@tomsun28/pizza 0.0.9 → 0.1.1

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 (382) hide show
  1. package/README.md +20 -143
  2. package/README.zh-CN.md +36 -0
  3. package/dist/bun/cli.d.ts +2 -0
  4. package/dist/bun/cli.js +6 -0
  5. package/dist/bun/register-bedrock.d.ts +1 -0
  6. package/dist/bun/register-bedrock.js +3 -0
  7. package/dist/cli/args.d.ts +48 -0
  8. package/dist/cli/args.js +330 -0
  9. package/dist/cli/config-selector.d.ts +13 -0
  10. package/dist/cli/config-selector.js +30 -0
  11. package/dist/cli/file-processor.d.ts +14 -0
  12. package/dist/cli/file-processor.js +82 -0
  13. package/dist/cli/initial-message.d.ts +17 -0
  14. package/dist/cli/initial-message.js +21 -0
  15. package/dist/cli/list-models.d.ts +8 -0
  16. package/dist/cli/list-models.js +96 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +68 -0
  19. package/dist/config.d.ts +79 -0
  20. package/dist/config.js +223 -0
  21. package/dist/core/agent/index.d.ts +6 -0
  22. package/dist/core/agent/index.js +6 -0
  23. package/dist/core/agent/types.d.ts +202 -0
  24. package/dist/core/agent/types.js +51 -0
  25. package/dist/core/auth-storage.d.ts +135 -0
  26. package/dist/core/auth-storage.js +417 -0
  27. package/dist/core/bash-executor.d.ts +31 -0
  28. package/dist/core/bash-executor.js +107 -0
  29. package/dist/core/compaction/branch-summarization.d.ts +87 -0
  30. package/dist/core/compaction/branch-summarization.js +242 -0
  31. package/dist/core/compaction/compaction-engine.d.ts +40 -0
  32. package/dist/core/compaction/compaction-engine.js +292 -0
  33. package/dist/core/compaction/compaction.d.ts +106 -0
  34. package/dist/core/compaction/compaction.js +295 -0
  35. package/dist/core/compaction/index.d.ts +7 -0
  36. package/dist/core/compaction/index.js +7 -0
  37. package/dist/core/compaction/utils.d.ts +37 -0
  38. package/dist/core/compaction/utils.js +152 -0
  39. package/dist/core/defaults.d.ts +2 -0
  40. package/dist/core/defaults.js +1 -0
  41. package/dist/core/diagnostics.d.ts +14 -0
  42. package/dist/core/diagnostics.js +1 -0
  43. package/dist/core/event-bus.d.ts +8 -0
  44. package/dist/core/event-bus.js +24 -0
  45. package/dist/core/event-store/events.d.ts +465 -0
  46. package/dist/core/event-store/events.js +6 -0
  47. package/dist/core/event-store/index.d.ts +10 -0
  48. package/dist/core/event-store/index.js +10 -0
  49. package/dist/core/event-store/sqlite-store.d.ts +27 -0
  50. package/dist/core/event-store/sqlite-store.js +275 -0
  51. package/dist/core/event-store/store.d.ts +91 -0
  52. package/dist/core/event-store/store.js +7 -0
  53. package/dist/core/event-store/thread-scoped-store.d.ts +29 -0
  54. package/dist/core/event-store/thread-scoped-store.js +50 -0
  55. package/dist/core/event-store/types.d.ts +70 -0
  56. package/dist/core/event-store/types.js +7 -0
  57. package/dist/core/event-store/workspace.d.ts +37 -0
  58. package/dist/core/event-store/workspace.js +71 -0
  59. package/dist/core/exec.d.ts +28 -0
  60. package/dist/core/exec.js +74 -0
  61. package/dist/core/export-html/ansi-to-html.d.ts +21 -0
  62. package/dist/core/export-html/ansi-to-html.js +248 -0
  63. package/dist/core/export-html/index.d.ts +29 -0
  64. package/dist/core/export-html/index.js +186 -0
  65. package/dist/core/export-html/template.css +1017 -0
  66. package/dist/core/export-html/template.html +55 -0
  67. package/dist/core/export-html/template.js +1742 -0
  68. package/dist/core/export-html/tool-renderer.d.ts +39 -0
  69. package/dist/core/export-html/tool-renderer.js +94 -0
  70. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  71. package/dist/core/export-html/vendor/marked.min.js +6 -0
  72. package/dist/core/extensions/index.d.ts +12 -0
  73. package/dist/core/extensions/index.js +9 -0
  74. package/dist/core/extensions/loader.d.ts +24 -0
  75. package/dist/core/extensions/loader.js +492 -0
  76. package/dist/core/extensions/runner.d.ts +167 -0
  77. package/dist/core/extensions/runner.js +898 -0
  78. package/dist/core/extensions/session-context.d.ts +67 -0
  79. package/dist/core/extensions/session-context.js +272 -0
  80. package/dist/core/extensions/types.d.ts +1147 -0
  81. package/dist/core/extensions/types.js +44 -0
  82. package/dist/core/extensions/wrapper.d.ts +19 -0
  83. package/dist/core/extensions/wrapper.js +21 -0
  84. package/dist/core/footer-data-provider.d.ts +47 -0
  85. package/dist/core/footer-data-provider.js +321 -0
  86. package/dist/core/goal/index.d.ts +3 -0
  87. package/dist/core/goal/index.js +1 -0
  88. package/dist/core/goal/scheduler.d.ts +83 -0
  89. package/dist/core/goal/scheduler.js +154 -0
  90. package/dist/core/goal/types.d.ts +182 -0
  91. package/dist/core/goal/types.js +11 -0
  92. package/dist/core/index.d.ts +8 -0
  93. package/dist/core/index.js +8 -0
  94. package/dist/core/intent/classifier.d.ts +53 -0
  95. package/dist/core/intent/classifier.js +353 -0
  96. package/dist/core/intent/index.d.ts +8 -0
  97. package/dist/core/intent/index.js +8 -0
  98. package/dist/core/intent/tool-adapter.d.ts +31 -0
  99. package/dist/core/intent/tool-adapter.js +168 -0
  100. package/dist/core/intent/types.d.ts +71 -0
  101. package/dist/core/intent/types.js +6 -0
  102. package/dist/core/keybindings.d.ts +297 -0
  103. package/dist/core/keybindings.js +250 -0
  104. package/dist/core/messages.d.ts +30 -0
  105. package/dist/core/messages.js +134 -0
  106. package/dist/core/model-registry.d.ts +131 -0
  107. package/dist/core/model-registry.js +634 -0
  108. package/dist/core/model-resolver.d.ts +109 -0
  109. package/dist/core/model-resolver.js +486 -0
  110. package/dist/core/output-guard.d.ts +5 -0
  111. package/dist/core/output-guard.js +58 -0
  112. package/dist/core/package-manager.d.ts +196 -0
  113. package/dist/core/package-manager.js +1873 -0
  114. package/dist/core/projection/boundary-inferrer.d.ts +58 -0
  115. package/dist/core/projection/boundary-inferrer.js +122 -0
  116. package/dist/core/projection/event-to-message.d.ts +35 -0
  117. package/dist/core/projection/event-to-message.js +253 -0
  118. package/dist/core/projection/goal-projection.d.ts +67 -0
  119. package/dist/core/projection/goal-projection.js +339 -0
  120. package/dist/core/projection/index.d.ts +13 -0
  121. package/dist/core/projection/index.js +13 -0
  122. package/dist/core/projection/session-manager.d.ts +100 -0
  123. package/dist/core/projection/session-manager.js +331 -0
  124. package/dist/core/projection/session-projection.d.ts +58 -0
  125. package/dist/core/projection/session-projection.js +257 -0
  126. package/dist/core/projection/task-history.d.ts +13 -0
  127. package/dist/core/projection/task-history.js +61 -0
  128. package/dist/core/projection/timeline-projection.d.ts +82 -0
  129. package/dist/core/projection/timeline-projection.js +276 -0
  130. package/dist/core/projection/types.d.ts +69 -0
  131. package/dist/core/projection/types.js +6 -0
  132. package/dist/core/prompt-templates.d.ts +51 -0
  133. package/dist/core/prompt-templates.js +249 -0
  134. package/dist/core/resolve-config-value.d.ts +22 -0
  135. package/dist/core/resolve-config-value.js +125 -0
  136. package/dist/core/resource-loader.d.ts +193 -0
  137. package/dist/core/resource-loader.js +685 -0
  138. package/dist/core/runtime/ai-client.d.ts +12 -0
  139. package/dist/core/runtime/ai-client.js +153 -0
  140. package/dist/core/runtime/checkpoint.d.ts +12 -0
  141. package/dist/core/runtime/checkpoint.js +78 -0
  142. package/dist/core/runtime/index.d.ts +12 -0
  143. package/dist/core/runtime/index.js +12 -0
  144. package/dist/core/runtime/llm-types.d.ts +99 -0
  145. package/dist/core/runtime/llm-types.js +6 -0
  146. package/dist/core/runtime/local-runtime.d.ts +23 -0
  147. package/dist/core/runtime/local-runtime.js +59 -0
  148. package/dist/core/runtime/policies.d.ts +72 -0
  149. package/dist/core/runtime/policies.js +37 -0
  150. package/dist/core/runtime/reactor.d.ts +213 -0
  151. package/dist/core/runtime/reactor.js +992 -0
  152. package/dist/core/runtime/runtime.d.ts +191 -0
  153. package/dist/core/runtime/runtime.js +449 -0
  154. package/dist/core/runtime/types.d.ts +42 -0
  155. package/dist/core/runtime/types.js +1 -0
  156. package/dist/core/sdk.d.ts +12 -0
  157. package/dist/core/sdk.js +10 -0
  158. package/dist/core/session-context-builder.d.ts +9 -0
  159. package/dist/core/session-context-builder.js +87 -0
  160. package/dist/core/session-cwd.d.ts +18 -0
  161. package/dist/core/session-cwd.js +36 -0
  162. package/dist/core/session-facade-factory.d.ts +79 -0
  163. package/dist/core/session-facade-factory.js +460 -0
  164. package/dist/core/session-facade.d.ts +57 -0
  165. package/dist/core/session-facade.js +91 -0
  166. package/dist/core/session-listing.d.ts +30 -0
  167. package/dist/core/session-listing.js +168 -0
  168. package/dist/core/session-reader.d.ts +19 -0
  169. package/dist/core/session-reader.js +101 -0
  170. package/dist/core/session-ref.d.ts +7 -0
  171. package/dist/core/session-ref.js +25 -0
  172. package/dist/core/session-services.d.ts +51 -0
  173. package/dist/core/session-services.js +90 -0
  174. package/dist/core/session-stats.d.ts +43 -0
  175. package/dist/core/session-stats.js +41 -0
  176. package/dist/core/settings-manager.d.ts +236 -0
  177. package/dist/core/settings-manager.js +706 -0
  178. package/dist/core/skill-block-parser.d.ts +12 -0
  179. package/dist/core/skill-block-parser.js +15 -0
  180. package/dist/core/skills.d.ts +59 -0
  181. package/dist/core/skills.js +408 -0
  182. package/dist/core/slash-commands.d.ts +13 -0
  183. package/dist/core/slash-commands.js +17 -0
  184. package/dist/core/source-info.d.ts +17 -0
  185. package/dist/core/source-info.js +18 -0
  186. package/dist/core/system-prompt.d.ts +27 -0
  187. package/dist/core/system-prompt.js +179 -0
  188. package/dist/core/timings.d.ts +7 -0
  189. package/dist/core/timings.js +30 -0
  190. package/dist/core/tools/bash.d.ts +95 -0
  191. package/dist/core/tools/bash.js +513 -0
  192. package/dist/core/tools/builtin-commands.d.ts +75 -0
  193. package/dist/core/tools/builtin-commands.js +503 -0
  194. package/dist/core/tools/compat-commands.d.ts +12 -0
  195. package/dist/core/tools/compat-commands.js +1280 -0
  196. package/dist/core/tools/edit-diff.d.ts +59 -0
  197. package/dist/core/tools/edit-diff.js +263 -0
  198. package/dist/core/tools/edit.d.ts +49 -0
  199. package/dist/core/tools/edit.js +340 -0
  200. package/dist/core/tools/file-mutation-queue.d.ts +5 -0
  201. package/dist/core/tools/file-mutation-queue.js +36 -0
  202. package/dist/core/tools/find.d.ts +34 -0
  203. package/dist/core/tools/find.js +459 -0
  204. package/dist/core/tools/grep.d.ts +36 -0
  205. package/dist/core/tools/grep.js +422 -0
  206. package/dist/core/tools/index.d.ts +70 -0
  207. package/dist/core/tools/index.js +129 -0
  208. package/dist/core/tools/line-anchors.d.ts +33 -0
  209. package/dist/core/tools/line-anchors.js +151 -0
  210. package/dist/core/tools/ls.d.ts +36 -0
  211. package/dist/core/tools/ls.js +268 -0
  212. package/dist/core/tools/path-utils.d.ts +7 -0
  213. package/dist/core/tools/path-utils.js +80 -0
  214. package/dist/core/tools/read.d.ts +35 -0
  215. package/dist/core/tools/read.js +244 -0
  216. package/dist/core/tools/render-utils.d.ts +20 -0
  217. package/dist/core/tools/render-utils.js +48 -0
  218. package/dist/core/tools/session-split.d.ts +9 -0
  219. package/dist/core/tools/session-split.js +77 -0
  220. package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
  221. package/dist/core/tools/tool-definition-wrapper.js +32 -0
  222. package/dist/core/tools/truncate.d.ts +69 -0
  223. package/dist/core/tools/truncate.js +204 -0
  224. package/dist/core/tools/write.d.ts +25 -0
  225. package/dist/core/tools/write.js +211 -0
  226. package/dist/core/types/session-types.d.ts +123 -0
  227. package/dist/core/types/session-types.js +8 -0
  228. package/dist/index.d.ts +27 -0
  229. package/dist/index.js +38 -0
  230. package/dist/main.d.ts +11 -2
  231. package/dist/main.js +577 -149
  232. package/dist/modes/event-mapper.d.ts +115 -0
  233. package/dist/modes/event-mapper.js +200 -0
  234. package/dist/modes/gui/server.d.ts +14 -0
  235. package/dist/modes/gui/server.js +1032 -0
  236. package/dist/modes/index.d.ts +10 -0
  237. package/dist/modes/index.js +9 -0
  238. package/dist/modes/interactive/assets/clankolas.png +0 -0
  239. package/dist/modes/interactive/components/armin.d.ts +33 -0
  240. package/dist/modes/interactive/components/armin.js +328 -0
  241. package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
  242. package/dist/modes/interactive/components/assistant-message.js +115 -0
  243. package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
  244. package/dist/modes/interactive/components/bash-execution.js +169 -0
  245. package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
  246. package/dist/modes/interactive/components/bordered-loader.js +50 -0
  247. package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
  248. package/dist/modes/interactive/components/branch-summary-message.js +41 -0
  249. package/dist/modes/interactive/components/brand-header.d.ts +33 -0
  250. package/dist/modes/interactive/components/brand-header.js +235 -0
  251. package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
  252. package/dist/modes/interactive/components/compaction-summary-message.js +42 -0
  253. package/dist/modes/interactive/components/config-selector.d.ts +70 -0
  254. package/dist/modes/interactive/components/config-selector.js +469 -0
  255. package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
  256. package/dist/modes/interactive/components/countdown-timer.js +27 -0
  257. package/dist/modes/interactive/components/custom-editor.d.ts +27 -0
  258. package/dist/modes/interactive/components/custom-editor.js +94 -0
  259. package/dist/modes/interactive/components/custom-message.d.ts +19 -0
  260. package/dist/modes/interactive/components/custom-message.js +73 -0
  261. package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
  262. package/dist/modes/interactive/components/daxnuts.js +137 -0
  263. package/dist/modes/interactive/components/diff.d.ts +11 -0
  264. package/dist/modes/interactive/components/diff.js +132 -0
  265. package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
  266. package/dist/modes/interactive/components/dynamic-border.js +19 -0
  267. package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
  268. package/dist/modes/interactive/components/earendil-announcement.js +39 -0
  269. package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
  270. package/dist/modes/interactive/components/extension-editor.js +105 -0
  271. package/dist/modes/interactive/components/extension-input.d.ts +22 -0
  272. package/dist/modes/interactive/components/extension-input.js +54 -0
  273. package/dist/modes/interactive/components/extension-selector.d.ts +23 -0
  274. package/dist/modes/interactive/components/extension-selector.js +70 -0
  275. package/dist/modes/interactive/components/footer.d.ts +55 -0
  276. package/dist/modes/interactive/components/footer.js +207 -0
  277. package/dist/modes/interactive/components/index.d.ts +31 -0
  278. package/dist/modes/interactive/components/index.js +32 -0
  279. package/dist/modes/interactive/components/keybinding-hints.d.ts +7 -0
  280. package/dist/modes/interactive/components/keybinding-hints.js +21 -0
  281. package/dist/modes/interactive/components/login-dialog.d.ts +41 -0
  282. package/dist/modes/interactive/components/login-dialog.js +138 -0
  283. package/dist/modes/interactive/components/model-selector.d.ts +32 -0
  284. package/dist/modes/interactive/components/model-selector.js +209 -0
  285. package/dist/modes/interactive/components/oauth-selector.d.ts +18 -0
  286. package/dist/modes/interactive/components/oauth-selector.js +91 -0
  287. package/dist/modes/interactive/components/settings-selector.d.ts +57 -0
  288. package/dist/modes/interactive/components/settings-selector.js +299 -0
  289. package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
  290. package/dist/modes/interactive/components/show-images-selector.js +37 -0
  291. package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
  292. package/dist/modes/interactive/components/skill-invocation-message.js +44 -0
  293. package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
  294. package/dist/modes/interactive/components/theme-selector.js +47 -0
  295. package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
  296. package/dist/modes/interactive/components/thinking-selector.js +50 -0
  297. package/dist/modes/interactive/components/timeline-view.d.ts +31 -0
  298. package/dist/modes/interactive/components/timeline-view.js +81 -0
  299. package/dist/modes/interactive/components/tool-execution.d.ts +64 -0
  300. package/dist/modes/interactive/components/tool-execution.js +305 -0
  301. package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
  302. package/dist/modes/interactive/components/tree-selector.js +1072 -0
  303. package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
  304. package/dist/modes/interactive/components/user-message-selector.js +110 -0
  305. package/dist/modes/interactive/components/user-message.d.ts +9 -0
  306. package/dist/modes/interactive/components/user-message.js +27 -0
  307. package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
  308. package/dist/modes/interactive/components/visual-truncate.js +32 -0
  309. package/dist/modes/interactive/interactive-mode.d.ts +394 -0
  310. package/dist/modes/interactive/interactive-mode.js +4116 -0
  311. package/dist/modes/interactive/theme/dark.json +85 -0
  312. package/dist/modes/interactive/theme/light.json +84 -0
  313. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  314. package/dist/modes/interactive/theme/theme.d.ts +80 -0
  315. package/dist/modes/interactive/theme/theme.js +973 -0
  316. package/dist/modes/print-mode.d.ts +27 -0
  317. package/dist/modes/print-mode.js +102 -0
  318. package/dist/modes/rpc/jsonl.d.ts +16 -0
  319. package/dist/modes/rpc/jsonl.js +48 -0
  320. package/dist/modes/rpc/rpc-client.d.ts +219 -0
  321. package/dist/modes/rpc/rpc-client.js +405 -0
  322. package/dist/modes/rpc/rpc-mode.d.ts +19 -0
  323. package/dist/modes/rpc/rpc-mode.js +381 -0
  324. package/dist/modes/rpc/rpc-types.d.ts +406 -0
  325. package/dist/modes/rpc/rpc-types.js +7 -0
  326. package/dist/package-manager-cli.d.ts +3 -0
  327. package/dist/package-manager-cli.js +233 -0
  328. package/dist/utils/changelog.d.ts +20 -0
  329. package/dist/utils/changelog.js +86 -0
  330. package/dist/utils/child-process.d.ts +10 -0
  331. package/dist/utils/child-process.js +77 -0
  332. package/dist/utils/clipboard-image.d.ts +10 -0
  333. package/dist/utils/clipboard-image.js +244 -0
  334. package/dist/utils/clipboard-native.d.ts +7 -0
  335. package/dist/utils/clipboard-native.js +13 -0
  336. package/dist/utils/clipboard.d.ts +1 -0
  337. package/dist/utils/clipboard.js +77 -0
  338. package/dist/utils/exif-orientation.d.ts +4 -0
  339. package/dist/utils/exif-orientation.js +157 -0
  340. package/dist/utils/frontmatter.d.ts +7 -0
  341. package/dist/utils/frontmatter.js +25 -0
  342. package/dist/utils/git.d.ts +25 -0
  343. package/dist/utils/git.js +162 -0
  344. package/dist/utils/image-convert.d.ts +8 -0
  345. package/dist/utils/image-convert.js +38 -0
  346. package/dist/utils/image-resize.d.ts +35 -0
  347. package/dist/utils/image-resize.js +136 -0
  348. package/dist/utils/mime.d.ts +1 -0
  349. package/dist/utils/mime.js +25 -0
  350. package/dist/utils/path-shims.d.ts +1 -0
  351. package/dist/utils/path-shims.js +90 -0
  352. package/dist/utils/paths.d.ts +6 -0
  353. package/dist/utils/paths.js +18 -0
  354. package/dist/utils/photon.d.ts +20 -0
  355. package/dist/utils/photon.js +120 -0
  356. package/dist/utils/shell.d.ts +29 -0
  357. package/dist/utils/shell.js +189 -0
  358. package/dist/utils/sleep.d.ts +4 -0
  359. package/dist/utils/sleep.js +16 -0
  360. package/dist/utils/tools-manager.d.ts +3 -0
  361. package/dist/utils/tools-manager.js +101 -0
  362. package/dist/vendor/bin/darwin-arm64/fd +0 -0
  363. package/dist/vendor/bin/darwin-arm64/rg +0 -0
  364. package/dist/vendor/bin/darwin-x64/fd +0 -0
  365. package/dist/vendor/bin/darwin-x64/rg +0 -0
  366. package/dist/vendor/bin/linux-arm64/fd +0 -0
  367. package/dist/vendor/bin/linux-arm64/rg +0 -0
  368. package/dist/vendor/bin/linux-x64/fd +0 -0
  369. package/dist/vendor/bin/linux-x64/rg +0 -0
  370. package/dist/vendor/bin/win32-arm64/fd.exe +0 -0
  371. package/dist/vendor/bin/win32-arm64/rg.exe +0 -0
  372. package/dist/vendor/bin/win32-x64/fd.exe +0 -0
  373. package/dist/vendor/bin/win32-x64/rg.exe +0 -0
  374. package/package.json +90 -26
  375. package/dist/extension/core.d.ts +0 -69
  376. package/dist/extension/core.js +0 -270
  377. package/dist/extension/core.js.map +0 -1
  378. package/dist/extension/index.d.ts +0 -25
  379. package/dist/extension/index.js +0 -303
  380. package/dist/extension/index.js.map +0 -1
  381. package/dist/main.js.map +0 -1
  382. package/themes/pizza.json +0 -87
@@ -0,0 +1,460 @@
1
+ /**
2
+ * SessionFacade factory.
3
+ *
4
+ * Builds a fully wired, pure event-sourced session: EventStore (SQLite) +
5
+ * projection SessionManager + EventSourcedRuntime, wrapped in a SessionFacade.
6
+ *
7
+ * This is the primary session creation API. Modes and extensions subscribe
8
+ * directly to EventStore TypedEvents through the facade.
9
+ */
10
+ import { join } from "node:path";
11
+ import { streamSimple } from "@earendil-works/pi-ai/compat";
12
+ import { getAgentDir, getDocsPath } from "../config.js";
13
+ import { AuthStorage } from "./auth-storage.js";
14
+ import { estimateContextTokens } from "./compaction/index.js";
15
+ import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
16
+ import { EventStoreExtensionSessionManager, ExtensionRunner, } from "./extensions/index.js";
17
+ import { SqliteEventStore } from "./event-store/sqlite-store.js";
18
+ import { deriveWorkspaceId, ensureWorkspaceMeta, getEventDatabasePath, getSessionIndexPath } from "./event-store/workspace.js";
19
+ import { createToolRegistry } from "./intent/tool-adapter.js";
20
+ import { ModelRegistry } from "./model-registry.js";
21
+ import { findInitialModel } from "./model-resolver.js";
22
+ import { SessionManager as ProjectionSessionManager } from "./projection/session-manager.js";
23
+ import { DefaultResourceLoader } from "./resource-loader.js";
24
+ import { buildLlmClientFromStreamFn, toModelConfig } from "./runtime/ai-client.js";
25
+ import { DefaultRetryPolicy } from "./runtime/policies.js";
26
+ import { EventSourcedRuntime } from "./runtime/runtime.js";
27
+ import { SessionFacade } from "./session-facade.js";
28
+ import { SettingsManager } from "./settings-manager.js";
29
+ import { createSyntheticSourceInfo } from "./source-info.js";
30
+ import { buildSystemPrompt } from "./system-prompt.js";
31
+ import { allToolNames, createToolDefinition, DEFAULT_LLM_TOOLS } from "./tools/index.js";
32
+ import { createSessionSplitToolDefinition } from "./tools/session-split.js";
33
+ import { wrapToolDefinitions } from "./tools/tool-definition-wrapper.js";
34
+ function isBuiltInToolName(name) {
35
+ return allToolNames.has(name);
36
+ }
37
+ function toRuntimeToolDefinition(definition) {
38
+ return {
39
+ name: definition.name,
40
+ description: definition.description ?? "",
41
+ input_schema: definition.parameters,
42
+ };
43
+ }
44
+ function splitUserContent(content) {
45
+ if (typeof content === "string") {
46
+ return { text: content };
47
+ }
48
+ const textParts = [];
49
+ const images = [];
50
+ for (const part of content) {
51
+ if (part.type === "text" && typeof part.text === "string") {
52
+ textParts.push(part.text);
53
+ }
54
+ else if (part.type === "image") {
55
+ images.push(part);
56
+ }
57
+ }
58
+ return {
59
+ text: textParts.join("\n"),
60
+ images: images.length > 0 ? images : undefined,
61
+ };
62
+ }
63
+ function estimateContextUsage(model, messages) {
64
+ if (!model)
65
+ return undefined;
66
+ const contextWindow = model.contextWindow ?? 0;
67
+ if (contextWindow <= 0)
68
+ return undefined;
69
+ const estimate = estimateContextTokens(messages);
70
+ return {
71
+ tokens: estimate.tokens,
72
+ contextWindow,
73
+ percent: (estimate.tokens / contextWindow) * 100,
74
+ };
75
+ }
76
+ function cloneContextEventForFork(event) {
77
+ return {
78
+ actor_id: event.actor_id,
79
+ type: event.type,
80
+ payload: event.payload,
81
+ timestamp: event.timestamp,
82
+ schema_version: event.schema_version,
83
+ };
84
+ }
85
+ function prepareForkedSession(options) {
86
+ const { store, sessionManager, agentDir, source } = options;
87
+ if (source.workspaceId === store.workspace_id) {
88
+ sessionManager.forkFromSession(source.sessionId);
89
+ return;
90
+ }
91
+ const sourceAgentDir = source.agentDir ?? agentDir;
92
+ const sourceStore = new SqliteEventStore(source.workspaceId, getEventDatabasePath(source.workspaceId, sourceAgentDir), "session_fork_source");
93
+ const sourceSessionManager = new ProjectionSessionManager(sourceStore, getSessionIndexPath(source.workspaceId, sourceAgentDir));
94
+ try {
95
+ const sourceProjection = sourceSessionManager.getSessionProjection(source.sessionId);
96
+ if (!sourceProjection) {
97
+ throw new Error(`Session not found: ${source.sessionId}`);
98
+ }
99
+ const sourceDescriptor = sourceProjection.getDescriptor();
100
+ const forkAtEventId = sourceDescriptor.event_range.end_event_id === "HEAD"
101
+ ? sourceStore.head ?? sourceDescriptor.event_range.start_event_id
102
+ : sourceDescriptor.event_range.end_event_id;
103
+ const forked = sessionManager.createSession("fork", sourceDescriptor.name, {
104
+ parentSessionId: source.sessionId,
105
+ });
106
+ store.append({
107
+ actor_id: "runtime",
108
+ type: "SESSION_FORKED",
109
+ payload: {
110
+ new_session_id: forked.session_id,
111
+ parent_session_id: source.sessionId,
112
+ fork_at_event_id: forkAtEventId,
113
+ },
114
+ thread_id: forked.thread_id,
115
+ });
116
+ store.appendBatch(sourceProjection.buildContext().events.map(cloneContextEventForFork));
117
+ }
118
+ finally {
119
+ sourceSessionManager.dispose();
120
+ sourceStore.close();
121
+ }
122
+ }
123
+ /**
124
+ * Create a pure event-sourced SessionFacade.
125
+ */
126
+ export async function createSessionFacade(options = {}) {
127
+ const cwd = options.cwd ?? process.cwd();
128
+ const agentDir = options.agentDir ?? getAgentDir();
129
+ const authPath = options.agentDir ? join(agentDir, "auth.json") : undefined;
130
+ const modelsPath = options.agentDir ? join(agentDir, "models.json") : undefined;
131
+ const authStorage = options.authStorage ?? AuthStorage.create(authPath);
132
+ const modelRegistry = options.modelRegistry ?? ModelRegistry.create(authStorage, modelsPath);
133
+ const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
134
+ let resourceLoader = options.resourceLoader;
135
+ if (!resourceLoader) {
136
+ resourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });
137
+ await resourceLoader.reload();
138
+ }
139
+ // ── Resolve model + thinking level ─────────────────────────────────────
140
+ let model = options.model;
141
+ let modelFallbackMessage;
142
+ if (!model) {
143
+ const resolved = await findInitialModel({
144
+ scopedModels: [],
145
+ isContinuing: false,
146
+ defaultProvider: settingsManager.getDefaultProvider(),
147
+ defaultModelId: settingsManager.getDefaultModel(),
148
+ defaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),
149
+ modelRegistry,
150
+ });
151
+ model = resolved.model;
152
+ if (!model) {
153
+ modelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), "providers.md")}. Then use /model to select a model.`;
154
+ }
155
+ }
156
+ let thinkingLevel = options.thinkingLevel ?? settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;
157
+ if (!model || !model.reasoning) {
158
+ thinkingLevel = "off";
159
+ }
160
+ // ── EventStore + projection SessionManager ─────────────────────────────
161
+ const workspaceId = options.workspaceId ?? deriveWorkspaceId(cwd);
162
+ if (options.storagePath !== ":memory:" && options.sessionIndexPath !== ":memory:") {
163
+ ensureWorkspaceMeta(workspaceId, cwd, options.agentDir);
164
+ }
165
+ const store = new SqliteEventStore(workspaceId, options.storagePath ?? getEventDatabasePath(workspaceId, options.agentDir));
166
+ const sessionManager = new ProjectionSessionManager(store, options.sessionIndexPath ?? getSessionIndexPath(workspaceId, options.agentDir));
167
+ if (options.forkFrom) {
168
+ prepareForkedSession({ store, sessionManager, agentDir, source: options.forkFrom });
169
+ }
170
+ else if (options.sessionId) {
171
+ sessionManager.switchTo(options.sessionId);
172
+ }
173
+ // ── Extensions + tools ─────────────────────────────────────────────────
174
+ const projection = sessionManager.getActiveSession();
175
+ const extensionSessionManager = new EventStoreExtensionSessionManager({
176
+ store,
177
+ projection,
178
+ cwd,
179
+ sessionManager,
180
+ });
181
+ const extensionsResult = resourceLoader.getExtensions();
182
+ const extensionRunner = new ExtensionRunner(extensionsResult.extensions, extensionsResult.runtime, cwd, extensionSessionManager, modelRegistry);
183
+ const requestedToolNames = options.tools ?? [...DEFAULT_LLM_TOOLS];
184
+ const allowedToolNames = options.tools ? new Set(options.tools) : undefined;
185
+ const shellCommandPrefix = settingsManager.getShellCommandPrefix();
186
+ const shellPath = settingsManager.getShellPath();
187
+ const autoResizeImages = settingsManager.getImageAutoResize();
188
+ const toolOptions = {
189
+ read: { autoResizeImages },
190
+ cli: { commandPrefix: shellCommandPrefix, shellPath, read: { autoResizeImages } },
191
+ };
192
+ let runtime;
193
+ let activeToolDefinitions = [];
194
+ let availableToolDefinitions = [];
195
+ let availableToolSources = new Map();
196
+ let systemPrompt = "";
197
+ const includeTool = (name) => !allowedToolNames || allowedToolNames.has(name);
198
+ const buildAvailableTools = () => {
199
+ const definitions = new Map();
200
+ const sources = new Map();
201
+ for (const name of requestedToolNames) {
202
+ if (!isBuiltInToolName(name) || !includeTool(name))
203
+ continue;
204
+ const definition = createToolDefinition(name, cwd, toolOptions);
205
+ definitions.set(definition.name, definition);
206
+ sources.set(definition.name, createSyntheticSourceInfo(`<builtin:${definition.name}>`, { source: "builtin" }));
207
+ }
208
+ for (const tool of extensionRunner.getAllRegisteredTools()) {
209
+ if (!includeTool(tool.definition.name))
210
+ continue;
211
+ definitions.set(tool.definition.name, tool.definition);
212
+ sources.set(tool.definition.name, tool.sourceInfo);
213
+ }
214
+ for (const definition of options.customTools ?? []) {
215
+ if (!includeTool(definition.name))
216
+ continue;
217
+ definitions.set(definition.name, definition);
218
+ sources.set(definition.name, createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }));
219
+ }
220
+ // Always include the session_split tool
221
+ const sessionSplitDef = createSessionSplitToolDefinition();
222
+ definitions.set(sessionSplitDef.name, sessionSplitDef);
223
+ sources.set(sessionSplitDef.name, createSyntheticSourceInfo(`<builtin:${sessionSplitDef.name}>`, { source: "builtin" }));
224
+ availableToolDefinitions = Array.from(definitions.values());
225
+ availableToolSources = sources;
226
+ };
227
+ const buildPromptForTools = (definitions) => {
228
+ const appendSystemPrompt = resourceLoader.getAppendSystemPrompt();
229
+ const toolSnippets = {};
230
+ const promptGuidelines = [];
231
+ for (const definition of definitions) {
232
+ const snippet = definition.promptSnippet?.trim();
233
+ if (snippet) {
234
+ toolSnippets[definition.name] = snippet;
235
+ }
236
+ for (const guideline of definition.promptGuidelines ?? []) {
237
+ const normalized = guideline.trim();
238
+ if (normalized) {
239
+ promptGuidelines.push(normalized);
240
+ }
241
+ }
242
+ }
243
+ return buildSystemPrompt({
244
+ cwd,
245
+ skills: resourceLoader.getSkills().skills,
246
+ contextFiles: resourceLoader.getAgentsFiles().agentsFiles,
247
+ customPrompt: resourceLoader.getSystemPrompt(),
248
+ appendSystemPrompt: appendSystemPrompt.length > 0 ? appendSystemPrompt.join("\n\n") : undefined,
249
+ selectedTools: definitions.map((definition) => definition.name),
250
+ toolSnippets,
251
+ promptGuidelines,
252
+ });
253
+ };
254
+ const applyActiveTools = (toolNames) => {
255
+ buildAvailableTools();
256
+ const activeNames = toolNames ? new Set(toolNames) : undefined;
257
+ activeToolDefinitions = activeNames
258
+ ? availableToolDefinitions.filter((definition) => activeNames.has(definition.name))
259
+ : [...availableToolDefinitions];
260
+ systemPrompt = buildPromptForTools(activeToolDefinitions);
261
+ if (runtime) {
262
+ runtime.setTools(activeToolDefinitions.map(toRuntimeToolDefinition));
263
+ runtime.setSystemPrompt(systemPrompt);
264
+ }
265
+ };
266
+ const getToolInfos = () => availableToolDefinitions.map((definition) => ({
267
+ name: definition.name,
268
+ description: definition.description,
269
+ parameters: definition.parameters,
270
+ sourceInfo: availableToolSources.get(definition.name) ??
271
+ createSyntheticSourceInfo(`<tool:${definition.name}>`, { source: "unknown" }),
272
+ }));
273
+ const currentSessionId = () => sessionManager.getActiveSessionId() ?? projection.getDescriptor().session_id;
274
+ const currentThreadId = () => sessionManager.getActiveThreadId() ?? projection.getDescriptor().thread_id;
275
+ const appendSessionEntry = (entry) => {
276
+ store.append({
277
+ actor_id: "runtime",
278
+ type: "SESSION_ENTRY_APPENDED",
279
+ payload: {
280
+ session_id: currentSessionId(),
281
+ entry: {
282
+ id: `entry_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
283
+ parentId: store.head ?? null,
284
+ timestamp: new Date().toISOString(),
285
+ ...entry,
286
+ },
287
+ leaf_id: store.head ?? null,
288
+ },
289
+ thread_id: currentThreadId(),
290
+ });
291
+ };
292
+ applyActiveTools();
293
+ extensionRunner.bindCore({
294
+ sendMessage: (message, options) => {
295
+ store.append({
296
+ actor_id: "runtime",
297
+ type: "CUSTOM_MESSAGE",
298
+ payload: {
299
+ extension_id: "sdk",
300
+ kind: message.customType,
301
+ data: message.details ?? message.content,
302
+ display: message.display,
303
+ },
304
+ thread_id: currentThreadId(),
305
+ });
306
+ if (!runtime || (!options?.triggerTurn && !options?.deliverAs))
307
+ return;
308
+ const text = typeof message.content === "string" ? message.content : JSON.stringify(message.content);
309
+ if (options?.deliverAs === "steer") {
310
+ runtime.steer(text);
311
+ }
312
+ else if (options?.deliverAs === "followUp") {
313
+ runtime.followUp(text);
314
+ }
315
+ else if (options?.triggerTurn) {
316
+ void runtime.prompt(text).catch((err) => {
317
+ extensionRunner.emitError({
318
+ extensionPath: "<runtime>",
319
+ event: "send_message",
320
+ error: err instanceof Error ? err.message : String(err),
321
+ });
322
+ });
323
+ }
324
+ },
325
+ sendUserMessage: (content, options) => {
326
+ if (!runtime)
327
+ return;
328
+ const { text, images } = splitUserContent(content);
329
+ if (runtime.isRunning) {
330
+ if (options?.deliverAs === "steer") {
331
+ runtime.steer(text, images);
332
+ }
333
+ else {
334
+ runtime.followUp(text, images);
335
+ }
336
+ return;
337
+ }
338
+ void runtime.prompt(text, images).catch((err) => {
339
+ extensionRunner.emitError({
340
+ extensionPath: "<runtime>",
341
+ event: "send_user_message",
342
+ error: err instanceof Error ? err.message : String(err),
343
+ });
344
+ });
345
+ },
346
+ appendEntry: (customType, data) => appendSessionEntry({ type: "custom", customType, data }),
347
+ setSessionName: (name) => {
348
+ sessionManager.renameSession(currentSessionId(), name);
349
+ appendSessionEntry({ type: "session_info", name });
350
+ },
351
+ getSessionName: () => extensionSessionManager.getSessionName(),
352
+ setLabel: (entryId, label) => appendSessionEntry({ type: "label", targetId: entryId, label }),
353
+ getActiveTools: () => activeToolDefinitions.map((definition) => definition.name),
354
+ getAllTools: getToolInfos,
355
+ setActiveTools: (toolNames) => applyActiveTools(toolNames),
356
+ refreshTools: () => applyActiveTools(activeToolDefinitions.map((definition) => definition.name)),
357
+ getCommands: () => extensionRunner.getRegisteredCommands().map((command) => ({
358
+ name: command.invocationName,
359
+ description: command.description,
360
+ source: "extension",
361
+ sourceInfo: command.sourceInfo,
362
+ })),
363
+ setModel: async (nextModel) => {
364
+ if (!modelRegistry.hasConfiguredAuth(nextModel))
365
+ return false;
366
+ model = nextModel;
367
+ runtime?.setModel(nextModel.provider, nextModel.id);
368
+ return true;
369
+ },
370
+ getThinkingLevel: () => thinkingLevel,
371
+ setThinkingLevel: (level) => {
372
+ thinkingLevel = level;
373
+ runtime?.setThinkingLevel(level);
374
+ },
375
+ }, {
376
+ getModel: () => model,
377
+ isIdle: () => !runtime?.isRunning,
378
+ getSignal: () => runtime?.signal,
379
+ abort: () => runtime?.abort(),
380
+ hasPendingMessages: () => false,
381
+ shutdown: () => { },
382
+ getContextUsage: () => estimateContextUsage(model, runtime?.getProjection().buildContext().messages ?? []),
383
+ compact: (options) => {
384
+ runtime?.compact({ reason: "manual" });
385
+ void options;
386
+ },
387
+ getSystemPrompt: () => runtime?.getSystemPrompt() ?? systemPrompt,
388
+ }, {
389
+ registerProvider: (name, config) => modelRegistry.registerProvider(name, config),
390
+ unregisterProvider: (name) => modelRegistry.unregisterProvider(name),
391
+ });
392
+ const tools = wrapToolDefinitions(availableToolDefinitions, () => extensionRunner.createContext());
393
+ // ── LLM client (AI stream function -> reactor LLMClient) ───────────────
394
+ const llmClient = model
395
+ ? buildLlmClientFromStreamFn(model, async (m, context, opts) => {
396
+ const auth = await modelRegistry.getApiKeyAndHeaders(m);
397
+ if (!auth.ok) {
398
+ throw new Error(auth.error);
399
+ }
400
+ return streamSimple(m, context, {
401
+ ...opts,
402
+ apiKey: auth.apiKey,
403
+ headers: auth.headers ?? opts?.headers,
404
+ });
405
+ }, {
406
+ thinkingBudgets: settingsManager.getThinkingBudgets(),
407
+ transport: settingsManager.getTransport(),
408
+ onPayload: async (payload) => {
409
+ if (!extensionRunner.hasHandlers("before_provider_request")) {
410
+ return payload;
411
+ }
412
+ return extensionRunner.emitBeforeProviderRequest(payload);
413
+ },
414
+ onResponse: async (response) => {
415
+ if (!extensionRunner.hasHandlers("after_provider_response")) {
416
+ return;
417
+ }
418
+ await extensionRunner.emit({
419
+ type: "after_provider_response",
420
+ status: response.status,
421
+ headers: response.headers,
422
+ });
423
+ },
424
+ })
425
+ : undefined;
426
+ // ── Runtime ────────────────────────────────────────────────────────────
427
+ runtime = new EventSourcedRuntime({
428
+ cwd,
429
+ agentDir,
430
+ store,
431
+ sessionManager,
432
+ threadId: currentThreadId(),
433
+ toolRegistry: createToolRegistry(tools),
434
+ llmClient: llmClient,
435
+ systemPrompt,
436
+ model: toModelConfig(model ?? { provider: "none", id: "none" }, thinkingLevel),
437
+ tools: activeToolDefinitions.map(toRuntimeToolDefinition),
438
+ // The default facade currently has no approval UI handler, so keep coding tools usable.
439
+ // Direct runtime/classifier consumers get the stricter defaults unless they opt out.
440
+ classifierConfig: {
441
+ require_approval_writes: false,
442
+ require_approval_edits: false,
443
+ require_approval_unknown: false,
444
+ },
445
+ retryAssistantErrorCompletions: true,
446
+ retryPolicy: new DefaultRetryPolicy({ capDelayMs: settingsManager.getRetrySettings().maxDelayMs }),
447
+ contextBudget: options.contextBudget ?? model?.contextWindow ?? 128000,
448
+ });
449
+ const extensionEventUnsubscribe = extensionRunner.bindEventStore(store);
450
+ await extensionRunner.emit(options.sessionStartEvent ?? { type: "session_start", reason: "startup" });
451
+ const facade = new SessionFacade({
452
+ runtime,
453
+ settingsManager,
454
+ modelRegistry,
455
+ extensionRunner,
456
+ resourceLoader,
457
+ disposers: [extensionEventUnsubscribe],
458
+ });
459
+ return { facade, runtime, model, thinkingLevel, extensionsResult, modelFallbackMessage };
460
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * SessionFacade
3
+ *
4
+ * Lightweight event-sourced session entry point for modes and extensions.
5
+ * It owns no transcript state; conversation data is read from EventStore
6
+ * projections through EventSourcedRuntime.
7
+ */
8
+ import type { Model } from "@earendil-works/pi-ai/compat";
9
+ import type { EventBase, ImageContent } from "./event-store/types.js";
10
+ import type { SubscribeOptions } from "./event-store/store.js";
11
+ import type { ExtensionRunner } from "./extensions/runner.js";
12
+ import type { ModelRegistry } from "./model-registry.js";
13
+ import type { ResourceLoader } from "./resource-loader.js";
14
+ import type { SessionProjection } from "./projection/session-projection.js";
15
+ import type { SettingsManager } from "./settings-manager.js";
16
+ import type { ModelConfig, ToolDefinition } from "./runtime/llm-types.js";
17
+ import type { RuntimeCompactOptions } from "./runtime/runtime.js";
18
+ import { EventSourcedRuntime } from "./runtime/runtime.js";
19
+ export interface SessionFacadeConfig {
20
+ runtime: EventSourcedRuntime;
21
+ settingsManager: SettingsManager;
22
+ extensionRunner?: ExtensionRunner;
23
+ modelRegistry?: ModelRegistry;
24
+ resourceLoader?: ResourceLoader;
25
+ disposers?: Array<() => void>;
26
+ }
27
+ export type SessionFacadeEventListener = (event: EventBase) => void;
28
+ export declare class SessionFacade {
29
+ readonly runtime: EventSourcedRuntime;
30
+ readonly settingsManager: SettingsManager;
31
+ readonly extensionRunner: ExtensionRunner | undefined;
32
+ readonly modelRegistry: ModelRegistry | undefined;
33
+ readonly resourceLoader: ResourceLoader | undefined;
34
+ private disposers;
35
+ private disposed;
36
+ constructor(config: SessionFacadeConfig);
37
+ subscribe(listener: SessionFacadeEventListener, options?: SubscribeOptions): () => void;
38
+ prompt(text: string, images?: ImageContent[]): Promise<void>;
39
+ steer(text: string, images?: ImageContent[]): void;
40
+ followUp(text: string, images?: ImageContent[]): void;
41
+ abort(): void;
42
+ compact(options?: RuntimeCompactOptions): void;
43
+ waitForIdle(): Promise<void>;
44
+ get isRunning(): boolean;
45
+ get signal(): AbortSignal | undefined;
46
+ getProjection(): SessionProjection;
47
+ get model(): ModelConfig;
48
+ set model(model: ModelConfig);
49
+ setModel(model: ModelConfig | Model<any>, thinkingLevel?: string): void;
50
+ get thinkingLevel(): string | undefined;
51
+ set thinkingLevel(level: string | undefined);
52
+ get tools(): ToolDefinition[];
53
+ set tools(tools: ToolDefinition[]);
54
+ get systemPrompt(): string;
55
+ set systemPrompt(prompt: string);
56
+ dispose(): void;
57
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * SessionFacade
3
+ *
4
+ * Lightweight event-sourced session entry point for modes and extensions.
5
+ * It owns no transcript state; conversation data is read from EventStore
6
+ * projections through EventSourcedRuntime.
7
+ */
8
+ export class SessionFacade {
9
+ constructor(config) {
10
+ this.disposed = false;
11
+ this.runtime = config.runtime;
12
+ this.settingsManager = config.settingsManager;
13
+ this.extensionRunner = config.extensionRunner;
14
+ this.modelRegistry = config.modelRegistry;
15
+ this.resourceLoader = config.resourceLoader;
16
+ this.disposers = config.disposers ?? [];
17
+ }
18
+ subscribe(listener, options) {
19
+ return this.runtime.subscribe(listener, options);
20
+ }
21
+ prompt(text, images) {
22
+ return this.runtime.prompt(text, images);
23
+ }
24
+ steer(text, images) {
25
+ this.runtime.steer(text, images);
26
+ }
27
+ followUp(text, images) {
28
+ this.runtime.followUp(text, images);
29
+ }
30
+ abort() {
31
+ this.runtime.abort();
32
+ }
33
+ compact(options) {
34
+ this.runtime.compact(options);
35
+ }
36
+ waitForIdle() {
37
+ return this.runtime.waitForIdle();
38
+ }
39
+ get isRunning() {
40
+ return this.runtime.isRunning;
41
+ }
42
+ get signal() {
43
+ return this.runtime.signal;
44
+ }
45
+ getProjection() {
46
+ return this.runtime.getProjection();
47
+ }
48
+ get model() {
49
+ return this.runtime.getModel();
50
+ }
51
+ set model(model) {
52
+ this.setModel(model);
53
+ }
54
+ setModel(model, thinkingLevel) {
55
+ const modelId = "model_id" in model ? model.model_id : model.id;
56
+ this.runtime.setModel(model.provider, modelId);
57
+ const nextThinkingLevel = thinkingLevel ?? ("thinking_level" in model ? model.thinking_level : undefined);
58
+ if (nextThinkingLevel !== undefined) {
59
+ this.runtime.setThinkingLevel(nextThinkingLevel);
60
+ }
61
+ }
62
+ get thinkingLevel() {
63
+ return this.runtime.getThinkingLevel();
64
+ }
65
+ set thinkingLevel(level) {
66
+ if (level !== undefined) {
67
+ this.runtime.setThinkingLevel(level);
68
+ }
69
+ }
70
+ get tools() {
71
+ return this.runtime.getTools();
72
+ }
73
+ set tools(tools) {
74
+ this.runtime.setTools(tools);
75
+ }
76
+ get systemPrompt() {
77
+ return this.runtime.getSystemPrompt();
78
+ }
79
+ set systemPrompt(prompt) {
80
+ this.runtime.setSystemPrompt(prompt);
81
+ }
82
+ dispose() {
83
+ if (this.disposed)
84
+ return;
85
+ this.disposed = true;
86
+ for (const dispose of this.disposers.splice(0)) {
87
+ dispose();
88
+ }
89
+ this.runtime.dispose();
90
+ }
91
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Session Listing
3
+ *
4
+ * Lists sessions from the new session index (sessions.json) and EventStore.
5
+ * Replaces old SessionManager.list/listAll static methods with a clean,
6
+ * event-sourced implementation.
7
+ */
8
+ export interface SessionListInfo {
9
+ path: string;
10
+ id: string;
11
+ cwd: string;
12
+ name?: string;
13
+ parentSessionPath?: string;
14
+ created: Date;
15
+ modified: Date;
16
+ messageCount: number;
17
+ firstMessage: string;
18
+ allMessagesText: string;
19
+ }
20
+ export type SessionListProgress = (loaded: number, total: number) => void;
21
+ /**
22
+ * List all sessions for a workspace (current cwd).
23
+ * Reads from sessions.json + EventStore for each session.
24
+ */
25
+ export declare function listWorkspaceSessions(cwd: string, agentDir?: string, onProgress?: SessionListProgress): Promise<SessionListInfo[]>;
26
+ /**
27
+ * List all sessions across all workspaces.
28
+ * Scans agentDir/workspaces/* for sessions.json files.
29
+ */
30
+ export declare function listAllSessions(agentDir?: string, onProgress?: SessionListProgress): Promise<SessionListInfo[]>;