通用類型
跨通道共用、適用於代理主機協定每個通道的橫切型別定義 — 基本別名、操作信封、基礎指令形狀、跨通道 auth/required 通知,以及 JSON-RPC 線路類型。
JSON Schema: state.schema.json
狀態類型
URI
URI 字串(例如 ahp-root://、ahp-session:/<uuid> 或 ahp-chat:/<uuid>)。
string
StringOrMarkdown
可選擇以 Markdown 呈現的字串。
- 純
string會原樣呈現(不進行 Markdown 處理)。 - 帶有
{ markdown: string }的物件會以 Markdown 格式呈現。
string | { markdown: string }
JsonPrimitive
基本 JSON 值:字串、數字、布林值或 null。
string | number | boolean | null
Icon
可選擇指定大小的圖示,可在使用者介面中顯示。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
src | URI | 是 | 指向圖示資源的標準 URI。可以是 HTTP/HTTPS URL,或是帶有 Base64 編碼影像資料的 data: URI。消費者 SHOULD 採取步驟,確保提供圖示的 URL 來自與用戶端/伺服器相同的網域或受信任的網域。 消費者 SHOULD 在使用 SVG 時採取適當的防護措施,因為 SVG 可能包含可執行的 JavaScript。 |
contentType | string | 否 | 選用的 MIME 類型覆寫值,用於來源 MIME 類型缺失或為通用型別時。 例如:"image/png"、"image/jpeg" 或 "image/svg+xml"。 |
sizes | string[] | 否 | 選用的字串陣列,指定圖示可使用的尺寸。 每個字串應為 WxH 格式(例如 "48x48"、"96x96"),或可縮放格式(如 SVG)使用 "any"。若未提供,用戶端應假設該圖示可用於任何尺寸。 |
theme | 'light' | 'dark' | 否 | 選用的指定值,說明此圖示所設計的主題。"light" 表示圖示設計用於淺色背景, "dark" 表示圖示設計用於深色背景。若未提供,用戶端應假設該圖示可用於任何主題。 |
ProtectedResourceMetadata
使用 RFC 9728(OAuth 2.0 受保護資源中繼資料)語意,描述受保護資源的驗證需求。
欄位名稱使用 snake_case,以符合 RFC 9728 的 JSON 格式。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
resource | string | 是 | REQUIRED. 受保護資源的資源識別碼,一個使用 https 配置且不含片段元件的 URL(例如 "https://api.github.com")。 |
resource_name | string | 否 | OPTIONAL. 受保護資源的人類可讀名稱。 |
authorization_servers | string[] | 否 | OPTIONAL. OAuth 授權伺服器識別碼 URL 的 JSON 陣列。 |
jwks_uri | string | 否 | OPTIONAL. 受保護資源的 JWK Set 文件之 URL。 |
scopes_supported | string[] | 否 | RECOMMENDED. 用於授權請求的 OAuth 2.0 範圍值之 JSON 陣列。 |
bearer_methods_supported | string[] | 否 | OPTIONAL. 受支援之 Bearer Token 呈現方法的 JSON 陣列。 |
resource_signing_alg_values_supported | string[] | 否 | OPTIONAL. 受支援之 JWS 簽章演算法的 JSON 陣列。 |
resource_encryption_alg_values_supported | string[] | 否 | OPTIONAL. 受支援之 JWE 加密演算法(alg)的 JSON 陣列。 |
resource_encryption_enc_values_supported | string[] | 否 | OPTIONAL. 受支援之 JWE 加密演算法(enc)的 JSON 陣列。 |
resource_documentation | string | 否 | OPTIONAL. 資源之人類可讀文件的 URL。 |
resource_policy_uri | string | 否 | OPTIONAL. 資源之資料使用政策的 URL。 |
resource_tos_uri | string | 否 | OPTIONAL. 資源之服務條款的 URL。 |
required | boolean | 否 | AHP 擴充功能。此資源是否需要驗證。 - true(預設) — 沒有有效的令牌就無法使用代理程式。 若用戶端在未驗證的情況下嘗試使用代理程式,伺服器 SHOULD 回傳 AuthRequired(-32007)。 - false — 代理程式無須驗證即可運作,但當提供令牌時 MAY 提供增強的能力。用戶端 SHOULD 將缺失的欄位視同 true。 |
ConfigPropertySchema
相容於 JSON Schema 的屬性描述器,附帶顯示擴充功能。
標準 JSON Schema 欄位(type、title、description、default、 enum)讓驗證器能處理該結構描述。顯示擴充功能(enumLabels、 enumDescriptions)為平行的陣列,為每個 enum 值提供 UI 中繼資料。
這是通用基底類型。關於工作階段專屬的擴充功能,請參見 {@link SessionConfigPropertySchema}。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
type | 'string' | 'number' | 'boolean' | 'array' | 'object' | 是 | JSON Schema:屬性類型 |
title | string | 是 | JSON Schema:屬性的人類可讀標籤 |
description | string | 否 | JSON Schema:描述/工具提示 |
default | unknown | 否 | JSON Schema:預設值 |
enum | JsonPrimitive[] | 否 | JSON Schema:允許的值。可為任一 JSON 類型的基本值。 |
enumLabels | string[] | 否 | 顯示擴充功能:每個列舉值的人類可讀標籤(平行陣列) |
enumDescriptions | string[] | 否 | 顯示擴充功能:每個列舉值的描述(平行陣列) |
readOnly | boolean | 否 | JSON Schema:當 true 時,屬性會顯示但使用者無法修改 |
items | ConfigPropertySchema | 否 | JSON Schema:陣列項目的結構描述(當 type 為 'array' 時使用) |
properties | Record<string, ConfigPropertySchema> | 否 | JSON Schema:物件屬性的屬性描述器(當 type 為 'object' 時使用) |
required | string[] | 否 | JSON Schema:必要屬性 id 的清單(當 type 為 'object' 時使用) |
additionalProperties | ConfigPropertySchema | 否 | JSON Schema:未列於 properties 中之額外屬性的結構描述(當 type 為 'object' 時使用)。 |
ConfigSchema
描述可用設定屬性的 JSON Schema 物件。
這是通用基底類型。關於工作階段專屬的用法,請參見 {@link SessionConfigSchema}。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
type | 'object' | 是 | JSON Schema:永遠為 'object' |
properties | Record<string, ConfigPropertySchema> | 是 | JSON Schema:以屬性 id 為索引鍵的屬性描述器 |
required | string[] | 否 | JSON Schema:必要屬性 id 的清單 |
TextPosition
文字文件中以零為基底的某個位置。
| 欄位 | 類型 | 說明 |
|---|---|---|
line | number | 以零為基底的行號。 |
character | number | 該行內以零為基底的字元偏移量。 |
TextRange
文字文件中的一個範圍。
| 欄位 | 類型 | 說明 |
|---|---|---|
start | TextPosition | 範圍的起始位置。 |
end | TextPosition | 範圍的結束位置。 |
TextSelection
文字資源中的一個選取範圍。
這僅對文字資源有意義。二進位資源仍可使用資源或內嵌資源附件,但不應使用此 文字選取欄位。
| 欄位 | 類型 | 說明 |
|---|---|---|
range | TextRange | 選取範圍所涵蓋的範圍。 |
ContentRef
對儲存於狀態樹外之大型內容的參照。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
uri | URI | 是 | 內容 URI |
sizeHint | number | 否 | 以位元組為單位的近似大小 |
contentType | string | 否 | 內容 MIME 類型 |
nonce | string | 否 | 內容 nonce |
FileEdit
描述檔案修改的先後狀態與差異中繼資料。
支援建立(僅 after)、刪除(僅 before)、重新命名/移動 (before 與 after 中 uri 不同),以及編輯(uri 相同、內容不同)。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
before | | 否 | 編輯前的檔案狀態。檔案建立或就地檔案編輯時不存在。 |
after | | 否 | 編輯後的檔案狀態。檔案刪除時不存在。 |
diff | | 否 | 選用的差異顯示中繼資料 |
UsageInfo
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
inputTokens | number | 否 | 已消耗的輸入令牌 |
outputTokens | number | 否 | 已產生的輸出令牌 |
model | string | 否 | 使用的模型 |
cacheReadTokens | number | 否 | 從快取讀取的令牌 |
_meta | Record<string, unknown> | 否 | 此用量報告的額外提供者專屬中繼資料。 用戶端 MAY 在此尋找已知的選用索引鍵,以提供增強的 UI。 |
ErrorInfo
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
errorType | string | 是 | 錯誤類型識別碼 |
message | string | 是 | 人類可讀的錯誤訊息 |
stack | string | 否 | 堆疊追蹤 |
_meta | Record<string, unknown> | 否 | 此錯誤的額外提供者專屬中繼資料。 用戶端 MAY 在此尋找已知的選用索引鍵,以提供增強的 UI (例如用於更豐富、本地化訊息的結構化聊天擷取錯誤)。 |
Snapshot
已訂閱資源狀態的某個時間點快照,由 initialize、reconnect 與 subscribe 回傳。
| 欄位 | 類型 | 說明 |
|---|---|---|
resource | URI | 已訂閱的通道 URI(例如 ahp-root://、ahp-session:/<uuid> 或 ahp-chat:/<uuid>) |
state | RootState | SessionState | TerminalState | ChangesetState | ResourceWatchState | AnnotationsState | ChatState | 資源的目前狀態 |
fromSeq | number | 取此快照時的 serverSeq。後續操作將具有 serverSeq > fromSeq。 |
操作信封
每個會變動狀態的訊息都包裝在 ActionEnvelope 中,並依其 channel 欄位路由。操作酬載的完整判別聯集為 StateAction;個別操作變體記錄於各通道頁面。
ActionType
所有狀態操作的判別欄位值。
| 成員 | 值 |
|---|---|
RootAgentsChanged | 'root/agentsChanged' |
RootActiveSessionsChanged | 'root/activeSessionsChanged' |
SessionReady | 'session/ready' |
SessionCreationFailed | 'session/creationFailed' |
SessionChatAdded | 'session/chatAdded' |
SessionChatRemoved | 'session/chatRemoved' |
SessionChatUpdated | 'session/chatUpdated' |
SessionDefaultChatChanged | 'session/defaultChatChanged' |
ChatTurnStarted | 'chat/turnStarted' |
ChatDelta | 'chat/delta' |
ChatResponsePart | 'chat/responsePart' |
ChatToolCallStart | 'chat/toolCallStart' |
ChatToolCallDelta | 'chat/toolCallDelta' |
ChatToolCallReady | 'chat/toolCallReady' |
ChatToolCallConfirmed | 'chat/toolCallConfirmed' |
ChatToolCallComplete | 'chat/toolCallComplete' |
ChatToolCallResultConfirmed | 'chat/toolCallResultConfirmed' |
ChatToolCallContentChanged | 'chat/toolCallContentChanged' |
ChatToolCallAuthRequired | 'chat/toolCallAuthRequired' |
ChatToolCallAuthResolved | 'chat/toolCallAuthResolved' |
ChatTurnComplete | 'chat/turnComplete' |
ChatTurnCancelled | 'chat/turnCancelled' |
ChatError | 'chat/error' |
ChatActivityChanged | 'chat/activityChanged' |
ChatWorkingDirectorySet | 'chat/workingDirectorySet' |
ChatWorkingDirectoryRemoved | 'chat/workingDirectoryRemoved' |
SessionTitleChanged | 'session/titleChanged' |
ChatUsage | 'chat/usage' |
ChatReasoning | 'chat/reasoning' |
SessionServerToolsChanged | 'session/serverToolsChanged' |
SessionActiveClientSet | 'session/activeClientSet' |
SessionActiveClientRemoved | 'session/activeClientRemoved' |
SessionWorkingDirectorySet | 'session/workingDirectorySet' |
SessionWorkingDirectoryRemoved | 'session/workingDirectoryRemoved' |
SessionInputNeededSet | 'session/inputNeededSet' |
SessionInputNeededRemoved | 'session/inputNeededRemoved' |
ChatPendingMessageSet | 'chat/pendingMessageSet' |
ChatPendingMessageRemoved | 'chat/pendingMessageRemoved' |
ChatQueuedMessagesReordered | 'chat/queuedMessagesReordered' |
ChatDraftChanged | 'chat/draftChanged' |
ChatInputRequested | 'chat/inputRequested' |
ChatInputAnswerChanged | 'chat/inputAnswerChanged' |
ChatInputCompleted | 'chat/inputCompleted' |
SessionCustomizationsChanged | 'session/customizationsChanged' |
SessionCustomizationToggled | 'session/customizationToggled' |
SessionCustomizationUpdated | 'session/customizationUpdated' |
SessionCustomizationRemoved | 'session/customizationRemoved' |
SessionMcpServerStateChanged | 'session/mcpServerStateChanged' |
SessionMcpServerStartRequested | 'session/mcpServerStartRequested' |
SessionMcpServerStopRequested | 'session/mcpServerStopRequested' |
ChatTruncated | 'chat/truncated' |
ChatTurnsLoaded | 'chat/turnsLoaded' |
SessionIsReadChanged | 'session/isReadChanged' |
SessionIsArchivedChanged | 'session/isArchivedChanged' |
SessionActivityChanged | 'session/activityChanged' |
SessionChangesetsChanged | 'session/changesetsChanged' |
SessionConfigChanged | 'session/configChanged' |
SessionMetaChanged | 'session/metaChanged' |
ChangesetStatusChanged | 'changeset/statusChanged' |
ChangesetFileSet | 'changeset/fileSet' |
ChangesetFileRemoved | 'changeset/fileRemoved' |
ChangesetFilesReviewChanged | 'changeset/filesReviewChanged' |
ChangesetContentChanged | 'changeset/contentChanged' |
ChangesetOperationsChanged | 'changeset/operationsChanged' |
ChangesetOperationStatusChanged | 'changeset/operationStatusChanged' |
ChangesetCleared | 'changeset/cleared' |
AnnotationsSet | 'annotations/set' |
AnnotationsUpdated | 'annotations/updated' |
AnnotationsRemoved | 'annotations/removed' |
AnnotationsEntrySet | 'annotations/entrySet' |
AnnotationsEntryRemoved | 'annotations/entryRemoved' |
RootTerminalsChanged | 'root/terminalsChanged' |
RootConfigChanged | 'root/configChanged' |
TerminalData | 'terminal/data' |
TerminalInput | 'terminal/input' |
TerminalResized | 'terminal/resized' |
TerminalClaimed | 'terminal/claimed' |
TerminalTitleChanged | 'terminal/titleChanged' |
TerminalCwdChanged | 'terminal/cwdChanged' |
TerminalExited | 'terminal/exited' |
TerminalCleared | 'terminal/cleared' |
TerminalCommandDetectionAvailable | 'terminal/commandDetectionAvailable' |
TerminalCommandExecuted | 'terminal/commandExecuted' |
TerminalCommandFinished | 'terminal/commandFinished' |
ResourceWatchChanged | 'resourceWatch/changed' |
ActionOrigin
識別最初分派該操作的用戶端。
| 欄位 | 類型 | 說明 |
|---|---|---|
clientId | string | |
clientSeq | number |
ActionEnvelope
每個操作都包裝在 ActionEnvelope 中。
此信封識別該操作所屬的通道(例如根操作使用 ahp-root://、工作階段操作 使用工作階段 URI、終端機操作使用終端機 URI)。個別操作的有效負載只帶有 該操作本身固有的欄位;通道來自信封,這使得任何可訂閱的資源都能統一地 路由其操作。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | URI | 是 | 此操作所屬的通道 URI。 |
action | StateAction | 是 | |
serverSeq | number | 是 | |
origin | ActionOrigin | undefined | 是 | |
rejectionReason | string | 否 |
StateAction
所有狀態操作的判別聯集。
RootAgentsChangedAction | RootActiveSessionsChangedAction | RootTerminalsChangedAction | RootConfigChangedAction | SessionReadyAction | SessionCreationFailedAction | SessionChatAddedAction | SessionChatRemovedAction | SessionChatUpdatedAction | SessionDefaultChatChangedAction | SessionTitleChangedAction | SessionServerToolsChangedAction | SessionActiveClientSetAction | SessionActiveClientRemovedAction | SessionWorkingDirectorySetAction | SessionWorkingDirectoryRemovedAction | SessionInputNeededSetAction | SessionInputNeededRemovedAction | SessionCustomizationsChangedAction | SessionCustomizationToggledAction | SessionCustomizationUpdatedAction | SessionCustomizationRemovedAction | SessionMcpServerStateChangedAction | SessionMcpServerStartRequestedAction | SessionMcpServerStopRequestedAction | SessionIsReadChangedAction | SessionIsArchivedChangedAction | SessionActivityChangedAction | SessionChangesetsChangedAction | SessionConfigChangedAction | SessionMetaChangedAction | ChatTurnStartedAction | ChatDeltaAction | ChatResponsePartAction | ChatToolCallStartAction | ChatToolCallDeltaAction | ChatToolCallReadyAction | ChatToolCallConfirmedAction | ChatToolCallCompleteAction | ChatToolCallResultConfirmedAction | ChatToolCallContentChangedAction | ChatToolCallAuthRequiredAction | ChatToolCallAuthResolvedAction | ChatTurnCompleteAction | ChatTurnCancelledAction | ChatErrorAction | ChatActivityChangedAction | ChatWorkingDirectorySetAction | ChatWorkingDirectoryRemovedAction | ChatUsageAction | ChatReasoningAction | ChatPendingMessageSetAction | ChatPendingMessageRemovedAction | ChatQueuedMessagesReorderedAction | ChatDraftChangedAction | ChatInputRequestedAction | ChatInputAnswerChangedAction | ChatInputCompletedAction | ChatTruncatedAction | ChatTurnsLoadedAction | ChangesetStatusChangedAction | ChangesetFileSetAction | ChangesetFileRemovedAction | ChangesetFilesReviewChangedAction | ChangesetContentChangedAction | ChangesetOperationsChangedAction | ChangesetOperationStatusChangedAction | ChangesetClearedAction | AnnotationsSetAction | AnnotationsUpdatedAction | AnnotationsRemovedAction | AnnotationsEntrySetAction | AnnotationsEntryRemovedAction | TerminalDataAction | TerminalInputAction | TerminalResizedAction | TerminalClaimedAction | TerminalTitleChangedAction | TerminalCwdChangedAction | TerminalExitedAction | TerminalClearedAction | TerminalCommandDetectionAvailableAction | TerminalCommandExecutedAction | TerminalCommandFinishedAction | ResourceWatchChangedAction
基礎參數
每個指令的 params 物件都會擴充 BaseParams,確保頂層一定帶有 channel: URI。
BaseParams
每個指令的 params 所擴充的基底形狀。
channel 識別該指令所針對的通道,與每個協定通知上的 channel 欄位互相對應。 對於操作特定通道(工作階段、終端機或變更集)的指令,channel 為該通道的 URI。 對於連線層級而非通道範圍的指令(例如 {@link InitializeParams | initialize}、 {@link PingParams | ping}、{@link ListSessionsParams | listSessions}、 resource* 檔案系統指令,以及 {@link AuthenticateParams | authenticate}), 其 params 類型會將 channel 縮窄為字面根 URI 'ahp-root://'。
此不變性讓實作能藉由檢查 params.channel 來路由每個傳入訊息 — 無論是請求、回應或通知 — 而無需知道各 method 的 params 形狀。
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | URI | 此指令所針對的通道 URI。 |
指令
跨通道指令與通知。通道專屬指令(createSession、listSessions、createTerminal、invokeChangesetOperation 等)記錄於對應的通道頁面。
JSON Schema: commands.schema.json
initialize
建立新連線並協商協定版本。 這 MUST 是用戶端傳送的第一個訊息。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
protocolVersions | string[] | 是 | 用戶端願意使用的協定版本,依最偏好到最不偏好排序。每個項目為一個 SemVer MAJOR.MINOR.PATCH 字串(例如 "0.1.0")。伺服器會選取一個項目,並以 InitializeResult.protocolVersion 回傳。 若伺服器無法使用提供的任何版本,它 MUST 回傳錯誤碼 -32005 (UnsupportedProtocolVersion)。 |
clientId | string | 是 | 唯一的用戶端識別碼 |
clientInfo | Implementation | 否 | 選用的用戶端實作識別(名稱與版本)。僅供參考 — 關於其可用與不可用的方式, 請參見 {@link Implementation}。有別於 {@link InitializeParams.clientId | clientId}, 後者是每個連線用於重新連線的不透明識別碼,而非人類可讀的實作名稱。 |
initialSubscriptions | URI[] | 否 | 握手期間要訂閱的 URI |
locale | string | 否 | IETF BCP 47 語言標籤,指出用戶端的偏好地區設定(例如 "en-US"、"ja")。 伺服器 SHOULD 使用此值來本地化面向使用者的字串,例如確認選項標籤。 |
capabilities | ClientCapabilities | 否 | 選用的用戶端能力宣告。 伺服器 SHOULD 僅宣佈其對應用戶端能力在此處已設定的功能。缺少代表 「未宣告」— 伺服器 MUST 假設用戶端不支援該功能。 |
結果:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
protocolVersion | string | 是 | 伺服器選取的協定版本。MUST 是 InitializeParams.protocolVersions 中的其中 一個項目。格式為 SemVer MAJOR.MINOR.PATCH 字串 (例如 "0.1.0")。 |
serverSeq | number | 是 | 目前的伺服器序號 |
serverInfo | Implementation | 否 | 選用的伺服器實作識別(名稱與版本)。僅供參考 — 關於其可用與不可用的方式, 請參見 {@link Implementation}。相對於 {@link InitializeResult.protocolVersion | protocolVersion} 識別已協商的協定, serverInfo 則識別其背後的主機軟體。 |
snapshots | Snapshot[] | 是 | 每個 initialSubscriptions URI 的快照 |
defaultDirectory | URI | 否 | 建議用於遠端檔案系統瀏覽的預設目錄 |
completionTriggerCharacters | string[] | 否 | 在 {@link Message} 輸入中輸入時,SHOULD 讓用戶端發出帶有 {@link CompletionItemKind.UserMessage} 之 completions 請求的字元。 通常包含如 '@' 或 '/' 等字元。 |
terminalCommandPrefix | string | 否 | 主機在使用者 {@link Message.text} 開頭識別的前綴,作為將剩餘部分當作終端機 指令執行的速記。目前標準化的慣例為 "!";缺少代表主機不支援指令前綴。 |
telemetry | TelemetryCapabilities | 否 | 主機發出的 OTLP 遙測通道(若有)。每個已填入的欄位若非字面的 ahp-otlp: 通道 URI,即為用戶端在訂閱前展開的 RFC 6570 URI 範本(目前只有 logs 通道定義了範本變數 {level},供訂閱端進行嚴重性篩選)。用戶端 MAY 忽略 其無法處理的訊號。 |
詳見 生命週期。
ping
驗證 AHP 連線是否仍存活,並避免被閒置逾時的中介者(代理伺服器、負載平衡器等) 關閉。
無論用戶端是否已完成 initialize 或持有任何訂閱,伺服器都 MUST 回應。Ping 在 任一方向都不帶有效負載;回應本身即為訊號。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | 'ahp-root://' |
結果: 成功時為 null。
reconnect
重新建立已中斷的連線。伺服器會重播遺漏的操作或提供新的快照。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | 'ahp-root://' | |
clientId | string | 原始連線的用戶端識別碼 |
lastSeenServerSeq | number | 用戶端收到的最後一個 serverSeq |
subscriptions | URI[] | 用戶端已訂閱的 URI |
結果(重播): 當伺服器可從請求的序列重播時:
| 欄位 | 類型 | 說明 |
|---|---|---|
type | ReconnectResultType.Replay | 判別欄位 |
actions | ActionEnvelope[] | 自 lastSeenServerSeq 以來遺漏的操作信封 |
missing | URI[] | ReconnectParams.subscriptions 中伺服器無法恢復的 URI。這包括已不存在的資源 (例如已處置的工作階段或終端機),以及用戶端不再獲許觀察的資源。用戶端 SHOULD 將這些從其本地訂閱集合中捨棄。 |
結果(快照): 當間距超過重播緩衝區時:
| 欄位 | 類型 | 說明 |
|---|---|---|
type | ReconnectResultType.Snapshot | 判別欄位 |
snapshots | Snapshot[] | 每個訂閱的新快照 |
詳見 生命週期。
subscribe
訂閱以 URI 識別的通道。
通道 MAY 帶有相關聯的狀態(例如根、工作階段、終端機),或是無狀態的 (純粹用於串流資料的發佈/訂閱)。對於帶有狀態的通道,結果會包含快照; 對於無狀態的通道則省略 snapshot。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
delivery | SubscriptionDeliveryOptions | 否 | 此訂閱的選用傳遞偏好。 伺服器 MAY 使用這些偏好來緩衝並合併高頻率的更新,同時保留相同的縮減狀態。 省略此欄位則採用伺服器的預設傳遞行為。 |
view | SubscribeView | 否 | 針對回傳快照的選用用戶端請求形狀。 不理解所請求 view 的伺服器會忽略它並回傳其預設快照。用戶端 MUST 容忍收到 比請求更多的狀態。 |
結果:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
snapshot | Snapshot | 否 | 已訂閱通道狀態的快照(無狀態的通道會省略) |
詳見 訂閱。
unsubscribe
停止接收某個通道的更新。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 通知 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | URI | 要取消訂閱的通道 URI |
詳見 訂閱。
dispatchAction
射後即忘的操作分派(預寫入)。用戶端將操作樂觀地套用到本地狀態,而伺服器一旦 接受就會以 {@link ActionEnvelope} 回傳它們。
用戶端 → 伺服器的 method 名為 dispatchAction;伺服器的回覆會透過 伺服器 → 用戶端的 action 通知抵達(params:{@link ActionEnvelope})。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 通知 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | URI | 此操作所針對的通道 URI |
clientSeq | number | 用戶端序號 |
action | StateAction | 要分派的操作 |
詳見 操作。
resourceRead
依 URI 讀取資源的內容。
內容參照以參照而非內嵌的方式儲存大型資料(影像、冗長的工具輸出),藉此讓狀態 樹保持小巧。
二進位內容(影像等)MUST 使用 base64 編碼。文字內容 MAY 使用 utf-8 編碼。
如同所有 resource* method,resourceRead 是對稱的,MAY 在任一方向傳送。 主機用它來從用戶端發佈的 URI(例如 virtual://my-client/... 外掛)擷取內容; 用戶端用它來讀取主機端的檔案。無論由哪一端發起,接收端都透過相同的 權限/resourceRequest 流程來強制執行存取。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
uri | string | 是 | 來自 ContentRef 的內容 URI |
encoding | ContentEncoding | 否 | 回傳資料的偏好編碼(預設:由伺服器選擇) |
結果:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
data | string | 是 | 編碼為字串的內容 |
encoding | ContentEncoding | 是 | data 的編碼方式 |
contentType | string | 否 | 內容類型(例如 "image/png"、"text/plain") |
範例:
// Client → Server
{ "jsonrpc": "2.0", "id": 10, "method": "resourceRead",
"params": { "uri": "ahp-session:/<uuid>/content/img-1" } }
// Server → Client
{ "jsonrpc": "2.0", "id": 10, "result": {
"data": "iVBORw0KGgo...",
"encoding": "base64",
"contentType": "image/png"
}}resourceWrite
將內容寫入伺服器檔案系統上的檔案。
二進位內容(影像等)MUST 使用 base64 編碼。文字內容 MAY 使用 utf-8 編碼。
若檔案不存在,會予以建立。若檔案已存在,對現有位元組的影響取決於 {@link ResourceWriteParams.mode}:truncate(預設)從所選偏移量開始覆寫、 append 保留所有現有位元組並在以 EOF 為基準的位置加入 data,而 insert 保留所有現有位元組並在以檔案開頭為基準的偏移量處拼接 data。
如同所有 resource* method,resourceWrite 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
uri | URI | 是 | 伺服器檔案系統上的目標檔案 URI |
data | string | 是 | 編碼為字串的內容 |
encoding | ContentEncoding | 是 | data 的編碼方式 |
contentType | string | 否 | 內容類型(例如 "text/plain"、"image/png") |
createOnly | boolean | 否 | 若為 true,當檔案已存在時伺服器 MUST 失敗,而非覆寫它。適用於安全地 建立新檔案。 |
mode | ResourceWriteMode | 否 | data 在目標檔案中的放置方式。省略時預設為 'truncate'(完整覆寫)。 關於各模式的意義及其對 {@link position} 的解讀,請參見 {@link ResourceWriteMode}。 |
position | number | 否 | 依 {@link mode} 解讀的位元組偏移量。預設為 0。 - truncate:從檔案開頭起算,要在寫入前截斷的偏移量。 - append:從 EOF 往回起算,要插入 data 的位元組數。 - insert:從檔案開頭起算,要拼接 data 的偏移量。 |
ifMatch | string | 否 | 先前由 {@link ResourceResolveResult.etag} 回傳的樂觀並行令牌。設定後,若目前 的 etag 不相符,伺服器 MUST 以 Conflict 失敗 — 以防止 resourceResolve 與後續 resourceWrite 之間的更新遺失。 |
結果:
(空物件)
範例:
// Client → Server
{ "jsonrpc": "2.0", "id": 11, "method": "resourceWrite",
"params": { "uri": "file:///workspace/hello.txt", "data": "SGVsbG8=",
"encoding": "base64", "contentType": "text/plain" } }
// Server → Client
{ "jsonrpc": "2.0", "id": 11, "result": {} }resourceList
列出伺服器檔案系統上某個檔案 URI 的目錄項目。
這是為了遠端資料夾挑選器及類似的 UI 而設計,這類 UI 需要讓使用者瀏覽伺服器 的本地檔案系統。
伺服器 MUST 僅在目標存在且為目錄時回傳成功。若目標不存在、不是目錄或無法 存取,伺服器 MUST 回傳 JSON-RPC 錯誤。
如同所有 resource* method,resourceList 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | 'ahp-root://' | |
uri | URI | 伺服器檔案系統上的目錄 URI |
結果:
| 欄位 | 類型 | 說明 |
|---|---|---|
entries | DirectoryEntry[] | 直接包含在所請求目錄中的項目 |
resourceCopy
將資源從某個 URI 複製到另一個 URI(位於伺服器的檔案系統)。
若目的地已存在,除非設定了 failIfExists,否則會被覆寫。
如同所有 resource* method,resourceCopy 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
source | URI | 是 | 要從中複製的來源 URI |
destination | URI | 是 | 要複製到的目的地 URI |
failIfExists | boolean | 否 | 若為 true,當目的地已存在時伺服器 MUST 失敗,而非覆寫它。 |
結果:
(空物件)
resourceDelete
刪除伺服器檔案系統上位於某個 URI 的資源。
如同所有 resource* method,resourceDelete 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
uri | URI | 是 | 要刪除的資源 URI |
recursive | boolean | 否 | 若為 true 且目標為目錄,則遞迴刪除它及其所有內容。若為 false(預設), 刪除非空目錄時 MUST 失敗。 |
結果:
(空物件)
resourceRequest
請求存取接收端檔案系統上某個資源的權限。
resourceRequest 是對稱的,MAY 在任一方向傳送:用戶端要求伺服器授予對伺服器端 資源的存取權,或伺服器要求用戶端授予對用戶端端資源的存取權。接收端決定要允許、 拒絕,還是針對所請求的存取提示使用者。
若接收端拒絕存取,它 MUST 以 PermissionDenied(-32009) 回應。錯誤資料 MAY 包含一個 ResourceRequestParams 值,描述呼叫端需要被授予哪些存取權該操作才會 成功;請參見 types/errors.ts 中的 PermissionDeniedErrorData。
在 resourceRequest 成功後,呼叫端 MAY 使用對應的 resource* 指令(例如 resourceRead、resourceWrite)來執行該操作。接收端 MAY 隨時撤銷存取權,只需 在後續操作中回傳 PermissionDenied。
read、write 或兩者 SHOULD 至少有一個設為 true。兩個旗標皆未設定的請求, 接收端會視為 read: true。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
uri | URI | 是 | 所請求的資源 URI。通常是接收端檔案系統上的 file: URI,但任何由接收端仲介 存取的 URI 配置皆可。 |
read | boolean | 否 | 呼叫端是否需要對該資源的讀取權。 |
write | boolean | 否 | 呼叫端是否需要對該資源的寫入權。 |
結果:
(空物件)
resourceMove
將資源從某個 URI 移動(重新命名)到另一個 URI(位於伺服器的檔案系統)。
若目的地已存在,除非設定了 failIfExists,否則會被覆寫。
如同所有 resource* method,resourceMove 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
source | URI | 是 | 要從中移動的來源 URI |
destination | URI | 是 | 要移動到的目的地 URI |
failIfExists | boolean | 否 | 若為 true,當目的地已存在時伺服器 MUST 失敗,而非覆寫它。 |
結果:
(空物件)
resourceResolve
解析資源 — 結合 POSIX 的 stat 與 realpath。
resourceResolve 回傳資源的中繼資料,以及符號連結解析後的標準 URI。請以此 取代任何 resourceExists 的權宜措施:缺少的資源 MUST 以 NotFound JSON-RPC 錯誤呈現,而非帶有哨兵值的成功回應。真正需要布林檢查的呼叫端應嘗試 resourceResolve,並將 NotFound 視為「不存在」。
如同所有 resource* method,resourceResolve 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
uri | URI | 是 | 要解析的 URI |
followSymlinks | boolean | 否 | 當為 true(預設)時,跟隨符號連結並回報連結目標的中繼資料 — 並將結果中的 uri 設為標準(realpath)URI。當為 false 時,對連結本身執行 stat (lstat 語意)並回報 type: 'symlink'。 |
結果:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
uri | URI | 是 | 符號連結解析後的標準 URI。當 followSymlinks 為 false 或該 URI 未穿越 符號連結時,等於所請求的 URI。 |
type | ResourceType | 是 | 資源種類。 |
size | number | 否 | 以位元組為單位的大小。當提供者無法廉價地計算時,對目錄省略。 |
mtime | string | 否 | 上次修改時間,採 ISO 8601 格式(已知時)。 |
ctime | string | 否 | 建立時間,採 ISO 8601 格式(已知時)。 |
contentType | string | 否 | 嗅探得到的 MIME 類型(已知時,例如 "text/plain"、"image/png")。 |
etag | string | 否 | 不透明的各提供者版本令牌。出現時,請將其作為 {@link ResourceWriteParams.ifMatch} 傳入後續的 resourceWrite,以偵測並行的修改。 |
範例:
// Client → Server
{ "jsonrpc": "2.0", "id": 20, "method": "resourceResolve",
"params": { "channel": "ahp-root://", "uri": "file:///workspace/hello.txt" } }
// Server → Client
{ "jsonrpc": "2.0", "id": 20, "result": {
"uri": "file:///workspace/hello.txt",
"type": "file",
"size": 5,
"mtime": "2026-01-15T12:34:56.789Z",
"etag": "W/\"5-abc123\""
}}resourceMkdir
以 mkdir -p 語意在伺服器的檔案系統上建立目錄。
伺服器 MUST 建立任何缺少的父目錄。建立已存在的目錄為無操作的成功。若 uri 已存在但不是目錄,伺服器 MUST 以 AlreadyExists 失敗。
如同所有 resource* method,resourceMkdir 是對稱的,MAY 在任一方向傳送。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 ↔ 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 說明 |
|---|---|---|
channel | 'ahp-root://' | |
uri | URI | 要建立的目錄 URI(視需要建立父目錄)。 |
結果:
(空物件)
authenticate
為受保護資源推送 ******。resource 欄位 MUST 符合用戶端從伺服器發現的受保護 資源識別碼 — 無論是靜態宣告於 AgentInfo.protectedResources,或是從即時的 McpServerAuthRequiredState.resource 或 ToolCallAuthRequiredState.auth.resource 動態發現(後兩者僅在對應的 MCP 伺服器或工具呼叫實際挑戰驗證時才會浮現)。 伺服器 MUST 接受其透過這三種機制之一所自行宣佈的任何 resource 值。
令牌使用 RFC 6750 (****** 使用)語意傳遞。用戶端從資源中繼資料所列的授權伺服器取得令牌, 並透過此指令將其推送給伺服器。
| 屬性 | 值 |
|---|---|
| 方向 | 用戶端 → 伺服器 |
| 類型 | 請求 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | 'ahp-root://' | 是 | |
resource | string | 是 | 受保護資源識別碼。MUST 符合伺服器已宣佈的 resource 值 — 透過 AgentInfo.protectedResources 中的 ProtectedResourceMetadata,或是透過 即時的 McpServerAuthRequiredState.resource/ToolCallAuthRequiredState.auth.resource。 |
token | string | 是 | 從資源的授權伺服器取得的 |
scopes | string[] | 否 | 令牌所授予的 OAuth 範圍(已知時)。讓伺服器能判斷某個特定挑戰 — 例如即時 McpServerAuthRequiredState 或 ToolCallAuthRequiredState.auth 上的 requiredScopes — 是否已滿足,而無需解碼(不透明、伺服器專屬的)令牌本身。 當用戶端未將已授予的範圍與令牌分開追蹤時省略。 |
結果:
(空物件)
詳見 驗證。
範例:
// Client → Server
{ "jsonrpc": "2.0", "id": 3, "method": "authenticate",
"params": { "channel": "ahp-root://", "resource": "https://api.github.com", "token": "gho_xxxx" } }
// Server → Client (success)
{ "jsonrpc": "2.0", "id": 3, "result": {} }
// Server → Client (failure — invalid token)
{ "jsonrpc": "2.0", "id": 3, "error": { "code": -32007, "message": "Invalid token" } }通知
通知是短暫的廣播,不屬於狀態樹的一部分。它們不會被 reducer 處理,也不會在重新連線時重播。每個通知都帶有頂層 channel: URI,用來識別其所屬的訂閱。
JSON Schema: notifications.schema.json
auth/required
當受保護資源需要(重新)驗證時,由伺服器發送。
此通知 MAY 與任何通道關聯 — 例如在根通道上公告的代理程式,或是某個 工作階段專屬資源。channel 欄位識別此驗證需求所屬的訂閱;resource 欄位則帶有受 OAuth 保護的資源識別碼(依 RFC 9728)。
用戶端應取得新的令牌,並透過 authenticate 指令推送它。
| 屬性 | 值 |
|---|---|
| 方向 | 伺服器 → 用戶端 |
| 類型 | 通知 |
參數:
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
channel | URI | 是 | 此通知所屬的通道 URI |
resource | string | 是 | 需要驗證的受保護資源識別碼 |
reason | AuthRequiredReason | 否 | 要求驗證的原因 |
範例:
{
"jsonrpc": "2.0",
"method": "auth/required",
"params": {
"channel": "ahp-root://",
"resource": "https://api.github.com",
"reason": "expired"
}
}JSON-RPC 線路類型
基礎 JSON-RPC 訊息形狀,以及驅動判別聯集包裝器的具型別登錄檔(AhpRequest、AhpResponse、AhpClientNotification、AhpServerNotification、AhpNotification、ProtocolMessage)。
JsonRpcRequest
JSON-RPC 請求:同時具有 method 與 id。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
jsonrpc | '2.0' | 是 | |
id | number | 是 | |
method | string | 是 | |
params | unknown | 否 |
JsonRpcSuccessResponse
JSON-RPC 成功回應。
| 欄位 | 類型 | 說明 |
|---|---|---|
jsonrpc | '2.0' | |
id | number | |
result | unknown |
JsonRpcErrorResponse
JSON-RPC 錯誤回應。
| 欄位 | 類型 | 說明 |
|---|---|---|
jsonrpc | '2.0' | |
id | number | |
error | |
JsonRpcNotification
JSON-RPC 通知:具有 method 但沒有 id。
| 欄位 | 類型 | 必要 | 說明 |
|---|---|---|---|
jsonrpc | '2.0' | 是 | |
method | string | 是 | |
params | unknown | 否 |
AhpErrorResponse
一個型別化的 JSON-RPC 錯誤回應,其錯誤物件為完整型別化的 {@link AhpError}。當呼叫端知道該回應是 AHP 應用錯誤,且希望 data 依 code 縮窄時,此型別相當實用。
| 欄位 | 類型 | 說明 |
|---|---|---|
jsonrpc | '2.0' | |
id | number | |
error | AhpError |
登錄檔
判別聯集包裝器是以這些登錄檔介面參數化。每個屬性都是一個 JSON-RPC 方法名稱;每個值都是一個 { params; result? } 型別字面值。
CommandMap
將每個指令 method 名稱對應到其 params 與 result 類型的登錄。
CommandMap 涵蓋由用戶端傳送給伺服器的 method。也可能由伺服器發起的 method 會重複出現在 {@link ServerCommandMap} 中;兩份對應中的項目保持一致。
export interface CommandMap {
'initialize': { params: InitializeParams; result: InitializeResult };
'ping': { params: PingParams; result: null };
'reconnect': { params: ReconnectParams; result: ReconnectResult };
'subscribe': { params: SubscribeParams; result: SubscribeResult };
'createSession': { params: CreateSessionParams; result: null };
'disposeSession': { params: DisposeSessionParams; result: null };
'createChat': { params: CreateChatParams; result: null };
'disposeChat': { params: DisposeChatParams; result: null };
'createTerminal': { params: CreateTerminalParams; result: null };
'disposeTerminal': { params: DisposeTerminalParams; result: null };
'createResourceWatch': { params: CreateResourceWatchParams; result: CreateResourceWatchResult };
'listSessions': { params: ListSessionsParams; result: ListSessionsResult };
'resourceRead': { params: ResourceReadParams; result: ResourceReadResult };
'resourceWrite': { params: ResourceWriteParams; result: ResourceWriteResult };
'resourceList': { params: ResourceListParams; result: ResourceListResult };
'resourceCopy': { params: ResourceCopyParams; result: ResourceCopyResult };
'resourceDelete': { params: ResourceDeleteParams; result: ResourceDeleteResult };
'resourceMove': { params: ResourceMoveParams; result: ResourceMoveResult };
'resourceResolve': { params: ResourceResolveParams; result: ResourceResolveResult };
'resourceMkdir': { params: ResourceMkdirParams; result: ResourceMkdirResult };
'resourceRequest': { params: ResourceRequestParams; result: ResourceRequestResult };
'fetchTurns': { params: FetchTurnsParams; result: FetchTurnsResult };
'authenticate': { params: AuthenticateParams; result: AuthenticateResult };
'resolveSessionConfig': { params: ResolveSessionConfigParams; result: ResolveSessionConfigResult };
'sessionConfigCompletions': { params: SessionConfigCompletionsParams; result: SessionConfigCompletionsResult };
'completions': { params: CompletionsParams; result: CompletionsResult };
'invokeChangesetOperation': { params: InvokeChangesetOperationParams; result: InvokeChangesetOperationResult };
}ServerCommandMap
將每個伺服器 → 用戶端請求 method 對應到其 params 與 result 類型的登錄。
resource* 家族是對稱的:每個出現在 {@link CommandMap} 中的 method 也會 以相同的 params/result 形狀出現在此處,而無論由哪一端發起,接收端都會決定 要允許、拒絕或針對所請求的操作提示使用者。主機使用反向方向來讀取用戶端發佈的 URI(例如 virtual://my-client/... 外掛),並驅動各工作階段的檔案系統提供者, 而用戶端無需重新實作線路結構描述。
export interface ServerCommandMap {
'resourceRead': { params: ResourceReadParams; result: ResourceReadResult };
'resourceWrite': { params: ResourceWriteParams; result: ResourceWriteResult };
'resourceList': { params: ResourceListParams; result: ResourceListResult };
'resourceCopy': { params: ResourceCopyParams; result: ResourceCopyResult };
'resourceDelete': { params: ResourceDeleteParams; result: ResourceDeleteResult };
'resourceMove': { params: ResourceMoveParams; result: ResourceMoveResult };
'resourceResolve': { params: ResourceResolveParams; result: ResourceResolveResult };
'resourceMkdir': { params: ResourceMkdirParams; result: ResourceMkdirResult };
'resourceRequest': { params: ResourceRequestParams; result: ResourceRequestResult };
'createResourceWatch': { params: CreateResourceWatchParams; result: CreateResourceWatchResult };
}ClientNotificationMap
將每個用戶端 → 伺服器通知 method 對應到其 params 類型的登錄。
每個通知的 params MUST 帶有頂層的 channel: URI,以便伺服器能將訊息路由到 正確的訂閱。關於標準的「基底」形狀,請參見 {@link UnsubscribeParams}。
export interface ClientNotificationMap {
'unsubscribe': { params: UnsubscribeParams };
'dispatchAction': { params: DispatchActionParams };
}ServerNotificationMap
將每個伺服器 → 用戶端通知 method 對應到其 params 類型的登錄。
每個通知的 params MUST 帶有頂層的 channel: URI,以便用戶端能將訊息分派到 正確的訂閱。
export interface ServerNotificationMap {
'action': { params: ActionEnvelope };
'root/sessionAdded': { params: SessionAddedParams };
'root/sessionRemoved': { params: SessionRemovedParams };
'root/sessionSummaryChanged': { params: SessionSummaryChangedParams };
'root/progress': { params: ProgressParams };
'auth/required': { params: AuthRequiredParams };
'otlp/exportLogs': { params: OtlpExportLogsParams };
'otlp/exportTraces': { params: OtlpExportTracesParams };
'otlp/exportMetrics': { params: OtlpExportMetricsParams };
}具型別包裝器
AhpRequest
針對特定 AHP 指令的完整型別化 JSON-RPC 請求。
當作為聯集使用時(預設泛型),對 method 縮窄即可得到型別化的 params:
function handle(req: AhpRequest) {
if (req.method === 'fetchTurns') {
req.params.session; // typed as URI
}
}預設為用戶端 → 伺服器請求({@link CommandMap})。請使用 {@link AhpServerRequest} 來處理伺服器 → 用戶端請求。
M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly method: M; readonly params: CommandMap[M]['params']; } : never
AhpServerRequest
由伺服器發起的完整型別化 JSON-RPC 請求。形狀與 {@link AhpRequest} 相同, 但以 {@link ServerCommandMap} 參數化。
M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly method: M; readonly params: ServerCommandMap[M]['params']; } : never
AhpSuccessResponse
針對特定 AHP 指令的完整型別化 JSON-RPC 成功回應。
由於 JSON-RPC 回應不帶有 method,當您從關聯的請求得知 method 時, 請搭配明確的泛型參數使用此型別:
const result: AhpSuccessResponse<'listSessions'> = ...;
result.result.items; // typed as SessionSummary[]M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly result: CommandMap[M]['result']; } : never
AhpResponse
型別化的 JSON-RPC 回應(帶有已知 result 類型的成功回應,或錯誤回應)。
AhpSuccessResponse<M> | JsonRpcErrorResponse
AhpServerSuccessResponse
針對伺服器 → 用戶端請求({@link ServerCommandMap})的完整型別化 JSON-RPC 成功回應。
M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly result: ServerCommandMap[M]['result']; } : never
AhpServerResponse
針對伺服器 → 用戶端請求的型別化 JSON-RPC 回應。
AhpServerSuccessResponse<M> | JsonRpcErrorResponse
AhpClientNotification
用戶端 → 伺服器通知。
M extends unknown ? { readonly jsonrpc: '2.0'; readonly method: M; readonly params: ClientNotificationMap[M]['params']; } : never
AhpServerNotification
伺服器 → 用戶端通知。
M extends unknown ? { readonly jsonrpc: '2.0'; readonly method: M; readonly params: ServerNotificationMap[M]['params']; } : never
AhpNotification
完整型別化的 JSON-RPC 通知 — 任一方向皆可。
用戶端 → 伺服器的 dispatchAction method 與伺服器 → 用戶端的 action method 是登錄中兩個不同的項目;其 params 具有不相關的形狀 ({@link DispatchActionParams} 與 {@link ActionEnvelope})。
AhpClientNotification | AhpServerNotification
ProtocolMessage
所有 AHP 協定訊息的判別聯集。
使用標準 JSON-RPC 結構來縮窄:
- 帶有
method+id→ 請求({@link AhpRequest} 或 {@link AhpServerRequest}) - 帶有
method、無id→ 通知({@link AhpNotification}) - 帶有
result或error+id→ 回應({@link AhpResponse})
接著對 method 縮窄以取得完整型別化的 params:
function dispatch(msg: ProtocolMessage) {
if ('method' in msg && 'id' in msg) {
// msg is AhpRequest | AhpServerRequest
if (msg.method === 'fetchTurns') {
msg.params.session; // URI
}
}
}AhpRequest | AhpServerRequest | AhpSuccessResponse | AhpServerSuccessResponse | JsonRpcErrorResponse | AhpNotification