@deepseek-ai/dsh-tool-cordis 0.2.0-rc.1 → 0.2.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -18,8 +18,8 @@
18
18
  en: e8c90b0ad037513c
19
19
  zh: 563454508c30d9b0
20
20
  /deepseek-ai-dsh-tool-cordis/understand-the-implementation:
21
- en: de18fe3471a4a341
22
- zh: fda07860cfe1e325
21
+ en: ff959016d633c6c0
22
+ zh: d84dfa7e9d73532f
23
23
  /deepseek-ai-dsh-tool-cordis/further-exploration:
24
24
  en: 1863373f02bcc196
25
25
  zh: 3efdbf5569411562
@@ -39,8 +39,8 @@
39
39
  en: f57a20cd4e76d13c
40
40
  zh: 7b673116422bee87
41
41
  /deepseek-ai-dsh-tool-cordis/known-limitations-and-deferred-work:
42
- en: ffe15dd1fd333dbf
43
- zh: b256afc74a1782cb
42
+ en: 3c135d9cb67790d2
43
+ zh: ff2d0a444f55d28f
44
44
  /deepseek-ai-dsh-tool-cordis/known-limitations-and-deferred-work/dev-note:
45
45
  en: 0a1253c6f7b5e8b9
46
46
  zh: 9f56528562c7c914
package/README.md CHANGED
@@ -35,7 +35,7 @@ Creator mode includes this toolset. Other compositions mount `@deepseek-ai/dsh-t
35
35
  <details>
36
36
  <summary>Implementation internals — click to expand</summary>
37
37
 
38
- Host providers combine generated Service/Event catalogs, the live Loader tree projected through the app-boot Config projector, and the requesting agent's tool registry. Client providers synchronize their manifests through the existing inspection registry and answer queries from a connected page. The host entry owns the Host provider registrations and the preset row owns the two tools, each through Cordis effects; the registry rejects a duplicate provider id, which is why the providers register once per process rather than per preset. No invariant companion is published because inspection reads its providers directly and maintains no independent runtime projection.
38
+ Host providers combine generated Service/Event catalogs, the live Loader tree projected through the app-boot Config projector, and the requesting agent's tool registry. Client providers synchronize their manifests through the existing inspection registry and answer queries from a connected page. The host entry owns the Host provider registrations and the preset row owns the two tools, each through Cordis effects; the registry rejects a duplicate provider id, which is why the providers register once per process rather than per preset.
39
39
 
40
40
  </details>
41
41
 
@@ -68,7 +68,7 @@ Unchanged tool schemas remain prefix-stable. Query results append to history; en
68
68
 
69
69
  <a id="known-limitations-and-deferred-work"></a>
70
70
 
71
- - Client queries wait for a responding page or cancellation. Inspection cannot invoke service methods, configure plugins, or execute generated code.
71
+ - Client queries need a responding page and use the Host runner's [bounded wait and retry policy](../cordis-host-runner/README.md#client-inspection). Inspection cannot invoke service methods, configure plugins, or execute generated code.
72
72
  - `Config.listConfigs` walks the profile Loader tree only. Agent preset `plugins` lists mount in detached preset trees, so a plugin present only inside a preset declaration is not listed unless the profile tree also mounts it.
73
73
 
74
74
  <a id="dev-note"></a>
package/README.zh.md CHANGED
@@ -35,7 +35,7 @@ kind: "package-reference"
35
35
  <details>
36
36
  <summary>实现细节 — 点击展开</summary>
37
37
 
38
- Host provider 结合生成的 Service/Event 目录、经 app-boot Config 投影器投影的运行中 Loader 树,以及请求 agent 的工具注册表。Client provider 通过现有检查注册表同步清单,并从已连接页面回答查询。宿主入口持有 Host provider 的注册,preset 行持有两个工具,都通过 Cordis effect;注册表拒绝重复的 provider id,所以 provider 按进程注册一次而不是按 preset 注册。检查直接读取 provider,不维护独立运行时投影,因此不发布不变式配套插件。
38
+ Host provider 结合生成的 Service/Event 目录、经 app-boot Config 投影器投影的运行中 Loader 树,以及请求 agent 的工具注册表。Client provider 通过现有检查注册表同步清单,并从已连接页面回答查询。宿主入口持有 Host provider 的注册,preset 行持有两个工具,都通过 Cordis effect;注册表拒绝重复的 provider id,所以 provider 按进程注册一次而不是按 preset 注册。
39
39
 
40
40
  </details>
41
41
 
@@ -68,7 +68,7 @@ Host provider 结合生成的 Service/Event 目录、经 app-boot Config 投影
68
68
 
69
69
  <a id="known-limitations-and-deferred-work"></a>
70
70
 
71
- - Client 查询等待页面响应或取消。检查不能调用服务方法、配置插件或执行生成代码。
71
+ - Client 查询需要页面响应,并采用 Host runner 的[有界等待与重试策略](../cordis-host-runner/README.zh.md#client-inspection)。检查不能调用服务方法、配置插件或执行生成代码。
72
72
  - `Config.listConfigs` 只遍历 profile 的 Loader 树。Agent preset 的 `plugins` 列表挂载在独立的 preset 树中,所以只出现在 preset 声明里的插件不会被列出,除非 profile 树也挂载了它。
73
73
 
74
74
  <a id="dev-note"></a>
package/lib/index.js CHANGED
@@ -54,7 +54,7 @@ function apply(ctx) {
54
54
  }));
55
55
  ctx.tools.register(defineTool({
56
56
  name: "cordis_inspect_query",
57
- description: "Run a read-only query declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before writing plugin code to read exact Service methods, Event modes, plugin Config schemas, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service methods or modify the runtime.",
57
+ description: "Run a read-only query declared by an Inspect Provider. platform, provider, and method must come from cordis_inspect_list, and input must satisfy that method's schema. Use this Tool before writing plugin code to read exact Service methods, Event modes, plugin Config schemas, Tool schemas, theme tokens, or live Slot trees and props. Host queries run locally. A Client query waits for the first valid page response within the configured timeout; otherwise it reports a Client failure or asks you to reconnect and retry. This Tool cannot invoke business Service methods or modify the runtime.",
58
58
  parameters: {
59
59
  platform: {
60
60
  type: "string",
@@ -73,6 +73,12 @@ export const SERVICE_API = [
73
73
  parameters: [{ name: 'definition', description: 'Parsed configuration supplied by the declaring plugin.' }],
74
74
  returns: 'Definition disposer after activation or its diagnostic settles; the declaring plugin owns it.',
75
75
  },
76
+ {
77
+ signature: 'inspectCompositions(ctx?: Context): AgentPresetInspection[]',
78
+ description: 'Inspect retained revisions, or the exact revision an Agent joined.',
79
+ parameters: [{ name: 'ctx', description: 'optional Agent context; omission includes all retained revisions.' }],
80
+ returns: 'detached module references and isolation diagnostics; no match returns an empty list.',
81
+ },
76
82
  {
77
83
  signature: 'async list(): Promise<AgentPreset[]>',
78
84
  description: 'Read every declared preset, including activation failures.',
@@ -487,6 +493,32 @@ export const SERVICE_API = [
487
493
  },
488
494
  ],
489
495
  },
496
+ {
497
+ key: 'claudeCodeMods',
498
+ summary: 'The bridge service: loaded mods, their hooks, and the harness listeners that raise their events.',
499
+ description: 'The bridge service: loaded mods, their hooks, and the harness listeners that raise their events. Mods join through ClaudeCodeMods.add, which defineMod calls when a mod plugin mounts. The Remote methods let a Client draw each session\'s band above the prompt and press its buttons.',
500
+ methods: [
501
+ {
502
+ signature: '@Remote({ mode: \'stream\' }) watchBand(agent: Agent, signal: AbortSignal): AsyncIterable<SurfaceSnapshot>',
503
+ description: 'Watch the band above the prompt of one session: the current drawing, then every redraw, until the Client stops watching.',
504
+ parameters: [{ name: 'agent', description: 'the session\'s agent, resolved by the Gateway.' }, { name: 'signal', description: 'carrier cancellation.' }],
505
+ returns: 'the band\'s snapshots.',
506
+ },
507
+ {
508
+ signature: '@Remote pressBand(agent: Agent, generation: number, actionId: string): Promise<SurfaceSnapshot>',
509
+ description: 'Press a button of the band\'s current drawing: runs the mod\'s `onPress` and redraws.',
510
+ parameters: [{ name: 'agent', description: 'the session\'s agent, resolved by the Gateway.' }, { name: 'generation', description: 'the drawing the Client saw.' }, { name: 'actionId', description: 'the button\'s action id in that drawing.' }],
511
+ returns: 'the snapshot after the press.',
512
+ },
513
+ {
514
+ signature: 'async add(definition: ModDefinition): Promise<() => Promise<void>>',
515
+ description: 'Load one mod beneath every mod loaded before it: run its `register`, keep its hooks, and report which of its events this host never raises.',
516
+ parameters: [{ name: 'definition', description: 'the mod as its plugin defined it.' }],
517
+ returns: 'the disposer that removes the mod\'s hooks, closes its timers, and releases its registrations.',
518
+ throws: ['Error when the name is invalid or taken, or when `register` throws (Claude Code\'s `hooks module did not load` wording).'],
519
+ },
520
+ ],
521
+ },
490
522
  {
491
523
  key: 'clientModules',
492
524
  summary: 'The web plugin table service: incremental `dsh.client` scan + wire composition + bundle route + index injection rows.',
@@ -931,8 +963,8 @@ export const SERVICE_API = [
931
963
  },
932
964
  {
933
965
  key: 'fileUploads',
934
- summary: 'Host service owning upload storage and Agent-scoped staged receipts.',
935
- description: 'Host service owning upload storage and Agent-scoped staged receipts.',
966
+ summary: 'Host service owning upload storage and receipts keyed by each receiving Agent\'s exact Session.',
967
+ description: 'Host service owning upload storage and receipts keyed by each receiving Agent\'s exact Session.',
936
968
  methods: [
937
969
  {
938
970
  signature: 'registerAgentResolver(resolve: AgentResolver): () => void',
@@ -954,7 +986,7 @@ export const SERVICE_API = [
954
986
  },
955
987
  {
956
988
  signature: 'resolve(agent: Agent, receiptId: FileUploadReceiptId): FileAttachmentRef | undefined',
957
- description: 'Resolve one staged receipt inside its receiving Agent scope.',
989
+ description: 'Resolve one staged receipt for the receiving Agent\'s exact Session.',
958
990
  parameters: [{ name: 'agent', description: 'receiving Agent.' }, { name: 'receiptId', description: 'opaque receipt minted for one completed upload.' }],
959
991
  returns: 'durable file reference, or `undefined` for an unknown or foreign receipt.',
960
992
  },
@@ -1190,19 +1222,6 @@ export const SERVICE_API = [
1190
1222
  },
1191
1223
  ],
1192
1224
  },
1193
- {
1194
- key: 'invariants',
1195
- summary: 'Package-owned invariant registry with global and regex-based selection.',
1196
- description: 'Package-owned invariant registry with global and regex-based selection.',
1197
- methods: [
1198
- {
1199
- signature: 'register(packageName: string, installer: InvariantInstaller): () => void',
1200
- description: 'Register one package\'s invariant installer. The package name is reserved even when filtering disables its checks. Enabled installers run in a child fiber; failure disposes that fiber and releases the reservation.',
1201
- parameters: [{ name: 'packageName', description: 'full npm package name that owns the contribution.' }, { name: 'installer', description: 'listener or startup-check installer for the child context.' }],
1202
- returns: 'an effect-scoped disposer for the registration.',
1203
- },
1204
- ],
1205
- },
1206
1225
  {
1207
1226
  key: 'jobController',
1208
1227
  summary: 'Host service backing the generated `ctx.remote.job` namespace.',
@@ -1588,7 +1607,7 @@ export const SERVICE_API = [
1588
1607
  signature: '@Remote listBundles(): Promise<BundleInfo[]>',
1589
1608
  description: 'Read the profile\'s installed bundles, the bundles this dsh installation supplies, and the selected names that are not bundles. A dependency without a bundle patch is listed, as a `not-bundle` problem, only while it is selected.',
1590
1609
  parameters: [],
1591
- returns: 'Package versions, manifest descriptions, rows, optional display metadata, activation selections, whether the installation offers the bundle, and removal availability.',
1610
+ returns: 'Package versions, manifest descriptions, the installable spec of profile dependencies, rows, optional display metadata, activation selections, whether the installation offers the bundle, and removal availability.',
1592
1611
  },
1593
1612
  {
1594
1613
  signature: '@Remote async registries(): Promise<PluginRegistries>',
@@ -1634,8 +1653,8 @@ export const SERVICE_API = [
1634
1653
  },
1635
1654
  {
1636
1655
  signature: '@Remote removeBundle(name: string): Promise<ChangeResult>',
1637
- description: 'Unload and remove a profile-owned bundle dependency through dsh plugin\'s pnpm path.',
1638
- parameters: [{ name: 'name', description: 'Installed dependency name.' }],
1656
+ description: 'Unload and remove a profile-owned bundle dependency through dsh plugin\'s pnpm path; a selected name no dependency holds is only deselected.',
1657
+ parameters: [{ name: 'name', description: 'Installed dependency or selected bundle name.' }],
1639
1658
  returns: 'Removal diagnostics and the remaining profile state.',
1640
1659
  },
1641
1660
  ],
@@ -1797,7 +1816,7 @@ export const SERVICE_API = [
1797
1816
  methods: [
1798
1817
  {
1799
1818
  signature: 'async create(sessionId: SessionId, request: ScheduleCreateRequest, signal?: AbortSignal): Promise<ScheduleRecord>',
1800
- description: 'Create a reminder bound to the caller-selected Session without activating it.\n\nThe request must supply a title; a missing, blank-after-trim, or over-long title rejects with `invalid_prompt` instead of deriving one from the prompt. The record is built from the clock reading taken before the request joins the serialized queue, so a create that waits behind a longer operation keeps its request-time anchor and may already be due when the queue reaches it.',
1819
+ description: 'Create a reminder bound to the caller-selected Session without activating it.\n\nThe request must supply a title; a missing, blank-after-trim, or over-long title rejects with `invalid_prompt` instead of deriving one from the prompt. A Session a delegated child owns rejects with `subagent_session`, because delivery can never reach it: the child is one whose delegation depth is above zero. The record is built from the clock reading taken before the request joins the serialized queue, so a create that waits behind a longer operation keeps its request-time anchor and may already be due when the queue reaches it.',
1801
1820
  parameters: [{ name: 'sessionId', description: 'Original Session receiving the reminder.' }, { name: 'request', description: 'Validated tool selector, required title, and reminder content.' }, { name: 'signal', description: 'Optional cancellation checked before persistence begins, including after FIFO waits.' }],
1802
1821
  returns: 'The durably stored schedule. Cancellation does not roll back an in-flight write.',
1803
1822
  },
@@ -1822,15 +1841,15 @@ export const SERVICE_API = [
1822
1841
  },
1823
1842
  {
1824
1843
  signature: '@Remote(\'delete\') async delete(request: ScheduleDeleteRequest, signal?: AbortSignal): Promise<ScheduleDeleteResult>',
1825
- description: 'Delete one task belonging to the selected Session, leaving queued messages intact.\n\nThe row is removed: the task no longer schedules, leaves `list` and `catalog`, and its saved delivery records go with it.',
1844
+ description: 'Delete one task belonging to the selected Session, leaving queued messages intact.\n\nThe row is removed: the task no longer schedules, leaves `list` and `catalog`, and its saved delivery records go with it. A task bound to a Session a delegated child owns stays deletable even though creation and timing edits refuse that binding, so a task stored before that rule existed remains removable.',
1826
1845
  parameters: [{ name: 'request', description: 'Session and exact task identity.' }, { name: 'signal', description: 'Optional cancellation checked before persistence begins, including after FIFO waits.' }],
1827
1846
  returns: 'Whether that Session owned a deleted task. Cancellation does not roll back an in-flight write.',
1828
1847
  },
1829
1848
  {
1830
1849
  signature: '@Remote(\'update\') async update(request: ScheduleUpdateRequest, signal?: AbortSignal): Promise<ScheduleUpdateResult>',
1831
- description: 'Update the name, instruction, and timing of an active task within the original Session binding without activating the Session or changing saved deliveries.\n\nEach supplied field replaces its stored value; an omitted field keeps it. A name or instruction change alone does not reset the committed target.',
1850
+ description: 'Update the name, instruction, and timing of an active task within the original Session binding without activating the Session or changing saved deliveries.\n\nEach supplied field replaces its stored value; an omitted field keeps it. A name or instruction change alone does not reset the committed target. A Session a delegated child owns returns the non-mutating `subagent_session` result, so an edit cannot re-arm a task bound to a Session delivery can never reach, and the Web editor can explain the refusal through the ordinary result it already renders.',
1832
1851
  parameters: [{ name: 'request', description: 'Task binding, complete observed record, and any combination of timing, name, and instruction.' }, { name: 'signal', description: 'Cancellation checked after domain readiness and FIFO waits, before persistence begins.' }],
1833
- returns: 'The committed record, unchanged record for a no-op, or a non-mutating input/lookup/conflict result. Storage and lifecycle failures reject; cancellation after a write starts does not roll it back.',
1852
+ returns: 'The committed record, unchanged record for a no-op, or a non-mutating input/lookup/conflict/refusal result. Storage and lifecycle failures reject; cancellation after a write starts does not roll it back.',
1834
1853
  },
1835
1854
  ],
1836
1855
  },
@@ -1854,7 +1873,7 @@ export const SERVICE_API = [
1854
1873
  {
1855
1874
  signature: '@Remote(\'list\') async list(_request: SessionListRequest, signal: AbortSignal): Promise<SessionListValue>',
1856
1875
  description: 'Read all visible Session rows without resuming an Agent.',
1857
- parameters: [{ name: '_request', description: 'reserved empty list request.' }, { name: 'signal', description: 'cancellation for persistence reads.' }],
1876
+ parameters: [{ name: '_request', description: 'reserved empty list request.' }, { name: 'signal', description: 'cancellation for persistence reads and summary generation.' }],
1858
1877
  returns: 'visible Session summaries ordered by activity.',
1859
1878
  },
1860
1879
  {
@@ -2323,7 +2342,7 @@ export const SERVICE_API = [
2323
2342
  },
2324
2343
  {
2325
2344
  signature: 'async flush(session: Session): Promise<boolean>',
2326
- description: 'Dispatch the awaited `session/flush` durability checkpoint for `session`, with the carrier captured at enter. THE flush entry point: the store owns the carrier, so callers (the checkpoint policy\'s per-request barrier, goal-round-driver\'s idle checkpoint, teardown drains, and consumers that flush themselves before reading storage) must come through here rather than dispatch a raw `ctx.parallel(\'session/flush\', …)` — one owner, one spelling, and the scoped-dispatch invariant can pin it.',
2345
+ description: 'Dispatch the awaited `session/flush` durability checkpoint for `session`, with the carrier captured at enter. THE flush entry point: the store owns the carrier, so callers (the checkpoint policy\'s per-request barrier, goal-round-driver\'s idle checkpoint, teardown drains, and consumers that flush themselves before reading storage) must come through here rather than dispatch a raw `ctx.parallel(\'session/flush\', …)` — one owner and one spelling.',
2327
2346
  parameters: [{ name: 'session', description: 'the session whose buffered events must reach durable storage.' }],
2328
2347
  returns: 'whether at least one durability listener participated, after every listener has settled successfully.',
2329
2348
  throws: ['the first registered listener failure after every listener settles.'],
@@ -2768,7 +2787,7 @@ export const SERVICE_API = [
2768
2787
  },
2769
2788
  {
2770
2789
  signature: 'get(name: string): DomainImpl | undefined',
2771
- description: 'Look up an open domain by name, untyped. Diagnostic surface (the package invariant cross-checks change events against live domain state); typed consumers hold the handle returned by open.',
2790
+ description: 'Look up an open domain by name, untyped. Diagnostic surface; typed consumers hold the handle returned by open.',
2772
2791
  parameters: [{ name: 'name', description: 'Domain name.' }],
2773
2792
  returns: 'the open domain runtime, or `undefined` when not open.',
2774
2793
  },
@@ -3308,6 +3327,12 @@ export const SERVICE_API = [
3308
3327
  description: 'Carrier adapter shared by the WebSocket mux and local Host transports.',
3309
3328
  parameters: [],
3310
3329
  },
3330
+ {
3331
+ signature: 'hasLiveClient(): boolean',
3332
+ description: 'Check for an active Client event stream.',
3333
+ parameters: [],
3334
+ returns: 'whether a stream is open and has not been cancelled.',
3335
+ },
3311
3336
  {
3312
3337
  signature: 'registerRemoteEvents( source: TypertRemoteEventSource, host: RemoteEventHostInfo, ): () => Promise<void>',
3313
3338
  description: 'Register the sole application-selected forwarded-event source.',
@@ -3334,6 +3359,26 @@ export const SERVICE_API = [
3334
3359
  summary: '`ctx.userQuestions`: validation plus the scoped answerer waterfall.',
3335
3360
  description: '`ctx.userQuestions`: validation plus the scoped answerer waterfall.',
3336
3361
  methods: [
3362
+ {
3363
+ signature: '@Remote answer(agent: Agent, callId: ToolCallId, answer: AskUserQuestionAnswer): boolean',
3364
+ description: 'Answer a continued question. The reply is steered into the agent as a user message whose source names the call; that message is also the record that closes the question in the projection.',
3365
+ parameters: [{ name: 'agent', description: 'Live root agent for the owning Session.' }, { name: 'callId', description: 'Continued question identity.' }, { name: 'answer', description: 'Complete structured answer batch, one item per question of the call.' }],
3366
+ returns: 'Whether the question is still continued; an accepted reply stays queued until the agent admits its user message.',
3367
+ throws: ['{UserQuestionError} `BAD_ANSWER` when the batch does not name each question of the call exactly once, or `REPLY_QUEUED` when a reply is already waiting for admission.'],
3368
+ },
3369
+ {
3370
+ signature: '@Remote({ mode: \'stream\' }) async *attachWait(agent: Agent, callId: ToolCallId, signal: AbortSignal): AsyncIterable<{ remainingMs: number }>',
3371
+ description: 'Let one answer UI hold a live timed wait. Closing the stream releases its claim.',
3372
+ parameters: [{ name: 'agent', description: 'Live root agent owning the question.' }, { name: 'callId', description: 'Foreground tool call to attach to.' }, { name: 'signal', description: 'Remote stream cancellation, including Client disconnect.' }],
3373
+ returns: 'One Host-computed remaining duration, or no frames once the wait ended.',
3374
+ },
3375
+ {
3376
+ signature: 'async askTimed( request: AskUserQuestionRequest & { agent: Agent }, callId: ToolCallId, timeoutMs: number, ): Promise<TimedUserQuestionResult>',
3377
+ description: 'Foreground wait whose first settlement the Client decides: the Client rejects with `ASK_TIMED_OUT` when its countdown ends, and this method maps that code to the pending result.',
3378
+ parameters: [{ name: 'request', description: 'Questions, live owner agent, and abort signal.' }, { name: 'callId', description: 'Tool call identity the Client card is keyed by.' }, { name: 'timeoutMs', description: 'Positive foreground wait in milliseconds.' }],
3379
+ returns: 'The answer when it arrives inside the window, otherwise a pending result, also when no connected Client claimed the request by the deadline.',
3380
+ throws: ['{UserQuestionError} `BAD_TIMEOUT` for a non-integer, non-positive, or oversized wait.'],
3381
+ },
3337
3382
  {
3338
3383
  signature: 'async ask(request: AskUserQuestionRequest): Promise<AskUserQuestionAnswer>',
3339
3384
  description: 'Ask the scoped answerer waterfall and wait for the user\'s answer.\n\nWhen a caller supplies an agent, human interaction is valid only for the exact live runtime root. Runtime ownership, not durable session lineage, decides this boundary: an owned child has no human answerer and would block forever, while a lineage-bearing session resumed as a new runtime root may ask normally.',
@@ -3923,7 +3968,7 @@ export const EVENT_API = [
3923
3968
  mode: 'emit',
3924
3969
  signature: '\'credentials/reference-updated\'(ref: CredentialRef): void',
3925
3970
  summary: 'Committed change to a provider-managed credential source: a `set`, an `unset`, or an external edit observed in storage.',
3926
- description: 'Committed change to a provider-managed credential source: a `set`, an `unset`, or an external edit observed in storage. Ambient process-environment changes are not observable and never emit. Listener failures are contained and logged — a sync throw and an async rejection alike — without changing the committed operation\'s outcome, except `INVARIANT`-coded failures, which rethrow after every listener ran; that rethrow reaches the emitter only from synchronous listeners, so invariant checks on this event must not be async functions.',
3971
+ description: 'Committed change to a provider-managed credential source: a `set`, an `unset`, or an external edit observed in storage. Ambient process-environment changes are not observable and never emit. Listener failures are contained and logged — a sync throw and an async rejection alike — without changing the committed operation\'s outcome.',
3927
3972
  parameters: [{ name: 'ref', description: 'the reference whose stored value changed.' }],
3928
3973
  },
3929
3974
  {
@@ -4397,6 +4442,10 @@ export const TYPE_API = [
4397
4442
  name: 'AgentPresetDocument',
4398
4443
  declaration: 'export interface AgentPresetDocument {\n readonly agentPreset: string;\n readonly content: string;\n readonly name?: string;\n readonly description?: string;\n}',
4399
4444
  },
4445
+ {
4446
+ name: 'AgentPresetInspection',
4447
+ declaration: 'export interface AgentPresetInspection {\n readonly id: string;\n readonly modules: readonly {\n readonly moduleName: string;\n readonly baseUrl?: string;\n readonly useHostBase: boolean;\n }[];\n readonly leakedServices: readonly string[];\n}',
4448
+ },
4400
4449
  {
4401
4450
  name: 'AgentPresetRoster',
4402
4451
  declaration: 'export interface AgentPresetRoster {\n readonly presets: readonly AgentPresetRow[];\n}',
@@ -4421,6 +4470,10 @@ export const TYPE_API = [
4421
4470
  name: 'AgentStatus',
4422
4471
  declaration: 'export type AgentStatus = \'idle\' | \'running\';',
4423
4472
  },
4473
+ {
4474
+ name: 'AnyHook',
4475
+ declaration: 'export type AnyHook = ModHook<unknown, unknown>;',
4476
+ },
4424
4477
  {
4425
4478
  name: 'ApiKeyRecord',
4426
4479
  declaration: 'export interface ApiKeyRecord {\n readonly kind: \'api-key\';\n readonly key?: string;\n readonly env?: Readonly<Record<string, string>>;\n}',
@@ -4453,6 +4506,10 @@ export const TYPE_API = [
4453
4506
  name: 'ArchiveSessionOptions',
4454
4507
  declaration: 'export interface ArchiveSessionOptions {\n readonly stopActivity?: boolean;\n}',
4455
4508
  },
4509
+ {
4510
+ name: 'AskOptions',
4511
+ declaration: 'export interface AskOptions {\n options?: readonly string[];\n header?: string;\n multiSelect?: true;\n}',
4512
+ },
4456
4513
  {
4457
4514
  name: 'AskUserQuestionAnswer',
4458
4515
  declaration: 'export interface AskUserQuestionAnswer {\n answers: AskUserQuestionAnswerItem[];\n}',
@@ -4479,7 +4536,7 @@ export const TYPE_API = [
4479
4536
  },
4480
4537
  {
4481
4538
  name: 'AskUserQuestionRequestEvent',
4482
- declaration: 'export interface AskUserQuestionRequestEvent {\n questions: AskUserQuestionItem[];\n agent?: Agent;\n signal?: AbortSignal;\n}',
4539
+ declaration: 'export interface AskUserQuestionRequestEvent {\n questions: AskUserQuestionItem[];\n agent?: Agent;\n signal?: AbortSignal;\n wait?: {\n callId: ToolCallId;\n timed?: boolean;\n };\n}',
4483
4540
  },
4484
4541
  {
4485
4542
  name: 'AssembleContext',
@@ -4597,6 +4654,10 @@ export const TYPE_API = [
4597
4654
  name: 'BashEnvVariableInfo',
4598
4655
  declaration: 'export interface BashEnvVariableInfo extends BashEnvVariable {\n contributor: string;\n key: DshEnvironmentKey;\n}',
4599
4656
  },
4657
+ {
4658
+ name: 'BoxProps',
4659
+ declaration: 'export interface BoxProps {\n readonly flexDirection?: \'row\' | \'column\' | undefined;\n readonly paddingX?: number | undefined;\n readonly paddingY?: number | undefined;\n readonly padding?: number | undefined;\n readonly gap?: number | undefined;\n readonly border?: boolean | string | undefined;\n readonly borderColor?: string | undefined;\n readonly children?: UiNode | undefined;\n}',
4660
+ },
4600
4661
  {
4601
4662
  name: 'Branded',
4602
4663
  declaration: 'export type Branded<B extends string> = string & {\n readonly [BRAND]: B;\n};',
@@ -4611,15 +4672,19 @@ export const TYPE_API = [
4611
4672
  },
4612
4673
  {
4613
4674
  name: 'BundleInfo',
4614
- declaration: 'export interface BundleInfo {\n name: string;\n version?: string;\n meta?: PluginLocalizedMeta;\n description?: string;\n enabled: boolean;\n installed: boolean;\n optional: boolean;\n removable: boolean;\n readOnlyReason?: ReadOnlyReason;\n error?: ManagementError;\n rows: BundleRowInfo[];\n overrides: string[];\n}',
4675
+ declaration: 'export interface BundleInfo {\n name: string;\n version?: string;\n meta?: PluginLocalizedMeta;\n description?: string;\n enabled: boolean;\n installed: boolean;\n source?: string;\n optional: boolean;\n removable: boolean;\n readOnlyReason?: ReadOnlyReason;\n error?: ManagementError;\n rows: BundleRowInfo[];\n overrides: string[];\n}',
4615
4676
  },
4616
4677
  {
4617
4678
  name: 'BundleRowInfo',
4618
4679
  declaration: 'export interface BundleRowInfo {\n rowId: string;\n moduleName: string;\n meta?: PluginLocalizedMeta;\n entryId?: PluginEntryId;\n}',
4619
4680
  },
4681
+ {
4682
+ name: 'ButtonProps',
4683
+ declaration: 'export interface ButtonProps {\n readonly label: string;\n readonly hotkey?: string | undefined;\n readonly disabled?: boolean | undefined;\n readonly onPress?: (() => unknown) | undefined;\n}',
4684
+ },
4620
4685
  {
4621
4686
  name: 'ChangeResult',
4622
- declaration: 'export interface ChangeResult {\n changed: boolean;\n application: \'applied\' | \'restart-required\' | \'overridden\' | \'failed\' | \'cancelled\';\n stage: \'install\' | \'enable\' | \'remove\';\n target: string;\n enabled?: boolean;\n error?: ManagementError;\n warnings?: string[];\n packageResult?: PackageResult;\n bundle?: string;\n pendingBuilds?: string[];\n approvedBuilds?: string[];\n registries?: Registry[];\n failedAt?: \'registry\' | \'spec-host\';\n}',
4687
+ declaration: 'export interface ChangeResult {\n changed: boolean;\n application: \'applied\' | \'restart-required\' | \'overridden\' | \'failed\' | \'cancelled\';\n stage: \'install\' | \'enable\' | \'remove\';\n target: string;\n enabled?: boolean;\n error?: ManagementError;\n warnings?: string[];\n packageResult?: PackageResult;\n bundle?: string;\n version?: string;\n pendingBuilds?: string[];\n approvedBuilds?: string[];\n registries?: Registry[];\n failedAt?: \'registry\' | \'spec-host\';\n}',
4623
4688
  },
4624
4689
  {
4625
4690
  name: 'ClientArtifactBaseline',
@@ -4653,6 +4718,10 @@ export const TYPE_API = [
4653
4718
  name: 'CommandId',
4654
4719
  declaration: 'export type CommandId = Branded<\'CommandId\'>;',
4655
4720
  },
4721
+ {
4722
+ name: 'CommandInfo',
4723
+ declaration: 'export interface CommandInfo {\n name: string;\n description: string;\n source: \'builtin\' | \'plugin\' | \'user\' | \'mcp\';\n plugin?: string;\n}',
4724
+ },
4656
4725
  {
4657
4726
  name: 'CommandInputDescriptor',
4658
4727
  declaration: 'export interface CommandInputDescriptor {\n readonly hint: string;\n readonly attachments?: boolean;\n}',
@@ -4665,6 +4734,18 @@ export const TYPE_API = [
4665
4734
  name: 'CommandResult',
4666
4735
  declaration: 'export type CommandResult = {\n readonly kind: \'success\';\n readonly text?: string;\n readonly sourceEventSeq?: SessionSeq;\n} | {\n readonly kind: \'error\';\n readonly text: string;\n};',
4667
4736
  },
4737
+ {
4738
+ name: 'CommandRunInput',
4739
+ declaration: 'export interface CommandRunInput {\n command: string;\n args: string;\n origin: PromptOrigin;\n}',
4740
+ },
4741
+ {
4742
+ name: 'CommandRunResult',
4743
+ declaration: 'export interface CommandRunResult {\n text?: string;\n}',
4744
+ },
4745
+ {
4746
+ name: 'CommandSpec',
4747
+ declaration: 'export interface CommandSpec {\n name: string;\n description: string;\n argumentHint?: string;\n immediate?: true;\n}',
4748
+ },
4668
4749
  {
4669
4750
  name: 'CommandSubmitAttachment',
4670
4751
  declaration: 'export type CommandSubmitAttachment = ({\n readonly type: \'image\';\n} & EncodedImageAttachment) | {\n readonly type: \'file\';\n readonly receiptId: string;\n};',
@@ -5221,6 +5302,30 @@ export const TYPE_API = [
5221
5302
  name: 'GrantRecord',
5222
5303
  declaration: 'export interface GrantRecord {\n readonly kind: \'grant\';\n readonly payload: unknown;\n}',
5223
5304
  },
5305
+ {
5306
+ name: 'HookBudget',
5307
+ declaration: 'export interface HookBudget {\n readonly ms: number;\n readonly remainingMs: number;\n}',
5308
+ },
5309
+ {
5310
+ name: 'HookFailure',
5311
+ declaration: 'export interface HookFailure {\n readonly kind: \'throw\' | \'timeout\';\n readonly message: string;\n}',
5312
+ },
5313
+ {
5314
+ name: 'HookMatcher',
5315
+ declaration: 'export type HookMatcher = Readonly<Record<string, MatcherValue>>;',
5316
+ },
5317
+ {
5318
+ name: 'HookNext',
5319
+ declaration: 'export interface HookNext<E, R> {\n (e: E): Promise<R>;\n readonly signal: AbortSignal;\n readonly origin: HookOrigin;\n readonly budget: HookBudget;\n to(e: E, tier: ModTier): Promise<R>;\n readonly error?: HookFailure;\n readonly called?: boolean;\n}',
5320
+ },
5321
+ {
5322
+ name: 'HookOrigin',
5323
+ declaration: 'export interface HookOrigin {\n readonly plugin: string;\n readonly tier: ModTier;\n}',
5324
+ },
5325
+ {
5326
+ name: 'HookRegistration',
5327
+ declaration: 'export interface HookRegistration {\n catch(handler: AnyHook): void;\n}',
5328
+ },
5224
5329
  {
5225
5330
  name: 'HostConnectionFetch',
5226
5331
  declaration: 'export interface HostConnectionFetch {\n register(route: ConnectionFetchRoute): () => Promise<void>;\n}',
@@ -5313,14 +5418,6 @@ export const TYPE_API = [
5313
5418
  name: 'InvalidTimeZoneError',
5314
5419
  declaration: 'export interface InvalidTimeZoneError {\n readonly code: \'invalid_time_zone\';\n readonly message: string;\n}',
5315
5420
  },
5316
- {
5317
- name: 'InvariantFailure',
5318
- declaration: 'export type InvariantFailure = (message: string) => never;',
5319
- },
5320
- {
5321
- name: 'InvariantInstaller',
5322
- declaration: 'export interface InvariantInstaller {\n (ctx: Context, fail: InvariantFailure): void | Promise<void>;\n readonly inject?: Inject;\n}',
5323
- },
5324
5421
  {
5325
5422
  name: 'InvocationDescriptor',
5326
5423
  declaration: 'export interface InvocationDescriptor {\n readonly id: string;\n readonly service: string;\n readonly namespace: string;\n readonly method: string;\n readonly implementation?: string;\n readonly mode?: \'stream\';\n readonly invocation: {\n readonly kind: \'direct\';\n } | {\n readonly kind: \'context\';\n readonly context: string;\n readonly wire: string;\n readonly codec: TypertCodec;\n };\n readonly scope?: {\n readonly context: string;\n readonly wire: string;\n };\n readonly parameters: readonly InvocationParameterDescriptor[];\n readonly uplink?: {\n readonly codec: TypertCodec;\n };\n readonly cancellation?: {\n readonly parameter: \'signal\';\n };\n readonly result: TypertCodec;\n readonly sourceLocation?: InvocationSourceLocation;\n}',
@@ -5601,6 +5698,10 @@ export const TYPE_API = [
5601
5698
  name: 'ManualCompactAgentContext',
5602
5699
  declaration: 'export interface ManualCompactAgentContext extends CompactionAgentContext {\n runMaintenance<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;\n}',
5603
5700
  },
5701
+ {
5702
+ name: 'MatcherValue',
5703
+ declaration: 'export type MatcherValue = string | number | boolean | null | RegExp | readonly (string | number | boolean | null)[];',
5704
+ },
5604
5705
  {
5605
5706
  name: 'McpResourceProvider',
5606
5707
  declaration: 'export interface McpResourceProvider {\n request(request: McpResourceRequest, exec: ToolExecution): Promise<JsonValue>;\n}',
@@ -5701,6 +5802,10 @@ export const TYPE_API = [
5701
5802
  name: 'MessageSourceMap',
5702
5803
  declaration: 'export interface MessageSourceMap {\n user: {\n kind: \'user\';\n };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n \'system-prompt\': SystemPromptMessageSource;\n}',
5703
5804
  },
5805
+ {
5806
+ name: 'ModDefinition',
5807
+ declaration: 'export interface ModDefinition {\n readonly name: string;\n readonly version?: string;\n readonly root?: string;\n readonly options?: PluginOptions;\n readonly register: ModRegister;\n}',
5808
+ },
5704
5809
  {
5705
5810
  name: 'ModelCatalog',
5706
5811
  declaration: 'export interface ModelCatalog {\n readonly default: ModelSelection;\n readonly routableProviders: readonly string[];\n readonly groups: readonly ModelProviderGroup[];\n readonly failures: readonly ModelCatalogFailure[];\n}',
@@ -5737,6 +5842,30 @@ export const TYPE_API = [
5737
5842
  name: 'ModelReasoningEffort',
5738
5843
  declaration: 'export interface ModelReasoningEffort {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n}',
5739
5844
  },
5845
+ {
5846
+ name: 'ModEvents',
5847
+ declaration: 'export interface ModEvents {\n \'session.start\': {\n input: SessionStartInput;\n result: SessionStartResult;\n };\n \'session.end\': {\n input: SessionEndInput;\n result: SessionEndResult;\n };\n \'prompt.submit\': {\n input: PromptSubmitInput;\n result: PromptSubmitResult;\n };\n \'turn.start\': {\n input: TurnStartInput;\n result: TurnStartResult;\n };\n \'turn.complete\': {\n input: TurnCompleteInput;\n result: TurnCompleteResult;\n };\n \'tool.call\': {\n input: ToolCallInput;\n result: ToolCallResult;\n };\n \'command.run\': {\n input: CommandRunInput;\n result: CommandRunResult;\n };\n \'ui.render\': {\n input: UiRenderInput;\n result: UiRenderResult;\n };\n}',
5848
+ },
5849
+ {
5850
+ name: 'ModHook',
5851
+ declaration: 'export type ModHook<E, R> = ($: ModsApi, e: E, next: HookNext<E, R>) => R | Promise<R>;',
5852
+ },
5853
+ {
5854
+ name: 'ModOn',
5855
+ declaration: 'export interface ModOn {\n <K extends keyof ModEvents>(event: K, hook: ModHook<ModEvents[K][\'input\'], ModEvents[K][\'result\']>): HookRegistration;\n <K extends keyof ModEvents>(event: K, matcher: HookMatcher, hook: ModHook<ModEvents[K][\'input\'], ModEvents[K][\'result\']>): HookRegistration;\n (event: string, hook: AnyHook): HookRegistration;\n (event: string, matcher: HookMatcher, hook: AnyHook): HookRegistration;\n}',
5856
+ },
5857
+ {
5858
+ name: 'ModRegister',
5859
+ declaration: 'export type ModRegister = (on: ModOn, options: PluginOptions) => unknown;',
5860
+ },
5861
+ {
5862
+ name: 'ModsApi',
5863
+ declaration: 'export interface ModsApi {\n readonly plugin: {\n readonly name: string;\n readonly root: string;\n };\n readonly ui: {\n log(text: string, options?: UiLogOptions): void;\n toast(text: string, options?: ToastOptions): void;\n status(text: string | undefined): void;\n invalidate(event: string): void;\n open(pane: PaneOpenArgs): Promise<PaneOpenResult>;\n close(pane: {\n id: string;\n }): Promise<void>;\n panes(): Promise<never[]>;\n ask(question: string, options?: readonly string[] | AskOptions): Promise<string>;\n resolve(e: UiRenderInput): UiElements;\n };\n readonly command: {\n register(command: CommandSpec): Promise<void>;\n run(input: {\n command: string;\n args?: string;\n }): Promise<CommandRunResult>;\n list(): Promise<CommandInfo[]>;\n };\n readonly tool: {\n register(tool: ToolSpec): Promise<void>;\n call(input: {\n tool: string;\n [argument: string]: unknown;\n }): Promise<ToolCallResult>;\n list(): Promise<ToolInfo[]>;\n };\n readonly prompt: {\n submit(input: PromptSubmitArgs): Promise<{\n text: string;\n }>;\n };\n readonly session: {\n id(): Promise<string>;\n cwd(): Promise<string>;\n root(): Promise<string>;\n model(): Promise<string>;\n turns(): Promise<number>;\n messages(): Promise<SessionMessage[]>;\n us /* …truncated — full shape in source */',
5864
+ },
5865
+ {
5866
+ name: 'ModTier',
5867
+ declaration: 'export type ModTier = \'prepend\' | \'user\' | \'append\' | \'builtin\' | \'core\';',
5868
+ },
5740
5869
  {
5741
5870
  name: 'NativeFileApplication',
5742
5871
  declaration: 'export interface NativeFileApplication {\n readonly id: string;\n readonly name: string;\n readonly default: boolean;\n readonly icon: string | null;\n}',
@@ -5805,6 +5934,14 @@ export const TYPE_API = [
5805
5934
  name: 'PackageResult',
5806
5935
  declaration: 'export interface PackageResult {\n exitCode: number;\n output: string;\n truncated: boolean;\n logPath: string;\n kind?: PluginInstallFailureKind;\n timedOut?: boolean;\n incompatible?: IncompatiblePlugin[];\n}',
5807
5936
  },
5937
+ {
5938
+ name: 'PaneOpenArgs',
5939
+ declaration: 'export interface PaneOpenArgs {\n id: string;\n title?: string;\n focus?: true;\n closeOnEscape?: true;\n holdToasts?: true;\n rows?: number;\n columns?: number;\n}',
5940
+ },
5941
+ {
5942
+ name: 'PaneOpenResult',
5943
+ declaration: 'export interface PaneOpenResult {\n id: string;\n isPlaced: boolean;\n reason?: string;\n}',
5944
+ },
5808
5945
  {
5809
5946
  name: 'PeerAdmission',
5810
5947
  declaration: 'export type PeerAdmission = {\n readonly peer: PeerScope;\n} | {\n readonly rejection: 401 | 403;\n};',
@@ -5873,6 +6010,14 @@ export const TYPE_API = [
5873
6010
  name: 'PluginLocalizedMeta',
5874
6011
  declaration: 'export interface PluginLocalizedMeta {\n readonly title?: LocalizedText;\n readonly description?: LocalizedText;\n readonly icon?: string;\n readonly error?: string;\n}',
5875
6012
  },
6013
+ {
6014
+ name: 'PluginOptions',
6015
+ declaration: 'export type PluginOptions = Readonly<Record<string, PluginOptionValue>>;',
6016
+ },
6017
+ {
6018
+ name: 'PluginOptionValue',
6019
+ declaration: 'export type PluginOptionValue = string | number | boolean | readonly string[];',
6020
+ },
5876
6021
  {
5877
6022
  name: 'PluginRegistries',
5878
6023
  declaration: 'export interface PluginRegistries {\n readonly registry: Registry;\n readonly fallbackRegistries: readonly string[];\n readonly resolved: string | null;\n}',
@@ -5981,6 +6126,10 @@ export const TYPE_API = [
5981
6126
  name: 'PromptFileBinding',
5982
6127
  declaration: 'export interface PromptFileBinding extends Disposable {\n commit(): void;\n}',
5983
6128
  },
6129
+ {
6130
+ name: 'PromptOrigin',
6131
+ declaration: 'export type PromptOrigin = {\n kind: \'composer\';\n} | {\n kind: \'plugin\';\n name: string;\n};',
6132
+ },
5984
6133
  {
5985
6134
  name: 'PromptSection',
5986
6135
  declaration: 'export interface PromptSection {\n readonly name: string;\n readonly order: number;\n readonly text: string | ((context: AssembleContext) => string);\n readonly interpolate?: boolean;\n readonly complete?: boolean;\n}',
@@ -5989,6 +6138,18 @@ export const TYPE_API = [
5989
6138
  name: 'PromptSectionOrderName',
5990
6139
  declaration: 'export type PromptSectionOrderName = keyof typeof SECTION_ORDERS;',
5991
6140
  },
6141
+ {
6142
+ name: 'PromptSubmitArgs',
6143
+ declaration: 'export interface PromptSubmitArgs {\n text: string;\n asUser?: boolean;\n}',
6144
+ },
6145
+ {
6146
+ name: 'PromptSubmitInput',
6147
+ declaration: 'export interface PromptSubmitInput {\n text: string;\n context?: readonly string[];\n turnId?: string;\n wait: boolean;\n origin: PromptOrigin;\n}',
6148
+ },
6149
+ {
6150
+ name: 'PromptSubmitResult',
6151
+ declaration: 'export type PromptSubmitResult = {\n text: string;\n context?: readonly string[];\n drop?: undefined;\n} | {\n drop: string;\n text?: undefined;\n context?: undefined;\n};',
6152
+ },
5992
6153
  {
5993
6154
  name: 'ProviderRequestId',
5994
6155
  declaration: 'export type ProviderRequestId = Branded<\'ProviderRequestId\'>;',
@@ -6079,7 +6240,7 @@ export const TYPE_API = [
6079
6240
  },
6080
6241
  {
6081
6242
  name: 'Reload',
6082
- declaration: 'export interface Reload {\n filename: string;\n runtime?: Plugin.Runtime | undefined;\n}',
6243
+ declaration: 'export interface Reload {\n filename: string;\n modules: ReloadModules;\n runtime?: Plugin.Runtime | undefined;\n}',
6083
6244
  },
6084
6245
  {
6085
6246
  name: 'RemoteError',
@@ -6267,7 +6428,7 @@ export const TYPE_API = [
6267
6428
  },
6268
6429
  {
6269
6430
  name: 'ScheduleToolError',
6270
- declaration: 'export type ScheduleToolError = InvalidPromptError | InvalidSelectorError | InvalidRuleError | InvalidTimeZoneError | NotFutureError | TimeOutOfRangeError | FrequencyTooHighError | InternalScheduleError;',
6431
+ declaration: 'export type ScheduleToolError = InvalidPromptError | InvalidSelectorError | InvalidRuleError | InvalidTimeZoneError | NotFutureError | TimeOutOfRangeError | FrequencyTooHighError | SubagentSessionError | InternalScheduleError;',
6271
6432
  },
6272
6433
  {
6273
6434
  name: 'ScheduleUpdateContent',
@@ -6321,6 +6482,14 @@ export const TYPE_API = [
6321
6482
  name: 'SendTeamMessageResult',
6322
6483
  declaration: 'export interface SendTeamMessageResult {\n readonly messageId: TeamMessageId;\n readonly status: \'accepted\' | \'queued\';\n}',
6323
6484
  },
6485
+ {
6486
+ name: 'SerializedElement',
6487
+ declaration: 'export interface SerializedElement {\n readonly type: \'Box\' | \'Text\' | \'Button\';\n readonly props: Readonly<Record<string, string | number | boolean>>;\n readonly children: readonly SerializedNode[];\n readonly actionId?: string;\n}',
6488
+ },
6489
+ {
6490
+ name: 'SerializedNode',
6491
+ declaration: 'export type SerializedNode = SerializedElement | string;',
6492
+ },
6324
6493
  {
6325
6494
  name: 'ServerResponse',
6326
6495
  declaration: 'export interface ServerResponse {\n readonly type: \'server-response\';\n readonly rpcId: RpcId;\n readonly result: ConnectionRpcResult<unknown>;\n}',
@@ -6405,6 +6574,14 @@ export const TYPE_API = [
6405
6574
  name: 'SessionCreateValue',
6406
6575
  declaration: 'export interface SessionCreateValue {\n readonly sessionId: SessionId;\n readonly agentPreset?: string;\n}',
6407
6576
  },
6577
+ {
6578
+ name: 'SessionEndInput',
6579
+ declaration: 'export interface SessionEndInput {\n reason: \'clear\' | \'logout\' | \'prompt_input_exit\' | \'resume\' | \'other\';\n sessionId: string;\n}',
6580
+ },
6581
+ {
6582
+ name: 'SessionEndResult',
6583
+ declaration: 'export interface SessionEndResult {\n sessionId: string;\n}',
6584
+ },
6408
6585
  {
6409
6586
  name: 'SessionEvent',
6410
6587
  declaration: 'export type SessionEvent<T extends SessionEventType = SessionEventType> = {\n [K in SessionEventType]: {\n type: K;\n seq: SessionSeq;\n time: number;\n data: SessionEventMap[K];\n ignorable?: true;\n } & (K extends SurfaceEventType ? SurfaceIntent<K> : {\n surfaceOp?: never;\n sourceEventSeqs?: never;\n });\n}[T];',
@@ -6581,6 +6758,10 @@ export const TYPE_API = [
6581
6758
  name: 'SessionLogSnapshot',
6582
6759
  declaration: 'export interface SessionLogSnapshot {\n session: SessionHeader;\n inheritedEventCount: SessionLogOffset;\n events: SessionEvent[];\n}',
6583
6760
  },
6761
+ {
6762
+ name: 'SessionMessage',
6763
+ declaration: 'export interface SessionMessage {\n role: \'user\' | \'assistant\';\n text: string;\n toolUses: ToolUseSummary[];\n}',
6764
+ },
6584
6765
  {
6585
6766
  name: 'SessionMessageProjection',
6586
6767
  declaration: 'export interface SessionMessageProjection<T extends SessionEventType = SessionEventType> {\n type: T;\n project(event: SessionEvent<T>, context: SessionMessageProjectionContext): ReadonlyMap<SessionSeq, Message>;\n}',
@@ -6761,6 +6942,14 @@ export const TYPE_API = [
6761
6942
  name: 'SessionSeqCursor',
6762
6943
  declaration: 'export type SessionSeqCursor = SessionSeq | -1;',
6763
6944
  },
6945
+ {
6946
+ name: 'SessionStartInput',
6947
+ declaration: 'export interface SessionStartInput {\n cwd: string;\n surface: string | null;\n isInteractive: boolean;\n}',
6948
+ },
6949
+ {
6950
+ name: 'SessionStartResult',
6951
+ declaration: 'export interface SessionStartResult {\n cwd: string;\n}',
6952
+ },
6764
6953
  {
6765
6954
  name: 'SessionStartSource',
6766
6955
  declaration: 'export type SessionStartSource = \'startup\' | \'resume\' | \'clear\' | \'compact\';',
@@ -6943,7 +7132,7 @@ export const TYPE_API = [
6943
7132
  },
6944
7133
  {
6945
7134
  name: 'SignInErrorCode',
6946
- declaration: 'export type SignInErrorCode = \'network\' | \'protocol\' | \'expired\' | \'storage\';',
7135
+ declaration: 'export type SignInErrorCode = \'no-response\' | \'network\' | \'protocol\' | \'expired\' | \'storage\';',
6947
7136
  },
6948
7137
  {
6949
7138
  name: 'SkillCandidate',
@@ -7201,6 +7390,10 @@ export const TYPE_API = [
7201
7390
  name: 'SubagentSendMessageOptions',
7202
7391
  declaration: 'export interface SubagentSendMessageOptions {\n readonly signal: AbortSignal;\n}',
7203
7392
  },
7393
+ {
7394
+ name: 'SubagentSessionError',
7395
+ declaration: 'export interface SubagentSessionError {\n readonly code: \'subagent_session\';\n readonly message: string;\n}',
7396
+ },
7204
7397
  {
7205
7398
  name: 'SubagentStartRequest',
7206
7399
  declaration: 'export interface SubagentStartRequest {\n readonly label?: string;\n readonly prompt: ContentBlock[];\n readonly parent: Agent;\n readonly signal: AbortSignal;\n readonly agentOptions?: AgentOptions;\n readonly outputSchema?: ObjectJsonSchema;\n readonly maxDepth?: number;\n readonly toolFilter?: ToolRestriction;\n readonly persona?: string;\n}',
@@ -7293,6 +7486,10 @@ export const TYPE_API = [
7293
7486
  name: 'SurfaceOp',
7294
7487
  declaration: 'export type SurfaceOp = \'append\' | {\n op: \'replace\';\n startSeq: SessionSeq;\n endSeq: SessionSeq;\n};',
7295
7488
  },
7489
+ {
7490
+ name: 'SurfaceSnapshot',
7491
+ declaration: 'export interface SurfaceSnapshot {\n readonly generation: number;\n readonly tree: readonly SerializedNode[] | null;\n}',
7492
+ },
7296
7493
  {
7297
7494
  name: 'SystemMessage',
7298
7495
  declaration: 'export interface SystemMessage extends MessageBase {\n readonly role: \'system\';\n readonly source: MessageSourceMap[\'system-prompt\'];\n}',
@@ -7457,10 +7654,22 @@ export const TYPE_API = [
7457
7654
  name: 'TerminalWaitReason',
7458
7655
  declaration: 'export type TerminalWaitReason = \'stdin_read\' | \'inferred_idle\' | \'timeout\' | \'session_exit\';',
7459
7656
  },
7657
+ {
7658
+ name: 'TextProps',
7659
+ declaration: 'export interface TextProps {\n readonly color?: string | undefined;\n readonly bold?: boolean | undefined;\n readonly dimColor?: boolean | undefined;\n readonly italic?: boolean | undefined;\n readonly underline?: boolean | undefined;\n readonly children?: UiNode | undefined;\n}',
7660
+ },
7661
+ {
7662
+ name: 'TimedUserQuestionResult',
7663
+ declaration: 'export type TimedUserQuestionResult = AskUserQuestionAnswer | {\n pending: true;\n callId: ToolCallId;\n};',
7664
+ },
7460
7665
  {
7461
7666
  name: 'TimeOutOfRangeError',
7462
7667
  declaration: 'export interface TimeOutOfRangeError {\n readonly code: \'time_out_of_range\';\n readonly message: string;\n}',
7463
7668
  },
7669
+ {
7670
+ name: 'ToastOptions',
7671
+ declaration: 'export interface ToastOptions {\n timeoutMs?: number;\n}',
7672
+ },
7464
7673
  {
7465
7674
  name: 'TokenMeasurement',
7466
7675
  declaration: 'export interface TokenMeasurement {\n readonly logRevision: SessionLogOffset;\n readonly baseline: TokenMeasurementBaseline;\n readonly surfaceDeltaTokens: number;\n readonly totalTokens: number;\n readonly surfaceTokens: number;\n readonly nodes: readonly TokenSurfaceNode[];\n}',
@@ -7489,10 +7698,18 @@ export const TYPE_API = [
7489
7698
  name: 'ToolCallId',
7490
7699
  declaration: 'export type ToolCallId = Branded<\'ToolCallId\'>;',
7491
7700
  },
7701
+ {
7702
+ name: 'ToolCallInput',
7703
+ declaration: 'export interface ToolCallInput {\n tool: string;\n tool_use_id: string;\n agentId?: string;\n [argument: string]: unknown;\n}',
7704
+ },
7492
7705
  {
7493
7706
  name: 'ToolCallKind',
7494
7707
  declaration: 'export type ToolCallKind = \'read\' | \'edit\' | \'delete\' | \'move\' | \'search\' | \'execute\' | \'fetch\' | \'other\';',
7495
7708
  },
7709
+ {
7710
+ name: 'ToolCallResult',
7711
+ declaration: 'export type ToolCallResult = {\n deny: string;\n result?: undefined;\n isError?: undefined;\n} | {\n result: unknown;\n isError?: true;\n deny?: undefined;\n};',
7712
+ },
7496
7713
  {
7497
7714
  name: 'ToolCallView',
7498
7715
  declaration: 'export type ToolCallView = GenericCallView | TerminalCallView | DiffCallView;',
@@ -7549,6 +7766,10 @@ export const TYPE_API = [
7549
7766
  name: 'ToolHistory',
7550
7767
  declaration: 'export interface ToolHistory {\n readonly tools: readonly ToolSchema[];\n readonly updates: readonly {\n readonly messageId: MessageId;\n readonly additions: readonly ToolSchema[];\n }[];\n}',
7551
7768
  },
7769
+ {
7770
+ name: 'ToolInfo',
7771
+ declaration: 'export interface ToolInfo {\n name: string;\n description: string;\n}',
7772
+ },
7552
7773
  {
7553
7774
  name: 'ToolMessageSource',
7554
7775
  declaration: 'export interface ToolMessageSource {\n kind: \'tool\';\n callId: ToolCallId;\n}',
@@ -7601,10 +7822,18 @@ export const TYPE_API = [
7601
7822
  name: 'ToolSchema',
7602
7823
  declaration: 'export interface ToolSchema {\n deferLoading?: true;\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}',
7603
7824
  },
7825
+ {
7826
+ name: 'ToolSpec',
7827
+ declaration: 'export interface ToolSpec {\n name: string;\n description: string;\n inputSchema?: Record<string, unknown>;\n}',
7828
+ },
7604
7829
  {
7605
7830
  name: 'ToolUpdate',
7606
7831
  declaration: 'export type ToolUpdate = \'in-history\' | \'addition-only\';',
7607
7832
  },
7833
+ {
7834
+ name: 'ToolUseSummary',
7835
+ declaration: 'export interface ToolUseSummary {\n tool_use_id: string;\n tool: string;\n input: Record<string, unknown>;\n}',
7836
+ },
7608
7837
  {
7609
7838
  name: 'Transcript',
7610
7839
  declaration: 'export interface Transcript {\n readonly text: string;\n readonly audioSeconds: number;\n readonly inferenceSeconds: number;\n}',
@@ -7613,6 +7842,14 @@ export const TYPE_API = [
7613
7842
  name: 'TranscriptionRequest',
7614
7843
  declaration: 'export interface TranscriptionRequest {\n readonly audioBase64: string;\n readonly providerId?: SpeechProviderId;\n readonly language?: string;\n}',
7615
7844
  },
7845
+ {
7846
+ name: 'TurnCompleteInput',
7847
+ declaration: 'export interface TurnCompleteInput {\n turnId: string;\n answer: string;\n durationMs: number;\n isAborted: boolean;\n reason: \'answer\' | \'aborted\' | \'error\';\n agentId?: string;\n usage?: TurnUsage;\n}',
7848
+ },
7849
+ {
7850
+ name: 'TurnCompleteResult',
7851
+ declaration: 'export interface TurnCompleteResult {\n text: string;\n}',
7852
+ },
7616
7853
  {
7617
7854
  name: 'TurnEndCancelCause',
7618
7855
  declaration: 'export type TurnEndCancelCause = AgentCancelCause | {\n readonly kind: \'legacy\';\n};',
@@ -7625,6 +7862,18 @@ export const TYPE_API = [
7625
7862
  name: 'TurnEndReasonMap',
7626
7863
  declaration: 'export interface TurnEndReasonMap {\n completed: {\n kind: \'completed\';\n };\n aborted: {\n kind: \'aborted\';\n reason: TurnEndCancelCause;\n };\n blocked: {\n kind: \'blocked\';\n };\n error: {\n kind: \'error\';\n error: LlmFailure;\n };\n \'max-tokens\': {\n kind: \'max-tokens\';\n };\n interrupted: {\n kind: \'interrupted\';\n };\n forked: {\n kind: \'forked\';\n };\n}',
7627
7864
  },
7865
+ {
7866
+ name: 'TurnStartInput',
7867
+ declaration: 'export interface TurnStartInput {\n text: string;\n turnId: string;\n agentId?: string;\n}',
7868
+ },
7869
+ {
7870
+ name: 'TurnStartResult',
7871
+ declaration: 'export interface TurnStartResult {\n turnId: string;\n}',
7872
+ },
7873
+ {
7874
+ name: 'TurnUsage',
7875
+ declaration: 'export interface TurnUsage {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens: number;\n cache_creation_input_tokens: number;\n model: string;\n}',
7876
+ },
7628
7877
  {
7629
7878
  name: 'TypertCodec',
7630
7879
  declaration: 'export type TypertCodec = {\n readonly mode: \'strict\';\n readonly typeSymbol: string;\n readonly create: () => TypertSchema;\n readonly decode?: (value: unknown) => unknown;\n readonly encode?: (value: unknown, writeBytes: (bytes: Uint8Array, path: readonly (string | number)[]) => null) => unknown;\n} | {\n readonly mode: \'src-json\';\n};',
@@ -7729,6 +7978,30 @@ export const TYPE_API = [
7729
7978
  name: 'TypertTypeModel',
7730
7979
  declaration: 'export interface TypertTypeModel {\n readonly name: string;\n readonly declaration: string;\n}',
7731
7980
  },
7981
+ {
7982
+ name: 'UiElement',
7983
+ declaration: 'export interface UiElement {\n readonly type: \'Box\' | \'Text\' | \'Button\';\n readonly props: Readonly<Record<string, unknown>>;\n}',
7984
+ },
7985
+ {
7986
+ name: 'UiElements',
7987
+ declaration: 'export interface UiElements {\n readonly Box: (props: BoxProps) => UiElement;\n readonly Text: (props: TextProps) => UiElement;\n readonly Button: (props: ButtonProps) => UiElement;\n}',
7988
+ },
7989
+ {
7990
+ name: 'UiLogOptions',
7991
+ declaration: 'export interface UiLogOptions {\n to?: \'transcript\' | \'debug\';\n}',
7992
+ },
7993
+ {
7994
+ name: 'UiNode',
7995
+ declaration: 'export type UiNode = UiElement | string | number | null | undefined | false | readonly UiNode[];',
7996
+ },
7997
+ {
7998
+ name: 'UiRenderInput',
7999
+ declaration: 'export interface UiRenderInput {\n component: \'AbovePrompt\' | \'Pane\';\n surface: string;\n requestId?: string;\n props: Readonly<Record<string, unknown>>;\n viewport: {\n readonly columns: number;\n readonly rows?: number;\n };\n}',
8000
+ },
8001
+ {
8002
+ name: 'UiRenderResult',
8003
+ declaration: 'export type UiRenderResult = UiNode;',
8004
+ },
7732
8005
  {
7733
8006
  name: 'UpdateTeamTaskRequest',
7734
8007
  declaration: 'export interface UpdateTeamTaskRequest {\n readonly taskId: TeamTaskId;\n readonly expectedRevision: number;\n readonly action: TeamTaskAction;\n readonly subject?: string;\n readonly description?: string;\n readonly blockedBy?: readonly TeamTaskId[];\n readonly writeScopes?: readonly string[];\n readonly owner?: string;\n}',
@@ -34,9 +34,9 @@ export function apply(ctx) {
34
34
  description: 'Run a read-only query declared by an Inspect Provider. platform, provider, and method must come from '
35
35
  + 'cordis_inspect_list, and input must satisfy that method\'s schema. Use this Tool before writing plugin code '
36
36
  + 'to read exact Service methods, Event modes, plugin Config schemas, Tool schemas, theme tokens, or live '
37
- + 'Slot trees and props. Host queries run locally. A Client query waits for the first valid page response and '
38
- + 'remains pending until a page answers or the Tool is cancelled. This Tool cannot invoke business Service '
39
- + 'methods or modify the runtime.',
37
+ + 'Slot trees and props. Host queries run locally. A Client query waits for the first valid page response '
38
+ + 'within the configured timeout; otherwise it reports a Client failure or asks you to reconnect and retry. '
39
+ + 'This Tool cannot invoke business Service methods or modify the runtime.',
40
40
  parameters: {
41
41
  platform: { type: 'string', required: true, enum: ['host', 'client'], description: 'Runtime platform that owns the Provider.' },
42
42
  provider: { type: 'string', required: true, description: 'Exact Provider ID returned by cordis_inspect_list.' },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-tool-cordis",
3
3
  "description": "Read-only runtime API inspection for Harness plugin development",
4
- "version": "0.2.0-rc.1",
4
+ "version": "0.2.1-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -32,22 +32,22 @@
32
32
  ],
33
33
  "license": "MIT",
34
34
  "peerDependencies": {
35
- "@deepseek-ai/cordis-plugin-loader": "~1.0.5",
36
- "@deepseek-ai/cordis": "~4.0.4",
37
- "@deepseek-ai/dsh-agent": "0.2.0-rc.1",
38
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.0-rc.1",
39
- "@deepseek-ai/dsh-tools": "0.2.0-rc.1",
40
- "@deepseek-ai/dsh-app-boot": "0.2.0-rc.1"
35
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
36
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
37
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
38
+ "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.1",
39
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.1",
40
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.1"
41
41
  },
42
42
  "devDependencies": {
43
- "@deepseek-ai/cordis": "~4.0.4",
44
- "@deepseek-ai/cordis-plugin-group": "~1.0.4",
45
- "@deepseek-ai/cordis-plugin-loader": "~1.0.5",
46
- "@deepseek-ai/dsh-app-boot": "0.2.0-rc.1",
47
- "@deepseek-ai/dsh-agent": "0.2.0-rc.1",
48
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.0-rc.1",
49
- "@deepseek-ai/dsh-tools": "0.2.0-rc.1",
50
- "@deepseek-ai/schemastery": "~3.18.4",
51
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.1"
43
+ "@deepseek-ai/cordis": "~4.0.5-alpha.1",
44
+ "@deepseek-ai/cordis-plugin-group": "~1.0.5-alpha.1",
45
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
46
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
47
+ "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.1",
48
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.1",
49
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.1",
50
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.1",
51
+ "@deepseek-ai/schemastery": "~3.18.5-alpha.1"
52
52
  }
53
53
  }