codekin 0.6.4 → 0.7.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/README.md +8 -5
- package/bin/codekin.mjs +69 -6
- package/dist/assets/index-CLuQVRRb.css +1 -0
- package/dist/assets/index-JVnFWiSw.js +185 -0
- package/dist/index.html +2 -2
- package/package.json +6 -4
- package/server/dist/anthropic-models.d.ts +40 -0
- package/server/dist/anthropic-models.js +212 -0
- package/server/dist/anthropic-models.js.map +1 -0
- package/server/dist/claude-process.d.ts +32 -3
- package/server/dist/claude-process.js +129 -9
- package/server/dist/claude-process.js.map +1 -1
- package/server/dist/codex-process.d.ts +147 -0
- package/server/dist/codex-process.js +741 -0
- package/server/dist/codex-process.js.map +1 -0
- package/server/dist/coding-process.d.ts +16 -4
- package/server/dist/coding-process.js +10 -0
- package/server/dist/coding-process.js.map +1 -1
- package/server/dist/commit-event-handler.d.ts +14 -1
- package/server/dist/commit-event-handler.js +40 -8
- package/server/dist/commit-event-handler.js.map +1 -1
- package/server/dist/config.d.ts +25 -0
- package/server/dist/config.js +42 -0
- package/server/dist/config.js.map +1 -1
- package/server/dist/opencode-process.d.ts +142 -5
- package/server/dist/opencode-process.js +664 -84
- package/server/dist/opencode-process.js.map +1 -1
- package/server/dist/orchestrator-children.d.ts +94 -7
- package/server/dist/orchestrator-children.js +375 -65
- package/server/dist/orchestrator-children.js.map +1 -1
- package/server/dist/orchestrator-manager.d.ts +10 -0
- package/server/dist/orchestrator-manager.js +70 -18
- package/server/dist/orchestrator-manager.js.map +1 -1
- package/server/dist/orchestrator-monitor.d.ts +7 -1
- package/server/dist/orchestrator-monitor.js +62 -19
- package/server/dist/orchestrator-monitor.js.map +1 -1
- package/server/dist/orchestrator-notify.d.ts +42 -0
- package/server/dist/orchestrator-notify.js +42 -0
- package/server/dist/orchestrator-notify.js.map +1 -0
- package/server/dist/orchestrator-outbox.d.ts +48 -0
- package/server/dist/orchestrator-outbox.js +154 -0
- package/server/dist/orchestrator-outbox.js.map +1 -0
- package/server/dist/orchestrator-session-router.js +43 -1
- package/server/dist/orchestrator-session-router.js.map +1 -1
- package/server/dist/prompt-router.d.ts +22 -1
- package/server/dist/prompt-router.js +94 -11
- package/server/dist/prompt-router.js.map +1 -1
- package/server/dist/session-archive.js +11 -1
- package/server/dist/session-archive.js.map +1 -1
- package/server/dist/session-lifecycle.d.ts +1 -0
- package/server/dist/session-lifecycle.js +37 -0
- package/server/dist/session-lifecycle.js.map +1 -1
- package/server/dist/session-manager.d.ts +49 -2
- package/server/dist/session-manager.js +221 -33
- package/server/dist/session-manager.js.map +1 -1
- package/server/dist/session-naming.d.ts +4 -0
- package/server/dist/session-naming.js +26 -5
- package/server/dist/session-naming.js.map +1 -1
- package/server/dist/session-routes.js +42 -2
- package/server/dist/session-routes.js.map +1 -1
- package/server/dist/stepflow-handler.js +2 -2
- package/server/dist/stepflow-handler.js.map +1 -1
- package/server/dist/tsconfig.tsbuildinfo +1 -1
- package/server/dist/types.d.ts +24 -3
- package/server/dist/types.js +1 -9
- package/server/dist/types.js.map +1 -1
- package/server/dist/upload-routes.d.ts +7 -0
- package/server/dist/upload-routes.js +85 -28
- package/server/dist/upload-routes.js.map +1 -1
- package/server/dist/webhook-handler.js +3 -3
- package/server/dist/webhook-handler.js.map +1 -1
- package/server/dist/workflow-config.d.ts +2 -2
- package/server/dist/workflow-engine.d.ts +20 -0
- package/server/dist/workflow-engine.js +52 -15
- package/server/dist/workflow-engine.js.map +1 -1
- package/server/dist/workflow-loader.d.ts +5 -5
- package/server/dist/workflow-loader.js +169 -54
- package/server/dist/workflow-loader.js.map +1 -1
- package/server/dist/workflow-routes.js +36 -2
- package/server/dist/workflow-routes.js.map +1 -1
- package/server/dist/ws-message-handler.js +24 -9
- package/server/dist/ws-message-handler.js.map +1 -1
- package/server/dist/ws-server.js +53 -11
- package/server/dist/ws-server.js.map +1 -1
- package/dist/assets/index-BRB_Ksyk.js +0 -182
- package/dist/assets/index-Q2WSVlHo.css +0 -1
|
@@ -7,8 +7,18 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { SessionManager } from './session-manager.js';
|
|
9
9
|
export declare const ORCHESTRATOR_DIR: string;
|
|
10
|
+
/**
|
|
11
|
+
* Bump this whenever CLAUDE_MD_TEMPLATE changes. Already-seeded CLAUDE.md
|
|
12
|
+
* files carrying an older (or no) version stamp are refreshed on boot —
|
|
13
|
+
* without this, installs keep running on stale orchestrator instructions
|
|
14
|
+
* forever. CLAUDE.md is system-managed; user memory lives in PROFILE.md,
|
|
15
|
+
* REPOS.md and journal/, which are never overwritten.
|
|
16
|
+
*/
|
|
17
|
+
export declare const CLAUDE_MD_TEMPLATE_VERSION = 2;
|
|
10
18
|
/** Ensure the orchestrator workspace directory exists with starter files. */
|
|
11
19
|
export declare function ensureOrchestratorDir(): void;
|
|
20
|
+
/** Parse the template version stamp from a seeded CLAUDE.md; 0 when absent. */
|
|
21
|
+
export declare function readTemplateVersion(path: string): number;
|
|
12
22
|
/** Get or create a stable session UUID that persists across restarts. */
|
|
13
23
|
export declare function getOrCreateOrchestratorId(): string;
|
|
14
24
|
/** Check if a session is the orchestrator session. */
|
|
@@ -29,7 +29,16 @@ Agent ${AGENT_DISPLAY_NAME} tracks repositories you work with in Codekin.
|
|
|
29
29
|
## Active Repos
|
|
30
30
|
(none yet — ${AGENT_DISPLAY_NAME} will populate this as you work)
|
|
31
31
|
`;
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Bump this whenever CLAUDE_MD_TEMPLATE changes. Already-seeded CLAUDE.md
|
|
34
|
+
* files carrying an older (or no) version stamp are refreshed on boot —
|
|
35
|
+
* without this, installs keep running on stale orchestrator instructions
|
|
36
|
+
* forever. CLAUDE.md is system-managed; user memory lives in PROFILE.md,
|
|
37
|
+
* REPOS.md and journal/, which are never overwritten.
|
|
38
|
+
*/
|
|
39
|
+
export const CLAUDE_MD_TEMPLATE_VERSION = 2;
|
|
40
|
+
const CLAUDE_MD_TEMPLATE = `<!-- codekin-template-version: ${CLAUDE_MD_TEMPLATE_VERSION} -->
|
|
41
|
+
# Agent ${AGENT_DISPLAY_NAME} — Codekin Orchestrator
|
|
33
42
|
|
|
34
43
|
You are ${AGENT_DISPLAY_NAME}, a calm and friendly ops manager inside Codekin.
|
|
35
44
|
You help users keep their repositories healthy, their workflows running
|
|
@@ -129,6 +138,13 @@ Fields:
|
|
|
129
138
|
- **useWorktree**: true (default) — runs in an isolated git worktree
|
|
130
139
|
- **model**: Optional model override (e.g. "claude-sonnet-4-6")
|
|
131
140
|
- **allowedTools**: Optional array of tool patterns to override defaults (advanced)
|
|
141
|
+
- **timeoutMs**: Optional working-time budget in ms (default 1800000 = 30 min,
|
|
142
|
+
range 1 min – 4 h). Time spent blocked on an approval does not count.
|
|
143
|
+
Raise this for large tasks (big refactors, full test suites).
|
|
144
|
+
|
|
145
|
+
The spawn response includes a \`worktree\` field ("active", "failed", or
|
|
146
|
+
"none") and \`worktreePath\`. If worktree is "failed", the child works
|
|
147
|
+
directly in the main repo directory — watch it more closely.
|
|
132
148
|
|
|
133
149
|
### What Child Sessions Can Do Automatically
|
|
134
150
|
Child sessions have a broad set of pre-approved tools for standard dev work:
|
|
@@ -136,6 +152,9 @@ Child sessions have a broad set of pre-approved tools for standard dev work:
|
|
|
136
152
|
- **Git & GitHub**: git (all subcommands), gh (PRs, issues, runs)
|
|
137
153
|
- **Package managers**: npm, npx, yarn, pnpm, bun
|
|
138
154
|
- **Build tools**: node, tsc, eslint, prettier, cargo, go, make, pip
|
|
155
|
+
- **Python**: python3, pytest
|
|
156
|
+
- **Text/data**: sed, rg, jq
|
|
157
|
+
- **File management** (non-destructive): mkdir, cp, mv, touch
|
|
139
158
|
- **Filesystem** (read-only): ls, cat, head, tail, sort, diff, tree, wc, which, file
|
|
140
159
|
|
|
141
160
|
They do NOT have access to destructive commands (rm, sudo, docker,
|
|
@@ -158,6 +177,12 @@ curl -s "http://localhost:$CODEKIN_PORT/api/orchestrator/children" \\
|
|
|
158
177
|
# Get specific child session
|
|
159
178
|
curl -s "http://localhost:$CODEKIN_PORT/api/orchestrator/children/SESSION_ID" \\
|
|
160
179
|
-H "Authorization: Bearer $CODEKIN_AUTH_TOKEN"
|
|
180
|
+
|
|
181
|
+
# Read the tail of a child's transcript (what Claude actually output).
|
|
182
|
+
# Useful when a child stops with "Completion not verified" or gets stuck.
|
|
183
|
+
# ?limit caps the returned characters (default 5000, max 50000).
|
|
184
|
+
curl -s "http://localhost:$CODEKIN_PORT/api/orchestrator/children/SESSION_ID/transcript?limit=10000" \\
|
|
185
|
+
-H "Authorization: Bearer $CODEKIN_AUTH_TOKEN"
|
|
161
186
|
\`\`\`
|
|
162
187
|
|
|
163
188
|
## Scheduling Reminders & Recurring Tasks
|
|
@@ -171,16 +196,26 @@ You have access to CronCreate, CronDelete, and CronList tools for in-session sch
|
|
|
171
196
|
Examples:
|
|
172
197
|
- Every morning at 9am: \`cron: "3 9 * * *"\`, \`prompt: "Check for new reports"\`
|
|
173
198
|
- One-shot reminder: \`cron: "0 14 22 3 *"\`, \`prompt: "Follow up on deploy"\`, \`recurring: false\`
|
|
174
|
-
|
|
199
|
+
|
|
200
|
+
You do NOT need a recurring cron to watch child sessions — the server
|
|
201
|
+
pushes you a notification the moment a child blocks on an approval,
|
|
202
|
+
finishes, fails, or times out. Use crons for reminders and scheduled
|
|
203
|
+
work, not for polling.
|
|
175
204
|
|
|
176
205
|
Important: The \`cron\` parameter must be a plain string like \`"0 9 * * *"\`, NOT an object.
|
|
177
206
|
Jobs only live in this session — they are lost when the session restarts. Recurring jobs auto-expire after 7 days.
|
|
178
207
|
|
|
179
208
|
## Monitoring Sessions
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
|
|
183
|
-
|
|
209
|
+
You receive push notifications about your child sessions automatically:
|
|
210
|
+
- **Blocked**: the child is waiting on a tool approval or question — the
|
|
211
|
+
notification includes the requestId and the exact curl to respond
|
|
212
|
+
- **Stopped**: the child completed, failed, or timed out
|
|
213
|
+
|
|
214
|
+
The server also verifies completion against ground truth (does the PR /
|
|
215
|
+
pushed branch actually exist?) and nudges the child once if the final
|
|
216
|
+
step is missing. When a "Stopped" notification carries a
|
|
217
|
+
"Completion not verified" note, the final step still didn't land —
|
|
218
|
+
inspect the worktree and finish it or respawn.
|
|
184
219
|
- If the session gets stuck or fails, inform the user and suggest next steps
|
|
185
220
|
- When done, summarize what was accomplished
|
|
186
221
|
|
|
@@ -188,31 +223,31 @@ After spawning a session:
|
|
|
188
223
|
Sessions can get stuck waiting for tool approvals or user answers. You can
|
|
189
224
|
discover and unblock them:
|
|
190
225
|
|
|
191
|
-
|
|
226
|
+
\`\`\`bash
|
|
192
227
|
# List all sessions with pending prompts
|
|
193
228
|
curl -s "http://localhost:$CODEKIN_PORT/api/orchestrator/sessions/pending-prompts" \\
|
|
194
229
|
-H "Authorization: Bearer $CODEKIN_AUTH_TOKEN"
|
|
195
|
-
|
|
230
|
+
\`\`\`
|
|
196
231
|
|
|
197
|
-
Returns sessions with their pending prompts, including the
|
|
198
|
-
|
|
232
|
+
Returns sessions with their pending prompts, including the \`requestId\`,
|
|
233
|
+
\`toolName\`, and \`promptType\` ("permission" or "question").
|
|
199
234
|
|
|
200
235
|
### Giving Approvals to Stuck Sessions
|
|
201
236
|
If a child session is blocked on a tool approval and you're confident it's
|
|
202
237
|
safe, you can approve it directly:
|
|
203
238
|
|
|
204
|
-
|
|
239
|
+
\`\`\`bash
|
|
205
240
|
curl -s -X POST "http://localhost:$CODEKIN_PORT/api/orchestrator/sessions/SESSION_ID/respond" \\
|
|
206
241
|
-H "Authorization: Bearer $CODEKIN_AUTH_TOKEN" \\
|
|
207
242
|
-H "Content-Type: application/json" \\
|
|
208
243
|
-d '{"requestId": "REQUEST_ID", "value": "allow"}'
|
|
209
|
-
|
|
244
|
+
\`\`\`
|
|
210
245
|
|
|
211
|
-
Values:
|
|
246
|
+
Values: \`"allow"\`, \`"deny"\`, \`"always_allow"\`, or free text for question prompts.
|
|
212
247
|
|
|
213
248
|
**Guidelines for giving approvals:**
|
|
214
249
|
- Only approve tools you understand — if unsure, ask the user
|
|
215
|
-
- Prefer
|
|
250
|
+
- Prefer \`"allow"\` over \`"always_allow"\` for child sessions
|
|
216
251
|
- Never approve destructive commands (rm -rf, git push --force, DROP TABLE)
|
|
217
252
|
without user confirmation
|
|
218
253
|
- For question prompts, provide a reasonable answer or ask the user
|
|
@@ -273,9 +308,9 @@ Users can manage trust directly in chat:
|
|
|
273
308
|
4. Read skill-profile.json for guidance style adaptation
|
|
274
309
|
5. Check for new audit reports that may have landed
|
|
275
310
|
6. Check for decisions pending outcome assessment
|
|
276
|
-
7. **Re-establish cron jobs** — cron jobs do not survive session restarts, so
|
|
311
|
+
7. **Re-establish cron jobs** — cron jobs do not survive session restarts, so re-create your scheduled work on startup:
|
|
277
312
|
- Report check: \`cron: "3 9 * * *"\`, \`prompt: "Check for new audit reports across all managed repos and triage any new findings"\`
|
|
278
|
-
-
|
|
313
|
+
- Do NOT create a child-session polling cron — the server pushes blocked/terminal notifications to you in realtime.
|
|
279
314
|
8. Greet the user with a brief, friendly status update
|
|
280
315
|
|
|
281
316
|
### Greeting Guidelines
|
|
@@ -294,16 +329,33 @@ export function ensureOrchestratorDir() {
|
|
|
294
329
|
const journalDir = join(ORCHESTRATOR_DIR, 'journal');
|
|
295
330
|
if (!existsSync(journalDir))
|
|
296
331
|
mkdirSync(journalDir, { recursive: true });
|
|
297
|
-
// Seed files only if they don't exist (preserve user edits)
|
|
332
|
+
// Seed memory files only if they don't exist (preserve user edits)
|
|
298
333
|
const seeds = [
|
|
299
334
|
[join(ORCHESTRATOR_DIR, 'PROFILE.md'), PROFILE_TEMPLATE],
|
|
300
335
|
[join(ORCHESTRATOR_DIR, 'REPOS.md'), REPOS_TEMPLATE],
|
|
301
|
-
[join(ORCHESTRATOR_DIR, 'CLAUDE.md'), CLAUDE_MD_TEMPLATE],
|
|
302
336
|
];
|
|
303
337
|
for (const [path, content] of seeds) {
|
|
304
338
|
if (!existsSync(path))
|
|
305
339
|
writeFileSync(path, content, 'utf-8');
|
|
306
340
|
}
|
|
341
|
+
// CLAUDE.md is system-managed: refresh it whenever the embedded template
|
|
342
|
+
// version is older than the current one (or missing entirely).
|
|
343
|
+
const claudeMdPath = join(ORCHESTRATOR_DIR, 'CLAUDE.md');
|
|
344
|
+
if (readTemplateVersion(claudeMdPath) < CLAUDE_MD_TEMPLATE_VERSION) {
|
|
345
|
+
writeFileSync(claudeMdPath, CLAUDE_MD_TEMPLATE, 'utf-8');
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/** Parse the template version stamp from a seeded CLAUDE.md; 0 when absent. */
|
|
349
|
+
export function readTemplateVersion(path) {
|
|
350
|
+
try {
|
|
351
|
+
if (!existsSync(path))
|
|
352
|
+
return 0;
|
|
353
|
+
const match = /<!-- codekin-template-version: (\d+) -->/.exec(readFileSync(path, 'utf-8'));
|
|
354
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
return 0;
|
|
358
|
+
}
|
|
307
359
|
}
|
|
308
360
|
/** Get or create a stable session UUID that persists across restarts. */
|
|
309
361
|
export function getOrCreateOrchestratorId() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-manager.js","sourceRoot":"","sources":["../orchestrator-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAG/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;AAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAA;AAE7D,MAAM,gBAAgB,GAAG;;QAEjB,kBAAkB;;;;KAIrB,kBAAkB;;;KAGlB,kBAAkB;CACtB,CAAA;AAED,MAAM,cAAc,GAAG;;QAEf,kBAAkB;;;cAGZ,kBAAkB;CAC/B,CAAA;AAED,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"orchestrator-manager.js","sourceRoot":"","sources":["../orchestrator-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,9 +55,15 @@ export declare class OrchestratorMonitor {
|
|
|
55
55
|
private addNotification;
|
|
56
56
|
/** Deliver a notification to the orchestrator chat session. */
|
|
57
57
|
private deliverToOrchestrator;
|
|
58
|
-
/** Discover repo paths from REPOS_ROOT. */
|
|
58
|
+
/** Discover repo paths from REPOS_ROOT (see discoverRepoPathsUnder). */
|
|
59
59
|
private discoverRepoPaths;
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Discover git repositories under a root directory, recursing one level into
|
|
63
|
+
* non-repo directories so org-style layouts (root/org/repo) are picked up
|
|
64
|
+
* alongside flat ones (root/repo). Unreadable entries are skipped.
|
|
65
|
+
*/
|
|
66
|
+
export declare function discoverRepoPathsUnder(root: string): string[];
|
|
61
67
|
/**
|
|
62
68
|
* Suppress passive-repo alerts unless at least one workflow is enabled for the
|
|
63
69
|
* repo — there's nothing to "de-schedule" otherwise, so the nag is noise.
|
|
@@ -10,6 +10,7 @@ import { join } from 'path';
|
|
|
10
10
|
import { scanRepoReports } from './orchestrator-reports.js';
|
|
11
11
|
import { runAgingCycle, getPendingOutcomeAssessments } from './orchestrator-learning.js';
|
|
12
12
|
import { getOrchestratorSessionId } from './orchestrator-manager.js';
|
|
13
|
+
import { getOrchestratorOutbox } from './orchestrator-outbox.js';
|
|
13
14
|
import { REPOS_ROOT, getAgentDisplayName } from './config.js';
|
|
14
15
|
import { loadWorkflowConfig } from './workflow-config.js';
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -117,6 +118,13 @@ export class OrchestratorMonitor {
|
|
|
117
118
|
}
|
|
118
119
|
/** Periodic poll — check for new reports and idle repos. */
|
|
119
120
|
async poll() {
|
|
121
|
+
// Skip the entire poll if the rate-limit circuit breaker is open. This
|
|
122
|
+
// is the dominant source of background API calls; continuing to poke
|
|
123
|
+
// the orchestrator session during a cooldown just deepens the hole.
|
|
124
|
+
if (this.sessions.isRateLimited()) {
|
|
125
|
+
console.log('[orchestrator-monitor] rate-limit circuit breaker open — skipping poll');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
120
128
|
const repoPaths = this.discoverRepoPaths();
|
|
121
129
|
// Check for new reports
|
|
122
130
|
this.checkNewReports(repoPaths);
|
|
@@ -207,41 +215,76 @@ export class OrchestratorMonitor {
|
|
|
207
215
|
}
|
|
208
216
|
/** Deliver a notification to the orchestrator chat session. */
|
|
209
217
|
deliverToOrchestrator(notification) {
|
|
218
|
+
// Don't push more API work at the orchestrator while the rate-limit
|
|
219
|
+
// circuit breaker is open. The notification stays in the buffer and
|
|
220
|
+
// can still be inspected via the API; it just isn't replayed as a
|
|
221
|
+
// chat message until the cooldown expires.
|
|
222
|
+
if (this.sessions.isRateLimited())
|
|
223
|
+
return;
|
|
210
224
|
const orchestratorId = getOrchestratorSessionId(this.sessions);
|
|
211
225
|
if (!orchestratorId)
|
|
212
226
|
return;
|
|
213
227
|
const session = this.sessions.get(orchestratorId);
|
|
214
|
-
if (!session?.claudeProcess?.isAlive())
|
|
228
|
+
if (!session?.claudeProcess?.isAlive()) {
|
|
229
|
+
// Orchestrator not running — hand the notification to the persistent
|
|
230
|
+
// outbox so it is replayed (as a digest) when the session comes back,
|
|
231
|
+
// instead of rotting in the in-memory buffer forever.
|
|
232
|
+
getOrchestratorOutbox().enqueue({
|
|
233
|
+
label: notification.severity.toUpperCase(),
|
|
234
|
+
title: notification.title,
|
|
235
|
+
body: notification.body,
|
|
236
|
+
});
|
|
237
|
+
notification.delivered = true;
|
|
215
238
|
return;
|
|
239
|
+
}
|
|
216
240
|
// Send as a system message that the orchestrator will see and respond to
|
|
217
241
|
const message = `[Agent ${getAgentDisplayName()} Notification — ${notification.severity.toUpperCase()}]\n${notification.title}\n${notification.body}`;
|
|
218
242
|
this.sessions.sendInput(orchestratorId, message);
|
|
219
243
|
notification.delivered = true;
|
|
220
244
|
}
|
|
221
|
-
/** Discover repo paths from REPOS_ROOT. */
|
|
245
|
+
/** Discover repo paths from REPOS_ROOT (see discoverRepoPathsUnder). */
|
|
222
246
|
discoverRepoPaths() {
|
|
223
|
-
|
|
224
|
-
return [];
|
|
225
|
-
try {
|
|
226
|
-
return readdirSync(REPOS_ROOT)
|
|
227
|
-
.map(name => join(REPOS_ROOT, name))
|
|
228
|
-
.filter(p => {
|
|
229
|
-
try {
|
|
230
|
-
return statSync(p).isDirectory() && existsSync(join(p, '.git'));
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
catch {
|
|
238
|
-
return [];
|
|
239
|
-
}
|
|
247
|
+
return discoverRepoPathsUnder(REPOS_ROOT);
|
|
240
248
|
}
|
|
241
249
|
}
|
|
242
250
|
// ---------------------------------------------------------------------------
|
|
243
251
|
// Helpers
|
|
244
252
|
// ---------------------------------------------------------------------------
|
|
253
|
+
/**
|
|
254
|
+
* Discover git repositories under a root directory, recursing one level into
|
|
255
|
+
* non-repo directories so org-style layouts (root/org/repo) are picked up
|
|
256
|
+
* alongside flat ones (root/repo). Unreadable entries are skipped.
|
|
257
|
+
*/
|
|
258
|
+
export function discoverRepoPathsUnder(root) {
|
|
259
|
+
if (!existsSync(root))
|
|
260
|
+
return [];
|
|
261
|
+
const repos = [];
|
|
262
|
+
const scan = (dir, depth) => {
|
|
263
|
+
let entries;
|
|
264
|
+
try {
|
|
265
|
+
entries = readdirSync(dir);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
for (const name of entries) {
|
|
271
|
+
const p = join(dir, name);
|
|
272
|
+
try {
|
|
273
|
+
if (!statSync(p).isDirectory())
|
|
274
|
+
continue;
|
|
275
|
+
if (existsSync(join(p, '.git')))
|
|
276
|
+
repos.push(p);
|
|
277
|
+
else if (depth < 2)
|
|
278
|
+
scan(p, depth + 1);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// unreadable entry — skip
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
scan(root, 1);
|
|
286
|
+
return repos;
|
|
287
|
+
}
|
|
245
288
|
/**
|
|
246
289
|
* Suppress passive-repo alerts unless at least one workflow is enabled for the
|
|
247
290
|
* repo — there's nothing to "de-schedule" otherwise, so the nag is noise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-monitor.js","sourceRoot":"","sources":["../orchestrator-monitor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator-monitor.js","sourceRoot":"","sources":["../orchestrator-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAyB,MAAM,sBAAsB,CAAA;AAehF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAE,aAAa;AACtD,MAAM,sBAAsB,GAAG,EAAE,CAAA;AAEjC,MAAM,OAAO,mBAAmB;IACtB,QAAQ,CAAgB;IACxB,SAAS,GAA0C,IAAI,CAAA;IACvD,UAAU,GAA0C,IAAI,CAAA;IACxD,aAAa,GAA+B,EAAE,CAAA;IAC9C,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,MAAM,GAA8B,IAAI,CAAA;IAEhD,YAAY,QAAwB;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED,qEAAqE;IACrE,SAAS,CAAC,MAAsB;QAC9B,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAoB,EAAE,EAAE;YACnD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,4DAA4D;IAC5D,SAAS,CAAC,MAA0B;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,+BAA+B;IAC/B,KAAK;QACH,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAA;QAEjF,wCAAwC;QACxC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAA;QAEvB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAA;QAClB,CAAC,EAAE,gBAAgB,CAAC,CAAA;QAEpB,8CAA8C;QAC9C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC/B,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACxB,CAAC;IAED,wBAAwB;IACxB,IAAI;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,uCAAuC;IACvC,aAAa,CAAC,GAAa;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IACvF,CAAC;IAED,4EAA4E;IAC5E,WAAW;IACX,4EAA4E;IAE5E,kEAAkE;IAC1D,sBAAsB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QAExB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,IAAI,WAAW,CAAC,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,CAAC,OAAO,aAAa,WAAW,CAAC,SAAS,eAAe,WAAW,CAAC,OAAO,UAAU,CAAC,CAAA;YACvJ,CAAC;YAED,mDAAmD;YACnD,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,eAAe,CAAC;oBACnB,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,uBAAuB;oBAC9B,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,mFAAmF;iBAC3G,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,+DAA+D;IACvD,KAAK,CAAC,WAAW;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;QACD,wBAAwB;IAC1B,CAAC;IAED,4DAA4D;IACpD,KAAK,CAAC,IAAI;QAChB,uEAAuE;QACvE,qEAAqE;QACrE,oEAAoE;QACpE,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAA;YACrF,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAE1C,wBAAwB;QACxB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAE/B,0BAA0B;QAC1B,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAEjC,wBAAwB;IAC1B,CAAC;IAED,gDAAgD;IACxC,eAAe,CAAC,SAAmB;QACzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;YACzC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEzE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;gBAClC,CAAC;gBAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAA;gBACtD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAEhE,IAAI,CAAC,eAAe,CAAC;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,KAAK,EAAE,mBAAmB,QAAQ,EAAE;oBACpC,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,0BAA0B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB;iBAC7F,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,uDAAuD;IAC/C,iBAAiB,CAAC,SAAmB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC,WAAW,CAAA;QAEpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC;oBAAE,SAAQ;gBAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACrC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAQ;gBAEjC,uDAAuD;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBACrC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAQ;gBAEnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;gBAE9F,IAAI,iBAAiB,IAAI,sBAAsB,EAAE,CAAC;oBAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAA;oBACtD,IAAI,CAAC,eAAe,CAAC;wBACnB,QAAQ,EAAE,MAAM;wBAChB,KAAK,EAAE,GAAG,QAAQ,gBAAgB;wBAClC,IAAI,EAAE,kBAAkB,iBAAiB,4DAA4D;qBACtG,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IAC7B,mBAAmB,CAAC,KAAoB;QAC9C,8BAA8B;QAC9B,IAAI,KAAK,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC;gBACnB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,oBAAoB,KAAK,CAAC,IAAI,EAAE;gBACvC,IAAI,EAAE,OAAO,KAAK,CAAC,KAAK,+CAA+C;aACxE,CAAC,CAAA;QACJ,CAAC;QAED,iDAAiD;QACjD,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;YACxC,wEAAwE;QAC1E,CAAC;IACH,CAAC;IAED,0BAA0B;IAClB,eAAe,CAAC,IAAsE;QAC5F,MAAM,YAAY,GAA6B;YAC7C,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACnE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,KAAK;YAChB,GAAG,IAAI;SACR,CAAA;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAErC,8BAA8B;QAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;QACrD,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAA;IAC1C,CAAC;IAED,+DAA+D;IACvD,qBAAqB,CAAC,YAAsC;QAClE,oEAAoE;QACpE,oEAAoE;QACpE,kEAAkE;QAClE,2CAA2C;QAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;YAAE,OAAM;QAEzC,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9D,IAAI,CAAC,cAAc;YAAE,OAAM;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACjD,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;YACvC,qEAAqE;YACrE,sEAAsE;YACtE,sDAAsD;YACtD,qBAAqB,EAAE,CAAC,OAAO,CAAC;gBAC9B,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE;gBAC1C,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,IAAI,EAAE,YAAY,CAAC,IAAI;aACxB,CAAC,CAAA;YACF,YAAY,CAAC,SAAS,GAAG,IAAI,CAAA;YAC7B,OAAM;QACR,CAAC;QAED,yEAAyE;QACzE,MAAM,OAAO,GAAG,UAAU,mBAAmB,EAAE,mBAAmB,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,YAAY,CAAC,KAAK,KAAK,YAAY,CAAC,IAAI,EAAE,CAAA;QACrJ,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QAChD,YAAY,CAAC,SAAS,GAAG,IAAI,CAAA;IAC/B,CAAC;IAED,wEAAwE;IAChE,iBAAiB;QACvB,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC;CACF;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,KAAa,EAAQ,EAAE;QAChD,IAAI,OAAiB,CAAA;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAM;QACR,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;oBAAE,SAAQ;gBACxC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;qBACzC,IAAI,KAAK,GAAG,CAAC;oBAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IACD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACb,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAgB,EAChB,WAA+B;IAE/B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;AACpE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for delivering notification messages to the orchestrator
|
|
3
|
+
* (parent) session via the Claude stdin channel.
|
|
4
|
+
*
|
|
5
|
+
* The rendered format is:
|
|
6
|
+
* [Agent <name> Notification — LABEL]
|
|
7
|
+
* <title>
|
|
8
|
+
* <body>
|
|
9
|
+
*
|
|
10
|
+
* which is the established style used by the proactive monitor and surfaced
|
|
11
|
+
* inside the orchestrator chat.
|
|
12
|
+
*
|
|
13
|
+
* When the recipient session cannot be reached (missing or its Claude
|
|
14
|
+
* process is not running), the notification is queued in the persistent
|
|
15
|
+
* outbox and replayed as a digest once the orchestrator is back.
|
|
16
|
+
*/
|
|
17
|
+
import type { SessionManager } from './session-manager.js';
|
|
18
|
+
export interface OrchestratorNotifyArgs {
|
|
19
|
+
/** Recipient session ID (the parent / orchestrator session). */
|
|
20
|
+
parentSessionId: string;
|
|
21
|
+
/** Bracket-suffix label (e.g. 'ACTION', 'ALERT', 'Child Session Stopped'). */
|
|
22
|
+
label: string;
|
|
23
|
+
/** First body line — short headline. */
|
|
24
|
+
title: string;
|
|
25
|
+
/** Remaining body — multi-line is fine. */
|
|
26
|
+
body: string;
|
|
27
|
+
}
|
|
28
|
+
/** Minimal outbox surface needed by this helper (injectable for tests). */
|
|
29
|
+
export interface NotificationOutbox {
|
|
30
|
+
enqueue(args: {
|
|
31
|
+
label: string;
|
|
32
|
+
title: string;
|
|
33
|
+
body: string;
|
|
34
|
+
}): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Send a notification to the parent session via Claude stdin.
|
|
38
|
+
* Returns true when delivered immediately OR queued in the outbox for
|
|
39
|
+
* replay (the outbox owns delivery from that point on). Returns false only
|
|
40
|
+
* when queueing itself failed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function sendOrchestratorNotification(sessions: SessionManager, args: OrchestratorNotifyArgs, outbox?: NotificationOutbox): boolean;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for delivering notification messages to the orchestrator
|
|
3
|
+
* (parent) session via the Claude stdin channel.
|
|
4
|
+
*
|
|
5
|
+
* The rendered format is:
|
|
6
|
+
* [Agent <name> Notification — LABEL]
|
|
7
|
+
* <title>
|
|
8
|
+
* <body>
|
|
9
|
+
*
|
|
10
|
+
* which is the established style used by the proactive monitor and surfaced
|
|
11
|
+
* inside the orchestrator chat.
|
|
12
|
+
*
|
|
13
|
+
* When the recipient session cannot be reached (missing or its Claude
|
|
14
|
+
* process is not running), the notification is queued in the persistent
|
|
15
|
+
* outbox and replayed as a digest once the orchestrator is back.
|
|
16
|
+
*/
|
|
17
|
+
import { getAgentDisplayName } from './config.js';
|
|
18
|
+
import { getOrchestratorOutbox } from './orchestrator-outbox.js';
|
|
19
|
+
/**
|
|
20
|
+
* Send a notification to the parent session via Claude stdin.
|
|
21
|
+
* Returns true when delivered immediately OR queued in the outbox for
|
|
22
|
+
* replay (the outbox owns delivery from that point on). Returns false only
|
|
23
|
+
* when queueing itself failed.
|
|
24
|
+
*/
|
|
25
|
+
export function sendOrchestratorNotification(sessions, args, outbox = getOrchestratorOutbox()) {
|
|
26
|
+
const session = sessions.get(args.parentSessionId);
|
|
27
|
+
if (session?.claudeProcess?.isAlive()) {
|
|
28
|
+
const message = `[Agent ${getAgentDisplayName()} Notification — ${args.label}]\n${args.title}\n${args.body}`;
|
|
29
|
+
sessions.sendInput(args.parentSessionId, message);
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
// Parent unreachable — queue for replay when the orchestrator comes back.
|
|
33
|
+
try {
|
|
34
|
+
outbox.enqueue({ label: args.label, title: args.title, body: args.body });
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.warn('[orchestrator-notify] failed to queue notification:', err);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=orchestrator-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-notify.js","sourceRoot":"","sources":["../orchestrator-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAkBhE;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAwB,EACxB,IAA4B,EAC5B,SAA6B,qBAAqB,EAAE;IAEpD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAClD,IAAI,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,UAAU,mBAAmB,EAAE,mBAAmB,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5G,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;QACjD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACzE,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAA;QACxE,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent outbox for orchestrator notifications.
|
|
3
|
+
*
|
|
4
|
+
* When a notification cannot be delivered to the orchestrator session
|
|
5
|
+
* (Claude process not running), it is queued here and replayed as a single
|
|
6
|
+
* digest message once the orchestrator is back. The queue survives server
|
|
7
|
+
* restarts via a JSON file in the orchestrator workspace.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionManager } from './session-manager.js';
|
|
10
|
+
export interface OutboxItem {
|
|
11
|
+
id: string;
|
|
12
|
+
label: string;
|
|
13
|
+
title: string;
|
|
14
|
+
body: string;
|
|
15
|
+
queuedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class OrchestratorOutbox {
|
|
18
|
+
private items;
|
|
19
|
+
private filePath;
|
|
20
|
+
private flushTimer;
|
|
21
|
+
constructor(filePath?: string);
|
|
22
|
+
/** Number of queued (undelivered) notifications. */
|
|
23
|
+
size(): number;
|
|
24
|
+
/** Queue a notification for later delivery. Oldest items are dropped at the cap. */
|
|
25
|
+
enqueue(args: {
|
|
26
|
+
label: string;
|
|
27
|
+
title: string;
|
|
28
|
+
body: string;
|
|
29
|
+
}): void;
|
|
30
|
+
/**
|
|
31
|
+
* Attempt to deliver all queued items to the orchestrator session as a
|
|
32
|
+
* single digest message. No-op when the queue is empty, the orchestrator
|
|
33
|
+
* session is missing / not running, or the rate-limit circuit breaker is
|
|
34
|
+
* open. Returns the number of items delivered.
|
|
35
|
+
*/
|
|
36
|
+
flush(sessions: SessionManager): number;
|
|
37
|
+
/** Start a background timer that periodically attempts a flush. */
|
|
38
|
+
startFlusher(sessions: SessionManager, intervalMs?: number): void;
|
|
39
|
+
/** Stop the background flusher. */
|
|
40
|
+
stopFlusher(): void;
|
|
41
|
+
private buildDigest;
|
|
42
|
+
private load;
|
|
43
|
+
private persist;
|
|
44
|
+
}
|
|
45
|
+
/** Get the process-wide outbox instance. */
|
|
46
|
+
export declare function getOrchestratorOutbox(): OrchestratorOutbox;
|
|
47
|
+
/** Test-only: replace the singleton (pass null to reset). */
|
|
48
|
+
export declare function setOrchestratorOutboxForTest(outbox: OrchestratorOutbox | null): void;
|