@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,275 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname } from "node:path";
4
+ import { v7 as uuidv7 } from "uuid";
5
+ import { deriveWorkspaceId, getEventDatabasePath } from "./workspace.js";
6
+ const require = createRequire(import.meta.url);
7
+ let DatabaseSyncCtor;
8
+ export class SqliteEventStore {
9
+ constructor(workspaceId, dbPath, runtimeId = "local_runtime") {
10
+ this.runtimeId = runtimeId;
11
+ this.subscribers = new Map();
12
+ this.nextSubId = 0;
13
+ this.workspace_id = workspaceId;
14
+ if (dbPath !== ":memory:") {
15
+ mkdirSync(dirname(dbPath), { recursive: true });
16
+ }
17
+ this.db = new (loadDatabaseSync())(dbPath);
18
+ this._initSchema();
19
+ }
20
+ append(partial) {
21
+ if (partial.idempotency_key) {
22
+ const existing = this._getByIdempotencyKey(partial.idempotency_key);
23
+ if (existing)
24
+ return existing;
25
+ }
26
+ const event = this._normalizeEvent(partial);
27
+ this._insert(event);
28
+ const inserted = this.get(event.event_id) ?? event;
29
+ this._notify(inserted);
30
+ return inserted;
31
+ }
32
+ appendBatch(partials) {
33
+ const events = [];
34
+ const newEvents = [];
35
+ let nextSequence = this.head_sequence + 1;
36
+ for (const partial of partials) {
37
+ if (partial.idempotency_key) {
38
+ const existing = this._getByIdempotencyKey(partial.idempotency_key);
39
+ if (existing) {
40
+ events.push(existing);
41
+ continue;
42
+ }
43
+ }
44
+ const sequence = partial.sequence ?? nextSequence;
45
+ nextSequence = Math.max(nextSequence, sequence + 1);
46
+ const event = this._normalizeEvent({ ...partial, sequence });
47
+ events.push(event);
48
+ newEvents.push(event);
49
+ }
50
+ this.db.exec("begin");
51
+ try {
52
+ for (const event of newEvents) {
53
+ this._insert(event);
54
+ }
55
+ this.db.exec("commit");
56
+ }
57
+ catch (error) {
58
+ this.db.exec("rollback");
59
+ throw error;
60
+ }
61
+ for (const event of newEvents) {
62
+ this._notify(event);
63
+ }
64
+ return events.map((event) => this.get(event.event_id) ?? event);
65
+ }
66
+ query(filter) {
67
+ const clauses = ["workspace_id = ?"];
68
+ const params = [this.workspace_id];
69
+ if (filter.after_sequence !== undefined) {
70
+ clauses.push("sequence > ?");
71
+ params.push(filter.after_sequence);
72
+ }
73
+ if (filter.before_sequence !== undefined) {
74
+ clauses.push("sequence < ?");
75
+ params.push(filter.before_sequence);
76
+ }
77
+ if (filter.after) {
78
+ const after = this.get(filter.after);
79
+ if (after) {
80
+ clauses.push("sequence > ?");
81
+ params.push(after.sequence);
82
+ }
83
+ }
84
+ if (filter.before) {
85
+ const before = this.get(filter.before);
86
+ if (before) {
87
+ clauses.push("sequence < ?");
88
+ params.push(before.sequence);
89
+ }
90
+ }
91
+ if (filter.types?.length) {
92
+ clauses.push(`type in (${filter.types.map(() => "?").join(", ")})`);
93
+ params.push(...filter.types);
94
+ }
95
+ if (filter.actor_ids?.length) {
96
+ clauses.push(`actor_id in (${filter.actor_ids.map(() => "?").join(", ")})`);
97
+ params.push(...filter.actor_ids);
98
+ }
99
+ if (filter.thread_id) {
100
+ clauses.push("thread_id = ?");
101
+ params.push(filter.thread_id);
102
+ }
103
+ if (filter.caused_by) {
104
+ clauses.push(`event_id in (
105
+ with recursive descendants(event_id) as (
106
+ select event_id from events where workspace_id = ? and caused_by = ?
107
+ union all
108
+ select e.event_id from events e join descendants d on e.caused_by = d.event_id
109
+ where e.workspace_id = ?
110
+ )
111
+ select event_id from descendants
112
+ )`);
113
+ params.push(this.workspace_id, filter.caused_by, this.workspace_id);
114
+ }
115
+ let sql = `select * from events where ${clauses.join(" and ")} order by sequence ${filter.reverse ? "desc" : "asc"}`;
116
+ if (filter.limit && filter.limit > 0) {
117
+ sql += " limit ?";
118
+ params.push(filter.limit);
119
+ }
120
+ return this.db.prepare(sql).all(...params).map((row) => rowToEvent(row));
121
+ }
122
+ get(event_id) {
123
+ const row = this.db
124
+ .prepare("select * from events where workspace_id = ? and event_id = ?")
125
+ .get(this.workspace_id, event_id);
126
+ return row ? rowToEvent(row) : undefined;
127
+ }
128
+ latest(count) {
129
+ return this.query({ limit: count, reverse: true }).reverse();
130
+ }
131
+ getCausalChain(event_id) {
132
+ const chain = [];
133
+ let currentId = event_id;
134
+ while (currentId) {
135
+ const event = this.get(currentId);
136
+ if (!event)
137
+ break;
138
+ chain.unshift(event);
139
+ currentId = event.caused_by;
140
+ }
141
+ return chain;
142
+ }
143
+ subscribe(handler, options) {
144
+ const subId = this.nextSubId++;
145
+ this.subscribers.set(subId, { handler, options });
146
+ return () => this.subscribers.delete(subId);
147
+ }
148
+ get size() {
149
+ const row = this.db
150
+ .prepare("select count(*) as count from events where workspace_id = ?")
151
+ .get(this.workspace_id);
152
+ return row.count;
153
+ }
154
+ get head() {
155
+ const row = this.db
156
+ .prepare("select event_id from events where workspace_id = ? order by sequence desc limit 1")
157
+ .get(this.workspace_id);
158
+ return row?.event_id;
159
+ }
160
+ get head_sequence() {
161
+ const row = this.db
162
+ .prepare("select coalesce(max(sequence), 0) as sequence from events where workspace_id = ?")
163
+ .get(this.workspace_id);
164
+ return row.sequence;
165
+ }
166
+ close() {
167
+ this.db.close();
168
+ }
169
+ _initSchema() {
170
+ this.db.exec(`
171
+ create table if not exists events (
172
+ sequence integer not null,
173
+ event_id text not null unique,
174
+ workspace_id text not null,
175
+ runtime_id text not null,
176
+ actor_id text not null,
177
+ timestamp integer not null,
178
+ type text not null,
179
+ payload_json text not null,
180
+ caused_by text,
181
+ correlation_id text,
182
+ thread_id text,
183
+ schema_version integer not null default 1,
184
+ idempotency_key text
185
+ );
186
+ create index if not exists idx_events_workspace_sequence on events(workspace_id, sequence);
187
+ create unique index if not exists uniq_events_workspace_sequence on events(workspace_id, sequence);
188
+ create index if not exists idx_events_workspace_type_sequence on events(workspace_id, type, sequence);
189
+ create index if not exists idx_events_caused_by on events(caused_by);
190
+ create index if not exists idx_events_correlation on events(correlation_id);
191
+ create unique index if not exists idx_events_workspace_idempotency
192
+ on events(workspace_id, idempotency_key)
193
+ where idempotency_key is not null;
194
+ `);
195
+ // Migrate legacy column name session_hint → thread_id.
196
+ // session_hint was always NULL in shipped code (isolation was never active),
197
+ // so this is a safe rename with no data loss.
198
+ const columns = this.db.prepare("pragma table_info(events)").all();
199
+ if (columns.some((c) => c.name === "session_hint") && !columns.some((c) => c.name === "thread_id")) {
200
+ this.db.exec("alter table events rename column session_hint to thread_id");
201
+ }
202
+ }
203
+ _normalizeEvent(partial) {
204
+ return {
205
+ ...partial,
206
+ sequence: partial.sequence ?? this.head_sequence + 1,
207
+ event_id: partial.event_id ?? uuidv7(),
208
+ workspace_id: this.workspace_id,
209
+ runtime_id: partial.runtime_id ?? this.runtimeId,
210
+ timestamp: partial.timestamp ?? Date.now(),
211
+ schema_version: partial.schema_version ?? 1,
212
+ };
213
+ }
214
+ _insert(event) {
215
+ this.db.prepare(`
216
+ insert into events (
217
+ sequence, event_id, workspace_id, runtime_id, actor_id, timestamp, type,
218
+ payload_json, caused_by, correlation_id, thread_id, schema_version, idempotency_key
219
+ ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
220
+ `).run(event.sequence, event.event_id, event.workspace_id, event.runtime_id, event.actor_id, event.timestamp, event.type, JSON.stringify(event.payload), event.caused_by ?? null, event.correlation_id ?? null, event.thread_id ?? null, event.schema_version, event.idempotency_key ?? null);
221
+ }
222
+ _getByIdempotencyKey(idempotencyKey) {
223
+ const row = this.db
224
+ .prepare("select * from events where workspace_id = ? and idempotency_key = ?")
225
+ .get(this.workspace_id, idempotencyKey);
226
+ return row ? rowToEvent(row) : undefined;
227
+ }
228
+ _notify(event) {
229
+ for (const [, sub] of this.subscribers) {
230
+ if (matchesSubscription(event, sub.options)) {
231
+ sub.handler(event);
232
+ }
233
+ }
234
+ }
235
+ }
236
+ function rowToEvent(row) {
237
+ return {
238
+ sequence: row.sequence,
239
+ event_id: row.event_id,
240
+ workspace_id: row.workspace_id,
241
+ runtime_id: row.runtime_id,
242
+ actor_id: row.actor_id,
243
+ timestamp: row.timestamp,
244
+ type: row.type,
245
+ payload: JSON.parse(row.payload_json),
246
+ caused_by: row.caused_by ?? undefined,
247
+ correlation_id: row.correlation_id ?? undefined,
248
+ thread_id: row.thread_id ?? undefined,
249
+ schema_version: row.schema_version,
250
+ idempotency_key: row.idempotency_key ?? undefined,
251
+ };
252
+ }
253
+ function matchesSubscription(event, options) {
254
+ if (!options)
255
+ return true;
256
+ if (options.after && event.event_id <= options.after)
257
+ return false;
258
+ if (options.after_sequence !== undefined && event.sequence <= options.after_sequence)
259
+ return false;
260
+ if (options.types?.length && !options.types.includes(event.type))
261
+ return false;
262
+ if (options.actor_ids?.length && !options.actor_ids.includes(event.actor_id))
263
+ return false;
264
+ return true;
265
+ }
266
+ function loadDatabaseSync() {
267
+ if (!DatabaseSyncCtor) {
268
+ DatabaseSyncCtor = require("node:sqlite").DatabaseSync;
269
+ }
270
+ return DatabaseSyncCtor;
271
+ }
272
+ export function createEventStore(cwd, agentDir, runtimeId) {
273
+ const workspaceId = deriveWorkspaceId(cwd);
274
+ return new SqliteEventStore(workspaceId, getEventDatabasePath(workspaceId, agentDir), runtimeId);
275
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * EventStore Interface
3
+ *
4
+ * The single source of truth for all events in the event-sourced architecture.
5
+ * All observable state can be derived from the event log.
6
+ */
7
+ import type { EventBase, EventType } from "./types.js";
8
+ /** EventStore query filter */
9
+ export interface EventQuery {
10
+ /** Sequence range, workspace-local and monotonic */
11
+ after_sequence?: number;
12
+ before_sequence?: number;
13
+ /** Time range (by event_id, UUIDv7 is time-ordered) */
14
+ after?: string;
15
+ before?: string;
16
+ /** Filter by event types */
17
+ types?: EventType[];
18
+ /** Filter by actor */
19
+ actor_ids?: string[];
20
+ /** Filter by causal chain (return all descendants of this event) */
21
+ caused_by?: string;
22
+ /** Filter by thread (isolation key) */
23
+ thread_id?: string;
24
+ /** Maximum number of events to return */
25
+ limit?: number;
26
+ /** Return events in reverse order */
27
+ reverse?: boolean;
28
+ }
29
+ /** EventStore subscription options */
30
+ export interface SubscribeOptions {
31
+ /** Start receiving events after this event_id (exclusive) */
32
+ after?: string;
33
+ /** Start receiving events after this sequence (exclusive) */
34
+ after_sequence?: number;
35
+ /** Filter by event types */
36
+ types?: EventType[];
37
+ /** Filter by actor */
38
+ actor_ids?: string[];
39
+ }
40
+ /**
41
+ * EventStore - the single source of truth for all events.
42
+ *
43
+ * Responsibilities:
44
+ * - Append-only event storage
45
+ * - Query by various filters
46
+ * - Real-time subscription to new events
47
+ * - Causal chain traversal
48
+ */
49
+ export interface EventStore {
50
+ /** Workspace identifier */
51
+ readonly workspace_id: string;
52
+ /**
53
+ * Append a new event.
54
+ * Returns the complete event with generated event_id and timestamp.
55
+ */
56
+ append(event: EventAppendInput): EventBase;
57
+ /**
58
+ * Batch append multiple events.
59
+ * Returns the complete events with generated IDs and timestamps.
60
+ */
61
+ appendBatch(events: EventAppendInput[]): EventBase[];
62
+ /**
63
+ * Query events by filter.
64
+ */
65
+ query(filter: EventQuery): EventBase[];
66
+ /**
67
+ * Get a single event by ID.
68
+ */
69
+ get(event_id: string): EventBase | undefined;
70
+ /**
71
+ * Get the latest N events.
72
+ */
73
+ latest(count: number): EventBase[];
74
+ /**
75
+ * Get the causal chain from this event to root.
76
+ * Returns events in order from root to this event.
77
+ */
78
+ getCausalChain(event_id: string): EventBase[];
79
+ /**
80
+ * Subscribe to real-time events.
81
+ * Returns an unsubscribe function.
82
+ */
83
+ subscribe(handler: (event: EventBase) => void, options?: SubscribeOptions): () => void;
84
+ /** Current total event count */
85
+ readonly size: number;
86
+ /** Latest event_id, or undefined if empty */
87
+ readonly head: string | undefined;
88
+ /** Latest workspace-local sequence, or 0 if empty */
89
+ readonly head_sequence: number;
90
+ }
91
+ export type EventAppendInput = Omit<EventBase, "event_id" | "timestamp" | "workspace_id" | "sequence" | "runtime_id" | "schema_version"> & Partial<Pick<EventBase, "event_id" | "timestamp" | "sequence" | "runtime_id" | "schema_version">>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * EventStore Interface
3
+ *
4
+ * The single source of truth for all events in the event-sourced architecture.
5
+ * All observable state can be derived from the event log.
6
+ */
7
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * ThreadScopedStore
3
+ *
4
+ * Wraps an EventStore to automatically tag every appended event with a
5
+ * `thread_id`. This is the isolation mechanism for single-workspace
6
+ * multi-thread: all threads share one SQLite event log, but each thread's
7
+ * events are tagged, and SessionProjection.buildContext() filters by it.
8
+ *
9
+ * Read operations (query, get, subscribe, etc.) delegate to the inner store
10
+ * unchanged — callers add `thread_id` to their own queries when needed.
11
+ */
12
+ import type { EventBase } from "./types.js";
13
+ import type { EventAppendInput, EventQuery, EventStore, SubscribeOptions } from "./store.js";
14
+ export declare class ThreadScopedStore implements EventStore {
15
+ private readonly inner;
16
+ private readonly threadId;
17
+ constructor(inner: EventStore, threadId: string);
18
+ get workspace_id(): string;
19
+ append(event: EventAppendInput): EventBase;
20
+ appendBatch(events: EventAppendInput[]): EventBase[];
21
+ query(filter: EventQuery): EventBase[];
22
+ get(event_id: string): EventBase | undefined;
23
+ latest(count: number): EventBase[];
24
+ getCausalChain(event_id: string): EventBase[];
25
+ subscribe(handler: (event: EventBase) => void, options?: SubscribeOptions): () => void;
26
+ get size(): number;
27
+ get head(): string | undefined;
28
+ get head_sequence(): number;
29
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ThreadScopedStore
3
+ *
4
+ * Wraps an EventStore to automatically tag every appended event with a
5
+ * `thread_id`. This is the isolation mechanism for single-workspace
6
+ * multi-thread: all threads share one SQLite event log, but each thread's
7
+ * events are tagged, and SessionProjection.buildContext() filters by it.
8
+ *
9
+ * Read operations (query, get, subscribe, etc.) delegate to the inner store
10
+ * unchanged — callers add `thread_id` to their own queries when needed.
11
+ */
12
+ export class ThreadScopedStore {
13
+ constructor(inner, threadId) {
14
+ this.inner = inner;
15
+ this.threadId = threadId;
16
+ }
17
+ get workspace_id() {
18
+ return this.inner.workspace_id;
19
+ }
20
+ append(event) {
21
+ return this.inner.append({ ...event, thread_id: this.threadId });
22
+ }
23
+ appendBatch(events) {
24
+ return this.inner.appendBatch(events.map((e) => ({ ...e, thread_id: this.threadId })));
25
+ }
26
+ query(filter) {
27
+ return this.inner.query(filter);
28
+ }
29
+ get(event_id) {
30
+ return this.inner.get(event_id);
31
+ }
32
+ latest(count) {
33
+ return this.inner.latest(count);
34
+ }
35
+ getCausalChain(event_id) {
36
+ return this.inner.getCausalChain(event_id);
37
+ }
38
+ subscribe(handler, options) {
39
+ return this.inner.subscribe(handler, options);
40
+ }
41
+ get size() {
42
+ return this.inner.size;
43
+ }
44
+ get head() {
45
+ return this.inner.head;
46
+ }
47
+ get head_sequence() {
48
+ return this.inner.head_sequence;
49
+ }
50
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Event-Sourced Runtime Types
3
+ *
4
+ * This module defines the core types for the event-sourced architecture.
5
+ * All events are immutable, append-only, causally linked, and timestamped.
6
+ */
7
+ /** All event base interface - immutable, append-only, causally linked */
8
+ export interface EventBase {
9
+ /** Workspace-local monotonic sequence number */
10
+ sequence: number;
11
+ /** Global unique event ID (UUIDv7, time-ordered) */
12
+ event_id: string;
13
+ /** Workspace identifier (one cwd = one workspace) */
14
+ workspace_id: string;
15
+ /** Runtime instance that produced this event */
16
+ runtime_id: string;
17
+ /** Actor that produced this event */
18
+ actor_id: ActorId;
19
+ /** Unix ms timestamp */
20
+ timestamp: number;
21
+ /** Event type */
22
+ type: EventType;
23
+ /** Event payload (structure determined by type) */
24
+ payload: unknown;
25
+ /** Causal chain: event_id that triggered this event */
26
+ caused_by?: string;
27
+ /** Trace identifier for a user turn, scheduled tick, webhook, or goal run */
28
+ correlation_id?: string;
29
+ /** Thread this event belongs to (isolation key; one conversation = one thread_id). Events of a thread are visible only to that thread's sessions. */
30
+ thread_id?: string;
31
+ /** Event payload schema version */
32
+ schema_version: number;
33
+ /** Optional retry-safe deduplication key */
34
+ idempotency_key?: string;
35
+ }
36
+ /** Actor identifier */
37
+ export type ActorId = "user" | "coder_agent" | "runtime" | "compactor" | string;
38
+ /** All event types */
39
+ export type EventType = "USER_MESSAGE" | "USER_APPROVAL" | "USER_REJECTION" | "USER_INTERRUPT" | "USER_FOLLOWUP_QUEUED" | "USER_CONFIG_CHANGE" | "AGENT_TURN_REQUESTED" | "AGENT_TURN_COMPLETED" | "LLM_CALL_REQUESTED" | "LLM_CALL_FAILED" | "TOOL_RESULTS_AGGREGATED" | "RETRY_SCHEDULED" | "RETRY_ABORTED" | "AGENT_THINKING_START" | "AGENT_THINKING_END" | "AGENT_MESSAGE_START" | "AGENT_MESSAGE_CHUNK" | "AGENT_MESSAGE_END" | "AGENT_TURN_START" | "AGENT_TURN_END" | "AGENT_ERROR" | "INTENT_TOOL_CALL" | "INTENT_FILE_EDIT" | "INTENT_COMMAND_EXEC" | "TOOL_EXECUTION_START" | "TOOL_EXECUTION_UPDATE" | "TOOL_EXECUTION_END" | "FILE_MUTATION_APPLIED" | "BASH_EXECUTION" | "CUSTOM_MESSAGE" | "BRANCH_SUMMARY" | "COMMAND_EXECUTED" | "SESSION_CREATED" | "SESSION_BOUNDARY_INFERRED" | "SESSION_FORKED" | "SESSION_ENTRY_APPENDED" | "COMPACTION_REQUESTED" | "COMPACTION_START" | "COMPACTION_END" | "COMPACTION_ABORTED" | "RUNTIME_STARTED" | "RUNTIME_PAUSED" | "RUNTIME_RESUMED" | "CHECKPOINT_CREATED" | "CHECKPOINT_RESTORED" | "CHECKPOINT_FAILED" | "MODEL_CHANGED" | "THINKING_LEVEL_CHANGED" | "RUNTIME_ERROR" | "GOAL_CREATED" | "GOAL_CLASSIFIED" | "GOAL_PLANNED" | "GOAL_PAUSED" | "GOAL_RESUMED" | "GOAL_COMPLETED" | "GOAL_CANCELLED" | "TASK_CREATED" | "TASK_ASSIGNED" | "TASK_STARTED" | "TASK_PROGRESS" | "TASK_COMPLETED" | "TASK_FAILED" | "TASK_REWORK_REQUESTED" | "TASK_ACCEPTED" | "TASK_CANCELLED";
40
+ /** Content block for messages */
41
+ export interface ContentBlock {
42
+ type: "text" | "image" | "thinking" | "tool_call";
43
+ [key: string]: unknown;
44
+ }
45
+ /** Token usage statistics */
46
+ export interface TokenUsage {
47
+ input: number;
48
+ output: number;
49
+ cache_read: number;
50
+ cache_write: number;
51
+ total: number;
52
+ cost: number;
53
+ }
54
+ /** File mutation record */
55
+ export interface FileMutation {
56
+ path: string;
57
+ operation: "create" | "modify" | "delete";
58
+ diff?: string;
59
+ }
60
+ /** Memory node reference */
61
+ export interface MemoryNodeRef {
62
+ node_id: string;
63
+ type: string;
64
+ }
65
+ /** Image content */
66
+ export interface ImageContent {
67
+ type: "image";
68
+ data: string;
69
+ mime_type: string;
70
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Event-Sourced Runtime Types
3
+ *
4
+ * This module defines the core types for the event-sourced architecture.
5
+ * All events are immutable, append-only, causally linked, and timestamped.
6
+ */
7
+ export {};
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Workspace Identification and Storage Layout
3
+ *
4
+ * Provides deterministic workspace_id derivation from cwd and the
5
+ * standard storage path structure.
6
+ *
7
+ * Storage layout:
8
+ * <agentDir>/workspaces/<workspace_id>/
9
+ * events.sqlite # Primary event log
10
+ * meta.json
11
+ * sessions.json
12
+ */
13
+ /**
14
+ * workspace_id = deterministic hash of canonical cwd
15
+ * Same directory always yields the same workspace_id.
16
+ */
17
+ export declare function deriveWorkspaceId(cwd: string): string;
18
+ /**
19
+ * Returns the workspace directory:
20
+ * <agentDir>/workspaces/<workspace_id>/
21
+ */
22
+ export declare function getWorkspaceDir(workspaceId: string, agentDir?: string): string;
23
+ /** Returns the primary SQLite event database path for a workspace. */
24
+ export declare function getEventDatabasePath(workspaceId: string, agentDir?: string): string;
25
+ /** Returns the meta.json path for a workspace. */
26
+ export declare function getWorkspaceMetaPath(workspaceId: string, agentDir?: string): string;
27
+ /** Returns the sessions.json path for a workspace. */
28
+ export declare function getSessionIndexPath(workspaceId: string, agentDir?: string): string;
29
+ /** Workspace metadata. */
30
+ export interface WorkspaceMeta {
31
+ workspace_id: string;
32
+ cwd: string;
33
+ created_at: number;
34
+ last_accessed_at: number;
35
+ }
36
+ /** Read workspace metadata, creating it if absent. */
37
+ export declare function ensureWorkspaceMeta(workspaceId: string, cwd: string, agentDir?: string): WorkspaceMeta;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Workspace Identification and Storage Layout
3
+ *
4
+ * Provides deterministic workspace_id derivation from cwd and the
5
+ * standard storage path structure.
6
+ *
7
+ * Storage layout:
8
+ * <agentDir>/workspaces/<workspace_id>/
9
+ * events.sqlite # Primary event log
10
+ * meta.json
11
+ * sessions.json
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { join, resolve } from "node:path";
16
+ import { getAgentDir as getDefaultAgentDir } from "../../config.js";
17
+ /**
18
+ * workspace_id = deterministic hash of canonical cwd
19
+ * Same directory always yields the same workspace_id.
20
+ */
21
+ export function deriveWorkspaceId(cwd) {
22
+ const canonical = resolve(cwd).replace(/\\/g, "/");
23
+ return `ws_${createHash("sha256").update(canonical).digest("hex").slice(0, 12)}`;
24
+ }
25
+ /**
26
+ * Returns the workspace directory:
27
+ * <agentDir>/workspaces/<workspace_id>/
28
+ */
29
+ export function getWorkspaceDir(workspaceId, agentDir = getDefaultAgentDir()) {
30
+ const dir = join(agentDir, "workspaces", workspaceId);
31
+ if (!existsSync(dir)) {
32
+ mkdirSync(dir, { recursive: true });
33
+ }
34
+ return dir;
35
+ }
36
+ /** Returns the primary SQLite event database path for a workspace. */
37
+ export function getEventDatabasePath(workspaceId, agentDir) {
38
+ return join(getWorkspaceDir(workspaceId, agentDir), "events.sqlite");
39
+ }
40
+ /** Returns the meta.json path for a workspace. */
41
+ export function getWorkspaceMetaPath(workspaceId, agentDir) {
42
+ return join(getWorkspaceDir(workspaceId, agentDir), "meta.json");
43
+ }
44
+ /** Returns the sessions.json path for a workspace. */
45
+ export function getSessionIndexPath(workspaceId, agentDir) {
46
+ return join(getWorkspaceDir(workspaceId, agentDir), "sessions.json");
47
+ }
48
+ /** Read workspace metadata, creating it if absent. */
49
+ export function ensureWorkspaceMeta(workspaceId, cwd, agentDir) {
50
+ const path = getWorkspaceMetaPath(workspaceId, agentDir);
51
+ if (existsSync(path)) {
52
+ try {
53
+ const raw = readFileSync(path, "utf8");
54
+ const meta = JSON.parse(raw);
55
+ meta.last_accessed_at = Date.now();
56
+ writeFileSync(path, JSON.stringify(meta, null, 2));
57
+ return meta;
58
+ }
59
+ catch {
60
+ // fall through to create
61
+ }
62
+ }
63
+ const meta = {
64
+ workspace_id: workspaceId,
65
+ cwd,
66
+ created_at: Date.now(),
67
+ last_accessed_at: Date.now(),
68
+ };
69
+ writeFileSync(path, JSON.stringify(meta, null, 2));
70
+ return meta;
71
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared command execution utilities for extensions and custom tools.
3
+ */
4
+ /**
5
+ * Options for executing shell commands.
6
+ */
7
+ export interface ExecOptions {
8
+ /** AbortSignal to cancel the command */
9
+ signal?: AbortSignal;
10
+ /** Timeout in milliseconds */
11
+ timeout?: number;
12
+ /** Working directory */
13
+ cwd?: string;
14
+ }
15
+ /**
16
+ * Result of executing a shell command.
17
+ */
18
+ export interface ExecResult {
19
+ stdout: string;
20
+ stderr: string;
21
+ code: number;
22
+ killed: boolean;
23
+ }
24
+ /**
25
+ * Execute a shell command and return stdout/stderr/code.
26
+ * Supports timeout and abort signal.
27
+ */
28
+ export declare function execCommand(command: string, args: string[], cwd: string, options?: ExecOptions): Promise<ExecResult>;