neoctl 0.1.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 (218) hide show
  1. package/README.md +146 -0
  2. package/dist/agents/agent-definition.d.ts +39 -0
  3. package/dist/agents/agent-definition.js +57 -0
  4. package/dist/agents/agent-definition.js.map +1 -0
  5. package/dist/agents/agent-tool.d.ts +38 -0
  6. package/dist/agents/agent-tool.js +336 -0
  7. package/dist/agents/agent-tool.js.map +1 -0
  8. package/dist/agents/local-agent-task.d.ts +52 -0
  9. package/dist/agents/local-agent-task.js +63 -0
  10. package/dist/agents/local-agent-task.js.map +1 -0
  11. package/dist/agents/smoke-agents.d.ts +1 -0
  12. package/dist/agents/smoke-agents.js +142 -0
  13. package/dist/agents/smoke-agents.js.map +1 -0
  14. package/dist/agents/team.d.ts +10 -0
  15. package/dist/agents/team.js +2 -0
  16. package/dist/agents/team.js.map +1 -0
  17. package/dist/app/app-state.d.ts +21 -0
  18. package/dist/app/app-state.js +24 -0
  19. package/dist/app/app-state.js.map +1 -0
  20. package/dist/context/compaction.d.ts +49 -0
  21. package/dist/context/compaction.js +334 -0
  22. package/dist/context/compaction.js.map +1 -0
  23. package/dist/context/context-manager.d.ts +53 -0
  24. package/dist/context/context-manager.js +98 -0
  25. package/dist/context/context-manager.js.map +1 -0
  26. package/dist/context/prompts.d.ts +22 -0
  27. package/dist/context/prompts.js +84 -0
  28. package/dist/context/prompts.js.map +1 -0
  29. package/dist/context/smoke-context.d.ts +1 -0
  30. package/dist/context/smoke-context.js +151 -0
  31. package/dist/context/smoke-context.js.map +1 -0
  32. package/dist/core/assistant-output-filter.d.ts +9 -0
  33. package/dist/core/assistant-output-filter.js +78 -0
  34. package/dist/core/assistant-output-filter.js.map +1 -0
  35. package/dist/core/context-metrics.d.ts +10 -0
  36. package/dist/core/context-metrics.js +77 -0
  37. package/dist/core/context-metrics.js.map +1 -0
  38. package/dist/core/message-pipeline.d.ts +10 -0
  39. package/dist/core/message-pipeline.js +138 -0
  40. package/dist/core/message-pipeline.js.map +1 -0
  41. package/dist/core/query-engine.d.ts +86 -0
  42. package/dist/core/query-engine.js +337 -0
  43. package/dist/core/query-engine.js.map +1 -0
  44. package/dist/core/query.d.ts +47 -0
  45. package/dist/core/query.js +408 -0
  46. package/dist/core/query.js.map +1 -0
  47. package/dist/core/run-agent.d.ts +48 -0
  48. package/dist/core/run-agent.js +150 -0
  49. package/dist/core/run-agent.js.map +1 -0
  50. package/dist/core/smoke-core-loop.d.ts +1 -0
  51. package/dist/core/smoke-core-loop.js +42 -0
  52. package/dist/core/smoke-core-loop.js.map +1 -0
  53. package/dist/core/state.d.ts +37 -0
  54. package/dist/core/state.js +31 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/model/communication-logger.d.ts +30 -0
  60. package/dist/model/communication-logger.js +218 -0
  61. package/dist/model/communication-logger.js.map +1 -0
  62. package/dist/model/config.d.ts +25 -0
  63. package/dist/model/config.js +65 -0
  64. package/dist/model/config.js.map +1 -0
  65. package/dist/model/context-window.d.ts +32 -0
  66. package/dist/model/context-window.js +76 -0
  67. package/dist/model/context-window.js.map +1 -0
  68. package/dist/model/credentials.d.ts +13 -0
  69. package/dist/model/credentials.js +19 -0
  70. package/dist/model/credentials.js.map +1 -0
  71. package/dist/model/env.d.ts +8 -0
  72. package/dist/model/env.js +36 -0
  73. package/dist/model/env.js.map +1 -0
  74. package/dist/model/errors.d.ts +42 -0
  75. package/dist/model/errors.js +74 -0
  76. package/dist/model/errors.js.map +1 -0
  77. package/dist/model/http-transport.d.ts +26 -0
  78. package/dist/model/http-transport.js +118 -0
  79. package/dist/model/http-transport.js.map +1 -0
  80. package/dist/model/model-gateway.d.ts +103 -0
  81. package/dist/model/model-gateway.js +15 -0
  82. package/dist/model/model-gateway.js.map +1 -0
  83. package/dist/model/model-metadata.json +677 -0
  84. package/dist/model/openai-adapter.d.ts +34 -0
  85. package/dist/model/openai-adapter.js +152 -0
  86. package/dist/model/openai-adapter.js.map +1 -0
  87. package/dist/model/openai-chat-mapper.d.ts +11 -0
  88. package/dist/model/openai-chat-mapper.js +114 -0
  89. package/dist/model/openai-chat-mapper.js.map +1 -0
  90. package/dist/model/openai-mappers.d.ts +21 -0
  91. package/dist/model/openai-mappers.js +261 -0
  92. package/dist/model/openai-mappers.js.map +1 -0
  93. package/dist/model/openai-responses-adapter.d.ts +2 -0
  94. package/dist/model/openai-responses-adapter.js +2 -0
  95. package/dist/model/openai-responses-adapter.js.map +1 -0
  96. package/dist/model/openai-responses-mapper.d.ts +11 -0
  97. package/dist/model/openai-responses-mapper.js +218 -0
  98. package/dist/model/openai-responses-mapper.js.map +1 -0
  99. package/dist/model/provider-adapter.d.ts +17 -0
  100. package/dist/model/provider-adapter.js +2 -0
  101. package/dist/model/provider-adapter.js.map +1 -0
  102. package/dist/model/provider-factory.d.ts +4 -0
  103. package/dist/model/provider-factory.js +29 -0
  104. package/dist/model/provider-factory.js.map +1 -0
  105. package/dist/model/retry-runner.d.ts +8 -0
  106. package/dist/model/retry-runner.js +28 -0
  107. package/dist/model/retry-runner.js.map +1 -0
  108. package/dist/model/smoke-openai.d.ts +1 -0
  109. package/dist/model/smoke-openai.js +44 -0
  110. package/dist/model/smoke-openai.js.map +1 -0
  111. package/dist/model/smoke-responses-mapper.d.ts +1 -0
  112. package/dist/model/smoke-responses-mapper.js +72 -0
  113. package/dist/model/smoke-responses-mapper.js.map +1 -0
  114. package/dist/model/sse-decoder.d.ts +5 -0
  115. package/dist/model/sse-decoder.js +79 -0
  116. package/dist/model/sse-decoder.js.map +1 -0
  117. package/dist/repl/clipboard.d.ts +14 -0
  118. package/dist/repl/clipboard.js +92 -0
  119. package/dist/repl/clipboard.js.map +1 -0
  120. package/dist/repl/commands.d.ts +38 -0
  121. package/dist/repl/commands.js +86 -0
  122. package/dist/repl/commands.js.map +1 -0
  123. package/dist/repl/index.d.ts +2 -0
  124. package/dist/repl/index.js +2836 -0
  125. package/dist/repl/index.js.map +1 -0
  126. package/dist/repl/markdown-renderer.d.ts +81 -0
  127. package/dist/repl/markdown-renderer.js +546 -0
  128. package/dist/repl/markdown-renderer.js.map +1 -0
  129. package/dist/repl/render.d.ts +2 -0
  130. package/dist/repl/render.js +45 -0
  131. package/dist/repl/render.js.map +1 -0
  132. package/dist/repl/status-line.d.ts +19 -0
  133. package/dist/repl/status-line.js +160 -0
  134. package/dist/repl/status-line.js.map +1 -0
  135. package/dist/safety/audit.d.ts +10 -0
  136. package/dist/safety/audit.js +2 -0
  137. package/dist/safety/audit.js.map +1 -0
  138. package/dist/safety/permissions.d.ts +10 -0
  139. package/dist/safety/permissions.js +2 -0
  140. package/dist/safety/permissions.js.map +1 -0
  141. package/dist/safety/sandbox.d.ts +6 -0
  142. package/dist/safety/sandbox.js +2 -0
  143. package/dist/safety/sandbox.js.map +1 -0
  144. package/dist/session/session-store.d.ts +98 -0
  145. package/dist/session/session-store.js +249 -0
  146. package/dist/session/session-store.js.map +1 -0
  147. package/dist/session/smoke-session.d.ts +1 -0
  148. package/dist/session/smoke-session.js +85 -0
  149. package/dist/session/smoke-session.js.map +1 -0
  150. package/dist/session/tool-result-memory.d.ts +64 -0
  151. package/dist/session/tool-result-memory.js +303 -0
  152. package/dist/session/tool-result-memory.js.map +1 -0
  153. package/dist/skills/skill-tool.d.ts +28 -0
  154. package/dist/skills/skill-tool.js +107 -0
  155. package/dist/skills/skill-tool.js.map +1 -0
  156. package/dist/skills/smoke-skills.d.ts +1 -0
  157. package/dist/skills/smoke-skills.js +60 -0
  158. package/dist/skills/smoke-skills.js.map +1 -0
  159. package/dist/tasks/task-store.d.ts +43 -0
  160. package/dist/tasks/task-store.js +150 -0
  161. package/dist/tasks/task-store.js.map +1 -0
  162. package/dist/tasks/task-tools.d.ts +31 -0
  163. package/dist/tasks/task-tools.js +232 -0
  164. package/dist/tasks/task-tools.js.map +1 -0
  165. package/dist/tools/builtins/echo-tool.d.ts +4 -0
  166. package/dist/tools/builtins/echo-tool.js +26 -0
  167. package/dist/tools/builtins/echo-tool.js.map +1 -0
  168. package/dist/tools/builtins/edit-tool.d.ts +30 -0
  169. package/dist/tools/builtins/edit-tool.js +423 -0
  170. package/dist/tools/builtins/edit-tool.js.map +1 -0
  171. package/dist/tools/builtins/exec-tool.d.ts +18 -0
  172. package/dist/tools/builtins/exec-tool.js +290 -0
  173. package/dist/tools/builtins/exec-tool.js.map +1 -0
  174. package/dist/tools/builtins/filesystem-tools.d.ts +16 -0
  175. package/dist/tools/builtins/filesystem-tools.js +306 -0
  176. package/dist/tools/builtins/filesystem-tools.js.map +1 -0
  177. package/dist/tools/builtins/grep-tool.d.ts +56 -0
  178. package/dist/tools/builtins/grep-tool.js +320 -0
  179. package/dist/tools/builtins/grep-tool.js.map +1 -0
  180. package/dist/tools/builtins/ripgrep-binary.d.ts +6 -0
  181. package/dist/tools/builtins/ripgrep-binary.js +51 -0
  182. package/dist/tools/builtins/ripgrep-binary.js.map +1 -0
  183. package/dist/tools/builtins/search-providers.d.ts +49 -0
  184. package/dist/tools/builtins/search-providers.js +240 -0
  185. package/dist/tools/builtins/search-providers.js.map +1 -0
  186. package/dist/tools/builtins/search-tool.d.ts +18 -0
  187. package/dist/tools/builtins/search-tool.js +171 -0
  188. package/dist/tools/builtins/search-tool.js.map +1 -0
  189. package/dist/tools/registry.d.ts +18 -0
  190. package/dist/tools/registry.js +69 -0
  191. package/dist/tools/registry.js.map +1 -0
  192. package/dist/tools/run-tool-use.d.ts +13 -0
  193. package/dist/tools/run-tool-use.js +113 -0
  194. package/dist/tools/run-tool-use.js.map +1 -0
  195. package/dist/tools/schema.d.ts +2 -0
  196. package/dist/tools/schema.js +61 -0
  197. package/dist/tools/schema.js.map +1 -0
  198. package/dist/tools/smoke-tool-system.d.ts +1 -0
  199. package/dist/tools/smoke-tool-system.js +204 -0
  200. package/dist/tools/smoke-tool-system.js.map +1 -0
  201. package/dist/tools/streaming-tool-executor.d.ts +19 -0
  202. package/dist/tools/streaming-tool-executor.js +89 -0
  203. package/dist/tools/streaming-tool-executor.js.map +1 -0
  204. package/dist/tools/tool-orchestration.d.ts +15 -0
  205. package/dist/tools/tool-orchestration.js +89 -0
  206. package/dist/tools/tool-orchestration.js.map +1 -0
  207. package/dist/tools/tool.d.ts +121 -0
  208. package/dist/tools/tool.js +4 -0
  209. package/dist/tools/tool.js.map +1 -0
  210. package/dist/types/events.d.ts +66 -0
  211. package/dist/types/events.js +2 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/messages.d.ts +57 -0
  214. package/dist/types/messages.js +42 -0
  215. package/dist/types/messages.js.map +1 -0
  216. package/package.json +49 -0
  217. package/scripts/copy-model-metadata.mjs +4 -0
  218. package/scripts/install-ripgrep.cjs +152 -0
@@ -0,0 +1,151 @@
1
+ import { ModelAPIError } from "../model/errors.js";
2
+ import { QueryEngine } from "../core/query-engine.js";
3
+ import { applyToolResultBudget, appendSystemContext, ensureToolResultPairing, hasValidToolResultPairing, prependUserContext } from "../core/message-pipeline.js";
4
+ import { ToolRegistry } from "../tools/registry.js";
5
+ import { createTextMessage, createToolResultMessage } from "../types/messages.js";
6
+ import { CLEARED_TOOL_RESULT_CONTENT, DeterministicCompactor, microCompactIfNeeded, ModelDrivenCompactor } from "./compaction.js";
7
+ import { DefaultContextManager } from "./context-manager.js";
8
+ import { buildEffectiveSystemPrompt, splitSystemPromptPrefix, SYSTEM_PROMPT_DYNAMIC_BOUNDARY } from "./prompts.js";
9
+ class ContextOverflowThenSuccessGateway {
10
+ calls = 0;
11
+ sawBoundaryOnRetry = false;
12
+ sawUserContext = false;
13
+ sawSystemContext = false;
14
+ async *stream(request) {
15
+ this.calls += 1;
16
+ this.sawUserContext ||= request.messages.some((message) => message.metadata?.userContext === true);
17
+ this.sawSystemContext ||= Boolean(request.systemPrompt?.includes("## System Context"));
18
+ if (this.calls === 1) {
19
+ throw new ModelAPIError({
20
+ category: "context_length",
21
+ provider: "fake",
22
+ message: "context length exceeded",
23
+ retryable: false,
24
+ });
25
+ }
26
+ this.sawBoundaryOnRetry = request.messages.some((message) => message.metadata?.compactBoundary === true);
27
+ yield { type: "assistant_message", message: createTextMessage("assistant", "compacted") };
28
+ yield { type: "response_completed", responseId: "resp_context", stopReason: "completed" };
29
+ }
30
+ }
31
+ class SummaryGateway {
32
+ compactCalls = 0;
33
+ async *stream(request) {
34
+ if (request.queryOrigin !== "compact")
35
+ throw new Error(`Unexpected query origin: ${request.queryOrigin}`);
36
+ this.compactCalls += 1;
37
+ yield { type: "assistant_delta", text: "Goal: keep working.\nPending Work: finish validation." };
38
+ yield { type: "response_completed", responseId: "compact_1", stopReason: "completed" };
39
+ }
40
+ }
41
+ async function main() {
42
+ const prompt = buildEffectiveSystemPrompt([
43
+ { name: "Stable", content: "cache me", cacheStable: true },
44
+ { name: "Dynamic", content: "session only", cacheStable: false },
45
+ ]);
46
+ const split = splitSystemPromptPrefix(prompt);
47
+ const promptOk = prompt.includes(SYSTEM_PROMPT_DYNAMIC_BOUNDARY) &&
48
+ split.stablePrefix.includes("cache me") &&
49
+ split.dynamicSuffix.includes("session only");
50
+ const contextManager = new DefaultContextManager({ currentDate: () => "2026-05-05" });
51
+ const runtime = await contextManager.build({ agentId: "main", messages: [createTextMessage("user", "hello")] });
52
+ const contextOk = runtime.userContext.currentDate === "2026-05-05" &&
53
+ Boolean(runtime.systemContext.cwd) &&
54
+ appendSystemContext(runtime.systemPrompt, runtime.systemContext).includes("## System Context") &&
55
+ prependUserContext([], runtime.userContext)[0]?.metadata?.userContext === true;
56
+ const toolResult = createToolResultMessage({ id: "call_big", name: "big", input: {} }, true, "x".repeat(120));
57
+ const budgeted = applyToolResultBudget([toolResult], { maxSerializedLength: 20 });
58
+ const budgetOk = budgeted[0].metadata?.budgeted === true;
59
+ const compactor = new DeterministicCompactor();
60
+ const longHistory = Array.from({ length: 12 }, (_, index) => createTextMessage(index % 2 ? "assistant" : "user", `${index}: ${"x".repeat(600)}`));
61
+ const compacted = await compactor.compact(longHistory, {
62
+ snipMaxChars: 2000,
63
+ microCompactMaxChars: 1800,
64
+ autoCompactMaxChars: 1500,
65
+ keepRecentMessages: 4,
66
+ });
67
+ const compactBoundary = compacted.messages.find((message) => message.metadata?.compactBoundary === true);
68
+ const compactOk = compacted.changed &&
69
+ compactBoundary?.role === "system" &&
70
+ JSON.stringify(compactBoundary).includes("Internal continuation state") &&
71
+ !JSON.stringify(compactBoundary).includes("Conversation summary");
72
+ const toolUseOld = {
73
+ id: "assistant_old_tool",
74
+ role: "assistant",
75
+ createdAt: new Date().toISOString(),
76
+ blocks: [{ type: "tool_use", id: "call_old", name: "grep", input: { query: "old" } }],
77
+ };
78
+ const toolUseNew = {
79
+ id: "assistant_new_tool",
80
+ role: "assistant",
81
+ createdAt: new Date().toISOString(),
82
+ blocks: [{ type: "tool_use", id: "call_new", name: "grep", input: { query: "new" } }],
83
+ };
84
+ const oldResult = createToolResultMessage({ id: "call_old", name: "grep", input: {} }, true, "old".repeat(1200));
85
+ const newResult = createToolResultMessage({ id: "call_new", name: "grep", input: {} }, true, "new".repeat(1200));
86
+ const micro = microCompactIfNeeded([toolUseOld, oldResult, toolUseNew, newResult], { microCompactMaxChars: 100, keepRecentToolResults: 1 });
87
+ const oldOutput = micro.messages[1]?.blocks[0]?.type === "tool_result" ? micro.messages[1].blocks[0].output : undefined;
88
+ const newOutput = micro.messages[3]?.blocks[0]?.type === "tool_result" ? micro.messages[3].blocks[0].output : undefined;
89
+ const microOk = micro.changed && oldOutput === CLEARED_TOOL_RESULT_CONTENT && typeof newOutput === "string" && newOutput.startsWith("new");
90
+ const orphanResult = createToolResultMessage({ id: "call_orphan", name: "grep", input: {} }, true, "orphan");
91
+ const paired = ensureToolResultPairing([toolUseOld, createTextMessage("assistant", "done"), orphanResult]);
92
+ const pairedJson = JSON.stringify(paired);
93
+ const pairingOk = hasValidToolResultPairing(paired) &&
94
+ pairedJson.includes("call_old") &&
95
+ pairedJson.includes("synthetic failure result") &&
96
+ !pairedJson.includes("call_orphan");
97
+ const bigGrepUse = {
98
+ id: "assistant_big_grep",
99
+ role: "assistant",
100
+ createdAt: new Date().toISOString(),
101
+ blocks: [{ type: "tool_use", id: "call_big_grep", name: "grep", input: { query: "^|\\S", root: ".." } }],
102
+ };
103
+ const bigGrepResult = createToolResultMessage({ id: "call_big_grep", name: "grep", input: {} }, true, JSON.stringify({ query: "^|\\S", root: "..", matches: Array.from({ length: 600 }, (_, index) => `match ${index}: ${"x".repeat(80)}`) }));
104
+ const budgetedGrep = applyToolResultBudget([bigGrepUse, bigGrepResult], { maxSerializedLength: 1200 });
105
+ const microGrep = microCompactIfNeeded(budgetedGrep, { microCompactMaxChars: 100, keepRecentToolResults: 1 });
106
+ const repairedGrep = ensureToolResultPairing(microGrep.messages);
107
+ const grepOutput = repairedGrep[1]?.blocks[0]?.type === "tool_result" ? String(repairedGrep[1].blocks[0].output) : "";
108
+ const grepRegressionOk = hasValidToolResultPairing(repairedGrep) &&
109
+ grepOutput.startsWith("[Tool result truncated for context budget: original ") &&
110
+ !grepOutput.includes('"preview"') &&
111
+ !grepOutput.includes('"truncated"');
112
+ const summaryGateway = new SummaryGateway();
113
+ const modelCompactor = new ModelDrivenCompactor(summaryGateway);
114
+ const modelCompacted = await modelCompactor.compact(longHistory, {
115
+ snipMaxChars: 20000,
116
+ microCompactMaxChars: 19000,
117
+ autoCompactMaxChars: 1500,
118
+ keepRecentMessages: 3,
119
+ });
120
+ const modelCompactOk = summaryGateway.compactCalls === 1 &&
121
+ modelCompacted.changed &&
122
+ modelCompacted.summary?.includes("Pending Work") === true &&
123
+ modelCompacted.messages.some((message) => message.metadata?.modelDriven === true);
124
+ const gateway = new ContextOverflowThenSuccessGateway();
125
+ const engine = new QueryEngine({
126
+ modelGateway: gateway,
127
+ tools: new ToolRegistry(),
128
+ contextManager,
129
+ compactor,
130
+ contextBudget: { keepRecentMessages: 3, summaryMaxChars: 1000 },
131
+ maxTurns: 4,
132
+ });
133
+ const events = [];
134
+ for await (const event of engine.sendUserText("trigger reactive compact")) {
135
+ events.push(event.type === "terminal" ? `${event.type}:${event.reason}` : event.type);
136
+ }
137
+ const reactiveOk = gateway.calls === 2 &&
138
+ gateway.sawBoundaryOnRetry &&
139
+ gateway.sawUserContext &&
140
+ gateway.sawSystemContext &&
141
+ events.includes("terminal:completed");
142
+ const ok = promptOk && contextOk && budgetOk && compactOk && microOk && pairingOk && grepRegressionOk && modelCompactOk && reactiveOk;
143
+ console.log(JSON.stringify({ ok, promptOk, contextOk, budgetOk, compactOk, microOk, pairingOk, grepRegressionOk, modelCompactOk, reactiveOk, events, calls: gateway.calls }, null, 2));
144
+ if (!ok)
145
+ process.exitCode = 1;
146
+ }
147
+ main().catch((error) => {
148
+ console.error(error instanceof Error ? error.stack ?? error.message : String(error));
149
+ process.exitCode = 1;
150
+ });
151
+ //# sourceMappingURL=smoke-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-context.js","sourceRoot":"","sources":["../../src/context/smoke-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjK,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAClI,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAEnH,MAAM,iCAAiC;IACrC,KAAK,GAAG,CAAC,CAAC;IACV,kBAAkB,GAAG,KAAK,CAAC;IAC3B,cAAc,GAAG,KAAK,CAAC;IACvB,gBAAgB,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAqB;QACjC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC;QACnG,IAAI,CAAC,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEvF,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,aAAa,CAAC;gBACtB,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,yBAAyB;gBAClC,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC,CAAC;QACzG,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QAC1F,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IAC5F,CAAC;CACF;AAED,MAAM,cAAc;IAClB,YAAY,GAAG,CAAC,CAAC;IAEjB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAqB;QACjC,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,uDAAuD,EAAE,CAAC;QACjG,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IACzF,CAAC;CACF;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,0BAA0B,CAAC;QACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE;QAC1D,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE;KACjE,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC/C,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAChH,MAAM,SAAS,GACb,OAAO,CAAC,WAAW,CAAC,WAAW,KAAK,YAAY;QAChD,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC;QAClC,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC9F,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAEjF,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9G,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAEzD,MAAM,SAAS,GAAG,IAAI,sBAAsB,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClJ,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE;QACrD,YAAY,EAAE,IAAI;QAClB,oBAAoB,EAAE,IAAI;QAC1B,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC,CAAC;IACzG,MAAM,SAAS,GACb,SAAS,CAAC,OAAO;QACjB,eAAe,EAAE,IAAI,KAAK,QAAQ;QAClC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACvE,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IAEpE,MAAM,UAAU,GAAG;QACjB,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,WAAoB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;KAC/F,CAAC;IACF,MAAM,UAAU,GAAG;QACjB,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,WAAoB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;KAC/F,CAAC;IACF,MAAM,SAAS,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjH,MAAM,SAAS,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjH,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5I,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,SAAS,KAAK,2BAA2B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAE3I,MAAM,YAAY,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,uBAAuB,CAAC,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAC3G,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GACb,yBAAyB,CAAC,MAAM,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/B,UAAU,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAC/C,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG;QACjB,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,WAAoB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;KAClH,CAAC;IACF,MAAM,aAAa,GAAG,uBAAuB,CAC3C,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAChD,IAAI,EACJ,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACxI,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9G,MAAM,YAAY,GAAG,uBAAuB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,UAAU,GACd,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,gBAAgB,GACpB,yBAAyB,CAAC,YAAY,CAAC;QACvC,UAAU,CAAC,UAAU,CAAC,sDAAsD,CAAC;QAC7E,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QACjC,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE;QAC/D,YAAY,EAAE,KAAK;QACnB,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,IAAI;QACzB,kBAAkB,EAAE,CAAC;KACtB,CAAC,CAAC;IACH,MAAM,cAAc,GAClB,cAAc,CAAC,YAAY,KAAK,CAAC;QACjC,cAAc,CAAC,OAAO;QACtB,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI;QACzD,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC,CAAC;IAEpF,MAAM,OAAO,GAAG,IAAI,iCAAiC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;QAC7B,YAAY,EAAE,OAAO;QACrB,KAAK,EAAE,IAAI,YAAY,EAAE;QACzB,cAAc;QACd,SAAS;QACT,aAAa,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;QAC/D,QAAQ,EAAE,CAAC;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,UAAU,GACd,OAAO,CAAC,KAAK,KAAK,CAAC;QACnB,OAAO,CAAC,kBAAkB;QAC1B,OAAO,CAAC,cAAc;QACtB,OAAO,CAAC,gBAAgB;QACxB,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAExC,MAAM,EAAE,GAAG,QAAQ,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,IAAI,gBAAgB,IAAI,cAAc,IAAI,UAAU,CAAC;IACtI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxL,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Message } from "../types/messages.js";
2
+ export declare class AssistantOutputFilter {
3
+ private buffer;
4
+ private emittedLength;
5
+ private redacted;
6
+ push(delta: string): string;
7
+ sanitizeMessage(message: Message): Message;
8
+ }
9
+ export declare function stripLeakedReasoningText(text: string): string;
@@ -0,0 +1,78 @@
1
+ const STREAM_HOLD_BACK_CHARS = 64;
2
+ export class AssistantOutputFilter {
3
+ buffer = "";
4
+ emittedLength = 0;
5
+ redacted = false;
6
+ push(delta) {
7
+ if (!delta || this.redacted)
8
+ return "";
9
+ this.buffer += delta;
10
+ const leakStart = findReasoningLeakStart(this.buffer);
11
+ if (leakStart >= 0) {
12
+ const safe = this.buffer.slice(this.emittedLength, leakStart);
13
+ this.emittedLength = leakStart;
14
+ this.redacted = true;
15
+ return safe;
16
+ }
17
+ const safeEnd = Math.max(0, this.buffer.length - STREAM_HOLD_BACK_CHARS);
18
+ if (safeEnd <= this.emittedLength)
19
+ return "";
20
+ const safe = this.buffer.slice(this.emittedLength, safeEnd);
21
+ this.emittedLength = safeEnd;
22
+ return safe;
23
+ }
24
+ sanitizeMessage(message) {
25
+ let changed = false;
26
+ const blocks = message.blocks.map((block) => {
27
+ if (block.type !== "text")
28
+ return block;
29
+ const text = stripLeakedReasoningText(block.text);
30
+ if (text === block.text)
31
+ return block;
32
+ changed = true;
33
+ return { ...block, text };
34
+ });
35
+ return changed ? { ...message, blocks, metadata: { ...message.metadata, outputSanitized: true } } : message;
36
+ }
37
+ }
38
+ export function stripLeakedReasoningText(text) {
39
+ const leakStart = findReasoningLeakStart(text);
40
+ if (leakStart < 0)
41
+ return text;
42
+ return text.slice(0, leakStart).trimEnd();
43
+ }
44
+ function findReasoningLeakStart(text) {
45
+ const candidates = [
46
+ /\bWe need\b/i,
47
+ /\bNeed (?:answer|respond|final|maybe|check|mention|say)\b/i,
48
+ /\bFinal maybe\b/i,
49
+ /\bThe transcript shows\b/i,
50
+ /\bOur final\b/i,
51
+ /\bUser asked\b/i,
52
+ /\bNeed answer\b/i,
53
+ /\bI should\b/i,
54
+ ];
55
+ let earliest = -1;
56
+ for (const pattern of candidates) {
57
+ const match = pattern.exec(text);
58
+ if (!match || !isLikelyReasoningLeak(text, match.index))
59
+ continue;
60
+ earliest = earliest < 0 ? match.index : Math.min(earliest, match.index);
61
+ }
62
+ return earliest;
63
+ }
64
+ function isLikelyReasoningLeak(text, index) {
65
+ const prefix = text.slice(0, index);
66
+ if (prefix.trim().length < 12)
67
+ return false;
68
+ if (/[\u4e00-\u9fff]/.test(prefix))
69
+ return true;
70
+ if (/[`*_-]\s*$/.test(prefix))
71
+ return true;
72
+ if (/[。!?.!?]\s*$/.test(prefix))
73
+ return true;
74
+ if (/\n\s*(?:[-*]|\d+\.)\s+/.test(prefix))
75
+ return true;
76
+ return prefix.trim().length >= 80;
77
+ }
78
+ //# sourceMappingURL=assistant-output-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-output-filter.js","sourceRoot":"","sources":["../../src/core/assistant-output-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolDefinition } from "../tools/tool.js";
2
+ import type { ContextMetrics } from "../types/events.js";
3
+ import type { Message } from "../types/messages.js";
4
+ export declare function buildContextMetrics(input: {
5
+ model?: string;
6
+ messages: readonly Message[];
7
+ systemPrompt: string;
8
+ tools: readonly ToolDefinition[];
9
+ }): ContextMetrics;
10
+ export declare function estimateTextTokens(text: string): number;
@@ -0,0 +1,77 @@
1
+ import { resolveContextWindowTokens } from "../model/context-window.js";
2
+ export function buildContextMetrics(input) {
3
+ const serialized = [
4
+ input.systemPrompt,
5
+ ...input.messages.map(serializeMessageForMetrics),
6
+ JSON.stringify(input.tools.map((tool) => ({ name: tool.name, description: tool.description, parameters: tool.inputSchema }))),
7
+ ].join("\n");
8
+ const estimatedChars = serialized.length;
9
+ const estimatedInputTokens = estimateTextTokens(serialized);
10
+ const window = resolveContextWindowTokens(input.model);
11
+ return {
12
+ model: input.model,
13
+ estimatedInputTokens,
14
+ estimatedChars,
15
+ messageCount: input.messages.length,
16
+ toolCount: input.tools.length,
17
+ contextWindowTokens: window.tokens,
18
+ contextWindowSource: window.source,
19
+ contextUsageRatio: window.tokens ? estimatedInputTokens / window.tokens : undefined,
20
+ modelMetadata: window.model
21
+ ? {
22
+ id: window.model.id,
23
+ provider: window.model.provider,
24
+ maxOutputTokens: window.model.maxOutputTokens,
25
+ knowledgeCutoff: window.model.knowledgeCutoff,
26
+ reasoning: window.model.reasoning,
27
+ imageInput: window.model.imageInput,
28
+ source: window.model.source,
29
+ }
30
+ : undefined,
31
+ };
32
+ }
33
+ export function estimateTextTokens(text) {
34
+ if (!text)
35
+ return 0;
36
+ let tokens = 0;
37
+ let asciiRun = 0;
38
+ for (const char of text) {
39
+ const code = char.codePointAt(0) ?? 0;
40
+ if (code >= 0x4e00 && code <= 0x9fff) {
41
+ tokens += Math.ceil(asciiRun / 4);
42
+ asciiRun = 0;
43
+ tokens += 2;
44
+ continue;
45
+ }
46
+ if (code >= 0x3000 && code <= 0x303f || code >= 0xff00 && code <= 0xffef ||
47
+ code >= 0xac00 && code <= 0xd7af || code >= 0x3400 && code <= 0x4dbf) {
48
+ tokens += Math.ceil(asciiRun / 4);
49
+ asciiRun = 0;
50
+ tokens += 2;
51
+ continue;
52
+ }
53
+ if (/\s/.test(char)) {
54
+ tokens += Math.ceil(asciiRun / 4);
55
+ asciiRun = 0;
56
+ continue;
57
+ }
58
+ asciiRun += 1;
59
+ }
60
+ tokens += Math.ceil(asciiRun / 4);
61
+ return Math.max(1, tokens);
62
+ }
63
+ function serializeMessageForMetrics(message) {
64
+ return `${message.role}: ${message.blocks.map(serializeBlockForMetrics).join("\n")}`;
65
+ }
66
+ function serializeBlockForMetrics(block) {
67
+ if (block.type === "text")
68
+ return block.text;
69
+ if (block.type === "image")
70
+ return `[image ${block.mimeType} ${block.data.length} base64 chars]`;
71
+ if (block.type === "thinking")
72
+ return block.text;
73
+ if (block.type === "tool_use")
74
+ return `tool_use ${block.name} ${JSON.stringify(block.input)}`;
75
+ return `tool_result ${block.name} ${JSON.stringify(block.output)}`;
76
+ }
77
+ //# sourceMappingURL=context-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-metrics.js","sourceRoot":"","sources":["../../src/core/context-metrics.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,KAKnC;IACC,MAAM,UAAU,GAAG;QACjB,KAAK,CAAC,YAAY;QAClB,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;KAC9H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC;IACzC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,oBAAoB;QACpB,cAAc;QACd,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;QACnC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QAC7B,mBAAmB,EAAE,MAAM,CAAC,MAAM;QAClC,mBAAmB,EAAE,MAAM,CAAC,MAAM;QAClC,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACnF,aAAa,EAAE,MAAM,CAAC,KAAK;YACzB,CAAC,CAAC;gBACE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACnB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe;gBAC7C,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe;gBAC7C,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;gBACjC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;gBACnC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;aAC5B;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClC,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM,IAAI,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;YACpE,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACzE,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClC,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM,IAAI,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClC,QAAQ,GAAG,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,QAAQ,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAgB;IAClD,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAmB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,UAAU,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC;IACjG,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,YAAY,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9F,OAAO,eAAe,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Message } from "../types/messages.js";
2
+ export interface ToolResultBudgetOptions {
3
+ maxSerializedLength?: number;
4
+ }
5
+ export declare function getMessagesAfterCompactBoundary(messages: readonly Message[]): Message[];
6
+ export declare function applyToolResultBudget(messages: readonly Message[], options?: ToolResultBudgetOptions): Message[];
7
+ export declare function ensureToolResultPairing(messages: readonly Message[]): Message[];
8
+ export declare function hasValidToolResultPairing(messages: readonly Message[]): boolean;
9
+ export declare function prependUserContext<T extends object>(messages: readonly Message[], userContext: T): Message[];
10
+ export declare function appendSystemContext<T extends object>(systemPrompt: string, systemContext: T): string;
@@ -0,0 +1,138 @@
1
+ import { createTextMessage } from "../types/messages.js";
2
+ export function getMessagesAfterCompactBoundary(messages) {
3
+ const lastBoundary = findLastIndex(messages, (message) => message.metadata?.compactBoundary === true);
4
+ if (lastBoundary < 0)
5
+ return [...messages];
6
+ return messages.slice(lastBoundary);
7
+ }
8
+ export function applyToolResultBudget(messages, options = {}) {
9
+ const maxSerializedLength = options.maxSerializedLength ?? 16000;
10
+ return messages.map((message) => {
11
+ if (message.role !== "tool_result")
12
+ return message;
13
+ let changed = false;
14
+ const blocks = message.blocks.map((block) => {
15
+ if (block.type !== "tool_result")
16
+ return block;
17
+ const serialized = serializeToolOutput(block.output);
18
+ if (serialized.length <= maxSerializedLength)
19
+ return block;
20
+ changed = true;
21
+ return {
22
+ ...block,
23
+ output: buildStableToolResultPreview(serialized, maxSerializedLength),
24
+ };
25
+ });
26
+ return changed ? { ...message, blocks, metadata: { ...message.metadata, budgeted: true } } : message;
27
+ });
28
+ }
29
+ export function ensureToolResultPairing(messages) {
30
+ const toolUses = new Map();
31
+ const toolResultIds = new Set();
32
+ for (const message of messages) {
33
+ for (const block of message.blocks) {
34
+ if (block.type === "tool_use")
35
+ toolUses.set(block.id, { id: block.id, name: block.name, input: block.input });
36
+ if (block.type === "tool_result")
37
+ toolResultIds.add(block.toolUseId);
38
+ }
39
+ }
40
+ const knownToolUseIds = new Set(toolUses.keys());
41
+ let changed = false;
42
+ const repaired = [];
43
+ for (const message of messages) {
44
+ const blocks = message.blocks.filter((block) => {
45
+ if (block.type === "tool_result" && !knownToolUseIds.has(block.toolUseId)) {
46
+ changed = true;
47
+ return false;
48
+ }
49
+ return true;
50
+ });
51
+ if (blocks.length === 0) {
52
+ changed = true;
53
+ continue;
54
+ }
55
+ repaired.push(blocks.length === message.blocks.length ? message : { ...message, blocks, metadata: { ...message.metadata, pairingRepaired: true } });
56
+ const missingResults = blocks
57
+ .filter((block) => block.type === "tool_use" && !toolResultIds.has(block.id))
58
+ .map((block) => ({
59
+ type: "tool_result",
60
+ toolUseId: block.id,
61
+ name: block.name,
62
+ ok: false,
63
+ output: `Tool call ${block.id} (${block.name}) did not have a recorded result. A synthetic failure result was inserted to keep model tool history valid.`,
64
+ }));
65
+ if (missingResults.length > 0) {
66
+ changed = true;
67
+ repaired.push({
68
+ id: `synthetic-tool-result-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,
69
+ role: "tool_result",
70
+ createdAt: new Date().toISOString(),
71
+ blocks: missingResults,
72
+ isMeta: true,
73
+ metadata: { syntheticToolResult: true, pairingRepaired: true },
74
+ });
75
+ }
76
+ }
77
+ return changed ? repaired : [...messages];
78
+ }
79
+ export function hasValidToolResultPairing(messages) {
80
+ const toolUseIds = new Set();
81
+ const toolResultIds = new Set();
82
+ for (const message of messages) {
83
+ for (const block of message.blocks) {
84
+ if (block.type === "tool_use")
85
+ toolUseIds.add(block.id);
86
+ if (block.type === "tool_result")
87
+ toolResultIds.add(block.toolUseId);
88
+ }
89
+ }
90
+ for (const id of toolUseIds) {
91
+ if (!toolResultIds.has(id))
92
+ return false;
93
+ }
94
+ for (const id of toolResultIds) {
95
+ if (!toolUseIds.has(id))
96
+ return false;
97
+ }
98
+ return true;
99
+ }
100
+ export function prependUserContext(messages, userContext) {
101
+ const entries = Object.entries(userContext).filter(([, value]) => value !== undefined);
102
+ if (entries.length === 0)
103
+ return [...messages];
104
+ const contextText = entries
105
+ .map(([key, value]) => `${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`)
106
+ .join("\n");
107
+ return [
108
+ {
109
+ ...createTextMessage("user", `User context:\n${contextText}`),
110
+ metadata: { userContext: true },
111
+ },
112
+ ...messages,
113
+ ];
114
+ }
115
+ export function appendSystemContext(systemPrompt, systemContext) {
116
+ const entries = Object.entries(systemContext).filter(([, value]) => value !== undefined);
117
+ if (entries.length === 0)
118
+ return systemPrompt;
119
+ const rendered = entries
120
+ .map(([key, value]) => `${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`)
121
+ .join("\n");
122
+ return `${systemPrompt}\n\n## System Context\n${rendered}`;
123
+ }
124
+ function buildStableToolResultPreview(serialized, maxSerializedLength) {
125
+ const previewLength = Math.max(0, maxSerializedLength - 120);
126
+ return `[Tool result truncated for context budget: original ${serialized.length} chars, showing first ${previewLength} chars]\n${serialized.slice(0, previewLength)}`;
127
+ }
128
+ function serializeToolOutput(output) {
129
+ return typeof output === "string" ? output : JSON.stringify(output);
130
+ }
131
+ function findLastIndex(items, predicate) {
132
+ for (let index = items.length - 1; index >= 0; index -= 1) {
133
+ if (predicate(items[index]))
134
+ return index;
135
+ }
136
+ return -1;
137
+ }
138
+ //# sourceMappingURL=message-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-pipeline.js","sourceRoot":"","sources":["../../src/core/message-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { ContextManager } from "../context/context-manager.js";
2
+ import type { Compactor, ContextBudgetOptions } from "../context/compaction.js";
3
+ import type { ModelGateway, ReasoningConfig } from "../model/model-gateway.js";
4
+ import { ToolRegistry } from "../tools/registry.js";
5
+ import type { CanUseTool } from "../tools/tool.js";
6
+ import type { TaskNotificationSource } from "./query.js";
7
+ import type { AgentEvent } from "../types/events.js";
8
+ import type { Message, MessageBlock } from "../types/messages.js";
9
+ import type { TerminalReason } from "./state.js";
10
+ import { type SessionStoreSnapshot, type SessionSummary } from "../session/session-store.js";
11
+ export interface QueryEngineOptions {
12
+ agentId?: string;
13
+ model?: string;
14
+ fallbackModel?: string;
15
+ reasoning?: ReasoningConfig;
16
+ queryOrigin?: string;
17
+ maxOutputTokensOverride?: number;
18
+ maxTurns?: number;
19
+ modelGateway: ModelGateway;
20
+ tools: ToolRegistry;
21
+ contextManager?: ContextManager;
22
+ compactor?: Compactor;
23
+ contextBudget?: ContextBudgetOptions;
24
+ canUseTool?: CanUseTool;
25
+ taskNotificationSource?: TaskNotificationSource;
26
+ commands?: readonly string[];
27
+ agents?: readonly string[];
28
+ skills?: readonly string[];
29
+ plugins?: readonly string[];
30
+ session?: {
31
+ enabled?: boolean;
32
+ sessionId?: string;
33
+ rootDir?: string;
34
+ resume?: boolean;
35
+ toolResultThresholdChars?: number;
36
+ };
37
+ }
38
+ export declare class QueryEngine {
39
+ private readonly options;
40
+ private readonly agentId;
41
+ private readonly history;
42
+ private readonly titleTimers;
43
+ private lastTerminalReason?;
44
+ private sessionStore?;
45
+ private currentModel?;
46
+ private currentReasoning?;
47
+ private sessionInitialized;
48
+ private userTurns;
49
+ private titleSchedulerVersion;
50
+ private titleAgentRun?;
51
+ private readonly sessionTitleListeners;
52
+ constructor(options: QueryEngineOptions);
53
+ onSessionTitleChange(listener: (snapshot: SessionStoreSnapshot | undefined) => void): () => void;
54
+ initialize(): Promise<void>;
55
+ resumeSession(sessionId?: string): Promise<SessionStoreSnapshot>;
56
+ listSessions(limit?: number): Promise<SessionSummary[]>;
57
+ deleteSession(sessionId: string): Promise<boolean>;
58
+ sendUserText(text: string, options?: {
59
+ abortSignal?: AbortSignal;
60
+ blocks?: MessageBlock[];
61
+ displayText?: string;
62
+ }): AsyncGenerator<AgentEvent>;
63
+ setModel(model: string | undefined, reasoning?: ReasoningConfig | null, updateReasoning?: boolean): void;
64
+ getModelSettings(): {
65
+ model?: string;
66
+ fallbackModel?: string;
67
+ reasoning?: ReasoningConfig | null;
68
+ };
69
+ reset(): void;
70
+ snapshot(): {
71
+ agentId: string;
72
+ messages: number;
73
+ model?: string;
74
+ fallbackModel?: string;
75
+ reasoning?: ReasoningConfig | null;
76
+ lastTerminalReason?: TerminalReason;
77
+ session?: SessionStoreSnapshot;
78
+ };
79
+ getHistoryMessages(): Message[];
80
+ get toolResultMemory(): import("../index.js").ToolResultMemory | undefined;
81
+ private openSession;
82
+ private scheduleSessionTitleCheck;
83
+ private runSessionTitleCheck;
84
+ private notifySessionTitleChange;
85
+ private cancelPendingTitleWork;
86
+ }