@foothill/agent-move 1.0.6
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/.github/screenshot.png +0 -0
- package/README.md +266 -0
- package/bin/cli.js +229 -0
- package/package.json +53 -0
- package/packages/client/dist/assets/BufferResource-Ddjob236.js +185 -0
- package/packages/client/dist/assets/CanvasRenderer-B0w6SYyW.js +1 -0
- package/packages/client/dist/assets/Filter-NcMGuiK-.js +1 -0
- package/packages/client/dist/assets/RenderTargetSystem-DgAzY5_U.js +172 -0
- package/packages/client/dist/assets/WebGLRenderer-DUWXDPIX.js +156 -0
- package/packages/client/dist/assets/WebGPURenderer-C1HbrllR.js +41 -0
- package/packages/client/dist/assets/browserAll-CaF1Fl0O.js +14 -0
- package/packages/client/dist/assets/index-CMmR_RuS.css +1 -0
- package/packages/client/dist/assets/index-Dh8yWoLP.js +711 -0
- package/packages/client/dist/assets/webworkerAll-BJ6UhC7r.js +83 -0
- package/packages/client/dist/favicon.svg +27 -0
- package/packages/client/dist/index.html +167 -0
- package/packages/client/package.json +19 -0
- package/packages/server/dist/config.d.ts +12 -0
- package/packages/server/dist/config.d.ts.map +1 -0
- package/packages/server/dist/config.js +19 -0
- package/packages/server/dist/config.js.map +1 -0
- package/packages/server/dist/hooks/hook-event-manager.d.ts +39 -0
- package/packages/server/dist/hooks/hook-event-manager.d.ts.map +1 -0
- package/packages/server/dist/hooks/hook-event-manager.js +161 -0
- package/packages/server/dist/hooks/hook-event-manager.js.map +1 -0
- package/packages/server/dist/hooks/hook-installer.d.ts +14 -0
- package/packages/server/dist/hooks/hook-installer.d.ts.map +1 -0
- package/packages/server/dist/hooks/hook-installer.js +179 -0
- package/packages/server/dist/hooks/hook-installer.js.map +1 -0
- package/packages/server/dist/index.d.ts +4 -0
- package/packages/server/dist/index.d.ts.map +1 -0
- package/packages/server/dist/index.js +3544 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/dist/routes/api.d.ts +4 -0
- package/packages/server/dist/routes/api.d.ts.map +1 -0
- package/packages/server/dist/routes/api.js +27 -0
- package/packages/server/dist/routes/api.js.map +1 -0
- package/packages/server/dist/state/activity-processor.d.ts +31 -0
- package/packages/server/dist/state/activity-processor.d.ts.map +1 -0
- package/packages/server/dist/state/activity-processor.js +417 -0
- package/packages/server/dist/state/activity-processor.js.map +1 -0
- package/packages/server/dist/state/agent-state-manager.d.ts +107 -0
- package/packages/server/dist/state/agent-state-manager.d.ts.map +1 -0
- package/packages/server/dist/state/agent-state-manager.js +1622 -0
- package/packages/server/dist/state/agent-state-manager.js.map +1 -0
- package/packages/server/dist/state/anomaly-detector.d.ts +23 -0
- package/packages/server/dist/state/anomaly-detector.d.ts.map +1 -0
- package/packages/server/dist/state/anomaly-detector.js +272 -0
- package/packages/server/dist/state/anomaly-detector.js.map +1 -0
- package/packages/server/dist/state/identity-manager.d.ts +31 -0
- package/packages/server/dist/state/identity-manager.d.ts.map +1 -0
- package/packages/server/dist/state/identity-manager.js +63 -0
- package/packages/server/dist/state/identity-manager.js.map +1 -0
- package/packages/server/dist/state/role-resolver.d.ts +23 -0
- package/packages/server/dist/state/role-resolver.d.ts.map +1 -0
- package/packages/server/dist/state/role-resolver.js +43 -0
- package/packages/server/dist/state/role-resolver.js.map +1 -0
- package/packages/server/dist/state/task-graph-manager.d.ts +31 -0
- package/packages/server/dist/state/task-graph-manager.d.ts.map +1 -0
- package/packages/server/dist/state/task-graph-manager.js +191 -0
- package/packages/server/dist/state/task-graph-manager.js.map +1 -0
- package/packages/server/dist/state/tool-chain-tracker.d.ts +23 -0
- package/packages/server/dist/state/tool-chain-tracker.d.ts.map +1 -0
- package/packages/server/dist/state/tool-chain-tracker.js +113 -0
- package/packages/server/dist/state/tool-chain-tracker.js.map +1 -0
- package/packages/server/dist/watcher/agent-watcher.d.ts +16 -0
- package/packages/server/dist/watcher/agent-watcher.d.ts.map +1 -0
- package/packages/server/dist/watcher/agent-watcher.js +0 -0
- package/packages/server/dist/watcher/agent-watcher.js.map +1 -0
- package/packages/server/dist/watcher/claude-paths.d.ts +32 -0
- package/packages/server/dist/watcher/claude-paths.d.ts.map +1 -0
- package/packages/server/dist/watcher/claude-paths.js +104 -0
- package/packages/server/dist/watcher/claude-paths.js.map +1 -0
- package/packages/server/dist/watcher/file-watcher.d.ts +17 -0
- package/packages/server/dist/watcher/file-watcher.d.ts.map +1 -0
- package/packages/server/dist/watcher/file-watcher.js +347 -0
- package/packages/server/dist/watcher/file-watcher.js.map +1 -0
- package/packages/server/dist/watcher/git-info.d.ts +3 -0
- package/packages/server/dist/watcher/git-info.d.ts.map +1 -0
- package/packages/server/dist/watcher/git-info.js +35 -0
- package/packages/server/dist/watcher/git-info.js.map +1 -0
- package/packages/server/dist/watcher/jsonl-parser.d.ts +21 -0
- package/packages/server/dist/watcher/jsonl-parser.d.ts.map +1 -0
- package/packages/server/dist/watcher/jsonl-parser.js +95 -0
- package/packages/server/dist/watcher/jsonl-parser.js.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-parser.d.ts +58 -0
- package/packages/server/dist/watcher/opencode/opencode-parser.d.ts.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-parser.js +256 -0
- package/packages/server/dist/watcher/opencode/opencode-parser.js.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-paths.d.ts +20 -0
- package/packages/server/dist/watcher/opencode/opencode-paths.d.ts.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-paths.js +35 -0
- package/packages/server/dist/watcher/opencode/opencode-paths.js.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-watcher.d.ts +49 -0
- package/packages/server/dist/watcher/opencode/opencode-watcher.d.ts.map +1 -0
- package/packages/server/dist/watcher/opencode/opencode-watcher.js +1292 -0
- package/packages/server/dist/watcher/opencode/opencode-watcher.js.map +1 -0
- package/packages/server/dist/watcher/session-scanner.d.ts +7 -0
- package/packages/server/dist/watcher/session-scanner.d.ts.map +1 -0
- package/packages/server/dist/watcher/session-scanner.js +69 -0
- package/packages/server/dist/watcher/session-scanner.js.map +1 -0
- package/packages/server/dist/ws/broadcaster.d.ts +18 -0
- package/packages/server/dist/ws/broadcaster.d.ts.map +1 -0
- package/packages/server/dist/ws/broadcaster.js +152 -0
- package/packages/server/dist/ws/broadcaster.js.map +1 -0
- package/packages/server/dist/ws/ws-handler.d.ts +6 -0
- package/packages/server/dist/ws/ws-handler.d.ts.map +1 -0
- package/packages/server/dist/ws/ws-handler.js +55 -0
- package/packages/server/dist/ws/ws-handler.js.map +1 -0
- package/packages/server/package.json +25 -0
- package/packages/shared/dist/constants/colors.d.ts +46 -0
- package/packages/shared/dist/constants/colors.d.ts.map +1 -0
- package/packages/shared/dist/constants/colors.js +178 -0
- package/packages/shared/dist/constants/colors.js.map +1 -0
- package/packages/shared/dist/constants/names.d.ts +6 -0
- package/packages/shared/dist/constants/names.d.ts.map +1 -0
- package/packages/shared/dist/constants/names.js +28 -0
- package/packages/shared/dist/constants/names.js.map +1 -0
- package/packages/shared/dist/constants/tools.d.ts +15 -0
- package/packages/shared/dist/constants/tools.d.ts.map +1 -0
- package/packages/shared/dist/constants/tools.js +120 -0
- package/packages/shared/dist/constants/tools.js.map +1 -0
- package/packages/shared/dist/constants/zones.d.ts +37 -0
- package/packages/shared/dist/constants/zones.d.ts.map +1 -0
- package/packages/shared/dist/constants/zones.js +128 -0
- package/packages/shared/dist/constants/zones.js.map +1 -0
- package/packages/shared/dist/index.d.ts +15 -0
- package/packages/shared/dist/index.d.ts.map +1 -0
- package/packages/shared/dist/index.js +7 -0
- package/packages/shared/dist/index.js.map +1 -0
- package/packages/shared/dist/types/agent.d.ts +85 -0
- package/packages/shared/dist/types/agent.d.ts.map +1 -0
- package/packages/shared/dist/types/agent.js +2 -0
- package/packages/shared/dist/types/agent.js.map +1 -0
- package/packages/shared/dist/types/anomaly.d.ts +18 -0
- package/packages/shared/dist/types/anomaly.d.ts.map +1 -0
- package/packages/shared/dist/types/anomaly.js +6 -0
- package/packages/shared/dist/types/anomaly.js.map +1 -0
- package/packages/shared/dist/types/hooks.d.ts +51 -0
- package/packages/shared/dist/types/hooks.d.ts.map +1 -0
- package/packages/shared/dist/types/hooks.js +2 -0
- package/packages/shared/dist/types/hooks.js.map +1 -0
- package/packages/shared/dist/types/jsonl.d.ts +62 -0
- package/packages/shared/dist/types/jsonl.d.ts.map +1 -0
- package/packages/shared/dist/types/jsonl.js +3 -0
- package/packages/shared/dist/types/jsonl.js.map +1 -0
- package/packages/shared/dist/types/task-graph.d.ts +20 -0
- package/packages/shared/dist/types/task-graph.d.ts.map +1 -0
- package/packages/shared/dist/types/task-graph.js +2 -0
- package/packages/shared/dist/types/task-graph.js.map +1 -0
- package/packages/shared/dist/types/tool-chain.d.ts +17 -0
- package/packages/shared/dist/types/tool-chain.d.ts.map +1 -0
- package/packages/shared/dist/types/tool-chain.js +2 -0
- package/packages/shared/dist/types/tool-chain.js.map +1 -0
- package/packages/shared/dist/types/websocket.d.ts +132 -0
- package/packages/shared/dist/types/websocket.d.ts.map +1 -0
- package/packages/shared/dist/types/websocket.js +2 -0
- package/packages/shared/dist/types/websocket.js.map +1 -0
- package/packages/shared/dist/types/zone.d.ts +21 -0
- package/packages/shared/dist/types/zone.d.ts.map +1 -0
- package/packages/shared/dist/types/zone.js +2 -0
- package/packages/shared/dist/types/zone.js.map +1 -0
- package/packages/shared/package.json +15 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// dist/state/task-graph-manager.js
|
|
2
|
+
var TaskGraphManager = class {
|
|
3
|
+
tasks = /* @__PURE__ */ new Map();
|
|
4
|
+
/** Per-agent-root counters to match Claude's sequential task IDs per team */
|
|
5
|
+
counters = /* @__PURE__ */ new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Build a scoped key from rootSessionId + short task ID.
|
|
8
|
+
* This prevents cross-team ID collisions in the global map.
|
|
9
|
+
*/
|
|
10
|
+
scopedKey(root, shortId) {
|
|
11
|
+
return `${root}::${shortId}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Process a tool use that may affect the task graph.
|
|
15
|
+
* Returns true if the graph changed.
|
|
16
|
+
*/
|
|
17
|
+
processToolUse(agentId, agentName, toolName, toolInput, projectName, rootSessionId) {
|
|
18
|
+
const root = rootSessionId ?? agentId;
|
|
19
|
+
if (toolName === "TaskCreate") {
|
|
20
|
+
return this.handleCreate(agentId, agentName, toolInput, projectName, root);
|
|
21
|
+
}
|
|
22
|
+
if (toolName === "TaskUpdate") {
|
|
23
|
+
return this.handleUpdate(agentId, agentName, toolInput, projectName, root);
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
handleCreate(agentId, agentName, toolInput, projectName, root) {
|
|
28
|
+
const input = toolInput;
|
|
29
|
+
if (!input)
|
|
30
|
+
return false;
|
|
31
|
+
const count = (this.counters.get(root) ?? 0) + 1;
|
|
32
|
+
this.counters.set(root, count);
|
|
33
|
+
const shortId = String(count);
|
|
34
|
+
const key = this.scopedKey(root, shortId);
|
|
35
|
+
const subject = input.subject ?? `Task ${shortId}`;
|
|
36
|
+
const description = input.description;
|
|
37
|
+
const node = {
|
|
38
|
+
id: shortId,
|
|
39
|
+
subject,
|
|
40
|
+
description,
|
|
41
|
+
status: "pending",
|
|
42
|
+
owner: void 0,
|
|
43
|
+
agentId,
|
|
44
|
+
agentName,
|
|
45
|
+
projectName,
|
|
46
|
+
blocks: [],
|
|
47
|
+
blockedBy: [],
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
_rootKey: key
|
|
50
|
+
};
|
|
51
|
+
this.tasks.set(key, node);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
handleUpdate(agentId, agentName, toolInput, projectName, root) {
|
|
55
|
+
const input = toolInput;
|
|
56
|
+
if (!input)
|
|
57
|
+
return false;
|
|
58
|
+
const taskId = input.taskId;
|
|
59
|
+
if (!taskId)
|
|
60
|
+
return false;
|
|
61
|
+
const key = this.scopedKey(root, taskId);
|
|
62
|
+
let task = this.tasks.get(key);
|
|
63
|
+
if (!task) {
|
|
64
|
+
task = {
|
|
65
|
+
id: taskId,
|
|
66
|
+
subject: `Task ${taskId}`,
|
|
67
|
+
status: "pending",
|
|
68
|
+
agentId,
|
|
69
|
+
agentName,
|
|
70
|
+
projectName,
|
|
71
|
+
blocks: [],
|
|
72
|
+
blockedBy: [],
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
_rootKey: key
|
|
75
|
+
};
|
|
76
|
+
this.tasks.set(key, task);
|
|
77
|
+
}
|
|
78
|
+
let changed = false;
|
|
79
|
+
if (input.status !== void 0) {
|
|
80
|
+
const newStatus = input.status;
|
|
81
|
+
if (["pending", "in_progress", "completed", "deleted"].includes(newStatus)) {
|
|
82
|
+
task.status = newStatus;
|
|
83
|
+
changed = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (input.owner !== void 0) {
|
|
87
|
+
task.owner = input.owner;
|
|
88
|
+
changed = true;
|
|
89
|
+
}
|
|
90
|
+
if (input.subject !== void 0) {
|
|
91
|
+
task.subject = input.subject;
|
|
92
|
+
changed = true;
|
|
93
|
+
}
|
|
94
|
+
if (input.description !== void 0) {
|
|
95
|
+
task.description = input.description;
|
|
96
|
+
changed = true;
|
|
97
|
+
}
|
|
98
|
+
if (input.addBlocks) {
|
|
99
|
+
const blocks = input.addBlocks;
|
|
100
|
+
for (const id of blocks) {
|
|
101
|
+
if (!task.blocks.includes(id)) {
|
|
102
|
+
task.blocks.push(id);
|
|
103
|
+
changed = true;
|
|
104
|
+
}
|
|
105
|
+
const otherKey = this.scopedKey(root, id);
|
|
106
|
+
const other = this.tasks.get(otherKey);
|
|
107
|
+
if (other && !other.blockedBy.includes(taskId)) {
|
|
108
|
+
other.blockedBy.push(taskId);
|
|
109
|
+
changed = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (input.addBlockedBy) {
|
|
114
|
+
const blockedBy = input.addBlockedBy;
|
|
115
|
+
for (const id of blockedBy) {
|
|
116
|
+
if (!task.blockedBy.includes(id)) {
|
|
117
|
+
task.blockedBy.push(id);
|
|
118
|
+
changed = true;
|
|
119
|
+
}
|
|
120
|
+
const otherKey = this.scopedKey(root, id);
|
|
121
|
+
const other = this.tasks.get(otherKey);
|
|
122
|
+
if (other && !other.blocks.includes(taskId)) {
|
|
123
|
+
other.blocks.push(taskId);
|
|
124
|
+
changed = true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return changed;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Mark a task as completed (hook-sourced — TaskCompleted event).
|
|
132
|
+
* Returns true if the status actually changed.
|
|
133
|
+
*/
|
|
134
|
+
processTaskCompleted(taskId, root) {
|
|
135
|
+
const key = this.scopedKey(root, taskId);
|
|
136
|
+
const task = this.tasks.get(key);
|
|
137
|
+
if (!task || task.status === "completed")
|
|
138
|
+
return false;
|
|
139
|
+
task.status = "completed";
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Remove all tasks created by a given agent.
|
|
144
|
+
* Cleans up dependency references from remaining tasks.
|
|
145
|
+
* Returns true if any tasks were removed.
|
|
146
|
+
*/
|
|
147
|
+
removeAgentTasks(agentId) {
|
|
148
|
+
const toRemove = /* @__PURE__ */ new Set();
|
|
149
|
+
for (const [key, task] of this.tasks) {
|
|
150
|
+
if (task.agentId === agentId)
|
|
151
|
+
toRemove.add(key);
|
|
152
|
+
}
|
|
153
|
+
if (toRemove.size === 0)
|
|
154
|
+
return false;
|
|
155
|
+
const removedKeys = /* @__PURE__ */ new Set();
|
|
156
|
+
for (const key of toRemove) {
|
|
157
|
+
removedKeys.add(key);
|
|
158
|
+
this.tasks.delete(key);
|
|
159
|
+
}
|
|
160
|
+
for (const [taskKey, task] of this.tasks) {
|
|
161
|
+
const root = taskKey.split("::")[0];
|
|
162
|
+
task.blocks = task.blocks.filter((id) => !removedKeys.has(`${root}::${id}`));
|
|
163
|
+
task.blockedBy = task.blockedBy.filter((id) => !removedKeys.has(`${root}::${id}`));
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
getSnapshot() {
|
|
168
|
+
const live = Array.from(this.tasks.values()).filter((t) => t.status !== "deleted");
|
|
169
|
+
const rootOf = (key) => key.split("::")[0];
|
|
170
|
+
const shortToRoot = /* @__PURE__ */ new Map();
|
|
171
|
+
for (const t of live) {
|
|
172
|
+
const root = rootOf(t._rootKey);
|
|
173
|
+
if (!shortToRoot.has(root))
|
|
174
|
+
shortToRoot.set(root, /* @__PURE__ */ new Map());
|
|
175
|
+
shortToRoot.get(root).set(t.id, t._rootKey);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
tasks: live.map((t) => {
|
|
179
|
+
const lookup = shortToRoot.get(rootOf(t._rootKey));
|
|
180
|
+
return {
|
|
181
|
+
...t,
|
|
182
|
+
blocks: t.blocks.map((id) => lookup?.get(id) ?? id),
|
|
183
|
+
blockedBy: t.blockedBy.map((id) => lookup?.get(id) ?? id)
|
|
184
|
+
};
|
|
185
|
+
})
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
export {
|
|
190
|
+
TaskGraphManager
|
|
191
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-graph-manager.js","sourceRoot":"","sources":["../../src/state/task-graph-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ToolChainData } from '@agent-move/shared';
|
|
2
|
+
export declare class ToolChainTracker {
|
|
3
|
+
private lastTool;
|
|
4
|
+
private transitions;
|
|
5
|
+
private toolCounts;
|
|
6
|
+
private toolSuccesses;
|
|
7
|
+
private toolFailures;
|
|
8
|
+
private toolDurationSamples;
|
|
9
|
+
/** Per-agent pending tool start: agentId → {tool, startTime} */
|
|
10
|
+
private pendingStart;
|
|
11
|
+
recordToolUse(agentId: string, toolName: string): void;
|
|
12
|
+
/** Called from hookPreToolUse — records when a tool started for duration tracking */
|
|
13
|
+
recordToolStart(agentId: string, toolName: string): void;
|
|
14
|
+
/** Called from hookPostToolUse — records outcome and duration */
|
|
15
|
+
recordToolOutcome(agentId: string, success: boolean): void;
|
|
16
|
+
resetAgent(agentId: string): void;
|
|
17
|
+
/** Migrate per-agent state from an old ID to a new canonical ID (used on agent merge). */
|
|
18
|
+
migrateAgent(fromId: string, toId: string): void;
|
|
19
|
+
reset(): void;
|
|
20
|
+
hasActiveAgents(): boolean;
|
|
21
|
+
getSnapshot(): ToolChainData;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tool-chain-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-chain-tracker.d.ts","sourceRoot":"","sources":["../../src/state/tool-chain-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,oBAAoB,CAAC;AAIxE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,UAAU,CAA6B;IAG/C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,gEAAgE;IAChE,OAAO,CAAC,YAAY,CAA0D;IAE9E,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWtD,qFAAqF;IACrF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxD,iEAAiE;IACjE,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAqB1D,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKjC,0FAA0F;IAC1F,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAahD,KAAK,IAAI,IAAI;IAUb,eAAe,IAAI,OAAO;IAI1B,WAAW,IAAI,aAAa;CAiC7B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// dist/state/tool-chain-tracker.js
|
|
2
|
+
var MAX_DURATION_SAMPLES = 50;
|
|
3
|
+
var ToolChainTracker = class {
|
|
4
|
+
lastTool = /* @__PURE__ */ new Map();
|
|
5
|
+
transitions = /* @__PURE__ */ new Map();
|
|
6
|
+
toolCounts = /* @__PURE__ */ new Map();
|
|
7
|
+
// Hook-sourced outcome tracking
|
|
8
|
+
toolSuccesses = /* @__PURE__ */ new Map();
|
|
9
|
+
toolFailures = /* @__PURE__ */ new Map();
|
|
10
|
+
toolDurationSamples = /* @__PURE__ */ new Map();
|
|
11
|
+
/** Per-agent pending tool start: agentId → {tool, startTime} */
|
|
12
|
+
pendingStart = /* @__PURE__ */ new Map();
|
|
13
|
+
recordToolUse(agentId, toolName) {
|
|
14
|
+
this.toolCounts.set(toolName, (this.toolCounts.get(toolName) ?? 0) + 1);
|
|
15
|
+
const prev = this.lastTool.get(agentId);
|
|
16
|
+
this.lastTool.set(agentId, toolName);
|
|
17
|
+
if (prev && prev !== toolName) {
|
|
18
|
+
const key = `${prev}\u2192${toolName}`;
|
|
19
|
+
this.transitions.set(key, (this.transitions.get(key) ?? 0) + 1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Called from hookPreToolUse — records when a tool started for duration tracking */
|
|
23
|
+
recordToolStart(agentId, toolName) {
|
|
24
|
+
this.pendingStart.set(agentId, { tool: toolName, startTime: Date.now() });
|
|
25
|
+
}
|
|
26
|
+
/** Called from hookPostToolUse — records outcome and duration */
|
|
27
|
+
recordToolOutcome(agentId, success) {
|
|
28
|
+
const pending = this.pendingStart.get(agentId);
|
|
29
|
+
if (!pending)
|
|
30
|
+
return;
|
|
31
|
+
this.pendingStart.delete(agentId);
|
|
32
|
+
const { tool, startTime } = pending;
|
|
33
|
+
const duration = Date.now() - startTime;
|
|
34
|
+
if (success) {
|
|
35
|
+
this.toolSuccesses.set(tool, (this.toolSuccesses.get(tool) ?? 0) + 1);
|
|
36
|
+
} else {
|
|
37
|
+
this.toolFailures.set(tool, (this.toolFailures.get(tool) ?? 0) + 1);
|
|
38
|
+
}
|
|
39
|
+
let samples = this.toolDurationSamples.get(tool);
|
|
40
|
+
if (!samples) {
|
|
41
|
+
samples = [];
|
|
42
|
+
this.toolDurationSamples.set(tool, samples);
|
|
43
|
+
}
|
|
44
|
+
samples.push(duration);
|
|
45
|
+
if (samples.length > MAX_DURATION_SAMPLES)
|
|
46
|
+
samples.shift();
|
|
47
|
+
}
|
|
48
|
+
resetAgent(agentId) {
|
|
49
|
+
this.lastTool.delete(agentId);
|
|
50
|
+
this.pendingStart.delete(agentId);
|
|
51
|
+
}
|
|
52
|
+
/** Migrate per-agent state from an old ID to a new canonical ID (used on agent merge). */
|
|
53
|
+
migrateAgent(fromId, toId) {
|
|
54
|
+
const last = this.lastTool.get(fromId);
|
|
55
|
+
if (last !== void 0) {
|
|
56
|
+
if (!this.lastTool.has(toId))
|
|
57
|
+
this.lastTool.set(toId, last);
|
|
58
|
+
this.lastTool.delete(fromId);
|
|
59
|
+
}
|
|
60
|
+
const pending = this.pendingStart.get(fromId);
|
|
61
|
+
if (pending !== void 0) {
|
|
62
|
+
if (!this.pendingStart.has(toId))
|
|
63
|
+
this.pendingStart.set(toId, pending);
|
|
64
|
+
this.pendingStart.delete(fromId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
reset() {
|
|
68
|
+
this.lastTool.clear();
|
|
69
|
+
this.transitions.clear();
|
|
70
|
+
this.toolCounts.clear();
|
|
71
|
+
this.toolSuccesses.clear();
|
|
72
|
+
this.toolFailures.clear();
|
|
73
|
+
this.toolDurationSamples.clear();
|
|
74
|
+
this.pendingStart.clear();
|
|
75
|
+
}
|
|
76
|
+
hasActiveAgents() {
|
|
77
|
+
return this.lastTool.size > 0;
|
|
78
|
+
}
|
|
79
|
+
getSnapshot() {
|
|
80
|
+
const transitions = [];
|
|
81
|
+
for (const [key, count] of this.transitions) {
|
|
82
|
+
const [from, to] = key.split("\u2192");
|
|
83
|
+
transitions.push({ from, to, count });
|
|
84
|
+
}
|
|
85
|
+
transitions.sort((a, b) => b.count - a.count);
|
|
86
|
+
const toolCounts = {};
|
|
87
|
+
for (const [tool, count] of this.toolCounts)
|
|
88
|
+
toolCounts[tool] = count;
|
|
89
|
+
const toolSuccesses = {};
|
|
90
|
+
for (const [tool, count] of this.toolSuccesses)
|
|
91
|
+
toolSuccesses[tool] = count;
|
|
92
|
+
const toolFailures = {};
|
|
93
|
+
for (const [tool, count] of this.toolFailures)
|
|
94
|
+
toolFailures[tool] = count;
|
|
95
|
+
const toolAvgDuration = {};
|
|
96
|
+
for (const [tool, samples] of this.toolDurationSamples) {
|
|
97
|
+
if (samples.length > 0) {
|
|
98
|
+
toolAvgDuration[tool] = Math.round(samples.reduce((a, b) => a + b, 0) / samples.length);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
transitions,
|
|
103
|
+
tools: Array.from(this.toolCounts.keys()).sort(),
|
|
104
|
+
toolCounts,
|
|
105
|
+
toolSuccesses,
|
|
106
|
+
toolFailures,
|
|
107
|
+
toolAvgDuration
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
export {
|
|
112
|
+
ToolChainTracker
|
|
113
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-chain-tracker.js","sourceRoot":"","sources":["../../src/state/tool-chain-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common interface for all agent watchers (Claude Code, OpenCode, etc.).
|
|
3
|
+
* Each watcher monitors its own data source and feeds activity into
|
|
4
|
+
* AgentStateManager via processMessage() / heartbeat().
|
|
5
|
+
*
|
|
6
|
+
* Adding support for a new agent type:
|
|
7
|
+
* 1. Create a class in watcher/<agent-name>/ that implements AgentWatcher
|
|
8
|
+
* 2. Normalize tool names via normalizeToolName() and input fields via
|
|
9
|
+
* normalizeToolInput() before emitting ParsedActivity
|
|
10
|
+
* 3. Add the watcher to the array in index.ts
|
|
11
|
+
*/
|
|
12
|
+
export interface AgentWatcher {
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
stop(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=agent-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/agent-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,IAAI,CAAC;CACd"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-watcher.js","sourceRoot":"","sources":["../../src/watcher/agent-watcher.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SessionInfo {
|
|
2
|
+
projectPath: string;
|
|
3
|
+
projectName: string;
|
|
4
|
+
isSubagent: boolean;
|
|
5
|
+
/** The encoded project directory (shared by main + subagents of the same project) */
|
|
6
|
+
projectDir: string;
|
|
7
|
+
/** The parent session ID extracted from the path (for subagents) */
|
|
8
|
+
parentSessionId: string | null;
|
|
9
|
+
}
|
|
10
|
+
declare class ClaudePaths {
|
|
11
|
+
/**
|
|
12
|
+
* Parse a JSONL session file path to extract project info.
|
|
13
|
+
* Paths look like: ~/.claude/projects/{encoded-project-path}/{sessionId}.jsonl
|
|
14
|
+
* Subagent paths may be nested deeper.
|
|
15
|
+
*/
|
|
16
|
+
parseSessionPath(filePath: string): SessionInfo;
|
|
17
|
+
/**
|
|
18
|
+
* Decode Claude Code's encoded project path format.
|
|
19
|
+
* Resolves against the filesystem to correctly handle dashes in folder names.
|
|
20
|
+
* e.g., "C--projects-fts-temp-agent-move" → "agent-move"
|
|
21
|
+
*/
|
|
22
|
+
decodeProjectName(encoded: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Greedily resolve the encoded path against the filesystem.
|
|
25
|
+
* Tries each dash-segment as a directory, joining multiple segments
|
|
26
|
+
* when a single one doesn't exist (to handle dashes in folder names).
|
|
27
|
+
*/
|
|
28
|
+
private resolveToFolderName;
|
|
29
|
+
}
|
|
30
|
+
export declare const claudePaths: ClaudePaths;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=claude-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-paths.d.ts","sourceRoot":"","sources":["../../src/watcher/claude-paths.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,cAAM,WAAW;IACf;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAqC/C;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAU1C;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAsD5B;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// dist/watcher/claude-paths.js
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
var ClaudePaths = class {
|
|
5
|
+
/**
|
|
6
|
+
* Parse a JSONL session file path to extract project info.
|
|
7
|
+
* Paths look like: ~/.claude/projects/{encoded-project-path}/{sessionId}.jsonl
|
|
8
|
+
* Subagent paths may be nested deeper.
|
|
9
|
+
*/
|
|
10
|
+
parseSessionPath(filePath) {
|
|
11
|
+
const normalized = filePath.replace(/\\/g, "/");
|
|
12
|
+
const parts = normalized.split("/");
|
|
13
|
+
const projectsIdx = parts.indexOf("projects");
|
|
14
|
+
if (projectsIdx === -1 || projectsIdx + 1 >= parts.length) {
|
|
15
|
+
return {
|
|
16
|
+
projectPath: "unknown",
|
|
17
|
+
projectName: "Unknown",
|
|
18
|
+
isSubagent: false,
|
|
19
|
+
projectDir: "unknown",
|
|
20
|
+
parentSessionId: null
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const encodedProjectName = parts[projectsIdx + 1];
|
|
24
|
+
const projectName = this.decodeProjectName(encodedProjectName);
|
|
25
|
+
const depthAfterProject = parts.length - projectsIdx - 2;
|
|
26
|
+
const isSubagent = depthAfterProject > 1;
|
|
27
|
+
const parentSessionId = isSubagent ? parts[projectsIdx + 2] : null;
|
|
28
|
+
return {
|
|
29
|
+
projectPath: encodedProjectName,
|
|
30
|
+
projectName,
|
|
31
|
+
isSubagent,
|
|
32
|
+
projectDir: encodedProjectName,
|
|
33
|
+
parentSessionId
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decode Claude Code's encoded project path format.
|
|
38
|
+
* Resolves against the filesystem to correctly handle dashes in folder names.
|
|
39
|
+
* e.g., "C--projects-fts-temp-agent-move" → "agent-move"
|
|
40
|
+
*/
|
|
41
|
+
decodeProjectName(encoded) {
|
|
42
|
+
const resolved = this.resolveToFolderName(encoded);
|
|
43
|
+
if (resolved)
|
|
44
|
+
return resolved;
|
|
45
|
+
const parts = encoded.split("-").filter((p) => p.length > 0);
|
|
46
|
+
if (parts.length <= 2)
|
|
47
|
+
return parts.join("/");
|
|
48
|
+
return parts.slice(-2).join("/");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Greedily resolve the encoded path against the filesystem.
|
|
52
|
+
* Tries each dash-segment as a directory, joining multiple segments
|
|
53
|
+
* when a single one doesn't exist (to handle dashes in folder names).
|
|
54
|
+
*/
|
|
55
|
+
resolveToFolderName(encoded) {
|
|
56
|
+
try {
|
|
57
|
+
let root;
|
|
58
|
+
let rest;
|
|
59
|
+
const driveMatch = encoded.match(/^([A-Za-z])--(.*)/);
|
|
60
|
+
const unixMatch = !driveMatch && encoded.match(/^-(.*)/);
|
|
61
|
+
if (driveMatch) {
|
|
62
|
+
root = driveMatch[1] + ":/";
|
|
63
|
+
rest = driveMatch[2];
|
|
64
|
+
} else if (unixMatch) {
|
|
65
|
+
root = "/";
|
|
66
|
+
rest = unixMatch[1];
|
|
67
|
+
} else {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const parts = rest.split("-").filter(Boolean);
|
|
71
|
+
let currentPath = root;
|
|
72
|
+
let lastName = "";
|
|
73
|
+
let i = 0;
|
|
74
|
+
while (i < parts.length) {
|
|
75
|
+
let found = false;
|
|
76
|
+
const maxLen = Math.min(parts.length - i, 6);
|
|
77
|
+
for (let len = 1; len <= maxLen; len++) {
|
|
78
|
+
const segment = parts.slice(i, i + len).join("-");
|
|
79
|
+
for (const prefix of ["", "."]) {
|
|
80
|
+
const testPath = join(currentPath, prefix + segment);
|
|
81
|
+
if (existsSync(testPath)) {
|
|
82
|
+
currentPath = testPath;
|
|
83
|
+
lastName = prefix + segment;
|
|
84
|
+
i += len;
|
|
85
|
+
found = true;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (found)
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
if (!found)
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return lastName || null;
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var claudePaths = new ClaudePaths();
|
|
102
|
+
export {
|
|
103
|
+
claudePaths
|
|
104
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-paths.js","sourceRoot":"","sources":["../../src/watcher/claude-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentStateManager } from '../state/agent-state-manager.js';
|
|
2
|
+
import type { AgentWatcher } from './agent-watcher.js';
|
|
3
|
+
export declare class FileWatcher implements AgentWatcher {
|
|
4
|
+
private claudeHome;
|
|
5
|
+
private stateManager;
|
|
6
|
+
private watcher;
|
|
7
|
+
private byteOffsets;
|
|
8
|
+
private parser;
|
|
9
|
+
/** Per-file lock to prevent concurrent processFile calls for the same file */
|
|
10
|
+
private fileLocks;
|
|
11
|
+
constructor(claudeHome: string, stateManager: AgentStateManager);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): void;
|
|
14
|
+
private processFile;
|
|
15
|
+
private doProcessFile;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=file-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,qBAAa,WAAY,YAAW,YAAY;IAQ5C,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IARtB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAAqB;IACnC,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAAoC;gBAG3C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,iBAAiB;IAGnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,WAAW;YAcL,aAAa;CA4C5B"}
|