@xopcai/xopc 0.0.124 → 0.0.125
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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-BKDKICZV.js} +1 -1
- package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-DI4BqHKW.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-6_ie3NQ4.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-kUHEJ1HK.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-Dm-9prpU.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-OTxQTPnC.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-DllA_jQ0.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-Cm6CWNj1.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-VJ89b6I2.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BaPj8wC2.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-B5PwBEUx.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +1 -0
- package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +2 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-DySMzOF6.js} +1 -1
- package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
- package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
- package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-D_AjSnV_.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-BaM0FpW7.js +1 -0
- package/dist/gateway/static/root/assets/extension-page-DuZWVOGA.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-DarVtbmJ.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-NFKfkqrd.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-CFEm9rgy.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-BMk2S5td.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-Dtwh_yGg.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-BKP7ylcG.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-DTWZNA_Y.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-CTmA3hWK.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-Bhct0ZT-.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-C-UxSU4a.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
- package/dist/gateway/static/root/assets/index-BNHDd2j1.css +1 -0
- package/dist/gateway/static/root/assets/index-BPXLPMuY.js +193 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-DCjy2y4d.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
- package/dist/gateway/static/root/assets/markdown-split-BaqxP-GQ.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-DQ_EXloK.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +2 -0
- package/dist/gateway/static/root/assets/page-tabs-EIZhLppK.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-r_uB4Epr.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-B132Uf-2.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-B5qshALm.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-CvLmkdS9.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-pRlvqsAf.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BnqYMWHR.js → settings-form-section-BBYUDLVd.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DaO7zYZM.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CdWZU1hd.js → settings-page-layout-D8g9PAek.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-v6-IOp8t.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-HUU2FFjM.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-AH160QHh.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-BXzDmjCQ.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-DxwnQvQ3.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-i5POEtqd.js} +1 -1
- package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CD6FL_Rs.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-ClVVMgN-.js +3 -0
- package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-Dv4ZA1T0.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +18 -0
- package/dist/gateway/static/root/index.html +8 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +6 -2
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +2 -0
- package/dist/src/agent/child-agent-factory.js +2 -0
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/coding/index.d.ts +1 -0
- package/dist/src/agent/coding/index.js +2 -0
- package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
- package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
- package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
- package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/config.js +3 -3
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/constants.js +1 -1
- package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
- package/dist/src/agent/memory/dreaming/events.js +6 -6
- package/dist/src/agent/memory/dreaming/events.js.map +1 -1
- package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
- package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
- package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/preview.js +2 -2
- package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
- package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
- package/dist/src/agent/memory/dreaming/scope.js +27 -0
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
- package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
- package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
- package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
- package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/sandbox/command-validator.js +12 -0
- package/dist/src/agent/sandbox/command-validator.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -1
- package/dist/src/agent/service.js +18 -6
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +5 -3
- package/dist/src/agent/session/session-inspector.js +16 -7
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/source-context/types.d.ts +1 -1
- package/dist/src/agent/source-context/types.js +1 -1
- package/dist/src/agent/source-context/types.js.map +1 -1
- package/dist/src/agent/tools/apply-patch.js +116 -62
- package/dist/src/agent/tools/apply-patch.js.map +1 -1
- package/dist/src/agent/tools/concurrency.d.ts +8 -0
- package/dist/src/agent/tools/concurrency.js +31 -0
- package/dist/src/agent/tools/concurrency.js.map +1 -0
- package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
- package/dist/src/agent/tools/dreaming-tool.js +13 -10
- package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
- package/dist/src/agent/tools/exec-command.js +4 -0
- package/dist/src/agent/tools/exec-command.js.map +1 -1
- package/dist/src/agent/tools/executor.d.ts +6 -4
- package/dist/src/agent/tools/executor.js +7 -4
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -0
- package/dist/src/agent/tools/factory.js +7 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +2 -0
- package/dist/src/agent/tools/find.js.map +1 -1
- package/dist/src/agent/tools/grep.js +2 -0
- package/dist/src/agent/tools/grep.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +2 -0
- package/dist/src/agent/tools/index.js +3 -1
- package/dist/src/agent/tools/list-dir.js +2 -0
- package/dist/src/agent/tools/list-dir.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.d.ts +1 -0
- package/dist/src/agent/tools/memory-tool.js +2 -2
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/metadata.d.ts +15 -0
- package/dist/src/agent/tools/metadata.js +26 -0
- package/dist/src/agent/tools/metadata.js.map +1 -0
- package/dist/src/agent/tools/read.js +2 -0
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/write.js +6 -0
- package/dist/src/agent/tools/write.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
- package/dist/src/agent/workflow/subagent-runner.js +5 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/connectors/health.d.ts +2 -1
- package/dist/src/connectors/health.js +59 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +1 -0
- package/dist/src/connectors/install.js +28 -1
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +7 -0
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.js +38 -13
- package/dist/src/connectors/registries/modelscope.js.map +1 -1
- package/dist/src/connectors/types.d.ts +2 -0
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/hono/app.js +7 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +46 -2
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +111 -66
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +846 -43
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +1 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/service.js +17 -8
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/media/store.js +1 -1
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/media/types.d.ts +1 -1
- package/dist/src/media/uri.js +2 -1
- package/dist/src/media/uri.js.map +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +2 -0
- package/dist/src/session/session-context-for-llm.js +14 -1
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/store.js +2 -2
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
- package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +78 -0
- package/dist/src/tui/components/assistant-message.js +12 -2
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/tool-execution.d.ts +8 -0
- package/dist/src/tui/components/tool-execution.js +87 -77
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +1 -0
- package/dist/src/tui/components/visual-truncate.js +28 -1
- package/dist/src/tui/components/visual-truncate.js.map +1 -1
- package/dist/src/tui/tool-summary.d.ts +22 -0
- package/dist/src/tui/tool-summary.js +212 -0
- package/dist/src/tui/tool-summary.js.map +1 -0
- package/dist/src/tui/tui-tool-diff.d.ts +15 -0
- package/dist/src/tui/tui-tool-diff.js +178 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/work-items/agent-context.d.ts +3 -0
- package/dist/src/work-items/agent-context.js +39 -0
- package/dist/src/work-items/agent-context.js.map +1 -0
- package/dist/src/work-items/index.d.ts +4 -0
- package/dist/src/work-items/index.js +4 -0
- package/dist/src/work-items/types.d.ts +112 -0
- package/dist/src/work-items/types.js +1 -0
- package/dist/src/work-items/work-item-service.d.ts +33 -0
- package/dist/src/work-items/work-item-service.js +180 -0
- package/dist/src/work-items/work-item-service.js.map +1 -0
- package/dist/src/work-items/work-item-store.d.ts +21 -0
- package/dist/src/work-items/work-item-store.js +302 -0
- package/dist/src/work-items/work-item-store.js.map +1 -0
- package/dist/src/workflows/service/workflow-run-service.js +4 -3
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -0
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
- package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
- package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
- package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
- package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
- package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
- package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
- package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
- package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
- package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
|
@@ -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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"}
|
|
@@ -35,8 +35,8 @@ export type DreamingResolvedConfig = {
|
|
|
35
35
|
};
|
|
36
36
|
deep: DreamingDeepConfig;
|
|
37
37
|
};
|
|
38
|
-
/** Resolve the full three-phase dreaming config from
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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;
|
|
@@ -47,14 +47,14 @@ async function runDreamingDeepPromotion(params) {
|
|
|
47
47
|
const now = params.now ?? /* @__PURE__ */ new Date();
|
|
48
48
|
const startedAt = now.toISOString();
|
|
49
49
|
const runId = `${startedAt}:${process.pid}:${Math.random().toString(16).slice(2)}`;
|
|
50
|
-
const memoryPath = path.join(params.
|
|
50
|
+
const memoryPath = path.join(params.dreamingRoot, MEMORY_MD_FILENAME);
|
|
51
51
|
const t0 = Date.now();
|
|
52
52
|
const earlyExitReason = !cfg.enabled ? "dreaming disabled" : cfg.limit === 0 ? "dreaming limit=0" : null;
|
|
53
53
|
if (earlyExitReason) {
|
|
54
54
|
const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
55
55
|
const empty = emptyDeepPhaseSkipped();
|
|
56
56
|
await writeDreamingDeepLastRun({
|
|
57
|
-
|
|
57
|
+
dreamingRoot: params.dreamingRoot,
|
|
58
58
|
lastRun: buildDeepLastRun({
|
|
59
59
|
runId,
|
|
60
60
|
startedAt,
|
|
@@ -80,8 +80,8 @@ async function runDreamingDeepPromotion(params) {
|
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
try {
|
|
83
|
-
const result = await withDreamingPromotionLock(params.
|
|
84
|
-
const { store } = await loadDreamingStore({
|
|
83
|
+
const result = await withDreamingPromotionLock(params.dreamingRoot, async () => {
|
|
84
|
+
const { store } = await loadDreamingStore({ dreamingRoot: params.dreamingRoot });
|
|
85
85
|
const nowMs = now.getTime();
|
|
86
86
|
const ranked = Object.values(store.entries ?? {}).filter((e) => {
|
|
87
87
|
if (!e || typeof e !== "object") return false;
|
|
@@ -155,7 +155,7 @@ async function runDreamingDeepPromotion(params) {
|
|
|
155
155
|
}
|
|
156
156
|
if (appliedCandidates.length === 0) {
|
|
157
157
|
await saveDreamingStore({
|
|
158
|
-
|
|
158
|
+
dreamingRoot: params.dreamingRoot,
|
|
159
159
|
store
|
|
160
160
|
});
|
|
161
161
|
return {
|
|
@@ -181,23 +181,13 @@ async function runDreamingDeepPromotion(params) {
|
|
|
181
181
|
}
|
|
182
182
|
sectionLines.push("");
|
|
183
183
|
const next = `${header}${existing.endsWith("\n") || existing.length === 0 ? existing : `${existing}\n`}${sectionLines.join("\n")}`;
|
|
184
|
+
await fs.mkdir(path.dirname(memoryPath), { recursive: true });
|
|
184
185
|
await fs.writeFile(memoryPath, next, "utf-8");
|
|
185
186
|
const nowIso = now.toISOString();
|
|
186
187
|
for (const c of appliedCandidates) {
|
|
187
|
-
const writeResult = await params.memoryManager?.write({
|
|
188
|
-
kind: "derived_insight",
|
|
189
|
-
content: c.snippet,
|
|
190
|
-
source: {
|
|
191
|
-
provider: "dreaming",
|
|
192
|
-
path: c.path,
|
|
193
|
-
lineStart: c.startLine,
|
|
194
|
-
lineEnd: c.endLine
|
|
195
|
-
},
|
|
196
|
-
tags: ["dreaming", "promoted"]
|
|
197
|
-
});
|
|
198
188
|
params.memoryManager?.recordSignal({
|
|
199
189
|
source: "dreaming",
|
|
200
|
-
recordId:
|
|
190
|
+
recordId: `dreaming:${c.key}`,
|
|
201
191
|
score: c.score,
|
|
202
192
|
content: c.snippet,
|
|
203
193
|
metadata: {
|
|
@@ -218,11 +208,12 @@ async function runDreamingDeepPromotion(params) {
|
|
|
218
208
|
}
|
|
219
209
|
store.updatedAt = nowIso;
|
|
220
210
|
await saveDreamingStore({
|
|
221
|
-
|
|
211
|
+
dreamingRoot: params.dreamingRoot,
|
|
222
212
|
store
|
|
223
213
|
});
|
|
224
214
|
log.info({
|
|
225
215
|
workspaceDir: params.workspaceDir,
|
|
216
|
+
dreamingRoot: params.dreamingRoot,
|
|
226
217
|
candidates: ranked.length,
|
|
227
218
|
applied: appliedCandidates.length
|
|
228
219
|
}, "Dreaming deep promotion complete");
|
|
@@ -239,7 +230,7 @@ async function runDreamingDeepPromotion(params) {
|
|
|
239
230
|
const empty = emptyDeepPhaseSkipped();
|
|
240
231
|
const resultSkipped = "skipped" in result ? result.skipped : empty;
|
|
241
232
|
await writeDreamingDeepLastRun({
|
|
242
|
-
|
|
233
|
+
dreamingRoot: params.dreamingRoot,
|
|
243
234
|
lastRun: buildDeepLastRun({
|
|
244
235
|
runId,
|
|
245
236
|
startedAt,
|
|
@@ -268,7 +259,7 @@ async function runDreamingDeepPromotion(params) {
|
|
|
268
259
|
const em = err instanceof Error ? err.message : String(err);
|
|
269
260
|
const z = emptyDeepPhaseSkipped();
|
|
270
261
|
await writeDreamingDeepLastRun({
|
|
271
|
-
|
|
262
|
+
dreamingRoot: params.dreamingRoot,
|
|
272
263
|
lastRun: buildDeepLastRun({
|
|
273
264
|
runId,
|
|
274
265
|
startedAt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-promotion.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/deep-promotion.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { MEMORY_MD_FILENAME } from './constants.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n withDreamingPromotionLock,\n type DreamingStoreEntry,\n} from './short-term-store.js';\nimport {\n DREAMING_LAST_RUN_FORMAT_VERSION,\n emptyDeepPhaseSkipped,\n writeDreamingDeepLastRun,\n type DreamingDeepLastRun,\n type DreamingDeepPhaseSkipped,\n} from './last-run.js';\nimport type { DreamingDeepConfig } from './config.js';\nimport type { MemoryManager } from '../manager.js';\nimport {\n clamp01,\n compareCandidatesByScore,\n computeCandidateScore,\n extractPromotionMarkers,\n isContaminatedSnippet,\n isExpiredEntry,\n isoDay,\n readFileLines,\n resolveDeepDefaults,\n sliceRange,\n snippetHash,\n} from './utils.js';\n\nconst log = createLogger('Dreaming:Deep');\n\nexport type { DreamingDeepConfig } from './config.js';\n\nexport type DreamingPromotionCandidate = DreamingStoreEntry & {\n avgScore: number;\n /** Time-decay-adjusted final score used for ranking. */\n score: number;\n /** Raw recency decay multiplier (0–1). */\n recencyDecay: number;\n};\n\n\nfunction markerForPromotion(key: string, hash: string): string {\n // Quote values to allow spaces/colons in key.\n return `<!-- xopc-memory-promotion key=\"${key}\" hash=\"${hash}\" -->`;\n}\n\n\nasync function rehydrateSnippet(params: {\n workspaceDir: string;\n candidate: DreamingPromotionCandidate;\n}): Promise<{ snippet: string; startLine: number; endLine: number } | null> {\n const fullPath = path.join(params.workspaceDir, params.candidate.path);\n const lines = await readFileLines(fullPath);\n if (!lines) return null;\n\n const startLine = Math.max(1, Math.floor(params.candidate.startLine));\n const endLine = Math.max(startLine, Math.floor(params.candidate.endLine));\n const snippet = sliceRange(lines, startLine, endLine);\n if (!snippet) return null;\n return { snippet, startLine, endLine };\n}\n\n\nfunction buildDeepLastRun(base: {\n runId: string;\n startedAt: string;\n finishedAt: string;\n t0: number;\n ok: boolean;\n reason: string;\n config: DreamingDeepConfig;\n memoryPath: string;\n errorMessage?: string;\n deep: DreamingDeepLastRun['deep'];\n}): DreamingDeepLastRun {\n const durationMs = Math.max(0, Date.now() - base.t0);\n return {\n version: DREAMING_LAST_RUN_FORMAT_VERSION,\n phase: 'deep',\n runId: base.runId,\n startedAt: base.startedAt,\n finishedAt: base.finishedAt,\n durationMs,\n ok: base.ok,\n reason: base.reason,\n config: base.config,\n memoryPath: base.memoryPath,\n ...(base.errorMessage ? { errorMessage: base.errorMessage } : {}),\n deep: base.deep,\n };\n}\n\nexport async function runDreamingDeepPromotion(params: {\n workspaceDir: string;\n config?: Partial<DreamingDeepConfig>;\n memoryManager?: MemoryManager;\n now?: Date;\n}): Promise<{\n ok: boolean;\n reason: string;\n candidates: number;\n applied: number;\n memoryPath: string;\n}> {\n const cfg = resolveDeepDefaults(params.config);\n const now = params.now ?? new Date();\n const startedAt = now.toISOString();\n const runId = `${startedAt}:${process.pid}:${Math.random().toString(16).slice(2)}`;\n const memoryPath = path.join(params.workspaceDir, MEMORY_MD_FILENAME);\n const t0 = Date.now();\n\n // Early exit for disabled or zero-limit configurations.\n const earlyExitReason = !cfg.enabled ? 'dreaming disabled' : cfg.limit === 0 ? 'dreaming limit=0' : null;\n if (earlyExitReason) {\n const finishedAt = new Date().toISOString();\n const empty = emptyDeepPhaseSkipped();\n await writeDreamingDeepLastRun({\n workspaceDir: params.workspaceDir,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: true,\n reason: earlyExitReason,\n config: cfg,\n memoryPath,\n deep: { candidatesRanked: 0, applied: 0, skipped: empty },\n }),\n }).catch(() => undefined);\n return { ok: true, reason: earlyExitReason, candidates: 0, applied: 0, memoryPath };\n }\n\n try {\n const result = await withDreamingPromotionLock(params.workspaceDir, async () => {\n const { store } = await loadDreamingStore({ workspaceDir: params.workspaceDir });\n\n const nowMs = now.getTime();\n\n const all = Object.values(store.entries ?? {}).filter((e): e is DreamingStoreEntry => {\n if (!e || typeof e !== 'object') return false;\n if (e.promotedAt) return false;\n if (!e.path || !e.path.startsWith('memory/')) return false;\n if (e.recallCount < cfg.minRecallCount) return false;\n // Require minimum unique queries to avoid single-query inflation.\n if ((e.queryHashes?.length ?? 0) < cfg.minUniqueQueries) return false;\n // Expire entries older than maxAgeDays since last recall.\n if (isExpiredEntry(e.lastRecalledAt, nowMs, cfg.maxAgeDays)) return false;\n const avg = e.recallCount > 0 ? e.totalScore / e.recallCount : 0;\n return clamp01(avg) >= cfg.minScore;\n });\n\n const ranked: DreamingPromotionCandidate[] = all\n .map((e) => {\n const { avgScore, score, recencyDecay } = computeCandidateScore(e, nowMs, cfg.recencyHalfLifeDays);\n return { ...e, avgScore, score, recencyDecay };\n })\n .sort(compareCandidatesByScore)\n .slice(0, cfg.limit);\n\n if (ranked.length === 0) {\n const z = emptyDeepPhaseSkipped();\n return { ok: true, reason: 'no eligible candidates', candidates: 0, applied: 0, memoryPath, skipped: z };\n }\n\n const existing = await fs.readFile(memoryPath, 'utf-8').catch((err: unknown) => {\n if ((err as NodeJS.ErrnoException | undefined)?.code === 'ENOENT') return '';\n throw err;\n });\n const existingMarkers = extractPromotionMarkers(existing);\n\n const appliedCandidates: Array<{\n key: string;\n hash: string;\n snippet: string;\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n recallCount: number;\n avgScore: number;\n }> = [];\n\n const skipped: DreamingDeepPhaseSkipped = emptyDeepPhaseSkipped();\n for (const candidate of ranked) {\n if (existingMarkers.keys.has(candidate.key)) {\n skipped.alreadyPromotedKey += 1;\n // Treat as already applied; mark promotedAt for idempotency and keep going.\n const entry = store.entries[candidate.key];\n if (entry && !entry.promotedAt) {\n entry.promotedAt = now.toISOString();\n }\n continue;\n }\n const rehydrated = await rehydrateSnippet({ workspaceDir: params.workspaceDir, candidate });\n if (!rehydrated) {\n skipped.rehydrateFailed += 1;\n continue;\n }\n if (isContaminatedSnippet(rehydrated.snippet)) {\n skipped.contaminated += 1;\n continue;\n }\n const hash = snippetHash(rehydrated.snippet);\n if (existingMarkers.hashes.has(hash)) {\n skipped.hashDuplicate += 1;\n // Already promoted (possibly from a different key/line range). Mark promoted for idempotency.\n const entry = store.entries[candidate.key];\n if (entry && !entry.promotedAt) {\n entry.promotedAt = now.toISOString();\n }\n continue;\n }\n appliedCandidates.push({\n key: candidate.key,\n hash,\n snippet: rehydrated.snippet,\n path: candidate.path,\n startLine: rehydrated.startLine,\n endLine: rehydrated.endLine,\n score: candidate.score,\n recallCount: candidate.recallCount,\n avgScore: candidate.avgScore,\n });\n }\n\n if (appliedCandidates.length === 0) {\n await saveDreamingStore({ workspaceDir: params.workspaceDir, store });\n return {\n ok: true,\n reason: 'candidates were stale or already applied',\n candidates: ranked.length,\n applied: 0,\n memoryPath,\n skipped,\n };\n }\n\n const day = isoDay(now);\n const header = existing.trim().length > 0 ? '' : '# Long-Term Memory\\n\\n';\n const sectionLines: string[] = ['', `## Promoted From Short-Term Memory (${day})`, ''];\n for (const c of appliedCandidates) {\n const src = `${c.path}:${c.startLine}-${c.endLine}`;\n sectionLines.push(markerForPromotion(c.key, c.hash));\n sectionLines.push(\n `- ${c.snippet} [score=${c.score.toFixed(3)} recalls=${c.recallCount} avg=${c.avgScore.toFixed(3)} source=${src}]`,\n );\n }\n sectionLines.push('');\n\n const next = `${header}${existing.endsWith('\\n') || existing.length === 0 ? existing : `${existing}\\n`}${sectionLines.join('\\n')}`;\n await fs.writeFile(memoryPath, next, 'utf-8');\n\n const nowIso = now.toISOString();\n for (const c of appliedCandidates) {\n const writeResult = await params.memoryManager?.write({\n kind: 'derived_insight',\n content: c.snippet,\n source: {\n provider: 'dreaming',\n path: c.path,\n lineStart: c.startLine,\n lineEnd: c.endLine,\n },\n tags: ['dreaming', 'promoted'],\n });\n params.memoryManager?.recordSignal({\n source: 'dreaming',\n recordId: writeResult?.record?.id,\n score: c.score,\n content: c.snippet,\n metadata: {\n path: c.path,\n startLine: c.startLine,\n endLine: c.endLine,\n recallCount: c.recallCount,\n avgScore: c.avgScore,\n },\n });\n const entry = store.entries[c.key];\n if (entry) {\n entry.promotedAt = nowIso;\n entry.snippet = c.snippet;\n entry.startLine = c.startLine;\n entry.endLine = c.endLine;\n }\n }\n store.updatedAt = nowIso;\n await saveDreamingStore({ workspaceDir: params.workspaceDir, store });\n\n log.info(\n { workspaceDir: params.workspaceDir, candidates: ranked.length, applied: appliedCandidates.length },\n 'Dreaming deep promotion complete',\n );\n\n return {\n ok: true,\n reason: 'applied promotions',\n candidates: ranked.length,\n applied: appliedCandidates.length,\n memoryPath,\n skipped,\n };\n });\n\n const finishedAt = new Date().toISOString();\n const empty = emptyDeepPhaseSkipped();\n const resultSkipped = 'skipped' in result ? result.skipped : empty;\n await writeDreamingDeepLastRun({\n workspaceDir: params.workspaceDir,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: result.ok,\n reason: result.reason,\n config: cfg,\n memoryPath: result.memoryPath,\n deep: {\n candidatesRanked: result.candidates,\n applied: result.applied,\n skipped: resultSkipped,\n },\n }),\n }).catch(() => undefined);\n\n return {\n ok: result.ok,\n reason: result.reason,\n candidates: result.candidates,\n applied: result.applied,\n memoryPath: result.memoryPath,\n };\n } catch (err) {\n const finishedAt = new Date().toISOString();\n const em = err instanceof Error ? err.message : String(err);\n const z = emptyDeepPhaseSkipped();\n await writeDreamingDeepLastRun({\n workspaceDir: params.workspaceDir,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: false,\n reason: 'error',\n config: cfg,\n memoryPath,\n errorMessage: em,\n deep: { candidatesRanked: 0, applied: 0, skipped: z },\n }),\n }).catch(() => undefined);\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deep-promotion.js","names":[],"sources":["../../../../../src/agent/memory/dreaming/deep-promotion.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { MEMORY_MD_FILENAME } from './constants.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n withDreamingPromotionLock,\n type DreamingStoreEntry,\n} from './short-term-store.js';\nimport {\n DREAMING_LAST_RUN_FORMAT_VERSION,\n emptyDeepPhaseSkipped,\n writeDreamingDeepLastRun,\n type DreamingDeepLastRun,\n type DreamingDeepPhaseSkipped,\n} from './last-run.js';\nimport type { DreamingDeepConfig } from './config.js';\nimport type { MemoryManager } from '../manager.js';\nimport {\n clamp01,\n compareCandidatesByScore,\n computeCandidateScore,\n extractPromotionMarkers,\n isContaminatedSnippet,\n isExpiredEntry,\n isoDay,\n readFileLines,\n resolveDeepDefaults,\n sliceRange,\n snippetHash,\n} from './utils.js';\n\nconst log = createLogger('Dreaming:Deep');\n\nexport type { DreamingDeepConfig } from './config.js';\n\nexport type DreamingPromotionCandidate = DreamingStoreEntry & {\n avgScore: number;\n /** Time-decay-adjusted final score used for ranking. */\n score: number;\n /** Raw recency decay multiplier (0–1). */\n recencyDecay: number;\n};\n\n\nfunction markerForPromotion(key: string, hash: string): string {\n // Quote values to allow spaces/colons in key.\n return `<!-- xopc-memory-promotion key=\"${key}\" hash=\"${hash}\" -->`;\n}\n\n\nasync function rehydrateSnippet(params: {\n workspaceDir: string;\n candidate: DreamingPromotionCandidate;\n}): Promise<{ snippet: string; startLine: number; endLine: number } | null> {\n const fullPath = path.join(params.workspaceDir, params.candidate.path);\n const lines = await readFileLines(fullPath);\n if (!lines) return null;\n\n const startLine = Math.max(1, Math.floor(params.candidate.startLine));\n const endLine = Math.max(startLine, Math.floor(params.candidate.endLine));\n const snippet = sliceRange(lines, startLine, endLine);\n if (!snippet) return null;\n return { snippet, startLine, endLine };\n}\n\n\nfunction buildDeepLastRun(base: {\n runId: string;\n startedAt: string;\n finishedAt: string;\n t0: number;\n ok: boolean;\n reason: string;\n config: DreamingDeepConfig;\n memoryPath: string;\n errorMessage?: string;\n deep: DreamingDeepLastRun['deep'];\n}): DreamingDeepLastRun {\n const durationMs = Math.max(0, Date.now() - base.t0);\n return {\n version: DREAMING_LAST_RUN_FORMAT_VERSION,\n phase: 'deep',\n runId: base.runId,\n startedAt: base.startedAt,\n finishedAt: base.finishedAt,\n durationMs,\n ok: base.ok,\n reason: base.reason,\n config: base.config,\n memoryPath: base.memoryPath,\n ...(base.errorMessage ? { errorMessage: base.errorMessage } : {}),\n deep: base.deep,\n };\n}\n\nexport async function runDreamingDeepPromotion(params: {\n workspaceDir: string;\n dreamingRoot: string;\n config?: Partial<DreamingDeepConfig>;\n memoryManager?: MemoryManager;\n now?: Date;\n}): Promise<{\n ok: boolean;\n reason: string;\n candidates: number;\n applied: number;\n memoryPath: string;\n}> {\n const cfg = resolveDeepDefaults(params.config);\n const now = params.now ?? new Date();\n const startedAt = now.toISOString();\n const runId = `${startedAt}:${process.pid}:${Math.random().toString(16).slice(2)}`;\n const memoryPath = path.join(params.dreamingRoot, MEMORY_MD_FILENAME);\n const t0 = Date.now();\n\n // Early exit for disabled or zero-limit configurations.\n const earlyExitReason = !cfg.enabled ? 'dreaming disabled' : cfg.limit === 0 ? 'dreaming limit=0' : null;\n if (earlyExitReason) {\n const finishedAt = new Date().toISOString();\n const empty = emptyDeepPhaseSkipped();\n await writeDreamingDeepLastRun({\n dreamingRoot: params.dreamingRoot,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: true,\n reason: earlyExitReason,\n config: cfg,\n memoryPath,\n deep: { candidatesRanked: 0, applied: 0, skipped: empty },\n }),\n }).catch(() => undefined);\n return { ok: true, reason: earlyExitReason, candidates: 0, applied: 0, memoryPath };\n }\n\n try {\n const result = await withDreamingPromotionLock(params.dreamingRoot, async () => {\n const { store } = await loadDreamingStore({ dreamingRoot: params.dreamingRoot });\n\n const nowMs = now.getTime();\n\n const all = Object.values(store.entries ?? {}).filter((e): e is DreamingStoreEntry => {\n if (!e || typeof e !== 'object') return false;\n if (e.promotedAt) return false;\n if (!e.path || !e.path.startsWith('memory/')) return false;\n if (e.recallCount < cfg.minRecallCount) return false;\n // Require minimum unique queries to avoid single-query inflation.\n if ((e.queryHashes?.length ?? 0) < cfg.minUniqueQueries) return false;\n // Expire entries older than maxAgeDays since last recall.\n if (isExpiredEntry(e.lastRecalledAt, nowMs, cfg.maxAgeDays)) return false;\n const avg = e.recallCount > 0 ? e.totalScore / e.recallCount : 0;\n return clamp01(avg) >= cfg.minScore;\n });\n\n const ranked: DreamingPromotionCandidate[] = all\n .map((e) => {\n const { avgScore, score, recencyDecay } = computeCandidateScore(e, nowMs, cfg.recencyHalfLifeDays);\n return { ...e, avgScore, score, recencyDecay };\n })\n .sort(compareCandidatesByScore)\n .slice(0, cfg.limit);\n\n if (ranked.length === 0) {\n const z = emptyDeepPhaseSkipped();\n return { ok: true, reason: 'no eligible candidates', candidates: 0, applied: 0, memoryPath, skipped: z };\n }\n\n const existing = await fs.readFile(memoryPath, 'utf-8').catch((err: unknown) => {\n if ((err as NodeJS.ErrnoException | undefined)?.code === 'ENOENT') return '';\n throw err;\n });\n const existingMarkers = extractPromotionMarkers(existing);\n\n const appliedCandidates: Array<{\n key: string;\n hash: string;\n snippet: string;\n path: string;\n startLine: number;\n endLine: number;\n score: number;\n recallCount: number;\n avgScore: number;\n }> = [];\n\n const skipped: DreamingDeepPhaseSkipped = emptyDeepPhaseSkipped();\n for (const candidate of ranked) {\n if (existingMarkers.keys.has(candidate.key)) {\n skipped.alreadyPromotedKey += 1;\n // Treat as already applied; mark promotedAt for idempotency and keep going.\n const entry = store.entries[candidate.key];\n if (entry && !entry.promotedAt) {\n entry.promotedAt = now.toISOString();\n }\n continue;\n }\n const rehydrated = await rehydrateSnippet({ workspaceDir: params.workspaceDir, candidate });\n if (!rehydrated) {\n skipped.rehydrateFailed += 1;\n continue;\n }\n if (isContaminatedSnippet(rehydrated.snippet)) {\n skipped.contaminated += 1;\n continue;\n }\n const hash = snippetHash(rehydrated.snippet);\n if (existingMarkers.hashes.has(hash)) {\n skipped.hashDuplicate += 1;\n // Already promoted (possibly from a different key/line range). Mark promoted for idempotency.\n const entry = store.entries[candidate.key];\n if (entry && !entry.promotedAt) {\n entry.promotedAt = now.toISOString();\n }\n continue;\n }\n appliedCandidates.push({\n key: candidate.key,\n hash,\n snippet: rehydrated.snippet,\n path: candidate.path,\n startLine: rehydrated.startLine,\n endLine: rehydrated.endLine,\n score: candidate.score,\n recallCount: candidate.recallCount,\n avgScore: candidate.avgScore,\n });\n }\n\n if (appliedCandidates.length === 0) {\n await saveDreamingStore({ dreamingRoot: params.dreamingRoot, store });\n return {\n ok: true,\n reason: 'candidates were stale or already applied',\n candidates: ranked.length,\n applied: 0,\n memoryPath,\n skipped,\n };\n }\n\n const day = isoDay(now);\n const header = existing.trim().length > 0 ? '' : '# Long-Term Memory\\n\\n';\n const sectionLines: string[] = ['', `## Promoted From Short-Term Memory (${day})`, ''];\n for (const c of appliedCandidates) {\n const src = `${c.path}:${c.startLine}-${c.endLine}`;\n sectionLines.push(markerForPromotion(c.key, c.hash));\n sectionLines.push(\n `- ${c.snippet} [score=${c.score.toFixed(3)} recalls=${c.recallCount} avg=${c.avgScore.toFixed(3)} source=${src}]`,\n );\n }\n sectionLines.push('');\n\n const next = `${header}${existing.endsWith('\\n') || existing.length === 0 ? existing : `${existing}\\n`}${sectionLines.join('\\n')}`;\n await fs.mkdir(path.dirname(memoryPath), { recursive: true });\n await fs.writeFile(memoryPath, next, 'utf-8');\n\n const nowIso = now.toISOString();\n for (const c of appliedCandidates) {\n params.memoryManager?.recordSignal({\n source: 'dreaming',\n recordId: `dreaming:${c.key}`,\n score: c.score,\n content: c.snippet,\n metadata: {\n path: c.path,\n startLine: c.startLine,\n endLine: c.endLine,\n recallCount: c.recallCount,\n avgScore: c.avgScore,\n },\n });\n const entry = store.entries[c.key];\n if (entry) {\n entry.promotedAt = nowIso;\n entry.snippet = c.snippet;\n entry.startLine = c.startLine;\n entry.endLine = c.endLine;\n }\n }\n store.updatedAt = nowIso;\n await saveDreamingStore({ dreamingRoot: params.dreamingRoot, store });\n\n log.info(\n {\n workspaceDir: params.workspaceDir,\n dreamingRoot: params.dreamingRoot,\n candidates: ranked.length,\n applied: appliedCandidates.length,\n },\n 'Dreaming deep promotion complete',\n );\n\n return {\n ok: true,\n reason: 'applied promotions',\n candidates: ranked.length,\n applied: appliedCandidates.length,\n memoryPath,\n skipped,\n };\n });\n\n const finishedAt = new Date().toISOString();\n const empty = emptyDeepPhaseSkipped();\n const resultSkipped = 'skipped' in result ? result.skipped : empty;\n await writeDreamingDeepLastRun({\n dreamingRoot: params.dreamingRoot,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: result.ok,\n reason: result.reason,\n config: cfg,\n memoryPath: result.memoryPath,\n deep: {\n candidatesRanked: result.candidates,\n applied: result.applied,\n skipped: resultSkipped,\n },\n }),\n }).catch(() => undefined);\n\n return {\n ok: result.ok,\n reason: result.reason,\n candidates: result.candidates,\n applied: result.applied,\n memoryPath: result.memoryPath,\n };\n } catch (err) {\n const finishedAt = new Date().toISOString();\n const em = err instanceof Error ? err.message : String(err);\n const z = emptyDeepPhaseSkipped();\n await writeDreamingDeepLastRun({\n dreamingRoot: params.dreamingRoot,\n lastRun: buildDeepLastRun({\n runId,\n startedAt,\n finishedAt,\n t0,\n ok: false,\n reason: 'error',\n config: cfg,\n memoryPath,\n errorMessage: em,\n deep: { candidatesRanked: 0, applied: 0, skipped: z },\n }),\n }).catch(() => undefined);\n throw err;\n }\n}\n"],"mappings":"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"}
|
|
@@ -24,13 +24,13 @@ export type DreamingRemEvent = DreamingEventBase & {
|
|
|
24
24
|
};
|
|
25
25
|
export type DreamingEvent = DreamingLightEvent | DreamingDeepEvent | DreamingRemEvent;
|
|
26
26
|
/**
|
|
27
|
-
* Append a single event line to `
|
|
27
|
+
* Append a single event line to an agent's `memories/.dreams/events.jsonl`.
|
|
28
28
|
* Creates the directory and file if they don't exist.
|
|
29
29
|
* Failures are silently ignored so audit logging never blocks execution.
|
|
30
30
|
*/
|
|
31
|
-
export declare function appendDreamingEvent(
|
|
31
|
+
export declare function appendDreamingEvent(dreamingRoot: string, event: DreamingEvent): Promise<void>;
|
|
32
32
|
/**
|
|
33
33
|
* Read the most recent N events from the events log.
|
|
34
34
|
* Returns newest-first. If the file doesn't exist, returns an empty array.
|
|
35
35
|
*/
|
|
36
|
-
export declare function readDreamingEvents(
|
|
36
|
+
export declare function readDreamingEvents(dreamingRoot: string, limit?: number): Promise<DreamingEvent[]>;
|
|
@@ -3,15 +3,15 @@ import path from "node:path";
|
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
//#region src/agent/memory/dreaming/events.ts
|
|
5
5
|
/**
|
|
6
|
-
* Append a single event line to `
|
|
6
|
+
* Append a single event line to an agent's `memories/.dreams/events.jsonl`.
|
|
7
7
|
* Creates the directory and file if they don't exist.
|
|
8
8
|
* Failures are silently ignored so audit logging never blocks execution.
|
|
9
9
|
*/
|
|
10
|
-
async function appendDreamingEvent(
|
|
10
|
+
async function appendDreamingEvent(dreamingRoot, event) {
|
|
11
11
|
try {
|
|
12
|
-
const dirPath = path.join(
|
|
12
|
+
const dirPath = path.join(dreamingRoot, DREAMING_DIR_RELATIVE);
|
|
13
13
|
await fs.mkdir(dirPath, { recursive: true });
|
|
14
|
-
const filePath = path.join(
|
|
14
|
+
const filePath = path.join(dreamingRoot, DREAMING_EVENTS_LOG_RELATIVE);
|
|
15
15
|
const line = JSON.stringify(event) + "\n";
|
|
16
16
|
await fs.appendFile(filePath, line, "utf-8");
|
|
17
17
|
} catch {}
|
|
@@ -20,8 +20,8 @@ async function appendDreamingEvent(workspaceDir, event) {
|
|
|
20
20
|
* Read the most recent N events from the events log.
|
|
21
21
|
* Returns newest-first. If the file doesn't exist, returns an empty array.
|
|
22
22
|
*/
|
|
23
|
-
async function readDreamingEvents(
|
|
24
|
-
const filePath = path.join(
|
|
23
|
+
async function readDreamingEvents(dreamingRoot, limit = 50) {
|
|
24
|
+
const filePath = path.join(dreamingRoot, DREAMING_EVENTS_LOG_RELATIVE);
|
|
25
25
|
let raw;
|
|
26
26
|
try {
|
|
27
27
|
raw = await fs.readFile(filePath, "utf-8");
|