Codeer.LowCode.Blazor.Extras.Server 0.17.1

dotnet add package Codeer.LowCode.Blazor.Extras.Server --version 0.17.1
                    
NuGet\Install-Package Codeer.LowCode.Blazor.Extras.Server -Version 0.17.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Codeer.LowCode.Blazor.Extras.Server" Version="0.17.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Codeer.LowCode.Blazor.Extras.Server" Version="0.17.1" />
                    
Directory.Packages.props
<PackageReference Include="Codeer.LowCode.Blazor.Extras.Server" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Codeer.LowCode.Blazor.Extras.Server --version 0.17.1
                    
#r "nuget: Codeer.LowCode.Blazor.Extras.Server, 0.17.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Codeer.LowCode.Blazor.Extras.Server@0.17.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Codeer.LowCode.Blazor.Extras.Server&version=0.17.1
                    
Install as a Cake Addin
#tool nuget:?package=Codeer.LowCode.Blazor.Extras.Server&version=0.17.1
                    
Install as a Cake Tool

Codeer.LowCode.Blazor.Extras

Codeer.LowCode.Blazor に高機能UIコンポーネントと、 アプリケーション開発でよく使うクライアント/サーバーサービスを追加する拡張ライブラリです。 ソースは MIT で公開しているため、動作を変えたい場合はクラスを丸ごと差し替えたり、ソースをコピーして改変できます。

NuGet License: MIT

パッケージ構成

パッケージ 内容
Codeer.LowCode.Blazor.Extras 拡張フィールド (メール送信・承認フロー・編集履歴・一括ファイル入出力を含む)、スクリプトオブジェクト (Excel / WebApi / Toaster / BulkFileReader / BulkFileTransferService)、クライアントサービス
Codeer.LowCode.Blazor.Extras.Designer デザイナ統合 (ツールボックス登録・AI 用ドキュメント登録)
Codeer.LowCode.Blazor.Extras.Server サーバーサービス (認証: ID/パスワード照合・外部 IdP・二要素認証 / メール送信 / 承認フローエンジン / 編集履歴の記録 / 一括ファイル入出力 (CSV・固定長・列マッピング・値の変換) / AI チャット・意味検索 / AI ドキュメント解析 / ファイルストレージ (ファイルシステム / Azure Blob / Amazon S3) / 監査ログ / ASP.NET Core ヘルパ)

提供フィールド

フィールド 説明
CalendarField 月・週・日表示のカレンダー。イベントの表示・追加・編集が可能
GanttField SVGベースのガントチャート。タスクのドラッグ移動・リサイズ、依存関係の管理が可能
TaskBoardField カンバンボード。ドラッグ&ドロップでステータス変更が可能
RichTextField 書式付きテキストエディタ。太字・色・リンクなどのHTMLフォーマットに対応
MarkdownField Markdown エディタ / ビューア。Markdown をプレーンテキストのまま保存し、閲覧時は HTML に描画。ツールバーとプレビュー (タブ / 左右並び) 付き。生 HTML は無効化 (外部ライブラリ Markdig を使用)
ColorPickerField カラーピッカー。HTML5ネイティブカラーピッカーで色をHEX文字列として保存
MarkerListField 画像上にマーカー(ピン)を配置・操作するフィールド
QrCodeField 文字列をQRコード画像として表示する表示専用フィールド (外部ライブラリ QRCoder を使用)
ProgressField 進捗率を横バー / 半円メーターで表示する表示専用フィールド。値・色を別フィールドから参照
ExcelReportButtonField テンプレート Excel のセル ($フィールド名.Value) を自モジュールの値で置き換えて xlsx / PDF でダウンロードするボタン。スクリプト不要
BulkFileTransferButtonField 詳細画面に置く一括ダウンロード / 一括更新ボタン。対象は同じ画面の検索フィールドか一覧の条件
CsvFileFormatField 一括ダウンロード / 一括更新のファイル形式を CSV (エンコーディング・区切り文字指定) や固定長にする設定用フィールド (UI なし)
FileColumnMappingField 一括ダウンロード / 一括更新の列構成を相手仕様 (列の並び・列名・固定値・固定長の列幅) にする設定用フィールド (UI なし)
FileValueConversionField 一括ダウンロード / 一括更新で、フィールドの値を変換表モジュールで引き当てる (リンクを名前で出し入れする・コード変換) 設定用フィールド (UI なし)
FileStorage FileField のファイル保存先。FileSystem / Azure Blob / Amazon S3 (S3互換含む) と独自プロバイダ
EnterFocusMoveField Enterキーでモジュール内の次の入力要素にフォーカスを移動させるユーティリティフィールド
LoginAccountContractField ユーザーモジュールに置く契約フィールド。ログイン ID・外部 IdP の突き合わせ・有効フラグ・表示名・メール二要素の送信先・パスワード入力欄を役割で、パスワード照合用の列と認証アプリ (TOTP) の列を宣言する。サーバーのログイン処理はこの契約だけを見る (認証の全体像)
二要素認証 LoginAccountContractField の TOTP 列 (認証アプリ) か TwoFactorEmail (メールのワンタイムコード) を設定すると、パスワード成功後に 6 桁コードの入力を求める (Extras.Server の TotpLogin / EmailOtpLogin)
TotpResetButtonField 表示中のユーザーの認証アプリ (TOTP) 登録を解除するボタン (管理者用)。ユーザーモジュールの詳細画面に置く。通常の保存と同じ権限で制御される
MyTotpResetButtonField ログイン中の自分の認証アプリ登録を解除するボタン (本人用)。設定画面などどのモジュールにも置ける
PasswordHashField パスワードを Submit 時にハッシュ + ソルトへ変換して DB に書き込む補助フィールド (サーバサイド実装が必要)。ログインユーザーモジュールでは LoginAccountContractField の PasswordField で代替できる
OrientationLockField タッチ端末で画面の向き(横/縦)が指定と異なるとき、全画面オーバーレイで回転を促すフィールド
AITextAnalyzerField 帳票ファイルや自由テキストを AI で解析し、モジュールのフィールドへ自動入力する入力補助フィールド (Azure OpenAI + Document Intelligence を使用)
AIChatField AI (サーバー側の Agent) とのチャット UI。送信→ポーリングで返事を受け取り HTML で表示する。Agent は名前で選び (Agent プロパティ)、標準で RawDataAccessAgent (Microsoft.Extensions.AI の IChatClient で会話し、DB を SQL で読んで集計・SVG グラフで答える) を用意
SemanticSearchField 行を「内容の意味で探せる」ようにする補助フィールド (UI なし)。Submit 時に対象フィールドを「表示名: 値」の文章にして送り、サーバーが埋め込みベクトルを付けて書き込み専用の列に保存する。AIChatField の RawDataAccessAgent が search_records で「似た事例」を探し、AI の SQL の中でも {embed:…} で意味の近さを使える。距離計算は DB のベクトル検索 (PostgreSQL pgvector / SQL Server 2025) が行う = 対応 DB 限定 (サーバサイド実装が必要)

一覧の見出しに置く部品

一覧レイアウトの見出しセルの「プロコード」(ListElementComponent) に指定して使う部品です。

部品 説明
SelectAllCheckBoxListElementComponent チェックボックス列の見出しに出す全選択チェックボックス。クリックすると、その見出しの列のフィールド (FieldName。BooleanField) を全行まとめて ON / OFF する。見出しは幅 40 程度の固定幅・「リサイズ」なし・「ユーザーソート」なしにするのが定番。JSON では Codeer.LowCode.Blazor.Extras.Components.SelectAllCheckBoxListElementComponent を指定する

認証 (ログイン)

Codeer.LowCode.Blazor 本体が持つのは認可だけで、認証 (ログイン) はライブラリに含まれません。認証はホストアプリの担当で、その実装をこの Extras が MIT で提供します。 セッションは Cookie、ログインアカウントの宣言はユーザーモジュールの契約フィールド。パスワード / Entra ID / Google / AWS Cognito / OpenID Connect / 二要素認証のどれでログインしても、本体の認可 (CurrentUser・モジュール / 行 / PageFrame の条件) は変わりません。

ドキュメント 内容
認証の全体像 本体 (認可) とホスト・Extras (認証) の役割分担、部品の一覧、ホストに入っているもの
外部ログイン Entra ID / Google / AWS Cognito / 汎用 OpenID Connect。appsettings だけで有効化。MAUI 対応
二要素認証 認証アプリ (TOTP) とメールのワンタイムコード。解除ボタン
LoginAccountContractField ユーザーモジュールに置く契約フィールドの仕様
サーバー API の権限チェック メール送信・一斉送信・承認・AI チャット・AI 帳票解析・意味検索の再索引の API は、呼び出し元のフィールドが今のユーザーに見えるときだけ応じる。フィールドごとに何を見て何を見ないかの一覧

業務機能

機能 説明
メール送信 MailField (単発送信ボタン) / BulkMailField (名簿への一斉送信) / 送信履歴 / プレビュー。宛先・文面はレコードの値から組み立てる。契約フィールド: BulkMailRecipientContractField (一斉送信の宛先) / MailHistoryContractField・MailHistoryDetailContractField (送信履歴)
MailSender 担当者本人のアカウント (Gmail / Microsoft 365 / SMTP) 名義で送る Windows アプリ (Tools/MailSender をビルドして使う)。Web のプレビュー HTML を開いて送信。トークンは本人の PC にだけ置く。Web アプリのシステム送信者用トークンの発行にも使う
承認フロー ApprovalFlowField を申請書に置くだけで申請・承認・却下・差し戻し・取り下げ・再申請・回覧。承認データは通常のモジュール。状態遷移はサーバーが検証。履歴だけを別の場所に出す ApprovalHistoryField。契約フィールド: ApprovalFlowContractField / ApprovalMemberContractField / ApprovalHistoryContractField
監査ログ いつ・誰が・どこから・何に・何をして・どうなったかをサーバーが WebAPI ごとに記録する。フィールド不要で appsettings だけで有効化。DB / JSON Lines ファイルへ出力、失敗・権限拒否も記録、保持期限で自動削除、監査ログのテーブルはアプリ経路から追記専用 (サーバサイド実装が必要)
編集履歴 EditHistoryField をモジュールに置くと保存 (作成・更新・削除) ごとにレコード全体 (明細込み) のスナップショットが履歴モジュールへ記録される。詳細画面に版の一覧 (変更フィールドの 旧 → 新)・「この版を表示」・「この版に戻す」(フォームへ反映して保存で確定)・削除したレコードの復活。履歴は通常のモジュール = 閲覧権限は履歴モジュールの設定で、版の内容は読む人の権限に合わせて返される (サーバサイド実装が必要)。履歴モジュールに置く EditHistoryContractField (契約) / EditHistoryUndeleteButtonField (削除したレコードの復活ボタン)

いずれもデザイナの Tools > メールのセットアップ / 承認フローのセットアップ / 編集履歴のセットアップ / 監査ログのセットアップ (または CLI の mail-setup / approval-setup / edit-history-setup / audit-log-setup) で 必要なモジュール群 (監査ログは閲覧モジュールとテーブル作成 DDL) を生成できます。

スクリプトオブジェクト

スクリプト (*.mod.cs) から利用できるサービス・型です。ExtrasClientInitializer.Initialize で一括登録されます。

オブジェクト 説明
Excel Excel ファイルの読み書き・テンプレートへの値書き込み・xlsx / PDF ダウンロード
WebApiService 外部 API への HTTP リクエスト (Get / Post / Put / Delete)
Toaster トースト通知の表示 (Success / Info / Warn / Error)
BulkFileReader new BulkFileReader<モジュール名>()。ファイルを選ばせ、そのモジュールの一括ファイル入出力の定義 (CSV / 固定長 / 列マッピング / 値の変換) で解析して行を返す (DB には書かない)。一括ファイル入出力
BulkFileTransferService 検索条件や加工済みの行で一括ダウンロード (Download)、加工済みの行を 1 トランザクションで一括保存 (Submit)。一括ファイル入出力

各オブジェクトの正確なシグネチャと使用例は、デザイナの入力補完、またはデザイナ CLI の script-catalog サブコマンドが生成するカタログで確認できます。

クライアントサービス

アプリテンプレートの DI に登録して使う実装です。インターフェース (IHttpService / IToastService 等) で 登録するため、自前実装への丸ごと差し替えができます。

  • HttpService — ローディング表示・エラー通知付きの HTTP 通信ラッパー
  • UIService — ファイルダウンロード・通知トースト
  • Logger — ブラウザコンソール + トースト通知のロガー
  • ToastService — Sotsera.Blazor.Toaster ベースのトースト実装
  • LocalizeService — TSV リソースによるローカライズ

サーバーサービス (Codeer.LowCode.Blazor.Extras.Server)

  • AITextAnalyzeService — Azure Document Intelligence + Azure OpenAI による帳票・テキスト解析 (AITextAnalyzerField のサーバー側)
  • AI チャット — AIChatService (AIChatField の受け口。送信をバックグラウンドの Agent に渡し、ポーリングに状態を返す) と標準 Agent の RawDataAccessAgent (アプリの設計を読み、DB を SQL で読んで集計・グラフで答える)。独自の Agent は IAIChatAgent で追加。AIChatField
  • 意味検索 — SemanticSearchService (SemanticSearchField のサーバー側。保存時に行の文章へ埋め込みベクトルを付け、再索引をジョブで実行し、AI チャットに search_records ツールを提供)。埋め込みモデルは IEmbeddingProvider (Azure OpenAI 実装を同梱。独自実装で差し替え可)。類似度の計算は DB 側 (PostgreSQL pgvector / SQL Server 2025)。SemanticSearchField
  • 認証 — LoginAccountStore (ID/パスワード照合・ユーザー行の解決) / 外部 IdP (OidcLoginProvider と Entra / Google / Cognito 実装) / TotpLogin・EmailOtpLogin (二要素認証)。認証の全体像
  • メール送信 — MailDispatcher (テンプレート解決・一斉送信・送信履歴) と SMTP / Microsoft Graph / SendGrid / Gmail API 送信。独自の送信手段は IMailSender で追加
  • 承認フロー — ApprovalEngine (状態遷移の検証と実行)
  • 編集履歴 — EditHistoryRecorder (本体の IO インターセプタ。ModuleDataIO の派生 (テンプレートの CustomizedModuleDataIO) で AddInterceptor(new EditHistoryRecorder(designData)) と登録すると、保存時の記録・復活と、版の内容を読む人の権限に落とす処理の両方に効く)。編集履歴
  • 一括ファイル入出力 — BulkFileTransfer (一覧の一括ダウンロード / 一括更新とスクリプトの入出力の処理本体。ModuleDataController から移譲する)、CsvUtils (CSV の生成 / 解析)。一括ファイル入出力
  • StorageAccess / TemporaryFileManager — ファイルストレージ (ファイルシステム / Azure Blob / Amazon S3 (S3 互換含む)。独自の保存先は IFileStorage で追加) と一時ファイル管理。FileStorage
  • CustomFontResolver — Excel PDF 変換用のフォントリゾルバ
  • 監査ログ — AuditLogger (いつ・誰が・どこから・何に・何をして・どうなったかを WebAPI ごとに 1 レコード記録。DB / JSON Lines ファイルへ。Strict/BestEffort・保持期限・追記専用の保護)。appsettings だけで有効化。監査ログ
  • Web ヘルパ — ETag 付きファイル応答 (FileWithETag)、ホットリロード (HotReloadHub / FileWatcherService)

セットアップ

新しいアプリテンプレートで作成したプロジェクトには最初から組み込まれています。 既存プロジェクトに追加する場合は以下の手順で設定してください。

1. NuGet パッケージのインストール

インストール先プロジェクト パッケージ名
LowCodeApp.Client.Shared Codeer.LowCode.Blazor.Extras
LowCodeApp.Designer Codeer.LowCode.Blazor.Extras.Designer
LowCodeApp.Server (サーバーサービスを使う場合) Codeer.LowCode.Blazor.Extras.Server

2. コードの修正

LowCodeApp.Client.Shared

Services/AppInfoService.cs の AppInfoService コンストラクタに以下のコードを追加してください。

using Codeer.LowCode.Blazor.Extras;

// フィールドのみ使う場合
ExtrasClientInitializer.Initialize(this);

// スクリプトオブジェクト (Excel / WebApi / Toaster) も使う場合
ExtrasClientInitializer.Initialize(this, http, logger, toaster);

メール送信・承認フロー・Excel PDF 変換・AI 解析・AI チャット・意味検索・スクリプトの一括ファイル入出力・自分の認証アプリ解除ボタンを使う場合は、エンドポイント URL を起動時に設定します (URL はアプリのコントローラに合わせて変更してください)。

using Codeer.LowCode.Blazor.Extras.Fields;
using Codeer.LowCode.Blazor.Extras.Mail;
using Codeer.LowCode.Blazor.Extras.Approval;
using Codeer.LowCode.Blazor.Extras.ScriptObjects;

MailTransport.SendMailEndPoint = "/api/mail";
MailTransport.BulkSearchMailEndPoint = "/api/mail/bulk_search";
MailTransport.PreviewMailEndPoint = "/api/mail/preview";
MailTransport.BulkPreviewMailEndPoint = "/api/mail/bulk_preview";
ApprovalTransport.EndPointBase = "/api/approval";
Codeer.LowCode.Blazor.Extras.ScriptObjects.Excel.ConvertPdfEndPoint = "api/excel/pdf";
AITextAnalyzerField.FileToModuleDataEndPoint = "/api/ai_text_analyze/file";
AITextAnalyzerField.TextToModuleDataEndPoint = "/api/ai_text_analyze/text";
AIChatField.EndPoint = "/api/ai_chat";
SemanticSearchField.EndPoint = "/api/semantic_search/reindex";
BulkFileReader.ParseFileEndPoint = "/api/module_data/parse_file";
BulkFileTransferService.ListFileByDataEndPoint = "/api/module_data/list_file_by_data";
BulkFileTransferService.BulkSubmitEndPoint = "/api/module_data/bulk_submit";
TotpResetClient.StatusEndPoint = "/api/account/totp/status";
TotpResetClient.ResetEndPoint = "/api/account/totp/reset";
LowCodeApp.Server

Program.cs に以下のコードを追加してください。

using Codeer.LowCode.Blazor.Extras;

ExtrasServerInitializer.Initialize();

メール送信・承認フローを使う場合は、受け口となるコントローラ (MailController / ApprovalController) と 送信インフラの対応表 (MailSenderTable) が必要です。新しいアプリテンプレートには含まれています。 詳細は メール送信 / 承認フロー を参照してください。

一括ファイル入出力 (CSV / 固定長 / 列マッピング / 値の変換) を使う場合は、ModuleDataController の list_file / submit_by_file を BulkFileTransfer に移譲し、スクリプト用の list_file_by_data / bulk_submit / parse_file を足します。新しいアプリテンプレートには含まれています。詳細は 一括ファイル入出力 を参照してください。

AI チャット・意味検索を使う場合も同じ形で、受け口のコントローラ (AIChatController / SemanticSearchController) と対応表 (Agent 名 → Agent の AIChatAgentTable、埋め込みプロバイダの呼び名 → 実装の EmbeddingProviderTable) をアプリが持ちます。 新しいアプリテンプレート (Cookie) には含まれています。モデルの接続先は appsettings の AISettings (チャット) と SemanticSearch / AzureOpenAIEmbedding (埋め込み) で、 未設定なら AI チャットの Agent と意味検索は使えないだけでアプリは動きます。詳細は AIChatField / SemanticSearchField を参照してください。

LowCodeApp.Designer

App.xaml.cs に以下のコードを追加してください。

using Codeer.LowCode.Blazor.Extras.Designer;

// OnStartup メソッド内 (base.OnStartup(e) より前)
ExtrasDesignerInitializer.Initialize(BlazorRuntime);

// base.OnStartup(e) の後 (Tools メニュー: 承認フローのセットアップ / メールのセットアップ / 編集履歴のセットアップ)
ExtrasDesignerInitializer.Setup(DesignerEnvironment);

セットアップメニューは承認フロー・メール履歴・編集履歴・監査ログに必要なモジュール群をテンプレートから生成し、 テーブル作成 DDL の提示 (その場で実行可) と次にやることの案内まで行います (headless CLI の approval-setup / mail-setup / edit-history-setup / audit-log-setup verb からも同じ生成を実行できます)。

3. セットアップ完了

以上でセットアップは完了です。Designer から Extras のフィールドが配置できるようになります。

カスタマイズ

ソースは MIT で公開しています。動作を変えたい場合は次のいずれかで対応できます。

  • インターフェースで登録するサービス (IHttpService / IToastService / ITemporaryFileManager 等) は、自前実装を DI 登録して丸ごと差し替える
  • それ以外のクラスは、このリポジトリのソースをコピーしてアプリ内で改変し、元のクラスの代わりに使う

各フィールドの詳細

各フィールドの詳しい説明は以下のドキュメントを参照してください。

CSS カスタマイズ

各フィールドの見た目はCSSで自由にカスタマイズできます。詳しくは CSS カスタマイズガイド を参照してください。

ライセンス

MIT License

使用している OSS

各パッケージが NuGet 参照で取り込む第三者ライブラリとそのライセンスです (Microsoft.* / Azure.* / System.* の Microsoft 製パッケージはすべて MIT)。 いずれも商用利用・再配布が可能なライセンスで、NuGet パッケージ自体がライセンス文を同梱しているため、利用側で追加の手続きは要りません。

パッケージ ライブラリ ライセンス 用途
Codeer.LowCode.Blazor.Extras Markdig BSD-2-Clause MarkdownField の描画
Codeer.LowCode.Blazor.Extras QRCoder MIT QrCodeField の QR 生成
Codeer.LowCode.Blazor.Extras Sotsera.Blazor.Toaster MIT トースト通知 (ToastService)
Codeer.LowCode.Blazor.Extras / .Server Excel.Report.PDF (Codeer) MIT Excel の読み書き・PDF 変換。推移的に ClosedXML (MIT)、PdfSharp (MIT)、SixLabors.Fonts 1.0 (Apache-2.0) を含む
Codeer.LowCode.Blazor.Extras.Server MailKit MIT SMTP 送信
Codeer.LowCode.Blazor.Extras.Server AWSSDK.S3 Apache-2.0 FileField の S3 保存先
Codeer.LowCode.Blazor.Extras.Server Azure.AI.FormRecognizer / Azure.AI.OpenAI / Azure.Identity / Azure.Storage.Blobs MIT AI 帳票解析、Azure Blob 保存先、Entra ID
Codeer.LowCode.Blazor.Extras.Server Microsoft.AspNetCore.Authentication.OpenIdConnect MIT 外部ログイン
Codeer.LowCode.Blazor.Extras.SeleniumDrivers Codeer.LowCode.Blazor.SeleniumDrivers (Codeer) MIT 本体フィールドのドライバ

本体 (Codeer.LowCode.Blazor / .Designer) は Codeer の商用ライセンスです。

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.17.1 45 10/2/2026
0.17.0 35 10/2/2026
0.16.1 46 9/30/2026
0.16.0 48 9/29/2026
0.14.0 68 9/24/2026
0.13.0 77 9/17/2026
0.12.2 70 9/17/2026
0.12.1 77 9/15/2026
0.12.0 101 9/11/2026
0.11.0 112 9/9/2026
0.10.0 105 9/9/2026
0.9.0 102 9/8/2026
0.8.5 109 9/7/2026
0.8.4 110 9/3/2026
0.8.3 108 8/31/2026
0.8.2 106 8/29/2026
0.8.1 108 8/29/2026
0.8.0 106 8/29/2026
0.7.0 105 8/28/2026
0.6.0 106 8/26/2026
Loading failed

Audit log: list reads always record the module and the row count; row ids are recorded with AddRead(..., recordIds: true).