@xopcai/xopc 0.0.95 → 0.0.97

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 (442) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/plugin.js +1 -1
  5. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  6. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/extensions/weixin/src/api/api.js +2 -2
  9. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  10. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  11. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  12. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  13. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  17. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  18. package/dist/gateway/static/root/assets/{agents-CKe2LMnz.js → agents-B_YUvNi6.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Mi9mMIZ1.js → apps-page-BmwG5aur.js} +1 -1
  20. package/dist/gateway/static/root/assets/{channels-settings-BrdyC101.js → channels-settings-BiwkeKPb.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-status-swr-D55Bu0nn.js → channels-status-swr-ChyN473C.js} +1 -1
  22. package/dist/gateway/static/root/assets/{cron-api-CPpx2l-E.js → cron-api-CvSifIfJ.js} +1 -1
  23. package/dist/gateway/static/root/assets/{cron-page-Bx2jB0YN.js → cron-page-BDqTDFy6.js} +1 -1
  24. package/dist/gateway/static/root/assets/{dist-D_AiG_Kg.js → dist-DxsUrjpy.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-debug-page-6ieHsxRE.js → extension-debug-page-DV_Av5Jq.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-B8nywHRO.js → extension-page-CwZwRhWw.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-DrskdEIV.js → extension-settings-page-Bb7TR1Se.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-B0aeeY0q.js → fetch-BLLOP2CM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{field-primitives--9ooY8Xl.js → field-primitives-CyqVu1QR.js} +1 -1
  30. package/dist/gateway/static/root/assets/{heartbeat-config-api-DUZ_W1w-.js → heartbeat-config-api-Cd4M1eHt.js} +1 -1
  31. package/dist/gateway/static/root/assets/{index-Dj9FuxCm.js → index-0tS9lV85.js} +74 -74
  32. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +1 -0
  33. package/dist/gateway/static/root/assets/{logs-page-CaXqhpKf.js → logs-page-BsAOSowN.js} +1 -1
  34. package/dist/gateway/static/root/assets/{note-detail-page-B91pLkEI.css → note-detail-page-D4ZIVQbk.css} +1 -1
  35. package/dist/gateway/static/root/assets/{note-detail-page-DYzym2B0.js → note-detail-page-Dlxoy6Ap.js} +54 -53
  36. package/dist/gateway/static/root/assets/{note-time-B-vSi2dR.js → note-time-B-r8yTpQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{notes-page-BkhWdGiT.js → notes-page-CHFcyqYW.js} +1 -1
  38. package/dist/gateway/static/root/assets/{sessions-page-53YFokoe.js → sessions-page-Ctu0kgt7.js} +1 -1
  39. package/dist/gateway/static/root/assets/{settings-advanced-gate-BaZmaklx.js → settings-advanced-gate-Dh0TyOOg.js} +1 -1
  40. package/dist/gateway/static/root/assets/{settings-form-section-DIJPKpTR.js → settings-form-section-DXMCEW1d.js} +1 -1
  41. package/dist/gateway/static/root/assets/{settings-page-Dvb230FF.js → settings-page-CIkZ7233.js} +1 -1
  42. package/dist/gateway/static/root/assets/{share-preview-page-CRyjTAG6.js → share-preview-page-7RV65xhJ.js} +1 -1
  43. package/dist/gateway/static/root/assets/{skills-page-C5ZJbfAe.js → skills-page-D_Az1SlU.js} +1 -1
  44. package/dist/gateway/static/root/assets/{theme-store-Cg_SuBw0.js → theme-store-e2q2yjs4.js} +1 -1
  45. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +3 -0
  46. package/dist/gateway/static/root/assets/{utils-lMYoWhqo.js → utils-OA_b1q0Q.js} +1 -1
  47. package/dist/gateway/static/root/assets/{voice-api-key-field-Dda2pcUU.js → voice-api-key-field-SJml1hAt.js} +1 -1
  48. package/dist/gateway/static/root/assets/{workflow-page.utils-KIladUrU.js → workflow-page.utils-D90VVCzC.js} +1 -1
  49. package/dist/gateway/static/root/assets/{workflows-page-BTis4Z7Y.js → workflows-page-y7Btji0J.js} +1 -1
  50. package/dist/gateway/static/root/index.html +5 -5
  51. package/dist/package.js +1 -1
  52. package/dist/src/agent/agent-manager.js +12 -8
  53. package/dist/src/agent/agent-manager.js.map +1 -1
  54. package/dist/src/agent/agent-scope.d.ts +0 -1
  55. package/dist/src/agent/agent-scope.js +2 -5
  56. package/dist/src/agent/agent-scope.js.map +1 -1
  57. package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +2 -0
  58. package/dist/src/agent/bootstrap/bootstrap-cache.js +10 -1
  59. package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
  60. package/dist/src/agent/bootstrap/bootstrap-files.d.ts +2 -1
  61. package/dist/src/agent/bootstrap/bootstrap-files.js +34 -12
  62. package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
  63. package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +1 -2
  64. package/dist/src/agent/bootstrap/load-bootstrap-files.js +6 -12
  65. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  66. package/dist/src/agent/bootstrap/types.d.ts +5 -5
  67. package/dist/src/agent/context/workspace-seed.js +6 -6
  68. package/dist/src/agent/context/workspace-seed.js.map +1 -1
  69. package/dist/src/agent/context/workspace-state.d.ts +20 -0
  70. package/dist/src/agent/context/workspace-state.js +57 -0
  71. package/dist/src/agent/context/workspace-state.js.map +1 -0
  72. package/dist/src/agent/context/workspace-templates/AGENTS.md +0 -4
  73. package/dist/src/agent/embedded/index.d.ts +2 -2
  74. package/dist/src/agent/embedded/index.js +3 -3
  75. package/dist/src/agent/embedded/run-turn.js +0 -3
  76. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  77. package/dist/src/agent/embedded/session-manager-init.d.ts +0 -17
  78. package/dist/src/agent/embedded/session-manager-init.js +1 -36
  79. package/dist/src/agent/embedded/session-manager-init.js.map +1 -1
  80. package/dist/src/agent/embedded/session-runner.d.ts +3 -12
  81. package/dist/src/agent/embedded/session-runner.js +12 -26
  82. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  83. package/dist/src/agent/embedded/session-tool-result-guard.js +2 -4
  84. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  85. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.d.ts +10 -0
  86. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js +34 -0
  87. package/dist/src/agent/embedded/sqlite-hydrating-session-manager.js.map +1 -0
  88. package/dist/src/agent/goals/goal-run-store.js +4 -4
  89. package/dist/src/agent/goals/persistent-goal-service.js +8 -15
  90. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  91. package/dist/src/agent/goals/post-turn.js +2 -2
  92. package/dist/src/agent/image/load-image-media.js +2 -2
  93. package/dist/src/agent/ipc/bus.js +1 -1
  94. package/dist/src/agent/ipc/inbox.js +2 -2
  95. package/dist/src/agent/ipc/socket.js +1 -1
  96. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  97. package/dist/src/agent/mcp/bundle-mcp-runtime.js +2 -2
  98. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  99. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  100. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  101. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  102. package/dist/src/agent/memory/dreaming/events.js +1 -1
  103. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  104. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  105. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  106. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  107. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  109. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  110. package/dist/src/agent/models/manager.js +1 -1
  111. package/dist/src/agent/prompt/memory/index.d.ts +1 -0
  112. package/dist/src/agent/prompt/memory/index.js +34 -80
  113. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  114. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  115. package/dist/src/agent/prompt/system-prompt.js +0 -1
  116. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  117. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  118. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  119. package/dist/src/agent/sandbox/path-policy.js +2 -2
  120. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  121. package/dist/src/agent/service/process-direct-one-shot.js +8 -17
  122. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.js +14 -23
  124. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  125. package/dist/src/agent/service.js +7 -11
  126. package/dist/src/agent/service.js.map +1 -1
  127. package/dist/src/agent/session/session-inspector.js +1 -1
  128. package/dist/src/agent/skills/config.js +1 -1
  129. package/dist/src/agent/skills/hub-hash.js +2 -2
  130. package/dist/src/agent/skills/hub-lock.js +1 -1
  131. package/dist/src/agent/skills/hub-pull.js +3 -3
  132. package/dist/src/agent/skills/index.js +1 -1
  133. package/dist/src/agent/skills/managed-store.js +1 -1
  134. package/dist/src/agent/skills/scanner.js +1 -1
  135. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  136. package/dist/src/agent/skills/skill-manager.js +1 -1
  137. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  138. package/dist/src/agent/tools/factory.js +1 -1
  139. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  140. package/dist/src/agent/tools/index.d.ts +0 -1
  141. package/dist/src/agent/tools/index.js +1 -2
  142. package/dist/src/agent/tools/send-media.js +1 -1
  143. package/dist/src/agent/tools/session-search-tool.d.ts +0 -1
  144. package/dist/src/agent/tools/session-search-tool.js +11 -6
  145. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  146. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  147. package/dist/src/agent/tools/tool-paths.js +1 -3
  148. package/dist/src/agent/tools/tool-paths.js.map +1 -1
  149. package/dist/src/agent/tools/workflow-tool.js +1 -1
  150. package/dist/src/agent/tools/write.js +1 -1
  151. package/dist/src/agent/workflow/catalog.js +1 -1
  152. package/dist/src/auth/credentials.js +3 -3
  153. package/dist/src/auth/profiles/store.js +1 -1
  154. package/dist/src/auth/sync-provider-auth.js +1 -1
  155. package/dist/src/browser/cache-dir-policy.js +1 -1
  156. package/dist/src/browser/cdp-local-launcher.js +2 -2
  157. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  158. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  159. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  160. package/dist/src/browser/stealth.js +1 -1
  161. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  162. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  163. package/dist/src/channels/outbound/persist-store.js +1 -1
  164. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  165. package/dist/src/channels/pairing/pairing-store.js +2 -2
  166. package/dist/src/chat-commands/agent-edit.js +3 -4
  167. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  168. package/dist/src/chat-commands/builtins/config.js +2 -2
  169. package/dist/src/chat-commands/context.js +1 -1
  170. package/dist/src/cli/commands/config.js +1 -1
  171. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  172. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  173. package/dist/src/cli/commands/doctor/checks/session-integrity.js +32 -95
  174. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  175. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  176. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  177. package/dist/src/cli/commands/extension-dev.js +1 -1
  178. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  179. package/dist/src/cli/commands/extension-pack.js +1 -1
  180. package/dist/src/cli/commands/gateway/logs.js +1 -1
  181. package/dist/src/cli/commands/image.js +1 -1
  182. package/dist/src/cli/commands/init.js +5 -7
  183. package/dist/src/cli/commands/init.js.map +1 -1
  184. package/dist/src/cli/commands/onboard.js +0 -8
  185. package/dist/src/cli/commands/onboard.js.map +1 -1
  186. package/dist/src/cli/templates.d.ts +3 -10
  187. package/dist/src/cli/templates.js +4 -32
  188. package/dist/src/cli/templates.js.map +1 -1
  189. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  190. package/dist/src/commands/agents.config.js +1 -1
  191. package/dist/src/config/agent-profile.js +1 -1
  192. package/dist/src/config/gateway-bind.js +1 -1
  193. package/dist/src/config/index.js +7 -8
  194. package/dist/src/config/index.js.map +1 -1
  195. package/dist/src/config/loader.js +2 -2
  196. package/dist/src/config/models-json.js +2 -2
  197. package/dist/src/config/paths-state.d.ts +3 -0
  198. package/dist/src/config/paths-state.js +7 -3
  199. package/dist/src/config/paths-state.js.map +1 -1
  200. package/dist/src/config/paths.d.ts +5 -36
  201. package/dist/src/config/paths.js +7 -52
  202. package/dist/src/config/paths.js.map +1 -1
  203. package/dist/src/config/profile.js +2 -2
  204. package/dist/src/config/schema.d.ts +15 -0
  205. package/dist/src/config/schema.js +11 -0
  206. package/dist/src/config/schema.js.map +1 -1
  207. package/dist/src/config/workspace-path.js +1 -1
  208. package/dist/src/cron/execution-types.d.ts +42 -0
  209. package/dist/src/cron/executor.js +2 -2
  210. package/dist/src/cron/persistence.js +1 -1
  211. package/dist/src/cron/run-log-store.d.ts +4 -8
  212. package/dist/src/cron/run-log-store.js +26 -78
  213. package/dist/src/cron/run-log-store.js.map +1 -1
  214. package/dist/src/cron/service.d.ts +3 -3
  215. package/dist/src/cron/service.js +2 -2
  216. package/dist/src/cron/service.js.map +1 -1
  217. package/dist/src/cron/types.d.ts +1 -42
  218. package/dist/src/daemon/constants.js +1 -1
  219. package/dist/src/daemon/install-plan.js +2 -2
  220. package/dist/src/daemon/launchd.js +2 -2
  221. package/dist/src/daemon/schtasks.js +2 -2
  222. package/dist/src/daemon/systemd.js +2 -2
  223. package/dist/src/extensions/bundle-mcp.js +1 -1
  224. package/dist/src/extensions/discover-extensions.js +1 -1
  225. package/dist/src/extensions/health.js +1 -1
  226. package/dist/src/extensions/loader.js +1 -1
  227. package/dist/src/extensions/lockfile.js +2 -2
  228. package/dist/src/extensions/update.js +1 -1
  229. package/dist/src/gateway/agents-admin.js +4 -4
  230. package/dist/src/gateway/agents-admin.js.map +1 -1
  231. package/dist/src/gateway/file-path-classifier.d.ts +0 -1
  232. package/dist/src/gateway/file-path-classifier.js +2 -8
  233. package/dist/src/gateway/file-path-classifier.js.map +1 -1
  234. package/dist/src/gateway/heartbeat/service.js +1 -1
  235. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  236. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  237. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  238. package/dist/src/gateway/hono/oauth.js +1 -1
  239. package/dist/src/gateway/hono/routes/agents.js +1 -1
  240. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  241. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  242. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  243. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  244. package/dist/src/gateway/hono/routes/models.js +1 -1
  245. package/dist/src/gateway/hono/routes/shares.js +1 -1
  246. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  247. package/dist/src/gateway/lock.js +3 -3
  248. package/dist/src/gateway/ports.js +1 -1
  249. package/dist/src/gateway/service/agent-runner.js +2 -2
  250. package/dist/src/gateway/service/marketplace-service.js +2 -2
  251. package/dist/src/gateway/service.js +5 -1
  252. package/dist/src/gateway/service.js.map +1 -1
  253. package/dist/src/gateway/session-reset-service.d.ts +1 -1
  254. package/dist/src/gateway/session-reset-service.js +1 -1
  255. package/dist/src/gateway/session-reset-service.js.map +1 -1
  256. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  257. package/dist/src/heartbeat/index.js +1 -1
  258. package/dist/src/infra/brew.js +1 -1
  259. package/dist/src/infra/node-sqlite.d.ts +1 -0
  260. package/dist/src/infra/node-sqlite.js +17 -0
  261. package/dist/src/infra/node-sqlite.js.map +1 -0
  262. package/dist/src/infra/package-json.js +1 -1
  263. package/dist/src/infra/package-update-steps.js +1 -1
  264. package/dist/src/infra/path-env.js +2 -2
  265. package/dist/src/infra/restart.js +2 -2
  266. package/dist/src/infra/sqlite-errors.d.ts +1 -0
  267. package/dist/src/infra/sqlite-errors.js +77 -0
  268. package/dist/src/infra/sqlite-errors.js.map +1 -0
  269. package/dist/src/infra/stable-node-path.js +1 -1
  270. package/dist/src/infra/unhandled-rejections.d.ts +1 -0
  271. package/dist/src/infra/unhandled-rejections.js +25 -0
  272. package/dist/src/infra/unhandled-rejections.js.map +1 -0
  273. package/dist/src/infra/update-check.js +1 -1
  274. package/dist/src/infra/update-global.js +1 -1
  275. package/dist/src/infra/update-lock.js +3 -3
  276. package/dist/src/infra/update-runner.js +1 -1
  277. package/dist/src/infra/update-startup.js +2 -2
  278. package/dist/src/infra/warning-filter.d.ts +7 -0
  279. package/dist/src/infra/warning-filter.js +59 -0
  280. package/dist/src/infra/warning-filter.js.map +1 -0
  281. package/dist/src/infra/write-file-atomic.js +2 -2
  282. package/dist/src/notes/store.d.ts +3 -9
  283. package/dist/src/notes/store.js +22 -196
  284. package/dist/src/notes/store.js.map +1 -1
  285. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  286. package/dist/src/providers/index.js +2 -2
  287. package/dist/src/providers/model-registry.js +1 -1
  288. package/dist/src/session/config-store.d.ts +6 -75
  289. package/dist/src/session/config-store.js +38 -144
  290. package/dist/src/session/config-store.js.map +1 -1
  291. package/dist/src/session/config-types.d.ts +15 -0
  292. package/dist/src/session/config-types.js +1 -0
  293. package/dist/src/session/index.d.ts +1 -3
  294. package/dist/src/session/index.js +3 -5
  295. package/dist/src/session/init-session-turn.d.ts +0 -6
  296. package/dist/src/session/init-session-turn.js +18 -18
  297. package/dist/src/session/init-session-turn.js.map +1 -1
  298. package/dist/src/session/lifecycle-timestamps.d.ts +5 -2
  299. package/dist/src/session/lifecycle-timestamps.js.map +1 -1
  300. package/dist/src/session/{parity/load-jsonl-entries.js → load-jsonl-entries.js} +1 -1
  301. package/dist/src/session/load-jsonl-entries.js.map +1 -0
  302. package/dist/src/session/manager.d.ts +5 -3
  303. package/dist/src/session/manager.js +1 -5
  304. package/dist/src/session/manager.js.map +1 -1
  305. package/dist/src/session/resolve-session.d.ts +3 -6
  306. package/dist/src/session/resolve-session.js +26 -31
  307. package/dist/src/session/resolve-session.js.map +1 -1
  308. package/dist/src/session/session-context-for-llm.js +5 -1
  309. package/dist/src/session/session-context-for-llm.js.map +1 -1
  310. package/dist/src/session/session-id.js +12 -0
  311. package/dist/src/session/session-id.js.map +1 -0
  312. package/dist/src/session/session-title.js +2 -2
  313. package/dist/src/session/session-workspace.d.ts +1 -1
  314. package/dist/src/session/session-workspace.js.map +1 -1
  315. package/dist/src/session/store.d.ts +14 -63
  316. package/dist/src/session/store.js +172 -847
  317. package/dist/src/session/store.js.map +1 -1
  318. package/dist/src/session/stored-rows-to-file-entries.d.ts +11 -0
  319. package/dist/src/session/stored-rows-to-file-entries.js +95 -0
  320. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -0
  321. package/dist/src/session/transcript-events.d.ts +1 -2
  322. package/dist/src/session/transcript-events.js +5 -12
  323. package/dist/src/session/transcript-events.js.map +1 -1
  324. package/dist/src/session/transcript-format.d.ts +1 -1
  325. package/dist/src/session/transcript-format.js.map +1 -1
  326. package/dist/src/session/transcript-stats.d.ts +1 -0
  327. package/dist/src/session/transcript-stats.js +10 -0
  328. package/dist/src/session/transcript-stats.js.map +1 -0
  329. package/dist/src/share/share-auto.js +2 -2
  330. package/dist/src/share/share-store.js +3 -3
  331. package/dist/src/share/share-thumbnail.js +2 -2
  332. package/dist/src/share/share-zip.js +1 -1
  333. package/dist/src/share/site-share-store.js +3 -3
  334. package/dist/src/share/site-static-serve.js +1 -1
  335. package/dist/src/storage/sqlite/config-repository.d.ts +6 -0
  336. package/dist/src/storage/sqlite/config-repository.js +56 -0
  337. package/dist/src/storage/sqlite/config-repository.js.map +1 -0
  338. package/dist/src/storage/sqlite/connection.d.ts +38 -0
  339. package/dist/src/storage/sqlite/connection.js +258 -0
  340. package/dist/src/storage/sqlite/connection.js.map +1 -0
  341. package/dist/src/storage/sqlite/cron-run-repository.d.ts +5 -0
  342. package/dist/src/storage/sqlite/cron-run-repository.js +97 -0
  343. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/fts.d.ts +2 -0
  345. package/dist/src/storage/sqlite/fts.js +11 -0
  346. package/dist/src/storage/sqlite/fts.js.map +1 -0
  347. package/dist/src/storage/sqlite/index.d.ts +12 -0
  348. package/dist/src/storage/sqlite/index.js +13 -0
  349. package/dist/src/storage/sqlite/memory-index-repository.d.ts +18 -0
  350. package/dist/src/storage/sqlite/memory-index-repository.js +132 -0
  351. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -0
  352. package/dist/src/storage/sqlite/notes-repository.d.ts +11 -0
  353. package/dist/src/storage/sqlite/notes-repository.js +191 -0
  354. package/dist/src/storage/sqlite/notes-repository.js.map +1 -0
  355. package/dist/src/storage/sqlite/paths.d.ts +1 -0
  356. package/dist/src/storage/sqlite/paths.js +7 -0
  357. package/dist/src/storage/sqlite/paths.js.map +1 -0
  358. package/dist/src/storage/sqlite/row-mappers.d.ts +82 -0
  359. package/dist/src/storage/sqlite/row-mappers.js +164 -0
  360. package/dist/src/storage/sqlite/row-mappers.js.map +1 -0
  361. package/dist/src/storage/sqlite/schema.d.ts +5 -0
  362. package/dist/src/storage/sqlite/schema.js +43 -0
  363. package/dist/src/storage/sqlite/schema.js.map +1 -0
  364. package/dist/src/storage/sqlite/schema.sql +195 -0
  365. package/dist/src/storage/sqlite/session-metadata.d.ts +8 -0
  366. package/dist/src/storage/sqlite/session-metadata.js +83 -0
  367. package/dist/src/storage/sqlite/session-metadata.js.map +1 -0
  368. package/dist/src/storage/sqlite/session-repository.d.ts +29 -0
  369. package/dist/src/storage/sqlite/session-repository.js +268 -0
  370. package/dist/src/storage/sqlite/session-repository.js.map +1 -0
  371. package/dist/src/storage/sqlite/transaction.d.ts +11 -0
  372. package/dist/src/storage/sqlite/transaction.js +115 -0
  373. package/dist/src/storage/sqlite/transaction.js.map +1 -0
  374. package/dist/src/storage/sqlite/transcript-repository.d.ts +34 -0
  375. package/dist/src/storage/sqlite/transcript-repository.js +241 -0
  376. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -0
  377. package/dist/src/tui/clipboard-image.js +3 -3
  378. package/dist/src/tui/theme-manager.js +1 -1
  379. package/dist/src/tui/tui-keybindings-file.js +1 -1
  380. package/dist/src/tui/tui-scoped-models.js +2 -2
  381. package/dist/src/tui/tui-settings.js +1 -1
  382. package/dist/src/tui/tui.js +3 -3
  383. package/dist/src/tunnel/frpc-binary.js +3 -3
  384. package/dist/src/tunnel/frpc-config.js +1 -1
  385. package/dist/src/tunnel/frpc-extract.js +1 -1
  386. package/dist/src/tunnel/tunnel-state.js +1 -1
  387. package/dist/src/utils/logger/audit.js +1 -1
  388. package/dist/src/utils/logger/log-store.js +1 -1
  389. package/dist/src/utils/logger/rotation.js +1 -1
  390. package/dist/src/voice/tts/audio.js +1 -1
  391. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  392. package/dist/src/workflows/service/workflow-session-bridge.js +41 -64
  393. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  394. package/dist/src/workflows/store/event-store.js +1 -1
  395. package/dist/src/workflows/store/run-store.js +1 -1
  396. package/package.json +2 -2
  397. package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +0 -1
  398. package/dist/gateway/static/root/assets/url-BHHmdJYc.js +0 -3
  399. package/dist/src/agent/context/workspace-templates/BOOTSTRAP.md +0 -61
  400. package/dist/src/agent/embedded/session-manager-cache.d.ts +0 -19
  401. package/dist/src/agent/embedded/session-manager-cache.js +0 -48
  402. package/dist/src/agent/embedded/session-manager-cache.js.map +0 -1
  403. package/dist/src/session/parity/artifacts.d.ts +0 -16
  404. package/dist/src/session/parity/artifacts.js +0 -80
  405. package/dist/src/session/parity/artifacts.js.map +0 -1
  406. package/dist/src/session/parity/jsonl-transcript-io.d.ts +0 -54
  407. package/dist/src/session/parity/jsonl-transcript-io.js +0 -236
  408. package/dist/src/session/parity/jsonl-transcript-io.js.map +0 -1
  409. package/dist/src/session/parity/load-jsonl-entries.js.map +0 -1
  410. package/dist/src/session/parity/session-id.js +0 -18
  411. package/dist/src/session/parity/session-id.js.map +0 -1
  412. package/dist/src/session/parity/sessions-json-cache.d.ts +0 -14
  413. package/dist/src/session/parity/sessions-json-cache.js +0 -98
  414. package/dist/src/session/parity/sessions-json-cache.js.map +0 -1
  415. package/dist/src/session/parity/sessions-json-file-read.d.ts +0 -6
  416. package/dist/src/session/parity/sessions-json-file-read.js +0 -19
  417. package/dist/src/session/parity/sessions-json-file-read.js.map +0 -1
  418. package/dist/src/session/parity/sessions-json-file.d.ts +0 -11
  419. package/dist/src/session/parity/sessions-json-file.js +0 -52
  420. package/dist/src/session/parity/sessions-json-file.js.map +0 -1
  421. package/dist/src/session/parity/sessions-json-patch.d.ts +0 -14
  422. package/dist/src/session/parity/sessions-json-patch.js +0 -40
  423. package/dist/src/session/parity/sessions-json-patch.js.map +0 -1
  424. package/dist/src/session/parity/transcript-file-lock.d.ts +0 -22
  425. package/dist/src/session/parity/transcript-file-lock.js +0 -142
  426. package/dist/src/session/parity/transcript-file-lock.js.map +0 -1
  427. package/dist/src/session/parity/transcript-pagination.d.ts +0 -29
  428. package/dist/src/session/parity/transcript-pagination.js +0 -132
  429. package/dist/src/session/parity/transcript-pagination.js.map +0 -1
  430. package/dist/src/session/parity/transcript-paths.d.ts +0 -13
  431. package/dist/src/session/parity/transcript-paths.js +0 -64
  432. package/dist/src/session/parity/transcript-paths.js.map +0 -1
  433. package/dist/src/session/parity/xopc-session-disk-entry.d.ts +0 -22
  434. package/dist/src/session/search-index-cache.d.ts +0 -6
  435. package/dist/src/session/search-index-cache.js +0 -44
  436. package/dist/src/session/search-index-cache.js.map +0 -1
  437. package/dist/src/session/search-index.d.ts +0 -20
  438. package/dist/src/session/search-index.js +0 -124
  439. package/dist/src/session/search-index.js.map +0 -1
  440. /package/dist/src/{session/parity/xopc-session-disk-entry.js → cron/execution-types.js} +0 -0
  441. /package/dist/src/session/{parity/load-jsonl-entries.d.ts → load-jsonl-entries.d.ts} +0 -0
  442. /package/dist/src/session/{parity/session-id.d.ts → session-id.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"agent-scope.js","names":[],"sources":["../../../src/agent/agent-scope.ts"],"sourcesContent":["/**\n * Agent path and list resolution (config is the single source of truth).\n */\n\nimport fs from 'node:fs';\nimport { basename, join, relative, resolve, isAbsolute } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport const DEFAULT_AGENT_ID = 'main';\n\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/** Normalized id segment safe for directory names under `agents/<id>/`. */\nexport const STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction normalizeLowercaseStringOrEmpty(s: string): string {\n return s.trim().toLowerCase();\n}\n\n/** Path-safe agent id. */\nexport function normalizeAgentId(value: string | undefined | null): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = normalizeLowercaseStringOrEmpty(trimmed);\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\n/**\n * Validate agent id for new agents (folder-safe path segment).\n * When `explicitId` is set, it must already match {@link STRICT_AGENT_ID_RE} (case-insensitive input, stored lowercase).\n * When omitted, id is derived from `displayNameForDerivation` via {@link normalizeAgentId}.\n */\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n\n/** Expand `~` and resolve to an absolute path. */\nexport function resolveUserPath(raw: string): string {\n const expanded = expandWorkspacePathString(raw.trim());\n return resolve(expanded);\n}\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport function listAgentEntries(cfg: Config): AgentEntry[] {\n const list = cfg.agents?.list;\n if (!Array.isArray(list)) {\n return [];\n }\n return list.filter((e): e is AgentEntry => Boolean(e && typeof e === 'object'));\n}\n\nexport function resolveDefaultAgentId(cfg: Config): string {\n const explicit = cfg.agents?.default?.trim();\n if (explicit) {\n return normalizeAgentId(explicit);\n }\n const agents = listAgentEntries(cfg);\n if (agents.length === 0) {\n return DEFAULT_AGENT_ID;\n }\n const defaults = agents.filter((a) => a?.default === true);\n const chosen = (defaults[0] ?? agents[0])?.id?.trim();\n return chosen ? normalizeAgentId(chosen) : DEFAULT_AGENT_ID;\n}\n\nfunction resolveAgentEntry(cfg: Config, agentId: string): AgentEntry | undefined {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).find((e) => normalizeAgentId(e.id) === id);\n}\n\n/**\n * Markdown workspace root for an agent.\n */\nexport function resolveAgentWorkspaceDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.workspace?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const defaultAgentId = resolveDefaultAgentId(cfg);\n const fallback = cfg.agents?.defaults?.workspace?.trim();\n if (fallback) {\n return join(resolveUserPath(fallback), id);\n }\n if (id === defaultAgentId) {\n return resolveDefaultAgentWorkspaceDir(process.env);\n }\n const stateDir = resolveStateDir(process.env);\n return join(stateDir, `workspace-${id}`);\n}\n\n/**\n * Internal agent state dir: credentials, `agent.json`, pid, inbox (`…/agent/`).\n */\nexport function resolveAgentDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.agentDir?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const root = resolveStateDir(process.env);\n return join(root, 'agents', id, 'agent');\n}\n\n/** Parent of `sessions/` and `agent/`: `<stateDir>/agents/<id>/`. */\nexport function resolveAgentHomeDir(cfg: Config, agentId: string): string {\n return join(resolveStateDir(process.env), 'agents', normalizeAgentId(agentId));\n}\n\n/** Profile Markdown + gateway avatar files: `<stateDir>/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'profile');\n}\n\n/** Resolved path for a single profile Markdown basename (e.g. `SOUL.md`). */\nexport function resolveAgentProfileMarkdownPath(cfg: Config, agentId: string, filename: string): string {\n const base = basename(filename.trim().replace(/\\\\/g, '/'));\n return join(resolveAgentProfileDir(cfg, agentId), base);\n}\n\nexport function resolveSessionsDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'sessions');\n}\n\nfunction normalizePathForComparison(input: string): string {\n const resolved = resolve(resolveUserPath(input));\n let normalized = resolved;\n try {\n normalized = fs.realpathSync.native(resolved);\n } catch {\n // Keep lexical path for non-existent directories.\n }\n if (process.platform === 'win32') {\n return normalized.toLowerCase();\n }\n return normalized;\n}\n\nfunction isPathWithinRoot(candidatePath: string, rootPath: string): boolean {\n const rel = relative(rootPath, candidatePath);\n return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));\n}\n\n/** Agent ids whose workspace root contains `workspacePath` (longest match first). */\nexport function resolveAgentIdsByWorkspacePath(cfg: Config, workspacePath: string): string[] {\n const normalizedWorkspacePath = normalizePathForComparison(workspacePath);\n const entries = listAgentEntries(cfg);\n const matches: Array<{ id: string; workspaceDir: string; order: number }> = [];\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index]!;\n const id = normalizeAgentId(entry.id);\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, id));\n if (!isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n continue;\n }\n matches.push({ id, workspaceDir, order: index });\n }\n\n const defaultId = resolveDefaultAgentId(cfg);\n if (!entries.some((e) => normalizeAgentId(e.id) === defaultId)) {\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, defaultId));\n if (isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n matches.push({ id: defaultId, workspaceDir, order: entries.length });\n }\n }\n\n matches.sort((left, right) => {\n const workspaceLengthDelta = right.workspaceDir.length - left.workspaceDir.length;\n if (workspaceLengthDelta !== 0) {\n return workspaceLengthDelta;\n }\n return left.order - right.order;\n });\n\n return matches.map((entry) => entry.id);\n}\n\n/** Best-matching agent id for cwd, or `undefined` when no workspace contains the path. */\nexport function resolveAgentIdByWorkspacePath(\n cfg: Config,\n workspacePath: string,\n): string | undefined {\n return resolveAgentIdsByWorkspacePath(cfg, workspacePath)[0];\n}\n\n/**\n * Find the agent id whose resolved markdown workspace matches `resolvedWorkspacePath`.\n * Falls back to {@link resolveDefaultAgentId} when no list entry matches.\n */\nexport function resolveAgentIdForWorkspacePath(cfg: Config, resolvedWorkspacePath: string): string {\n return (\n resolveAgentIdByWorkspacePath(cfg, resolvedWorkspacePath) ??\n resolveDefaultAgentId(cfg)\n );\n}\n\nexport function getDefaultWorkspacePath(cfg: Config): string {\n return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-scope.js","names":[],"sources":["../../../src/agent/agent-scope.ts"],"sourcesContent":["/**\n * Agent path and list resolution (config is the single source of truth).\n */\n\nimport fs from 'node:fs';\nimport { basename, join, relative, resolve, isAbsolute } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { resolveStateDir } from '../config/paths-state.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport { resolveDefaultAgentWorkspaceDir } from '../config/workspace-defaults.js';\n\nexport const DEFAULT_AGENT_ID = 'main';\n\nconst VALID_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/i;\nconst INVALID_CHARS_RE = /[^a-z0-9_-]+/g;\nconst LEADING_DASH_RE = /^-+/;\nconst TRAILING_DASH_RE = /-+$/;\n\n/** Normalized id segment safe for directory names under `agents/<id>/`. */\nexport const STRICT_AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;\n\nconst WINDOWS_RESERVED_AGENT_IDS = new Set<string>([\n 'con',\n 'prn',\n 'aux',\n 'nul',\n 'com1',\n 'com2',\n 'com3',\n 'com4',\n 'com5',\n 'com6',\n 'com7',\n 'com8',\n 'com9',\n 'lpt1',\n 'lpt2',\n 'lpt3',\n 'lpt4',\n 'lpt5',\n 'lpt6',\n 'lpt7',\n 'lpt8',\n 'lpt9',\n]);\n\nfunction normalizeLowercaseStringOrEmpty(s: string): string {\n return s.trim().toLowerCase();\n}\n\n/** Path-safe agent id. */\nexport function normalizeAgentId(value: string | undefined | null): string {\n const trimmed = (value ?? '').trim();\n if (!trimmed) {\n return DEFAULT_AGENT_ID;\n }\n const normalized = normalizeLowercaseStringOrEmpty(trimmed);\n if (VALID_ID_RE.test(trimmed)) {\n return normalized;\n }\n return (\n normalized\n .replace(INVALID_CHARS_RE, '-')\n .replace(LEADING_DASH_RE, '')\n .replace(TRAILING_DASH_RE, '')\n .slice(0, 64) || DEFAULT_AGENT_ID\n );\n}\n\n/**\n * Validate agent id for new agents (folder-safe path segment).\n * When `explicitId` is set, it must already match {@link STRICT_AGENT_ID_RE} (case-insensitive input, stored lowercase).\n * When omitted, id is derived from `displayNameForDerivation` via {@link normalizeAgentId}.\n */\nexport function validateAgentIdForNewAgent(\n explicitId: string | undefined | null,\n displayNameForDerivation: string,\n): { ok: true; agentId: string } | { ok: false; error: string } {\n const explicit = explicitId?.trim();\n if (explicit) {\n const id = explicit.toLowerCase();\n if (!STRICT_AGENT_ID_RE.test(id)) {\n return {\n ok: false,\n error:\n 'Invalid agent id: use 1–64 characters; letters, digits, underscores, and hyphens only; start with a letter or digit.',\n };\n }\n if (id === DEFAULT_AGENT_ID) {\n return { ok: false, error: `\"${DEFAULT_AGENT_ID}\" is reserved` };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(id)) {\n return { ok: false, error: `Agent id \"${id}\" is reserved (Windows device name).` };\n }\n return { ok: true, agentId: id };\n }\n\n const agentId = normalizeAgentId(displayNameForDerivation.trim());\n if (agentId === DEFAULT_AGENT_ID) {\n return {\n ok: false,\n error:\n 'Display name cannot produce a valid agent folder id. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n if (WINDOWS_RESERVED_AGENT_IDS.has(agentId)) {\n return {\n ok: false,\n error: `That display name resolves to \"${agentId}\", which is reserved. Use a different display name or set an explicit Agent id.`,\n };\n }\n if (!STRICT_AGENT_ID_RE.test(agentId)) {\n return {\n ok: false,\n error:\n 'Could not derive a folder-safe agent id from the display name. Set an explicit Agent id (letters, digits, underscores, hyphens only).',\n };\n }\n return { ok: true, agentId };\n}\n\n/** Expand `~` and resolve to an absolute path. */\nexport function resolveUserPath(raw: string): string {\n const expanded = expandWorkspacePathString(raw.trim());\n return resolve(expanded);\n}\n\ntype AgentEntry = NonNullable<NonNullable<Config['agents']>['list']>[number];\n\nexport function listAgentEntries(cfg: Config): AgentEntry[] {\n const list = cfg.agents?.list;\n if (!Array.isArray(list)) {\n return [];\n }\n return list.filter((e): e is AgentEntry => Boolean(e && typeof e === 'object'));\n}\n\nexport function resolveDefaultAgentId(cfg: Config): string {\n const explicit = cfg.agents?.default?.trim();\n if (explicit) {\n return normalizeAgentId(explicit);\n }\n const agents = listAgentEntries(cfg);\n if (agents.length === 0) {\n return DEFAULT_AGENT_ID;\n }\n const defaults = agents.filter((a) => a?.default === true);\n const chosen = (defaults[0] ?? agents[0])?.id?.trim();\n return chosen ? normalizeAgentId(chosen) : DEFAULT_AGENT_ID;\n}\n\nfunction resolveAgentEntry(cfg: Config, agentId: string): AgentEntry | undefined {\n const id = normalizeAgentId(agentId);\n return listAgentEntries(cfg).find((e) => normalizeAgentId(e.id) === id);\n}\n\n/**\n * Markdown workspace root for an agent.\n */\nexport function resolveAgentWorkspaceDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.workspace?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const defaultAgentId = resolveDefaultAgentId(cfg);\n const fallback = cfg.agents?.defaults?.workspace?.trim();\n if (fallback) {\n return join(resolveUserPath(fallback), id);\n }\n if (id === defaultAgentId) {\n return resolveDefaultAgentWorkspaceDir(process.env);\n }\n const stateDir = resolveStateDir(process.env);\n return join(stateDir, `workspace-${id}`);\n}\n\n/**\n * Internal agent state dir: credentials, `agent.json`, pid, inbox (`…/agent/`).\n */\nexport function resolveAgentDir(cfg: Config, agentId: string): string {\n const id = normalizeAgentId(agentId);\n const configured = resolveAgentEntry(cfg, id)?.agentDir?.trim();\n if (configured) {\n return resolveUserPath(configured);\n }\n const root = resolveStateDir(process.env);\n return join(root, 'agents', id, 'agent');\n}\n\n/** Parent of `sessions/` and `agent/`: `<stateDir>/agents/<id>/`. */\nexport function resolveAgentHomeDir(cfg: Config, agentId: string): string {\n return join(resolveStateDir(process.env), 'agents', normalizeAgentId(agentId));\n}\n\n/** Profile Markdown + gateway avatar files: `<stateDir>/agents/<id>/profile/`. */\nexport function resolveAgentProfileDir(cfg: Config, agentId: string): string {\n return join(resolveAgentHomeDir(cfg, agentId), 'profile');\n}\n\n/** Resolved path for a single profile Markdown basename (e.g. `SOUL.md`). */\nexport function resolveAgentProfileMarkdownPath(cfg: Config, agentId: string, filename: string): string {\n const base = basename(filename.trim().replace(/\\\\/g, '/'));\n return join(resolveAgentProfileDir(cfg, agentId), base);\n}\n\nfunction normalizePathForComparison(input: string): string {\n const resolved = resolve(resolveUserPath(input));\n let normalized = resolved;\n try {\n normalized = fs.realpathSync.native(resolved);\n } catch {\n // Keep lexical path for non-existent directories.\n }\n if (process.platform === 'win32') {\n return normalized.toLowerCase();\n }\n return normalized;\n}\n\nfunction isPathWithinRoot(candidatePath: string, rootPath: string): boolean {\n const rel = relative(rootPath, candidatePath);\n return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));\n}\n\n/** Agent ids whose workspace root contains `workspacePath` (longest match first). */\nexport function resolveAgentIdsByWorkspacePath(cfg: Config, workspacePath: string): string[] {\n const normalizedWorkspacePath = normalizePathForComparison(workspacePath);\n const entries = listAgentEntries(cfg);\n const matches: Array<{ id: string; workspaceDir: string; order: number }> = [];\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index]!;\n const id = normalizeAgentId(entry.id);\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, id));\n if (!isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n continue;\n }\n matches.push({ id, workspaceDir, order: index });\n }\n\n const defaultId = resolveDefaultAgentId(cfg);\n if (!entries.some((e) => normalizeAgentId(e.id) === defaultId)) {\n const workspaceDir = normalizePathForComparison(resolveAgentWorkspaceDir(cfg, defaultId));\n if (isPathWithinRoot(normalizedWorkspacePath, workspaceDir)) {\n matches.push({ id: defaultId, workspaceDir, order: entries.length });\n }\n }\n\n matches.sort((left, right) => {\n const workspaceLengthDelta = right.workspaceDir.length - left.workspaceDir.length;\n if (workspaceLengthDelta !== 0) {\n return workspaceLengthDelta;\n }\n return left.order - right.order;\n });\n\n return matches.map((entry) => entry.id);\n}\n\n/** Best-matching agent id for cwd, or `undefined` when no workspace contains the path. */\nexport function resolveAgentIdByWorkspacePath(\n cfg: Config,\n workspacePath: string,\n): string | undefined {\n return resolveAgentIdsByWorkspacePath(cfg, workspacePath)[0];\n}\n\n/**\n * Find the agent id whose resolved markdown workspace matches `resolvedWorkspacePath`.\n * Falls back to {@link resolveDefaultAgentId} when no list entry matches.\n */\nexport function resolveAgentIdForWorkspacePath(cfg: Config, resolvedWorkspacePath: string): string {\n return (\n resolveAgentIdByWorkspacePath(cfg, resolvedWorkspacePath) ??\n resolveDefaultAgentId(cfg)\n );\n}\n\nexport function getDefaultWorkspacePath(cfg: Config): string {\n return resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg));\n}\n"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { WorkspaceBootstrapFile } from './types.js';
2
+ export declare function wasBootstrapContextInjected(sessionKey: string): boolean;
3
+ export declare function markBootstrapContextInjected(sessionKey: string): void;
2
4
  export declare function getOrLoadBootstrapFiles(params: {
3
5
  profileDir: string;
4
6
  sessionKey: string;
@@ -1,6 +1,7 @@
1
1
  import { loadProfileBootstrapFiles } from "./load-bootstrap-files.js";
2
2
  //#region src/agent/bootstrap/bootstrap-cache.ts
3
3
  const cache = /* @__PURE__ */ new Map();
4
+ const bootstrapContextInjected = /* @__PURE__ */ new Set();
4
5
  function bootstrapFilesEqual(previous, next) {
5
6
  if (previous.length !== next.length) return false;
6
7
  return previous.every((file, index) => {
@@ -8,6 +9,12 @@ function bootstrapFilesEqual(previous, next) {
8
9
  return updated !== void 0 && file.name === updated.name && file.path === updated.path && file.content === updated.content && file.missing === updated.missing;
9
10
  });
10
11
  }
12
+ function wasBootstrapContextInjected(sessionKey) {
13
+ return bootstrapContextInjected.has(sessionKey);
14
+ }
15
+ function markBootstrapContextInjected(sessionKey) {
16
+ bootstrapContextInjected.add(sessionKey);
17
+ }
11
18
  async function getOrLoadBootstrapFiles(params) {
12
19
  const existing = cache.get(params.sessionKey);
13
20
  const files = loadProfileBootstrapFiles(params.profileDir);
@@ -20,11 +27,13 @@ async function getOrLoadBootstrapFiles(params) {
20
27
  }
21
28
  function clearBootstrapSnapshot(sessionKey) {
22
29
  cache.delete(sessionKey);
30
+ bootstrapContextInjected.delete(sessionKey);
23
31
  }
24
32
  function clearAllBootstrapSnapshots() {
25
33
  cache.clear();
34
+ bootstrapContextInjected.clear();
26
35
  }
27
36
  //#endregion
28
- export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles };
37
+ export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles, markBootstrapContextInjected, wasBootstrapContextInjected };
29
38
 
30
39
  //# sourceMappingURL=bootstrap-cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-cache.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-cache.ts"],"sourcesContent":["import { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { WorkspaceBootstrapFile } from './types.js';\n\ntype BootstrapSnapshot = {\n profileDir: string;\n files: WorkspaceBootstrapFile[];\n};\n\nconst cache = new Map<string, BootstrapSnapshot>();\n\nfunction bootstrapFilesEqual(\n previous: WorkspaceBootstrapFile[],\n next: WorkspaceBootstrapFile[],\n): boolean {\n if (previous.length !== next.length) {\n return false;\n }\n return previous.every((file, index) => {\n const updated = next[index];\n return (\n updated !== undefined &&\n file.name === updated.name &&\n file.path === updated.path &&\n file.content === updated.content &&\n file.missing === updated.missing\n );\n });\n}\n\nexport async function getOrLoadBootstrapFiles(params: {\n profileDir: string;\n sessionKey: string;\n}): Promise<WorkspaceBootstrapFile[]> {\n const existing = cache.get(params.sessionKey);\n const files = loadProfileBootstrapFiles(params.profileDir);\n if (\n existing &&\n existing.profileDir === params.profileDir &&\n bootstrapFilesEqual(existing.files, files)\n ) {\n return existing.files;\n }\n cache.set(params.sessionKey, { profileDir: params.profileDir, files });\n return files;\n}\n\nexport function clearBootstrapSnapshot(sessionKey: string): void {\n cache.delete(sessionKey);\n}\n\nexport function clearAllBootstrapSnapshots(): void {\n cache.clear();\n}\n"],"mappings":";;AAQA,MAAM,wBAAQ,IAAI,KAAgC;AAElD,SAAS,oBACP,UACA,MACS;AACT,KAAI,SAAS,WAAW,KAAK,OAC3B,QAAO;AAET,QAAO,SAAS,OAAO,MAAM,UAAU;EACrC,MAAM,UAAU,KAAK;AACrB,SACE,YAAY,KAAA,KACZ,KAAK,SAAS,QAAQ,QACtB,KAAK,SAAS,QAAQ,QACtB,KAAK,YAAY,QAAQ,WACzB,KAAK,YAAY,QAAQ;GAE3B;;AAGJ,eAAsB,wBAAwB,QAGR;CACpC,MAAM,WAAW,MAAM,IAAI,OAAO,WAAW;CAC7C,MAAM,QAAQ,0BAA0B,OAAO,WAAW;AAC1D,KACE,YACA,SAAS,eAAe,OAAO,cAC/B,oBAAoB,SAAS,OAAO,MAAM,CAE1C,QAAO,SAAS;AAElB,OAAM,IAAI,OAAO,YAAY;EAAE,YAAY,OAAO;EAAY;EAAO,CAAC;AACtE,QAAO;;AAGT,SAAgB,uBAAuB,YAA0B;AAC/D,OAAM,OAAO,WAAW;;AAG1B,SAAgB,6BAAmC;AACjD,OAAM,OAAO"}
1
+ {"version":3,"file":"bootstrap-cache.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-cache.ts"],"sourcesContent":["import { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { WorkspaceBootstrapFile } from './types.js';\n\ntype BootstrapSnapshot = {\n profileDir: string;\n files: WorkspaceBootstrapFile[];\n};\n\nconst cache = new Map<string, BootstrapSnapshot>();\nconst bootstrapContextInjected = new Set<string>();\n\nfunction bootstrapFilesEqual(\n previous: WorkspaceBootstrapFile[],\n next: WorkspaceBootstrapFile[],\n): boolean {\n if (previous.length !== next.length) {\n return false;\n }\n return previous.every((file, index) => {\n const updated = next[index];\n return (\n updated !== undefined &&\n file.name === updated.name &&\n file.path === updated.path &&\n file.content === updated.content &&\n file.missing === updated.missing\n );\n });\n}\n\nexport function wasBootstrapContextInjected(sessionKey: string): boolean {\n return bootstrapContextInjected.has(sessionKey);\n}\n\nexport function markBootstrapContextInjected(sessionKey: string): void {\n bootstrapContextInjected.add(sessionKey);\n}\n\nexport async function getOrLoadBootstrapFiles(params: {\n profileDir: string;\n sessionKey: string;\n}): Promise<WorkspaceBootstrapFile[]> {\n const existing = cache.get(params.sessionKey);\n const files = loadProfileBootstrapFiles(params.profileDir);\n if (existing && existing.profileDir === params.profileDir && bootstrapFilesEqual(existing.files, files)) {\n return existing.files;\n }\n cache.set(params.sessionKey, {\n profileDir: params.profileDir,\n files,\n });\n return files;\n}\n\nexport function clearBootstrapSnapshot(sessionKey: string): void {\n cache.delete(sessionKey);\n bootstrapContextInjected.delete(sessionKey);\n}\n\nexport function clearAllBootstrapSnapshots(): void {\n cache.clear();\n bootstrapContextInjected.clear();\n}\n"],"mappings":";;AAQA,MAAM,wBAAQ,IAAI,KAAgC;AAClD,MAAM,2CAA2B,IAAI,KAAa;AAElD,SAAS,oBACP,UACA,MACS;AACT,KAAI,SAAS,WAAW,KAAK,OAC3B,QAAO;AAET,QAAO,SAAS,OAAO,MAAM,UAAU;EACrC,MAAM,UAAU,KAAK;AACrB,SACE,YAAY,KAAA,KACZ,KAAK,SAAS,QAAQ,QACtB,KAAK,SAAS,QAAQ,QACtB,KAAK,YAAY,QAAQ,WACzB,KAAK,YAAY,QAAQ;GAE3B;;AAGJ,SAAgB,4BAA4B,YAA6B;AACvE,QAAO,yBAAyB,IAAI,WAAW;;AAGjD,SAAgB,6BAA6B,YAA0B;AACrE,0BAAyB,IAAI,WAAW;;AAG1C,eAAsB,wBAAwB,QAGR;CACpC,MAAM,WAAW,MAAM,IAAI,OAAO,WAAW;CAC7C,MAAM,QAAQ,0BAA0B,OAAO,WAAW;AAC1D,KAAI,YAAY,SAAS,eAAe,OAAO,cAAc,oBAAoB,SAAS,OAAO,MAAM,CACrG,QAAO,SAAS;AAElB,OAAM,IAAI,OAAO,YAAY;EAC3B,YAAY,OAAO;EACnB;EACD,CAAC;AACF,QAAO;;AAGT,SAAgB,uBAAuB,YAA0B;AAC/D,OAAM,OAAO,WAAW;AACxB,0BAAyB,OAAO,WAAW;;AAG7C,SAAgB,6BAAmC;AACjD,OAAM,OAAO;AACb,0BAAyB,OAAO"}
@@ -1,6 +1,5 @@
1
1
  import type { Config } from '../../config/schema.js';
2
2
  import type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';
3
- export { isProfileBootstrapPending } from './load-bootstrap-files.js';
4
3
  export { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';
5
4
  export declare function resolveBootstrapFilesSync(params: {
6
5
  profileDir: string;
@@ -18,6 +17,7 @@ export declare function resolveBootstrapContextSync(params: {
18
17
  config?: Config;
19
18
  sessionKey?: string;
20
19
  excludeHeartbeat?: boolean;
20
+ contextInjection?: 'always' | 'continuation-skip' | 'never';
21
21
  }): {
22
22
  bootstrapFiles: WorkspaceBootstrapFile[];
23
23
  contextFiles: EmbeddedContextFile[];
@@ -27,6 +27,7 @@ export declare function resolveBootstrapContextForRun(params: {
27
27
  config?: Config;
28
28
  sessionKey?: string;
29
29
  excludeHeartbeat?: boolean;
30
+ contextInjection?: 'always' | 'continuation-skip' | 'never';
30
31
  warn?: (message: string) => void;
31
32
  }): Promise<{
32
33
  bootstrapFiles: WorkspaceBootstrapFile[];
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_HEARTBEAT_FILENAME } from "../context/workspace.js";
2
- import { isProfileBootstrapPending, loadProfileBootstrapFiles } from "./load-bootstrap-files.js";
3
- import { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles } from "./bootstrap-cache.js";
2
+ import { loadProfileBootstrapFiles } from "./load-bootstrap-files.js";
3
+ import { clearAllBootstrapSnapshots, clearBootstrapSnapshot, getOrLoadBootstrapFiles, markBootstrapContextInjected, wasBootstrapContextInjected } from "./bootstrap-cache.js";
4
4
  import { buildBootstrapContextFiles, resolveBootstrapMaxChars, resolveBootstrapTotalMaxChars } from "./bootstrap-context.js";
5
5
  import { filterBootstrapFilesForSession } from "./filter-bootstrap-files.js";
6
6
  //#region src/agent/bootstrap/bootstrap-files.ts
@@ -19,27 +19,49 @@ async function resolveBootstrapFilesForRun(params) {
19
19
  }) : loadProfileBootstrapFiles(params.profileDir), sessionKey), params.excludeHeartbeat ?? false);
20
20
  }
21
21
  function resolveBootstrapContextSync(params) {
22
+ const mode = params.contextInjection ?? "always";
23
+ if (mode === "never") return {
24
+ bootstrapFiles: [],
25
+ contextFiles: []
26
+ };
27
+ if (mode === "continuation-skip" && params.sessionKey && wasBootstrapContextInjected(params.sessionKey)) return {
28
+ bootstrapFiles: [],
29
+ contextFiles: []
30
+ };
22
31
  const bootstrapFiles = resolveBootstrapFilesSync(params);
32
+ const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {
33
+ maxChars: resolveBootstrapMaxChars(params.config),
34
+ totalMaxChars: resolveBootstrapTotalMaxChars(params.config)
35
+ });
36
+ if (mode === "continuation-skip" && params.sessionKey && contextFiles.length > 0) markBootstrapContextInjected(params.sessionKey);
23
37
  return {
24
38
  bootstrapFiles,
25
- contextFiles: buildBootstrapContextFiles(bootstrapFiles, {
26
- maxChars: resolveBootstrapMaxChars(params.config),
27
- totalMaxChars: resolveBootstrapTotalMaxChars(params.config)
28
- })
39
+ contextFiles
29
40
  };
30
41
  }
31
42
  async function resolveBootstrapContextForRun(params) {
43
+ const mode = params.contextInjection ?? "always";
44
+ if (mode === "never") return {
45
+ bootstrapFiles: [],
46
+ contextFiles: []
47
+ };
48
+ if (mode === "continuation-skip" && params.sessionKey && wasBootstrapContextInjected(params.sessionKey)) return {
49
+ bootstrapFiles: [],
50
+ contextFiles: []
51
+ };
32
52
  const bootstrapFiles = await resolveBootstrapFilesForRun(params);
53
+ const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {
54
+ maxChars: resolveBootstrapMaxChars(params.config),
55
+ totalMaxChars: resolveBootstrapTotalMaxChars(params.config),
56
+ warn: params.warn
57
+ });
58
+ if (mode === "continuation-skip" && params.sessionKey && contextFiles.length > 0) markBootstrapContextInjected(params.sessionKey);
33
59
  return {
34
60
  bootstrapFiles,
35
- contextFiles: buildBootstrapContextFiles(bootstrapFiles, {
36
- maxChars: resolveBootstrapMaxChars(params.config),
37
- totalMaxChars: resolveBootstrapTotalMaxChars(params.config),
38
- warn: params.warn
39
- })
61
+ contextFiles
40
62
  };
41
63
  }
42
64
  //#endregion
43
- export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, isProfileBootstrapPending, resolveBootstrapContextForRun, resolveBootstrapContextSync, resolveBootstrapFilesForRun, resolveBootstrapFilesSync };
65
+ export { clearAllBootstrapSnapshots, clearBootstrapSnapshot, resolveBootstrapContextForRun, resolveBootstrapContextSync, resolveBootstrapFilesForRun, resolveBootstrapFilesSync };
44
66
 
45
67
  //# sourceMappingURL=bootstrap-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport { getOrLoadBootstrapFiles } from './bootstrap-cache.js';\nimport {\n buildBootstrapContextFiles,\n resolveBootstrapMaxChars,\n resolveBootstrapTotalMaxChars,\n} from './bootstrap-context.js';\nimport { filterBootstrapFilesForSession } from './filter-bootstrap-files.js';\nimport { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport { isProfileBootstrapPending } from './load-bootstrap-files.js';\nexport { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';\n\nfunction filterHeartbeatBootstrapFile(\n files: WorkspaceBootstrapFile[],\n exclude: boolean,\n): WorkspaceBootstrapFile[] {\n if (!exclude) {\n return files;\n }\n return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);\n}\n\nexport function resolveBootstrapFilesSync(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): WorkspaceBootstrapFile[] {\n const rawFiles = loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, params.sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport async function resolveBootstrapFilesForRun(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<WorkspaceBootstrapFile[]> {\n const sessionKey = params.sessionKey;\n const rawFiles = sessionKey\n ? await getOrLoadBootstrapFiles({ profileDir: params.profileDir, sessionKey })\n : loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport function resolveBootstrapContextSync(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): {\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n} {\n const bootstrapFiles = resolveBootstrapFilesSync(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n });\n return { bootstrapFiles, contextFiles };\n}\n\nexport async function resolveBootstrapContextForRun(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<{\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n}> {\n const bootstrapFiles = await resolveBootstrapFilesForRun(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n warn: params.warn,\n });\n return { bootstrapFiles, contextFiles };\n}\n"],"mappings":";;;;;;AAeA,SAAS,6BACP,OACA,SAC0B;AAC1B,KAAI,CAAC,QACH,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,2BAA2B;;AAGzE,SAAgB,0BAA0B,QAIb;AAG3B,QAAO,6BADU,+BADA,0BAA0B,OAAO,WACM,EAAE,OAAO,WACrB,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,eAAsB,4BAA4B,QAKZ;CACpC,MAAM,aAAa,OAAO;AAK1B,QAAO,6BADU,+BAHA,aACb,MAAM,wBAAwB;EAAE,YAAY,OAAO;EAAY;EAAY,CAAC,GAC5E,0BAA0B,OAAO,WAAW,EACU,WACd,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,SAAgB,4BAA4B,QAQ1C;CACA,MAAM,iBAAiB,0BAA0B,OAAO;AAKxD,QAAO;EAAE;EAAgB,cAJJ,2BAA2B,gBAAgB;GAC9D,UAAU,yBAAyB,OAAO,OAAO;GACjD,eAAe,8BAA8B,OAAO,OAAO;GAC5D,CACoC;EAAE;;AAGzC,eAAsB,8BAA8B,QASjD;CACD,MAAM,iBAAiB,MAAM,4BAA4B,OAAO;AAMhE,QAAO;EAAE;EAAgB,cALJ,2BAA2B,gBAAgB;GAC9D,UAAU,yBAAyB,OAAO,OAAO;GACjD,eAAe,8BAA8B,OAAO,OAAO;GAC3D,MAAM,OAAO;GACd,CACoC;EAAE"}
1
+ {"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport {\n getOrLoadBootstrapFiles,\n markBootstrapContextInjected,\n wasBootstrapContextInjected,\n} from './bootstrap-cache.js';\nimport {\n buildBootstrapContextFiles,\n resolveBootstrapMaxChars,\n resolveBootstrapTotalMaxChars,\n} from './bootstrap-context.js';\nimport { filterBootstrapFilesForSession } from './filter-bootstrap-files.js';\nimport { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';\n\nfunction filterHeartbeatBootstrapFile(\n files: WorkspaceBootstrapFile[],\n exclude: boolean,\n): WorkspaceBootstrapFile[] {\n if (!exclude) {\n return files;\n }\n return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);\n}\n\nexport function resolveBootstrapFilesSync(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): WorkspaceBootstrapFile[] {\n const rawFiles = loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, params.sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport async function resolveBootstrapFilesForRun(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<WorkspaceBootstrapFile[]> {\n const sessionKey = params.sessionKey;\n const rawFiles = sessionKey\n ? await getOrLoadBootstrapFiles({\n profileDir: params.profileDir,\n sessionKey,\n })\n : loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport function resolveBootstrapContextSync(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n}): {\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n} {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = resolveBootstrapFilesSync(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n\nexport async function resolveBootstrapContextForRun(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n warn?: (message: string) => void;\n}): Promise<{\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n}> {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = await resolveBootstrapFilesForRun(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n warn: params.warn,\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n"],"mappings":";;;;;;AAkBA,SAAS,6BACP,OACA,SAC0B;AAC1B,KAAI,CAAC,QACH,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,2BAA2B;;AAGzE,SAAgB,0BAA0B,QAIb;AAG3B,QAAO,6BADU,+BADA,0BAA0B,OAAO,WACM,EAAE,OAAO,WACrB,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,eAAsB,4BAA4B,QAKZ;CACpC,MAAM,aAAa,OAAO;AAQ1B,QAAO,6BADU,+BANA,aACb,MAAM,wBAAwB;EAC5B,YAAY,OAAO;EACnB;EACD,CAAC,GACF,0BAA0B,OAAO,WAAW,EACU,WACd,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,SAAgB,4BAA4B,QAS1C;CACA,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,0BAA0B,OAAO;CACxD,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC5D,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc;;AAGzC,eAAsB,8BAA8B,QAUjD;CACD,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,MAAM,4BAA4B,OAAO;CAChE,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC3D,MAAM,OAAO;EACd,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc"}
@@ -1,7 +1,6 @@
1
1
  import type { WorkspaceBootstrapFile } from './types.js';
2
- export declare function isProfileBootstrapPending(profileDir: string): boolean;
3
2
  /**
4
3
  * Load bootstrap profile Markdown from `agents/<id>/profile/`.
5
- * MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.
4
+ * MEMORY.md is omitted when absent; other slots emit missing markers.
6
5
  */
7
6
  export declare function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[];
@@ -1,17 +1,14 @@
1
- import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
2
1
  import { DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME, DEFAULT_USER_FILENAME, stripFrontMatter } from "../context/workspace.js";
3
- import { join, resolve } from "node:path";
4
2
  import { existsSync, readFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
5
4
  //#region src/agent/bootstrap/load-bootstrap-files.ts
6
- init_paths();
7
- const BOOTSTRAP_LOAD_ORDER = [
5
+ const PROFILE_LOAD_ORDER = [
8
6
  DEFAULT_AGENTS_FILENAME,
9
7
  DEFAULT_SOUL_FILENAME,
10
8
  DEFAULT_TOOLS_FILENAME,
11
9
  DEFAULT_IDENTITY_FILENAME,
12
10
  DEFAULT_USER_FILENAME,
13
11
  DEFAULT_HEARTBEAT_FILENAME,
14
- WORKSPACE_FILES.BOOTSTRAP,
15
12
  DEFAULT_MEMORY_FILENAME
16
13
  ];
17
14
  function readProfileFile(filePath) {
@@ -22,19 +19,16 @@ function readProfileFile(filePath) {
22
19
  return null;
23
20
  }
24
21
  }
25
- function isProfileBootstrapPending(profileDir) {
26
- return existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP));
27
- }
28
22
  /**
29
23
  * Load bootstrap profile Markdown from `agents/<id>/profile/`.
30
- * MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.
24
+ * MEMORY.md is omitted when absent; other slots emit missing markers.
31
25
  */
32
26
  function loadProfileBootstrapFiles(profileDir) {
33
27
  const resolvedDir = resolve(profileDir);
34
28
  const result = [];
35
- for (const name of BOOTSTRAP_LOAD_ORDER) {
29
+ for (const name of PROFILE_LOAD_ORDER) {
36
30
  const filePath = join(resolvedDir, name);
37
- if (name === "MEMORY.md" || name === WORKSPACE_FILES.BOOTSTRAP) {
31
+ if (name === "MEMORY.md") {
38
32
  const content = readProfileFile(filePath);
39
33
  if (content === null) continue;
40
34
  result.push({
@@ -61,6 +55,6 @@ function loadProfileBootstrapFiles(profileDir) {
61
55
  return result;
62
56
  }
63
57
  //#endregion
64
- export { isProfileBootstrapPending, loadProfileBootstrapFiles };
58
+ export { loadProfileBootstrapFiles };
65
59
 
66
60
  //# sourceMappingURL=load-bootstrap-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_USER_FILENAME,\n} from '../context/workspace.js';\nimport type { BootstrapFileName, WorkspaceBootstrapFile } from './types.js';\n\nconst BOOTSTRAP_LOAD_ORDER: BootstrapFileName[] = [\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_USER_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n WORKSPACE_FILES.BOOTSTRAP,\n DEFAULT_MEMORY_FILENAME,\n];\n\nfunction readProfileFile(filePath: string): string | null {\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n return stripFrontMatter(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function isProfileBootstrapPending(profileDir: string): boolean {\n return existsSync(join(profileDir, WORKSPACE_FILES.BOOTSTRAP));\n}\n\n/**\n * Load bootstrap profile Markdown from `agents/<id>/profile/`.\n * MEMORY.md and BOOTSTRAP.md are omitted when absent; other slots emit missing markers.\n */\nexport function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[] {\n const resolvedDir = resolve(profileDir);\n const result: WorkspaceBootstrapFile[] = [];\n\n for (const name of BOOTSTRAP_LOAD_ORDER) {\n const filePath = join(resolvedDir, name);\n\n if (name === DEFAULT_MEMORY_FILENAME || name === WORKSPACE_FILES.BOOTSTRAP) {\n const content = readProfileFile(filePath);\n if (content === null) {\n continue;\n }\n result.push({ name, path: filePath, content, missing: false });\n continue;\n }\n\n const content = readProfileFile(filePath);\n if (content !== null) {\n result.push({ name, path: filePath, content, missing: false });\n } else {\n result.push({ name, path: filePath, missing: true });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;YAGwD;AAaxD,MAAM,uBAA4C;CAChD;CACA;CACA;CACA;CACA;CACA;CACA,gBAAgB;CAChB;CACD;AAED,SAAS,gBAAgB,UAAiC;AACxD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;AAET,KAAI;AACF,SAAO,iBAAiB,aAAa,UAAU,QAAQ,CAAC;SAClD;AACN,SAAO;;;AAIX,SAAgB,0BAA0B,YAA6B;AACrE,QAAO,WAAW,KAAK,YAAY,gBAAgB,UAAU,CAAC;;;;;;AAOhE,SAAgB,0BAA0B,YAA8C;CACtF,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,SAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,sBAAsB;EACvC,MAAM,WAAW,KAAK,aAAa,KAAK;AAExC,MAAI,SAAA,eAAoC,SAAS,gBAAgB,WAAW;GAC1E,MAAM,UAAU,gBAAgB,SAAS;AACzC,OAAI,YAAY,KACd;AAEF,UAAO,KAAK;IAAE;IAAM,MAAM;IAAU;IAAS,SAAS;IAAO,CAAC;AAC9D;;EAGF,MAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,YAAY,KACd,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU;GAAS,SAAS;GAAO,CAAC;MAE9D,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU,SAAS;GAAM,CAAC;;AAIxD,QAAO"}
1
+ {"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_USER_FILENAME,\n} from '../context/workspace.js';\nimport type { BootstrapFileName, WorkspaceBootstrapFile } from './types.js';\n\nconst PROFILE_LOAD_ORDER: BootstrapFileName[] = [\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_USER_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n];\n\nfunction readProfileFile(filePath: string): string | null {\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n return stripFrontMatter(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Load bootstrap profile Markdown from `agents/<id>/profile/`.\n * MEMORY.md is omitted when absent; other slots emit missing markers.\n */\nexport function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[] {\n const resolvedDir = resolve(profileDir);\n const result: WorkspaceBootstrapFile[] = [];\n\n for (const name of PROFILE_LOAD_ORDER) {\n const filePath = join(resolvedDir, name);\n\n if (name === DEFAULT_MEMORY_FILENAME) {\n const content = readProfileFile(filePath);\n if (content === null) {\n continue;\n }\n result.push({ name, path: filePath, content, missing: false });\n continue;\n }\n\n const content = readProfileFile(filePath);\n if (content !== null) {\n result.push({ name, path: filePath, content, missing: false });\n } else {\n result.push({ name, path: filePath, missing: true });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AAeA,MAAM,qBAA0C;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,gBAAgB,UAAiC;AACxD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;AAET,KAAI;AACF,SAAO,iBAAiB,aAAa,UAAU,QAAQ,CAAC;SAClD;AACN,SAAO;;;;;;;AAQX,SAAgB,0BAA0B,YAA8C;CACtF,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,SAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,oBAAoB;EACrC,MAAM,WAAW,KAAK,aAAa,KAAK;AAExC,MAAI,SAAA,aAAkC;GACpC,MAAM,UAAU,gBAAgB,SAAS;AACzC,OAAI,YAAY,KACd;AAEF,UAAO,KAAK;IAAE;IAAM,MAAM;IAAU;IAAS,SAAS;IAAO,CAAC;AAC9D;;EAGF,MAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,YAAY,KACd,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU;GAAS,SAAS;GAAO,CAAC;MAE9D,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU,SAAS;GAAM,CAAC;;AAIxD,QAAO"}
@@ -1,12 +1,12 @@
1
1
  import type { AgentProfileMarkdownFilename } from '../context/workspace.js';
2
- export type BootstrapFileName = AgentProfileMarkdownFilename | 'BOOTSTRAP.md';
3
- export interface WorkspaceBootstrapFile {
2
+ export type BootstrapFileName = AgentProfileMarkdownFilename;
3
+ export type WorkspaceBootstrapFile = {
4
4
  name: BootstrapFileName;
5
5
  path: string;
6
6
  content?: string;
7
7
  missing: boolean;
8
- }
9
- export interface EmbeddedContextFile {
8
+ };
9
+ export type EmbeddedContextFile = {
10
10
  path: string;
11
11
  content: string;
12
- }
12
+ };
@@ -1,12 +1,12 @@
1
- import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir } from "../agent-scope.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent-scope.js";
4
4
  import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from "./workspace.js";
6
- import { dirname, join } from "node:path";
7
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
- import { execFileSync } from "node:child_process";
7
+ import { dirname, join } from "node:path";
9
8
  import { fileURLToPath } from "node:url";
9
+ import { execFileSync } from "node:child_process";
10
10
  //#region src/agent/context/workspace-seed.ts
11
11
  /**
12
12
  * Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).
@@ -18,8 +18,7 @@ init_logger();
18
18
  const log = createLogger("WorkspaceSeed");
19
19
  /** Marker in bundled/reference `IDENTITY.md` templates; replaced on agent creation when a display name is known. */
20
20
  const IDENTITY_NAME_PLACEHOLDER = "_(pick something you like)_";
21
- /** Files to copy when seeding a new agent (includes `BOOTSTRAP.md`, not part of system-prompt load order). */
22
- const SEED_FILENAMES = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, WORKSPACE_FILES.BOOTSTRAP];
21
+ const SEED_FILENAMES = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES];
23
22
  const __dirname = dirname(fileURLToPath(import.meta.url));
24
23
  function resolveBundledTemplatesDir() {
25
24
  return join(__dirname, "workspace-templates");
@@ -107,7 +106,8 @@ function ensureGitRepo(markdownWorkspaceDir, isBrandNew) {
107
106
  * Ensure default (`main`) agent has reference profile Markdown templates (missing files only).
108
107
  */
109
108
  function seedMainAgentProfileMarkdown(cfg) {
110
- seedAgentProfileMarkdownFiles(resolveAgentProfileDir(cfg, DEFAULT_AGENT_ID), resolveAgentWorkspaceDir(cfg, DEFAULT_AGENT_ID));
109
+ const agentId = resolveDefaultAgentId(cfg);
110
+ seedAgentProfileMarkdownFiles(resolveAgentProfileDir(cfg, agentId), resolveAgentWorkspaceDir(cfg, agentId), { displayName: agentId });
111
111
  }
112
112
  //#endregion
113
113
  export { IDENTITY_NAME_PLACEHOLDER, seedAgentProfileMarkdownFiles, seedMainAgentProfileMarkdown };
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-seed.js","names":[],"sources":["../../../../src/agent/context/workspace-seed.ts"],"sourcesContent":["/**\n * Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).\n * Resolution order per file: `XOPC_TEMPLATE_PATH` or repo `docs/reference/templates`, then bundled `./workspace-templates/`.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { Config } from '../../config/schema.js';\nimport { DEFAULT_AGENT_ID, resolveAgentProfileDir, resolveAgentWorkspaceDir } from '../agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from './workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('WorkspaceSeed');\n\n/** Marker in bundled/reference `IDENTITY.md` templates; replaced on agent creation when a display name is known. */\nexport const IDENTITY_NAME_PLACEHOLDER = '_(pick something you like)_';\n\nexport type SeedWorkspaceProfileMarkdownOptions = {\n /** Fills the **Name** line in `IDENTITY.md` when the template still contains the placeholder. */\n displayName?: string;\n};\n\n/** Files to copy when seeding a new agent (includes `BOOTSTRAP.md`, not part of system-prompt load order). */\nconst SEED_FILENAMES: readonly string[] = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, WORKSPACE_FILES.BOOTSTRAP];\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction resolveBundledTemplatesDir(): string {\n return join(__dirname, 'workspace-templates');\n}\n\n/** Walk ancestors for `docs/reference/templates` (dev checkout or local install with docs). */\nfunction resolveDocsTemplatesDirFromWalk(): string | null {\n let dir = __dirname;\n for (let i = 0; i < 12; i++) {\n const candidate = join(dir, 'docs', 'reference', 'templates');\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Same convention as CLI `templates.ts`: env override, then docs tree, else null. */\nfunction resolvePrimaryTemplatesBaseDir(): string | null {\n const envPath = process.env.XOPC_TEMPLATE_PATH?.trim();\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n return resolveDocsTemplatesDirFromWalk();\n}\n\nfunction readTemplate(name: string): string | null {\n const primary = resolvePrimaryTemplatesBaseDir();\n if (primary) {\n const p = join(primary, name);\n if (existsSync(p)) {\n return readFileSync(p, 'utf-8');\n }\n }\n const bundled = join(resolveBundledTemplatesDir(), name);\n if (existsSync(bundled)) {\n return readFileSync(bundled, 'utf-8');\n }\n return null;\n}\n\nfunction writeFileIfMissing(targetPath: string, content: string): boolean {\n if (existsSync(targetPath)) {\n return false;\n }\n writeFileSync(targetPath, content, 'utf-8');\n return true;\n}\n\nfunction personalizeIdentityTemplate(content: string, displayName?: string): string {\n const n = displayName?.trim();\n if (!n || !content.includes(IDENTITY_NAME_PLACEHOLDER)) {\n return content;\n }\n return content.replaceAll(IDENTITY_NAME_PLACEHOLDER, n);\n}\n\n/**\n * Seed profile Markdown into `profileDir` (`agents/<id>/profile/`).\n * When `markdownWorkspaceDir` is set, runs `git init` on a brand-new Markdown workspace only (never under `profile/`).\n * Does not overwrite existing files.\n */\nexport function seedAgentProfileMarkdownFiles(\n profileDir: string,\n markdownWorkspaceDir: string,\n options?: SeedWorkspaceProfileMarkdownOptions,\n): void {\n const wsPreExisted = existsSync(markdownWorkspaceDir);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(markdownWorkspaceDir, { recursive: true });\n\n const isBrandNewWorkspace = !wsPreExisted;\n\n let seeded = 0;\n for (const name of SEED_FILENAMES) {\n const targetPath = join(profileDir, name);\n const tpl = readTemplate(name);\n if (!tpl) {\n log.warn({ name }, 'Missing workspace template file; skip seeding');\n continue;\n }\n const body =\n name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl;\n if (writeFileIfMissing(targetPath, body)) {\n seeded++;\n }\n }\n\n if (seeded > 0) {\n log.info({ profileDir, seeded }, 'Seeded profile Markdown files');\n }\n\n ensureGitRepo(markdownWorkspaceDir, isBrandNewWorkspace);\n}\n\n/** Attempt `git init` on a brand-new Markdown workspace; silently skip on failure. */\nfunction ensureGitRepo(markdownWorkspaceDir: string, isBrandNew: boolean): void {\n if (!isBrandNew) {\n return;\n }\n if (existsSync(join(markdownWorkspaceDir, '.git'))) {\n return;\n }\n try {\n execFileSync('git', ['init'], { cwd: markdownWorkspaceDir, stdio: 'ignore', timeout: 5_000 });\n log.info({ markdownWorkspaceDir }, 'Initialized git repo in Markdown workspace');\n } catch {\n log.debug({ markdownWorkspaceDir }, 'git init skipped (git not available or failed)');\n }\n}\n\n/**\n * Ensure default (`main`) agent has reference profile Markdown templates (missing files only).\n */\nexport function seedMainAgentProfileMarkdown(cfg: Config): void {\n seedAgentProfileMarkdownFiles(\n resolveAgentProfileDir(cfg, DEFAULT_AGENT_ID),\n resolveAgentWorkspaceDir(cfg, DEFAULT_AGENT_ID),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;kBAWuG;YAC/C;aAEH;AAErD,MAAM,MAAM,aAAa,gBAAgB;;AAGzC,MAAa,4BAA4B;;AAQzC,MAAM,iBAAoC,CAAC,GAAG,qCAAqC,gBAAgB,UAAU;AAE7G,MAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAEzD,SAAS,6BAAqC;AAC5C,QAAO,KAAK,WAAW,sBAAsB;;;AAI/C,SAAS,kCAAiD;CACxD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,YAAY,KAAK,KAAK,QAAQ,aAAa,YAAY;AAC7D,MAAI,WAAW,UAAU,CACvB,QAAO;EAET,MAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,IAAK;AACpB,QAAM;;AAER,QAAO;;;AAIT,SAAS,iCAAgD;CACvD,MAAM,UAAU,QAAQ,IAAI,oBAAoB,MAAM;AACtD,KAAI,WAAW,WAAW,QAAQ,CAChC,QAAO;AAET,QAAO,iCAAiC;;AAG1C,SAAS,aAAa,MAA6B;CACjD,MAAM,UAAU,gCAAgC;AAChD,KAAI,SAAS;EACX,MAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,MAAI,WAAW,EAAE,CACf,QAAO,aAAa,GAAG,QAAQ;;CAGnC,MAAM,UAAU,KAAK,4BAA4B,EAAE,KAAK;AACxD,KAAI,WAAW,QAAQ,CACrB,QAAO,aAAa,SAAS,QAAQ;AAEvC,QAAO;;AAGT,SAAS,mBAAmB,YAAoB,SAA0B;AACxE,KAAI,WAAW,WAAW,CACxB,QAAO;AAET,eAAc,YAAY,SAAS,QAAQ;AAC3C,QAAO;;AAGT,SAAS,4BAA4B,SAAiB,aAA8B;CAClF,MAAM,IAAI,aAAa,MAAM;AAC7B,KAAI,CAAC,KAAK,CAAC,QAAQ,SAAA,8BAAmC,CACpD,QAAO;AAET,QAAO,QAAQ,WAAW,2BAA2B,EAAE;;;;;;;AAQzD,SAAgB,8BACd,YACA,sBACA,SACM;CACN,MAAM,eAAe,WAAW,qBAAqB;AACrD,WAAU,YAAY,EAAE,WAAW,MAAM,CAAC;AAC1C,WAAU,sBAAsB,EAAE,WAAW,MAAM,CAAC;CAEpD,MAAM,sBAAsB,CAAC;CAE7B,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,aAAa,KAAK,YAAY,KAAK;EACzC,MAAM,MAAM,aAAa,KAAK;AAC9B,MAAI,CAAC,KAAK;AACR,OAAI,KAAK,EAAE,MAAM,EAAE,gDAAgD;AACnE;;AAIF,MAAI,mBAAmB,YADrB,SAAS,gBAAgB,WAAW,4BAA4B,KAAK,SAAS,YAAY,GAAG,IACvD,CACtC;;AAIJ,KAAI,SAAS,EACX,KAAI,KAAK;EAAE;EAAY;EAAQ,EAAE,gCAAgC;AAGnE,eAAc,sBAAsB,oBAAoB;;;AAI1D,SAAS,cAAc,sBAA8B,YAA2B;AAC9E,KAAI,CAAC,WACH;AAEF,KAAI,WAAW,KAAK,sBAAsB,OAAO,CAAC,CAChD;AAEF,KAAI;AACF,eAAa,OAAO,CAAC,OAAO,EAAE;GAAE,KAAK;GAAsB,OAAO;GAAU,SAAS;GAAO,CAAC;AAC7F,MAAI,KAAK,EAAE,sBAAsB,EAAE,6CAA6C;SAC1E;AACN,MAAI,MAAM,EAAE,sBAAsB,EAAE,iDAAiD;;;;;;AAOzF,SAAgB,6BAA6B,KAAmB;AAC9D,+BACE,uBAAuB,KAAK,iBAAiB,EAC7C,yBAAyB,KAAK,iBAAiB,CAChD"}
1
+ {"version":3,"file":"workspace-seed.js","names":[],"sources":["../../../../src/agent/context/workspace-seed.ts"],"sourcesContent":["/**\n * Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).\n * Resolution order per file: `XOPC_TEMPLATE_PATH` or repo `docs/reference/templates`, then bundled `./workspace-templates/`.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { Config } from '../../config/schema.js';\nimport {\n resolveAgentProfileDir,\n resolveAgentWorkspaceDir,\n resolveDefaultAgentId,\n} from '../agent-scope.js';\nimport { WORKSPACE_FILES } from '../../config/paths.js';\nimport { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from './workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('WorkspaceSeed');\n\n/** Marker in bundled/reference `IDENTITY.md` templates; replaced on agent creation when a display name is known. */\nexport const IDENTITY_NAME_PLACEHOLDER = '_(pick something you like)_';\n\nexport type SeedWorkspaceProfileMarkdownOptions = {\n /** Fills the **Name** line in `IDENTITY.md` when the template still contains the placeholder. */\n displayName?: string;\n};\n\nconst SEED_FILENAMES: readonly string[] = [...AGENT_PROFILE_MARKDOWN_SYSTEM_FILES];\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction resolveBundledTemplatesDir(): string {\n return join(__dirname, 'workspace-templates');\n}\n\n/** Walk ancestors for `docs/reference/templates` (dev checkout or local install with docs). */\nfunction resolveDocsTemplatesDirFromWalk(): string | null {\n let dir = __dirname;\n for (let i = 0; i < 12; i++) {\n const candidate = join(dir, 'docs', 'reference', 'templates');\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Same convention as CLI `templates.ts`: env override, then docs tree, else null. */\nfunction resolvePrimaryTemplatesBaseDir(): string | null {\n const envPath = process.env.XOPC_TEMPLATE_PATH?.trim();\n if (envPath && existsSync(envPath)) {\n return envPath;\n }\n return resolveDocsTemplatesDirFromWalk();\n}\n\nfunction readTemplate(name: string): string | null {\n const primary = resolvePrimaryTemplatesBaseDir();\n if (primary) {\n const p = join(primary, name);\n if (existsSync(p)) {\n return readFileSync(p, 'utf-8');\n }\n }\n const bundled = join(resolveBundledTemplatesDir(), name);\n if (existsSync(bundled)) {\n return readFileSync(bundled, 'utf-8');\n }\n return null;\n}\n\nfunction writeFileIfMissing(targetPath: string, content: string): boolean {\n if (existsSync(targetPath)) {\n return false;\n }\n writeFileSync(targetPath, content, 'utf-8');\n return true;\n}\n\nfunction personalizeIdentityTemplate(content: string, displayName?: string): string {\n const n = displayName?.trim();\n if (!n || !content.includes(IDENTITY_NAME_PLACEHOLDER)) {\n return content;\n }\n return content.replaceAll(IDENTITY_NAME_PLACEHOLDER, n);\n}\n\n/**\n * Seed profile Markdown into `profileDir` (`agents/<id>/profile/`).\n * When `markdownWorkspaceDir` is set, runs `git init` on a brand-new Markdown workspace only (never under `profile/`).\n * Does not overwrite existing files.\n */\nexport function seedAgentProfileMarkdownFiles(\n profileDir: string,\n markdownWorkspaceDir: string,\n options?: SeedWorkspaceProfileMarkdownOptions,\n): void {\n const wsPreExisted = existsSync(markdownWorkspaceDir);\n mkdirSync(profileDir, { recursive: true });\n mkdirSync(markdownWorkspaceDir, { recursive: true });\n\n const isBrandNewWorkspace = !wsPreExisted;\n\n let seeded = 0;\n for (const name of SEED_FILENAMES) {\n const targetPath = join(profileDir, name);\n const tpl = readTemplate(name);\n if (!tpl) {\n log.warn({ name }, 'Missing workspace template file; skip seeding');\n continue;\n }\n const body =\n name === WORKSPACE_FILES.IDENTITY ? personalizeIdentityTemplate(tpl, options?.displayName) : tpl;\n if (writeFileIfMissing(targetPath, body)) {\n seeded++;\n }\n }\n\n if (seeded > 0) {\n log.info({ profileDir, seeded }, 'Seeded profile Markdown files');\n }\n\n ensureGitRepo(markdownWorkspaceDir, isBrandNewWorkspace);\n}\n\n/** Attempt `git init` on a brand-new Markdown workspace; silently skip on failure. */\nfunction ensureGitRepo(markdownWorkspaceDir: string, isBrandNew: boolean): void {\n if (!isBrandNew) {\n return;\n }\n if (existsSync(join(markdownWorkspaceDir, '.git'))) {\n return;\n }\n try {\n execFileSync('git', ['init'], { cwd: markdownWorkspaceDir, stdio: 'ignore', timeout: 5_000 });\n log.info({ markdownWorkspaceDir }, 'Initialized git repo in Markdown workspace');\n } catch {\n log.debug({ markdownWorkspaceDir }, 'git init skipped (git not available or failed)');\n }\n}\n\n/**\n * Ensure default (`main`) agent has reference profile Markdown templates (missing files only).\n */\nexport function seedMainAgentProfileMarkdown(cfg: Config): void {\n const agentId = resolveDefaultAgentId(cfg);\n seedAgentProfileMarkdownFiles(\n resolveAgentProfileDir(cfg, agentId),\n resolveAgentWorkspaceDir(cfg, agentId),\n { displayName: agentId },\n );\n}\n"],"mappings":";;;;;;;;;;;;;;kBAe2B;YAC6B;aAEH;AAErD,MAAM,MAAM,aAAa,gBAAgB;;AAGzC,MAAa,4BAA4B;AAOzC,MAAM,iBAAoC,CAAC,GAAG,oCAAoC;AAElF,MAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAEzD,SAAS,6BAAqC;AAC5C,QAAO,KAAK,WAAW,sBAAsB;;;AAI/C,SAAS,kCAAiD;CACxD,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK;EAC3B,MAAM,YAAY,KAAK,KAAK,QAAQ,aAAa,YAAY;AAC7D,MAAI,WAAW,UAAU,CACvB,QAAO;EAET,MAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,IAAK;AACpB,QAAM;;AAER,QAAO;;;AAIT,SAAS,iCAAgD;CACvD,MAAM,UAAU,QAAQ,IAAI,oBAAoB,MAAM;AACtD,KAAI,WAAW,WAAW,QAAQ,CAChC,QAAO;AAET,QAAO,iCAAiC;;AAG1C,SAAS,aAAa,MAA6B;CACjD,MAAM,UAAU,gCAAgC;AAChD,KAAI,SAAS;EACX,MAAM,IAAI,KAAK,SAAS,KAAK;AAC7B,MAAI,WAAW,EAAE,CACf,QAAO,aAAa,GAAG,QAAQ;;CAGnC,MAAM,UAAU,KAAK,4BAA4B,EAAE,KAAK;AACxD,KAAI,WAAW,QAAQ,CACrB,QAAO,aAAa,SAAS,QAAQ;AAEvC,QAAO;;AAGT,SAAS,mBAAmB,YAAoB,SAA0B;AACxE,KAAI,WAAW,WAAW,CACxB,QAAO;AAET,eAAc,YAAY,SAAS,QAAQ;AAC3C,QAAO;;AAGT,SAAS,4BAA4B,SAAiB,aAA8B;CAClF,MAAM,IAAI,aAAa,MAAM;AAC7B,KAAI,CAAC,KAAK,CAAC,QAAQ,SAAA,8BAAmC,CACpD,QAAO;AAET,QAAO,QAAQ,WAAW,2BAA2B,EAAE;;;;;;;AAQzD,SAAgB,8BACd,YACA,sBACA,SACM;CACN,MAAM,eAAe,WAAW,qBAAqB;AACrD,WAAU,YAAY,EAAE,WAAW,MAAM,CAAC;AAC1C,WAAU,sBAAsB,EAAE,WAAW,MAAM,CAAC;CAEpD,MAAM,sBAAsB,CAAC;CAE7B,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,aAAa,KAAK,YAAY,KAAK;EACzC,MAAM,MAAM,aAAa,KAAK;AAC9B,MAAI,CAAC,KAAK;AACR,OAAI,KAAK,EAAE,MAAM,EAAE,gDAAgD;AACnE;;AAIF,MAAI,mBAAmB,YADrB,SAAS,gBAAgB,WAAW,4BAA4B,KAAK,SAAS,YAAY,GAAG,IACvD,CACtC;;AAIJ,KAAI,SAAS,EACX,KAAI,KAAK;EAAE;EAAY;EAAQ,EAAE,gCAAgC;AAGnE,eAAc,sBAAsB,oBAAoB;;;AAI1D,SAAS,cAAc,sBAA8B,YAA2B;AAC9E,KAAI,CAAC,WACH;AAEF,KAAI,WAAW,KAAK,sBAAsB,OAAO,CAAC,CAChD;AAEF,KAAI;AACF,eAAa,OAAO,CAAC,OAAO,EAAE;GAAE,KAAK;GAAsB,OAAO;GAAU,SAAS;GAAO,CAAC;AAC7F,MAAI,KAAK,EAAE,sBAAsB,EAAE,6CAA6C;SAC1E;AACN,MAAI,MAAM,EAAE,sBAAsB,EAAE,iDAAiD;;;;;;AAOzF,SAAgB,6BAA6B,KAAmB;CAC9D,MAAM,UAAU,sBAAsB,IAAI;AAC1C,+BACE,uBAAuB,KAAK,QAAQ,EACpC,yBAAyB,KAAK,QAAQ,EACtC,EAAE,aAAa,SAAS,CACzB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Workspace setup metadata in `<markdownWorkspace>/.xopc/workspace.json`
3
+ * (same path as `resolveWorkspaceStatePath` / `xopc init`).
4
+ */
5
+ import type { Config } from '../../config/schema.js';
6
+ import { resolveWorkspaceStatePath } from '../../config/paths.js';
7
+ export { resolveWorkspaceStatePath };
8
+ export interface WorkspaceSetupState {
9
+ version: number;
10
+ /** Set by `xopc init` for the agent id owning this workspace. */
11
+ agentId?: string;
12
+ /** ISO timestamp when profile Markdown was first seeded (init / agents add). */
13
+ profileMarkdownSeededAt?: string;
14
+ }
15
+ /** Resolve workspace state path when only the Markdown workspace root is known. */
16
+ export declare function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir: string): string;
17
+ /** Resolve workspace state path from config + agent id. */
18
+ export declare function resolveAgentWorkspaceStatePath(config: Config, agentId: string): string;
19
+ /** Record profile Markdown seed time (idempotent). */
20
+ export declare function markProfileMarkdownSeeded(statePath: string): void;
@@ -0,0 +1,57 @@
1
+ import { FILENAMES, init_paths, resolveWorkspaceStatePath } from "../../config/paths.js";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ //#region src/agent/context/workspace-state.ts
5
+ /**
6
+ * Workspace setup metadata in `<markdownWorkspace>/.xopc/workspace.json`
7
+ * (same path as `resolveWorkspaceStatePath` / `xopc init`).
8
+ */
9
+ init_paths();
10
+ const WORKSPACE_STATE_VERSION = 1;
11
+ function parseWorkspaceState(raw) {
12
+ try {
13
+ const parsed = JSON.parse(raw);
14
+ if (!parsed || typeof parsed !== "object") return null;
15
+ return {
16
+ version: WORKSPACE_STATE_VERSION,
17
+ agentId: typeof parsed.agentId === "string" ? parsed.agentId : void 0,
18
+ profileMarkdownSeededAt: typeof parsed.profileMarkdownSeededAt === "string" ? parsed.profileMarkdownSeededAt : void 0
19
+ };
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ function readWorkspaceState(statePath) {
25
+ try {
26
+ return parseWorkspaceState(readFileSync(statePath, "utf-8")) ?? { version: WORKSPACE_STATE_VERSION };
27
+ } catch (err) {
28
+ if (err.code !== "ENOENT") throw err;
29
+ return { version: WORKSPACE_STATE_VERSION };
30
+ }
31
+ }
32
+ function writeWorkspaceState(statePath, patch) {
33
+ const merged = {
34
+ ...readWorkspaceState(statePath),
35
+ ...patch,
36
+ version: WORKSPACE_STATE_VERSION
37
+ };
38
+ mkdirSync(dirname(statePath), { recursive: true });
39
+ writeFileSync(statePath, `${JSON.stringify(merged, null, 2)}\n`, "utf-8");
40
+ }
41
+ /** Resolve workspace state path when only the Markdown workspace root is known. */
42
+ function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir) {
43
+ return join(markdownWorkspaceDir, ".xopc", FILENAMES.WORKSPACE_STATE);
44
+ }
45
+ /** Resolve workspace state path from config + agent id. */
46
+ function resolveAgentWorkspaceStatePath(config, agentId) {
47
+ return resolveWorkspaceStatePath(config, agentId);
48
+ }
49
+ /** Record profile Markdown seed time (idempotent). */
50
+ function markProfileMarkdownSeeded(statePath) {
51
+ if (readWorkspaceState(statePath).profileMarkdownSeededAt) return;
52
+ writeWorkspaceState(statePath, { profileMarkdownSeededAt: (/* @__PURE__ */ new Date()).toISOString() });
53
+ }
54
+ //#endregion
55
+ export { markProfileMarkdownSeeded, resolveAgentWorkspaceStatePath, resolveWorkspaceStatePath, resolveWorkspaceStatePathForMarkdownWorkspace };
56
+
57
+ //# sourceMappingURL=workspace-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-state.js","names":[],"sources":["../../../../src/agent/context/workspace-state.ts"],"sourcesContent":["/**\n * Workspace setup metadata in `<markdownWorkspace>/.xopc/workspace.json`\n * (same path as `resolveWorkspaceStatePath` / `xopc init`).\n */\n\nimport { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { FILENAMES, resolveWorkspaceStatePath } from '../../config/paths.js';\n\nexport { resolveWorkspaceStatePath };\n\nconst WORKSPACE_STATE_VERSION = 1;\n\nexport interface WorkspaceSetupState {\n version: number;\n /** Set by `xopc init` for the agent id owning this workspace. */\n agentId?: string;\n /** ISO timestamp when profile Markdown was first seeded (init / agents add). */\n profileMarkdownSeededAt?: string;\n}\n\nfunction parseWorkspaceState(raw: string): WorkspaceSetupState | null {\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (!parsed || typeof parsed !== 'object') {\n return null;\n }\n return {\n version: WORKSPACE_STATE_VERSION,\n agentId: typeof parsed.agentId === 'string' ? parsed.agentId : undefined,\n profileMarkdownSeededAt:\n typeof parsed.profileMarkdownSeededAt === 'string' ? parsed.profileMarkdownSeededAt : undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction readWorkspaceState(statePath: string): WorkspaceSetupState {\n try {\n const raw = readFileSync(statePath, 'utf-8');\n return parseWorkspaceState(raw) ?? { version: WORKSPACE_STATE_VERSION };\n } catch (err: unknown) {\n const code = (err as { code?: string }).code;\n if (code !== 'ENOENT') {\n throw err;\n }\n return { version: WORKSPACE_STATE_VERSION };\n }\n}\n\nfunction writeWorkspaceState(statePath: string, patch: Partial<WorkspaceSetupState>): void {\n const merged = { ...readWorkspaceState(statePath), ...patch, version: WORKSPACE_STATE_VERSION };\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, `${JSON.stringify(merged, null, 2)}\\n`, 'utf-8');\n}\n\n/** Resolve workspace state path when only the Markdown workspace root is known. */\nexport function resolveWorkspaceStatePathForMarkdownWorkspace(markdownWorkspaceDir: string): string {\n return join(markdownWorkspaceDir, '.xopc', FILENAMES.WORKSPACE_STATE);\n}\n\n/** Resolve workspace state path from config + agent id. */\nexport function resolveAgentWorkspaceStatePath(config: Config, agentId: string): string {\n return resolveWorkspaceStatePath(config, agentId);\n}\n\n/** Record profile Markdown seed time (idempotent). */\nexport function markProfileMarkdownSeeded(statePath: string): void {\n const state = readWorkspaceState(statePath);\n if (state.profileMarkdownSeededAt) {\n return;\n }\n writeWorkspaceState(statePath, { profileMarkdownSeededAt: new Date().toISOString() });\n}\n"],"mappings":";;;;;;;;YAS6E;AAI7E,MAAM,0BAA0B;AAUhC,SAAS,oBAAoB,KAAyC;AACpE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;AAET,SAAO;GACL,SAAS;GACT,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;GAC/D,yBACE,OAAO,OAAO,4BAA4B,WAAW,OAAO,0BAA0B,KAAA;GACzF;SACK;AACN,SAAO;;;AAIX,SAAS,mBAAmB,WAAwC;AAClE,KAAI;AAEF,SAAO,oBADK,aAAa,WAAW,QACN,CAAC,IAAI,EAAE,SAAS,yBAAyB;UAChE,KAAc;AAErB,MADc,IAA0B,SAC3B,SACX,OAAM;AAER,SAAO,EAAE,SAAS,yBAAyB;;;AAI/C,SAAS,oBAAoB,WAAmB,OAA2C;CACzF,MAAM,SAAS;EAAE,GAAG,mBAAmB,UAAU;EAAE,GAAG;EAAO,SAAS;EAAyB;AAC/F,WAAU,QAAQ,UAAU,EAAE,EAAE,WAAW,MAAM,CAAC;AAClD,eAAc,WAAW,GAAG,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC,KAAK,QAAQ;;;AAI3E,SAAgB,8CAA8C,sBAAsC;AAClG,QAAO,KAAK,sBAAsB,SAAS,UAAU,gBAAgB;;;AAIvE,SAAgB,+BAA+B,QAAgB,SAAyB;AACtF,QAAO,0BAA0B,QAAQ,QAAQ;;;AAInD,SAAgB,0BAA0B,WAAyB;AAEjE,KADc,mBAAmB,UACxB,CAAC,wBACR;AAEF,qBAAoB,WAAW,EAAE,0CAAyB,IAAI,MAAM,EAAC,aAAa,EAAE,CAAC"}
@@ -9,10 +9,6 @@ read_when:
9
9
 
10
10
  This folder is home. Treat it that way.
11
11
 
12
- ## First Run
13
-
14
- If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
15
-
16
12
  ## Session Startup
17
13
 
18
14
  Use runtime-provided startup context first.
@@ -1,8 +1,8 @@
1
1
  export { PiTranscriptManager, CURRENT_SESSION_VERSION } from './pi-transcript.js';
2
2
  export type { SessionManager as PiTranscriptManagerType } from './pi-transcript.js';
3
3
  export { installSessionToolResultGuard, guardSessionManager, getRawSessionAppendMessage, type GuardedPiTranscriptManager, type ToolResultGuardOptions, } from './session-tool-result-guard.js';
4
- export { prepareSessionManagerForRun } from './session-manager-init.js';
5
- export { trackSessionManagerAccess, prewarmSessionFile, isSessionManagerCached, } from './session-manager-cache.js';
4
+ export { repairAssistantUsageInSessionManager } from './session-manager-init.js';
5
+ export { openSqliteHydratingSessionManager } from './sqlite-hydrating-session-manager.js';
6
6
  export { acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs, } from './session-runner.js';
7
7
  export { DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, resolveLiveToolResultMaxChars, truncateToolResultMessage, } from './tool-result-truncation.js';
8
8
  export { runXopcEmbeddedTurn, abortEmbeddedRun, queueEmbeddedSteer } from './run-turn.js';
@@ -1,10 +1,10 @@
1
1
  import { DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, resolveLiveToolResultMaxChars, truncateToolResultMessage } from "./tool-result-truncation.js";
2
2
  import { getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard } from "./session-tool-result-guard.js";
3
- import { prepareSessionManagerForRun } from "./session-manager-init.js";
4
- import { isSessionManagerCached, prewarmSessionFile, trackSessionManagerAccess } from "./session-manager-cache.js";
3
+ import { repairAssistantUsageInSessionManager } from "./session-manager-init.js";
4
+ import { openSqliteHydratingSessionManager } from "./sqlite-hydrating-session-manager.js";
5
5
  import { acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs } from "./session-runner.js";
6
6
  import { abortEmbeddedRun, getEmbeddedRunBySessionKey, queueEmbeddedSteer, registerEmbeddedRun } from "./runs.js";
7
7
  import { runXopcEmbeddedTurn } from "./run-turn.js";
8
8
  import { runEmbeddedTurnForSession } from "./run-for-session.js";
9
9
  import { CURRENT_SESSION_VERSION, PiTranscriptManager } from "./pi-transcript.js";
10
- export { CURRENT_SESSION_VERSION, DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, PiTranscriptManager, abortEmbeddedRun, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedRunBySessionKey, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard, isEmbeddedSessionRunnerEnabled, isSessionManagerCached, prepareSessionManagerForRun, prewarmSessionFile, queueEmbeddedSteer, registerEmbeddedRun, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs, resolveLiveToolResultMaxChars, runEmbeddedTurnForSession, runXopcEmbeddedTurn, trackSessionManagerAccess, truncateToolResultMessage };
10
+ export { CURRENT_SESSION_VERSION, DEFAULT_MAX_LIVE_TOOL_RESULT_CHARS, PiTranscriptManager, abortEmbeddedRun, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedRunBySessionKey, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, getRawSessionAppendMessage, guardSessionManager, installSessionToolResultGuard, isEmbeddedSessionRunnerEnabled, openSqliteHydratingSessionManager, queueEmbeddedSteer, registerEmbeddedRun, repairAssistantUsageInSessionManager, resetEmbeddedSessionRunnerForTest, resolveEmbeddedTranscriptInputs, resolveLiveToolResultMaxChars, runEmbeddedTurnForSession, runXopcEmbeddedTurn, truncateToolResultMessage };
@@ -82,9 +82,6 @@ async function runXopcEmbeddedTurn(params) {
82
82
  runner = await acquireEmbeddedSessionRunner({
83
83
  sessionKey,
84
84
  sessionId: transcript.sessionId,
85
- sessionFile: transcript.sessionFile,
86
- sessionsDir: transcript.sessionsDir,
87
- hadSessionFile: transcript.hadSessionFile,
88
85
  workspaceDir,
89
86
  model: resolvedModel,
90
87
  modelRef: params.modelRef,