@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.
Files changed (163) hide show
  1. package/.github/screenshot.png +0 -0
  2. package/README.md +266 -0
  3. package/bin/cli.js +229 -0
  4. package/package.json +53 -0
  5. package/packages/client/dist/assets/BufferResource-Ddjob236.js +185 -0
  6. package/packages/client/dist/assets/CanvasRenderer-B0w6SYyW.js +1 -0
  7. package/packages/client/dist/assets/Filter-NcMGuiK-.js +1 -0
  8. package/packages/client/dist/assets/RenderTargetSystem-DgAzY5_U.js +172 -0
  9. package/packages/client/dist/assets/WebGLRenderer-DUWXDPIX.js +156 -0
  10. package/packages/client/dist/assets/WebGPURenderer-C1HbrllR.js +41 -0
  11. package/packages/client/dist/assets/browserAll-CaF1Fl0O.js +14 -0
  12. package/packages/client/dist/assets/index-CMmR_RuS.css +1 -0
  13. package/packages/client/dist/assets/index-Dh8yWoLP.js +711 -0
  14. package/packages/client/dist/assets/webworkerAll-BJ6UhC7r.js +83 -0
  15. package/packages/client/dist/favicon.svg +27 -0
  16. package/packages/client/dist/index.html +167 -0
  17. package/packages/client/package.json +19 -0
  18. package/packages/server/dist/config.d.ts +12 -0
  19. package/packages/server/dist/config.d.ts.map +1 -0
  20. package/packages/server/dist/config.js +19 -0
  21. package/packages/server/dist/config.js.map +1 -0
  22. package/packages/server/dist/hooks/hook-event-manager.d.ts +39 -0
  23. package/packages/server/dist/hooks/hook-event-manager.d.ts.map +1 -0
  24. package/packages/server/dist/hooks/hook-event-manager.js +161 -0
  25. package/packages/server/dist/hooks/hook-event-manager.js.map +1 -0
  26. package/packages/server/dist/hooks/hook-installer.d.ts +14 -0
  27. package/packages/server/dist/hooks/hook-installer.d.ts.map +1 -0
  28. package/packages/server/dist/hooks/hook-installer.js +179 -0
  29. package/packages/server/dist/hooks/hook-installer.js.map +1 -0
  30. package/packages/server/dist/index.d.ts +4 -0
  31. package/packages/server/dist/index.d.ts.map +1 -0
  32. package/packages/server/dist/index.js +3544 -0
  33. package/packages/server/dist/index.js.map +1 -0
  34. package/packages/server/dist/routes/api.d.ts +4 -0
  35. package/packages/server/dist/routes/api.d.ts.map +1 -0
  36. package/packages/server/dist/routes/api.js +27 -0
  37. package/packages/server/dist/routes/api.js.map +1 -0
  38. package/packages/server/dist/state/activity-processor.d.ts +31 -0
  39. package/packages/server/dist/state/activity-processor.d.ts.map +1 -0
  40. package/packages/server/dist/state/activity-processor.js +417 -0
  41. package/packages/server/dist/state/activity-processor.js.map +1 -0
  42. package/packages/server/dist/state/agent-state-manager.d.ts +107 -0
  43. package/packages/server/dist/state/agent-state-manager.d.ts.map +1 -0
  44. package/packages/server/dist/state/agent-state-manager.js +1622 -0
  45. package/packages/server/dist/state/agent-state-manager.js.map +1 -0
  46. package/packages/server/dist/state/anomaly-detector.d.ts +23 -0
  47. package/packages/server/dist/state/anomaly-detector.d.ts.map +1 -0
  48. package/packages/server/dist/state/anomaly-detector.js +272 -0
  49. package/packages/server/dist/state/anomaly-detector.js.map +1 -0
  50. package/packages/server/dist/state/identity-manager.d.ts +31 -0
  51. package/packages/server/dist/state/identity-manager.d.ts.map +1 -0
  52. package/packages/server/dist/state/identity-manager.js +63 -0
  53. package/packages/server/dist/state/identity-manager.js.map +1 -0
  54. package/packages/server/dist/state/role-resolver.d.ts +23 -0
  55. package/packages/server/dist/state/role-resolver.d.ts.map +1 -0
  56. package/packages/server/dist/state/role-resolver.js +43 -0
  57. package/packages/server/dist/state/role-resolver.js.map +1 -0
  58. package/packages/server/dist/state/task-graph-manager.d.ts +31 -0
  59. package/packages/server/dist/state/task-graph-manager.d.ts.map +1 -0
  60. package/packages/server/dist/state/task-graph-manager.js +191 -0
  61. package/packages/server/dist/state/task-graph-manager.js.map +1 -0
  62. package/packages/server/dist/state/tool-chain-tracker.d.ts +23 -0
  63. package/packages/server/dist/state/tool-chain-tracker.d.ts.map +1 -0
  64. package/packages/server/dist/state/tool-chain-tracker.js +113 -0
  65. package/packages/server/dist/state/tool-chain-tracker.js.map +1 -0
  66. package/packages/server/dist/watcher/agent-watcher.d.ts +16 -0
  67. package/packages/server/dist/watcher/agent-watcher.d.ts.map +1 -0
  68. package/packages/server/dist/watcher/agent-watcher.js +0 -0
  69. package/packages/server/dist/watcher/agent-watcher.js.map +1 -0
  70. package/packages/server/dist/watcher/claude-paths.d.ts +32 -0
  71. package/packages/server/dist/watcher/claude-paths.d.ts.map +1 -0
  72. package/packages/server/dist/watcher/claude-paths.js +104 -0
  73. package/packages/server/dist/watcher/claude-paths.js.map +1 -0
  74. package/packages/server/dist/watcher/file-watcher.d.ts +17 -0
  75. package/packages/server/dist/watcher/file-watcher.d.ts.map +1 -0
  76. package/packages/server/dist/watcher/file-watcher.js +347 -0
  77. package/packages/server/dist/watcher/file-watcher.js.map +1 -0
  78. package/packages/server/dist/watcher/git-info.d.ts +3 -0
  79. package/packages/server/dist/watcher/git-info.d.ts.map +1 -0
  80. package/packages/server/dist/watcher/git-info.js +35 -0
  81. package/packages/server/dist/watcher/git-info.js.map +1 -0
  82. package/packages/server/dist/watcher/jsonl-parser.d.ts +21 -0
  83. package/packages/server/dist/watcher/jsonl-parser.d.ts.map +1 -0
  84. package/packages/server/dist/watcher/jsonl-parser.js +95 -0
  85. package/packages/server/dist/watcher/jsonl-parser.js.map +1 -0
  86. package/packages/server/dist/watcher/opencode/opencode-parser.d.ts +58 -0
  87. package/packages/server/dist/watcher/opencode/opencode-parser.d.ts.map +1 -0
  88. package/packages/server/dist/watcher/opencode/opencode-parser.js +256 -0
  89. package/packages/server/dist/watcher/opencode/opencode-parser.js.map +1 -0
  90. package/packages/server/dist/watcher/opencode/opencode-paths.d.ts +20 -0
  91. package/packages/server/dist/watcher/opencode/opencode-paths.d.ts.map +1 -0
  92. package/packages/server/dist/watcher/opencode/opencode-paths.js +35 -0
  93. package/packages/server/dist/watcher/opencode/opencode-paths.js.map +1 -0
  94. package/packages/server/dist/watcher/opencode/opencode-watcher.d.ts +49 -0
  95. package/packages/server/dist/watcher/opencode/opencode-watcher.d.ts.map +1 -0
  96. package/packages/server/dist/watcher/opencode/opencode-watcher.js +1292 -0
  97. package/packages/server/dist/watcher/opencode/opencode-watcher.js.map +1 -0
  98. package/packages/server/dist/watcher/session-scanner.d.ts +7 -0
  99. package/packages/server/dist/watcher/session-scanner.d.ts.map +1 -0
  100. package/packages/server/dist/watcher/session-scanner.js +69 -0
  101. package/packages/server/dist/watcher/session-scanner.js.map +1 -0
  102. package/packages/server/dist/ws/broadcaster.d.ts +18 -0
  103. package/packages/server/dist/ws/broadcaster.d.ts.map +1 -0
  104. package/packages/server/dist/ws/broadcaster.js +152 -0
  105. package/packages/server/dist/ws/broadcaster.js.map +1 -0
  106. package/packages/server/dist/ws/ws-handler.d.ts +6 -0
  107. package/packages/server/dist/ws/ws-handler.d.ts.map +1 -0
  108. package/packages/server/dist/ws/ws-handler.js +55 -0
  109. package/packages/server/dist/ws/ws-handler.js.map +1 -0
  110. package/packages/server/package.json +25 -0
  111. package/packages/shared/dist/constants/colors.d.ts +46 -0
  112. package/packages/shared/dist/constants/colors.d.ts.map +1 -0
  113. package/packages/shared/dist/constants/colors.js +178 -0
  114. package/packages/shared/dist/constants/colors.js.map +1 -0
  115. package/packages/shared/dist/constants/names.d.ts +6 -0
  116. package/packages/shared/dist/constants/names.d.ts.map +1 -0
  117. package/packages/shared/dist/constants/names.js +28 -0
  118. package/packages/shared/dist/constants/names.js.map +1 -0
  119. package/packages/shared/dist/constants/tools.d.ts +15 -0
  120. package/packages/shared/dist/constants/tools.d.ts.map +1 -0
  121. package/packages/shared/dist/constants/tools.js +120 -0
  122. package/packages/shared/dist/constants/tools.js.map +1 -0
  123. package/packages/shared/dist/constants/zones.d.ts +37 -0
  124. package/packages/shared/dist/constants/zones.d.ts.map +1 -0
  125. package/packages/shared/dist/constants/zones.js +128 -0
  126. package/packages/shared/dist/constants/zones.js.map +1 -0
  127. package/packages/shared/dist/index.d.ts +15 -0
  128. package/packages/shared/dist/index.d.ts.map +1 -0
  129. package/packages/shared/dist/index.js +7 -0
  130. package/packages/shared/dist/index.js.map +1 -0
  131. package/packages/shared/dist/types/agent.d.ts +85 -0
  132. package/packages/shared/dist/types/agent.d.ts.map +1 -0
  133. package/packages/shared/dist/types/agent.js +2 -0
  134. package/packages/shared/dist/types/agent.js.map +1 -0
  135. package/packages/shared/dist/types/anomaly.d.ts +18 -0
  136. package/packages/shared/dist/types/anomaly.d.ts.map +1 -0
  137. package/packages/shared/dist/types/anomaly.js +6 -0
  138. package/packages/shared/dist/types/anomaly.js.map +1 -0
  139. package/packages/shared/dist/types/hooks.d.ts +51 -0
  140. package/packages/shared/dist/types/hooks.d.ts.map +1 -0
  141. package/packages/shared/dist/types/hooks.js +2 -0
  142. package/packages/shared/dist/types/hooks.js.map +1 -0
  143. package/packages/shared/dist/types/jsonl.d.ts +62 -0
  144. package/packages/shared/dist/types/jsonl.d.ts.map +1 -0
  145. package/packages/shared/dist/types/jsonl.js +3 -0
  146. package/packages/shared/dist/types/jsonl.js.map +1 -0
  147. package/packages/shared/dist/types/task-graph.d.ts +20 -0
  148. package/packages/shared/dist/types/task-graph.d.ts.map +1 -0
  149. package/packages/shared/dist/types/task-graph.js +2 -0
  150. package/packages/shared/dist/types/task-graph.js.map +1 -0
  151. package/packages/shared/dist/types/tool-chain.d.ts +17 -0
  152. package/packages/shared/dist/types/tool-chain.d.ts.map +1 -0
  153. package/packages/shared/dist/types/tool-chain.js +2 -0
  154. package/packages/shared/dist/types/tool-chain.js.map +1 -0
  155. package/packages/shared/dist/types/websocket.d.ts +132 -0
  156. package/packages/shared/dist/types/websocket.d.ts.map +1 -0
  157. package/packages/shared/dist/types/websocket.js +2 -0
  158. package/packages/shared/dist/types/websocket.js.map +1 -0
  159. package/packages/shared/dist/types/zone.d.ts +21 -0
  160. package/packages/shared/dist/types/zone.d.ts.map +1 -0
  161. package/packages/shared/dist/types/zone.js +2 -0
  162. package/packages/shared/dist/types/zone.js.map +1 -0
  163. 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"}