neoctl 0.2.35 → 0.2.37
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/dist/agents/agent-report-security.test.d.ts +1 -0
- package/dist/agents/agent-report-security.test.js +301 -0
- package/dist/agents/agent-report-security.test.js.map +1 -0
- package/dist/agents/agent-tool-persistence.test.d.ts +1 -0
- package/dist/agents/agent-tool-persistence.test.js +319 -0
- package/dist/agents/agent-tool-persistence.test.js.map +1 -0
- package/dist/agents/agent-tool.d.ts +3 -0
- package/dist/agents/agent-tool.js +246 -76
- package/dist/agents/agent-tool.js.map +1 -1
- package/dist/agents/live-preview-redaction-security.test.d.ts +1 -0
- package/dist/agents/live-preview-redaction-security.test.js +286 -0
- package/dist/agents/live-preview-redaction-security.test.js.map +1 -0
- package/dist/agents/local-agent-task.d.ts +68 -1
- package/dist/agents/local-agent-task.js +78 -5
- package/dist/agents/local-agent-task.js.map +1 -1
- package/dist/agents/no-nested-delegation.test.d.ts +1 -0
- package/dist/agents/no-nested-delegation.test.js +38 -0
- package/dist/agents/no-nested-delegation.test.js.map +1 -0
- package/dist/agents/obs07-11-run-facts.test.d.ts +1 -0
- package/dist/agents/obs07-11-run-facts.test.js +459 -0
- package/dist/agents/obs07-11-run-facts.test.js.map +1 -0
- package/dist/agents/smoke-agent-lifecycle.d.ts +1 -0
- package/dist/agents/smoke-agent-lifecycle.js +192 -0
- package/dist/agents/smoke-agent-lifecycle.js.map +1 -0
- package/dist/agents/smoke-agents.js +7 -3
- package/dist/agents/smoke-agents.js.map +1 -1
- package/dist/context/context-manager.d.ts +1 -0
- package/dist/context/context-manager.js +10 -6
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/smoke-context.js +46 -3
- package/dist/context/smoke-context.js.map +1 -1
- package/dist/core/image-registry.js +1 -1
- package/dist/core/image-registry.js.map +1 -1
- package/dist/core/obs04-visible-data.test.d.ts +1 -0
- package/dist/core/obs04-visible-data.test.js +147 -0
- package/dist/core/obs04-visible-data.test.js.map +1 -0
- package/dist/core/query-engine.d.ts +5 -0
- package/dist/core/query-engine.js +36 -3
- package/dist/core/query-engine.js.map +1 -1
- package/dist/core/query.d.ts +5 -1
- package/dist/core/query.js +120 -18
- package/dist/core/query.js.map +1 -1
- package/dist/core/run-agent-pause.test.d.ts +1 -0
- package/dist/core/run-agent-pause.test.js +52 -0
- package/dist/core/run-agent-pause.test.js.map +1 -0
- package/dist/core/run-agent-persistence.test.d.ts +1 -0
- package/dist/core/run-agent-persistence.test.js +222 -0
- package/dist/core/run-agent-persistence.test.js.map +1 -0
- package/dist/core/run-agent.d.ts +13 -0
- package/dist/core/run-agent.js +72 -17
- package/dist/core/run-agent.js.map +1 -1
- package/dist/core/smoke-core-loop.js +8 -7
- package/dist/core/smoke-core-loop.js.map +1 -1
- package/dist/model/model-gateway.d.ts +1 -0
- package/dist/model/openai-native-image-guard.test.d.ts +1 -0
- package/dist/model/openai-native-image-guard.test.js +101 -0
- package/dist/model/openai-native-image-guard.test.js.map +1 -0
- package/dist/model/openai-responses-mapper.js +91 -16
- package/dist/model/openai-responses-mapper.js.map +1 -1
- package/dist/plugins/smoke-plugin-system.js +14 -14
- package/dist/repl/index.js +22 -28
- package/dist/repl/index.js.map +1 -1
- package/dist/secrets/secret-redaction.d.ts +6 -5
- package/dist/secrets/secret-redaction.js +7 -79
- package/dist/secrets/secret-redaction.js.map +1 -1
- package/dist/secrets/secret-types.d.ts +4 -1
- package/dist/secrets/secret-types.js.map +1 -1
- package/dist/session/session-store-safety.test.d.ts +1 -0
- package/dist/session/session-store-safety.test.js +107 -0
- package/dist/session/session-store-safety.test.js.map +1 -0
- package/dist/session/session-store.d.ts +5 -1
- package/dist/session/session-store.js +69 -7
- package/dist/session/session-store.js.map +1 -1
- package/dist/session/tool-result-memory.d.ts +3 -1
- package/dist/session/tool-result-memory.js.map +1 -1
- package/dist/tasks/subagent-tools.d.ts +4 -1
- package/dist/tasks/subagent-tools.js +85 -24
- package/dist/tasks/subagent-tools.js.map +1 -1
- package/dist/tasks/subagent-tools.test.d.ts +1 -0
- package/dist/tasks/subagent-tools.test.js +159 -0
- package/dist/tasks/subagent-tools.test.js.map +1 -0
- package/dist/tasks/task-ack-size.test.d.ts +1 -0
- package/dist/tasks/task-ack-size.test.js +101 -0
- package/dist/tasks/task-ack-size.test.js.map +1 -0
- package/dist/tasks/task-persistence.d.ts +23 -0
- package/dist/tasks/task-persistence.js +216 -0
- package/dist/tasks/task-persistence.js.map +1 -0
- package/dist/tasks/task-persistence.test.d.ts +1 -0
- package/dist/tasks/task-persistence.test.js +331 -0
- package/dist/tasks/task-persistence.test.js.map +1 -0
- package/dist/tasks/task-store.d.ts +51 -7
- package/dist/tasks/task-store.js +333 -31
- package/dist/tasks/task-store.js.map +1 -1
- package/dist/tools/builtins/exec-process-manager.d.ts +97 -2
- package/dist/tools/builtins/exec-process-manager.js +218 -19
- package/dist/tools/builtins/exec-process-manager.js.map +1 -1
- package/dist/tools/builtins/exec-tool.js +14 -1
- package/dist/tools/builtins/exec-tool.js.map +1 -1
- package/dist/tools/builtins/image-generation-tool.js +24 -24
- package/dist/tools/builtins/image-generation-tool.js.map +1 -1
- package/dist/tools/smoke-exec-process.js +2 -1
- package/dist/tools/smoke-exec-process.js.map +1 -1
- package/dist/tools/smoke-terminal-output-chain.d.ts +1 -0
- package/dist/tools/smoke-terminal-output-chain.js +245 -0
- package/dist/tools/smoke-terminal-output-chain.js.map +1 -0
- package/dist/tools/smoke-tool-system.js +6 -6
- package/dist/tools/smoke-tool-system.js.map +1 -1
- package/dist/tools/terminal-output-persistence.test.d.ts +1 -0
- package/dist/tools/terminal-output-persistence.test.js +50 -0
- package/dist/tools/terminal-output-persistence.test.js.map +1 -0
- package/dist/tools/terminal-output-store.d.ts +150 -0
- package/dist/tools/terminal-output-store.js +562 -0
- package/dist/tools/terminal-output-store.js.map +1 -0
- package/dist/tools/terminal-output-store.test.d.ts +1 -0
- package/dist/tools/terminal-output-store.test.js +364 -0
- package/dist/tools/terminal-output-store.test.js.map +1 -0
- package/dist/tools/tool.d.ts +5 -0
- package/dist/tools/tool.js.map +1 -1
- package/dist/types/events.d.ts +1 -0
- package/dist/types/messages.d.ts +1 -0
- package/dist/web/agent-content-detail.d.ts +78 -0
- package/dist/web/agent-content-detail.js +495 -0
- package/dist/web/agent-content-detail.js.map +1 -0
- package/dist/web/agent-content-detail.test.d.ts +1 -0
- package/dist/web/agent-content-detail.test.js +307 -0
- package/dist/web/agent-content-detail.test.js.map +1 -0
- package/dist/web/agent-parent-messages.test.d.ts +1 -0
- package/dist/web/agent-parent-messages.test.js +58 -0
- package/dist/web/agent-parent-messages.test.js.map +1 -0
- package/dist/web/agent-tool-payload-security.test.d.ts +1 -0
- package/dist/web/agent-tool-payload-security.test.js +120 -0
- package/dist/web/agent-tool-payload-security.test.js.map +1 -0
- package/dist/web/index.d.ts +213 -9
- package/dist/web/index.js +260 -108
- package/dist/web/index.js.map +1 -1
- package/dist/web/smoke-agent-content-http.d.ts +1 -0
- package/dist/web/smoke-agent-content-http.js +446 -0
- package/dist/web/smoke-agent-content-http.js.map +1 -0
- package/dist/web/smoke-status-semantics.d.ts +1 -0
- package/dist/web/smoke-status-semantics.js +90 -0
- package/dist/web/smoke-status-semantics.js.map +1 -0
- package/dist/web/smoke-task-session-entrypoints.d.ts +1 -0
- package/dist/web/smoke-task-session-entrypoints.js +96 -0
- package/dist/web/smoke-task-session-entrypoints.js.map +1 -0
- package/dist/web/smoke-terminal-output-http.d.ts +1 -0
- package/dist/web/smoke-terminal-output-http.js +372 -0
- package/dist/web/smoke-terminal-output-http.js.map +1 -0
- package/dist/web/smoke-tool-call-detail.d.ts +1 -0
- package/dist/web/smoke-tool-call-detail.js +106 -0
- package/dist/web/smoke-tool-call-detail.js.map +1 -0
- package/dist/web/smoke-tool-call-http.d.ts +1 -0
- package/dist/web/smoke-tool-call-http.js +100 -0
- package/dist/web/smoke-tool-call-http.js.map +1 -0
- package/dist/web/smoke-tool-detail-fields-http.d.ts +1 -0
- package/dist/web/smoke-tool-detail-fields-http.js +121 -0
- package/dist/web/smoke-tool-detail-fields-http.js.map +1 -0
- package/dist/web/smoke-web-agent-tasks.d.ts +1 -0
- package/dist/web/smoke-web-agent-tasks.js +50 -0
- package/dist/web/smoke-web-agent-tasks.js.map +1 -0
- package/dist/web/smoke-web-terminal-tasks.js +126 -76
- package/dist/web/smoke-web-terminal-tasks.js.map +1 -1
- package/dist/web/status-semantics.d.ts +11 -0
- package/dist/web/status-semantics.js +59 -0
- package/dist/web/status-semantics.js.map +1 -0
- package/dist/web/terminal-presentation.d.ts +15 -0
- package/dist/web/terminal-presentation.js +61 -0
- package/dist/web/terminal-presentation.js.map +1 -0
- package/dist/web/terminal-presentation.test.d.ts +1 -0
- package/dist/web/terminal-presentation.test.js +33 -0
- package/dist/web/terminal-presentation.test.js.map +1 -0
- package/dist/web/tool-call-detail.d.ts +40 -0
- package/dist/web/tool-call-detail.js +167 -0
- package/dist/web/tool-call-detail.js.map +1 -0
- package/dist/web/tool-detail-fields.d.ts +59 -0
- package/dist/web/tool-detail-fields.js +119 -0
- package/dist/web/tool-detail-fields.js.map +1 -0
- package/dist/web/tool-detail-fields.test.d.ts +1 -0
- package/dist/web/tool-detail-fields.test.js +121 -0
- package/dist/web/tool-detail-fields.test.js.map +1 -0
- package/package.json +90 -90
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { subagentHeader } from './status-semantics.js';
|
|
4
|
+
/** Compatibility entry point: display user-owned tool data without text rewriting. */
|
|
5
|
+
export function redactToolDetail(value) { return value; }
|
|
6
|
+
// Exact registered agent tools only: unrelated tools may legitimately return arbitrary text.
|
|
7
|
+
const agentPayloadTools = new Set(['subagent_run', 'subagent_get', 'subagent_output', 'subagent_list', 'subagent_resume', 'subagent_stop', 'subagent_message']);
|
|
8
|
+
const agentControlTools = new Set(['subagent_message', 'subagent_stop', 'subagent_resume']);
|
|
9
|
+
const reportUnavailable = '报告正文不可获取:缺少获准展示来源(displaySource);请使用任务/轮次报告入口';
|
|
10
|
+
/** Source authorization, BEFORE registry redaction, serialization or preview slicing.
|
|
11
|
+
* Provenance authorizes only the same result object's content, never sibling/history prose.
|
|
12
|
+
* This is not a secret redactor; callers must retain their existing redaction boundary.
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeAgentToolPayload(name, output) {
|
|
15
|
+
if (!agentPayloadTools.has(name) || output === undefined || output === null)
|
|
16
|
+
return { value: output };
|
|
17
|
+
let withheld = false;
|
|
18
|
+
const unavailable = () => { withheld = true; return `[unavailable: ${reportUnavailable}]`; };
|
|
19
|
+
function body(value, depth) {
|
|
20
|
+
if (value === undefined || value === null)
|
|
21
|
+
return value;
|
|
22
|
+
if (depth > 40)
|
|
23
|
+
return unavailable();
|
|
24
|
+
if (typeof value === 'string') {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse(value);
|
|
27
|
+
if (parsed && typeof parsed === 'object')
|
|
28
|
+
return visit(parsed, depth + 1);
|
|
29
|
+
}
|
|
30
|
+
catch { /* unproven plain/XML prose is not a report */ }
|
|
31
|
+
const header = subagentHeader(value);
|
|
32
|
+
return { ...header, content: unavailable() };
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === 'object')
|
|
35
|
+
return visit(value, depth + 1);
|
|
36
|
+
return unavailable();
|
|
37
|
+
}
|
|
38
|
+
function visit(value, depth, root = false) {
|
|
39
|
+
if (depth > 40)
|
|
40
|
+
return unavailable();
|
|
41
|
+
if (Array.isArray(value))
|
|
42
|
+
return value.map(item => body(item, depth + 1));
|
|
43
|
+
if (!value || typeof value !== 'object')
|
|
44
|
+
return value;
|
|
45
|
+
const data = value;
|
|
46
|
+
const proven = data.displaySource === 'agent_report' || data.displaySource === 'visible_text';
|
|
47
|
+
return Object.fromEntries(Object.entries(data).map(([key, item]) => {
|
|
48
|
+
if (key === 'content')
|
|
49
|
+
return [key, proven && typeof item === 'string' ? item : item == null ? item : unavailable()];
|
|
50
|
+
if (/^(last_?text|text|message|error)$/i.test(key)) {
|
|
51
|
+
// Top-level structured errors are tool diagnostics; nested result/error may be legacy report prose.
|
|
52
|
+
return [key, root && (key === 'error' || (agentControlTools.has(name) && key === 'message')) ? item : item == null ? item : unavailable()];
|
|
53
|
+
}
|
|
54
|
+
if (/^(result|output|report)$/i.test(key))
|
|
55
|
+
return [key, body(item, depth + 1)];
|
|
56
|
+
if (item && typeof item === 'object')
|
|
57
|
+
return [key, visit(item, depth + 1)];
|
|
58
|
+
return [key, item]; // IDs/status/delivery metadata and user delegation prompt/description.
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
let value;
|
|
62
|
+
if (typeof output === 'string') {
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = JSON.parse(output);
|
|
66
|
+
}
|
|
67
|
+
catch { /* legacy XML/plain output */ }
|
|
68
|
+
value = parsed && typeof parsed === 'object'
|
|
69
|
+
? visit(parsed, 0, true)
|
|
70
|
+
: agentControlTools.has(name) ? output : body(output, 0);
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
value = visit(output, 0, true);
|
|
74
|
+
return { value, ...(withheld ? { unavailable: reportUnavailable } : {}) };
|
|
75
|
+
}
|
|
76
|
+
const serialize = (value) => typeof value === 'string' ? value : JSON.stringify(value, null, 2) ?? '';
|
|
77
|
+
const missing = (reason) => ({ state: 'missing', text: '', reason });
|
|
78
|
+
function sourceTruncated(value) {
|
|
79
|
+
if (typeof value === 'string') {
|
|
80
|
+
if (/<persisted-output>|\[Tool result truncated|\[Old tool result content cleared\]/.test(value))
|
|
81
|
+
return true;
|
|
82
|
+
try {
|
|
83
|
+
const parsed = JSON.parse(value);
|
|
84
|
+
return parsed && typeof parsed === 'object' ? sourceTruncated(parsed) : false;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!value || typeof value !== 'object')
|
|
91
|
+
return false;
|
|
92
|
+
return Object.entries(value).some(([key, item]) => (/truncated|hasMore|has_more/.test(key) && item === true) || (key === 'omitted_chars' && item && typeof item === 'object' && Object.values(item).some(n => typeof n === 'number' && n > 0)) || (typeof item === 'object' && sourceTruncated(item)));
|
|
93
|
+
}
|
|
94
|
+
function part(value) {
|
|
95
|
+
if (value === undefined)
|
|
96
|
+
return missing('未提供');
|
|
97
|
+
const truncated = sourceTruncated(value);
|
|
98
|
+
return { state: truncated ? 'truncated' : 'complete', text: serialize(redactToolDetail(value)), reason: truncated ? '数据源已截断;当前为预览,不是完整结果' : '已保存数据的脱敏全文' };
|
|
99
|
+
}
|
|
100
|
+
export function toolErrorText(output, ok) {
|
|
101
|
+
if (ok)
|
|
102
|
+
return '';
|
|
103
|
+
const data = output && typeof output === 'object' ? output : undefined;
|
|
104
|
+
const error = data?.error ?? data?.message ?? (typeof output === 'string' ? output : undefined);
|
|
105
|
+
return error === undefined ? '未提供错误原因' : serialize(redactToolDetail(error));
|
|
106
|
+
}
|
|
107
|
+
export function allowToolDetailRequest(origin, host, fetchSite) {
|
|
108
|
+
if (fetchSite === 'cross-site')
|
|
109
|
+
return false;
|
|
110
|
+
if (!origin)
|
|
111
|
+
return true; // local desktop / non-browser clients share the existing local-user trust boundary
|
|
112
|
+
try {
|
|
113
|
+
return new URL(origin).host === host;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function readToolCallDetail(options) {
|
|
120
|
+
if (!options.sessionId || options.expectedSessionId !== options.sessionId || !options.toolUseId)
|
|
121
|
+
return undefined;
|
|
122
|
+
const blocks = options.entries.flatMap(entry => entry.type === 'message' && entry.message && ['assistant', 'tool_result'].includes(entry.message.role) ? entry.message.blocks.map(block => ({ block, messageId: entry.message.id })) : []);
|
|
123
|
+
const uses = blocks.filter(item => item.block.type === 'tool_use' && item.block.id === options.toolUseId);
|
|
124
|
+
const results = blocks.filter(item => item.block.type === 'tool_result' && item.block.toolUseId === options.toolUseId && (!options.messageId || item.messageId === options.messageId));
|
|
125
|
+
if (uses.length > 1 || results.length > 1 || (!uses.length && !results.length) || (options.messageId && !results.length))
|
|
126
|
+
return undefined;
|
|
127
|
+
const use = uses[0]?.block;
|
|
128
|
+
const result = results[0]?.block;
|
|
129
|
+
if (use && result && use.name !== result.name)
|
|
130
|
+
return undefined;
|
|
131
|
+
const name = result?.name ?? use.name;
|
|
132
|
+
// Secret/config tools are not part of the public ordinary-call payload contract.
|
|
133
|
+
if (/^(secret_|.*config)/i.test(name))
|
|
134
|
+
return undefined;
|
|
135
|
+
let output = result?.output;
|
|
136
|
+
let unavailable = '';
|
|
137
|
+
if (typeof output === 'string' && output.startsWith('<persisted-output>')) {
|
|
138
|
+
try {
|
|
139
|
+
if (!options.sessionDir)
|
|
140
|
+
throw new Error('no session storage');
|
|
141
|
+
const safeId = options.toolUseId.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 160) || 'tool-result';
|
|
142
|
+
const collisions = blocks.some(({ block }) => block.type === 'tool_result' && block.toolUseId !== options.toolUseId && block.toolUseId.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 160) === safeId);
|
|
143
|
+
if (collisions)
|
|
144
|
+
throw new Error('ambiguous storage identity');
|
|
145
|
+
const ref = /Full output saved to: (.+)\r?\n/.exec(output)?.[1]?.trim();
|
|
146
|
+
const dir = path.join(options.sessionDir, 'tool-results');
|
|
147
|
+
if (!ref || !['json', 'txt'].some(ext => path.resolve(ref) === path.resolve(dir, `${safeId}.${ext}`)))
|
|
148
|
+
throw new Error('invalid stored reference');
|
|
149
|
+
const [realDir, realFile, stat] = await Promise.all([fs.realpath(dir), fs.realpath(ref), fs.lstat(ref)]);
|
|
150
|
+
if (stat.isSymbolicLink() || path.dirname(realFile) !== realDir || realDir !== path.join(await fs.realpath(options.sessionDir), 'tool-results'))
|
|
151
|
+
throw new Error('invalid storage path');
|
|
152
|
+
const stored = await fs.readFile(realFile, 'utf8');
|
|
153
|
+
output = ref.endsWith('.json') ? JSON.parse(stored) : stored;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
unavailable = '完整结果不可获取:存储已清理、引用无效或不可访问;以下仅为保存的预览';
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const redact = options.redact ?? ((value) => value);
|
|
160
|
+
const authorized = sanitizeAgentToolPayload(name, output);
|
|
161
|
+
output = redact(authorized.value);
|
|
162
|
+
unavailable ||= authorized.unavailable ?? '';
|
|
163
|
+
return { sessionId: options.sessionId, toolUseId: options.toolUseId, messageId: results[0]?.messageId, toolName: name, ok: result?.ok,
|
|
164
|
+
input: part(redact(use?.input)), result: unavailable ? { ...part(output), state: 'unavailable', reason: unavailable } : part(output),
|
|
165
|
+
error: result?.ok === false ? { ...part(toolErrorText(output, false)), ...(unavailable ? { state: 'unavailable', reason: unavailable } : {}) } : missing(result ? '不适用' : '结果尚未提供') };
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=tool-call-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-detail.js","sourceRoot":"","sources":["../../src/web/tool-call-detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { DetailPart, ToolCallDetail } from './tool-call-detail.js';
|
|
2
|
+
/** OBS06 detail contract. Pure projection, NOT an authorization/redaction boundary.
|
|
3
|
+
* Call only after OBS01 authorization + redaction. Never pass raw messages/context.
|
|
4
|
+
* No IO, defaults from runtime configuration, status inference or summary parsing.
|
|
5
|
+
*/
|
|
6
|
+
export type FieldState = 'provided' | 'not-provided' | 'unspecified' | 'not-applicable';
|
|
7
|
+
export interface DetailField {
|
|
8
|
+
key: string;
|
|
9
|
+
state: FieldState;
|
|
10
|
+
value?: unknown;
|
|
11
|
+
source?: 'input' | 'result' | 'display';
|
|
12
|
+
sourceKey?: string;
|
|
13
|
+
completeness?: DetailPart['state'] | 'summary';
|
|
14
|
+
}
|
|
15
|
+
export type FieldCategory = 'file-read' | 'file-list' | 'file-change' | 'file-search' | 'web-search' | 'subagent' | 'other';
|
|
16
|
+
export interface SanitizedToolFieldsSource {
|
|
17
|
+
toolName: string;
|
|
18
|
+
input?: unknown;
|
|
19
|
+
output?: unknown;
|
|
20
|
+
/** Actual saved display metadata only; never used to infer objects/parameters. */
|
|
21
|
+
purpose?: unknown;
|
|
22
|
+
subject?: unknown;
|
|
23
|
+
inputCompleteness?: DetailPart['state'];
|
|
24
|
+
outputCompleteness?: DetailPart['state'];
|
|
25
|
+
}
|
|
26
|
+
export interface ToolDetailFields {
|
|
27
|
+
toolName: string;
|
|
28
|
+
canonicalName: string;
|
|
29
|
+
category: FieldCategory;
|
|
30
|
+
purpose: DetailField;
|
|
31
|
+
subject: DetailField;
|
|
32
|
+
object: DetailField;
|
|
33
|
+
keyParameters: DetailField[];
|
|
34
|
+
actualPath: DetailField & {
|
|
35
|
+
isAbsolute: boolean;
|
|
36
|
+
copyValue?: string;
|
|
37
|
+
};
|
|
38
|
+
actualProvider: DetailField;
|
|
39
|
+
input: {
|
|
40
|
+
completeness: DetailPart['state'];
|
|
41
|
+
structured: boolean;
|
|
42
|
+
reason: string;
|
|
43
|
+
};
|
|
44
|
+
result: {
|
|
45
|
+
completeness: DetailPart['state'];
|
|
46
|
+
empty: boolean;
|
|
47
|
+
reason: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Direct sanitized JSON values; undefined means not recorded, null is explicit data. */
|
|
51
|
+
export declare function classifyToolDetailFields(source: SanitizedToolFieldsSource): ToolDetailFields;
|
|
52
|
+
/** OBS01 adapter. Parse JSON only, never recover fields from text previews/regex.
|
|
53
|
+
* Truncated valid JSON may expose explicitly present values with truncated provenance;
|
|
54
|
+
* malformed JSON exposes none. Missing/unavailable parts cannot provide facts.
|
|
55
|
+
*/
|
|
56
|
+
export declare function toolDetailFieldsFromDetail(detail: Pick<ToolCallDetail, 'toolName' | 'input' | 'result'>, display?: {
|
|
57
|
+
purpose?: unknown;
|
|
58
|
+
subject?: unknown;
|
|
59
|
+
}): ToolDetailFields;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Specification's explicit locating aliases; no prefix stripping, fuzzy/title matching
|
|
2
|
+
// or invented legacy Task*/Agent names. Runtime-resolved identities should be passed in.
|
|
3
|
+
const aliases = {
|
|
4
|
+
read: 'file_read', list: 'file_list', write: 'file_write', edit: 'file_edit',
|
|
5
|
+
grep: 'file_search', search: 'web_search',
|
|
6
|
+
};
|
|
7
|
+
const specs = {
|
|
8
|
+
file_read: { category: 'file-read', object: 'path', required: ['path'], optional: ['offset', 'limit'] },
|
|
9
|
+
file_list: { category: 'file-list', object: 'path', optional: ['path', 'recursive', 'includeHidden', 'maxEntries', 'maxDepth', 'exclude'] },
|
|
10
|
+
file_write: { category: 'file-change', object: 'path', required: ['path', 'content'], optional: [] },
|
|
11
|
+
file_edit: { category: 'file-change', object: 'path', required: ['path', 'oldString', 'newString'], optional: ['replaceAll'] },
|
|
12
|
+
file_search: { category: 'file-search', object: 'query', required: ['query'], optional: ['path', 'glob', 'caseMode', 'fixedStrings', 'includeHidden', 'contextLines', 'maxResults', 'maxColumns'] },
|
|
13
|
+
web_search: { category: 'web-search', object: 'query', required: ['query'], optional: ['provider', 'numResults', 'includeDomains', 'excludeDomains', 'startPublishedDate', 'endPublishedDate'] },
|
|
14
|
+
subagent_run: { category: 'subagent', object: 'task_id', required: ['prompt'], optional: ['description', 'subagent_type', 'model', 'run_in_background', 'name', 'team_name', 'mode', 'isolation', 'cwd', 'parallel'] },
|
|
15
|
+
subagent_get: { category: 'subagent', object: 'task_id', required: ['task_id'], optional: ['detail'] },
|
|
16
|
+
subagent_output: { category: 'subagent', object: 'task_id', required: ['task_id'], optional: ['block', 'timeout_ms'] },
|
|
17
|
+
subagent_stop: { category: 'subagent', object: 'task_id', required: ['task_id'], optional: [] },
|
|
18
|
+
subagent_message: { category: 'subagent', object: 'task_id', required: ['target', 'message'], optional: [] },
|
|
19
|
+
subagent_resume: { category: 'subagent', object: 'task_id', required: ['task_id'], optional: ['directive'] },
|
|
20
|
+
subagent_list: { category: 'subagent', object: '', optional: [] },
|
|
21
|
+
subagent_report: { category: 'subagent', object: '', required: ['content'], optional: ['status'] },
|
|
22
|
+
};
|
|
23
|
+
const own = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
24
|
+
const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
25
|
+
// Host independent: do not resolve a historical relative path against current cwd.
|
|
26
|
+
const absolute = (value) => typeof value === 'string' && (/^\//.test(value) || /^[a-z]:[\\/]/i.test(value) || /^\\\\[^\\]+\\[^\\]+/.test(value));
|
|
27
|
+
const empty = (value) => value === '' || value === null || (Array.isArray(value) && value.length === 0) || (!!record(value) && Object.keys(value).length === 0);
|
|
28
|
+
const absent = (key, state = 'not-provided') => ({ key, state });
|
|
29
|
+
/** Direct sanitized JSON values; undefined means not recorded, null is explicit data. */
|
|
30
|
+
export function classifyToolDetailFields(source) {
|
|
31
|
+
const canonicalName = own(aliases, source.toolName) ? aliases[source.toolName] : source.toolName;
|
|
32
|
+
const spec = own(specs, canonicalName) ? specs[canonicalName] : undefined;
|
|
33
|
+
const inputState = source.inputCompleteness ?? (source.input === undefined ? 'missing' : 'complete');
|
|
34
|
+
const outputState = source.outputCompleteness ?? (source.output === undefined ? 'missing' : 'complete');
|
|
35
|
+
const input = inputState === 'missing' || inputState === 'unavailable' ? undefined : record(source.input);
|
|
36
|
+
const output = outputState === 'missing' || outputState === 'unavailable' ? undefined : record(source.output);
|
|
37
|
+
function field(key, side, sourceKey = key, optional = false) {
|
|
38
|
+
const data = side === 'input' ? input : output;
|
|
39
|
+
const completeness = side === 'input' ? inputState : outputState;
|
|
40
|
+
if (data && own(data, sourceKey) && data[sourceKey] !== undefined)
|
|
41
|
+
return { key, state: 'provided', value: data[sourceKey], source: side, sourceKey, completeness };
|
|
42
|
+
return absent(key, optional && !!data && completeness === 'complete' ? 'unspecified' : 'not-provided');
|
|
43
|
+
}
|
|
44
|
+
function metadata(key) {
|
|
45
|
+
const value = field(key, 'input');
|
|
46
|
+
if (value.state === 'provided')
|
|
47
|
+
return value;
|
|
48
|
+
const description = key === 'purpose' ? field(key, 'input', 'description') : value;
|
|
49
|
+
if (description.state === 'provided')
|
|
50
|
+
return description;
|
|
51
|
+
if (own(source, key) && source[key] !== undefined)
|
|
52
|
+
return { key, state: 'provided', value: source[key], source: 'display', sourceKey: key, completeness: 'summary' };
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
const file = spec?.category.startsWith('file-') === true;
|
|
56
|
+
let actualPath = absent('actualPath', file ? 'not-provided' : 'not-applicable');
|
|
57
|
+
if (file) {
|
|
58
|
+
const returned = field('actualPath', 'result', canonicalName === 'file_search' ? 'grepPath' : 'path');
|
|
59
|
+
actualPath = returned.state === 'provided' && absolute(returned.value) ? returned : field('actualPath', 'input', 'path', !(spec?.required ?? []).includes('path'));
|
|
60
|
+
}
|
|
61
|
+
let object = spec?.object ? field('object', 'input', spec.object) : absent('object', spec ? 'not-applicable' : 'not-provided');
|
|
62
|
+
if (file && spec?.object === 'path')
|
|
63
|
+
object = { ...actualPath, key: 'object' };
|
|
64
|
+
if (spec?.category === 'subagent' && spec.object) {
|
|
65
|
+
const returnedId = field('object', 'result', 'task_id');
|
|
66
|
+
object = returnedId.state === 'provided' ? returnedId : field('object', 'input', 'task_id');
|
|
67
|
+
if (object.state !== 'provided' && canonicalName === 'subagent_message')
|
|
68
|
+
object = field('object', 'input', 'target');
|
|
69
|
+
}
|
|
70
|
+
const keyParameters = spec ? [
|
|
71
|
+
...(spec.required ?? []).map(key => field(key, 'input')),
|
|
72
|
+
...spec.optional.map(key => field(key, 'input', key, true)),
|
|
73
|
+
field('maxResultChars', 'input', 'maxResultChars', true),
|
|
74
|
+
] : [];
|
|
75
|
+
if (spec?.category === 'subagent') {
|
|
76
|
+
// Output identity is not a requested alias; never infer task/round from purpose.
|
|
77
|
+
for (const key of ['task_id', 'agent_id', 'run_generation', 'prompt']) {
|
|
78
|
+
const returned = field(key, 'result');
|
|
79
|
+
if (returned.state === 'provided')
|
|
80
|
+
keyParameters.push(returned);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const resultValue = record(source.output);
|
|
84
|
+
const emptyResult = outputState === 'complete' && source.output !== undefined && (empty(source.output)
|
|
85
|
+
|| (canonicalName === 'web_search' && !!resultValue && own(resultValue, 'results') && empty(resultValue.results))
|
|
86
|
+
|| (canonicalName === 'file_search' && !!resultValue && own(resultValue, 'matches') && empty(resultValue.matches)));
|
|
87
|
+
return {
|
|
88
|
+
toolName: source.toolName, canonicalName, category: spec?.category ?? 'other',
|
|
89
|
+
purpose: metadata('purpose'), subject: metadata('subject'), object, keyParameters,
|
|
90
|
+
actualPath: { ...actualPath, isAbsolute: absolute(actualPath.value), ...(absolute(actualPath.value) && actualPath.completeness === 'complete' ? { copyValue: actualPath.value } : {}) },
|
|
91
|
+
actualProvider: canonicalName === 'web_search' ? field('actualProvider', 'result', 'provider') : absent('actualProvider', 'not-applicable'),
|
|
92
|
+
input: { completeness: inputState, structured: !!input, reason: '' },
|
|
93
|
+
result: { completeness: outputState, empty: emptyResult, reason: '' },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** OBS01 adapter. Parse JSON only, never recover fields from text previews/regex.
|
|
97
|
+
* Truncated valid JSON may expose explicitly present values with truncated provenance;
|
|
98
|
+
* malformed JSON exposes none. Missing/unavailable parts cannot provide facts.
|
|
99
|
+
*/
|
|
100
|
+
export function toolDetailFieldsFromDetail(detail, display = {}) {
|
|
101
|
+
function parse(part) {
|
|
102
|
+
if (part.state === 'missing' || part.state === 'unavailable')
|
|
103
|
+
return undefined;
|
|
104
|
+
try {
|
|
105
|
+
return JSON.parse(part.text);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return part.text;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const fields = classifyToolDetailFields({ ...display, toolName: detail.toolName,
|
|
112
|
+
input: parse(detail.input), output: parse(detail.result),
|
|
113
|
+
inputCompleteness: detail.input.state, outputCompleteness: detail.result.state,
|
|
114
|
+
});
|
|
115
|
+
fields.input.reason = detail.input.reason;
|
|
116
|
+
fields.result.reason = detail.result.reason;
|
|
117
|
+
return fields;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=tool-detail-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-detail-fields.js","sourceRoot":"","sources":["../../src/web/tool-detail-fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { classifyToolDetailFields as classify, toolDetailFieldsFromDetail as adapt } from './tool-detail-fields.js';
|
|
4
|
+
import { redactToolDetail } from './tool-call-detail.js';
|
|
5
|
+
const param = (f, key) => f.keyParameters.find(p => p.key === key);
|
|
6
|
+
const part = (value, state = 'complete') => ({ text: JSON.stringify(value), state, reason: state });
|
|
7
|
+
test('explicit spec aliases only; unrelated/prototype names never guessed', () => {
|
|
8
|
+
for (const [alias, canonical] of Object.entries({ read: 'file_read', list: 'file_list', write: 'file_write', edit: 'file_edit', grep: 'file_search', search: 'web_search' })) {
|
|
9
|
+
assert.deepEqual(classify({ toolName: alias, input: {} }).keyParameters, classify({ toolName: canonical, input: {} }).keyParameters);
|
|
10
|
+
assert.equal(classify({ toolName: alias }).canonicalName, canonical);
|
|
11
|
+
}
|
|
12
|
+
for (const toolName of ['constructor', '__proto__', 'TaskOutput', 'subagent_fake', 'file_read_more', 'image2']) {
|
|
13
|
+
const f = classify({ toolName, input: { purpose: 'file_read offset 4', title: 'file_read', path: '/fake' } });
|
|
14
|
+
assert.equal(f.category, 'other');
|
|
15
|
+
assert.deepEqual(f.keyParameters, []);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
test('purpose/subject independent; never derive parameters from metadata', () => {
|
|
19
|
+
const f = classify({ toolName: 'read', purpose: 'read /intent offset 99', subject: '/summary', input: { description: 'other intention' } });
|
|
20
|
+
assert.equal(f.purpose.value, 'other intention');
|
|
21
|
+
assert.equal(f.purpose.source, 'input');
|
|
22
|
+
assert.equal(f.subject.completeness, 'summary');
|
|
23
|
+
assert.equal(f.subject.value, '/summary');
|
|
24
|
+
assert.equal(f.object.state, 'not-provided');
|
|
25
|
+
assert.equal(param(f, 'offset').state, 'unspecified');
|
|
26
|
+
assert.equal(classify({ toolName: 'read', input: { purpose: '', description: 'not fallback' } }).purpose.value, '');
|
|
27
|
+
});
|
|
28
|
+
test('real absolute result path wins; raw input path retained; Windows/UNC/POSIX', () => {
|
|
29
|
+
for (const path of ['C:\\work\\真实 文件.ts', '\\\\server\\share\\file', '/work/file']) {
|
|
30
|
+
const f = classify({ toolName: 'file_read', input: { path: './file', offset: 0, limit: 0 }, output: { path } });
|
|
31
|
+
assert.equal(f.actualPath.copyValue, path);
|
|
32
|
+
assert.equal(f.object.value, path);
|
|
33
|
+
assert.equal(param(f, 'path').value, './file');
|
|
34
|
+
assert.equal(param(f, 'offset').value, 0);
|
|
35
|
+
assert.equal(param(f, 'limit').value, 0);
|
|
36
|
+
}
|
|
37
|
+
const f = classify({ toolName: 'read', input: { path: './real' }, output: { path: 'relative-result' } });
|
|
38
|
+
assert.equal(f.actualPath.value, './real');
|
|
39
|
+
assert.equal(f.actualPath.copyValue, undefined);
|
|
40
|
+
});
|
|
41
|
+
test('edit/write preserve empty creation rule, multiline changes and false', () => {
|
|
42
|
+
const input = Object.freeze({ path: '/file', oldString: '', newString: 'a\n b\n', replaceAll: false });
|
|
43
|
+
const f = classify({ toolName: 'edit', input });
|
|
44
|
+
assert.equal(param(f, 'oldString').value, '');
|
|
45
|
+
assert.equal(param(f, 'newString').value, input.newString);
|
|
46
|
+
assert.equal(param(f, 'replaceAll').value, false);
|
|
47
|
+
assert.equal(param(classify({ toolName: 'write', input: { content: '' } }), 'content').state, 'provided');
|
|
48
|
+
});
|
|
49
|
+
test('missing source vs unspecified optional filters vs valid empty results', () => {
|
|
50
|
+
assert.equal(param(classify({ toolName: 'search' }), 'provider').state, 'not-provided');
|
|
51
|
+
const f = classify({ toolName: 'search', input: { query: 'q', includeDomains: [] }, output: { provider: 'exa', results: [] } });
|
|
52
|
+
assert.equal(param(f, 'provider').state, 'unspecified');
|
|
53
|
+
assert.equal(f.actualProvider.value, 'exa');
|
|
54
|
+
assert.equal(f.result.empty, true);
|
|
55
|
+
assert.deepEqual(param(f, 'includeDomains').value, []);
|
|
56
|
+
assert.equal(param(f, 'excludeDomains').state, 'unspecified');
|
|
57
|
+
const requestOnly = classify({ toolName: 'search', input: { provider: 'openai' } });
|
|
58
|
+
assert.equal(requestOnly.actualProvider.state, 'not-provided');
|
|
59
|
+
assert.equal(requestOnly.result.empty, false);
|
|
60
|
+
for (const output of [0, false])
|
|
61
|
+
assert.equal(classify({ toolName: 'search', output }).result.empty, false);
|
|
62
|
+
for (const output of ['', [], null])
|
|
63
|
+
assert.equal(classify({ toolName: 'search', output }).result.empty, true);
|
|
64
|
+
});
|
|
65
|
+
test('search exact fields, real grepPath, requested vs actual provider', () => {
|
|
66
|
+
const grep = classify({ toolName: 'grep', input: { query: 'a\nb', path: '.', glob: [], fixedStrings: false, caseMode: 'sensitive', contextLines: 0, maxResults: 0 }, output: { grepPath: 'C:\\repo', matches: [] } });
|
|
67
|
+
assert.equal(grep.actualPath.copyValue, 'C:\\repo');
|
|
68
|
+
assert.equal(grep.object.value, 'a\nb');
|
|
69
|
+
assert.equal(grep.result.empty, true);
|
|
70
|
+
for (const key of ['contextLines', 'maxResults'])
|
|
71
|
+
assert.equal(param(grep, key).value, 0);
|
|
72
|
+
const input = { query: 'q', provider: 'openai', startPublishedDate: '2026-01-01', endPublishedDate: '2026-09-07', includeDomains: ['example.org'], excludeDomains: [] };
|
|
73
|
+
const f = classify({ toolName: 'web_search', input, output: { provider: 'exa', results: [] } });
|
|
74
|
+
for (const [key, value] of Object.entries(input))
|
|
75
|
+
assert.deepEqual(param(f, key).value, value);
|
|
76
|
+
assert.equal(f.actualProvider.source, 'result');
|
|
77
|
+
assert.equal(f.actualProvider.value, 'exa');
|
|
78
|
+
});
|
|
79
|
+
test('subagent real task identity, target, prompt, directive and controls; no status inference', () => {
|
|
80
|
+
const f = classify({ toolName: 'subagent_message', input: { target: 'worker', message: 'line1\nline2' }, output: { task_id: 'actual-id', agent_id: 'agent', run_generation: 0, status: 'queued' } });
|
|
81
|
+
assert.equal(f.object.value, 'actual-id');
|
|
82
|
+
assert.equal(param(f, 'target').value, 'worker');
|
|
83
|
+
assert.equal(param(f, 'message').value, 'line1\nline2');
|
|
84
|
+
assert.equal(param(f, 'run_generation').value, 0);
|
|
85
|
+
assert.equal(f.keyParameters.some(p => p.key === 'status'), false);
|
|
86
|
+
const prompt = 'delegation\n'.repeat(3000);
|
|
87
|
+
assert.equal(param(classify({ toolName: 'subagent_run', input: { prompt, parallel: false } }), 'prompt').value, prompt);
|
|
88
|
+
assert.equal(param(classify({ toolName: 'subagent_resume', input: { task_id: 'id', directive: '' } }), 'directive').value, '');
|
|
89
|
+
const out = classify({ toolName: 'subagent_output', input: { task_id: 'id', block: false, timeout_ms: 0 } });
|
|
90
|
+
assert.equal(param(out, 'block').value, false);
|
|
91
|
+
assert.equal(param(out, 'timeout_ms').value, 0);
|
|
92
|
+
assert.equal(param(classify({ toolName: 'subagent_get', output: { prompt } }), 'prompt').source, 'result');
|
|
93
|
+
});
|
|
94
|
+
test('OBS01 structural contract, redacted fields, completeness and reasons preserved', () => {
|
|
95
|
+
const detail = { sessionId: 's', toolUseId: 't', toolName: 'edit', input: part(redactToolDetail({ path: '/file', oldString: '', newString: 'Bearer secret-value' })), result: part({ path: '/file' }), error: part('') };
|
|
96
|
+
const before = JSON.stringify(detail);
|
|
97
|
+
const f = adapt(detail);
|
|
98
|
+
assert.equal(JSON.stringify(detail), before);
|
|
99
|
+
assert.equal(f.actualPath.copyValue, '/file');
|
|
100
|
+
assert.equal(String(param(f, 'newString').value).includes('secret-value'), false);
|
|
101
|
+
assert.equal(f.input.reason, 'complete');
|
|
102
|
+
const truncated = adapt({ ...detail, input: part({ path: '/preview' }, 'truncated'), result: part({}, 'missing') });
|
|
103
|
+
assert.equal(truncated.actualPath.value, '/preview');
|
|
104
|
+
assert.equal(truncated.actualPath.copyValue, undefined);
|
|
105
|
+
assert.equal(param(truncated, 'replaceAll').state, 'not-provided');
|
|
106
|
+
assert.equal(truncated.input.completeness, 'truncated');
|
|
107
|
+
for (const state of ['missing', 'unavailable']) {
|
|
108
|
+
const f = adapt({ ...detail, input: part({ path: '/hidden' }, state), result: part({ path: '/hidden' }, state) });
|
|
109
|
+
assert.equal(f.actualPath.state, 'not-provided');
|
|
110
|
+
assert.equal(f.result.empty, false);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
test('malformed JSON and plain/XML text cannot supply fields or task IDs', () => {
|
|
114
|
+
for (const text of ['{"path":"/file",', 'path: /file offset: 4', '<task_id>id</task_id>']) {
|
|
115
|
+
const f = adapt({ toolName: 'file_read', input: { state: 'truncated', text, reason: 'budget' }, result: { state: 'complete', text, reason: 'saved text' } });
|
|
116
|
+
assert.equal(f.actualPath.state, 'not-provided');
|
|
117
|
+
assert.equal(f.input.structured, false);
|
|
118
|
+
assert.equal(f.input.reason, 'budget');
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=tool-detail-fields.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-detail-fields.test.js","sourceRoot":"","sources":["../../src/web/tool-detail-fields.test.ts"],"names":[],"mappings":"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"}
|