@oxgeneral/orch 0.2.0
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/LICENSE +21 -0
- package/dist/App-CPQPQTZU.js +4751 -0
- package/dist/agent-J62U7ABO.js +157 -0
- package/dist/chunk-2B32FPEB.js +11 -0
- package/dist/chunk-2B32FPEB.js.map +1 -0
- package/dist/chunk-2VSAM7RH.js +166 -0
- package/dist/chunk-33QNTNR6.js +46 -0
- package/dist/chunk-45K2XID7.js +29 -0
- package/dist/chunk-6GFVB6EK.js +101 -0
- package/dist/chunk-6HENRUYZ.js +2 -0
- package/dist/chunk-6HENRUYZ.js.map +1 -0
- package/dist/chunk-AELEEEV3.js +92 -0
- package/dist/chunk-AELEEEV3.js.map +1 -0
- package/dist/chunk-CHIP7O6V.js +83 -0
- package/dist/chunk-CIIE6LNG.js +217 -0
- package/dist/chunk-E3TCKHU6.js +13 -0
- package/dist/chunk-E3TCKHU6.js.map +1 -0
- package/dist/chunk-ED47GL3F.js +29 -0
- package/dist/chunk-HNKJ4IF7.js +177 -0
- package/dist/chunk-HXYAZGLP.js +15 -0
- package/dist/chunk-IRN2U2NE.js +79 -0
- package/dist/chunk-IZYSGYXG.js +2 -0
- package/dist/chunk-IZYSGYXG.js.map +1 -0
- package/dist/chunk-O5AO5QIR.js +76 -0
- package/dist/chunk-P6ATSXGL.js +107 -0
- package/dist/chunk-PBFE5V3G.js +2 -0
- package/dist/chunk-PBFE5V3G.js.map +1 -0
- package/dist/chunk-PNE6LQRF.js +5 -0
- package/dist/chunk-POUC4CPC.js +2 -0
- package/dist/chunk-POUC4CPC.js.map +1 -0
- package/dist/chunk-TX7WOFCW.js +59 -0
- package/dist/chunk-VTA74YWX.js +291 -0
- package/dist/chunk-XI4TU6VU.js +50 -0
- package/dist/chunk-ZU6AY2VU.js +2 -0
- package/dist/chunk-ZU6AY2VU.js.map +1 -0
- package/dist/claude-GH6P2DC5.js +4 -0
- package/dist/claude-S47YTIHU.js +2 -0
- package/dist/claude-S47YTIHU.js.map +1 -0
- package/dist/cli.js +205 -0
- package/dist/codex-2CH57B7G.js +2 -0
- package/dist/codex-2CH57B7G.js.map +1 -0
- package/dist/codex-U7LTJTX6.js +115 -0
- package/dist/config-VN4MYHSY.js +75 -0
- package/dist/container-74P43KDY.js +1532 -0
- package/dist/context-EPHCF34F.js +83 -0
- package/dist/cursor-3DI5GKRF.js +92 -0
- package/dist/cursor-QFUNKPCQ.js +2 -0
- package/dist/cursor-QFUNKPCQ.js.map +1 -0
- package/dist/doctor-BK46WCQ5.js +67 -0
- package/dist/doctor-service-A34DHPKI.js +2 -0
- package/dist/doctor-service-NTWBWOM2.js +2 -0
- package/dist/doctor-service-NTWBWOM2.js.map +1 -0
- package/dist/goal-KGAIM3ZK.js +110 -0
- package/dist/index.d.ts +1356 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/init-QBWCEDCI.js +152 -0
- package/dist/logs-PYEKMQE2.js +207 -0
- package/dist/msg-BBIPCGDO.js +95 -0
- package/dist/orchestrator-TAFBYQQ5.js +2 -0
- package/dist/orchestrator-TAFBYQQ5.js.map +1 -0
- package/dist/orchestrator-VGYKSOZJ.js +1292 -0
- package/dist/output-5VQVCJ2K.js +2 -0
- package/dist/process-manager-HUVNAPQV.js +2 -0
- package/dist/process-manager-TLZOTO4Y.js +2 -0
- package/dist/process-manager-TLZOTO4Y.js.map +1 -0
- package/dist/registry-PQWRVNF2.js +2 -0
- package/dist/registry-UQAHK77P.js +2 -0
- package/dist/registry-UQAHK77P.js.map +1 -0
- package/dist/run-4GSZFGQZ.js +95 -0
- package/dist/shell-5ZNXFGXV.js +3 -0
- package/dist/shell-OGTSH4RJ.js +3 -0
- package/dist/shell-OGTSH4RJ.js.map +1 -0
- package/dist/status-KIISF542.js +56 -0
- package/dist/task-NUCRHYW7.js +209 -0
- package/dist/team-IBUP5XV4.js +97 -0
- package/dist/template-engine-322SCRR6.js +2 -0
- package/dist/template-engine-322SCRR6.js.map +1 -0
- package/dist/template-engine-3CDRZNMJ.js +3 -0
- package/dist/tui-WWZA73IO.js +225 -0
- package/dist/update-RJ4IYACQ.js +64 -0
- package/dist/update-check-4RV7Z6WT.js +2 -0
- package/dist/workspace-manager-47KI7B27.js +179 -0
- package/dist/workspace-manager-7M46ESUL.js +2 -0
- package/dist/workspace-manager-7M46ESUL.js.map +1 -0
- package/package.json +79 -0
- package/readme.md +270 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { InvalidArgumentsError } from './chunk-O5AO5QIR.js';
|
|
3
|
+
import { printError, dim, getIcon } from './chunk-2VSAM7RH.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 };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { printSuccess, dim, formatDurationSince, printTable } from './chunk-2VSAM7RH.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 };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"orchestrator-TAFBYQQ5.js"}
|