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,334 @@
1
+ import { createTextMessage } from "../types/messages.js";
2
+ export const CLEARED_TOOL_RESULT_CONTENT = "[Old tool result content cleared]";
3
+ export class DeterministicCompactor {
4
+ async compact(messages, options = {}) {
5
+ const micro = microCompactIfNeeded(messages, options);
6
+ const auto = autoCompactIfNeeded(micro.messages, options);
7
+ const snipped = snipCompactIfNeeded(auto.messages, options);
8
+ if (snipped.changed)
9
+ return mergeResults([micro, auto, snipped], snipped.reason);
10
+ if (auto.changed)
11
+ return mergeResults([micro, auto], auto.reason);
12
+ if (micro.changed)
13
+ return micro;
14
+ return { messages: [...messages], changed: false, reason: "none" };
15
+ }
16
+ async reactiveCompact(messages, error, options = {}) {
17
+ const micro = microCompactIfNeeded(messages, options);
18
+ const reactive = reactiveCompactWithSummary(micro.messages, `Reactive compact after model context error: ${error.message}`, options);
19
+ return micro.changed ? mergeResults([micro, reactive], reactive.reason) : reactive;
20
+ }
21
+ }
22
+ export class ModelDrivenCompactor {
23
+ modelGateway;
24
+ fallback = new DeterministicCompactor();
25
+ constructor(modelGateway) {
26
+ this.modelGateway = modelGateway;
27
+ }
28
+ async compact(messages, options = {}) {
29
+ const micro = microCompactIfNeeded(messages, options);
30
+ const auto = await this.modelAutoCompactIfNeeded(micro.messages, options);
31
+ const snipped = snipCompactIfNeeded(auto.messages, options);
32
+ if (snipped.changed)
33
+ return mergeResults([micro, auto, snipped], snipped.reason);
34
+ if (auto.changed)
35
+ return mergeResults([micro, auto], auto.reason);
36
+ if (micro.changed)
37
+ return micro;
38
+ return { messages: [...messages], changed: false, reason: "none" };
39
+ }
40
+ async reactiveCompact(messages, error, options = {}) {
41
+ const micro = microCompactIfNeeded(messages, options);
42
+ const keepRecentMessages = options.keepRecentMessages ?? 8;
43
+ const recent = micro.messages.slice(-keepRecentMessages);
44
+ const older = micro.messages.slice(0, Math.max(0, micro.messages.length - keepRecentMessages));
45
+ try {
46
+ const summary = await this.summarizeWithModel(older, buildReactiveCompactInstruction(error), options);
47
+ const reactive = buildCompactionResult(micro.messages, recent, summary, "reactive_compact", true);
48
+ return micro.changed ? mergeResults([micro, reactive], reactive.reason) : reactive;
49
+ }
50
+ catch {
51
+ const fallback = await this.fallback.reactiveCompact(micro.messages, error, options);
52
+ return micro.changed ? mergeResults([micro, fallback], fallback.reason) : fallback;
53
+ }
54
+ }
55
+ async modelAutoCompactIfNeeded(messages, options) {
56
+ if (!shouldCompactForBudget(messages, options, options.autoCompactMaxChars ?? 50000)) {
57
+ return { messages: [...messages], changed: false, reason: "none" };
58
+ }
59
+ const maxChars = options.autoCompactMaxChars ?? 50000;
60
+ const keepRecentMessages = options.keepRecentMessages ?? 8;
61
+ const recent = messages.slice(-keepRecentMessages);
62
+ const older = messages.slice(0, Math.max(0, messages.length - keepRecentMessages));
63
+ try {
64
+ const summary = await this.summarizeWithModel(older, AUTO_COMPACT_INSTRUCTIONS, options);
65
+ return buildCompactionResult(messages, recent, summary, "autocompact", true);
66
+ }
67
+ catch {
68
+ return autoCompactIfNeeded(messages, options);
69
+ }
70
+ }
71
+ async summarizeWithModel(messages, instructions, options) {
72
+ const transcript = serializeTranscriptForSummary(messages, options.summaryMaxChars ?? 12000);
73
+ if (!transcript.trim())
74
+ return "No earlier conversation content required preservation.";
75
+ let text = "";
76
+ for await (const event of this.modelGateway.stream({
77
+ model: options.compactModel,
78
+ instructions,
79
+ messages: [createTextMessage("user", transcript)],
80
+ tools: [],
81
+ stream: true,
82
+ maxOutputTokens: options.compactMaxOutputTokens ?? 2500,
83
+ queryOrigin: "compact",
84
+ providerOptions: {
85
+ compact: true,
86
+ },
87
+ })) {
88
+ if (event.type === "assistant_delta")
89
+ text += event.text;
90
+ if (event.type === "assistant_message")
91
+ text += extractText(event.message);
92
+ if (event.type === "error")
93
+ throw event.error;
94
+ }
95
+ const summary = text.trim();
96
+ if (!summary)
97
+ throw new Error("Model compaction produced an empty summary");
98
+ return summary.length > (options.summaryMaxChars ?? 6000)
99
+ ? `${summary.slice(0, options.summaryMaxChars ?? 6000)}\n- ...model summary truncated...`
100
+ : summary;
101
+ }
102
+ }
103
+ export class NoopCompactor {
104
+ async compact(messages) {
105
+ return { messages: [...messages], changed: false, reason: "none" };
106
+ }
107
+ }
108
+ export function estimateMessagesChars(messages) {
109
+ return messages.reduce((total, message) => total + serializeMessage(message).length, 0);
110
+ }
111
+ export function snipCompactIfNeeded(messages, options = {}) {
112
+ const maxChars = options.snipMaxChars ?? 90000;
113
+ const triggerRatio = options.snipCompactTriggerRatio ?? 0.98;
114
+ if (!shouldCompactForBudget(messages, options, maxChars, triggerRatio))
115
+ return { messages: [...messages], changed: false, reason: "none" };
116
+ const keepRecentMessages = options.keepRecentMessages ?? 6;
117
+ const head = messages.slice(0, 1).filter((message) => !message.metadata?.compactBoundary);
118
+ const tailStart = Math.max(head.length, messages.length - keepRecentMessages);
119
+ const tail = messages.slice(tailStart);
120
+ const removed = messages.slice(head.length, tailStart);
121
+ const summary = buildHistorySummary(removed, options.summaryMaxChars ?? 3000);
122
+ const boundary = createCompactionBoundaryMessage(`Snipped older conversation for context budget.\n\n${summary}`, "snip", false);
123
+ const compacted = [...head, boundary, ...tail];
124
+ return {
125
+ messages: compacted,
126
+ summary,
127
+ changed: true,
128
+ reason: "snip",
129
+ tokensFreed: Math.max(0, estimateMessagesChars(messages) - estimateMessagesChars(compacted)),
130
+ };
131
+ }
132
+ export function microCompactIfNeeded(messages, options = {}) {
133
+ const maxChars = options.microCompactMaxChars ?? 30000;
134
+ const triggerRatio = options.microCompactTriggerRatio ?? 0.85;
135
+ if (!shouldCompactForBudget(messages, options, maxChars, triggerRatio))
136
+ return { messages: [...messages], changed: false, reason: "none" };
137
+ const keepRecentToolResults = Math.max(1, options.keepRecentToolResults ?? 6);
138
+ const toolResultIds = collectToolResultIds(messages);
139
+ const keepIds = new Set(toolResultIds.slice(-keepRecentToolResults));
140
+ let changed = false;
141
+ let cleared = 0;
142
+ const compacted = messages.map((message) => {
143
+ if (message.metadata?.compactBoundary === true || message.role !== "tool_result")
144
+ return message;
145
+ let touched = false;
146
+ const blocks = message.blocks.map((block) => {
147
+ if (block.type !== "tool_result" || keepIds.has(block.toolUseId))
148
+ return block;
149
+ const serialized = serializeToolOutput(block.output);
150
+ if (serialized === CLEARED_TOOL_RESULT_CONTENT || serialized.length < 512)
151
+ return block;
152
+ touched = true;
153
+ cleared += 1;
154
+ return {
155
+ ...block,
156
+ output: CLEARED_TOOL_RESULT_CONTENT,
157
+ };
158
+ });
159
+ if (!touched)
160
+ return message;
161
+ changed = true;
162
+ return {
163
+ ...message,
164
+ blocks,
165
+ metadata: { ...message.metadata, microCompacted: true, clearedToolResultContent: true },
166
+ };
167
+ });
168
+ if (!changed)
169
+ return { messages: [...messages], changed: false, reason: "none" };
170
+ return {
171
+ messages: compacted,
172
+ summary: `Cleared ${cleared} older tool result content block(s); kept the latest ${keepRecentToolResults}.`,
173
+ changed: true,
174
+ reason: "microcompact",
175
+ tokensFreed: Math.max(0, estimateMessagesChars(messages) - estimateMessagesChars(compacted)),
176
+ };
177
+ }
178
+ export function autoCompactIfNeeded(messages, options = {}) {
179
+ const maxChars = options.autoCompactMaxChars ?? 50000;
180
+ if (!shouldCompactForBudget(messages, options, maxChars))
181
+ return { messages: [...messages], changed: false, reason: "none" };
182
+ const keepRecentMessages = options.keepRecentMessages ?? 8;
183
+ const recent = messages.slice(-keepRecentMessages);
184
+ const older = messages.slice(0, Math.max(0, messages.length - keepRecentMessages));
185
+ const summary = buildHistorySummary(older, options.summaryMaxChars ?? 5000);
186
+ return buildCompactionResult(messages, recent, summary, "autocompact", false);
187
+ }
188
+ function shouldCompactForBudget(messages, options, fallbackMaxChars, triggerRatioOverride) {
189
+ if (options.contextWindowTokens && options.estimatedInputTokens !== undefined) {
190
+ const triggerRatio = triggerRatioOverride ?? options.autoCompactTriggerRatio ?? 0.92;
191
+ return options.estimatedInputTokens / options.contextWindowTokens >= triggerRatio;
192
+ }
193
+ return estimateMessagesChars(messages) > fallbackMaxChars;
194
+ }
195
+ function reactiveCompactWithSummary(messages, heading, options) {
196
+ const keepRecentMessages = options.keepRecentMessages ?? 8;
197
+ const recent = messages.slice(-keepRecentMessages);
198
+ const older = messages.slice(0, Math.max(0, messages.length - keepRecentMessages));
199
+ const summary = buildHistorySummary(older, options.summaryMaxChars ?? 6000);
200
+ return buildCompactionResult(messages, recent, `${heading}\n\n${summary || "No older messages were available to summarize."}`, "reactive_compact", false);
201
+ }
202
+ function buildCompactionResult(originalMessages, recentMessages, summary, reason, modelDriven) {
203
+ const label = reason === "autocompact" ? "Auto compacted earlier conversation." : "Reactive compacted earlier conversation.";
204
+ const boundary = createCompactionBoundaryMessage(`${label}\n\n${summary}`, reason, modelDriven);
205
+ const compacted = [boundary, ...recentMessages];
206
+ return {
207
+ messages: compacted,
208
+ summary,
209
+ changed: true,
210
+ reason,
211
+ tokensFreed: Math.max(0, estimateMessagesChars(originalMessages) - estimateMessagesChars(compacted)),
212
+ };
213
+ }
214
+ function mergeResults(results, reason) {
215
+ const changedResults = results.filter((result) => result.changed);
216
+ const last = changedResults[changedResults.length - 1] ?? results[results.length - 1];
217
+ return {
218
+ messages: last.messages,
219
+ summary: changedResults.map((result) => result.summary).filter(Boolean).join("\n\n") || undefined,
220
+ changed: changedResults.length > 0,
221
+ reason,
222
+ tokensFreed: changedResults.reduce((total, result) => total + (result.tokensFreed ?? 0), 0),
223
+ };
224
+ }
225
+ function createCompactionBoundaryMessage(summary, reason, modelDriven) {
226
+ return {
227
+ ...createTextMessage("system", renderInternalContinuationState(summary, reason)),
228
+ isMeta: true,
229
+ metadata: { compactBoundary: true, compactionReason: reason, modelDriven },
230
+ };
231
+ }
232
+ function renderInternalContinuationState(summary, reason) {
233
+ return [
234
+ `Internal continuation state from context compaction (${reason}).`,
235
+ "This is not a user message. Use it only to continue the task; do not quote, summarize, or mirror this block in the final answer.",
236
+ "<compact_state>",
237
+ normalizeSummaryForInternalState(summary),
238
+ "</compact_state>",
239
+ ].join("\n");
240
+ }
241
+ function normalizeSummaryForInternalState(summary) {
242
+ return summary
243
+ .split(/\r?\n/)
244
+ .map((line) => line.replace(/^#{1,6}\s+/, ""))
245
+ .join("\n")
246
+ .trim();
247
+ }
248
+ function buildHistorySummary(messages, maxChars) {
249
+ if (messages.length === 0)
250
+ return "";
251
+ const lines = messages.map((message) => {
252
+ const text = serializeMessageForSummary(message).replace(/\s+/g, " ").trim();
253
+ return `- ${message.role}: ${text.slice(0, 500)}`;
254
+ });
255
+ const joined = lines.join("\n");
256
+ return joined.length > maxChars ? `${joined.slice(0, maxChars)}\n- ...summary truncated...` : joined;
257
+ }
258
+ function serializeTranscriptForSummary(messages, maxChars) {
259
+ const lines = messages.map((message) => {
260
+ const metadata = [
261
+ message.providerMessageId ? `provider=${message.providerMessageId}` : undefined,
262
+ message.requestId ? `request=${message.requestId}` : undefined,
263
+ message.isMeta ? "meta" : undefined,
264
+ ].filter(Boolean).join(" ");
265
+ return `<message role="${message.role}"${metadata ? ` ${metadata}` : ""}>\n${serializeMessageForSummary(message)}\n</message>`;
266
+ });
267
+ const joined = lines.join("\n\n");
268
+ return joined.length > maxChars ? joined.slice(Math.max(0, joined.length - maxChars)) : joined;
269
+ }
270
+ function serializeMessage(message) {
271
+ return message.blocks.map(serializeBlock).join("\n");
272
+ }
273
+ function serializeMessageForSummary(message) {
274
+ if (message.metadata?.compactBoundary === true)
275
+ return extractText(message) || "[compact boundary]";
276
+ return message.blocks
277
+ .map((block) => {
278
+ if (block.type !== "tool_result")
279
+ return serializeBlock(block);
280
+ const output = serializeToolOutput(block.output);
281
+ if (output === CLEARED_TOOL_RESULT_CONTENT)
282
+ return `tool_result ${block.name}: ${CLEARED_TOOL_RESULT_CONTENT}`;
283
+ return `tool_result ${block.name}: ${summarizeToolOutput(output)}`;
284
+ })
285
+ .join("\n");
286
+ }
287
+ function serializeBlock(block) {
288
+ if (block.type === "text")
289
+ return block.text;
290
+ if (block.type === "image")
291
+ return block.label ?? `[image ${block.mimeType}]`;
292
+ if (block.type === "thinking")
293
+ return `thinking: ${block.text}`;
294
+ if (block.type === "tool_use")
295
+ return `tool_use ${block.name}: ${JSON.stringify(block.input)}`;
296
+ if (block.type === "tool_result")
297
+ return `tool_result ${block.name}: ${serializeToolOutput(block.output)}`;
298
+ return "";
299
+ }
300
+ function serializeToolOutput(output) {
301
+ return typeof output === "string" ? output : JSON.stringify(output);
302
+ }
303
+ function summarizeToolOutput(output) {
304
+ if (output.length <= 800)
305
+ return output;
306
+ return `[large tool result: ${output.length} chars, head: ${output.slice(0, 400)}]`;
307
+ }
308
+ function collectToolResultIds(messages) {
309
+ const ids = [];
310
+ for (const message of messages) {
311
+ for (const block of message.blocks) {
312
+ if (block.type === "tool_result")
313
+ ids.push(block.toolUseId);
314
+ }
315
+ }
316
+ return ids;
317
+ }
318
+ function extractText(message) {
319
+ return message.blocks
320
+ .filter((block) => block.type === "text")
321
+ .map((block) => block.text)
322
+ .join("\n");
323
+ }
324
+ function buildReactiveCompactInstruction(error) {
325
+ return `${AUTO_COMPACT_INSTRUCTIONS}\n\nThe previous model request failed because the prompt was too long. Preserve enough task state to continue after this error. Error: ${error.message}`;
326
+ }
327
+ const AUTO_COMPACT_INSTRUCTIONS = [
328
+ "Summarize the earlier agent conversation for continuation after context compaction.",
329
+ "Preserve: user goals and constraints, decisions made, files or commands mentioned, completed work, pending work, task ids, important tool results, and any errors or blockers.",
330
+ "Drop: repetitive logs, transient progress chatter, and irrelevant wording.",
331
+ "Return concise plain text labels, not Markdown headings. Use labels like Goal:, Constraints:, Work completed:, Important facts:, Pending work:, Open risks:.",
332
+ "Do not include final-answer prose; this summary is an internal continuation state only.",
333
+ ].join("\n");
334
+ //# sourceMappingURL=compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/context/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { ToolUseContext } from "../tools/tool.js";
2
+ import type { Message } from "../types/messages.js";
3
+ import { type EffectiveSystemPromptOptions, type PromptSection } from "./prompts.js";
4
+ export interface ContextBuildInput extends EffectiveSystemPromptOptions {
5
+ agentId: string;
6
+ messages: readonly Message[];
7
+ cwd?: string;
8
+ enabledTools?: readonly string[];
9
+ toolUseContext?: ToolUseContext;
10
+ omitProjectMemory?: boolean;
11
+ disableGitContext?: boolean;
12
+ }
13
+ export interface UserContext {
14
+ currentDate: string;
15
+ projectMemory?: string;
16
+ memoryFiles?: string[];
17
+ }
18
+ export interface SystemContext {
19
+ cwd: string;
20
+ platform: NodeJS.Platform;
21
+ git?: GitContext;
22
+ }
23
+ export interface GitContext {
24
+ branch?: string;
25
+ recentCommit?: string;
26
+ status?: string;
27
+ }
28
+ export interface RuntimeContext {
29
+ systemPrompt: string;
30
+ promptSections: PromptSection[];
31
+ userContext: UserContext;
32
+ systemContext: SystemContext;
33
+ }
34
+ export interface ContextManager {
35
+ build(input: ContextBuildInput): Promise<RuntimeContext>;
36
+ }
37
+ export interface DefaultContextManagerOptions {
38
+ cwd?: string;
39
+ memoryFileNames?: readonly string[];
40
+ currentDate?: () => string;
41
+ }
42
+ export declare class DefaultContextManager implements ContextManager {
43
+ private readonly options;
44
+ private readonly cwd;
45
+ private userContextCache?;
46
+ private systemContextCache?;
47
+ constructor(options?: DefaultContextManagerOptions);
48
+ build(input: ContextBuildInput): Promise<RuntimeContext>;
49
+ private getUserContext;
50
+ private getSystemContext;
51
+ }
52
+ export declare class NoopContextManager extends DefaultContextManager {
53
+ }
@@ -0,0 +1,98 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { execFileSync } from "node:child_process";
4
+ import { buildDefaultSystemPromptSections, buildEffectiveSystemPrompt, } from "./prompts.js";
5
+ export class DefaultContextManager {
6
+ options;
7
+ cwd;
8
+ userContextCache;
9
+ systemContextCache;
10
+ constructor(options = {}) {
11
+ this.options = options;
12
+ this.cwd = resolve(options.cwd ?? process.cwd());
13
+ }
14
+ async build(input) {
15
+ const cwd = resolve(input.cwd ?? this.cwd);
16
+ const promptSections = [
17
+ ...buildDefaultSystemPromptSections(input.enabledTools ?? []),
18
+ {
19
+ name: "Runtime",
20
+ cacheStable: false,
21
+ content: `agentId=${input.agentId}; messages=${input.messages.length}`,
22
+ },
23
+ ];
24
+ const systemPrompt = buildEffectiveSystemPrompt(promptSections, input);
25
+ const userContext = input.omitProjectMemory ? stripProjectMemory(this.getUserContext(cwd)) : this.getUserContext(cwd);
26
+ const systemContext = input.disableGitContext ? stripGitContext(this.getSystemContext(cwd)) : this.getSystemContext(cwd);
27
+ return { systemPrompt, promptSections, userContext, systemContext };
28
+ }
29
+ getUserContext(cwd) {
30
+ if (this.userContextCache)
31
+ return this.userContextCache;
32
+ const memory = readProjectMemory(cwd, this.options.memoryFileNames ?? DEFAULT_MEMORY_FILE_NAMES);
33
+ this.userContextCache = {
34
+ currentDate: this.options.currentDate?.() ?? new Date().toISOString().slice(0, 10),
35
+ ...(memory.content ? { projectMemory: memory.content, memoryFiles: memory.files } : {}),
36
+ };
37
+ return this.userContextCache;
38
+ }
39
+ getSystemContext(cwd) {
40
+ if (this.systemContextCache)
41
+ return this.systemContextCache;
42
+ this.systemContextCache = {
43
+ cwd,
44
+ platform: process.platform,
45
+ git: readGitContext(cwd),
46
+ };
47
+ return this.systemContextCache;
48
+ }
49
+ }
50
+ export class NoopContextManager extends DefaultContextManager {
51
+ }
52
+ const DEFAULT_MEMORY_FILE_NAMES = [
53
+ "AGENTS.md",
54
+ "CLAUDE.md",
55
+ ".agent/memory.md",
56
+ ".codex/memory.md",
57
+ ".github/copilot-instructions.md",
58
+ ];
59
+ function readProjectMemory(cwd, memoryFileNames) {
60
+ const parts = [];
61
+ const files = [];
62
+ for (const name of memoryFileNames) {
63
+ const path = join(cwd, name);
64
+ if (!existsSync(path))
65
+ continue;
66
+ const content = readFileSync(path, "utf8").trim();
67
+ if (!content)
68
+ continue;
69
+ files.push(path);
70
+ parts.push(`### ${name}\n${content}`);
71
+ }
72
+ return parts.length ? { content: parts.join("\n\n"), files } : {};
73
+ }
74
+ function readGitContext(cwd) {
75
+ const branch = git(cwd, ["rev-parse", "--abbrev-ref", "HEAD"]);
76
+ const recentCommit = git(cwd, ["log", "-1", "--oneline"]);
77
+ const status = git(cwd, ["status", "--short"]);
78
+ if (!branch && !recentCommit && !status)
79
+ return undefined;
80
+ return { branch, recentCommit, status: status || "clean" };
81
+ }
82
+ function git(cwd, args) {
83
+ try {
84
+ return execFileSync("git", [...args], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() || undefined;
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ }
90
+ function stripProjectMemory(context) {
91
+ const { projectMemory: _projectMemory, memoryFiles: _memoryFiles, ...rest } = context;
92
+ return rest;
93
+ }
94
+ function stripGitContext(context) {
95
+ const { git: _git, ...rest } = context;
96
+ return rest;
97
+ }
98
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/context/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ToolUseContext } from "../tools/tool.js";
2
+ export declare const SYSTEM_PROMPT_DYNAMIC_BOUNDARY = "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__";
3
+ export interface PromptSection {
4
+ name: string;
5
+ content: string;
6
+ cacheStable?: boolean;
7
+ }
8
+ export interface EffectiveSystemPromptOptions {
9
+ overrideSystemPrompt?: string;
10
+ coordinatorPrompt?: string;
11
+ agentPrompt?: string | ((context?: ToolUseContext) => string);
12
+ agentPromptMode?: "replace" | "proactive_append";
13
+ customSystemPrompt?: string;
14
+ appendSystemPrompt?: string;
15
+ toolUseContext?: ToolUseContext;
16
+ }
17
+ export declare function buildDefaultSystemPromptSections(enabledTools?: readonly string[]): PromptSection[];
18
+ export declare function buildEffectiveSystemPrompt(sections?: readonly PromptSection[], options?: EffectiveSystemPromptOptions): string;
19
+ export declare function splitSystemPromptPrefix(systemPrompt: string): {
20
+ stablePrefix: string;
21
+ dynamicSuffix: string;
22
+ };
@@ -0,0 +1,84 @@
1
+ export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY = "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__";
2
+ export function buildDefaultSystemPromptSections(enabledTools = []) {
3
+ return [
4
+ {
5
+ name: "Agent Scaffold",
6
+ cacheStable: true,
7
+ content: [
8
+ "You are an engineering agent running inside neo.",
9
+ "You may identify yourself as neo when referring to your operating identity.",
10
+ "Drive tasks through the shared query loop, tool system, context manager, and model gateway.",
11
+ ].join("\n"),
12
+ },
13
+ {
14
+ name: "Doing Tasks",
15
+ cacheStable: true,
16
+ content: [
17
+ "Keep work concrete and verifiable.",
18
+ "Use tools for real workspace changes and report validation results precisely.",
19
+ "When following a concrete strategy, you may briefly state meaningful progress transitions, such as finishing code edits and preparing to run tests.",
20
+ ].join("\n"),
21
+ },
22
+ {
23
+ name: "Using Tools",
24
+ cacheStable: true,
25
+ content: [
26
+ enabledTools.length
27
+ ? `Available tools are provided separately. Stable tool prefix: ${enabledTools.join(", ")}.`
28
+ : "Available tools are provided separately by the runtime.",
29
+ "When using tools, you may briefly state the intent of the tool call; if a tool result contains valuable information, you may briefly report it.",
30
+ ].join("\n"),
31
+ },
32
+ {
33
+ name: "Tone And Output",
34
+ cacheStable: true,
35
+ content: "Be direct, concise, and action-oriented. Avoid inventing file contents or command results.",
36
+ },
37
+ ];
38
+ }
39
+ export function buildEffectiveSystemPrompt(sections = buildDefaultSystemPromptSections(), options = {}) {
40
+ const replacement = promptReplacement(options);
41
+ const base = replacement ?? renderSectionGroups(sections);
42
+ const withProactiveAgent = !replacement && options.agentPrompt && options.agentPromptMode === "proactive_append"
43
+ ? `${base}\n\n${renderLooseSection("Agent Prompt", resolveAgentPrompt(options))}`
44
+ : base;
45
+ if (!options.appendSystemPrompt?.trim())
46
+ return withProactiveAgent;
47
+ return `${withProactiveAgent}\n\n${renderLooseSection("Appended System Prompt", options.appendSystemPrompt.trim())}`;
48
+ }
49
+ export function splitSystemPromptPrefix(systemPrompt) {
50
+ const index = systemPrompt.indexOf(SYSTEM_PROMPT_DYNAMIC_BOUNDARY);
51
+ if (index < 0)
52
+ return { stablePrefix: systemPrompt, dynamicSuffix: "" };
53
+ return {
54
+ stablePrefix: systemPrompt.slice(0, index).trimEnd(),
55
+ dynamicSuffix: systemPrompt.slice(index + SYSTEM_PROMPT_DYNAMIC_BOUNDARY.length).trimStart(),
56
+ };
57
+ }
58
+ function promptReplacement(options) {
59
+ if (options.overrideSystemPrompt?.trim())
60
+ return options.overrideSystemPrompt.trim();
61
+ if (options.coordinatorPrompt?.trim())
62
+ return options.coordinatorPrompt.trim();
63
+ if (options.agentPrompt && options.agentPromptMode !== "proactive_append")
64
+ return resolveAgentPrompt(options);
65
+ if (options.customSystemPrompt?.trim())
66
+ return options.customSystemPrompt.trim();
67
+ return undefined;
68
+ }
69
+ function renderSectionGroups(sections) {
70
+ const stable = sections.filter((section) => section.cacheStable !== false).map(renderSection);
71
+ const dynamic = sections.filter((section) => section.cacheStable === false).map(renderSection);
72
+ return [...stable, SYSTEM_PROMPT_DYNAMIC_BOUNDARY, ...dynamic].filter(Boolean).join("\n\n");
73
+ }
74
+ function renderSection(section) {
75
+ return renderLooseSection(section.name, section.content);
76
+ }
77
+ function renderLooseSection(name, content) {
78
+ return `## ${name}\n${content}`;
79
+ }
80
+ function resolveAgentPrompt(options) {
81
+ const prompt = typeof options.agentPrompt === "function" ? options.agentPrompt(options.toolUseContext) : options.agentPrompt;
82
+ return prompt?.trim() ?? "";
83
+ }
84
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/context/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};