@project-ava-supernova/core 0.2.71
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/agent/agent.d.ts +623 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +3558 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/claims-auditor.d.ts +54 -0
- package/dist/agent/claims-auditor.d.ts.map +1 -0
- package/dist/agent/claims-auditor.js +125 -0
- package/dist/agent/claims-auditor.js.map +1 -0
- package/dist/agent/context-continuity.d.ts +125 -0
- package/dist/agent/context-continuity.d.ts.map +1 -0
- package/dist/agent/context-continuity.js +231 -0
- package/dist/agent/context-continuity.js.map +1 -0
- package/dist/agent/conversation.d.ts +26 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +86 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/design-reinjection.d.ts +93 -0
- package/dist/agent/design-reinjection.d.ts.map +1 -0
- package/dist/agent/design-reinjection.js +235 -0
- package/dist/agent/design-reinjection.js.map +1 -0
- package/dist/agent/error-loop-detector.d.ts +59 -0
- package/dist/agent/error-loop-detector.d.ts.map +1 -0
- package/dist/agent/error-loop-detector.js +124 -0
- package/dist/agent/error-loop-detector.js.map +1 -0
- package/dist/agent/fresh-eyes.d.ts +52 -0
- package/dist/agent/fresh-eyes.d.ts.map +1 -0
- package/dist/agent/fresh-eyes.js +118 -0
- package/dist/agent/fresh-eyes.js.map +1 -0
- package/dist/agent/intent-classifier.d.ts +51 -0
- package/dist/agent/intent-classifier.d.ts.map +1 -0
- package/dist/agent/intent-classifier.js +125 -0
- package/dist/agent/intent-classifier.js.map +1 -0
- package/dist/agent/post-edit-verify.d.ts +79 -0
- package/dist/agent/post-edit-verify.d.ts.map +1 -0
- package/dist/agent/post-edit-verify.js +143 -0
- package/dist/agent/post-edit-verify.js.map +1 -0
- package/dist/agent/recover-written-calls.d.ts +90 -0
- package/dist/agent/recover-written-calls.d.ts.map +1 -0
- package/dist/agent/recover-written-calls.js +257 -0
- package/dist/agent/recover-written-calls.js.map +1 -0
- package/dist/agent/social-craft.d.ts +76 -0
- package/dist/agent/social-craft.d.ts.map +1 -0
- package/dist/agent/social-craft.js +210 -0
- package/dist/agent/social-craft.js.map +1 -0
- package/dist/agent/stop-command.d.ts +23 -0
- package/dist/agent/stop-command.d.ts.map +1 -0
- package/dist/agent/stop-command.js +59 -0
- package/dist/agent/stop-command.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +125 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +1334 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/task-classifier.d.ts +50 -0
- package/dist/agent/task-classifier.d.ts.map +1 -0
- package/dist/agent/task-classifier.js +187 -0
- package/dist/agent/task-classifier.js.map +1 -0
- package/dist/agent/text-tool-parser.d.ts +34 -0
- package/dist/agent/text-tool-parser.d.ts.map +1 -0
- package/dist/agent/text-tool-parser.js +96 -0
- package/dist/agent/text-tool-parser.js.map +1 -0
- package/dist/agent/vision-bridge.d.ts +29 -0
- package/dist/agent/vision-bridge.d.ts.map +1 -0
- package/dist/agent/vision-bridge.js +143 -0
- package/dist/agent/vision-bridge.js.map +1 -0
- package/dist/audit/cost.d.ts +18 -0
- package/dist/audit/cost.d.ts.map +1 -0
- package/dist/audit/cost.js +170 -0
- package/dist/audit/cost.js.map +1 -0
- package/dist/audit/export.d.ts +30 -0
- package/dist/audit/export.d.ts.map +1 -0
- package/dist/audit/export.js +155 -0
- package/dist/audit/export.js.map +1 -0
- package/dist/audit/index.d.ts +11 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +9 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/integrity.d.ts +7 -0
- package/dist/audit/integrity.d.ts.map +1 -0
- package/dist/audit/integrity.js +78 -0
- package/dist/audit/integrity.js.map +1 -0
- package/dist/audit/logger.d.ts +18 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +113 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/patterns.d.ts +34 -0
- package/dist/audit/patterns.d.ts.map +1 -0
- package/dist/audit/patterns.js +104 -0
- package/dist/audit/patterns.js.map +1 -0
- package/dist/audit/security.d.ts +8 -0
- package/dist/audit/security.d.ts.map +1 -0
- package/dist/audit/security.js +56 -0
- package/dist/audit/security.js.map +1 -0
- package/dist/audit/summary.d.ts +22 -0
- package/dist/audit/summary.d.ts.map +1 -0
- package/dist/audit/summary.js +51 -0
- package/dist/audit/summary.js.map +1 -0
- package/dist/audit/types.d.ts +104 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +11 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/auto/aurora-router.d.ts +71 -0
- package/dist/auto/aurora-router.d.ts.map +1 -0
- package/dist/auto/aurora-router.js +138 -0
- package/dist/auto/aurora-router.js.map +1 -0
- package/dist/auto/auto-coordinator.d.ts +232 -0
- package/dist/auto/auto-coordinator.d.ts.map +1 -0
- package/dist/auto/auto-coordinator.js +1260 -0
- package/dist/auto/auto-coordinator.js.map +1 -0
- package/dist/auto/brief-generator.d.ts +10 -0
- package/dist/auto/brief-generator.d.ts.map +1 -0
- package/dist/auto/brief-generator.js +67 -0
- package/dist/auto/brief-generator.js.map +1 -0
- package/dist/auto/changes-summary.d.ts +19 -0
- package/dist/auto/changes-summary.d.ts.map +1 -0
- package/dist/auto/changes-summary.js +45 -0
- package/dist/auto/changes-summary.js.map +1 -0
- package/dist/auto/context-tracker.d.ts +27 -0
- package/dist/auto/context-tracker.d.ts.map +1 -0
- package/dist/auto/context-tracker.js +56 -0
- package/dist/auto/context-tracker.js.map +1 -0
- package/dist/auto/coordinator-model.d.ts +31 -0
- package/dist/auto/coordinator-model.d.ts.map +1 -0
- package/dist/auto/coordinator-model.js +68 -0
- package/dist/auto/coordinator-model.js.map +1 -0
- package/dist/auto/index.d.ts +12 -0
- package/dist/auto/index.d.ts.map +1 -0
- package/dist/auto/index.js +11 -0
- package/dist/auto/index.js.map +1 -0
- package/dist/auto/intent-gate.d.ts +85 -0
- package/dist/auto/intent-gate.d.ts.map +1 -0
- package/dist/auto/intent-gate.js +247 -0
- package/dist/auto/intent-gate.js.map +1 -0
- package/dist/auto/longxiang-router.d.ts +123 -0
- package/dist/auto/longxiang-router.d.ts.map +1 -0
- package/dist/auto/longxiang-router.js +184 -0
- package/dist/auto/longxiang-router.js.map +1 -0
- package/dist/auto/model-router.d.ts +42 -0
- package/dist/auto/model-router.d.ts.map +1 -0
- package/dist/auto/model-router.js +208 -0
- package/dist/auto/model-router.js.map +1 -0
- package/dist/auto/routing-modes.d.ts +33 -0
- package/dist/auto/routing-modes.d.ts.map +1 -0
- package/dist/auto/routing-modes.js +34 -0
- package/dist/auto/routing-modes.js.map +1 -0
- package/dist/auto/supernova-router.d.ts +50 -0
- package/dist/auto/supernova-router.d.ts.map +1 -0
- package/dist/auto/supernova-router.js +116 -0
- package/dist/auto/supernova-router.js.map +1 -0
- package/dist/auto/task-classifier.d.ts +10 -0
- package/dist/auto/task-classifier.d.ts.map +1 -0
- package/dist/auto/task-classifier.js +116 -0
- package/dist/auto/task-classifier.js.map +1 -0
- package/dist/auto/task-executor.d.ts +86 -0
- package/dist/auto/task-executor.d.ts.map +1 -0
- package/dist/auto/task-executor.js +271 -0
- package/dist/auto/task-executor.js.map +1 -0
- package/dist/auto/types.d.ts +57 -0
- package/dist/auto/types.d.ts.map +1 -0
- package/dist/auto/types.js +2 -0
- package/dist/auto/types.js.map +1 -0
- package/dist/awareness/tick-engine.d.ts +73 -0
- package/dist/awareness/tick-engine.d.ts.map +1 -0
- package/dist/awareness/tick-engine.js +156 -0
- package/dist/awareness/tick-engine.js.map +1 -0
- package/dist/billing/credits.d.ts +213 -0
- package/dist/billing/credits.d.ts.map +1 -0
- package/dist/billing/credits.js +535 -0
- package/dist/billing/credits.js.map +1 -0
- package/dist/billing/meter.d.ts +43 -0
- package/dist/billing/meter.d.ts.map +1 -0
- package/dist/billing/meter.js +67 -0
- package/dist/billing/meter.js.map +1 -0
- package/dist/billing/plans.d.ts +34 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +108 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/briefing/briefing-engine.d.ts +51 -0
- package/dist/briefing/briefing-engine.d.ts.map +1 -0
- package/dist/briefing/briefing-engine.js +289 -0
- package/dist/briefing/briefing-engine.js.map +1 -0
- package/dist/briefing/index.d.ts +3 -0
- package/dist/briefing/index.d.ts.map +1 -0
- package/dist/briefing/index.js +2 -0
- package/dist/briefing/index.js.map +1 -0
- package/dist/briefing/types.d.ts +49 -0
- package/dist/briefing/types.d.ts.map +1 -0
- package/dist/briefing/types.js +8 -0
- package/dist/briefing/types.js.map +1 -0
- package/dist/checkpoint/checkpoint-manager.d.ts +33 -0
- package/dist/checkpoint/checkpoint-manager.d.ts.map +1 -0
- package/dist/checkpoint/checkpoint-manager.js +144 -0
- package/dist/checkpoint/checkpoint-manager.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +169 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/personality.d.ts +32 -0
- package/dist/config/personality.d.ts.map +1 -0
- package/dist/config/personality.js +96 -0
- package/dist/config/personality.js.map +1 -0
- package/dist/config/project-config.d.ts +17 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +38 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/config/project.d.ts +155 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +746 -0
- package/dist/config/project.js.map +1 -0
- package/dist/config/schema.d.ts +61 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +11 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/constants.d.ts +13 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +15 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/dates.d.ts +35 -0
- package/dist/core/dates.d.ts.map +1 -0
- package/dist/core/dates.js +45 -0
- package/dist/core/dates.js.map +1 -0
- package/dist/core/errors.d.ts +27 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +172 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-lock.d.ts +22 -0
- package/dist/core/file-lock.d.ts.map +1 -0
- package/dist/core/file-lock.js +120 -0
- package/dist/core/file-lock.js.map +1 -0
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +32 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +157 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +13 -0
- package/dist/core/types.js.map +1 -0
- package/dist/creative/index.d.ts +50 -0
- package/dist/creative/index.d.ts.map +1 -0
- package/dist/creative/index.js +178 -0
- package/dist/creative/index.js.map +1 -0
- package/dist/dataset/capture.d.ts +15 -0
- package/dist/dataset/capture.d.ts.map +1 -0
- package/dist/dataset/capture.js +203 -0
- package/dist/dataset/capture.js.map +1 -0
- package/dist/dataset/config.d.ts +33 -0
- package/dist/dataset/config.d.ts.map +1 -0
- package/dist/dataset/config.js +60 -0
- package/dist/dataset/config.js.map +1 -0
- package/dist/dataset/consumer.d.ts +33 -0
- package/dist/dataset/consumer.d.ts.map +1 -0
- package/dist/dataset/consumer.js +97 -0
- package/dist/dataset/consumer.js.map +1 -0
- package/dist/dataset/emitter.d.ts +153 -0
- package/dist/dataset/emitter.d.ts.map +1 -0
- package/dist/dataset/emitter.js +157 -0
- package/dist/dataset/emitter.js.map +1 -0
- package/dist/dataset/events.d.ts +360 -0
- package/dist/dataset/events.d.ts.map +1 -0
- package/dist/dataset/events.js +30 -0
- package/dist/dataset/events.js.map +1 -0
- package/dist/dataset/generation-emit.d.ts +72 -0
- package/dist/dataset/generation-emit.d.ts.map +1 -0
- package/dist/dataset/generation-emit.js +94 -0
- package/dist/dataset/generation-emit.js.map +1 -0
- package/dist/dataset/redactor.d.ts +22 -0
- package/dist/dataset/redactor.d.ts.map +1 -0
- package/dist/dataset/redactor.js +68 -0
- package/dist/dataset/redactor.js.map +1 -0
- package/dist/dataset/routing.d.ts +17 -0
- package/dist/dataset/routing.d.ts.map +1 -0
- package/dist/dataset/routing.js +77 -0
- package/dist/dataset/routing.js.map +1 -0
- package/dist/dataset/summarizers.d.ts +47 -0
- package/dist/dataset/summarizers.d.ts.map +1 -0
- package/dist/dataset/summarizers.js +98 -0
- package/dist/dataset/summarizers.js.map +1 -0
- package/dist/dataset/verification.d.ts +29 -0
- package/dist/dataset/verification.d.ts.map +1 -0
- package/dist/dataset/verification.js +70 -0
- package/dist/dataset/verification.js.map +1 -0
- package/dist/desktop/budget.d.ts +66 -0
- package/dist/desktop/budget.d.ts.map +1 -0
- package/dist/desktop/budget.js +159 -0
- package/dist/desktop/budget.js.map +1 -0
- package/dist/desktop/capability.d.ts +28 -0
- package/dist/desktop/capability.d.ts.map +1 -0
- package/dist/desktop/capability.js +39 -0
- package/dist/desktop/capability.js.map +1 -0
- package/dist/desktop/conductor.d.ts +104 -0
- package/dist/desktop/conductor.d.ts.map +1 -0
- package/dist/desktop/conductor.js +876 -0
- package/dist/desktop/conductor.js.map +1 -0
- package/dist/desktop/fork-points.d.ts +56 -0
- package/dist/desktop/fork-points.d.ts.map +1 -0
- package/dist/desktop/fork-points.js +138 -0
- package/dist/desktop/fork-points.js.map +1 -0
- package/dist/desktop/index.d.ts +22 -0
- package/dist/desktop/index.d.ts.map +1 -0
- package/dist/desktop/index.js +21 -0
- package/dist/desktop/index.js.map +1 -0
- package/dist/desktop/perception.d.ts +24 -0
- package/dist/desktop/perception.d.ts.map +1 -0
- package/dist/desktop/perception.js +106 -0
- package/dist/desktop/perception.js.map +1 -0
- package/dist/desktop/personas.d.ts +30 -0
- package/dist/desktop/personas.d.ts.map +1 -0
- package/dist/desktop/personas.js +206 -0
- package/dist/desktop/personas.js.map +1 -0
- package/dist/desktop/safety.d.ts +86 -0
- package/dist/desktop/safety.d.ts.map +1 -0
- package/dist/desktop/safety.js +272 -0
- package/dist/desktop/safety.js.map +1 -0
- package/dist/desktop/screen-key.d.ts +54 -0
- package/dist/desktop/screen-key.d.ts.map +1 -0
- package/dist/desktop/screen-key.js +187 -0
- package/dist/desktop/screen-key.js.map +1 -0
- package/dist/desktop/types.d.ts +141 -0
- package/dist/desktop/types.d.ts.map +1 -0
- package/dist/desktop/types.js +8 -0
- package/dist/desktop/types.js.map +1 -0
- package/dist/docs/adapter.d.ts +71 -0
- package/dist/docs/adapter.d.ts.map +1 -0
- package/dist/docs/adapter.js +75 -0
- package/dist/docs/adapter.js.map +1 -0
- package/dist/docs/content/concepts.d.ts +3 -0
- package/dist/docs/content/concepts.d.ts.map +1 -0
- package/dist/docs/content/concepts.js +304 -0
- package/dist/docs/content/concepts.js.map +1 -0
- package/dist/docs/content/features.d.ts +3 -0
- package/dist/docs/content/features.d.ts.map +1 -0
- package/dist/docs/content/features.js +275 -0
- package/dist/docs/content/features.js.map +1 -0
- package/dist/docs/content/index.d.ts +3 -0
- package/dist/docs/content/index.d.ts.map +1 -0
- package/dist/docs/content/index.js +15 -0
- package/dist/docs/content/index.js.map +1 -0
- package/dist/docs/content/reference.d.ts +3 -0
- package/dist/docs/content/reference.d.ts.map +1 -0
- package/dist/docs/content/reference.js +220 -0
- package/dist/docs/content/reference.js.map +1 -0
- package/dist/docs/content/start.d.ts +3 -0
- package/dist/docs/content/start.d.ts.map +1 -0
- package/dist/docs/content/start.js +203 -0
- package/dist/docs/content/start.js.map +1 -0
- package/dist/docs/content/troubleshooting.d.ts +3 -0
- package/dist/docs/content/troubleshooting.d.ts.map +1 -0
- package/dist/docs/content/troubleshooting.js +98 -0
- package/dist/docs/content/troubleshooting.js.map +1 -0
- package/dist/docs/corpus.d.ts +7 -0
- package/dist/docs/corpus.d.ts.map +1 -0
- package/dist/docs/corpus.js +18 -0
- package/dist/docs/corpus.js.map +1 -0
- package/dist/docs/data/capabilities.d.ts +24 -0
- package/dist/docs/data/capabilities.d.ts.map +1 -0
- package/dist/docs/data/capabilities.js +63 -0
- package/dist/docs/data/capabilities.js.map +1 -0
- package/dist/docs/data/modes.d.ts +11 -0
- package/dist/docs/data/modes.d.ts.map +1 -0
- package/dist/docs/data/modes.js +60 -0
- package/dist/docs/data/modes.js.map +1 -0
- package/dist/docs/data/permissions.d.ts +12 -0
- package/dist/docs/data/permissions.d.ts.map +1 -0
- package/dist/docs/data/permissions.js +62 -0
- package/dist/docs/data/permissions.js.map +1 -0
- package/dist/docs/data/personas.d.ts +13 -0
- package/dist/docs/data/personas.d.ts.map +1 -0
- package/dist/docs/data/personas.js +42 -0
- package/dist/docs/data/personas.js.map +1 -0
- package/dist/docs/data/providers.d.ts +21 -0
- package/dist/docs/data/providers.d.ts.map +1 -0
- package/dist/docs/data/providers.js +210 -0
- package/dist/docs/data/providers.js.map +1 -0
- package/dist/docs/data/shortcuts.d.ts +9 -0
- package/dist/docs/data/shortcuts.d.ts.map +1 -0
- package/dist/docs/data/shortcuts.js +18 -0
- package/dist/docs/data/shortcuts.js.map +1 -0
- package/dist/docs/data/tasks.d.ts +17 -0
- package/dist/docs/data/tasks.d.ts.map +1 -0
- package/dist/docs/data/tasks.js +64 -0
- package/dist/docs/data/tasks.js.map +1 -0
- package/dist/docs/data/tools.d.ts +12 -0
- package/dist/docs/data/tools.d.ts.map +1 -0
- package/dist/docs/data/tools.js +100 -0
- package/dist/docs/data/tools.js.map +1 -0
- package/dist/docs/filter.d.ts +35 -0
- package/dist/docs/filter.d.ts.map +1 -0
- package/dist/docs/filter.js +68 -0
- package/dist/docs/filter.js.map +1 -0
- package/dist/docs/i18n/translations.d.ts +2 -0
- package/dist/docs/i18n/translations.d.ts.map +1 -0
- package/dist/docs/i18n/translations.js +4 -0
- package/dist/docs/i18n/translations.js.map +1 -0
- package/dist/docs/i18n.d.ts +15 -0
- package/dist/docs/i18n.d.ts.map +1 -0
- package/dist/docs/i18n.js +88 -0
- package/dist/docs/i18n.js.map +1 -0
- package/dist/docs/index.d.ts +16 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +15 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/product-knowledge.d.ts +45 -0
- package/dist/docs/product-knowledge.d.ts.map +1 -0
- package/dist/docs/product-knowledge.js +147 -0
- package/dist/docs/product-knowledge.js.map +1 -0
- package/dist/docs/types.d.ts +138 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/types.js +14 -0
- package/dist/docs/types.js.map +1 -0
- package/dist/events/event-detector.d.ts +39 -0
- package/dist/events/event-detector.d.ts.map +1 -0
- package/dist/events/event-detector.js +223 -0
- package/dist/events/event-detector.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +35 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -0
- package/dist/exercises/index.d.ts +249 -0
- package/dist/exercises/index.d.ts.map +1 -0
- package/dist/exercises/index.js +181 -0
- package/dist/exercises/index.js.map +1 -0
- package/dist/health/aisles.d.ts +33 -0
- package/dist/health/aisles.d.ts.map +1 -0
- package/dist/health/aisles.js +417 -0
- package/dist/health/aisles.js.map +1 -0
- package/dist/health/cooking.d.ts +13 -0
- package/dist/health/cooking.d.ts.map +1 -0
- package/dist/health/cooking.js +19 -0
- package/dist/health/cooking.js.map +1 -0
- package/dist/health/duplicate.d.ts +47 -0
- package/dist/health/duplicate.d.ts.map +1 -0
- package/dist/health/duplicate.js +136 -0
- package/dist/health/duplicate.js.map +1 -0
- package/dist/health/index.d.ts +7 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +10 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/node-store.d.ts +30 -0
- package/dist/health/node-store.d.ts.map +1 -0
- package/dist/health/node-store.js +250 -0
- package/dist/health/node-store.js.map +1 -0
- package/dist/health/prep.d.ts +86 -0
- package/dist/health/prep.d.ts.map +1 -0
- package/dist/health/prep.js +152 -0
- package/dist/health/prep.js.map +1 -0
- package/dist/health/profile-fields.d.ts +46 -0
- package/dist/health/profile-fields.d.ts.map +1 -0
- package/dist/health/profile-fields.js +194 -0
- package/dist/health/profile-fields.js.map +1 -0
- package/dist/health/session-store.d.ts +30 -0
- package/dist/health/session-store.d.ts.map +1 -0
- package/dist/health/session-store.js +20 -0
- package/dist/health/session-store.js.map +1 -0
- package/dist/health/session-summary.d.ts +10 -0
- package/dist/health/session-summary.d.ts.map +1 -0
- package/dist/health/session-summary.js +106 -0
- package/dist/health/session-summary.js.map +1 -0
- package/dist/health/session-types.d.ts +74 -0
- package/dist/health/session-types.d.ts.map +1 -0
- package/dist/health/session-types.js +53 -0
- package/dist/health/session-types.js.map +1 -0
- package/dist/health/shopping-list.d.ts +226 -0
- package/dist/health/shopping-list.d.ts.map +1 -0
- package/dist/health/shopping-list.js +432 -0
- package/dist/health/shopping-list.js.map +1 -0
- package/dist/health/starters.d.ts +155 -0
- package/dist/health/starters.d.ts.map +1 -0
- package/dist/health/starters.js +270 -0
- package/dist/health/starters.js.map +1 -0
- package/dist/health/store.d.ts +59 -0
- package/dist/health/store.d.ts.map +1 -0
- package/dist/health/store.js +17 -0
- package/dist/health/store.js.map +1 -0
- package/dist/health/types.d.ts +213 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/health/types.js +11 -0
- package/dist/health/types.js.map +1 -0
- package/dist/history/conversation-title.d.ts +67 -0
- package/dist/history/conversation-title.d.ts.map +1 -0
- package/dist/history/conversation-title.js +184 -0
- package/dist/history/conversation-title.js.map +1 -0
- package/dist/history/history-manager.d.ts +50 -0
- package/dist/history/history-manager.d.ts.map +1 -0
- package/dist/history/history-manager.js +168 -0
- package/dist/history/history-manager.js.map +1 -0
- package/dist/history/storage.d.ts +41 -0
- package/dist/history/storage.d.ts.map +1 -0
- package/dist/history/storage.js +133 -0
- package/dist/history/storage.js.map +1 -0
- package/dist/i18n/index.d.ts +41 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +188 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/keep-english.d.ts +12 -0
- package/dist/i18n/keep-english.d.ts.map +1 -0
- package/dist/i18n/keep-english.js +351 -0
- package/dist/i18n/keep-english.js.map +1 -0
- package/dist/i18n/locales/ar.d.ts +4 -0
- package/dist/i18n/locales/ar.d.ts.map +1 -0
- package/dist/i18n/locales/ar.js +4143 -0
- package/dist/i18n/locales/ar.js.map +1 -0
- package/dist/i18n/locales/de.d.ts +4 -0
- package/dist/i18n/locales/de.d.ts.map +1 -0
- package/dist/i18n/locales/de.js +4133 -0
- package/dist/i18n/locales/de.js.map +1 -0
- package/dist/i18n/locales/en.d.ts +4068 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +4347 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/es.d.ts +4 -0
- package/dist/i18n/locales/es.d.ts.map +1 -0
- package/dist/i18n/locales/es.js +4128 -0
- package/dist/i18n/locales/es.js.map +1 -0
- package/dist/i18n/locales/fr.d.ts +4 -0
- package/dist/i18n/locales/fr.d.ts.map +1 -0
- package/dist/i18n/locales/fr.js +4140 -0
- package/dist/i18n/locales/fr.js.map +1 -0
- package/dist/i18n/locales/hi.d.ts +4 -0
- package/dist/i18n/locales/hi.d.ts.map +1 -0
- package/dist/i18n/locales/hi.js +4143 -0
- package/dist/i18n/locales/hi.js.map +1 -0
- package/dist/i18n/locales/id.d.ts +4 -0
- package/dist/i18n/locales/id.d.ts.map +1 -0
- package/dist/i18n/locales/id.js +4142 -0
- package/dist/i18n/locales/id.js.map +1 -0
- package/dist/i18n/locales/it.d.ts +4 -0
- package/dist/i18n/locales/it.d.ts.map +1 -0
- package/dist/i18n/locales/it.js +4143 -0
- package/dist/i18n/locales/it.js.map +1 -0
- package/dist/i18n/locales/ja.d.ts +4 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -0
- package/dist/i18n/locales/ja.js +4144 -0
- package/dist/i18n/locales/ja.js.map +1 -0
- package/dist/i18n/locales/ko.d.ts +4 -0
- package/dist/i18n/locales/ko.d.ts.map +1 -0
- package/dist/i18n/locales/ko.js +4143 -0
- package/dist/i18n/locales/ko.js.map +1 -0
- package/dist/i18n/locales/nl.d.ts +4 -0
- package/dist/i18n/locales/nl.d.ts.map +1 -0
- package/dist/i18n/locales/nl.js +4143 -0
- package/dist/i18n/locales/nl.js.map +1 -0
- package/dist/i18n/locales/pl.d.ts +4 -0
- package/dist/i18n/locales/pl.d.ts.map +1 -0
- package/dist/i18n/locales/pl.js +4133 -0
- package/dist/i18n/locales/pl.js.map +1 -0
- package/dist/i18n/locales/pt.d.ts +4 -0
- package/dist/i18n/locales/pt.d.ts.map +1 -0
- package/dist/i18n/locales/pt.js +4141 -0
- package/dist/i18n/locales/pt.js.map +1 -0
- package/dist/i18n/locales/ru.d.ts +4 -0
- package/dist/i18n/locales/ru.d.ts.map +1 -0
- package/dist/i18n/locales/ru.js +4143 -0
- package/dist/i18n/locales/ru.js.map +1 -0
- package/dist/i18n/locales/th.d.ts +4 -0
- package/dist/i18n/locales/th.d.ts.map +1 -0
- package/dist/i18n/locales/th.js +4143 -0
- package/dist/i18n/locales/th.js.map +1 -0
- package/dist/i18n/locales/tr.d.ts +4 -0
- package/dist/i18n/locales/tr.d.ts.map +1 -0
- package/dist/i18n/locales/tr.js +4143 -0
- package/dist/i18n/locales/tr.js.map +1 -0
- package/dist/i18n/locales/uk.d.ts +4 -0
- package/dist/i18n/locales/uk.d.ts.map +1 -0
- package/dist/i18n/locales/uk.js +4133 -0
- package/dist/i18n/locales/uk.js.map +1 -0
- package/dist/i18n/locales/vi.d.ts +4 -0
- package/dist/i18n/locales/vi.d.ts.map +1 -0
- package/dist/i18n/locales/vi.js +4143 -0
- package/dist/i18n/locales/vi.js.map +1 -0
- package/dist/i18n/locales/zh-CN.d.ts +4 -0
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
- package/dist/i18n/locales/zh-CN.js +4133 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -0
- package/dist/i18n/locales/zh-TW.d.ts +4 -0
- package/dist/i18n/locales/zh-TW.d.ts.map +1 -0
- package/dist/i18n/locales/zh-TW.js +4143 -0
- package/dist/i18n/locales/zh-TW.js.map +1 -0
- package/dist/i18n/types.d.ts +5 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +46 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +142 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/project-indexer.d.ts +66 -0
- package/dist/indexer/project-indexer.d.ts.map +1 -0
- package/dist/indexer/project-indexer.js +574 -0
- package/dist/indexer/project-indexer.js.map +1 -0
- package/dist/indexer/symbol-indexer.d.ts +56 -0
- package/dist/indexer/symbol-indexer.d.ts.map +1 -0
- package/dist/indexer/symbol-indexer.js +579 -0
- package/dist/indexer/symbol-indexer.js.map +1 -0
- package/dist/journal/journal-manager.d.ts +143 -0
- package/dist/journal/journal-manager.d.ts.map +1 -0
- package/dist/journal/journal-manager.js +472 -0
- package/dist/journal/journal-manager.js.map +1 -0
- package/dist/journal/platform-sync.d.ts +17 -0
- package/dist/journal/platform-sync.d.ts.map +1 -0
- package/dist/journal/platform-sync.js +21 -0
- package/dist/journal/platform-sync.js.map +1 -0
- package/dist/journal/types.d.ts +78 -0
- package/dist/journal/types.d.ts.map +1 -0
- package/dist/journal/types.js +74 -0
- package/dist/journal/types.js.map +1 -0
- package/dist/knowledge/index.d.ts +2 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +2 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/learning/index.d.ts +6 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +9 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/learner-context.d.ts +11 -0
- package/dist/learning/learner-context.d.ts.map +1 -0
- package/dist/learning/learner-context.js +57 -0
- package/dist/learning/learner-context.js.map +1 -0
- package/dist/learning/library-fork.d.ts +33 -0
- package/dist/learning/library-fork.d.ts.map +1 -0
- package/dist/learning/library-fork.js +92 -0
- package/dist/learning/library-fork.js.map +1 -0
- package/dist/learning/progression-export.d.ts +4 -0
- package/dist/learning/progression-export.d.ts.map +1 -0
- package/dist/learning/progression-export.js +21 -0
- package/dist/learning/progression-export.js.map +1 -0
- package/dist/learning/progression-markdown.d.ts +14 -0
- package/dist/learning/progression-markdown.d.ts.map +1 -0
- package/dist/learning/progression-markdown.js +73 -0
- package/dist/learning/progression-markdown.js.map +1 -0
- package/dist/learning/progression.d.ts +65 -0
- package/dist/learning/progression.d.ts.map +1 -0
- package/dist/learning/progression.js +186 -0
- package/dist/learning/progression.js.map +1 -0
- package/dist/memory/ambient-capture.d.ts +26 -0
- package/dist/memory/ambient-capture.d.ts.map +1 -0
- package/dist/memory/ambient-capture.js +174 -0
- package/dist/memory/ambient-capture.js.map +1 -0
- package/dist/memory/auto-extract.d.ts +54 -0
- package/dist/memory/auto-extract.d.ts.map +1 -0
- package/dist/memory/auto-extract.js +499 -0
- package/dist/memory/auto-extract.js.map +1 -0
- package/dist/memory/config.d.ts +47 -0
- package/dist/memory/config.d.ts.map +1 -0
- package/dist/memory/config.js +52 -0
- package/dist/memory/config.js.map +1 -0
- package/dist/memory/consolidation.d.ts +60 -0
- package/dist/memory/consolidation.d.ts.map +1 -0
- package/dist/memory/consolidation.js +311 -0
- package/dist/memory/consolidation.js.map +1 -0
- package/dist/memory/embedding-service.d.ts +50 -0
- package/dist/memory/embedding-service.d.ts.map +1 -0
- package/dist/memory/embedding-service.js +86 -0
- package/dist/memory/embedding-service.js.map +1 -0
- package/dist/memory/embedding-store.d.ts +31 -0
- package/dist/memory/embedding-store.d.ts.map +1 -0
- package/dist/memory/embedding-store.js +109 -0
- package/dist/memory/embedding-store.js.map +1 -0
- package/dist/memory/graph-engine.d.ts +145 -0
- package/dist/memory/graph-engine.d.ts.map +1 -0
- package/dist/memory/graph-engine.js +628 -0
- package/dist/memory/graph-engine.js.map +1 -0
- package/dist/memory/insights.d.ts +39 -0
- package/dist/memory/insights.d.ts.map +1 -0
- package/dist/memory/insights.js +138 -0
- package/dist/memory/insights.js.map +1 -0
- package/dist/memory/memory-agent.d.ts +93 -0
- package/dist/memory/memory-agent.d.ts.map +1 -0
- package/dist/memory/memory-agent.js +475 -0
- package/dist/memory/memory-agent.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +232 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +1633 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/migration-v3.d.ts +22 -0
- package/dist/memory/migration-v3.d.ts.map +1 -0
- package/dist/memory/migration-v3.js +193 -0
- package/dist/memory/migration-v3.js.map +1 -0
- package/dist/memory/mode-recall.d.ts +20 -0
- package/dist/memory/mode-recall.d.ts.map +1 -0
- package/dist/memory/mode-recall.js +104 -0
- package/dist/memory/mode-recall.js.map +1 -0
- package/dist/memory/patterns.d.ts +92 -0
- package/dist/memory/patterns.d.ts.map +1 -0
- package/dist/memory/patterns.js +389 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/memory/platform-sync.d.ts +54 -0
- package/dist/memory/platform-sync.d.ts.map +1 -0
- package/dist/memory/platform-sync.js +176 -0
- package/dist/memory/platform-sync.js.map +1 -0
- package/dist/memory/procedural.d.ts +47 -0
- package/dist/memory/procedural.d.ts.map +1 -0
- package/dist/memory/procedural.js +182 -0
- package/dist/memory/procedural.js.map +1 -0
- package/dist/memory/project-brain.d.ts +27 -0
- package/dist/memory/project-brain.d.ts.map +1 -0
- package/dist/memory/project-brain.js +158 -0
- package/dist/memory/project-brain.js.map +1 -0
- package/dist/memory/self-improvement.d.ts +45 -0
- package/dist/memory/self-improvement.d.ts.map +1 -0
- package/dist/memory/self-improvement.js +178 -0
- package/dist/memory/self-improvement.js.map +1 -0
- package/dist/memory/tfidf.d.ts +71 -0
- package/dist/memory/tfidf.d.ts.map +1 -0
- package/dist/memory/tfidf.js +223 -0
- package/dist/memory/tfidf.js.map +1 -0
- package/dist/memory/training-export.d.ts +51 -0
- package/dist/memory/training-export.d.ts.map +1 -0
- package/dist/memory/training-export.js +122 -0
- package/dist/memory/training-export.js.map +1 -0
- package/dist/memory/types.d.ts +380 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +99 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/news/index.d.ts +163 -0
- package/dist/news/index.d.ts.map +1 -0
- package/dist/news/index.js +184 -0
- package/dist/news/index.js.map +1 -0
- package/dist/papers/arxiv-client.d.ts +21 -0
- package/dist/papers/arxiv-client.d.ts.map +1 -0
- package/dist/papers/arxiv-client.js +130 -0
- package/dist/papers/arxiv-client.js.map +1 -0
- package/dist/papers/crossref-client.d.ts +3 -0
- package/dist/papers/crossref-client.d.ts.map +1 -0
- package/dist/papers/crossref-client.js +96 -0
- package/dist/papers/crossref-client.js.map +1 -0
- package/dist/papers/discipline.d.ts +19 -0
- package/dist/papers/discipline.d.ts.map +1 -0
- package/dist/papers/discipline.js +96 -0
- package/dist/papers/discipline.js.map +1 -0
- package/dist/papers/index.d.ts +10 -0
- package/dist/papers/index.d.ts.map +1 -0
- package/dist/papers/index.js +7 -0
- package/dist/papers/index.js.map +1 -0
- package/dist/papers/openalex-client.d.ts +13 -0
- package/dist/papers/openalex-client.d.ts.map +1 -0
- package/dist/papers/openalex-client.js +206 -0
- package/dist/papers/openalex-client.js.map +1 -0
- package/dist/papers/paper-fetcher.d.ts +37 -0
- package/dist/papers/paper-fetcher.d.ts.map +1 -0
- package/dist/papers/paper-fetcher.js +75 -0
- package/dist/papers/paper-fetcher.js.map +1 -0
- package/dist/papers/types.d.ts +80 -0
- package/dist/papers/types.d.ts.map +1 -0
- package/dist/papers/types.js +25 -0
- package/dist/papers/types.js.map +1 -0
- package/dist/personas/conductor.d.ts +184 -0
- package/dist/personas/conductor.d.ts.map +1 -0
- package/dist/personas/conductor.js +871 -0
- package/dist/personas/conductor.js.map +1 -0
- package/dist/personas/definitions.d.ts +48 -0
- package/dist/personas/definitions.d.ts.map +1 -0
- package/dist/personas/definitions.js +828 -0
- package/dist/personas/definitions.js.map +1 -0
- package/dist/personas/index.d.ts +4 -0
- package/dist/personas/index.d.ts.map +1 -0
- package/dist/personas/index.js +3 -0
- package/dist/personas/index.js.map +1 -0
- package/dist/personas/types.d.ts +148 -0
- package/dist/personas/types.d.ts.map +1 -0
- package/dist/personas/types.js +5 -0
- package/dist/personas/types.js.map +1 -0
- package/dist/personas/verification-matrix.d.ts +44 -0
- package/dist/personas/verification-matrix.d.ts.map +1 -0
- package/dist/personas/verification-matrix.js +232 -0
- package/dist/personas/verification-matrix.js.map +1 -0
- package/dist/portability/bundle.d.ts +80 -0
- package/dist/portability/bundle.d.ts.map +1 -0
- package/dist/portability/bundle.js +155 -0
- package/dist/portability/bundle.js.map +1 -0
- package/dist/portability/crypto.d.ts +42 -0
- package/dist/portability/crypto.d.ts.map +1 -0
- package/dist/portability/crypto.js +89 -0
- package/dist/portability/crypto.js.map +1 -0
- package/dist/portability/data-types.d.ts +54 -0
- package/dist/portability/data-types.d.ts.map +1 -0
- package/dist/portability/data-types.js +281 -0
- package/dist/portability/data-types.js.map +1 -0
- package/dist/portability/index.d.ts +35 -0
- package/dist/portability/index.d.ts.map +1 -0
- package/dist/portability/index.js +41 -0
- package/dist/portability/index.js.map +1 -0
- package/dist/providers/base-provider.d.ts +65 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +305 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/catalog.d.ts +25 -0
- package/dist/providers/catalog.d.ts.map +1 -0
- package/dist/providers/catalog.js +53 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/deepseek/index.d.ts +9 -0
- package/dist/providers/deepseek/index.d.ts.map +1 -0
- package/dist/providers/deepseek/index.js +19 -0
- package/dist/providers/deepseek/index.js.map +1 -0
- package/dist/providers/deepseek/models.d.ts +3 -0
- package/dist/providers/deepseek/models.d.ts.map +1 -0
- package/dist/providers/deepseek/models.js +56 -0
- package/dist/providers/deepseek/models.js.map +1 -0
- package/dist/providers/generic/index.d.ts +25 -0
- package/dist/providers/generic/index.d.ts.map +1 -0
- package/dist/providers/generic/index.js +51 -0
- package/dist/providers/generic/index.js.map +1 -0
- package/dist/providers/generic/models.d.ts +3 -0
- package/dist/providers/generic/models.d.ts.map +1 -0
- package/dist/providers/generic/models.js +13 -0
- package/dist/providers/generic/models.js.map +1 -0
- package/dist/providers/health-tracker.d.ts +44 -0
- package/dist/providers/health-tracker.d.ts.map +1 -0
- package/dist/providers/health-tracker.js +110 -0
- package/dist/providers/health-tracker.js.map +1 -0
- package/dist/providers/kimi/index.d.ts +9 -0
- package/dist/providers/kimi/index.d.ts.map +1 -0
- package/dist/providers/kimi/index.js +13 -0
- package/dist/providers/kimi/index.js.map +1 -0
- package/dist/providers/kimi/models.d.ts +3 -0
- package/dist/providers/kimi/models.d.ts.map +1 -0
- package/dist/providers/kimi/models.js +60 -0
- package/dist/providers/kimi/models.js.map +1 -0
- package/dist/providers/minimax/index.d.ts +9 -0
- package/dist/providers/minimax/index.d.ts.map +1 -0
- package/dist/providers/minimax/index.js +13 -0
- package/dist/providers/minimax/index.js.map +1 -0
- package/dist/providers/minimax/models.d.ts +3 -0
- package/dist/providers/minimax/models.d.ts.map +1 -0
- package/dist/providers/minimax/models.js +65 -0
- package/dist/providers/minimax/models.js.map +1 -0
- package/dist/providers/mistral/index.d.ts +11 -0
- package/dist/providers/mistral/index.d.ts.map +1 -0
- package/dist/providers/mistral/index.js +24 -0
- package/dist/providers/mistral/index.js.map +1 -0
- package/dist/providers/mistral/models.d.ts +3 -0
- package/dist/providers/mistral/models.d.ts.map +1 -0
- package/dist/providers/mistral/models.js +65 -0
- package/dist/providers/mistral/models.js.map +1 -0
- package/dist/providers/nvidia/index.d.ts +16 -0
- package/dist/providers/nvidia/index.d.ts.map +1 -0
- package/dist/providers/nvidia/index.js +20 -0
- package/dist/providers/nvidia/index.js.map +1 -0
- package/dist/providers/nvidia/models.d.ts +3 -0
- package/dist/providers/nvidia/models.d.ts.map +1 -0
- package/dist/providers/nvidia/models.js +56 -0
- package/dist/providers/nvidia/models.js.map +1 -0
- package/dist/providers/platform/index.d.ts +10 -0
- package/dist/providers/platform/index.d.ts.map +1 -0
- package/dist/providers/platform/index.js +16 -0
- package/dist/providers/platform/index.js.map +1 -0
- package/dist/providers/platform/models.d.ts +3 -0
- package/dist/providers/platform/models.d.ts.map +1 -0
- package/dist/providers/platform/models.js +233 -0
- package/dist/providers/platform/models.js.map +1 -0
- package/dist/providers/provider-registry.d.ts +44 -0
- package/dist/providers/provider-registry.d.ts.map +1 -0
- package/dist/providers/provider-registry.js +197 -0
- package/dist/providers/provider-registry.js.map +1 -0
- package/dist/providers/qwen/index.d.ts +9 -0
- package/dist/providers/qwen/index.d.ts.map +1 -0
- package/dist/providers/qwen/index.js +13 -0
- package/dist/providers/qwen/index.js.map +1 -0
- package/dist/providers/qwen/models.d.ts +3 -0
- package/dist/providers/qwen/models.d.ts.map +1 -0
- package/dist/providers/qwen/models.js +164 -0
- package/dist/providers/qwen/models.js.map +1 -0
- package/dist/providers/request-shaping/index.d.ts +29 -0
- package/dist/providers/request-shaping/index.d.ts.map +1 -0
- package/dist/providers/request-shaping/index.js +31 -0
- package/dist/providers/request-shaping/index.js.map +1 -0
- package/dist/providers/request-shaping/messages.d.ts +61 -0
- package/dist/providers/request-shaping/messages.d.ts.map +1 -0
- package/dist/providers/request-shaping/messages.js +114 -0
- package/dist/providers/request-shaping/messages.js.map +1 -0
- package/dist/providers/request-shaping/model-ids.d.ts +44 -0
- package/dist/providers/request-shaping/model-ids.d.ts.map +1 -0
- package/dist/providers/request-shaping/model-ids.js +96 -0
- package/dist/providers/request-shaping/model-ids.js.map +1 -0
- package/dist/providers/request-shaping/params.d.ts +38 -0
- package/dist/providers/request-shaping/params.d.ts.map +1 -0
- package/dist/providers/request-shaping/params.js +79 -0
- package/dist/providers/request-shaping/params.js.map +1 -0
- package/dist/providers/resilient-provider.d.ts +44 -0
- package/dist/providers/resilient-provider.d.ts.map +1 -0
- package/dist/providers/resilient-provider.js +141 -0
- package/dist/providers/resilient-provider.js.map +1 -0
- package/dist/providers/tencent/index.d.ts +19 -0
- package/dist/providers/tencent/index.d.ts.map +1 -0
- package/dist/providers/tencent/index.js +50 -0
- package/dist/providers/tencent/index.js.map +1 -0
- package/dist/providers/tencent/models.d.ts +3 -0
- package/dist/providers/tencent/models.d.ts.map +1 -0
- package/dist/providers/tencent/models.js +29 -0
- package/dist/providers/tencent/models.js.map +1 -0
- package/dist/providers/types.d.ts +98 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/xiaomi/index.d.ts +9 -0
- package/dist/providers/xiaomi/index.d.ts.map +1 -0
- package/dist/providers/xiaomi/index.js +16 -0
- package/dist/providers/xiaomi/index.js.map +1 -0
- package/dist/providers/xiaomi/models.d.ts +3 -0
- package/dist/providers/xiaomi/models.d.ts.map +1 -0
- package/dist/providers/xiaomi/models.js +37 -0
- package/dist/providers/xiaomi/models.js.map +1 -0
- package/dist/providers/zhipu/index.d.ts +11 -0
- package/dist/providers/zhipu/index.d.ts.map +1 -0
- package/dist/providers/zhipu/index.js +44 -0
- package/dist/providers/zhipu/index.js.map +1 -0
- package/dist/providers/zhipu/models.d.ts +3 -0
- package/dist/providers/zhipu/models.d.ts.map +1 -0
- package/dist/providers/zhipu/models.js +37 -0
- package/dist/providers/zhipu/models.js.map +1 -0
- package/dist/recipes/index.d.ts +215 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +232 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/remote/client.d.ts +67 -0
- package/dist/remote/client.d.ts.map +1 -0
- package/dist/remote/client.js +202 -0
- package/dist/remote/client.js.map +1 -0
- package/dist/remote/index.d.ts +9 -0
- package/dist/remote/index.d.ts.map +1 -0
- package/dist/remote/index.js +7 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote/schema.d.ts +152 -0
- package/dist/remote/schema.d.ts.map +1 -0
- package/dist/remote/schema.js +26 -0
- package/dist/remote/schema.js.map +1 -0
- package/dist/security/index.d.ts +6 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +5 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/scanner.d.ts +67 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +422 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/social/day-plan.d.ts +38 -0
- package/dist/social/day-plan.d.ts.map +1 -0
- package/dist/social/day-plan.js +16 -0
- package/dist/social/day-plan.js.map +1 -0
- package/dist/social/index.d.ts +290 -0
- package/dist/social/index.d.ts.map +1 -0
- package/dist/social/index.js +96 -0
- package/dist/social/index.js.map +1 -0
- package/dist/tasks/platform-sync.d.ts +22 -0
- package/dist/tasks/platform-sync.d.ts.map +1 -0
- package/dist/tasks/platform-sync.js +132 -0
- package/dist/tasks/platform-sync.js.map +1 -0
- package/dist/tasks/task-manager.d.ts +164 -0
- package/dist/tasks/task-manager.d.ts.map +1 -0
- package/dist/tasks/task-manager.js +643 -0
- package/dist/tasks/task-manager.js.map +1 -0
- package/dist/tasks/types.d.ts +105 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +23 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/tools/analyze-architecture.d.ts +17 -0
- package/dist/tools/analyze-architecture.d.ts.map +1 -0
- package/dist/tools/analyze-architecture.js +316 -0
- package/dist/tools/analyze-architecture.js.map +1 -0
- package/dist/tools/apply-plan.d.ts +12 -0
- package/dist/tools/apply-plan.d.ts.map +1 -0
- package/dist/tools/apply-plan.js +119 -0
- package/dist/tools/apply-plan.js.map +1 -0
- package/dist/tools/ask-user.d.ts +11 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +32 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/audit-dependencies.d.ts +13 -0
- package/dist/tools/audit-dependencies.d.ts.map +1 -0
- package/dist/tools/audit-dependencies.js +156 -0
- package/dist/tools/audit-dependencies.js.map +1 -0
- package/dist/tools/authoring/doc-model.d.ts +128 -0
- package/dist/tools/authoring/doc-model.d.ts.map +1 -0
- package/dist/tools/authoring/doc-model.js +82 -0
- package/dist/tools/authoring/doc-model.js.map +1 -0
- package/dist/tools/authoring/frontmatter.d.ts +51 -0
- package/dist/tools/authoring/frontmatter.d.ts.map +1 -0
- package/dist/tools/authoring/frontmatter.js +203 -0
- package/dist/tools/authoring/frontmatter.js.map +1 -0
- package/dist/tools/authoring/image-size.d.ts +17 -0
- package/dist/tools/authoring/image-size.d.ts.map +1 -0
- package/dist/tools/authoring/image-size.js +47 -0
- package/dist/tools/authoring/image-size.js.map +1 -0
- package/dist/tools/authoring/index.d.ts +34 -0
- package/dist/tools/authoring/index.d.ts.map +1 -0
- package/dist/tools/authoring/index.js +44 -0
- package/dist/tools/authoring/index.js.map +1 -0
- package/dist/tools/authoring/md-parse.d.ts +18 -0
- package/dist/tools/authoring/md-parse.d.ts.map +1 -0
- package/dist/tools/authoring/md-parse.js +262 -0
- package/dist/tools/authoring/md-parse.js.map +1 -0
- package/dist/tools/authoring/render-docx.d.ts +18 -0
- package/dist/tools/authoring/render-docx.d.ts.map +1 -0
- package/dist/tools/authoring/render-docx.js +272 -0
- package/dist/tools/authoring/render-docx.js.map +1 -0
- package/dist/tools/authoring/render-md.d.ts +13 -0
- package/dist/tools/authoring/render-md.d.ts.map +1 -0
- package/dist/tools/authoring/render-md.js +139 -0
- package/dist/tools/authoring/render-md.js.map +1 -0
- package/dist/tools/authoring/render-pdf.d.ts +16 -0
- package/dist/tools/authoring/render-pdf.d.ts.map +1 -0
- package/dist/tools/authoring/render-pdf.js +298 -0
- package/dist/tools/authoring/render-pdf.js.map +1 -0
- package/dist/tools/authoring/sections.d.ts +35 -0
- package/dist/tools/authoring/sections.d.ts.map +1 -0
- package/dist/tools/authoring/sections.js +81 -0
- package/dist/tools/authoring/sections.js.map +1 -0
- package/dist/tools/authoring/templates/builtins.d.ts +11 -0
- package/dist/tools/authoring/templates/builtins.d.ts.map +1 -0
- package/dist/tools/authoring/templates/builtins.js +478 -0
- package/dist/tools/authoring/templates/builtins.js.map +1 -0
- package/dist/tools/authoring/templates/index.d.ts +15 -0
- package/dist/tools/authoring/templates/index.d.ts.map +1 -0
- package/dist/tools/authoring/templates/index.js +25 -0
- package/dist/tools/authoring/templates/index.js.map +1 -0
- package/dist/tools/authoring/templates/store.d.ts +15 -0
- package/dist/tools/authoring/templates/store.d.ts.map +1 -0
- package/dist/tools/authoring/templates/store.js +63 -0
- package/dist/tools/authoring/templates/store.js.map +1 -0
- package/dist/tools/authoring/templates/template-model.d.ts +44 -0
- package/dist/tools/authoring/templates/template-model.d.ts.map +1 -0
- package/dist/tools/authoring/templates/template-model.js +39 -0
- package/dist/tools/authoring/templates/template-model.js.map +1 -0
- package/dist/tools/bash.d.ts +34 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +353 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/benchmark.d.ts +12 -0
- package/dist/tools/benchmark.d.ts.map +1 -0
- package/dist/tools/benchmark.js +147 -0
- package/dist/tools/benchmark.js.map +1 -0
- package/dist/tools/browse-library.d.ts +12 -0
- package/dist/tools/browse-library.d.ts.map +1 -0
- package/dist/tools/browse-library.js +188 -0
- package/dist/tools/browse-library.js.map +1 -0
- package/dist/tools/browser-click.d.ts +12 -0
- package/dist/tools/browser-click.d.ts.map +1 -0
- package/dist/tools/browser-click.js +58 -0
- package/dist/tools/browser-click.js.map +1 -0
- package/dist/tools/browser-close.d.ts +11 -0
- package/dist/tools/browser-close.d.ts.map +1 -0
- package/dist/tools/browser-close.js +27 -0
- package/dist/tools/browser-close.js.map +1 -0
- package/dist/tools/browser-navigate.d.ts +12 -0
- package/dist/tools/browser-navigate.d.ts.map +1 -0
- package/dist/tools/browser-navigate.js +66 -0
- package/dist/tools/browser-navigate.js.map +1 -0
- package/dist/tools/browser-snapshot.d.ts +11 -0
- package/dist/tools/browser-snapshot.d.ts.map +1 -0
- package/dist/tools/browser-snapshot.js +56 -0
- package/dist/tools/browser-snapshot.js.map +1 -0
- package/dist/tools/browser-type.d.ts +12 -0
- package/dist/tools/browser-type.d.ts.map +1 -0
- package/dist/tools/browser-type.js +68 -0
- package/dist/tools/browser-type.js.map +1 -0
- package/dist/tools/browser.d.ts +29 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +307 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/conversation-recall.d.ts +43 -0
- package/dist/tools/conversation-recall.d.ts.map +1 -0
- package/dist/tools/conversation-recall.js +177 -0
- package/dist/tools/conversation-recall.js.map +1 -0
- package/dist/tools/creative-asset-sync.d.ts +33 -0
- package/dist/tools/creative-asset-sync.d.ts.map +1 -0
- package/dist/tools/creative-asset-sync.js +39 -0
- package/dist/tools/creative-asset-sync.js.map +1 -0
- package/dist/tools/curator.d.ts +34 -0
- package/dist/tools/curator.d.ts.map +1 -0
- package/dist/tools/curator.js +191 -0
- package/dist/tools/curator.js.map +1 -0
- package/dist/tools/database-query.d.ts +11 -0
- package/dist/tools/database-query.d.ts.map +1 -0
- package/dist/tools/database-query.js +228 -0
- package/dist/tools/database-query.js.map +1 -0
- package/dist/tools/day-plan.d.ts +27 -0
- package/dist/tools/day-plan.d.ts.map +1 -0
- package/dist/tools/day-plan.js +207 -0
- package/dist/tools/day-plan.js.map +1 -0
- package/dist/tools/debug-logs.d.ts +13 -0
- package/dist/tools/debug-logs.d.ts.map +1 -0
- package/dist/tools/debug-logs.js +141 -0
- package/dist/tools/debug-logs.js.map +1 -0
- package/dist/tools/deploy-manifest.d.ts +37 -0
- package/dist/tools/deploy-manifest.d.ts.map +1 -0
- package/dist/tools/deploy-manifest.js +71 -0
- package/dist/tools/deploy-manifest.js.map +1 -0
- package/dist/tools/design-studio-tools.d.ts +83 -0
- package/dist/tools/design-studio-tools.d.ts.map +1 -0
- package/dist/tools/design-studio-tools.js +761 -0
- package/dist/tools/design-studio-tools.js.map +1 -0
- package/dist/tools/desktop-click-by-name.d.ts +12 -0
- package/dist/tools/desktop-click-by-name.d.ts.map +1 -0
- package/dist/tools/desktop-click-by-name.js +64 -0
- package/dist/tools/desktop-click-by-name.js.map +1 -0
- package/dist/tools/desktop-focus-window.d.ts +12 -0
- package/dist/tools/desktop-focus-window.d.ts.map +1 -0
- package/dist/tools/desktop-focus-window.js +59 -0
- package/dist/tools/desktop-focus-window.js.map +1 -0
- package/dist/tools/desktop-key-press.d.ts +12 -0
- package/dist/tools/desktop-key-press.d.ts.map +1 -0
- package/dist/tools/desktop-key-press.js +73 -0
- package/dist/tools/desktop-key-press.js.map +1 -0
- package/dist/tools/desktop-launch-app.d.ts +12 -0
- package/dist/tools/desktop-launch-app.d.ts.map +1 -0
- package/dist/tools/desktop-launch-app.js +58 -0
- package/dist/tools/desktop-launch-app.js.map +1 -0
- package/dist/tools/desktop-list-elements.d.ts +11 -0
- package/dist/tools/desktop-list-elements.d.ts.map +1 -0
- package/dist/tools/desktop-list-elements.js +65 -0
- package/dist/tools/desktop-list-elements.js.map +1 -0
- package/dist/tools/desktop-plan-approve.d.ts +30 -0
- package/dist/tools/desktop-plan-approve.d.ts.map +1 -0
- package/dist/tools/desktop-plan-approve.js +135 -0
- package/dist/tools/desktop-plan-approve.js.map +1 -0
- package/dist/tools/desktop-providers.d.ts +144 -0
- package/dist/tools/desktop-providers.d.ts.map +1 -0
- package/dist/tools/desktop-providers.js +12 -0
- package/dist/tools/desktop-providers.js.map +1 -0
- package/dist/tools/desktop-safety-gate.d.ts +84 -0
- package/dist/tools/desktop-safety-gate.d.ts.map +1 -0
- package/dist/tools/desktop-safety-gate.js +171 -0
- package/dist/tools/desktop-safety-gate.js.map +1 -0
- package/dist/tools/desktop-tools.d.ts +22 -0
- package/dist/tools/desktop-tools.d.ts.map +1 -0
- package/dist/tools/desktop-tools.js +71 -0
- package/dist/tools/desktop-tools.js.map +1 -0
- package/dist/tools/desktop-type.d.ts +12 -0
- package/dist/tools/desktop-type.d.ts.map +1 -0
- package/dist/tools/desktop-type.js +63 -0
- package/dist/tools/desktop-type.js.map +1 -0
- package/dist/tools/detect-language.d.ts +11 -0
- package/dist/tools/detect-language.d.ts.map +1 -0
- package/dist/tools/detect-language.js +235 -0
- package/dist/tools/detect-language.js.map +1 -0
- package/dist/tools/discover-news.d.ts +11 -0
- package/dist/tools/discover-news.d.ts.map +1 -0
- package/dist/tools/discover-news.js +261 -0
- package/dist/tools/discover-news.js.map +1 -0
- package/dist/tools/doc-generate.d.ts +17 -0
- package/dist/tools/doc-generate.d.ts.map +1 -0
- package/dist/tools/doc-generate.js +222 -0
- package/dist/tools/doc-generate.js.map +1 -0
- package/dist/tools/docs-lookup.d.ts +38 -0
- package/dist/tools/docs-lookup.d.ts.map +1 -0
- package/dist/tools/docs-lookup.js +174 -0
- package/dist/tools/docs-lookup.js.map +1 -0
- package/dist/tools/document-author.d.ts +40 -0
- package/dist/tools/document-author.d.ts.map +1 -0
- package/dist/tools/document-author.js +465 -0
- package/dist/tools/document-author.js.map +1 -0
- package/dist/tools/document-manage.d.ts +43 -0
- package/dist/tools/document-manage.d.ts.map +1 -0
- package/dist/tools/document-manage.js +665 -0
- package/dist/tools/document-manage.js.map +1 -0
- package/dist/tools/document-styling.d.ts +132 -0
- package/dist/tools/document-styling.d.ts.map +1 -0
- package/dist/tools/document-styling.js +360 -0
- package/dist/tools/document-styling.js.map +1 -0
- package/dist/tools/document-templates.d.ts +32 -0
- package/dist/tools/document-templates.d.ts.map +1 -0
- package/dist/tools/document-templates.js +95 -0
- package/dist/tools/document-templates.js.map +1 -0
- package/dist/tools/email-draft.d.ts +20 -0
- package/dist/tools/email-draft.d.ts.map +1 -0
- package/dist/tools/email-draft.js +191 -0
- package/dist/tools/email-draft.js.map +1 -0
- package/dist/tools/env-write.d.ts +32 -0
- package/dist/tools/env-write.d.ts.map +1 -0
- package/dist/tools/env-write.js +145 -0
- package/dist/tools/env-write.js.map +1 -0
- package/dist/tools/error-guidance.d.ts +38 -0
- package/dist/tools/error-guidance.d.ts.map +1 -0
- package/dist/tools/error-guidance.js +261 -0
- package/dist/tools/error-guidance.js.map +1 -0
- package/dist/tools/exercise-repair.d.ts +89 -0
- package/dist/tools/exercise-repair.d.ts.map +1 -0
- package/dist/tools/exercise-repair.js +350 -0
- package/dist/tools/exercise-repair.js.map +1 -0
- package/dist/tools/fact-check.d.ts +24 -0
- package/dist/tools/fact-check.d.ts.map +1 -0
- package/dist/tools/fact-check.js +78 -0
- package/dist/tools/fact-check.js.map +1 -0
- package/dist/tools/file-edit.d.ts +11 -0
- package/dist/tools/file-edit.d.ts.map +1 -0
- package/dist/tools/file-edit.js +166 -0
- package/dist/tools/file-edit.js.map +1 -0
- package/dist/tools/file-read.d.ts +12 -0
- package/dist/tools/file-read.d.ts.map +1 -0
- package/dist/tools/file-read.js +98 -0
- package/dist/tools/file-read.js.map +1 -0
- package/dist/tools/file-write.d.ts +13 -0
- package/dist/tools/file-write.d.ts.map +1 -0
- package/dist/tools/file-write.js +163 -0
- package/dist/tools/file-write.js.map +1 -0
- package/dist/tools/find-symbol.d.ts +13 -0
- package/dist/tools/find-symbol.d.ts.map +1 -0
- package/dist/tools/find-symbol.js +144 -0
- package/dist/tools/find-symbol.js.map +1 -0
- package/dist/tools/generate-image.d.ts +19 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +438 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/generate-video.d.ts +21 -0
- package/dist/tools/generate-video.d.ts.map +1 -0
- package/dist/tools/generate-video.js +197 -0
- package/dist/tools/generate-video.js.map +1 -0
- package/dist/tools/generate-voice.d.ts +13 -0
- package/dist/tools/generate-voice.d.ts.map +1 -0
- package/dist/tools/generate-voice.js +156 -0
- package/dist/tools/generate-voice.js.map +1 -0
- package/dist/tools/generation-manager.d.ts +75 -0
- package/dist/tools/generation-manager.d.ts.map +1 -0
- package/dist/tools/generation-manager.js +150 -0
- package/dist/tools/generation-manager.js.map +1 -0
- package/dist/tools/get-datetime.d.ts +11 -0
- package/dist/tools/get-datetime.d.ts.map +1 -0
- package/dist/tools/get-datetime.js +59 -0
- package/dist/tools/get-datetime.js.map +1 -0
- package/dist/tools/git-commit.d.ts +13 -0
- package/dist/tools/git-commit.d.ts.map +1 -0
- package/dist/tools/git-commit.js +136 -0
- package/dist/tools/git-commit.js.map +1 -0
- package/dist/tools/git-create-pr.d.ts +13 -0
- package/dist/tools/git-create-pr.d.ts.map +1 -0
- package/dist/tools/git-create-pr.js +134 -0
- package/dist/tools/git-create-pr.js.map +1 -0
- package/dist/tools/git-diff.d.ts +12 -0
- package/dist/tools/git-diff.d.ts.map +1 -0
- package/dist/tools/git-diff.js +134 -0
- package/dist/tools/git-diff.js.map +1 -0
- package/dist/tools/git.d.ts +11 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +89 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/glob.d.ts +11 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +64 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +11 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +131 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/health-catalogue-search.d.ts +11 -0
- package/dist/tools/health-catalogue-search.d.ts.map +1 -0
- package/dist/tools/health-catalogue-search.js +179 -0
- package/dist/tools/health-catalogue-search.js.map +1 -0
- package/dist/tools/health-plan-create.d.ts +24 -0
- package/dist/tools/health-plan-create.d.ts.map +1 -0
- package/dist/tools/health-plan-create.js +325 -0
- package/dist/tools/health-plan-create.js.map +1 -0
- package/dist/tools/health-plan-delete.d.ts +11 -0
- package/dist/tools/health-plan-delete.d.ts.map +1 -0
- package/dist/tools/health-plan-delete.js +97 -0
- package/dist/tools/health-plan-delete.js.map +1 -0
- package/dist/tools/health-plan-list.d.ts +11 -0
- package/dist/tools/health-plan-list.d.ts.map +1 -0
- package/dist/tools/health-plan-list.js +123 -0
- package/dist/tools/health-plan-list.js.map +1 -0
- package/dist/tools/health-plan-update-day.d.ts +18 -0
- package/dist/tools/health-plan-update-day.d.ts.map +1 -0
- package/dist/tools/health-plan-update-day.js +134 -0
- package/dist/tools/health-plan-update-day.js.map +1 -0
- package/dist/tools/health-plan-update.d.ts +11 -0
- package/dist/tools/health-plan-update.d.ts.map +1 -0
- package/dist/tools/health-plan-update.js +103 -0
- package/dist/tools/health-plan-update.js.map +1 -0
- package/dist/tools/health-profile-ask.d.ts +21 -0
- package/dist/tools/health-profile-ask.d.ts.map +1 -0
- package/dist/tools/health-profile-ask.js +50 -0
- package/dist/tools/health-profile-ask.js.map +1 -0
- package/dist/tools/http-request.d.ts +12 -0
- package/dist/tools/http-request.d.ts.map +1 -0
- package/dist/tools/http-request.js +329 -0
- package/dist/tools/http-request.js.map +1 -0
- package/dist/tools/journal.d.ts +17 -0
- package/dist/tools/journal.d.ts.map +1 -0
- package/dist/tools/journal.js +159 -0
- package/dist/tools/journal.js.map +1 -0
- package/dist/tools/learning.d.ts +154 -0
- package/dist/tools/learning.d.ts.map +1 -0
- package/dist/tools/learning.js +1344 -0
- package/dist/tools/learning.js.map +1 -0
- package/dist/tools/list-directory.d.ts +11 -0
- package/dist/tools/list-directory.d.ts.map +1 -0
- package/dist/tools/list-directory.js +95 -0
- package/dist/tools/list-directory.js.map +1 -0
- package/dist/tools/memory-delete.d.ts +11 -0
- package/dist/tools/memory-delete.d.ts.map +1 -0
- package/dist/tools/memory-delete.js +54 -0
- package/dist/tools/memory-delete.js.map +1 -0
- package/dist/tools/memory-recall.d.ts +11 -0
- package/dist/tools/memory-recall.d.ts.map +1 -0
- package/dist/tools/memory-recall.js +101 -0
- package/dist/tools/memory-recall.js.map +1 -0
- package/dist/tools/memory-save.d.ts +11 -0
- package/dist/tools/memory-save.d.ts.map +1 -0
- package/dist/tools/memory-save.js +110 -0
- package/dist/tools/memory-save.js.map +1 -0
- package/dist/tools/memory-update.d.ts +11 -0
- package/dist/tools/memory-update.d.ts.map +1 -0
- package/dist/tools/memory-update.js +88 -0
- package/dist/tools/memory-update.js.map +1 -0
- package/dist/tools/news.d.ts +11 -0
- package/dist/tools/news.d.ts.map +1 -0
- package/dist/tools/news.js +137 -0
- package/dist/tools/news.js.map +1 -0
- package/dist/tools/open-design-studio.d.ts +20 -0
- package/dist/tools/open-design-studio.d.ts.map +1 -0
- package/dist/tools/open-design-studio.js +45 -0
- package/dist/tools/open-design-studio.js.map +1 -0
- package/dist/tools/open-health-room.d.ts +19 -0
- package/dist/tools/open-health-room.d.ts.map +1 -0
- package/dist/tools/open-health-room.js +44 -0
- package/dist/tools/open-health-room.js.map +1 -0
- package/dist/tools/open-learning-room.d.ts +20 -0
- package/dist/tools/open-learning-room.d.ts.map +1 -0
- package/dist/tools/open-learning-room.js +44 -0
- package/dist/tools/open-learning-room.js.map +1 -0
- package/dist/tools/paper-fetch.d.ts +11 -0
- package/dist/tools/paper-fetch.d.ts.map +1 -0
- package/dist/tools/paper-fetch.js +236 -0
- package/dist/tools/paper-fetch.js.map +1 -0
- package/dist/tools/post-performance.d.ts +17 -0
- package/dist/tools/post-performance.d.ts.map +1 -0
- package/dist/tools/post-performance.js +58 -0
- package/dist/tools/post-performance.js.map +1 -0
- package/dist/tools/present-plan.d.ts +34 -0
- package/dist/tools/present-plan.d.ts.map +1 -0
- package/dist/tools/present-plan.js +117 -0
- package/dist/tools/present-plan.js.map +1 -0
- package/dist/tools/project-index.d.ts +11 -0
- package/dist/tools/project-index.d.ts.map +1 -0
- package/dist/tools/project-index.js +88 -0
- package/dist/tools/project-index.js.map +1 -0
- package/dist/tools/propose-hooks.d.ts +17 -0
- package/dist/tools/propose-hooks.d.ts.map +1 -0
- package/dist/tools/propose-hooks.js +71 -0
- package/dist/tools/propose-hooks.js.map +1 -0
- package/dist/tools/propose-tool.d.ts +11 -0
- package/dist/tools/propose-tool.d.ts.map +1 -0
- package/dist/tools/propose-tool.js +155 -0
- package/dist/tools/propose-tool.js.map +1 -0
- package/dist/tools/recipe-repair.d.ts +116 -0
- package/dist/tools/recipe-repair.d.ts.map +1 -0
- package/dist/tools/recipe-repair.js +404 -0
- package/dist/tools/recipe-repair.js.map +1 -0
- package/dist/tools/record-machine-rule.d.ts +24 -0
- package/dist/tools/record-machine-rule.d.ts.map +1 -0
- package/dist/tools/record-machine-rule.js +60 -0
- package/dist/tools/record-machine-rule.js.map +1 -0
- package/dist/tools/release-notes.d.ts +11 -0
- package/dist/tools/release-notes.d.ts.map +1 -0
- package/dist/tools/release-notes.js +59 -0
- package/dist/tools/release-notes.js.map +1 -0
- package/dist/tools/remove-background.d.ts +15 -0
- package/dist/tools/remove-background.d.ts.map +1 -0
- package/dist/tools/remove-background.js +117 -0
- package/dist/tools/remove-background.js.map +1 -0
- package/dist/tools/report-generate.d.ts +30 -0
- package/dist/tools/report-generate.d.ts.map +1 -0
- package/dist/tools/report-generate.js +325 -0
- package/dist/tools/report-generate.js.map +1 -0
- package/dist/tools/research-post.d.ts +20 -0
- package/dist/tools/research-post.d.ts.map +1 -0
- package/dist/tools/research-post.js +87 -0
- package/dist/tools/research-post.js.map +1 -0
- package/dist/tools/research-story.d.ts +29 -0
- package/dist/tools/research-story.d.ts.map +1 -0
- package/dist/tools/research-story.js +78 -0
- package/dist/tools/research-story.js.map +1 -0
- package/dist/tools/rollback.d.ts +11 -0
- package/dist/tools/rollback.d.ts.map +1 -0
- package/dist/tools/rollback.js +81 -0
- package/dist/tools/rollback.js.map +1 -0
- package/dist/tools/scan-industry.d.ts +19 -0
- package/dist/tools/scan-industry.d.ts.map +1 -0
- package/dist/tools/scan-industry.js +82 -0
- package/dist/tools/scan-industry.js.map +1 -0
- package/dist/tools/screenshot.d.ts +11 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/screenshot.js +82 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/secret-request.d.ts +24 -0
- package/dist/tools/secret-request.d.ts.map +1 -0
- package/dist/tools/secret-request.js +75 -0
- package/dist/tools/secret-request.js.map +1 -0
- package/dist/tools/security.d.ts +26 -0
- package/dist/tools/security.d.ts.map +1 -0
- package/dist/tools/security.js +78 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/tools/self-inspect.d.ts +34 -0
- package/dist/tools/self-inspect.d.ts.map +1 -0
- package/dist/tools/self-inspect.js +427 -0
- package/dist/tools/self-inspect.js.map +1 -0
- package/dist/tools/suggest-beats.d.ts +17 -0
- package/dist/tools/suggest-beats.d.ts.map +1 -0
- package/dist/tools/suggest-beats.js +71 -0
- package/dist/tools/suggest-beats.js.map +1 -0
- package/dist/tools/suggest-stories.d.ts +26 -0
- package/dist/tools/suggest-stories.d.ts.map +1 -0
- package/dist/tools/suggest-stories.js +102 -0
- package/dist/tools/suggest-stories.js.map +1 -0
- package/dist/tools/support-request.d.ts +11 -0
- package/dist/tools/support-request.d.ts.map +1 -0
- package/dist/tools/support-request.js +110 -0
- package/dist/tools/support-request.js.map +1 -0
- package/dist/tools/switch-mode.d.ts +21 -0
- package/dist/tools/switch-mode.d.ts.map +1 -0
- package/dist/tools/switch-mode.js +57 -0
- package/dist/tools/switch-mode.js.map +1 -0
- package/dist/tools/task-manage.d.ts +16 -0
- package/dist/tools/task-manage.d.ts.map +1 -0
- package/dist/tools/task-manage.js +256 -0
- package/dist/tools/task-manage.js.map +1 -0
- package/dist/tools/task-suggest.d.ts +27 -0
- package/dist/tools/task-suggest.d.ts.map +1 -0
- package/dist/tools/task-suggest.js +70 -0
- package/dist/tools/task-suggest.js.map +1 -0
- package/dist/tools/test-generate.d.ts +20 -0
- package/dist/tools/test-generate.d.ts.map +1 -0
- package/dist/tools/test-generate.js +259 -0
- package/dist/tools/test-generate.js.map +1 -0
- package/dist/tools/test-run.d.ts +13 -0
- package/dist/tools/test-run.d.ts.map +1 -0
- package/dist/tools/test-run.js +177 -0
- package/dist/tools/test-run.js.map +1 -0
- package/dist/tools/todo-write.d.ts +11 -0
- package/dist/tools/todo-write.d.ts.map +1 -0
- package/dist/tools/todo-write.js +70 -0
- package/dist/tools/todo-write.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +84 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +728 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/types.d.ts +128 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/verification-trust.d.ts +39 -0
- package/dist/tools/verification-trust.d.ts.map +1 -0
- package/dist/tools/verification-trust.js +135 -0
- package/dist/tools/verification-trust.js.map +1 -0
- package/dist/tools/verify-change.d.ts +11 -0
- package/dist/tools/verify-change.d.ts.map +1 -0
- package/dist/tools/verify-change.js +775 -0
- package/dist/tools/verify-change.js.map +1 -0
- package/dist/tools/weather.d.ts +11 -0
- package/dist/tools/weather.d.ts.map +1 -0
- package/dist/tools/weather.js +96 -0
- package/dist/tools/weather.js.map +1 -0
- package/dist/tools/web-search.d.ts +12 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +137 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write-article.d.ts +33 -0
- package/dist/tools/write-article.d.ts.map +1 -0
- package/dist/tools/write-article.js +206 -0
- package/dist/tools/write-article.js.map +1 -0
- package/dist/tools/write-exercise.d.ts +31 -0
- package/dist/tools/write-exercise.d.ts.map +1 -0
- package/dist/tools/write-exercise.js +278 -0
- package/dist/tools/write-exercise.js.map +1 -0
- package/dist/tools/write-post-image.d.ts +31 -0
- package/dist/tools/write-post-image.d.ts.map +1 -0
- package/dist/tools/write-post-image.js +102 -0
- package/dist/tools/write-post-image.js.map +1 -0
- package/dist/tools/write-post.d.ts +20 -0
- package/dist/tools/write-post.d.ts.map +1 -0
- package/dist/tools/write-post.js +113 -0
- package/dist/tools/write-post.js.map +1 -0
- package/dist/tools/write-recipe.d.ts +29 -0
- package/dist/tools/write-recipe.d.ts.map +1 -0
- package/dist/tools/write-recipe.js +262 -0
- package/dist/tools/write-recipe.js.map +1 -0
- package/dist/tools/write-video-post.d.ts +25 -0
- package/dist/tools/write-video-post.d.ts.map +1 -0
- package/dist/tools/write-video-post.js +238 -0
- package/dist/tools/write-video-post.js.map +1 -0
- package/dist/tools/write-voiceover.d.ts +29 -0
- package/dist/tools/write-voiceover.d.ts.map +1 -0
- package/dist/tools/write-voiceover.js +98 -0
- package/dist/tools/write-voiceover.js.map +1 -0
- package/dist/workflows/index.d.ts +4 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +2 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/types.d.ts +112 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +10 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workflows/workflow-manager.d.ts +54 -0
- package/dist/workflows/workflow-manager.d.ts.map +1 -0
- package/dist/workflows/workflow-manager.js +277 -0
- package/dist/workflows/workflow-manager.js.map +1 -0
- package/package.json +223 -0
|
@@ -0,0 +1,1633 @@
|
|
|
1
|
+
import { readFile, writeFile, rename, mkdir, unlink } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join, basename } from 'node:path';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { TfIdfIndex, cosineDense } from './tfidf.js';
|
|
6
|
+
import { EmbeddingStore } from './embedding-store.js';
|
|
7
|
+
import { MEMORY_CATEGORIES, createEmptyStore, inferLayer } from './types.js';
|
|
8
|
+
import { MemoryGraph } from './graph-engine.js';
|
|
9
|
+
import { needsMigration, migrateV2ToV3 } from './migration-v3.js';
|
|
10
|
+
import { ProceduralObserver } from './procedural.js';
|
|
11
|
+
import { synthesiseProjectBrain, loadProjectBrain, saveProjectBrain } from './project-brain.js';
|
|
12
|
+
import { AmbientCaptureManager } from './ambient-capture.js';
|
|
13
|
+
import { logger } from '../core/logger.js';
|
|
14
|
+
import { avaEvents } from '../dataset/emitter.js';
|
|
15
|
+
const MEMORY_FILENAME_V1 = 'memory.md';
|
|
16
|
+
const MEMORY_FILENAME_V2 = 'memory.json';
|
|
17
|
+
const PROJECTS_REGISTRY = 'projects.json';
|
|
18
|
+
/** Minimum cosine for a node to count as a semantic recall hit. Related text
|
|
19
|
+
* sits well above this; unrelated text falls below. */
|
|
20
|
+
const SEMANTIC_RECALL_THRESHOLD = 0.5;
|
|
21
|
+
/** Backfill: flush the store + yield to the event loop every N embeds. */
|
|
22
|
+
const EMBED_BACKFILL_BATCH = 50;
|
|
23
|
+
/** Backfill: embed this many nodes concurrently (Ollama handles parallel
|
|
24
|
+
* requests; keeps a 29k backfill to minutes, not tens of minutes). */
|
|
25
|
+
const EMBED_BACKFILL_CONCURRENCY = 6;
|
|
26
|
+
import { CONFLICT_THRESHOLD as CONFLICT_TFIDF_THRESHOLD, RECALL_THRESHOLD as RECALL_TFIDF_THRESHOLD, CONSOLIDATION_THRESHOLD, STALE_DAYS as STALE_THRESHOLD_DAYS, W_TFIDF, W_RECENCY, W_FREQUENCY, } from './config.js';
|
|
27
|
+
export class MemoryManager {
|
|
28
|
+
globalDir;
|
|
29
|
+
projectDir;
|
|
30
|
+
sync;
|
|
31
|
+
// In-memory caches — loaded lazily, written through on save
|
|
32
|
+
globalStore = null;
|
|
33
|
+
projectStore = null;
|
|
34
|
+
// TF-IDF indexes — one per scope, rebuilt on load
|
|
35
|
+
globalIndex = new TfIdfIndex();
|
|
36
|
+
projectIndex = new TfIdfIndex();
|
|
37
|
+
/** When true, skip all platform sync — memories stay on disk only. Default: true (local-first). */
|
|
38
|
+
localOnly = true;
|
|
39
|
+
// ── v3 Graph layer ────────────────────────────────────────────────────────
|
|
40
|
+
// Runs alongside the v2 flat stores during the transition. New operations
|
|
41
|
+
// (recall, project brain, procedural learning, ambient capture) use the
|
|
42
|
+
// graph; existing operations (saveEntry, getEntries) write to both so
|
|
43
|
+
// backwards compat is preserved for dashboard and sync callers.
|
|
44
|
+
graphGlobal = null;
|
|
45
|
+
graphProject = null;
|
|
46
|
+
graphInitialized = false;
|
|
47
|
+
// Resolves when initGraph() completes — saveEntry awaits this so it never
|
|
48
|
+
// writes to a not-yet-loaded graph.
|
|
49
|
+
initGraphPromise = Promise.resolve();
|
|
50
|
+
proceduralGlobal = null;
|
|
51
|
+
proceduralProject = null;
|
|
52
|
+
ambientGlobal = null;
|
|
53
|
+
ambientProject = null;
|
|
54
|
+
projectBrainCache = null;
|
|
55
|
+
// ── Semantic recall (optional, local Ollama) ──────────────────────────────
|
|
56
|
+
// When an embedding service is injected, memories are embedded on write and
|
|
57
|
+
// recall adds a graph-wide semantic phase. All null/absent → pure TF-IDF, no
|
|
58
|
+
// external dependency. Vectors live in a SEPARATE embeddings.json per scope.
|
|
59
|
+
embeddingService = null;
|
|
60
|
+
embeddingStoreGlobal = null;
|
|
61
|
+
embeddingStoreProject = null;
|
|
62
|
+
// ── Sync coalescing — debounce + in-flight guard ──────────────────────────
|
|
63
|
+
// syncEntries() used to fire every store mutation, with each call doing a
|
|
64
|
+
// full pull + per-entry POST/PATCH against the platform. With the Memory
|
|
65
|
+
// Agent extracting 5+ memories at once, that meant dozens of parallel
|
|
66
|
+
// racing syncs from a single turn — flooding the client's connection pool
|
|
67
|
+
// and starving the LLM stream until the 30s stall watchdog tripped.
|
|
68
|
+
//
|
|
69
|
+
// The fix: debounce sync calls per scope (collect rapid mutations into one
|
|
70
|
+
// sync), and guard against concurrent runs (in-flight + dirty flag pattern).
|
|
71
|
+
SYNC_DEBOUNCE_MS = 2000;
|
|
72
|
+
syncTimers = new Map();
|
|
73
|
+
syncInFlight = new Set();
|
|
74
|
+
syncDirty = new Set();
|
|
75
|
+
constructor(opts) {
|
|
76
|
+
this.globalDir = opts.globalDir;
|
|
77
|
+
this.projectDir = opts.projectRoot ? join(opts.projectRoot, '.ava') : null;
|
|
78
|
+
this.sync = opts.sync;
|
|
79
|
+
this.localOnly = opts.localOnly ?? true;
|
|
80
|
+
this.embeddingService = opts.embeddingService ?? null;
|
|
81
|
+
// Auto-register this project in the global registry (fire-and-forget)
|
|
82
|
+
if (opts.projectRoot) {
|
|
83
|
+
this.registerProject(opts.projectRoot).catch(() => { });
|
|
84
|
+
}
|
|
85
|
+
// Initialize v3 graph layer (async, non-blocking). Keep the promise so
|
|
86
|
+
// saveEntry/recall can await readiness; warn (not debug) on failure so a
|
|
87
|
+
// broken graph init is visible rather than silently dropping memories.
|
|
88
|
+
this.initGraphPromise = this.initGraph().catch(err => logger.warn(`[memory] Graph init failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
89
|
+
}
|
|
90
|
+
/** Resolves once the v3 graph layer has finished initializing. */
|
|
91
|
+
async ensureGraphReady() {
|
|
92
|
+
await this.initGraphPromise;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Initialize the v3 graph layer. Creates MemoryGraph instances for
|
|
96
|
+
* global + project scopes, runs auto-migration from v2 if needed,
|
|
97
|
+
* and sets up procedural observers + ambient capture managers.
|
|
98
|
+
*/
|
|
99
|
+
async initGraph() {
|
|
100
|
+
if (this.graphInitialized)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
// Global graph
|
|
104
|
+
const globalMemDir = join(this.globalDir, 'memory');
|
|
105
|
+
this.graphGlobal = new MemoryGraph(globalMemDir);
|
|
106
|
+
if (needsMigration(this.globalDir)) {
|
|
107
|
+
// v2 memory.json exists but no graph.json — migrate
|
|
108
|
+
await this.graphGlobal.load();
|
|
109
|
+
await migrateV2ToV3(this.globalDir, this.graphGlobal);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
await this.graphGlobal.load();
|
|
113
|
+
}
|
|
114
|
+
this.proceduralGlobal = new ProceduralObserver(globalMemDir);
|
|
115
|
+
await this.proceduralGlobal.load();
|
|
116
|
+
this.ambientGlobal = new AmbientCaptureManager(this.graphGlobal);
|
|
117
|
+
if (this.embeddingService) {
|
|
118
|
+
this.embeddingStoreGlobal = new EmbeddingStore(globalMemDir, this.embeddingService.embedModel);
|
|
119
|
+
await this.embeddingStoreGlobal.load();
|
|
120
|
+
}
|
|
121
|
+
// Project graph
|
|
122
|
+
if (this.projectDir) {
|
|
123
|
+
const projectMemDir = join(this.projectDir, 'memory');
|
|
124
|
+
this.graphProject = new MemoryGraph(projectMemDir);
|
|
125
|
+
if (needsMigration(this.projectDir)) {
|
|
126
|
+
await this.graphProject.load();
|
|
127
|
+
await migrateV2ToV3(this.projectDir, this.graphProject);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
await this.graphProject.load();
|
|
131
|
+
}
|
|
132
|
+
this.proceduralProject = new ProceduralObserver(projectMemDir);
|
|
133
|
+
await this.proceduralProject.load();
|
|
134
|
+
this.ambientProject = new AmbientCaptureManager(this.graphProject);
|
|
135
|
+
if (this.embeddingService) {
|
|
136
|
+
this.embeddingStoreProject = new EmbeddingStore(projectMemDir, this.embeddingService.embedModel);
|
|
137
|
+
await this.embeddingStoreProject.load();
|
|
138
|
+
}
|
|
139
|
+
// Load or generate project brain
|
|
140
|
+
const brainDir = join(this.projectDir, 'memory');
|
|
141
|
+
const graphHash = this.graphProject.getGraphHash();
|
|
142
|
+
this.projectBrainCache = await loadProjectBrain(brainDir, graphHash);
|
|
143
|
+
if (!this.projectBrainCache && this.graphProject.nodeCount > 0) {
|
|
144
|
+
const procedures = this.proceduralProject?.getAllPatterns() ?? [];
|
|
145
|
+
this.projectBrainCache = synthesiseProjectBrain(this.graphProject, this.projectDir, procedures);
|
|
146
|
+
await saveProjectBrain(brainDir, this.projectBrainCache);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.graphInitialized = true;
|
|
150
|
+
logger.debug(`[memory] v3 graph initialized: global=${this.graphGlobal?.nodeCount ?? 0} nodes, project=${this.graphProject?.nodeCount ?? 0} nodes`);
|
|
151
|
+
// Background semantic backfill — embed any nodes missing a vector so
|
|
152
|
+
// recall spans the whole graph. Fire-and-forget; resumable (only fills
|
|
153
|
+
// gaps); fast-no-ops if Ollama is unreachable (breaker trips).
|
|
154
|
+
if (this.embeddingService) {
|
|
155
|
+
void this.runEmbeddingBackfill().catch(() => { });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
logger.warn(`[memory] v3 graph init failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
160
|
+
// Non-fatal — v2 stores still work as fallback
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// ── v3 Public API — Graph-specific operations ─────────────────────────────
|
|
164
|
+
/** Get the project brain brief for session-start injection. */
|
|
165
|
+
getProjectBrain() {
|
|
166
|
+
return this.projectBrainCache;
|
|
167
|
+
}
|
|
168
|
+
/** Get the graph instance for a scope (for direct graph operations). */
|
|
169
|
+
getGraph(scope) {
|
|
170
|
+
return scope === 'global' ? this.graphGlobal : this.graphProject;
|
|
171
|
+
}
|
|
172
|
+
/** Get the procedural observer for a scope. */
|
|
173
|
+
getProceduralObserver(scope) {
|
|
174
|
+
return scope === 'global' ? this.proceduralGlobal : this.proceduralProject;
|
|
175
|
+
}
|
|
176
|
+
/** Get the ambient capture manager for a scope. */
|
|
177
|
+
getAmbientCapture(scope) {
|
|
178
|
+
return scope === 'global' ? this.ambientGlobal : this.ambientProject;
|
|
179
|
+
}
|
|
180
|
+
// ── Semantic embeddings (optional, local Ollama) ──────────────────────────
|
|
181
|
+
embeddingStore(scope) {
|
|
182
|
+
return scope === 'global' ? this.embeddingStoreGlobal : this.embeddingStoreProject;
|
|
183
|
+
}
|
|
184
|
+
/** Embed a node's content and stash the vector. Background; never throws. */
|
|
185
|
+
async embedNode(scope, nodeId, content) {
|
|
186
|
+
const store = this.embeddingStore(scope);
|
|
187
|
+
if (!store || !this.embeddingService)
|
|
188
|
+
return;
|
|
189
|
+
try {
|
|
190
|
+
const vec = await this.embeddingService.embed(content);
|
|
191
|
+
if (vec)
|
|
192
|
+
store.set(nodeId, vec);
|
|
193
|
+
}
|
|
194
|
+
catch { /* never throw on a background embed */ }
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Backfill embeddings for active graph nodes missing a vector, so recall can
|
|
198
|
+
* span the whole memory (not just newly-saved entries). Resumable (only
|
|
199
|
+
* fills gaps), batched (flush + yield every N), and bails fast if the
|
|
200
|
+
* endpoint is down (breaker trips → embed returns null). Fire-and-forget on
|
|
201
|
+
* init; also callable from maintenance.
|
|
202
|
+
*/
|
|
203
|
+
async runEmbeddingBackfill(signal) {
|
|
204
|
+
if (!this.embeddingService)
|
|
205
|
+
return;
|
|
206
|
+
await this.ensureGraphReady();
|
|
207
|
+
const jobs = [];
|
|
208
|
+
if (this.graphGlobal && this.embeddingStoreGlobal)
|
|
209
|
+
jobs.push({ graph: this.graphGlobal, store: this.embeddingStoreGlobal, scope: 'global' });
|
|
210
|
+
if (this.graphProject && this.embeddingStoreProject)
|
|
211
|
+
jobs.push({ graph: this.graphProject, store: this.embeddingStoreProject, scope: 'project' });
|
|
212
|
+
for (const { graph, store, scope } of jobs) {
|
|
213
|
+
const nodes = graph.getActiveNodes();
|
|
214
|
+
const missing = nodes.filter(n => !store.has(n.id) && n.content?.trim());
|
|
215
|
+
if (missing.length === 0)
|
|
216
|
+
continue;
|
|
217
|
+
logger.info(`[embeddings] backfill ${scope}: ${missing.length}/${nodes.length} nodes need embedding`);
|
|
218
|
+
let done = 0, embedded = 0, sinceFlush = 0;
|
|
219
|
+
for (let i = 0; i < missing.length; i += EMBED_BACKFILL_CONCURRENCY) {
|
|
220
|
+
if (signal?.aborted) {
|
|
221
|
+
await store.flush();
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
// Endpoint just failed → stop and resume next session rather than
|
|
225
|
+
// spinning through thousands of fast-fails.
|
|
226
|
+
if (this.embeddingService.tripped) {
|
|
227
|
+
logger.debug(`[embeddings] backfill ${scope}: endpoint unavailable, pausing after ${embedded}`);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
const batch = missing.slice(i, i + EMBED_BACKFILL_CONCURRENCY);
|
|
231
|
+
const vecs = await Promise.all(batch.map(n => this.embeddingService.embed(n.content)));
|
|
232
|
+
for (let j = 0; j < batch.length; j++) {
|
|
233
|
+
const vec = vecs[j];
|
|
234
|
+
if (vec) {
|
|
235
|
+
store.set(batch[j].id, vec);
|
|
236
|
+
embedded++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
done += batch.length;
|
|
240
|
+
sinceFlush += batch.length;
|
|
241
|
+
if (sinceFlush >= EMBED_BACKFILL_BATCH) {
|
|
242
|
+
sinceFlush = 0;
|
|
243
|
+
await store.flush();
|
|
244
|
+
await new Promise(r => setTimeout(r, 0)); // yield
|
|
245
|
+
logger.debug(`[embeddings] backfill ${scope}: ${done}/${missing.length}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
await store.flush();
|
|
249
|
+
logger.info(`[embeddings] backfill ${scope} done: ${embedded} embedded`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/** Run confidence decay + forgetting pass on both graphs. Called on session end. */
|
|
253
|
+
async runMaintenance() {
|
|
254
|
+
if (this.graphGlobal) {
|
|
255
|
+
this.graphGlobal.applyDecay();
|
|
256
|
+
this.graphGlobal.runForgettingPass();
|
|
257
|
+
await this.graphGlobal.save();
|
|
258
|
+
}
|
|
259
|
+
if (this.graphProject) {
|
|
260
|
+
this.graphProject.applyDecay();
|
|
261
|
+
this.graphProject.runForgettingPass();
|
|
262
|
+
await this.graphProject.save();
|
|
263
|
+
// Regenerate project brain after maintenance
|
|
264
|
+
if (this.projectDir && this.graphProject.nodeCount > 0) {
|
|
265
|
+
const procedures = this.proceduralProject?.getAllPatterns() ?? [];
|
|
266
|
+
this.projectBrainCache = synthesiseProjectBrain(this.graphProject, this.projectDir, procedures);
|
|
267
|
+
await saveProjectBrain(join(this.projectDir, 'memory'), this.projectBrainCache);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (this.proceduralGlobal)
|
|
271
|
+
await this.proceduralGlobal.save();
|
|
272
|
+
if (this.proceduralProject)
|
|
273
|
+
await this.proceduralProject.save();
|
|
274
|
+
}
|
|
275
|
+
/** Save all graph state to disk (called at end of session). */
|
|
276
|
+
async saveGraphs() {
|
|
277
|
+
if (this.graphGlobal)
|
|
278
|
+
await this.graphGlobal.save();
|
|
279
|
+
if (this.graphProject)
|
|
280
|
+
await this.graphProject.save();
|
|
281
|
+
if (this.proceduralGlobal)
|
|
282
|
+
await this.proceduralGlobal.save();
|
|
283
|
+
if (this.proceduralProject)
|
|
284
|
+
await this.proceduralProject.save();
|
|
285
|
+
}
|
|
286
|
+
// ── Public API — Load ──────────────────────────────────────────────────────
|
|
287
|
+
/** Load global memory store, migrating from v1 if needed. */
|
|
288
|
+
async loadGlobalStore() {
|
|
289
|
+
if (this.globalStore)
|
|
290
|
+
return this.globalStore;
|
|
291
|
+
this.globalStore = await this.loadStore(this.globalDir, 'global');
|
|
292
|
+
this.rebuildIndex(this.globalStore, this.globalIndex);
|
|
293
|
+
return this.globalStore;
|
|
294
|
+
}
|
|
295
|
+
/** Load project memory store, migrating from v1 if needed. */
|
|
296
|
+
async loadProjectStore() {
|
|
297
|
+
if (!this.projectDir)
|
|
298
|
+
return null;
|
|
299
|
+
if (this.projectStore)
|
|
300
|
+
return this.projectStore;
|
|
301
|
+
this.projectStore = await this.loadStore(this.projectDir, 'project');
|
|
302
|
+
this.rebuildIndex(this.projectStore, this.projectIndex);
|
|
303
|
+
return this.projectStore;
|
|
304
|
+
}
|
|
305
|
+
/** Load both stores and format for system prompt injection. */
|
|
306
|
+
async loadAll(context, branch) {
|
|
307
|
+
const [globalStore, projectStore, episodic] = await Promise.all([
|
|
308
|
+
this.loadGlobalStore(),
|
|
309
|
+
this.loadProjectStore(),
|
|
310
|
+
context ? this.loadRelevantMemories(context) : Promise.resolve([]),
|
|
311
|
+
]);
|
|
312
|
+
const sections = [];
|
|
313
|
+
// Filter to active (non-archived) entries, respecting branch scope
|
|
314
|
+
const globalEntries = this.filterActive(globalStore.entries, branch);
|
|
315
|
+
const projectEntries = projectStore ? this.filterActive(projectStore.entries, branch) : [];
|
|
316
|
+
if (globalEntries.length > 0) {
|
|
317
|
+
sections.push(`### Global Memory\n${this.formatEntriesForPrompt(globalEntries)}`);
|
|
318
|
+
}
|
|
319
|
+
if (projectEntries.length > 0) {
|
|
320
|
+
sections.push(`### Project Memory\n${this.formatEntriesForPrompt(projectEntries)}`);
|
|
321
|
+
}
|
|
322
|
+
if (episodic.length > 0) {
|
|
323
|
+
const items = episodic
|
|
324
|
+
.map((m) => `- **${m.key}** (${m.scope}, ${Math.round(m.similarity * 100)}% match): ${m.content}`)
|
|
325
|
+
.join('\n');
|
|
326
|
+
sections.push(`### Relevant Memories\n${items}`);
|
|
327
|
+
}
|
|
328
|
+
return sections.join('\n\n');
|
|
329
|
+
}
|
|
330
|
+
// ── Backwards compat — v1 string accessors ─────────────────────────────────
|
|
331
|
+
/** Load global memory as markdown string (v1 compat). */
|
|
332
|
+
async loadGlobalMemory() {
|
|
333
|
+
const store = await this.loadGlobalStore();
|
|
334
|
+
if (store.entries.length === 0)
|
|
335
|
+
return null;
|
|
336
|
+
return this.formatEntriesAsMarkdown(store.entries);
|
|
337
|
+
}
|
|
338
|
+
/** Load project memory as markdown string (v1 compat). */
|
|
339
|
+
async loadProjectMemory() {
|
|
340
|
+
const store = await this.loadProjectStore();
|
|
341
|
+
if (!store || store.entries.length === 0)
|
|
342
|
+
return null;
|
|
343
|
+
return this.formatEntriesAsMarkdown(store.entries);
|
|
344
|
+
}
|
|
345
|
+
/** Overwrite global memory with raw markdown (v1 compat — used by dashboard). */
|
|
346
|
+
async saveGlobalMemory(content) {
|
|
347
|
+
const store = await this.loadGlobalStore();
|
|
348
|
+
store.entries = this.markdownToEntries(content);
|
|
349
|
+
store.lastModified = new Date().toISOString();
|
|
350
|
+
this.globalStore = store;
|
|
351
|
+
this.rebuildIndex(store, this.globalIndex);
|
|
352
|
+
await this.persistStore(this.globalDir, store);
|
|
353
|
+
this.syncEntries('global', store.entries);
|
|
354
|
+
}
|
|
355
|
+
/** Overwrite project memory with raw markdown (v1 compat — used by dashboard). */
|
|
356
|
+
async saveProjectMemory(content) {
|
|
357
|
+
if (!this.projectDir)
|
|
358
|
+
throw new Error('No project root configured.');
|
|
359
|
+
await mkdir(this.projectDir, { recursive: true });
|
|
360
|
+
const store = await this.loadProjectStore() ?? createEmptyStore();
|
|
361
|
+
store.entries = this.markdownToEntries(content);
|
|
362
|
+
store.lastModified = new Date().toISOString();
|
|
363
|
+
this.projectStore = store;
|
|
364
|
+
this.rebuildIndex(store, this.projectIndex);
|
|
365
|
+
await this.persistStore(this.projectDir, store);
|
|
366
|
+
this.syncEntries('project', store.entries);
|
|
367
|
+
}
|
|
368
|
+
/** Append raw markdown entry (v1 compat). */
|
|
369
|
+
async appendGlobal(entry) {
|
|
370
|
+
await this.saveEntry({
|
|
371
|
+
scope: 'global',
|
|
372
|
+
content: entry.replace(/^####\s*\d{4}-\d{2}-\d{2}\n/, ''),
|
|
373
|
+
category: 'general',
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
/** Append raw markdown entry (v1 compat). */
|
|
377
|
+
async appendProject(entry) {
|
|
378
|
+
await this.saveEntry({
|
|
379
|
+
scope: 'project',
|
|
380
|
+
content: entry.replace(/^####\s*\d{4}-\d{2}-\d{2}\n/, ''),
|
|
381
|
+
category: 'general',
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
// ── Public API — v2 Structured Operations ──────────────────────────────────
|
|
385
|
+
/** Save a new memory entry with TF-IDF conflict detection. Returns the saved entry. */
|
|
386
|
+
async saveEntry(opts) {
|
|
387
|
+
// If saving to project scope but no project is open, fall back to global
|
|
388
|
+
// rather than silently losing the memory in a temporary in-memory store
|
|
389
|
+
const effectiveScope = (opts.scope === 'project' && !this.projectDir) ? 'global' : opts.scope;
|
|
390
|
+
const store = effectiveScope === 'global'
|
|
391
|
+
? await this.loadGlobalStore()
|
|
392
|
+
: await this.loadProjectStore() ?? createEmptyStore();
|
|
393
|
+
if (effectiveScope === 'project' && this.projectDir) {
|
|
394
|
+
await mkdir(this.projectDir, { recursive: true });
|
|
395
|
+
}
|
|
396
|
+
const index = effectiveScope === 'global' ? this.globalIndex : this.projectIndex;
|
|
397
|
+
// Determine layer
|
|
398
|
+
const category = opts.category ?? 'general';
|
|
399
|
+
const layer = opts.layer ?? inferLayer(category, opts.scope);
|
|
400
|
+
// Conflict detection — project memories use stricter threshold to avoid over-merging
|
|
401
|
+
const conflict = this.findConflict(store, index, opts.content, opts.category, layer === 'project' ? 0.6 : undefined);
|
|
402
|
+
let entry;
|
|
403
|
+
if (conflict) {
|
|
404
|
+
// Update existing entry instead of duplicating
|
|
405
|
+
conflict.content = opts.content;
|
|
406
|
+
conflict.updatedAt = new Date().toISOString();
|
|
407
|
+
conflict.category = opts.category ?? conflict.category;
|
|
408
|
+
conflict.layer = layer;
|
|
409
|
+
if (opts.tags)
|
|
410
|
+
conflict.tags = opts.tags;
|
|
411
|
+
if (opts.branch !== undefined)
|
|
412
|
+
conflict.branch = opts.branch;
|
|
413
|
+
if (opts.directoryScope !== undefined)
|
|
414
|
+
conflict.directoryScope = opts.directoryScope;
|
|
415
|
+
// Unarchive if it was archived
|
|
416
|
+
conflict.archived = false;
|
|
417
|
+
conflict.archivedAt = null;
|
|
418
|
+
entry = conflict;
|
|
419
|
+
// Update index
|
|
420
|
+
index.addDocument(entry.id, entry.content);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
// Create new entry
|
|
424
|
+
entry = {
|
|
425
|
+
id: randomUUID(),
|
|
426
|
+
category,
|
|
427
|
+
layer,
|
|
428
|
+
content: opts.content,
|
|
429
|
+
createdAt: new Date().toISOString(),
|
|
430
|
+
updatedAt: new Date().toISOString(),
|
|
431
|
+
lastRecalledAt: null,
|
|
432
|
+
recallCount: 0,
|
|
433
|
+
sourceConversationId: opts.sourceConversationId,
|
|
434
|
+
tags: opts.tags,
|
|
435
|
+
archived: false,
|
|
436
|
+
branch: opts.branch ?? null,
|
|
437
|
+
directoryScope: opts.directoryScope ?? null,
|
|
438
|
+
};
|
|
439
|
+
store.entries.push(entry);
|
|
440
|
+
// Add to index
|
|
441
|
+
index.addDocument(entry.id, entry.content);
|
|
442
|
+
}
|
|
443
|
+
// Cap at 500 entries per scope — archive oldest non-archived entries
|
|
444
|
+
const MAX_ENTRIES = 500;
|
|
445
|
+
const active = store.entries.filter(e => !e.archived);
|
|
446
|
+
if (active.length > MAX_ENTRIES) {
|
|
447
|
+
const sorted = active.sort((a, b) => new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime());
|
|
448
|
+
const toArchive = sorted.slice(0, active.length - MAX_ENTRIES);
|
|
449
|
+
for (const e of toArchive) {
|
|
450
|
+
e.archived = true;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
store.lastModified = new Date().toISOString();
|
|
454
|
+
// Update cache and persist
|
|
455
|
+
if (effectiveScope === 'global') {
|
|
456
|
+
this.globalStore = store;
|
|
457
|
+
await this.persistStore(this.globalDir, store);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
this.projectStore = store;
|
|
461
|
+
if (this.projectDir)
|
|
462
|
+
await this.persistStore(this.projectDir, store);
|
|
463
|
+
}
|
|
464
|
+
this.syncEntries(effectiveScope, store.entries);
|
|
465
|
+
// ── v3 graph write ──────────────────────────────────────────────────
|
|
466
|
+
// The v2 store above is the legacy layer; getEntries() and the dashboard
|
|
467
|
+
// read from the GRAPH. Without this mirror, new memories saved here never
|
|
468
|
+
// appeared in the Memory panel ("nothing being logged"). Reinforces a
|
|
469
|
+
// near-duplicate node or adds a new one. Non-fatal on failure — the v2
|
|
470
|
+
// write already succeeded.
|
|
471
|
+
try {
|
|
472
|
+
await this.ensureGraphReady();
|
|
473
|
+
const graph = this.getGraph(effectiveScope);
|
|
474
|
+
if (graph) {
|
|
475
|
+
const node = graph.upsertNode({
|
|
476
|
+
content: entry.content,
|
|
477
|
+
category: entry.category,
|
|
478
|
+
scope: effectiveScope,
|
|
479
|
+
layer: entry.layer,
|
|
480
|
+
tags: entry.tags,
|
|
481
|
+
branch: entry.branch,
|
|
482
|
+
directoryScope: entry.directoryScope,
|
|
483
|
+
confidenceSource: 'explicit',
|
|
484
|
+
});
|
|
485
|
+
await graph.save();
|
|
486
|
+
logger.debug(`[memory] saved to ${effectiveScope} graph: "${entry.content.slice(0, 48)}"`);
|
|
487
|
+
// Semantic: embed the node's content in the background (never blocks
|
|
488
|
+
// the write). No-op if embeddings disabled / Ollama unreachable.
|
|
489
|
+
if (this.embeddingService) {
|
|
490
|
+
void this.embedNode(effectiveScope, node.id, node.content);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
logger.warn(`[memory] saveEntry: ${effectiveScope} graph unavailable — saved to v2 store only`);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
catch (err) {
|
|
498
|
+
logger.warn(`[memory] saveEntry graph write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
499
|
+
}
|
|
500
|
+
// ── Dataset event ──────────────────────────────────────────────────
|
|
501
|
+
avaEvents.emit('memory_save', {
|
|
502
|
+
scope: effectiveScope,
|
|
503
|
+
layer,
|
|
504
|
+
category: entry.category,
|
|
505
|
+
source: opts.source ?? 'explicit',
|
|
506
|
+
// content_signature is the category — never the raw content.
|
|
507
|
+
content_signature: entry.category,
|
|
508
|
+
});
|
|
509
|
+
return entry;
|
|
510
|
+
}
|
|
511
|
+
/** Update an existing memory entry by ID. */
|
|
512
|
+
async updateEntry(scope, id, updates) {
|
|
513
|
+
const store = scope === 'global'
|
|
514
|
+
? await this.loadGlobalStore()
|
|
515
|
+
: await this.loadProjectStore();
|
|
516
|
+
if (!store)
|
|
517
|
+
return null;
|
|
518
|
+
const entry = store.entries.find(e => e.id === id);
|
|
519
|
+
if (!entry)
|
|
520
|
+
return null;
|
|
521
|
+
if (updates.content !== undefined)
|
|
522
|
+
entry.content = updates.content;
|
|
523
|
+
if (updates.category !== undefined)
|
|
524
|
+
entry.category = updates.category;
|
|
525
|
+
if (updates.tags !== undefined)
|
|
526
|
+
entry.tags = updates.tags;
|
|
527
|
+
if (updates.branch !== undefined)
|
|
528
|
+
entry.branch = updates.branch;
|
|
529
|
+
if (updates.directoryScope !== undefined)
|
|
530
|
+
entry.directoryScope = updates.directoryScope;
|
|
531
|
+
entry.updatedAt = new Date().toISOString();
|
|
532
|
+
store.lastModified = new Date().toISOString();
|
|
533
|
+
// Update TF-IDF index if content changed
|
|
534
|
+
if (updates.content !== undefined) {
|
|
535
|
+
const index = scope === 'global' ? this.globalIndex : this.projectIndex;
|
|
536
|
+
index.addDocument(id, entry.content);
|
|
537
|
+
}
|
|
538
|
+
if (scope === 'global') {
|
|
539
|
+
this.globalStore = store;
|
|
540
|
+
await this.persistStore(this.globalDir, store);
|
|
541
|
+
}
|
|
542
|
+
else if (this.projectDir) {
|
|
543
|
+
this.projectStore = store;
|
|
544
|
+
await this.persistStore(this.projectDir, store);
|
|
545
|
+
}
|
|
546
|
+
this.syncEntries(scope, store.entries);
|
|
547
|
+
// ── Dataset event ──────────────────────────────────────────────────
|
|
548
|
+
// what_changed reports the first explicit change; covers the common
|
|
549
|
+
// case where a single field is updated. Multi-field updates fire one
|
|
550
|
+
// event with the highest-signal field reported.
|
|
551
|
+
const changedField = updates.content !== undefined ? 'content'
|
|
552
|
+
: updates.tags !== undefined ? 'tags'
|
|
553
|
+
: 'metadata';
|
|
554
|
+
avaEvents.emit('memory_update', {
|
|
555
|
+
scope,
|
|
556
|
+
what_changed: changedField,
|
|
557
|
+
reason: 'updateEntry',
|
|
558
|
+
});
|
|
559
|
+
return entry;
|
|
560
|
+
}
|
|
561
|
+
/** Delete a memory entry by ID. */
|
|
562
|
+
async deleteEntry(scope, id) {
|
|
563
|
+
const store = scope === 'global'
|
|
564
|
+
? await this.loadGlobalStore()
|
|
565
|
+
: await this.loadProjectStore();
|
|
566
|
+
if (!store)
|
|
567
|
+
return false;
|
|
568
|
+
const idx = store.entries.findIndex(e => e.id === id);
|
|
569
|
+
if (idx === -1)
|
|
570
|
+
return false;
|
|
571
|
+
store.entries.splice(idx, 1);
|
|
572
|
+
store.lastModified = new Date().toISOString();
|
|
573
|
+
// Remove from TF-IDF index
|
|
574
|
+
const index = scope === 'global' ? this.globalIndex : this.projectIndex;
|
|
575
|
+
index.removeDocument(id);
|
|
576
|
+
if (scope === 'global') {
|
|
577
|
+
this.globalStore = store;
|
|
578
|
+
await this.persistStore(this.globalDir, store);
|
|
579
|
+
}
|
|
580
|
+
else if (this.projectDir) {
|
|
581
|
+
this.projectStore = store;
|
|
582
|
+
await this.persistStore(this.projectDir, store);
|
|
583
|
+
}
|
|
584
|
+
this.syncEntries(scope, store.entries);
|
|
585
|
+
return true;
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Delete ALL entries from a scope. Permanent.
|
|
589
|
+
*/
|
|
590
|
+
async clearAll(scope) {
|
|
591
|
+
const store = scope === 'global'
|
|
592
|
+
? await this.loadGlobalStore()
|
|
593
|
+
: await this.loadProjectStore();
|
|
594
|
+
if (!store)
|
|
595
|
+
return;
|
|
596
|
+
store.entries = [];
|
|
597
|
+
store.lastModified = new Date().toISOString();
|
|
598
|
+
const index = scope === 'global' ? this.globalIndex : this.projectIndex;
|
|
599
|
+
index.clear();
|
|
600
|
+
if (scope === 'global') {
|
|
601
|
+
this.globalStore = store;
|
|
602
|
+
await this.persistStore(this.globalDir, store);
|
|
603
|
+
}
|
|
604
|
+
else if (this.projectDir) {
|
|
605
|
+
this.projectStore = store;
|
|
606
|
+
await this.persistStore(this.projectDir, store);
|
|
607
|
+
}
|
|
608
|
+
this.syncEntries(scope, []);
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Delete ALL entries from ALL scopes — global + current project + all known projects.
|
|
612
|
+
* Reads the project registry to find every project memory file.
|
|
613
|
+
*/
|
|
614
|
+
async clearEverything() {
|
|
615
|
+
// Disable sync to prevent re-upload of cached entries
|
|
616
|
+
this.sync = undefined;
|
|
617
|
+
this.localOnly = true;
|
|
618
|
+
// Reset in-memory caches
|
|
619
|
+
this.globalStore = null;
|
|
620
|
+
this.projectStore = null;
|
|
621
|
+
// Clear global
|
|
622
|
+
await this.clearAll('global');
|
|
623
|
+
// Clear current project
|
|
624
|
+
await this.clearAll('project');
|
|
625
|
+
// Clear all known projects from registry
|
|
626
|
+
try {
|
|
627
|
+
const registryPath = join(this.globalDir, PROJECTS_REGISTRY);
|
|
628
|
+
const data = await readFile(registryPath, 'utf-8');
|
|
629
|
+
const registry = JSON.parse(data);
|
|
630
|
+
for (const project of registry) {
|
|
631
|
+
try {
|
|
632
|
+
const projectMemoryPath = join(project.path, '.ava', MEMORY_FILENAME_V2);
|
|
633
|
+
const raw = await readFile(projectMemoryPath, 'utf-8');
|
|
634
|
+
const store = JSON.parse(raw);
|
|
635
|
+
store.entries = [];
|
|
636
|
+
store.lastModified = new Date().toISOString();
|
|
637
|
+
await this.writeSafe(projectMemoryPath, JSON.stringify(store, null, 2));
|
|
638
|
+
}
|
|
639
|
+
catch { /* project dir may not exist anymore */ }
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
catch { /* no registry or corrupt */ }
|
|
643
|
+
// Clear legacy memory.md
|
|
644
|
+
try {
|
|
645
|
+
const mdPath = join(this.globalDir, 'memory.md');
|
|
646
|
+
await this.writeSafe(mdPath, '');
|
|
647
|
+
}
|
|
648
|
+
catch { /* best effort */ }
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* Search memories with TF-IDF ranking + temporal relevance scoring.
|
|
652
|
+
* Falls back to substring for exact matches, then semantic via platform.
|
|
653
|
+
*/
|
|
654
|
+
async recall(opts) {
|
|
655
|
+
const results = [];
|
|
656
|
+
const lowerQuery = opts.query.toLowerCase();
|
|
657
|
+
const limit = opts.limit ?? 10;
|
|
658
|
+
const includeArchived = opts.includeArchived ?? false;
|
|
659
|
+
const searchStore = (store, scope, index) => {
|
|
660
|
+
// Phase 1: Exact substring matches (highest priority)
|
|
661
|
+
const substringMatches = new Set();
|
|
662
|
+
for (const entry of store.entries) {
|
|
663
|
+
if (!includeArchived && entry.archived)
|
|
664
|
+
continue;
|
|
665
|
+
if (opts.category && entry.category !== opts.category)
|
|
666
|
+
continue;
|
|
667
|
+
if (opts.branch && entry.branch && entry.branch !== opts.branch)
|
|
668
|
+
continue;
|
|
669
|
+
if (entry.content.toLowerCase().includes(lowerQuery) ||
|
|
670
|
+
entry.tags?.some(t => t.toLowerCase().includes(lowerQuery))) {
|
|
671
|
+
const relevance = this.computeRelevance(1.0, entry);
|
|
672
|
+
results.push({ entry, scope, relevance, matchType: 'substring' });
|
|
673
|
+
substringMatches.add(entry.id);
|
|
674
|
+
// Update recall stats
|
|
675
|
+
entry.lastRecalledAt = new Date().toISOString();
|
|
676
|
+
entry.recallCount++;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
// Phase 2: TF-IDF search for semantic-ish matches
|
|
680
|
+
const tfidfResults = index.search(opts.query, limit * 2);
|
|
681
|
+
for (const { id, score } of tfidfResults) {
|
|
682
|
+
if (substringMatches.has(id))
|
|
683
|
+
continue; // already found via substring
|
|
684
|
+
if (score < RECALL_TFIDF_THRESHOLD)
|
|
685
|
+
continue;
|
|
686
|
+
const entry = store.entries.find(e => e.id === id);
|
|
687
|
+
if (!entry)
|
|
688
|
+
continue;
|
|
689
|
+
if (!includeArchived && entry.archived)
|
|
690
|
+
continue;
|
|
691
|
+
if (opts.category && entry.category !== opts.category)
|
|
692
|
+
continue;
|
|
693
|
+
if (opts.branch && entry.branch && entry.branch !== opts.branch)
|
|
694
|
+
continue;
|
|
695
|
+
const relevance = this.computeRelevance(score, entry);
|
|
696
|
+
results.push({ entry, scope, relevance, matchType: 'tfidf' });
|
|
697
|
+
// Update recall stats
|
|
698
|
+
entry.lastRecalledAt = new Date().toISOString();
|
|
699
|
+
entry.recallCount++;
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
if (opts.scope !== 'project') {
|
|
703
|
+
const globalStore = await this.loadGlobalStore();
|
|
704
|
+
searchStore(globalStore, 'global', this.globalIndex);
|
|
705
|
+
}
|
|
706
|
+
if (opts.scope === 'all_projects') {
|
|
707
|
+
// Search every known project (including current)
|
|
708
|
+
const projects = await this.loadProjectRegistry();
|
|
709
|
+
for (const proj of projects) {
|
|
710
|
+
const projAvaDir = join(proj.path, '.ava');
|
|
711
|
+
// Skip the current project — it's searched via 'project' scope below
|
|
712
|
+
if (this.projectDir && projAvaDir === this.projectDir)
|
|
713
|
+
continue;
|
|
714
|
+
// Only search projects that still exist on disk
|
|
715
|
+
if (!existsSync(join(projAvaDir, MEMORY_FILENAME_V2)))
|
|
716
|
+
continue;
|
|
717
|
+
try {
|
|
718
|
+
const storeData = await readFile(join(projAvaDir, MEMORY_FILENAME_V2), 'utf-8');
|
|
719
|
+
const store = JSON.parse(storeData);
|
|
720
|
+
const tempIndex = new TfIdfIndex();
|
|
721
|
+
this.rebuildIndex(store, tempIndex);
|
|
722
|
+
searchStore(store, `project:${proj.name}`, tempIndex);
|
|
723
|
+
}
|
|
724
|
+
catch {
|
|
725
|
+
// Skip unreadable project stores
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (opts.scope !== 'global') {
|
|
730
|
+
const projectStore = await this.loadProjectStore();
|
|
731
|
+
if (projectStore)
|
|
732
|
+
searchStore(projectStore, 'project', this.projectIndex);
|
|
733
|
+
}
|
|
734
|
+
// Sort by composite relevance score
|
|
735
|
+
results.sort((a, b) => b.relevance - a.relevance);
|
|
736
|
+
// ── Local semantic phase (graph-wide, optional) ────────────────────────
|
|
737
|
+
// Embed the query and cosine against the graph's stored vectors. Unlike the
|
|
738
|
+
// keyword phases above (which see only the ≤500 v2 store), this spans the
|
|
739
|
+
// FULL graph — surfacing memories that are semantically related but share
|
|
740
|
+
// no keywords. Additive + graceful: no embeddings / endpoint down → skipped
|
|
741
|
+
// entirely, leaving the keyword results exactly as they are today.
|
|
742
|
+
if (this.embeddingService) {
|
|
743
|
+
const qVec = await this.embeddingService.embed(opts.query);
|
|
744
|
+
if (qVec) {
|
|
745
|
+
await this.ensureGraphReady();
|
|
746
|
+
const seen = new Set(results.map(r => r.entry.id));
|
|
747
|
+
const addSemantic = (graph, store, scope) => {
|
|
748
|
+
if (!graph || !store)
|
|
749
|
+
return;
|
|
750
|
+
const hits = [];
|
|
751
|
+
for (const node of graph.getActiveNodes()) {
|
|
752
|
+
if (seen.has(node.id))
|
|
753
|
+
continue;
|
|
754
|
+
if (opts.category && node.category !== opts.category)
|
|
755
|
+
continue;
|
|
756
|
+
if (opts.branch && node.branch && node.branch !== opts.branch)
|
|
757
|
+
continue;
|
|
758
|
+
const vec = store.get(node.id);
|
|
759
|
+
if (!vec)
|
|
760
|
+
continue;
|
|
761
|
+
const sim = cosineDense(qVec, vec);
|
|
762
|
+
if (sim >= SEMANTIC_RECALL_THRESHOLD)
|
|
763
|
+
hits.push({ node, sim });
|
|
764
|
+
}
|
|
765
|
+
hits.sort((a, b) => b.sim - a.sim);
|
|
766
|
+
for (const { node, sim } of hits.slice(0, limit)) {
|
|
767
|
+
seen.add(node.id);
|
|
768
|
+
results.push({ entry: node, scope, relevance: this.computeRelevance(sim, node), matchType: 'semantic' });
|
|
769
|
+
}
|
|
770
|
+
};
|
|
771
|
+
if (opts.scope !== 'project')
|
|
772
|
+
addSemantic(this.graphGlobal, this.embeddingStoreGlobal, 'global');
|
|
773
|
+
if (opts.scope !== 'global')
|
|
774
|
+
addSemantic(this.graphProject, this.embeddingStoreProject, 'project');
|
|
775
|
+
results.sort((a, b) => b.relevance - a.relevance);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
// If no local matches, try semantic search via platform
|
|
779
|
+
if (results.length === 0 && this.sync) {
|
|
780
|
+
const semantic = opts.scope === 'all_projects'
|
|
781
|
+
? await this.sync.semanticSearch(opts.query, { allProjects: true, threshold: 0.65, limit }).catch(() => [])
|
|
782
|
+
: await this.loadRelevantMemories(opts.query, limit);
|
|
783
|
+
for (const m of semantic) {
|
|
784
|
+
results.push({
|
|
785
|
+
entry: {
|
|
786
|
+
id: m.id,
|
|
787
|
+
category: 'general',
|
|
788
|
+
content: m.content,
|
|
789
|
+
createdAt: '',
|
|
790
|
+
updatedAt: '',
|
|
791
|
+
lastRecalledAt: new Date().toISOString(),
|
|
792
|
+
recallCount: 0,
|
|
793
|
+
},
|
|
794
|
+
scope: m.scope,
|
|
795
|
+
relevance: m.similarity,
|
|
796
|
+
matchType: 'semantic',
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
// Persist updated recall stats and sync
|
|
801
|
+
if (results.some(r => r.matchType === 'substring' || r.matchType === 'tfidf')) {
|
|
802
|
+
await Promise.all([
|
|
803
|
+
this.globalStore ? this.persistStore(this.globalDir, this.globalStore) : Promise.resolve(),
|
|
804
|
+
this.projectStore && this.projectDir ? this.persistStore(this.projectDir, this.projectStore) : Promise.resolve(),
|
|
805
|
+
]);
|
|
806
|
+
// Don't sync on recall — only sync when explicitly saving/updating
|
|
807
|
+
// Recall just updates lastRecalledAt counters, not content
|
|
808
|
+
}
|
|
809
|
+
const final = results.slice(0, limit);
|
|
810
|
+
// ── Dataset event ──────────────────────────────────────────────────
|
|
811
|
+
// query_signature is a coarse length category (single-word /
|
|
812
|
+
// short-phrase / long-query). Never the raw query. results_used_count
|
|
813
|
+
// is set to 0 here because we don't know at recall time which entries
|
|
814
|
+
// will end up in the response — the join happens at training time
|
|
815
|
+
// via trajectory_id correlation with subsequent assistant turns.
|
|
816
|
+
const wordCount = opts.query.trim().split(/\s+/).filter(Boolean).length;
|
|
817
|
+
const querySignature = wordCount <= 1 ? 'single-word'
|
|
818
|
+
: wordCount <= 5 ? 'short-phrase'
|
|
819
|
+
: 'long-query';
|
|
820
|
+
avaEvents.emit('memory_recall', {
|
|
821
|
+
query_signature: querySignature,
|
|
822
|
+
results_count: final.length,
|
|
823
|
+
results_used_count: 0,
|
|
824
|
+
});
|
|
825
|
+
return final;
|
|
826
|
+
}
|
|
827
|
+
// ── Public API — Phase 3: Temporal & Scope ──────────────────────────────────
|
|
828
|
+
/**
|
|
829
|
+
* Archive stale entries (not recalled in 90+ days).
|
|
830
|
+
* Returns the number of entries archived.
|
|
831
|
+
*/
|
|
832
|
+
async archiveStaleEntries(scope) {
|
|
833
|
+
const store = scope === 'global'
|
|
834
|
+
? await this.loadGlobalStore()
|
|
835
|
+
: await this.loadProjectStore();
|
|
836
|
+
if (!store)
|
|
837
|
+
return 0;
|
|
838
|
+
let count = 0;
|
|
839
|
+
const now = new Date().toISOString();
|
|
840
|
+
for (const entry of store.entries) {
|
|
841
|
+
if (entry.archived)
|
|
842
|
+
continue;
|
|
843
|
+
if (this.isStale(entry)) {
|
|
844
|
+
entry.archived = true;
|
|
845
|
+
entry.archivedAt = now;
|
|
846
|
+
count++;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
if (count > 0) {
|
|
850
|
+
store.lastModified = now;
|
|
851
|
+
if (scope === 'global') {
|
|
852
|
+
await this.persistStore(this.globalDir, store);
|
|
853
|
+
}
|
|
854
|
+
else if (this.projectDir) {
|
|
855
|
+
await this.persistStore(this.projectDir, store);
|
|
856
|
+
}
|
|
857
|
+
this.syncEntries(scope, store.entries);
|
|
858
|
+
}
|
|
859
|
+
return count;
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* Restore an archived entry back to active status.
|
|
863
|
+
*/
|
|
864
|
+
async restoreEntry(scope, id) {
|
|
865
|
+
const store = scope === 'global'
|
|
866
|
+
? await this.loadGlobalStore()
|
|
867
|
+
: await this.loadProjectStore();
|
|
868
|
+
if (!store)
|
|
869
|
+
return false;
|
|
870
|
+
const entry = store.entries.find(e => e.id === id);
|
|
871
|
+
if (!entry || !entry.archived)
|
|
872
|
+
return false;
|
|
873
|
+
entry.archived = false;
|
|
874
|
+
entry.archivedAt = null;
|
|
875
|
+
entry.updatedAt = new Date().toISOString();
|
|
876
|
+
store.lastModified = new Date().toISOString();
|
|
877
|
+
if (scope === 'global') {
|
|
878
|
+
await this.persistStore(this.globalDir, store);
|
|
879
|
+
}
|
|
880
|
+
else if (this.projectDir) {
|
|
881
|
+
await this.persistStore(this.projectDir, store);
|
|
882
|
+
}
|
|
883
|
+
this.syncEntries(scope, store.entries);
|
|
884
|
+
return true;
|
|
885
|
+
}
|
|
886
|
+
/**
|
|
887
|
+
* Archive a single entry by ID.
|
|
888
|
+
*/
|
|
889
|
+
async archiveEntry(scope, id) {
|
|
890
|
+
const store = scope === 'global'
|
|
891
|
+
? await this.loadGlobalStore()
|
|
892
|
+
: await this.loadProjectStore();
|
|
893
|
+
if (!store)
|
|
894
|
+
return false;
|
|
895
|
+
const entry = store.entries.find(e => e.id === id);
|
|
896
|
+
if (!entry || entry.archived)
|
|
897
|
+
return false;
|
|
898
|
+
entry.archived = true;
|
|
899
|
+
entry.archivedAt = new Date().toISOString();
|
|
900
|
+
entry.updatedAt = new Date().toISOString();
|
|
901
|
+
store.lastModified = new Date().toISOString();
|
|
902
|
+
if (scope === 'global') {
|
|
903
|
+
await this.persistStore(this.globalDir, store);
|
|
904
|
+
}
|
|
905
|
+
else if (this.projectDir) {
|
|
906
|
+
await this.persistStore(this.projectDir, store);
|
|
907
|
+
}
|
|
908
|
+
this.syncEntries(scope, store.entries);
|
|
909
|
+
return true;
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* Find groups of related entries that could be consolidated.
|
|
913
|
+
* Uses TF-IDF similarity to cluster entries within the same category.
|
|
914
|
+
* Returns groups sorted by number of related entries (largest first).
|
|
915
|
+
*/
|
|
916
|
+
findConsolidationGroups(scope) {
|
|
917
|
+
const store = scope === 'global' ? this.globalStore : this.projectStore;
|
|
918
|
+
if (!store || store.entries.length < 2)
|
|
919
|
+
return [];
|
|
920
|
+
const index = scope === 'global' ? this.globalIndex : this.projectIndex;
|
|
921
|
+
const activeEntries = store.entries.filter(e => !e.archived);
|
|
922
|
+
// Group by category first — only consolidate within same category
|
|
923
|
+
const byCategory = new Map();
|
|
924
|
+
for (const entry of activeEntries) {
|
|
925
|
+
const list = byCategory.get(entry.category) ?? [];
|
|
926
|
+
list.push(entry);
|
|
927
|
+
byCategory.set(entry.category, list);
|
|
928
|
+
}
|
|
929
|
+
const groups = [];
|
|
930
|
+
const claimed = new Set(); // entries already in a group
|
|
931
|
+
for (const [, categoryEntries] of byCategory) {
|
|
932
|
+
if (categoryEntries.length < 2)
|
|
933
|
+
continue;
|
|
934
|
+
for (const entry of categoryEntries) {
|
|
935
|
+
if (claimed.has(entry.id))
|
|
936
|
+
continue;
|
|
937
|
+
// Find similar entries using TF-IDF
|
|
938
|
+
const similar = index.findSimilar(entry.id, CONSOLIDATION_THRESHOLD)
|
|
939
|
+
.filter(s => {
|
|
940
|
+
if (claimed.has(s.id))
|
|
941
|
+
return false;
|
|
942
|
+
const other = categoryEntries.find(e => e.id === s.id);
|
|
943
|
+
return other && !other.archived;
|
|
944
|
+
});
|
|
945
|
+
if (similar.length === 0)
|
|
946
|
+
continue;
|
|
947
|
+
const related = similar.map(s => categoryEntries.find(e => e.id === s.id));
|
|
948
|
+
const avgSimilarity = similar.reduce((sum, s) => sum + s.score, 0) / similar.length;
|
|
949
|
+
// Primary = entry with highest recall count
|
|
950
|
+
const allInGroup = [entry, ...related];
|
|
951
|
+
allInGroup.sort((a, b) => b.recallCount - a.recallCount);
|
|
952
|
+
groups.push({
|
|
953
|
+
primary: allInGroup[0],
|
|
954
|
+
related: allInGroup.slice(1),
|
|
955
|
+
avgSimilarity,
|
|
956
|
+
});
|
|
957
|
+
for (const e of allInGroup)
|
|
958
|
+
claimed.add(e.id);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
// Sort by group size (most consolidation potential first)
|
|
962
|
+
groups.sort((a, b) => b.related.length - a.related.length);
|
|
963
|
+
return groups;
|
|
964
|
+
}
|
|
965
|
+
/**
|
|
966
|
+
* Get stale entries for a scope (for dashboard review).
|
|
967
|
+
*/
|
|
968
|
+
async getStaleEntries(scope) {
|
|
969
|
+
const store = scope === 'global'
|
|
970
|
+
? await this.loadGlobalStore()
|
|
971
|
+
: await this.loadProjectStore();
|
|
972
|
+
if (!store)
|
|
973
|
+
return [];
|
|
974
|
+
return store.entries.filter(e => !e.archived && this.isStale(e));
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Get archived entries for a scope.
|
|
978
|
+
*/
|
|
979
|
+
async getArchivedEntries(scope) {
|
|
980
|
+
const store = scope === 'global'
|
|
981
|
+
? await this.loadGlobalStore()
|
|
982
|
+
: await this.loadProjectStore();
|
|
983
|
+
if (!store)
|
|
984
|
+
return [];
|
|
985
|
+
return store.entries.filter(e => e.archived);
|
|
986
|
+
}
|
|
987
|
+
/** Get summary statistics for a store. */
|
|
988
|
+
async getSummary(scope) {
|
|
989
|
+
const store = scope === 'global'
|
|
990
|
+
? await this.loadGlobalStore()
|
|
991
|
+
: await this.loadProjectStore() ?? createEmptyStore();
|
|
992
|
+
const byCategory = {};
|
|
993
|
+
for (const cat of MEMORY_CATEGORIES)
|
|
994
|
+
byCategory[cat] = 0;
|
|
995
|
+
const byLayer = { person: 0, workflow: 0, project: 0 };
|
|
996
|
+
const now = Date.now();
|
|
997
|
+
let staleCount = 0;
|
|
998
|
+
let archivedCount = 0;
|
|
999
|
+
let branchScoped = 0;
|
|
1000
|
+
let oldest = null;
|
|
1001
|
+
let newest = null;
|
|
1002
|
+
for (const entry of store.entries) {
|
|
1003
|
+
if (entry.archived) {
|
|
1004
|
+
archivedCount++;
|
|
1005
|
+
continue; // don't count archived in category/stale stats
|
|
1006
|
+
}
|
|
1007
|
+
byCategory[entry.category] = (byCategory[entry.category] ?? 0) + 1;
|
|
1008
|
+
const layer = entry.layer ?? inferLayer(entry.category, scope);
|
|
1009
|
+
byLayer[layer] = (byLayer[layer] ?? 0) + 1;
|
|
1010
|
+
if (!oldest || entry.createdAt < oldest)
|
|
1011
|
+
oldest = entry.createdAt;
|
|
1012
|
+
if (!newest || entry.createdAt > newest)
|
|
1013
|
+
newest = entry.createdAt;
|
|
1014
|
+
if (entry.branch)
|
|
1015
|
+
branchScoped++;
|
|
1016
|
+
const lastActivity = entry.lastRecalledAt ?? entry.updatedAt ?? entry.createdAt;
|
|
1017
|
+
const daysSince = (now - new Date(lastActivity).getTime()) / (1000 * 60 * 60 * 24);
|
|
1018
|
+
if (daysSince > STALE_THRESHOLD_DAYS)
|
|
1019
|
+
staleCount++;
|
|
1020
|
+
}
|
|
1021
|
+
return {
|
|
1022
|
+
totalEntries: store.entries.filter(e => !e.archived).length,
|
|
1023
|
+
byCategory,
|
|
1024
|
+
byLayer,
|
|
1025
|
+
oldestEntry: oldest,
|
|
1026
|
+
newestEntry: newest,
|
|
1027
|
+
staleCount,
|
|
1028
|
+
archivedCount,
|
|
1029
|
+
branchScoped,
|
|
1030
|
+
};
|
|
1031
|
+
}
|
|
1032
|
+
/** Get all entries for a scope (for dashboard display). */
|
|
1033
|
+
async getEntries(scope) {
|
|
1034
|
+
// Wait for the v3 graph to finish its async init before reading — otherwise
|
|
1035
|
+
// a caller right after construction (e.g. the dashboard's get_memories) hits
|
|
1036
|
+
// a null graph and silently falls back to the stale v2 store / empty list.
|
|
1037
|
+
// recall() already guards this way; getEntries must too so the dashboard
|
|
1038
|
+
// always sees the authoritative graph.
|
|
1039
|
+
await this.ensureGraphReady();
|
|
1040
|
+
// v3: prefer graph nodes when available (MemoryNode extends MemoryEntry
|
|
1041
|
+
// so the return type is compatible). Falls back to v2 store if graph
|
|
1042
|
+
// isn't initialized yet.
|
|
1043
|
+
const graph = scope === 'global' ? this.graphGlobal : this.graphProject;
|
|
1044
|
+
if (graph) {
|
|
1045
|
+
return graph.getAllNodes();
|
|
1046
|
+
}
|
|
1047
|
+
const store = scope === 'global'
|
|
1048
|
+
? await this.loadGlobalStore()
|
|
1049
|
+
: await this.loadProjectStore();
|
|
1050
|
+
return store?.entries ?? [];
|
|
1051
|
+
}
|
|
1052
|
+
/** Get graph stats for the dashboard (v3). */
|
|
1053
|
+
getGraphStats(scope) {
|
|
1054
|
+
const graph = scope === 'global' ? this.graphGlobal : this.graphProject;
|
|
1055
|
+
if (!graph)
|
|
1056
|
+
return null;
|
|
1057
|
+
const stats = graph.getStats();
|
|
1058
|
+
const contradictions = graph.getAllEdges().filter(e => e.type === 'contradicts').length;
|
|
1059
|
+
const observer = scope === 'global' ? this.proceduralGlobal : this.proceduralProject;
|
|
1060
|
+
const allPatterns = observer?.getAllPatterns() ?? [];
|
|
1061
|
+
return {
|
|
1062
|
+
...stats,
|
|
1063
|
+
contradictions,
|
|
1064
|
+
proceduralPatterns: allPatterns.length,
|
|
1065
|
+
crystallisedPatterns: allPatterns.filter(p => p.crystallised).length,
|
|
1066
|
+
};
|
|
1067
|
+
}
|
|
1068
|
+
/** Get contradictions for the dashboard resolution UI (v3). */
|
|
1069
|
+
getContradictions(scope) {
|
|
1070
|
+
const graph = scope === 'global' ? this.graphGlobal : this.graphProject;
|
|
1071
|
+
if (!graph)
|
|
1072
|
+
return [];
|
|
1073
|
+
const contradictEdges = graph.getAllEdges().filter(e => e.type === 'contradicts');
|
|
1074
|
+
const results = [];
|
|
1075
|
+
for (const edge of contradictEdges) {
|
|
1076
|
+
const nodeA = graph.getNode(edge.fromNodeId);
|
|
1077
|
+
const nodeB = graph.getNode(edge.toNodeId);
|
|
1078
|
+
if (nodeA && nodeB && !nodeA.archived && !nodeB.archived) {
|
|
1079
|
+
results.push({ nodeA, nodeB, similarity: edge.weight, edgeId: edge.id });
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
return results;
|
|
1083
|
+
}
|
|
1084
|
+
/** Get procedural patterns for the dashboard (v3). */
|
|
1085
|
+
getProceduralPatterns(scope) {
|
|
1086
|
+
const observer = scope === 'global' ? this.proceduralGlobal : this.proceduralProject;
|
|
1087
|
+
return observer?.getAllPatterns() ?? [];
|
|
1088
|
+
}
|
|
1089
|
+
/** Get file path for a scope (for display). */
|
|
1090
|
+
getPath(scope) {
|
|
1091
|
+
if (scope === 'global')
|
|
1092
|
+
return join(this.globalDir, MEMORY_FILENAME_V2);
|
|
1093
|
+
return this.projectDir ? join(this.projectDir, MEMORY_FILENAME_V2) : null;
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Pull latest memories from the platform and merge into local store.
|
|
1097
|
+
* Remote entries win conflicts (by updatedAt). Returns count of new/updated entries.
|
|
1098
|
+
*/
|
|
1099
|
+
async pullLatest(scope) {
|
|
1100
|
+
if (!this.sync || this.localOnly)
|
|
1101
|
+
return 0;
|
|
1102
|
+
try {
|
|
1103
|
+
const remote = await this.sync.pull(scope);
|
|
1104
|
+
if (remote.length === 0)
|
|
1105
|
+
return 0;
|
|
1106
|
+
const store = scope === 'global'
|
|
1107
|
+
? await this.loadGlobalStore()
|
|
1108
|
+
: await this.loadProjectStore() ?? { version: 2, lastModified: new Date().toISOString(), entries: [] };
|
|
1109
|
+
let updated = 0;
|
|
1110
|
+
for (const r of remote) {
|
|
1111
|
+
if (r.key === 'memory.json')
|
|
1112
|
+
continue; // Skip legacy blob records
|
|
1113
|
+
const existing = store.entries.find(e => e.id === r.key);
|
|
1114
|
+
if (existing) {
|
|
1115
|
+
// Remote wins if newer
|
|
1116
|
+
if (r.updated_at > existing.updatedAt) {
|
|
1117
|
+
existing.content = r.content;
|
|
1118
|
+
existing.updatedAt = r.updated_at;
|
|
1119
|
+
existing.category = this.inferCategory(r.content);
|
|
1120
|
+
updated++;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
else {
|
|
1124
|
+
// New entry from remote
|
|
1125
|
+
store.entries.push({
|
|
1126
|
+
id: r.key,
|
|
1127
|
+
category: this.inferCategory(r.content),
|
|
1128
|
+
content: r.content,
|
|
1129
|
+
createdAt: r.updated_at,
|
|
1130
|
+
updatedAt: r.updated_at,
|
|
1131
|
+
lastRecalledAt: null,
|
|
1132
|
+
recallCount: 0,
|
|
1133
|
+
archived: false,
|
|
1134
|
+
});
|
|
1135
|
+
updated++;
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
if (updated > 0) {
|
|
1139
|
+
store.lastModified = new Date().toISOString();
|
|
1140
|
+
const dir = scope === 'global' ? this.globalDir : this.projectDir;
|
|
1141
|
+
if (dir) {
|
|
1142
|
+
await this.persistStore(dir, store);
|
|
1143
|
+
this.clearCache();
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
return updated;
|
|
1147
|
+
}
|
|
1148
|
+
catch {
|
|
1149
|
+
return 0;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
/** Invalidate cached stores and TF-IDF indexes. */
|
|
1153
|
+
clearCache() {
|
|
1154
|
+
this.globalStore = null;
|
|
1155
|
+
this.projectStore = null;
|
|
1156
|
+
this.globalIndex.clear();
|
|
1157
|
+
this.projectIndex.clear();
|
|
1158
|
+
}
|
|
1159
|
+
// ── Semantic search (platform) ─────────────────────────────────────────────
|
|
1160
|
+
async loadRelevantMemories(context, limit = 5) {
|
|
1161
|
+
if (!this.sync)
|
|
1162
|
+
return [];
|
|
1163
|
+
try {
|
|
1164
|
+
return await this.sync.semanticSearch(context, { threshold: 0.65, limit });
|
|
1165
|
+
}
|
|
1166
|
+
catch {
|
|
1167
|
+
return [];
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
// ── Private — Storage ──────────────────────────────────────────────────────
|
|
1171
|
+
async loadStore(dir, scope) {
|
|
1172
|
+
// Clean up orphaned .tmp files from interrupted writes
|
|
1173
|
+
try {
|
|
1174
|
+
const { readdir, unlink: unlinkFile } = await import('node:fs/promises');
|
|
1175
|
+
const files = await readdir(dir).catch(() => []);
|
|
1176
|
+
for (const file of files) {
|
|
1177
|
+
if (file.endsWith('.tmp')) {
|
|
1178
|
+
await unlinkFile(join(dir, file)).catch(() => { });
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
catch { /* non-critical cleanup */ }
|
|
1183
|
+
const v2Path = join(dir, MEMORY_FILENAME_V2);
|
|
1184
|
+
const v1Path = join(dir, MEMORY_FILENAME_V1);
|
|
1185
|
+
// Try v2 first
|
|
1186
|
+
try {
|
|
1187
|
+
const raw = await readFile(v2Path, 'utf-8');
|
|
1188
|
+
const parsed = JSON.parse(raw);
|
|
1189
|
+
if ((parsed.version === 2 || parsed.version === 3) && Array.isArray(parsed.entries)) {
|
|
1190
|
+
// Fix corrupt entries whose content is a JSON store blob
|
|
1191
|
+
const cleaned = this.cleanBlobEntries(parsed);
|
|
1192
|
+
if (cleaned) {
|
|
1193
|
+
await this.persistStore(dir, parsed);
|
|
1194
|
+
}
|
|
1195
|
+
// Auto-migrate v2 → v3: assign layer to entries that don't have one
|
|
1196
|
+
if (parsed.version === 2 || parsed.entries.some(e => !e.layer)) {
|
|
1197
|
+
for (const entry of parsed.entries) {
|
|
1198
|
+
if (!entry.layer) {
|
|
1199
|
+
entry.layer = inferLayer(entry.category, scope);
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
parsed.version = 3;
|
|
1203
|
+
await this.persistStore(dir, parsed);
|
|
1204
|
+
}
|
|
1205
|
+
return parsed;
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
catch { /* v2 doesn't exist or is corrupt */ }
|
|
1209
|
+
// Try migrating from v1
|
|
1210
|
+
try {
|
|
1211
|
+
const v1Content = await readFile(v1Path, 'utf-8');
|
|
1212
|
+
if (v1Content?.trim()) {
|
|
1213
|
+
const store = this.migrateFromV1(v1Content);
|
|
1214
|
+
await mkdir(dir, { recursive: true });
|
|
1215
|
+
await this.persistStore(dir, store);
|
|
1216
|
+
return store;
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
catch { /* v1 doesn't exist either */ }
|
|
1220
|
+
// Try bootstrapping from platform
|
|
1221
|
+
if (this.sync) {
|
|
1222
|
+
try {
|
|
1223
|
+
const remote = await this.sync.pull(scope);
|
|
1224
|
+
if (remote.length > 0) {
|
|
1225
|
+
// Build store from individual remote entries
|
|
1226
|
+
const entries = remote
|
|
1227
|
+
.filter((m) => m.key !== 'memory.json') // Skip legacy blob records
|
|
1228
|
+
.map((m) => ({
|
|
1229
|
+
id: m.key, // Local entry ID was used as the key
|
|
1230
|
+
category: this.inferCategory(m.content),
|
|
1231
|
+
content: m.content,
|
|
1232
|
+
createdAt: m.updated_at,
|
|
1233
|
+
updatedAt: m.updated_at,
|
|
1234
|
+
lastRecalledAt: null,
|
|
1235
|
+
recallCount: 0,
|
|
1236
|
+
archived: false,
|
|
1237
|
+
}));
|
|
1238
|
+
if (entries.length > 0) {
|
|
1239
|
+
const store = {
|
|
1240
|
+
version: 2,
|
|
1241
|
+
lastModified: new Date().toISOString(),
|
|
1242
|
+
entries,
|
|
1243
|
+
};
|
|
1244
|
+
await mkdir(dir, { recursive: true });
|
|
1245
|
+
await this.persistStore(dir, store);
|
|
1246
|
+
return store;
|
|
1247
|
+
}
|
|
1248
|
+
// Fallback: if only legacy blob records exist, migrate them
|
|
1249
|
+
const legacyContent = remote.map((m) => m.content).join('\n\n');
|
|
1250
|
+
if (legacyContent.trim()) {
|
|
1251
|
+
const store = this.migrateFromV1(legacyContent);
|
|
1252
|
+
await mkdir(dir, { recursive: true });
|
|
1253
|
+
await this.persistStore(dir, store);
|
|
1254
|
+
return store;
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
catch { /* platform unavailable */ }
|
|
1259
|
+
}
|
|
1260
|
+
return createEmptyStore();
|
|
1261
|
+
}
|
|
1262
|
+
async persistStore(dir, store) {
|
|
1263
|
+
await mkdir(dir, { recursive: true });
|
|
1264
|
+
const path = join(dir, MEMORY_FILENAME_V2);
|
|
1265
|
+
const content = JSON.stringify(store, null, 2);
|
|
1266
|
+
await this.writeSafe(path, content);
|
|
1267
|
+
// Also write a human-readable markdown mirror (active entries only)
|
|
1268
|
+
const mdPath = join(dir, MEMORY_FILENAME_V1);
|
|
1269
|
+
const activeEntries = store.entries.filter(e => !e.archived);
|
|
1270
|
+
const markdown = this.formatEntriesAsMarkdown(activeEntries);
|
|
1271
|
+
await this.writeSafe(mdPath, markdown);
|
|
1272
|
+
}
|
|
1273
|
+
// ── Private — TF-IDF Index ─────────────────────────────────────────────────
|
|
1274
|
+
/** Rebuild TF-IDF index from a store's entries. */
|
|
1275
|
+
rebuildIndex(store, index) {
|
|
1276
|
+
index.clear();
|
|
1277
|
+
for (const entry of store.entries) {
|
|
1278
|
+
if (!entry.archived) {
|
|
1279
|
+
index.addDocument(entry.id, entry.content);
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
// ── Private — Relevance Scoring ────────────────────────────────────────────
|
|
1284
|
+
/**
|
|
1285
|
+
* Compute composite relevance score combining TF-IDF match quality,
|
|
1286
|
+
* recency, and recall frequency. Returns 0–1.
|
|
1287
|
+
*/
|
|
1288
|
+
computeRelevance(tfidfScore, entry) {
|
|
1289
|
+
// Recency score: exponential decay, half-life of 30 days
|
|
1290
|
+
const lastActivity = entry.lastRecalledAt ?? entry.updatedAt ?? entry.createdAt;
|
|
1291
|
+
const daysSince = (Date.now() - new Date(lastActivity).getTime()) / (1000 * 60 * 60 * 24);
|
|
1292
|
+
const recencyScore = Math.exp(-daysSince / 30);
|
|
1293
|
+
// Frequency score: logarithmic — diminishing returns after many recalls
|
|
1294
|
+
const frequencyScore = entry.recallCount > 0
|
|
1295
|
+
? Math.min(1, Math.log(1 + entry.recallCount) / Math.log(20))
|
|
1296
|
+
: 0;
|
|
1297
|
+
return (tfidfScore * W_TFIDF) + (recencyScore * W_RECENCY) + (frequencyScore * W_FREQUENCY);
|
|
1298
|
+
}
|
|
1299
|
+
// ── Private — Migration ────────────────────────────────────────────────────
|
|
1300
|
+
/** Convert v1 markdown to v2 structured store. */
|
|
1301
|
+
migrateFromV1(markdown) {
|
|
1302
|
+
const entries = this.markdownToEntries(markdown);
|
|
1303
|
+
return {
|
|
1304
|
+
version: 2,
|
|
1305
|
+
lastModified: new Date().toISOString(),
|
|
1306
|
+
entries,
|
|
1307
|
+
};
|
|
1308
|
+
}
|
|
1309
|
+
/** Parse markdown content into structured entries. */
|
|
1310
|
+
markdownToEntries(markdown) {
|
|
1311
|
+
const trimmedInput = markdown.trim();
|
|
1312
|
+
if (!trimmedInput)
|
|
1313
|
+
return [];
|
|
1314
|
+
// Detect JSON input — if it's a v2 store blob, extract entries directly
|
|
1315
|
+
if (trimmedInput.startsWith('{')) {
|
|
1316
|
+
try {
|
|
1317
|
+
const parsed = JSON.parse(trimmedInput);
|
|
1318
|
+
if ((parsed.version === 2 || parsed.version === 3) && Array.isArray(parsed.entries)) {
|
|
1319
|
+
// It's a full MemoryStore — return the entries as-is
|
|
1320
|
+
return parsed.entries;
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
catch { /* not valid JSON — fall through to markdown parsing */ }
|
|
1324
|
+
}
|
|
1325
|
+
const sections = trimmedInput.split(/(?=^####\s)/m);
|
|
1326
|
+
const entries = [];
|
|
1327
|
+
for (const section of sections) {
|
|
1328
|
+
const trimmed = section.trim();
|
|
1329
|
+
if (!trimmed)
|
|
1330
|
+
continue;
|
|
1331
|
+
const dateMatch = trimmed.match(/^####\s*(\d{4}-\d{2}-\d{2})\s*\n([\s\S]*)$/);
|
|
1332
|
+
const createdAt = dateMatch ? new Date(dateMatch[1]).toISOString() : new Date().toISOString();
|
|
1333
|
+
const content = dateMatch ? dateMatch[2].trim() : trimmed;
|
|
1334
|
+
if (!content)
|
|
1335
|
+
continue;
|
|
1336
|
+
entries.push({
|
|
1337
|
+
id: randomUUID(),
|
|
1338
|
+
category: this.inferCategory(content),
|
|
1339
|
+
content,
|
|
1340
|
+
createdAt,
|
|
1341
|
+
updatedAt: createdAt,
|
|
1342
|
+
lastRecalledAt: null,
|
|
1343
|
+
recallCount: 0,
|
|
1344
|
+
archived: false,
|
|
1345
|
+
});
|
|
1346
|
+
}
|
|
1347
|
+
// If no #### sections found, treat the whole thing as one entry
|
|
1348
|
+
if (entries.length === 0 && trimmedInput) {
|
|
1349
|
+
entries.push({
|
|
1350
|
+
id: randomUUID(),
|
|
1351
|
+
category: this.inferCategory(trimmedInput),
|
|
1352
|
+
content: trimmedInput,
|
|
1353
|
+
createdAt: new Date().toISOString(),
|
|
1354
|
+
updatedAt: new Date().toISOString(),
|
|
1355
|
+
lastRecalledAt: null,
|
|
1356
|
+
recallCount: 0,
|
|
1357
|
+
archived: false,
|
|
1358
|
+
});
|
|
1359
|
+
}
|
|
1360
|
+
return entries;
|
|
1361
|
+
}
|
|
1362
|
+
/**
|
|
1363
|
+
* Fix corrupt entries where content is a JSON store blob.
|
|
1364
|
+
* Replaces them with the actual entries from inside the blob.
|
|
1365
|
+
* Returns true if any entries were fixed.
|
|
1366
|
+
*/
|
|
1367
|
+
cleanBlobEntries(store) {
|
|
1368
|
+
let changed = false;
|
|
1369
|
+
const toRemove = [];
|
|
1370
|
+
const toAdd = [];
|
|
1371
|
+
for (let i = 0; i < store.entries.length; i++) {
|
|
1372
|
+
const entry = store.entries[i];
|
|
1373
|
+
if (entry.content.startsWith('{"version":')) {
|
|
1374
|
+
try {
|
|
1375
|
+
const blob = JSON.parse(entry.content);
|
|
1376
|
+
if ((blob.version === 2 || blob.version === 3) && Array.isArray(blob.entries)) {
|
|
1377
|
+
toRemove.push(i);
|
|
1378
|
+
// Extract real entries, skip duplicates already in store
|
|
1379
|
+
const existingIds = new Set(store.entries.map(e => e.id));
|
|
1380
|
+
for (const blobEntry of blob.entries) {
|
|
1381
|
+
if (!existingIds.has(blobEntry.id)) {
|
|
1382
|
+
toAdd.push(blobEntry);
|
|
1383
|
+
existingIds.add(blobEntry.id);
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
changed = true;
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
catch { /* not JSON — leave it */ }
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
// Remove corrupt entries (reverse order to preserve indices)
|
|
1393
|
+
for (const idx of toRemove.reverse()) {
|
|
1394
|
+
store.entries.splice(idx, 1);
|
|
1395
|
+
}
|
|
1396
|
+
// Add extracted entries
|
|
1397
|
+
store.entries.push(...toAdd);
|
|
1398
|
+
if (changed) {
|
|
1399
|
+
store.lastModified = new Date().toISOString();
|
|
1400
|
+
}
|
|
1401
|
+
return changed;
|
|
1402
|
+
}
|
|
1403
|
+
/** Infer a category from content using keyword heuristics. */
|
|
1404
|
+
inferCategory(content) {
|
|
1405
|
+
const lower = content.toLowerCase();
|
|
1406
|
+
if (/\b(bug|fix|error|crash|issue|broken|regression)\b/.test(lower))
|
|
1407
|
+
return 'bug-fix';
|
|
1408
|
+
if (/\b(prefer|always use|never use|style|workflow)\b/.test(lower))
|
|
1409
|
+
return 'preference';
|
|
1410
|
+
if (/\b(architecture|structure|design|pattern|layout|monorepo)\b/.test(lower))
|
|
1411
|
+
return 'architecture';
|
|
1412
|
+
if (/\b(convention|naming|format|lint|rule)\b/.test(lower))
|
|
1413
|
+
return 'convention';
|
|
1414
|
+
if (/\b(config|setup|install|environment|tool|setting)\b/.test(lower))
|
|
1415
|
+
return 'tool-config';
|
|
1416
|
+
if (/\b(decided|decision|chose|agreed|went with)\b/.test(lower))
|
|
1417
|
+
return 'decision';
|
|
1418
|
+
if (/\b(pattern|approach|technique|method|strategy)\b/.test(lower))
|
|
1419
|
+
return 'pattern';
|
|
1420
|
+
return 'general';
|
|
1421
|
+
}
|
|
1422
|
+
// ── Private — Conflict Detection (TF-IDF enhanced) ─────────────────────────
|
|
1423
|
+
/** Find an existing entry that conflicts with new content using TF-IDF similarity. */
|
|
1424
|
+
findConflict(store, index, newContent, category, customThreshold) {
|
|
1425
|
+
const threshold = customThreshold ?? CONFLICT_TFIDF_THRESHOLD;
|
|
1426
|
+
// Only check active entries in the same category
|
|
1427
|
+
for (const entry of store.entries) {
|
|
1428
|
+
if (entry.archived)
|
|
1429
|
+
continue;
|
|
1430
|
+
if (category && entry.category !== category)
|
|
1431
|
+
continue;
|
|
1432
|
+
// TF-IDF similarity check
|
|
1433
|
+
const similarity = index.similarityToText(entry.id, newContent);
|
|
1434
|
+
if (similarity > threshold)
|
|
1435
|
+
return entry;
|
|
1436
|
+
// First-line exact match fallback (catches renamed/reformatted entries)
|
|
1437
|
+
const newFirstLine = newContent.toLowerCase().split('\n')[0].trim();
|
|
1438
|
+
const existingFirstLine = entry.content.toLowerCase().split('\n')[0].trim();
|
|
1439
|
+
if (newFirstLine.length > 10 && newFirstLine === existingFirstLine)
|
|
1440
|
+
return entry;
|
|
1441
|
+
}
|
|
1442
|
+
return null;
|
|
1443
|
+
}
|
|
1444
|
+
// ── Private — Filtering ────────────────────────────────────────────────────
|
|
1445
|
+
/** Filter entries to active (non-archived), optionally respecting branch scope. */
|
|
1446
|
+
filterActive(entries, branch) {
|
|
1447
|
+
return entries.filter(e => {
|
|
1448
|
+
if (e.archived)
|
|
1449
|
+
return false;
|
|
1450
|
+
// If entry is branch-scoped, only include if branch matches
|
|
1451
|
+
if (e.branch && branch && e.branch !== branch)
|
|
1452
|
+
return false;
|
|
1453
|
+
return true;
|
|
1454
|
+
});
|
|
1455
|
+
}
|
|
1456
|
+
// ── Private — Formatting ───────────────────────────────────────────────────
|
|
1457
|
+
/** Format entries for system prompt (compact, category-grouped). */
|
|
1458
|
+
formatEntriesForPrompt(entries) {
|
|
1459
|
+
const layerLabels = {
|
|
1460
|
+
person: 'About You',
|
|
1461
|
+
workflow: 'How You Work',
|
|
1462
|
+
project: 'This Project',
|
|
1463
|
+
};
|
|
1464
|
+
// Group by layer first, then category within each layer
|
|
1465
|
+
const byLayer = new Map();
|
|
1466
|
+
for (const entry of entries) {
|
|
1467
|
+
const layer = entry.layer ?? 'workflow';
|
|
1468
|
+
const list = byLayer.get(layer) ?? [];
|
|
1469
|
+
list.push(entry);
|
|
1470
|
+
byLayer.set(layer, list);
|
|
1471
|
+
}
|
|
1472
|
+
const parts = [];
|
|
1473
|
+
for (const layerKey of ['person', 'workflow', 'project']) {
|
|
1474
|
+
const layerEntries = byLayer.get(layerKey);
|
|
1475
|
+
if (!layerEntries || layerEntries.length === 0)
|
|
1476
|
+
continue;
|
|
1477
|
+
const items = layerEntries.map(e => {
|
|
1478
|
+
const stale = this.isStale(e) ? ' (stale)' : '';
|
|
1479
|
+
const branchTag = e.branch ? ` [${e.branch}]` : '';
|
|
1480
|
+
return `- [${e.category}] ${e.content}${branchTag}${stale}`;
|
|
1481
|
+
}).join('\n');
|
|
1482
|
+
parts.push(`**${layerLabels[layerKey] || layerKey}:**\n${items}`);
|
|
1483
|
+
}
|
|
1484
|
+
return parts.join('\n\n');
|
|
1485
|
+
}
|
|
1486
|
+
/** Format entries as flat markdown (for v1 compat and human-readable mirror). */
|
|
1487
|
+
formatEntriesAsMarkdown(entries) {
|
|
1488
|
+
return entries.map(e => {
|
|
1489
|
+
const date = e.createdAt.split('T')[0];
|
|
1490
|
+
const branchTag = e.branch ? ` [branch: ${e.branch}]` : '';
|
|
1491
|
+
return `#### ${date}${branchTag}\n${e.content}`;
|
|
1492
|
+
}).join('\n\n');
|
|
1493
|
+
}
|
|
1494
|
+
/** Check if an entry is stale (not recalled in 90+ days). */
|
|
1495
|
+
isStale(entry) {
|
|
1496
|
+
const lastActivity = entry.lastRecalledAt ?? entry.updatedAt ?? entry.createdAt;
|
|
1497
|
+
const daysSince = (Date.now() - new Date(lastActivity).getTime()) / (1000 * 60 * 60 * 24);
|
|
1498
|
+
return daysSince > STALE_THRESHOLD_DAYS;
|
|
1499
|
+
}
|
|
1500
|
+
// ── Private — File I/O ─────────────────────────────────────────────────────
|
|
1501
|
+
/** Atomic write with lock: acquire lock → temp file → rename → release. */
|
|
1502
|
+
async writeSafe(path, content) {
|
|
1503
|
+
const { withLock } = await import('../core/file-lock.js');
|
|
1504
|
+
await withLock(path, async () => {
|
|
1505
|
+
const tmpPath = path + '.tmp';
|
|
1506
|
+
await writeFile(tmpPath, content, 'utf-8');
|
|
1507
|
+
try {
|
|
1508
|
+
await rename(tmpPath, path);
|
|
1509
|
+
}
|
|
1510
|
+
catch (err) {
|
|
1511
|
+
await unlink(tmpPath).catch(() => { });
|
|
1512
|
+
throw err;
|
|
1513
|
+
}
|
|
1514
|
+
});
|
|
1515
|
+
}
|
|
1516
|
+
/** Set the localOnly flag at runtime (e.g. when user toggles the setting). */
|
|
1517
|
+
setLocalOnly(value) {
|
|
1518
|
+
this.localOnly = value;
|
|
1519
|
+
}
|
|
1520
|
+
/**
|
|
1521
|
+
* Fire-and-forget sync entries to platform. Never throws.
|
|
1522
|
+
*
|
|
1523
|
+
* Schedules a debounced sync — multiple calls in quick succession (e.g.
|
|
1524
|
+
* the Memory Agent saving 5 entries in a loop) coalesce into a single
|
|
1525
|
+
* sync 2 seconds after the last mutation. This eliminates the 5x parallel
|
|
1526
|
+
* racing-syncs flood that was saturating the client's HTTP connection
|
|
1527
|
+
* pool and stalling the LLM stream.
|
|
1528
|
+
*
|
|
1529
|
+
* The `entries` parameter is intentionally ignored — the actual sync
|
|
1530
|
+
* reads the latest store at execution time so we always push current
|
|
1531
|
+
* state, never stale snapshots.
|
|
1532
|
+
*/
|
|
1533
|
+
syncEntries(scope, _entries) {
|
|
1534
|
+
if (!this.sync || this.localOnly)
|
|
1535
|
+
return;
|
|
1536
|
+
this.scheduleSync(scope);
|
|
1537
|
+
}
|
|
1538
|
+
/** Coalesce sync calls into a debounced execution per scope. */
|
|
1539
|
+
scheduleSync(scope) {
|
|
1540
|
+
const existing = this.syncTimers.get(scope);
|
|
1541
|
+
if (existing)
|
|
1542
|
+
clearTimeout(existing);
|
|
1543
|
+
const timer = setTimeout(() => {
|
|
1544
|
+
this.syncTimers.delete(scope);
|
|
1545
|
+
void this.runSync(scope);
|
|
1546
|
+
}, this.SYNC_DEBOUNCE_MS);
|
|
1547
|
+
this.syncTimers.set(scope, timer);
|
|
1548
|
+
}
|
|
1549
|
+
/**
|
|
1550
|
+
* Execute one sync for a scope. If a sync is already in flight, mark the
|
|
1551
|
+
* scope dirty so the running sync schedules another pass when it finishes.
|
|
1552
|
+
* Reads the latest store at execution time so we always push current state.
|
|
1553
|
+
*/
|
|
1554
|
+
async runSync(scope) {
|
|
1555
|
+
if (!this.sync)
|
|
1556
|
+
return;
|
|
1557
|
+
// In-flight guard — coalesce with any sync already running
|
|
1558
|
+
if (this.syncInFlight.has(scope)) {
|
|
1559
|
+
this.syncDirty.add(scope);
|
|
1560
|
+
return;
|
|
1561
|
+
}
|
|
1562
|
+
this.syncInFlight.add(scope);
|
|
1563
|
+
this.syncDirty.delete(scope);
|
|
1564
|
+
try {
|
|
1565
|
+
const store = scope === 'global'
|
|
1566
|
+
? await this.loadGlobalStore()
|
|
1567
|
+
: await this.loadProjectStore();
|
|
1568
|
+
if (!store)
|
|
1569
|
+
return;
|
|
1570
|
+
const entries = store.entries;
|
|
1571
|
+
console.info(`[memory] Syncing ${entries.length} ${scope} entries to platform`);
|
|
1572
|
+
await this.sync.pushEntries(scope, entries.map((e) => ({
|
|
1573
|
+
id: e.id,
|
|
1574
|
+
content: e.content,
|
|
1575
|
+
category: e.category,
|
|
1576
|
+
tags: e.tags,
|
|
1577
|
+
archived: e.archived,
|
|
1578
|
+
})));
|
|
1579
|
+
console.info(`[memory] Platform sync complete for ${scope} (${entries.length} entries)`);
|
|
1580
|
+
}
|
|
1581
|
+
catch (err) {
|
|
1582
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1583
|
+
console.warn(`[memory] Platform sync failed for ${scope}: ${msg}`);
|
|
1584
|
+
}
|
|
1585
|
+
finally {
|
|
1586
|
+
this.syncInFlight.delete(scope);
|
|
1587
|
+
// If anything got marked dirty during the sync, schedule another pass
|
|
1588
|
+
// through the debounce so we coalesce subsequent dirty marks too.
|
|
1589
|
+
if (this.syncDirty.has(scope)) {
|
|
1590
|
+
this.syncDirty.delete(scope);
|
|
1591
|
+
this.scheduleSync(scope);
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
// ── Project Registry ────────────────────────────────────────────────────────
|
|
1596
|
+
/** Register the current project in the global project registry. */
|
|
1597
|
+
async registerProject(projectRoot) {
|
|
1598
|
+
const registryPath = join(this.globalDir, PROJECTS_REGISTRY);
|
|
1599
|
+
let registry = [];
|
|
1600
|
+
try {
|
|
1601
|
+
const data = await readFile(registryPath, 'utf-8');
|
|
1602
|
+
registry = JSON.parse(data);
|
|
1603
|
+
}
|
|
1604
|
+
catch {
|
|
1605
|
+
// No registry yet or corrupt — start fresh
|
|
1606
|
+
}
|
|
1607
|
+
const existing = registry.findIndex(p => p.path === projectRoot);
|
|
1608
|
+
const entry = {
|
|
1609
|
+
path: projectRoot,
|
|
1610
|
+
name: basename(projectRoot),
|
|
1611
|
+
lastUsed: new Date().toISOString(),
|
|
1612
|
+
};
|
|
1613
|
+
if (existing >= 0) {
|
|
1614
|
+
registry[existing] = entry;
|
|
1615
|
+
}
|
|
1616
|
+
else {
|
|
1617
|
+
registry.push(entry);
|
|
1618
|
+
}
|
|
1619
|
+
await mkdir(this.globalDir, { recursive: true });
|
|
1620
|
+
await this.writeSafe(registryPath, JSON.stringify(registry, null, 2));
|
|
1621
|
+
}
|
|
1622
|
+
/** Load the project registry — all known project paths. */
|
|
1623
|
+
async loadProjectRegistry() {
|
|
1624
|
+
try {
|
|
1625
|
+
const data = await readFile(join(this.globalDir, PROJECTS_REGISTRY), 'utf-8');
|
|
1626
|
+
return JSON.parse(data);
|
|
1627
|
+
}
|
|
1628
|
+
catch {
|
|
1629
|
+
return [];
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
//# sourceMappingURL=memory-manager.js.map
|