botmux 2.85.1 → 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 (116) hide show
  1. package/dist/core/command-handler.d.ts.map +1 -1
  2. package/dist/core/command-handler.js +209 -1
  3. package/dist/core/command-handler.js.map +1 -1
  4. package/dist/core/cost-calculator.d.ts.map +1 -1
  5. package/dist/core/cost-calculator.js +7 -106
  6. package/dist/core/cost-calculator.js.map +1 -1
  7. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  8. package/dist/core/dashboard-ipc-server.js +240 -2
  9. package/dist/core/dashboard-ipc-server.js.map +1 -1
  10. package/dist/core/passthrough-commands.d.ts.map +1 -1
  11. package/dist/core/passthrough-commands.js +1 -1
  12. package/dist/core/passthrough-commands.js.map +1 -1
  13. package/dist/core/role-resolver.d.ts +1 -0
  14. package/dist/core/role-resolver.d.ts.map +1 -1
  15. package/dist/core/role-resolver.js +14 -0
  16. package/dist/core/role-resolver.js.map +1 -1
  17. package/dist/dashboard/web/app.d.ts.map +1 -1
  18. package/dist/dashboard/web/app.js +15 -4
  19. package/dist/dashboard/web/app.js.map +1 -1
  20. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  21. package/dist/dashboard/web/bot-defaults.js +116 -0
  22. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  23. package/dist/dashboard/web/groups.d.ts +2 -0
  24. package/dist/dashboard/web/groups.d.ts.map +1 -1
  25. package/dist/dashboard/web/groups.js +419 -3
  26. package/dist/dashboard/web/groups.js.map +1 -1
  27. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  28. package/dist/dashboard/web/i18n.js +617 -3
  29. package/dist/dashboard/web/i18n.js.map +1 -1
  30. package/dist/dashboard/web/insights.d.ts +2 -0
  31. package/dist/dashboard/web/insights.d.ts.map +1 -0
  32. package/dist/dashboard/web/insights.js +1523 -0
  33. package/dist/dashboard/web/insights.js.map +1 -0
  34. package/dist/dashboard/web/role-profile-match.d.ts +31 -0
  35. package/dist/dashboard/web/role-profile-match.d.ts.map +1 -0
  36. package/dist/dashboard/web/role-profile-match.js +58 -0
  37. package/dist/dashboard/web/role-profile-match.js.map +1 -0
  38. package/dist/dashboard/web/roles.d.ts +1 -0
  39. package/dist/dashboard/web/roles.d.ts.map +1 -1
  40. package/dist/dashboard/web/roles.js +520 -27
  41. package/dist/dashboard/web/roles.js.map +1 -1
  42. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  43. package/dist/dashboard/web/sessions.js +84 -0
  44. package/dist/dashboard/web/sessions.js.map +1 -1
  45. package/dist/dashboard-web/app.js +1243 -831
  46. package/dist/dashboard-web/index.html +2 -1
  47. package/dist/dashboard-web/style.css +1085 -3
  48. package/dist/dashboard.js +215 -3
  49. package/dist/dashboard.js.map +1 -1
  50. package/dist/i18n/en.d.ts.map +1 -1
  51. package/dist/i18n/en.js +34 -1
  52. package/dist/i18n/en.js.map +1 -1
  53. package/dist/i18n/zh.d.ts.map +1 -1
  54. package/dist/i18n/zh.js +34 -1
  55. package/dist/i18n/zh.js.map +1 -1
  56. package/dist/services/group-creator.d.ts +6 -0
  57. package/dist/services/group-creator.d.ts.map +1 -1
  58. package/dist/services/group-creator.js +54 -5
  59. package/dist/services/group-creator.js.map +1 -1
  60. package/dist/services/insight/antigravity-span-reader.d.ts +3 -0
  61. package/dist/services/insight/antigravity-span-reader.d.ts.map +1 -0
  62. package/dist/services/insight/antigravity-span-reader.js +249 -0
  63. package/dist/services/insight/antigravity-span-reader.js.map +1 -0
  64. package/dist/services/insight/classify.d.ts +7 -0
  65. package/dist/services/insight/classify.d.ts.map +1 -0
  66. package/dist/services/insight/classify.js +46 -0
  67. package/dist/services/insight/classify.js.map +1 -0
  68. package/dist/services/insight/claude-span-reader.d.ts +3 -0
  69. package/dist/services/insight/claude-span-reader.d.ts.map +1 -0
  70. package/dist/services/insight/claude-span-reader.js +257 -0
  71. package/dist/services/insight/claude-span-reader.js.map +1 -0
  72. package/dist/services/insight/codex-span-reader.d.ts +3 -0
  73. package/dist/services/insight/codex-span-reader.d.ts.map +1 -0
  74. package/dist/services/insight/codex-span-reader.js +290 -0
  75. package/dist/services/insight/codex-span-reader.js.map +1 -0
  76. package/dist/services/insight/intent.d.ts +5 -0
  77. package/dist/services/insight/intent.d.ts.map +1 -0
  78. package/dist/services/insight/intent.js +145 -0
  79. package/dist/services/insight/intent.js.map +1 -0
  80. package/dist/services/insight/jsonl.d.ts +10 -0
  81. package/dist/services/insight/jsonl.d.ts.map +1 -0
  82. package/dist/services/insight/jsonl.js +36 -0
  83. package/dist/services/insight/jsonl.js.map +1 -0
  84. package/dist/services/insight/prompt.d.ts +3 -0
  85. package/dist/services/insight/prompt.d.ts.map +1 -0
  86. package/dist/services/insight/prompt.js +99 -0
  87. package/dist/services/insight/prompt.js.map +1 -0
  88. package/dist/services/insight/redact.d.ts +4 -0
  89. package/dist/services/insight/redact.d.ts.map +1 -0
  90. package/dist/services/insight/redact.js +67 -0
  91. package/dist/services/insight/redact.js.map +1 -0
  92. package/dist/services/insight/report.d.ts +29 -0
  93. package/dist/services/insight/report.d.ts.map +1 -0
  94. package/dist/services/insight/report.js +1126 -0
  95. package/dist/services/insight/report.js.map +1 -0
  96. package/dist/services/insight/safe-detail.d.ts +5 -0
  97. package/dist/services/insight/safe-detail.d.ts.map +1 -0
  98. package/dist/services/insight/safe-detail.js +59 -0
  99. package/dist/services/insight/safe-detail.js.map +1 -0
  100. package/dist/services/insight/scrub.d.ts +22 -0
  101. package/dist/services/insight/scrub.d.ts.map +1 -0
  102. package/dist/services/insight/scrub.js +70 -0
  103. package/dist/services/insight/scrub.js.map +1 -0
  104. package/dist/services/insight/types.d.ts +394 -0
  105. package/dist/services/insight/types.d.ts.map +1 -0
  106. package/dist/services/insight/types.js +2 -0
  107. package/dist/services/insight/types.js.map +1 -0
  108. package/dist/services/role-profile-store.d.ts +25 -0
  109. package/dist/services/role-profile-store.d.ts.map +1 -0
  110. package/dist/services/role-profile-store.js +171 -0
  111. package/dist/services/role-profile-store.js.map +1 -0
  112. package/dist/services/transcript-resolver.d.ts +26 -0
  113. package/dist/services/transcript-resolver.d.ts.map +1 -0
  114. package/dist/services/transcript-resolver.js +111 -0
  115. package/dist/services/transcript-resolver.js.map +1 -0
  116. package/package.json +1 -1
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/services/insight/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RawInsightSpan, SafeSpan, SafeSpanTag } from './types.js';
2
+ export declare function toSafeSpan(span: RawInsightSpan, firstEventMs: number | undefined, tags?: SafeSpanTag[]): SafeSpan;
3
+ export declare function safeErrorMessage(code: string): string;
4
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/services/insight/redact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuBxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,GAAE,WAAW,EAAO,GAAG,QAAQ,CAqBrH;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD"}
@@ -0,0 +1,67 @@
1
+ import { safeToolLabel } from './classify.js';
2
+ import { scrubSecrets } from './scrub.js';
3
+ function scrubAllowedText(value) {
4
+ if (!value)
5
+ return undefined;
6
+ const out = value.replace(/\s+/g, ' ').trim();
7
+ if (!out)
8
+ return undefined;
9
+ // Defense-in-depth only: allowSummary() is fail-closed and never passes raw
10
+ // text here today, but route through the shared (ReDoS-safe) scrubber so this
11
+ // copy can't silently regress if the gate ever loosens.
12
+ return scrubSecrets(out).slice(0, 160);
13
+ }
14
+ function allowSummary(value) {
15
+ if (!value)
16
+ return undefined;
17
+ // Fail-closed: only reader-produced structural labels or numeric exit codes
18
+ // cross the daemon IPC boundary. Regex scrub is a second layer, not the gate.
19
+ if (/^(shell command|file edit|read\/search|agent task|tool input|tool result|tool error|patch failed|patch applied)$/.test(value)) {
20
+ return value;
21
+ }
22
+ if (/^exit -?\d+$/.test(value))
23
+ return value;
24
+ return scrubAllowedText(undefined);
25
+ }
26
+ export function toSafeSpan(span, firstEventMs, tags = []) {
27
+ const relStartMs = span.startMs !== undefined && firstEventMs !== undefined
28
+ ? Math.max(0, span.startMs - firstEventMs)
29
+ : 0;
30
+ const safe = {
31
+ tool: safeToolLabel(span.tool),
32
+ phase: span.phase,
33
+ turnIndex: Math.max(0, Math.floor(span.turnIndex)),
34
+ relStartMs,
35
+ status: span.status,
36
+ };
37
+ if (span.durationMs !== undefined)
38
+ safe.durationMs = Math.max(0, Math.round(span.durationMs));
39
+ const inputSummary = allowSummary(span.inputSummary);
40
+ const outputSummary = allowSummary(span.outputSummary);
41
+ if (inputSummary)
42
+ safe.inputSummary = inputSummary;
43
+ if (outputSummary)
44
+ safe.outputSummary = outputSummary;
45
+ if (span.intent)
46
+ safe.intent = span.intent;
47
+ if (span.result)
48
+ safe.result = span.result;
49
+ if (tags.length > 0)
50
+ safe.tags = tags;
51
+ if (span.evidence)
52
+ safe.evidence = span.evidence;
53
+ return safe;
54
+ }
55
+ export function safeErrorMessage(code) {
56
+ switch (code) {
57
+ case 'unsupported_cli':
58
+ return 'Insight is not available for this CLI yet.';
59
+ case 'transcript_missing':
60
+ return 'Transcript is not available for this session yet.';
61
+ case 'parse_error':
62
+ return 'Transcript could not be parsed safely.';
63
+ default:
64
+ return 'Insight is unavailable.';
65
+ }
66
+ }
67
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/services/insight/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { InsightDetail, InsightConversationRole, InsightOverviewSessionInput, InsightReportQuery, InsightSeverity, SafeInsightConversation, SafeInsightOverview, SafeInsightReport, SafeInsightTurnDetail, SafeSpanTag } from './types.js';
2
+ export interface BuildInsightReportOptions {
3
+ detail?: InsightDetail;
4
+ maxSpans?: number;
5
+ slowThresholdMs?: number;
6
+ now?: () => Date;
7
+ }
8
+ export interface BuildInsightOverviewOptions extends BuildInsightReportOptions {
9
+ limit?: number;
10
+ }
11
+ export interface BuildInsightTurnPromptOptions {
12
+ offset?: number;
13
+ limit?: number;
14
+ q?: string;
15
+ role?: InsightConversationRole;
16
+ severity?: InsightSeverity;
17
+ tag?: SafeSpanTag;
18
+ turnIndexes?: number[];
19
+ }
20
+ export declare function __resetInsightReportCacheForTest(): void;
21
+ export declare function buildSafeInsightTurnDetail(q: InsightReportQuery, turnIndexInput: number, opts?: BuildInsightTurnPromptOptions): SafeInsightTurnDetail;
22
+ export declare function buildSafeInsightConversation(q: InsightReportQuery, opts?: BuildInsightTurnPromptOptions): SafeInsightConversation;
23
+ export declare function buildSafeInsightReport(q: InsightReportQuery, opts?: BuildInsightReportOptions): SafeInsightReport;
24
+ export declare function buildSafeInsightOverview(sessions: InsightOverviewSessionInput[], opts?: BuildInsightOverviewOptions): Promise<SafeInsightOverview>;
25
+ export declare function mergeSafeInsightOverviews(overviews: SafeInsightOverview[], opts?: {
26
+ generatedAt?: string;
27
+ limit?: number;
28
+ }): SafeInsightOverview;
29
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/services/insight/report.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EAGb,uBAAuB,EAGvB,2BAA2B,EAC3B,kBAAkB,EAClB,eAAe,EAGf,uBAAuB,EAGvB,mBAAmB,EAGnB,iBAAiB,EAEjB,qBAAqB,EAGrB,WAAW,EAMZ,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAcD,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAg4BD,wBAAgB,0BAA0B,CACxC,CAAC,EAAE,kBAAkB,EACrB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,6BAAkC,GACvC,qBAAqB,CAkCvB;AAED,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,kBAAkB,EACrB,IAAI,GAAE,6BAAkC,GACvC,uBAAuB,CAqBzB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,GAAE,yBAA8B,GAAG,iBAAiB,CAyDrH;AAyDD,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,2BAA2B,EAAE,EACvC,IAAI,GAAE,2BAAgC,GACrC,OAAO,CAAC,mBAAmB,CAAC,CAqE9B;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,mBAAmB,EAAE,EAChC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,mBAAmB,CAoDrB"}