@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,256 @@
|
|
|
1
|
+
// dist/watcher/opencode/opencode-parser.js
|
|
2
|
+
var TOOL_NAME_MAP = {
|
|
3
|
+
// OpenCode lowercase → canonical PascalCase
|
|
4
|
+
read: "Read",
|
|
5
|
+
write: "Write",
|
|
6
|
+
edit: "Edit",
|
|
7
|
+
patch: "Patch",
|
|
8
|
+
glob: "Glob",
|
|
9
|
+
bash: "Bash",
|
|
10
|
+
grep: "Grep",
|
|
11
|
+
websearch: "WebSearch",
|
|
12
|
+
webfetch: "WebFetch",
|
|
13
|
+
todoread: "TodoRead",
|
|
14
|
+
todowrite: "TodoWrite"
|
|
15
|
+
};
|
|
16
|
+
function normalizeToolName(name) {
|
|
17
|
+
return TOOL_NAME_MAP[name] ?? name;
|
|
18
|
+
}
|
|
19
|
+
function normalizeToolInput(input) {
|
|
20
|
+
if (!("filePath" in input) && !("oldString" in input) && !("newString" in input) && !("replaceAll" in input)) {
|
|
21
|
+
return input;
|
|
22
|
+
}
|
|
23
|
+
const out = { ...input };
|
|
24
|
+
if ("filePath" in out) {
|
|
25
|
+
out.file_path = out.filePath;
|
|
26
|
+
delete out.filePath;
|
|
27
|
+
}
|
|
28
|
+
if ("oldString" in out) {
|
|
29
|
+
out.old_string = out.oldString;
|
|
30
|
+
delete out.oldString;
|
|
31
|
+
}
|
|
32
|
+
if ("newString" in out) {
|
|
33
|
+
out.new_string = out.newString;
|
|
34
|
+
delete out.newString;
|
|
35
|
+
}
|
|
36
|
+
if ("replaceAll" in out) {
|
|
37
|
+
out.replace_all = out.replaceAll;
|
|
38
|
+
delete out.replaceAll;
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
var ZONES = [
|
|
43
|
+
// Row 0
|
|
44
|
+
{
|
|
45
|
+
id: "search",
|
|
46
|
+
label: "Search",
|
|
47
|
+
description: "Grep, WebSearch \u2014 Research & lookup",
|
|
48
|
+
icon: "\u{1F4DA}",
|
|
49
|
+
color: 15381256,
|
|
50
|
+
colStart: 0,
|
|
51
|
+
colSpan: 5,
|
|
52
|
+
rowStart: 0,
|
|
53
|
+
rowSpan: 1,
|
|
54
|
+
x: 0,
|
|
55
|
+
y: 0,
|
|
56
|
+
width: 0,
|
|
57
|
+
height: 0
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "terminal",
|
|
61
|
+
label: "Terminal",
|
|
62
|
+
description: "Bash commands \u2014 Server room",
|
|
63
|
+
icon: "\u{1F4BB}",
|
|
64
|
+
color: 2278750,
|
|
65
|
+
colStart: 5,
|
|
66
|
+
colSpan: 3,
|
|
67
|
+
rowStart: 0,
|
|
68
|
+
rowSpan: 1,
|
|
69
|
+
x: 0,
|
|
70
|
+
y: 0,
|
|
71
|
+
width: 0,
|
|
72
|
+
height: 0
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "web",
|
|
76
|
+
label: "Web",
|
|
77
|
+
description: "WebFetch, Browser \u2014 Network hub",
|
|
78
|
+
icon: "\u{1F310}",
|
|
79
|
+
color: 9133302,
|
|
80
|
+
colStart: 8,
|
|
81
|
+
colSpan: 4,
|
|
82
|
+
rowStart: 0,
|
|
83
|
+
rowSpan: 1,
|
|
84
|
+
x: 0,
|
|
85
|
+
y: 0,
|
|
86
|
+
width: 0,
|
|
87
|
+
height: 0
|
|
88
|
+
},
|
|
89
|
+
// Row 1
|
|
90
|
+
{
|
|
91
|
+
id: "files",
|
|
92
|
+
label: "Files",
|
|
93
|
+
description: "Read, Write, Edit, Glob \u2014 File storage",
|
|
94
|
+
icon: "\u{1F4C1}",
|
|
95
|
+
color: 3900150,
|
|
96
|
+
colStart: 0,
|
|
97
|
+
colSpan: 4,
|
|
98
|
+
rowStart: 1,
|
|
99
|
+
rowSpan: 1,
|
|
100
|
+
x: 0,
|
|
101
|
+
y: 0,
|
|
102
|
+
width: 0,
|
|
103
|
+
height: 0
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "thinking",
|
|
107
|
+
label: "Thinking",
|
|
108
|
+
description: "Planning, Questions \u2014 Conference area",
|
|
109
|
+
icon: "\u{1F4AD}",
|
|
110
|
+
color: 16347926,
|
|
111
|
+
colStart: 4,
|
|
112
|
+
colSpan: 5,
|
|
113
|
+
rowStart: 1,
|
|
114
|
+
rowSpan: 1,
|
|
115
|
+
x: 0,
|
|
116
|
+
y: 0,
|
|
117
|
+
width: 0,
|
|
118
|
+
height: 0
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: "messaging",
|
|
122
|
+
label: "Messaging",
|
|
123
|
+
description: "SendMessage, Teams \u2014 Chat & relax",
|
|
124
|
+
icon: "\u{1F4AC}",
|
|
125
|
+
color: 15485081,
|
|
126
|
+
colStart: 9,
|
|
127
|
+
colSpan: 3,
|
|
128
|
+
rowStart: 1,
|
|
129
|
+
rowSpan: 1,
|
|
130
|
+
x: 0,
|
|
131
|
+
y: 0,
|
|
132
|
+
width: 0,
|
|
133
|
+
height: 0
|
|
134
|
+
},
|
|
135
|
+
// Row 2
|
|
136
|
+
{
|
|
137
|
+
id: "spawn",
|
|
138
|
+
label: "Spawn",
|
|
139
|
+
description: "Agent spawn/despawn \u2014 Entry portal",
|
|
140
|
+
icon: "\u{1F300}",
|
|
141
|
+
color: 11032055,
|
|
142
|
+
colStart: 0,
|
|
143
|
+
colSpan: 3,
|
|
144
|
+
rowStart: 2,
|
|
145
|
+
rowSpan: 1,
|
|
146
|
+
x: 0,
|
|
147
|
+
y: 0,
|
|
148
|
+
width: 0,
|
|
149
|
+
height: 0
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "idle",
|
|
153
|
+
label: "Idle",
|
|
154
|
+
description: "Idle agents rest here \u2014 Kitchen & lounge",
|
|
155
|
+
icon: "\u2615",
|
|
156
|
+
color: 7041664,
|
|
157
|
+
colStart: 3,
|
|
158
|
+
colSpan: 5,
|
|
159
|
+
rowStart: 2,
|
|
160
|
+
rowSpan: 1,
|
|
161
|
+
x: 0,
|
|
162
|
+
y: 0,
|
|
163
|
+
width: 0,
|
|
164
|
+
height: 0
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "tasks",
|
|
168
|
+
label: "Tasks",
|
|
169
|
+
description: "TaskCreate, TaskUpdate \u2014 Kanban & planning",
|
|
170
|
+
icon: "\u{1F4CB}",
|
|
171
|
+
color: 1357990,
|
|
172
|
+
colStart: 8,
|
|
173
|
+
colSpan: 4,
|
|
174
|
+
rowStart: 2,
|
|
175
|
+
rowSpan: 1,
|
|
176
|
+
x: 0,
|
|
177
|
+
y: 0,
|
|
178
|
+
width: 0,
|
|
179
|
+
height: 0
|
|
180
|
+
}
|
|
181
|
+
];
|
|
182
|
+
var ZONE_MAP = new Map(ZONES.map((z) => [z.id, z]));
|
|
183
|
+
var OpenCodeParser = class {
|
|
184
|
+
/**
|
|
185
|
+
* Convert an OpenCode part JSON object into a ParsedActivity.
|
|
186
|
+
* All tool names and input field names are normalized to canonical form
|
|
187
|
+
* so downstream code (activity-processor, TOOL_ZONE_MAP, etc.) needs no
|
|
188
|
+
* agent-specific branches.
|
|
189
|
+
*
|
|
190
|
+
* Returns null for parts that carry no actionable activity.
|
|
191
|
+
*/
|
|
192
|
+
parsePart(partData, messageData) {
|
|
193
|
+
if (partData.type === "tool") {
|
|
194
|
+
const tool = partData;
|
|
195
|
+
if (tool.state.status === "pending")
|
|
196
|
+
return null;
|
|
197
|
+
const rawInput = tool.state.input ?? {};
|
|
198
|
+
return {
|
|
199
|
+
type: "tool_use",
|
|
200
|
+
toolName: normalizeToolName(tool.tool),
|
|
201
|
+
toolInput: normalizeToolInput(rawInput),
|
|
202
|
+
agentName: messageData?.agent,
|
|
203
|
+
model: messageData?.modelID
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (partData.type === "text") {
|
|
207
|
+
const text = partData;
|
|
208
|
+
if (text.synthetic)
|
|
209
|
+
return null;
|
|
210
|
+
const trimmed = text.text?.trim() ?? "";
|
|
211
|
+
if (trimmed.length === 0 || trimmed.length >= 200)
|
|
212
|
+
return null;
|
|
213
|
+
return {
|
|
214
|
+
type: "text",
|
|
215
|
+
text: trimmed,
|
|
216
|
+
agentName: messageData?.agent,
|
|
217
|
+
model: messageData?.modelID
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
if (partData.type === "reasoning") {
|
|
221
|
+
const reasoning = partData;
|
|
222
|
+
const trimmed = reasoning.text?.trim() ?? "";
|
|
223
|
+
return {
|
|
224
|
+
type: "tool_use",
|
|
225
|
+
toolName: "thinking",
|
|
226
|
+
toolInput: trimmed.length > 0 ? { thought: trimmed.slice(0, 120) } : void 0,
|
|
227
|
+
agentName: messageData?.agent,
|
|
228
|
+
model: messageData?.modelID
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Emit token usage from an assistant message row.
|
|
235
|
+
* Called once per assistant message.
|
|
236
|
+
*/
|
|
237
|
+
parseTokenUsage(messageData) {
|
|
238
|
+
if (messageData.role !== "assistant")
|
|
239
|
+
return null;
|
|
240
|
+
const t = messageData.tokens;
|
|
241
|
+
if (!t?.input && !t?.output)
|
|
242
|
+
return null;
|
|
243
|
+
return {
|
|
244
|
+
type: "token_usage",
|
|
245
|
+
inputTokens: t.input,
|
|
246
|
+
outputTokens: t.output,
|
|
247
|
+
cacheReadTokens: t.cache?.read,
|
|
248
|
+
cacheCreationTokens: t.cache?.write,
|
|
249
|
+
model: messageData.modelID,
|
|
250
|
+
agentName: messageData.agent
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
export {
|
|
255
|
+
OpenCodeParser
|
|
256
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-parser.js","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA8C3E,MAAM,OAAO,cAAc;IACzB;;;;;;;OAOG;IACH,SAAS,CAAC,QAAc,EAAE,WAAiC;QACzD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAoB,CAAC;YAClC,sEAAsE;YACtE,yEAAyE;YACzE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtC,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC;gBACvC,SAAS,EAAE,WAAW,EAAE,KAAK;gBAC7B,KAAK,EAAE,WAAW,EAAE,OAAO;aAC5B,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,QAAoB,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC;YAE/D,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,WAAW,EAAE,KAAK;gBAC7B,KAAK,EAAE,WAAW,EAAE,OAAO;aAC5B,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,4EAA4E;QAC5E,gDAAgD;QAChD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,QAAyB,CAAC;YAC5C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC7C,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC9E,SAAS,EAAE,WAAW,EAAE,KAAK;gBAC7B,KAAK,EAAE,WAAW,EAAE,OAAO;aAC5B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,WAAgC;QAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzC,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,CAAC,CAAC,KAAK;YACpB,YAAY,EAAE,CAAC,CAAC,MAAM;YACtB,eAAe,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI;YAC9B,mBAAmB,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK;YACnC,KAAK,EAAE,WAAW,CAAC,OAAO;YAC1B,SAAS,EAAE,WAAW,CAAC,KAAK;SAC7B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SessionInfo } from '../claude-paths.js';
|
|
2
|
+
/**
|
|
3
|
+
* Find the OpenCode SQLite database file.
|
|
4
|
+
* OpenCode stores everything in a single DB at:
|
|
5
|
+
* Linux/Mac: ~/.local/share/opencode/opencode.db
|
|
6
|
+
* Windows: same path (OpenCode uses XDG even on Windows)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getOpenCodeDbPath(): string | null;
|
|
9
|
+
export interface OpenCodeSessionRow {
|
|
10
|
+
id: string;
|
|
11
|
+
directory: string;
|
|
12
|
+
parent_id: string | null;
|
|
13
|
+
title: string;
|
|
14
|
+
project_id: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convert an OpenCode session DB row into the shared SessionInfo format.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseOpenCodeSession(row: OpenCodeSessionRow): SessionInfo;
|
|
20
|
+
//# sourceMappingURL=opencode-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-paths.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAejD;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,WAAW,CAazE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// dist/watcher/opencode/opencode-paths.js
|
|
2
|
+
import { homedir } from "os";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { existsSync } from "fs";
|
|
5
|
+
function getOpenCodeDbPath() {
|
|
6
|
+
const home = homedir();
|
|
7
|
+
const candidates = [
|
|
8
|
+
join(home, ".local", "share", "opencode", "opencode.db"),
|
|
9
|
+
// Windows fallback via LOCALAPPDATA
|
|
10
|
+
...process.env.LOCALAPPDATA ? [join(process.env.LOCALAPPDATA, "opencode", "opencode.db")] : [],
|
|
11
|
+
join(home, ".opencode", "opencode.db")
|
|
12
|
+
];
|
|
13
|
+
for (const candidate of candidates) {
|
|
14
|
+
if (existsSync(candidate))
|
|
15
|
+
return candidate;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function parseOpenCodeSession(row) {
|
|
20
|
+
const segments = row.directory.replace(/\\/g, "/").split("/").filter(Boolean);
|
|
21
|
+
const projectName = segments[segments.length - 1] || "opencode";
|
|
22
|
+
return {
|
|
23
|
+
// Use the actual directory as projectPath so getGitBranch() gets a valid cwd.
|
|
24
|
+
// projectDir uses the project_id hash to group agents belonging to the same project.
|
|
25
|
+
projectPath: row.directory || row.project_id,
|
|
26
|
+
projectName,
|
|
27
|
+
isSubagent: !!row.parent_id,
|
|
28
|
+
projectDir: row.project_id,
|
|
29
|
+
parentSessionId: row.parent_id ? `oc:${row.parent_id}` : null
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
getOpenCodeDbPath,
|
|
34
|
+
parseOpenCodeSession
|
|
35
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-paths.js","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,UAAU,GAAa;QAC3B,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;QACxD,oCAAoC;QACpC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;YAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC;KACvC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAUD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAuB;IAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;IAEhE,OAAO;QACL,8EAA8E;QAC9E,qFAAqF;QACrF,WAAW,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU;QAC5C,WAAW;QACX,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS;QAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,eAAe,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AgentStateManager } from '../../state/agent-state-manager.js';
|
|
2
|
+
import type { AgentWatcher } from '../agent-watcher.js';
|
|
3
|
+
/**
|
|
4
|
+
* Watches OpenCode's SQLite database for new activity and forwards it to AgentStateManager.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* 1. Open the DB in readonly mode (WAL allows concurrent readers).
|
|
8
|
+
* 2. On startup, replay messages/parts from recently-active sessions.
|
|
9
|
+
* 3. Watch the WAL file (opencode.db-wal) with chokidar — it changes on every write.
|
|
10
|
+
* 4. On each notification, query rows with time_updated > lastSeenTs.
|
|
11
|
+
*/
|
|
12
|
+
export declare class OpenCodeWatcher implements AgentWatcher {
|
|
13
|
+
private stateManager;
|
|
14
|
+
private watcher;
|
|
15
|
+
private db;
|
|
16
|
+
private parser;
|
|
17
|
+
/** Timestamp watermark for incremental polling (ms) */
|
|
18
|
+
private lastMessageTs;
|
|
19
|
+
/** Tracks time_created (not time_updated) so each part is processed exactly once */
|
|
20
|
+
private lastPartCreatedTs;
|
|
21
|
+
/** sessionId → SessionInfo cache */
|
|
22
|
+
private sessions;
|
|
23
|
+
/** messageId → parsed message data cache */
|
|
24
|
+
private messages;
|
|
25
|
+
/** callID → true — deduplicates tool_use per tool invocation */
|
|
26
|
+
private seenCallIds;
|
|
27
|
+
/** row id → true — deduplicates text/token events */
|
|
28
|
+
private seenIds;
|
|
29
|
+
private stmtAllSessions;
|
|
30
|
+
private stmtRecentSessions;
|
|
31
|
+
private stmtMessagesBySession;
|
|
32
|
+
private stmtPartsBySession;
|
|
33
|
+
private stmtNewMessages;
|
|
34
|
+
private stmtNewParts;
|
|
35
|
+
constructor(stateManager: AgentStateManager);
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
stop(): void;
|
|
38
|
+
private prepareStatements;
|
|
39
|
+
private loadAllSessions;
|
|
40
|
+
private replayRecentSessions;
|
|
41
|
+
private replaySession;
|
|
42
|
+
private poll;
|
|
43
|
+
private processMessageRow;
|
|
44
|
+
private processPartRow;
|
|
45
|
+
private getSessionInfo;
|
|
46
|
+
private prefixed;
|
|
47
|
+
private fallbackSession;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=opencode-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-watcher.d.ts","sourceRoot":"","sources":["../../../src/watcher/opencode/opencode-watcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAS5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAkBxD;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,YAAY;IA2BtC,OAAO,CAAC,YAAY;IA1BhC,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,MAAM,CAAwB;IAEtC,uDAAuD;IACvD,OAAO,CAAC,aAAa,CAAK;IAC1B,oFAAoF;IACpF,OAAO,CAAC,iBAAiB,CAAK;IAE9B,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAkC;IAClD,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAA0C;IAC1D,gEAAgE;IAChE,OAAO,CAAC,WAAW,CAAqB;IACxC,qDAAqD;IACrD,OAAO,CAAC,OAAO,CAAqB;IAGpC,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAsB;gBAEtB,YAAY,EAAE,iBAAiB;IAE7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B,IAAI;IAWJ,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,IAAI;IAkCZ,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;CASxB"}
|