@oxgeneral/orch 1.0.2 → 1.0.4

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 (132) hide show
  1. package/dist/App-SSYYVFGW.js +22 -0
  2. package/dist/agent-Q34L27AY.js +9 -0
  3. package/dist/agent-shop-D2RS4BZK.js +2 -0
  4. package/dist/chunk-4MMHVHA6.js +112 -0
  5. package/dist/chunk-64WUDYEM.js +6 -0
  6. package/dist/chunk-6MJ7V6VY.js +2 -0
  7. package/dist/{chunk-DAVHOWGD.js → chunk-BCPUTULS.js} +16 -188
  8. package/dist/{chunk-INZ4O2RI.js → chunk-BSJVYRI3.js} +5 -2
  9. package/dist/chunk-BSJVYRI3.js.map +1 -0
  10. package/dist/chunk-CDFA4IIQ.js +2 -0
  11. package/dist/chunk-CHRW4CLD.js +2 -0
  12. package/dist/chunk-HMMPM7MF.js +3 -0
  13. package/dist/chunk-HXOMNULD.js +2 -0
  14. package/dist/chunk-IKNBPOQL.js +2 -0
  15. package/dist/chunk-KFQTWMZI.js +3 -0
  16. package/dist/chunk-LXNRCJ22.js +2 -0
  17. package/dist/{chunk-C6XZ3FJT.js → chunk-MOWC2CHX.js} +7 -4
  18. package/dist/chunk-MOWC2CHX.js.map +1 -0
  19. package/dist/chunk-P4JTJBWO.js +2 -0
  20. package/dist/chunk-PJ5DKXGR.js +2 -0
  21. package/dist/chunk-QNZ6D63E.js +4 -0
  22. package/dist/chunk-RHFRHCN5.js +16 -0
  23. package/dist/chunk-RHFRHCN5.js.map +1 -0
  24. package/dist/chunk-TPTHLFOB.js +2 -0
  25. package/dist/chunk-UMZEA3JT.js +5 -0
  26. package/dist/chunk-X54D5JZG.js +11 -0
  27. package/dist/{chunk-O2OQCSBL.js → chunk-YHIYJ5OL.js} +105 -29
  28. package/dist/chunk-YHIYJ5OL.js.map +1 -0
  29. package/dist/{claude-WUJU5KIE.js → claude-4R6L6BWY.js} +4 -4
  30. package/dist/{claude-WUJU5KIE.js.map → claude-4R6L6BWY.js.map} +1 -1
  31. package/dist/claude-ZLVOLRUG.js +2 -0
  32. package/dist/cli.js +1 -213
  33. package/dist/clipboard-service-WVON5ZN4.js +25 -0
  34. package/dist/{codex-NYJWEPRQ.js → codex-IMOW5ZUZ.js} +4 -4
  35. package/dist/{codex-NYJWEPRQ.js.map → codex-IMOW5ZUZ.js.map} +1 -1
  36. package/dist/codex-YRSODLH4.js +2 -0
  37. package/dist/config-OOB7QEKM.js +2 -0
  38. package/dist/container-FJI7RN2L.js +4 -0
  39. package/dist/context-FXRERFSP.js +7 -0
  40. package/dist/cursor-2HILMNM3.js +2 -0
  41. package/dist/{cursor-3YHVD4NP.js → cursor-NHV7X3WG.js} +4 -4
  42. package/dist/{cursor-3YHVD4NP.js.map → cursor-NHV7X3WG.js.map} +1 -1
  43. package/dist/doctor-GKTV4YYD.js +2 -0
  44. package/dist/doctor-service-PB7YBH3F.js +2 -0
  45. package/dist/editor-7IFRWVTL.js +8 -0
  46. package/dist/goal-RNNZYMNR.js +8 -0
  47. package/dist/index.d.ts +26 -8
  48. package/dist/index.js +247 -75
  49. package/dist/index.js.map +1 -1
  50. package/dist/init-56QC5QVX.js +53 -0
  51. package/dist/logs-4ISTWUWV.js +12 -0
  52. package/dist/msg-4ELI7Q52.js +9 -0
  53. package/dist/opencode-3S4VDXRG.js +2 -0
  54. package/dist/{opencode-FAMPSA6X.js → opencode-ULT6DYCT.js} +6 -5
  55. package/dist/opencode-ULT6DYCT.js.map +1 -0
  56. package/dist/orchestrator-PM4BW7W5.js +13 -0
  57. package/dist/orchestrator-QFNYZ6AH.js +6 -0
  58. package/dist/{orchestrator-X2CWGFCL.js.map → orchestrator-QFNYZ6AH.js.map} +1 -1
  59. package/dist/org-WAK3CDPG.js +3 -0
  60. package/dist/process-manager-33H27MQF.js +2 -0
  61. package/dist/registry-BO2PPRNG.js +2 -0
  62. package/dist/run-NE5E4JPW.js +3 -0
  63. package/dist/shell-OBHIVC2H.js +2 -0
  64. package/dist/{shell-NJNW3O6K.js → shell-UXEJRK3D.js} +4 -4
  65. package/dist/{shell-NJNW3O6K.js.map → shell-UXEJRK3D.js.map} +1 -1
  66. package/dist/shop-picker-LE3SKFOX.js +5 -0
  67. package/dist/status-NYHZ7Q5G.js +2 -0
  68. package/dist/task-SZBYNAZP.js +20 -0
  69. package/dist/team-VCJSUDWX.js +4 -0
  70. package/dist/template-engine-42PKL5KD.js +2 -0
  71. package/dist/tui-4VRDSRVB.js +2 -0
  72. package/dist/update-FFKCOV63.js +2 -0
  73. package/dist/update-check-HGMBDYHL.js +2 -0
  74. package/dist/{workspace-manager-2SFPKPLZ.js → workspace-manager-ABXFBL2A.js} +3 -3
  75. package/dist/{workspace-manager-2SFPKPLZ.js.map → workspace-manager-ABXFBL2A.js.map} +1 -1
  76. package/dist/workspace-manager-Q6WWXSTR.js +3 -0
  77. package/package.json +1 -1
  78. package/dist/App-YQOT4LBE.js +0 -6727
  79. package/dist/agent-7ZJ3ZDJ7.js +0 -183
  80. package/dist/agent-shop-YN2BSLHM.js +0 -2
  81. package/dist/chunk-2C2TFQ7K.js +0 -136
  82. package/dist/chunk-45K2XID7.js +0 -29
  83. package/dist/chunk-4IFIOMCW.js +0 -86
  84. package/dist/chunk-7X2GI5OV.js +0 -181
  85. package/dist/chunk-C6XZ3FJT.js.map +0 -1
  86. package/dist/chunk-CHIP7O6V.js +0 -83
  87. package/dist/chunk-FRTKB575.js +0 -87
  88. package/dist/chunk-HXYAZGLP.js +0 -15
  89. package/dist/chunk-I3SMISEF.js +0 -29
  90. package/dist/chunk-INZ4O2RI.js.map +0 -1
  91. package/dist/chunk-ITLJKMTP.js +0 -297
  92. package/dist/chunk-K6DMQERQ.js +0 -89
  93. package/dist/chunk-MGGSRXWJ.js +0 -69
  94. package/dist/chunk-O2OQCSBL.js.map +0 -1
  95. package/dist/chunk-P6ATSXGL.js +0 -107
  96. package/dist/chunk-PNE6LQRF.js +0 -5
  97. package/dist/chunk-U2VDNUZL.js +0 -52
  98. package/dist/chunk-VXS2CJFH.js +0 -273
  99. package/dist/chunk-XDVMX2FO.js +0 -8
  100. package/dist/chunk-XDVMX2FO.js.map +0 -1
  101. package/dist/chunk-XJTJ2TJV.js +0 -221
  102. package/dist/claude-ZUEKJJ4X.js +0 -5
  103. package/dist/clipboard-service-RTDUUQQU.js +0 -200
  104. package/dist/codex-7IXXXG5U.js +0 -123
  105. package/dist/config-OTAVSMOD.js +0 -75
  106. package/dist/container-IZZVO4AH.js +0 -1596
  107. package/dist/context-OL4BVUV5.js +0 -83
  108. package/dist/cursor-622RBRHH.js +0 -97
  109. package/dist/doctor-SETNAS4S.js +0 -67
  110. package/dist/doctor-service-TPOMFAIG.js +0 -2
  111. package/dist/goal-C6YGSX5D.js +0 -143
  112. package/dist/init-SWAAXP5H.js +0 -199
  113. package/dist/logs-PHPYWQ6I.js +0 -207
  114. package/dist/msg-FUWWLEKM.js +0 -95
  115. package/dist/opencode-FAMPSA6X.js.map +0 -1
  116. package/dist/opencode-WOR53TSC.js +0 -98
  117. package/dist/orchestrator-O6MFMATT.js +0 -1448
  118. package/dist/orchestrator-X2CWGFCL.js +0 -5
  119. package/dist/org-JSMMBZHI.js +0 -249
  120. package/dist/process-manager-HUVNAPQV.js +0 -2
  121. package/dist/registry-PQWRVNF2.js +0 -2
  122. package/dist/run-N72G5V2H.js +0 -95
  123. package/dist/shell-DVFHHYAZ.js +0 -5
  124. package/dist/shop-picker-2HY67UWP.js +0 -79
  125. package/dist/status-RZWN2C6C.js +0 -56
  126. package/dist/task-XNYZHPCS.js +0 -221
  127. package/dist/team-PFLP4PPL.js +0 -97
  128. package/dist/template-engine-AWIS56BL.js +0 -3
  129. package/dist/tui-JW3DOOKH.js +0 -245
  130. package/dist/update-YLP7FPNY.js +0 -64
  131. package/dist/update-check-4YKLGBFB.js +0 -2
  132. package/dist/workspace-manager-ESPU7WOH.js +0 -215
@@ -1,207 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printError, dim, getIcon } from './chunk-7X2GI5OV.js';
3
- import { InvalidArgumentsError } from './chunk-2C2TFQ7K.js';
4
-
5
- // src/cli/commands/logs.ts
6
- function registerLogsCommand(program, container) {
7
- program.command("logs [run-id]").description("View run logs").option("--agent <agent-id>", "Filter by agent").option("--task <task-id>", "Filter by task").option("--follow", "Live stream").option("--since <duration>", "Filter by time (e.g. 5m, 1h)").action(async (runId, opts) => {
8
- await container.paths.requireInit();
9
- const sinceMs = opts.since ? parseDuration(opts.since) : void 0;
10
- if (opts.follow) {
11
- await followLive(container, { runId, taskId: opts.task, agentId: opts.agent });
12
- } else if (runId) {
13
- await showRunLogs(container, runId, sinceMs);
14
- } else if (opts.task) {
15
- await showTaskLogs(container, opts.task, sinceMs);
16
- } else if (opts.agent) {
17
- await showAgentLogs(container, opts.agent, sinceMs);
18
- } else {
19
- printError("Specify a run ID, --task, or --agent");
20
- process.exit(2);
21
- }
22
- });
23
- }
24
- function formatEvent(event) {
25
- const time = new Date(event.timestamp).toLocaleTimeString("en-US", {
26
- hour12: false,
27
- hour: "2-digit",
28
- minute: "2-digit",
29
- second: "2-digit"
30
- });
31
- const icon = event.type === "error" ? getIcon("failed") : getIcon("agentAction");
32
- const data = typeof event.data === "string" ? event.data : JSON.stringify(event.data);
33
- return ` ${dim(time)} ${icon} ${data.slice(0, 80)}`;
34
- }
35
- function filterBySince(events, sinceMs) {
36
- if (!sinceMs) return events;
37
- const cutoff = Date.now() - sinceMs;
38
- return events.filter((e) => new Date(e.timestamp).getTime() >= cutoff);
39
- }
40
- async function showRunLogs(container, runId, sinceMs) {
41
- let events = sinceMs ? filterBySince(await container.runService.readEventsTail(runId, 500), sinceMs) : await container.runService.readEventsTail(runId, 50);
42
- if (container.context.json) {
43
- console.log(JSON.stringify(events, null, 2));
44
- return;
45
- }
46
- if (events.length === 0) {
47
- console.log(`
48
- No events for run ${runId}
49
- `);
50
- return;
51
- }
52
- console.log();
53
- for (const event of events) {
54
- console.log(formatEvent(event));
55
- }
56
- console.log();
57
- }
58
- async function showTaskLogs(container, taskId, sinceMs) {
59
- const runs = await container.runService.listForTask(taskId);
60
- if (container.context.json) {
61
- console.log(JSON.stringify(runs, null, 2));
62
- return;
63
- }
64
- if (runs.length === 0) {
65
- console.log(`
66
- No runs for task ${taskId}
67
- `);
68
- return;
69
- }
70
- const recentRuns = sinceMs ? runs.slice(-20) : runs;
71
- const eventsPerRun = await Promise.all(
72
- recentRuns.map(
73
- (run) => sinceMs ? container.runService.readEventsTail(run.id, 500).then((e) => filterBySince(e, sinceMs)) : container.runService.readEventsTail(run.id, 10)
74
- )
75
- );
76
- for (let i = 0; i < recentRuns.length; i++) {
77
- const run = recentRuns[i];
78
- const events = eventsPerRun[i];
79
- console.log(`
80
- Run ${run.id} \xB7 attempt ${run.attempt} \xB7 ${run.status}`);
81
- for (const event of events.slice(-10)) {
82
- console.log(formatEvent(event));
83
- }
84
- }
85
- console.log();
86
- }
87
- async function showAgentLogs(container, agentId, sinceMs) {
88
- const runs = await container.runService.listForAgent(agentId);
89
- if (container.context.json) {
90
- console.log(JSON.stringify(runs, null, 2));
91
- return;
92
- }
93
- if (runs.length === 0) {
94
- console.log(`
95
- No runs for agent ${agentId}
96
- `);
97
- return;
98
- }
99
- const recentRuns = runs.slice(-5);
100
- const eventsPerRun = await Promise.all(
101
- recentRuns.map(
102
- (run) => sinceMs ? container.runService.readEventsTail(run.id, 500).then((e) => filterBySince(e, sinceMs)) : container.runService.readEventsTail(run.id, 5)
103
- )
104
- );
105
- for (let i = 0; i < recentRuns.length; i++) {
106
- const run = recentRuns[i];
107
- const events = eventsPerRun[i];
108
- console.log(`
109
- Run ${run.id} \xB7 task ${run.task_id} \xB7 ${run.status}`);
110
- for (const event of events.slice(-5)) {
111
- console.log(formatEvent(event));
112
- }
113
- }
114
- console.log();
115
- }
116
- async function followLive(container, filter) {
117
- const runIds = /* @__PURE__ */ new Set();
118
- const agentIds = /* @__PURE__ */ new Set();
119
- if (filter.runId) {
120
- runIds.add(filter.runId);
121
- }
122
- if (filter.taskId) {
123
- const runs = await container.runService.listForTask(filter.taskId);
124
- for (const r of runs) runIds.add(r.id);
125
- }
126
- if (filter.agentId) {
127
- agentIds.add(filter.agentId);
128
- }
129
- const hasFilter = runIds.size > 0 || agentIds.size > 0;
130
- console.log(`
131
- ${dim("Following live events...")} ${dim("(Ctrl+C to stop)")}
132
- `);
133
- const unsub = container.eventBus.onAny((event) => {
134
- const time = (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", {
135
- hour12: false,
136
- hour: "2-digit",
137
- minute: "2-digit",
138
- second: "2-digit"
139
- });
140
- if (hasFilter) {
141
- if ("runId" in event && runIds.size > 0 && !runIds.has(event.runId)) return;
142
- if ("agentId" in event && agentIds.size > 0) {
143
- const evt = event;
144
- if (!agentIds.has(evt.agentId)) return;
145
- }
146
- }
147
- switch (event.type) {
148
- case "agent:output": {
149
- const data = typeof event.data === "string" ? event.data.slice(0, 80) : "";
150
- console.log(` ${dim(time)} ${getIcon("agentAction")} ${data}`);
151
- break;
152
- }
153
- case "agent:file_changed":
154
- console.log(` ${dim(time)} ${getIcon("agentAction")} Modified ${event.path}`);
155
- break;
156
- case "agent:error":
157
- console.log(` ${dim(time)} ${getIcon("failed")} ${event.error}`);
158
- break;
159
- case "agent:started":
160
- console.log(` ${dim(time)} ${getIcon("orchestratorEvent")} Started ${event.runId} (agent: ${event.agentId})`);
161
- break;
162
- case "agent:completed":
163
- if (event.success) {
164
- console.log(` ${dim(time)} ${getIcon("done")} DONE ${event.runId}`);
165
- } else {
166
- console.log(` ${dim(time)} ${getIcon("failed")} FAIL ${event.runId}`);
167
- }
168
- break;
169
- case "run:retry":
170
- console.log(` ${dim(time)} ${getIcon("retrying")} RETRY attempt ${event.attempt} \xB7 next in ${Math.round(event.delay_ms / 1e3)}s`);
171
- break;
172
- case "orchestrator:stall_detected":
173
- console.log(` ${dim(time)} ${getIcon("warning")} STALL ${event.runId}`);
174
- break;
175
- }
176
- });
177
- await new Promise((resolve) => {
178
- const cleanup = () => {
179
- unsub();
180
- resolve();
181
- };
182
- process.once("SIGINT", cleanup);
183
- process.once("SIGTERM", cleanup);
184
- });
185
- }
186
- function parseDuration(input) {
187
- const match = input.match(/^(\d+)(s|m|h|d)$/);
188
- if (!match) {
189
- throw new InvalidArgumentsError(`Invalid duration: "${input}". Use format: 5m, 1h, 30s, 1d`);
190
- }
191
- const value = parseInt(match[1], 10);
192
- const unit = match[2];
193
- switch (unit) {
194
- case "s":
195
- return value * 1e3;
196
- case "m":
197
- return value * 6e4;
198
- case "h":
199
- return value * 36e5;
200
- case "d":
201
- return value * 864e5;
202
- default:
203
- return value * 6e4;
204
- }
205
- }
206
-
207
- export { registerLogsCommand };
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env node
2
- import { printSuccess, dim, formatDurationSince, printTable } from './chunk-7X2GI5OV.js';
3
-
4
- // src/cli/commands/msg.ts
5
- function registerMsgCommand(program, container) {
6
- const msg = program.command("msg").description("Inter-agent messaging");
7
- msg.command("send <to-agent-id> <body>").description("Send a direct message to an agent").option("-s, --subject <subject>", "Message subject").option("--from <agent-id>", "Sender agent ID (default: cli)").option("--ttl <ms>", "TTL in milliseconds").option("--reply-to <msg-id>", "Reply to a message").action(async (toAgentId, body, opts) => {
8
- await container.paths.requireInit();
9
- const messages = await container.messageService.send({
10
- channel: "direct",
11
- from_agent_id: opts.from ?? "cli",
12
- to_agent_id: toAgentId,
13
- subject: opts.subject ?? "",
14
- body,
15
- ttl_ms: opts.ttl ? parseInt(opts.ttl, 10) : void 0,
16
- reply_to: opts.replyTo
17
- });
18
- if (container.context.json) {
19
- console.log(JSON.stringify(messages, null, 2));
20
- } else if (container.context.quiet) {
21
- console.log(messages[0]?.id);
22
- } else {
23
- printSuccess(`Message sent: ${messages[0]?.id} \u2192 ${toAgentId}`);
24
- }
25
- });
26
- msg.command("broadcast <body>").description("Broadcast a message to all agents (or team members)").option("-s, --subject <subject>", "Message subject").option("--from <agent-id>", "Sender agent ID (default: cli)").option("--team <team-id>", "Limit broadcast to team members").option("--ttl <ms>", "TTL in milliseconds").action(async (body, opts) => {
27
- await container.paths.requireInit();
28
- const messages = await container.messageService.send({
29
- channel: "broadcast",
30
- from_agent_id: opts.from ?? "cli",
31
- subject: opts.subject ?? "",
32
- body,
33
- ttl_ms: opts.ttl ? parseInt(opts.ttl, 10) : void 0,
34
- team_id: opts.team
35
- });
36
- if (container.context.json) {
37
- console.log(JSON.stringify(messages, null, 2));
38
- } else if (container.context.quiet) {
39
- console.log(messages.map((m) => m.id).join("\n"));
40
- } else {
41
- printSuccess(`Broadcast sent to ${messages.length} agent(s)`);
42
- }
43
- });
44
- msg.command("inbox <agent-id>").description("Show pending messages for an agent").action(async (agentId) => {
45
- await container.paths.requireInit();
46
- const pending = await container.messageService.listPendingForAgent(agentId);
47
- if (container.context.json) {
48
- console.log(JSON.stringify(pending, null, 2));
49
- return;
50
- }
51
- if (pending.length === 0) {
52
- console.log(dim("\n No pending messages.\n"));
53
- return;
54
- }
55
- console.log();
56
- for (const m of pending) {
57
- console.log(` ${dim(m.id)} from ${m.from_agent_id}${m.subject ? ` \u2014 ${m.subject}` : ""}`);
58
- console.log(` ${m.body}`);
59
- console.log();
60
- }
61
- });
62
- msg.command("list").description("List all messages").option("--agent <agent-id>", "Filter by agent (sent or received)").action(async (opts) => {
63
- await container.paths.requireInit();
64
- let messages;
65
- if (opts.agent) {
66
- messages = await container.messageService.listForAgent(opts.agent);
67
- } else {
68
- messages = await container.messageService.listAll();
69
- }
70
- if (container.context.json) {
71
- console.log(JSON.stringify(messages, null, 2));
72
- return;
73
- }
74
- if (messages.length === 0) {
75
- console.log(dim("\n No messages.\n"));
76
- return;
77
- }
78
- const headers = ["ID", "FROM", "TO", "CHANNEL", "STATUS", "SENT"];
79
- const rows = messages.map((m) => [
80
- m.id,
81
- m.from_agent_id,
82
- m.to_agent_id ?? "*",
83
- m.channel,
84
- m.status,
85
- formatDurationSince(m.created_at)
86
- ]);
87
- console.log();
88
- printTable(headers, rows);
89
- console.log(`
90
- ${messages.length} message(s)
91
- `);
92
- });
93
- }
94
-
95
- export { registerMsgCommand };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/adapters/opencode.ts"],"names":[],"mappings":"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","file":"opencode-FAMPSA6X.js","sourcesContent":["/**\n * OpenCode adapter.\n *\n * Spawns `opencode run --format json` in headless mode.\n * Parses JSONL events from stdout into AgentEvent stream.\n */\n\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { createStreamingEvents, buildFullPrompt } from './utils.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\nimport { createTokenUsage } from '../../domain/run.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport class OpenCodeAdapter implements IAgentAdapter {\n readonly kind = 'opencode';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('opencode', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'OpenCode CLI not found. Install: npm i -g opencode',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n 'run',\n '--format', 'json',\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n\n // OpenCode has no native --system-prompt; prepend to user prompt\n const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);\n args.push(fullPrompt);\n\n const { process: proc, pid } = this.processManager.spawn('opencode', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createStreamingEvents(proc, parseOpenCodeEvent, 'OpenCode', params.signal);\n\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction parseOpenCodeEvent(line: string): AgentEvent | null {\n if (!line.trim()) return null;\n\n try {\n const parsed: Record<string, unknown> = JSON.parse(line);\n const timestamp = new Date().toISOString();\n const type = (parsed.type as string) ?? '';\n const part = (parsed.part as Record<string, unknown>) ?? {};\n\n switch (type) {\n case 'step_start':\n return null; // lifecycle event — no user-visible content\n\n case 'text':\n return { type: 'output', timestamp, data: part.text ?? part };\n\n case 'tool_use': {\n const state = (part.state as Record<string, unknown>) ?? {};\n if (state.status === 'error') {\n const errMsg = typeof state.error === 'string' ? state.error : JSON.stringify(state);\n return { type: 'error', timestamp, data: state, errorKind: classifyAdapterError(errMsg) };\n }\n // Map to { name, input } shape expected by TUI formatToolInput\n return { type: 'tool_call', timestamp, data: { name: part.tool, input: state.input } };\n }\n\n case 'step_finish': {\n const reason = part.reason as string | undefined;\n const tokens = extractOpenCodeTokens(part);\n\n if (reason === 'error') {\n const errMsg = typeof part.error === 'string' ? part.error : JSON.stringify(part);\n return { type: 'error', timestamp, data: part, tokens, errorKind: classifyAdapterError(errMsg) };\n }\n if (reason === 'tool-calls') {\n return null; // intermediate lifecycle — tool_use events carry the actual content\n }\n // reason === 'stop', 'max_tokens', or any other terminal reason → done\n return { type: 'done', timestamp, data: part, tokens };\n }\n\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: line };\n }\n}\n\n/** Extract token usage from opencode step_finish part. */\nfunction extractOpenCodeTokens(part: Record<string, unknown>): { input: number; output: number; total: number } | undefined {\n const tokens = part.tokens as Record<string, unknown> | undefined;\n if (!tokens || typeof tokens.input !== 'number') return undefined;\n\n const input = tokens.input;\n const output = typeof tokens.output === 'number' ? tokens.output : 0;\n return createTokenUsage(input, output);\n}\n"]}
@@ -1,98 +0,0 @@
1
- #!/usr/bin/env node
2
- import { buildFullPrompt, createStreamingEvents, createTokenUsage } from './chunk-MGGSRXWJ.js';
3
- import { classifyAdapterError } from './chunk-2C2TFQ7K.js';
4
- import './chunk-CHIP7O6V.js';
5
- import { execFile } from 'child_process';
6
- import { promisify } from 'util';
7
-
8
- var execFileAsync = promisify(execFile);
9
- var OpenCodeAdapter = class {
10
- constructor(processManager) {
11
- this.processManager = processManager;
12
- }
13
- kind = "opencode";
14
- async test() {
15
- try {
16
- const { stdout } = await execFileAsync("opencode", ["--version"]);
17
- return { ok: true, version: stdout.trim() };
18
- } catch (err) {
19
- const msg = err instanceof Error ? err.message : String(err);
20
- return {
21
- ok: false,
22
- error: "OpenCode CLI not found. Install: npm i -g opencode",
23
- errorKind: classifyAdapterError(msg)
24
- };
25
- }
26
- }
27
- execute(params) {
28
- const args = [
29
- "run",
30
- "--format",
31
- "json"
32
- ];
33
- if (params.config.model) {
34
- args.push("--model", params.config.model);
35
- }
36
- const fullPrompt = buildFullPrompt(params.systemPrompt, params.prompt);
37
- args.push(fullPrompt);
38
- const { process: proc, pid } = this.processManager.spawn("opencode", args, {
39
- cwd: params.workspace,
40
- env: { ...process.env, ...params.env },
41
- signal: params.signal
42
- });
43
- const events = createStreamingEvents(proc, parseOpenCodeEvent, "OpenCode", params.signal);
44
- return { pid, events };
45
- }
46
- async stop(pid) {
47
- await this.processManager.killWithGrace(pid);
48
- }
49
- };
50
- function parseOpenCodeEvent(line) {
51
- if (!line.trim()) return null;
52
- try {
53
- const parsed = JSON.parse(line);
54
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
55
- const type = parsed.type ?? "";
56
- const part = parsed.part ?? {};
57
- switch (type) {
58
- case "step_start":
59
- return null;
60
- // lifecycle event — no user-visible content
61
- case "text":
62
- return { type: "output", timestamp, data: part.text ?? part };
63
- case "tool_use": {
64
- const state = part.state ?? {};
65
- if (state.status === "error") {
66
- const errMsg = typeof state.error === "string" ? state.error : JSON.stringify(state);
67
- return { type: "error", timestamp, data: state, errorKind: classifyAdapterError(errMsg) };
68
- }
69
- return { type: "tool_call", timestamp, data: { name: part.tool, input: state.input } };
70
- }
71
- case "step_finish": {
72
- const reason = part.reason;
73
- const tokens = extractOpenCodeTokens(part);
74
- if (reason === "error") {
75
- const errMsg = typeof part.error === "string" ? part.error : JSON.stringify(part);
76
- return { type: "error", timestamp, data: part, tokens, errorKind: classifyAdapterError(errMsg) };
77
- }
78
- if (reason === "tool-calls") {
79
- return null;
80
- }
81
- return { type: "done", timestamp, data: part, tokens };
82
- }
83
- default:
84
- return { type: "output", timestamp, data: parsed };
85
- }
86
- } catch {
87
- return { type: "output", timestamp: (/* @__PURE__ */ new Date()).toISOString(), data: line };
88
- }
89
- }
90
- function extractOpenCodeTokens(part) {
91
- const tokens = part.tokens;
92
- if (!tokens || typeof tokens.input !== "number") return void 0;
93
- const input = tokens.input;
94
- const output = typeof tokens.output === "number" ? tokens.output : 0;
95
- return createTokenUsage(input, output);
96
- }
97
-
98
- export { OpenCodeAdapter };