@di-code/coding-agent 0.1.6 → 0.1.8

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 (338) hide show
  1. package/README.md +112 -68
  2. package/compositions/base.yml +54 -0
  3. package/compositions/interactive.yml +14 -0
  4. package/compositions/json.yml +6 -0
  5. package/compositions/print.yml +5 -0
  6. package/compositions/rpc.yml +12 -0
  7. package/compositions/webui.yml +9 -0
  8. package/dist/cli.d.ts +22 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +97 -3
  11. package/dist/cli.js.map +1 -1
  12. package/dist/composition-loader-entry.d.ts +11 -0
  13. package/dist/composition-loader-entry.d.ts.map +1 -0
  14. package/dist/composition-loader-entry.js +12 -0
  15. package/dist/composition-loader-entry.js.map +1 -0
  16. package/dist/compositions.d.ts +32 -0
  17. package/dist/compositions.d.ts.map +1 -0
  18. package/dist/compositions.js +173 -0
  19. package/dist/compositions.js.map +1 -0
  20. package/dist/core/session/session-manager.d.ts +9 -2
  21. package/dist/core/session/session-manager.d.ts.map +1 -1
  22. package/dist/core/session/session-manager.js +28 -0
  23. package/dist/core/session/session-manager.js.map +1 -1
  24. package/dist/core/session/session-storage.d.ts.map +1 -1
  25. package/dist/core/session/session-storage.js +20 -3
  26. package/dist/core/session/session-storage.js.map +1 -1
  27. package/dist/core/session/types.d.ts +11 -2
  28. package/dist/core/session/types.d.ts.map +1 -1
  29. package/dist/core/session/types.js.map +1 -1
  30. package/dist/core/session-tools.d.ts +5 -0
  31. package/dist/core/session-tools.d.ts.map +1 -0
  32. package/dist/core/session-tools.js +17 -0
  33. package/dist/core/session-tools.js.map +1 -0
  34. package/dist/core/session.d.ts +21 -7
  35. package/dist/core/session.d.ts.map +1 -1
  36. package/dist/core/session.js +77 -41
  37. package/dist/core/session.js.map +1 -1
  38. package/dist/core/tools/bash.d.ts +1 -38
  39. package/dist/core/tools/bash.d.ts.map +1 -1
  40. package/dist/core/tools/bash.js +1 -207
  41. package/dist/core/tools/bash.js.map +1 -1
  42. package/dist/core/tools/edit-diff.d.ts +1 -24
  43. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  44. package/dist/core/tools/edit-diff.js +1 -135
  45. package/dist/core/tools/edit-diff.js.map +1 -1
  46. package/dist/core/tools/edit.d.ts +1 -26
  47. package/dist/core/tools/edit.d.ts.map +1 -1
  48. package/dist/core/tools/edit.js +1 -140
  49. package/dist/core/tools/edit.js.map +1 -1
  50. package/dist/core/tools/file-mutation-queue.d.ts +1 -1
  51. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  52. package/dist/core/tools/file-mutation-queue.js +1 -23
  53. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  54. package/dist/core/tools/file-search.d.ts +1 -13
  55. package/dist/core/tools/file-search.d.ts.map +1 -1
  56. package/dist/core/tools/file-search.js +1 -98
  57. package/dist/core/tools/file-search.js.map +1 -1
  58. package/dist/core/tools/glob.d.ts +1 -10
  59. package/dist/core/tools/glob.d.ts.map +1 -1
  60. package/dist/core/tools/glob.js +1 -43
  61. package/dist/core/tools/glob.js.map +1 -1
  62. package/dist/core/tools/grep.d.ts +1 -12
  63. package/dist/core/tools/grep.d.ts.map +1 -1
  64. package/dist/core/tools/grep.js +1 -66
  65. package/dist/core/tools/grep.js.map +1 -1
  66. package/dist/core/tools/load-skill.d.ts +1 -9
  67. package/dist/core/tools/load-skill.d.ts.map +1 -1
  68. package/dist/core/tools/load-skill.js +1 -21
  69. package/dist/core/tools/load-skill.js.map +1 -1
  70. package/dist/core/tools/path-boundary.d.ts +1 -4
  71. package/dist/core/tools/path-boundary.d.ts.map +1 -1
  72. package/dist/core/tools/path-boundary.js +1 -65
  73. package/dist/core/tools/path-boundary.js.map +1 -1
  74. package/dist/core/tools/read.d.ts +1 -16
  75. package/dist/core/tools/read.d.ts.map +1 -1
  76. package/dist/core/tools/read.js +1 -131
  77. package/dist/core/tools/read.js.map +1 -1
  78. package/dist/core/tools/write.d.ts +1 -16
  79. package/dist/core/tools/write.d.ts.map +1 -1
  80. package/dist/core/tools/write.js +1 -44
  81. package/dist/core/tools/write.js.map +1 -1
  82. package/dist/entry.js +30 -28
  83. package/dist/entry.js.map +1 -1
  84. package/dist/i18n.d.ts.map +1 -1
  85. package/dist/i18n.js +2 -0
  86. package/dist/i18n.js.map +1 -1
  87. package/dist/index.d.ts +6 -3
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +6 -3
  90. package/dist/index.js.map +1 -1
  91. package/dist/interactive/builtin.d.ts +17 -0
  92. package/dist/interactive/builtin.d.ts.map +1 -0
  93. package/dist/interactive/builtin.js +47 -0
  94. package/dist/interactive/builtin.js.map +1 -0
  95. package/dist/interactive/controller.d.ts +85 -0
  96. package/dist/interactive/controller.d.ts.map +1 -0
  97. package/dist/interactive/controller.js +211 -0
  98. package/dist/interactive/controller.js.map +1 -0
  99. package/dist/interactive/index.d.ts +3 -0
  100. package/dist/interactive/index.d.ts.map +1 -0
  101. package/dist/interactive/index.js +3 -0
  102. package/dist/interactive/index.js.map +1 -0
  103. package/dist/interactive-host-entry.d.ts +7 -0
  104. package/dist/interactive-host-entry.d.ts.map +1 -0
  105. package/dist/interactive-host-entry.js +123 -0
  106. package/dist/interactive-host-entry.js.map +1 -0
  107. package/dist/interactive-profile.d.ts +18 -0
  108. package/dist/interactive-profile.d.ts.map +1 -0
  109. package/dist/interactive-profile.js +290 -0
  110. package/dist/interactive-profile.js.map +1 -0
  111. package/dist/interactive-resources-entry.d.ts +7 -0
  112. package/dist/interactive-resources-entry.d.ts.map +1 -0
  113. package/dist/interactive-resources-entry.js +42 -0
  114. package/dist/interactive-resources-entry.js.map +1 -0
  115. package/dist/legacy-main.d.ts +39 -0
  116. package/dist/legacy-main.d.ts.map +1 -0
  117. package/dist/legacy-main.js +611 -0
  118. package/dist/legacy-main.js.map +1 -0
  119. package/dist/main.d.ts +15 -34
  120. package/dist/main.d.ts.map +1 -1
  121. package/dist/main.js +130 -513
  122. package/dist/main.js.map +1 -1
  123. package/dist/mcp/entries.d.ts +42 -0
  124. package/dist/mcp/entries.d.ts.map +1 -0
  125. package/dist/mcp/entries.js +98 -0
  126. package/dist/mcp/entries.js.map +1 -0
  127. package/dist/mcp-client-entry.d.ts +5 -0
  128. package/dist/mcp-client-entry.d.ts.map +1 -0
  129. package/dist/mcp-client-entry.js +6 -0
  130. package/dist/mcp-client-entry.js.map +1 -0
  131. package/dist/mcp-config-entry.d.ts +5 -0
  132. package/dist/mcp-config-entry.d.ts.map +1 -0
  133. package/dist/mcp-config-entry.js +6 -0
  134. package/dist/mcp-config-entry.js.map +1 -0
  135. package/dist/mcp-tools-entry.d.ts +5 -0
  136. package/dist/mcp-tools-entry.d.ts.map +1 -0
  137. package/dist/mcp-tools-entry.js +6 -0
  138. package/dist/mcp-tools-entry.js.map +1 -0
  139. package/dist/mcp-transport-entry.d.ts +5 -0
  140. package/dist/mcp-transport-entry.d.ts.map +1 -0
  141. package/dist/mcp-transport-entry.js +6 -0
  142. package/dist/mcp-transport-entry.js.map +1 -0
  143. package/dist/modes/interactive-entry.d.ts +18 -0
  144. package/dist/modes/interactive-entry.d.ts.map +1 -0
  145. package/dist/modes/interactive-entry.js +21 -0
  146. package/dist/modes/interactive-entry.js.map +1 -0
  147. package/dist/modes/interactive-state.js +1 -1
  148. package/dist/modes/interactive-state.js.map +1 -1
  149. package/dist/modes/interactive.d.ts +16 -6
  150. package/dist/modes/interactive.d.ts.map +1 -1
  151. package/dist/modes/interactive.js +99 -33
  152. package/dist/modes/interactive.js.map +1 -1
  153. package/dist/modes/json-entry.d.ts +13 -0
  154. package/dist/modes/json-entry.d.ts.map +1 -0
  155. package/dist/modes/json-entry.js +14 -0
  156. package/dist/modes/json-entry.js.map +1 -0
  157. package/dist/modes/json.d.ts +4 -1
  158. package/dist/modes/json.d.ts.map +1 -1
  159. package/dist/modes/json.js +3 -3
  160. package/dist/modes/json.js.map +1 -1
  161. package/dist/modes/print-entry.d.ts +10 -0
  162. package/dist/modes/print-entry.d.ts.map +1 -0
  163. package/dist/modes/print-entry.js +11 -0
  164. package/dist/modes/print-entry.js.map +1 -0
  165. package/dist/modes/tree-selector.d.ts.map +1 -1
  166. package/dist/modes/tree-selector.js +4 -0
  167. package/dist/modes/tree-selector.js.map +1 -1
  168. package/dist/plugin-dump-composition.d.ts +6 -0
  169. package/dist/plugin-dump-composition.d.ts.map +1 -0
  170. package/dist/plugin-dump-composition.js +7 -0
  171. package/dist/plugin-dump-composition.js.map +1 -0
  172. package/dist/plugin-inventory.d.ts +7 -0
  173. package/dist/plugin-inventory.d.ts.map +1 -0
  174. package/dist/plugin-inventory.js +8 -0
  175. package/dist/plugin-inventory.js.map +1 -0
  176. package/dist/plugin-manager.d.ts +6 -0
  177. package/dist/plugin-manager.d.ts.map +1 -0
  178. package/dist/plugin-manager.js +7 -0
  179. package/dist/plugin-manager.js.map +1 -0
  180. package/dist/plugin-trace.d.ts +6 -0
  181. package/dist/plugin-trace.d.ts.map +1 -0
  182. package/dist/plugin-trace.js +7 -0
  183. package/dist/plugin-trace.js.map +1 -0
  184. package/dist/plugins/dynamic-broker.d.ts +76 -0
  185. package/dist/plugins/dynamic-broker.d.ts.map +1 -0
  186. package/dist/plugins/dynamic-broker.js +852 -0
  187. package/dist/plugins/dynamic-broker.js.map +1 -0
  188. package/dist/plugins/profile.d.ts +15 -0
  189. package/dist/plugins/profile.d.ts.map +1 -0
  190. package/dist/plugins/profile.js +34 -0
  191. package/dist/plugins/profile.js.map +1 -0
  192. package/dist/plugins/runtime-host.d.ts +37 -0
  193. package/dist/plugins/runtime-host.d.ts.map +1 -0
  194. package/dist/plugins/runtime-host.js +95 -0
  195. package/dist/plugins/runtime-host.js.map +1 -0
  196. package/dist/plugins/trust.d.ts +8 -0
  197. package/dist/plugins/trust.d.ts.map +1 -0
  198. package/dist/plugins/trust.js +59 -0
  199. package/dist/plugins/trust.js.map +1 -0
  200. package/dist/project-trust-entry.d.ts +15 -0
  201. package/dist/project-trust-entry.d.ts.map +1 -0
  202. package/dist/project-trust-entry.js +15 -0
  203. package/dist/project-trust-entry.js.map +1 -0
  204. package/dist/rpc/client.d.ts +78 -6
  205. package/dist/rpc/client.d.ts.map +1 -1
  206. package/dist/rpc/client.js +172 -4
  207. package/dist/rpc/client.js.map +1 -1
  208. package/dist/rpc/dispatcher.d.ts +121 -0
  209. package/dist/rpc/dispatcher.d.ts.map +1 -0
  210. package/dist/rpc/dispatcher.js +994 -0
  211. package/dist/rpc/dispatcher.js.map +1 -0
  212. package/dist/rpc/index.d.ts +2 -0
  213. package/dist/rpc/index.d.ts.map +1 -1
  214. package/dist/rpc/index.js +2 -0
  215. package/dist/rpc/index.js.map +1 -1
  216. package/dist/rpc/lifecycle.d.ts +6 -0
  217. package/dist/rpc/lifecycle.d.ts.map +1 -0
  218. package/dist/rpc/lifecycle.js +24 -0
  219. package/dist/rpc/lifecycle.js.map +1 -0
  220. package/dist/rpc/protocol.d.ts +112 -31
  221. package/dist/rpc/protocol.d.ts.map +1 -1
  222. package/dist/rpc/protocol.js +569 -117
  223. package/dist/rpc/protocol.js.map +1 -1
  224. package/dist/rpc/server-service.d.ts +7 -0
  225. package/dist/rpc/server-service.d.ts.map +1 -0
  226. package/dist/rpc/server-service.js +3 -0
  227. package/dist/rpc/server-service.js.map +1 -0
  228. package/dist/rpc/server.d.ts +16 -19
  229. package/dist/rpc/server.d.ts.map +1 -1
  230. package/dist/rpc/server.js +59 -115
  231. package/dist/rpc/server.js.map +1 -1
  232. package/dist/rpc-client-sdk-entry.d.ts +12 -0
  233. package/dist/rpc-client-sdk-entry.d.ts.map +1 -0
  234. package/dist/rpc-client-sdk-entry.js +11 -0
  235. package/dist/rpc-client-sdk-entry.js.map +1 -0
  236. package/dist/rpc-entry.js +50 -18
  237. package/dist/rpc-entry.js.map +1 -1
  238. package/dist/rpc-server-entry.d.ts +8 -0
  239. package/dist/rpc-server-entry.d.ts.map +1 -0
  240. package/dist/rpc-server-entry.js +67 -0
  241. package/dist/rpc-server-entry.js.map +1 -0
  242. package/dist/runtime/attachment-store.d.ts +13 -0
  243. package/dist/runtime/attachment-store.d.ts.map +1 -0
  244. package/dist/runtime/attachment-store.js +93 -0
  245. package/dist/runtime/attachment-store.js.map +1 -0
  246. package/dist/runtime/bootstrap.d.ts +14 -0
  247. package/dist/runtime/bootstrap.d.ts.map +1 -0
  248. package/dist/runtime/bootstrap.js +29 -0
  249. package/dist/runtime/bootstrap.js.map +1 -0
  250. package/dist/runtime/interactive-host-service.d.ts +22 -0
  251. package/dist/runtime/interactive-host-service.d.ts.map +1 -0
  252. package/dist/runtime/interactive-host-service.js +2 -0
  253. package/dist/runtime/interactive-host-service.js.map +1 -0
  254. package/dist/runtime/interactive-resource-service.d.ts +11 -0
  255. package/dist/runtime/interactive-resource-service.d.ts.map +1 -0
  256. package/dist/runtime/interactive-resource-service.js +3 -0
  257. package/dist/runtime/interactive-resource-service.js.map +1 -0
  258. package/dist/runtime/plugin-inventory-entry.d.ts +5 -0
  259. package/dist/runtime/plugin-inventory-entry.d.ts.map +1 -0
  260. package/dist/runtime/plugin-inventory-entry.js +18 -0
  261. package/dist/runtime/plugin-inventory-entry.js.map +1 -0
  262. package/dist/runtime/plugin-inventory-service.d.ts +8 -0
  263. package/dist/runtime/plugin-inventory-service.d.ts.map +1 -0
  264. package/dist/runtime/plugin-inventory-service.js +3 -0
  265. package/dist/runtime/plugin-inventory-service.js.map +1 -0
  266. package/dist/runtime/plugin-manager-entry.d.ts +20 -0
  267. package/dist/runtime/plugin-manager-entry.d.ts.map +1 -0
  268. package/dist/runtime/plugin-manager-entry.js +96 -0
  269. package/dist/runtime/plugin-manager-entry.js.map +1 -0
  270. package/dist/runtime/plugin-observability-entry.d.ts +12 -0
  271. package/dist/runtime/plugin-observability-entry.d.ts.map +1 -0
  272. package/dist/runtime/plugin-observability-entry.js +73 -0
  273. package/dist/runtime/plugin-observability-entry.js.map +1 -0
  274. package/dist/runtime/product-host.d.ts +91 -0
  275. package/dist/runtime/product-host.d.ts.map +1 -0
  276. package/dist/runtime/product-host.js +529 -0
  277. package/dist/runtime/product-host.js.map +1 -0
  278. package/dist/runtime/session-factory.d.ts +17 -0
  279. package/dist/runtime/session-factory.d.ts.map +1 -0
  280. package/dist/runtime/session-factory.js +75 -0
  281. package/dist/runtime/session-factory.js.map +1 -0
  282. package/dist/runtime/session-host.d.ts +152 -0
  283. package/dist/runtime/session-host.d.ts.map +1 -0
  284. package/dist/runtime/session-host.js +895 -0
  285. package/dist/runtime/session-host.js.map +1 -0
  286. package/dist/runtime-core-entry.d.ts +11 -0
  287. package/dist/runtime-core-entry.d.ts.map +1 -0
  288. package/dist/runtime-core-entry.js +9 -0
  289. package/dist/runtime-core-entry.js.map +1 -0
  290. package/dist/session-factory-entry.d.ts +7 -0
  291. package/dist/session-factory-entry.d.ts.map +1 -0
  292. package/dist/session-factory-entry.js +9 -0
  293. package/dist/session-factory-entry.js.map +1 -0
  294. package/dist/session-store-jsonl-entry.d.ts +7 -0
  295. package/dist/session-store-jsonl-entry.d.ts.map +1 -0
  296. package/dist/session-store-jsonl-entry.js +33 -0
  297. package/dist/session-store-jsonl-entry.js.map +1 -0
  298. package/dist/startup.d.ts +21 -1
  299. package/dist/startup.d.ts.map +1 -1
  300. package/dist/startup.js +179 -10
  301. package/dist/startup.js.map +1 -1
  302. package/dist/subagents/index.d.ts +2 -0
  303. package/dist/subagents/index.d.ts.map +1 -0
  304. package/dist/subagents/index.js +2 -0
  305. package/dist/subagents/index.js.map +1 -0
  306. package/dist/subagents/service.d.ts +50 -0
  307. package/dist/subagents/service.d.ts.map +1 -0
  308. package/dist/subagents/service.js +521 -0
  309. package/dist/subagents/service.js.map +1 -0
  310. package/dist/ui-host.d.ts +125 -0
  311. package/dist/ui-host.d.ts.map +1 -0
  312. package/dist/ui-host.js +275 -0
  313. package/dist/ui-host.js.map +1 -0
  314. package/dist/web/assets/index-BwfuGMvv.css +1 -0
  315. package/dist/web/assets/index-DPUaJqFJ.js +41 -0
  316. package/dist/web/assets/index-DPUaJqFJ.js.map +1 -0
  317. package/dist/web/index.html +14 -0
  318. package/dist/web-command.d.ts +11 -0
  319. package/dist/web-command.d.ts.map +1 -0
  320. package/dist/web-command.js +114 -0
  321. package/dist/web-command.js.map +1 -0
  322. package/dist/web-frontend.d.ts +73 -0
  323. package/dist/web-frontend.d.ts.map +1 -0
  324. package/dist/web-frontend.js +249 -0
  325. package/dist/web-frontend.js.map +1 -0
  326. package/dist/web.d.ts +254 -0
  327. package/dist/web.d.ts.map +1 -0
  328. package/dist/web.js +740 -0
  329. package/dist/web.js.map +1 -0
  330. package/dist/webui-entry.d.ts +3 -0
  331. package/dist/webui-entry.d.ts.map +1 -0
  332. package/dist/webui-entry.js +73 -0
  333. package/dist/webui-entry.js.map +1 -0
  334. package/dist/webui.d.ts +91 -0
  335. package/dist/webui.d.ts.map +1 -0
  336. package/dist/webui.js +882 -0
  337. package/dist/webui.js.map +1 -0
  338. package/package.json +89 -8
@@ -1,18 +1,12 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { Agent, estimateContextTokens, generateCompactionSummary, prepareCompaction, resolveContextBudget, shouldCompact, } from "@di-code/agent";
3
3
  import { createSkillCatalog, resolveSkillInvocation } from "@di-code/skills";
4
- import { createBashTool } from "./tools/bash.js";
5
- import { createEditTool } from "./tools/edit.js";
6
- import { createGlobTool } from "./tools/glob.js";
7
- import { createGrepTool } from "./tools/grep.js";
8
- import { createLoadSkillTool } from "./tools/load-skill.js";
9
- import { createReadTool } from "./tools/read.js";
10
- import { createWriteTool } from "./tools/write.js";
11
4
  function defaultThinkingLevel(model) {
12
5
  const efforts = model.reasoningEfforts;
13
6
  if (!efforts || efforts.length === 0)
14
7
  return undefined;
15
- return efforts.includes("medium") ? "medium" : efforts.includes("high") ? "high" : efforts[0];
8
+ return (model.defaultReasoningEffort ??
9
+ (efforts.includes("medium") ? "medium" : efforts.includes("high") ? "high" : efforts[0]));
16
10
  }
17
11
  function textFromUserMessage(message) {
18
12
  return message.content
@@ -27,12 +21,12 @@ export class AgentSession {
27
21
  provider;
28
22
  skills;
29
23
  skillCatalog;
30
- extensionHost;
31
24
  model;
32
25
  thinkingLevelValue;
33
26
  sessionIdValue;
34
27
  now;
35
28
  compactionEnabledValue;
29
+ compactionTransform;
36
30
  contextBudget;
37
31
  keepRecentTokens;
38
32
  usageTotals;
@@ -40,8 +34,12 @@ export class AgentSession {
40
34
  promptActive = false;
41
35
  steeringMessages = [];
42
36
  sessionListeners = new Set();
37
+ agentUnsubscribers = [];
38
+ onDispose;
39
+ disposed = false;
43
40
  constructor(options) {
44
41
  this.allowedRootValue = options.allowedRoot;
42
+ this.onDispose = options.onDispose;
45
43
  this.sessionManager = options.sessionManager;
46
44
  this.provider = options.provider;
47
45
  this.skills = structuredClone([...(options.skills ?? [])].map((skill) => ({
@@ -57,9 +55,11 @@ export class AgentSession {
57
55
  },
58
56
  diagnostics: [],
59
57
  })));
60
- this.extensionHost = options.extensionHost;
61
58
  this.model = options.model;
62
- this.thinkingLevelValue = defaultThinkingLevel(this.model);
59
+ this.thinkingLevelValue =
60
+ options.thinkingLevel !== undefined && this.model.reasoningEfforts?.includes(options.thinkingLevel)
61
+ ? options.thinkingLevel
62
+ : defaultThinkingLevel(this.model);
63
63
  this.sessionIdValue = options.sessionManager?.header.id ?? randomUUID();
64
64
  this.now = options.now ?? Date.now;
65
65
  this.contextBudget = resolveContextBudget(options.model);
@@ -67,6 +67,7 @@ export class AgentSession {
67
67
  throw new TypeError("compaction.enabled must be a boolean");
68
68
  }
69
69
  this.compactionEnabledValue = options.sessionManager !== undefined && options.compaction?.enabled !== false;
70
+ this.compactionTransform = options.compaction?.prepareMessages;
70
71
  const defaultKeepRecentTokens = Math.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2)));
71
72
  this.keepRecentTokens = options.compaction?.keepRecentTokens ?? defaultKeepRecentTokens;
72
73
  if (!Number.isInteger(this.keepRecentTokens) || this.keepRecentTokens <= 0) {
@@ -92,32 +93,12 @@ export class AgentSession {
92
93
  thinkingLevel: this.thinkingLevelValue,
93
94
  systemPrompt: options.systemPrompt,
94
95
  sessionId: this.sessionIdValue,
95
- tools: [
96
- createReadTool(options.allowedRoot),
97
- createWriteTool(options.allowedRoot),
98
- createEditTool(options.allowedRoot),
99
- createBashTool(options.allowedRoot),
100
- createGlobTool(options.allowedRoot),
101
- createGrepTool(options.allowedRoot),
102
- ...(this.skillCatalog.listForModel().length > 0 ? [createLoadSkillTool(this.skillCatalog)] : []),
103
- ...(this.extensionHost?.listTools().map((tool) => ({
104
- name: tool.name,
105
- description: tool.description,
106
- parameters: tool.parameters,
107
- execute: async (toolCallId, parameters, signal) => {
108
- const result = await this.extensionHost?.runTool(tool.name, toolCallId, parameters, signal);
109
- if (result === undefined)
110
- throw new Error(`Extension tool "${tool.name}" is unavailable.`);
111
- return [...result];
112
- },
113
- })) ?? []),
114
- ...(options.externalTools ?? []),
115
- ],
96
+ tools: Object.freeze([...options.tools]),
116
97
  now: this.now,
117
98
  initialMessages: options.sessionManager?.messages,
118
99
  initialContextMessages: initialContext?.messages,
119
100
  });
120
- this.agent.subscribe(async (event) => {
101
+ this.agentUnsubscribers.push(this.agent.subscribe(async (event) => {
121
102
  if (event.type !== "message_end" || this.sessionManager === undefined || this.persistenceError !== undefined) {
122
103
  return;
123
104
  }
@@ -128,14 +109,14 @@ export class AgentSession {
128
109
  this.persistenceError = cause;
129
110
  throw cause;
130
111
  }
131
- });
132
- this.agent.subscribe(async (event) => {
112
+ }));
113
+ this.agentUnsubscribers.push(this.agent.subscribe(async (event) => {
133
114
  if (event.type !== "message_end" || event.message.role !== "assistant")
134
115
  return;
135
116
  this.addUsage(event.message.usage);
136
117
  await this.emitSession({ type: "usage_update", usage: this.usage });
137
- });
138
- this.agent.subscribe(async (event, signal) => {
118
+ }));
119
+ this.agentUnsubscribers.push(this.agent.subscribe(async (event, _signal) => {
139
120
  if (event.type === "message_end" && event.message.role === "user") {
140
121
  const queued = this.steeringMessages[0];
141
122
  if (queued && textFromUserMessage(event.message) === queued.deliveredText) {
@@ -143,10 +124,22 @@ export class AgentSession {
143
124
  await this.emitQueueUpdate();
144
125
  }
145
126
  }
146
- if (this.extensionHost)
147
- await this.extensionHost.emit(event, signal);
148
127
  await this.emitSession(event);
149
- });
128
+ }));
129
+ }
130
+ /** Releases listeners and the isolated product scope. Repeated calls are harmless. */
131
+ async dispose() {
132
+ if (this.disposed)
133
+ return;
134
+ this.disposed = true;
135
+ for (const unsubscribe of this.agentUnsubscribers.splice(0))
136
+ unsubscribe();
137
+ this.sessionListeners.clear();
138
+ await this.onDispose?.();
139
+ }
140
+ assertNotDisposed() {
141
+ if (this.disposed)
142
+ throw new Error("AgentSession has been disposed.");
150
143
  }
151
144
  get transcript() {
152
145
  if (!this.sessionManager)
@@ -181,6 +174,7 @@ export class AgentSession {
181
174
  return structuredClone(this.skills.filter((skill) => skill.userInvocable !== false));
182
175
  }
183
176
  setModel(modelId) {
177
+ this.assertNotDisposed();
184
178
  if (this.promptActive)
185
179
  throw new Error("Cannot change model while AgentSession is processing a prompt.");
186
180
  const next = this.provider.models.find((model) => model.id === modelId);
@@ -198,6 +192,7 @@ export class AgentSession {
198
192
  return structuredClone(this.model);
199
193
  }
200
194
  setRuntime(provider, model) {
195
+ this.assertNotDisposed();
201
196
  if (this.promptActive)
202
197
  throw new Error("Cannot change runtime while AgentSession is processing a prompt.");
203
198
  const configuredModel = provider.models.find((candidate) => candidate.id === model.id);
@@ -214,6 +209,7 @@ export class AgentSession {
214
209
  return structuredClone(this.model);
215
210
  }
216
211
  cycleThinkingLevel() {
212
+ this.assertNotDisposed();
217
213
  if (this.promptActive)
218
214
  throw new Error("Cannot change thinking level while AgentSession is processing a prompt.");
219
215
  const efforts = this.model.reasoningEfforts;
@@ -224,10 +220,22 @@ export class AgentSession {
224
220
  this.agent.setThinkingLevel(this.thinkingLevelValue);
225
221
  return this.thinkingLevelValue;
226
222
  }
223
+ setThinkingLevel(level) {
224
+ this.assertNotDisposed();
225
+ if (this.promptActive)
226
+ throw new Error("Cannot change thinking level while AgentSession is processing a prompt.");
227
+ if (!this.model.reasoningEfforts?.includes(level)) {
228
+ throw new Error(`Thinking level "${level}" is not supported by model "${this.model.id}".`);
229
+ }
230
+ this.thinkingLevelValue = level;
231
+ this.agent.setThinkingLevel(level);
232
+ return level;
233
+ }
227
234
  get compactionEnabled() {
228
235
  return this.compactionEnabledValue;
229
236
  }
230
237
  setCompactionEnabled(enabled) {
238
+ this.assertNotDisposed();
231
239
  if (this.promptActive)
232
240
  throw new Error("Cannot change compaction while AgentSession is processing a prompt.");
233
241
  this.compactionEnabledValue = enabled && this.sessionManager !== undefined;
@@ -264,6 +272,7 @@ export class AgentSession {
264
272
  }
265
273
  /** Queues provider-neutral text and image content for the active Agent run. */
266
274
  async steerWithImages(text, images, signal) {
275
+ this.assertNotDisposed();
267
276
  if (this.persistenceError !== undefined)
268
277
  throw this.persistenceError;
269
278
  if (!this.promptActive)
@@ -279,6 +288,7 @@ export class AgentSession {
279
288
  }
280
289
  /** Sends one text prompt with explicitly supplied image attachments. */
281
290
  async promptWithImages(text, images, signal) {
291
+ this.assertNotDisposed();
282
292
  if (this.persistenceError !== undefined) {
283
293
  throw this.persistenceError;
284
294
  }
@@ -300,6 +310,7 @@ export class AgentSession {
300
310
  }
301
311
  }
302
312
  async compact(signal) {
313
+ this.assertNotDisposed();
303
314
  if (this.promptActive)
304
315
  throw new Error("AgentSession is already processing a prompt.");
305
316
  if (!this.sessionManager)
@@ -314,6 +325,7 @@ export class AgentSession {
314
325
  }
315
326
  /** Changes the active persisted branch and replaces the next-request model context. */
316
327
  async navigateTree(entryId) {
328
+ this.assertNotDisposed();
317
329
  if (this.promptActive)
318
330
  throw new Error("Cannot navigate the session tree while AgentSession is processing a prompt.");
319
331
  if (!this.sessionManager)
@@ -404,7 +416,22 @@ export class AgentSession {
404
416
  throw new Error("Cannot compact without a persisted session.");
405
417
  const context = this.sessionManager.buildContext();
406
418
  await this.emitSession({ type: "compaction_start", reason });
407
- const preparation = prepareCompaction(context.messages, this.keepRecentTokens);
419
+ let messages;
420
+ try {
421
+ messages = this.compactionTransform ? await this.compactionTransform(context.messages, signal) : context.messages;
422
+ }
423
+ catch (cause) {
424
+ const errorMessage = cause instanceof Error ? cause.message : String(cause);
425
+ await this.emitSession({ type: "compaction_end", reason, success: false, errorMessage });
426
+ throw cause;
427
+ }
428
+ if (messages.length !== context.messages.length) {
429
+ const error = new Error("Compaction message transform must preserve message count.");
430
+ await this.emitSession({ type: "compaction_end", reason, success: false, errorMessage: error.message });
431
+ throw error;
432
+ }
433
+ const preparation = prepareCompaction(messages, this.keepRecentTokens) ??
434
+ (reason === "manual" ? this.prepareManualCompaction(messages) : undefined);
408
435
  const firstKeptEntryId = preparation ? context.sourceEntryIds[preparation.firstKeptMessageIndex] : undefined;
409
436
  if (!preparation || typeof firstKeptEntryId !== "string") {
410
437
  const errorMessage = reason === "manual"
@@ -444,5 +471,14 @@ export class AgentSession {
444
471
  this.agent.replaceContext(this.sessionManager.buildContext().messages);
445
472
  await this.emitSession({ type: "compaction_end", reason, success: true });
446
473
  }
474
+ /** A manual request may retain only the newest complete user turn when the configured suffix is larger than history. */
475
+ prepareManualCompaction(messages) {
476
+ for (let index = messages.length - 1; index > 0; index--) {
477
+ if (messages[index]?.role !== "user")
478
+ continue;
479
+ return prepareCompaction(messages, estimateContextTokens(messages.slice(index)));
480
+ }
481
+ return undefined;
482
+ }
447
483
  }
448
484
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentTool } from \"@di-code/agent\";\nimport {\n\tAgent,\n\ttype AgentListener,\n\ttype ContextBudget,\n\testimateContextTokens,\n\tgenerateCompactionSummary,\n\tprepareCompaction,\n\tresolveContextBudget,\n\tshouldCompact,\n} from \"@di-code/agent\";\nimport type {\n\tAssistantMessage,\n\tImageContent,\n\tMessage,\n\tModel,\n\tProvider,\n\tThinkingLevel,\n\tUsage,\n\tUserContent,\n} from \"@di-code/ai\";\nimport { createSkillCatalog, resolveSkillInvocation, type SkillCatalog } from \"@di-code/skills\";\nimport type { ExtensionHost } from \"../extensions/runtime.ts\";\nimport type { SkillResource } from \"./resources/types.ts\";\nimport type { SessionManager } from \"./session/session-manager.ts\";\nimport type { SessionDiagnostic, SessionEntry, SessionTreeNode } from \"./session/types.ts\";\nimport { createBashTool } from \"./tools/bash.ts\";\nimport { createEditTool } from \"./tools/edit.ts\";\nimport { createGlobTool } from \"./tools/glob.ts\";\nimport { createGrepTool } from \"./tools/grep.ts\";\nimport { createLoadSkillTool } from \"./tools/load-skill.ts\";\nimport { createReadTool } from \"./tools/read.ts\";\nimport { createWriteTool } from \"./tools/write.ts\";\n\nexport interface AgentSessionCompactionOptions {\n\treadonly enabled?: boolean;\n\treadonly keepRecentTokens?: number;\n}\n\nexport interface SessionUsage {\n\treadonly requestCount: number;\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n\treadonly cacheReadTokens: number;\n\treadonly cacheWriteTokens: number;\n\treadonly totalTokens: number;\n\treadonly cost: Usage[\"cost\"];\n\treadonly estimatedContextTokens: number;\n\treadonly contextWindow: number;\n\treadonly reserveTokens: number;\n\treadonly triggerTokens: number;\n}\n\nexport interface AgentSessionOptions {\n\treadonly allowedRoot: string;\n\treadonly provider: Provider;\n\treadonly model: Model;\n\treadonly systemPrompt?: string;\n\treadonly skills?: readonly SkillResource[];\n\treadonly now?: () => number;\n\treadonly sessionManager?: SessionManager;\n\treadonly compaction?: AgentSessionCompactionOptions;\n\treadonly extensionHost?: ExtensionHost;\n\t/** External tools already validated by the product integration layer. */\n\treadonly externalTools?: readonly AgentTool[];\n}\n\nexport type AgentSessionEvent =\n\t| import(\"@di-code/agent\").AgentEvent\n\t| { type: \"compaction_start\"; reason: \"threshold\" | \"manual\" }\n\t| { type: \"compaction_end\"; reason: \"threshold\" | \"manual\"; success: boolean; errorMessage?: string }\n\t| { type: \"queue_update\"; steering: readonly string[] }\n\t| { type: \"usage_update\"; usage: SessionUsage }\n\t| {\n\t\t\ttype: \"tree_navigated\";\n\t\t\toldLeafId: string;\n\t\t\tnewLeafId: string;\n\t\t\tselectedEntryId: string;\n\t\t\trestoredEditorText: boolean;\n\t };\n\nexport interface TreeNavigationResult {\n\treadonly editorText?: string;\n\treadonly selectedEntryId: string;\n\treadonly leafId: string;\n\treadonly imagesOmitted: boolean;\n}\n\nexport type AgentSessionListener = (event: AgentSessionEvent) => void | Promise<void>;\n\nfunction defaultThinkingLevel(model: Model): ThinkingLevel | undefined {\n\tconst efforts = model.reasoningEfforts;\n\tif (!efforts || efforts.length === 0) return undefined;\n\treturn efforts.includes(\"medium\") ? \"medium\" : efforts.includes(\"high\") ? \"high\" : efforts[0];\n}\n\nfunction textFromUserMessage(message: Extract<Message, { role: \"user\" }>): string {\n\treturn message.content\n\t\t.filter((content): content is Extract<UserContent, { type: \"text\" }> => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\");\n}\n\nexport class AgentSession {\n\tprivate readonly agent: Agent;\n\tprivate readonly allowedRootValue: string;\n\tprivate readonly sessionManager?: SessionManager;\n\tprivate provider: Provider;\n\tprivate readonly skills: readonly SkillResource[];\n\tprivate readonly skillCatalog: SkillCatalog;\n\tprivate readonly extensionHost?: ExtensionHost;\n\tprivate model: Model;\n\tprivate thinkingLevelValue?: ThinkingLevel;\n\tprivate readonly sessionIdValue: string;\n\tprivate readonly now: () => number;\n\tprivate compactionEnabledValue: boolean;\n\tprivate contextBudget: ContextBudget;\n\tprivate keepRecentTokens: number;\n\tprivate usageTotals: Omit<\n\t\tSessionUsage,\n\t\t\"estimatedContextTokens\" | \"contextWindow\" | \"reserveTokens\" | \"triggerTokens\"\n\t>;\n\tprivate persistenceError?: unknown;\n\tprivate promptActive = false;\n\tprivate readonly steeringMessages: Array<{ displayText: string; deliveredText: string }> = [];\n\tprivate readonly sessionListeners = new Set<AgentSessionListener>();\n\n\tconstructor(options: AgentSessionOptions) {\n\t\tthis.allowedRootValue = options.allowedRoot;\n\t\tthis.sessionManager = options.sessionManager;\n\t\tthis.provider = options.provider;\n\t\tthis.skills = structuredClone(\n\t\t\t[...(options.skills ?? [])].map((skill) => ({\n\t\t\t\t...skill,\n\t\t\t\tsource:\n\t\t\t\t\tskill.source ?? (skill.scope === \"explicit\" ? \"explicit\" : skill.scope === \"project\" ? \"project\" : \"user\"),\n\t\t\t\tuserInvocable: skill.userInvocable ?? true,\n\t\t\t})),\n\t\t);\n\t\tthis.skillCatalog = createSkillCatalog(\n\t\t\tthis.skills.map((skill) => ({\n\t\t\t\tskill: {\n\t\t\t\t\t...skill,\n\t\t\t\t\tsource:\n\t\t\t\t\t\tskill.source ?? (skill.scope === \"explicit\" ? \"explicit\" : skill.scope === \"project\" ? \"project\" : \"user\"),\n\t\t\t\t\tuserInvocable: skill.userInvocable ?? true,\n\t\t\t\t},\n\t\t\t\tdiagnostics: [],\n\t\t\t})),\n\t\t);\n\t\tthis.extensionHost = options.extensionHost;\n\t\tthis.model = options.model;\n\t\tthis.thinkingLevelValue = defaultThinkingLevel(this.model);\n\t\tthis.sessionIdValue = options.sessionManager?.header.id ?? randomUUID();\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.contextBudget = resolveContextBudget(options.model);\n\t\tif (options.compaction?.enabled !== undefined && typeof options.compaction.enabled !== \"boolean\") {\n\t\t\tthrow new TypeError(\"compaction.enabled must be a boolean\");\n\t\t}\n\t\tthis.compactionEnabledValue = options.sessionManager !== undefined && options.compaction?.enabled !== false;\n\t\tconst defaultKeepRecentTokens = Math.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2)));\n\t\tthis.keepRecentTokens = options.compaction?.keepRecentTokens ?? defaultKeepRecentTokens;\n\t\tif (!Number.isInteger(this.keepRecentTokens) || this.keepRecentTokens <= 0) {\n\t\t\tthrow new RangeError(\"compaction.keepRecentTokens must be a positive integer\");\n\t\t}\n\t\tthis.usageTotals = {\n\t\t\trequestCount: 0,\n\t\t\tinputTokens: 0,\n\t\t\toutputTokens: 0,\n\t\t\tcacheReadTokens: 0,\n\t\t\tcacheWriteTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t};\n\t\tfor (const message of options.sessionManager?.messages ?? []) {\n\t\t\tif (message.role === \"assistant\") this.addUsage(message.usage);\n\t\t}\n\t\tconst initialContext = options.sessionManager?.buildContext();\n\t\tthis.agent = new Agent({\n\t\t\tprovider: options.provider,\n\t\t\tmodel: options.model,\n\t\t\tthinkingLevel: this.thinkingLevelValue,\n\t\t\tsystemPrompt: options.systemPrompt,\n\t\t\tsessionId: this.sessionIdValue,\n\t\t\ttools: [\n\t\t\t\tcreateReadTool(options.allowedRoot),\n\t\t\t\tcreateWriteTool(options.allowedRoot),\n\t\t\t\tcreateEditTool(options.allowedRoot),\n\t\t\t\tcreateBashTool(options.allowedRoot),\n\t\t\t\tcreateGlobTool(options.allowedRoot),\n\t\t\t\tcreateGrepTool(options.allowedRoot),\n\t\t\t\t...(this.skillCatalog.listForModel().length > 0 ? [createLoadSkillTool(this.skillCatalog)] : []),\n\t\t\t\t...(this.extensionHost?.listTools().map((tool) => ({\n\t\t\t\t\tname: tool.name,\n\t\t\t\t\tdescription: tool.description,\n\t\t\t\t\tparameters: tool.parameters,\n\t\t\t\t\texecute: async (toolCallId: string, parameters: never, signal?: AbortSignal) => {\n\t\t\t\t\t\tconst result = await this.extensionHost?.runTool(tool.name, toolCallId, parameters, signal);\n\t\t\t\t\t\tif (result === undefined) throw new Error(`Extension tool \"${tool.name}\" is unavailable.`);\n\t\t\t\t\t\treturn [...result];\n\t\t\t\t\t},\n\t\t\t\t})) ?? []),\n\t\t\t\t...(options.externalTools ?? []),\n\t\t\t],\n\t\t\tnow: this.now,\n\t\t\tinitialMessages: options.sessionManager?.messages,\n\t\t\tinitialContextMessages: initialContext?.messages,\n\t\t});\n\t\tthis.agent.subscribe(async (event) => {\n\t\t\tif (event.type !== \"message_end\" || this.sessionManager === undefined || this.persistenceError !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.sessionManager.appendMessage(event.message);\n\t\t\t} catch (cause) {\n\t\t\t\tthis.persistenceError = cause;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t});\n\t\tthis.agent.subscribe(async (event) => {\n\t\t\tif (event.type !== \"message_end\" || event.message.role !== \"assistant\") return;\n\t\t\tthis.addUsage(event.message.usage);\n\t\t\tawait this.emitSession({ type: \"usage_update\", usage: this.usage });\n\t\t});\n\t\tthis.agent.subscribe(async (event, signal) => {\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"user\") {\n\t\t\t\tconst queued = this.steeringMessages[0];\n\t\t\t\tif (queued && textFromUserMessage(event.message) === queued.deliveredText) {\n\t\t\t\t\tthis.steeringMessages.shift();\n\t\t\t\t\tawait this.emitQueueUpdate();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.extensionHost) await this.extensionHost.emit(event, signal);\n\t\t\tawait this.emitSession(event);\n\t\t});\n\t}\n\n\tget transcript(): readonly Message[] {\n\t\tif (!this.sessionManager) return this.agent.transcript;\n\t\treturn this.sessionManager\n\t\t\t.getBranch()\n\t\t\t.filter((entry): entry is Extract<SessionEntry, { type: \"message\" }> => entry.type === \"message\")\n\t\t\t.map((entry) => structuredClone(entry.message));\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.promptActive;\n\t}\n\n\tget sessionId(): string {\n\t\treturn this.sessionIdValue;\n\t}\n\n\tget modelId(): string {\n\t\treturn this.model.id;\n\t}\n\n\tget providerId(): string {\n\t\treturn this.provider.id;\n\t}\n\n\tget thinkingLevel(): ThinkingLevel | undefined {\n\t\treturn this.thinkingLevelValue;\n\t}\n\n\tget allowedRoot(): string {\n\t\treturn this.allowedRootValue;\n\t}\n\n\tget availableModels(): readonly Model[] {\n\t\treturn structuredClone(this.provider.models);\n\t}\n\n\tget availableSkills(): readonly SkillResource[] {\n\t\treturn structuredClone(this.skills.filter((skill) => skill.userInvocable !== false));\n\t}\n\n\tsetModel(modelId: string): Model {\n\t\tif (this.promptActive) throw new Error(\"Cannot change model while AgentSession is processing a prompt.\");\n\t\tconst next = this.provider.models.find((model) => model.id === modelId);\n\t\tif (!next) throw new Error(`Unknown model \"${modelId}\" for provider \"${this.provider.id}\".`);\n\t\tthis.model = structuredClone(next);\n\t\tthis.thinkingLevelValue =\n\t\t\tthis.thinkingLevelValue !== undefined && this.model.reasoningEfforts?.includes(this.thinkingLevelValue)\n\t\t\t\t? this.thinkingLevelValue\n\t\t\t\t: defaultThinkingLevel(this.model);\n\t\tthis.agent.setModel(this.model);\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\tthis.contextBudget = resolveContextBudget(this.model);\n\t\tthis.keepRecentTokens = Math.min(\n\t\t\tthis.keepRecentTokens,\n\t\t\tMath.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2))),\n\t\t);\n\t\treturn structuredClone(this.model);\n\t}\n\n\tsetRuntime(provider: Provider, model: Model): Model {\n\t\tif (this.promptActive) throw new Error(\"Cannot change runtime while AgentSession is processing a prompt.\");\n\t\tconst configuredModel = provider.models.find((candidate) => candidate.id === model.id);\n\t\tif (!configuredModel || configuredModel.provider !== provider.id || model.provider !== provider.id) {\n\t\t\tthrow new Error(`Model \"${model.id}\" does not belong to provider \"${provider.id}\".`);\n\t\t}\n\t\tthis.provider = provider;\n\t\tthis.model = structuredClone(configuredModel);\n\t\tthis.thinkingLevelValue = defaultThinkingLevel(this.model);\n\t\tthis.agent.setRuntime(provider, this.model);\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\tthis.contextBudget = resolveContextBudget(this.model);\n\t\tthis.keepRecentTokens = Math.min(\n\t\t\tthis.keepRecentTokens,\n\t\t\tMath.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2))),\n\t\t);\n\t\treturn structuredClone(this.model);\n\t}\n\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tif (this.promptActive) throw new Error(\"Cannot change thinking level while AgentSession is processing a prompt.\");\n\t\tconst efforts = this.model.reasoningEfforts;\n\t\tif (!efforts || efforts.length === 0) return undefined;\n\t\tconst currentIndex = this.thinkingLevelValue === undefined ? -1 : efforts.indexOf(this.thinkingLevelValue);\n\t\tthis.thinkingLevelValue = efforts[(currentIndex + 1) % efforts.length];\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\treturn this.thinkingLevelValue;\n\t}\n\n\tget compactionEnabled(): boolean {\n\t\treturn this.compactionEnabledValue;\n\t}\n\n\tsetCompactionEnabled(enabled: boolean): boolean {\n\t\tif (this.promptActive) throw new Error(\"Cannot change compaction while AgentSession is processing a prompt.\");\n\t\tthis.compactionEnabledValue = enabled && this.sessionManager !== undefined;\n\t\treturn this.compactionEnabledValue;\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager?.filePath;\n\t}\n\n\tget sessionDiagnostics(): readonly SessionDiagnostic[] {\n\t\treturn this.sessionManager?.diagnostics ?? [];\n\t}\n\n\tget sessionTree(): readonly SessionTreeNode[] {\n\t\treturn this.sessionManager?.getTree() ?? [];\n\t}\n\n\tget sessionLeafId(): string | undefined {\n\t\treturn this.sessionManager?.leafId;\n\t}\n\n\tget usage(): SessionUsage {\n\t\treturn {\n\t\t\t...this.usageTotals,\n\t\t\tcost: { ...this.usageTotals.cost },\n\t\t\testimatedContextTokens: estimateContextTokens(this.agent.contextMessages),\n\t\t\tcontextWindow: this.contextBudget.contextWindow,\n\t\t\treserveTokens: this.contextBudget.reserveTokens,\n\t\t\ttriggerTokens: this.contextBudget.triggerTokens,\n\t\t};\n\t}\n\n\tasync prompt(text: string, signal?: AbortSignal): Promise<AssistantMessage> {\n\t\treturn this.promptWithImages(text, [], signal);\n\t}\n\n\t/** Queues an instruction for the next provider request while this Session is running. */\n\tasync steer(text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.steerWithImages(text, [], signal);\n\t}\n\n\t/** Queues provider-neutral text and image content for the active Agent run. */\n\tasync steerWithImages(text: string, images: readonly ImageContent[], signal?: AbortSignal): Promise<void> {\n\t\tif (this.persistenceError !== undefined) throw this.persistenceError;\n\t\tif (!this.promptActive) throw new Error(\"AgentSession is not processing a prompt.\");\n\t\tif (images.length > 0 && !this.model.input.includes(\"image\")) {\n\t\t\tthrow new Error(`Model \"${this.model.id}\" does not support image input.`);\n\t\t}\n\t\tconst prompt = await resolveSkillInvocation(text, this.skillCatalog, signal);\n\t\tconst content: UserContent[] = [{ type: \"text\", text: prompt }, ...structuredClone([...images])];\n\t\tthis.agent.steerWithContent(content);\n\t\tthis.steeringMessages.push({ displayText: text, deliveredText: prompt });\n\t\tawait this.emitQueueUpdate();\n\t}\n\n\t/** Sends one text prompt with explicitly supplied image attachments. */\n\tasync promptWithImages(\n\t\ttext: string,\n\t\timages: readonly ImageContent[],\n\t\tsignal?: AbortSignal,\n\t): Promise<AssistantMessage> {\n\t\tif (this.persistenceError !== undefined) {\n\t\t\tthrow this.persistenceError;\n\t\t}\n\t\tif (this.promptActive) {\n\t\t\tthrow new Error(\"AgentSession is already processing a prompt.\");\n\t\t}\n\n\t\tthis.promptActive = true;\n\t\ttry {\n\t\t\tif (images.length > 0 && !this.model.input.includes(\"image\")) {\n\t\t\t\tthrow new Error(`Model \"${this.model.id}\" does not support image input.`);\n\t\t\t}\n\t\t\tconst prompt = await resolveSkillInvocation(text, this.skillCatalog, signal);\n\t\t\tconst content: UserContent[] = [{ type: \"text\", text: prompt }, ...structuredClone([...images])];\n\t\t\tawait this.compactIfNeeded(content, signal);\n\t\t\treturn await this.agent.promptWithContent(content, signal);\n\t\t} finally {\n\t\t\tthis.promptActive = false;\n\t\t}\n\t}\n\n\tasync compact(signal?: AbortSignal): Promise<void> {\n\t\tif (this.promptActive) throw new Error(\"AgentSession is already processing a prompt.\");\n\t\tif (!this.sessionManager) throw new Error(\"Cannot compact without a persisted session.\");\n\t\tthis.promptActive = true;\n\t\ttry {\n\t\t\tawait this.compactNow(signal, \"manual\");\n\t\t} finally {\n\t\t\tthis.promptActive = false;\n\t\t}\n\t}\n\n\t/** Changes the active persisted branch and replaces the next-request model context. */\n\tasync navigateTree(entryId: string): Promise<TreeNavigationResult> {\n\t\tif (this.promptActive)\n\t\t\tthrow new Error(\"Cannot navigate the session tree while AgentSession is processing a prompt.\");\n\t\tif (!this.sessionManager) throw new Error(\"Cannot navigate an in-memory session.\");\n\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\tif (!entry) throw new Error(`Unknown session tree entry \"${entryId}\".`);\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\" && entry.message.stopReason === \"tool_use\") {\n\t\t\tthrow new Error(\"Select the final tool result for an assistant message with tool calls.\");\n\t\t}\n\n\t\tconst oldLeafId = this.sessionManager.leafId;\n\t\tlet editorText: string | undefined;\n\t\tlet imagesOmitted = false;\n\t\tif (entry.type === \"message\" && entry.message.role === \"user\") {\n\t\t\teditorText = textFromUserMessage(entry.message);\n\t\t\timagesOmitted = entry.message.content.some((content) => content.type === \"image\");\n\t\t\tthis.sessionManager.setLeaf(entry.parentId);\n\t\t} else {\n\t\t\tthis.sessionManager.setLeaf(entry.id);\n\t\t}\n\n\t\ttry {\n\t\t\tthis.agent.replaceContext(this.sessionManager.buildContext().messages);\n\t\t} catch (cause) {\n\t\t\tthis.sessionManager.setLeaf(oldLeafId);\n\t\t\tthrow cause;\n\t\t}\n\t\tawait this.emitSession({\n\t\t\ttype: \"tree_navigated\",\n\t\t\toldLeafId,\n\t\t\tnewLeafId: this.sessionManager.leafId,\n\t\t\tselectedEntryId: entry.id,\n\t\t\trestoredEditorText: editorText !== undefined,\n\t\t});\n\t\treturn { editorText, selectedEntryId: entry.id, leafId: this.sessionManager.leafId, imagesOmitted };\n\t}\n\n\tsubscribe(listener: AgentListener): () => void {\n\t\treturn this.agent.subscribe(listener);\n\t}\n\n\tsubscribeSession(listener: AgentSessionListener): () => void {\n\t\tthis.sessionListeners.add(listener);\n\t\treturn () => this.sessionListeners.delete(listener);\n\t}\n\n\tprivate async emitSession(event: AgentSessionEvent): Promise<void> {\n\t\tfor (const listener of this.sessionListeners) await listener(structuredClone(event));\n\t}\n\n\tprivate async emitQueueUpdate(): Promise<void> {\n\t\tawait this.emitSession({\n\t\t\ttype: \"queue_update\",\n\t\t\tsteering: this.steeringMessages.map((message) => message.displayText),\n\t\t});\n\t}\n\n\tprivate addUsage(usage: Usage): void {\n\t\tthis.usageTotals = {\n\t\t\trequestCount: this.usageTotals.requestCount + 1,\n\t\t\tinputTokens: this.usageTotals.inputTokens + usage.input,\n\t\t\toutputTokens: this.usageTotals.outputTokens + usage.output,\n\t\t\tcacheReadTokens: this.usageTotals.cacheReadTokens + usage.cacheRead,\n\t\t\tcacheWriteTokens: this.usageTotals.cacheWriteTokens + usage.cacheWrite,\n\t\t\ttotalTokens: this.usageTotals.totalTokens + usage.totalTokens,\n\t\t\tcost: {\n\t\t\t\tinput: this.usageTotals.cost.input + usage.cost.input,\n\t\t\t\toutput: this.usageTotals.cost.output + usage.cost.output,\n\t\t\t\tcacheRead: this.usageTotals.cost.cacheRead + usage.cost.cacheRead,\n\t\t\t\tcacheWrite: this.usageTotals.cost.cacheWrite + usage.cost.cacheWrite,\n\t\t\t\ttotal: this.usageTotals.cost.total + usage.cost.total,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async compactIfNeeded(content: readonly UserContent[], signal?: AbortSignal): Promise<void> {\n\t\tif (!this.compactionEnabledValue || !this.sessionManager) return;\n\n\t\tconst context = this.sessionManager.buildContext();\n\t\tconst pendingUser: Message = {\n\t\t\trole: \"user\",\n\t\t\tcontent: structuredClone([...content]),\n\t\t\ttimestamp: 0,\n\t\t};\n\t\tconst estimatedTokens = estimateContextTokens([...context.messages, pendingUser]);\n\t\tif (!shouldCompact(estimatedTokens, this.contextBudget)) return;\n\n\t\tawait this.compactNow(signal, \"threshold\");\n\t}\n\n\tprivate async compactNow(signal: AbortSignal | undefined, reason: \"threshold\" | \"manual\"): Promise<void> {\n\t\tif (!this.sessionManager) throw new Error(\"Cannot compact without a persisted session.\");\n\t\tconst context = this.sessionManager.buildContext();\n\t\tawait this.emitSession({ type: \"compaction_start\", reason });\n\t\tconst preparation = prepareCompaction(context.messages, this.keepRecentTokens);\n\t\tconst firstKeptEntryId = preparation ? context.sourceEntryIds[preparation.firstKeptMessageIndex] : undefined;\n\t\tif (!preparation || typeof firstKeptEntryId !== \"string\") {\n\t\t\tconst errorMessage =\n\t\t\t\treason === \"manual\"\n\t\t\t\t\t? \"No valid compaction cut point was found for the current session.\"\n\t\t\t\t\t: \"Context limit reached but no valid compaction cut point was found.\";\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow new Error(errorMessage);\n\t\t}\n\n\t\tlet summary: string;\n\t\ttry {\n\t\t\tsummary = await generateCompactionSummary(preparation, this.provider, this.model, {\n\t\t\t\treserveTokens: this.contextBudget.reserveTokens,\n\t\t\t\tsignal,\n\t\t\t\tnow: this.now,\n\t\t\t\tonUsage: (usage) => this.addUsage(usage),\n\t\t\t});\n\t\t\tawait this.emitSession({ type: \"usage_update\", usage: this.usage });\n\t\t} catch (cause) {\n\t\t\tconst errorMessage = cause instanceof Error ? cause.message : String(cause);\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow cause;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.sessionManager.appendSummary({\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tthis.persistenceError = cause;\n\t\t\tconst errorMessage = cause instanceof Error ? cause.message : String(cause);\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow cause;\n\t\t}\n\n\t\tthis.agent.replaceContext(this.sessionManager.buildContext().messages);\n\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: true });\n\t}\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentTool, AgentToolResult } from \"@di-code/agent\";\nimport {\n\tAgent,\n\ttype AgentListener,\n\ttype ContextBudget,\n\testimateContextTokens,\n\tgenerateCompactionSummary,\n\tprepareCompaction,\n\tresolveContextBudget,\n\tshouldCompact,\n} from \"@di-code/agent\";\nimport type {\n\tAssistantMessage,\n\tImageContent,\n\tMessage,\n\tModel,\n\tProvider,\n\tThinkingLevel,\n\tTSchema,\n\tUsage,\n\tUserContent,\n} from \"@di-code/ai\";\nimport { createSkillCatalog, resolveSkillInvocation, type SkillCatalog } from \"@di-code/skills\";\nimport type { SkillResource } from \"./resources/types.ts\";\nimport type { SessionManager } from \"./session/session-manager.ts\";\nimport type { SessionDiagnostic, SessionEntry, SessionTreeNode } from \"./session/types.ts\";\n\nexport interface AgentSessionCompactionOptions {\n\treadonly enabled?: boolean;\n\treadonly keepRecentTokens?: number;\n\t/** Optional registry-owned message transform applied before compaction cut selection. */\n\treadonly prepareMessages?: (\n\t\tmessages: readonly Message[],\n\t\tsignal?: AbortSignal,\n\t) => readonly Message[] | Promise<readonly Message[]>;\n}\n\nexport type AgentSessionTool = AgentTool<TSchema, AgentToolResult>;\n\nexport interface SessionUsage {\n\treadonly requestCount: number;\n\treadonly inputTokens: number;\n\treadonly outputTokens: number;\n\treadonly cacheReadTokens: number;\n\treadonly cacheWriteTokens: number;\n\treadonly totalTokens: number;\n\treadonly cost: Usage[\"cost\"];\n\treadonly estimatedContextTokens: number;\n\treadonly contextWindow: number;\n\treadonly reserveTokens: number;\n\treadonly triggerTokens: number;\n}\n\nexport interface AgentSessionOptions {\n\treadonly allowedRoot: string;\n\treadonly provider: Provider;\n\treadonly model: Model;\n\t/** Immutable tool snapshot selected by the owning SessionFactory. */\n\treadonly tools: readonly AgentSessionTool[];\n\t/** Valid initial override for the selected model's thinking level. */\n\treadonly thinkingLevel?: ThinkingLevel;\n\treadonly systemPrompt?: string;\n\treadonly skills?: readonly SkillResource[];\n\treadonly now?: () => number;\n\treadonly sessionManager?: SessionManager;\n\treadonly compaction?: AgentSessionCompactionOptions;\n\t/** Called once when the owning product host releases this session scope. */\n\treadonly onDispose?: () => void | Promise<void>;\n}\n\nexport type AgentSessionEvent =\n\t| import(\"@di-code/agent\").AgentEvent\n\t| { type: \"compaction_start\"; reason: \"threshold\" | \"manual\" }\n\t| { type: \"compaction_end\"; reason: \"threshold\" | \"manual\"; success: boolean; errorMessage?: string }\n\t| { type: \"queue_update\"; steering: readonly string[] }\n\t| { type: \"usage_update\"; usage: SessionUsage }\n\t| {\n\t\t\ttype: \"tree_navigated\";\n\t\t\toldLeafId: string;\n\t\t\tnewLeafId: string;\n\t\t\tselectedEntryId: string;\n\t\t\trestoredEditorText: boolean;\n\t };\n\nexport interface TreeNavigationResult {\n\treadonly editorText?: string;\n\treadonly selectedEntryId: string;\n\treadonly leafId: string;\n\treadonly imagesOmitted: boolean;\n}\n\nexport type AgentSessionListener = (event: AgentSessionEvent) => void | Promise<void>;\n\nfunction defaultThinkingLevel(model: Model): ThinkingLevel | undefined {\n\tconst efforts = model.reasoningEfforts;\n\tif (!efforts || efforts.length === 0) return undefined;\n\treturn (\n\t\tmodel.defaultReasoningEffort ??\n\t\t(efforts.includes(\"medium\") ? \"medium\" : efforts.includes(\"high\") ? \"high\" : efforts[0])\n\t);\n}\n\nfunction textFromUserMessage(message: Extract<Message, { role: \"user\" }>): string {\n\treturn message.content\n\t\t.filter((content): content is Extract<UserContent, { type: \"text\" }> => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\");\n}\n\nexport class AgentSession {\n\tprivate readonly agent: Agent;\n\tprivate readonly allowedRootValue: string;\n\tprivate readonly sessionManager?: SessionManager;\n\tprivate provider: Provider;\n\tprivate readonly skills: readonly SkillResource[];\n\tprivate readonly skillCatalog: SkillCatalog;\n\tprivate model: Model;\n\tprivate thinkingLevelValue?: ThinkingLevel;\n\tprivate readonly sessionIdValue: string;\n\tprivate readonly now: () => number;\n\tprivate compactionEnabledValue: boolean;\n\tprivate readonly compactionTransform?: AgentSessionCompactionOptions[\"prepareMessages\"];\n\tprivate contextBudget: ContextBudget;\n\tprivate keepRecentTokens: number;\n\tprivate usageTotals: Omit<\n\t\tSessionUsage,\n\t\t\"estimatedContextTokens\" | \"contextWindow\" | \"reserveTokens\" | \"triggerTokens\"\n\t>;\n\tprivate persistenceError?: unknown;\n\tprivate promptActive = false;\n\tprivate readonly steeringMessages: Array<{ displayText: string; deliveredText: string }> = [];\n\tprivate readonly sessionListeners = new Set<AgentSessionListener>();\n\tprivate readonly agentUnsubscribers: Array<() => void> = [];\n\tprivate readonly onDispose?: AgentSessionOptions[\"onDispose\"];\n\tprivate disposed = false;\n\n\tconstructor(options: AgentSessionOptions) {\n\t\tthis.allowedRootValue = options.allowedRoot;\n\t\tthis.onDispose = options.onDispose;\n\t\tthis.sessionManager = options.sessionManager;\n\t\tthis.provider = options.provider;\n\t\tthis.skills = structuredClone(\n\t\t\t[...(options.skills ?? [])].map((skill) => ({\n\t\t\t\t...skill,\n\t\t\t\tsource:\n\t\t\t\t\tskill.source ?? (skill.scope === \"explicit\" ? \"explicit\" : skill.scope === \"project\" ? \"project\" : \"user\"),\n\t\t\t\tuserInvocable: skill.userInvocable ?? true,\n\t\t\t})),\n\t\t);\n\t\tthis.skillCatalog = createSkillCatalog(\n\t\t\tthis.skills.map((skill) => ({\n\t\t\t\tskill: {\n\t\t\t\t\t...skill,\n\t\t\t\t\tsource:\n\t\t\t\t\t\tskill.source ?? (skill.scope === \"explicit\" ? \"explicit\" : skill.scope === \"project\" ? \"project\" : \"user\"),\n\t\t\t\t\tuserInvocable: skill.userInvocable ?? true,\n\t\t\t\t},\n\t\t\t\tdiagnostics: [],\n\t\t\t})),\n\t\t);\n\t\tthis.model = options.model;\n\t\tthis.thinkingLevelValue =\n\t\t\toptions.thinkingLevel !== undefined && this.model.reasoningEfforts?.includes(options.thinkingLevel)\n\t\t\t\t? options.thinkingLevel\n\t\t\t\t: defaultThinkingLevel(this.model);\n\t\tthis.sessionIdValue = options.sessionManager?.header.id ?? randomUUID();\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.contextBudget = resolveContextBudget(options.model);\n\t\tif (options.compaction?.enabled !== undefined && typeof options.compaction.enabled !== \"boolean\") {\n\t\t\tthrow new TypeError(\"compaction.enabled must be a boolean\");\n\t\t}\n\t\tthis.compactionEnabledValue = options.sessionManager !== undefined && options.compaction?.enabled !== false;\n\t\tthis.compactionTransform = options.compaction?.prepareMessages;\n\t\tconst defaultKeepRecentTokens = Math.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2)));\n\t\tthis.keepRecentTokens = options.compaction?.keepRecentTokens ?? defaultKeepRecentTokens;\n\t\tif (!Number.isInteger(this.keepRecentTokens) || this.keepRecentTokens <= 0) {\n\t\t\tthrow new RangeError(\"compaction.keepRecentTokens must be a positive integer\");\n\t\t}\n\t\tthis.usageTotals = {\n\t\t\trequestCount: 0,\n\t\t\tinputTokens: 0,\n\t\t\toutputTokens: 0,\n\t\t\tcacheReadTokens: 0,\n\t\t\tcacheWriteTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t};\n\t\tfor (const message of options.sessionManager?.messages ?? []) {\n\t\t\tif (message.role === \"assistant\") this.addUsage(message.usage);\n\t\t}\n\t\tconst initialContext = options.sessionManager?.buildContext();\n\t\tthis.agent = new Agent({\n\t\t\tprovider: options.provider,\n\t\t\tmodel: options.model,\n\t\t\tthinkingLevel: this.thinkingLevelValue,\n\t\t\tsystemPrompt: options.systemPrompt,\n\t\t\tsessionId: this.sessionIdValue,\n\t\t\ttools: Object.freeze([...options.tools]),\n\t\t\tnow: this.now,\n\t\t\tinitialMessages: options.sessionManager?.messages,\n\t\t\tinitialContextMessages: initialContext?.messages,\n\t\t});\n\t\tthis.agentUnsubscribers.push(\n\t\t\tthis.agent.subscribe(async (event) => {\n\t\t\t\tif (event.type !== \"message_end\" || this.sessionManager === undefined || this.persistenceError !== undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tawait this.sessionManager.appendMessage(event.message);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tthis.persistenceError = cause;\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t\tthis.agentUnsubscribers.push(\n\t\t\tthis.agent.subscribe(async (event) => {\n\t\t\t\tif (event.type !== \"message_end\" || event.message.role !== \"assistant\") return;\n\t\t\t\tthis.addUsage(event.message.usage);\n\t\t\t\tawait this.emitSession({ type: \"usage_update\", usage: this.usage });\n\t\t\t}),\n\t\t);\n\t\tthis.agentUnsubscribers.push(\n\t\t\tthis.agent.subscribe(async (event, _signal) => {\n\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"user\") {\n\t\t\t\t\tconst queued = this.steeringMessages[0];\n\t\t\t\t\tif (queued && textFromUserMessage(event.message) === queued.deliveredText) {\n\t\t\t\t\t\tthis.steeringMessages.shift();\n\t\t\t\t\t\tawait this.emitQueueUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.emitSession(event);\n\t\t\t}),\n\t\t);\n\t}\n\n\t/** Releases listeners and the isolated product scope. Repeated calls are harmless. */\n\tasync dispose(): Promise<void> {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tfor (const unsubscribe of this.agentUnsubscribers.splice(0)) unsubscribe();\n\t\tthis.sessionListeners.clear();\n\t\tawait this.onDispose?.();\n\t}\n\n\tprivate assertNotDisposed(): void {\n\t\tif (this.disposed) throw new Error(\"AgentSession has been disposed.\");\n\t}\n\n\tget transcript(): readonly Message[] {\n\t\tif (!this.sessionManager) return this.agent.transcript;\n\t\treturn this.sessionManager\n\t\t\t.getBranch()\n\t\t\t.filter((entry): entry is Extract<SessionEntry, { type: \"message\" }> => entry.type === \"message\")\n\t\t\t.map((entry) => structuredClone(entry.message));\n\t}\n\n\tget isStreaming(): boolean {\n\t\treturn this.promptActive;\n\t}\n\n\tget sessionId(): string {\n\t\treturn this.sessionIdValue;\n\t}\n\n\tget modelId(): string {\n\t\treturn this.model.id;\n\t}\n\n\tget providerId(): string {\n\t\treturn this.provider.id;\n\t}\n\n\tget thinkingLevel(): ThinkingLevel | undefined {\n\t\treturn this.thinkingLevelValue;\n\t}\n\n\tget allowedRoot(): string {\n\t\treturn this.allowedRootValue;\n\t}\n\n\tget availableModels(): readonly Model[] {\n\t\treturn structuredClone(this.provider.models);\n\t}\n\n\tget availableSkills(): readonly SkillResource[] {\n\t\treturn structuredClone(this.skills.filter((skill) => skill.userInvocable !== false));\n\t}\n\n\tsetModel(modelId: string): Model {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"Cannot change model while AgentSession is processing a prompt.\");\n\t\tconst next = this.provider.models.find((model) => model.id === modelId);\n\t\tif (!next) throw new Error(`Unknown model \"${modelId}\" for provider \"${this.provider.id}\".`);\n\t\tthis.model = structuredClone(next);\n\t\tthis.thinkingLevelValue =\n\t\t\tthis.thinkingLevelValue !== undefined && this.model.reasoningEfforts?.includes(this.thinkingLevelValue)\n\t\t\t\t? this.thinkingLevelValue\n\t\t\t\t: defaultThinkingLevel(this.model);\n\t\tthis.agent.setModel(this.model);\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\tthis.contextBudget = resolveContextBudget(this.model);\n\t\tthis.keepRecentTokens = Math.min(\n\t\t\tthis.keepRecentTokens,\n\t\t\tMath.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2))),\n\t\t);\n\t\treturn structuredClone(this.model);\n\t}\n\n\tsetRuntime(provider: Provider, model: Model): Model {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"Cannot change runtime while AgentSession is processing a prompt.\");\n\t\tconst configuredModel = provider.models.find((candidate) => candidate.id === model.id);\n\t\tif (!configuredModel || configuredModel.provider !== provider.id || model.provider !== provider.id) {\n\t\t\tthrow new Error(`Model \"${model.id}\" does not belong to provider \"${provider.id}\".`);\n\t\t}\n\t\tthis.provider = provider;\n\t\tthis.model = structuredClone(configuredModel);\n\t\tthis.thinkingLevelValue = defaultThinkingLevel(this.model);\n\t\tthis.agent.setRuntime(provider, this.model);\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\tthis.contextBudget = resolveContextBudget(this.model);\n\t\tthis.keepRecentTokens = Math.min(\n\t\t\tthis.keepRecentTokens,\n\t\t\tMath.max(1, Math.min(20_000, Math.floor(this.contextBudget.triggerTokens / 2))),\n\t\t);\n\t\treturn structuredClone(this.model);\n\t}\n\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"Cannot change thinking level while AgentSession is processing a prompt.\");\n\t\tconst efforts = this.model.reasoningEfforts;\n\t\tif (!efforts || efforts.length === 0) return undefined;\n\t\tconst currentIndex = this.thinkingLevelValue === undefined ? -1 : efforts.indexOf(this.thinkingLevelValue);\n\t\tthis.thinkingLevelValue = efforts[(currentIndex + 1) % efforts.length];\n\t\tthis.agent.setThinkingLevel(this.thinkingLevelValue);\n\t\treturn this.thinkingLevelValue;\n\t}\n\n\tsetThinkingLevel(level: ThinkingLevel): ThinkingLevel {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"Cannot change thinking level while AgentSession is processing a prompt.\");\n\t\tif (!this.model.reasoningEfforts?.includes(level)) {\n\t\t\tthrow new Error(`Thinking level \"${level}\" is not supported by model \"${this.model.id}\".`);\n\t\t}\n\t\tthis.thinkingLevelValue = level;\n\t\tthis.agent.setThinkingLevel(level);\n\t\treturn level;\n\t}\n\n\tget compactionEnabled(): boolean {\n\t\treturn this.compactionEnabledValue;\n\t}\n\n\tsetCompactionEnabled(enabled: boolean): boolean {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"Cannot change compaction while AgentSession is processing a prompt.\");\n\t\tthis.compactionEnabledValue = enabled && this.sessionManager !== undefined;\n\t\treturn this.compactionEnabledValue;\n\t}\n\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager?.filePath;\n\t}\n\n\tget sessionDiagnostics(): readonly SessionDiagnostic[] {\n\t\treturn this.sessionManager?.diagnostics ?? [];\n\t}\n\n\tget sessionTree(): readonly SessionTreeNode[] {\n\t\treturn this.sessionManager?.getTree() ?? [];\n\t}\n\n\tget sessionLeafId(): string | undefined {\n\t\treturn this.sessionManager?.leafId;\n\t}\n\n\tget usage(): SessionUsage {\n\t\treturn {\n\t\t\t...this.usageTotals,\n\t\t\tcost: { ...this.usageTotals.cost },\n\t\t\testimatedContextTokens: estimateContextTokens(this.agent.contextMessages),\n\t\t\tcontextWindow: this.contextBudget.contextWindow,\n\t\t\treserveTokens: this.contextBudget.reserveTokens,\n\t\t\ttriggerTokens: this.contextBudget.triggerTokens,\n\t\t};\n\t}\n\n\tasync prompt(text: string, signal?: AbortSignal): Promise<AssistantMessage> {\n\t\treturn this.promptWithImages(text, [], signal);\n\t}\n\n\t/** Queues an instruction for the next provider request while this Session is running. */\n\tasync steer(text: string, signal?: AbortSignal): Promise<void> {\n\t\tawait this.steerWithImages(text, [], signal);\n\t}\n\n\t/** Queues provider-neutral text and image content for the active Agent run. */\n\tasync steerWithImages(text: string, images: readonly ImageContent[], signal?: AbortSignal): Promise<void> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.persistenceError !== undefined) throw this.persistenceError;\n\t\tif (!this.promptActive) throw new Error(\"AgentSession is not processing a prompt.\");\n\t\tif (images.length > 0 && !this.model.input.includes(\"image\")) {\n\t\t\tthrow new Error(`Model \"${this.model.id}\" does not support image input.`);\n\t\t}\n\t\tconst prompt = await resolveSkillInvocation(text, this.skillCatalog, signal);\n\t\tconst content: UserContent[] = [{ type: \"text\", text: prompt }, ...structuredClone([...images])];\n\t\tthis.agent.steerWithContent(content);\n\t\tthis.steeringMessages.push({ displayText: text, deliveredText: prompt });\n\t\tawait this.emitQueueUpdate();\n\t}\n\n\t/** Sends one text prompt with explicitly supplied image attachments. */\n\tasync promptWithImages(\n\t\ttext: string,\n\t\timages: readonly ImageContent[],\n\t\tsignal?: AbortSignal,\n\t): Promise<AssistantMessage> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.persistenceError !== undefined) {\n\t\t\tthrow this.persistenceError;\n\t\t}\n\t\tif (this.promptActive) {\n\t\t\tthrow new Error(\"AgentSession is already processing a prompt.\");\n\t\t}\n\n\t\tthis.promptActive = true;\n\t\ttry {\n\t\t\tif (images.length > 0 && !this.model.input.includes(\"image\")) {\n\t\t\t\tthrow new Error(`Model \"${this.model.id}\" does not support image input.`);\n\t\t\t}\n\t\t\tconst prompt = await resolveSkillInvocation(text, this.skillCatalog, signal);\n\t\t\tconst content: UserContent[] = [{ type: \"text\", text: prompt }, ...structuredClone([...images])];\n\t\t\tawait this.compactIfNeeded(content, signal);\n\t\t\treturn await this.agent.promptWithContent(content, signal);\n\t\t} finally {\n\t\t\tthis.promptActive = false;\n\t\t}\n\t}\n\n\tasync compact(signal?: AbortSignal): Promise<void> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive) throw new Error(\"AgentSession is already processing a prompt.\");\n\t\tif (!this.sessionManager) throw new Error(\"Cannot compact without a persisted session.\");\n\t\tthis.promptActive = true;\n\t\ttry {\n\t\t\tawait this.compactNow(signal, \"manual\");\n\t\t} finally {\n\t\t\tthis.promptActive = false;\n\t\t}\n\t}\n\n\t/** Changes the active persisted branch and replaces the next-request model context. */\n\tasync navigateTree(entryId: string): Promise<TreeNavigationResult> {\n\t\tthis.assertNotDisposed();\n\t\tif (this.promptActive)\n\t\t\tthrow new Error(\"Cannot navigate the session tree while AgentSession is processing a prompt.\");\n\t\tif (!this.sessionManager) throw new Error(\"Cannot navigate an in-memory session.\");\n\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\tif (!entry) throw new Error(`Unknown session tree entry \"${entryId}\".`);\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\" && entry.message.stopReason === \"tool_use\") {\n\t\t\tthrow new Error(\"Select the final tool result for an assistant message with tool calls.\");\n\t\t}\n\n\t\tconst oldLeafId = this.sessionManager.leafId;\n\t\tlet editorText: string | undefined;\n\t\tlet imagesOmitted = false;\n\t\tif (entry.type === \"message\" && entry.message.role === \"user\") {\n\t\t\teditorText = textFromUserMessage(entry.message);\n\t\t\timagesOmitted = entry.message.content.some((content) => content.type === \"image\");\n\t\t\tthis.sessionManager.setLeaf(entry.parentId);\n\t\t} else {\n\t\t\tthis.sessionManager.setLeaf(entry.id);\n\t\t}\n\n\t\ttry {\n\t\t\tthis.agent.replaceContext(this.sessionManager.buildContext().messages);\n\t\t} catch (cause) {\n\t\t\tthis.sessionManager.setLeaf(oldLeafId);\n\t\t\tthrow cause;\n\t\t}\n\t\tawait this.emitSession({\n\t\t\ttype: \"tree_navigated\",\n\t\t\toldLeafId,\n\t\t\tnewLeafId: this.sessionManager.leafId,\n\t\t\tselectedEntryId: entry.id,\n\t\t\trestoredEditorText: editorText !== undefined,\n\t\t});\n\t\treturn { editorText, selectedEntryId: entry.id, leafId: this.sessionManager.leafId, imagesOmitted };\n\t}\n\n\tsubscribe(listener: AgentListener): () => void {\n\t\treturn this.agent.subscribe(listener);\n\t}\n\n\tsubscribeSession(listener: AgentSessionListener): () => void {\n\t\tthis.sessionListeners.add(listener);\n\t\treturn () => this.sessionListeners.delete(listener);\n\t}\n\n\tprivate async emitSession(event: AgentSessionEvent): Promise<void> {\n\t\tfor (const listener of this.sessionListeners) await listener(structuredClone(event));\n\t}\n\n\tprivate async emitQueueUpdate(): Promise<void> {\n\t\tawait this.emitSession({\n\t\t\ttype: \"queue_update\",\n\t\t\tsteering: this.steeringMessages.map((message) => message.displayText),\n\t\t});\n\t}\n\n\tprivate addUsage(usage: Usage): void {\n\t\tthis.usageTotals = {\n\t\t\trequestCount: this.usageTotals.requestCount + 1,\n\t\t\tinputTokens: this.usageTotals.inputTokens + usage.input,\n\t\t\toutputTokens: this.usageTotals.outputTokens + usage.output,\n\t\t\tcacheReadTokens: this.usageTotals.cacheReadTokens + usage.cacheRead,\n\t\t\tcacheWriteTokens: this.usageTotals.cacheWriteTokens + usage.cacheWrite,\n\t\t\ttotalTokens: this.usageTotals.totalTokens + usage.totalTokens,\n\t\t\tcost: {\n\t\t\t\tinput: this.usageTotals.cost.input + usage.cost.input,\n\t\t\t\toutput: this.usageTotals.cost.output + usage.cost.output,\n\t\t\t\tcacheRead: this.usageTotals.cost.cacheRead + usage.cost.cacheRead,\n\t\t\t\tcacheWrite: this.usageTotals.cost.cacheWrite + usage.cost.cacheWrite,\n\t\t\t\ttotal: this.usageTotals.cost.total + usage.cost.total,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async compactIfNeeded(content: readonly UserContent[], signal?: AbortSignal): Promise<void> {\n\t\tif (!this.compactionEnabledValue || !this.sessionManager) return;\n\n\t\tconst context = this.sessionManager.buildContext();\n\t\tconst pendingUser: Message = {\n\t\t\trole: \"user\",\n\t\t\tcontent: structuredClone([...content]),\n\t\t\ttimestamp: 0,\n\t\t};\n\t\tconst estimatedTokens = estimateContextTokens([...context.messages, pendingUser]);\n\t\tif (!shouldCompact(estimatedTokens, this.contextBudget)) return;\n\n\t\tawait this.compactNow(signal, \"threshold\");\n\t}\n\n\tprivate async compactNow(signal: AbortSignal | undefined, reason: \"threshold\" | \"manual\"): Promise<void> {\n\t\tif (!this.sessionManager) throw new Error(\"Cannot compact without a persisted session.\");\n\t\tconst context = this.sessionManager.buildContext();\n\t\tawait this.emitSession({ type: \"compaction_start\", reason });\n\t\tlet messages: readonly Message[];\n\t\ttry {\n\t\t\tmessages = this.compactionTransform ? await this.compactionTransform(context.messages, signal) : context.messages;\n\t\t} catch (cause) {\n\t\t\tconst errorMessage = cause instanceof Error ? cause.message : String(cause);\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow cause;\n\t\t}\n\t\tif (messages.length !== context.messages.length) {\n\t\t\tconst error = new Error(\"Compaction message transform must preserve message count.\");\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage: error.message });\n\t\t\tthrow error;\n\t\t}\n\t\tconst preparation =\n\t\t\tprepareCompaction(messages, this.keepRecentTokens) ??\n\t\t\t(reason === \"manual\" ? this.prepareManualCompaction(messages) : undefined);\n\t\tconst firstKeptEntryId = preparation ? context.sourceEntryIds[preparation.firstKeptMessageIndex] : undefined;\n\t\tif (!preparation || typeof firstKeptEntryId !== \"string\") {\n\t\t\tconst errorMessage =\n\t\t\t\treason === \"manual\"\n\t\t\t\t\t? \"No valid compaction cut point was found for the current session.\"\n\t\t\t\t\t: \"Context limit reached but no valid compaction cut point was found.\";\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow new Error(errorMessage);\n\t\t}\n\n\t\tlet summary: string;\n\t\ttry {\n\t\t\tsummary = await generateCompactionSummary(preparation, this.provider, this.model, {\n\t\t\t\treserveTokens: this.contextBudget.reserveTokens,\n\t\t\t\tsignal,\n\t\t\t\tnow: this.now,\n\t\t\t\tonUsage: (usage) => this.addUsage(usage),\n\t\t\t});\n\t\t\tawait this.emitSession({ type: \"usage_update\", usage: this.usage });\n\t\t} catch (cause) {\n\t\t\tconst errorMessage = cause instanceof Error ? cause.message : String(cause);\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow cause;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.sessionManager.appendSummary({\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore: preparation.tokensBefore,\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tthis.persistenceError = cause;\n\t\t\tconst errorMessage = cause instanceof Error ? cause.message : String(cause);\n\t\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: false, errorMessage });\n\t\t\tthrow cause;\n\t\t}\n\n\t\tthis.agent.replaceContext(this.sessionManager.buildContext().messages);\n\t\tawait this.emitSession({ type: \"compaction_end\", reason, success: true });\n\t}\n\n\t/** A manual request may retain only the newest complete user turn when the configured suffix is larger than history. */\n\tprivate prepareManualCompaction(messages: readonly Message[]) {\n\t\tfor (let index = messages.length - 1; index > 0; index--) {\n\t\t\tif (messages[index]?.role !== \"user\") continue;\n\t\t\treturn prepareCompaction(messages, estimateContextTokens(messages.slice(index)));\n\t\t}\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -1,39 +1,2 @@
1
- import type { AgentTool } from "@di-code/agent";
2
- import { type Static, type ToolResultContent, Type } from "@di-code/ai";
3
- export declare const DEFAULT_BASH_TIMEOUT_MS = 30000;
4
- export declare const MAX_BASH_TIMEOUT_MS = 300000;
5
- export declare const DEFAULT_BASH_MAX_OUTPUT_BYTES: number;
6
- export declare const bashParameters: Type.TObject<{
7
- command: Type.TString;
8
- timeoutMs: Type.TOptional<Type.TInteger>;
9
- }>;
10
- export type BashParameters = Static<typeof bashParameters>;
11
- export interface BashRunOptions {
12
- readonly signal?: AbortSignal;
13
- readonly timeoutMs: number;
14
- readonly onStdout: (chunk: Buffer) => void;
15
- readonly onStderr: (chunk: Buffer) => void;
16
- }
17
- export interface BashExecution {
18
- readonly exitCode: number | null;
19
- readonly timedOut: boolean;
20
- readonly aborted: boolean;
21
- }
22
- export interface BashOperations {
23
- run(command: string, cwd: string, options: BashRunOptions): Promise<BashExecution>;
24
- }
25
- export interface BashToolOptions {
26
- readonly operations?: BashOperations;
27
- readonly maxOutputBytes?: number;
28
- }
29
- export type BashTool = AgentTool<typeof bashParameters, ToolResultContent[]>;
30
- export interface ShellRuntime {
31
- readonly executable: string;
32
- readonly detached: boolean;
33
- readonly description: string;
34
- args(command: string): readonly string[];
35
- }
36
- export declare function resolveShellRuntime(platform?: NodeJS.Platform): ShellRuntime;
37
- export declare function createLocalBashOperations(): BashOperations;
38
- export declare function createBashTool(allowedRoot: string, options?: BashToolOptions): BashTool;
1
+ export * from "@di-code/builtins";
39
2
  //# sourceMappingURL=bash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,iBAAiB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExE,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAC3C,eAAO,MAAM,6BAA6B,QAAY,CAAC;AAEvD,eAAO,MAAM,cAAc;;;EAGzB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC9B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,cAAc,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACzC;AAoED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,YAAY,CAkB9F;AAyFD,wBAAgB,yBAAyB,IAAI,cAAc,CAE1D;AAaD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAqC3F"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/core/tools/bash.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}