@codegrammer/co-od 0.1.2 → 0.1.3
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/commands/daemon.js +48 -20
- package/dist/commands/run.js +5 -1
- package/package.json +1 -1
package/dist/commands/daemon.js
CHANGED
|
@@ -36,6 +36,9 @@ function parseArgs(args) {
|
|
|
36
36
|
else if (args[i] === "--server" && args[i + 1]) {
|
|
37
37
|
parsed.server = args[++i];
|
|
38
38
|
}
|
|
39
|
+
else if (args[i] === "--handoff-to" && args[i + 1]) {
|
|
40
|
+
parsed.handoffTo = args[++i];
|
|
41
|
+
}
|
|
39
42
|
else if (!args[i].startsWith("--")) {
|
|
40
43
|
parsed.roomId = args[i];
|
|
41
44
|
}
|
|
@@ -128,41 +131,66 @@ export async function run(args) {
|
|
|
128
131
|
activeRuns++;
|
|
129
132
|
console.error(`[${timestamp()}] Dispatching: ${goal.slice(0, 80)}`);
|
|
130
133
|
// Create a run on the server
|
|
134
|
+
const sessionToken = api.getSessionToken();
|
|
135
|
+
const baseUrl = api.getBaseUrl();
|
|
131
136
|
api
|
|
132
137
|
.post(`/api/rooms/${parsed.roomId}/agent-runs`, { goal, provider: parsed.provider, agentId, eventId: event._id })
|
|
133
138
|
.then(async ({ runId }) => {
|
|
134
139
|
const result = await adapter.execute(goal, {
|
|
135
140
|
workDir: parsed.dir,
|
|
136
141
|
onOutput: (data) => process.stderr.write(data),
|
|
142
|
+
// Room context enables Claude Code hooks for live reporting
|
|
143
|
+
roomId: parsed.roomId,
|
|
144
|
+
runId,
|
|
145
|
+
serverUrl: baseUrl,
|
|
146
|
+
sessionToken: sessionToken || undefined,
|
|
137
147
|
});
|
|
138
|
-
|
|
148
|
+
const succeeded = result.exitCode === 0;
|
|
149
|
+
console.error(`\n[${timestamp()}] Run ${runId} ${succeeded ? "succeeded" : "failed"}`);
|
|
139
150
|
// Report completion
|
|
140
151
|
try {
|
|
141
|
-
await api.post(`/api/rooms/${parsed.roomId}/agent-runs/${runId}/
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
payload: {
|
|
152
|
-
stdout: result.stdout.slice(-4096),
|
|
153
|
-
stderr: result.stderr.slice(-2048),
|
|
154
|
-
exitCode: result.exitCode,
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
created_at: Date.now(),
|
|
158
|
-
},
|
|
159
|
-
],
|
|
152
|
+
await api.post(`/api/rooms/${parsed.roomId}/agent-runs/${runId}/steps`, {
|
|
153
|
+
kind: succeeded ? "observation" : "error",
|
|
154
|
+
input: { description: succeeded ? "Task completed" : "Task failed" },
|
|
155
|
+
output: {
|
|
156
|
+
success: succeeded,
|
|
157
|
+
payload: {
|
|
158
|
+
stdout: result.stdout.slice(-4096),
|
|
159
|
+
stderr: result.stderr.slice(-2048),
|
|
160
|
+
exitCode: result.exitCode,
|
|
161
|
+
},
|
|
160
162
|
},
|
|
161
163
|
});
|
|
162
164
|
}
|
|
163
165
|
catch {
|
|
164
166
|
console.error(`[${timestamp()}] Warning: failed to report completion`);
|
|
165
167
|
}
|
|
168
|
+
// Agent-to-agent handoff
|
|
169
|
+
const handoffTarget = parsed.handoffTo ||
|
|
170
|
+
event.payload?.handoffTo ||
|
|
171
|
+
null;
|
|
172
|
+
if (succeeded && handoffTarget && parsed.roomId) {
|
|
173
|
+
console.error(`[${timestamp()}] Handing off to "${handoffTarget}"...`);
|
|
174
|
+
try {
|
|
175
|
+
// Find target agent by name
|
|
176
|
+
const agents = await api.get(`/api/rooms/${parsed.roomId}/agents`);
|
|
177
|
+
const target = agents.agents?.find((a) => a.name.toLowerCase() === handoffTarget.toLowerCase() || a._id === handoffTarget);
|
|
178
|
+
if (target) {
|
|
179
|
+
await api.post(`/api/rooms/${parsed.roomId}/agent-runs/${runId}/handoff`, {
|
|
180
|
+
targetAgentId: target._id,
|
|
181
|
+
context: `Completed: ${goal}. Output: ${result.stdout.slice(-500)}`,
|
|
182
|
+
goal: `Continue from "${agentName}": ${goal}`,
|
|
183
|
+
});
|
|
184
|
+
console.error(`[${timestamp()}] Handed off to "${target.name}" (${target._id})`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
console.error(`[${timestamp()}] Handoff target "${handoffTarget}" not found in room`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
console.error(`[${timestamp()}] Handoff failed: ${err}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
166
194
|
})
|
|
167
195
|
.catch((err) => {
|
|
168
196
|
console.error(`[${timestamp()}] Run failed: ${err}`);
|
package/dist/commands/run.js
CHANGED
|
@@ -57,12 +57,16 @@ export async function run(args) {
|
|
|
57
57
|
if (!parsed.json) {
|
|
58
58
|
console.error(`[co-od] Run ${runId} created. Executing with ${adapter.name}...`);
|
|
59
59
|
}
|
|
60
|
-
// Execute locally
|
|
60
|
+
// Execute locally — with room context for live hooks reporting
|
|
61
61
|
const result = await adapter.execute(parsed.goal, {
|
|
62
62
|
workDir: parsed.dir,
|
|
63
63
|
onOutput: parsed.json
|
|
64
64
|
? undefined
|
|
65
65
|
: (data) => process.stderr.write(data),
|
|
66
|
+
roomId: parsed.roomId,
|
|
67
|
+
runId,
|
|
68
|
+
serverUrl: api.getBaseUrl(),
|
|
69
|
+
sessionToken: api.getSessionToken() || undefined,
|
|
66
70
|
});
|
|
67
71
|
// Report completion
|
|
68
72
|
if (!parsed.json) {
|