subharness 0.0.4 → 0.0.7
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.md +95 -9
- package/dist/adapters/claude-process.d.ts +3 -0
- package/dist/adapters/claude-process.js +19 -2
- package/dist/adapters/claude-process.js.map +1 -1
- package/dist/adapters/claude-result.d.ts +2 -0
- package/dist/adapters/claude-result.js +22 -0
- package/dist/adapters/claude-result.js.map +1 -0
- package/dist/adapters/claude-tools.d.ts +6 -2
- package/dist/adapters/claude-tools.js +14 -12
- package/dist/adapters/claude-tools.js.map +1 -1
- package/dist/adapters/claude-worker-client.d.ts +49 -0
- package/dist/adapters/claude-worker-client.js +359 -0
- package/dist/adapters/claude-worker-client.js.map +1 -0
- package/dist/adapters/claude-worker-process.d.ts +20 -0
- package/dist/adapters/claude-worker-process.js +76 -0
- package/dist/adapters/claude-worker-process.js.map +1 -0
- package/dist/adapters/claude-worker-protocol.d.ts +38 -0
- package/dist/adapters/claude-worker-protocol.js +2 -0
- package/dist/adapters/claude-worker-protocol.js.map +1 -0
- package/dist/adapters/claude-worker.d.ts +1 -0
- package/dist/adapters/claude-worker.js +126 -0
- package/dist/adapters/claude-worker.js.map +1 -0
- package/dist/adapters/claude.d.ts +16 -6
- package/dist/adapters/claude.js +164 -75
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.js +4 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot-permissions.d.ts +26 -0
- package/dist/adapters/copilot-permissions.js +121 -0
- package/dist/adapters/copilot-permissions.js.map +1 -0
- package/dist/adapters/copilot-tools.d.ts +12 -0
- package/dist/adapters/copilot-tools.js +61 -0
- package/dist/adapters/copilot-tools.js.map +1 -0
- package/dist/adapters/copilot.d.ts +108 -0
- package/dist/adapters/copilot.js +819 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
- package/dist/adapters/cursor-cli-approvals.js +83 -0
- package/dist/adapters/cursor-cli-approvals.js.map +1 -0
- package/dist/adapters/cursor-cli-model.d.ts +4 -0
- package/dist/adapters/cursor-cli-model.js +64 -0
- package/dist/adapters/cursor-cli-model.js.map +1 -0
- package/dist/adapters/cursor-cli-session.d.ts +32 -0
- package/dist/adapters/cursor-cli-session.js +316 -0
- package/dist/adapters/cursor-cli-session.js.map +1 -0
- package/dist/adapters/cursor-cli-tools.d.ts +20 -0
- package/dist/adapters/cursor-cli-tools.js +181 -0
- package/dist/adapters/cursor-cli-tools.js.map +1 -0
- package/dist/adapters/cursor-cli.d.ts +2 -0
- package/dist/adapters/cursor-cli.js +306 -0
- package/dist/adapters/cursor-cli.js.map +1 -0
- package/dist/adapters/cursor-model.d.ts +7 -0
- package/dist/adapters/cursor-model.js +67 -0
- package/dist/adapters/cursor-model.js.map +1 -0
- package/dist/adapters/cursor-rpc.d.ts +42 -0
- package/dist/adapters/cursor-rpc.js +271 -0
- package/dist/adapters/cursor-rpc.js.map +1 -0
- package/dist/adapters/cursor-session.d.ts +4 -0
- package/dist/adapters/cursor-session.js +327 -0
- package/dist/adapters/cursor-session.js.map +1 -0
- package/dist/adapters/cursor-startup.d.ts +16 -0
- package/dist/adapters/cursor-startup.js +74 -0
- package/dist/adapters/cursor-startup.js.map +1 -0
- package/dist/adapters/cursor-tools.d.ts +11 -0
- package/dist/adapters/cursor-tools.js +49 -0
- package/dist/adapters/cursor-tools.js.map +1 -0
- package/dist/adapters/cursor.d.ts +6 -0
- package/dist/adapters/cursor.js +17 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/fx-auth.d.ts +12 -2
- package/dist/adapters/fx-auth.js +51 -61
- package/dist/adapters/fx-auth.js.map +1 -1
- package/dist/adapters/fx-profile.d.ts +8 -0
- package/dist/adapters/fx-profile.js +101 -0
- package/dist/adapters/fx-profile.js.map +1 -0
- package/dist/adapters/fx-rpc.d.ts +2 -0
- package/dist/adapters/fx-rpc.js +30 -4
- package/dist/adapters/fx-rpc.js.map +1 -1
- package/dist/adapters/fx-status.d.ts +2 -0
- package/dist/adapters/fx-status.js +96 -0
- package/dist/adapters/fx-status.js.map +1 -0
- package/dist/adapters/fx.js +28 -12
- package/dist/adapters/fx.js.map +1 -1
- package/dist/adapters/opencode-access.d.ts +13 -0
- package/dist/adapters/opencode-access.js +76 -0
- package/dist/adapters/opencode-access.js.map +1 -0
- package/dist/adapters/opencode-config.d.ts +11 -0
- package/dist/adapters/opencode-config.js +238 -0
- package/dist/adapters/opencode-config.js.map +1 -0
- package/dist/adapters/opencode-http.d.ts +28 -0
- package/dist/adapters/opencode-http.js +297 -0
- package/dist/adapters/opencode-http.js.map +1 -0
- package/dist/adapters/opencode-tools.d.ts +19 -0
- package/dist/adapters/opencode-tools.js +127 -0
- package/dist/adapters/opencode-tools.js.map +1 -0
- package/dist/adapters/opencode.d.ts +2 -0
- package/dist/adapters/opencode.js +569 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/rpc.d.ts +3 -0
- package/dist/adapters/rpc.js +45 -4
- package/dist/adapters/rpc.js.map +1 -1
- package/dist/adapters/types.d.ts +5 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/approvals/types.d.ts +1 -1
- package/dist/approvals/types.js.map +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.js +4 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/catalog-worker.js.map +1 -1
- package/dist/cli/dashboard-client.js +20 -31
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/dashboard-controller.d.ts +7 -0
- package/dist/cli/dashboard-controller.js +27 -0
- package/dist/cli/dashboard-controller.js.map +1 -0
- package/dist/cli/dashboard-detail-view.d.ts +1 -1
- package/dist/cli/dashboard-detail-view.js +3 -4
- package/dist/cli/dashboard-detail-view.js.map +1 -1
- package/dist/cli/dashboard-history-view.js.map +1 -1
- package/dist/cli/dashboard-input.d.ts +1 -1
- package/dist/cli/dashboard-input.js +11 -1
- package/dist/cli/dashboard-input.js.map +1 -1
- package/dist/cli/dashboard-layout.js +3 -3
- package/dist/cli/dashboard-layout.js.map +1 -1
- package/dist/cli/dashboard-renderer.js.map +1 -1
- package/dist/cli/dashboard-style.js +2 -2
- package/dist/cli/dashboard-style.js.map +1 -1
- package/dist/cli/dashboard.d.ts +2 -2
- package/dist/cli/dashboard.js +7 -32
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +30 -12
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +55 -43
- package/dist/cli/main.js.map +1 -1
- package/dist/config/access-provenance.d.ts +10 -0
- package/dist/config/access-provenance.js +31 -0
- package/dist/config/access-provenance.js.map +1 -0
- package/dist/config/access.d.ts +12 -2
- package/dist/config/access.js +125 -27
- package/dist/config/access.js.map +1 -1
- package/dist/config/loader.js +1 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/oidc.js +4 -2
- package/dist/config/oidc.js.map +1 -1
- package/dist/config/project.js +2 -1
- package/dist/config/project.js.map +1 -1
- package/dist/config/resolve-access.js +24 -10
- package/dist/config/resolve-access.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/process-diagnostics.d.ts +2 -0
- package/dist/process-diagnostics.js +11 -0
- package/dist/process-diagnostics.js.map +1 -0
- package/dist/runtime/access-errors.d.ts +4 -0
- package/dist/runtime/access-errors.js +25 -0
- package/dist/runtime/access-errors.js.map +1 -0
- package/dist/runtime/approval-registry.d.ts +9 -0
- package/dist/runtime/approval-registry.js +144 -5
- package/dist/runtime/approval-registry.js.map +1 -1
- package/dist/runtime/capture.d.ts +22 -0
- package/dist/runtime/capture.js +320 -0
- package/dist/runtime/capture.js.map +1 -0
- package/dist/runtime/catalog.d.ts +39 -0
- package/dist/runtime/catalog.js +84 -0
- package/dist/runtime/catalog.js.map +1 -0
- package/dist/runtime/client.d.ts +2 -1
- package/dist/runtime/client.js +74 -47
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/coordinator.d.ts +44 -7
- package/dist/runtime/coordinator.js +265 -31
- package/dist/runtime/coordinator.js.map +1 -1
- package/dist/runtime/daemon.js +12 -6
- package/dist/runtime/daemon.js.map +1 -1
- package/dist/runtime/dashboard-sanitize.d.ts +2 -0
- package/dist/runtime/dashboard-sanitize.js +7 -0
- package/dist/runtime/dashboard-sanitize.js.map +1 -0
- package/dist/runtime/dashboard-workspace.js +5 -1
- package/dist/runtime/dashboard-workspace.js.map +1 -1
- package/dist/runtime/dashboard.d.ts +1 -1
- package/dist/runtime/dashboard.js +2 -3
- package/dist/runtime/dashboard.js.map +1 -1
- package/dist/runtime/definition.d.ts +6 -1
- package/dist/runtime/definition.js +42 -2
- package/dist/runtime/definition.js.map +1 -1
- package/dist/runtime/native-owner.js +7 -1
- package/dist/runtime/native-owner.js.map +1 -1
- package/dist/runtime/pagination.d.ts +9 -0
- package/dist/runtime/pagination.js +36 -0
- package/dist/runtime/pagination.js.map +1 -0
- package/dist/runtime/sdk-observation.d.ts +8 -0
- package/dist/runtime/sdk-observation.js +75 -0
- package/dist/runtime/sdk-observation.js.map +1 -0
- package/dist/runtime/sdk-projection.d.ts +8 -0
- package/dist/runtime/sdk-projection.js +19 -0
- package/dist/runtime/sdk-projection.js.map +1 -0
- package/dist/runtime/sdk-service.d.ts +11 -0
- package/dist/runtime/sdk-service.js +109 -0
- package/dist/runtime/sdk-service.js.map +1 -0
- package/dist/runtime/select-native.d.ts +4 -1
- package/dist/runtime/select-native.js +28 -13
- package/dist/runtime/select-native.js.map +1 -1
- package/dist/runtime/service.d.ts +11 -1
- package/dist/runtime/service.js +178 -3
- package/dist/runtime/service.js.map +1 -1
- package/dist/runtime/session-launcher.js +1 -1
- package/dist/runtime/session-launcher.js.map +1 -1
- package/dist/runtime/snapshots.d.ts +103 -0
- package/dist/runtime/snapshots.js +124 -0
- package/dist/runtime/snapshots.js.map +1 -0
- package/dist/runtime/state.d.ts +26 -0
- package/dist/runtime/state.js +86 -17
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/task-data.d.ts +38 -0
- package/dist/runtime/task-data.js +2 -0
- package/dist/runtime/task-data.js.map +1 -0
- package/dist/runtime/transport.d.ts +13 -0
- package/dist/runtime/transport.js +166 -0
- package/dist/runtime/transport.js.map +1 -0
- package/dist/runtime/types.d.ts +28 -9
- package/dist/runtime/types.js.map +1 -1
- package/dist/runtime/worker-client.js +40 -13
- package/dist/runtime/worker-client.js.map +1 -1
- package/dist/runtime/worker-server.js +105 -24
- package/dist/runtime/worker-server.js.map +1 -1
- package/dist/sdk/connected-types.d.ts +42 -0
- package/dist/sdk/connected-types.js +2 -0
- package/dist/sdk/connected-types.js.map +1 -0
- package/dist/sdk/connected.d.ts +3 -0
- package/dist/sdk/connected.js +232 -0
- package/dist/sdk/connected.js.map +1 -0
- package/dist/sdk/definitions.d.ts +4 -1
- package/dist/sdk/definitions.js +16 -2
- package/dist/sdk/definitions.js.map +1 -1
- package/dist/sdk/execution-definition.d.ts +3 -0
- package/dist/sdk/execution-definition.js +59 -0
- package/dist/sdk/execution-definition.js.map +1 -0
- package/dist/sdk/execution-driver.d.ts +6 -0
- package/dist/sdk/execution-driver.js +86 -0
- package/dist/sdk/execution-driver.js.map +1 -0
- package/dist/sdk/execution-observation.d.ts +3 -0
- package/dist/sdk/execution-observation.js +35 -0
- package/dist/sdk/execution-observation.js.map +1 -0
- package/dist/sdk/execution-options.d.ts +17 -0
- package/dist/sdk/execution-options.js +115 -0
- package/dist/sdk/execution-options.js.map +1 -0
- package/dist/sdk/execution-types.d.ts +72 -0
- package/dist/sdk/execution-types.js +2 -0
- package/dist/sdk/execution-types.js.map +1 -0
- package/dist/sdk/execution.d.ts +3 -0
- package/dist/sdk/execution.js +3 -0
- package/dist/sdk/execution.js.map +1 -0
- package/dist/sdk/hosted-error.d.ts +3 -0
- package/dist/sdk/hosted-error.js +14 -0
- package/dist/sdk/hosted-error.js.map +1 -0
- package/dist/sdk/hosted.d.ts +23 -0
- package/dist/sdk/hosted.js +204 -0
- package/dist/sdk/hosted.js.map +1 -0
- package/dist/sdk/permission-validation.js +10 -1
- package/dist/sdk/permission-validation.js.map +1 -1
- package/dist/sdk/runner.d.ts +5 -0
- package/dist/sdk/runner.js +107 -0
- package/dist/sdk/runner.js.map +1 -0
- package/dist/sdk/tools.js +4 -1
- package/dist/sdk/tools.js.map +1 -1
- package/dist/sdk/types.d.ts +29 -1
- package/dist/sdk/types.js.map +1 -1
- package/package.json +6 -3
- package/sdk/access-config.md +60 -4
- package/sdk/adapter-contract.md +13 -3
- package/sdk/additional-harnesses.md +43 -0
- package/sdk/agent-skill.md +2 -2
- package/sdk/agent.md +6 -4
- package/sdk/approvals.md +5 -1
- package/sdk/authentication.md +1 -1
- package/sdk/cli/dashboard-design.md +6 -0
- package/sdk/cli/index.md +9 -6
- package/sdk/cli/output.md +3 -1
- package/sdk/completion-notifications.md +2 -0
- package/sdk/config.md +1 -1
- package/sdk/copilot.md +53 -0
- package/sdk/cursor.md +68 -0
- package/sdk/diagnostics.md +29 -0
- package/sdk/distribution.md +5 -3
- package/sdk/evals.md +1 -1
- package/sdk/examples/chat-tool.ts +126 -0
- package/sdk/execution.md +743 -0
- package/sdk/fx.md +50 -5
- package/sdk/harnesses.md +13 -13
- package/sdk/index.md +45 -20
- package/sdk/message-delivery.md +2 -0
- package/sdk/opencode.md +57 -0
- package/sdk/permissions.md +6 -2
- package/sdk/plugins/sub-agents.md +4 -2
- package/sdk/project-team.md +25 -1
- package/sdk/sessions.md +2 -0
- package/sdk/tools.md +4 -2
- package/sdk/v1-runtime.md +8 -6
- package/dist/cli/catalog.d.ts +0 -26
- package/dist/cli/catalog.js +0 -41
- package/dist/cli/catalog.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-renderer.js","sourceRoot":"","sources":["../../src/cli/dashboard-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DashboardDetail, DashboardRow, DashboardSession, DashboardWorkspace } from '../runtime/dashboard.js';\nimport { DashboardHistoryView } from './dashboard-history-view.js';\nimport {\n dashboardOverviewSlots,\n formatDashboardRows,\n groupDashboardRows,\n labelDashboardGroups,\n layoutDashboardSlots,\n type DashboardGroup,\n type LabelledDashboardGroup,\n} from './dashboard-layout.js';\n\nexport interface DashboardOutput {\n columns?: number;\n rows?: number;\n write(text: string): boolean;\n on(event: 'drain', listener: () => void): unknown;\n off(event: 'drain', listener: () => void): unknown;\n}\n\nconst enter = '\\u001b[?1049h\\u001b[?25l\\u001b[2J';\nconst leave = '\\u001b[?25h\\u001b[?1049l';\n\nexport function formatDashboardRow(row: DashboardRow, columns: number, now: number): string {\n return formatDashboardRows([row], columns, now)[0] ?? '';\n}\n\n/** Keeps one pending snapshot when the terminal applies backpressure. */\nexport class DashboardRenderer {\n private previous: string[] = [];\n private current: DashboardRow[] = [];\n private now = 0;\n private blocked = false;\n private active = false;\n private size = '';\n private firstObserved: ReadonlyMap<string, number> = new Map();\n private labelMembership = new Map<string, string | undefined>();\n private labels = new Map<string, string>();\n private groups: LabelledDashboardGroup[] = [];\n private orderedTaskIds: string[] = [];\n private selectedId?: string;\n private overviewOffset = 0;\n private view: 'overview' | 'detail' = 'overview';\n private inspectionId?: string;\n private history?: DashboardHistoryView;\n private readonly drain = () => {\n this.blocked = false;\n try { this.draw(); } catch (error) {\n if (!this.onFailure) throw error;\n this.onFailure(error);\n }\n };\n\n constructor(\n private readonly output: DashboardOutput,\n private readonly launchWorkspace?: DashboardWorkspace,\n private readonly color = false,\n private readonly onFailure?: (error: unknown) => void,\n ) {}\n\n start() {\n this.active = true;\n this.output.on('drain', this.drain);\n this.blocked = !this.output.write(enter);\n }\n\n render(rows: DashboardRow[], now: number) {\n this.current = rows;\n this.now = now;\n this.prepareOverview();\n this.draw();\n }\n\n get selectedTaskId() { return this.selectedId; }\n get inspectedTaskId() { return this.view === 'detail' ? this.inspectionId : undefined; }\n get expandedTaskId() { return this.history?.expandedTaskId; }\n get historySelectedTaskId() { return this.history?.selectedTaskId; }\n get historyLoaded() { return this.history !== undefined; }\n get knownResponseId() { return this.history?.responseId; }\n get detailLoaded() { return this.history?.detailLoaded ?? false; }\n get inspecting() { return this.view === 'detail'; }\n\n moveSelection(delta: -1 | 1) {\n if (this.view !== 'overview' || !this.selectedId) return;\n const index = this.orderedTaskIds.indexOf(this.selectedId);\n const next = Math.max(0, Math.min(this.orderedTaskIds.length - 1, index + delta));\n this.selectedId = this.orderedTaskIds[next];\n this.draw();\n }\n\n openDetail(): string | undefined {\n if (this.view !== 'overview' || !this.selectedId) return;\n this.view = 'detail';\n this.inspectionId = this.selectedId;\n this.history = undefined;\n this.draw();\n return this.inspectionId;\n }\n\n updateSession(session: DashboardSession): boolean {\n if (this.view !== 'detail' || session.taskId !== this.inspectionId) return false;\n if (this.history) this.history.update(session);\n else this.history = new DashboardHistoryView(session, this.inspectionId);\n this.draw();\n return true;\n }\n\n toggleExpansion() {\n if (this.view !== 'detail' || !this.history) return false;\n this.history.toggleExpansion();\n this.draw();\n return true;\n }\n\n updateDetail(detail: DashboardDetail): boolean {\n if (!this.history?.updateDetail(detail)) return false;\n this.draw();\n return true;\n }\n\n leaveDetail(): boolean {\n if (this.view !== 'detail') return false;\n this.view = 'overview';\n this.inspectionId = undefined;\n this.history = undefined;\n this.draw();\n return true;\n }\n\n scrollDetail(key: 'up' | 'down' | 'page-up' | 'page-down' | 'home' | 'end') {\n if (this.view !== 'detail') return;\n this.history?.navigate(key, Math.max(0, this.output.columns ?? 80), Math.max(0, this.output.rows ?? 24));\n this.draw();\n }\n\n redraw() { this.draw(); }\n\n private prepareOverview() {\n const previousIds = this.orderedTaskIds;\n const previousIndex = this.selectedId ? previousIds.indexOf(this.selectedId) : -1;\n const grouping = groupDashboardRows(this.current, this.launchWorkspace, this.firstObserved);\n this.firstObserved = grouping.firstObserved;\n this.groups = this.labelGroups(grouping.groups);\n this.orderedTaskIds = this.groups.flatMap(group => group.rows.map(row => row.taskId));\n if (!this.orderedTaskIds.length) this.selectedId = undefined;\n else if (!this.selectedId || !this.orderedTaskIds.includes(this.selectedId)) {\n this.selectedId = this.orderedTaskIds[Math.min(Math.max(0, previousIndex), this.orderedTaskIds.length - 1)];\n }\n }\n\n private draw() {\n if (!this.active || this.blocked) return;\n const height = Math.max(0, this.output.rows ?? 24);\n const width = Math.max(0, this.output.columns ?? 80);\n const lines = this.view === 'detail'\n ? this.detailLines(width, height)\n : this.overviewLines(width, height);\n const size = `${width}:${height}`;\n let frame = this.size && this.size !== size ? '\\u001b[2J' : '';\n if (frame) this.previous = [];\n this.size = size;\n for (let index = 0; index < Math.min(height, Math.max(lines.length, this.previous.length)); index++) {\n if ((lines[index] ?? '') !== (this.previous[index] ?? '')) {\n frame += `\\u001b[${index + 1};1H\\u001b[2K${lines[index] ?? ''}`;\n }\n }\n this.previous = lines;\n if (frame) this.blocked = !this.output.write(frame);\n }\n\n private overviewLines(width: number, height: number): string[] {\n const slots = dashboardOverviewSlots(this.groups);\n const selectedLine = slots.findIndex(slot => slot.kind === 'row' && slot.row.taskId === this.selectedId);\n const max = Math.max(0, slots.length - height);\n if (selectedLine >= 0 && selectedLine < this.overviewOffset) this.overviewOffset = selectedLine;\n else if (selectedLine >= this.overviewOffset + height) this.overviewOffset = selectedLine - height + 1;\n this.overviewOffset = Math.max(0, Math.min(max, this.overviewOffset));\n return layoutDashboardSlots(\n slots.slice(this.overviewOffset, this.overviewOffset + height),\n width,\n this.now,\n this.selectedId,\n this.color,\n );\n }\n\n private detailLines(width: number, height: number): string[] {\n if (!this.history) return [];\n const workspace = this.history.workspace;\n const label = this.labels.get(workspace.directory)\n ?? labelDashboardGroups([{workspace, rows: [], updatedAt: 0}])[0]!.label;\n return this.history.lines(label, width, height, this.now, this.color);\n }\n\n private labelGroups(groups: DashboardGroup[]): LabelledDashboardGroup[] {\n const membershipChanged = groups.length !== this.labelMembership.size\n || groups.some(group => !this.labelMembership.has(group.workspace.directory)\n || this.labelMembership.get(group.workspace.directory) !== group.workspace.repository);\n if (membershipChanged) {\n this.labelMembership = new Map(groups.map(group => [\n group.workspace.directory,\n group.workspace.repository,\n ]));\n this.labels = new Map(labelDashboardGroups(groups)\n .map(group => [group.workspace.directory, group.label]));\n }\n return groups.map(group => ({...group, label: this.labels.get(group.workspace.directory)!}));\n }\n\n close() {\n if (!this.active) return;\n this.active = false;\n this.output.off('drain', this.drain);\n this.output.write(leave);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dashboard-renderer.js","sourceRoot":"","sources":["../../src/cli/dashboard-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DashboardDetail, DashboardRow, DashboardSession, DashboardWorkspace } from '../runtime/dashboard.js';\nimport { DashboardHistoryView } from './dashboard-history-view.ts';\nimport {\n dashboardOverviewSlots,\n formatDashboardRows,\n groupDashboardRows,\n labelDashboardGroups,\n layoutDashboardSlots,\n type DashboardGroup,\n type LabelledDashboardGroup,\n} from './dashboard-layout.ts';\n\nexport interface DashboardOutput {\n columns?: number;\n rows?: number;\n write(text: string): boolean;\n on(event: 'drain', listener: () => void): unknown;\n off(event: 'drain', listener: () => void): unknown;\n}\n\nconst enter = '\\u001b[?1049h\\u001b[?25l\\u001b[2J';\nconst leave = '\\u001b[?25h\\u001b[?1049l';\n\nexport function formatDashboardRow(row: DashboardRow, columns: number, now: number): string {\n return formatDashboardRows([row], columns, now)[0] ?? '';\n}\n\n/** Keeps one pending snapshot when the terminal applies backpressure. */\nexport class DashboardRenderer {\n private previous: string[] = [];\n private current: DashboardRow[] = [];\n private now = 0;\n private blocked = false;\n private active = false;\n private size = '';\n private firstObserved: ReadonlyMap<string, number> = new Map();\n private labelMembership = new Map<string, string | undefined>();\n private labels = new Map<string, string>();\n private groups: LabelledDashboardGroup[] = [];\n private orderedTaskIds: string[] = [];\n private selectedId?: string;\n private overviewOffset = 0;\n private view: 'overview' | 'detail' = 'overview';\n private inspectionId?: string;\n private history?: DashboardHistoryView;\n private readonly drain = () => {\n this.blocked = false;\n try { this.draw(); } catch (error) {\n if (!this.onFailure) throw error;\n this.onFailure(error);\n }\n };\n\n constructor(\n private readonly output: DashboardOutput,\n private readonly launchWorkspace?: DashboardWorkspace,\n private readonly color = false,\n private readonly onFailure?: (error: unknown) => void,\n ) {}\n\n start() {\n this.active = true;\n this.output.on('drain', this.drain);\n this.blocked = !this.output.write(enter);\n }\n\n render(rows: DashboardRow[], now: number) {\n this.current = rows;\n this.now = now;\n this.prepareOverview();\n this.draw();\n }\n\n get selectedTaskId() { return this.selectedId; }\n get inspectedTaskId() { return this.view === 'detail' ? this.inspectionId : undefined; }\n get expandedTaskId() { return this.history?.expandedTaskId; }\n get historySelectedTaskId() { return this.history?.selectedTaskId; }\n get historyLoaded() { return this.history !== undefined; }\n get knownResponseId() { return this.history?.responseId; }\n get detailLoaded() { return this.history?.detailLoaded ?? false; }\n get inspecting() { return this.view === 'detail'; }\n\n moveSelection(delta: -1 | 1) {\n if (this.view !== 'overview' || !this.selectedId) return;\n const index = this.orderedTaskIds.indexOf(this.selectedId);\n const next = Math.max(0, Math.min(this.orderedTaskIds.length - 1, index + delta));\n this.selectedId = this.orderedTaskIds[next];\n this.draw();\n }\n\n openDetail(): string | undefined {\n if (this.view !== 'overview' || !this.selectedId) return;\n this.view = 'detail';\n this.inspectionId = this.selectedId;\n this.history = undefined;\n this.draw();\n return this.inspectionId;\n }\n\n updateSession(session: DashboardSession): boolean {\n if (this.view !== 'detail' || session.taskId !== this.inspectionId) return false;\n if (this.history) this.history.update(session);\n else this.history = new DashboardHistoryView(session, this.inspectionId);\n this.draw();\n return true;\n }\n\n toggleExpansion() {\n if (this.view !== 'detail' || !this.history) return false;\n this.history.toggleExpansion();\n this.draw();\n return true;\n }\n\n updateDetail(detail: DashboardDetail): boolean {\n if (!this.history?.updateDetail(detail)) return false;\n this.draw();\n return true;\n }\n\n leaveDetail(): boolean {\n if (this.view !== 'detail') return false;\n this.view = 'overview';\n this.inspectionId = undefined;\n this.history = undefined;\n this.draw();\n return true;\n }\n\n scrollDetail(key: 'up' | 'down' | 'page-up' | 'page-down' | 'home' | 'end') {\n if (this.view !== 'detail') return;\n this.history?.navigate(key, Math.max(0, this.output.columns ?? 80), Math.max(0, this.output.rows ?? 24));\n this.draw();\n }\n\n redraw() { this.draw(); }\n\n private prepareOverview() {\n const previousIds = this.orderedTaskIds;\n const previousIndex = this.selectedId ? previousIds.indexOf(this.selectedId) : -1;\n const grouping = groupDashboardRows(this.current, this.launchWorkspace, this.firstObserved);\n this.firstObserved = grouping.firstObserved;\n this.groups = this.labelGroups(grouping.groups);\n this.orderedTaskIds = this.groups.flatMap(group => group.rows.map(row => row.taskId));\n if (!this.orderedTaskIds.length) this.selectedId = undefined;\n else if (!this.selectedId || !this.orderedTaskIds.includes(this.selectedId)) {\n this.selectedId = this.orderedTaskIds[Math.min(Math.max(0, previousIndex), this.orderedTaskIds.length - 1)];\n }\n }\n\n private draw() {\n if (!this.active || this.blocked) return;\n const height = Math.max(0, this.output.rows ?? 24);\n const width = Math.max(0, this.output.columns ?? 80);\n const lines = this.view === 'detail'\n ? this.detailLines(width, height)\n : this.overviewLines(width, height);\n const size = `${width}:${height}`;\n let frame = this.size && this.size !== size ? '\\u001b[2J' : '';\n if (frame) this.previous = [];\n this.size = size;\n for (let index = 0; index < Math.min(height, Math.max(lines.length, this.previous.length)); index++) {\n if ((lines[index] ?? '') !== (this.previous[index] ?? '')) {\n frame += `\\u001b[${index + 1};1H\\u001b[2K${lines[index] ?? ''}`;\n }\n }\n this.previous = lines;\n if (frame) this.blocked = !this.output.write(frame);\n }\n\n private overviewLines(width: number, height: number): string[] {\n const slots = dashboardOverviewSlots(this.groups);\n const selectedLine = slots.findIndex(slot => slot.kind === 'row' && slot.row.taskId === this.selectedId);\n const max = Math.max(0, slots.length - height);\n if (selectedLine >= 0 && selectedLine < this.overviewOffset) this.overviewOffset = selectedLine;\n else if (selectedLine >= this.overviewOffset + height) this.overviewOffset = selectedLine - height + 1;\n this.overviewOffset = Math.max(0, Math.min(max, this.overviewOffset));\n return layoutDashboardSlots(\n slots.slice(this.overviewOffset, this.overviewOffset + height),\n width,\n this.now,\n this.selectedId,\n this.color,\n );\n }\n\n private detailLines(width: number, height: number): string[] {\n if (!this.history) return [];\n const workspace = this.history.workspace;\n const label = this.labels.get(workspace.directory)\n ?? labelDashboardGroups([{workspace, rows: [], updatedAt: 0}])[0]!.label;\n return this.history.lines(label, width, height, this.now, this.color);\n }\n\n private labelGroups(groups: DashboardGroup[]): LabelledDashboardGroup[] {\n const membershipChanged = groups.length !== this.labelMembership.size\n || groups.some(group => !this.labelMembership.has(group.workspace.directory)\n || this.labelMembership.get(group.workspace.directory) !== group.workspace.repository);\n if (membershipChanged) {\n this.labelMembership = new Map(groups.map(group => [\n group.workspace.directory,\n group.workspace.repository,\n ]));\n this.labels = new Map(labelDashboardGroups(groups)\n .map(group => [group.workspace.directory, group.label]));\n }\n return groups.map(group => ({...group, label: this.labels.get(group.workspace.directory)!}));\n }\n\n close() {\n if (!this.active) return;\n this.active = false;\n this.output.off('drain', this.drain);\n this.output.write(leave);\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { stripVTControlCharacters } from 'node:util';
|
|
2
1
|
import stringWidth from 'string-width';
|
|
2
|
+
import { sanitizeDashboardTerminalText } from '../runtime/dashboard-sanitize.js';
|
|
3
3
|
const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
|
|
4
4
|
export function cleanDashboardLine(text) {
|
|
5
|
-
return
|
|
5
|
+
return sanitizeDashboardTerminalText(text).replace(/[\t\n\r]/gu, '').replace(/\s+/gu, ' ').trim();
|
|
6
6
|
}
|
|
7
7
|
export function stateStyle(state) {
|
|
8
8
|
return { running: '36', completed: '32', failed: '31', interrupted: '33' }[state] ?? '2';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-style.js","sourceRoot":"","sources":["../../src/cli/dashboard-style.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dashboard-style.js","sourceRoot":"","sources":["../../src/cli/dashboard-style.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,6BAA6B,EAAC,MAAM,kCAAkC,CAAC;AAE/E,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,6BAA6B,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACpG,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAA6B,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;AACvH,CAAC;AAKD,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,KAAsB,EAAE,OAAe,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK;IACjG,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,GAAG,SAAS;gBACnB,MAAM;YACR,IAAI,IAAI,OAAO,CAAC;YAChB,SAAS,IAAI,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,IAAI;YACN,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtH,IAAI,SAAS,KAAK,CAAC;YACjB,MAAM;IACV,CAAC;IAED,IAAI,KAAK,IAAI,QAAQ;QACnB,OAAO,mBAAmB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;IACtE,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,KAAK,GAAG,KAAK;IACzE,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACxK,CAAC","sourcesContent":["import stringWidth from 'string-width';\nimport {sanitizeDashboardTerminalText} from '../runtime/dashboard-sanitize.ts';\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\nexport function cleanDashboardLine(text: string): string {\n return sanitizeDashboardTerminalText(text).replace(/[\\t\\n\\r]/gu, '').replace(/\\s+/gu, ' ').trim();\n}\nexport function stateStyle(state: string): string {\n return ({ running: '36', completed: '32', failed: '31', interrupted: '33' } as Record<string, string>)[state] ?? '2';\n}\nexport interface DashboardSpan {\n text: string;\n style?: string;\n}\n/** Clip trusted, already sanitized text before adding application-owned ANSI. */\nexport function styledLine(spans: DashboardSpan[], columns: number, color = false, selected = false): string {\n let remaining = Math.max(0, columns), result = '';\n for (const span of spans) {\n let text = '';\n for (const { segment } of graphemes.segment(span.text)) {\n const width = stringWidth(segment);\n if (width > remaining)\n break;\n text += segment;\n remaining -= width;\n }\n if (text)\n result += color && span.style ? `\\u001b[${span.style}m${text}\\u001b[0m${selected ? '\\u001b[48;5;238m' : ''}` : text;\n if (remaining === 0)\n break;\n }\n\n if (color && selected)\n return `\\u001b[48;5;238m${result}${' '.repeat(remaining)}\\u001b[0m`;\n return result;\n}\nexport function workspaceLine(label: string, columns: number, color = false): string {\n const text = cleanDashboardLine(label);\n const split = text.lastIndexOf(' / ');\n return styledLine(split < 0 ? [{ text, style: '1' }] : [{ text: text.slice(0, split + 3), style: '2' }, { text: text.slice(split + 3), style: '1' }], columns, color);\n}\n"]}
|
package/dist/cli/dashboard.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ interface Keyboard {
|
|
|
14
14
|
setRawMode(enabled: boolean): unknown;
|
|
15
15
|
resume(): unknown;
|
|
16
16
|
pause(): unknown;
|
|
17
|
-
on(event: 'data', listener: (chunk:
|
|
18
|
-
off(event: 'data', listener: (chunk:
|
|
17
|
+
on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown;
|
|
18
|
+
off(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown;
|
|
19
19
|
}
|
|
20
20
|
interface DashboardOptions {
|
|
21
21
|
cwd?: string;
|
package/dist/cli/dashboard.js
CHANGED
|
@@ -2,6 +2,7 @@ import { AgentError } from '../errors.js';
|
|
|
2
2
|
import { resolveDashboardWorkspace } from '../runtime/dashboard-workspace.js';
|
|
3
3
|
import { readEndpoint, stateDirectory } from '../runtime/state.js';
|
|
4
4
|
import { fetchDashboardDetail, fetchDashboardSession, fetchDashboardSnapshot } from './dashboard-client.js';
|
|
5
|
+
import { dispatchDashboardKey } from './dashboard-controller.js';
|
|
5
6
|
import { DashboardKeyDecoder } from './dashboard-input.js';
|
|
6
7
|
import { DashboardRenderer } from './dashboard-renderer.js';
|
|
7
8
|
export async function runDashboard(options = {}) {
|
|
@@ -54,42 +55,16 @@ export async function runDashboard(options = {}) {
|
|
|
54
55
|
const interrupt = () => stop(130);
|
|
55
56
|
const terminate = () => stop(143);
|
|
56
57
|
const key = (pressed) => {
|
|
57
|
-
|
|
58
|
+
const action = dispatchDashboardKey(renderer, pressed);
|
|
59
|
+
if (action.interrupt) {
|
|
58
60
|
interrupt();
|
|
59
61
|
return;
|
|
60
62
|
}
|
|
61
|
-
if (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
wake?.();
|
|
66
|
-
}
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (pressed === 'enter') {
|
|
70
|
-
if (renderer.inspecting ? renderer.toggleExpansion() : renderer.openDetail()) {
|
|
71
|
-
detailAbort?.abort();
|
|
72
|
-
detailAbort = new AbortController();
|
|
73
|
-
wake?.();
|
|
74
|
-
}
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (pressed === 'up' || pressed === 'down') {
|
|
78
|
-
if (renderer.inspecting) {
|
|
79
|
-
const expanded = renderer.expandedTaskId;
|
|
80
|
-
renderer.scrollDetail(pressed);
|
|
81
|
-
if (expanded !== renderer.expandedTaskId) {
|
|
82
|
-
detailAbort?.abort();
|
|
83
|
-
detailAbort = new AbortController();
|
|
84
|
-
wake?.();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else
|
|
88
|
-
renderer.moveSelection(pressed === 'up' ? -1 : 1);
|
|
89
|
-
return;
|
|
63
|
+
if (action.refreshInspection) {
|
|
64
|
+
detailAbort?.abort();
|
|
65
|
+
detailAbort = renderer.inspecting ? new AbortController() : undefined;
|
|
66
|
+
wake?.();
|
|
90
67
|
}
|
|
91
|
-
if (renderer.inspecting)
|
|
92
|
-
renderer.scrollDetail(pressed);
|
|
93
68
|
};
|
|
94
69
|
const decoder = new DashboardKeyDecoder(guarded(key));
|
|
95
70
|
const keys = guarded((chunk) => decoder.push(chunk));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAiB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,mBAAmB,EAAqB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAwB,MAAM,yBAAyB,CAAC;AAoClF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAO,GAAqB,EAAE;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;QACnE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,6DAA6D,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC;IAClD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,sBAAsB,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChF,IAAI,IAAI,GAAmB,EAAE,CAAC;IAC9B,IAAI,QAA8B,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,WAAoB,CAAC;IACzB,IAAI,WAAwC,CAAC;IAC7C,IAAI,IAA8B,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;QAC5B,QAAQ,GAAG,IAAI,CAAC;QAChB,WAAW,EAAE,KAAK,EAAE,CAAC;QACrB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,CAAC;IACX,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE;QACtC,WAAW,KAAK,KAAK,CAAC;QACtB,WAAW,EAAE,KAAK,EAAE,CAAC;QACrB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,CAAC;IACX,CAAC,CAAC;IACF,sFAAsF;IACtF,MAAM,OAAO,GAAG,CAA8B,QAAsC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;QAC9G,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO;QACjC,IAAI,CAAC;YAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IACnE,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/F,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,CAAC,OAAqB,EAAE,EAAE;QACpC,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAAC,SAAS,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACrD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3B,WAAW,EAAE,KAAK,EAAE,CAAC;gBACrB,WAAW,GAAG,SAAS,CAAC;gBACxB,IAAI,EAAE,EAAE,CAAC;YACX,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC7E,WAAW,EAAE,KAAK,EAAE,CAAC;gBACrB,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;gBACpC,IAAI,EAAE,EAAE,CAAC;YACX,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YAC3C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC;gBACzC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC/B,IAAI,QAAQ,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;oBACzC,WAAW,EAAE,KAAK,EAAE,CAAC;oBAAC,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;oBAAC,IAAI,EAAE,EAAE,CAAC;gBACtE,CAAC;YACH,CAAC;;gBACI,QAAQ,CAAC,aAAa,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU;YAAE,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,CAAC,YAAoB,EAAiB,EAAE;QAC7D,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACnD,OAAO,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACjC,IAAI,KAAiC,CAAC;YACtC,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,IAAI,KAAK;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC/B,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAChD,IAAI,IAAI,KAAK,IAAI;oBAAE,IAAI,GAAG,SAAS,CAAC;gBACpC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;YAC3D,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,IAAI,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7C,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,YAAY,GAAG,IAAI,CAAC;YACpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;YACnC,QAAQ,KAAK,MAAM,QAAQ,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM;YAChC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU;gBAAE,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC/F,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM;YAChC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC;YAC9C,MAAM,eAAe,GAAG,WAAW,CAAC;YACpC,IAAI,QAAQ,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;oBACvE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;oBAC9D,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,KAAK,eAAe,IAAI,QAAQ,CAAC,eAAe,KAAK,YAAY;wBAAE,SAAS;oBACnH,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;oBAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC;oBAC3C,IAAI,UAAU,EAAE,CAAC;wBACf,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;wBAC5G,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,KAAK,eAAe,IAAI,QAAQ,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;4BACvG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,WAAW,KAAK,eAAe,IAAI,QAAQ,CAAC,eAAe,KAAK,YAAY;wBAAE,SAAS;oBAC3F,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,KAAK,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,WAAW,EAAE,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,WAAW,KAAK,KAAK,CAAC;QAAC,CAAC;QAClE,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACxB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,WAAW;QAAE,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,uCAAuC,CAAC,CAAC;IAC3F,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type { EventEmitter } from 'node:events';\nimport { AgentError } from '../errors.js';\nimport type { DashboardDetail, DashboardRow, DashboardSession, DashboardSnapshot } from '../runtime/dashboard.js';\nimport { resolveDashboardWorkspace } from '../runtime/dashboard-workspace.js';\nimport { readEndpoint, stateDirectory, type Endpoint } from '../runtime/state.js';\nimport { fetchDashboardDetail, fetchDashboardSession, fetchDashboardSnapshot } from './dashboard-client.js';\nimport { DashboardKeyDecoder, type DashboardKey } from './dashboard-input.js';\nimport { DashboardRenderer, type DashboardOutput } from './dashboard-renderer.js';\n\ninterface Terminal extends DashboardOutput {\n isTTY?: boolean;\n on(event: 'drain' | 'resize' | 'error', listener: (...args: any[]) => void): unknown;\n off(event: 'drain' | 'resize' | 'error', listener: (...args: any[]) => void): unknown;\n}\ninterface Keyboard {\n isTTY?: boolean;\n isRaw?: boolean;\n readableFlowing: boolean | null;\n setRawMode(enabled: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: 'data', listener: (chunk: Buffer | string) => void): unknown;\n off(event: 'data', listener: (chunk: Buffer | string) => void): unknown;\n}\ninterface DashboardOptions {\n cwd?: string;\n output?: Terminal;\n input?: Keyboard;\n signals?: Pick<EventEmitter, 'on' | 'off'>;\n term?: string;\n intervalMs?: number;\n discover?: () => Promise<Endpoint | undefined>;\n snapshot?: (endpoint: Endpoint, signal: AbortSignal) => Promise<DashboardSnapshot>;\n session?: (endpoint: Endpoint, id: string, signal: AbortSignal) => Promise<DashboardSession>;\n detail?: (\n endpoint: Endpoint,\n id: string,\n signal: AbortSignal,\n includePrompt?: boolean,\n knownResponseId?: string,\n ) => Promise<DashboardDetail>;\n}\n\nexport async function runDashboard(options: DashboardOptions = {}): Promise<number> {\n const output = options.output ?? process.stdout;\n if (!output.isTTY || (options.term ?? process.env.TERM) === 'dumb') {\n throw new AgentError('INVALID_ARGUMENT', 'The dashboard requires terminal stdout with cursor control.');\n }\n const input = options.input ?? process.stdin;\n const wasRaw = input.isRaw ?? false;\n const wasFlowing = input.readableFlowing === true;\n let inputEnabled = false;\n const signals = options.signals ?? process;\n const discover = options.discover ?? (() => readEndpoint(stateDirectory()));\n const snapshot = options.snapshot ?? fetchDashboardSnapshot;\n const detail = options.detail ?? fetchDashboardDetail;\n const session = options.session ?? fetchDashboardSession;\n const interval = options.intervalMs ?? 1_000;\n const abort = new AbortController();\n const workspace = await resolveDashboardWorkspace(options.cwd ?? process.cwd());\n let rows: DashboardRow[] = [];\n let endpoint: Endpoint | undefined;\n let exitCode = 0;\n let outputError: unknown;\n let detailAbort: AbortController | undefined;\n let wake: (() => void) | undefined;\n const stop = (code: number) => {\n exitCode = code;\n detailAbort?.abort();\n abort.abort();\n wake?.();\n };\n const failedOutput = (error: unknown) => {\n outputError ??= error;\n detailAbort?.abort();\n abort.abort();\n wake?.();\n };\n // Event listeners and the decoder's Escape timer run outside the polling try/finally.\n const guarded = <Arguments extends unknown[]>(callback: (...args: Arguments) => void) => (...args: Arguments) => {\n if (abort.signal.aborted) return;\n try { callback(...args); } catch (error) { failedOutput(error); }\n };\n const renderer = new DashboardRenderer(output, workspace, !process.env.NO_COLOR, failedOutput);\n const interrupt = () => stop(130);\n const terminate = () => stop(143);\n const key = (pressed: DashboardKey) => {\n if (pressed === 'interrupt') { interrupt(); return; }\n if (pressed === 'escape') {\n if (renderer.leaveDetail()) {\n detailAbort?.abort();\n detailAbort = undefined;\n wake?.();\n }\n return;\n }\n if (pressed === 'enter') {\n if (renderer.inspecting ? renderer.toggleExpansion() : renderer.openDetail()) {\n detailAbort?.abort();\n detailAbort = new AbortController();\n wake?.();\n }\n return;\n }\n if (pressed === 'up' || pressed === 'down') {\n if (renderer.inspecting) {\n const expanded = renderer.expandedTaskId;\n renderer.scrollDetail(pressed);\n if (expanded !== renderer.expandedTaskId) {\n detailAbort?.abort(); detailAbort = new AbortController(); wake?.();\n }\n }\n else renderer.moveSelection(pressed === 'up' ? -1 : 1);\n return;\n }\n if (renderer.inspecting) renderer.scrollDetail(pressed);\n };\n const decoder = new DashboardKeyDecoder(guarded(key));\n const keys = guarded((chunk: Buffer | string) => decoder.push(chunk));\n const resize = guarded(() => renderer.render(rows, Date.now()));\n const waitForRefresh = (milliseconds: number): Promise<void> => {\n if (abort.signal.aborted) return Promise.resolve();\n return new Promise<void>(resolve => {\n let timer: NodeJS.Timeout | undefined;\n const done = () => {\n if (timer) clearTimeout(timer);\n abort.signal.removeEventListener('abort', done);\n if (wake === done) wake = undefined;\n resolve();\n };\n abort.signal.addEventListener('abort', done, {once: true});\n if (abort.signal.aborted) { done(); return; }\n timer = setTimeout(done, milliseconds);\n wake = done;\n });\n };\n signals.on('SIGINT', interrupt);\n signals.on('SIGTERM', terminate);\n output.on('resize', resize);\n output.on('error', failedOutput);\n try {\n if (input.isTTY) {\n input.setRawMode(true);\n inputEnabled = true;\n input.on('data', keys);\n input.resume();\n }\n renderer.start();\n while (!abort.signal.aborted) {\n const next = Date.now() + interval;\n endpoint ??= await discover();\n if (abort.signal.aborted) break;\n if (endpoint && !renderer.inspecting) rows = (await snapshot(endpoint, abort.signal)).sessions;\n if (abort.signal.aborted) break;\n renderer.render(rows, Date.now());\n const inspectionId = renderer.inspectedTaskId;\n const inspectionAbort = detailAbort;\n if (endpoint && inspectionId && inspectionAbort) {\n try {\n const signal = AbortSignal.any([abort.signal, inspectionAbort.signal]);\n const history = await session(endpoint, inspectionId, signal);\n if (abort.signal.aborted || detailAbort !== inspectionAbort || renderer.inspectedTaskId !== inspectionId) continue;\n renderer.updateSession(history);\n const expandedId = renderer.expandedTaskId;\n if (expandedId) {\n const record = await detail(endpoint, expandedId, signal, !renderer.detailLoaded, renderer.knownResponseId);\n if (!abort.signal.aborted && detailAbort === inspectionAbort && renderer.expandedTaskId === expandedId) {\n renderer.updateDetail(record);\n }\n }\n } catch (error) {\n if (detailAbort !== inspectionAbort || renderer.inspectedTaskId !== inspectionId) continue;\n throw error;\n }\n }\n await waitForRefresh(Math.max(0, next - Date.now()));\n }\n } catch (error) {\n if (!abort.signal.aborted) throw error;\n } finally {\n abort.abort();\n detailAbort?.abort();\n decoder.close();\n try { renderer.close(); } catch (error) { outputError ??= error; }\n if (inputEnabled) {\n input.off('data', keys);\n input.setRawMode(wasRaw);\n if (!wasFlowing) input.pause();\n }\n signals.off('SIGINT', interrupt);\n signals.off('SIGTERM', terminate);\n output.off('resize', resize);\n output.off('error', failedOutput);\n }\n if (outputError) throw new AgentError('INTERNAL', 'The dashboard terminal output failed.');\n return exitCode;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventEmitter } from 'node:events';\nimport { AgentError } from '../errors.js';\nimport type { DashboardDetail, DashboardRow, DashboardSession, DashboardSnapshot } from '../runtime/dashboard.js';\nimport { resolveDashboardWorkspace } from '../runtime/dashboard-workspace.js';\nimport { readEndpoint, stateDirectory, type Endpoint } from '../runtime/state.js';\nimport { fetchDashboardDetail, fetchDashboardSession, fetchDashboardSnapshot } from './dashboard-client.js';\nimport {dispatchDashboardKey} from './dashboard-controller.js';\nimport { DashboardKeyDecoder } from './dashboard-input.js';\nimport { DashboardRenderer, type DashboardOutput } from './dashboard-renderer.js';\n\ninterface Terminal extends DashboardOutput {\n isTTY?: boolean;\n on(event: 'drain' | 'resize' | 'error', listener: (...args: any[]) => void): unknown;\n off(event: 'drain' | 'resize' | 'error', listener: (...args: any[]) => void): unknown;\n}\ninterface Keyboard {\n isTTY?: boolean;\n isRaw?: boolean;\n readableFlowing: boolean | null;\n setRawMode(enabled: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown;\n off(event: 'data', listener: (chunk: Uint8Array | string) => void): unknown;\n}\ninterface DashboardOptions {\n cwd?: string;\n output?: Terminal;\n input?: Keyboard;\n signals?: Pick<EventEmitter, 'on' | 'off'>;\n term?: string;\n intervalMs?: number;\n discover?: () => Promise<Endpoint | undefined>;\n snapshot?: (endpoint: Endpoint, signal: AbortSignal) => Promise<DashboardSnapshot>;\n session?: (endpoint: Endpoint, id: string, signal: AbortSignal) => Promise<DashboardSession>;\n detail?: (\n endpoint: Endpoint,\n id: string,\n signal: AbortSignal,\n includePrompt?: boolean,\n knownResponseId?: string,\n ) => Promise<DashboardDetail>;\n}\n\nexport async function runDashboard(options: DashboardOptions = {}): Promise<number> {\n const output = options.output ?? process.stdout;\n if (!output.isTTY || (options.term ?? process.env.TERM) === 'dumb') {\n throw new AgentError('INVALID_ARGUMENT', 'The dashboard requires terminal stdout with cursor control.');\n }\n const input = options.input ?? process.stdin;\n const wasRaw = input.isRaw ?? false;\n const wasFlowing = input.readableFlowing === true;\n let inputEnabled = false;\n const signals = options.signals ?? process;\n const discover = options.discover ?? (() => readEndpoint(stateDirectory()));\n const snapshot = options.snapshot ?? fetchDashboardSnapshot;\n const detail = options.detail ?? fetchDashboardDetail;\n const session = options.session ?? fetchDashboardSession;\n const interval = options.intervalMs ?? 1_000;\n const abort = new AbortController();\n const workspace = await resolveDashboardWorkspace(options.cwd ?? process.cwd());\n let rows: DashboardRow[] = [];\n let endpoint: Endpoint | undefined;\n let exitCode = 0;\n let outputError: unknown;\n let detailAbort: AbortController | undefined;\n let wake: (() => void) | undefined;\n const stop = (code: number) => {\n exitCode = code;\n detailAbort?.abort();\n abort.abort();\n wake?.();\n };\n const failedOutput = (error: unknown) => {\n outputError ??= error;\n detailAbort?.abort();\n abort.abort();\n wake?.();\n };\n // Event listeners and the decoder's Escape timer run outside the polling try/finally.\n const guarded = <Arguments extends unknown[]>(callback: (...args: Arguments) => void) => (...args: Arguments) => {\n if (abort.signal.aborted) return;\n try { callback(...args); } catch (error) { failedOutput(error); }\n };\n const renderer = new DashboardRenderer(output, workspace, !process.env.NO_COLOR, failedOutput);\n const interrupt = () => stop(130);\n const terminate = () => stop(143);\n const key = (pressed: Parameters<typeof dispatchDashboardKey>[1]) => {\n const action = dispatchDashboardKey(renderer, pressed);\n if (action.interrupt) { interrupt(); return; }\n if (action.refreshInspection) {\n detailAbort?.abort();\n detailAbort = renderer.inspecting ? new AbortController() : undefined;\n wake?.();\n }\n };\n const decoder = new DashboardKeyDecoder(guarded(key));\n const keys = guarded((chunk: Uint8Array | string) => decoder.push(chunk));\n const resize = guarded(() => renderer.render(rows, Date.now()));\n const waitForRefresh = (milliseconds: number): Promise<void> => {\n if (abort.signal.aborted) return Promise.resolve();\n return new Promise<void>(resolve => {\n let timer: NodeJS.Timeout | undefined;\n const done = () => {\n if (timer) clearTimeout(timer);\n abort.signal.removeEventListener('abort', done);\n if (wake === done) wake = undefined;\n resolve();\n };\n abort.signal.addEventListener('abort', done, {once: true});\n if (abort.signal.aborted) { done(); return; }\n timer = setTimeout(done, milliseconds);\n wake = done;\n });\n };\n signals.on('SIGINT', interrupt);\n signals.on('SIGTERM', terminate);\n output.on('resize', resize);\n output.on('error', failedOutput);\n try {\n if (input.isTTY) {\n input.setRawMode(true);\n inputEnabled = true;\n input.on('data', keys);\n input.resume();\n }\n renderer.start();\n while (!abort.signal.aborted) {\n const next = Date.now() + interval;\n endpoint ??= await discover();\n if (abort.signal.aborted) break;\n if (endpoint && !renderer.inspecting) rows = (await snapshot(endpoint, abort.signal)).sessions;\n if (abort.signal.aborted) break;\n renderer.render(rows, Date.now());\n const inspectionId = renderer.inspectedTaskId;\n const inspectionAbort = detailAbort;\n if (endpoint && inspectionId && inspectionAbort) {\n try {\n const signal = AbortSignal.any([abort.signal, inspectionAbort.signal]);\n const history = await session(endpoint, inspectionId, signal);\n if (abort.signal.aborted || detailAbort !== inspectionAbort || renderer.inspectedTaskId !== inspectionId) continue;\n renderer.updateSession(history);\n const expandedId = renderer.expandedTaskId;\n if (expandedId) {\n const record = await detail(endpoint, expandedId, signal, !renderer.detailLoaded, renderer.knownResponseId);\n if (!abort.signal.aborted && detailAbort === inspectionAbort && renderer.expandedTaskId === expandedId) {\n renderer.updateDetail(record);\n }\n }\n } catch (error) {\n if (detailAbort !== inspectionAbort || renderer.inspectedTaskId !== inspectionId) continue;\n throw error;\n }\n }\n await waitForRefresh(Math.max(0, next - Date.now()));\n }\n } catch (error) {\n if (!abort.signal.aborted) throw error;\n } finally {\n abort.abort();\n detailAbort?.abort();\n decoder.close();\n try { renderer.close(); } catch (error) { outputError ??= error; }\n if (inputEnabled) {\n input.off('data', keys);\n input.setRawMode(wasRaw);\n if (!wasFlowing) input.pause();\n }\n signals.off('SIGINT', interrupt);\n signals.off('SIGTERM', terminate);\n output.off('resize', resize);\n output.off('error', failedOutput);\n }\n if (outputError) throw new AgentError('INTERNAL', 'The dashboard terminal output failed.');\n return exitCode;\n}\n"]}
|
package/dist/cli/help.d.ts
CHANGED
package/dist/cli/help.js
CHANGED
|
@@ -19,7 +19,7 @@ Usage:
|
|
|
19
19
|
subharness respond <request-id> --content <json>
|
|
20
20
|
subharness respond <request-id> --content-file <path|->
|
|
21
21
|
|
|
22
|
-
Direct harness targets: codex, claude, fx. These bare names are reserved; same-named specialists require repo: or global:.
|
|
22
|
+
Direct harness targets: codex, claude, fx, opencode, copilot, cursor. These bare names are reserved; same-named specialists require repo: or global:.
|
|
23
23
|
Specialist targets: repo:<name>, global:<name>, or an unambiguous bare name.
|
|
24
24
|
Declared child targets: subagent:<name>, resolved only from the active managed parent's declarations.
|
|
25
25
|
Run "subharness run <harness> --help" or "subharness check <harness> --help" for harness-specific options.
|
|
@@ -49,51 +49,69 @@ const details = {
|
|
|
49
49
|
},
|
|
50
50
|
fx: {
|
|
51
51
|
name: 'fx',
|
|
52
|
-
access: 'Requires an installed fx executable and
|
|
52
|
+
access: 'Requires an installed fx executable and explicit native login, API-key, or Gateway access.',
|
|
53
53
|
effort: 'fx accepts a nonempty native effort identifier; model compatibility is checked by the adapter.',
|
|
54
54
|
},
|
|
55
|
+
opencode: {
|
|
56
|
+
name: 'opencode',
|
|
57
|
+
access: 'Requires an installed OpenCode executable and explicit native login, API-key, or Gateway access.',
|
|
58
|
+
modelRequired: true,
|
|
59
|
+
},
|
|
60
|
+
copilot: {
|
|
61
|
+
name: 'copilot',
|
|
62
|
+
access: 'Requires the GitHub Copilot SDK runtime and explicit native login, API-key, or Gateway access.',
|
|
63
|
+
modelRequired: true,
|
|
64
|
+
},
|
|
65
|
+
cursor: {
|
|
66
|
+
name: 'cursor',
|
|
67
|
+
access: 'Requires configured native Cursor CLI subscription access or Cursor SDK API-key access.',
|
|
68
|
+
modelRequired: true,
|
|
69
|
+
},
|
|
55
70
|
};
|
|
56
71
|
export function renderHelp(harness, command = 'run') {
|
|
57
72
|
if (!harness)
|
|
58
73
|
return GLOBAL_HELP;
|
|
59
74
|
const target = details[harness];
|
|
75
|
+
const effortUsage = target.effort ? ' [--effort <effort>]' : '';
|
|
76
|
+
const effortOption = target.effort ? ' --effort <effort> Native effort identifier\n' : '';
|
|
77
|
+
const modelNote = target.modelRequired
|
|
78
|
+
? 'This harness requires an explicit --model; it has no verifiable implicit model.'
|
|
79
|
+
: 'Omitting --model or --effort uses the verifiable native default for the selected access route.';
|
|
60
80
|
if (command === 'check')
|
|
61
81
|
return `subharness check ${target.name} — check direct ${target.name} startup readiness
|
|
62
82
|
|
|
63
83
|
Usage:
|
|
64
|
-
subharness check ${target.name} [--cwd <directory>]
|
|
84
|
+
subharness check ${target.name} [--cwd <directory>] ${target.modelRequired ? '--model <model>' : '[--model <model>]'}${effortUsage} [--format text|jsonl]
|
|
65
85
|
|
|
66
86
|
Options:
|
|
67
87
|
--cwd <directory> Execution directory for the startup check
|
|
68
88
|
--model <model> Native model identifier
|
|
69
|
-
--
|
|
70
|
-
--format text|jsonl Output format (text by default)
|
|
89
|
+
${effortOption} --format text|jsonl Output format (text by default)
|
|
71
90
|
|
|
72
91
|
The check opens and closes an isolated native session without submitting a turn.
|
|
73
92
|
Readiness covers startup at that moment, not quota, task success, native permissions, or continued availability.
|
|
74
|
-
|
|
75
|
-
${target.effort}
|
|
93
|
+
${modelNote}
|
|
94
|
+
${target.effort ?? ''}
|
|
76
95
|
${target.access}
|
|
77
96
|
Native harness flags are not forwarded; unsupported options are errors.
|
|
78
97
|
`;
|
|
79
98
|
return `subharness run ${target.name} — start a direct ${target.name} session
|
|
80
99
|
|
|
81
100
|
Usage:
|
|
82
|
-
subharness run ${target.name} [--cwd <directory>]
|
|
101
|
+
subharness run ${target.name} [--cwd <directory>] ${target.modelRequired ? '--model <model>' : '[--model <model>]'}${effortUsage} <prompt>
|
|
83
102
|
subharness run ${target.name} [options] --prompt <text>
|
|
84
103
|
subharness run ${target.name} [options] --prompt-file <path|->
|
|
85
104
|
|
|
86
105
|
Options:
|
|
87
106
|
--cwd <directory> Execution directory for the new session
|
|
88
107
|
--model <model> Native model identifier
|
|
89
|
-
--effort <effort> Native effort identifier
|
|
90
|
-
--prompt <text> Prompt text
|
|
108
|
+
${target.effort ? ' --effort <effort> Native effort identifier\n' : ''} --prompt <text> Prompt text
|
|
91
109
|
--prompt-file <path|-> Read the prompt from a UTF-8 file or stdin
|
|
92
110
|
--detach Return after admission without observing a response
|
|
93
111
|
--format text|jsonl Output format (text by default)
|
|
94
112
|
|
|
95
|
-
|
|
96
|
-
${target.effort}
|
|
113
|
+
${modelNote}
|
|
114
|
+
${target.effort ?? ''}
|
|
97
115
|
${target.access}
|
|
98
116
|
Native harness flags are not forwarded; unsupported options are errors.
|
|
99
117
|
`;
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB,CAAC;AAEF,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB,CAAC;AAEF,MAAM,OAAO,GAAiG;IAC5G,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,wEAAwE;QAChF,MAAM,EAAE,mGAAmG;KAC5G;IACD,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,8EAA8E;QACtF,MAAM,EAAE,yDAAyD;KAClE;IACD,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,4FAA4F;QACpG,MAAM,EAAE,gGAAgG;KACzG;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,kGAAkG;QAC1G,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,gGAAgG;QACxG,aAAa,EAAE,IAAI;KACpB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,yFAAyF;QACjG,aAAa,EAAE,IAAI;KACpB;CACF,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAuB,EAAE,OAAO,GAAoB,KAAK;IAClF,IAAI,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa;QACpC,CAAC,CAAC,iFAAiF;QACnF,CAAC,CAAC,gGAAgG,CAAC;IACrG,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,oBAAoB,MAAM,CAAC,IAAI,mBAAmB,MAAM,CAAC,IAAI;;;qBAG1E,MAAM,CAAC,IAAI,wBAAwB,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,GAAG,WAAW;;;;;EAKlI,YAAY;;;;EAIZ,SAAS;EACT,MAAM,CAAC,MAAM,IAAI,EAAE;EACnB,MAAM,CAAC,MAAM;;CAEd,CAAC;IACA,OAAO,kBAAkB,MAAM,CAAC,IAAI,qBAAqB,MAAM,CAAC,IAAI;;;mBAGnD,MAAM,CAAC,IAAI,wBAAwB,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,GAAG,WAAW;mBAC/G,MAAM,CAAC,IAAI;mBACX,MAAM,CAAC,IAAI;;;;;EAK5B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC,EAAE;;;;;EAK3E,SAAS;EACT,MAAM,CAAC,MAAM,IAAI,EAAE;EACnB,MAAM,CAAC,MAAM;;CAEd,CAAC;AACF,CAAC","sourcesContent":["type DirectHarness = 'codex' | 'claudeCode' | 'fx' | 'opencode' | 'copilot' | 'cursor';\n\nconst GLOBAL_HELP = `subharness — coordinate external coding agents\n\nUsage:\n subharness list [--cwd <directory>]\n subharness dashboard\n subharness check <target> [--cwd <directory>] [--format text|jsonl]\n subharness check <harness> [--cwd <directory>] [--model <model>] [--effort <effort>] [--format text|jsonl]\n subharness run <target> [options] [--detach] <prompt>\n subharness run <target> [options] [--detach] --prompt <text>\n subharness run <target> [options] [--detach] --prompt-file <path|->\n subharness send <session-id> [--delivery queue|steer|interrupt] [--detach] <prompt>\n subharness send <session-id> [--delivery queue|steer|interrupt] [--detach] --prompt <text>\n subharness send <session-id> [--delivery queue|steer|interrupt] [--detach] --prompt-file <path|->\n subharness wait <task-id> [--after <response-id>]\n subharness status <task-id> [--full]\n subharness queue <session-id>\n subharness cancel <task-id>\n subharness resume <session-id>\n subharness respond <request-id> --content <json>\n subharness respond <request-id> --content-file <path|->\n\nDirect harness targets: codex, claude, fx, opencode, copilot, cursor. These bare names are reserved; same-named specialists require repo: or global:.\nSpecialist targets: repo:<name>, global:<name>, or an unambiguous bare name.\nDeclared child targets: subagent:<name>, resolved only from the active managed parent's declarations.\nRun \"subharness run <harness> --help\" or \"subharness check <harness> --help\" for harness-specific options.\nExecution commands accept --format text|jsonl; text is the default.\nOmit --after to wait for the first retained response; supply it to wait for the next response.\nDetach after admission with --detach, then use wait or status; steering cannot be detached.\nPermission requests return approval_required with a request-specific schema. Inspect the action and scope,\nrespond with one JSON object matching that schema (at most 16 KiB), then wait on the same task.\nEach request offers its own choices; never invent a universal allow/deny value or assume \"always\" is permanent.\nDenial uses an offered rejection choice. Use cancel to stop the task; resume does not answer permissions.\nApproval content files resolve from the caller's working directory; - reads standard input.\nDashboard is a terminal-only read-only view and accepts no options.\n--help and --version do not start a coordinator or native harness.\nUse -- to pass a positional prompt beginning with a dash.\nagent is an identical compatibility alias for subharness.\n`;\n\nconst details: Record<DirectHarness, {name: string; access: string; effort?: string; modelRequired?: true}> = {\n codex: {\n name: 'codex',\n access: 'Requires an installed Codex executable and eligible configured access.',\n effort: 'Codex accepts a nonempty native effort identifier; model compatibility is checked by the adapter.',\n },\n claudeCode: {\n name: 'claude',\n access: 'Requires an installed Claude Code executable and eligible configured access.',\n effort: 'Claude effort must be low, medium, high, xhigh, or max.',\n },\n fx: {\n name: 'fx',\n access: 'Requires an installed fx executable and explicit native login, API-key, or Gateway access.',\n effort: 'fx accepts a nonempty native effort identifier; model compatibility is checked by the adapter.',\n },\n opencode: {\n name: 'opencode',\n access: 'Requires an installed OpenCode executable and explicit native login, API-key, or Gateway access.',\n modelRequired: true,\n },\n copilot: {\n name: 'copilot',\n access: 'Requires the GitHub Copilot SDK runtime and explicit native login, API-key, or Gateway access.',\n modelRequired: true,\n },\n cursor: {\n name: 'cursor',\n access: 'Requires configured native Cursor CLI subscription access or Cursor SDK API-key access.',\n modelRequired: true,\n },\n};\n\nexport function renderHelp(harness?: DirectHarness, command: 'run' | 'check' = 'run'): string {\n if (!harness) return GLOBAL_HELP;\n const target = details[harness];\n const effortUsage = target.effort ? ' [--effort <effort>]' : '';\n const effortOption = target.effort ? ' --effort <effort> Native effort identifier\\n' : '';\n const modelNote = target.modelRequired\n ? 'This harness requires an explicit --model; it has no verifiable implicit model.'\n : 'Omitting --model or --effort uses the verifiable native default for the selected access route.';\n if (command === 'check') return `subharness check ${target.name} — check direct ${target.name} startup readiness\n\nUsage:\n subharness check ${target.name} [--cwd <directory>] ${target.modelRequired ? '--model <model>' : '[--model <model>]'}${effortUsage} [--format text|jsonl]\n\nOptions:\n --cwd <directory> Execution directory for the startup check\n --model <model> Native model identifier\n${effortOption} --format text|jsonl Output format (text by default)\n\nThe check opens and closes an isolated native session without submitting a turn.\nReadiness covers startup at that moment, not quota, task success, native permissions, or continued availability.\n${modelNote}\n${target.effort ?? ''}\n${target.access}\nNative harness flags are not forwarded; unsupported options are errors.\n`;\n return `subharness run ${target.name} — start a direct ${target.name} session\n\nUsage:\n subharness run ${target.name} [--cwd <directory>] ${target.modelRequired ? '--model <model>' : '[--model <model>]'}${effortUsage} <prompt>\n subharness run ${target.name} [options] --prompt <text>\n subharness run ${target.name} [options] --prompt-file <path|->\n\nOptions:\n --cwd <directory> Execution directory for the new session\n --model <model> Native model identifier\n${target.effort ? ' --effort <effort> Native effort identifier\\n' : ''} --prompt <text> Prompt text\n --prompt-file <path|-> Read the prompt from a UTF-8 file or stdin\n --detach Return after admission without observing a response\n --format text|jsonl Output format (text by default)\n\n${modelNote}\n${target.effort ?? ''}\n${target.access}\nNative harness flags are not forwarded; unsupported options are errors.\n`;\n}\n"]}
|
package/dist/cli/main.js
CHANGED
|
@@ -3,11 +3,13 @@ import { readFile, realpath, stat } from 'node:fs/promises';
|
|
|
3
3
|
import { parseArgs } from './args.js';
|
|
4
4
|
import { renderHelp } from './help.js';
|
|
5
5
|
import { renderText, exitCode } from './output.js';
|
|
6
|
-
import { loadCatalog, loadDeclaredChildren } from './catalog.js';
|
|
7
6
|
import { AgentError, errorInfo } from '../errors.js';
|
|
8
7
|
import { connect, request } from '../runtime/client.js';
|
|
9
8
|
import { harnessReference } from '../runtime/definition.js';
|
|
10
|
-
import {
|
|
9
|
+
import { quoteDiagnosticPath } from '../config/access-provenance.js';
|
|
10
|
+
import { checkAgent, listAgents } from '../runtime/catalog.js';
|
|
11
|
+
import { captureReference, checkCapturedExecution } from '../runtime/capture.js';
|
|
12
|
+
import { stateDirectory } from '../runtime/state.js';
|
|
11
13
|
const valueOptions = new Set(['cwd', 'prompt', 'prompt-file', 'content', 'content-file', 'model', 'effort', 'delivery', 'after']);
|
|
12
14
|
function parseErrorFormat(argv) {
|
|
13
15
|
for (let index = 1; index < argv.length; index++) {
|
|
@@ -47,6 +49,7 @@ async function main() {
|
|
|
47
49
|
}
|
|
48
50
|
const parentToken = process.env.AGENT_PARENT_TOKEN;
|
|
49
51
|
let reference;
|
|
52
|
+
let managedEndpoint;
|
|
50
53
|
if (args.command === 'list' || args.command === 'run' || args.command === 'check') {
|
|
51
54
|
const requestedCwd = args.cwd;
|
|
52
55
|
try {
|
|
@@ -55,57 +58,52 @@ async function main() {
|
|
|
55
58
|
throw new Error();
|
|
56
59
|
}
|
|
57
60
|
catch {
|
|
58
|
-
throw new AgentError('INVALID_CONFIG', `Execution directory is not accessible: ${requestedCwd}`);
|
|
61
|
+
throw new AgentError('INVALID_CONFIG', `Execution directory is not accessible: ${quoteDiagnosticPath(requestedCwd)}`);
|
|
59
62
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
throw new AgentError(record.error.code, record.error.message);
|
|
70
|
-
parent = record;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if ((args.command === 'run' || args.command === 'check') && args.id.startsWith('subagent:')) {
|
|
74
|
-
const name = args.id.slice(9);
|
|
75
|
-
if (!parent || !('file' in parent.reference))
|
|
76
|
-
throw new AgentError('INVALID_PARENT', 'This subagent is not available in the active parent context.');
|
|
77
|
-
const children = await loadDeclaredChildren(args.cwd, parent.reference);
|
|
78
|
-
if (!children.some(child => child.name === name))
|
|
79
|
-
throw new AgentError('INVALID_PARENT', 'This subagent is not available in the active parent context.');
|
|
80
|
-
reference = { file: parent.reference.file, subagents: [...parent.reference.subagents, name] };
|
|
63
|
+
const environment = cliEnvironment();
|
|
64
|
+
if (!parentToken && args.id?.startsWith('subagent:'))
|
|
65
|
+
throw new AgentError('INVALID_PARENT', 'This subagent is not available in the active parent context.');
|
|
66
|
+
if (parentToken) {
|
|
67
|
+
managedEndpoint = await connect(false);
|
|
68
|
+
if (args.command === 'list') {
|
|
69
|
+
for await (const record of request(managedEndpoint, { command: 'parent-catalog', parentToken, cwd: args.cwd, env: environment }))
|
|
70
|
+
emit(record);
|
|
71
|
+
return;
|
|
81
72
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
{ id: 'fx', name: 'fx', description: 'Run the native fx harness through AI Gateway.', scope: 'harness' },
|
|
89
|
-
...entries.map(({ id, name, description, scope }) => ({ id, name, description, scope })),
|
|
90
|
-
...children.map(({ name, description }) => ({ id: `subagent:${name}`, name, description, scope: 'subagent' })),
|
|
91
|
-
] });
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const matches = entries.filter(entry => entry.id === args.id || entry.name === args.id);
|
|
95
|
-
if (matches.length !== 1)
|
|
96
|
-
throw new AgentError(matches.length ? 'AMBIGUOUS_AGENT' : 'UNKNOWN_AGENT', matches.length ? `Choose ${matches.map(entry => entry.id).join(' or ')}.` : 'Agent not found. Use subharness list.');
|
|
97
|
-
reference = { file: matches[0].file, subagents: [] };
|
|
73
|
+
if (!args.id.startsWith('subagent:'))
|
|
74
|
+
throw new AgentError('INVALID_PARENT', 'This subagent is not available in the active parent context.');
|
|
75
|
+
if (args.command === 'check') {
|
|
76
|
+
await requireAcknowledgement(managedEndpoint, { command: 'parent-check', agent: args.id, cwd: args.cwd, env: environment, parentToken });
|
|
77
|
+
emit({ version: 1, type: 'check', target: args.id, ready: true });
|
|
78
|
+
return;
|
|
98
79
|
}
|
|
99
80
|
}
|
|
81
|
+
else if (args.command === 'list') {
|
|
82
|
+
const catalog = await listAgents({ cwd: args.cwd, env: environment });
|
|
83
|
+
emit({ version: 1, type: 'agents', agents: [...catalog.items] });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
else if (args.harness) {
|
|
87
|
+
reference = harnessReference(args.harness, args.model, args.effort);
|
|
88
|
+
}
|
|
89
|
+
else if (args.command === 'check') {
|
|
90
|
+
await checkAgent(args.id, { cwd: args.cwd, env: environment });
|
|
91
|
+
emit({ version: 1, type: 'check', target: args.id, ready: true });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
100
94
|
}
|
|
101
95
|
if (args.command === 'check') {
|
|
102
|
-
|
|
96
|
+
const input = { cwd: args.cwd, env: cliEnvironment() };
|
|
97
|
+
const captured = await captureReference(reference, input);
|
|
98
|
+
await checkCapturedExecution(captured, input);
|
|
103
99
|
emit({ version: 1, type: 'check', target: args.id, ready: true });
|
|
104
100
|
return;
|
|
105
101
|
}
|
|
106
|
-
const endpoint = await connect(args.command === 'run');
|
|
102
|
+
const endpoint = managedEndpoint ?? await connect(args.command === 'run');
|
|
107
103
|
const body = args.command === 'run'
|
|
108
|
-
?
|
|
104
|
+
? parentToken
|
|
105
|
+
? { command: 'parent-run', agent: args.id, cwd: args.cwd, env: cliEnvironment(), prompt: args.prompt, parentToken, detach: args.detach }
|
|
106
|
+
: { command: 'cli-run', ...(reference ? { reference } : { agent: args.id }), cwd: args.cwd, env: cliEnvironment(), prompt: args.prompt, detach: args.detach }
|
|
109
107
|
: { ...args, parentToken };
|
|
110
108
|
for await (const record of request(endpoint, body))
|
|
111
109
|
emit(record);
|
|
@@ -114,5 +112,19 @@ async function main() {
|
|
|
114
112
|
emit({ version: 1, type: 'error', error: errorInfo(error) });
|
|
115
113
|
}
|
|
116
114
|
}
|
|
115
|
+
function cliEnvironment() {
|
|
116
|
+
const { AGENT_PARENT_TOKEN: _parent, AGENT_CLI_PATH: _launcher, ...environment } = process.env;
|
|
117
|
+
return { ...environment, AGENT_STATE_DIR: stateDirectory() };
|
|
118
|
+
}
|
|
119
|
+
async function requireAcknowledgement(endpoint, body) {
|
|
120
|
+
let acknowledged = false;
|
|
121
|
+
for await (const record of request(endpoint, body)) {
|
|
122
|
+
if (record.type === 'error')
|
|
123
|
+
throw new AgentError(record.error.code, record.error.message);
|
|
124
|
+
acknowledged = true;
|
|
125
|
+
}
|
|
126
|
+
if (!acknowledged)
|
|
127
|
+
throw new AgentError('COORDINATOR_UNAVAILABLE', 'The coordinator returned no acknowledgement.');
|
|
128
|
+
}
|
|
117
129
|
await main();
|
|
118
130
|
//# sourceMappingURL=main.js.map
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { readFile, realpath, stat } from 'node:fs/promises';\nimport { parseArgs } from './args.js';\nimport { renderHelp } from './help.js';\nimport { renderText, exitCode, type OutputRecord } from './output.js';\nimport { loadCatalog, loadDeclaredChildren } from './catalog.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { connect, request } from '../runtime/client.js';\nimport type { ExecutionReference } from '../runtime/types.js';\nimport { harnessReference } from '../runtime/definition.js';\nimport { checkReadiness } from '../runtime/readiness.js';\n\nconst valueOptions = new Set(['cwd', 'prompt', 'prompt-file', 'content', 'content-file', 'model', 'effort', 'delivery', 'after']);\n\nfunction parseErrorFormat(argv: string[]): 'text' | 'jsonl' {\n for (let index = 1; index < argv.length; index++) {\n const argument = argv[index]!;\n if (argument === '--') break;\n if (argument === '--format') return argv[index + 1] === 'jsonl' ? 'jsonl' : 'text';\n if (argument.startsWith('--') && valueOptions.has(argument.slice(2))) index++;\n }\n return 'text';\n}\n\nasync function main() {\n let format = process.argv[2] === 'dashboard' ? 'text' : parseErrorFormat(process.argv.slice(2));\n const emit = (record: OutputRecord) => {\n const text = format === 'jsonl' ? JSON.stringify(record) : renderText(record);\n (record.type === 'error' && format === 'text' ? process.stderr : process.stdout).write(text + '\\n');\n process.exitCode = exitCode(record);\n };\n try {\n const args = await parseArgs(process.argv.slice(2)); format = args.format;\n if (args.command === 'help') { process.stdout.write(renderHelp(args.harness, args.helpCommand)); return; }\n if (args.command === 'version') {\n const manifest = JSON.parse(await readFile(new URL('../../package.json', import.meta.url), 'utf8')) as { version: string };\n process.stdout.write(`${manifest.version}\\n`);\n return;\n }\n if (args.command === 'dashboard') {\n const { runDashboard } = await import('./dashboard.js');\n process.exitCode = await runDashboard();\n return;\n }\n const parentToken = process.env.AGENT_PARENT_TOKEN;\n let reference: ExecutionReference | undefined;\n if (args.command === 'list' || args.command === 'run' || args.command === 'check') {\n const requestedCwd = args.cwd;\n try {\n args.cwd = await realpath(requestedCwd);\n if (!(await stat(args.cwd)).isDirectory()) throw new Error();\n } catch {\n throw new AgentError('INVALID_CONFIG', `Execution directory is not accessible: ${requestedCwd}`);\n }\n if ((args.command === 'run' || args.command === 'check') && args.harness) {\n reference = harnessReference(args.harness, args.model, args.effort);\n } else {\n let parent: {reference:ExecutionReference}|undefined;\n if (parentToken) {\n const endpoint = await connect(false);\n for await (const record of request(endpoint,{command:'parent',parentToken})) {\n if (record.type === 'error') throw new AgentError((record.error as any).code,(record.error as any).message);\n parent = record as unknown as {reference:ExecutionReference};\n }\n }\n if ((args.command === 'run' || args.command === 'check') && args.id!.startsWith('subagent:')) {\n const name = args.id!.slice(9);\n if (!parent || !('file' in parent.reference)) throw new AgentError('INVALID_PARENT','This subagent is not available in the active parent context.');\n const children = await loadDeclaredChildren(args.cwd, parent.reference);\n if (!children.some(child => child.name === name)) throw new AgentError('INVALID_PARENT','This subagent is not available in the active parent context.');\n reference = {file:parent.reference.file,subagents:[...parent.reference.subagents,name]};\n } else {\n const { entries, children } = await loadCatalog(args.cwd, parent?.reference);\n if (args.command === 'list') {\n emit({version:1,type:'agents',agents:[\n {id:'codex',name:'codex',description:'Run the native Codex harness.',scope:'harness'},\n {id:'claude',name:'claude',description:'Run the native Claude Code harness.',scope:'harness'},\n {id:'fx',name:'fx',description:'Run the native fx harness through AI Gateway.',scope:'harness'},\n ...entries.map(({id,name,description,scope})=>({id,name,description,scope})),\n ...children.map(({name,description})=>({id:`subagent:${name}`,name,description,scope:'subagent'})),\n ]}); return;\n }\n const matches = entries.filter(entry=>entry.id===args.id || entry.name===args.id);\n if (matches.length !== 1) throw new AgentError(matches.length ? 'AMBIGUOUS_AGENT':'UNKNOWN_AGENT',matches.length ? `Choose ${matches.map(entry=>entry.id).join(' or ')}.` : 'Agent not found. Use subharness list.');\n reference = {file:matches[0]!.file,subagents:[]};\n }\n }\n }\n if (args.command === 'check') {\n await checkReadiness(reference!, args.cwd, process.env);\n emit({version: 1, type: 'check', target: args.id!, ready: true});\n return;\n }\n const endpoint = await connect(args.command === 'run');\n const body = args.command === 'run'\n ? {command:'run',input:{reference,cwd:args.cwd,env:process.env,prompt:args.prompt,parentToken},detach:args.detach}\n : {...args,parentToken};\n for await (const record of request(endpoint,body)) emit(record);\n } catch (error) { emit({version:1,type:'error',error:errorInfo(error)}); }\n}\nawait main();\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { readFile, realpath, stat } from 'node:fs/promises';\nimport { parseArgs } from './args.js';\nimport { renderHelp } from './help.js';\nimport { renderText, exitCode, type OutputRecord } from './output.js';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { connect, request } from '../runtime/client.js';\nimport type { ExecutionReference } from '../runtime/types.js';\nimport { harnessReference } from '../runtime/definition.js';\nimport { quoteDiagnosticPath } from '../config/access-provenance.js';\nimport { checkAgent, listAgents } from '../runtime/catalog.js';\nimport { captureReference, checkCapturedExecution } from '../runtime/capture.js';\nimport { stateDirectory } from '../runtime/state.js';\n\nconst valueOptions = new Set(['cwd', 'prompt', 'prompt-file', 'content', 'content-file', 'model', 'effort', 'delivery', 'after']);\n\nfunction parseErrorFormat(argv: string[]): 'text' | 'jsonl' {\n for (let index = 1; index < argv.length; index++) {\n const argument = argv[index]!;\n if (argument === '--') break;\n if (argument === '--format') return argv[index + 1] === 'jsonl' ? 'jsonl' : 'text';\n if (argument.startsWith('--') && valueOptions.has(argument.slice(2))) index++;\n }\n return 'text';\n}\n\nasync function main() {\n let format = process.argv[2] === 'dashboard' ? 'text' : parseErrorFormat(process.argv.slice(2));\n const emit = (record: OutputRecord) => {\n const text = format === 'jsonl' ? JSON.stringify(record) : renderText(record);\n (record.type === 'error' && format === 'text' ? process.stderr : process.stdout).write(text + '\\n');\n process.exitCode = exitCode(record);\n };\n try {\n const args = await parseArgs(process.argv.slice(2)); format = args.format;\n if (args.command === 'help') { process.stdout.write(renderHelp(args.harness, args.helpCommand)); return; }\n if (args.command === 'version') {\n const manifest = JSON.parse(await readFile(new URL('../../package.json', import.meta.url), 'utf8')) as { version: string };\n process.stdout.write(`${manifest.version}\\n`);\n return;\n }\n if (args.command === 'dashboard') {\n const { runDashboard } = await import('./dashboard.js');\n process.exitCode = await runDashboard();\n return;\n }\n const parentToken = process.env.AGENT_PARENT_TOKEN;\n let reference: ExecutionReference | undefined;\n let managedEndpoint: Awaited<ReturnType<typeof connect>> | undefined;\n if (args.command === 'list' || args.command === 'run' || args.command === 'check') {\n const requestedCwd = args.cwd;\n try {\n args.cwd = await realpath(requestedCwd);\n if (!(await stat(args.cwd)).isDirectory()) throw new Error();\n } catch {\n throw new AgentError('INVALID_CONFIG', `Execution directory is not accessible: ${quoteDiagnosticPath(requestedCwd)}`);\n }\n const environment=cliEnvironment();\n if (!parentToken && args.id?.startsWith('subagent:'))\n throw new AgentError('INVALID_PARENT','This subagent is not available in the active parent context.');\n if (parentToken) {\n managedEndpoint=await connect(false);\n if (args.command === 'list') {\n for await (const record of request(managedEndpoint,{command:'parent-catalog',parentToken,cwd:args.cwd,env:environment})) emit(record);\n return;\n }\n if (!args.id!.startsWith('subagent:'))\n throw new AgentError('INVALID_PARENT','This subagent is not available in the active parent context.');\n if (args.command === 'check') {\n await requireAcknowledgement(managedEndpoint,{command:'parent-check',agent:args.id,cwd:args.cwd,env:environment,parentToken});\n emit({version:1,type:'check',target:args.id!,ready:true}); return;\n }\n } else if (args.command === 'list') {\n const catalog=await listAgents({cwd:args.cwd,env:environment});\n emit({version:1,type:'agents',agents:[...catalog.items]}); return;\n } else if (args.harness) {\n reference=harnessReference(args.harness,args.model,args.effort);\n } else if (args.command === 'check') {\n await checkAgent(args.id!,{cwd:args.cwd,env:environment});\n emit({version:1,type:'check',target:args.id!,ready:true}); return;\n }\n }\n if (args.command === 'check') {\n const input={cwd:args.cwd,env:cliEnvironment()};\n const captured=await captureReference(reference!,input);\n await checkCapturedExecution(captured,input);\n emit({version: 1, type: 'check', target: args.id!, ready: true});\n return;\n }\n const endpoint = managedEndpoint ?? await connect(args.command === 'run');\n const body = args.command === 'run'\n ? parentToken\n ? {command:'parent-run',agent:args.id,cwd:args.cwd,env:cliEnvironment(),prompt:args.prompt,parentToken,detach:args.detach}\n : {command:'cli-run',...(reference ? {reference} : {agent:args.id}),cwd:args.cwd,env:cliEnvironment(),prompt:args.prompt,detach:args.detach}\n : {...args,parentToken};\n for await (const record of request(endpoint,body)) emit(record);\n } catch (error) { emit({version:1,type:'error',error:errorInfo(error)}); }\n}\n\nfunction cliEnvironment():NodeJS.ProcessEnv {\n const {AGENT_PARENT_TOKEN:_parent,AGENT_CLI_PATH:_launcher,...environment}=process.env;\n return {...environment,AGENT_STATE_DIR:stateDirectory()};\n}\n\nasync function requireAcknowledgement(endpoint:Awaited<ReturnType<typeof connect>>,body:unknown):Promise<void> {\n let acknowledged=false;\n for await(const record of request(endpoint,body)) {\n if(record.type==='error')throw new AgentError((record.error as any).code,(record.error as any).message);\n acknowledged=true;\n }\n if(!acknowledged)throw new AgentError('COORDINATOR_UNAVAILABLE','The coordinator returned no acknowledgement.');\n}\nawait main();\n"]}
|