agent-nuvira 2.7.2 → 3.0.0
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/agents/agents/writer-tool-calling.d.ts +14 -0
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +20 -0
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +15 -4
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/edit-module.d.ts +7 -0
- package/dist/agents/edit-module.d.ts.map +1 -1
- package/dist/agents/edit-module.js +21 -6
- package/dist/agents/edit-module.js.map +1 -1
- package/dist/agents/orchestrator.d.ts +40 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +116 -27
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/tool-calling-agent.d.ts +19 -0
- package/dist/agents/tool-calling-agent.d.ts.map +1 -1
- package/dist/agents/tool-calling-agent.js +42 -2
- package/dist/agents/tool-calling-agent.js.map +1 -1
- package/dist/auth-api.d.ts +2 -0
- package/dist/auth-api.d.ts.map +1 -0
- package/dist/auth-api.js +61 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/auth.test.d.ts +1 -0
- package/dist/auth.test.d.ts.map +1 -0
- package/dist/auth.test.js +3 -0
- package/dist/auth.test.js.map +1 -0
- package/dist/cli/chat.d.ts +66 -1
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +323 -77
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts +6 -0
- package/dist/cli/cli-program.d.ts.map +1 -0
- package/dist/cli/cli-program.js +222 -0
- package/dist/cli/cli-program.js.map +1 -0
- package/dist/cli/edit.d.ts.map +1 -1
- package/dist/cli/edit.js +18 -3
- package/dist/cli/edit.js.map +1 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +29 -5
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/failover-runner.d.ts +13 -0
- package/dist/cli/failover-runner.d.ts.map +1 -1
- package/dist/cli/failover-runner.js +11 -0
- package/dist/cli/failover-runner.js.map +1 -1
- package/dist/cli/gateway.d.ts +16 -0
- package/dist/cli/gateway.d.ts.map +1 -1
- package/dist/cli/gateway.js +108 -2
- package/dist/cli/gateway.js.map +1 -1
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +296 -20
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +20 -6
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/process-control.d.ts +10 -0
- package/dist/cli/process-control.d.ts.map +1 -1
- package/dist/cli/process-control.js +73 -7
- package/dist/cli/process-control.js.map +1 -1
- package/dist/cli/router.d.ts +16 -5
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +31 -206
- package/dist/cli/router.js.map +1 -1
- package/dist/config/paths.d.ts +23 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +30 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/provider-env.d.ts +37 -0
- package/dist/config/provider-env.d.ts.map +1 -0
- package/dist/config/provider-env.js +86 -0
- package/dist/config/provider-env.js.map +1 -0
- package/dist/context/history.d.ts.map +1 -1
- package/dist/context/history.js +24 -8
- package/dist/context/history.js.map +1 -1
- package/dist/context/session-recall.d.ts +30 -0
- package/dist/context/session-recall.d.ts.map +1 -1
- package/dist/context/session-recall.js +61 -0
- package/dist/context/session-recall.js.map +1 -1
- package/dist/file.js +0 -1
- package/dist/file.js.map +1 -1
- package/dist/gateway/adapters.d.ts +10 -0
- package/dist/gateway/adapters.d.ts.map +1 -1
- package/dist/gateway/adapters.js +4 -1
- package/dist/gateway/adapters.js.map +1 -1
- package/dist/gateway/dedup.d.ts +105 -0
- package/dist/gateway/dedup.d.ts.map +1 -0
- package/dist/gateway/dedup.js +160 -0
- package/dist/gateway/dedup.js.map +1 -0
- package/dist/gateway/heartbeat.d.ts +99 -0
- package/dist/gateway/heartbeat.d.ts.map +1 -0
- package/dist/gateway/heartbeat.js +122 -0
- package/dist/gateway/heartbeat.js.map +1 -0
- package/dist/gateway/inbox.d.ts +14 -1
- package/dist/gateway/inbox.d.ts.map +1 -1
- package/dist/gateway/inbox.js.map +1 -1
- package/dist/gateway/platform-config.d.ts +5 -0
- package/dist/gateway/platform-config.d.ts.map +1 -1
- package/dist/gateway/platform-config.js +8 -13
- package/dist/gateway/platform-config.js.map +1 -1
- package/dist/gateway/registry.d.ts +65 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +307 -32
- package/dist/gateway/registry.js.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts +11 -1
- package/dist/gateway/whatsapp/baileys-bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/baileys-bridge.js +64 -1
- package/dist/gateway/whatsapp/baileys-bridge.js.map +1 -1
- package/dist/gateway/whatsapp/bridge.d.ts +4 -2
- package/dist/gateway/whatsapp/bridge.d.ts.map +1 -1
- package/dist/gateway/whatsapp/bridge.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/inference/factory.d.ts +16 -0
- package/dist/inference/factory.d.ts.map +1 -1
- package/dist/inference/factory.js +42 -0
- package/dist/inference/factory.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +3 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/interface.d.ts +12 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/local-adapter.d.ts +2 -0
- package/dist/inference/local-adapter.d.ts.map +1 -1
- package/dist/inference/local-adapter.js +36 -5
- package/dist/inference/local-adapter.js.map +1 -1
- package/dist/inference/model-catalog.d.ts +8 -0
- package/dist/inference/model-catalog.d.ts.map +1 -1
- package/dist/inference/model-catalog.js +40 -0
- package/dist/inference/model-catalog.js.map +1 -1
- package/dist/inference/model-probe.d.ts +7 -0
- package/dist/inference/model-probe.d.ts.map +1 -1
- package/dist/inference/model-probe.js +25 -7
- package/dist/inference/model-probe.js.map +1 -1
- package/dist/inference/native-tools.d.ts +8 -0
- package/dist/inference/native-tools.d.ts.map +1 -1
- package/dist/inference/native-tools.js +14 -3
- package/dist/inference/native-tools.js.map +1 -1
- package/dist/inference/tool-call-utils.d.ts +66 -7
- package/dist/inference/tool-call-utils.d.ts.map +1 -1
- package/dist/inference/tool-call-utils.js +134 -13
- package/dist/inference/tool-call-utils.js.map +1 -1
- package/dist/learning/auto-router.d.ts +21 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +282 -21
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-budget.d.ts +133 -0
- package/dist/learning/context-budget.d.ts.map +1 -0
- package/dist/learning/context-budget.js +196 -0
- package/dist/learning/context-budget.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -1
- package/dist/learning/cost-tracker.js +20 -8
- package/dist/learning/cost-tracker.js.map +1 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +6 -2
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/failure-bookkeeping.d.ts +41 -0
- package/dist/learning/failure-bookkeeping.d.ts.map +1 -1
- package/dist/learning/failure-bookkeeping.js +122 -4
- package/dist/learning/failure-bookkeeping.js.map +1 -1
- package/dist/learning/feedback.d.ts.map +1 -1
- package/dist/learning/feedback.js +19 -8
- package/dist/learning/feedback.js.map +1 -1
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +5 -11
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-harness.d.ts +76 -0
- package/dist/learning/model-harness.d.ts.map +1 -0
- package/dist/learning/model-harness.js +119 -0
- package/dist/learning/model-harness.js.map +1 -0
- package/dist/learning/model-registry.d.ts +29 -0
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +129 -3
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/model-scoring.d.ts.map +1 -1
- package/dist/learning/model-scoring.js +6 -1
- package/dist/learning/model-scoring.js.map +1 -1
- package/dist/learning/model-selection.d.ts +15 -0
- package/dist/learning/model-selection.d.ts.map +1 -1
- package/dist/learning/model-selection.js +40 -1
- package/dist/learning/model-selection.js.map +1 -1
- package/dist/learning/provider-fallback.d.ts +12 -0
- package/dist/learning/provider-fallback.d.ts.map +1 -1
- package/dist/learning/provider-fallback.js +84 -0
- package/dist/learning/provider-fallback.js.map +1 -1
- package/dist/learning/provider-revival.d.ts +106 -0
- package/dist/learning/provider-revival.d.ts.map +1 -0
- package/dist/learning/provider-revival.js +154 -0
- package/dist/learning/provider-revival.js.map +1 -0
- package/dist/learning/quota-ledger.d.ts +64 -3
- package/dist/learning/quota-ledger.d.ts.map +1 -1
- package/dist/learning/quota-ledger.js +122 -9
- package/dist/learning/quota-ledger.js.map +1 -1
- package/dist/learning/resilient-call.d.ts +98 -0
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +252 -46
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/nlu/conversation-gate.d.ts +37 -0
- package/dist/nlu/conversation-gate.d.ts.map +1 -1
- package/dist/nlu/conversation-gate.js +49 -0
- package/dist/nlu/conversation-gate.js.map +1 -1
- package/dist/nlu/schema.d.ts +4 -4
- package/dist/observability/dag-bridge.d.ts +69 -0
- package/dist/observability/dag-bridge.d.ts.map +1 -0
- package/dist/observability/dag-bridge.js +56 -0
- package/dist/observability/dag-bridge.js.map +1 -0
- package/dist/observability/event-bus.d.ts +5 -10
- package/dist/observability/event-bus.d.ts.map +1 -1
- package/dist/observability/event-bus.js +10 -42
- package/dist/observability/event-bus.js.map +1 -1
- package/dist/routes/auth.d.ts +3 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +41 -36
- package/dist/routes/auth.js.map +1 -0
- package/dist/skills/execution-audit.d.ts.map +1 -1
- package/dist/skills/execution-audit.js +17 -5
- package/dist/skills/execution-audit.js.map +1 -1
- package/dist/skills/sandbox-executor.d.ts +12 -1
- package/dist/skills/sandbox-executor.d.ts.map +1 -1
- package/dist/skills/sandbox-executor.js +28 -6
- package/dist/skills/sandbox-executor.js.map +1 -1
- package/dist/skills/secret-capture.d.ts +45 -1
- package/dist/skills/secret-capture.d.ts.map +1 -1
- package/dist/skills/secret-capture.js +82 -19
- package/dist/skills/secret-capture.js.map +1 -1
- package/dist/skills/skill-env-inventory.d.ts +79 -0
- package/dist/skills/skill-env-inventory.d.ts.map +1 -0
- package/dist/skills/skill-env-inventory.js +167 -0
- package/dist/skills/skill-env-inventory.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +2 -0
- package/dist/skills/skill-executor.d.ts.map +1 -1
- package/dist/skills/skill-executor.js +19 -24
- package/dist/skills/skill-executor.js.map +1 -1
- package/dist/tools/ask-user.d.ts +14 -1
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +25 -1
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/followup-utils.d.ts +64 -0
- package/dist/tools/followup-utils.d.ts.map +1 -0
- package/dist/tools/followup-utils.js +158 -0
- package/dist/tools/followup-utils.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +35 -0
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +76 -0
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/pipeline-tool.d.ts.map +1 -1
- package/dist/tools/pipeline-tool.js +8 -3
- package/dist/tools/pipeline-tool.js.map +1 -1
- package/dist/tools/registry.d.ts +25 -12
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +31 -6
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/skill-tool.d.ts.map +1 -1
- package/dist/tools/skill-tool.js +52 -5
- package/dist/tools/skill-tool.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +63 -1
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +305 -66
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.d.ts +19 -3
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +21 -5
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/utils/env.d.ts.map +1 -1
- package/dist/utils/env.js +9 -13
- package/dist/utils/env.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +13 -1
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +16 -2
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/hub-data.d.ts +2 -0
- package/dist/web-dashboard/hub-data.d.ts.map +1 -1
- package/dist/web-dashboard/hub-data.js +4 -0
- package/dist/web-dashboard/hub-data.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +6 -0
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +196 -3
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +31 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/package.json +11 -1
- package/src/web-dashboard/public/assets/index-56yPnN_m.js +207 -0
- package/src/web-dashboard/public/assets/index-56yPnN_m.js.map +1 -0
- package/src/web-dashboard/public/assets/{index-C507EUWf.css → index-Cyd6tIew.css} +1 -1
- package/src/web-dashboard/public/index.html +2 -2
- package/dist/example.d.ts +0 -1
- package/dist/example.d.ts.map +0 -1
- package/dist/example.js +0 -3
- package/dist/example.js.map +0 -1
- package/dist/fresh.d.ts +0 -2
- package/dist/fresh.d.ts.map +0 -1
- package/dist/fresh.js +0 -2
- package/dist/fresh.js.map +0 -1
- package/dist/mcp/mcp-dashboard-oauth.d.ts +0 -94
- package/dist/mcp/mcp-dashboard-oauth.d.ts.map +0 -1
- package/dist/mcp/mcp-dashboard-oauth.js +0 -140
- package/dist/mcp/mcp-dashboard-oauth.js.map +0 -1
- package/dist/memory/background-sync.d.ts +0 -107
- package/dist/memory/background-sync.d.ts.map +0 -1
- package/dist/memory/background-sync.js +0 -242
- package/dist/memory/background-sync.js.map +0 -1
- package/dist/memory/cross-session.d.ts +0 -68
- package/dist/memory/cross-session.d.ts.map +0 -1
- package/dist/memory/cross-session.js +0 -153
- package/dist/memory/cross-session.js.map +0 -1
- package/dist/memory/drift-detector.d.ts +0 -76
- package/dist/memory/drift-detector.d.ts.map +0 -1
- package/dist/memory/drift-detector.js +0 -216
- package/dist/memory/drift-detector.js.map +0 -1
- package/dist/memory/enhanced-manager.d.ts +0 -105
- package/dist/memory/enhanced-manager.d.ts.map +0 -1
- package/dist/memory/enhanced-manager.js +0 -280
- package/dist/memory/enhanced-manager.js.map +0 -1
- package/dist/memory/session-extraction.d.ts +0 -93
- package/dist/memory/session-extraction.d.ts.map +0 -1
- package/dist/memory/session-extraction.js +0 -290
- package/dist/memory/session-extraction.js.map +0 -1
- package/dist/memory/sqlite-store.d.ts +0 -208
- package/dist/memory/sqlite-store.d.ts.map +0 -1
- package/dist/memory/sqlite-store.js +0 -556
- package/dist/memory/sqlite-store.js.map +0 -1
- package/dist/skills/daytona-executor.d.ts +0 -78
- package/dist/skills/daytona-executor.d.ts.map +0 -1
- package/dist/skills/daytona-executor.js +0 -256
- package/dist/skills/daytona-executor.js.map +0 -1
- package/dist/skills/modal-executor.d.ts +0 -81
- package/dist/skills/modal-executor.d.ts.map +0 -1
- package/dist/skills/modal-executor.js +0 -285
- package/dist/skills/modal-executor.js.map +0 -1
- package/dist/sync/inventory.d.ts +0 -1
- package/dist/sync/inventory.d.ts.map +0 -1
- package/dist/sync/inventory.js +0 -3
- package/dist/sync/inventory.js.map +0 -1
- package/dist/sync/validate.d.ts +0 -1
- package/dist/sync/validate.d.ts.map +0 -1
- package/dist/sync/validate.js +0 -3
- package/dist/sync/validate.js.map +0 -1
- package/dist/test.d.ts +0 -2
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -3
- package/dist/test.js.map +0 -1
- package/dist/tools/browser-tool.d.ts +0 -206
- package/dist/tools/browser-tool.d.ts.map +0 -1
- package/dist/tools/browser-tool.js +0 -726
- package/dist/tools/browser-tool.js.map +0 -1
- package/dist/tools/delegate-tool.d.ts +0 -109
- package/dist/tools/delegate-tool.d.ts.map +0 -1
- package/dist/tools/delegate-tool.js +0 -185
- package/dist/tools/delegate-tool.js.map +0 -1
- package/dist/tools/delegation-state.d.ts +0 -87
- package/dist/tools/delegation-state.d.ts.map +0 -1
- package/dist/tools/delegation-state.js +0 -278
- package/dist/tools/delegation-state.js.map +0 -1
- package/dist/tools/desktop-ui.d.ts +0 -148
- package/dist/tools/desktop-ui.d.ts.map +0 -1
- package/dist/tools/desktop-ui.js +0 -486
- package/dist/tools/desktop-ui.js.map +0 -1
- package/dist/tools/image-video-tool.d.ts +0 -88
- package/dist/tools/image-video-tool.d.ts.map +0 -1
- package/dist/tools/image-video-tool.js +0 -276
- package/dist/tools/image-video-tool.js.map +0 -1
- package/dist/tools/kanban-cron-tools.d.ts +0 -92
- package/dist/tools/kanban-cron-tools.d.ts.map +0 -1
- package/dist/tools/kanban-cron-tools.js +0 -197
- package/dist/tools/kanban-cron-tools.js.map +0 -1
- package/dist/tools/messaging-tool.d.ts +0 -127
- package/dist/tools/messaging-tool.d.ts.map +0 -1
- package/dist/tools/messaging-tool.js +0 -314
- package/dist/tools/messaging-tool.js.map +0 -1
- package/dist/tools/modality/generic-caller.d.ts +0 -43
- package/dist/tools/modality/generic-caller.d.ts.map +0 -1
- package/dist/tools/modality/generic-caller.js +0 -254
- package/dist/tools/modality/generic-caller.js.map +0 -1
- package/dist/tools/modality/modality-catalog.d.ts +0 -134
- package/dist/tools/modality/modality-catalog.d.ts.map +0 -1
- package/dist/tools/modality/modality-catalog.js +0 -445
- package/dist/tools/modality/modality-catalog.js.map +0 -1
- package/dist/tools/modality/tool-router.d.ts +0 -81
- package/dist/tools/modality/tool-router.d.ts.map +0 -1
- package/dist/tools/modality/tool-router.js +0 -84
- package/dist/tools/modality/tool-router.js.map +0 -1
- package/dist/tools/security-tools.d.ts +0 -107
- package/dist/tools/security-tools.d.ts.map +0 -1
- package/dist/tools/security-tools.js +0 -264
- package/dist/tools/security-tools.js.map +0 -1
- package/dist/tools/ssh-tool.d.ts +0 -130
- package/dist/tools/ssh-tool.d.ts.map +0 -1
- package/dist/tools/ssh-tool.js +0 -328
- package/dist/tools/ssh-tool.js.map +0 -1
- package/dist/tools/tts-tool.d.ts +0 -91
- package/dist/tools/tts-tool.d.ts.map +0 -1
- package/dist/tools/tts-tool.js +0 -406
- package/dist/tools/tts-tool.js.map +0 -1
- package/dist/utils/shell-detection.d.ts +0 -124
- package/dist/utils/shell-detection.d.ts.map +0 -1
- package/dist/utils/shell-detection.js +0 -305
- package/dist/utils/shell-detection.js.map +0 -1
- package/dist/utils/windows-paths.d.ts +0 -185
- package/dist/utils/windows-paths.d.ts.map +0 -1
- package/dist/utils/windows-paths.js +0 -472
- package/dist/utils/windows-paths.js.map +0 -1
- package/src/web-dashboard/public/assets/index-C4frng1Q.js +0 -207
- package/src/web-dashboard/public/assets/index-C4frng1Q.js.map +0 -1
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EnhancedMemoryManager — Memory manager with background sync.
|
|
3
|
-
*
|
|
4
|
-
* Extends the base MemoryManager with:
|
|
5
|
-
* - Background sync for zero-cost per-turn operations
|
|
6
|
-
* - Session-end extraction for fact distillation
|
|
7
|
-
* - Drift detection for memory file safety
|
|
8
|
-
* - Daemon thread management
|
|
9
|
-
*
|
|
10
|
-
* This is the recommended entry point for production use.
|
|
11
|
-
*/
|
|
12
|
-
import { EventEmitter } from 'events';
|
|
13
|
-
import { getMemoryManager } from './manager.js';
|
|
14
|
-
import { BackgroundSyncManager } from './background-sync.js';
|
|
15
|
-
import { SessionExtractionManager } from './session-extraction.js';
|
|
16
|
-
import { DriftDetector } from './drift-detector.js';
|
|
17
|
-
import { getSQLiteStore } from './sqlite-store.js';
|
|
18
|
-
import { getCrossSessionPersistence } from './cross-session.js';
|
|
19
|
-
import { logger } from '../utils/logger.js';
|
|
20
|
-
// ─── Enhanced Memory Manager ────────────────────────────────────────────────
|
|
21
|
-
export class EnhancedMemoryManager extends EventEmitter {
|
|
22
|
-
baseManager;
|
|
23
|
-
backgroundSync;
|
|
24
|
-
sessionExtraction;
|
|
25
|
-
driftDetector;
|
|
26
|
-
config;
|
|
27
|
-
metrics;
|
|
28
|
-
sessionId = null;
|
|
29
|
-
sqliteStore = null;
|
|
30
|
-
crossSession = null;
|
|
31
|
-
constructor(config) {
|
|
32
|
-
super();
|
|
33
|
-
this.config = {
|
|
34
|
-
enableBackgroundSync: config?.enableBackgroundSync ?? true,
|
|
35
|
-
enableDriftDetection: config?.enableDriftDetection ?? true,
|
|
36
|
-
enableSessionExtraction: config?.enableSessionExtraction ?? true,
|
|
37
|
-
enableSQLite: config?.enableSQLite ?? true,
|
|
38
|
-
syncConcurrency: config?.syncConcurrency ?? 3,
|
|
39
|
-
drainTimeoutMs: config?.drainTimeoutMs ?? 5000,
|
|
40
|
-
};
|
|
41
|
-
this.baseManager = getMemoryManager();
|
|
42
|
-
this.backgroundSync = new BackgroundSyncManager({
|
|
43
|
-
maxConcurrent: this.config.syncConcurrency,
|
|
44
|
-
drainTimeoutMs: this.config.drainTimeoutMs,
|
|
45
|
-
});
|
|
46
|
-
this.sessionExtraction = new SessionExtractionManager();
|
|
47
|
-
this.driftDetector = new DriftDetector();
|
|
48
|
-
// Initialize SQLite if enabled
|
|
49
|
-
if (this.config.enableSQLite) {
|
|
50
|
-
this.sqliteStore = getSQLiteStore();
|
|
51
|
-
this.crossSession = getCrossSessionPersistence();
|
|
52
|
-
}
|
|
53
|
-
this.metrics = {
|
|
54
|
-
turnsBuffered: 0,
|
|
55
|
-
factsExtracted: 0,
|
|
56
|
-
driftsDetected: 0,
|
|
57
|
-
backgroundTasksQueued: 0,
|
|
58
|
-
backgroundTasksCompleted: 0,
|
|
59
|
-
};
|
|
60
|
-
this.setupEventHandlers();
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Setup event handlers for background sync.
|
|
64
|
-
*/
|
|
65
|
-
setupEventHandlers() {
|
|
66
|
-
this.backgroundSync.on('task:completed', (event) => {
|
|
67
|
-
this.metrics.backgroundTasksCompleted++;
|
|
68
|
-
this.emit('sync:completed', event);
|
|
69
|
-
});
|
|
70
|
-
this.backgroundSync.on('task:failed', (event) => {
|
|
71
|
-
logger.debug(`Background sync task failed: ${event.error}`);
|
|
72
|
-
this.emit('sync:failed', event);
|
|
73
|
-
});
|
|
74
|
-
this.backgroundSync.on('task:execute', (task, resolve, reject) => {
|
|
75
|
-
this.executeSyncTask(task, resolve, reject);
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Begin a session.
|
|
80
|
-
*/
|
|
81
|
-
async startSession(sessionId) {
|
|
82
|
-
this.sessionId = sessionId;
|
|
83
|
-
await this.baseManager.startSession(sessionId);
|
|
84
|
-
// Load cross-session context if SQLite is enabled
|
|
85
|
-
if (this.crossSession) {
|
|
86
|
-
const context = await this.crossSession.loadSessionContext(sessionId);
|
|
87
|
-
this.emit('session:started', { sessionId, contextLoaded: true });
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
this.emit('session:started', { sessionId, contextLoaded: false });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Build memory block for a query.
|
|
95
|
-
*/
|
|
96
|
-
async buildMemoryBlock(query) {
|
|
97
|
-
return this.baseManager.buildMemoryBlock(query);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Record a completed user↔assistant turn (buffered, zero-cost).
|
|
101
|
-
*/
|
|
102
|
-
async recordTurn(userText, assistantText) {
|
|
103
|
-
// Buffer for session extraction
|
|
104
|
-
if (this.config.enableSessionExtraction) {
|
|
105
|
-
this.sessionExtraction.bufferTurn(userText, assistantText);
|
|
106
|
-
this.metrics.turnsBuffered++;
|
|
107
|
-
}
|
|
108
|
-
// Save to SQLite if enabled
|
|
109
|
-
if (this.sqliteStore && this.sessionId) {
|
|
110
|
-
const trajectoryId = `traj_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
111
|
-
this.sqliteStore.addTrajectory({
|
|
112
|
-
id: trajectoryId,
|
|
113
|
-
sessionId: this.sessionId,
|
|
114
|
-
userText,
|
|
115
|
-
assistantText,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
// Queue background sync
|
|
119
|
-
if (this.config.enableBackgroundSync) {
|
|
120
|
-
this.backgroundSync.enqueue({
|
|
121
|
-
type: 'sync',
|
|
122
|
-
data: { userText, assistantText, sessionId: this.sessionId },
|
|
123
|
-
priority: 0,
|
|
124
|
-
});
|
|
125
|
-
this.metrics.backgroundTasksQueued++;
|
|
126
|
-
}
|
|
127
|
-
// Record in base manager (best-effort)
|
|
128
|
-
await this.baseManager.recordTurn(userText, assistantText).catch(() => { });
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* End the session — flush buffered turns into durable facts.
|
|
132
|
-
*/
|
|
133
|
-
async endSession() {
|
|
134
|
-
const sid = this.sessionId;
|
|
135
|
-
if (!sid)
|
|
136
|
-
return null;
|
|
137
|
-
// Extract facts from buffered turns
|
|
138
|
-
if (this.config.enableSessionExtraction) {
|
|
139
|
-
const result = await this.sessionExtraction.extractAtSessionEnd();
|
|
140
|
-
this.metrics.factsExtracted += result.statistics.factsExtracted;
|
|
141
|
-
// Save extracted facts to SQLite
|
|
142
|
-
if (this.sqliteStore) {
|
|
143
|
-
for (const fact of result.facts) {
|
|
144
|
-
this.sqliteStore.addMemory({
|
|
145
|
-
id: `mem_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
146
|
-
content: fact.content,
|
|
147
|
-
type: fact.type,
|
|
148
|
-
tags: fact.tags,
|
|
149
|
-
source: fact.source,
|
|
150
|
-
confidence: fact.confidence,
|
|
151
|
-
sessionId: sid,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
// Save extracted patterns
|
|
155
|
-
for (const pattern of result.patterns) {
|
|
156
|
-
this.sqliteStore.upsertPattern({
|
|
157
|
-
id: `pat_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
158
|
-
pattern,
|
|
159
|
-
examples: [],
|
|
160
|
-
confidence: 0.5,
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
// Save extracted lessons
|
|
164
|
-
for (const lesson of result.lessons) {
|
|
165
|
-
this.sqliteStore.addLesson({
|
|
166
|
-
id: `les_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
167
|
-
lesson,
|
|
168
|
-
context: 'session-extraction',
|
|
169
|
-
severity: 'medium',
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
this.emit('session:extracted', result);
|
|
174
|
-
}
|
|
175
|
-
// Drain background sync queue
|
|
176
|
-
if (this.config.enableBackgroundSync) {
|
|
177
|
-
await this.backgroundSync.drain(this.config.drainTimeoutMs);
|
|
178
|
-
}
|
|
179
|
-
// End base session
|
|
180
|
-
const endedSid = await this.baseManager.endSession();
|
|
181
|
-
this.sessionId = null;
|
|
182
|
-
this.emit('session:ended', { sessionId: sid });
|
|
183
|
-
return endedSid;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Execute a sync task in background.
|
|
187
|
-
*/
|
|
188
|
-
async executeSyncTask(task, resolve, reject) {
|
|
189
|
-
try {
|
|
190
|
-
// Process the sync task
|
|
191
|
-
await this.baseManager.recordTurn(task.data.userText, task.data.assistantText);
|
|
192
|
-
resolve();
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
reject(err);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Add a memory with drift detection.
|
|
200
|
-
*/
|
|
201
|
-
async addMemoryWithDriftDetection(filePath, content) {
|
|
202
|
-
if (this.config.enableDriftDetection) {
|
|
203
|
-
// Check for drift
|
|
204
|
-
const driftCheck = this.driftDetector.checkDrift(filePath);
|
|
205
|
-
if (driftCheck.hasDrift) {
|
|
206
|
-
this.metrics.driftsDetected++;
|
|
207
|
-
this.emit('drift:detected', { path: filePath, driftCheck });
|
|
208
|
-
// Create backup
|
|
209
|
-
const backupPath = this.driftDetector.backup(filePath);
|
|
210
|
-
// Merge changes
|
|
211
|
-
const merged = this.driftDetector.merge(filePath, content, driftCheck.currentContent || '');
|
|
212
|
-
// Write merged content
|
|
213
|
-
const fs = await import('fs');
|
|
214
|
-
fs.writeFileSync(filePath, merged, 'utf-8');
|
|
215
|
-
return { success: true, driftDetected: true };
|
|
216
|
-
}
|
|
217
|
-
// Snapshot before write
|
|
218
|
-
this.driftDetector.snapshot(filePath);
|
|
219
|
-
}
|
|
220
|
-
// Write content
|
|
221
|
-
const fs = await import('fs');
|
|
222
|
-
fs.writeFileSync(filePath, content, 'utf-8');
|
|
223
|
-
return { success: true, driftDetected: false };
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Get metrics.
|
|
227
|
-
*/
|
|
228
|
-
getMetrics() {
|
|
229
|
-
return {
|
|
230
|
-
...this.metrics,
|
|
231
|
-
backgroundSync: this.backgroundSync.getMetrics(),
|
|
232
|
-
sqlite: this.sqliteStore?.getStats(),
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Get SQLite store.
|
|
237
|
-
*/
|
|
238
|
-
getSQLiteStore() {
|
|
239
|
-
return this.sqliteStore;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Get cross-session persistence.
|
|
243
|
-
*/
|
|
244
|
-
getCrossSession() {
|
|
245
|
-
return this.crossSession;
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Get background sync manager.
|
|
249
|
-
*/
|
|
250
|
-
getBackgroundSync() {
|
|
251
|
-
return this.backgroundSync;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Get drift detector.
|
|
255
|
-
*/
|
|
256
|
-
getDriftDetector() {
|
|
257
|
-
return this.driftDetector;
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Shutdown gracefully.
|
|
261
|
-
*/
|
|
262
|
-
async shutdown() {
|
|
263
|
-
await this.backgroundSync.shutdown();
|
|
264
|
-
this.removeAllListeners();
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
// ─── Singleton ──────────────────────────────────────────────────────────────
|
|
268
|
-
let _instance = null;
|
|
269
|
-
export function getEnhancedMemoryManager() {
|
|
270
|
-
if (!_instance)
|
|
271
|
-
_instance = new EnhancedMemoryManager();
|
|
272
|
-
return _instance;
|
|
273
|
-
}
|
|
274
|
-
export function resetEnhancedMemoryManager() {
|
|
275
|
-
if (_instance) {
|
|
276
|
-
_instance.shutdown();
|
|
277
|
-
_instance = null;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
//# sourceMappingURL=enhanced-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-manager.js","sourceRoot":"","sources":["../../src/memory/enhanced-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SessionExtraction — Extract facts from buffered turns at session end.
|
|
3
|
-
*
|
|
4
|
-
* Distills conversation turns into durable facts, patterns, and lessons.
|
|
5
|
-
* Uses rules + optional LLM for extraction.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Rule-based extraction (no LLM required)
|
|
9
|
-
* - LLM-enhanced extraction (optional)
|
|
10
|
-
* - Pattern detection
|
|
11
|
-
* - Lesson extraction
|
|
12
|
-
* - Confidence scoring
|
|
13
|
-
*/
|
|
14
|
-
import { type MemoryStore } from '../tools/memory-tools.js';
|
|
15
|
-
interface ExtractedFact {
|
|
16
|
-
content: string;
|
|
17
|
-
type: 'fact' | 'preference' | 'lesson' | 'observation' | 'pattern';
|
|
18
|
-
confidence: number;
|
|
19
|
-
source: string;
|
|
20
|
-
tags: string[];
|
|
21
|
-
}
|
|
22
|
-
interface ExtractionResult {
|
|
23
|
-
facts: ExtractedFact[];
|
|
24
|
-
patterns: string[];
|
|
25
|
-
lessons: string[];
|
|
26
|
-
statistics: {
|
|
27
|
-
turnsProcessed: number;
|
|
28
|
-
factsExtracted: number;
|
|
29
|
-
patternsDetected: number;
|
|
30
|
-
lessonsLearned: number;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
export declare class SessionExtractionManager {
|
|
34
|
-
private memoryStore;
|
|
35
|
-
private bufferedTurns;
|
|
36
|
-
private maxBufferedTurns;
|
|
37
|
-
constructor(memoryStore?: MemoryStore);
|
|
38
|
-
/**
|
|
39
|
-
* Buffer a conversation turn.
|
|
40
|
-
*/
|
|
41
|
-
bufferTurn(userText: string, assistantText: string): void;
|
|
42
|
-
/**
|
|
43
|
-
* Extract facts from buffered turns at session end.
|
|
44
|
-
*/
|
|
45
|
-
extractAtSessionEnd(): Promise<ExtractionResult>;
|
|
46
|
-
/**
|
|
47
|
-
* Extract facts from a single turn.
|
|
48
|
-
*/
|
|
49
|
-
private extractFromTurn;
|
|
50
|
-
/**
|
|
51
|
-
* Extract preference from user text.
|
|
52
|
-
*/
|
|
53
|
-
private extractPreference;
|
|
54
|
-
/**
|
|
55
|
-
* Extract project fact from conversation.
|
|
56
|
-
*/
|
|
57
|
-
private extractProjectFact;
|
|
58
|
-
/**
|
|
59
|
-
* Extract lesson from assistant text.
|
|
60
|
-
*/
|
|
61
|
-
private extractLesson;
|
|
62
|
-
/**
|
|
63
|
-
* Check if this is a repeated action.
|
|
64
|
-
*/
|
|
65
|
-
private isRepeatedAction;
|
|
66
|
-
/**
|
|
67
|
-
* Extract pattern from turn.
|
|
68
|
-
*/
|
|
69
|
-
private extractPattern;
|
|
70
|
-
/**
|
|
71
|
-
* Extract topic from text.
|
|
72
|
-
*/
|
|
73
|
-
private extractTopic;
|
|
74
|
-
/**
|
|
75
|
-
* Extract observation from text.
|
|
76
|
-
*/
|
|
77
|
-
private extractObservation;
|
|
78
|
-
/**
|
|
79
|
-
* Detect cross-turn patterns.
|
|
80
|
-
*/
|
|
81
|
-
private detectCrossTurnPatterns;
|
|
82
|
-
/**
|
|
83
|
-
* Get buffered turn count.
|
|
84
|
-
*/
|
|
85
|
-
getBufferedTurnCount(): number;
|
|
86
|
-
/**
|
|
87
|
-
* Clear buffer.
|
|
88
|
-
*/
|
|
89
|
-
clearBuffer(): void;
|
|
90
|
-
}
|
|
91
|
-
export declare function getSessionExtractionManager(): SessionExtractionManager;
|
|
92
|
-
export {};
|
|
93
|
-
//# sourceMappingURL=session-extraction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-extraction.d.ts","sourceRoot":"","sources":["../../src/memory/session-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAU5E,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAID,qBAAa,wBAAwB;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,gBAAgB,CAAM;gBAElB,WAAW,CAAC,EAAE,WAAW;IAIrC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAazD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2CtD;;OAEG;IACH,OAAO,CAAC,eAAe;IAuEvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,WAAW,IAAI,IAAI;CAGpB;AAMD,wBAAgB,2BAA2B,IAAI,wBAAwB,CAGtE"}
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SessionExtraction — Extract facts from buffered turns at session end.
|
|
3
|
-
*
|
|
4
|
-
* Distills conversation turns into durable facts, patterns, and lessons.
|
|
5
|
-
* Uses rules + optional LLM for extraction.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Rule-based extraction (no LLM required)
|
|
9
|
-
* - LLM-enhanced extraction (optional)
|
|
10
|
-
* - Pattern detection
|
|
11
|
-
* - Lesson extraction
|
|
12
|
-
* - Confidence scoring
|
|
13
|
-
*/
|
|
14
|
-
import { getMemoryStore } from '../tools/memory-tools.js';
|
|
15
|
-
// ─── Session Extraction Manager ─────────────────────────────────────────────
|
|
16
|
-
export class SessionExtractionManager {
|
|
17
|
-
memoryStore;
|
|
18
|
-
bufferedTurns = [];
|
|
19
|
-
maxBufferedTurns = 50;
|
|
20
|
-
constructor(memoryStore) {
|
|
21
|
-
this.memoryStore = memoryStore || getMemoryStore();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Buffer a conversation turn.
|
|
25
|
-
*/
|
|
26
|
-
bufferTurn(userText, assistantText) {
|
|
27
|
-
this.bufferedTurns.push({
|
|
28
|
-
userText,
|
|
29
|
-
assistantText,
|
|
30
|
-
timestamp: Date.now(),
|
|
31
|
-
});
|
|
32
|
-
// Keep buffer bounded
|
|
33
|
-
if (this.bufferedTurns.length > this.maxBufferedTurns) {
|
|
34
|
-
this.bufferedTurns = this.bufferedTurns.slice(-this.maxBufferedTurns);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Extract facts from buffered turns at session end.
|
|
39
|
-
*/
|
|
40
|
-
async extractAtSessionEnd() {
|
|
41
|
-
const turns = [...this.bufferedTurns];
|
|
42
|
-
this.bufferedTurns = [];
|
|
43
|
-
const facts = [];
|
|
44
|
-
const patterns = [];
|
|
45
|
-
const lessons = [];
|
|
46
|
-
// Rule-based extraction
|
|
47
|
-
for (const turn of turns) {
|
|
48
|
-
const extracted = this.extractFromTurn(turn);
|
|
49
|
-
facts.push(...extracted.facts);
|
|
50
|
-
patterns.push(...extracted.patterns);
|
|
51
|
-
lessons.push(...extracted.lessons);
|
|
52
|
-
}
|
|
53
|
-
// Detect cross-turn patterns
|
|
54
|
-
const crossTurnPatterns = this.detectCrossTurnPatterns(turns);
|
|
55
|
-
patterns.push(...crossTurnPatterns);
|
|
56
|
-
// Store extracted facts
|
|
57
|
-
for (const fact of facts) {
|
|
58
|
-
this.memoryStore.add({
|
|
59
|
-
content: fact.content,
|
|
60
|
-
type: fact.type,
|
|
61
|
-
tags: fact.tags,
|
|
62
|
-
source: fact.source,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
facts,
|
|
67
|
-
patterns,
|
|
68
|
-
lessons,
|
|
69
|
-
statistics: {
|
|
70
|
-
turnsProcessed: turns.length,
|
|
71
|
-
factsExtracted: facts.length,
|
|
72
|
-
patternsDetected: patterns.length,
|
|
73
|
-
lessonsLearned: lessons.length,
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Extract facts from a single turn.
|
|
79
|
-
*/
|
|
80
|
-
extractFromTurn(turn) {
|
|
81
|
-
const facts = [];
|
|
82
|
-
const patterns = [];
|
|
83
|
-
const lessons = [];
|
|
84
|
-
const userText = turn.userText.toLowerCase();
|
|
85
|
-
const assistantText = turn.assistantText.toLowerCase();
|
|
86
|
-
// Extract preferences
|
|
87
|
-
if (userText.includes('prefer') || userText.includes('like') || userText.includes('want')) {
|
|
88
|
-
facts.push({
|
|
89
|
-
content: this.extractPreference(turn.userText),
|
|
90
|
-
type: 'preference',
|
|
91
|
-
confidence: 0.8,
|
|
92
|
-
source: 'user-statement',
|
|
93
|
-
tags: ['preference', 'user'],
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
// Extract facts about the project
|
|
97
|
-
if (userText.includes('project') || userText.includes('code') || userText.includes('file')) {
|
|
98
|
-
const fact = this.extractProjectFact(turn.userText, turn.assistantText);
|
|
99
|
-
if (fact) {
|
|
100
|
-
facts.push(fact);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Extract lessons from errors
|
|
104
|
-
if (assistantText.includes('error') || assistantText.includes('failed') || assistantText.includes('fix')) {
|
|
105
|
-
const lesson = this.extractLesson(turn.assistantText);
|
|
106
|
-
if (lesson) {
|
|
107
|
-
lessons.push(lesson);
|
|
108
|
-
facts.push({
|
|
109
|
-
content: lesson,
|
|
110
|
-
type: 'lesson',
|
|
111
|
-
confidence: 0.9,
|
|
112
|
-
source: 'error-resolution',
|
|
113
|
-
tags: ['lesson', 'error', 'fix'],
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Extract patterns from repeated actions
|
|
118
|
-
if (this.isRepeatedAction(turn)) {
|
|
119
|
-
patterns.push(this.extractPattern(turn));
|
|
120
|
-
}
|
|
121
|
-
// Extract observations about the environment
|
|
122
|
-
if (userText.includes('environment') || userText.includes('setup') || userText.includes('config')) {
|
|
123
|
-
facts.push({
|
|
124
|
-
content: this.extractObservation(turn.userText),
|
|
125
|
-
type: 'observation',
|
|
126
|
-
confidence: 0.7,
|
|
127
|
-
source: 'environment',
|
|
128
|
-
tags: ['observation', 'environment'],
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
return {
|
|
132
|
-
facts,
|
|
133
|
-
patterns,
|
|
134
|
-
lessons,
|
|
135
|
-
statistics: {
|
|
136
|
-
turnsProcessed: 1,
|
|
137
|
-
factsExtracted: facts.length,
|
|
138
|
-
patternsDetected: patterns.length,
|
|
139
|
-
lessonsLearned: lessons.length,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Extract preference from user text.
|
|
145
|
-
*/
|
|
146
|
-
extractPreference(text) {
|
|
147
|
-
// Simple extraction - find preference statement
|
|
148
|
-
const patterns = [
|
|
149
|
-
/(?:prefer|like|want|need)\s+(.+?)(?:\.|$)/i,
|
|
150
|
-
/(?:please|kindly)\s+(.+?)(?:\.|$)/i,
|
|
151
|
-
/(?:don't|do not)\s+(?:want|like)\s+(.+?)(?:\.|$)/i,
|
|
152
|
-
];
|
|
153
|
-
for (const pattern of patterns) {
|
|
154
|
-
const match = text.match(pattern);
|
|
155
|
-
if (match) {
|
|
156
|
-
return `User preference: ${match[1].trim()}`;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return `User stated: ${text.slice(0, 200)}`;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Extract project fact from conversation.
|
|
163
|
-
*/
|
|
164
|
-
extractProjectFact(userText, assistantText) {
|
|
165
|
-
// Look for factual statements about the project
|
|
166
|
-
const patterns = [
|
|
167
|
-
/(?:this project|the codebase|our app)\s+(?:is|uses|has|runs)\s+(.+?)(?:\.|$)/i,
|
|
168
|
-
/(?:we|I)\s+(?:use|are using|have)\s+(.+?)(?:\s+for|\s+to|\s+in|\s+on|\s+\.)/i,
|
|
169
|
-
];
|
|
170
|
-
for (const pattern of patterns) {
|
|
171
|
-
const match = userText.match(pattern);
|
|
172
|
-
if (match) {
|
|
173
|
-
return {
|
|
174
|
-
content: `Project fact: ${match[1].trim()}`,
|
|
175
|
-
type: 'fact',
|
|
176
|
-
confidence: 0.8,
|
|
177
|
-
source: 'user-statement',
|
|
178
|
-
tags: ['fact', 'project'],
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return null;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Extract lesson from assistant text.
|
|
186
|
-
*/
|
|
187
|
-
extractLesson(text) {
|
|
188
|
-
// Look for lesson patterns
|
|
189
|
-
const patterns = [
|
|
190
|
-
/(?:the issue|the problem|the error)\s+(?:was|is)\s+(.+?)(?:\.|$)/i,
|
|
191
|
-
/(?:to fix|to resolve|to solve)\s+(?:this|the)\s+(?:issue|problem|error),?\s+(.+?)(?:\.|$)/i,
|
|
192
|
-
/(?:the solution|the fix)\s+(?:is|was)\s+(.+?)(?:\.|$)/i,
|
|
193
|
-
];
|
|
194
|
-
for (const pattern of patterns) {
|
|
195
|
-
const match = text.match(pattern);
|
|
196
|
-
if (match) {
|
|
197
|
-
return `Lesson learned: ${match[1].trim()}`;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Check if this is a repeated action.
|
|
204
|
-
*/
|
|
205
|
-
isRepeatedAction(turn) {
|
|
206
|
-
// Simple heuristic - check for similar patterns
|
|
207
|
-
const recentTurns = this.bufferedTurns.slice(-5);
|
|
208
|
-
const userWords = turn.userText.toLowerCase().split(/\s+/);
|
|
209
|
-
let similarCount = 0;
|
|
210
|
-
for (const recent of recentTurns) {
|
|
211
|
-
const recentWords = recent.userText.toLowerCase().split(/\s+/);
|
|
212
|
-
const overlap = userWords.filter((w) => recentWords.includes(w)).length;
|
|
213
|
-
if (overlap > userWords.length * 0.5) {
|
|
214
|
-
similarCount++;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return similarCount >= 2;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Extract pattern from turn.
|
|
221
|
-
*/
|
|
222
|
-
extractPattern(turn) {
|
|
223
|
-
return `Repeated pattern: User asked about ${this.extractTopic(turn.userText)}`;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Extract topic from text.
|
|
227
|
-
*/
|
|
228
|
-
extractTopic(text) {
|
|
229
|
-
// Simple topic extraction
|
|
230
|
-
const words = text.toLowerCase().split(/\s+/);
|
|
231
|
-
const stopWords = new Set(['the', 'a', 'an', 'is', 'are', 'was', 'were', 'i', 'you', 'we', 'they', 'it']);
|
|
232
|
-
const meaningfulWords = words.filter((w) => !stopWords.has(w) && w.length > 3);
|
|
233
|
-
return meaningfulWords.slice(0, 3).join(' ') || 'unknown topic';
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Extract observation from text.
|
|
237
|
-
*/
|
|
238
|
-
extractObservation(text) {
|
|
239
|
-
return `Observation: ${text.slice(0, 200)}`;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Detect cross-turn patterns.
|
|
243
|
-
*/
|
|
244
|
-
detectCrossTurnPatterns(turns) {
|
|
245
|
-
const patterns = [];
|
|
246
|
-
// Detect topic clustering
|
|
247
|
-
const topicCounts = new Map();
|
|
248
|
-
for (const turn of turns) {
|
|
249
|
-
const topic = this.extractTopic(turn.userText);
|
|
250
|
-
topicCounts.set(topic, (topicCounts.get(topic) || 0) + 1);
|
|
251
|
-
}
|
|
252
|
-
for (const [topic, count] of topicCounts) {
|
|
253
|
-
if (count >= 3) {
|
|
254
|
-
patterns.push(`Frequent topic: ${topic} (${count} times)`);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
// Detect time-based patterns
|
|
258
|
-
if (turns.length >= 5) {
|
|
259
|
-
const timeGaps = [];
|
|
260
|
-
for (let i = 1; i < turns.length; i++) {
|
|
261
|
-
timeGaps.push(turns[i].timestamp - turns[i - 1].timestamp);
|
|
262
|
-
}
|
|
263
|
-
const avgGap = timeGaps.reduce((a, b) => a + b, 0) / timeGaps.length;
|
|
264
|
-
if (avgGap < 60_000) {
|
|
265
|
-
patterns.push('Rapid-fire conversation pattern detected');
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return patterns;
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Get buffered turn count.
|
|
272
|
-
*/
|
|
273
|
-
getBufferedTurnCount() {
|
|
274
|
-
return this.bufferedTurns.length;
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Clear buffer.
|
|
278
|
-
*/
|
|
279
|
-
clearBuffer() {
|
|
280
|
-
this.bufferedTurns = [];
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
// ─── Singleton ──────────────────────────────────────────────────────────────
|
|
284
|
-
let _instance = null;
|
|
285
|
-
export function getSessionExtractionManager() {
|
|
286
|
-
if (!_instance)
|
|
287
|
-
_instance = new SessionExtractionManager();
|
|
288
|
-
return _instance;
|
|
289
|
-
}
|
|
290
|
-
//# sourceMappingURL=session-extraction.js.map
|