@xopcai/xopc 0.0.124 → 0.0.126

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 (496) hide show
  1. package/README.md +56 -102
  2. package/README.zh-CN.md +51 -98
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  8. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +1 -1
  14. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  17. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  18. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
  19. package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
  20. package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +1 -0
  21. package/dist/gateway/static/root/assets/appearance-settings-BHlahIDL.js +1 -0
  22. package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
  23. package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-B-aoIt0w.js} +1 -1
  24. package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-BD0G0FD5.js} +1 -1
  25. package/dist/gateway/static/root/assets/automation-suggestion-card-iJRVI7aZ.js +1 -0
  26. package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
  27. package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-B0mNlVSz.js} +1 -1
  28. package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-CJY9Lu5G.js} +3 -3
  29. package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
  30. package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +1 -0
  31. package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +1 -0
  32. package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-0sauApoC.js} +1 -1
  33. package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
  34. package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
  35. package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
  37. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  38. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  39. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  40. package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +3 -0
  41. package/dist/gateway/static/root/assets/extension-debug-page-BbyczVZ3.js +1 -0
  42. package/dist/gateway/static/root/assets/extension-page-DLN1I3DR.js +1 -0
  43. package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +1 -0
  44. package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-5V96dUz3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-BtIzObwp.js} +1 -1
  46. package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +1 -0
  47. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-DEMad2wt.js} +1 -1
  48. package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +1 -0
  49. package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
  50. package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-CVN7-pdM.js} +1 -1
  51. package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +2 -0
  52. package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +1 -0
  53. package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +1 -0
  54. package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
  55. package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
  56. package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
  57. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-lKTg6St7.js +1 -0
  58. package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
  59. package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
  60. package/dist/gateway/static/root/assets/markdown-split-Bv4k6iGJ.js +1 -0
  61. package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-Bbi8g3N8.js} +1 -1
  62. package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
  63. package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
  64. package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
  66. package/dist/gateway/static/root/assets/page-tabs-Cp395RYD.js +1 -0
  67. package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
  68. package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
  69. package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
  70. package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
  71. package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-BItmzAzI.js} +1 -1
  72. package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-BQ8IjjCn.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-BRpD6x3d.js} +1 -1
  74. package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
  78. package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
  79. package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
  80. package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
  81. package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-DbYZNAPb.js} +1 -1
  82. package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
  83. package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
  84. package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
  85. package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-DKDAojWM.js} +1 -1
  86. package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-BCCV4Kkp.js} +1 -1
  87. package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-NBqg3iFY.js} +1 -1
  88. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
  89. package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-DPGVr3tS.js} +1 -1
  90. package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
  91. package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
  92. package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +1 -0
  93. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BTkRVNAh.js +3 -0
  94. package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-DAImVtdO.js} +1 -1
  95. package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
  96. package/dist/gateway/static/root/index.html +8 -7
  97. package/dist/package.js +1 -1
  98. package/dist/src/activity/context.d.ts +11 -0
  99. package/dist/src/activity/context.js +36 -0
  100. package/dist/src/activity/context.js.map +1 -0
  101. package/dist/src/activity/emitter.d.ts +6 -0
  102. package/dist/src/activity/emitter.js +43 -0
  103. package/dist/src/activity/emitter.js.map +1 -0
  104. package/dist/src/activity/index.d.ts +3 -0
  105. package/dist/src/activity/index.js +3 -0
  106. package/dist/src/activity/service.d.ts +12 -0
  107. package/dist/src/activity/service.js +59 -0
  108. package/dist/src/activity/service.js.map +1 -0
  109. package/dist/src/activity/types.d.ts +109 -0
  110. package/dist/src/activity/types.js +1 -0
  111. package/dist/src/agent/agent-manager.d.ts +7 -0
  112. package/dist/src/agent/agent-manager.js +12 -5
  113. package/dist/src/agent/agent-manager.js.map +1 -1
  114. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  115. package/dist/src/agent/child-agent-factory.js +2 -0
  116. package/dist/src/agent/child-agent-factory.js.map +1 -1
  117. package/dist/src/agent/coding/index.d.ts +1 -0
  118. package/dist/src/agent/coding/index.js +2 -0
  119. package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
  120. package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
  121. package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
  122. package/dist/src/agent/context/project-context.js +2 -2
  123. package/dist/src/agent/context/workspace-seed.js +2 -2
  124. package/dist/src/agent/embedded/run-for-session.js +1 -1
  125. package/dist/src/agent/goals/post-turn.js +2 -2
  126. package/dist/src/agent/ipc/bus.js +1 -1
  127. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
  132. package/dist/src/agent/memory/dreaming/config.js +3 -3
  133. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  134. package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
  135. package/dist/src/agent/memory/dreaming/constants.js +1 -1
  136. package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
  138. package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
  139. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  140. package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
  141. package/dist/src/agent/memory/dreaming/events.js +6 -6
  142. package/dist/src/agent/memory/dreaming/events.js.map +1 -1
  143. package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
  144. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  145. package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
  146. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
  147. package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
  148. package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
  149. package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
  150. package/dist/src/agent/memory/dreaming/preview.js +2 -2
  151. package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
  152. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
  153. package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
  155. package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
  156. package/dist/src/agent/memory/dreaming/scope.js +27 -0
  157. package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
  158. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
  159. package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
  160. package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
  161. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
  164. package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
  165. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  166. package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
  167. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  168. package/dist/src/agent/sandbox/command-validator.js +12 -0
  169. package/dist/src/agent/sandbox/command-validator.js.map +1 -1
  170. package/dist/src/agent/service.d.ts +2 -1
  171. package/dist/src/agent/service.js +24 -9
  172. package/dist/src/agent/service.js.map +1 -1
  173. package/dist/src/agent/service.types.d.ts +7 -0
  174. package/dist/src/agent/session/session-inspector.d.ts +5 -3
  175. package/dist/src/agent/session/session-inspector.js +17 -8
  176. package/dist/src/agent/session/session-inspector.js.map +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +1 -1
  178. package/dist/src/agent/source-context/types.d.ts +1 -1
  179. package/dist/src/agent/source-context/types.js +1 -1
  180. package/dist/src/agent/source-context/types.js.map +1 -1
  181. package/dist/src/agent/tool-manuals/index.js +15 -6
  182. package/dist/src/agent/tool-manuals/index.js.map +1 -1
  183. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
  184. package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
  185. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
  186. package/dist/src/agent/tools/apply-patch.js +116 -62
  187. package/dist/src/agent/tools/apply-patch.js.map +1 -1
  188. package/dist/src/agent/tools/concurrency.d.ts +8 -0
  189. package/dist/src/agent/tools/concurrency.js +31 -0
  190. package/dist/src/agent/tools/concurrency.js.map +1 -0
  191. package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
  192. package/dist/src/agent/tools/dreaming-tool.js +13 -10
  193. package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
  194. package/dist/src/agent/tools/exec-command.js +4 -0
  195. package/dist/src/agent/tools/exec-command.js.map +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +6 -4
  197. package/dist/src/agent/tools/executor.js +7 -4
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +10 -0
  200. package/dist/src/agent/tools/factory.js +16 -1
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/find.js +2 -0
  203. package/dist/src/agent/tools/find.js.map +1 -1
  204. package/dist/src/agent/tools/goal-tool.js +2 -2
  205. package/dist/src/agent/tools/grep.js +2 -0
  206. package/dist/src/agent/tools/grep.js.map +1 -1
  207. package/dist/src/agent/tools/index.d.ts +3 -0
  208. package/dist/src/agent/tools/index.js +4 -1
  209. package/dist/src/agent/tools/list-dir.js +2 -0
  210. package/dist/src/agent/tools/list-dir.js.map +1 -1
  211. package/dist/src/agent/tools/memory-tool.d.ts +1 -0
  212. package/dist/src/agent/tools/memory-tool.js +2 -2
  213. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  214. package/dist/src/agent/tools/metadata.d.ts +15 -0
  215. package/dist/src/agent/tools/metadata.js +26 -0
  216. package/dist/src/agent/tools/metadata.js.map +1 -0
  217. package/dist/src/agent/tools/read.js +2 -0
  218. package/dist/src/agent/tools/read.js.map +1 -1
  219. package/dist/src/agent/tools/workflow-tool.js +1 -1
  220. package/dist/src/agent/tools/write.js +6 -0
  221. package/dist/src/agent/tools/write.js.map +1 -1
  222. package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
  223. package/dist/src/agent/tools/xopc-use-tool.js +636 -0
  224. package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
  225. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  226. package/dist/src/agent/workflow/subagent-runner.js +5 -1
  227. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  228. package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
  229. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  230. package/dist/src/agent-manifest/schema.d.ts +27 -27
  231. package/dist/src/automations/api/routes.js +1 -1
  232. package/dist/src/automations/domain/validation.d.ts +55 -55
  233. package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
  234. package/dist/src/automations/service/action-executor.js +2 -2
  235. package/dist/src/browser/cdp-local-launcher.js +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  237. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/chat-commands/agent-edit.js +1 -1
  241. package/dist/src/chat-commands/builtins/config.js +1 -1
  242. package/dist/src/chat-commands/builtins/goal.js +2 -2
  243. package/dist/src/chat-commands/context.js +1 -1
  244. package/dist/src/cli/commands/agent.js +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  247. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  248. package/dist/src/cli/commands/extension-pack.js +1 -1
  249. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  250. package/dist/src/cli/commands/goal.js +3 -3
  251. package/dist/src/cli/commands/init.js +1 -1
  252. package/dist/src/cli/commands/project.js +4 -4
  253. package/dist/src/config/agent-profile.js +1 -1
  254. package/dist/src/config/gateway-bind.js +1 -1
  255. package/dist/src/config/index.js +1 -1
  256. package/dist/src/config/loader.js +1 -1
  257. package/dist/src/config/models-json.d.ts +14 -14
  258. package/dist/src/config/models-json.js +1 -1
  259. package/dist/src/config/schema.d.ts +60 -60
  260. package/dist/src/connectors/health.d.ts +2 -1
  261. package/dist/src/connectors/health.js +59 -1
  262. package/dist/src/connectors/health.js.map +1 -1
  263. package/dist/src/connectors/install.d.ts +1 -0
  264. package/dist/src/connectors/install.js +28 -1
  265. package/dist/src/connectors/install.js.map +1 -1
  266. package/dist/src/connectors/instances.js +7 -0
  267. package/dist/src/connectors/instances.js.map +1 -1
  268. package/dist/src/connectors/materialize.js +2 -1
  269. package/dist/src/connectors/materialize.js.map +1 -1
  270. package/dist/src/connectors/registries/modelscope.js +38 -13
  271. package/dist/src/connectors/registries/modelscope.js.map +1 -1
  272. package/dist/src/connectors/types.d.ts +2 -0
  273. package/dist/src/daemon/launchd.js +1 -1
  274. package/dist/src/daemon/systemd.js +1 -1
  275. package/dist/src/extensions/discover-extensions.js +1 -1
  276. package/dist/src/extensions/loader.js +2 -2
  277. package/dist/src/gateway/agents-admin.js +1 -1
  278. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
  279. package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
  280. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  281. package/dist/src/gateway/hono/app.js +7 -1
  282. package/dist/src/gateway/hono/app.js.map +1 -1
  283. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
  284. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  285. package/dist/src/gateway/hono/middleware/log-context.js +8 -1
  286. package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
  287. package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
  288. package/dist/src/gateway/hono/routes/activity.js +72 -0
  289. package/dist/src/gateway/hono/routes/activity.js.map +1 -0
  290. package/dist/src/gateway/hono/routes/connectors.js +46 -2
  291. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  292. package/dist/src/gateway/hono/routes/dreaming.js +111 -66
  293. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/goals.js +1 -1
  295. package/dist/src/gateway/hono/routes/index.js +2 -0
  296. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  297. package/dist/src/gateway/hono/routes/memory.js +2 -2
  298. package/dist/src/gateway/hono/routes/projects.js +903 -50
  299. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  300. package/dist/src/gateway/hono/routes/sessions.js +102 -2
  301. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  302. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  303. package/dist/src/gateway/lock.js +1 -1
  304. package/dist/src/gateway/ports.js +1 -1
  305. package/dist/src/gateway/service/sessions-api.d.ts +10 -0
  306. package/dist/src/gateway/service/sessions-api.js +31 -0
  307. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  308. package/dist/src/gateway/service.js +28 -16
  309. package/dist/src/gateway/service.js.map +1 -1
  310. package/dist/src/goals/goal-store.js +1 -1
  311. package/dist/src/goals/goal-store.js.map +1 -1
  312. package/dist/src/goals/goal-workflow-judge.js +1 -1
  313. package/dist/src/infra/ports.js +1 -1
  314. package/dist/src/infra/ssh-tunnel.js +1 -1
  315. package/dist/src/infra/update-check.js +1 -1
  316. package/dist/src/infra/update-restart.js +1 -1
  317. package/dist/src/mcp/channel-bridge.js +1 -1
  318. package/dist/src/media/store.js +1 -1
  319. package/dist/src/media/store.js.map +1 -1
  320. package/dist/src/media/types.d.ts +1 -1
  321. package/dist/src/media/uri.js +2 -1
  322. package/dist/src/media/uri.js.map +1 -1
  323. package/dist/src/migrations/runner.js +1 -1
  324. package/dist/src/notes/service.js +65 -6
  325. package/dist/src/notes/service.js.map +1 -1
  326. package/dist/src/notes/store.js +1 -1
  327. package/dist/src/projects/project-service.d.ts +2 -1
  328. package/dist/src/projects/project-service.js +59 -2
  329. package/dist/src/projects/project-service.js.map +1 -1
  330. package/dist/src/projects/project-store.d.ts +2 -1
  331. package/dist/src/projects/project-store.js +43 -0
  332. package/dist/src/projects/project-store.js.map +1 -1
  333. package/dist/src/projects/types.d.ts +10 -0
  334. package/dist/src/projects/workspace.js +1 -1
  335. package/dist/src/routing/agent-session-key.js +1 -1
  336. package/dist/src/routing/resolve-route.js +1 -1
  337. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  338. package/dist/src/session/client-history.d.ts +3 -0
  339. package/dist/src/session/client-history.js +24 -9
  340. package/dist/src/session/client-history.js.map +1 -1
  341. package/dist/src/session/init-session-turn.js +1 -1
  342. package/dist/src/session/resolve-session.js +1 -1
  343. package/dist/src/session/session-context-for-llm.d.ts +2 -0
  344. package/dist/src/session/session-context-for-llm.js +14 -1
  345. package/dist/src/session/session-context-for-llm.js.map +1 -1
  346. package/dist/src/session/session-title.js +2 -2
  347. package/dist/src/session/store.js +3 -3
  348. package/dist/src/session/store.js.map +1 -1
  349. package/dist/src/session/types.d.ts +4 -0
  350. package/dist/src/session/types.js.map +1 -1
  351. package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
  352. package/dist/src/storage/sqlite/activity-repository.js +208 -0
  353. package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
  354. package/dist/src/storage/sqlite/connection.js +1 -1
  355. package/dist/src/storage/sqlite/index.d.ts +1 -0
  356. package/dist/src/storage/sqlite/index.js +2 -1
  357. package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
  358. package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
  359. package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
  360. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  361. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  362. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  363. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  364. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  365. package/dist/src/storage/sqlite/schema.js +1 -1
  366. package/dist/src/storage/sqlite/schema.sql +141 -0
  367. package/dist/src/storage/sqlite/session-repository.js +11 -0
  368. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  369. package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
  370. package/dist/src/tui/backends/embedded-backend.js +76 -7
  371. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  372. package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
  373. package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
  374. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  375. package/dist/src/tui/chat-history.js +16 -3
  376. package/dist/src/tui/chat-history.js.map +1 -1
  377. package/dist/src/tui/clipboard-image.js +1 -1
  378. package/dist/src/tui/components/assistant-message.js +12 -2
  379. package/dist/src/tui/components/assistant-message.js.map +1 -1
  380. package/dist/src/tui/components/chat-log.d.ts +23 -3
  381. package/dist/src/tui/components/chat-log.js +68 -9
  382. package/dist/src/tui/components/chat-log.js.map +1 -1
  383. package/dist/src/tui/components/tool-execution.d.ts +8 -0
  384. package/dist/src/tui/components/tool-execution.js +87 -77
  385. package/dist/src/tui/components/tool-execution.js.map +1 -1
  386. package/dist/src/tui/components/tui-bottom-bar.js +9 -5
  387. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  388. package/dist/src/tui/components/visual-truncate.d.ts +1 -0
  389. package/dist/src/tui/components/visual-truncate.js +28 -1
  390. package/dist/src/tui/components/visual-truncate.js.map +1 -1
  391. package/dist/src/tui/tool-summary.d.ts +22 -0
  392. package/dist/src/tui/tool-summary.js +212 -0
  393. package/dist/src/tui/tool-summary.js.map +1 -0
  394. package/dist/src/tui/tui-backend.d.ts +16 -0
  395. package/dist/src/tui/tui-command-formatters.js +2 -2
  396. package/dist/src/tui/tui-commands.d.ts +9 -0
  397. package/dist/src/tui/tui-commands.js +95 -6
  398. package/dist/src/tui/tui-commands.js.map +1 -1
  399. package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
  400. package/dist/src/tui/tui-picker-overlay.js +36 -1
  401. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  402. package/dist/src/tui/tui-picker-services.d.ts +13 -0
  403. package/dist/src/tui/tui-run-state.js +11 -0
  404. package/dist/src/tui/tui-run-state.js.map +1 -1
  405. package/dist/src/tui/tui-run-status-format.d.ts +3 -0
  406. package/dist/src/tui/tui-run-status-format.js +33 -0
  407. package/dist/src/tui/tui-run-status-format.js.map +1 -0
  408. package/dist/src/tui/tui-session-actions.d.ts +5 -0
  409. package/dist/src/tui/tui-session-actions.js +24 -0
  410. package/dist/src/tui/tui-session-actions.js.map +1 -1
  411. package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
  412. package/dist/src/tui/tui-timeline-picker.js +81 -0
  413. package/dist/src/tui/tui-timeline-picker.js.map +1 -0
  414. package/dist/src/tui/tui-timeline.d.ts +15 -0
  415. package/dist/src/tui/tui-timeline.js +65 -0
  416. package/dist/src/tui/tui-timeline.js.map +1 -0
  417. package/dist/src/tui/tui-tool-diff.d.ts +15 -0
  418. package/dist/src/tui/tui-tool-diff.js +178 -7
  419. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  420. package/dist/src/tui/tui-types.d.ts +1 -0
  421. package/dist/src/tui/tui-types.js +1 -0
  422. package/dist/src/tui/tui-types.js.map +1 -1
  423. package/dist/src/tui/tui.js +31 -25
  424. package/dist/src/tui/tui.js.map +1 -1
  425. package/dist/src/utils/index.js +1 -1
  426. package/dist/src/utils/logger/index.js +1 -1
  427. package/dist/src/utils/logger/stats.d.ts +3 -3
  428. package/dist/src/utils/logger.js +1 -1
  429. package/dist/src/work-items/agent-context.d.ts +7 -0
  430. package/dist/src/work-items/agent-context.js +75 -0
  431. package/dist/src/work-items/agent-context.js.map +1 -0
  432. package/dist/src/work-items/index.d.ts +4 -0
  433. package/dist/src/work-items/index.js +4 -0
  434. package/dist/src/work-items/types.d.ts +112 -0
  435. package/dist/src/work-items/types.js +1 -0
  436. package/dist/src/work-items/work-item-service.d.ts +35 -0
  437. package/dist/src/work-items/work-item-service.js +277 -0
  438. package/dist/src/work-items/work-item-service.js.map +1 -0
  439. package/dist/src/work-items/work-item-store.d.ts +21 -0
  440. package/dist/src/work-items/work-item-store.js +302 -0
  441. package/dist/src/work-items/work-item-store.js.map +1 -0
  442. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  443. package/dist/src/workflows/service/workflow-run-service.js +4 -3
  444. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  445. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  446. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  447. package/package.json +5 -5
  448. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  449. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
  450. package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
  451. package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
  452. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
  453. package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
  454. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
  455. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
  456. package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
  457. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
  458. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
  459. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
  460. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
  461. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  462. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
  463. package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
  464. package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
  465. package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
  466. package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
  467. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
  468. package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
  469. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
  470. package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
  471. package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
  472. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
  473. package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
  474. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
  475. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
  476. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
  477. package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
  478. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
  479. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
  480. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
  481. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
  482. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
  483. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
  484. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
  485. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
  486. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
  487. package/dist/gateway/static/root/assets/settings-form-section-BnqYMWHR.js +0 -1
  488. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
  489. package/dist/gateway/static/root/assets/settings-page-layout-CdWZU1hd.js +0 -1
  490. package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
  491. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
  492. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
  493. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
  494. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
  495. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
  496. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
@@ -0,0 +1 @@
1
+ export { TurnDiffTracker, type TurnDiffState, type TurnFileChange, type TurnVerificationRecord, type WorkspaceMutationKind, } from './turn-diff-tracker.js';
@@ -0,0 +1,2 @@
1
+ import { TurnDiffTracker } from "./turn-diff-tracker.js";
2
+ export { TurnDiffTracker };
@@ -0,0 +1,67 @@
1
+ export type WorkspaceMutationKind = 'add' | 'update' | 'delete' | 'move' | 'rewrite' | 'unknown';
2
+ export interface TurnFileChange {
3
+ kind: WorkspaceMutationKind;
4
+ path: string;
5
+ moveTo?: string;
6
+ added?: number;
7
+ removed?: number;
8
+ diff?: string;
9
+ toolName: string;
10
+ at: number;
11
+ }
12
+ export interface TurnVerificationRecord {
13
+ toolName: string;
14
+ command?: string;
15
+ success: boolean;
16
+ status?: string;
17
+ exitCode?: number | null;
18
+ timedOut?: boolean;
19
+ }
20
+ export interface TurnDiffState {
21
+ sessionKey: string;
22
+ turnId: string;
23
+ changedFiles: string[];
24
+ changes: TurnFileChange[];
25
+ cumulativeDiff: string;
26
+ added: number;
27
+ removed: number;
28
+ dirty: boolean;
29
+ dirtyReason?: string;
30
+ diffReviewed: boolean;
31
+ verificationAttempted: boolean;
32
+ lastVerification?: TurnVerificationRecord;
33
+ }
34
+ export declare class TurnDiffTracker {
35
+ private readonly states;
36
+ beginTurn(sessionKey: string, turnId?: string): void;
37
+ getState(sessionKey: string): TurnDiffState;
38
+ reset(sessionKey: string): void;
39
+ recordToolResult(input: {
40
+ sessionKey: string;
41
+ toolName: string;
42
+ args?: unknown;
43
+ result?: unknown;
44
+ isError?: boolean;
45
+ }): void;
46
+ recordMutation(input: {
47
+ sessionKey: string;
48
+ toolName: string;
49
+ changes: TurnFileChange[];
50
+ }): void;
51
+ recordDiffReviewed(sessionKey: string): void;
52
+ recordVerification(input: {
53
+ sessionKey: string;
54
+ toolName: string;
55
+ command?: string;
56
+ success: boolean;
57
+ status?: string;
58
+ exitCode?: number | null;
59
+ timedOut?: boolean;
60
+ }): void;
61
+ markDirty(sessionKey: string, reason: string): void;
62
+ buildFinalGuardContext(sessionKey: string): string;
63
+ private mutableState;
64
+ private recordApplyPatch;
65
+ private recordWriteFile;
66
+ private recordExecCommand;
67
+ }
@@ -0,0 +1,233 @@
1
+ //#region src/agent/coding/turn-diff-tracker.ts
2
+ const DEFAULT_TURN_ID = "default";
3
+ function createState(sessionKey, turnId = DEFAULT_TURN_ID) {
4
+ return {
5
+ sessionKey,
6
+ turnId,
7
+ changedFiles: [],
8
+ changes: [],
9
+ cumulativeDiff: "",
10
+ added: 0,
11
+ removed: 0,
12
+ dirty: false,
13
+ diffReviewed: false,
14
+ verificationAttempted: false
15
+ };
16
+ }
17
+ function readRecord(value) {
18
+ return value && typeof value === "object" ? value : null;
19
+ }
20
+ function readDetails(result) {
21
+ return readRecord(readRecord(result)?.details);
22
+ }
23
+ function readString(value) {
24
+ return typeof value === "string" && value.trim() ? value : void 0;
25
+ }
26
+ function readNumber(value) {
27
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
28
+ }
29
+ function readExitCode(value) {
30
+ if (typeof value === "number" && Number.isFinite(value)) return value;
31
+ if (value === null) return null;
32
+ }
33
+ function readStringArray(value) {
34
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : [];
35
+ }
36
+ function uniqueSorted(values) {
37
+ return Array.from(new Set(Array.from(values).filter(Boolean))).sort();
38
+ }
39
+ function extractExecCommand(args, result) {
40
+ const argRec = readRecord(args);
41
+ const fromArgs = readString(argRec?.cmd) ?? readString(argRec?.command);
42
+ if (fromArgs) return fromArgs;
43
+ return readString(readDetails(result)?.command) ?? "";
44
+ }
45
+ function isDiffReviewCommand(command) {
46
+ return /\bgit\s+(diff|status)\b/i.test(command);
47
+ }
48
+ function isVerificationCommand(command) {
49
+ return /\b(test|vitest|jest|mocha|ava|playwright|typecheck|type-check|tsc|build|lint)\b/i.test(command);
50
+ }
51
+ function commandMayMutateWorkspace(command) {
52
+ return /\b(sed\s+-i|perl\s+-pi|rm\s+|mv\s+|cp\s+|git\s+(checkout|reset|clean|apply|merge|rebase)|writeFile|write\(|open\([^)]*['"]w['"])/i.test(command);
53
+ }
54
+ function execSuccess(isError, result) {
55
+ if (isError) return false;
56
+ const details = readDetails(result);
57
+ if (!details) return false;
58
+ if (details.timedOut === true) return false;
59
+ if (details.status === "success") return true;
60
+ return details.exitCode === 0;
61
+ }
62
+ function appendSection(lines, title, body) {
63
+ if (body.length === 0) return;
64
+ lines.push(title, ...body);
65
+ }
66
+ var TurnDiffTracker = class {
67
+ states = /* @__PURE__ */ new Map();
68
+ beginTurn(sessionKey, turnId = `${Date.now()}`) {
69
+ this.states.set(sessionKey, createState(sessionKey, turnId));
70
+ }
71
+ getState(sessionKey) {
72
+ const state = this.states.get(sessionKey) ?? createState(sessionKey);
73
+ return {
74
+ ...state,
75
+ changedFiles: [...state.changedFiles],
76
+ changes: state.changes.map((change) => ({ ...change })),
77
+ lastVerification: state.lastVerification ? { ...state.lastVerification } : void 0
78
+ };
79
+ }
80
+ reset(sessionKey) {
81
+ this.states.delete(sessionKey);
82
+ }
83
+ recordToolResult(input) {
84
+ if (input.isError) return;
85
+ const name = input.toolName.toLowerCase();
86
+ if (name === "apply_patch") {
87
+ this.recordApplyPatch(input.sessionKey, input.toolName, input.result);
88
+ return;
89
+ }
90
+ if (name === "write_file") {
91
+ this.recordWriteFile(input.sessionKey, input.toolName, input.args, input.result);
92
+ return;
93
+ }
94
+ if (name === "exec_command") this.recordExecCommand(input.sessionKey, input.toolName, input.args, input.result, input.isError);
95
+ }
96
+ recordMutation(input) {
97
+ const state = this.mutableState(input.sessionKey);
98
+ for (const change of input.changes) {
99
+ state.changes.push({
100
+ ...change,
101
+ toolName: input.toolName
102
+ });
103
+ state.added += change.added ?? 0;
104
+ state.removed += change.removed ?? 0;
105
+ if (change.diff) state.cumulativeDiff = [state.cumulativeDiff.trimEnd(), change.diff.trimEnd()].filter(Boolean).join("\n");
106
+ }
107
+ state.changedFiles = uniqueSorted([...state.changedFiles, ...input.changes.flatMap((change) => [change.path, change.moveTo].filter(Boolean))]);
108
+ }
109
+ recordDiffReviewed(sessionKey) {
110
+ this.mutableState(sessionKey).diffReviewed = true;
111
+ }
112
+ recordVerification(input) {
113
+ const state = this.mutableState(input.sessionKey);
114
+ state.verificationAttempted = true;
115
+ state.lastVerification = {
116
+ toolName: input.toolName,
117
+ command: input.command,
118
+ success: input.success,
119
+ status: input.status,
120
+ exitCode: input.exitCode,
121
+ timedOut: input.timedOut
122
+ };
123
+ }
124
+ markDirty(sessionKey, reason) {
125
+ const state = this.mutableState(sessionKey);
126
+ state.dirty = true;
127
+ state.dirtyReason = reason;
128
+ }
129
+ buildFinalGuardContext(sessionKey) {
130
+ const state = this.states.get(sessionKey);
131
+ if (!state) return "";
132
+ if (!(state.changedFiles.length > 0 || state.changes.length > 0 || state.dirty)) return "";
133
+ const needsDiff = !state.diffReviewed;
134
+ const needsVerification = !state.verificationAttempted;
135
+ const failedVerification = state.lastVerification && !state.lastVerification.success;
136
+ if (!needsDiff && !needsVerification && !failedVerification) return "";
137
+ const lines = ["## Coding final check reminder"];
138
+ if (state.changedFiles.length > 0) appendSection(lines, "This turn changed workspace files:", state.changedFiles.map((file) => `- ${file}`));
139
+ if (state.dirty && needsDiff) lines.push(`A command may have modified the workspace${state.dirtyReason ? `: ${state.dirtyReason}` : "."}`);
140
+ const actions = [];
141
+ if (needsDiff) actions.push("- Inspect the diff/status with `git_status` before final response.");
142
+ if (needsVerification) actions.push("- Run the smallest meaningful verification command if feasible.");
143
+ if (failedVerification) {
144
+ const v = state.lastVerification;
145
+ actions.push(`- Last verification failed${v.command ? `: ${v.command}` : ""}. Do not claim success until fixed or clearly report the blocker.`);
146
+ }
147
+ actions.push("- If skipping verification, say why in the final answer.");
148
+ appendSection(lines, "Before final response:", actions);
149
+ return lines.join("\n");
150
+ }
151
+ mutableState(sessionKey) {
152
+ let state = this.states.get(sessionKey);
153
+ if (!state) {
154
+ state = createState(sessionKey);
155
+ this.states.set(sessionKey, state);
156
+ }
157
+ return state;
158
+ }
159
+ recordApplyPatch(sessionKey, toolName, result) {
160
+ const details = readDetails(result);
161
+ if (!details) return;
162
+ const now = Date.now();
163
+ const changes = (Array.isArray(details.changes) ? details.changes : []).flatMap((raw) => {
164
+ const rec = readRecord(raw);
165
+ const path = readString(rec?.path);
166
+ if (!path) return [];
167
+ return [{
168
+ kind: readString(rec?.kind) ?? "update",
169
+ path,
170
+ moveTo: readString(rec?.moveTo),
171
+ added: readNumber(rec?.added),
172
+ removed: readNumber(rec?.removed),
173
+ diff: readString(rec?.diff),
174
+ toolName,
175
+ at: now
176
+ }];
177
+ });
178
+ if (changes.length === 0) {
179
+ const files = readStringArray(details.files);
180
+ for (const file of files) changes.push({
181
+ kind: "unknown",
182
+ path: file,
183
+ toolName,
184
+ at: now
185
+ });
186
+ }
187
+ this.recordMutation({
188
+ sessionKey,
189
+ toolName,
190
+ changes
191
+ });
192
+ const state = this.mutableState(sessionKey);
193
+ state.added = readNumber(details.added) ?? state.added;
194
+ state.removed = readNumber(details.removed) ?? state.removed;
195
+ const diff = readString(details.diff);
196
+ if (diff && !state.cumulativeDiff.includes(diff.trim())) state.cumulativeDiff = [state.cumulativeDiff.trimEnd(), diff.trimEnd()].filter(Boolean).join("\n");
197
+ }
198
+ recordWriteFile(sessionKey, toolName, args, result) {
199
+ if (typeof readDetails(result)?.size !== "number") return;
200
+ const path = readString(readRecord(args)?.path);
201
+ if (!path) return;
202
+ this.recordMutation({
203
+ sessionKey,
204
+ toolName,
205
+ changes: [{
206
+ kind: "rewrite",
207
+ path,
208
+ toolName,
209
+ at: Date.now()
210
+ }]
211
+ });
212
+ this.markDirty(sessionKey, "`write_file` rewrote file content without a captured unified diff");
213
+ }
214
+ recordExecCommand(sessionKey, toolName, args, result, isError) {
215
+ const command = extractExecCommand(args, result);
216
+ const details = readDetails(result);
217
+ if (command && isDiffReviewCommand(command)) this.recordDiffReviewed(sessionKey);
218
+ if (command && isVerificationCommand(command)) this.recordVerification({
219
+ sessionKey,
220
+ toolName,
221
+ command,
222
+ success: execSuccess(isError, result),
223
+ status: readString(details?.status),
224
+ exitCode: readExitCode(details?.exitCode),
225
+ timedOut: details?.timedOut === true
226
+ });
227
+ if (command && commandMayMutateWorkspace(command)) this.markDirty(sessionKey, `exec_command may have changed files: ${command.slice(0, 120)}`);
228
+ }
229
+ };
230
+ //#endregion
231
+ export { TurnDiffTracker };
232
+
233
+ //# sourceMappingURL=turn-diff-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-diff-tracker.js","names":[],"sources":["../../../../src/agent/coding/turn-diff-tracker.ts"],"sourcesContent":["export type WorkspaceMutationKind = 'add' | 'update' | 'delete' | 'move' | 'rewrite' | 'unknown';\n\nexport interface TurnFileChange {\n kind: WorkspaceMutationKind;\n path: string;\n moveTo?: string;\n added?: number;\n removed?: number;\n diff?: string;\n toolName: string;\n at: number;\n}\n\nexport interface TurnVerificationRecord {\n toolName: string;\n command?: string;\n success: boolean;\n status?: string;\n exitCode?: number | null;\n timedOut?: boolean;\n}\n\nexport interface TurnDiffState {\n sessionKey: string;\n turnId: string;\n changedFiles: string[];\n changes: TurnFileChange[];\n cumulativeDiff: string;\n added: number;\n removed: number;\n dirty: boolean;\n dirtyReason?: string;\n diffReviewed: boolean;\n verificationAttempted: boolean;\n lastVerification?: TurnVerificationRecord;\n}\n\nconst DEFAULT_TURN_ID = 'default';\n\nfunction createState(sessionKey: string, turnId = DEFAULT_TURN_ID): TurnDiffState {\n return {\n sessionKey,\n turnId,\n changedFiles: [],\n changes: [],\n cumulativeDiff: '',\n added: 0,\n removed: 0,\n dirty: false,\n diffReviewed: false,\n verificationAttempted: false,\n };\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n\nfunction readDetails(result: unknown): Record<string, unknown> | null {\n const rec = readRecord(result);\n return readRecord(rec?.details);\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readExitCode(value: unknown): number | null | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (value === null) return null;\n return undefined;\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string' && item.trim().length > 0) : [];\n}\n\nfunction uniqueSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(Array.from(values).filter(Boolean))).sort();\n}\n\nfunction extractExecCommand(args?: unknown, result?: unknown): string {\n const argRec = readRecord(args);\n const fromArgs = readString(argRec?.cmd) ?? readString(argRec?.command);\n if (fromArgs) return fromArgs;\n const details = readDetails(result);\n return readString(details?.command) ?? '';\n}\n\nfunction isDiffReviewCommand(command: string): boolean {\n return /\\bgit\\s+(diff|status)\\b/i.test(command);\n}\n\nfunction isVerificationCommand(command: string): boolean {\n return /\\b(test|vitest|jest|mocha|ava|playwright|typecheck|type-check|tsc|build|lint)\\b/i.test(command);\n}\n\nfunction commandMayMutateWorkspace(command: string): boolean {\n return /\\b(sed\\s+-i|perl\\s+-pi|rm\\s+|mv\\s+|cp\\s+|git\\s+(checkout|reset|clean|apply|merge|rebase)|writeFile|write\\(|open\\([^)]*['\"]w['\"])/i.test(command);\n}\n\nfunction execSuccess(isError: boolean | undefined, result: unknown): boolean {\n if (isError) return false;\n const details = readDetails(result);\n if (!details) return false;\n if (details.timedOut === true) return false;\n if (details.status === 'success') return true;\n return details.exitCode === 0;\n}\n\nfunction appendSection(lines: string[], title: string, body: string[]): void {\n if (body.length === 0) return;\n lines.push(title, ...body);\n}\n\nexport class TurnDiffTracker {\n private readonly states = new Map<string, TurnDiffState>();\n\n beginTurn(sessionKey: string, turnId = `${Date.now()}`): void {\n this.states.set(sessionKey, createState(sessionKey, turnId));\n }\n\n getState(sessionKey: string): TurnDiffState {\n const state = this.states.get(sessionKey) ?? createState(sessionKey);\n return {\n ...state,\n changedFiles: [...state.changedFiles],\n changes: state.changes.map((change) => ({ ...change })),\n lastVerification: state.lastVerification ? { ...state.lastVerification } : undefined,\n };\n }\n\n reset(sessionKey: string): void {\n this.states.delete(sessionKey);\n }\n\n recordToolResult(input: {\n sessionKey: string;\n toolName: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n }): void {\n if (input.isError) return;\n const name = input.toolName.toLowerCase();\n if (name === 'apply_patch') {\n this.recordApplyPatch(input.sessionKey, input.toolName, input.result);\n return;\n }\n if (name === 'write_file') {\n this.recordWriteFile(input.sessionKey, input.toolName, input.args, input.result);\n return;\n }\n if (name === 'exec_command') {\n this.recordExecCommand(input.sessionKey, input.toolName, input.args, input.result, input.isError);\n }\n }\n\n recordMutation(input: { sessionKey: string; toolName: string; changes: TurnFileChange[] }): void {\n const state = this.mutableState(input.sessionKey);\n for (const change of input.changes) {\n state.changes.push({ ...change, toolName: input.toolName });\n state.added += change.added ?? 0;\n state.removed += change.removed ?? 0;\n if (change.diff) {\n state.cumulativeDiff = [state.cumulativeDiff.trimEnd(), change.diff.trimEnd()]\n .filter(Boolean)\n .join('\\n');\n }\n }\n state.changedFiles = uniqueSorted([\n ...state.changedFiles,\n ...input.changes.flatMap((change) => [change.path, change.moveTo].filter(Boolean) as string[]),\n ]);\n }\n\n recordDiffReviewed(sessionKey: string): void {\n this.mutableState(sessionKey).diffReviewed = true;\n }\n\n recordVerification(input: {\n sessionKey: string;\n toolName: string;\n command?: string;\n success: boolean;\n status?: string;\n exitCode?: number | null;\n timedOut?: boolean;\n }): void {\n const state = this.mutableState(input.sessionKey);\n state.verificationAttempted = true;\n state.lastVerification = {\n toolName: input.toolName,\n command: input.command,\n success: input.success,\n status: input.status,\n exitCode: input.exitCode,\n timedOut: input.timedOut,\n };\n }\n\n markDirty(sessionKey: string, reason: string): void {\n const state = this.mutableState(sessionKey);\n state.dirty = true;\n state.dirtyReason = reason;\n }\n\n buildFinalGuardContext(sessionKey: string): string {\n const state = this.states.get(sessionKey);\n if (!state) return '';\n const hasChanges = state.changedFiles.length > 0 || state.changes.length > 0 || state.dirty;\n if (!hasChanges) return '';\n\n const needsDiff = !state.diffReviewed;\n const needsVerification = !state.verificationAttempted;\n const failedVerification = state.lastVerification && !state.lastVerification.success;\n if (!needsDiff && !needsVerification && !failedVerification) return '';\n\n const lines: string[] = ['## Coding final check reminder'];\n if (state.changedFiles.length > 0) {\n appendSection(lines, 'This turn changed workspace files:', state.changedFiles.map((file) => `- ${file}`));\n }\n if (state.dirty && needsDiff) {\n lines.push(`A command may have modified the workspace${state.dirtyReason ? `: ${state.dirtyReason}` : '.'}`);\n }\n const actions: string[] = [];\n if (needsDiff) actions.push('- Inspect the diff/status with `git_status` before final response.');\n if (needsVerification) actions.push('- Run the smallest meaningful verification command if feasible.');\n if (failedVerification) {\n const v = state.lastVerification!;\n actions.push(`- Last verification failed${v.command ? `: ${v.command}` : ''}. Do not claim success until fixed or clearly report the blocker.`);\n }\n actions.push('- If skipping verification, say why in the final answer.');\n appendSection(lines, 'Before final response:', actions);\n return lines.join('\\n');\n }\n\n private mutableState(sessionKey: string): TurnDiffState {\n let state = this.states.get(sessionKey);\n if (!state) {\n state = createState(sessionKey);\n this.states.set(sessionKey, state);\n }\n return state;\n }\n\n private recordApplyPatch(sessionKey: string, toolName: string, result: unknown): void {\n const details = readDetails(result);\n if (!details) return;\n const now = Date.now();\n const rawChanges = Array.isArray(details.changes) ? details.changes : [];\n const changes: TurnFileChange[] = rawChanges.flatMap((raw) => {\n const rec = readRecord(raw);\n const path = readString(rec?.path);\n if (!path) return [];\n return [{\n kind: (readString(rec?.kind) as WorkspaceMutationKind | undefined) ?? 'update',\n path,\n moveTo: readString(rec?.moveTo),\n added: readNumber(rec?.added),\n removed: readNumber(rec?.removed),\n diff: readString(rec?.diff),\n toolName,\n at: now,\n }];\n });\n if (changes.length === 0) {\n const files = readStringArray(details.files);\n for (const file of files) {\n changes.push({ kind: 'unknown', path: file, toolName, at: now });\n }\n }\n this.recordMutation({ sessionKey, toolName, changes });\n const state = this.mutableState(sessionKey);\n state.added = readNumber(details.added) ?? state.added;\n state.removed = readNumber(details.removed) ?? state.removed;\n const diff = readString(details.diff);\n if (diff && !state.cumulativeDiff.includes(diff.trim())) {\n state.cumulativeDiff = [state.cumulativeDiff.trimEnd(), diff.trimEnd()].filter(Boolean).join('\\n');\n }\n }\n\n private recordWriteFile(sessionKey: string, toolName: string, args: unknown, result: unknown): void {\n const details = readDetails(result);\n if (typeof details?.size !== 'number') return;\n const path = readString(readRecord(args)?.path);\n if (!path) return;\n this.recordMutation({\n sessionKey,\n toolName,\n changes: [{ kind: 'rewrite', path, toolName, at: Date.now() }],\n });\n this.markDirty(sessionKey, '`write_file` rewrote file content without a captured unified diff');\n }\n\n private recordExecCommand(sessionKey: string, toolName: string, args: unknown, result: unknown, isError?: boolean): void {\n const command = extractExecCommand(args, result);\n const details = readDetails(result);\n if (command && isDiffReviewCommand(command)) {\n this.recordDiffReviewed(sessionKey);\n }\n if (command && isVerificationCommand(command)) {\n this.recordVerification({\n sessionKey,\n toolName,\n command,\n success: execSuccess(isError, result),\n status: readString(details?.status),\n exitCode: readExitCode(details?.exitCode),\n timedOut: details?.timedOut === true,\n });\n }\n if (command && commandMayMutateWorkspace(command)) {\n this.markDirty(sessionKey, `exec_command may have changed files: ${command.slice(0, 120)}`);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { GoalService } from "../../goals/goal-service.js";
2
- import "../../goals/index.js";
3
1
  import { listMemoryRecords } from "../../storage/sqlite/memory-records-repository.js";
4
2
  import "../../storage/sqlite/index.js";
3
+ import { GoalService } from "../../goals/goal-service.js";
4
+ import "../../goals/index.js";
5
5
  import { ProjectStore } from "../../projects/project-store.js";
6
6
  import { getProjectForSession, getProjectWorkspacePathForSession } from "../../projects/workspace.js";
7
7
  import { sanitizeForPromptLiteral } from "../prompt/sanitize-for-prompt.js";
@@ -1,12 +1,12 @@
1
- import { init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } 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
6
  import { dirname, join } from "node:path";
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
- import { execFileSync } from "node:child_process";
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).
@@ -1,6 +1,6 @@
1
- import { resolveEffectiveAgentManifestForSession } from "../../config/agent-profile.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { resolveEffectiveAgentManifestForSession } from "../../config/agent-profile.js";
4
4
  import { init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
6
6
  import { runXopcEmbeddedTurn } from "./run-turn.js";
@@ -1,7 +1,7 @@
1
- import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
2
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
3
1
  import { createLogger } from "../../utils/logger/index.js";
4
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
5
5
  import { GoalService } from "../../goals/goal-service.js";
6
6
  import { resolveGoalUiLocale } from "./goal-locale.js";
7
7
  import { evaluateAfterTurnHermesLike } from "./evaluate-turn.js";
@@ -1,6 +1,6 @@
1
- import { init_agent_scope, resolveDefaultAgentId } 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, resolveDefaultAgentId } from "../agent-scope.js";
4
4
  import { createResponseMessage, createSignalMessage, createTaskMessage } from "./types.js";
5
5
  import { AgentInbox } from "./inbox.js";
6
6
  //#region src/agent/ipc/bus.ts
@@ -1,6 +1,6 @@
1
- import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
4
4
  import { buildSafeToolName, normalizeReservedToolNames } from "./bundle-mcp-names.js";
5
5
  import { setPluginToolMeta } from "./mcp-tool-meta.js";
6
6
  import crypto from "node:crypto";
@@ -1,7 +1,7 @@
1
- import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
4
3
  import { resolveGlobalSingleton } from "../../utils/global-singleton.js";
4
+ import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
5
5
  import { sanitizeServerName } from "./bundle-mcp-names.js";
6
6
  import { redactSensitiveUrlLikeString } from "../../utils/redact-sensitive-url.js";
7
7
  import { loadEmbeddedMcpConfig } from "./embedded-mcp.js";
@@ -1,6 +1,6 @@
1
- import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
4
4
  import { resolveXopcMcpTransportAlias } from "../../config/mcp-config-normalize.js";
5
5
  import { sanitizeForLog } from "../../utils/sanitize-log.js";
6
6
  import { describeHttpMcpServerLaunchConfig, resolveHttpMcpServerLaunchConfig } from "./mcp-http.js";
@@ -1,6 +1,6 @@
1
- import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
4
4
  import { XopcStdioClientTransport } from "./mcp-stdio-transport.js";
5
5
  import { resolveMcpTransportConfig } from "./mcp-transport-config.js";
6
6
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
@@ -35,8 +35,8 @@ export type DreamingResolvedConfig = {
35
35
  };
36
36
  deep: DreamingDeepConfig;
37
37
  };
38
- /** Resolve the full three-phase dreaming config from the default agent manifest. */
39
- export declare function resolveDreamingConfig(cfg: Config | undefined): DreamingResolvedConfig;
38
+ /** Resolve the full three-phase dreaming config from an agent manifest. */
39
+ export declare function resolveDreamingConfig(cfg: Config | undefined, requestedAgentId?: string | null): DreamingResolvedConfig;
40
40
  /** Get the cron expression for a specific phase from resolved config. */
41
41
  export declare function getPhaseCron(config: DreamingResolvedConfig, phase: DreamingPhaseId): string;
42
42
  /** Check if a specific phase is enabled (global + phase-level). */
@@ -25,9 +25,9 @@ function trimmedStringOr(value, fallback) {
25
25
  function optionalTrimmedString(value) {
26
26
  return typeof value === "string" && value.trim() ? value.trim() : void 0;
27
27
  }
28
- /** Resolve the full three-phase dreaming config from the default agent manifest. */
29
- function resolveDreamingConfig(cfg) {
30
- const agentId = cfg ? resolveDefaultAgentId(cfg) : void 0;
28
+ /** Resolve the full three-phase dreaming config from an agent manifest. */
29
+ function resolveDreamingConfig(cfg, requestedAgentId) {
30
+ const agentId = cfg ? requestedAgentId?.trim() || resolveDefaultAgentId(cfg) : void 0;
31
31
  const manifest = cfg && agentId ? resolveEffectiveAgentManifestForAgent(cfg, agentId) : void 0;
32
32
  const dreaming = manifest?.memory.dreaming;
33
33
  const enabled = dreaming?.enabled === true && manifest?.memory.mode !== "off";
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/config.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { resolveDefaultAgentId } from '../../agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport {\n DEFAULT_DEEP_CRON,\n DEFAULT_LIGHT_CRON,\n DEFAULT_MAX_AGE_DAYS,\n DEFAULT_RECENCY_HALF_LIFE_DAYS,\n DEFAULT_REM_CRON,\n type DreamingPhaseId,\n} from './constants.js';\n\n// ── Phase config types ─────────────────────────────────────────────────\n\nexport type DreamingLightConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n dedupeSimilarity: number;\n};\n\nexport type DreamingDeepConfig = {\n enabled: boolean;\n cron: string;\n minScore: number;\n minRecallCount: number;\n minUniqueQueries: number;\n limit: number;\n recencyHalfLifeDays: number;\n maxAgeDays: number;\n};\n\nexport type DreamingRemConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n minPatternStrength: number;\n};\n\nexport type DreamingResolvedConfig = {\n enabled: boolean;\n frequency: string;\n timezone?: string;\n phases: {\n light: DreamingLightConfig;\n deep: DreamingDeepConfig;\n rem: DreamingRemConfig;\n };\n deep: DreamingDeepConfig;\n};\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction clampScore(value: number, fallback: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction toPositiveInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored > 0 ? floored : fallback;\n}\n\nfunction toNonNegInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored >= 0 ? floored : fallback;\n}\n\nfunction trimmedStringOr(value: unknown, fallback: string): string {\n return typeof value === 'string' && value.trim() ? value.trim() : fallback;\n}\n\nfunction optionalTrimmedString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n// ── Resolver ───────────────────────────────────────────────────────────\n\n/** Resolve the full three-phase dreaming config from the default agent manifest. */\nexport function resolveDreamingConfig(cfg: Config | undefined): DreamingResolvedConfig {\n const agentId = cfg ? resolveDefaultAgentId(cfg) : undefined;\n const manifest = cfg && agentId ? resolveEffectiveAgentManifestForAgent(cfg, agentId) : undefined;\n const dreaming = manifest?.memory.dreaming;\n const enabled = dreaming?.enabled === true && manifest?.memory.mode !== 'off';\n\n const frequency = trimmedStringOr(dreaming?.frequency, DEFAULT_DEEP_CRON);\n const timezone = optionalTrimmedString(dreaming?.timezone);\n\n // ── Light phase ────────────────────────────────────────────────────\n const lightRaw = dreaming?.phases?.light ?? {};\n const light: DreamingLightConfig = {\n enabled: enabled && lightRaw?.enabled !== false,\n cron: trimmedStringOr(lightRaw?.cron, DEFAULT_LIGHT_CRON),\n lookbackDays: toPositiveInt(lightRaw?.lookbackDays, 2),\n limit: toNonNegInt(lightRaw?.limit, 100),\n dedupeSimilarity: clampScore(Number(lightRaw?.dedupeSimilarity), 0.9),\n };\n\n // ── Deep phase ─────────────────────────────────────────────────────\n const deepRaw = dreaming?.phases?.deep ?? {};\n const deep: DreamingDeepConfig = {\n enabled: enabled && deepRaw?.enabled !== false,\n cron: trimmedStringOr(deepRaw?.cron, frequency),\n minScore: clampScore(Number(deepRaw?.minScore), 0.8),\n minRecallCount: toPositiveInt(deepRaw?.minRecallCount, 3),\n minUniqueQueries: toPositiveInt(deepRaw?.minUniqueQueries, 3),\n limit: toNonNegInt(deepRaw?.limit, 10),\n recencyHalfLifeDays: toPositiveInt(deepRaw?.recencyHalfLifeDays, DEFAULT_RECENCY_HALF_LIFE_DAYS),\n maxAgeDays: toPositiveInt(deepRaw?.maxAgeDays, DEFAULT_MAX_AGE_DAYS),\n };\n\n // ── REM phase ──────────────────────────────────────────────────────\n const remRaw = dreaming?.phases?.rem ?? {};\n const rem: DreamingRemConfig = {\n enabled: enabled && remRaw?.enabled !== false,\n cron: trimmedStringOr(remRaw?.cron, DEFAULT_REM_CRON),\n lookbackDays: toPositiveInt(remRaw?.lookbackDays, 7),\n limit: toNonNegInt(remRaw?.limit, 10),\n minPatternStrength: clampScore(Number(remRaw?.minPatternStrength), 0.75),\n };\n\n return {\n enabled,\n frequency,\n ...(timezone ? { timezone } : {}),\n phases: { light, deep, rem },\n deep,\n };\n}\n\n/** Get the cron expression for a specific phase from resolved config. */\nexport function getPhaseCron(config: DreamingResolvedConfig, phase: DreamingPhaseId): string {\n return config.phases[phase].cron;\n}\n\n/** Check if a specific phase is enabled (global + phase-level). */\nexport function isPhaseEnabled(config: DreamingResolvedConfig, phase: DreamingPhaseId): boolean {\n return config.enabled && config.phases[phase].enabled;\n}\n"],"mappings":";;;;kBAC6D;AAsD7D,SAAS,WAAW,OAAe,UAA0B;AAC3D,KAAI,CAAC,OAAO,SAAS,MAAM,CAAE,QAAO;AACpC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;;AAGxC,SAAS,cAAc,OAAgB,UAA0B;CAC/D,MAAM,MAAM,OAAO,UAAU,WAAW,OAAO,MAAM,GAAG,OAAO,MAAM;AACrE,KAAI,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;CAClC,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAO,UAAU,IAAI,UAAU;;AAGjC,SAAS,YAAY,OAAgB,UAA0B;CAC7D,MAAM,MAAM,OAAO,UAAU,WAAW,OAAO,MAAM,GAAG,OAAO,MAAM;AACrE,KAAI,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;CAClC,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAO,WAAW,IAAI,UAAU;;AAGlC,SAAS,gBAAgB,OAAgB,UAA0B;AACjE,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG;;AAGpE,SAAS,sBAAsB,OAAoC;AACjE,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;;AAMpE,SAAgB,sBAAsB,KAAiD;CACrF,MAAM,UAAU,MAAM,sBAAsB,IAAI,GAAG,KAAA;CACnD,MAAM,WAAW,OAAO,UAAU,sCAAsC,KAAK,QAAQ,GAAG,KAAA;CACxF,MAAM,WAAW,UAAU,OAAO;CAClC,MAAM,UAAU,UAAU,YAAY,QAAQ,UAAU,OAAO,SAAS;CAExE,MAAM,YAAY,gBAAgB,UAAU,WAAW,kBAAkB;CACzE,MAAM,WAAW,sBAAsB,UAAU,SAAS;CAG1D,MAAM,WAAW,UAAU,QAAQ,SAAS,EAAE;CAC9C,MAAM,QAA6B;EACjC,SAAS,WAAW,UAAU,YAAY;EAC1C,MAAM,gBAAgB,UAAU,MAAM,mBAAmB;EACzD,cAAc,cAAc,UAAU,cAAc,EAAE;EACtD,OAAO,YAAY,UAAU,OAAO,IAAI;EACxC,kBAAkB,WAAW,OAAO,UAAU,iBAAiB,EAAE,GAAI;EACtE;CAGD,MAAM,UAAU,UAAU,QAAQ,QAAQ,EAAE;CAC5C,MAAM,OAA2B;EAC/B,SAAS,WAAW,SAAS,YAAY;EACzC,MAAM,gBAAgB,SAAS,MAAM,UAAU;EAC/C,UAAU,WAAW,OAAO,SAAS,SAAS,EAAE,GAAI;EACpD,gBAAgB,cAAc,SAAS,gBAAgB,EAAE;EACzD,kBAAkB,cAAc,SAAS,kBAAkB,EAAE;EAC7D,OAAO,YAAY,SAAS,OAAO,GAAG;EACtC,qBAAqB,cAAc,SAAS,qBAAA,GAAoD;EAChG,YAAY,cAAc,SAAS,YAAA,GAAiC;EACrE;CAGD,MAAM,SAAS,UAAU,QAAQ,OAAO,EAAE;CAC1C,MAAM,MAAyB;EAC7B,SAAS,WAAW,QAAQ,YAAY;EACxC,MAAM,gBAAgB,QAAQ,MAAM,iBAAiB;EACrD,cAAc,cAAc,QAAQ,cAAc,EAAE;EACpD,OAAO,YAAY,QAAQ,OAAO,GAAG;EACrC,oBAAoB,WAAW,OAAO,QAAQ,mBAAmB,EAAE,IAAK;EACzE;AAED,QAAO;EACL;EACA;EACA,GAAI,WAAW,EAAE,UAAU,GAAG,EAAE;EAChC,QAAQ;GAAE;GAAO;GAAM;GAAK;EAC5B;EACD;;;AAIH,SAAgB,aAAa,QAAgC,OAAgC;AAC3F,QAAO,OAAO,OAAO,OAAO;;;AAI9B,SAAgB,eAAe,QAAgC,OAAiC;AAC9F,QAAO,OAAO,WAAW,OAAO,OAAO,OAAO"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/config.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { resolveDefaultAgentId } from '../../agent-scope.js';\nimport { resolveEffectiveAgentManifestForAgent } from '../../../config/agent-profile.js';\nimport {\n DEFAULT_DEEP_CRON,\n DEFAULT_LIGHT_CRON,\n DEFAULT_MAX_AGE_DAYS,\n DEFAULT_RECENCY_HALF_LIFE_DAYS,\n DEFAULT_REM_CRON,\n type DreamingPhaseId,\n} from './constants.js';\n\n// ── Phase config types ─────────────────────────────────────────────────\n\nexport type DreamingLightConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n dedupeSimilarity: number;\n};\n\nexport type DreamingDeepConfig = {\n enabled: boolean;\n cron: string;\n minScore: number;\n minRecallCount: number;\n minUniqueQueries: number;\n limit: number;\n recencyHalfLifeDays: number;\n maxAgeDays: number;\n};\n\nexport type DreamingRemConfig = {\n enabled: boolean;\n cron: string;\n lookbackDays: number;\n limit: number;\n minPatternStrength: number;\n};\n\nexport type DreamingResolvedConfig = {\n enabled: boolean;\n frequency: string;\n timezone?: string;\n phases: {\n light: DreamingLightConfig;\n deep: DreamingDeepConfig;\n rem: DreamingRemConfig;\n };\n deep: DreamingDeepConfig;\n};\n\n// ── Helpers ────────────────────────────────────────────────────────────\n\nfunction clampScore(value: number, fallback: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction toPositiveInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored > 0 ? floored : fallback;\n}\n\nfunction toNonNegInt(value: unknown, fallback: number): number {\n const num = typeof value === 'string' ? Number(value) : Number(value);\n if (!Number.isFinite(num)) return fallback;\n const floored = Math.floor(num);\n return floored >= 0 ? floored : fallback;\n}\n\nfunction trimmedStringOr(value: unknown, fallback: string): string {\n return typeof value === 'string' && value.trim() ? value.trim() : fallback;\n}\n\nfunction optionalTrimmedString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n// ── Resolver ───────────────────────────────────────────────────────────\n\n/** Resolve the full three-phase dreaming config from an agent manifest. */\nexport function resolveDreamingConfig(cfg: Config | undefined, requestedAgentId?: string | null): DreamingResolvedConfig {\n const agentId = cfg ? (requestedAgentId?.trim() || resolveDefaultAgentId(cfg)) : undefined;\n const manifest = cfg && agentId ? resolveEffectiveAgentManifestForAgent(cfg, agentId) : undefined;\n const dreaming = manifest?.memory.dreaming;\n const enabled = dreaming?.enabled === true && manifest?.memory.mode !== 'off';\n\n const frequency = trimmedStringOr(dreaming?.frequency, DEFAULT_DEEP_CRON);\n const timezone = optionalTrimmedString(dreaming?.timezone);\n\n // ── Light phase ────────────────────────────────────────────────────\n const lightRaw = dreaming?.phases?.light ?? {};\n const light: DreamingLightConfig = {\n enabled: enabled && lightRaw?.enabled !== false,\n cron: trimmedStringOr(lightRaw?.cron, DEFAULT_LIGHT_CRON),\n lookbackDays: toPositiveInt(lightRaw?.lookbackDays, 2),\n limit: toNonNegInt(lightRaw?.limit, 100),\n dedupeSimilarity: clampScore(Number(lightRaw?.dedupeSimilarity), 0.9),\n };\n\n // ── Deep phase ─────────────────────────────────────────────────────\n const deepRaw = dreaming?.phases?.deep ?? {};\n const deep: DreamingDeepConfig = {\n enabled: enabled && deepRaw?.enabled !== false,\n cron: trimmedStringOr(deepRaw?.cron, frequency),\n minScore: clampScore(Number(deepRaw?.minScore), 0.8),\n minRecallCount: toPositiveInt(deepRaw?.minRecallCount, 3),\n minUniqueQueries: toPositiveInt(deepRaw?.minUniqueQueries, 3),\n limit: toNonNegInt(deepRaw?.limit, 10),\n recencyHalfLifeDays: toPositiveInt(deepRaw?.recencyHalfLifeDays, DEFAULT_RECENCY_HALF_LIFE_DAYS),\n maxAgeDays: toPositiveInt(deepRaw?.maxAgeDays, DEFAULT_MAX_AGE_DAYS),\n };\n\n // ── REM phase ──────────────────────────────────────────────────────\n const remRaw = dreaming?.phases?.rem ?? {};\n const rem: DreamingRemConfig = {\n enabled: enabled && remRaw?.enabled !== false,\n cron: trimmedStringOr(remRaw?.cron, DEFAULT_REM_CRON),\n lookbackDays: toPositiveInt(remRaw?.lookbackDays, 7),\n limit: toNonNegInt(remRaw?.limit, 10),\n minPatternStrength: clampScore(Number(remRaw?.minPatternStrength), 0.75),\n };\n\n return {\n enabled,\n frequency,\n ...(timezone ? { timezone } : {}),\n phases: { light, deep, rem },\n deep,\n };\n}\n\n/** Get the cron expression for a specific phase from resolved config. */\nexport function getPhaseCron(config: DreamingResolvedConfig, phase: DreamingPhaseId): string {\n return config.phases[phase].cron;\n}\n\n/** Check if a specific phase is enabled (global + phase-level). */\nexport function isPhaseEnabled(config: DreamingResolvedConfig, phase: DreamingPhaseId): boolean {\n return config.enabled && config.phases[phase].enabled;\n}\n"],"mappings":";;;;kBAC6D;AAsD7D,SAAS,WAAW,OAAe,UAA0B;AAC3D,KAAI,CAAC,OAAO,SAAS,MAAM,CAAE,QAAO;AACpC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;;AAGxC,SAAS,cAAc,OAAgB,UAA0B;CAC/D,MAAM,MAAM,OAAO,UAAU,WAAW,OAAO,MAAM,GAAG,OAAO,MAAM;AACrE,KAAI,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;CAClC,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAO,UAAU,IAAI,UAAU;;AAGjC,SAAS,YAAY,OAAgB,UAA0B;CAC7D,MAAM,MAAM,OAAO,UAAU,WAAW,OAAO,MAAM,GAAG,OAAO,MAAM;AACrE,KAAI,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;CAClC,MAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAO,WAAW,IAAI,UAAU;;AAGlC,SAAS,gBAAgB,OAAgB,UAA0B;AACjE,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG;;AAGpE,SAAS,sBAAsB,OAAoC;AACjE,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;;AAMpE,SAAgB,sBAAsB,KAAyB,kBAA0D;CACvH,MAAM,UAAU,MAAO,kBAAkB,MAAM,IAAI,sBAAsB,IAAI,GAAI,KAAA;CACjF,MAAM,WAAW,OAAO,UAAU,sCAAsC,KAAK,QAAQ,GAAG,KAAA;CACxF,MAAM,WAAW,UAAU,OAAO;CAClC,MAAM,UAAU,UAAU,YAAY,QAAQ,UAAU,OAAO,SAAS;CAExE,MAAM,YAAY,gBAAgB,UAAU,WAAW,kBAAkB;CACzE,MAAM,WAAW,sBAAsB,UAAU,SAAS;CAG1D,MAAM,WAAW,UAAU,QAAQ,SAAS,EAAE;CAC9C,MAAM,QAA6B;EACjC,SAAS,WAAW,UAAU,YAAY;EAC1C,MAAM,gBAAgB,UAAU,MAAM,mBAAmB;EACzD,cAAc,cAAc,UAAU,cAAc,EAAE;EACtD,OAAO,YAAY,UAAU,OAAO,IAAI;EACxC,kBAAkB,WAAW,OAAO,UAAU,iBAAiB,EAAE,GAAI;EACtE;CAGD,MAAM,UAAU,UAAU,QAAQ,QAAQ,EAAE;CAC5C,MAAM,OAA2B;EAC/B,SAAS,WAAW,SAAS,YAAY;EACzC,MAAM,gBAAgB,SAAS,MAAM,UAAU;EAC/C,UAAU,WAAW,OAAO,SAAS,SAAS,EAAE,GAAI;EACpD,gBAAgB,cAAc,SAAS,gBAAgB,EAAE;EACzD,kBAAkB,cAAc,SAAS,kBAAkB,EAAE;EAC7D,OAAO,YAAY,SAAS,OAAO,GAAG;EACtC,qBAAqB,cAAc,SAAS,qBAAA,GAAoD;EAChG,YAAY,cAAc,SAAS,YAAA,GAAiC;EACrE;CAGD,MAAM,SAAS,UAAU,QAAQ,OAAO,EAAE;CAC1C,MAAM,MAAyB;EAC7B,SAAS,WAAW,QAAQ,YAAY;EACxC,MAAM,gBAAgB,QAAQ,MAAM,iBAAiB;EACrD,cAAc,cAAc,QAAQ,cAAc,EAAE;EACpD,OAAO,YAAY,QAAQ,OAAO,GAAG;EACrC,oBAAoB,WAAW,OAAO,QAAQ,mBAAmB,EAAE,IAAK;EACzE;AAED,QAAO;EACL;EACA;EACA,GAAI,WAAW,EAAE,UAAU,GAAG,EAAE;EAChC,QAAQ;GAAE;GAAO;GAAM;GAAK;EAC5B;EACD;;;AAIH,SAAgB,aAAa,QAAgC,OAAgC;AAC3F,QAAO,OAAO,OAAO,OAAO;;;AAI9B,SAAgB,eAAe,QAAgC,OAAiC;AAC9F,QAAO,OAAO,WAAW,OAAO,OAAO,OAAO"}
@@ -20,7 +20,7 @@ export declare const REINFORCEMENT_WEIGHT = 0.12;
20
20
  export declare const DIVERSITY_WEIGHT = 0.08;
21
21
  /** Number of signal dimensions used for diversity calculation. */
22
22
  export declare const DIVERSITY_DIMENSION_COUNT = 4;
23
- export declare const DREAMING_DIR_RELATIVE: string;
23
+ export declare const DREAMING_DIR_RELATIVE = ".dreams";
24
24
  export declare const SHORT_TERM_RECALL_STORE_RELATIVE: string;
25
25
  export declare const SHORT_TERM_PROMOTION_LOCK_RELATIVE: string;
26
26
  export declare const DREAMING_LAST_RUN_RELATIVE: string;
@@ -25,7 +25,7 @@ const REINFORCEMENT_WEIGHT = .12;
25
25
  const DIVERSITY_WEIGHT = .08;
26
26
  /** Number of signal dimensions used for diversity calculation. */
27
27
  const DIVERSITY_DIMENSION_COUNT = 4;
28
- const DREAMING_DIR_RELATIVE = path.join("memory", ".dreams");
28
+ const DREAMING_DIR_RELATIVE = ".dreams";
29
29
  const SHORT_TERM_RECALL_STORE_RELATIVE = path.join(DREAMING_DIR_RELATIVE, "short-term-recall.json");
30
30
  const SHORT_TERM_PROMOTION_LOCK_RELATIVE = path.join(DREAMING_DIR_RELATIVE, "short-term-promotion.lock");
31
31
  const DREAMING_LAST_RUN_RELATIVE = path.join(DREAMING_DIR_RELATIVE, "last-run.json");
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/constants.ts"],"sourcesContent":["import path from 'node:path';\n\n// ── Phase identifiers ──────────────────────────────────────────────────\n\nexport type DreamingPhaseId = 'light' | 'deep' | 'rem';\n\nexport const DREAMING_PHASES: readonly DreamingPhaseId[] = ['light', 'deep', 'rem'] as const;\n\n// ── Sweep tokens (used in cron payloads to trigger each phase) ─────────\n\nexport const DREAMING_SWEEP_TOKEN = '__xopc_memory_dreaming_sweep__';\nexport const DREAMING_LIGHT_SWEEP_TOKEN = '__xopc_memory_dreaming_light_sweep__';\nexport const DREAMING_REM_SWEEP_TOKEN = '__xopc_memory_dreaming_rem_sweep__';\n\n// ── Cron job metadata ──────────────────────────────────────────────────\n\nexport const DREAMING_CRON_TAG = '[managed-by=xopc.memory.dreaming]';\n\nexport const DREAMING_CRON_NAME = 'Memory Dreaming - Deep Promotion';\nexport const DREAMING_LIGHT_CRON_NAME = 'Memory Dreaming - Light Sweep';\nexport const DREAMING_REM_CRON_NAME = 'Memory Dreaming - REM Patterns';\n\n// ── Default cron schedules ─────────────────────────────────────────────\n\nexport const DEFAULT_DEEP_CRON = '0 3 * * *';\nexport const DEFAULT_LIGHT_CRON = '0 */6 * * *';\nexport const DEFAULT_REM_CRON = '0 5 * * 0';\n\n// ── Time-decay defaults ────────────────────────────────────────────────\n\nexport const DEFAULT_RECENCY_HALF_LIFE_DAYS = 14;\nexport const DEFAULT_MAX_AGE_DAYS = 30;\n\n// ── Scoring weights ────────────────────────────────────────────────────\n\n/** Milliseconds in one day (used for time-decay calculations). */\nexport const MS_PER_DAY = 86_400_000;\n\n/** Weight applied to recall-count reinforcement (logarithmic boost). */\nexport const REINFORCEMENT_WEIGHT = 0.12;\n\n/** Weight applied to signal-diversity bonus. */\nexport const DIVERSITY_WEIGHT = 0.08;\n\n/** Number of signal dimensions used for diversity calculation. */\nexport const DIVERSITY_DIMENSION_COUNT = 4;\n\n// ── File paths ─────────────────────────────────────────────────────────\n\nexport const DREAMING_DIR_RELATIVE = path.join('memory', '.dreams');\nexport const SHORT_TERM_RECALL_STORE_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'short-term-recall.json');\nexport const SHORT_TERM_PROMOTION_LOCK_RELATIVE = path.join(\n DREAMING_DIR_RELATIVE,\n 'short-term-promotion.lock',\n);\nexport const DREAMING_LAST_RUN_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'last-run.json');\nexport const DREAMING_EVENTS_LOG_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'events.jsonl');\n\nexport const MEMORY_MD_FILENAME = 'MEMORY.md';\nexport const DREAMS_MD_FILENAME = 'DREAMS.md';\n\n"],"mappings":";;AAMA,MAAa,kBAA8C;CAAC;CAAS;CAAQ;CAAM;AAInF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,2BAA2B;AAIxC,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,2BAA2B;AACxC,MAAa,yBAAyB;AAItC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,mBAAmB;AAIhC,MAAa,iCAAiC;AAC9C,MAAa,uBAAuB;;AAKpC,MAAa,aAAa;;AAG1B,MAAa,uBAAuB;;AAGpC,MAAa,mBAAmB;;AAGhC,MAAa,4BAA4B;AAIzC,MAAa,wBAAwB,KAAK,KAAK,UAAU,UAAU;AACnE,MAAa,mCAAmC,KAAK,KAAK,uBAAuB,yBAAyB;AAC1G,MAAa,qCAAqC,KAAK,KACrD,uBACA,4BACD;AACD,MAAa,6BAA6B,KAAK,KAAK,uBAAuB,gBAAgB;AAC3F,MAAa,+BAA+B,KAAK,KAAK,uBAAuB,eAAe;AAE5F,MAAa,qBAAqB;AAClC,MAAa,qBAAqB"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/constants.ts"],"sourcesContent":["import path from 'node:path';\n\n// ── Phase identifiers ──────────────────────────────────────────────────\n\nexport type DreamingPhaseId = 'light' | 'deep' | 'rem';\n\nexport const DREAMING_PHASES: readonly DreamingPhaseId[] = ['light', 'deep', 'rem'] as const;\n\n// ── Sweep tokens (used in cron payloads to trigger each phase) ─────────\n\nexport const DREAMING_SWEEP_TOKEN = '__xopc_memory_dreaming_sweep__';\nexport const DREAMING_LIGHT_SWEEP_TOKEN = '__xopc_memory_dreaming_light_sweep__';\nexport const DREAMING_REM_SWEEP_TOKEN = '__xopc_memory_dreaming_rem_sweep__';\n\n// ── Cron job metadata ──────────────────────────────────────────────────\n\nexport const DREAMING_CRON_TAG = '[managed-by=xopc.memory.dreaming]';\n\nexport const DREAMING_CRON_NAME = 'Memory Dreaming - Deep Promotion';\nexport const DREAMING_LIGHT_CRON_NAME = 'Memory Dreaming - Light Sweep';\nexport const DREAMING_REM_CRON_NAME = 'Memory Dreaming - REM Patterns';\n\n// ── Default cron schedules ─────────────────────────────────────────────\n\nexport const DEFAULT_DEEP_CRON = '0 3 * * *';\nexport const DEFAULT_LIGHT_CRON = '0 */6 * * *';\nexport const DEFAULT_REM_CRON = '0 5 * * 0';\n\n// ── Time-decay defaults ────────────────────────────────────────────────\n\nexport const DEFAULT_RECENCY_HALF_LIFE_DAYS = 14;\nexport const DEFAULT_MAX_AGE_DAYS = 30;\n\n// ── Scoring weights ────────────────────────────────────────────────────\n\n/** Milliseconds in one day (used for time-decay calculations). */\nexport const MS_PER_DAY = 86_400_000;\n\n/** Weight applied to recall-count reinforcement (logarithmic boost). */\nexport const REINFORCEMENT_WEIGHT = 0.12;\n\n/** Weight applied to signal-diversity bonus. */\nexport const DIVERSITY_WEIGHT = 0.08;\n\n/** Number of signal dimensions used for diversity calculation. */\nexport const DIVERSITY_DIMENSION_COUNT = 4;\n\n// ── File paths ─────────────────────────────────────────────────────────\n\nexport const DREAMING_DIR_RELATIVE = '.dreams';\nexport const SHORT_TERM_RECALL_STORE_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'short-term-recall.json');\nexport const SHORT_TERM_PROMOTION_LOCK_RELATIVE = path.join(\n DREAMING_DIR_RELATIVE,\n 'short-term-promotion.lock',\n);\nexport const DREAMING_LAST_RUN_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'last-run.json');\nexport const DREAMING_EVENTS_LOG_RELATIVE = path.join(DREAMING_DIR_RELATIVE, 'events.jsonl');\n\nexport const MEMORY_MD_FILENAME = 'MEMORY.md';\nexport const DREAMS_MD_FILENAME = 'DREAMS.md';\n"],"mappings":";;AAMA,MAAa,kBAA8C;CAAC;CAAS;CAAQ;CAAM;AAInF,MAAa,uBAAuB;AACpC,MAAa,6BAA6B;AAC1C,MAAa,2BAA2B;AAIxC,MAAa,oBAAoB;AAEjC,MAAa,qBAAqB;AAClC,MAAa,2BAA2B;AACxC,MAAa,yBAAyB;AAItC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,mBAAmB;AAIhC,MAAa,iCAAiC;AAC9C,MAAa,uBAAuB;;AAKpC,MAAa,aAAa;;AAG1B,MAAa,uBAAuB;;AAGpC,MAAa,mBAAmB;;AAGhC,MAAa,4BAA4B;AAIzC,MAAa,wBAAwB;AACrC,MAAa,mCAAmC,KAAK,KAAK,uBAAuB,yBAAyB;AAC1G,MAAa,qCAAqC,KAAK,KACrD,uBACA,4BACD;AACD,MAAa,6BAA6B,KAAK,KAAK,uBAAuB,gBAAgB;AAC3F,MAAa,+BAA+B,KAAK,KAAK,uBAAuB,eAAe;AAE5F,MAAa,qBAAqB;AAClC,MAAa,qBAAqB"}
@@ -11,6 +11,7 @@ export type DreamingPromotionCandidate = DreamingStoreEntry & {
11
11
  };
12
12
  export declare function runDreamingDeepPromotion(params: {
13
13
  workspaceDir: string;
14
+ dreamingRoot: string;
14
15
  config?: Partial<DreamingDeepConfig>;
15
16
  memoryManager?: MemoryManager;
16
17
  now?: Date;