@orion-agents/orion-code 0.1.8 → 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 (232) hide show
  1. package/CHANGELOG.md +445 -0
  2. package/README.md +15 -6
  3. package/README.zh-CN.md +26 -7
  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/model-command-handlers.d.ts +1 -1
  20. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  21. package/dist/commands/model-command-handlers.js +166 -1
  22. package/dist/commands/model-command-handlers.js.map +1 -1
  23. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  24. package/dist/commands/session-command-handlers.js +97 -5
  25. package/dist/commands/session-command-handlers.js.map +1 -1
  26. package/dist/commands/session-commands.js +2 -2
  27. package/dist/commands/session-commands.js.map +1 -1
  28. package/dist/commands/types.d.ts +6 -0
  29. package/dist/commands/types.d.ts.map +1 -1
  30. package/dist/commands/types.js.map +1 -1
  31. package/dist/framework/index.d.ts +5 -3
  32. package/dist/framework/index.d.ts.map +1 -1
  33. package/dist/framework/index.js +9 -1
  34. package/dist/framework/index.js.map +1 -1
  35. package/dist/framework/query.d.ts +26 -4
  36. package/dist/framework/query.d.ts.map +1 -1
  37. package/dist/framework/query.js +319 -62
  38. package/dist/framework/query.js.map +1 -1
  39. package/dist/framework/stop-decision.d.ts +56 -0
  40. package/dist/framework/stop-decision.d.ts.map +1 -0
  41. package/dist/framework/stop-decision.js +36 -0
  42. package/dist/framework/stop-decision.js.map +1 -0
  43. package/dist/framework/tool-scheduler.d.ts +5 -0
  44. package/dist/framework/tool-scheduler.d.ts.map +1 -1
  45. package/dist/framework/tool-scheduler.js +24 -9
  46. package/dist/framework/tool-scheduler.js.map +1 -1
  47. package/dist/harness/assembler.d.ts.map +1 -1
  48. package/dist/harness/assembler.js +77 -19
  49. package/dist/harness/assembler.js.map +1 -1
  50. package/dist/harness/capability-profile.d.ts +3 -0
  51. package/dist/harness/capability-profile.d.ts.map +1 -0
  52. package/dist/harness/capability-profile.js +44 -0
  53. package/dist/harness/capability-profile.js.map +1 -0
  54. package/dist/harness/capsule.d.ts.map +1 -1
  55. package/dist/harness/capsule.js +22 -3
  56. package/dist/harness/capsule.js.map +1 -1
  57. package/dist/harness/compact-benchmark-corpus.d.ts +10 -0
  58. package/dist/harness/compact-benchmark-corpus.d.ts.map +1 -0
  59. package/dist/harness/compact-benchmark-corpus.js +56 -0
  60. package/dist/harness/compact-benchmark-corpus.js.map +1 -0
  61. package/dist/harness/context-harness.d.ts +23 -3
  62. package/dist/harness/context-harness.d.ts.map +1 -1
  63. package/dist/harness/context-harness.js +183 -11
  64. package/dist/harness/context-harness.js.map +1 -1
  65. package/dist/harness/contract.d.ts.map +1 -1
  66. package/dist/harness/contract.js +106 -11
  67. package/dist/harness/contract.js.map +1 -1
  68. package/dist/harness/drift-guard.d.ts +2 -1
  69. package/dist/harness/drift-guard.d.ts.map +1 -1
  70. package/dist/harness/drift-guard.js +315 -20
  71. package/dist/harness/drift-guard.js.map +1 -1
  72. package/dist/harness/evidence.d.ts.map +1 -1
  73. package/dist/harness/evidence.js +25 -12
  74. package/dist/harness/evidence.js.map +1 -1
  75. package/dist/harness/index.d.ts +7 -2
  76. package/dist/harness/index.d.ts.map +1 -1
  77. package/dist/harness/index.js +19 -1
  78. package/dist/harness/index.js.map +1 -1
  79. package/dist/harness/ledger.d.ts.map +1 -1
  80. package/dist/harness/ledger.js +44 -14
  81. package/dist/harness/ledger.js.map +1 -1
  82. package/dist/harness/progress-controller.d.ts +14 -0
  83. package/dist/harness/progress-controller.d.ts.map +1 -0
  84. package/dist/harness/progress-controller.js +110 -0
  85. package/dist/harness/progress-controller.js.map +1 -0
  86. package/dist/harness/state.d.ts.map +1 -1
  87. package/dist/harness/state.js +5 -2
  88. package/dist/harness/state.js.map +1 -1
  89. package/dist/harness/stop-controller.d.ts +15 -0
  90. package/dist/harness/stop-controller.d.ts.map +1 -0
  91. package/dist/harness/stop-controller.js +87 -0
  92. package/dist/harness/stop-controller.js.map +1 -0
  93. package/dist/harness/types.d.ts +137 -0
  94. package/dist/harness/types.d.ts.map +1 -1
  95. package/dist/harness/verification.d.ts +7 -0
  96. package/dist/harness/verification.d.ts.map +1 -0
  97. package/dist/harness/verification.js +122 -0
  98. package/dist/harness/verification.js.map +1 -0
  99. package/dist/index.d.ts +5 -5
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +7 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/ink-ui/screens/ReplScreen.d.ts +3 -0
  104. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  105. package/dist/ink-ui/screens/ReplScreen.js +30 -5
  106. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  107. package/dist/memory/index.d.ts +1 -0
  108. package/dist/memory/index.d.ts.map +1 -1
  109. package/dist/memory/index.js +1 -0
  110. package/dist/memory/index.js.map +1 -1
  111. package/dist/memory/prompt-context.d.ts +42 -0
  112. package/dist/memory/prompt-context.d.ts.map +1 -0
  113. package/dist/memory/prompt-context.js +129 -0
  114. package/dist/memory/prompt-context.js.map +1 -0
  115. package/dist/runtime/chat-compact.d.ts +26 -0
  116. package/dist/runtime/chat-compact.d.ts.map +1 -0
  117. package/dist/runtime/chat-compact.js +132 -0
  118. package/dist/runtime/chat-compact.js.map +1 -0
  119. package/dist/runtime/chat-controller.d.ts.map +1 -1
  120. package/dist/runtime/chat-controller.js +64 -74
  121. package/dist/runtime/chat-controller.js.map +1 -1
  122. package/dist/runtime/goals/coordinator.d.ts +3 -0
  123. package/dist/runtime/goals/coordinator.d.ts.map +1 -1
  124. package/dist/runtime/goals/coordinator.js +5 -15
  125. package/dist/runtime/goals/coordinator.js.map +1 -1
  126. package/dist/runtime/goals/prompt.js +1 -1
  127. package/dist/runtime/goals/prompt.js.map +1 -1
  128. package/dist/runtime/goals/stop-policy.d.ts +9 -0
  129. package/dist/runtime/goals/stop-policy.d.ts.map +1 -0
  130. package/dist/runtime/goals/stop-policy.js +83 -0
  131. package/dist/runtime/goals/stop-policy.js.map +1 -0
  132. package/dist/runtime/goals/types.d.ts +0 -1
  133. package/dist/runtime/goals/types.d.ts.map +1 -1
  134. package/dist/runtime/goals/types.js +0 -1
  135. package/dist/runtime/goals/types.js.map +1 -1
  136. package/dist/runtime/model-coordinator.d.ts +44 -1
  137. package/dist/runtime/model-coordinator.d.ts.map +1 -1
  138. package/dist/runtime/model-coordinator.js +161 -19
  139. package/dist/runtime/model-coordinator.js.map +1 -1
  140. package/dist/runtime/subagents/index.d.ts +1 -1
  141. package/dist/runtime/subagents/index.d.ts.map +1 -1
  142. package/dist/runtime/subagents/index.js.map +1 -1
  143. package/dist/runtime/subagents/production.d.ts +6 -2
  144. package/dist/runtime/subagents/production.d.ts.map +1 -1
  145. package/dist/runtime/subagents/production.js +25 -6
  146. package/dist/runtime/subagents/production.js.map +1 -1
  147. package/dist/runtime/subagents/runner.d.ts +12 -1
  148. package/dist/runtime/subagents/runner.d.ts.map +1 -1
  149. package/dist/runtime/subagents/runner.js +62 -1
  150. package/dist/runtime/subagents/runner.js.map +1 -1
  151. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  152. package/dist/runtime/subagents/runtime-integration.js +2 -1
  153. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  154. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  155. package/dist/runtime/subagents/supervisor.js +6 -0
  156. package/dist/runtime/subagents/supervisor.js.map +1 -1
  157. package/dist/runtime/subagents/types.d.ts +4 -1
  158. package/dist/runtime/subagents/types.d.ts.map +1 -1
  159. package/dist/runtime/subagents/types.js.map +1 -1
  160. package/dist/runtime/ui-events.d.ts +2 -0
  161. package/dist/runtime/ui-events.d.ts.map +1 -1
  162. package/dist/runtime/ui-events.js.map +1 -1
  163. package/dist/services/compact/auto-compact.d.ts +82 -2
  164. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  165. package/dist/services/compact/auto-compact.js +226 -44
  166. package/dist/services/compact/auto-compact.js.map +1 -1
  167. package/dist/services/compact/compact.d.ts +54 -37
  168. package/dist/services/compact/compact.d.ts.map +1 -1
  169. package/dist/services/compact/compact.js +512 -127
  170. package/dist/services/compact/compact.js.map +1 -1
  171. package/dist/services/compact/coordinator.d.ts +5 -1
  172. package/dist/services/compact/coordinator.d.ts.map +1 -1
  173. package/dist/services/compact/coordinator.js +10 -1
  174. package/dist/services/compact/coordinator.js.map +1 -1
  175. package/dist/services/compact/fingerprint.d.ts +27 -0
  176. package/dist/services/compact/fingerprint.d.ts.map +1 -0
  177. package/dist/services/compact/fingerprint.js +69 -0
  178. package/dist/services/compact/fingerprint.js.map +1 -0
  179. package/dist/services/compact/index.d.ts +7 -5
  180. package/dist/services/compact/index.d.ts.map +1 -1
  181. package/dist/services/compact/index.js +19 -6
  182. package/dist/services/compact/index.js.map +1 -1
  183. package/dist/services/compact/planner.d.ts +41 -0
  184. package/dist/services/compact/planner.d.ts.map +1 -0
  185. package/dist/services/compact/planner.js +102 -0
  186. package/dist/services/compact/planner.js.map +1 -0
  187. package/dist/services/compact/semantic-summary.d.ts +93 -0
  188. package/dist/services/compact/semantic-summary.d.ts.map +1 -0
  189. package/dist/services/compact/semantic-summary.js +158 -0
  190. package/dist/services/compact/semantic-summary.js.map +1 -0
  191. package/dist/services/compact/summary-generator.d.ts +23 -0
  192. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  193. package/dist/services/compact/summary-generator.js +173 -39
  194. package/dist/services/compact/summary-generator.js.map +1 -1
  195. package/dist/services/file-context.d.ts.map +1 -1
  196. package/dist/services/file-context.js +29 -33
  197. package/dist/services/file-context.js.map +1 -1
  198. package/dist/services/global-config.d.ts +6 -0
  199. package/dist/services/global-config.d.ts.map +1 -1
  200. package/dist/services/global-config.js +8 -0
  201. package/dist/services/global-config.js.map +1 -1
  202. package/dist/services/llm.d.ts +3 -0
  203. package/dist/services/llm.d.ts.map +1 -1
  204. package/dist/services/llm.js +7 -0
  205. package/dist/services/llm.js.map +1 -1
  206. package/dist/services/project-instructions.d.ts.map +1 -1
  207. package/dist/services/project-instructions.js +10 -17
  208. package/dist/services/project-instructions.js.map +1 -1
  209. package/dist/services/safe-project-reader.d.ts +30 -0
  210. package/dist/services/safe-project-reader.d.ts.map +1 -0
  211. package/dist/services/safe-project-reader.js +141 -0
  212. package/dist/services/safe-project-reader.js.map +1 -0
  213. package/dist/services/session-storage.d.ts +134 -5
  214. package/dist/services/session-storage.d.ts.map +1 -1
  215. package/dist/services/session-storage.js +727 -57
  216. package/dist/services/session-storage.js.map +1 -1
  217. package/dist/services/usage-state.d.ts +7 -0
  218. package/dist/services/usage-state.d.ts.map +1 -1
  219. package/dist/services/usage-state.js +117 -16
  220. package/dist/services/usage-state.js.map +1 -1
  221. package/dist/skills/runtime.d.ts.map +1 -1
  222. package/dist/skills/runtime.js +34 -35
  223. package/dist/skills/runtime.js.map +1 -1
  224. package/docs/migration/v0.1.8-to-v0.1.9.md +60 -0
  225. package/docs/plan/v0.1.9-release-checklist.md +64 -0
  226. package/docs/readme.md +27 -0
  227. package/npm-shrinkwrap.json +14 -38
  228. package/package.json +5 -1
  229. package/dist/services/compact/micro-compact.d.ts +0 -21
  230. package/dist/services/compact/micro-compact.d.ts.map +0 -1
  231. package/dist/services/compact/micro-compact.js +0 -99
  232. package/dist/services/compact/micro-compact.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMemoryPromptContext = buildMemoryPromptContext;
4
+ const entrypoint_1 = require("./entrypoint");
5
+ const relevant_finder_1 = require("./relevant-finder");
6
+ const storage_1 = require("./storage");
7
+ const DEFAULT_TOTAL_CHARS = 24000;
8
+ const DEFAULT_ENTRYPOINT_CHARS = 8000;
9
+ const DEFAULT_RELEVANT_ENTRIES = 5;
10
+ const DEFAULT_ENTRY_CHARS = 3000;
11
+ const MAX_RELEVANCE_CANDIDATES = 20;
12
+ function boundedInteger(value, fallback, maximum) {
13
+ if (value === undefined)
14
+ return fallback;
15
+ if (!Number.isSafeInteger(value))
16
+ return fallback;
17
+ return Math.max(0, Math.min(value, maximum));
18
+ }
19
+ function appendWithinBudget(parts, value, budget) {
20
+ const used = parts.reduce((total, part) => total + part.length, 0);
21
+ if (used >= budget)
22
+ return '';
23
+ const included = value.slice(0, budget - used);
24
+ parts.push(included);
25
+ return included;
26
+ }
27
+ function findIndexCandidates(index, query, minScore, limit) {
28
+ const queryKeywords = (0, relevant_finder_1.extractKeywords)(query);
29
+ if (queryKeywords.length === 0)
30
+ return [];
31
+ const candidates = [];
32
+ for (const line of index.split('\n')) {
33
+ const linkStart = line.lastIndexOf('](');
34
+ const hookStart = linkStart >= 0 ? line.indexOf(') — ', linkStart + 2) : -1;
35
+ if (linkStart < 0 || hookStart < 0)
36
+ continue;
37
+ const target = line.slice(linkStart + 2, hookStart);
38
+ if (!target.endsWith('.md'))
39
+ continue;
40
+ const name = target.slice(0, -3);
41
+ const hook = line.slice(hookStart + 4);
42
+ const memoryKeywords = (0, relevant_finder_1.extractKeywords)(`${name} ${hook}`);
43
+ const matchedKeywords = queryKeywords.filter(queryKeyword => memoryKeywords.some(memoryKeyword => memoryKeyword === queryKeyword ||
44
+ memoryKeyword.includes(queryKeyword) ||
45
+ queryKeyword.includes(memoryKeyword)));
46
+ const score = matchedKeywords.length / queryKeywords.length;
47
+ if (score >= minScore)
48
+ candidates.push({ name, score, matchedKeywords });
49
+ }
50
+ return candidates
51
+ .sort((left, right) => right.score - left.score || left.name.localeCompare(right.name))
52
+ .slice(0, limit);
53
+ }
54
+ /**
55
+ * Build a deterministic, bounded memory projection for a model-visible prompt.
56
+ *
57
+ * This is an integration API only: callers choose where the returned content
58
+ * is injected and should persist the manifest beside the request receipt.
59
+ */
60
+ function buildMemoryPromptContext(query, projectPath, options = {}) {
61
+ const maxTotalChars = boundedInteger(options.maxTotalChars, DEFAULT_TOTAL_CHARS, 100000);
62
+ const maxEntrypointChars = Math.min(boundedInteger(options.maxEntrypointChars, DEFAULT_ENTRYPOINT_CHARS, 25000), maxTotalChars);
63
+ const maxRelevantEntries = boundedInteger(options.maxRelevantEntries, DEFAULT_RELEVANT_ENTRIES, 10);
64
+ const maxEntryChars = boundedInteger(options.maxEntryChars, DEFAULT_ENTRY_CHARS, 12000);
65
+ const minScore = Number.isFinite(options.minScore) && options.minScore !== undefined
66
+ ? Math.max(0, Math.min(options.minScore, 1))
67
+ : 0.1;
68
+ const rawEntrypoint = (0, storage_1.loadMemoryIndex)(projectPath);
69
+ const normalizedEntrypoint = (0, entrypoint_1.truncateIfNeeded)(rawEntrypoint).content;
70
+ const entrypoint = normalizedEntrypoint.slice(0, maxEntrypointChars);
71
+ const candidateLimit = Math.min(MAX_RELEVANCE_CANDIDATES, Math.max(maxRelevantEntries + 1, maxRelevantEntries * 4));
72
+ const candidates = query.trim()
73
+ ? findIndexCandidates(normalizedEntrypoint, query, minScore, candidateLimit)
74
+ : [];
75
+ const parts = [];
76
+ let includedEntrypoint = '';
77
+ if (entrypoint) {
78
+ appendWithinBudget(parts, '## Memory index\n\n', maxTotalChars);
79
+ includedEntrypoint = appendWithinBudget(parts, entrypoint, maxTotalChars);
80
+ }
81
+ const selected = [];
82
+ const omitted = [];
83
+ for (const candidate of candidates) {
84
+ if (selected.length >= maxRelevantEntries) {
85
+ omitted.push({ name: candidate.name, reason: 'entry_limit' });
86
+ continue;
87
+ }
88
+ const memory = (0, storage_1.loadMemory)(candidate.name, projectPath);
89
+ if (!memory) {
90
+ omitted.push({ name: candidate.name, reason: 'unavailable' });
91
+ continue;
92
+ }
93
+ const separator = parts.length > 0 ? '\n\n' : '';
94
+ const header = `${separator}## Relevant memory: ${memory.name} (${memory.type})\n\n`;
95
+ const body = memory.content.slice(0, maxEntryChars);
96
+ const available = maxTotalChars - parts.reduce((total, part) => total + part.length, 0);
97
+ if (available <= header.length) {
98
+ omitted.push({ name: memory.name, reason: 'budget' });
99
+ continue;
100
+ }
101
+ appendWithinBudget(parts, header, maxTotalChars);
102
+ const includedBody = appendWithinBudget(parts, body, maxTotalChars);
103
+ selected.push({
104
+ name: memory.name,
105
+ type: memory.type,
106
+ score: candidate.score,
107
+ matchedKeywords: candidate.matchedKeywords.slice(0, 8),
108
+ includedChars: includedBody.length,
109
+ truncated: includedBody.length < memory.content.length || memory.content.length > maxEntryChars,
110
+ });
111
+ }
112
+ const content = parts.join('');
113
+ return {
114
+ content,
115
+ manifest: {
116
+ budgetChars: maxTotalChars,
117
+ usedChars: content.length,
118
+ candidateCount: candidates.length,
119
+ entrypoint: {
120
+ originalChars: normalizedEntrypoint.length,
121
+ includedChars: includedEntrypoint.length,
122
+ truncated: includedEntrypoint.length < normalizedEntrypoint.length,
123
+ },
124
+ selected,
125
+ omitted,
126
+ },
127
+ };
128
+ }
129
+ //# sourceMappingURL=prompt-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-context.js","sourceRoot":"","sources":["../../src/memory/prompt-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { QueryCompactCommit } from '../framework';
2
+ import type { Store } from '../framework/store';
3
+ import type { HarnessState } from '../harness';
4
+ import { type SessionMessage } from '../services/session-storage';
5
+ import type { SessionGoalV1 } from './goals/types';
6
+ import type { UiEventSink } from './ui-events';
7
+ interface CommitChatCompactInput {
8
+ pendingCompact: QueryCompactCommit;
9
+ sessionId?: string;
10
+ turnId: string;
11
+ modelId: string;
12
+ sessionMessages: readonly SessionMessage[];
13
+ harnessState: HarnessState;
14
+ activeGoal?: SessionGoalV1 | null;
15
+ store: Store;
16
+ events: UiEventSink;
17
+ }
18
+ /**
19
+ * Commit one prepared compact receipt without allowing the chat controller to
20
+ * become a second persistence owner. Transcript/checkpoint CAS remains inside
21
+ * session-storage; this adapter only emits the matching runtime trace and UI
22
+ * projection.
23
+ */
24
+ export declare function commitChatCompact(input: CommitChatCompactInput): void;
25
+ export {};
26
+ //# sourceMappingURL=chat-compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-compact.d.ts","sourceRoot":"","sources":["../../src/runtime/chat-compact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,UAAU,sBAAsB;IAC9B,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAsIrE"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.commitChatCompact = commitChatCompact;
4
+ const session_storage_1 = require("../services/session-storage");
5
+ const chat_trace_1 = require("./chat-trace");
6
+ /**
7
+ * Commit one prepared compact receipt without allowing the chat controller to
8
+ * become a second persistence owner. Transcript/checkpoint CAS remains inside
9
+ * session-storage; this adapter only emits the matching runtime trace and UI
10
+ * projection.
11
+ */
12
+ function commitChatCompact(input) {
13
+ const { pendingCompact, sessionId, turnId, modelId, sessionMessages, harnessState, activeGoal, store, events, } = input;
14
+ const compactTrace = {
15
+ model: modelId,
16
+ compactMode: pendingCompact.mode,
17
+ compactStrategy: pendingCompact.summary.source === 'llm' ? 'semantic-llm-v2' : 'deterministic-fallback-v2',
18
+ compactCandidateFingerprint: pendingCompact.fingerprint,
19
+ compactBeforeTokens: pendingCompact.beforeTokens,
20
+ compactAfterTokens: pendingCompact.afterTokens,
21
+ compactTargetTokens: pendingCompact.plan?.targetTokens,
22
+ compactTargetRatio: pendingCompact.plan?.targetRatio,
23
+ compactDiagnosticsCount: pendingCompact.diagnostics?.length ?? 0,
24
+ };
25
+ if (sessionId) {
26
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
27
+ turnId,
28
+ type: 'compact_prepare',
29
+ ...compactTrace,
30
+ });
31
+ }
32
+ try {
33
+ let committedCheckpointId;
34
+ if (sessionId) {
35
+ const prepareSource = pendingCompact.prepareSource
36
+ ? (0, session_storage_1.advanceSessionCompactSourceReceipt)(pendingCompact.prepareSource, sessionMessages)
37
+ : undefined;
38
+ const sourceMessageCount = prepareSource?.sourceMessageCount ?? (0, session_storage_1.readSessionMessages)(sessionId).length;
39
+ const checkpoint = (0, session_storage_1.commitSessionCompactCheckpoint)({
40
+ sessionId,
41
+ mode: pendingCompact.mode,
42
+ modelId,
43
+ sourceMessageCount,
44
+ transcriptStartMessageIndex: Math.max(0, sourceMessageCount - 20),
45
+ modelHistory: pendingCompact.modelHistory,
46
+ summary: pendingCompact.summary,
47
+ beforeUsage: pendingCompact.before,
48
+ afterUsage: pendingCompact.after,
49
+ harnessState,
50
+ semanticHarnessState: pendingCompact.semanticHarnessState,
51
+ goalBinding: activeGoal
52
+ ? { goalId: activeGoal.goalId, revision: activeGoal.revision, state: activeGoal }
53
+ : undefined,
54
+ prepareSource,
55
+ candidate: {
56
+ fingerprint: pendingCompact.fingerprint,
57
+ beforeTokens: pendingCompact.beforeTokens,
58
+ afterTokens: pendingCompact.afterTokens,
59
+ plan: pendingCompact.plan,
60
+ semanticSummary: pendingCompact.semanticSummary,
61
+ diagnostics: pendingCompact.diagnostics,
62
+ },
63
+ });
64
+ committedCheckpointId = checkpoint.checkpointId;
65
+ for (const type of ['compact_validate', 'compact_commit']) {
66
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
67
+ turnId,
68
+ type,
69
+ checkpointId: committedCheckpointId,
70
+ success: true,
71
+ compactSourceMessageCount: sourceMessageCount,
72
+ ...compactTrace,
73
+ });
74
+ }
75
+ store.setState({ conversationHistory: checkpoint.modelHistory });
76
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
77
+ turnId,
78
+ type: 'compact_boundary',
79
+ checkpointId: committedCheckpointId,
80
+ success: true,
81
+ compactSourceMessageCount: sourceMessageCount,
82
+ ...compactTrace,
83
+ });
84
+ }
85
+ else {
86
+ store.setState({
87
+ conversationHistory: pendingCompact.modelHistory.filter(message => message.role !== 'system'),
88
+ });
89
+ }
90
+ store.setContextUsage(pendingCompact.after);
91
+ if (sessionId) {
92
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
93
+ turnId,
94
+ type: 'compact_completed',
95
+ checkpointId: committedCheckpointId,
96
+ ...compactTrace,
97
+ note: pendingCompact.mode,
98
+ });
99
+ }
100
+ events.append({
101
+ role: 'status',
102
+ title: 'auto-compact',
103
+ statusTone: 'neutral',
104
+ content: `Context reached ${pendingCompact.before.percent}% of the safe input budget. Agent core committed a ${pendingCompact.mode} compact checkpoint; current context is ${pendingCompact.after.percent}%.`,
105
+ });
106
+ }
107
+ catch (error) {
108
+ if (sessionId) {
109
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
110
+ turnId,
111
+ type: 'compact_rollback',
112
+ success: false,
113
+ error: (0, chat_trace_1.compactTraceError)(error),
114
+ ...compactTrace,
115
+ });
116
+ (0, chat_trace_1.recordTraceEvent)(events, sessionId, {
117
+ turnId,
118
+ type: 'compact_failed',
119
+ ...compactTrace,
120
+ error: (0, chat_trace_1.compactTraceError)(error),
121
+ note: pendingCompact.mode,
122
+ });
123
+ }
124
+ events.append({
125
+ role: 'error',
126
+ title: 'compact-failed',
127
+ content: `Compact checkpoint failed; the previous model context remains active. ${error instanceof Error ? error.message : String(error)}`,
128
+ errorLayer: 'runtime',
129
+ });
130
+ }
131
+ }
132
+ //# sourceMappingURL=chat-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-compact.js","sourceRoot":"","sources":["../../src/runtime/chat-compact.ts"],"names":[],"mappings":";;AA+BA,8CAsIC;AAlKD,iEAKqC;AACrC,6CAAmE;AAgBnE;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,EACJ,cAAc,EACd,SAAS,EACT,MAAM,EACN,OAAO,EACP,eAAe,EACf,YAAY,EACZ,UAAU,EACV,KAAK,EACL,MAAM,GACP,GAAG,KAAK,CAAC;IACV,MAAM,YAAY,GAAG;QACnB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,cAAc,CAAC,IAAI;QAChC,eAAe,EACb,cAAc,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,2BAA2B;QAC3F,2BAA2B,EAAE,cAAc,CAAC,WAAW;QACvD,mBAAmB,EAAE,cAAc,CAAC,YAAY;QAChD,kBAAkB,EAAE,cAAc,CAAC,WAAW;QAC9C,mBAAmB,EAAE,cAAc,CAAC,IAAI,EAAE,YAAY;QACtD,kBAAkB,EAAE,cAAc,CAAC,IAAI,EAAE,WAAW;QACpD,uBAAuB,EAAE,cAAc,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;KACjE,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;YAClC,MAAM;YACN,IAAI,EAAE,iBAAiB;YACvB,GAAG,YAAY;SAChB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,IAAI,qBAAyC,CAAC;QAC9C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa;gBAChD,CAAC,CAAC,IAAA,oDAAkC,EAAC,cAAc,CAAC,aAAa,EAAE,eAAe,CAAC;gBACnF,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,kBAAkB,GACtB,aAAa,EAAE,kBAAkB,IAAI,IAAA,qCAAmB,EAAC,SAAS,CAAC,CAAC,MAAM,CAAC;YAC7E,MAAM,UAAU,GAAG,IAAA,gDAA8B,EAAC;gBAChD,SAAS;gBACT,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,OAAO;gBACP,kBAAkB;gBAClB,2BAA2B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,EAAE,CAAC;gBACjE,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,WAAW,EAAE,cAAc,CAAC,MAAM;gBAClC,UAAU,EAAE,cAAc,CAAC,KAAK;gBAChC,YAAY;gBACZ,oBAAoB,EAAE,cAAc,CAAC,oBAAoB;gBACzD,WAAW,EAAE,UAAU;oBACrB,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE;oBACjF,CAAC,CAAC,SAAS;gBACb,aAAa;gBACb,SAAS,EAAE;oBACT,WAAW,EAAE,cAAc,CAAC,WAAW;oBACvC,YAAY,EAAE,cAAc,CAAC,YAAY;oBACzC,WAAW,EAAE,cAAc,CAAC,WAAW;oBACvC,IAAI,EAAE,cAAc,CAAC,IAAI;oBACzB,eAAe,EAAE,cAAc,CAAC,eAAe;oBAC/C,WAAW,EAAE,cAAc,CAAC,WAAW;iBACxC;aACF,CAAC,CAAC;YACH,qBAAqB,GAAG,UAAU,CAAC,YAAY,CAAC;YAChD,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAU,EAAE,CAAC;gBACnE,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;oBAClC,MAAM;oBACN,IAAI;oBACJ,YAAY,EAAE,qBAAqB;oBACnC,OAAO,EAAE,IAAI;oBACb,yBAAyB,EAAE,kBAAkB;oBAC7C,GAAG,YAAY;iBAChB,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;YACjE,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;gBAClC,MAAM;gBACN,IAAI,EAAE,kBAAkB;gBACxB,YAAY,EAAE,qBAAqB;gBACnC,OAAO,EAAE,IAAI;gBACb,yBAAyB,EAAE,kBAAkB;gBAC7C,GAAG,YAAY;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,QAAQ,CAAC;gBACb,mBAAmB,EAAE,cAAc,CAAC,YAAY,CAAC,MAAM,CACrD,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CACrC;aACF,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;gBAClC,MAAM;gBACN,IAAI,EAAE,mBAAmB;gBACzB,YAAY,EAAE,qBAAqB;gBACnC,GAAG,YAAY;gBACf,IAAI,EAAE,cAAc,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,cAAc;YACrB,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,mBAAmB,cAAc,CAAC,MAAM,CAAC,OAAO,sDAAsD,cAAc,CAAC,IAAI,2CAA2C,cAAc,CAAC,KAAK,CAAC,OAAO,IAAI;SAC9M,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,EAAE,CAAC;YACd,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;gBAClC,MAAM;gBACN,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAA,8BAAiB,EAAC,KAAK,CAAC;gBAC/B,GAAG,YAAY;aAChB,CAAC,CAAC;YACH,IAAA,6BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE;gBAClC,MAAM;gBACN,IAAI,EAAE,gBAAgB;gBACtB,GAAG,YAAY;gBACf,KAAK,EAAE,IAAA,8BAAiB,EAAC,KAAK,CAAC;gBAC/B,IAAI,EAAE,cAAc,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,yEAAyE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YAC1I,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../src/runtime/chat-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../src/runtime/chat-controller.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,8 @@ const tool_artifacts_1 = require("../core/tool-artifacts");
20
20
  const skills_1 = require("../skills");
21
21
  const subagents_1 = require("./subagents");
22
22
  const file_context_1 = require("../services/file-context");
23
- const prompt_context_1 = require("../services/prompt-context");
23
+ const prompt_context_1 = require("../memory/prompt-context");
24
+ const prompt_context_2 = require("../services/prompt-context");
24
25
  const workspace_state_1 = require("../services/workspace-state");
25
26
  const verification_profile_1 = require("../services/verification-profile");
26
27
  const ui_events_1 = require("./ui-events");
@@ -33,6 +34,7 @@ const chat_checkpoint_1 = require("./chat-checkpoint");
33
34
  const chat_workspace_1 = require("./chat-workspace");
34
35
  const chat_presentation_1 = require("./chat-presentation");
35
36
  const chat_effort_1 = require("./chat-effort");
37
+ const chat_compact_1 = require("./chat-compact");
36
38
  const agent_mode_1 = require("../framework/agent-mode");
37
39
  const chat_command_scope_1 = require("./chat-command-scope");
38
40
  var chat_presentation_2 = require("./chat-presentation");
@@ -447,6 +449,7 @@ class AgentChatController {
447
449
  turnId,
448
450
  type: 'complete',
449
451
  finishReason: stats.finishReason,
452
+ stopDecision: stats.stopDecision,
450
453
  llmRequests: stats.llmRequests,
451
454
  toolCalls: stats.toolCalls,
452
455
  readOnlyToolCalls: stats.readOnlyToolCalls,
@@ -485,6 +488,7 @@ class AgentChatController {
485
488
  turnId,
486
489
  type: 'complete',
487
490
  finishReason: stats.finishReason,
491
+ stopDecision: stats.stopDecision,
488
492
  llmRequests: stats.llmRequests,
489
493
  toolCalls: stats.toolCalls,
490
494
  localFastPathUsed: true,
@@ -505,6 +509,7 @@ class AgentChatController {
505
509
  store: this.runtime.store,
506
510
  llm: this.runtime.llm,
507
511
  compactCoordinator: this.runtime.compactCoordinator,
512
+ modelCoordinator: this.runtime.modelCoordinator,
508
513
  runtime: this.runtime.runtime,
509
514
  sessionId: this.runtime.getSession()?.id,
510
515
  turnId,
@@ -521,6 +526,7 @@ class AgentChatController {
521
526
  this.events.sessionRestored?.(event);
522
527
  },
523
528
  getSession: this.runtime.getSession,
529
+ getActiveGoal: () => this.goalCoordinator?.goal ?? null,
524
530
  abortSignal,
525
531
  writeOutput: text => {
526
532
  if (text.trim()) {
@@ -685,7 +691,7 @@ class AgentChatController {
685
691
  if (options.persistAsUserMessage !== false) {
686
692
  this.runtime.store.addMessage({ role: 'user', content: input });
687
693
  }
688
- (0, prompt_context_1.refreshProjectInstructions)(this.runtime.store, this.runtime.cwd);
694
+ (0, prompt_context_2.refreshProjectInstructions)(this.runtime.store, this.runtime.cwd);
689
695
  const snapshot = this.runtime.store.getSnapshot();
690
696
  const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
691
697
  const onPlanModeChange = (0, agent_mode_1.createPlanModeChangeHandler)(this.runtime.store, this.controllerOptions.agentModeLifecycle);
@@ -830,12 +836,31 @@ class AgentChatController {
830
836
  : null;
831
837
  const subtaskTool = subagentBundle?.tool ?? null;
832
838
  const turnTools = subtaskTool ? [...skillResolution.tools, subtaskTool] : skillResolution.tools;
839
+ const memoryPrompt = (0, prompt_context_1.buildMemoryPromptContext)(input, this.runtime.cwd);
840
+ if (sessionId) {
841
+ const selected = memoryPrompt.manifest.selected.map(item => `memory:${item.name}`);
842
+ const omitted = memoryPrompt.manifest.omitted.map(item => `memory:${item.name}`);
843
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
844
+ turnId: String(turnId),
845
+ type: 'message',
846
+ name: 'memory_context',
847
+ argsSummary: JSON.stringify({
848
+ budgetChars: memoryPrompt.manifest.budgetChars,
849
+ usedChars: memoryPrompt.manifest.usedChars,
850
+ candidateCount: memoryPrompt.manifest.candidateCount,
851
+ entrypointTruncated: memoryPrompt.manifest.entrypoint.truncated,
852
+ selected: selected.slice(0, 10),
853
+ omitted: omitted.slice(0, 10),
854
+ }),
855
+ contentBytes: Buffer.byteLength(memoryPrompt.content, 'utf8'),
856
+ });
857
+ }
833
858
  const promptCtx = {
834
859
  cwd: this.runtime.cwd,
835
860
  platform: process.platform,
836
861
  nodeVersion: process.version,
837
862
  tools: turnTools,
838
- memoryContent: snapshot.memoryContent,
863
+ memoryContent: memoryPrompt.content,
839
864
  skillsContent: snapshot.skillsContent,
840
865
  projectInstructionsContent: snapshot.projectInstructionsContent,
841
866
  activeSkillsContent: skillResolution.promptInjection,
@@ -977,6 +1002,9 @@ class AgentChatController {
977
1002
  this.runtime.store.setContextUsage(usage);
978
1003
  },
979
1004
  compactCoordinator: this.runtime.compactCoordinator,
1005
+ onCompactPrepare: sessionId
1006
+ ? () => (0, session_storage_1.prepareSessionCompactSourceReceipt)(sessionId)
1007
+ : undefined,
980
1008
  })) {
981
1009
  switch (event.type) {
982
1010
  case 'request_start':
@@ -1009,6 +1037,10 @@ class AgentChatController {
1009
1037
  promptOmittedEvidence: event.omittedEvidence,
1010
1038
  promptIncludedEvidenceCount: event.includedEvidenceCount,
1011
1039
  promptOmittedEvidenceCount: event.omittedEvidenceCount,
1040
+ promptSectionManifest: event.sectionManifest,
1041
+ promptOverBudget: event.overBudget,
1042
+ promptCapabilityProfileVersion: event.capabilityProfileVersion,
1043
+ promptCapabilityProfileFingerprint: event.capabilityProfileFingerprint,
1012
1044
  });
1013
1045
  }
1014
1046
  break;
@@ -1218,6 +1250,7 @@ class AgentChatController {
1218
1250
  model: event.model,
1219
1251
  contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1220
1252
  finishReason: event.stats.finishReason,
1253
+ stopDecision: event.stats.stopDecision,
1221
1254
  llmRequests: event.stats.llmRequests,
1222
1255
  toolCalls: event.stats.toolCalls,
1223
1256
  readOnlyToolCalls: event.stats.readOnlyToolCalls,
@@ -1326,10 +1359,10 @@ class AgentChatController {
1326
1359
  }
1327
1360
  const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
1328
1361
  if (stats) {
1329
- pendingCompleteStats = {
1330
- ...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
1331
- finishReason: 'completion_gate',
1332
- };
1362
+ pendingCompleteStats = (0, framework_1.withLoopFinishReason)((0, chat_workspace_1.withVerificationLoopStats)(stats, summary), 'completion_gate');
1363
+ if (pendingCompleteTrace) {
1364
+ pendingCompleteTrace.stopDecision = pendingCompleteStats.stopDecision;
1365
+ }
1333
1366
  }
1334
1367
  }
1335
1368
  else if (profile.changedFiles.length > 0 && profile.required) {
@@ -1362,64 +1395,30 @@ class AgentChatController {
1362
1395
  if (sessionId && sessionMessagesToRecord.length > 0) {
1363
1396
  (0, session_storage_1.appendSessionMessages)(sessionId, sessionMessagesToRecord);
1364
1397
  }
1398
+ harness.ingestTurn({
1399
+ userInput: input,
1400
+ assistantContent: finalContent,
1401
+ sessionMessages: sessionMessagesToRecord,
1402
+ intent,
1403
+ });
1404
+ const harnessState = harness.toJSON();
1405
+ this.runtime.store.setState({ harnessState });
1406
+ (0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
1407
+ if (sessionId) {
1408
+ (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
1409
+ }
1365
1410
  if (pendingCompact) {
1366
- try {
1367
- let committedCheckpointId;
1368
- if (sessionId) {
1369
- const sourceMessageCount = (0, session_storage_1.readSessionMessages)(sessionId).length;
1370
- const checkpoint = (0, session_storage_1.commitSessionCompactCheckpoint)({
1371
- sessionId,
1372
- mode: pendingCompact.mode,
1373
- modelId: finalModel || this.runtime.llm.getModel(),
1374
- sourceMessageCount,
1375
- transcriptStartMessageIndex: Math.max(0, sourceMessageCount - 20),
1376
- modelHistory: pendingCompact.modelHistory,
1377
- summary: pendingCompact.summary,
1378
- beforeUsage: pendingCompact.before,
1379
- afterUsage: pendingCompact.after,
1380
- });
1381
- committedCheckpointId = checkpoint.checkpointId;
1382
- this.runtime.store.setState({ conversationHistory: checkpoint.modelHistory });
1383
- }
1384
- else {
1385
- this.runtime.store.setState({
1386
- conversationHistory: pendingCompact.modelHistory.filter(message => message.role !== 'system'),
1387
- });
1388
- }
1389
- this.runtime.store.setContextUsage(pendingCompact.after);
1390
- if (sessionId) {
1391
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1392
- turnId,
1393
- type: 'compact_completed',
1394
- checkpointId: committedCheckpointId,
1395
- model: finalModel || this.runtime.llm.getModel(),
1396
- note: pendingCompact.mode,
1397
- });
1398
- }
1399
- this.events.append({
1400
- role: 'status',
1401
- title: 'auto-compact',
1402
- statusTone: 'neutral',
1403
- content: `Context reached ${pendingCompact.before.percent}% of the safe input budget. Agent core committed a ${pendingCompact.mode} compact checkpoint; current context is ${pendingCompact.after.percent}%.`,
1404
- });
1405
- }
1406
- catch (error) {
1407
- if (sessionId) {
1408
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1409
- turnId,
1410
- type: 'compact_failed',
1411
- model: finalModel || this.runtime.llm.getModel(),
1412
- error: (0, chat_trace_1.compactTraceError)(error),
1413
- note: pendingCompact.mode,
1414
- });
1415
- }
1416
- this.events.append({
1417
- role: 'error',
1418
- title: 'compact-failed',
1419
- content: `Compact checkpoint failed; the previous model context remains active. ${error instanceof Error ? error.message : String(error)}`,
1420
- errorLayer: 'runtime',
1421
- });
1422
- }
1411
+ (0, chat_compact_1.commitChatCompact)({
1412
+ pendingCompact,
1413
+ sessionId,
1414
+ turnId,
1415
+ modelId: finalModel || this.runtime.llm.getModel(),
1416
+ sessionMessages: sessionMessagesToRecord,
1417
+ harnessState,
1418
+ activeGoal: this.goalCoordinator?.goal,
1419
+ store: this.runtime.store,
1420
+ events: this.events,
1421
+ });
1423
1422
  }
1424
1423
  if (finalUsage) {
1425
1424
  // Fold subagent token usage into /cost accounting.
@@ -1432,21 +1431,11 @@ class AgentChatController {
1432
1431
  }
1433
1432
  this.runtime.store.setTokenUsage(finalUsage);
1434
1433
  }
1435
- harness.ingestTurn({
1436
- userInput: input,
1437
- assistantContent: finalContent,
1438
- sessionMessages: sessionMessagesToRecord,
1439
- intent,
1440
- });
1441
- const harnessState = harness.toJSON();
1442
- this.runtime.store.setState({ harnessState });
1443
- (0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
1444
1434
  if (sessionId) {
1445
1435
  if (pendingCompleteTrace) {
1446
1436
  (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
1447
1437
  }
1448
1438
  (0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
1449
- (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
1450
1439
  }
1451
1440
  this.events.setStatus(finalModel ? `Completed with ${finalModel}` : 'Completed');
1452
1441
  }
@@ -1576,6 +1565,7 @@ class AgentChatController {
1576
1565
  model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
1577
1566
  contentBytes: 0,
1578
1567
  finishReason: failedStats.finishReason,
1568
+ stopDecision: failedStats.stopDecision,
1579
1569
  llmRequests: failedStats.llmRequests,
1580
1570
  toolCalls: failedStats.toolCalls,
1581
1571
  readOnlyToolCalls: failedStats.readOnlyToolCalls,