neoctl 0.2.36 → 0.2.38

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 (208) hide show
  1. package/dist/agents/agent-definition.d.ts +2 -0
  2. package/dist/agents/agent-definition.js +10 -0
  3. package/dist/agents/agent-definition.js.map +1 -1
  4. package/dist/agents/agent-report-security.test.d.ts +1 -0
  5. package/dist/agents/agent-report-security.test.js +301 -0
  6. package/dist/agents/agent-report-security.test.js.map +1 -0
  7. package/dist/agents/agent-tool-persistence.test.js +9 -3
  8. package/dist/agents/agent-tool-persistence.test.js.map +1 -1
  9. package/dist/agents/agent-tool.d.ts +3 -0
  10. package/dist/agents/agent-tool.js +131 -34
  11. package/dist/agents/agent-tool.js.map +1 -1
  12. package/dist/agents/coordination-boundary.test.d.ts +1 -0
  13. package/dist/agents/coordination-boundary.test.js +58 -0
  14. package/dist/agents/coordination-boundary.test.js.map +1 -0
  15. package/dist/agents/live-preview-redaction-security.test.d.ts +1 -0
  16. package/dist/agents/live-preview-redaction-security.test.js +286 -0
  17. package/dist/agents/live-preview-redaction-security.test.js.map +1 -0
  18. package/dist/agents/local-agent-task.d.ts +27 -1
  19. package/dist/agents/local-agent-task.js +75 -5
  20. package/dist/agents/local-agent-task.js.map +1 -1
  21. package/dist/agents/obs07-11-run-facts.test.d.ts +1 -0
  22. package/dist/agents/obs07-11-run-facts.test.js +459 -0
  23. package/dist/agents/obs07-11-run-facts.test.js.map +1 -0
  24. package/dist/agents/smoke-agent-lifecycle.js +8 -4
  25. package/dist/agents/smoke-agent-lifecycle.js.map +1 -1
  26. package/dist/agents/smoke-agents.js +7 -3
  27. package/dist/agents/smoke-agents.js.map +1 -1
  28. package/dist/context/context-manager.d.ts +5 -0
  29. package/dist/context/context-manager.js +14 -7
  30. package/dist/context/context-manager.js.map +1 -1
  31. package/dist/context/prompt-config.d.ts +35 -0
  32. package/dist/context/prompt-config.js +151 -0
  33. package/dist/context/prompt-config.js.map +1 -0
  34. package/dist/context/prompt-config.test.d.ts +1 -0
  35. package/dist/context/prompt-config.test.js +124 -0
  36. package/dist/context/prompt-config.test.js.map +1 -0
  37. package/dist/context/prompts.d.ts +1 -1
  38. package/dist/context/prompts.js +4 -27
  39. package/dist/context/prompts.js.map +1 -1
  40. package/dist/context/smoke-context.js +49 -4
  41. package/dist/context/smoke-context.js.map +1 -1
  42. package/dist/context/system.md +16 -0
  43. package/dist/core/image-registry.js +1 -1
  44. package/dist/core/image-registry.js.map +1 -1
  45. package/dist/core/obs04-visible-data.test.d.ts +1 -0
  46. package/dist/core/obs04-visible-data.test.js +147 -0
  47. package/dist/core/obs04-visible-data.test.js.map +1 -0
  48. package/dist/core/query-engine.d.ts +32 -1
  49. package/dist/core/query-engine.js +320 -95
  50. package/dist/core/query-engine.js.map +1 -1
  51. package/dist/core/query-session-settings.test.d.ts +1 -0
  52. package/dist/core/query-session-settings.test.js +252 -0
  53. package/dist/core/query-session-settings.test.js.map +1 -0
  54. package/dist/core/query.d.ts +18 -0
  55. package/dist/core/query.js +134 -15
  56. package/dist/core/query.js.map +1 -1
  57. package/dist/core/run-agent.d.ts +2 -0
  58. package/dist/core/run-agent.js +23 -15
  59. package/dist/core/run-agent.js.map +1 -1
  60. package/dist/core/session-settings-prompt.d.ts +35 -0
  61. package/dist/core/session-settings-prompt.js +61 -0
  62. package/dist/core/session-settings-prompt.js.map +1 -0
  63. package/dist/core/session-settings-prompt.test.d.ts +1 -0
  64. package/dist/core/session-settings-prompt.test.js +257 -0
  65. package/dist/core/session-settings-prompt.test.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.js +2 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/model/model-gateway.d.ts +1 -0
  70. package/dist/model/model-metadata.json +97 -99
  71. package/dist/model/openai-native-image-guard.test.d.ts +1 -0
  72. package/dist/model/openai-native-image-guard.test.js +101 -0
  73. package/dist/model/openai-native-image-guard.test.js.map +1 -0
  74. package/dist/model/openai-responses-instructions.test.d.ts +1 -0
  75. package/dist/model/openai-responses-instructions.test.js +64 -0
  76. package/dist/model/openai-responses-instructions.test.js.map +1 -0
  77. package/dist/model/openai-responses-mapper.js +96 -32
  78. package/dist/model/openai-responses-mapper.js.map +1 -1
  79. package/dist/model/smoke-responses-mapper.js +8 -5
  80. package/dist/model/smoke-responses-mapper.js.map +1 -1
  81. package/dist/plugins/smoke-plugin-system.js +14 -14
  82. package/dist/repl/index.js +2 -2
  83. package/dist/repl/index.js.map +1 -1
  84. package/dist/secrets/secret-redaction.d.ts +6 -5
  85. package/dist/secrets/secret-redaction.js +7 -79
  86. package/dist/secrets/secret-redaction.js.map +1 -1
  87. package/dist/secrets/secret-types.d.ts +4 -1
  88. package/dist/secrets/secret-types.js.map +1 -1
  89. package/dist/session/session-export.d.ts +6 -0
  90. package/dist/session/session-export.js.map +1 -1
  91. package/dist/session/session-store.d.ts +15 -1
  92. package/dist/session/session-store.js +30 -2
  93. package/dist/session/session-store.js.map +1 -1
  94. package/dist/tasks/subagent-tools.test.js +1 -0
  95. package/dist/tasks/subagent-tools.test.js.map +1 -1
  96. package/dist/tasks/task-ack-size.test.js +6 -5
  97. package/dist/tasks/task-ack-size.test.js.map +1 -1
  98. package/dist/tasks/task-persistence.d.ts +1 -0
  99. package/dist/tasks/task-persistence.js +31 -9
  100. package/dist/tasks/task-persistence.js.map +1 -1
  101. package/dist/tasks/task-store.d.ts +6 -4
  102. package/dist/tasks/task-store.js +46 -20
  103. package/dist/tasks/task-store.js.map +1 -1
  104. package/dist/tools/builtins/exec-process-manager.d.ts +97 -2
  105. package/dist/tools/builtins/exec-process-manager.js +221 -19
  106. package/dist/tools/builtins/exec-process-manager.js.map +1 -1
  107. package/dist/tools/builtins/exec-tool.js +14 -1
  108. package/dist/tools/builtins/exec-tool.js.map +1 -1
  109. package/dist/tools/builtins/image-generation-tool.js +24 -24
  110. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  111. package/dist/tools/smoke-exec-process.js +2 -1
  112. package/dist/tools/smoke-exec-process.js.map +1 -1
  113. package/dist/tools/smoke-terminal-output-chain.d.ts +1 -0
  114. package/dist/tools/smoke-terminal-output-chain.js +245 -0
  115. package/dist/tools/smoke-terminal-output-chain.js.map +1 -0
  116. package/dist/tools/smoke-tool-system.js +6 -6
  117. package/dist/tools/smoke-tool-system.js.map +1 -1
  118. package/dist/tools/terminal-background-history.test.d.ts +1 -0
  119. package/dist/tools/terminal-background-history.test.js +77 -0
  120. package/dist/tools/terminal-background-history.test.js.map +1 -0
  121. package/dist/tools/terminal-output-persistence.test.d.ts +1 -0
  122. package/dist/tools/terminal-output-persistence.test.js +50 -0
  123. package/dist/tools/terminal-output-persistence.test.js.map +1 -0
  124. package/dist/tools/terminal-output-store.d.ts +154 -0
  125. package/dist/tools/terminal-output-store.js +580 -0
  126. package/dist/tools/terminal-output-store.js.map +1 -0
  127. package/dist/tools/terminal-output-store.test.d.ts +1 -0
  128. package/dist/tools/terminal-output-store.test.js +364 -0
  129. package/dist/tools/terminal-output-store.test.js.map +1 -0
  130. package/dist/types/events.d.ts +1 -0
  131. package/dist/types/messages.d.ts +1 -0
  132. package/dist/web/agent-content-detail.d.ts +78 -0
  133. package/dist/web/agent-content-detail.js +495 -0
  134. package/dist/web/agent-content-detail.js.map +1 -0
  135. package/dist/web/agent-content-detail.test.d.ts +1 -0
  136. package/dist/web/agent-content-detail.test.js +307 -0
  137. package/dist/web/agent-content-detail.test.js.map +1 -0
  138. package/dist/web/agent-parent-messages.test.d.ts +1 -0
  139. package/dist/web/agent-parent-messages.test.js +58 -0
  140. package/dist/web/agent-parent-messages.test.js.map +1 -0
  141. package/dist/web/agent-tool-payload-security.test.d.ts +1 -0
  142. package/dist/web/agent-tool-payload-security.test.js +120 -0
  143. package/dist/web/agent-tool-payload-security.test.js.map +1 -0
  144. package/dist/web/index.d.ts +136 -4
  145. package/dist/web/index.js +303 -78
  146. package/dist/web/index.js.map +1 -1
  147. package/dist/web/prompt-config-protocol.d.ts +4 -0
  148. package/dist/web/prompt-config-protocol.js +57 -0
  149. package/dist/web/prompt-config-protocol.js.map +1 -0
  150. package/dist/web/prompt-config-protocol.test.d.ts +1 -0
  151. package/dist/web/prompt-config-protocol.test.js +78 -0
  152. package/dist/web/prompt-config-protocol.test.js.map +1 -0
  153. package/dist/web/runtime-context-protocol.d.ts +1 -0
  154. package/dist/web/runtime-context-protocol.js +1 -0
  155. package/dist/web/runtime-context-protocol.js.map +1 -1
  156. package/dist/web/session-prompt-integration.test.d.ts +1 -0
  157. package/dist/web/session-prompt-integration.test.js +57 -0
  158. package/dist/web/session-prompt-integration.test.js.map +1 -0
  159. package/dist/web/session-prompt-protocol.d.ts +8 -0
  160. package/dist/web/session-prompt-protocol.js +11 -0
  161. package/dist/web/session-prompt-protocol.js.map +1 -0
  162. package/dist/web/session-settings.test.d.ts +1 -0
  163. package/dist/web/session-settings.test.js +254 -0
  164. package/dist/web/session-settings.test.js.map +1 -0
  165. package/dist/web/smoke-agent-content-http.d.ts +1 -0
  166. package/dist/web/smoke-agent-content-http.js +446 -0
  167. package/dist/web/smoke-agent-content-http.js.map +1 -0
  168. package/dist/web/smoke-status-semantics.d.ts +1 -0
  169. package/dist/web/smoke-status-semantics.js +90 -0
  170. package/dist/web/smoke-status-semantics.js.map +1 -0
  171. package/dist/web/smoke-task-session-entrypoints.js +22 -1
  172. package/dist/web/smoke-task-session-entrypoints.js.map +1 -1
  173. package/dist/web/smoke-terminal-output-http.d.ts +1 -0
  174. package/dist/web/smoke-terminal-output-http.js +377 -0
  175. package/dist/web/smoke-terminal-output-http.js.map +1 -0
  176. package/dist/web/smoke-tool-call-detail.d.ts +1 -0
  177. package/dist/web/smoke-tool-call-detail.js +106 -0
  178. package/dist/web/smoke-tool-call-detail.js.map +1 -0
  179. package/dist/web/smoke-tool-call-http.d.ts +1 -0
  180. package/dist/web/smoke-tool-call-http.js +100 -0
  181. package/dist/web/smoke-tool-call-http.js.map +1 -0
  182. package/dist/web/smoke-tool-detail-fields-http.d.ts +1 -0
  183. package/dist/web/smoke-tool-detail-fields-http.js +121 -0
  184. package/dist/web/smoke-tool-detail-fields-http.js.map +1 -0
  185. package/dist/web/smoke-web-terminal-tasks.js +223 -76
  186. package/dist/web/smoke-web-terminal-tasks.js.map +1 -1
  187. package/dist/web/status-semantics.d.ts +11 -0
  188. package/dist/web/status-semantics.js +59 -0
  189. package/dist/web/status-semantics.js.map +1 -0
  190. package/dist/web/terminal-presentation.d.ts +15 -0
  191. package/dist/web/terminal-presentation.js +61 -0
  192. package/dist/web/terminal-presentation.js.map +1 -0
  193. package/dist/web/terminal-presentation.test.d.ts +1 -0
  194. package/dist/web/terminal-presentation.test.js +33 -0
  195. package/dist/web/terminal-presentation.test.js.map +1 -0
  196. package/dist/web/tool-call-detail.d.ts +40 -0
  197. package/dist/web/tool-call-detail.js +167 -0
  198. package/dist/web/tool-call-detail.js.map +1 -0
  199. package/dist/web/tool-detail-fields.d.ts +59 -0
  200. package/dist/web/tool-detail-fields.js +119 -0
  201. package/dist/web/tool-detail-fields.js.map +1 -0
  202. package/dist/web/tool-detail-fields.test.d.ts +1 -0
  203. package/dist/web/tool-detail-fields.test.js +121 -0
  204. package/dist/web/tool-detail-fields.test.js.map +1 -0
  205. package/docs/prompt-config.md +71 -0
  206. package/package.json +94 -93
  207. package/scripts/build-standalone.mjs +3 -0
  208. package/scripts/copy-prompt-resources.mjs +5 -0
@@ -0,0 +1,40 @@
1
+ import type { Message } from '../types/messages.js';
2
+ export interface DetailPart {
3
+ state: 'complete' | 'truncated' | 'missing' | 'unavailable';
4
+ text: string;
5
+ reason: string;
6
+ }
7
+ export interface ToolCallDetail {
8
+ sessionId: string;
9
+ toolUseId: string;
10
+ messageId?: string;
11
+ toolName: string;
12
+ ok?: boolean;
13
+ input: DetailPart;
14
+ result: DetailPart;
15
+ error: DetailPart;
16
+ }
17
+ /** Compatibility entry point: display user-owned tool data without text rewriting. */
18
+ export declare function redactToolDetail(value: unknown): unknown;
19
+ /** Source authorization, BEFORE registry redaction, serialization or preview slicing.
20
+ * Provenance authorizes only the same result object's content, never sibling/history prose.
21
+ * This is not a secret redactor; callers must retain their existing redaction boundary.
22
+ */
23
+ export declare function sanitizeAgentToolPayload(name: string, output: unknown): {
24
+ value: unknown;
25
+ unavailable?: string;
26
+ };
27
+ export declare function toolErrorText(output: unknown, ok: boolean): string;
28
+ export declare function allowToolDetailRequest(origin: string | undefined, host: string | undefined, fetchSite: string | undefined): boolean;
29
+ export declare function readToolCallDetail(options: {
30
+ sessionId: string;
31
+ expectedSessionId: string;
32
+ sessionDir?: string;
33
+ toolUseId: string;
34
+ messageId?: string;
35
+ redact?: (value: unknown) => unknown;
36
+ entries: readonly {
37
+ type: string;
38
+ message?: Message;
39
+ }[];
40
+ }): Promise<ToolCallDetail | undefined>;
@@ -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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"}