Skip to content

1.5.8.0 の変更点 ​

第6版作成 最終更新 (日本時間)
確認バージョン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/UsersGET / POSTユーザの一覧取得・作成
scim/v2/Users/{id}GET / PUT / PATCH / DELETEユーザの取得・置換・部分更新・削除
scim/v2/GroupsGET / POSTグループの一覧取得・作成
scim/v2/Groups/{id}GET / PUT / PATCH / DELETEグループの取得・置換・部分更新・削除
scim/v2/ServiceProviderConfigGETサーバの対応機能の申告
scim/v2/ResourceTypesGETリソース種別の一覧
scim/v2/SchemasGETスキーマ定義の一覧

PATCH は add / replace / remove の各操作と、members[value eq "123"] のようなフィルタ付きパス指定に対応しています。

有効化とライセンス ​

csharp
internal static bool Enabled() => Parameters.Scim?.Enabled == true
        && Parameters.CommercialLicense() && Parameters.HasScim();

設定ファイル Scim.json の Enabled だけでは動きません。商用ライセンスであり、かつライセンスに Scim オプションが含まれている必要があります。条件を満たさないと、リクエストは 404 で返されます(機能が無効な環境ではエンドポイントが存在しないように振る舞う設計)。

json
{
    "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]+$ でバリデーションされます。

json
{
    "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(既定)ローカルのファイルに書き出すだけ
DifyEndpoint、DatasetId、ApiKey(Secret)
OpenAiEndpoint、VectorStoreId、ApiKey(Secret)

Secret のキーは画面表示時に ******** でマスクされます。編集時にマスク値が送られてきた場合は保存済みの値が使われる(ResolveConnectionSetting)ため、画面を開いて保存し直しただけで API キーが消えることはありません。

設定はサイト単位 ​

AiProviders は SiteSettings に追加されており、テーブルの管理から設定します。同期したいテーブルだけを選んで有効化できます。AiProvidersAllDisabled という一括停止フラグもあります。

送信は期限付きテーブルと記録テーブルの作成・更新・一括更新時に AiConnectUtilities.Sync() から行われ、次の 3 段階のガードがあります。

  1. パラメータ AiConnect の Rag.Enabled が true でなければ送信しない
  2. サイトの AiProviders が空なら送信しない
  3. AiProvidersAllDisabled が true なら送信しない

キューの有無で送信方式が変わる ​

バックグラウンドキューが有効で、かつ BackgroundJobs の OutputFilePath が設定されていればジョブとして積まれ、レコードの保存はすぐ返ります。そうでなければ RunImmediate で同期的に送信されます。即時送信でも、SemaphoreSlim による同時実行制御とレコード単位のチェーン化により、同じレコードへの連続更新が並行して送信されないようになっています。

WARNING

バックグラウンドキューには Queue ライセンスオプションが必要です。ライセンスがない環境では即時送信になり、レコードの保存が外部 API のレスポンス待ちで遅くなります。

送信内容 ​

送信内容は AiConnect.json の Rag.FormatTemplate で決まります。[Title] のような角括弧はプリザンターの項目置換、{Url} はレコードの URL で、通知メールの本文テンプレートと同じ書き方です。

json
"FormatTemplate": [
    "# [Title]",
    "",
    "| 項目 | 値 |",
    "|------|----|",
    "| 状況 | [Status] |",
    "| 管理者 | [Manager] |",
    "| 担当者 | [Owner] |",
    "| 作成者 | [Creator] |",
    "| 更新者 | [Updator] |",
    "| 更新日時 | [UpdatedTime] |",
    "",
    "## 内容",
    "",
    "[Body]",
    "",
    "## コメント",
    "",
    "[Comments]",
    "",
    "---",
    "",
    "URL: {Url}",
    ""
]

ファイル名は issue-123.md、result-456.md のような規則で生成されるため、送信先で同じレコードを上書きできます。

ジョブとリトライ ​

ハンドラ役割
AiConnectSyncJobHandler送信
AiConnectIndexCheckJobHandler送信先でのインデックス完了確認(ポーリング)
AiConnectResyncJobHandlerサイト全体の再同期
AiConnectDeleteJobHandler削除
json
"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
usersGetGet / GetList / Create / Update
deptsGetGet / Create / Update
groupsGet / UpdateGet / Create / Update

取得したオブジェクトから拡張項目も読めるようになりました。拡張項目は API と同じ ClassHash NumHash のような形で渡されます。これまで拡張 SQL で直接引くしかなかった「ユーザの拡張項目に部署コードを持たせてサーバスクリプトから参照する」といった運用ができます。

キューイングのマルチテナント対応 ​

BackgroundJobTargetTenants が新設され、対象テナントの決定とワーカー数の算出が集約されました。

  • マルチテナントのライセンスがあれば全テナントが対象、なければ MultiTenant.DefaultTenantId のテナントだけを処理します。
  • DefaultTenantId が未設定(1 未満)のまま単一テナントライセンスで動かすと、ジョブが 1 件も処理されません。起動時にシステムログへ警告が出ます。
  • 単一テナントライセンスでは、WorkerCount を何に設定しても 1 に固定 されます(無視されたことはログに出ます)。
  • ワーカー数の上限は Quartz のスレッドプールサイズです。クラスタリングが無効なら 10 固定で、設定では上げられません。クラスタリングが有効なら MaxConcurrency が上限になります。
  • ワーカーと他のタイマーがスレッドプールを共有して発火が遅れそうな場合にも警告が出ます。

TypeScript の型定義ファイル ​

スクリプトとサーバスクリプト向けの型定義が追加されました。JSDoc 付きの日本語コメントとマニュアルへのリンクが含まれています。

text
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 で変換する)。

ts
/**
 * .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 で読み書きできます。

列ラベル
UiTypeUI タイプ
UiColorSchemeカラーモード
UiMainColorメインカラー
UiSubColorサブカラー
UiBackgroundColor背景色

ただし、これらの値を使って画面を描画している箇所はなく、描画側は未実装です。現時点で値を入れても見た目は変わりません。

既定値の変更(DeleteTenant) ​

diff
-    "DeleteTenant": true,
+    "DeleteTenant": false,

1.5.7.0 で追加されたテナントの物理削除ジョブが、既定で無効になりました。マルチテナント管理 API でテナントを論理削除しても、そのままでは物理削除されません。1.5.7.x で物理削除が走る前提で運用していた環境では、バージョンアップ時に DeleteTenant を明示的に true にしてください。設定ファイルに DeleteTenant を明示的に true と書いてある環境は、従来どおり動きます。

調査元 ​

変更履歴

第6版リリース資料と比較データを製品系列ごとのフォルダに整理
第5版1.2~1.5の178版を4項目で比較できるようにする
第4版1.5.8.0 の変更点と4項目の比較データを追加
第3版リリース記事の番号を追記しやすい連番に変更
第2版1.5.7.0の変更点を独立させ旧記事を版別に移行
第1版1.5.8.0の機能と修正内容を版別ページに整理