1.5.8.0 の変更点
リリース日: 2026年9月8日。1.5.7.1 からの変更です。機能追加・仕様変更と不具合修正を分けて記載します。
機能追加・仕様変更
- 利用者・権限 — SCIMによるユーザー同期機能が加わった。
- その他 — AI連携(RAG)機能が加わった。
- 画面・表示 — クロス集計のセルから絞り込んだ一覧へ遷移できるドリルダウン機能が加わった。
- 利用者・権限 — 計算式(拡張)にログインユーザのIDと名前を取得する関数を利用できるようになった。
- API・拡張 — Pleasanter MCPに、テンプレートを指定してサイトを作成できるようになった。
- 利用者・権限 — スクリプト、サーバスクリプト、APIに、ユーザ、組織、グループの拡張項目を取得・編集できるようになった。
- 実行環境・DB — インストーラでSQLServerの接続文字列にTrustServetCertificate=true;を付与する設問を利用できるようになった。
- 運用・設定 — キューイング機能がマルチテナント環境で動作するようになった。
- 画面・表示 — レコードの編集画面のスクロール処理を改善した。
- 運用・設定 — BackgroundService.json の DeleteTenant デフォルト値を true → false となるよう改めた。
不具合修正
- API・拡張 — レコードの作成、編集APIで、添付ファイルが登録されない場合がある不具合を修正。
- 画面・表示 — 「テーブルの管理」の変更履歴一覧でタイトルのハイパーリンクをクリックした際に、旧バージョンが表示されない状態を修正。
- 画面・表示 — 一覧の履歴表示でタイトル列が常に最新値になる不具合を修正。
- API・拡張 — Pleasanter MCPで分類項目に対する検索実行時にデータが全件取得される不具合を修正。
- 画面・表示 — ビューの検索条件に選択不可の列を指定できる不具合を修正。
- その他 — リンク先項目を複数指定した際に値が重複する不具合を修正。
- 画面・表示 — ダッシュボードパーツのリロードボタンが表示されない状態を修正。
実装を読む
1.5.7.1 との差分です。新規追加ファイルは 140 本以上、差分は 270 ファイル・約 3.4 万行の追加です。
| 分類 | 追加された主なもの | 概要 | ライセンス |
|---|---|---|---|
| SCIM 同期 | scim/v2 系エンドポイント | IdP からユーザ・グループを自動同期 | 必要 |
| AI 連携(RAG) | AiProviders サイト設定 | レコードを Markdown 化して外部の知識ベースへ送る | 不要(キュー利用時は必要) |
| クロス集計ドリルダウン | crosstabdrilldown.js | 集計セルから絞り込み済みの一覧へ遷移 | 不要 |
| 計算式(拡張) | $LOGINUSERID() / $LOGINUSERNAME() | 計算式でログインユーザを参照 | 不要 |
| 拡張項目の操作 | users.GetList() ほか | ユーザ・組織・グループの拡張項目を取得・編集 | 不要 |
| キューイング | BackgroundJobTargetTenants | バックグラウンドジョブがマルチテナントに対応 | 必要(Queue) |
| 型定義ファイル | pleasanter-script.d.ts ほか | スクリプト・サーバスクリプトの TypeScript 型 | 不要 |
| UI テーマ列 | Tenants.UiType ほか | テーマ設定用の列だけが先行して追加 | 不要 |
SCIM によるユーザ・グループ同期
SCIM(System for Cross-domain Identity Management)は、ID 基盤側からアプリケーションのユーザとグループを自動でプロビジョニングする標準プロトコルで、Entra ID や Okta が対応しています。Implem.Pleasanter/Controllers/Scim/ に 4 つのコントローラが新設されました。
| エンドポイント | メソッド | 用途 |
|---|---|---|
scim/v2/Users | GET / POST | ユーザの一覧取得・作成 |
scim/v2/Users/{id} | GET / PUT / PATCH / DELETE | ユーザの取得・置換・部分更新・削除 |
scim/v2/Groups | GET / POST | グループの一覧取得・作成 |
scim/v2/Groups/{id} | GET / PUT / PATCH / DELETE | グループの取得・置換・部分更新・削除 |
scim/v2/ServiceProviderConfig | GET | サーバの対応機能の申告 |
scim/v2/ResourceTypes | GET | リソース種別の一覧 |
scim/v2/Schemas | GET | スキーマ定義の一覧 |
PATCH は add / replace / remove の各操作と、members[value eq "123"] のようなフィルタ付きパス指定に対応しています。
有効化とライセンス
internal static bool Enabled() => Parameters.Scim?.Enabled == true
&& Parameters.CommercialLicense() && Parameters.HasScim();設定ファイル Scim.json の Enabled だけでは動きません。商用ライセンスであり、かつライセンスに Scim オプションが含まれている必要があります。条件を満たさないと、リクエストは 404 で返されます(機能が無効な環境ではエンドポイントが存在しないように振る舞う設計)。
{
"Enabled": false,
"SwaggerEnabled": false,
"ExtendedAttributes": {
"Users": [],
"Groups": []
}
}認証(SCIM 専用トークン)
既存の API キーとは別に、SCIM 専用のトークンが導入され、ScimTokens テーブルが新設されました。
| 列 | 用途 |
|---|---|
TokenHash | トークンの SHA-256 ハッシュ(平文は保存しない) |
TokenPrefix | 画面表示用の先頭部分 |
ExpiresTime | 有効期限 |
LastUsedTime | 最終使用時刻 |
Disabled | 無効化フラグ |
- 平文のトークンが見えるのは発行直後の一度だけです。検証時は受け取った
Bearerトークンをハッシュ化して突き合わせます。 - 最終使用時刻の更新は 60 秒に 1 回までに間引かれます(
LastUsedTimeUpdateIntervalSeconds = 60)。 - 認証の前に IP 制限(
Parameters.Security.AllowIpAddresses)のチェックが入るため、IdP の送信元 IP を絞れます。
同期状態の列と拡張項目のマッピング
Users と Groups に ScimId(SCIM 側のリソース ID)、ScimExternalId(IdP 側の externalId)、ScimSync(SCIM 経由で作成・管理されているかのフラグ)が追加されました。ScimSync により、画面から作ったユーザと IdP から同期されたユーザを区別できます。
ユーザの拡張項目(ClassA など)は、Scim.json の ExtendedAttributes で SCIM のスキーマ拡張として公開できます。宣言した属性は scim/v2/Schemas に反映され、IdP 側の属性マッピング画面に表示されます。Schema を省略すると既定のスキーマ URN が使われます。属性名は ^[A-Za-z][A-Za-z0-9_-]*$、列名は ^[A-Za-z0-9]+$ でバリデーションされます。
{
"Enabled": true,
"ExtendedAttributes": {
"Users": [
{
"Schema": "urn:ietf:params:scim:schemas:extension:pleasanter:2.0:User",
"Name": "employeeNumber",
"ColumnName": "ClassA"
}
],
"Groups": []
}
}Swagger UI
SwaggerEnabled を true にすると、SCIM API の OpenAPI ドキュメント(/scim/swagger/v1/swagger.json)と Swagger UI(/scim/swagger)が公開されます。IdP 側の設定を作る前の疎通確認に使えます。
WARNING
SwaggerEnabled は API の構造を公開する設定です。本番では無効のままにし、検証環境でだけ有効にする運用を推奨します。
AI 連携(RAG)
レコードを Markdown に整形して外部の知識ベースへ送る機能です。Implem.Pleasanter/Libraries/AiConnect/ に 18 ファイルが新設されました(1.5.8.1 のソースでは 17 ファイル)。
プロバイダと接続設定
| プロバイダ | 必要な接続設定キー |
|---|---|
MarkdownFile(既定) | ローカルのファイルに書き出すだけ |
Dify | Endpoint、DatasetId、ApiKey(Secret) |
OpenAi | Endpoint、VectorStoreId、ApiKey(Secret) |
Secret のキーは画面表示時に ******** でマスクされます。編集時にマスク値が送られてきた場合は保存済みの値が使われる(ResolveConnectionSetting)ため、画面を開いて保存し直しただけで API キーが消えることはありません。
設定はサイト単位
AiProviders は SiteSettings に追加されており、テーブルの管理から設定します。同期したいテーブルだけを選んで有効化できます。AiProvidersAllDisabled という一括停止フラグもあります。
送信は期限付きテーブルと記録テーブルの作成・更新・一括更新時に AiConnectUtilities.Sync() から行われ、次の 3 段階のガードがあります。
- パラメータ
AiConnectのRag.Enabledがtrueでなければ送信しない - サイトの
AiProvidersが空なら送信しない AiProvidersAllDisabledがtrueなら送信しない
キューの有無で送信方式が変わる
バックグラウンドキューが有効で、かつ BackgroundJobs の OutputFilePath が設定されていればジョブとして積まれ、レコードの保存はすぐ返ります。そうでなければ RunImmediate で同期的に送信されます。即時送信でも、SemaphoreSlim による同時実行制御とレコード単位のチェーン化により、同じレコードへの連続更新が並行して送信されないようになっています。
WARNING
バックグラウンドキューには Queue ライセンスオプションが必要です。ライセンスがない環境では即時送信になり、レコードの保存が外部 API のレスポンス待ちで遅くなります。
送信内容
送信内容は AiConnect.json の Rag.FormatTemplate で決まります。[Title] のような角括弧はプリザンターの項目置換、{Url} はレコードの URL で、通知メールの本文テンプレートと同じ書き方です。
"FormatTemplate": [
"# [Title]",
"",
"| 項目 | 値 |",
"|------|----|",
"| 状況 | [Status] |",
"| 管理者 | [Manager] |",
"| 担当者 | [Owner] |",
"| 作成者 | [Creator] |",
"| 更新者 | [Updator] |",
"| 更新日時 | [UpdatedTime] |",
"",
"## 内容",
"",
"[Body]",
"",
"## コメント",
"",
"[Comments]",
"",
"---",
"",
"URL: {Url}",
""
]ファイル名は issue-123.md、result-456.md のような規則で生成されるため、送信先で同じレコードを上書きできます。
ジョブとリトライ
| ハンドラ | 役割 |
|---|---|
AiConnectSyncJobHandler | 送信 |
AiConnectIndexCheckJobHandler | 送信先でのインデックス完了確認(ポーリング) |
AiConnectResyncJobHandler | サイト全体の再同期 |
AiConnectDeleteJobHandler | 削除 |
"SyncRetryCount": 2,
"IndexCheckMaxAttempts": 10,
"DeleteRetryCount": 2,
"RetryAfterMaxSeconds": 60送信先が返す Retry-After ヘッダを見て待機します。ヘッダがなければ 5 秒、あっても RetryAfterMaxSeconds(既定 60 秒)が上限です。
送信先は Parameters.AiConnect.ProviderEndpoints に列挙した許可エンドポイントに制限されます。AllowInsecureLoopbackEndpoint を明示的に有効にしない限り、localhost への平文通信も拒否されます。
クロス集計からのドリルダウン
クロス集計のセルをクリックすると、そのセルの条件で絞り込んだ一覧に遷移できるようになりました。

- サーバ側(
HtmlCrosstab.csのDrillDownView)で、X 軸・Y 軸の列に 完全一致 の検索方法を設定し、クロス集計用の設定(CrosstabGroupByX/CrosstabGroupByY)をnullにした一覧用のビューを組み立て、hidden に埋め込みます。 - クライアント側(
crosstabdrilldown.jsの$p.crosstabDrillDown)が絞り込み条件を足して遷移します。 - ドリルダウンの絞り込みはセッションに保存されるため、遷移前のビューを
sessionStorageに退避し、「戻る」の遷移先が絞り込み前のクロス集計になるようにしています。 EnterとSpaceキーでもドリルダウンできます。- 集計値が 0 のセルにはリンクの属性が付かないため、空の一覧に遷移することはありません。
計算式でログインユーザを参照できる
計算式(拡張)に 2 つの関数が追加されました。$NOW() や $DATETIME() と同じく、スクリプトを組み立てる時点で値が埋め込まれます。小文字($loginuserid()でも書けます。
| 関数 | 戻り値 |
|---|---|
$LOGINUSERID() | ログインユーザの ID |
$LOGINUSERNAME() | ログインユーザの名前 |
WARNING
値は計算式が実行された時点のログインユーザです。バックグラウンドサーバスクリプトや API 経由の更新では、その実行主体のユーザになります。「レコードを最後に更新した人」を残す用途なら、既存の Updator 項目を使うほうが確実です。
ユーザ・組織・グループの拡張項目を扱える
サーバスクリプトの users depts groups に、取得・作成・更新のメソッドが揃いました。
| オブジェクト | 1.5.7.1 まで | 1.5.8.0 |
|---|---|---|
users | Get | Get / GetList / Create / Update |
depts | Get | Get / Create / Update |
groups | Get / Update | Get / Create / Update |
取得したオブジェクトから拡張項目も読めるようになりました。拡張項目は API と同じ ClassHash NumHash のような形で渡されます。これまで拡張 SQL で直接引くしかなかった「ユーザの拡張項目に部署コードを持たせてサーバスクリプトから参照する」といった運用ができます。
キューイングのマルチテナント対応
BackgroundJobTargetTenants が新設され、対象テナントの決定とワーカー数の算出が集約されました。
- マルチテナントのライセンスがあれば全テナントが対象、なければ
MultiTenant.DefaultTenantIdのテナントだけを処理します。 DefaultTenantIdが未設定(1 未満)のまま単一テナントライセンスで動かすと、ジョブが 1 件も処理されません。起動時にシステムログへ警告が出ます。- 単一テナントライセンスでは、
WorkerCountを何に設定しても 1 に固定 されます(無視されたことはログに出ます)。 - ワーカー数の上限は Quartz のスレッドプールサイズです。クラスタリングが無効なら 10 固定で、設定では上げられません。クラスタリングが有効なら
MaxConcurrencyが上限になります。 - ワーカーと他のタイマーがスレッドプールを共有して発火が遅れそうな場合にも警告が出ます。
TypeScript の型定義ファイル
スクリプトとサーバスクリプト向けの型定義が追加されました。JSDoc 付きの日本語コメントとマニュアルへのリンクが含まれています。
Implem.PleasanterFrontend/wwwroot/src/types/pleasanter-script.d.ts (680 行)
Implem.PleasanterFrontend/wwwroot/src/types/pleasanter-server-script.d.ts(2084 行)サーバスクリプトで .NET の配列が渡ってくる点も型で表現されています(Length であって length ではない、JavaScript の配列メソッドを使うには Array.from で変換する)。
/**
* .NETの配列です。インデックスアクセス、Length、for...ofを使用できます。
* JavaScriptの配列メソッドを使用する場合はArray.fromで変換してください。
*/
interface PleasanterHostArray<T> extends Iterable<T> {
readonly [index: number]: T;
readonly Length: number;
}WARNING
型定義は C# の実装より少し遅れています。たとえば今回追加された users.GetList() users.Create() users.Update() は .d.ts にまだ載っていません(users は Get のみ)。型定義にないからといって使えないわけではありません。
UI テーマ列(先行追加)
Tenants と Users に、テーマ設定用とみられる列が 5 つずつ追加され、TenantApiModel / UserApiModel から API で読み書きできます。
| 列 | ラベル |
|---|---|
UiType | UI タイプ |
UiColorScheme | カラーモード |
UiMainColor | メインカラー |
UiSubColor | サブカラー |
UiBackgroundColor | 背景色 |
ただし、これらの値を使って画面を描画している箇所はなく、描画側は未実装です。現時点で値を入れても見た目は変わりません。
既定値の変更(DeleteTenant)
- "DeleteTenant": true,
+ "DeleteTenant": false,1.5.7.0 で追加されたテナントの物理削除ジョブが、既定で無効になりました。マルチテナント管理 API でテナントを論理削除しても、そのままでは物理削除されません。1.5.7.x で物理削除が走る前提で運用していた環境では、バージョンアップ時に DeleteTenant を明示的に true にしてください。設定ファイルに DeleteTenant を明示的に true と書いてある環境は、従来どおり動きます。