@orion-agents/orion-code 0.1.7 → 0.1.9

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 (431) hide show
  1. package/CHANGELOG.md +445 -0
  2. package/README.md +60 -41
  3. package/README.zh-CN.md +34 -8
  4. package/dist/agents/coordinator.d.ts.map +1 -1
  5. package/dist/agents/coordinator.js +49 -9
  6. package/dist/agents/coordinator.js.map +1 -1
  7. package/dist/agents/fork.d.ts +5 -1
  8. package/dist/agents/fork.d.ts.map +1 -1
  9. package/dist/agents/fork.js +9 -10
  10. package/dist/agents/fork.js.map +1 -1
  11. package/dist/agents/worker-pool.d.ts.map +1 -1
  12. package/dist/agents/worker-pool.js +8 -3
  13. package/dist/agents/worker-pool.js.map +1 -1
  14. package/dist/cli.js +6 -6
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/context-tool-command-handlers.d.ts.map +1 -1
  17. package/dist/commands/context-tool-command-handlers.js +42 -0
  18. package/dist/commands/context-tool-command-handlers.js.map +1 -1
  19. package/dist/commands/core-command-handlers.d.ts.map +1 -1
  20. package/dist/commands/core-command-handlers.js +3 -4
  21. package/dist/commands/core-command-handlers.js.map +1 -1
  22. package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -1
  23. package/dist/commands/diagnostic-command-handlers.js +3 -0
  24. package/dist/commands/diagnostic-command-handlers.js.map +1 -1
  25. package/dist/commands/model-command-handlers.d.ts +1 -1
  26. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  27. package/dist/commands/model-command-handlers.js +166 -1
  28. package/dist/commands/model-command-handlers.js.map +1 -1
  29. package/dist/commands/registry.d.ts.map +1 -1
  30. package/dist/commands/registry.js +7 -3
  31. package/dist/commands/registry.js.map +1 -1
  32. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  33. package/dist/commands/session-command-handlers.js +97 -5
  34. package/dist/commands/session-command-handlers.js.map +1 -1
  35. package/dist/commands/session-commands.js +2 -2
  36. package/dist/commands/session-commands.js.map +1 -1
  37. package/dist/commands/types.d.ts +6 -0
  38. package/dist/commands/types.d.ts.map +1 -1
  39. package/dist/commands/types.js.map +1 -1
  40. package/dist/commands/workflow-command-handlers.d.ts.map +1 -1
  41. package/dist/commands/workflow-command-handlers.js +2 -2
  42. package/dist/commands/workflow-command-handlers.js.map +1 -1
  43. package/dist/commands/workflow-commands.d.ts.map +1 -1
  44. package/dist/commands/workflow-commands.js +1 -1
  45. package/dist/commands/workflow-commands.js.map +1 -1
  46. package/dist/core/checkpoint.d.ts.map +1 -1
  47. package/dist/core/checkpoint.js +9 -8
  48. package/dist/core/checkpoint.js.map +1 -1
  49. package/dist/framework/index.d.ts +5 -3
  50. package/dist/framework/index.d.ts.map +1 -1
  51. package/dist/framework/index.js +9 -1
  52. package/dist/framework/index.js.map +1 -1
  53. package/dist/framework/prompt.d.ts +1 -1
  54. package/dist/framework/prompt.d.ts.map +1 -1
  55. package/dist/framework/prompt.js +5 -4
  56. package/dist/framework/prompt.js.map +1 -1
  57. package/dist/framework/query.d.ts +30 -4
  58. package/dist/framework/query.d.ts.map +1 -1
  59. package/dist/framework/query.js +329 -62
  60. package/dist/framework/query.js.map +1 -1
  61. package/dist/framework/stop-decision.d.ts +56 -0
  62. package/dist/framework/stop-decision.d.ts.map +1 -0
  63. package/dist/framework/stop-decision.js +36 -0
  64. package/dist/framework/stop-decision.js.map +1 -0
  65. package/dist/framework/store.d.ts.map +1 -1
  66. package/dist/framework/store.js +4 -4
  67. package/dist/framework/store.js.map +1 -1
  68. package/dist/framework/tool-scheduler.d.ts +23 -13
  69. package/dist/framework/tool-scheduler.d.ts.map +1 -1
  70. package/dist/framework/tool-scheduler.js +93 -77
  71. package/dist/framework/tool-scheduler.js.map +1 -1
  72. package/dist/framework/tool.d.ts +7 -0
  73. package/dist/framework/tool.d.ts.map +1 -1
  74. package/dist/framework/tool.js +9 -0
  75. package/dist/framework/tool.js.map +1 -1
  76. package/dist/harness/assembler.d.ts.map +1 -1
  77. package/dist/harness/assembler.js +77 -19
  78. package/dist/harness/assembler.js.map +1 -1
  79. package/dist/harness/capability-profile.d.ts +3 -0
  80. package/dist/harness/capability-profile.d.ts.map +1 -0
  81. package/dist/harness/capability-profile.js +44 -0
  82. package/dist/harness/capability-profile.js.map +1 -0
  83. package/dist/harness/capsule.d.ts.map +1 -1
  84. package/dist/harness/capsule.js +22 -3
  85. package/dist/harness/capsule.js.map +1 -1
  86. package/dist/harness/compact-benchmark-corpus.d.ts +10 -0
  87. package/dist/harness/compact-benchmark-corpus.d.ts.map +1 -0
  88. package/dist/harness/compact-benchmark-corpus.js +56 -0
  89. package/dist/harness/compact-benchmark-corpus.js.map +1 -0
  90. package/dist/harness/context-harness.d.ts +23 -3
  91. package/dist/harness/context-harness.d.ts.map +1 -1
  92. package/dist/harness/context-harness.js +183 -11
  93. package/dist/harness/context-harness.js.map +1 -1
  94. package/dist/harness/contract.d.ts.map +1 -1
  95. package/dist/harness/contract.js +106 -11
  96. package/dist/harness/contract.js.map +1 -1
  97. package/dist/harness/drift-guard.d.ts +2 -1
  98. package/dist/harness/drift-guard.d.ts.map +1 -1
  99. package/dist/harness/drift-guard.js +315 -20
  100. package/dist/harness/drift-guard.js.map +1 -1
  101. package/dist/harness/evidence.d.ts.map +1 -1
  102. package/dist/harness/evidence.js +25 -12
  103. package/dist/harness/evidence.js.map +1 -1
  104. package/dist/harness/index.d.ts +7 -2
  105. package/dist/harness/index.d.ts.map +1 -1
  106. package/dist/harness/index.js +19 -1
  107. package/dist/harness/index.js.map +1 -1
  108. package/dist/harness/ledger.d.ts.map +1 -1
  109. package/dist/harness/ledger.js +44 -14
  110. package/dist/harness/ledger.js.map +1 -1
  111. package/dist/harness/progress-controller.d.ts +14 -0
  112. package/dist/harness/progress-controller.d.ts.map +1 -0
  113. package/dist/harness/progress-controller.js +110 -0
  114. package/dist/harness/progress-controller.js.map +1 -0
  115. package/dist/harness/state.d.ts.map +1 -1
  116. package/dist/harness/state.js +5 -2
  117. package/dist/harness/state.js.map +1 -1
  118. package/dist/harness/stop-controller.d.ts +15 -0
  119. package/dist/harness/stop-controller.d.ts.map +1 -0
  120. package/dist/harness/stop-controller.js +87 -0
  121. package/dist/harness/stop-controller.js.map +1 -0
  122. package/dist/harness/types.d.ts +137 -0
  123. package/dist/harness/types.d.ts.map +1 -1
  124. package/dist/harness/verification.d.ts +7 -0
  125. package/dist/harness/verification.d.ts.map +1 -0
  126. package/dist/harness/verification.js +122 -0
  127. package/dist/harness/verification.js.map +1 -0
  128. package/dist/index.d.ts +5 -5
  129. package/dist/index.d.ts.map +1 -1
  130. package/dist/index.js +7 -1
  131. package/dist/index.js.map +1 -1
  132. package/dist/ink-ui/screens/ReplScreen.d.ts +3 -0
  133. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  134. package/dist/ink-ui/screens/ReplScreen.js +30 -5
  135. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  136. package/dist/memory/index.d.ts +1 -0
  137. package/dist/memory/index.d.ts.map +1 -1
  138. package/dist/memory/index.js +1 -0
  139. package/dist/memory/index.js.map +1 -1
  140. package/dist/memory/prompt-context.d.ts +42 -0
  141. package/dist/memory/prompt-context.d.ts.map +1 -0
  142. package/dist/memory/prompt-context.js +129 -0
  143. package/dist/memory/prompt-context.js.map +1 -0
  144. package/dist/print-ui/launch.d.ts +1 -0
  145. package/dist/print-ui/launch.d.ts.map +1 -1
  146. package/dist/print-ui/launch.js +5 -2
  147. package/dist/print-ui/launch.js.map +1 -1
  148. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  149. package/dist/runtime/agent-runtime-controller.js +60 -22
  150. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  151. package/dist/runtime/chat-checkpoint.d.ts.map +1 -1
  152. package/dist/runtime/chat-checkpoint.js +2 -5
  153. package/dist/runtime/chat-checkpoint.js.map +1 -1
  154. package/dist/runtime/chat-command-scope.d.ts +5 -0
  155. package/dist/runtime/chat-command-scope.d.ts.map +1 -0
  156. package/dist/runtime/chat-command-scope.js +22 -0
  157. package/dist/runtime/chat-command-scope.js.map +1 -0
  158. package/dist/runtime/chat-compact.d.ts +26 -0
  159. package/dist/runtime/chat-compact.d.ts.map +1 -0
  160. package/dist/runtime/chat-compact.js +132 -0
  161. package/dist/runtime/chat-compact.js.map +1 -0
  162. package/dist/runtime/chat-controller.d.ts.map +1 -1
  163. package/dist/runtime/chat-controller.js +102 -130
  164. package/dist/runtime/chat-controller.js.map +1 -1
  165. package/dist/runtime/chat-presentation.d.ts +6 -3
  166. package/dist/runtime/chat-presentation.d.ts.map +1 -1
  167. package/dist/runtime/chat-presentation.js +30 -6
  168. package/dist/runtime/chat-presentation.js.map +1 -1
  169. package/dist/runtime/goals/coordinator.d.ts +8 -0
  170. package/dist/runtime/goals/coordinator.d.ts.map +1 -1
  171. package/dist/runtime/goals/coordinator.js +103 -30
  172. package/dist/runtime/goals/coordinator.js.map +1 -1
  173. package/dist/runtime/goals/evidence.d.ts +10 -0
  174. package/dist/runtime/goals/evidence.d.ts.map +1 -1
  175. package/dist/runtime/goals/evidence.js +18 -0
  176. package/dist/runtime/goals/evidence.js.map +1 -1
  177. package/dist/runtime/goals/lifecycle.d.ts +13 -0
  178. package/dist/runtime/goals/lifecycle.d.ts.map +1 -0
  179. package/dist/runtime/goals/lifecycle.js +46 -0
  180. package/dist/runtime/goals/lifecycle.js.map +1 -0
  181. package/dist/runtime/goals/objective.d.ts +18 -0
  182. package/dist/runtime/goals/objective.d.ts.map +1 -0
  183. package/dist/runtime/goals/objective.js +60 -0
  184. package/dist/runtime/goals/objective.js.map +1 -0
  185. package/dist/runtime/goals/prompt.d.ts.map +1 -1
  186. package/dist/runtime/goals/prompt.js +7 -1
  187. package/dist/runtime/goals/prompt.js.map +1 -1
  188. package/dist/runtime/goals/stop-policy.d.ts +9 -0
  189. package/dist/runtime/goals/stop-policy.d.ts.map +1 -0
  190. package/dist/runtime/goals/stop-policy.js +83 -0
  191. package/dist/runtime/goals/stop-policy.js.map +1 -0
  192. package/dist/runtime/goals/tools.d.ts.map +1 -1
  193. package/dist/runtime/goals/tools.js +2 -2
  194. package/dist/runtime/goals/tools.js.map +1 -1
  195. package/dist/runtime/goals/types.d.ts +4 -1
  196. package/dist/runtime/goals/types.d.ts.map +1 -1
  197. package/dist/runtime/goals/types.js +2 -1
  198. package/dist/runtime/goals/types.js.map +1 -1
  199. package/dist/runtime/loop-budget.d.ts +2 -0
  200. package/dist/runtime/loop-budget.d.ts.map +1 -1
  201. package/dist/runtime/loop-budget.js +6 -2
  202. package/dist/runtime/loop-budget.js.map +1 -1
  203. package/dist/runtime/model-coordinator.d.ts +44 -1
  204. package/dist/runtime/model-coordinator.d.ts.map +1 -1
  205. package/dist/runtime/model-coordinator.js +161 -19
  206. package/dist/runtime/model-coordinator.js.map +1 -1
  207. package/dist/runtime/subagents/index.d.ts +1 -1
  208. package/dist/runtime/subagents/index.d.ts.map +1 -1
  209. package/dist/runtime/subagents/index.js.map +1 -1
  210. package/dist/runtime/subagents/production.d.ts +6 -2
  211. package/dist/runtime/subagents/production.d.ts.map +1 -1
  212. package/dist/runtime/subagents/production.js +25 -6
  213. package/dist/runtime/subagents/production.js.map +1 -1
  214. package/dist/runtime/subagents/runner.d.ts +12 -1
  215. package/dist/runtime/subagents/runner.d.ts.map +1 -1
  216. package/dist/runtime/subagents/runner.js +62 -1
  217. package/dist/runtime/subagents/runner.js.map +1 -1
  218. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  219. package/dist/runtime/subagents/runtime-integration.js +2 -1
  220. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  221. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  222. package/dist/runtime/subagents/supervisor.js +6 -0
  223. package/dist/runtime/subagents/supervisor.js.map +1 -1
  224. package/dist/runtime/subagents/types.d.ts +4 -1
  225. package/dist/runtime/subagents/types.d.ts.map +1 -1
  226. package/dist/runtime/subagents/types.js.map +1 -1
  227. package/dist/runtime/ui-events.d.ts +37 -1
  228. package/dist/runtime/ui-events.d.ts.map +1 -1
  229. package/dist/runtime/ui-events.js.map +1 -1
  230. package/dist/runtime/ui-view-model.d.ts +10 -1
  231. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  232. package/dist/runtime/ui-view-model.js +93 -4
  233. package/dist/runtime/ui-view-model.js.map +1 -1
  234. package/dist/services/bounded-response.d.ts +12 -0
  235. package/dist/services/bounded-response.d.ts.map +1 -0
  236. package/dist/services/bounded-response.js +67 -0
  237. package/dist/services/bounded-response.js.map +1 -0
  238. package/dist/services/compact/auto-compact.d.ts +82 -2
  239. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  240. package/dist/services/compact/auto-compact.js +226 -44
  241. package/dist/services/compact/auto-compact.js.map +1 -1
  242. package/dist/services/compact/compact.d.ts +54 -37
  243. package/dist/services/compact/compact.d.ts.map +1 -1
  244. package/dist/services/compact/compact.js +512 -127
  245. package/dist/services/compact/compact.js.map +1 -1
  246. package/dist/services/compact/coordinator.d.ts +5 -1
  247. package/dist/services/compact/coordinator.d.ts.map +1 -1
  248. package/dist/services/compact/coordinator.js +10 -1
  249. package/dist/services/compact/coordinator.js.map +1 -1
  250. package/dist/services/compact/fingerprint.d.ts +27 -0
  251. package/dist/services/compact/fingerprint.d.ts.map +1 -0
  252. package/dist/services/compact/fingerprint.js +69 -0
  253. package/dist/services/compact/fingerprint.js.map +1 -0
  254. package/dist/services/compact/index.d.ts +7 -5
  255. package/dist/services/compact/index.d.ts.map +1 -1
  256. package/dist/services/compact/index.js +19 -6
  257. package/dist/services/compact/index.js.map +1 -1
  258. package/dist/services/compact/planner.d.ts +41 -0
  259. package/dist/services/compact/planner.d.ts.map +1 -0
  260. package/dist/services/compact/planner.js +102 -0
  261. package/dist/services/compact/planner.js.map +1 -0
  262. package/dist/services/compact/semantic-summary.d.ts +93 -0
  263. package/dist/services/compact/semantic-summary.d.ts.map +1 -0
  264. package/dist/services/compact/semantic-summary.js +158 -0
  265. package/dist/services/compact/semantic-summary.js.map +1 -0
  266. package/dist/services/compact/summary-generator.d.ts +23 -0
  267. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  268. package/dist/services/compact/summary-generator.js +173 -39
  269. package/dist/services/compact/summary-generator.js.map +1 -1
  270. package/dist/services/concurrent-sessions.d.ts +1 -0
  271. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  272. package/dist/services/concurrent-sessions.js +35 -22
  273. package/dist/services/concurrent-sessions.js.map +1 -1
  274. package/dist/services/file-context.d.ts.map +1 -1
  275. package/dist/services/file-context.js +29 -33
  276. package/dist/services/file-context.js.map +1 -1
  277. package/dist/services/file-lock.d.ts.map +1 -1
  278. package/dist/services/file-lock.js +60 -27
  279. package/dist/services/file-lock.js.map +1 -1
  280. package/dist/services/global-config.d.ts +6 -0
  281. package/dist/services/global-config.d.ts.map +1 -1
  282. package/dist/services/global-config.js +23 -13
  283. package/dist/services/global-config.js.map +1 -1
  284. package/dist/services/goal-storage.d.ts +1 -1
  285. package/dist/services/goal-storage.d.ts.map +1 -1
  286. package/dist/services/goal-storage.js +14 -4
  287. package/dist/services/goal-storage.js.map +1 -1
  288. package/dist/services/llm.d.ts +3 -0
  289. package/dist/services/llm.d.ts.map +1 -1
  290. package/dist/services/llm.js +7 -0
  291. package/dist/services/llm.js.map +1 -1
  292. package/dist/services/project-instructions.d.ts +8 -0
  293. package/dist/services/project-instructions.d.ts.map +1 -1
  294. package/dist/services/project-instructions.js +101 -51
  295. package/dist/services/project-instructions.js.map +1 -1
  296. package/dist/services/provider-resilience/request-gate.d.ts +9 -5
  297. package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
  298. package/dist/services/provider-resilience/request-gate.js +71 -23
  299. package/dist/services/provider-resilience/request-gate.js.map +1 -1
  300. package/dist/services/safe-project-reader.d.ts +30 -0
  301. package/dist/services/safe-project-reader.d.ts.map +1 -0
  302. package/dist/services/safe-project-reader.js +141 -0
  303. package/dist/services/safe-project-reader.js.map +1 -0
  304. package/dist/services/session-storage.d.ts +146 -10
  305. package/dist/services/session-storage.d.ts.map +1 -1
  306. package/dist/services/session-storage.js +851 -120
  307. package/dist/services/session-storage.js.map +1 -1
  308. package/dist/services/tool-allowlist.d.ts +4 -4
  309. package/dist/services/tool-allowlist.js +4 -4
  310. package/dist/services/usage-state.d.ts +7 -0
  311. package/dist/services/usage-state.d.ts.map +1 -1
  312. package/dist/services/usage-state.js +117 -16
  313. package/dist/services/usage-state.js.map +1 -1
  314. package/dist/services/web-search-adapters.d.ts.map +1 -1
  315. package/dist/services/web-search-adapters.js +24 -10
  316. package/dist/services/web-search-adapters.js.map +1 -1
  317. package/dist/services/web-search-mcp.d.ts.map +1 -1
  318. package/dist/services/web-search-mcp.js +13 -3
  319. package/dist/services/web-search-mcp.js.map +1 -1
  320. package/dist/services/workspace-containment.d.ts +8 -0
  321. package/dist/services/workspace-containment.d.ts.map +1 -0
  322. package/dist/services/workspace-containment.js +44 -0
  323. package/dist/services/workspace-containment.js.map +1 -0
  324. package/dist/skills/runtime.d.ts.map +1 -1
  325. package/dist/skills/runtime.js +34 -35
  326. package/dist/skills/runtime.js.map +1 -1
  327. package/dist/terminal-ui/completion.d.ts.map +1 -1
  328. package/dist/terminal-ui/completion.js +5 -1
  329. package/dist/terminal-ui/completion.js.map +1 -1
  330. package/dist/terminal-ui/launch.d.ts +5 -0
  331. package/dist/terminal-ui/launch.d.ts.map +1 -1
  332. package/dist/terminal-ui/launch.js +53 -17
  333. package/dist/terminal-ui/launch.js.map +1 -1
  334. package/dist/tools/git.d.ts.map +1 -1
  335. package/dist/tools/git.js +47 -12
  336. package/dist/tools/git.js.map +1 -1
  337. package/dist/tools/index.d.ts.map +1 -1
  338. package/dist/tools/index.js +73 -64
  339. package/dist/tools/index.js.map +1 -1
  340. package/dist/tools/plan.d.ts.map +1 -1
  341. package/dist/tools/plan.js +7 -6
  342. package/dist/tools/plan.js.map +1 -1
  343. package/dist/tools/web.d.ts.map +1 -1
  344. package/dist/tools/web.js +11 -2
  345. package/dist/tools/web.js.map +1 -1
  346. package/dist/tui-ui/chrome-view-model.js +1 -1
  347. package/dist/tui-ui/chrome-view-model.js.map +1 -1
  348. package/dist/tui-ui/inline-surface.d.ts +1 -1
  349. package/dist/tui-ui/inline-surface.d.ts.map +1 -1
  350. package/dist/tui-ui/inline-surface.js +24 -16
  351. package/dist/tui-ui/inline-surface.js.map +1 -1
  352. package/dist/tui-ui/state.d.ts.map +1 -1
  353. package/dist/tui-ui/state.js +93 -13
  354. package/dist/tui-ui/state.js.map +1 -1
  355. package/dist/tui-ui/transcript-layout.d.ts.map +1 -1
  356. package/dist/tui-ui/transcript-layout.js +38 -29
  357. package/dist/tui-ui/transcript-layout.js.map +1 -1
  358. package/dist/ui/command-panel.d.ts +2 -0
  359. package/dist/ui/command-panel.d.ts.map +1 -1
  360. package/dist/ui/command-panel.js +46 -20
  361. package/dist/ui/command-panel.js.map +1 -1
  362. package/dist/ui/file-completion.d.ts.map +1 -1
  363. package/dist/ui/file-completion.js +12 -6
  364. package/dist/ui/file-completion.js.map +1 -1
  365. package/dist/ui/shared/command-palette.d.ts.map +1 -1
  366. package/dist/ui/shared/command-palette.js +13 -9
  367. package/dist/ui/shared/command-palette.js.map +1 -1
  368. package/dist/ui/shared/text.d.ts +2 -0
  369. package/dist/ui/shared/text.d.ts.map +1 -1
  370. package/dist/ui/shared/text.js +20 -12
  371. package/dist/ui/shared/text.js.map +1 -1
  372. package/dist/ui/suggestions.d.ts.map +1 -1
  373. package/dist/ui/suggestions.js +7 -6
  374. package/dist/ui/suggestions.js.map +1 -1
  375. package/docs/migration/v0.1.8-to-v0.1.9.md +60 -0
  376. package/docs/plan/v0.1.9-release-checklist.md +64 -0
  377. package/docs/readme.md +27 -0
  378. package/npm-shrinkwrap.json +7124 -0
  379. package/package.json +17 -7
  380. package/dist/ink/index.d.ts +0 -54
  381. package/dist/ink/index.d.ts.map +0 -1
  382. package/dist/ink/index.js +0 -111
  383. package/dist/ink/index.js.map +0 -1
  384. package/dist/services/compact/micro-compact.d.ts +0 -21
  385. package/dist/services/compact/micro-compact.d.ts.map +0 -1
  386. package/dist/services/compact/micro-compact.js +0 -99
  387. package/dist/services/compact/micro-compact.js.map +0 -1
  388. package/dist/ui-v2/components/command-palette.d.ts +0 -2
  389. package/dist/ui-v2/components/command-palette.d.ts.map +0 -1
  390. package/dist/ui-v2/components/command-palette.js +0 -18
  391. package/dist/ui-v2/components/command-palette.js.map +0 -1
  392. package/dist/ui-v2/components/edit-preview-picker.d.ts +0 -26
  393. package/dist/ui-v2/components/edit-preview-picker.d.ts.map +0 -1
  394. package/dist/ui-v2/components/edit-preview-picker.js +0 -79
  395. package/dist/ui-v2/components/edit-preview-picker.js.map +0 -1
  396. package/dist/ui-v2/components/session-picker.d.ts +0 -19
  397. package/dist/ui-v2/components/session-picker.d.ts.map +0 -1
  398. package/dist/ui-v2/components/session-picker.js +0 -52
  399. package/dist/ui-v2/components/session-picker.js.map +0 -1
  400. package/dist/ui-v2/components/shell.d.ts +0 -36
  401. package/dist/ui-v2/components/shell.d.ts.map +0 -1
  402. package/dist/ui-v2/components/shell.js +0 -131
  403. package/dist/ui-v2/components/shell.js.map +0 -1
  404. package/dist/ui-v2/index.d.ts +0 -11
  405. package/dist/ui-v2/index.d.ts.map +0 -1
  406. package/dist/ui-v2/index.js +0 -27
  407. package/dist/ui-v2/index.js.map +0 -1
  408. package/dist/ui-v2/runtime/text.d.ts +0 -2
  409. package/dist/ui-v2/runtime/text.d.ts.map +0 -1
  410. package/dist/ui-v2/runtime/text.js +0 -18
  411. package/dist/ui-v2/runtime/text.js.map +0 -1
  412. package/dist/ui-v2/state/input-reducer.d.ts +0 -39
  413. package/dist/ui-v2/state/input-reducer.d.ts.map +0 -1
  414. package/dist/ui-v2/state/input-reducer.js +0 -82
  415. package/dist/ui-v2/state/input-reducer.js.map +0 -1
  416. package/dist/ui-v2/state/picker.d.ts +0 -16
  417. package/dist/ui-v2/state/picker.d.ts.map +0 -1
  418. package/dist/ui-v2/state/picker.js +0 -52
  419. package/dist/ui-v2/state/picker.js.map +0 -1
  420. package/dist/ui-v2/state/sessions.d.ts +0 -15
  421. package/dist/ui-v2/state/sessions.d.ts.map +0 -1
  422. package/dist/ui-v2/state/sessions.js +0 -70
  423. package/dist/ui-v2/state/sessions.js.map +0 -1
  424. package/dist/ui-v2/state/suggestions.d.ts +0 -2
  425. package/dist/ui-v2/state/suggestions.d.ts.map +0 -1
  426. package/dist/ui-v2/state/suggestions.js +0 -18
  427. package/dist/ui-v2/state/suggestions.js.map +0 -1
  428. package/dist/ui-v2/types.d.ts +0 -2
  429. package/dist/ui-v2/types.d.ts.map +0 -1
  430. package/dist/ui-v2/types.js +0 -18
  431. package/dist/ui-v2/types.js.map +0 -1
@@ -1,160 +1,545 @@
1
1
  "use strict";
2
- /**
3
- * orion code - Compact 服务
4
- *
5
- * 长对话压缩服务,减少上下文长度同时保留关键信息。
6
- * 参考 OpenClaude 的 compact/ 目录实现。
7
- */
2
+ /** Semantic, group-safe conversation compaction. */
8
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.CompactCandidateValidationError = void 0;
5
+ exports.prepareCompactCandidate = prepareCompactCandidate;
6
+ exports.validateCompactCandidate = validateCompactCandidate;
7
+ exports.commitCompactCandidate = commitCompactCandidate;
9
8
  exports.compactMessages = compactMessages;
10
9
  exports.needsCompact = needsCompact;
11
- exports.quickCompact = quickCompact;
10
+ const crypto_1 = require("crypto");
12
11
  const summary_generator_1 = require("./summary-generator");
13
12
  const harness_1 = require("../../harness");
13
+ const token_estimate_1 = require("../../utils/token-estimate");
14
+ const fingerprint_1 = require("./fingerprint");
15
+ const planner_1 = require("./planner");
16
+ const semantic_summary_1 = require("./semantic-summary");
14
17
  const tool_call_groups_1 = require("./tool-call-groups");
15
- // ============================================================================
16
- // 默认配置
17
- // ============================================================================
18
+ const CONTEXT_SUMMARY_PREFIX = '[Context Summary]\n';
19
+ const SUMMARY_ACK = 'I understand the context. I will continue the conversation with this background information.';
20
+ class CompactCandidateValidationError extends Error {
21
+ constructor(validation) {
22
+ super(validation.errors.map(error => `${error.code}: ${error.message}`).join('; '));
23
+ this.validation = validation;
24
+ this.name = 'CompactCandidateValidationError';
25
+ }
26
+ }
27
+ exports.CompactCandidateValidationError = CompactCandidateValidationError;
18
28
  const DEFAULT_OPTIONS = {
19
29
  maxMessages: 20,
20
30
  keepToolCalls: true,
21
31
  keepSystemMessage: true,
22
- threshold: 0, // 不再使用消息数阈值,由 auto-compact 基于 token 控制
32
+ threshold: 0,
23
33
  };
24
- // ============================================================================
25
- // Compact 实现
26
- // ============================================================================
27
- /**
28
- * 压缩消息历史
29
- *
30
- * 策略:
31
- * 1. 保留 system 消息
32
- * 2. 保留最近 N 条消息
33
- * 3. 对早期消息生成摘要替换
34
- */
35
- async function compactMessages(messages, options) {
36
- const opts = { ...DEFAULT_OPTIONS, ...options };
37
- const originalCount = messages.length;
38
- // 检查是否需要压缩
39
- if (originalCount <= opts.threshold) {
40
- return {
41
- messages,
42
- originalCount,
43
- compactedCount: originalCount,
44
- ratio: 1,
45
- summary: '',
46
- summarySource: 'heuristic',
47
- summaryGeneratedAt: Date.now(),
48
- };
34
+ function cloneMessages(messages) {
35
+ return messages.map(message => ({
36
+ ...message,
37
+ tool_calls: message.tool_calls?.map(call => ({
38
+ ...call,
39
+ function: { ...call.function },
40
+ })),
41
+ }));
42
+ }
43
+ function uniqueStrings(values) {
44
+ return [
45
+ ...new Set(values.map(value => value?.trim()).filter((value) => !!value)),
46
+ ];
47
+ }
48
+ function invariantItemId(kind, material) {
49
+ const digest = (0, crypto_1.createHash)('sha256').update(material, 'utf8').digest('hex').slice(0, 20);
50
+ return `ctx-${kind}-${digest}`;
51
+ }
52
+ function invariantItem(params) {
53
+ const id = invariantItemId(params.kind, `${params.sourceRefs.join('\0')}\0${params.text}`);
54
+ return {
55
+ id,
56
+ groupId: `harness:${id}`,
57
+ kind: params.kind,
58
+ priority: 'must_keep',
59
+ sourceRefs: [...params.sourceRefs],
60
+ tokenEstimate: (0, token_estimate_1.estimateMessagesTokens)([{ role: 'system', content: params.text }]),
61
+ taskEpoch: params.taskEpoch,
62
+ expires: 'task',
63
+ text: params.text,
64
+ sourceRole: 'system',
65
+ messageIndexes: { start: -1, end: -1 },
66
+ status: params.status,
67
+ };
68
+ }
69
+ function structuredProjectionLine(label, value, maxLength = 280) {
70
+ const normalized = value.replace(/\s+/g, ' ').trim();
71
+ const prefix = `${label}: `;
72
+ if (prefix.length + normalized.length <= maxLength)
73
+ return `${prefix}${normalized}`;
74
+ const ref = (0, crypto_1.createHash)('sha256').update(normalized, 'utf8').digest('hex').slice(0, 16);
75
+ const suffix = ` [full-ref:${ref}]`;
76
+ const available = Math.max(0, maxLength - prefix.length - suffix.length);
77
+ return `${prefix}${normalized.slice(0, available)}${suffix}`;
78
+ }
79
+ function renderDeterministicSemanticSummary(summary, maxLength) {
80
+ const lines = ['[Semantic Snapshot v1]'];
81
+ if (summary.requestedFocus) {
82
+ lines.push(structuredProjectionLine('Requested focus', summary.requestedFocus));
83
+ }
84
+ if (summary.projectInstructions) {
85
+ lines.push(structuredProjectionLine('Project compact instructions', summary.projectInstructions));
49
86
  }
50
- // 1. 保留 system 消息
51
- const systemMessages = opts.keepSystemMessage ? messages.filter(m => m.role === 'system') : [];
52
- // 2. 分离需要压缩的消息
53
- const toCompact = opts.keepSystemMessage ? messages.filter(m => m.role !== 'system') : messages;
54
- const priorSummary = [...toCompact]
87
+ if (summary.objective)
88
+ lines.push(structuredProjectionLine('Objective', summary.objective));
89
+ if (summary.activeInstruction) {
90
+ lines.push(structuredProjectionLine('Active instruction', summary.activeInstruction));
91
+ }
92
+ for (const criterion of summary.criterionStates ?? []) {
93
+ lines.push(structuredProjectionLine(`Criterion ${criterion.id} [${criterion.status}]`, `${criterion.statement}${criterion.evidenceRefs.length ? ` | evidence=${criterion.evidenceRefs.join(',')}` : ''}`));
94
+ }
95
+ const appendValues = (label, values) => {
96
+ for (const value of values ?? [])
97
+ lines.push(structuredProjectionLine(label, value));
98
+ };
99
+ appendValues('Constraint', summary.constraints);
100
+ appendValues('Non-goal', summary.nonGoals);
101
+ appendValues('Decision', summary.decisions);
102
+ appendValues('Completed', summary.completed);
103
+ appendValues('Pending', summary.pending);
104
+ appendValues('Blocker', summary.blockers);
105
+ appendValues('Verification passed', summary.successfulVerifications);
106
+ appendValues('Verification failed', summary.failedVerifications);
107
+ appendValues('Changed file', summary.changedFiles);
108
+ appendValues('Open question', summary.openQuestions);
109
+ if (summary.nextAction)
110
+ lines.push(structuredProjectionLine('Next action', summary.nextAction));
111
+ lines.push(`Source boundary: ${summary.coverage.groupCount} groups / ${summary.coverage.messageCount} messages`);
112
+ const selected = [];
113
+ const omitted = [];
114
+ let used = 0;
115
+ for (const line of lines) {
116
+ const needed = line.length + (selected.length > 0 ? 1 : 0);
117
+ if (used + needed <= maxLength) {
118
+ selected.push(line);
119
+ used += needed;
120
+ }
121
+ else {
122
+ omitted.push(line);
123
+ }
124
+ }
125
+ if (omitted.length > 0) {
126
+ const ref = (0, crypto_1.createHash)('sha256').update(omitted.join('\n'), 'utf8').digest('hex').slice(0, 16);
127
+ const receipt = `Omitted structured lines: ${omitted.length} [full-ref:${ref}]`;
128
+ while (selected.length > 1 && selected.join('\n').length + receipt.length + 1 > maxLength) {
129
+ omitted.unshift(selected.pop());
130
+ }
131
+ if (receipt.length <= maxLength)
132
+ selected.push(receipt);
133
+ }
134
+ return selected.join('\n');
135
+ }
136
+ function enrichSemanticSummary(summary, options) {
137
+ const state = options.harnessState;
138
+ const capsule = state?.capsule ?? options.contextCapsule;
139
+ const contract = state?.contract ?? capsule?.contract;
140
+ const capability = state?.capabilityProfile;
141
+ const taskEpoch = Math.max(1, state?.taskEpoch ?? contract?.taskEpoch ?? summary.taskEpoch);
142
+ const criterionStates = contract?.criteria?.map(criterion => ({
143
+ id: criterion.id,
144
+ statement: criterion.statement,
145
+ status: criterion.status ?? 'pending',
146
+ evidenceRefs: [...criterion.evidenceRefs],
147
+ }));
148
+ const boundEvidenceRefs = uniqueStrings((criterionStates ?? []).flatMap(criterion => criterion.evidenceRefs));
149
+ const evidenceByRef = new Map();
150
+ for (const record of state?.evidenceIndex ?? []) {
151
+ const value = { content: record.content, status: record.verificationStatus };
152
+ evidenceByRef.set(record.id, value);
153
+ evidenceByRef.set(`evidence:${record.id}`, value);
154
+ }
155
+ for (const entry of state?.ledger ?? []) {
156
+ const rawSuccess = entry.metadata?.success;
157
+ const status = rawSuccess === true ? 'passed' : rawSuccess === false ? 'failed' : 'unknown';
158
+ const value = { content: entry.content, status };
159
+ evidenceByRef.set(entry.id, value);
160
+ evidenceByRef.set(`ledger:${entry.id}`, value);
161
+ }
162
+ const invariantItems = [];
163
+ if (contract) {
164
+ invariantItems.push(invariantItem({
165
+ kind: 'contract',
166
+ text: JSON.stringify({
167
+ objective: contract.objective,
168
+ activeInstruction: state?.activeInstruction ?? contract.userIntent,
169
+ constraints: contract.constraints,
170
+ prohibitions: contract.prohibitions,
171
+ nonGoals: state?.nonGoals ?? contract.nonGoals ?? [],
172
+ openQuestions: state?.openQuestions ?? contract.openQuestions ?? [],
173
+ criteria: criterionStates ?? [],
174
+ }),
175
+ sourceRefs: uniqueStrings([
176
+ `contract:${contract.id}`,
177
+ ...(criterionStates ?? []).map(criterion => criterion.id),
178
+ ]),
179
+ taskEpoch,
180
+ }));
181
+ }
182
+ for (const ref of boundEvidenceRefs) {
183
+ const evidence = evidenceByRef.get(ref);
184
+ invariantItems.push(invariantItem({
185
+ kind: 'evidence',
186
+ text: evidence?.content ?? `Evidence reference: ${ref}`,
187
+ sourceRefs: [ref],
188
+ taskEpoch,
189
+ status: evidence?.status ?? 'unknown',
190
+ }));
191
+ }
192
+ if (capsule?.nextAction) {
193
+ invariantItems.push(invariantItem({
194
+ kind: 'next_action',
195
+ text: capsule.nextAction,
196
+ sourceRefs: ['harness:next-action'],
197
+ taskEpoch,
198
+ }));
199
+ }
200
+ return {
201
+ ...summary,
202
+ taskEpoch,
203
+ objective: options.goalObjective ?? state?.rootObjective ?? contract?.objective ?? summary.objective,
204
+ activeInstruction: state?.activeInstruction ?? contract?.userIntent ?? summary.latestUserInstruction,
205
+ scope: contract
206
+ ? {
207
+ cwd: contract.allowedScope.cwd,
208
+ files: contract.allowedScope.files ? [...contract.allowedScope.files] : undefined,
209
+ commands: contract.allowedScope.commands
210
+ ? [...contract.allowedScope.commands]
211
+ : undefined,
212
+ }
213
+ : undefined,
214
+ nonGoals: uniqueStrings([
215
+ ...(summary.nonGoals ?? []),
216
+ ...(state?.nonGoals ?? contract?.nonGoals ?? []),
217
+ ]),
218
+ openQuestions: uniqueStrings([
219
+ ...(summary.openQuestions ?? []),
220
+ ...(state?.openQuestions ?? contract?.openQuestions ?? []),
221
+ ]),
222
+ criterionStates,
223
+ files: uniqueStrings([...summary.files, ...(capsule?.changedFiles ?? [])]),
224
+ changedFiles: uniqueStrings(capsule?.changedFiles ?? []),
225
+ successfulVerifications: uniqueStrings(capsule?.verification.passed ?? []),
226
+ failedVerifications: uniqueStrings(capsule?.verification.failed ?? []),
227
+ blockers: uniqueStrings([...summary.blockers, ...(capsule?.verification.warnings ?? [])]),
228
+ nextAction: capsule?.nextAction,
229
+ evidenceRefs: uniqueStrings([...summary.evidenceRefs, ...boundEvidenceRefs]),
230
+ items: [...invariantItems, ...summary.items.map(item => ({ ...item, taskEpoch }))],
231
+ verification: [
232
+ ...invariantItems.filter(item => item.kind === 'evidence'),
233
+ ...summary.verification.map(item => ({ ...item, taskEpoch })),
234
+ ],
235
+ capability: capability
236
+ ? {
237
+ revision: capability.revision,
238
+ fingerprint: capability.fingerprint,
239
+ modelId: capability.model.id,
240
+ permissionMode: capability.permission.mode,
241
+ tools: [...capability.tools],
242
+ }
243
+ : undefined,
244
+ };
245
+ }
246
+ function pinnedContextMessages(options) {
247
+ if (options.harnessState) {
248
+ return [
249
+ {
250
+ role: 'user',
251
+ content: (0, harness_1.renderHarnessStateForCompact)(options.harnessState, options.compactMode ?? 'manual'),
252
+ },
253
+ {
254
+ role: 'assistant',
255
+ content: 'I will continue from this Orion Code Context State and preserve its root objective, active instruction, constraints, and verification state.',
256
+ },
257
+ ];
258
+ }
259
+ if (options.contextCapsule) {
260
+ return [
261
+ { role: 'user', content: (0, harness_1.renderContextCapsule)(options.contextCapsule) },
262
+ {
263
+ role: 'assistant',
264
+ content: 'I will continue from this Context Capsule and preserve its open todos, constraints, and verification state.',
265
+ },
266
+ ];
267
+ }
268
+ return [];
269
+ }
270
+ function stripSyntheticCompactMessages(messages) {
271
+ const priorSummary = [...messages]
55
272
  .reverse()
56
- .find(message => message.content?.startsWith('[Context Summary]\n'));
57
- const conversationMessages = toCompact.filter(message => !message.content?.startsWith('[Context Summary]\n') &&
273
+ .find(message => message.content?.startsWith(CONTEXT_SUMMARY_PREFIX));
274
+ const conversation = messages.filter(message => !message.content?.startsWith(CONTEXT_SUMMARY_PREFIX) &&
275
+ !(message.role === 'assistant' && message.content === SUMMARY_ACK) &&
276
+ !message.content?.startsWith('[Orion Code Context State v2]') &&
277
+ !message.content?.startsWith('## Context Capsule') &&
58
278
  !(message.role === 'assistant' &&
59
- message.content ===
60
- 'I understand the context. I will continue the conversation with this background information.'));
61
- // 3. 保留最近 maxMessages
62
- const maxMessages = Math.max(0, Math.floor(opts.maxMessages ?? DEFAULT_OPTIONS.maxMessages));
63
- const requestedStart = Math.max(0, conversationMessages.length - maxMessages);
64
- const recentStart = (0, tool_call_groups_1.snapToToolCallGroupStart)(conversationMessages, requestedStart);
65
- const recentMessages = conversationMessages.slice(recentStart);
66
- const oldMessages = conversationMessages.slice(0, recentStart);
67
- if (priorSummary)
68
- oldMessages.unshift(priorSummary);
69
- // 4. 对早期消息生成摘要
70
- // Use LLM-driven summary if LLM service is provided, else fall back to heuristic
71
- const generated = opts.llm
72
- ? await (0, summary_generator_1.generateSummaryWithSource)(oldMessages, opts.llm, opts.summaryOptions)
73
- : {
74
- text: await (0, summary_generator_1.summaryGenerator)(oldMessages, opts.summaryOptions),
75
- source: 'heuristic',
76
- };
77
- const summary = generated.text;
78
- // 5. 构建压缩后的消息列表
79
- let compactedMessages = [];
80
- compactedMessages.push(...systemMessages);
81
- // Preserve structured task state before the lossy natural-language summary.
82
- if (opts.harnessState) {
83
- compactedMessages.push({
84
- role: 'user',
85
- content: (0, harness_1.renderHarnessStateForCompact)(opts.harnessState, opts.compactMode ?? 'manual'),
279
+ (message.content.startsWith('I will continue from this Orion Code Context State') ||
280
+ message.content.startsWith('I will continue from this Context Capsule'))));
281
+ return { priorSummary, conversation: cloneMessages(conversation) };
282
+ }
283
+ function withoutToolProtocol(messages) {
284
+ const callIds = new Set(messages.flatMap(message => message.tool_calls?.map(call => call.id) ?? []));
285
+ return messages
286
+ .filter(message => message.role !== 'tool' || !callIds.has(message.tool_call_id ?? ''))
287
+ .map(message => message.tool_calls?.length ? { ...message, tool_calls: undefined } : { ...message });
288
+ }
289
+ function emptyPlan(messages) {
290
+ return (0, planner_1.planCompactMessages)(messages, { maxMessages: messages.length });
291
+ }
292
+ function resultFromCandidate(candidate) {
293
+ return {
294
+ messages: cloneMessages(candidate.messages),
295
+ originalCount: candidate.originalCount,
296
+ compactedCount: candidate.messages.length,
297
+ ratio: candidate.originalCount === 0 ? 1 : candidate.messages.length / candidate.originalCount,
298
+ summary: candidate.summary,
299
+ summarySource: candidate.summarySource,
300
+ summaryGeneratedAt: candidate.summaryGeneratedAt,
301
+ semanticSummary: candidate.semanticSummary,
302
+ diagnostics: candidate.diagnostics.map(diagnostic => ({ ...diagnostic })),
303
+ fingerprint: candidate.fingerprint,
304
+ beforeTokens: candidate.beforeTokens,
305
+ afterTokens: candidate.afterTokens,
306
+ plan: candidate.plan,
307
+ };
308
+ }
309
+ /** Prepare a model-context projection without mutating or persisting its source. */
310
+ async function prepareCompactCandidate(messages, options = {}) {
311
+ const opts = { ...DEFAULT_OPTIONS, ...options };
312
+ const source = cloneMessages(messages);
313
+ const systemMessages = opts.keepSystemMessage
314
+ ? source.filter(message => message.role === 'system')
315
+ : [];
316
+ const nonSystem = opts.keepSystemMessage
317
+ ? source.filter(message => message.role !== 'system')
318
+ : source;
319
+ const { priorSummary, conversation } = stripSyntheticCompactMessages(nonSystem);
320
+ const pinned = pinnedContextMessages(opts);
321
+ const framingTokens = (0, token_estimate_1.estimateMessagesTokens)([
322
+ { role: 'user', content: CONTEXT_SUMMARY_PREFIX },
323
+ { role: 'assistant', content: SUMMARY_ACK },
324
+ ]);
325
+ const plan = (0, planner_1.planCompactMessages)(conversation, {
326
+ maxMessages: opts.maxMessages,
327
+ safeInputBudget: opts.safeInputBudget,
328
+ targetRatio: opts.targetRatio ?? planner_1.DEFAULT_COMPACT_TARGET_RATIO,
329
+ fixedTokens: (0, token_estimate_1.estimateMessagesTokens)([...systemMessages, ...pinned]) + framingTokens,
330
+ summaryReserveTokens: opts.summaryReserveTokens,
331
+ });
332
+ const evictedMessages = (0, planner_1.flattenCompactGroups)(plan.evictedGroups);
333
+ const oldMessages = priorSummary ? [{ ...priorSummary }, ...evictedMessages] : evictedMessages;
334
+ let semanticSummary = (0, semantic_summary_1.extractCompactSummary)(plan.evictedGroups, {
335
+ taskEpoch: opts.harnessState?.taskEpoch ?? opts.harnessState?.contract?.taskEpoch,
336
+ });
337
+ semanticSummary = {
338
+ ...semanticSummary,
339
+ requestedFocus: (0, summary_generator_1.normalizeCompactFocus)(opts.summaryOptions?.focus),
340
+ projectInstructions: (0, summary_generator_1.normalizeCompactInstructions)(opts.summaryOptions?.instructions),
341
+ };
342
+ semanticSummary = enrichSemanticSummary(semanticSummary, opts);
343
+ let summary = '';
344
+ let summarySource = 'heuristic';
345
+ let diagnostics = [];
346
+ if (plan.evictedGroups.length > 0) {
347
+ if (opts.llm) {
348
+ const generated = await (0, summary_generator_1.generateSummaryWithSource)(oldMessages, opts.llm, opts.summaryOptions);
349
+ summary = generated.text;
350
+ summarySource = generated.source;
351
+ diagnostics = generated.diagnostics;
352
+ if (generated.source === 'heuristic') {
353
+ const projectionBudget = Math.max(256, Math.min(opts.summaryOptions?.maxLength ?? 2000, plan.summaryReserveTokens * 3 || 2000));
354
+ summary = renderDeterministicSemanticSummary(semanticSummary, projectionBudget);
355
+ }
356
+ }
357
+ else {
358
+ const projectionBudget = Math.max(256, Math.min(opts.summaryOptions?.maxLength ?? 2000, plan.summaryReserveTokens * 3 || 2000));
359
+ summary = renderDeterministicSemanticSummary(semanticSummary, projectionBudget);
360
+ diagnostics = [
361
+ {
362
+ code: 'deterministic_projection',
363
+ message: 'Rendered the typed semantic snapshot without a summary provider.',
364
+ fallbackUsed: true,
365
+ },
366
+ ];
367
+ }
368
+ }
369
+ else if (priorSummary) {
370
+ summary = priorSummary.content.slice(CONTEXT_SUMMARY_PREFIX.length);
371
+ }
372
+ const candidateMessages = [...systemMessages];
373
+ if (plan.evictedGroups.length > 0)
374
+ candidateMessages.push(...pinned);
375
+ if (summary) {
376
+ candidateMessages.push({ role: 'user', content: `${CONTEXT_SUMMARY_PREFIX}${summary}` }, { role: 'assistant', content: SUMMARY_ACK });
377
+ }
378
+ candidateMessages.push(...(0, planner_1.flattenCompactGroups)(plan.recentGroups));
379
+ const visibleMessages = opts.keepToolCalls
380
+ ? candidateMessages
381
+ : withoutToolProtocol(candidateMessages);
382
+ return {
383
+ status: 'prepared',
384
+ messages: visibleMessages,
385
+ originalCount: source.length,
386
+ summary,
387
+ summarySource,
388
+ summaryGeneratedAt: Date.now(),
389
+ semanticSummary,
390
+ diagnostics,
391
+ fingerprint: (0, fingerprint_1.canonicalCompactCandidateFingerprint)({
392
+ messages: visibleMessages,
393
+ sourceBoundary: {
394
+ firstGroupId: semanticSummary.sourceBoundary?.firstGroupId,
395
+ lastGroupId: semanticSummary.sourceBoundary?.lastGroupId,
396
+ groupCount: semanticSummary.sourceBoundary?.groupCount ?? semanticSummary.coverage.groupCount,
397
+ messageCount: semanticSummary.sourceBoundary?.messageCount ?? semanticSummary.coverage.messageCount,
398
+ groupIds: semanticSummary.coverage.groupIds,
399
+ },
400
+ }),
401
+ beforeTokens: (0, token_estimate_1.estimateMessagesTokens)(source),
402
+ afterTokens: (0, token_estimate_1.estimateMessagesTokens)(visibleMessages),
403
+ plan,
404
+ };
405
+ }
406
+ /** Validate semantic coverage, provider headroom, and tool protocol invariants. */
407
+ function validateCompactCandidate(candidate) {
408
+ const errors = [];
409
+ try {
410
+ (0, tool_call_groups_1.assertToolCallGroups)(candidate.messages);
411
+ }
412
+ catch (error) {
413
+ errors.push({
414
+ code: 'tool_group_invalid',
415
+ message: error instanceof Error ? error.message : String(error),
86
416
  });
87
- compactedMessages.push({
88
- role: 'assistant',
89
- content: 'I will continue from this Orion Code Context State and preserve its root objective, active instruction, constraints, and verification state.',
417
+ }
418
+ if (candidate.plan.targetTokens !== undefined &&
419
+ candidate.afterTokens > candidate.plan.targetTokens) {
420
+ errors.push({
421
+ code: 'target_headroom_exceeded',
422
+ message: `Candidate uses ${candidate.afterTokens} tokens; target is ${candidate.plan.targetTokens}.`,
90
423
  });
91
424
  }
92
- else if (opts.contextCapsule) {
93
- compactedMessages.push({
94
- role: 'user',
95
- content: (0, harness_1.renderContextCapsule)(opts.contextCapsule),
425
+ const expectedCoverage = candidate.plan.evictedGroups.map(group => group.id);
426
+ if (expectedCoverage.length !== candidate.semanticSummary.coverage.groupIds.length ||
427
+ expectedCoverage.some((groupId, index) => candidate.semanticSummary.coverage.groupIds[index] !== groupId)) {
428
+ errors.push({
429
+ code: 'evicted_coverage_mismatch',
430
+ message: 'Semantic summary does not cover every evicted atomic group in order.',
96
431
  });
97
- compactedMessages.push({
98
- role: 'assistant',
99
- content: 'I will continue from this Context Capsule and preserve its open todos, constraints, and verification state.',
432
+ }
433
+ const summary = candidate.semanticSummary;
434
+ const expectedMessageCount = candidate.plan.evictedGroups.reduce((total, group) => total + group.messages.length, 0);
435
+ if (summary.sourceBoundary?.firstGroupId !== expectedCoverage[0] ||
436
+ summary.sourceBoundary?.lastGroupId !== expectedCoverage.at(-1) ||
437
+ summary.sourceBoundary?.groupCount !== expectedCoverage.length ||
438
+ summary.sourceBoundary?.messageCount !== expectedMessageCount) {
439
+ errors.push({
440
+ code: 'source_boundary_mismatch',
441
+ message: 'Semantic source boundary does not match the evicted atomic groups.',
100
442
  });
101
443
  }
102
- // 添加摘要作为 user 消息(作为上下文背景)
103
- if (summary) {
104
- compactedMessages.push({
105
- role: 'user',
106
- content: `[Context Summary]\n${summary}`,
444
+ const validKinds = new Set([
445
+ 'system',
446
+ 'contract',
447
+ 'decision',
448
+ 'evidence',
449
+ 'tool_group',
450
+ 'turn',
451
+ 'next_action',
452
+ ]);
453
+ const validPriorities = new Set(['must_keep', 'high', 'normal', 'evictable']);
454
+ const schemaInvalid = !Number.isSafeInteger(summary.taskEpoch) ||
455
+ summary.taskEpoch < 1 ||
456
+ summary.items.some(item => !item.id ||
457
+ !item.groupId ||
458
+ !validKinds.has(item.kind) ||
459
+ !validPriorities.has(item.priority) ||
460
+ !Array.isArray(item.sourceRefs) ||
461
+ item.sourceRefs.length === 0 ||
462
+ !Number.isSafeInteger(item.tokenEstimate) ||
463
+ item.tokenEstimate < 0);
464
+ if (schemaInvalid) {
465
+ errors.push({
466
+ code: 'semantic_schema_invalid',
467
+ message: 'Semantic ContextItems do not satisfy the typed schema.',
107
468
  });
108
- compactedMessages.push({
109
- role: 'assistant',
110
- content: 'I understand the context. I will continue the conversation with this background information.',
469
+ }
470
+ if (summary.items.some(item => item.taskEpoch !== summary.taskEpoch)) {
471
+ errors.push({
472
+ code: 'task_epoch_mismatch',
473
+ message: 'Semantic ContextItems are not bound to the current task epoch.',
474
+ });
475
+ }
476
+ const conversationItems = summary.items.filter(item => item.messageIndexes.start >= 0);
477
+ if (conversationItems.length !== expectedCoverage.length ||
478
+ expectedCoverage.some((groupId, index) => conversationItems[index]?.groupId !== groupId ||
479
+ !conversationItems[index]?.sourceRefs.includes(`group:${groupId}`))) {
480
+ errors.push({
481
+ code: 'semantic_reference_invalid',
482
+ message: 'Conversation ContextItems do not bind every evicted group in order.',
111
483
  });
112
484
  }
113
- // 添加最近消息
114
- compactedMessages.push(...recentMessages);
115
- // 过滤工具调用(如果需要)
116
- if (!opts.keepToolCalls) {
117
- compactedMessages = compactedMessages.map(m => {
118
- if (m.role === 'assistant' && m.tool_calls) {
119
- return { ...m, tool_calls: undefined };
485
+ const criterionIds = new Set();
486
+ let semanticReferenceInvalid = false;
487
+ for (const criterion of summary.criterionStates ?? []) {
488
+ if (!criterion.id || criterionIds.has(criterion.id))
489
+ semanticReferenceInvalid = true;
490
+ criterionIds.add(criterion.id);
491
+ if (!summary.items.some(item => item.kind === 'contract' && item.sourceRefs.includes(criterion.id))) {
492
+ semanticReferenceInvalid = true;
493
+ }
494
+ for (const evidenceRef of criterion.evidenceRefs) {
495
+ if (!summary.evidenceRefs.includes(evidenceRef) ||
496
+ !summary.items.some(item => item.kind === 'evidence' && item.sourceRefs.includes(evidenceRef))) {
497
+ semanticReferenceInvalid = true;
120
498
  }
121
- return m;
499
+ }
500
+ }
501
+ if (semanticReferenceInvalid) {
502
+ errors.push({
503
+ code: 'semantic_reference_invalid',
504
+ message: 'Criterion or evidence references are missing, duplicated, or dangling.',
122
505
  });
123
506
  }
124
- const compactedCount = compactedMessages.length;
125
- const ratio = compactedCount / originalCount;
126
- return {
127
- messages: compactedMessages,
128
- originalCount,
129
- compactedCount,
130
- ratio,
131
- summary,
132
- summarySource: generated.source,
133
- summaryGeneratedAt: Date.now(),
134
- };
507
+ return { valid: errors.length === 0, errors };
135
508
  }
136
509
  /**
137
- * 检查是否需要压缩
510
+ * Commit the prepared in-memory projection. This intentionally does not write a
511
+ * session checkpoint; the runtime/session owner must perform that transaction.
138
512
  */
139
- function needsCompact(messages, threshold) {
140
- const limit = threshold || DEFAULT_OPTIONS.threshold;
141
- return messages.length > limit;
513
+ function commitCompactCandidate(candidate) {
514
+ const validation = validateCompactCandidate(candidate);
515
+ if (!validation.valid)
516
+ throw new CompactCandidateValidationError(validation);
517
+ return resultFromCandidate(candidate);
142
518
  }
143
- /**
144
- * 快速压缩(不生成摘要,直接保留最近 N 条)
145
- */
146
- function quickCompact(messages, keepLast = 10) {
147
- const systemMessage = messages.find(m => m.role === 'system');
148
- // 过滤掉 system
149
- const nonSystem = messages.filter(m => m.role !== 'system');
150
- // 保留最近 keepLast 条
151
- const recent = nonSystem.slice(-keepLast);
152
- // 构建结果
153
- const result = [];
154
- if (systemMessage) {
155
- result.push(systemMessage);
156
- }
157
- result.push(...recent);
158
- return result;
519
+ async function compactMessages(messages, options = {}) {
520
+ const threshold = options.threshold ?? DEFAULT_OPTIONS.threshold;
521
+ if (messages.length <= threshold) {
522
+ const cloned = cloneMessages(messages);
523
+ const tokens = (0, token_estimate_1.estimateMessagesTokens)(cloned);
524
+ return {
525
+ messages,
526
+ originalCount: messages.length,
527
+ compactedCount: messages.length,
528
+ ratio: 1,
529
+ summary: '',
530
+ summarySource: 'heuristic',
531
+ summaryGeneratedAt: Date.now(),
532
+ semanticSummary: (0, semantic_summary_1.emptyCompactSummary)(),
533
+ diagnostics: [],
534
+ fingerprint: (0, fingerprint_1.canonicalMessagesFingerprint)(cloned),
535
+ beforeTokens: tokens,
536
+ afterTokens: tokens,
537
+ plan: emptyPlan(cloned),
538
+ };
539
+ }
540
+ return commitCompactCandidate(await prepareCompactCandidate(messages, options));
541
+ }
542
+ function needsCompact(messages, threshold) {
543
+ return messages.length > (threshold ?? DEFAULT_OPTIONS.threshold);
159
544
  }
160
545
  //# sourceMappingURL=compact.js.map