@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.
- package/dist/App-SSYYVFGW.js +22 -0
- package/dist/agent-Q34L27AY.js +9 -0
- package/dist/agent-shop-D2RS4BZK.js +2 -0
- package/dist/chunk-4MMHVHA6.js +112 -0
- package/dist/chunk-64WUDYEM.js +6 -0
- package/dist/chunk-6MJ7V6VY.js +2 -0
- package/dist/{chunk-DAVHOWGD.js → chunk-BCPUTULS.js} +16 -188
- package/dist/{chunk-INZ4O2RI.js → chunk-BSJVYRI3.js} +5 -2
- package/dist/chunk-BSJVYRI3.js.map +1 -0
- package/dist/chunk-CDFA4IIQ.js +2 -0
- package/dist/chunk-CHRW4CLD.js +2 -0
- package/dist/chunk-HMMPM7MF.js +3 -0
- package/dist/chunk-HXOMNULD.js +2 -0
- package/dist/chunk-IKNBPOQL.js +2 -0
- package/dist/chunk-KFQTWMZI.js +3 -0
- package/dist/chunk-LXNRCJ22.js +2 -0
- package/dist/{chunk-C6XZ3FJT.js → chunk-MOWC2CHX.js} +7 -4
- package/dist/chunk-MOWC2CHX.js.map +1 -0
- package/dist/chunk-P4JTJBWO.js +2 -0
- package/dist/chunk-PJ5DKXGR.js +2 -0
- package/dist/chunk-QNZ6D63E.js +4 -0
- package/dist/chunk-RHFRHCN5.js +16 -0
- package/dist/chunk-RHFRHCN5.js.map +1 -0
- package/dist/chunk-TPTHLFOB.js +2 -0
- package/dist/chunk-UMZEA3JT.js +5 -0
- package/dist/chunk-X54D5JZG.js +11 -0
- package/dist/{chunk-O2OQCSBL.js → chunk-YHIYJ5OL.js} +105 -29
- package/dist/chunk-YHIYJ5OL.js.map +1 -0
- package/dist/{claude-WUJU5KIE.js → claude-4R6L6BWY.js} +4 -4
- package/dist/{claude-WUJU5KIE.js.map → claude-4R6L6BWY.js.map} +1 -1
- package/dist/claude-ZLVOLRUG.js +2 -0
- package/dist/cli.js +1 -213
- package/dist/clipboard-service-WVON5ZN4.js +25 -0
- package/dist/{codex-NYJWEPRQ.js → codex-IMOW5ZUZ.js} +4 -4
- package/dist/{codex-NYJWEPRQ.js.map → codex-IMOW5ZUZ.js.map} +1 -1
- package/dist/codex-YRSODLH4.js +2 -0
- package/dist/config-OOB7QEKM.js +2 -0
- package/dist/container-FJI7RN2L.js +4 -0
- package/dist/context-FXRERFSP.js +7 -0
- package/dist/cursor-2HILMNM3.js +2 -0
- package/dist/{cursor-3YHVD4NP.js → cursor-NHV7X3WG.js} +4 -4
- package/dist/{cursor-3YHVD4NP.js.map → cursor-NHV7X3WG.js.map} +1 -1
- package/dist/doctor-GKTV4YYD.js +2 -0
- package/dist/doctor-service-PB7YBH3F.js +2 -0
- package/dist/editor-7IFRWVTL.js +8 -0
- package/dist/goal-RNNZYMNR.js +8 -0
- package/dist/index.d.ts +26 -8
- package/dist/index.js +247 -75
- package/dist/index.js.map +1 -1
- package/dist/init-56QC5QVX.js +53 -0
- package/dist/logs-4ISTWUWV.js +12 -0
- package/dist/msg-4ELI7Q52.js +9 -0
- package/dist/opencode-3S4VDXRG.js +2 -0
- package/dist/{opencode-FAMPSA6X.js → opencode-ULT6DYCT.js} +6 -5
- package/dist/opencode-ULT6DYCT.js.map +1 -0
- package/dist/orchestrator-PM4BW7W5.js +13 -0
- package/dist/orchestrator-QFNYZ6AH.js +6 -0
- package/dist/{orchestrator-X2CWGFCL.js.map → orchestrator-QFNYZ6AH.js.map} +1 -1
- package/dist/org-WAK3CDPG.js +3 -0
- package/dist/process-manager-33H27MQF.js +2 -0
- package/dist/registry-BO2PPRNG.js +2 -0
- package/dist/run-NE5E4JPW.js +3 -0
- package/dist/shell-OBHIVC2H.js +2 -0
- package/dist/{shell-NJNW3O6K.js → shell-UXEJRK3D.js} +4 -4
- package/dist/{shell-NJNW3O6K.js.map → shell-UXEJRK3D.js.map} +1 -1
- package/dist/shop-picker-LE3SKFOX.js +5 -0
- package/dist/status-NYHZ7Q5G.js +2 -0
- package/dist/task-SZBYNAZP.js +20 -0
- package/dist/team-VCJSUDWX.js +4 -0
- package/dist/template-engine-42PKL5KD.js +2 -0
- package/dist/tui-4VRDSRVB.js +2 -0
- package/dist/update-FFKCOV63.js +2 -0
- package/dist/update-check-HGMBDYHL.js +2 -0
- package/dist/{workspace-manager-2SFPKPLZ.js → workspace-manager-ABXFBL2A.js} +3 -3
- package/dist/{workspace-manager-2SFPKPLZ.js.map → workspace-manager-ABXFBL2A.js.map} +1 -1
- package/dist/workspace-manager-Q6WWXSTR.js +3 -0
- package/package.json +1 -1
- package/dist/App-YQOT4LBE.js +0 -6727
- package/dist/agent-7ZJ3ZDJ7.js +0 -183
- package/dist/agent-shop-YN2BSLHM.js +0 -2
- package/dist/chunk-2C2TFQ7K.js +0 -136
- package/dist/chunk-45K2XID7.js +0 -29
- package/dist/chunk-4IFIOMCW.js +0 -86
- package/dist/chunk-7X2GI5OV.js +0 -181
- package/dist/chunk-C6XZ3FJT.js.map +0 -1
- package/dist/chunk-CHIP7O6V.js +0 -83
- package/dist/chunk-FRTKB575.js +0 -87
- package/dist/chunk-HXYAZGLP.js +0 -15
- package/dist/chunk-I3SMISEF.js +0 -29
- package/dist/chunk-INZ4O2RI.js.map +0 -1
- package/dist/chunk-ITLJKMTP.js +0 -297
- package/dist/chunk-K6DMQERQ.js +0 -89
- package/dist/chunk-MGGSRXWJ.js +0 -69
- package/dist/chunk-O2OQCSBL.js.map +0 -1
- package/dist/chunk-P6ATSXGL.js +0 -107
- package/dist/chunk-PNE6LQRF.js +0 -5
- package/dist/chunk-U2VDNUZL.js +0 -52
- package/dist/chunk-VXS2CJFH.js +0 -273
- package/dist/chunk-XDVMX2FO.js +0 -8
- package/dist/chunk-XDVMX2FO.js.map +0 -1
- package/dist/chunk-XJTJ2TJV.js +0 -221
- package/dist/claude-ZUEKJJ4X.js +0 -5
- package/dist/clipboard-service-RTDUUQQU.js +0 -200
- package/dist/codex-7IXXXG5U.js +0 -123
- package/dist/config-OTAVSMOD.js +0 -75
- package/dist/container-IZZVO4AH.js +0 -1596
- package/dist/context-OL4BVUV5.js +0 -83
- package/dist/cursor-622RBRHH.js +0 -97
- package/dist/doctor-SETNAS4S.js +0 -67
- package/dist/doctor-service-TPOMFAIG.js +0 -2
- package/dist/goal-C6YGSX5D.js +0 -143
- package/dist/init-SWAAXP5H.js +0 -199
- package/dist/logs-PHPYWQ6I.js +0 -207
- package/dist/msg-FUWWLEKM.js +0 -95
- package/dist/opencode-FAMPSA6X.js.map +0 -1
- package/dist/opencode-WOR53TSC.js +0 -98
- package/dist/orchestrator-O6MFMATT.js +0 -1448
- package/dist/orchestrator-X2CWGFCL.js +0 -5
- package/dist/org-JSMMBZHI.js +0 -249
- package/dist/process-manager-HUVNAPQV.js +0 -2
- package/dist/registry-PQWRVNF2.js +0 -2
- package/dist/run-N72G5V2H.js +0 -95
- package/dist/shell-DVFHHYAZ.js +0 -5
- package/dist/shop-picker-2HY67UWP.js +0 -79
- package/dist/status-RZWN2C6C.js +0 -56
- package/dist/task-XNYZHPCS.js +0 -221
- package/dist/team-PFLP4PPL.js +0 -97
- package/dist/template-engine-AWIS56BL.js +0 -3
- package/dist/tui-JW3DOOKH.js +0 -245
- package/dist/update-YLP7FPNY.js +0 -64
- package/dist/update-check-4YKLGBFB.js +0 -2
- package/dist/workspace-manager-ESPU7WOH.js +0 -215
package/dist/logs-PHPYWQ6I.js
DELETED
|
@@ -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 };
|
package/dist/msg-FUWWLEKM.js
DELETED
|
@@ -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 };
|