subharness 0.0.1 → 0.0.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.
Files changed (120) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +51 -18
  3. package/dist/adapters/claude-process.d.ts +10 -0
  4. package/dist/adapters/claude-process.js +58 -0
  5. package/dist/adapters/claude-process.js.map +1 -0
  6. package/dist/adapters/claude.js +52 -10
  7. package/dist/adapters/claude.js.map +1 -1
  8. package/dist/adapters/codex-input.d.ts +2 -0
  9. package/dist/adapters/codex-input.js +14 -0
  10. package/dist/adapters/codex-input.js.map +1 -0
  11. package/dist/adapters/codex-permissions.d.ts +13 -0
  12. package/dist/adapters/codex-permissions.js +30 -0
  13. package/dist/adapters/codex-permissions.js.map +1 -0
  14. package/dist/adapters/codex.js +12 -6
  15. package/dist/adapters/codex.js.map +1 -1
  16. package/dist/adapters/fx-auth.js +3 -0
  17. package/dist/adapters/fx-auth.js.map +1 -1
  18. package/dist/adapters/fx-permissions.d.ts +3 -0
  19. package/dist/adapters/fx-permissions.js +128 -0
  20. package/dist/adapters/fx-permissions.js.map +1 -0
  21. package/dist/adapters/fx.js +4 -0
  22. package/dist/adapters/fx.js.map +1 -1
  23. package/dist/cli/args.d.ts +3 -1
  24. package/dist/cli/args.js +18 -12
  25. package/dist/cli/args.js.map +1 -1
  26. package/dist/cli/dashboard-client.d.ts +3 -0
  27. package/dist/cli/dashboard-client.js +78 -0
  28. package/dist/cli/dashboard-client.js.map +1 -0
  29. package/dist/cli/dashboard-layout.d.ts +21 -0
  30. package/dist/cli/dashboard-layout.js +211 -0
  31. package/dist/cli/dashboard-layout.js.map +1 -0
  32. package/dist/cli/dashboard-renderer.d.ts +30 -0
  33. package/dist/cli/dashboard-renderer.js +80 -0
  34. package/dist/cli/dashboard-renderer.js.map +1 -0
  35. package/dist/cli/dashboard.d.ts +31 -0
  36. package/dist/cli/dashboard.js +81 -0
  37. package/dist/cli/dashboard.js.map +1 -0
  38. package/dist/cli/help.d.ts +1 -1
  39. package/dist/cli/help.js +35 -9
  40. package/dist/cli/help.js.map +1 -1
  41. package/dist/cli/main.js +19 -6
  42. package/dist/cli/main.js.map +1 -1
  43. package/dist/cli/output.js +10 -1
  44. package/dist/cli/output.js.map +1 -1
  45. package/dist/config/access.js +4 -4
  46. package/dist/config/access.js.map +1 -1
  47. package/dist/config/loader.js +2 -2
  48. package/dist/config/loader.js.map +1 -1
  49. package/dist/runtime/client.d.ts +5 -1
  50. package/dist/runtime/client.js +91 -40
  51. package/dist/runtime/client.js.map +1 -1
  52. package/dist/runtime/coordinator.d.ts +7 -1
  53. package/dist/runtime/coordinator.js +72 -8
  54. package/dist/runtime/coordinator.js.map +1 -1
  55. package/dist/runtime/daemon.js +100 -18
  56. package/dist/runtime/daemon.js.map +1 -1
  57. package/dist/runtime/dashboard-workspace.d.ts +2 -0
  58. package/dist/runtime/dashboard-workspace.js +38 -0
  59. package/dist/runtime/dashboard-workspace.js.map +1 -0
  60. package/dist/runtime/dashboard.d.ts +28 -0
  61. package/dist/runtime/dashboard.js +19 -0
  62. package/dist/runtime/dashboard.js.map +1 -0
  63. package/dist/runtime/readiness.d.ts +4 -0
  64. package/dist/runtime/readiness.js +17 -0
  65. package/dist/runtime/readiness.js.map +1 -0
  66. package/dist/runtime/select-native.d.ts +2 -1
  67. package/dist/runtime/select-native.js +5 -3
  68. package/dist/runtime/select-native.js.map +1 -1
  69. package/dist/runtime/service.d.ts +1 -1
  70. package/dist/runtime/service.js +10 -3
  71. package/dist/runtime/service.js.map +1 -1
  72. package/dist/runtime/startup-lock.d.ts +5 -0
  73. package/dist/runtime/startup-lock.js +37 -0
  74. package/dist/runtime/startup-lock.js.map +1 -0
  75. package/dist/runtime/startup-protocol.d.ts +17 -0
  76. package/dist/runtime/startup-protocol.js +23 -0
  77. package/dist/runtime/startup-protocol.js.map +1 -0
  78. package/dist/runtime/state.d.ts +1 -2
  79. package/dist/runtime/state.js +8 -43
  80. package/dist/runtime/state.js.map +1 -1
  81. package/dist/runtime/types.d.ts +16 -2
  82. package/dist/runtime/types.js.map +1 -1
  83. package/dist/runtime/worker-client.d.ts +7 -2
  84. package/dist/runtime/worker-client.js +69 -12
  85. package/dist/runtime/worker-client.js.map +1 -1
  86. package/dist/runtime/worker-server.d.ts +7 -0
  87. package/dist/runtime/worker-server.js +101 -0
  88. package/dist/runtime/worker-server.js.map +1 -0
  89. package/dist/runtime/worker.js +2 -66
  90. package/dist/runtime/worker.js.map +1 -1
  91. package/dist/sdk/definitions.js +23 -13
  92. package/dist/sdk/definitions.js.map +1 -1
  93. package/dist/sdk/permission-validation.d.ts +4 -0
  94. package/dist/sdk/permission-validation.js +55 -0
  95. package/dist/sdk/permission-validation.js.map +1 -0
  96. package/dist/sdk/types.d.ts +14 -0
  97. package/dist/sdk/types.js.map +1 -1
  98. package/package.json +17 -17
  99. package/sdk/access-config.md +4 -2
  100. package/sdk/adapter-contract.md +14 -2
  101. package/sdk/agent-skill.md +38 -0
  102. package/sdk/agent.md +6 -2
  103. package/sdk/cli/dashboard-design.md +40 -0
  104. package/sdk/cli/index.md +47 -13
  105. package/sdk/cli/output.md +21 -3
  106. package/sdk/completion-notifications.md +9 -5
  107. package/sdk/config.md +33 -8
  108. package/sdk/distribution.md +9 -7
  109. package/sdk/evals.md +171 -0
  110. package/sdk/fx.md +4 -3
  111. package/sdk/harnesses.md +6 -0
  112. package/sdk/index.md +2 -0
  113. package/sdk/message-delivery.md +6 -2
  114. package/sdk/permissions.md +65 -0
  115. package/sdk/plugins/sub-agents.md +7 -4
  116. package/sdk/pr-integration.md +37 -0
  117. package/sdk/project-team.md +13 -8
  118. package/sdk/sessions.md +1 -1
  119. package/sdk/tools.md +2 -0
  120. package/sdk/v1-runtime.md +22 -7
@@ -1,11 +1,15 @@
1
1
  import { AgentError } from "../errors.js";
2
2
  import { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from "./fx-auth.js";
3
3
  import { FxRpc } from "./fx-rpc.js";
4
+ import { verifyFxPermissionMode } from "./fx-permissions.js";
4
5
  import { startFxTools } from "./fx-tools.js";
5
6
  export async function openFx(options, createRpc = (cwd, env, model) => new FxRpc(cwd, env, model)) {
7
+ if (options.harness.kind !== "fx")
8
+ throw new AgentError("INVALID_CONFIG", "fx received configuration for a different harness.");
6
9
  const env = fxEnvironment(options);
7
10
  const baseline = await fxSettingsFingerprint(env);
8
11
  await verifyFxAccess(options.cwd, env, options.access.type);
12
+ await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);
9
13
  const tools = await startFxTools(options.agent);
10
14
  let rpc;
11
15
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n const env = fxEnvironment(options);\n const baseline = await fxSettingsFingerprint(env);\n await verifyFxAccess(options.cwd, env, options.access.type);\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== \"gateway\") {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized Gateway route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected Gateway model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.id !== undefined) {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
1
+ {"version":3,"file":"fx.js","sourceRoot":"","sources":["../../src/adapters/fx.ts"],"names":[],"mappings":"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","sourcesContent":["import { AgentError } from \"../errors.js\";\nimport { fxEnvironment, fxSettingsFingerprint, verifyFxAccess } from \"./fx-auth.js\";\nimport { FxRpc, type AcpEnvelope } from \"./fx-rpc.js\";\nimport { verifyFxPermissionMode } from \"./fx-permissions.js\";\nimport { startFxTools, type FxToolEndpoint } from \"./fx-tools.js\";\nimport type { AdapterOptions, NativeSession } from \"./types.js\";\n\ntype ActiveTurn = {\n lastMessageId?: string;\n text: string;\n responseBytes: number;\n responseTooLarge: boolean;\n completion: Promise<string>;\n resolve(text: string): void;\n reject(error: Error): void;\n terminal: boolean;\n submitted: boolean;\n cancelRequested: boolean;\n admission: Promise<void>;\n releaseAdmission(): void;\n nativeStopped: Promise<void>;\n resolveNativeStopped(): void;\n cancellationTimer?: NodeJS.Timeout;\n failure?: AgentError;\n};\n\nexport async function openFx(\n options: AdapterOptions,\n createRpc: (cwd: string, env: NodeJS.ProcessEnv, model?: string) => FxRpc = (cwd, env, model) => new FxRpc(cwd, env, model),\n): Promise<NativeSession> {\n if (options.harness.kind !== \"fx\") throw new AgentError(\"INVALID_CONFIG\", \"fx received configuration for a different harness.\");\n const env = fxEnvironment(options);\n const baseline = await fxSettingsFingerprint(env);\n await verifyFxAccess(options.cwd, env, options.access.type);\n await verifyFxPermissionMode(options.cwd, env, options.harness.permissionMode);\n const tools = await startFxTools(options.agent);\n let rpc: FxRpc | undefined;\n try {\n const startedRpc = createRpc(options.cwd, env, options.harness.model);\n rpc = startedRpc;\n let startupFailure: AgentError | undefined;\n startedRpc.setFailureHandler(error => { startupFailure ??= error; });\n tools.onFailure(error => startedRpc.abort(error));\n startedRpc.onMessage = message => startupRequest(startedRpc, message);\n const initialized = await startedRpc.request(\"initialize\", { protocolVersion: 1, clientInfo: { name: \"subharness\", version: \"0.1.0\" }, clientCapabilities: {} });\n if (!initialized || typeof initialized !== \"object\" || Array.isArray(initialized) || typeof initialized.protocolVersion !== \"number\") {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP initialization response.\");\n }\n if (initialized.protocolVersion !== 1) throw new AgentError(\"HARNESS_UNAVAILABLE\", \"The installed fx ACP protocol is not compatible with version 1.\");\n const created = await startedRpc.request(\"session/new\", {\n cwd: options.cwd,\n mcpServers: tools.descriptor ? [tools.descriptor] : [],\n });\n if (typeof created?.sessionId !== \"string\" || created.sessionId.length === 0) throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not return a native session identifier.\");\n const selectedModel = verifySelection(created.configOptions, options.harness.model);\n if (options.harness.effort !== undefined) {\n verifyEffortAvailable(created.configOptions, options.harness.effort);\n const configured = await startedRpc.request(\"session/set_config_option\", { sessionId: created.sessionId, configId: \"effort\", value: options.harness.effort });\n verifySelection(configured?.configOptions, selectedModel, options.harness.effort);\n }\n if (await fxSettingsFingerprint(env) !== baseline) throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed during session startup. Start a new session.\");\n if (startupFailure) throw startupFailure;\n return new FxSession(startedRpc, created.sessionId, options, env, baseline, tools);\n } catch (error) {\n await rpc?.close();\n await tools.close();\n if (error instanceof AgentError) throw error;\n throw new AgentError(\"HARNESS_UNAVAILABLE\", \"Cannot start fx. Check the native executable and session configuration.\");\n }\n}\n\nfunction startupRequest(rpc: FxRpc, message: AcpEnvelope): void {\n if (message.id === undefined) return;\n try { rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* process may already be closing */ }\n rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input during startup. Complete its native setup before running an agent.\"));\n}\n\nfunction option(options: unknown, id: string): any {\n if (!Array.isArray(options)) throw new AgentError(\"PROTOCOL_ERROR\", \"fx returned invalid native session options.\");\n return options.find(value => value && typeof value === \"object\" && (value as any).id === id);\n}\n\nfunction verifySelection(configOptions: unknown, requestedModel?: string, effort?: string): string {\n const provider = option(configOptions, \"provider\");\n const selectedModel = option(configOptions, \"model\");\n if (!provider || !selectedModel) {\n throw new AgentError(\"PROTOCOL_ERROR\", \"fx did not expose compatible native provider and model selectors.\");\n }\n if (provider.currentValue !== \"gateway\") {\n throw new AgentError(\"INVALID_CONFIG\", \"fx selected a provider outside the authorized Gateway route.\");\n }\n const model = selectedModel.currentValue;\n if (typeof model !== \"string\" || model.length === 0) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx could not select a verifiable native default for this connection. Supply --model <model>.\");\n }\n if (requestedModel && model !== requestedModel) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx changed the explicitly selected Gateway model.\");\n }\n if (effort !== undefined && option(configOptions, \"effort\")?.currentValue !== effort) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx did not apply the explicitly selected effort.\");\n }\n return model;\n}\n\nfunction verifyEffortAvailable(configOptions: unknown, effort: string): void {\n const configured = option(configOptions, \"effort\");\n if (!configured || !Array.isArray(configured.options) || !configured.options.some((value: any) => value?.value === effort)) {\n throw new AgentError(\"UNSUPPORTED_OPTION\", \"The requested fx effort is not supported by the selected model.\");\n }\n}\n\nclass FxSession implements NativeSession {\n private active?: ActiveTurn;\n private failure?: AgentError;\n private retirement?: Promise<void>;\n private first = true;\n private closed = false;\n\n constructor(\n private readonly rpc: FxRpc,\n private readonly sessionId: string,\n private readonly options: AdapterOptions,\n private readonly env: NodeJS.ProcessEnv,\n private readonly settingsFingerprint: string,\n private readonly tools: FxToolEndpoint,\n ) {\n rpc.setFailureHandler(error => {\n this.failure ??= error;\n const active = this.active;\n this.retirement ??= this.rpc.close();\n if (active) void this.retirement.then(() => this.finish(active, undefined, error));\n });\n rpc.onMessage = message => this.message(message);\n }\n\n private message(message: AcpEnvelope): void {\n const active = this.active;\n const params = message.params;\n if (message.id !== undefined) {\n try { this.rpc.send({ id: message.id, result: { outcome: { outcome: \"cancelled\" } } }); } catch { /* cancellation will surface the transport failure */ }\n if (!active) {\n this.rpc.abort(new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input outside an active task.\"));\n } else if (!active.failure) {\n active.failure = new AgentError(\"INPUT_REQUIRED\", \"fx requested interactive input or approval. Configure native permissions before retrying; no approval was granted.\");\n this.tools.stopAdmission();\n try { this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } }); } catch { /* onFailure settles the turn */ }\n active.cancellationTimer = setTimeout(() => {\n if (this.active === active && !active.terminal) this.rpc.abort(new AgentError(\"CANCELLATION_FAILED\", \"fx did not stop after requesting interactive input.\"));\n }, 2_000);\n active.cancellationTimer.unref();\n }\n return;\n }\n if (params?.sessionId !== this.sessionId) return;\n if (!active || message.method !== \"session/update\") return;\n const update = params.update;\n if (!update || typeof update !== \"object\" || typeof update.sessionUpdate !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid ACP session update.\"));\n return;\n }\n if (update.sessionUpdate !== \"agent_message_chunk\") return;\n if (typeof update.messageId !== \"string\" || update.content?.type !== \"text\" || typeof update.content.text !== \"string\") {\n this.rpc.abort(new AgentError(\"PROTOCOL_ERROR\", \"fx returned an invalid agent message chunk.\"));\n return;\n }\n if (active.lastMessageId !== update.messageId) {\n active.lastMessageId = update.messageId;\n active.text = \"\";\n active.responseBytes = 0;\n active.responseTooLarge = false;\n }\n active.responseBytes += Buffer.byteLength(update.content.text, \"utf8\");\n if (active.responseBytes > 1024 * 1024) active.responseTooLarge = true;\n else active.text += update.content.text;\n }\n\n private async finish(active: ActiveTurn, result?: any, failure?: AgentError): Promise<void> {\n if (active.terminal) return;\n active.terminal = true;\n active.resolveNativeStopped();\n if (active.cancellationTimer) clearTimeout(active.cancellationTimer);\n this.tools.stopAdmission();\n await this.tools.drain();\n if (this.active === active) this.active = undefined;\n if (failure) return active.reject(failure);\n if (active.failure) return active.reject(active.failure);\n if (active.responseTooLarge) return active.reject(new AgentError(\"RESPONSE_TOO_LARGE\", \"fx response exceeds 1 MiB.\"));\n if (result?.stopReason === \"end_turn\") active.resolve(active.text);\n else active.reject(new AgentError(result?.stopReason === \"cancelled\" ? \"INTERRUPTED\" : \"HARNESS_FAILED\", \"fx did not complete the turn successfully.\"));\n }\n\n async turn(prompt: string): Promise<string> {\n if (this.closed) throw new AgentError(\"HARNESS_FAILED\", \"The fx session is closed.\");\n if (this.failure) throw this.failure;\n if (this.active) throw new AgentError(\"SESSION_BUSY\", \"fx already has an active turn.\");\n let resolve!: (text: string) => void, reject!: (error: Error) => void;\n let releaseAdmission!: () => void;\n let resolveNativeStopped!: () => void;\n const completion = new Promise<string>((a, b) => { resolve = a; reject = b; });\n const admission = new Promise<void>(resolveAdmission => { releaseAdmission = resolveAdmission; });\n const nativeStopped = new Promise<void>(resolveStopped => { resolveNativeStopped = resolveStopped; });\n const active: ActiveTurn = { text: \"\", responseBytes: 0, responseTooLarge: false, completion, resolve, reject, terminal: false, submitted: false, cancelRequested: false, admission, releaseAdmission, nativeStopped, resolveNativeStopped };\n this.active = active;\n void completion.catch(() => {});\n try {\n if (await fxSettingsFingerprint(this.env) !== this.settingsFingerprint) {\n throw new AgentError(\"INVALID_CONFIG\", \"fx native settings changed while the session was active. Start a new session.\");\n }\n if (this.failure) throw this.failure;\n if (active.terminal || this.active !== active) throw new AgentError(\"HARNESS_FAILED\", \"fx stopped while preparing the native prompt.\");\n if (active.cancelRequested || this.closed) throw new AgentError(\"INTERRUPTED\", \"The fx turn was interrupted before submission.\");\n this.tools.beginTurn();\n const includeInstructions = this.first;\n const text = includeInstructions && this.options.agent.instructions ? firstPrompt(this.options.agent.instructions, prompt) : prompt;\n active.submitted = true;\n active.releaseAdmission();\n const result = await this.rpc.request(\"session/prompt\", { sessionId: this.sessionId, prompt: [{ type: \"text\", text }] });\n if (includeInstructions) this.first = false;\n await this.finish(active, result);\n return await completion;\n } catch (error) {\n active.releaseAdmission();\n if (this.failure && this.retirement) await this.retirement;\n await this.finish(active, undefined, error instanceof AgentError ? error : new AgentError(\"HARNESS_FAILED\", \"fx could not complete the native prompt.\"));\n return await completion;\n }\n }\n\n async steer(_prompt: string): Promise<void> {\n throw new AgentError(\"UNSUPPORTED_DELIVERY\", \"fx does not expose verified active steering.\");\n }\n\n async interrupt(): Promise<void> {\n const active = this.active;\n if (!active) return;\n active.cancelRequested = true;\n this.tools.stopAdmission();\n await bounded(active.admission, 2_000);\n const admittedTools = this.tools.drain();\n let cancellationFailure: unknown;\n try {\n if (active.submitted && !active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n } catch (error) {\n cancellationFailure = error;\n }\n await admittedTools;\n if (cancellationFailure && !this.failure) throw cancellationFailure;\n await bounded(active.nativeStopped, 3_000);\n await active.completion.catch(() => {});\n }\n\n async resume(): Promise<string> {\n throw new AgentError(\"RECOVERY_UNSUPPORTED\", \"fx recovery without a new prompt is unavailable.\");\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.tools.stopAdmission();\n try {\n if (this.active) {\n this.active.cancelRequested = true;\n await bounded(this.active.admission, 2_000);\n if (this.active.submitted && !this.active.terminal) this.rpc.send({ method: \"session/cancel\", params: { sessionId: this.sessionId } });\n }\n await bounded(this.rpc.request(\"session/close\", { sessionId: this.sessionId }), 2_000);\n } catch { /* process termination below still retires the session */ }\n await this.rpc.close();\n await this.tools.close();\n }\n}\n\nfunction firstPrompt(instructions: string, prompt: string): string {\n return `<subharness-instructions>\\n${instructions}\\n</subharness-instructions>\\n\\n${prompt}`;\n}\n\nasync function bounded<T>(promise: Promise<T>, milliseconds: number): Promise<T> {\n let timer!: NodeJS.Timeout;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new AgentError(\"CANCELLATION_FAILED\", \"fx did not confirm that native execution stopped.\")), milliseconds);\n timer.unref();\n });\n try { return await Promise.race([promise, timeout]); }\n finally { clearTimeout(timer); }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { type PromptStream } from './input.js';
2
- export type Command = 'list' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'help' | 'version';
2
+ export type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'help' | 'version';
3
3
  export interface Arguments {
4
4
  command: Command;
5
5
  id?: string;
@@ -9,9 +9,11 @@ export interface Arguments {
9
9
  delivery: 'queue' | 'steer' | 'interrupt';
10
10
  format: 'text' | 'jsonl';
11
11
  full: boolean;
12
+ detach: boolean;
12
13
  harness?: 'codex' | 'claudeCode' | 'fx';
13
14
  model?: string;
14
15
  effort?: string;
16
+ helpCommand?: 'run' | 'check';
15
17
  }
16
18
  export declare function parseArgs(argv: string[], cwd?: string, dependencies?: {
17
19
  stdin?: PromptStream;
package/dist/cli/args.js CHANGED
@@ -2,7 +2,7 @@ import { resolve } from 'node:path';
2
2
  import { AgentError } from '../errors.js';
3
3
  import { MAX_PROMPT_BYTES, readPromptInput } from './input.js';
4
4
  const options = {
5
- list: ['cwd'], run: ['cwd', 'prompt', 'prompt-file', 'model', 'effort'], send: ['delivery', 'prompt', 'prompt-file'],
5
+ list: ['cwd'], dashboard: [], check: ['cwd', 'model', 'effort'], run: ['cwd', 'prompt', 'prompt-file', 'model', 'effort', 'detach'], send: ['delivery', 'prompt', 'prompt-file', 'detach'],
6
6
  wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [],
7
7
  };
8
8
  const directTargets = { codex: 'codex', claude: 'claudeCode', fx: 'fx' };
@@ -33,11 +33,11 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
33
33
  continue;
34
34
  }
35
35
  const name = argument.slice(2);
36
- if (name !== 'format' && name !== 'help' && !options[command].includes(name))
36
+ if ((name !== 'format' || command === 'dashboard') && name !== 'help' && !options[command].includes(name))
37
37
  fail(`Unknown option: ${argument}`);
38
38
  if (name in values)
39
39
  fail(`Duplicate option: ${argument}`);
40
- if (name === 'full' || name === 'help')
40
+ if (name === 'full' || name === 'help' || name === 'detach')
41
41
  values[name] = true;
42
42
  else {
43
43
  const value = argv[++i];
@@ -46,15 +46,17 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
46
46
  values[name] = value;
47
47
  }
48
48
  }
49
+ if (command === 'dashboard' && positionals.length)
50
+ fail('Expected no identifier for dashboard.');
49
51
  if (values.help === true) {
50
52
  if (Object.keys(values).some(name => name !== 'help'))
51
53
  fail('--help cannot be combined with other options.');
52
- const target = command === 'run' && positionals[0] && Object.hasOwn(directTargets, positionals[0])
54
+ const target = (command === 'run' || command === 'check') && positionals[0] && Object.hasOwn(directTargets, positionals[0])
53
55
  ? directTargets[positionals[0]] : undefined;
54
- return { ...defaults('help', cwd), ...(target ? { id: positionals[0], harness: target } : {}) };
56
+ return { ...defaults('help', cwd), ...(target ? { id: positionals[0], harness: target, helpCommand: command } : {}) };
55
57
  }
56
58
  const promptCommand = command === 'run' || command === 'send';
57
- const identifierCount = command === 'list' ? 0 : 1;
59
+ const identifierCount = command === 'list' || command === 'dashboard' ? 0 : 1;
58
60
  if (positionals.length < identifierCount)
59
61
  fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);
60
62
  if (!promptCommand && positionals.length !== identifierCount)
@@ -67,9 +69,11 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
67
69
  const delivery = values.delivery ?? 'queue';
68
70
  if (!['queue', 'steer', 'interrupt'].includes(String(delivery)))
69
71
  fail('Delivery must be queue, steer, or interrupt.');
72
+ if (values.detach === true && delivery === 'steer')
73
+ fail('--detach cannot be combined with --delivery steer.');
70
74
  const result = { ...defaults(command, cwd), id: positionals[0], format, delivery,
71
- cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true };
72
- if (command === 'run') {
75
+ cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true, detach: values.detach === true };
76
+ if (command === 'run' || command === 'check') {
73
77
  const direct = Object.hasOwn(directTargets, result.id)
74
78
  ? directTargets[result.id] : undefined;
75
79
  if (direct)
@@ -106,13 +110,15 @@ export async function parseArgs(argv, cwd = process.cwd(), dependencies = {}) {
106
110
  fail('Prompt exceeds 1 MiB.');
107
111
  }
108
112
  if (command === 'wait') {
109
- if (!values.after)
110
- fail('wait requires --after <response-id>.');
111
- result.after = String(values.after);
113
+ if ('after' in values) {
114
+ if (!values.after)
115
+ fail('wait requires --after <response-id>.');
116
+ result.after = String(values.after);
117
+ }
112
118
  }
113
119
  return result;
114
120
  }
115
121
  function defaults(command, cwd) {
116
- return { command, cwd, delivery: 'queue', format: 'text', full: false };
122
+ return { command, cwd, delivery: 'queue', format: 'text', full: false, detach: false };
117
123
  }
118
124
  //# sourceMappingURL=args.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAC;AAQlF,MAAM,OAAO,GAA6B;IACxC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAC,QAAQ,EAAC,aAAa,EAAC,OAAO,EAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,EAAC,QAAQ,EAAC,aAAa,CAAC;IAC9G,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;CACrE,CAAC;AACF,MAAM,aAAa,GAAG,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAAC,YAAY,EAAC,EAAE,EAAC,IAAI,EAAU,CAAC;AAC3E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAC;AACrE,MAAM,IAAI,GAAG,CAAC,OAAe,EAAS,EAAE,GAAG,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhG,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAc,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,GAA2B,EAAE;IAE9E,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,oBAAoB,OAAO,0BAA0B,CAAC,CAAC;IAClG,MAAM,MAAM,GAAqC,EAAE,CAAC;IACpD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,YAAY,GAAG,IAAI,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC1B,IAAI,YAAY,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAAC,YAAY,GAAG,KAAK,CAAC;YAAC,SAAS;QAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACnH,IAAI,IAAI,IAAI,MAAM;YAAE,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;aACvD,CAAC;YACJ,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAE,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;YAChH,MAAM,CAAC,IAAI,CAAC,GAAG,KAAM,CAAC;QACxB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC;YAAE,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;YAChG,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAA+B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,OAAO,EAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC;IAC9F,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;IAC9D,MAAM,eAAe,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,WAAW,CAAC,MAAM,GAAG,eAAe;QAAE,IAAI,CAAC,YAAY,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,QAAQ,OAAO,GAAG,CAAC,CAAC;IACnI,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC,MAAM,KAAK,eAAe;QAAE,IAAI,CAAC,YAAY,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,QAAQ,OAAO,GAAG,CAAC,CAAC;IACvJ,IAAI,aAAa,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,sCAAsC,OAAO,GAAG,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;IACvC,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO;QAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC;IAC5C,IAAI,CAAC,CAAC,OAAO,EAAC,OAAO,EAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAE,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACpH,MAAM,MAAM,GAAG,EAAC,GAAG,QAAQ,CAAC,OAAkB,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ;QACxF,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAc,CAAC;IACzF,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,EAAG,CAAC;YACrD,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,EAAiC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QACpC,IAAI,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACzF,IAAI,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACxF,IAAI,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3F,IAAI,MAAM,KAAK,YAAY,IAAI,QAAQ,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC/F,IAAI,CAAC,yDAAyD,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,OAAO,IAAI,MAAM;gBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,QAAQ,IAAI,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChH,IAAI,CAAC,sFAAsF,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAChG,CAAC;;YAAM,MAAM,CAAC,MAAM,GAAG,gBAAgB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE;YAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAO,CAAC,GAAG,gBAAgB;YAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,SAAS,QAAQ,CAAC,OAAgB,EAAE,GAAW;IAC7C,OAAO,EAAC,OAAO,EAAC,GAAG,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC;AACjE,CAAC","sourcesContent":["import { resolve } from 'node:path';\nimport { AgentError } from '../errors.js';\nimport { MAX_PROMPT_BYTES, readPromptInput, type PromptStream } from './input.js';\n\nexport type Command = 'list' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'help' | 'version';\nexport interface Arguments {\n command: Command; id?: string; cwd: string; prompt?: string; after?: string;\n delivery: 'queue' | 'steer' | 'interrupt'; format: 'text' | 'jsonl'; full: boolean;\n harness?: 'codex' | 'claudeCode' | 'fx'; model?: string; effort?: string;\n}\nconst options: Record<string, string[]> = {\n list: ['cwd'], run: ['cwd','prompt','prompt-file','model','effort'], send: ['delivery','prompt','prompt-file'],\n wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [],\n};\nconst directTargets = {codex:'codex',claude:'claudeCode',fx:'fx'} as const;\nconst claudeEfforts = new Set(['low','medium','high','xhigh','max']);\nconst fail = (message: string): never => { throw new AgentError('INVALID_ARGUMENT', message); };\n\nexport async function parseArgs(\n argv: string[], cwd = process.cwd(), dependencies: {stdin?: PromptStream} = {},\n): Promise<Arguments> {\n if (!argv.length) return defaults('help', cwd);\n if (argv[0] === '--help' || argv[0] === '--version') {\n if (argv.length !== 1) fail(`${argv[0]} cannot be combined with other options.`);\n return defaults(argv[0] === '--help' ? 'help' : 'version', cwd);\n }\n const command = argv[0]!;\n if (!Object.hasOwn(options, command)) fail(`Unknown command: ${command}. Use subharness --help.`);\n const values: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n let parseOptions = true;\n for (let i = 1; i < argv.length; i++) {\n const argument = argv[i]!;\n if (parseOptions && argument === '--') { parseOptions = false; continue; }\n if (!parseOptions || !argument.startsWith('--')) { positionals.push(argument); continue; }\n const name = argument.slice(2);\n if (name !== 'format' && name !== 'help' && !options[command]!.includes(name)) fail(`Unknown option: ${argument}`);\n if (name in values) fail(`Duplicate option: ${argument}`);\n if (name === 'full' || name === 'help') values[name] = true;\n else {\n const value = argv[++i];\n if (value === undefined || (name !== 'prompt' && value.startsWith('--'))) fail(`Missing value for ${argument}`);\n values[name] = value!;\n }\n }\n if (values.help === true) {\n if (Object.keys(values).some(name => name !== 'help')) fail('--help cannot be combined with other options.');\n const target = command === 'run' && positionals[0] && Object.hasOwn(directTargets, positionals[0])\n ? directTargets[positionals[0] as keyof typeof directTargets] : undefined;\n return {...defaults('help', cwd), ...(target ? {id: positionals[0], harness: target} : {})};\n }\n const promptCommand = command === 'run' || command === 'send';\n const identifierCount = command === 'list' ? 0 : 1;\n if (positionals.length < identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (!promptCommand && positionals.length !== identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (promptCommand && positionals.length > 2) fail(`Expected one positional prompt for ${command}.`);\n const format = values.format ?? 'text';\n if (format !== 'text' && format !== 'jsonl') fail('Format must be text or jsonl.');\n const delivery = values.delivery ?? 'queue';\n if (!['queue','steer','interrupt'].includes(String(delivery))) fail('Delivery must be queue, steer, or interrupt.');\n const result = {...defaults(command as Command, cwd), id: positionals[0], format, delivery,\n cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true} as Arguments;\n if (command === 'run') {\n const direct = Object.hasOwn(directTargets, result.id!)\n ? directTargets[result.id! as keyof typeof directTargets] : undefined;\n if (direct) result.harness = direct;\n if ('model' in values || 'effort' in values) {\n if (!direct) fail('--model and --effort are available only for direct harness targets.');\n if ('model' in values && !String(values.model).trim()) fail('Model must contain text.');\n if ('effort' in values && !String(values.effort).trim()) fail('Effort must contain text.');\n if (direct === 'claudeCode' && 'effort' in values && !claudeEfforts.has(String(values.effort))) {\n fail('Claude effort must be low, medium, high, xhigh, or max.');\n }\n if ('model' in values) result.model = String(values.model);\n if ('effort' in values) result.effort = String(values.effort);\n }\n }\n if (command === 'run' || command === 'send') {\n const positionalPrompt = positionals[1];\n if (Number(positionalPrompt !== undefined) + Number('prompt' in values) + Number('prompt-file' in values) !== 1) {\n fail('Supply exactly one prompt source: one positional prompt, --prompt, or --prompt-file.');\n }\n if ('prompt-file' in values) {\n result.prompt = await readPromptInput(String(values['prompt-file']), cwd, dependencies.stdin);\n } else result.prompt = positionalPrompt ?? String(values.prompt);\n if (!result.prompt?.trim()) fail('Prompt must contain text.');\n if (Buffer.byteLength(result.prompt!) > MAX_PROMPT_BYTES) fail('Prompt exceeds 1 MiB.');\n }\n if (command === 'wait') {\n if (!values.after) fail('wait requires --after <response-id>.');\n result.after = String(values.after);\n }\n return result;\n}\nfunction defaults(command: Command, cwd: string): Arguments {\n return {command,cwd,delivery:'queue',format:'text',full:false};\n}\n"]}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolve } from 'node:path';\nimport { AgentError } from '../errors.js';\nimport { MAX_PROMPT_BYTES, readPromptInput, type PromptStream } from './input.js';\n\nexport type Command = 'list' | 'dashboard' | 'check' | 'run' | 'send' | 'wait' | 'status' | 'queue' | 'cancel' | 'resume' | 'help' | 'version';\nexport interface Arguments {\n command: Command; id?: string; cwd: string; prompt?: string; after?: string;\n delivery: 'queue' | 'steer' | 'interrupt'; format: 'text' | 'jsonl'; full: boolean; detach: boolean;\n harness?: 'codex' | 'claudeCode' | 'fx'; model?: string; effort?: string;\n helpCommand?: 'run' | 'check';\n}\nconst options: Record<string, string[]> = {\n list: ['cwd'], dashboard: [], check: ['cwd','model','effort'], run: ['cwd','prompt','prompt-file','model','effort','detach'], send: ['delivery','prompt','prompt-file','detach'],\n wait: ['after'], status: ['full'], queue: [], cancel: [], resume: [],\n};\nconst directTargets = {codex:'codex',claude:'claudeCode',fx:'fx'} as const;\nconst claudeEfforts = new Set(['low','medium','high','xhigh','max']);\nconst fail = (message: string): never => { throw new AgentError('INVALID_ARGUMENT', message); };\n\nexport async function parseArgs(\n argv: string[], cwd = process.cwd(), dependencies: {stdin?: PromptStream} = {},\n): Promise<Arguments> {\n if (!argv.length) return defaults('help', cwd);\n if (argv[0] === '--help' || argv[0] === '--version') {\n if (argv.length !== 1) fail(`${argv[0]} cannot be combined with other options.`);\n return defaults(argv[0] === '--help' ? 'help' : 'version', cwd);\n }\n const command = argv[0]!;\n if (!Object.hasOwn(options, command)) fail(`Unknown command: ${command}. Use subharness --help.`);\n const values: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n let parseOptions = true;\n for (let i = 1; i < argv.length; i++) {\n const argument = argv[i]!;\n if (parseOptions && argument === '--') { parseOptions = false; continue; }\n if (!parseOptions || !argument.startsWith('--')) { positionals.push(argument); continue; }\n const name = argument.slice(2);\n if ((name !== 'format' || command === 'dashboard') && name !== 'help' && !options[command]!.includes(name)) fail(`Unknown option: ${argument}`);\n if (name in values) fail(`Duplicate option: ${argument}`);\n if (name === 'full' || name === 'help' || name === 'detach') values[name] = true;\n else {\n const value = argv[++i];\n if (value === undefined || (name !== 'prompt' && value.startsWith('--'))) fail(`Missing value for ${argument}`);\n values[name] = value!;\n }\n }\n if (command === 'dashboard' && positionals.length) fail('Expected no identifier for dashboard.');\n if (values.help === true) {\n if (Object.keys(values).some(name => name !== 'help')) fail('--help cannot be combined with other options.');\n const target = (command === 'run' || command === 'check') && positionals[0] && Object.hasOwn(directTargets, positionals[0])\n ? directTargets[positionals[0] as keyof typeof directTargets] : undefined;\n return {...defaults('help', cwd), ...(target ? {id: positionals[0], harness: target, helpCommand: command as 'run' | 'check'} : {})};\n }\n const promptCommand = command === 'run' || command === 'send';\n const identifierCount = command === 'list' || command === 'dashboard' ? 0 : 1;\n if (positionals.length < identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (!promptCommand && positionals.length !== identifierCount) fail(`Expected ${identifierCount ? 'one identifier' : 'no identifier'} for ${command}.`);\n if (promptCommand && positionals.length > 2) fail(`Expected one positional prompt for ${command}.`);\n const format = values.format ?? 'text';\n if (format !== 'text' && format !== 'jsonl') fail('Format must be text or jsonl.');\n const delivery = values.delivery ?? 'queue';\n if (!['queue','steer','interrupt'].includes(String(delivery))) fail('Delivery must be queue, steer, or interrupt.');\n if (values.detach === true && delivery === 'steer') fail('--detach cannot be combined with --delivery steer.');\n const result = {...defaults(command as Command, cwd), id: positionals[0], format, delivery,\n cwd: resolve(cwd, String(values.cwd ?? '.')), full: values.full === true, detach: values.detach === true} as Arguments;\n if (command === 'run' || command === 'check') {\n const direct = Object.hasOwn(directTargets, result.id!)\n ? directTargets[result.id! as keyof typeof directTargets] : undefined;\n if (direct) result.harness = direct;\n if ('model' in values || 'effort' in values) {\n if (!direct) fail('--model and --effort are available only for direct harness targets.');\n if ('model' in values && !String(values.model).trim()) fail('Model must contain text.');\n if ('effort' in values && !String(values.effort).trim()) fail('Effort must contain text.');\n if (direct === 'claudeCode' && 'effort' in values && !claudeEfforts.has(String(values.effort))) {\n fail('Claude effort must be low, medium, high, xhigh, or max.');\n }\n if ('model' in values) result.model = String(values.model);\n if ('effort' in values) result.effort = String(values.effort);\n }\n }\n if (command === 'run' || command === 'send') {\n const positionalPrompt = positionals[1];\n if (Number(positionalPrompt !== undefined) + Number('prompt' in values) + Number('prompt-file' in values) !== 1) {\n fail('Supply exactly one prompt source: one positional prompt, --prompt, or --prompt-file.');\n }\n if ('prompt-file' in values) {\n result.prompt = await readPromptInput(String(values['prompt-file']), cwd, dependencies.stdin);\n } else result.prompt = positionalPrompt ?? String(values.prompt);\n if (!result.prompt?.trim()) fail('Prompt must contain text.');\n if (Buffer.byteLength(result.prompt!) > MAX_PROMPT_BYTES) fail('Prompt exceeds 1 MiB.');\n }\n if (command === 'wait') {\n if ('after' in values) {\n if (!values.after) fail('wait requires --after <response-id>.');\n result.after = String(values.after);\n }\n }\n return result;\n}\nfunction defaults(command: Command, cwd: string): Arguments {\n return {command,cwd,delivery:'queue',format:'text',full:false,detach:false};\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { DashboardSnapshot } from '../runtime/dashboard.js';
2
+ import type { Endpoint } from '../runtime/state.js';
3
+ export declare function fetchDashboardSnapshot(endpoint: Endpoint, signal: AbortSignal, timeoutMs?: number): Promise<DashboardSnapshot>;
@@ -0,0 +1,78 @@
1
+ import { isAbsolute } from 'node:path';
2
+ import { AgentError } from '../errors.js';
3
+ const harnesses = new Set(['codex', 'claude', 'fx', 'pending']);
4
+ const states = new Set(['queued', 'running', 'waiting', 'completed', 'failed', 'cancelled', 'interrupted']);
5
+ const finishedStates = new Set(['completed', 'cancelled', 'interrupted']);
6
+ const timestamp = (value) => value === undefined || (typeof value === 'number' && Number.isFinite(value) && value >= 0);
7
+ function isWorkspace(value) {
8
+ if (!value || typeof value !== 'object')
9
+ return false;
10
+ const workspace = value;
11
+ return typeof workspace.directory === 'string' && isAbsolute(workspace.directory)
12
+ && (workspace.repository === undefined || (typeof workspace.repository === 'string' && isAbsolute(workspace.repository)));
13
+ }
14
+ function isSnapshot(value) {
15
+ if (!value || typeof value !== 'object')
16
+ return false;
17
+ const snapshot = value;
18
+ if (snapshot.version !== 1 || snapshot.type !== 'dashboard' || !Array.isArray(snapshot.sessions))
19
+ return false;
20
+ if ('history' in snapshot && typeof snapshot.history !== 'boolean')
21
+ return false;
22
+ if ('grouping' in snapshot && typeof snapshot.grouping !== 'boolean')
23
+ return false;
24
+ return snapshot.sessions.every((row) => {
25
+ if (!row || typeof row !== 'object')
26
+ return false;
27
+ const item = row;
28
+ return typeof item.sessionId === 'string' && typeof item.taskId === 'string'
29
+ && typeof item.harness === 'string' && harnesses.has(item.harness)
30
+ && typeof item.state === 'string' && states.has(item.state)
31
+ && typeof item.title === 'string' && [...item.title].length <= 120
32
+ && (snapshot.grouping !== true || (isWorkspace(item.workspace) && item.updatedAt !== undefined && timestamp(item.updatedAt)))
33
+ && timestamp(item.dispatchedAt) && timestamp(item.failedAt) && timestamp(item.finishedAt)
34
+ && (!finishedStates.has(item.state) || item.finishedAt !== undefined);
35
+ });
36
+ }
37
+ function isLegacyUnknownOperation(value) {
38
+ if (!value || typeof value !== 'object')
39
+ return false;
40
+ const response = value;
41
+ if (Object.keys(response).length !== 3 || response.version !== 1 || response.type !== 'error'
42
+ || !response.error || typeof response.error !== 'object')
43
+ return false;
44
+ const error = response.error;
45
+ return Object.keys(error).length === 2
46
+ && error.code === 'INVALID_ARGUMENT' && error.message === 'Unknown coordinator operation.';
47
+ }
48
+ function outdatedCoordinator(endpoint) {
49
+ return new AgentError('COORDINATOR_OUTDATED', `The background coordinator (PID ${endpoint.pid}) does not support finished-run history and checkout grouping. Stop that coordinator after active work ends, then start a new run. Reopening the dashboard does not reload coordinator code. Restarting the coordinator discards retained in-memory history.`);
50
+ }
51
+ export async function fetchDashboardSnapshot(endpoint, signal, timeoutMs = 5_000) {
52
+ const bounded = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
53
+ try {
54
+ const response = await fetch(endpoint.url, {
55
+ method: 'POST', headers: { authorization: `Bearer ${endpoint.token}`, 'content-type': 'application/json' },
56
+ body: JSON.stringify({ command: 'dashboard' }), signal: bounded,
57
+ });
58
+ if (!response.ok) {
59
+ await response.body?.cancel();
60
+ throw new Error('Rejected snapshot');
61
+ }
62
+ const snapshot = JSON.parse(await response.text());
63
+ if (isLegacyUnknownOperation(snapshot))
64
+ throw outdatedCoordinator(endpoint);
65
+ if (!isSnapshot(snapshot))
66
+ throw new Error('Invalid snapshot');
67
+ if (snapshot.history !== true || snapshot.grouping !== true) {
68
+ throw outdatedCoordinator(endpoint);
69
+ }
70
+ return { ...snapshot, history: true, grouping: true };
71
+ }
72
+ catch (error) {
73
+ if (error instanceof AgentError)
74
+ throw error;
75
+ throw new AgentError('COORDINATOR_UNAVAILABLE', 'The dashboard lost its connection to the local coordinator or received an invalid snapshot.');
76
+ }
77
+ }
78
+ //# sourceMappingURL=dashboard-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-client.js","sourceRoot":"","sources":["../../src/cli/dashboard-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AAChE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AAC5G,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AAC1E,MAAM,SAAS,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AAEjI,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC;WAC5E,CAAC,SAAS,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC9H,CAAC;AAID,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAgC,CAAC;IAClD,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/G,IAAI,SAAS,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,UAAU,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACnF,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,IAAI,GAAG,GAA8B,CAAC;QAC5C,OAAO,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;eACvE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;eAC/D,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;eACxD,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG;eAC/D,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;eAC1H,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;eACtF,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAgC,CAAC;IAClD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;WACxF,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAgC,CAAC;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;WACjC,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,OAAO,KAAK,gCAAgC,CAAC;AAC/F,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAkB;IAC7C,OAAO,IAAI,UAAU,CAAC,sBAAsB,EAAE,mCAAmC,QAAQ,CAAC,GAAG,8PAA8P,CAAC,CAAC;AAC/V,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,MAAmB,EAAE,SAAS,GAAG,KAAK;IACrG,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACzC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAC,aAAa,EAAE,UAAU,QAAQ,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAC;YACxG,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,WAAW,EAAC,CAAC,EAAE,MAAM,EAAE,OAAO;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAAC,CAAC;QAC1F,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,wBAAwB,CAAC,QAAQ,CAAC;YAAE,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC/D,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5D,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU;YAAE,MAAM,KAAK,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,yBAAyB,EAAE,6FAA6F,CAAC,CAAC;IACjJ,CAAC;AACH,CAAC","sourcesContent":["import { isAbsolute } from 'node:path';\nimport { AgentError } from '../errors.js';\nimport type { DashboardSnapshot } from '../runtime/dashboard.js';\nimport type { Endpoint } from '../runtime/state.js';\n\nconst harnesses = new Set(['codex', 'claude', 'fx', 'pending']);\nconst states = new Set(['queued', 'running', 'waiting', 'completed', 'failed', 'cancelled', 'interrupted']);\nconst finishedStates = new Set(['completed', 'cancelled', 'interrupted']);\nconst timestamp = (value: unknown) => value === undefined || (typeof value === 'number' && Number.isFinite(value) && value >= 0);\n\nfunction isWorkspace(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const workspace = value as Record<string, unknown>;\n return typeof workspace.directory === 'string' && isAbsolute(workspace.directory)\n && (workspace.repository === undefined || (typeof workspace.repository === 'string' && isAbsolute(workspace.repository)));\n}\n\ntype SnapshotResponse = Omit<DashboardSnapshot, 'history' | 'grouping'> & {history?: boolean; grouping?: boolean};\n\nfunction isSnapshot(value: unknown): value is SnapshotResponse {\n if (!value || typeof value !== 'object') return false;\n const snapshot = value as Record<string, unknown>;\n if (snapshot.version !== 1 || snapshot.type !== 'dashboard' || !Array.isArray(snapshot.sessions)) return false;\n if ('history' in snapshot && typeof snapshot.history !== 'boolean') return false;\n if ('grouping' in snapshot && typeof snapshot.grouping !== 'boolean') return false;\n return snapshot.sessions.every((row: unknown) => {\n if (!row || typeof row !== 'object') return false;\n const item = row as Record<string, unknown>;\n return typeof item.sessionId === 'string' && typeof item.taskId === 'string'\n && typeof item.harness === 'string' && harnesses.has(item.harness)\n && typeof item.state === 'string' && states.has(item.state)\n && typeof item.title === 'string' && [...item.title].length <= 120\n && (snapshot.grouping !== true || (isWorkspace(item.workspace) && item.updatedAt !== undefined && timestamp(item.updatedAt)))\n && timestamp(item.dispatchedAt) && timestamp(item.failedAt) && timestamp(item.finishedAt)\n && (!finishedStates.has(item.state) || item.finishedAt !== undefined);\n });\n}\n\nfunction isLegacyUnknownOperation(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const response = value as Record<string, unknown>;\n if (Object.keys(response).length !== 3 || response.version !== 1 || response.type !== 'error'\n || !response.error || typeof response.error !== 'object') return false;\n const error = response.error as Record<string, unknown>;\n return Object.keys(error).length === 2\n && error.code === 'INVALID_ARGUMENT' && error.message === 'Unknown coordinator operation.';\n}\n\nfunction outdatedCoordinator(endpoint: Endpoint): AgentError {\n return new AgentError('COORDINATOR_OUTDATED', `The background coordinator (PID ${endpoint.pid}) does not support finished-run history and checkout grouping. Stop that coordinator after active work ends, then start a new run. Reopening the dashboard does not reload coordinator code. Restarting the coordinator discards retained in-memory history.`);\n}\n\nexport async function fetchDashboardSnapshot(endpoint: Endpoint, signal: AbortSignal, timeoutMs = 5_000): Promise<DashboardSnapshot> {\n const bounded = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);\n try {\n const response = await fetch(endpoint.url, {\n method: 'POST', headers: {authorization: `Bearer ${endpoint.token}`, 'content-type': 'application/json'},\n body: JSON.stringify({command: 'dashboard'}), signal: bounded,\n });\n if (!response.ok) { await response.body?.cancel(); throw new Error('Rejected snapshot'); }\n const snapshot: unknown = JSON.parse(await response.text());\n if (isLegacyUnknownOperation(snapshot)) throw outdatedCoordinator(endpoint);\n if (!isSnapshot(snapshot)) throw new Error('Invalid snapshot');\n if (snapshot.history !== true || snapshot.grouping !== true) {\n throw outdatedCoordinator(endpoint);\n }\n return {...snapshot, history: true, grouping: true};\n } catch (error) {\n if (error instanceof AgentError) throw error;\n throw new AgentError('COORDINATOR_UNAVAILABLE', 'The dashboard lost its connection to the local coordinator or received an invalid snapshot.');\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { DashboardRow, DashboardWorkspace } from '../runtime/dashboard.js';
2
+ export interface DashboardGroup {
3
+ workspace: DashboardWorkspace;
4
+ rows: DashboardRow[];
5
+ updatedAt: number;
6
+ }
7
+ export interface LabelledDashboardGroup extends DashboardGroup {
8
+ label: string;
9
+ }
10
+ export interface DashboardGrouping {
11
+ groups: DashboardGroup[];
12
+ firstObserved: ReadonlyMap<string, number>;
13
+ }
14
+ /** Groups a snapshot without changing coordinator-owned row order. */
15
+ export declare function groupDashboardRows(rows: DashboardRow[], launchWorkspace?: DashboardWorkspace, previousFirstObserved?: ReadonlyMap<string, number>): DashboardGrouping;
16
+ /** Adds parent components only when short workspace labels would collide. */
17
+ export declare function labelDashboardGroups(groups: DashboardGroup[]): LabelledDashboardGroup[];
18
+ export declare function clipDashboardText(text: string, columns: number): string;
19
+ export declare function dashboardElapsed(row: DashboardRow, now: number): string;
20
+ export declare function formatDashboardRows(rows: DashboardRow[], columns: number, now: number): string[];
21
+ export declare function layoutDashboardGroups(groups: LabelledDashboardGroup[], columns: number, now: number, maxLines?: number): string[];