botmux 2.85.0 → 2.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +22 -13
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/command-handler.d.ts.map +1 -1
  5. package/dist/core/command-handler.js +209 -1
  6. package/dist/core/command-handler.js.map +1 -1
  7. package/dist/core/cost-calculator.d.ts.map +1 -1
  8. package/dist/core/cost-calculator.js +7 -106
  9. package/dist/core/cost-calculator.js.map +1 -1
  10. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  11. package/dist/core/dashboard-ipc-server.js +240 -2
  12. package/dist/core/dashboard-ipc-server.js.map +1 -1
  13. package/dist/core/passthrough-commands.d.ts.map +1 -1
  14. package/dist/core/passthrough-commands.js +1 -1
  15. package/dist/core/passthrough-commands.js.map +1 -1
  16. package/dist/core/role-resolver.d.ts +1 -0
  17. package/dist/core/role-resolver.d.ts.map +1 -1
  18. package/dist/core/role-resolver.js +14 -0
  19. package/dist/core/role-resolver.js.map +1 -1
  20. package/dist/daemon.d.ts.map +1 -1
  21. package/dist/daemon.js +4 -1
  22. package/dist/daemon.js.map +1 -1
  23. package/dist/dashboard/bot-onboarding.d.ts +24 -8
  24. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  25. package/dist/dashboard/bot-onboarding.js +170 -49
  26. package/dist/dashboard/bot-onboarding.js.map +1 -1
  27. package/dist/dashboard/bot-payload.d.ts +43 -0
  28. package/dist/dashboard/bot-payload.d.ts.map +1 -0
  29. package/dist/dashboard/bot-payload.js +44 -0
  30. package/dist/dashboard/bot-payload.js.map +1 -0
  31. package/dist/dashboard/registry.d.ts +2 -0
  32. package/dist/dashboard/registry.d.ts.map +1 -1
  33. package/dist/dashboard/registry.js.map +1 -1
  34. package/dist/dashboard/web/app.d.ts.map +1 -1
  35. package/dist/dashboard/web/app.js +15 -4
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/bot-defaults.d.ts +1 -0
  38. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  39. package/dist/dashboard/web/bot-defaults.js +122 -3
  40. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  41. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  42. package/dist/dashboard/web/bot-onboarding.js +60 -4
  43. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  44. package/dist/dashboard/web/groups.d.ts +2 -0
  45. package/dist/dashboard/web/groups.d.ts.map +1 -1
  46. package/dist/dashboard/web/groups.js +419 -3
  47. package/dist/dashboard/web/groups.js.map +1 -1
  48. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  49. package/dist/dashboard/web/i18n.js +631 -3
  50. package/dist/dashboard/web/i18n.js.map +1 -1
  51. package/dist/dashboard/web/insights.d.ts +2 -0
  52. package/dist/dashboard/web/insights.d.ts.map +1 -0
  53. package/dist/dashboard/web/insights.js +1523 -0
  54. package/dist/dashboard/web/insights.js.map +1 -0
  55. package/dist/dashboard/web/overview.d.ts +22 -0
  56. package/dist/dashboard/web/overview.d.ts.map +1 -1
  57. package/dist/dashboard/web/overview.js +6 -1
  58. package/dist/dashboard/web/overview.js.map +1 -1
  59. package/dist/dashboard/web/role-profile-match.d.ts +31 -0
  60. package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
  61. package/dist/dashboard/web/role-profile-match.js +58 -0
  62. package/dist/dashboard/web/role-profile-match.js.map +1 -0
  63. package/dist/dashboard/web/roles.d.ts +1 -0
  64. package/dist/dashboard/web/roles.d.ts.map +1 -1
  65. package/dist/dashboard/web/roles.js +520 -27
  66. package/dist/dashboard/web/roles.js.map +1 -1
  67. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  68. package/dist/dashboard/web/sessions.js +84 -0
  69. package/dist/dashboard/web/sessions.js.map +1 -1
  70. package/dist/dashboard-web/app.js +1246 -823
  71. package/dist/dashboard-web/index.html +2 -1
  72. package/dist/dashboard-web/style.css +1085 -3
  73. package/dist/dashboard.js +273 -39
  74. package/dist/dashboard.js.map +1 -1
  75. package/dist/i18n/en.d.ts.map +1 -1
  76. package/dist/i18n/en.js +34 -1
  77. package/dist/i18n/en.js.map +1 -1
  78. package/dist/i18n/zh.d.ts.map +1 -1
  79. package/dist/i18n/zh.js +34 -1
  80. package/dist/i18n/zh.js.map +1 -1
  81. package/dist/im/lark/client.d.ts.map +1 -1
  82. package/dist/im/lark/client.js +23 -1
  83. package/dist/im/lark/client.js.map +1 -1
  84. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  85. package/dist/im/lark/event-dispatcher.js +16 -9
  86. package/dist/im/lark/event-dispatcher.js.map +1 -1
  87. package/dist/services/group-creator.d.ts +6 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +54 -5
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
  92. package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
  93. package/dist/services/insight/antigravity-span-reader.js +249 -0
  94. package/dist/services/insight/antigravity-span-reader.js.map +1 -0
  95. package/dist/services/insight/classify.d.ts +7 -0
  96. package/dist/services/insight/classify.d.ts.map +1 -0
  97. package/dist/services/insight/classify.js +46 -0
  98. package/dist/services/insight/classify.js.map +1 -0
  99. package/dist/services/insight/claude-span-reader.d.ts +3 -0
  100. package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
  101. package/dist/services/insight/claude-span-reader.js +257 -0
  102. package/dist/services/insight/claude-span-reader.js.map +1 -0
  103. package/dist/services/insight/codex-span-reader.d.ts +3 -0
  104. package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
  105. package/dist/services/insight/codex-span-reader.js +290 -0
  106. package/dist/services/insight/codex-span-reader.js.map +1 -0
  107. package/dist/services/insight/intent.d.ts +5 -0
  108. package/dist/services/insight/intent.d.ts.map +1 -0
  109. package/dist/services/insight/intent.js +145 -0
  110. package/dist/services/insight/intent.js.map +1 -0
  111. package/dist/services/insight/jsonl.d.ts +10 -0
  112. package/dist/services/insight/jsonl.d.ts.map +1 -0
  113. package/dist/services/insight/jsonl.js +36 -0
  114. package/dist/services/insight/jsonl.js.map +1 -0
  115. package/dist/services/insight/prompt.d.ts +3 -0
  116. package/dist/services/insight/prompt.d.ts.map +1 -0
  117. package/dist/services/insight/prompt.js +99 -0
  118. package/dist/services/insight/prompt.js.map +1 -0
  119. package/dist/services/insight/redact.d.ts +4 -0
  120. package/dist/services/insight/redact.d.ts.map +1 -0
  121. package/dist/services/insight/redact.js +67 -0
  122. package/dist/services/insight/redact.js.map +1 -0
  123. package/dist/services/insight/report.d.ts +29 -0
  124. package/dist/services/insight/report.d.ts.map +1 -0
  125. package/dist/services/insight/report.js +1126 -0
  126. package/dist/services/insight/report.js.map +1 -0
  127. package/dist/services/insight/safe-detail.d.ts +5 -0
  128. package/dist/services/insight/safe-detail.d.ts.map +1 -0
  129. package/dist/services/insight/safe-detail.js +59 -0
  130. package/dist/services/insight/safe-detail.js.map +1 -0
  131. package/dist/services/insight/scrub.d.ts +22 -0
  132. package/dist/services/insight/scrub.d.ts.map +1 -0
  133. package/dist/services/insight/scrub.js +70 -0
  134. package/dist/services/insight/scrub.js.map +1 -0
  135. package/dist/services/insight/types.d.ts +394 -0
  136. package/dist/services/insight/types.d.ts.map +1 -0
  137. package/dist/services/insight/types.js +2 -0
  138. package/dist/services/insight/types.js.map +1 -0
  139. package/dist/services/role-profile-store.d.ts +25 -0
  140. package/dist/services/role-profile-store.d.ts.map +1 -0
  141. package/dist/services/role-profile-store.js +171 -0
  142. package/dist/services/role-profile-store.js.map +1 -0
  143. package/dist/services/transcript-resolver.d.ts +26 -0
  144. package/dist/services/transcript-resolver.d.ts.map +1 -0
  145. package/dist/services/transcript-resolver.js +111 -0
  146. package/dist/services/transcript-resolver.js.map +1 -0
  147. package/dist/setup/cli-selection.d.ts +20 -1
  148. package/dist/setup/cli-selection.d.ts.map +1 -1
  149. package/dist/setup/cli-selection.js +45 -5
  150. package/dist/setup/cli-selection.js.map +1 -1
  151. package/dist/worker.js +10 -1
  152. package/dist/worker.js.map +1 -1
  153. package/package.json +1 -1
@@ -0,0 +1,290 @@
1
+ import { phaseForTool, normalizeToolName } from './classify.js';
2
+ import { intentForCodexArguments, resultForToolOutput } from './intent.js';
3
+ import { readCompleteJsonlObjects } from './jsonl.js';
4
+ import { safePromptPreview } from './prompt.js';
5
+ import { safeCommandPreview, safeOutputPreview } from './safe-detail.js';
6
+ function tsMs(value) {
7
+ if (typeof value !== 'string')
8
+ return undefined;
9
+ const ms = Date.parse(value);
10
+ return Number.isFinite(ms) ? ms : undefined;
11
+ }
12
+ function compact(value, max = 160) {
13
+ if (value === undefined || value === null)
14
+ return undefined;
15
+ const text = String(value).replace(/\s+/g, ' ').trim();
16
+ return text ? (text.length > max ? `${text.slice(0, max - 1)}…` : text) : undefined;
17
+ }
18
+ function inputObject(input) {
19
+ if (input && typeof input === 'object' && !Array.isArray(input))
20
+ return input;
21
+ if (typeof input !== 'string')
22
+ return undefined;
23
+ try {
24
+ const parsed = JSON.parse(input);
25
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined;
26
+ }
27
+ catch {
28
+ return undefined;
29
+ }
30
+ }
31
+ function filePathsFromPatch(patch) {
32
+ if (!patch)
33
+ return [];
34
+ const paths = [];
35
+ const re = /^\*\*\* (?:Add|Update|Delete) File: (.+)$/gm;
36
+ let m;
37
+ while ((m = re.exec(patch)))
38
+ paths.push((m[1] ?? '').trim());
39
+ return paths.filter(Boolean);
40
+ }
41
+ function filePathsFromInput(input) {
42
+ const obj = inputObject(input);
43
+ const patch = patchTextFromInput(input);
44
+ const paths = [
45
+ obj?.file_path,
46
+ obj?.path,
47
+ ...filePathsFromPatch(patch),
48
+ ].filter((v) => typeof v === 'string' && v.trim().length > 0);
49
+ return paths.length ? [...new Set(paths)] : undefined;
50
+ }
51
+ function patchTextFromInput(input) {
52
+ const obj = inputObject(input);
53
+ for (const key of ['patch', 'diff', 'content']) {
54
+ if (typeof obj?.[key] === 'string')
55
+ return obj[key];
56
+ }
57
+ return typeof input === 'string' && input.includes('*** Begin Patch') ? input : undefined;
58
+ }
59
+ function countLines(value) {
60
+ if (!value)
61
+ return 0;
62
+ return value.split(/\r\n|\r|\n/).length;
63
+ }
64
+ function editLineCountsFromInput(input) {
65
+ const obj = inputObject(input);
66
+ if (!obj)
67
+ return undefined;
68
+ const oldValue = ['old_string', 'oldStr', 'oldText', 'before', 'search']
69
+ .map(key => obj[key])
70
+ .find((v) => typeof v === 'string');
71
+ const newValue = ['new_string', 'newStr', 'newText', 'replacement', 'replace', 'after', 'content']
72
+ .map(key => obj[key])
73
+ .find((v) => typeof v === 'string');
74
+ if (oldValue === undefined && newValue === undefined)
75
+ return undefined;
76
+ const removed = oldValue === undefined ? 0 : countLines(oldValue);
77
+ const added = newValue === undefined ? 0 : countLines(newValue);
78
+ return added > 0 || removed > 0 ? { added, removed } : undefined;
79
+ }
80
+ function normalizeCodexTool(payload) {
81
+ if (payload?.type === 'custom_tool_call' && payload.name === 'apply_patch')
82
+ return 'apply_patch';
83
+ if (payload?.type !== 'function_call')
84
+ return null;
85
+ if (typeof payload.name === 'string' && payload.name)
86
+ return normalizeToolName(payload.name);
87
+ return 'function_call';
88
+ }
89
+ function outputText(output) {
90
+ if (typeof output === 'string')
91
+ return output;
92
+ if (Array.isArray(output))
93
+ return output.map(outputText).filter(Boolean).join('\n');
94
+ if (output && typeof output === 'object') {
95
+ const any = output;
96
+ if (typeof any.text === 'string')
97
+ return any.text;
98
+ if (typeof any.content === 'string')
99
+ return any.content;
100
+ try {
101
+ return JSON.stringify(output);
102
+ }
103
+ catch {
104
+ return String(output);
105
+ }
106
+ }
107
+ return '';
108
+ }
109
+ function failedExit(output) {
110
+ // Match the real exit phrasings ("Process exited with code N", "exit code: N",
111
+ // "exited N") but bound the gap to the number ([\s:=]{0,4}) so it can't skip
112
+ // whole words to an unrelated number (the old [^\d-]* matched "exited from
113
+ // menu. 1 file changed" → 1).
114
+ const m = /(?:process\s+)?exit(?:ed)?(?:\s+with)?(?:\s+code)?[\s:=]{0,4}(-?\d+)/i.exec(output);
115
+ if (!m)
116
+ return null;
117
+ const code = Number(m[1]);
118
+ return Number.isFinite(code) && code !== 0 ? code : null;
119
+ }
120
+ function wallMs(output) {
121
+ const m = /Wall time:\s*([0-9.]+)s/i.exec(output);
122
+ if (!m)
123
+ return undefined;
124
+ const seconds = Number(m[1]);
125
+ return Number.isFinite(seconds) ? Math.round(seconds * 1000) : undefined;
126
+ }
127
+ function safeOutputSummary(output, errored) {
128
+ const code = failedExit(output);
129
+ if (code !== null)
130
+ return `exit ${code}`;
131
+ if (errored)
132
+ return 'tool error';
133
+ return compact(output) ? 'tool result' : undefined;
134
+ }
135
+ function inputSummary(tool) {
136
+ const phase = phaseForTool(tool);
137
+ if (phase === 'run')
138
+ return 'shell command';
139
+ if (phase === 'edit')
140
+ return 'file edit';
141
+ if (phase === 'research')
142
+ return 'read/search';
143
+ if (phase === 'delegate')
144
+ return 'agent task';
145
+ return undefined;
146
+ }
147
+ function num(value) {
148
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
149
+ }
150
+ function pickNum(obj, keys) {
151
+ if (!obj || typeof obj !== 'object')
152
+ return 0;
153
+ for (const key of keys) {
154
+ const value = num(obj[key]);
155
+ if (value)
156
+ return value;
157
+ }
158
+ return 0;
159
+ }
160
+ function contextPointFromTokenCount(turnIndex, payload, model) {
161
+ if (payload?.type !== 'token_count')
162
+ return undefined;
163
+ const usage = payload?.info?.total_token_usage;
164
+ if (!usage || typeof usage !== 'object')
165
+ return undefined;
166
+ const inputTokens = pickNum(usage, ['input_tokens', 'inputTokens']);
167
+ const outputTokens = pickNum(usage, ['output_tokens', 'outputTokens']);
168
+ const cacheReadTokens = pickNum(usage, ['cached_input_tokens', 'cachedInputTokens', 'cache_read_input_tokens', 'cacheReadInputTokens']);
169
+ const cacheCreateTokens = pickNum(usage, ['cache_creation_input_tokens', 'cacheCreationInputTokens', 'cache_write_input_tokens', 'cacheWriteInputTokens']);
170
+ if (inputTokens + outputTokens + cacheReadTokens + cacheCreateTokens <= 0)
171
+ return undefined;
172
+ const contextTokens = inputTokens + cacheReadTokens + cacheCreateTokens;
173
+ return {
174
+ turnIndex: Math.max(turnIndex, 0),
175
+ inputTokens,
176
+ outputTokens,
177
+ cacheReadTokens,
178
+ cacheCreateTokens,
179
+ contextTokens,
180
+ totalTokens: contextTokens + outputTokens,
181
+ ...(model ? { model } : {}),
182
+ };
183
+ }
184
+ export function parseCodexInsight(path, opts = {}) {
185
+ const read = readCompleteJsonlObjects(path);
186
+ const spans = [];
187
+ const byCall = new Map();
188
+ let firstEventMs;
189
+ let currentTurn = -1;
190
+ let compactions = 0;
191
+ const turnPrompts = [];
192
+ const turnContext = [];
193
+ let currentModel = '';
194
+ for (const entry of read.entries) {
195
+ const ms = tsMs(entry.timestamp);
196
+ if (ms !== undefined)
197
+ firstEventMs = firstEventMs === undefined ? ms : Math.min(firstEventMs, ms);
198
+ const payload = entry?.payload ?? {};
199
+ if (entry?.type === 'compacted' || payload.type === 'context_compacted')
200
+ compactions++;
201
+ const model = payload.model ?? payload.collaboration_mode?.settings?.model;
202
+ if (typeof model === 'string' && model)
203
+ currentModel = model;
204
+ if (entry?.type === 'event_msg' && payload.type === 'user_message') {
205
+ currentTurn++;
206
+ const preview = safePromptPreview(typeof payload.message === 'string' ? payload.message : outputText(payload.message), opts.promptMax);
207
+ if (preview)
208
+ turnPrompts[currentTurn] = preview;
209
+ }
210
+ if (entry?.type === 'event_msg' && payload.type === 'token_count') {
211
+ const point = contextPointFromTokenCount(currentTurn, payload, currentModel);
212
+ if (point)
213
+ turnContext[point.turnIndex] = { ...(turnContext[point.turnIndex] ?? {}), ...point };
214
+ }
215
+ const tool = entry?.type === 'response_item' ? normalizeCodexTool(payload) : null;
216
+ if (tool) {
217
+ const span = {
218
+ tool,
219
+ phase: phaseForTool(tool),
220
+ turnIndex: Math.max(currentTurn, 0),
221
+ startMs: ms,
222
+ status: 'running',
223
+ inputSummary: inputSummary(tool),
224
+ intent: intentForCodexArguments(tool, payload.arguments ?? payload.input),
225
+ };
226
+ if (span.phase === 'run') {
227
+ const command = safeCommandPreview(payload.arguments ?? payload.input);
228
+ if (command)
229
+ span.evidence = { command };
230
+ }
231
+ const filePaths = filePathsFromInput(payload.arguments ?? payload.input);
232
+ if (filePaths)
233
+ span.filePaths = filePaths;
234
+ const patchText = patchTextFromInput(payload.arguments ?? payload.input);
235
+ if (patchText)
236
+ span.patchText = patchText;
237
+ const lineCounts = editLineCountsFromInput(payload.arguments ?? payload.input);
238
+ if (lineCounts)
239
+ span.lineCounts = lineCounts;
240
+ spans.push(span);
241
+ if (typeof payload.call_id === 'string')
242
+ byCall.set(payload.call_id, span);
243
+ continue;
244
+ }
245
+ if (entry?.type === 'response_item' && (payload.type === 'function_call_output' || payload.type === 'custom_tool_call_output')) {
246
+ const span = typeof payload.call_id === 'string' ? byCall.get(payload.call_id) : undefined;
247
+ if (!span)
248
+ continue;
249
+ const out = outputText(payload.output);
250
+ const code = failedExit(out);
251
+ span.status = code !== null ? 'error' : 'ok';
252
+ span.outputSummary = safeOutputSummary(out, code !== null);
253
+ span.result = resultForToolOutput(span, out, code !== null, code ?? undefined);
254
+ if (span.phase === 'run') {
255
+ const safeOutput = safeOutputPreview(out);
256
+ if (safeOutput)
257
+ span.evidence = { ...(span.evidence ?? {}), output: safeOutput };
258
+ }
259
+ const parsedWallMs = wallMs(out);
260
+ if (parsedWallMs !== undefined)
261
+ span.durationMs = parsedWallMs;
262
+ else if (ms !== undefined && span.startMs !== undefined)
263
+ span.durationMs = Math.max(0, ms - span.startMs);
264
+ if (typeof payload.call_id === 'string')
265
+ byCall.delete(payload.call_id);
266
+ continue;
267
+ }
268
+ if (entry?.type === 'event_msg' && payload.type === 'patch_apply_end') {
269
+ const span = typeof payload.call_id === 'string' ? byCall.get(payload.call_id) : undefined;
270
+ if (!span)
271
+ continue;
272
+ span.status = payload.success === false ? 'error' : 'ok';
273
+ span.outputSummary = payload.success === false ? 'patch failed' : 'patch applied';
274
+ span.result = resultForToolOutput(span, undefined, payload.success === false);
275
+ if (ms !== undefined && span.startMs !== undefined)
276
+ span.durationMs = Math.max(0, ms - span.startMs);
277
+ byCall.delete(payload.call_id);
278
+ }
279
+ }
280
+ return {
281
+ spans,
282
+ compactions,
283
+ partial: read.partial,
284
+ asOf: read.asOf,
285
+ firstEventMs,
286
+ turnPrompts,
287
+ turnContext,
288
+ };
289
+ }
290
+ //# sourceMappingURL=codex-span-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-span-reader.js","sourceRoot":"","sources":["../../../src/services/insight/codex-span-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RawInsightSpan, SafeSpanIntent, SafeSpanResult } from './types.js';
2
+ export declare function intentForToolInput(tool: string, input: unknown): SafeSpanIntent;
3
+ export declare function intentForCodexArguments(tool: string, args: unknown): SafeSpanIntent;
4
+ export declare function resultForToolOutput(span: RawInsightSpan, output: string | undefined, errored: boolean, exitCode?: number): SafeSpanResult;
5
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/services/insight/intent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoFjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,CAa/E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,CAGnF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CASzI"}
@@ -0,0 +1,145 @@
1
+ import { basename, extname } from 'node:path';
2
+ import { phaseForTool } from './classify.js';
3
+ function safeSubject(value) {
4
+ if (!value)
5
+ return undefined;
6
+ const clean = value.replace(/[^\w@./:-]+/g, ' ').replace(/\s+/g, ' ').trim();
7
+ if (!clean || /(?:token|secret|password|passwd|pwd|key)=/i.test(clean))
8
+ return undefined;
9
+ return clean.slice(0, 80);
10
+ }
11
+ function safeBaseName(value) {
12
+ if (typeof value !== 'string' || !value.trim())
13
+ return undefined;
14
+ const base = basename(value.trim());
15
+ if (!base || base === '.' || base === '..')
16
+ return undefined;
17
+ const ext = extname(base);
18
+ if (ext && base.length > 80)
19
+ return `*${ext.slice(0, 20)}`;
20
+ return safeSubject(base);
21
+ }
22
+ function shellWords(command) {
23
+ const out = [];
24
+ const re = /"([^"]*)"|'([^']*)'|([^\s]+)/g;
25
+ let m;
26
+ while ((m = re.exec(command)) && out.length < 8)
27
+ out.push(m[1] ?? m[2] ?? m[3] ?? '');
28
+ return out.filter(Boolean);
29
+ }
30
+ function commandFromInput(input) {
31
+ if (typeof input === 'string')
32
+ return input;
33
+ if (!input || typeof input !== 'object')
34
+ return undefined;
35
+ const obj = input;
36
+ for (const key of ['command', 'cmd', 'script']) {
37
+ if (typeof obj[key] === 'string')
38
+ return obj[key];
39
+ }
40
+ return undefined;
41
+ }
42
+ function parseJsonObject(value) {
43
+ if (value && typeof value === 'object' && !Array.isArray(value))
44
+ return value;
45
+ if (typeof value !== 'string')
46
+ return undefined;
47
+ try {
48
+ const parsed = JSON.parse(value);
49
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined;
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ }
55
+ function subjectForPackageCommand(pm, words) {
56
+ const second = words[1];
57
+ const third = words[2];
58
+ if (second === 'test' || second === 'vitest' || second === 'jest')
59
+ return { kind: 'test', subject: `${pm} ${second}` };
60
+ if (second === 'lint')
61
+ return { kind: 'lint', subject: `${pm} lint` };
62
+ if (second === 'build')
63
+ return { kind: 'run_script', subject: `${pm} build`, detail: 'build' };
64
+ if (second === 'exec' && (third === 'tsc' || third === 'vue-tsc'))
65
+ return { kind: 'typecheck', subject: `${pm} exec ${third}` };
66
+ if ((second === 'run' || second === 'run-script') && third) {
67
+ const script = safeSubject(third);
68
+ if (!script)
69
+ return { kind: 'run_script', subject: `${pm} run` };
70
+ if (/test|spec|vitest|jest/i.test(script))
71
+ return { kind: 'test', subject: `${pm} run ${script}` };
72
+ if (/lint/i.test(script))
73
+ return { kind: 'lint', subject: `${pm} run ${script}` };
74
+ if (/type|tsc|check/i.test(script))
75
+ return { kind: 'typecheck', subject: `${pm} run ${script}` };
76
+ return { kind: 'run_script', subject: `${pm} run ${script}`, detail: script };
77
+ }
78
+ return { kind: 'run_script', subject: pm };
79
+ }
80
+ function intentForCommand(command) {
81
+ const words = shellWords(command ?? '');
82
+ const cmd = words[0]?.split('/').pop() ?? '';
83
+ if (!cmd)
84
+ return { kind: 'unknown' };
85
+ if (['pnpm', 'npm', 'yarn', 'bun'].includes(cmd))
86
+ return subjectForPackageCommand(cmd, words);
87
+ if (cmd === 'npx' && (words[1] === 'tsc' || words[1] === 'vue-tsc'))
88
+ return { kind: 'typecheck', subject: 'npx tsc' };
89
+ if (cmd === 'tsc' || cmd === 'vue-tsc')
90
+ return { kind: 'typecheck', subject: cmd };
91
+ if (cmd === 'eslint')
92
+ return { kind: 'lint', subject: 'eslint' };
93
+ if (cmd === 'vitest' || cmd === 'jest' || cmd === 'pytest')
94
+ return { kind: 'test', subject: cmd };
95
+ if (cmd === 'go' && words[1] === 'test')
96
+ return { kind: 'test', subject: 'go test' };
97
+ if (cmd === 'cargo' && words[1] === 'test')
98
+ return { kind: 'test', subject: 'cargo test' };
99
+ if (cmd === 'git') {
100
+ const sub = safeSubject(words[1]);
101
+ return { kind: 'git', subject: sub ? `git ${sub}` : 'git' };
102
+ }
103
+ if (cmd === 'rg' || cmd === 'grep')
104
+ return { kind: 'search', subject: cmd };
105
+ return { kind: 'unknown' };
106
+ }
107
+ export function intentForToolInput(tool, input) {
108
+ const phase = phaseForTool(tool);
109
+ if (phase === 'run')
110
+ return intentForCommand(commandFromInput(input));
111
+ if (phase === 'research')
112
+ return {
113
+ kind: tool.toLowerCase().includes('read') ? 'read_file' : 'search',
114
+ subject: safeBaseName(parseJsonObject(input)?.file_path ?? parseJsonObject(input)?.path),
115
+ };
116
+ if (phase === 'edit')
117
+ return {
118
+ kind: tool.toLowerCase().includes('write') ? 'write_file' : 'edit_file',
119
+ subject: safeBaseName(parseJsonObject(input)?.file_path ?? parseJsonObject(input)?.path) ?? (tool === 'apply_patch' ? 'patch' : undefined),
120
+ };
121
+ if (phase === 'delegate')
122
+ return { kind: 'delegate', subject: 'agent task' };
123
+ return { kind: 'unknown' };
124
+ }
125
+ export function intentForCodexArguments(tool, args) {
126
+ const parsed = parseJsonObject(args);
127
+ return intentForToolInput(tool, parsed ?? args);
128
+ }
129
+ export function resultForToolOutput(span, output, errored, exitCode) {
130
+ if (!errored && exitCode === undefined)
131
+ return { category: output ? 'ok' : 'no_output' };
132
+ const out = output ?? '';
133
+ if (/timed?\s*out|timeout/i.test(out))
134
+ return { category: 'timeout', ...(exitCode !== undefined ? { exitCode } : {}) };
135
+ if (span.intent?.kind === 'test')
136
+ return { category: 'test_failed', ...(exitCode !== undefined ? { exitCode } : {}) };
137
+ if (span.intent?.kind === 'typecheck')
138
+ return { category: 'typecheck_failed', ...(exitCode !== undefined ? { exitCode } : {}) };
139
+ if (span.intent?.kind === 'lint')
140
+ return { category: 'lint_failed', ...(exitCode !== undefined ? { exitCode } : {}) };
141
+ if (span.phase === 'run')
142
+ return { category: 'command_failed', ...(exitCode !== undefined ? { exitCode } : {}) };
143
+ return { category: 'tool_error', ...(exitCode !== undefined ? { exitCode } : {}) };
144
+ }
145
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/services/insight/intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface JsonlReadResult {
2
+ entries: any[];
3
+ asOf?: string;
4
+ partial: boolean;
5
+ }
6
+ /** Full-file JSONL reader for pull-mode insight.
7
+ * It commits only complete newline-terminated rows and discards the trailing
8
+ * partial row, matching the live transcript bridge's half-write tolerance. */
9
+ export declare function readCompleteJsonlObjects(path: string): JsonlReadResult;
10
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/services/insight/jsonl.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAUD;;+EAE+E;AAC/E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAoBtE"}
@@ -0,0 +1,36 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ /** Guard the single-threaded daemon: insight parse is synchronous (full
3
+ * readFileSync + per-line JSON.parse), so an oversized transcript would block
4
+ * the event loop and spike RSS — and the overview path parses up to 500 of them
5
+ * per request. Insight is advisory, so a transcript past this ceiling is skipped
6
+ * (partial:true, no spans) rather than read whole. Normal sessions are far below
7
+ * this; only pathological multi-month transcripts trip it. */
8
+ const MAX_TRANSCRIPT_BYTES = 32 * 1024 * 1024;
9
+ /** Full-file JSONL reader for pull-mode insight.
10
+ * It commits only complete newline-terminated rows and discards the trailing
11
+ * partial row, matching the live transcript bridge's half-write tolerance. */
12
+ export function readCompleteJsonlObjects(path) {
13
+ const st = statSync(path);
14
+ if (st.size > MAX_TRANSCRIPT_BYTES) {
15
+ return { entries: [], asOf: new Date(st.mtimeMs).toISOString(), partial: true };
16
+ }
17
+ const raw = readFileSync(path, 'utf-8');
18
+ const lastNl = raw.lastIndexOf('\n');
19
+ const partial = raw.length > 0 && lastNl !== raw.length - 1;
20
+ const committed = lastNl >= 0 ? raw.slice(0, lastNl) : '';
21
+ const entries = [];
22
+ for (const line of committed.split('\n')) {
23
+ if (!line.trim())
24
+ continue;
25
+ try {
26
+ const parsed = JSON.parse(line);
27
+ if (parsed && typeof parsed === 'object')
28
+ entries.push(parsed);
29
+ }
30
+ catch {
31
+ // Skip malformed committed rows defensively; insight is advisory.
32
+ }
33
+ }
34
+ return { entries, asOf: new Date(st.mtimeMs).toISOString(), partial };
35
+ }
36
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/services/insight/jsonl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQjD;;;;;+DAK+D;AAC/D,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C;;+EAE+E;AAC/E,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TurnPromptPreview } from './types.js';
2
+ export declare function safePromptPreview(value: string | undefined, max?: number): TurnPromptPreview | undefined;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/services/insight/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AA2FtE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAqB,GAAG,iBAAiB,GAAG,SAAS,CAapH"}
@@ -0,0 +1,99 @@
1
+ import { safeScrubAndTruncate } from './scrub.js';
2
+ const MAX_PROMPT_PREVIEW = 400;
3
+ function extractBotmuxUserText(value) {
4
+ const match = value.match(/<user_message>\s*([\s\S]*?)\s*<\/user_message>/);
5
+ let text = match?.[1] ?? value;
6
+ text = text
7
+ .replace(/<botmux_reminder>[\s\S]*?<\/botmux_reminder>/g, '')
8
+ .replace(/<mentions>[\s\S]*?<\/mentions>/g, '')
9
+ .replace(/<sender\b[\s\S]*?<\/sender>/g, '')
10
+ .replace(/<sender\b[\s\S]*?\/>/g, '')
11
+ .replace(/<session_id>[\s\S]*?<\/session_id>/g, '')
12
+ .replace(/<\/?user_message>/g, '')
13
+ .replace(/^\s*\[用户引用了消息[^\n]*\]\s*$/gm, '')
14
+ .replace(/^\s*\[来自[^\n]*@mention[^\n]*\]\s*$/gm, '')
15
+ .trim();
16
+ return text;
17
+ }
18
+ function decodeAttr(value) {
19
+ return value
20
+ .replace(/&quot;/g, '"')
21
+ .replace(/&apos;/g, "'")
22
+ .replace(/&lt;/g, '<')
23
+ .replace(/&gt;/g, '>')
24
+ .replace(/&amp;/g, '&');
25
+ }
26
+ function attrsFromTag(value) {
27
+ const out = {};
28
+ const re = /([A-Za-z_][\w:-]*)=(["'])(.*?)\2/g;
29
+ let m;
30
+ while ((m = re.exec(value))) {
31
+ out[m[1]] = decodeAttr(m[3] ?? '');
32
+ }
33
+ return out;
34
+ }
35
+ function compactName(value) {
36
+ const text = value?.replace(/\s+/g, ' ').trim();
37
+ if (!text)
38
+ return undefined;
39
+ return text.slice(0, 60);
40
+ }
41
+ function uniqueNames(values, cap = 8) {
42
+ const names = [...new Set(values.map(compactName).filter((v) => Boolean(v)))].slice(0, cap);
43
+ return names.length ? names : undefined;
44
+ }
45
+ function looksLikeHumanBotMention(text) {
46
+ return /^@\S+/.test(text.trim());
47
+ }
48
+ function extractBotmuxPromptSource(raw, extractedText) {
49
+ const senderAttrs = raw.match(/<sender\b([^>]*)\/?>/)?.[1];
50
+ const sender = senderAttrs ? attrsFromTag(senderAttrs) : {};
51
+ const senderType = sender.type === 'user' || sender.type === 'bot' || sender.type === 'system' ? sender.type : undefined;
52
+ const senderName = compactName(sender.name);
53
+ const isTaskNotification = /<task-notification\b[\s\S]*?<\/task-notification>/i.test(raw)
54
+ || /<task-notification\b/i.test(extractedText);
55
+ const mentionNames = [];
56
+ const mentionsBlock = raw.match(/<mentions>([\s\S]*?)<\/mentions>/)?.[1] ?? '';
57
+ const mentionRe = /<mention\b([^>]*)\/?>/g;
58
+ let mentionMatch;
59
+ while ((mentionMatch = mentionRe.exec(mentionsBlock))) {
60
+ mentionNames.push(attrsFromTag(mentionMatch[1] ?? '').name);
61
+ }
62
+ const quotedBotName = compactName(raw.match(/^\s*\[来自\s+([^\]\n]+?)\s+的 @mention\]\s*$/m)?.[1]);
63
+ if (quotedBotName)
64
+ mentionNames.push(quotedBotName);
65
+ const mentionedNames = uniqueNames(mentionNames);
66
+ const isBotSender = senderType === 'bot';
67
+ const isA2A = isBotSender || Boolean(quotedBotName);
68
+ const inferredUser = !senderType && looksLikeHumanBotMention(extractedText);
69
+ if (!senderType && !senderName && !mentionedNames && !isA2A && !isTaskNotification && !inferredUser)
70
+ return undefined;
71
+ const kind = isTaskNotification ? 'system' : isA2A ? 'a2a_agent' : 'user';
72
+ const agentName = isA2A ? (senderName ?? quotedBotName) : undefined;
73
+ return {
74
+ kind,
75
+ ...(agentName ? { agentName } : {}),
76
+ ...(senderType ? { senderType } : { senderType: isTaskNotification ? 'system' : inferredUser ? 'user' : 'unknown' }),
77
+ ...(senderName ? { senderName } : {}),
78
+ ...(isBotSender ? { isBotSender } : {}),
79
+ ...(isA2A ? { isA2A } : {}),
80
+ ...(mentionedNames ? { mentionedNames } : {}),
81
+ };
82
+ }
83
+ export function safePromptPreview(value, max = MAX_PROMPT_PREVIEW) {
84
+ const raw = (value ?? '').replace(/\r\n?/g, '\n').trim();
85
+ if (!raw)
86
+ return undefined;
87
+ const extractedText = extractBotmuxUserText(raw);
88
+ let text = extractedText;
89
+ if (!text)
90
+ return undefined;
91
+ const source = extractBotmuxPromptSource(raw, extractedText);
92
+ const { text: scrubbed, truncated } = safeScrubAndTruncate(text, max);
93
+ return {
94
+ text: scrubbed,
95
+ truncated,
96
+ ...(source ? { source } : {}),
97
+ };
98
+ }
99
+ //# sourceMappingURL=prompt.js.map