@agentmeshhq/agent 0.4.16 → 0.4.20
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/__tests__/attach.test.d.ts +1 -0
- package/dist/__tests__/attach.test.js +200 -0
- package/dist/__tests__/attach.test.js.map +1 -0
- package/dist/__tests__/auth-guard.integration.test.js +1 -1
- package/dist/__tests__/auth-guard.integration.test.js.map +1 -1
- package/dist/__tests__/auth-guard.test.js +3 -3
- package/dist/__tests__/auth-guard.test.js.map +1 -1
- package/dist/__tests__/bootstrap.test.js +23 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -1
- package/dist/__tests__/daemon-hub-resilience.test.js +2 -2
- package/dist/__tests__/daemon-hub-resilience.test.js.map +1 -1
- package/dist/__tests__/evicted-cleanup.test.js.map +1 -1
- package/dist/__tests__/injection-verify.test.d.ts +1 -0
- package/dist/__tests__/injection-verify.test.js +93 -0
- package/dist/__tests__/injection-verify.test.js.map +1 -0
- package/dist/__tests__/injector.test.js +124 -4
- package/dist/__tests__/injector.test.js.map +1 -1
- package/dist/__tests__/list.test.d.ts +1 -0
- package/dist/__tests__/list.test.js +62 -0
- package/dist/__tests__/list.test.js.map +1 -0
- package/dist/__tests__/opencode-serve.test.d.ts +1 -0
- package/dist/__tests__/opencode-serve.test.js +54 -0
- package/dist/__tests__/opencode-serve.test.js.map +1 -0
- package/dist/__tests__/opencode-session-policy.test.d.ts +1 -0
- package/dist/__tests__/opencode-session-policy.test.js +61 -0
- package/dist/__tests__/opencode-session-policy.test.js.map +1 -0
- package/dist/__tests__/opencode-session.test.d.ts +1 -0
- package/dist/__tests__/opencode-session.test.js +178 -0
- package/dist/__tests__/opencode-session.test.js.map +1 -0
- package/dist/__tests__/registry.register.test.js +16 -0
- package/dist/__tests__/registry.register.test.js.map +1 -1
- package/dist/__tests__/relay.test.d.ts +1 -0
- package/dist/__tests__/relay.test.js +136 -0
- package/dist/__tests__/relay.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +17 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/session-recovery.test.js +214 -11
- package/dist/__tests__/session-recovery.test.js.map +1 -1
- package/dist/__tests__/shared-resource-guards.test.js +1 -4
- package/dist/__tests__/shared-resource-guards.test.js.map +1 -1
- package/dist/__tests__/start-team-id.test.js +22 -0
- package/dist/__tests__/start-team-id.test.js.map +1 -1
- package/dist/__tests__/startup-diagnostics.test.d.ts +1 -0
- package/dist/__tests__/startup-diagnostics.test.js +250 -0
- package/dist/__tests__/startup-diagnostics.test.js.map +1 -0
- package/dist/__tests__/tmux-runtime.test.js +13 -0
- package/dist/__tests__/tmux-runtime.test.js.map +1 -1
- package/dist/__tests__/token-rejection-recovery.test.js +52 -0
- package/dist/__tests__/token-rejection-recovery.test.js.map +1 -1
- package/dist/__tests__/watcher-queue.test.d.ts +1 -0
- package/dist/__tests__/watcher-queue.test.js +90 -0
- package/dist/__tests__/watcher-queue.test.js.map +1 -0
- package/dist/__tests__/watcher-state.test.d.ts +1 -0
- package/dist/__tests__/watcher-state.test.js +159 -0
- package/dist/__tests__/watcher-state.test.js.map +1 -0
- package/dist/cli/attach.d.ts +1 -1
- package/dist/cli/attach.js +125 -2
- package/dist/cli/attach.js.map +1 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/commands.d.ts +32 -0
- package/dist/cli/commands.js +165 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +97 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/list.js +26 -2
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/relay.d.ts +4 -0
- package/dist/cli/relay.js +165 -3
- package/dist/cli/relay.js.map +1 -1
- package/dist/cli/start.d.ts +9 -1
- package/dist/cli/start.js +8 -0
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.js +21 -8
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/test.js +12 -1
- package/dist/cli/test.js.map +1 -1
- package/dist/config/schema.d.ts +17 -1
- package/dist/core/auth-guard.js +2 -2
- package/dist/core/auth-guard.js.map +1 -1
- package/dist/core/chat-output-parser.d.ts +24 -0
- package/dist/core/chat-output-parser.js +150 -0
- package/dist/core/chat-output-parser.js.map +1 -0
- package/dist/core/chat-output-parser.test.d.ts +7 -0
- package/dist/core/chat-output-parser.test.js +151 -0
- package/dist/core/chat-output-parser.test.js.map +1 -0
- package/dist/core/daemon/bootstrap.d.ts +8 -0
- package/dist/core/daemon/bootstrap.js +6 -1
- package/dist/core/daemon/bootstrap.js.map +1 -1
- package/dist/core/daemon/crash-log.js +5 -0
- package/dist/core/daemon/crash-log.js.map +1 -1
- package/dist/core/daemon/injection-verify.d.ts +25 -0
- package/dist/core/daemon/injection-verify.js +94 -0
- package/dist/core/daemon/injection-verify.js.map +1 -0
- package/dist/core/daemon/roles.d.ts +2 -2
- package/dist/core/daemon/roles.js +3 -0
- package/dist/core/daemon/roles.js.map +1 -1
- package/dist/core/daemon/session-recovery.d.ts +18 -1
- package/dist/core/daemon/session-recovery.js +89 -5
- package/dist/core/daemon/session-recovery.js.map +1 -1
- package/dist/core/daemon/startup-diagnostics.d.ts +76 -0
- package/dist/core/daemon/startup-diagnostics.js +277 -0
- package/dist/core/daemon/startup-diagnostics.js.map +1 -0
- package/dist/core/daemon/state.d.ts +8 -0
- package/dist/core/daemon/state.js +8 -0
- package/dist/core/daemon/state.js.map +1 -1
- package/dist/core/daemon/tmux-session.d.ts +4 -0
- package/dist/core/daemon/tmux-session.js +9 -1
- package/dist/core/daemon/tmux-session.js.map +1 -1
- package/dist/core/daemon/watcher-loop.d.ts +27 -0
- package/dist/core/daemon/watcher-loop.js +134 -0
- package/dist/core/daemon/watcher-loop.js.map +1 -0
- package/dist/core/daemon/watcher-queue.d.ts +33 -0
- package/dist/core/daemon/watcher-queue.js +71 -0
- package/dist/core/daemon/watcher-queue.js.map +1 -0
- package/dist/core/daemon/watcher-state.d.ts +66 -0
- package/dist/core/daemon/watcher-state.js +151 -0
- package/dist/core/daemon/watcher-state.js.map +1 -0
- package/dist/core/daemon/workspace.js +10 -2
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +22 -1
- package/dist/core/daemon.js +289 -20
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/handoff-sla.js +1 -1
- package/dist/core/handoff-sla.js.map +1 -1
- package/dist/core/injector.d.ts +2 -0
- package/dist/core/injector.js +227 -32
- package/dist/core/injector.js.map +1 -1
- package/dist/core/opencode-serve.d.ts +26 -0
- package/dist/core/opencode-serve.js +97 -0
- package/dist/core/opencode-serve.js.map +1 -0
- package/dist/core/opencode-session-policy.d.ts +10 -0
- package/dist/core/opencode-session-policy.js +10 -0
- package/dist/core/opencode-session-policy.js.map +1 -0
- package/dist/core/opencode-session.d.ts +12 -0
- package/dist/core/opencode-session.js +165 -0
- package/dist/core/opencode-session.js.map +1 -0
- package/dist/core/registry.d.ts +2 -1
- package/dist/core/registry.js +3 -2
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner/build.js +7 -31
- package/dist/core/runner/build.js.map +1 -1
- package/dist/core/runner/detect.js +2 -8
- package/dist/core/runner/detect.js.map +1 -1
- package/dist/core/runner/index.d.ts +3 -1
- package/dist/core/runner/index.js +2 -0
- package/dist/core/runner/index.js.map +1 -1
- package/dist/core/runner/kimi-models.d.ts +4 -0
- package/dist/core/runner/kimi-models.js +24 -0
- package/dist/core/runner/kimi-models.js.map +1 -0
- package/dist/core/runner/registry.d.ts +3 -0
- package/dist/core/runner/registry.js +75 -0
- package/dist/core/runner/registry.js.map +1 -0
- package/dist/core/runner/types.d.ts +17 -1
- package/dist/core/tmux-runtime.d.ts +2 -1
- package/dist/core/tmux-runtime.js +17 -1
- package/dist/core/tmux-runtime.js.map +1 -1
- package/dist/core/tmux.d.ts +4 -0
- package/dist/core/tmux.js +54 -11
- package/dist/core/tmux.js.map +1 -1
- package/dist/runtime/adapters/opencode.d.ts +63 -0
- package/dist/runtime/adapters/opencode.js +358 -0
- package/dist/runtime/adapters/opencode.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.d.ts +23 -0
- package/dist/runtime/adapters/tmux-fallback.js +148 -0
- package/dist/runtime/adapters/tmux-fallback.js.map +1 -0
- package/dist/runtime/adapters/tmux-fallback.test.d.ts +4 -0
- package/dist/runtime/adapters/tmux-fallback.test.js +91 -0
- package/dist/runtime/adapters/tmux-fallback.test.js.map +1 -0
- package/dist/runtime/index.d.ts +146 -0
- package/dist/runtime/index.js +191 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/registry.d.ts +53 -0
- package/dist/runtime/registry.js +112 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/registry.test.d.ts +4 -0
- package/dist/runtime/registry.test.js +69 -0
- package/dist/runtime/registry.test.js.map +1 -0
- package/dist/runtime/types.d.ts +158 -0
- package/dist/runtime/types.js +8 -0
- package/dist/runtime/types.js.map +1 -0
- package/package.json +11 -12
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-powered watcher loop.
|
|
3
|
+
*
|
|
4
|
+
* Two event sources feed the tick queue:
|
|
5
|
+
* 1. Scheduled ticker — every 2 min, full state fetch
|
|
6
|
+
* 2. WebSocket events — immediate reactive ticks (coalesced while LLM is busy)
|
|
7
|
+
*
|
|
8
|
+
* A consumer loop polls every 5s:
|
|
9
|
+
* - If LLM is processing → check tmux for completion
|
|
10
|
+
* - If idle and queue has items → dequeue, fetch state, inject into tmux
|
|
11
|
+
*
|
|
12
|
+
* Epic #883
|
|
13
|
+
*/
|
|
14
|
+
import { captureSessionOutput, sendKeys } from "../tmux.js";
|
|
15
|
+
import { fetchWatcherState, formatStateForLlm } from "./watcher-state.js";
|
|
16
|
+
const TICK_INTERVAL_MS = 120_000; // 2 minutes
|
|
17
|
+
const CONSUMER_POLL_MS = 5_000; // 5 seconds
|
|
18
|
+
const IDLE_THRESHOLD_MS = 10_000; // 10s no output change → tick complete
|
|
19
|
+
const HARD_TIMEOUT_MS = 180_000; // 3 min max per tick
|
|
20
|
+
/**
|
|
21
|
+
* Detect whether the LLM has finished processing by checking tmux output
|
|
22
|
+
* stability. Returns true if the output hasn't changed for IDLE_THRESHOLD_MS.
|
|
23
|
+
*/
|
|
24
|
+
function detectTickComplete(agentName, lastOutputSnapshot, lastOutputChangeAt) {
|
|
25
|
+
const current = captureSessionOutput(agentName, 30);
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
if (current !== lastOutputSnapshot) {
|
|
28
|
+
// Output changed — LLM is still working
|
|
29
|
+
return { complete: false, currentOutput: current };
|
|
30
|
+
}
|
|
31
|
+
// Output stable — check if long enough
|
|
32
|
+
if (now - lastOutputChangeAt >= IDLE_THRESHOLD_MS) {
|
|
33
|
+
return { complete: true, currentOutput: current };
|
|
34
|
+
}
|
|
35
|
+
return { complete: false, currentOutput: current };
|
|
36
|
+
}
|
|
37
|
+
export function startWatcherLoop(ctx, queue) {
|
|
38
|
+
let lastInjectionAt = 0;
|
|
39
|
+
let lastOutputSnapshot = null;
|
|
40
|
+
let lastOutputChangeAt = 0;
|
|
41
|
+
let stopped = false;
|
|
42
|
+
// --- Scheduled ticker: enqueue a scheduled tick every 2 min ---
|
|
43
|
+
const scheduledTimer = setInterval(() => {
|
|
44
|
+
if (stopped)
|
|
45
|
+
return;
|
|
46
|
+
queue.enqueue("scheduled", ["interval"]);
|
|
47
|
+
ctx.log("[watcher-loop] Scheduled tick enqueued");
|
|
48
|
+
}, TICK_INTERVAL_MS);
|
|
49
|
+
// Enqueue the first tick immediately
|
|
50
|
+
queue.enqueue("scheduled", ["startup"]);
|
|
51
|
+
// --- Consumer loop: process one tick at a time ---
|
|
52
|
+
const consumerTimer = setInterval(async () => {
|
|
53
|
+
if (stopped)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
if (queue.isProcessing()) {
|
|
57
|
+
// Check if LLM finished processing
|
|
58
|
+
const elapsed = Date.now() - lastInjectionAt;
|
|
59
|
+
if (elapsed >= HARD_TIMEOUT_MS) {
|
|
60
|
+
ctx.log(`[watcher-loop] Hard timeout (${Math.round(elapsed / 1000)}s) — forcing tick complete`);
|
|
61
|
+
queue.markComplete();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const { complete, currentOutput } = detectTickComplete(ctx.agentName, lastOutputSnapshot, lastOutputChangeAt);
|
|
65
|
+
if (currentOutput !== lastOutputSnapshot) {
|
|
66
|
+
lastOutputSnapshot = currentOutput;
|
|
67
|
+
lastOutputChangeAt = Date.now();
|
|
68
|
+
}
|
|
69
|
+
if (complete) {
|
|
70
|
+
ctx.log("[watcher-loop] Tick complete (output idle)");
|
|
71
|
+
queue.markComplete();
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Not processing — check if there's a tick to dequeue
|
|
76
|
+
if (queue.size() === 0)
|
|
77
|
+
return;
|
|
78
|
+
const tick = queue.dequeue();
|
|
79
|
+
if (!tick)
|
|
80
|
+
return;
|
|
81
|
+
const tickNumber = queue.nextTickNumber();
|
|
82
|
+
ctx.log(`[watcher-loop] Processing tick #${tickNumber} (${tick.source}: ${tick.triggeredBy.join(", ")})`);
|
|
83
|
+
// Fetch fresh state from hub
|
|
84
|
+
const state = await fetchWatcherState(ctx);
|
|
85
|
+
// Format and inject into tmux
|
|
86
|
+
const message = formatStateForLlm(state, tickNumber, tick.triggeredBy);
|
|
87
|
+
const sent = sendKeys(ctx.agentName, message);
|
|
88
|
+
if (!sent) {
|
|
89
|
+
ctx.log("[watcher-loop] Failed to inject tick into tmux — marking complete");
|
|
90
|
+
queue.markComplete();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Track for completion detection
|
|
94
|
+
lastInjectionAt = Date.now();
|
|
95
|
+
lastOutputSnapshot = captureSessionOutput(ctx.agentName, 30);
|
|
96
|
+
lastOutputChangeAt = Date.now();
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
ctx.log(`[watcher-loop] Consumer error: ${err.message}`);
|
|
100
|
+
// If processing, mark complete to avoid stuck state
|
|
101
|
+
if (queue.isProcessing()) {
|
|
102
|
+
queue.markComplete();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, CONSUMER_POLL_MS);
|
|
106
|
+
return {
|
|
107
|
+
stop() {
|
|
108
|
+
stopped = true;
|
|
109
|
+
clearInterval(scheduledTimer);
|
|
110
|
+
clearInterval(consumerTimer);
|
|
111
|
+
ctx.log("[watcher-loop] Stopped");
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Intercept WebSocket events relevant to the watcher and enqueue reactive ticks.
|
|
117
|
+
* Returns true if the event was consumed (watcher-relevant), false otherwise.
|
|
118
|
+
*/
|
|
119
|
+
export function handleWatcherWebSocketEvent(event, queue) {
|
|
120
|
+
const watcherEvents = new Set([
|
|
121
|
+
"handoff.received",
|
|
122
|
+
"handoff.created",
|
|
123
|
+
"handoffs.updated",
|
|
124
|
+
"claims.updated",
|
|
125
|
+
"blockers.updated",
|
|
126
|
+
"blocker.resolved",
|
|
127
|
+
]);
|
|
128
|
+
if (watcherEvents.has(event.type)) {
|
|
129
|
+
queue.enqueue("reactive", [event.type]);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=watcher-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher-loop.js","sourceRoot":"","sources":["../../../src/core/daemon/watcher-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory tick queue for the LLM-powered watcher.
|
|
3
|
+
*
|
|
4
|
+
* Coalesces rapid WebSocket events into a single reactive tick and replaces
|
|
5
|
+
* stale scheduled ticks so the LLM always gets the freshest state.
|
|
6
|
+
*
|
|
7
|
+
* Epic #883
|
|
8
|
+
*/
|
|
9
|
+
export type TickSource = "scheduled" | "reactive";
|
|
10
|
+
export interface TickItem {
|
|
11
|
+
source: TickSource;
|
|
12
|
+
triggeredBy: string[];
|
|
13
|
+
queuedAt: Date;
|
|
14
|
+
}
|
|
15
|
+
export declare class WatcherTickQueue {
|
|
16
|
+
private queue;
|
|
17
|
+
private processing;
|
|
18
|
+
private tickCounter;
|
|
19
|
+
/**
|
|
20
|
+
* Enqueue a tick with deduplication:
|
|
21
|
+
* - Reactive + reactive → coalesce (merge triggeredBy, keep latest queuedAt)
|
|
22
|
+
* - Scheduled + scheduled → replace (only latest snapshot matters)
|
|
23
|
+
* - Otherwise → push new item
|
|
24
|
+
*/
|
|
25
|
+
enqueue(source: TickSource, triggeredBy: string[]): void;
|
|
26
|
+
dequeue(): TickItem | null;
|
|
27
|
+
markComplete(): void;
|
|
28
|
+
isProcessing(): boolean;
|
|
29
|
+
size(): number;
|
|
30
|
+
nextTickNumber(): number;
|
|
31
|
+
/** Reset for testing */
|
|
32
|
+
clear(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory tick queue for the LLM-powered watcher.
|
|
3
|
+
*
|
|
4
|
+
* Coalesces rapid WebSocket events into a single reactive tick and replaces
|
|
5
|
+
* stale scheduled ticks so the LLM always gets the freshest state.
|
|
6
|
+
*
|
|
7
|
+
* Epic #883
|
|
8
|
+
*/
|
|
9
|
+
const MAX_QUEUE_SIZE = 10;
|
|
10
|
+
export class WatcherTickQueue {
|
|
11
|
+
queue = [];
|
|
12
|
+
processing = false;
|
|
13
|
+
tickCounter = 0;
|
|
14
|
+
/**
|
|
15
|
+
* Enqueue a tick with deduplication:
|
|
16
|
+
* - Reactive + reactive → coalesce (merge triggeredBy, keep latest queuedAt)
|
|
17
|
+
* - Scheduled + scheduled → replace (only latest snapshot matters)
|
|
18
|
+
* - Otherwise → push new item
|
|
19
|
+
*/
|
|
20
|
+
enqueue(source, triggeredBy) {
|
|
21
|
+
const last = this.queue.at(-1);
|
|
22
|
+
if (last && source === "reactive" && last.source === "reactive") {
|
|
23
|
+
// Coalesce: merge trigger reasons, update timestamp
|
|
24
|
+
for (const t of triggeredBy) {
|
|
25
|
+
if (!last.triggeredBy.includes(t)) {
|
|
26
|
+
last.triggeredBy.push(t);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
last.queuedAt = new Date();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (last && source === "scheduled" && last.source === "scheduled") {
|
|
33
|
+
// Replace stale scheduled tick
|
|
34
|
+
last.triggeredBy = triggeredBy;
|
|
35
|
+
last.queuedAt = new Date();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (this.queue.length >= MAX_QUEUE_SIZE) {
|
|
39
|
+
// Drop oldest to prevent unbounded growth
|
|
40
|
+
this.queue.shift();
|
|
41
|
+
}
|
|
42
|
+
this.queue.push({ source, triggeredBy, queuedAt: new Date() });
|
|
43
|
+
}
|
|
44
|
+
dequeue() {
|
|
45
|
+
const item = this.queue.shift() ?? null;
|
|
46
|
+
if (item) {
|
|
47
|
+
this.processing = true;
|
|
48
|
+
}
|
|
49
|
+
return item;
|
|
50
|
+
}
|
|
51
|
+
markComplete() {
|
|
52
|
+
this.processing = false;
|
|
53
|
+
}
|
|
54
|
+
isProcessing() {
|
|
55
|
+
return this.processing;
|
|
56
|
+
}
|
|
57
|
+
size() {
|
|
58
|
+
return this.queue.length;
|
|
59
|
+
}
|
|
60
|
+
nextTickNumber() {
|
|
61
|
+
this.tickCounter += 1;
|
|
62
|
+
return this.tickCounter;
|
|
63
|
+
}
|
|
64
|
+
/** Reset for testing */
|
|
65
|
+
clear() {
|
|
66
|
+
this.queue = [];
|
|
67
|
+
this.processing = false;
|
|
68
|
+
this.tickCounter = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=watcher-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher-queue.js","sourceRoot":"","sources":["../../../src/core/daemon/watcher-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,OAAO,gBAAgB;IACnB,KAAK,GAAe,EAAE,CAAC;IACvB,UAAU,GAAG,KAAK,CAAC;IACnB,WAAW,GAAG,CAAC,CAAC;IAExB;;;;;OAKG;IACH,OAAO,CAAC,MAAkB,EAAE,WAAqB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,IAAI,IAAI,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAChE,oDAAoD;YACpD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,IAAI,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClE,+BAA+B;YAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;YACxC,0CAA0C;YAC1C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,wBAAwB;IACxB,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetches project state from hub APIs and formats it for LLM injection.
|
|
3
|
+
*
|
|
4
|
+
* Each tick sends a full snapshot — the LLM reasons from a single tick
|
|
5
|
+
* without needing conversation history.
|
|
6
|
+
*
|
|
7
|
+
* Epic #883
|
|
8
|
+
*/
|
|
9
|
+
export interface WatcherContext {
|
|
10
|
+
hubUrl: string;
|
|
11
|
+
token: string;
|
|
12
|
+
workspace: string;
|
|
13
|
+
teamId: string;
|
|
14
|
+
agentName: string;
|
|
15
|
+
log: (msg: string) => void;
|
|
16
|
+
}
|
|
17
|
+
interface HandoffSnapshot {
|
|
18
|
+
handoff_id: string;
|
|
19
|
+
from_agent_id: string | null;
|
|
20
|
+
to_agent_id: string | null;
|
|
21
|
+
scope: string;
|
|
22
|
+
status: string;
|
|
23
|
+
created_at: string;
|
|
24
|
+
accepted_at: string | null;
|
|
25
|
+
}
|
|
26
|
+
interface ClaimSnapshot {
|
|
27
|
+
claim_id: string;
|
|
28
|
+
agent_id: string;
|
|
29
|
+
scope: string;
|
|
30
|
+
paths: string[];
|
|
31
|
+
status: string;
|
|
32
|
+
expires_at: string;
|
|
33
|
+
}
|
|
34
|
+
interface BlockerSnapshot {
|
|
35
|
+
blocker_id: string;
|
|
36
|
+
agent_id: string;
|
|
37
|
+
scope: string;
|
|
38
|
+
category: string;
|
|
39
|
+
description: string;
|
|
40
|
+
status: string;
|
|
41
|
+
created_at: string;
|
|
42
|
+
}
|
|
43
|
+
interface AgentSnapshot {
|
|
44
|
+
agent_id: string;
|
|
45
|
+
display_name: string;
|
|
46
|
+
status: string;
|
|
47
|
+
model: string;
|
|
48
|
+
last_heartbeat_at: string | null;
|
|
49
|
+
metadata?: Record<string, unknown>;
|
|
50
|
+
}
|
|
51
|
+
interface TeamMemberSnapshot {
|
|
52
|
+
agent_id: string;
|
|
53
|
+
display_name: string;
|
|
54
|
+
role: string;
|
|
55
|
+
}
|
|
56
|
+
export interface WatcherStatePayload {
|
|
57
|
+
fetchedAt: string;
|
|
58
|
+
handoffs: HandoffSnapshot[];
|
|
59
|
+
claims: ClaimSnapshot[];
|
|
60
|
+
blockers: BlockerSnapshot[];
|
|
61
|
+
agents: AgentSnapshot[];
|
|
62
|
+
teamMembers: TeamMemberSnapshot[];
|
|
63
|
+
}
|
|
64
|
+
export declare function fetchWatcherState(ctx: WatcherContext): Promise<WatcherStatePayload>;
|
|
65
|
+
export declare function formatStateForLlm(state: WatcherStatePayload, tickNumber: number, triggerReasons: string[]): string;
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetches project state from hub APIs and formats it for LLM injection.
|
|
3
|
+
*
|
|
4
|
+
* Each tick sends a full snapshot — the LLM reasons from a single tick
|
|
5
|
+
* without needing conversation history.
|
|
6
|
+
*
|
|
7
|
+
* Epic #883
|
|
8
|
+
*/
|
|
9
|
+
async function fetchJson(url, token) {
|
|
10
|
+
const res = await fetch(url, {
|
|
11
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
12
|
+
});
|
|
13
|
+
if (!res.ok) {
|
|
14
|
+
throw new Error(`${url} returned ${res.status}`);
|
|
15
|
+
}
|
|
16
|
+
return res.json();
|
|
17
|
+
}
|
|
18
|
+
export async function fetchWatcherState(ctx) {
|
|
19
|
+
const base = `${ctx.hubUrl}/api/v1/workspaces/${ctx.workspace}`;
|
|
20
|
+
const [handoffsRes, claimsRes, blockersRes, agentsRes, membersRes] = await Promise.all([
|
|
21
|
+
fetchJson(`${base}/handoffs?limit=50`, ctx.token).catch(() => ({
|
|
22
|
+
data: [],
|
|
23
|
+
})),
|
|
24
|
+
fetchJson(`${base}/claims`, ctx.token).catch(() => ({
|
|
25
|
+
data: [],
|
|
26
|
+
})),
|
|
27
|
+
fetchJson(`${base}/blockers`, ctx.token).catch(() => ({
|
|
28
|
+
data: [],
|
|
29
|
+
})),
|
|
30
|
+
fetchJson(`${base}/agents`, ctx.token).catch(() => ({
|
|
31
|
+
data: [],
|
|
32
|
+
})),
|
|
33
|
+
fetchJson(`${ctx.hubUrl}/api/v1/workspaces/${ctx.workspace}/teams/${ctx.teamId}/members`, ctx.token).catch(() => ({ data: [] })),
|
|
34
|
+
]);
|
|
35
|
+
return {
|
|
36
|
+
fetchedAt: new Date().toISOString(),
|
|
37
|
+
handoffs: handoffsRes.data,
|
|
38
|
+
claims: claimsRes.data.filter((c) => c.status === "active"),
|
|
39
|
+
blockers: blockersRes.data.filter((b) => b.status === "open"),
|
|
40
|
+
agents: agentsRes.data,
|
|
41
|
+
teamMembers: membersRes.data,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function timeSince(iso) {
|
|
45
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
46
|
+
const seconds = Math.floor(ms / 1000);
|
|
47
|
+
if (seconds < 60)
|
|
48
|
+
return `${seconds}s`;
|
|
49
|
+
if (seconds < 3600)
|
|
50
|
+
return `${Math.floor(seconds / 60)}m`;
|
|
51
|
+
if (seconds < 86400)
|
|
52
|
+
return `${Math.floor(seconds / 3600)}h`;
|
|
53
|
+
return `${Math.floor(seconds / 86400)}d`;
|
|
54
|
+
}
|
|
55
|
+
function agentHealth(agent) {
|
|
56
|
+
if (!agent.last_heartbeat_at)
|
|
57
|
+
return "unknown";
|
|
58
|
+
const ago = (Date.now() - new Date(agent.last_heartbeat_at).getTime()) / 1000;
|
|
59
|
+
if (ago < 15)
|
|
60
|
+
return "online";
|
|
61
|
+
if (ago < 45)
|
|
62
|
+
return "idle";
|
|
63
|
+
if (ago < 120)
|
|
64
|
+
return "stale";
|
|
65
|
+
return "offline";
|
|
66
|
+
}
|
|
67
|
+
export function formatStateForLlm(state, tickNumber, triggerReasons) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
lines.push(`[AgentMesh Watcher] === TICK #${tickNumber} === ${state.fetchedAt}`);
|
|
70
|
+
lines.push(`Triggered by: ${triggerReasons.join(" + ")}`);
|
|
71
|
+
lines.push("");
|
|
72
|
+
// Build agent ID → display name lookup
|
|
73
|
+
const agentNames = new Map();
|
|
74
|
+
for (const a of state.agents) {
|
|
75
|
+
agentNames.set(a.agent_id, a.display_name);
|
|
76
|
+
}
|
|
77
|
+
const resolveName = (id) => {
|
|
78
|
+
if (!id)
|
|
79
|
+
return "-";
|
|
80
|
+
return agentNames.get(id) ?? id.slice(0, 12);
|
|
81
|
+
};
|
|
82
|
+
// Handoffs — only non-completed
|
|
83
|
+
const activeHandoffs = state.handoffs.filter((h) => h.status !== "completed");
|
|
84
|
+
lines.push(`## Handoffs (${activeHandoffs.length} active)`);
|
|
85
|
+
if (activeHandoffs.length === 0) {
|
|
86
|
+
lines.push("No active handoffs.");
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
lines.push("| ID | From | To | Status | Age |");
|
|
90
|
+
lines.push("|---|---|---|---|---|");
|
|
91
|
+
for (const h of activeHandoffs.slice(0, 20)) {
|
|
92
|
+
const age = h.created_at ? timeSince(h.created_at) : "?";
|
|
93
|
+
lines.push(`| ${h.handoff_id.slice(0, 12)} | ${resolveName(h.from_agent_id)} | ${resolveName(h.to_agent_id)} | ${h.status} | ${age} |`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lines.push("");
|
|
97
|
+
// Agents
|
|
98
|
+
lines.push(`## Agents (${state.agents.length})`);
|
|
99
|
+
if (state.agents.length > 0) {
|
|
100
|
+
lines.push("| Name | Status | Health | Last Seen |");
|
|
101
|
+
lines.push("|---|---|---|---|");
|
|
102
|
+
for (const a of state.agents.slice(0, 20)) {
|
|
103
|
+
const health = agentHealth(a);
|
|
104
|
+
const lastSeen = a.last_heartbeat_at ? timeSince(a.last_heartbeat_at) : "never";
|
|
105
|
+
lines.push(`| ${a.display_name} | ${a.status} | ${health} | ${lastSeen} ago |`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
lines.push("");
|
|
109
|
+
// Team members
|
|
110
|
+
if (state.teamMembers.length > 0) {
|
|
111
|
+
lines.push(`## Team Members (${state.teamMembers.length})`);
|
|
112
|
+
for (const m of state.teamMembers) {
|
|
113
|
+
lines.push(`- ${m.display_name} (${m.role})`);
|
|
114
|
+
}
|
|
115
|
+
lines.push("");
|
|
116
|
+
}
|
|
117
|
+
// Blockers
|
|
118
|
+
lines.push(`## Blockers (${state.blockers.length} open)`);
|
|
119
|
+
if (state.blockers.length === 0) {
|
|
120
|
+
lines.push("No open blockers.");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
for (const b of state.blockers.slice(0, 10)) {
|
|
124
|
+
const age = b.created_at ? timeSince(b.created_at) : "?";
|
|
125
|
+
lines.push(`- ${b.blocker_id.slice(0, 12)}: "${b.description.slice(0, 80)}" (${b.category}, ${age}, agent: ${resolveName(b.agent_id)})`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
lines.push("");
|
|
129
|
+
// Claims
|
|
130
|
+
lines.push(`## Claims (${state.claims.length} active)`);
|
|
131
|
+
if (state.claims.length === 0) {
|
|
132
|
+
lines.push("No active claims.");
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
for (const c of state.claims.slice(0, 10)) {
|
|
136
|
+
lines.push(`- ${resolveName(c.agent_id)}: ${c.paths.join(", ")} (${c.scope})`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
lines.push("");
|
|
140
|
+
// Available actions
|
|
141
|
+
lines.push("## Available Actions");
|
|
142
|
+
lines.push('- `agentmesh nudge <agent-name> "<message>"` — nudge an agent');
|
|
143
|
+
lines.push("- `agentmesh handoff reassign <handoff-id> --to <agent-id>` — reassign a handoff");
|
|
144
|
+
lines.push("- `agentmesh handoff complete <handoff-id>` — mark handoff done");
|
|
145
|
+
lines.push('- `agentmesh blocker create "<description>"` — create a blocker');
|
|
146
|
+
lines.push("- `agentmesh claims release <claim-id>` — release a stale claim");
|
|
147
|
+
lines.push("");
|
|
148
|
+
lines.push("Analyze the above state and take any necessary actions. When done, wait for the next tick.");
|
|
149
|
+
return lines.join("\n");
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=watcher-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher-state.js","sourceRoot":"","sources":["../../../src/core/daemon/watcher-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,16 @@ function shouldAutoStashOnPullError(message) {
|
|
|
8
8
|
export function updateWorkspaceFromRemote(workspacePath, defaultBranch) {
|
|
9
9
|
try {
|
|
10
10
|
execSync("git fetch origin", { cwd: workspacePath, stdio: "pipe", timeout: 30_000 });
|
|
11
|
-
execSync(`git checkout ${defaultBranch}`, {
|
|
12
|
-
|
|
11
|
+
execSync(`git checkout ${defaultBranch}`, {
|
|
12
|
+
cwd: workspacePath,
|
|
13
|
+
stdio: "pipe",
|
|
14
|
+
timeout: 30_000,
|
|
15
|
+
});
|
|
16
|
+
execSync(`git pull origin ${defaultBranch}`, {
|
|
17
|
+
cwd: workspacePath,
|
|
18
|
+
stdio: "pipe",
|
|
19
|
+
timeout: 30_000,
|
|
20
|
+
});
|
|
13
21
|
return { ok: true, autoStashed: false };
|
|
14
22
|
}
|
|
15
23
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/core/daemon/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,SAAS,0BAA0B,CAAC,OAAe;IACjD,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACjD,OAAO,CAAC,QAAQ,CAAC,gEAAgE,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,aAAqB,EACrB,aAAqB;IAErB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,QAAQ,CAAC,gBAAgB,aAAa,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/core/daemon/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/core/daemon.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface DaemonOptions {
|
|
|
12
12
|
autoSetup?: boolean;
|
|
13
13
|
/** Run opencode serve instead of tmux TUI (for Integration Service) */
|
|
14
14
|
serve?: boolean;
|
|
15
|
-
/** Port for opencode serve (default:
|
|
15
|
+
/** Port for opencode serve (default: 4096) */
|
|
16
16
|
servePort?: number;
|
|
17
17
|
/** Run agent in Docker sandbox container */
|
|
18
18
|
sandbox?: boolean;
|
|
@@ -49,7 +49,12 @@ export declare class AgentDaemon {
|
|
|
49
49
|
private autoSetup;
|
|
50
50
|
private serveMode;
|
|
51
51
|
private servePort;
|
|
52
|
+
private serveHostname;
|
|
53
|
+
private servePublicUrl?;
|
|
54
|
+
private serveUsername?;
|
|
55
|
+
private servePasswordEnv?;
|
|
52
56
|
private serveProcess;
|
|
57
|
+
private serveHealth;
|
|
53
58
|
private sandboxMode;
|
|
54
59
|
private sandboxImage;
|
|
55
60
|
private sandboxCpu;
|
|
@@ -62,8 +67,11 @@ export declare class AgentDaemon {
|
|
|
62
67
|
private autonomous;
|
|
63
68
|
private healthCheckInterval;
|
|
64
69
|
private inboxPollInterval;
|
|
70
|
+
private commandPollInterval;
|
|
65
71
|
private leadInterval;
|
|
66
72
|
private leadContext;
|
|
73
|
+
private watcherLoopHandle;
|
|
74
|
+
private watcherQueue;
|
|
67
75
|
private stopCleanupScheduler;
|
|
68
76
|
private authHealthWatcher;
|
|
69
77
|
private _preStartSessionId;
|
|
@@ -71,12 +79,14 @@ export declare class AgentDaemon {
|
|
|
71
79
|
private stuckSince;
|
|
72
80
|
private lastPendingHandoffAlertAt;
|
|
73
81
|
private remoteAutomationPaused;
|
|
82
|
+
private rateLimitDetected;
|
|
74
83
|
private lastAutonomyPolicyFetchAt;
|
|
75
84
|
private teamId;
|
|
76
85
|
private pendingClaimCreations;
|
|
77
86
|
private sessionRecoveryAttempts;
|
|
78
87
|
private lastSessionRecoveryAt;
|
|
79
88
|
private initialInboxCheckComplete;
|
|
89
|
+
private commandPollInFlight;
|
|
80
90
|
constructor(options: DaemonOptions);
|
|
81
91
|
start(): Promise<void>;
|
|
82
92
|
/**
|
|
@@ -84,6 +94,11 @@ export declare class AgentDaemon {
|
|
|
84
94
|
* Includes auto-restart logic and progress watchdog
|
|
85
95
|
*/
|
|
86
96
|
private autoAcceptPendingHandoffs;
|
|
97
|
+
/**
|
|
98
|
+
* GH-887: After accepting a handoff, verify the LLM acknowledged it.
|
|
99
|
+
* If rate-limited, pause auto-acceptance. If stuck after retries, log warning.
|
|
100
|
+
*/
|
|
101
|
+
private verifyHandoffInjection;
|
|
87
102
|
private autoAcceptHandoffFromEvent;
|
|
88
103
|
private isAutomationPaused;
|
|
89
104
|
private sweepInboxOnWebSocketConnect;
|
|
@@ -97,6 +112,8 @@ export declare class AgentDaemon {
|
|
|
97
112
|
private releaseAllAutoClaims;
|
|
98
113
|
private reconcileAutoClaims;
|
|
99
114
|
private startHealthMonitor;
|
|
115
|
+
private startCommandPoller;
|
|
116
|
+
private pollNextCommand;
|
|
100
117
|
/**
|
|
101
118
|
* Handles session death - logs crash and attempts auto-restart
|
|
102
119
|
*/
|
|
@@ -112,6 +129,10 @@ export declare class AgentDaemon {
|
|
|
112
129
|
* Replaces tmux with a direct HTTP server
|
|
113
130
|
*/
|
|
114
131
|
private startServeMode;
|
|
132
|
+
private publishServeMetadata;
|
|
133
|
+
private publishDurableAgentMetadata;
|
|
134
|
+
private getServeLocalUrl;
|
|
135
|
+
private getServePassword;
|
|
115
136
|
/**
|
|
116
137
|
* Starts agent in Docker sandbox mode
|
|
117
138
|
* Provides filesystem isolation with only workspace mounted
|