@xopcai/xopc 0.0.110 → 0.0.112

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 (583) hide show
  1. package/README.md +46 -4
  2. package/README.zh-CN.md +46 -4
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  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/inbound-processor.js +1 -1
  8. package/dist/extensions/telegram/src/plugin.js +1 -1
  9. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  10. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  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 +2 -2
  14. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  15. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  23. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  24. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  25. package/dist/gateway/static/root/assets/agent-avatar-dicebear-EhRp-ZMa.js +1 -0
  26. package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +6 -0
  27. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +1 -0
  28. package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +71 -0
  29. package/dist/gateway/static/root/assets/app-management-settings-panel-BIy7KEsM.js +1 -0
  30. package/dist/gateway/static/root/assets/appearance-settings-DGQG8NwA.js +1 -0
  31. package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +1 -0
  32. package/dist/gateway/static/root/assets/archive-plugin-uuQPupqx.js +1 -0
  33. package/dist/gateway/static/root/assets/attachment-load-DBkv0cAv.js +2 -0
  34. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CybMSIoS.js → attachment-preview-renderer-DonnL2dL.js} +1 -1
  35. package/dist/gateway/static/root/assets/binary-plugins-DxxN_VAR.js +2 -0
  36. package/dist/gateway/static/root/assets/block-editor-CwnUlRmO.js +180 -0
  37. package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +1 -0
  38. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +1 -0
  39. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +1 -0
  40. package/dist/gateway/static/root/assets/config-api-BD-NcD5d.js +3 -0
  41. package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +1 -0
  42. package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +2 -0
  43. package/dist/gateway/static/root/assets/cron-api-C5DoipZA.js +1 -0
  44. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +1 -0
  45. package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +3 -0
  46. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  47. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  48. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  49. package/dist/gateway/static/root/assets/dreaming-scene-BHMRVEUS.js +4585 -0
  50. package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +1 -0
  51. package/dist/gateway/static/root/assets/extension-debug-page-BDHA9o_e.js +1 -0
  52. package/dist/gateway/static/root/assets/{extension-page-W1wiG38F.js → extension-page-DmDLVSPE.js} +1 -1
  53. package/dist/gateway/static/root/assets/extension-settings-page-1124aHw_.js +1 -0
  54. package/dist/gateway/static/root/assets/fetch-DOe56Wmy.js +1 -0
  55. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +2 -0
  56. package/dist/gateway/static/root/assets/format-interval-label-tsMSvBSR.js +1 -0
  57. package/dist/gateway/static/root/assets/gateway-config-api-CsD4FC9D.js +1 -0
  58. package/dist/gateway/static/root/assets/gateway-settings-HQ8FBhY2.js +1 -0
  59. package/dist/gateway/static/root/assets/gateway-startup-retry-C1zg7pH3.js +1 -0
  60. package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +1 -0
  61. package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +2 -0
  62. package/dist/gateway/static/root/assets/goals-settings-B5nI6lgz.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CIv42nJD.js +1 -0
  64. package/dist/gateway/static/root/assets/heartbeat-settings-DFcVuJ3M.js +1 -0
  65. package/dist/gateway/static/root/assets/html-workspace-editor-CQLWDiwE.js +1 -0
  66. package/dist/gateway/static/root/assets/index-5A_ZaABy.css +1 -0
  67. package/dist/gateway/static/root/assets/index-BTmbp2AU.js +121 -0
  68. package/dist/gateway/static/root/assets/interval-presets-DGP3S7OB.js +1 -0
  69. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-fETaDYQP.js +1 -0
  70. package/dist/gateway/static/root/assets/locale-store-DjbfSsfA.js +1 -0
  71. package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +2 -0
  72. package/dist/gateway/static/root/assets/markdown-editor-AssmZFx4.js +2 -0
  73. package/dist/gateway/static/root/assets/markdown-split-CgeBJMOD.js +1 -0
  74. package/dist/gateway/static/root/assets/media-plugins-C30GzlV2.js +1 -0
  75. package/dist/gateway/static/root/assets/mermaid-render-BbqDc_LQ.js +134 -0
  76. package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +3 -0
  77. package/dist/gateway/static/root/assets/middleware-Pd0e8Igk.js +1 -0
  78. package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +2 -0
  79. package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +2 -0
  80. package/dist/gateway/static/root/assets/note-image-lightbox-t1g0qZYh.js +1 -0
  81. package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +1 -0
  82. package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +1 -0
  83. package/dist/gateway/static/root/assets/preview-open-alternatives-DeWp9x5g.js +1 -0
  84. package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +1 -0
  85. package/dist/gateway/static/root/assets/save-bar-controls-BOaAOJI3.js +1 -0
  86. package/dist/gateway/static/root/assets/schedule-field-BLWLKqgw.js +1 -0
  87. package/dist/gateway/static/root/assets/schema-form-plqRFYT8.js +1 -0
  88. package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +1 -0
  89. package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +1 -0
  90. package/dist/gateway/static/root/assets/settings-collapsible-section-BP5zRrDI.js +1 -0
  91. package/dist/gateway/static/root/assets/settings-form-section-Bv8MZplG.js +1 -0
  92. package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +1 -0
  93. package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +1 -0
  94. package/dist/gateway/static/root/assets/share-preview-page-4OX1YCgp.js +2 -0
  95. package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +1 -0
  96. package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +1 -0
  97. package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +2 -0
  98. package/dist/gateway/static/root/assets/system-settings-panel-CGy4f_s2.js +1 -0
  99. package/dist/gateway/static/root/assets/theme-store-CD2wtgZV.js +1 -0
  100. package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +1 -0
  101. package/dist/gateway/static/root/assets/use-blob-object-url-D4BFuzZB.js +1 -0
  102. package/dist/gateway/static/root/assets/use-channel-catalog-CjGHnDvN.js +1 -0
  103. package/dist/gateway/static/root/assets/use-settings-tab-guard-BMMFa0oA.js +1 -0
  104. package/dist/gateway/static/root/assets/vendor-codemirror-CNP1wPe7.js +45 -0
  105. package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +1 -0
  106. package/dist/gateway/static/root/assets/voice-player-store-D5vzWwls.js +1 -0
  107. package/dist/gateway/static/root/assets/{workflow-page.utils-EYg_xBQS.js → workflow-page.utils-tjGpRVnw.js} +1 -1
  108. package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.js +18 -0
  109. package/dist/gateway/static/root/favicon-16x16.png +0 -0
  110. package/dist/gateway/static/root/favicon-32x32.png +0 -0
  111. package/dist/gateway/static/root/favicon.ico +0 -0
  112. package/dist/gateway/static/root/favicon.svg +14 -12
  113. package/dist/gateway/static/root/index.html +18 -15
  114. package/dist/package.js +1 -1
  115. package/dist/src/agent/agent-manager.d.ts +28 -2
  116. package/dist/src/agent/agent-manager.js +82 -11
  117. package/dist/src/agent/agent-manager.js.map +1 -1
  118. package/dist/src/agent/agent-scope.js +1 -1
  119. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  120. package/dist/src/agent/context/workspace-seed.js +2 -2
  121. package/dist/src/agent/context/workspace-state.js +1 -1
  122. package/dist/src/agent/context/workspace.js +1 -1
  123. package/dist/src/agent/goals/checklist-judge.d.ts +5 -0
  124. package/dist/src/agent/goals/checklist-judge.js +26 -2
  125. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  126. package/dist/src/agent/goals/evaluate-turn.d.ts +5 -1
  127. package/dist/src/agent/goals/evaluate-turn.js +29 -3
  128. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  129. package/dist/src/agent/goals/goal-locale.d.ts +0 -2
  130. package/dist/src/agent/goals/goal-locale.js +3 -16
  131. package/dist/src/agent/goals/goal-locale.js.map +1 -1
  132. package/dist/src/agent/goals/persistent-goal-service.d.ts +9 -0
  133. package/dist/src/agent/goals/persistent-goal-service.js +3 -2
  134. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  135. package/dist/src/agent/goals/post-turn.d.ts +7 -0
  136. package/dist/src/agent/goals/post-turn.js +70 -25
  137. package/dist/src/agent/goals/post-turn.js.map +1 -1
  138. package/dist/src/agent/goals/state.d.ts +0 -5
  139. package/dist/src/agent/goals/state.js +1 -96
  140. package/dist/src/agent/goals/state.js.map +1 -1
  141. package/dist/src/agent/image/load-image-media.js +2 -2
  142. package/dist/src/agent/ipc/inbox.js +3 -3
  143. package/dist/src/agent/ipc/socket.js +1 -1
  144. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  145. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  146. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  147. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  148. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  149. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  150. package/dist/src/agent/memory/dreaming/events.js +1 -1
  151. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  152. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  153. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  155. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  156. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  157. package/dist/src/agent/memory/memory-flush.js +1 -1
  158. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  159. package/dist/src/agent/messaging/command-handler.d.ts +7 -0
  160. package/dist/src/agent/messaging/command-handler.js +11 -2
  161. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/prompt/memory/index.js +1 -1
  164. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  165. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  166. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  167. package/dist/src/agent/sandbox/path-policy.js +2 -2
  168. package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
  169. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  170. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  171. package/dist/src/agent/service/process-direct-streaming.js +10 -1
  172. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  173. package/dist/src/agent/service/reconcile-dreaming-cron.js +8 -5
  174. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -1
  175. package/dist/src/agent/service.d.ts +2 -1
  176. package/dist/src/agent/service.js +30 -6
  177. package/dist/src/agent/service.js.map +1 -1
  178. package/dist/src/agent/service.types.d.ts +12 -0
  179. package/dist/src/agent/session/session-config-service.d.ts +8 -0
  180. package/dist/src/agent/session/session-config-service.js +20 -0
  181. package/dist/src/agent/session/session-config-service.js.map +1 -1
  182. package/dist/src/agent/session/session-inspector.js +1 -1
  183. package/dist/src/agent/skills/config.js +2 -2
  184. package/dist/src/agent/skills/filesystem-watcher.d.ts +19 -0
  185. package/dist/src/agent/skills/filesystem-watcher.js +182 -0
  186. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -0
  187. package/dist/src/agent/skills/hub-hash.js +2 -2
  188. package/dist/src/agent/skills/hub-lock.js +1 -1
  189. package/dist/src/agent/skills/hub-pull.js +30 -36
  190. package/dist/src/agent/skills/hub-pull.js.map +1 -1
  191. package/dist/src/agent/skills/index.js +82 -38
  192. package/dist/src/agent/skills/index.js.map +1 -1
  193. package/dist/src/agent/skills/installer.js +2 -2
  194. package/dist/src/agent/skills/managed-store.d.ts +19 -0
  195. package/dist/src/agent/skills/managed-store.js +97 -38
  196. package/dist/src/agent/skills/managed-store.js.map +1 -1
  197. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  198. package/dist/src/agent/skills/skill-manager.d.ts +16 -6
  199. package/dist/src/agent/skills/skill-manager.js +79 -24
  200. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  201. package/dist/src/agent/skills/skill-view-path.js +1 -1
  202. package/dist/src/agent/skills/test-framework.js +1 -1
  203. package/dist/src/agent/skills/types.d.ts +11 -0
  204. package/dist/src/agent/skills/watcher.js +1 -1
  205. package/dist/src/agent/starter-agents.js +1 -1
  206. package/dist/src/agent/tools/cronjob-tool.d.ts +8 -3
  207. package/dist/src/agent/tools/cronjob-tool.js +82 -24
  208. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  209. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  210. package/dist/src/agent/tools/edit.d.ts +2 -0
  211. package/dist/src/agent/tools/edit.js +10 -0
  212. package/dist/src/agent/tools/edit.js.map +1 -1
  213. package/dist/src/agent/tools/factory.js +17 -4
  214. package/dist/src/agent/tools/factory.js.map +1 -1
  215. package/dist/src/agent/tools/find.js +1 -1
  216. package/dist/src/agent/tools/goal-evidence-recorder.d.ts +6 -0
  217. package/dist/src/agent/tools/goal-evidence-recorder.js +34 -0
  218. package/dist/src/agent/tools/goal-evidence-recorder.js.map +1 -0
  219. package/dist/src/agent/tools/goal-tool.d.ts +19 -0
  220. package/dist/src/agent/tools/goal-tool.js +101 -0
  221. package/dist/src/agent/tools/goal-tool.js.map +1 -0
  222. package/dist/src/agent/tools/grep.js +1 -1
  223. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  224. package/dist/src/agent/tools/index.d.ts +1 -0
  225. package/dist/src/agent/tools/index.js +2 -1
  226. package/dist/src/agent/tools/shell.d.ts +2 -0
  227. package/dist/src/agent/tools/shell.js +17 -2
  228. package/dist/src/agent/tools/shell.js.map +1 -1
  229. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  230. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  231. package/dist/src/agent/tools/workflow-tool.js +11 -3
  232. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  233. package/dist/src/agent/tools/write.d.ts +2 -0
  234. package/dist/src/agent/tools/write.js +11 -0
  235. package/dist/src/agent/tools/write.js.map +1 -1
  236. package/dist/src/agent/workflow/catalog.js +1 -1
  237. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -0
  238. package/dist/src/agent/workspace-runtime/registry.js +7 -0
  239. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  240. package/dist/src/ai-assist/text-assist.d.ts +39 -0
  241. package/dist/src/ai-assist/text-assist.js +234 -0
  242. package/dist/src/ai-assist/text-assist.js.map +1 -0
  243. package/dist/src/auth/credentials.js +2 -2
  244. package/dist/src/auth/profiles/store.js +2 -2
  245. package/dist/src/auth/sync-provider-auth.js +1 -1
  246. package/dist/src/browser/cache-dir-policy.js +1 -1
  247. package/dist/src/browser/cdp-local-launcher.js +2 -2
  248. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  249. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  250. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  251. package/dist/src/browser/stealth.js +1 -1
  252. package/dist/src/channels/attachments/inbound-persist.d.ts +7 -0
  253. package/dist/src/channels/attachments/inbound-persist.js +20 -2
  254. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  255. package/dist/src/channels/outbound/persist-store.js +1 -1
  256. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/chat-commands/agent-edit.js +2 -2
  259. package/dist/src/chat-commands/builtins/config.js +3 -3
  260. package/dist/src/chat-commands/builtins/goal.d.ts +1 -1
  261. package/dist/src/chat-commands/builtins/goal.js +55 -97
  262. package/dist/src/chat-commands/builtins/goal.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/subgoal.d.ts +1 -1
  264. package/dist/src/chat-commands/builtins/subgoal.js +49 -108
  265. package/dist/src/chat-commands/builtins/subgoal.js.map +1 -1
  266. package/dist/src/chat-commands/builtins/system.js +11 -4
  267. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  268. package/dist/src/chat-commands/builtins/workflow.js +132 -8
  269. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  270. package/dist/src/chat-commands/context.d.ts +6 -0
  271. package/dist/src/chat-commands/context.js +12 -0
  272. package/dist/src/chat-commands/context.js.map +1 -1
  273. package/dist/src/chat-commands/types.d.ts +7 -0
  274. package/dist/src/cli/command-catalog.js +43 -0
  275. package/dist/src/cli/command-catalog.js.map +1 -1
  276. package/dist/src/cli/command-loaders.js +1 -0
  277. package/dist/src/cli/command-loaders.js.map +1 -1
  278. package/dist/src/cli/command-manifest.js +4 -0
  279. package/dist/src/cli/command-manifest.js.map +1 -1
  280. package/dist/src/cli/commands/config.js +1 -1
  281. package/dist/src/cli/commands/cron.js +55 -16
  282. package/dist/src/cli/commands/cron.js.map +1 -1
  283. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  284. package/dist/src/cli/commands/doctor/checks/cron-health.js +2 -83
  285. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  287. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  290. package/dist/src/cli/commands/extension-create.js +1 -1
  291. package/dist/src/cli/commands/extension-dev.js +2 -2
  292. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  293. package/dist/src/cli/commands/extension-pack.js +2 -2
  294. package/dist/src/cli/commands/extension.js +3 -3
  295. package/dist/src/cli/commands/gateway/logs.js +1 -1
  296. package/dist/src/cli/commands/goal.d.ts +4 -0
  297. package/dist/src/cli/commands/goal.js +213 -0
  298. package/dist/src/cli/commands/goal.js.map +1 -0
  299. package/dist/src/cli/commands/image.js +1 -1
  300. package/dist/src/cli/commands/init.js +2 -2
  301. package/dist/src/cli/commands/models.js +1 -1
  302. package/dist/src/cli/commands/onboard.js +11 -5
  303. package/dist/src/cli/commands/onboard.js.map +1 -1
  304. package/dist/src/cli/commands/skills-test.js +1 -1
  305. package/dist/src/cli/templates.js +1 -1
  306. package/dist/src/cli/utils/gateway-client.js +1 -1
  307. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  308. package/dist/src/config/agent-profile.js +1 -1
  309. package/dist/src/config/agent-typed-models.js +1 -1
  310. package/dist/src/config/gateway-bind.js +1 -1
  311. package/dist/src/config/index.js +8 -8
  312. package/dist/src/config/loader.js +4 -4
  313. package/dist/src/config/models-json.js +2 -2
  314. package/dist/src/config/paths-state.js +1 -1
  315. package/dist/src/config/paths.js +1 -1
  316. package/dist/src/config/profile.js +1 -1
  317. package/dist/src/config/reload.js +1 -1
  318. package/dist/src/config/schema.d.ts +115 -2
  319. package/dist/src/config/schema.js +63 -7
  320. package/dist/src/config/schema.js.map +1 -1
  321. package/dist/src/config/web-patch.d.ts +14 -1
  322. package/dist/src/config/web-patch.js +45 -8
  323. package/dist/src/config/web-patch.js.map +1 -1
  324. package/dist/src/config/workspace-path.js +1 -1
  325. package/dist/src/cron/executor.d.ts +2 -0
  326. package/dist/src/cron/executor.js +126 -70
  327. package/dist/src/cron/executor.js.map +1 -1
  328. package/dist/src/cron/index.d.ts +1 -1
  329. package/dist/src/cron/index.js +3 -3
  330. package/dist/src/cron/job-content.js +1 -0
  331. package/dist/src/cron/job-content.js.map +1 -1
  332. package/dist/src/cron/run-log-store.d.ts +1 -0
  333. package/dist/src/cron/run-log-store.js +4 -2
  334. package/dist/src/cron/run-log-store.js.map +1 -1
  335. package/dist/src/cron/schedule.d.ts +10 -0
  336. package/dist/src/cron/schedule.js +85 -0
  337. package/dist/src/cron/schedule.js.map +1 -0
  338. package/dist/src/cron/service.d.ts +34 -77
  339. package/dist/src/cron/service.js +327 -264
  340. package/dist/src/cron/service.js.map +1 -1
  341. package/dist/src/cron/types.d.ts +97 -49
  342. package/dist/src/cron/validation.d.ts +374 -86
  343. package/dist/src/cron/validation.js +156 -129
  344. package/dist/src/cron/validation.js.map +1 -1
  345. package/dist/src/cron/workflow-run-completion.js +1 -1
  346. package/dist/src/daemon/constants.js +1 -1
  347. package/dist/src/daemon/install-plan.js +2 -2
  348. package/dist/src/daemon/launchd.js +2 -2
  349. package/dist/src/daemon/schtasks.js +2 -2
  350. package/dist/src/daemon/systemd.js +2 -2
  351. package/dist/src/extensions/bundle-mcp.js +1 -1
  352. package/dist/src/extensions/discover-extensions.js +2 -2
  353. package/dist/src/extensions/health.js +1 -1
  354. package/dist/src/extensions/install.js +2 -2
  355. package/dist/src/extensions/loader.js +2 -2
  356. package/dist/src/extensions/lockfile.js +3 -3
  357. package/dist/src/extensions/security.js +1 -1
  358. package/dist/src/extensions/update.js +2 -2
  359. package/dist/src/gateway/agents-admin.js +2 -2
  360. package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
  361. package/dist/src/gateway/chat-stream/mapper.js +6 -2
  362. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  363. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
  364. package/dist/src/gateway/file-path-classifier.js +2 -2
  365. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -1
  366. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  367. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  368. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  369. package/dist/src/gateway/hono/oauth-async.js +1 -1
  370. package/dist/src/gateway/hono/routes/agents.js +1 -1
  371. package/dist/src/gateway/hono/routes/ai-assist.d.ts +3 -0
  372. package/dist/src/gateway/hono/routes/ai-assist.js +66 -0
  373. package/dist/src/gateway/hono/routes/ai-assist.js.map +1 -0
  374. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  375. package/dist/src/gateway/hono/routes/commands-skills.js +7 -0
  376. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  377. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  378. package/dist/src/gateway/hono/routes/cron.js +24 -5
  379. package/dist/src/gateway/hono/routes/cron.js.map +1 -1
  380. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  381. package/dist/src/gateway/hono/routes/goals.d.ts +1 -1
  382. package/dist/src/gateway/hono/routes/goals.js +670 -173
  383. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  384. package/dist/src/gateway/hono/routes/home.d.ts +5 -0
  385. package/dist/src/gateway/hono/routes/home.js +90 -3
  386. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  387. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  388. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  389. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  390. package/dist/src/gateway/hono/routes/models.js +1 -1
  391. package/dist/src/gateway/hono/routes/notes.js +20 -14
  392. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  393. package/dist/src/gateway/hono/routes/shares.js +1 -1
  394. package/dist/src/gateway/hono/routes/workflows.js +8 -4
  395. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  397. package/dist/src/gateway/hono/sse.js.map +1 -1
  398. package/dist/src/gateway/lock.js +3 -3
  399. package/dist/src/gateway/ports.js +1 -1
  400. package/dist/src/gateway/service/agent-runner.d.ts +2 -0
  401. package/dist/src/gateway/service/agent-runner.js +8 -4
  402. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  403. package/dist/src/gateway/service/config-coordinator.js +1 -1
  404. package/dist/src/gateway/service/marketplace-service.d.ts +22 -10
  405. package/dist/src/gateway/service/marketplace-service.js +46 -5
  406. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  407. package/dist/src/gateway/service/run-gateway-agent.d.ts +3 -0
  408. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  409. package/dist/src/gateway/service.d.ts +8 -0
  410. package/dist/src/gateway/service.js +79 -6
  411. package/dist/src/gateway/service.js.map +1 -1
  412. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  413. package/dist/src/goals/goal-notifications.d.ts +29 -0
  414. package/dist/src/goals/goal-notifications.js +154 -0
  415. package/dist/src/goals/goal-notifications.js.map +1 -0
  416. package/dist/src/goals/goal-queue-store.d.ts +16 -0
  417. package/dist/src/goals/goal-queue-store.js +131 -0
  418. package/dist/src/goals/goal-queue-store.js.map +1 -0
  419. package/dist/src/goals/goal-queue-types.d.ts +31 -0
  420. package/dist/src/goals/goal-queue-types.js +1 -0
  421. package/dist/src/goals/goal-runner.d.ts +17 -0
  422. package/dist/src/goals/goal-runner.js +127 -0
  423. package/dist/src/goals/goal-runner.js.map +1 -0
  424. package/dist/src/goals/goal-service.d.ts +77 -0
  425. package/dist/src/goals/goal-service.js +261 -0
  426. package/dist/src/goals/goal-service.js.map +1 -0
  427. package/dist/src/goals/goal-store.d.ts +38 -0
  428. package/dist/src/goals/goal-store.js +404 -0
  429. package/dist/src/goals/goal-store.js.map +1 -0
  430. package/dist/src/goals/goal-workflow-judge.d.ts +13 -0
  431. package/dist/src/goals/goal-workflow-judge.js +147 -0
  432. package/dist/src/goals/goal-workflow-judge.js.map +1 -0
  433. package/dist/src/goals/index.d.ts +10 -0
  434. package/dist/src/goals/index.js +7 -0
  435. package/dist/src/goals/types.d.ts +119 -0
  436. package/dist/src/goals/types.js +1 -0
  437. package/dist/src/i18n/goals-bundle.js +1 -1
  438. package/dist/src/i18n/index.js +1 -1
  439. package/dist/src/i18n/share-tool-bundle.js +2 -2
  440. package/dist/src/infra/brew.js +1 -1
  441. package/dist/src/infra/package-json.js +1 -1
  442. package/dist/src/infra/package-update-steps.js +1 -1
  443. package/dist/src/infra/path-env.js +2 -2
  444. package/dist/src/infra/restart.js +1 -1
  445. package/dist/src/infra/stable-node-path.js +1 -1
  446. package/dist/src/infra/update-check.js +1 -1
  447. package/dist/src/infra/update-global.js +1 -1
  448. package/dist/src/infra/update-lock.js +2 -2
  449. package/dist/src/infra/update-restart.js +1 -1
  450. package/dist/src/infra/update-runner.js +1 -1
  451. package/dist/src/infra/update-startup.js +1 -1
  452. package/dist/src/infra/write-file-atomic.js +2 -2
  453. package/dist/src/media/store.js +1 -1
  454. package/dist/src/notes/agent-context.js +1 -1
  455. package/dist/src/notes/service.js +1 -1
  456. package/dist/src/notes/store.js +2 -2
  457. package/dist/src/project-trust/trust-store.js +2 -2
  458. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  459. package/dist/src/providers/index.js +1 -1
  460. package/dist/src/providers/model-registry.js +4 -4
  461. package/dist/src/session/init-session-turn.js +2 -2
  462. package/dist/src/session/resolve-session.js +3 -3
  463. package/dist/src/session/session-title.js +2 -2
  464. package/dist/src/session/store.js +1 -1
  465. package/dist/src/share/share-auto.js +2 -2
  466. package/dist/src/share/share-store.js +3 -3
  467. package/dist/src/share/share-thumbnail.js +2 -2
  468. package/dist/src/share/share-zip.js +1 -1
  469. package/dist/src/share/site-share-store.js +3 -3
  470. package/dist/src/share/site-static-serve.js +1 -1
  471. package/dist/src/storage/sqlite/connection.js +1 -1
  472. package/dist/src/storage/sqlite/cron-job-repository.d.ts +6 -0
  473. package/dist/src/storage/sqlite/cron-job-repository.js +70 -0
  474. package/dist/src/storage/sqlite/cron-job-repository.js.map +1 -0
  475. package/dist/src/storage/sqlite/cron-run-repository.js +0 -1
  476. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/index.d.ts +1 -0
  478. package/dist/src/storage/sqlite/index.js +2 -1
  479. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  480. package/dist/src/storage/sqlite/migrations/006_add_goals.sql +108 -0
  481. package/dist/src/storage/sqlite/migrations/007_goal_run_judge_schema.sql +4 -0
  482. package/dist/src/storage/sqlite/migrations/008_goal_queue_workflow_runs.sql +53 -0
  483. package/dist/src/storage/sqlite/migrations/009_cron_jobs.sql +24 -0
  484. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  485. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  486. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  487. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  488. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  489. package/dist/src/storage/sqlite/schema.js +2 -2
  490. package/dist/src/storage/sqlite/schema.sql +188 -0
  491. package/dist/src/tui/clipboard-image.js +3 -3
  492. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  493. package/dist/src/tui/theme-manager.js +1 -1
  494. package/dist/src/tui/tui-command-formatters.js +4 -4
  495. package/dist/src/tui/tui-commands.js +2 -2
  496. package/dist/src/tui/tui-keybindings-file.js +1 -1
  497. package/dist/src/tui/tui-scoped-models.js +2 -2
  498. package/dist/src/tui/tui-settings.js +1 -1
  499. package/dist/src/tui/tui-startup-resources.js +1 -1
  500. package/dist/src/tui/tui.js +6 -6
  501. package/dist/src/tunnel/frpc-binary.js +4 -4
  502. package/dist/src/tunnel/frpc-config.js +1 -1
  503. package/dist/src/tunnel/frpc-extract.js +1 -1
  504. package/dist/src/tunnel/tunnel-state.js +1 -1
  505. package/dist/src/utils/logger/audit.js +1 -1
  506. package/dist/src/utils/logger/log-store.js +1 -1
  507. package/dist/src/utils/logger/rotation.js +1 -1
  508. package/dist/src/utils/logger/stats.d.ts +1 -1
  509. package/dist/src/utils/logger/streams.js +1 -1
  510. package/dist/src/voice/tts/audio.js +1 -1
  511. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  512. package/dist/src/workflows/domain/run.d.ts +1 -0
  513. package/dist/src/workflows/domain/run.js.map +1 -1
  514. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  515. package/dist/src/workflows/engine/projector.js +23 -14
  516. package/dist/src/workflows/engine/projector.js.map +1 -1
  517. package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
  518. package/dist/src/workflows/engine/workflow-engine.js +36 -0
  519. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  520. package/dist/src/workflows/index.js +1 -1
  521. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  522. package/dist/src/workflows/service/workflow-run-service.js +7 -3
  523. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  524. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
  525. package/dist/src/workflows/service/workflow-session-bridge.js +8 -1
  526. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  527. package/dist/src/workflows/store/event-store.js +1 -1
  528. package/dist/src/workflows/store/run-index-store.d.ts +8 -0
  529. package/dist/src/workflows/store/run-index-store.js +58 -0
  530. package/dist/src/workflows/store/run-index-store.js.map +1 -0
  531. package/dist/src/workflows/store/run-store.d.ts +2 -0
  532. package/dist/src/workflows/store/run-store.js +15 -22
  533. package/dist/src/workflows/store/run-store.js.map +1 -1
  534. package/package.json +10 -5
  535. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  536. package/dist/gateway/static/root/assets/agents-CFFioJCI.js +0 -78
  537. package/dist/gateway/static/root/assets/apps-page-BYDmkbzG.js +0 -1
  538. package/dist/gateway/static/root/assets/channels-settings-CsbDaMvd.js +0 -1
  539. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +0 -1
  540. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +0 -1
  541. package/dist/gateway/static/root/assets/cron-page-Apk-7p4p.js +0 -1
  542. package/dist/gateway/static/root/assets/dist-DmGDgpy2.js +0 -1
  543. package/dist/gateway/static/root/assets/extension-debug-page-pxFC-tUa.js +0 -1
  544. package/dist/gateway/static/root/assets/extension-settings-page-COXSv6xP.js +0 -1
  545. package/dist/gateway/static/root/assets/fetch-CFdKBnE6.js +0 -1
  546. package/dist/gateway/static/root/assets/gateway-startup-retry-DdngdObI.js +0 -1
  547. package/dist/gateway/static/root/assets/heartbeat-config-api-DcmAMYmN.js +0 -1
  548. package/dist/gateway/static/root/assets/index-C_2yKRJX.js +0 -4845
  549. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +0 -1
  550. package/dist/gateway/static/root/assets/logs-page-DvTWUOzd.js +0 -2
  551. package/dist/gateway/static/root/assets/note-detail-page-CZbdugWZ.js +0 -180
  552. package/dist/gateway/static/root/assets/note-time-RdyBZxj3.js +0 -1
  553. package/dist/gateway/static/root/assets/notes-page-mEAwy3e1.js +0 -1
  554. package/dist/gateway/static/root/assets/schema-form-DEvdni_r.js +0 -1
  555. package/dist/gateway/static/root/assets/sessions-page-BsgffzV4.js +0 -1
  556. package/dist/gateway/static/root/assets/settings-advanced-gate-t6v8Dwb8.js +0 -2
  557. package/dist/gateway/static/root/assets/settings-form-section-BoYYZmJG.js +0 -1
  558. package/dist/gateway/static/root/assets/settings-page-ClIthYF8.js +0 -3
  559. package/dist/gateway/static/root/assets/share-preview-page-Dd9et7KD.js +0 -2
  560. package/dist/gateway/static/root/assets/skills-page-DEXtxyfQ.js +0 -2
  561. package/dist/gateway/static/root/assets/theme-store-BZozwAeK.js +0 -1
  562. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +0 -3
  563. package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +0 -45
  564. package/dist/gateway/static/root/assets/voice-api-key-field-CNrKzQrf.js +0 -1
  565. package/dist/gateway/static/root/assets/workflows-page-EMZkzJNN.js +0 -18
  566. package/dist/gateway/static/root/favicon-16.png +0 -0
  567. package/dist/gateway/static/root/favicon-32.png +0 -0
  568. package/dist/src/agent/goals/checklist-user.d.ts +0 -24
  569. package/dist/src/agent/goals/checklist-user.js +0 -92
  570. package/dist/src/agent/goals/checklist-user.js.map +0 -1
  571. package/dist/src/agent/goals/goal-run-store.d.ts +0 -19
  572. package/dist/src/agent/goals/goal-run-store.js +0 -138
  573. package/dist/src/agent/goals/goal-run-store.js.map +0 -1
  574. package/dist/src/agent/goals/goal-run-types.d.ts +0 -28
  575. package/dist/src/agent/goals/goal-run-types.js +0 -6
  576. package/dist/src/agent/goals/goal-run-types.js.map +0 -1
  577. package/dist/src/agent/goals/patch-from-user-action.d.ts +0 -20
  578. package/dist/src/agent/goals/patch-from-user-action.js +0 -103
  579. package/dist/src/agent/goals/patch-from-user-action.js.map +0 -1
  580. package/dist/src/cron/persistence.d.ts +0 -62
  581. package/dist/src/cron/persistence.js +0 -188
  582. package/dist/src/cron/persistence.js.map +0 -1
  583. /package/dist/gateway/static/root/assets/{note-detail-page-D4ZIVQbk.css → block-editor-D4ZIVQbk.css} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"goal-run-store.js","names":[],"sources":["../../../../src/agent/goals/goal-run-store.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveAgentHomeDir } from '../agent-scope.js';\nimport { writeTextAtomic } from '../../infra/write-file-atomic.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport { checklistCounts } from './checklist-types.js';\nimport type { GoalPostTurnDecision } from './evaluate-turn.js';\nimport type { GoalRunFileV1, GoalRunRecord } from './goal-run-types.js';\nimport { GOAL_RUN_FILE_VERSION } from './goal-run-types.js';\n\nconst log = createLogger('GoalRunStore');\n\nconst MAX_REASON_CHARS = 4_000;\nconst MAX_GOAL_CHARS = 4_000;\nconst MAX_ASSISTANT_PREVIEW_CHARS = 2_000;\nconst MAX_RUNS_PER_FILE = 400;\n\nfunction truncate(s: string, max: number): string {\n const t = s.trim();\n if (t.length <= max) return t;\n return `${t.slice(0, max - 1)}…`;\n}\n\nexport function resolveGoalRunsFilePath(config: Config, sessionKey: string): string {\n const agentId = extractProfileAgentId(sessionKey, config);\n const home = resolveAgentHomeDir(config, agentId);\n const hash = createHash('sha256').update(sessionKey, 'utf8').digest('hex');\n return join(home, 'goal-runs', `${hash}.json`);\n}\n\nfunction isGoalRunFileV1(x: unknown): x is GoalRunFileV1 {\n if (!x || typeof x !== 'object' || Array.isArray(x)) return false;\n const o = x as Record<string, unknown>;\n if (o.version !== GOAL_RUN_FILE_VERSION) return false;\n if (typeof o.sessionKey !== 'string' || !o.sessionKey.trim()) return false;\n if (!Array.isArray(o.runs)) return false;\n return true;\n}\n\nfunction parseGoalRunFile(raw: string): GoalRunFileV1 | null {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isGoalRunFileV1(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction buildRecordFromDecision(\n sessionKey: string,\n decision: GoalPostTurnDecision,\n assistantPlainText: string,\n): GoalRunRecord | null {\n const ns = decision.newState;\n if (!ns) return null;\n const items = ns.checklist ?? [];\n const progress =\n items.length > 0\n ? (() => {\n const c = checklistCounts(items);\n return { done: c.completed + c.impossible, total: c.total };\n })()\n : undefined;\n\n return {\n id: randomUUID(),\n at: Date.now(),\n goalTitle: truncate(ns.goal, MAX_GOAL_CHARS),\n turnsUsed: ns.turnsUsed,\n maxTurns: ns.maxTurns,\n verdict: decision.verdict,\n statusAfter: ns.status,\n ...(decision.reason.trim() ? { reason: truncate(decision.reason, MAX_REASON_CHARS) } : {}),\n willContinue: decision.shouldContinue,\n ...(progress ? { checklistProgress: progress } : {}),\n ...(assistantPlainText.trim()\n ? { assistantPreview: truncate(assistantPlainText, MAX_ASSISTANT_PREVIEW_CHARS) }\n : {}),\n };\n}\n\n/**\n * Append one run after persistent-goal post-turn evaluation (best-effort; logs on failure).\n */\nexport async function appendGoalRun(opts: {\n config: Config;\n sessionKey: string;\n decision: GoalPostTurnDecision;\n assistantPlainText: string;\n}): Promise<void> {\n const { config, sessionKey, decision, assistantPlainText } = opts;\n const record = buildRecordFromDecision(sessionKey, decision, assistantPlainText);\n if (!record) return;\n\n const filePath = resolveGoalRunsFilePath(config, sessionKey);\n\n let existing: GoalRunFileV1 = {\n version: GOAL_RUN_FILE_VERSION,\n sessionKey,\n runs: [],\n };\n\n try {\n const raw = await readFile(filePath, 'utf8');\n const parsed = parseGoalRunFile(raw);\n if (parsed) {\n if (parsed.sessionKey !== sessionKey) {\n log.warn({ sessionKey, filePath }, 'Goal run file sessionKey mismatch; refusing append');\n return;\n }\n existing = parsed;\n }\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as NodeJS.ErrnoException).code) : '';\n if (code !== 'ENOENT') {\n log.warn(\n { err, sessionKey, filePath },\n `Goal run read failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n }\n\n const nextRuns = [...existing.runs, record];\n const trimmed =\n nextRuns.length > MAX_RUNS_PER_FILE ? nextRuns.slice(nextRuns.length - MAX_RUNS_PER_FILE) : nextRuns;\n\n const out: GoalRunFileV1 = {\n version: GOAL_RUN_FILE_VERSION,\n sessionKey,\n runs: trimmed,\n };\n\n await writeTextAtomic(filePath, `${JSON.stringify(out, null, 2)}\\n`);\n}\n\n/**\n * List runs for a session (newest first). Missing or invalid file yields [].\n */\nexport async function listGoalRuns(\n config: Config,\n sessionKey: string,\n opts?: { limit?: number },\n): Promise<GoalRunRecord[]> {\n const limit = Math.min(500, Math.max(1, Math.floor(opts?.limit ?? 50)));\n const filePath = resolveGoalRunsFilePath(config, sessionKey);\n let raw: string;\n try {\n raw = await readFile(filePath, 'utf8');\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as NodeJS.ErrnoException).code) : '';\n if (code === 'ENOENT') return [];\n log.debug(\n { err, sessionKey, filePath },\n `Goal run list read failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return [];\n }\n const parsed = parseGoalRunFile(raw);\n if (!parsed || parsed.sessionKey !== sessionKey) return [];\n const rev = [...parsed.runs].reverse();\n return rev.slice(0, limit);\n}\n"],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import type { PersistentGoalStatus } from './state.js';
2
- /** Matches {@link GoalPostTurnDecision} `verdict` for persisted runs. */
3
- export type GoalRunVerdict = 'done' | 'continue' | 'skipped' | 'inactive' | 'decompose';
4
- export declare const GOAL_RUN_FILE_VERSION: 1;
5
- export interface GoalRunChecklistProgress {
6
- done: number;
7
- total: number;
8
- }
9
- /** One persisted evaluation after an assistant turn (Hermes post-turn). */
10
- export interface GoalRunRecord {
11
- id: string;
12
- at: number;
13
- goalTitle: string;
14
- turnsUsed: number;
15
- maxTurns: number;
16
- verdict: GoalRunVerdict;
17
- statusAfter: PersistentGoalStatus;
18
- reason?: string;
19
- willContinue: boolean;
20
- checklistProgress?: GoalRunChecklistProgress;
21
- /** Truncated assistant visible text for this turn (context, not full transcript). */
22
- assistantPreview?: string;
23
- }
24
- export interface GoalRunFileV1 {
25
- version: typeof GOAL_RUN_FILE_VERSION;
26
- sessionKey: string;
27
- runs: GoalRunRecord[];
28
- }
@@ -1,6 +0,0 @@
1
- //#region src/agent/goals/goal-run-types.ts
2
- const GOAL_RUN_FILE_VERSION = 1;
3
- //#endregion
4
- export { GOAL_RUN_FILE_VERSION };
5
-
6
- //# sourceMappingURL=goal-run-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"goal-run-types.js","names":[],"sources":["../../../../src/agent/goals/goal-run-types.ts"],"sourcesContent":["import type { PersistentGoalStatus } from './state.js';\n\n/** Matches {@link GoalPostTurnDecision} `verdict` for persisted runs. */\nexport type GoalRunVerdict = 'done' | 'continue' | 'skipped' | 'inactive' | 'decompose';\n\nexport const GOAL_RUN_FILE_VERSION = 1 as const;\n\nexport interface GoalRunChecklistProgress {\n done: number;\n total: number;\n}\n\n/** One persisted evaluation after an assistant turn (Hermes post-turn). */\nexport interface GoalRunRecord {\n id: string;\n at: number;\n goalTitle: string;\n turnsUsed: number;\n maxTurns: number;\n verdict: GoalRunVerdict;\n statusAfter: PersistentGoalStatus;\n reason?: string;\n willContinue: boolean;\n checklistProgress?: GoalRunChecklistProgress;\n /** Truncated assistant visible text for this turn (context, not full transcript). */\n assistantPreview?: string;\n}\n\nexport interface GoalRunFileV1 {\n version: typeof GOAL_RUN_FILE_VERSION;\n sessionKey: string;\n runs: GoalRunRecord[];\n}\n"],"mappings":";AAKA,MAAa,wBAAwB"}
@@ -1,20 +0,0 @@
1
- export type PersistentGoalUserAction = 'pause' | 'resume' | 'clear' | 'restart';
2
- export type PersistentGoalUserActionResult = {
3
- kind: 'updated';
4
- customData: Record<string, unknown>;
5
- kickoff?: string;
6
- } | {
7
- kind: 'noop';
8
- message: string;
9
- } | {
10
- kind: 'error';
11
- error: string;
12
- };
13
- export interface GoalsConfigSlice {
14
- maxTurns?: number;
15
- judgeModelRef?: string;
16
- }
17
- /**
18
- * Pure transition for `/goal` slash and `POST /api/goals/webchat` so behaviour stays aligned.
19
- */
20
- export declare function applyPersistentGoalUserAction(customData: Record<string, unknown> | undefined, action: PersistentGoalUserAction, goalsCfg?: GoalsConfigSlice): PersistentGoalUserActionResult;
@@ -1,103 +0,0 @@
1
- import { PERSISTENT_GOAL_CUSTOM_KEY, defaultMaxTurns, mergeCustomDataPatch, readPersistentGoal, serializePersistentGoal } from "./state.js";
2
- //#region src/agent/goals/patch-from-user-action.ts
3
- function baseCustomData(customData) {
4
- return { ...customData ?? {} };
5
- }
6
- /**
7
- * Pure transition for `/goal` slash and `POST /api/goals/webchat` so behaviour stays aligned.
8
- */
9
- function applyPersistentGoalUserAction(customData, action, goalsCfg) {
10
- const s = readPersistentGoal(customData);
11
- if (action === "clear") {
12
- if (!s || s.status === "cleared") return {
13
- kind: "noop",
14
- message: "No active goal."
15
- };
16
- const b = baseCustomData(customData);
17
- delete b[PERSISTENT_GOAL_CUSTOM_KEY];
18
- return {
19
- kind: "updated",
20
- customData: b
21
- };
22
- }
23
- if (!s || s.status === "cleared") {
24
- if (action === "pause") return {
25
- kind: "noop",
26
- message: "No goal set."
27
- };
28
- if (action === "resume") return {
29
- kind: "noop",
30
- message: "No goal to resume."
31
- };
32
- if (action === "restart") return {
33
- kind: "error",
34
- error: "No goal to restart."
35
- };
36
- return {
37
- kind: "error",
38
- error: "No goal set."
39
- };
40
- }
41
- if (action === "pause") {
42
- if (s.status !== "active") return {
43
- kind: "noop",
44
- message: statusLineForMessage(s)
45
- };
46
- const next = {
47
- ...s,
48
- status: "paused",
49
- pausedReason: "user-paused"
50
- };
51
- return {
52
- kind: "updated",
53
- customData: mergeCustomDataPatch(baseCustomData(customData), { [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next) })
54
- };
55
- }
56
- if (action === "resume") {
57
- const next = {
58
- ...s,
59
- status: "active",
60
- pausedReason: void 0,
61
- turnsUsed: 0,
62
- consecutiveParseFailures: 0
63
- };
64
- return {
65
- kind: "updated",
66
- customData: mergeCustomDataPatch(baseCustomData(customData), { [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next) })
67
- };
68
- }
69
- const maxTurns = typeof s.maxTurns === "number" && Number.isFinite(s.maxTurns) ? Math.max(1, Math.min(500, Math.floor(s.maxTurns))) : defaultMaxTurns(goalsCfg);
70
- const judgeFromCfg = typeof goalsCfg?.judgeModelRef === "string" ? goalsCfg.judgeModelRef.trim() : void 0;
71
- const judgeModelRef = (s.judgeModelRef ?? judgeFromCfg)?.trim() || void 0;
72
- const next = {
73
- goal: s.goal,
74
- status: "active",
75
- turnsUsed: 0,
76
- maxTurns,
77
- createdAt: Date.now(),
78
- lastTurnAt: 0,
79
- consecutiveParseFailures: 0,
80
- ...judgeModelRef ? { judgeModelRef } : {},
81
- ...s.uiLocale ? { uiLocale: s.uiLocale } : {},
82
- ...s.checklist?.length ? {
83
- checklist: s.checklist.map((it) => ({ ...it })),
84
- decomposed: true
85
- } : {}
86
- };
87
- return {
88
- kind: "updated",
89
- customData: mergeCustomDataPatch(baseCustomData(customData), { [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next) }),
90
- kickoff: s.goal
91
- };
92
- }
93
- function statusLineForMessage(state) {
94
- const turns = `${state.turnsUsed}/${state.maxTurns} turns`;
95
- if (state.status === "active") return `⊙ Goal (active, ${turns}): ${state.goal}`;
96
- if (state.status === "paused") return `⏸ Goal (paused, ${turns}${state.pausedReason ? ` — ${state.pausedReason}` : ""}): ${state.goal}`;
97
- if (state.status === "done") return `✓ Goal done (${turns}): ${state.goal}`;
98
- return `Goal (${state.status}, ${turns}): ${state.goal}`;
99
- }
100
- //#endregion
101
- export { applyPersistentGoalUserAction };
102
-
103
- //# sourceMappingURL=patch-from-user-action.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patch-from-user-action.js","names":[],"sources":["../../../../src/agent/goals/patch-from-user-action.ts"],"sourcesContent":["import {\n defaultMaxTurns,\n mergeCustomDataPatch,\n readPersistentGoal,\n serializePersistentGoal,\n PERSISTENT_GOAL_CUSTOM_KEY,\n type PersistentGoalState,\n} from './state.js';\n\nexport type PersistentGoalUserAction = 'pause' | 'resume' | 'clear' | 'restart';\n\nexport type PersistentGoalUserActionResult =\n | { kind: 'updated'; customData: Record<string, unknown>; kickoff?: string }\n | { kind: 'noop'; message: string }\n | { kind: 'error'; error: string };\n\nexport interface GoalsConfigSlice {\n maxTurns?: number;\n judgeModelRef?: string;\n}\n\nfunction baseCustomData(customData: Record<string, unknown> | undefined): Record<string, unknown> {\n return { ...(customData ?? {}) };\n}\n\n/**\n * Pure transition for `/goal` slash and `POST /api/goals/webchat` so behaviour stays aligned.\n */\nexport function applyPersistentGoalUserAction(\n customData: Record<string, unknown> | undefined,\n action: PersistentGoalUserAction,\n goalsCfg?: GoalsConfigSlice,\n): PersistentGoalUserActionResult {\n const s = readPersistentGoal(customData);\n\n if (action === 'clear') {\n if (!s || s.status === 'cleared') {\n return { kind: 'noop', message: 'No active goal.' };\n }\n const b = baseCustomData(customData);\n delete b[PERSISTENT_GOAL_CUSTOM_KEY];\n return { kind: 'updated', customData: b };\n }\n\n if (!s || s.status === 'cleared') {\n if (action === 'pause') return { kind: 'noop', message: 'No goal set.' };\n if (action === 'resume') return { kind: 'noop', message: 'No goal to resume.' };\n if (action === 'restart') return { kind: 'error', error: 'No goal to restart.' };\n return { kind: 'error', error: 'No goal set.' };\n }\n\n if (action === 'pause') {\n if (s.status !== 'active') {\n return { kind: 'noop', message: statusLineForMessage(s) };\n }\n const next = { ...s, status: 'paused' as const, pausedReason: 'user-paused' as const };\n return {\n kind: 'updated',\n customData: mergeCustomDataPatch(baseCustomData(customData), {\n [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next),\n }),\n };\n }\n\n if (action === 'resume') {\n const next: PersistentGoalState = {\n ...s,\n status: 'active',\n pausedReason: undefined,\n turnsUsed: 0,\n consecutiveParseFailures: 0,\n };\n return {\n kind: 'updated',\n customData: mergeCustomDataPatch(baseCustomData(customData), {\n [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next),\n }),\n };\n }\n\n // restart\n const maxTurns =\n typeof s.maxTurns === 'number' && Number.isFinite(s.maxTurns)\n ? Math.max(1, Math.min(500, Math.floor(s.maxTurns)))\n : defaultMaxTurns(goalsCfg);\n const judgeFromCfg =\n typeof goalsCfg?.judgeModelRef === 'string' ? goalsCfg.judgeModelRef.trim() : undefined;\n const judgeModelRef = (s.judgeModelRef ?? judgeFromCfg)?.trim() || undefined;\n const next: PersistentGoalState = {\n goal: s.goal,\n status: 'active',\n turnsUsed: 0,\n maxTurns,\n createdAt: Date.now(),\n lastTurnAt: 0,\n consecutiveParseFailures: 0,\n ...(judgeModelRef ? { judgeModelRef } : {}),\n ...(s.uiLocale ? { uiLocale: s.uiLocale } : {}),\n ...(s.checklist?.length\n ? {\n checklist: s.checklist.map((it) => ({ ...it })),\n decomposed: true,\n }\n : {}),\n };\n return {\n kind: 'updated',\n customData: mergeCustomDataPatch(baseCustomData(customData), {\n [PERSISTENT_GOAL_CUSTOM_KEY]: serializePersistentGoal(next),\n }),\n kickoff: s.goal,\n };\n}\n\nfunction statusLineForMessage(state: PersistentGoalState): string {\n const turns = `${state.turnsUsed}/${state.maxTurns} turns`;\n if (state.status === 'active') {\n return `⊙ Goal (active, ${turns}): ${state.goal}`;\n }\n if (state.status === 'paused') {\n const extra = state.pausedReason ? ` — ${state.pausedReason}` : '';\n return `⏸ Goal (paused, ${turns}${extra}): ${state.goal}`;\n }\n if (state.status === 'done') {\n return `✓ Goal done (${turns}): ${state.goal}`;\n }\n return `Goal (${state.status}, ${turns}): ${state.goal}`;\n}\n"],"mappings":";;AAqBA,SAAS,eAAe,YAA0E;AAChG,QAAO,EAAE,GAAI,cAAc,EAAE,EAAG;;;;;AAMlC,SAAgB,8BACd,YACA,QACA,UACgC;CAChC,MAAM,IAAI,mBAAmB,WAAW;AAExC,KAAI,WAAW,SAAS;AACtB,MAAI,CAAC,KAAK,EAAE,WAAW,UACrB,QAAO;GAAE,MAAM;GAAQ,SAAS;GAAmB;EAErD,MAAM,IAAI,eAAe,WAAW;AACpC,SAAO,EAAE;AACT,SAAO;GAAE,MAAM;GAAW,YAAY;GAAG;;AAG3C,KAAI,CAAC,KAAK,EAAE,WAAW,WAAW;AAChC,MAAI,WAAW,QAAS,QAAO;GAAE,MAAM;GAAQ,SAAS;GAAgB;AACxE,MAAI,WAAW,SAAU,QAAO;GAAE,MAAM;GAAQ,SAAS;GAAsB;AAC/E,MAAI,WAAW,UAAW,QAAO;GAAE,MAAM;GAAS,OAAO;GAAuB;AAChF,SAAO;GAAE,MAAM;GAAS,OAAO;GAAgB;;AAGjD,KAAI,WAAW,SAAS;AACtB,MAAI,EAAE,WAAW,SACf,QAAO;GAAE,MAAM;GAAQ,SAAS,qBAAqB,EAAE;GAAE;EAE3D,MAAM,OAAO;GAAE,GAAG;GAAG,QAAQ;GAAmB,cAAc;GAAwB;AACtF,SAAO;GACL,MAAM;GACN,YAAY,qBAAqB,eAAe,WAAW,EAAE,GAC1D,6BAA6B,wBAAwB,KAAK,EAC5D,CAAC;GACH;;AAGH,KAAI,WAAW,UAAU;EACvB,MAAM,OAA4B;GAChC,GAAG;GACH,QAAQ;GACR,cAAc,KAAA;GACd,WAAW;GACX,0BAA0B;GAC3B;AACD,SAAO;GACL,MAAM;GACN,YAAY,qBAAqB,eAAe,WAAW,EAAE,GAC1D,6BAA6B,wBAAwB,KAAK,EAC5D,CAAC;GACH;;CAIH,MAAM,WACJ,OAAO,EAAE,aAAa,YAAY,OAAO,SAAS,EAAE,SAAS,GACzD,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC,GAClD,gBAAgB,SAAS;CAC/B,MAAM,eACJ,OAAO,UAAU,kBAAkB,WAAW,SAAS,cAAc,MAAM,GAAG,KAAA;CAChF,MAAM,iBAAiB,EAAE,iBAAiB,eAAe,MAAM,IAAI,KAAA;CACnE,MAAM,OAA4B;EAChC,MAAM,EAAE;EACR,QAAQ;EACR,WAAW;EACX;EACA,WAAW,KAAK,KAAK;EACrB,YAAY;EACZ,0BAA0B;EAC1B,GAAI,gBAAgB,EAAE,eAAe,GAAG,EAAE;EAC1C,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,EAAE;EAC9C,GAAI,EAAE,WAAW,SACb;GACE,WAAW,EAAE,UAAU,KAAK,QAAQ,EAAE,GAAG,IAAI,EAAE;GAC/C,YAAY;GACb,GACD,EAAE;EACP;AACD,QAAO;EACL,MAAM;EACN,YAAY,qBAAqB,eAAe,WAAW,EAAE,GAC1D,6BAA6B,wBAAwB,KAAK,EAC5D,CAAC;EACF,SAAS,EAAE;EACZ;;AAGH,SAAS,qBAAqB,OAAoC;CAChE,MAAM,QAAQ,GAAG,MAAM,UAAU,GAAG,MAAM,SAAS;AACnD,KAAI,MAAM,WAAW,SACnB,QAAO,mBAAmB,MAAM,KAAK,MAAM;AAE7C,KAAI,MAAM,WAAW,SAEnB,QAAO,mBAAmB,QADZ,MAAM,eAAe,MAAM,MAAM,iBAAiB,GACxB,KAAK,MAAM;AAErD,KAAI,MAAM,WAAW,OACnB,QAAO,gBAAgB,MAAM,KAAK,MAAM;AAE1C,QAAO,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,MAAM"}
@@ -1,62 +0,0 @@
1
- import type { JobData } from './types.js';
2
- export interface JobsFile {
3
- jobs: JobData[];
4
- version: number;
5
- }
6
- export declare class CronPersistence {
7
- private filePath;
8
- private cache;
9
- private dirty;
10
- private saveTimeout;
11
- private readonly debounceMs;
12
- constructor(filePath: string);
13
- /**
14
- * Initialize the storage file
15
- */
16
- initialize(): Promise<void>;
17
- /**
18
- * Load jobs from disk (with caching)
19
- */
20
- load(): Promise<JobsFile>;
21
- /**
22
- * Save jobs to disk (debounced)
23
- */
24
- save(data: JobsFile): Promise<void>;
25
- /**
26
- * Force immediate save (sync to disk)
27
- */
28
- flush(): Promise<void>;
29
- /**
30
- * Get all jobs
31
- */
32
- getJobs(): Promise<JobData[]>;
33
- /**
34
- * Get a single job by ID
35
- */
36
- getJob(id: string): Promise<JobData | null>;
37
- /**
38
- * Add a new job
39
- */
40
- addJob(job: JobData): Promise<void>;
41
- /**
42
- * Update an existing job
43
- */
44
- updateJob(id: string, updates: Partial<JobData>, options?: {
45
- clearAgentId?: boolean;
46
- clearWorkingDirectory?: boolean;
47
- }): Promise<boolean>;
48
- /**
49
- * Remove a job
50
- */
51
- removeJob(id: string): Promise<boolean>;
52
- /** Atomic write (fsync + rename) via shared helper. */
53
- private writeToDisk;
54
- /**
55
- * Mark cache as dirty and schedule debounced save
56
- */
57
- private markDirty;
58
- /**
59
- * Clear cache (useful for testing)
60
- */
61
- clearCache(): void;
62
- }
@@ -1,188 +0,0 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
- import { JobDataSchema } from "./validation.js";
5
- import { access, readFile } from "fs/promises";
6
- //#region src/cron/persistence.ts
7
- init_write_file_atomic();
8
- init_logger();
9
- const log = createLogger("CronPersistence");
10
- const DEFAULT_JOBS_FILE = {
11
- jobs: [],
12
- version: 1
13
- };
14
- var CronPersistence = class {
15
- filePath;
16
- cache = null;
17
- dirty = false;
18
- saveTimeout = null;
19
- debounceMs = 500;
20
- constructor(filePath) {
21
- this.filePath = filePath;
22
- }
23
- /**
24
- * Initialize the storage file
25
- */
26
- async initialize() {
27
- try {
28
- await access(this.filePath);
29
- await this.load();
30
- } catch {
31
- await this.save(DEFAULT_JOBS_FILE);
32
- log.info({ path: this.filePath }, "Created new jobs file");
33
- }
34
- }
35
- /**
36
- * Load jobs from disk (with caching)
37
- */
38
- async load() {
39
- if (this.cache) return this.cache;
40
- try {
41
- const content = await readFile(this.filePath, "utf-8");
42
- const data = JSON.parse(content);
43
- if (!data.jobs || !Array.isArray(data.jobs)) {
44
- log.warn({ path: this.filePath }, "Cron jobs file invalid (missing jobs[]), resetting to empty");
45
- this.cache = DEFAULT_JOBS_FILE;
46
- return this.cache;
47
- }
48
- const valid = [];
49
- for (const j of data.jobs) {
50
- const r = JobDataSchema.safeParse(j);
51
- if (r.success) valid.push(r.data);
52
- else log.warn({
53
- jobId: j.id,
54
- issues: r.error.flatten()
55
- }, "Dropped invalid cron job");
56
- }
57
- if (valid.length !== data.jobs.length) {
58
- data.jobs = valid;
59
- data.version = (data.version ?? 1) + 1;
60
- this.cache = data;
61
- await this.writeToDisk(data);
62
- this.dirty = false;
63
- log.info({ count: valid.length }, "Persisted cron jobs after validation");
64
- return data;
65
- }
66
- this.cache = data;
67
- log.debug({ jobCount: data.jobs.length }, "Loaded jobs from disk");
68
- return data;
69
- } catch (error) {
70
- const em = error instanceof Error ? error.message : String(error);
71
- log.error({
72
- err: error,
73
- path: this.filePath,
74
- errorMessage: em
75
- }, `Failed to load cron jobs file: ${em}`);
76
- this.cache = DEFAULT_JOBS_FILE;
77
- return this.cache;
78
- }
79
- }
80
- /**
81
- * Save jobs to disk (debounced)
82
- */
83
- async save(data) {
84
- this.cache = data;
85
- this.markDirty();
86
- }
87
- /**
88
- * Force immediate save (sync to disk)
89
- */
90
- async flush() {
91
- if (!this.dirty || !this.cache) return;
92
- if (this.saveTimeout) {
93
- clearTimeout(this.saveTimeout);
94
- this.saveTimeout = null;
95
- }
96
- await this.writeToDisk(this.cache);
97
- this.dirty = false;
98
- }
99
- /**
100
- * Get all jobs
101
- */
102
- async getJobs() {
103
- return (await this.load()).jobs;
104
- }
105
- /**
106
- * Get a single job by ID
107
- */
108
- async getJob(id) {
109
- return (await this.getJobs()).find((j) => j.id === id) || null;
110
- }
111
- /**
112
- * Add a new job
113
- */
114
- async addJob(job) {
115
- const data = await this.load();
116
- data.jobs.push(job);
117
- data.version++;
118
- await this.save(data);
119
- }
120
- /**
121
- * Update an existing job
122
- */
123
- async updateJob(id, updates, options) {
124
- const data = await this.load();
125
- const index = data.jobs.findIndex((j) => j.id === id);
126
- if (index === -1) return false;
127
- const merged = {
128
- ...data.jobs[index],
129
- ...updates,
130
- updated_at: (/* @__PURE__ */ new Date()).toISOString()
131
- };
132
- if (options?.clearAgentId) delete merged.agentId;
133
- if (options?.clearWorkingDirectory) delete merged.workingDirectory;
134
- data.jobs[index] = merged;
135
- data.version++;
136
- await this.save(data);
137
- return true;
138
- }
139
- /**
140
- * Remove a job
141
- */
142
- async removeJob(id) {
143
- const data = await this.load();
144
- const initialLength = data.jobs.length;
145
- data.jobs = data.jobs.filter((j) => j.id !== id);
146
- if (data.jobs.length === initialLength) return false;
147
- data.version++;
148
- await this.save(data);
149
- return true;
150
- }
151
- /** Atomic write (fsync + rename) via shared helper. */
152
- async writeToDisk(data) {
153
- await writeTextAtomic(this.filePath, JSON.stringify(data, null, 2));
154
- log.debug({ jobCount: data.jobs.length }, "Jobs saved to disk");
155
- }
156
- /**
157
- * Mark cache as dirty and schedule debounced save
158
- */
159
- markDirty() {
160
- this.dirty = true;
161
- if (this.saveTimeout) clearTimeout(this.saveTimeout);
162
- this.saveTimeout = setTimeout(() => {
163
- this.flush().catch((err) => {
164
- const em = err instanceof Error ? err.message : String(err);
165
- log.error({
166
- err,
167
- path: this.filePath,
168
- errorMessage: em
169
- }, `Failed to save cron jobs file: ${em}`);
170
- });
171
- }, this.debounceMs);
172
- }
173
- /**
174
- * Clear cache (useful for testing)
175
- */
176
- clearCache() {
177
- this.cache = null;
178
- this.dirty = false;
179
- if (this.saveTimeout) {
180
- clearTimeout(this.saveTimeout);
181
- this.saveTimeout = null;
182
- }
183
- }
184
- };
185
- //#endregion
186
- export { CronPersistence };
187
-
188
- //# sourceMappingURL=persistence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence.js","names":[],"sources":["../../../src/cron/persistence.ts"],"sourcesContent":["// Cron persistence layer with atomic writes and caching\nimport { readFile, access } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { JobData } from './types.js';\nimport { JobDataSchema } from './validation.js';\n\nconst log = createLogger('CronPersistence');\n\nexport interface JobsFile {\n jobs: JobData[];\n version: number;\n}\n\nconst DEFAULT_JOBS_FILE: JobsFile = {\n jobs: [],\n version: 1,\n};\n\nexport class CronPersistence {\n private filePath: string;\n private cache: JobsFile | null = null;\n private dirty = false;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private readonly debounceMs = 500; // Debounce saves\n\n constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n /**\n * Initialize the storage file\n */\n async initialize(): Promise<void> {\n try {\n await access(this.filePath);\n // File exists, load it\n await this.load();\n } catch {\n // File doesn't exist, create it\n await this.save(DEFAULT_JOBS_FILE);\n log.info({ path: this.filePath }, 'Created new jobs file');\n }\n }\n\n /**\n * Load jobs from disk (with caching)\n */\n async load(): Promise<JobsFile> {\n // Return cache if available\n if (this.cache) {\n return this.cache;\n }\n\n try {\n const content = await readFile(this.filePath, 'utf-8');\n const data = JSON.parse(content) as JobsFile;\n \n // Validate basic structure\n if (!data.jobs || !Array.isArray(data.jobs)) {\n log.warn({ path: this.filePath }, 'Cron jobs file invalid (missing jobs[]), resetting to empty');\n this.cache = DEFAULT_JOBS_FILE;\n return this.cache;\n }\n\n const valid: JobData[] = [];\n for (const j of data.jobs) {\n const r = JobDataSchema.safeParse(j);\n if (r.success) {\n valid.push(r.data as JobData);\n } else {\n log.warn(\n { jobId: (j as { id?: string }).id, issues: r.error.flatten() },\n 'Dropped invalid cron job'\n );\n }\n }\n\n if (valid.length !== data.jobs.length) {\n data.jobs = valid;\n data.version = (data.version ?? 1) + 1;\n this.cache = data;\n await this.writeToDisk(data);\n this.dirty = false;\n log.info({ count: valid.length }, 'Persisted cron jobs after validation');\n return data;\n }\n\n this.cache = data;\n log.debug({ jobCount: data.jobs.length }, 'Loaded jobs from disk');\n return data;\n } catch (error) {\n const em = error instanceof Error ? error.message : String(error);\n log.error({ err: error, path: this.filePath, errorMessage: em }, `Failed to load cron jobs file: ${em}`);\n this.cache = DEFAULT_JOBS_FILE;\n return this.cache;\n }\n }\n\n /**\n * Save jobs to disk (debounced)\n */\n async save(data: JobsFile): Promise<void> {\n this.cache = data;\n this.markDirty();\n }\n\n /**\n * Force immediate save (sync to disk)\n */\n async flush(): Promise<void> {\n if (!this.dirty || !this.cache) {\n return;\n }\n\n // Clear any pending debounced save\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n\n await this.writeToDisk(this.cache);\n this.dirty = false;\n }\n\n /**\n * Get all jobs\n */\n async getJobs(): Promise<JobData[]> {\n const data = await this.load();\n return data.jobs;\n }\n\n /**\n * Get a single job by ID\n */\n async getJob(id: string): Promise<JobData | null> {\n const jobs = await this.getJobs();\n return jobs.find((j) => j.id === id) || null;\n }\n\n /**\n * Add a new job\n */\n async addJob(job: JobData): Promise<void> {\n const data = await this.load();\n data.jobs.push(job);\n data.version++;\n await this.save(data);\n }\n\n /**\n * Update an existing job\n */\n async updateJob(\n id: string,\n updates: Partial<JobData>,\n options?: { clearAgentId?: boolean; clearWorkingDirectory?: boolean },\n ): Promise<boolean> {\n const data = await this.load();\n const index = data.jobs.findIndex((j) => j.id === id);\n \n if (index === -1) return false;\n\n const merged: JobData = {\n ...data.jobs[index],\n ...updates,\n updated_at: new Date().toISOString(),\n };\n if (options?.clearAgentId) {\n delete merged.agentId;\n }\n if (options?.clearWorkingDirectory) {\n delete merged.workingDirectory;\n }\n data.jobs[index] = merged;\n data.version++;\n await this.save(data);\n return true;\n }\n\n /**\n * Remove a job\n */\n async removeJob(id: string): Promise<boolean> {\n const data = await this.load();\n const initialLength = data.jobs.length;\n data.jobs = data.jobs.filter((j) => j.id !== id);\n \n if (data.jobs.length === initialLength) return false;\n\n data.version++;\n await this.save(data);\n return true;\n }\n\n /** Atomic write (fsync + rename) via shared helper. */\n private async writeToDisk(data: JobsFile): Promise<void> {\n await writeTextAtomic(this.filePath, JSON.stringify(data, null, 2));\n log.debug({ jobCount: data.jobs.length }, 'Jobs saved to disk');\n }\n\n /**\n * Mark cache as dirty and schedule debounced save\n */\n private markDirty(): void {\n this.dirty = true;\n\n // Debounce saves\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n this.flush().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.error({ err, path: this.filePath, errorMessage: em }, `Failed to save cron jobs file: ${em}`);\n });\n }, this.debounceMs);\n }\n\n /**\n * Clear cache (useful for testing)\n */\n clearCache(): void {\n this.cache = null;\n this.dirty = false;\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n }\n}\n"],"mappings":"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"}