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

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
@@ -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
@@ -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
@@ -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",
@@ -3308,6 +3308,12 @@ export const SERVICE_API = [
3308
3308
  description: 'Carrier adapter shared by the WebSocket mux and local Host transports.',
3309
3309
  parameters: [],
3310
3310
  },
3311
+ {
3312
+ signature: 'hasLiveClient(): boolean',
3313
+ description: 'Check for an active Client event stream.',
3314
+ parameters: [],
3315
+ returns: 'whether a stream is open and has not been cancelled.',
3316
+ },
3311
3317
  {
3312
3318
  signature: 'registerRemoteEvents( source: TypertRemoteEventSource, host: RemoteEventHostInfo, ): () => Promise<void>',
3313
3319
  description: 'Register the sole application-selected forwarded-event source.',
@@ -3334,6 +3340,26 @@ export const SERVICE_API = [
3334
3340
  summary: '`ctx.userQuestions`: validation plus the scoped answerer waterfall.',
3335
3341
  description: '`ctx.userQuestions`: validation plus the scoped answerer waterfall.',
3336
3342
  methods: [
3343
+ {
3344
+ signature: '@Remote answer(agent: Agent, callId: ToolCallId, answer: AskUserQuestionAnswer): boolean',
3345
+ 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.',
3346
+ 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.' }],
3347
+ returns: 'Whether the question is still continued; an accepted reply stays queued until the agent admits its user message.',
3348
+ 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.'],
3349
+ },
3350
+ {
3351
+ signature: '@Remote({ mode: \'stream\' }) async *attachWait(agent: Agent, callId: ToolCallId, signal: AbortSignal): AsyncIterable<{ remainingMs: number }>',
3352
+ description: 'Let one answer UI hold a live timed wait. Closing the stream releases its claim.',
3353
+ 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.' }],
3354
+ returns: 'One Host-computed remaining duration, or no frames once the wait ended.',
3355
+ },
3356
+ {
3357
+ signature: 'async askTimed( request: AskUserQuestionRequest & { agent: Agent }, callId: ToolCallId, timeoutMs: number, ): Promise<TimedUserQuestionResult>',
3358
+ 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.',
3359
+ 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.' }],
3360
+ returns: 'The answer when it arrives inside the window, otherwise a pending result, also when no connected Client claimed the request by the deadline.',
3361
+ throws: ['{UserQuestionError} `BAD_TIMEOUT` for a non-integer, non-positive, or oversized wait.'],
3362
+ },
3337
3363
  {
3338
3364
  signature: 'async ask(request: AskUserQuestionRequest): Promise<AskUserQuestionAnswer>',
3339
3365
  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.',
@@ -4479,7 +4505,7 @@ export const TYPE_API = [
4479
4505
  },
4480
4506
  {
4481
4507
  name: 'AskUserQuestionRequestEvent',
4482
- declaration: 'export interface AskUserQuestionRequestEvent {\n questions: AskUserQuestionItem[];\n agent?: Agent;\n signal?: AbortSignal;\n}',
4508
+ declaration: 'export interface AskUserQuestionRequestEvent {\n questions: AskUserQuestionItem[];\n agent?: Agent;\n signal?: AbortSignal;\n wait?: {\n callId: ToolCallId;\n timed?: boolean;\n };\n}',
4483
4509
  },
4484
4510
  {
4485
4511
  name: 'AssembleContext',
@@ -7457,6 +7483,10 @@ export const TYPE_API = [
7457
7483
  name: 'TerminalWaitReason',
7458
7484
  declaration: 'export type TerminalWaitReason = \'stdin_read\' | \'inferred_idle\' | \'timeout\' | \'session_exit\';',
7459
7485
  },
7486
+ {
7487
+ name: 'TimedUserQuestionResult',
7488
+ declaration: 'export type TimedUserQuestionResult = AskUserQuestionAnswer | {\n pending: true;\n callId: ToolCallId;\n};',
7489
+ },
7460
7490
  {
7461
7491
  name: 'TimeOutOfRangeError',
7462
7492
  declaration: 'export interface TimeOutOfRangeError {\n readonly code: \'time_out_of_range\';\n readonly message: 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.0-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -33,21 +33,21 @@
33
33
  "license": "MIT",
34
34
  "peerDependencies": {
35
35
  "@deepseek-ai/cordis-plugin-loader": "~1.0.5",
36
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
36
37
  "@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"
38
+ "@deepseek-ai/dsh-app-boot": "0.2.0-rc.2",
39
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.0-rc.2",
40
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@deepseek-ai/cordis": "~4.0.4",
44
44
  "@deepseek-ai/cordis-plugin-group": "~1.0.4",
45
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
46
+ "@deepseek-ai/dsh-app-boot": "0.2.0-rc.2",
47
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.0-rc.2",
45
48
  "@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"
49
+ "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
50
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
51
+ "@deepseek-ai/schemastery": "~3.18.4"
52
52
  }
53
53
  }