@cicctencent/agent-core 0.1.1 → 0.1.4
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/README.md +14 -927
- package/dist/cjs/agent/engine.d.ts.map +1 -0
- package/dist/cjs/agent/engine.js +766 -0
- package/dist/cjs/agent/engine.js.map +1 -0
- package/dist/cjs/agent/history-manager.d.ts.map +1 -0
- package/dist/cjs/agent/history-manager.js +271 -0
- package/dist/cjs/agent/history-manager.js.map +1 -0
- package/dist/cjs/agent/llm-caller.d.ts.map +1 -0
- package/dist/cjs/agent/llm-caller.js +307 -0
- package/dist/cjs/agent/llm-caller.js.map +1 -0
- package/dist/cjs/agent/tool-executor.d.ts.map +1 -0
- package/dist/cjs/agent/tool-executor.js +568 -0
- package/dist/cjs/agent/tool-executor.js.map +1 -0
- package/dist/cjs/agent/types.d.ts.map +1 -0
- package/dist/cjs/agent/types.js +6 -0
- package/dist/cjs/agent/types.js.map +1 -0
- package/dist/cjs/agent/workflow.d.ts.map +1 -0
- package/dist/cjs/agent/workflow.js +262 -0
- package/dist/cjs/agent/workflow.js.map +1 -0
- package/dist/cjs/context/collector.d.ts.map +1 -0
- package/dist/cjs/context/collector.js +94 -0
- package/dist/cjs/context/collector.js.map +1 -0
- package/dist/cjs/context/manager.d.ts.map +1 -0
- package/dist/cjs/context/manager.js +36 -0
- package/dist/cjs/context/manager.js.map +1 -0
- package/dist/cjs/context/types.d.ts.map +1 -0
- package/dist/cjs/context/types.js +6 -0
- package/dist/cjs/context/types.js.map +1 -0
- package/dist/cjs/hooks/types.d.ts.map +1 -0
- package/dist/cjs/hooks/types.js +6 -0
- package/dist/cjs/hooks/types.js.map +1 -0
- package/dist/{index.d.ts → cjs/index.d.ts} +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +98 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/cjs/llm/anthropic-provider.js +356 -0
- package/dist/cjs/llm/anthropic-provider.js.map +1 -0
- package/dist/cjs/llm/factory.d.ts.map +1 -0
- package/dist/cjs/llm/factory.js +34 -0
- package/dist/cjs/llm/factory.js.map +1 -0
- package/dist/cjs/llm/ollama-provider.d.ts.map +1 -0
- package/dist/cjs/llm/ollama-provider.js +34 -0
- package/dist/cjs/llm/ollama-provider.js.map +1 -0
- package/dist/cjs/llm/openai-provider.d.ts.map +1 -0
- package/dist/cjs/llm/openai-provider.js +186 -0
- package/dist/cjs/llm/openai-provider.js.map +1 -0
- package/dist/cjs/llm/provider.d.ts.map +1 -0
- package/dist/cjs/llm/provider.js +18 -0
- package/dist/cjs/llm/provider.js.map +1 -0
- package/dist/cjs/llm/types.d.ts.map +1 -0
- package/dist/cjs/llm/types.js +6 -0
- package/dist/cjs/llm/types.js.map +1 -0
- package/dist/cjs/mcp/base-client.d.ts.map +1 -0
- package/dist/cjs/mcp/base-client.js +112 -0
- package/dist/cjs/mcp/base-client.js.map +1 -0
- package/dist/cjs/mcp/client.d.ts.map +1 -0
- package/dist/cjs/mcp/client.js +76 -0
- package/dist/cjs/mcp/client.js.map +1 -0
- package/dist/cjs/mcp/factory.d.ts.map +1 -0
- package/dist/cjs/mcp/factory.js +43 -0
- package/dist/cjs/mcp/factory.js.map +1 -0
- package/dist/cjs/mcp/http-client.d.ts.map +1 -0
- package/dist/cjs/mcp/http-client.js +142 -0
- package/dist/cjs/mcp/http-client.js.map +1 -0
- package/dist/cjs/mcp/proxy-agent.d.ts.map +1 -0
- package/dist/cjs/mcp/proxy-agent.js +195 -0
- package/dist/cjs/mcp/proxy-agent.js.map +1 -0
- package/dist/cjs/mcp/stdio-client.d.ts.map +1 -0
- package/dist/cjs/mcp/stdio-client.js +95 -0
- package/dist/cjs/mcp/stdio-client.js.map +1 -0
- package/dist/cjs/mcp/types.d.ts.map +1 -0
- package/dist/cjs/mcp/types.js +6 -0
- package/dist/cjs/mcp/types.js.map +1 -0
- package/dist/cjs/memory/checkpoint.d.ts.map +1 -0
- package/dist/cjs/memory/checkpoint.js +160 -0
- package/dist/cjs/memory/checkpoint.js.map +1 -0
- package/dist/cjs/memory/extractor.d.ts.map +1 -0
- package/dist/cjs/memory/extractor.js +121 -0
- package/dist/cjs/memory/extractor.js.map +1 -0
- package/dist/cjs/memory/persona.d.ts.map +1 -0
- package/dist/cjs/memory/persona.js +79 -0
- package/dist/cjs/memory/persona.js.map +1 -0
- package/dist/cjs/memory/pipeline.d.ts.map +1 -0
- package/dist/cjs/memory/pipeline.js +148 -0
- package/dist/cjs/memory/pipeline.js.map +1 -0
- package/dist/cjs/memory/prompts.d.ts.map +1 -0
- package/dist/cjs/memory/prompts.js +70 -0
- package/dist/cjs/memory/prompts.js.map +1 -0
- package/dist/cjs/memory/recall.d.ts.map +1 -0
- package/dist/cjs/memory/recall.js +164 -0
- package/dist/cjs/memory/recall.js.map +1 -0
- package/dist/cjs/memory/scene.d.ts.map +1 -0
- package/dist/cjs/memory/scene.js +101 -0
- package/dist/cjs/memory/scene.js.map +1 -0
- package/dist/cjs/memory/types.d.ts.map +1 -0
- package/dist/cjs/memory/types.js +6 -0
- package/dist/cjs/memory/types.js.map +1 -0
- package/dist/cjs/middleware/types.d.ts.map +1 -0
- package/dist/cjs/middleware/types.js +6 -0
- package/dist/cjs/middleware/types.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/sandbox/types.d.ts.map +1 -0
- package/dist/cjs/sandbox/types.js +128 -0
- package/dist/cjs/sandbox/types.js.map +1 -0
- package/dist/{security → cjs/security}/guard.d.ts +1 -6
- package/dist/cjs/security/guard.d.ts.map +1 -0
- package/dist/cjs/security/guard.js +291 -0
- package/dist/cjs/security/guard.js.map +1 -0
- package/dist/{security → cjs/security}/types.d.ts +6 -2
- package/dist/cjs/security/types.d.ts.map +1 -0
- package/dist/cjs/security/types.js +6 -0
- package/dist/cjs/security/types.js.map +1 -0
- package/dist/cjs/skill/manager.d.ts.map +1 -0
- package/dist/cjs/skill/manager.js +413 -0
- package/dist/cjs/skill/manager.js.map +1 -0
- package/dist/cjs/skill/router.d.ts.map +1 -0
- package/dist/cjs/skill/router.js +139 -0
- package/dist/cjs/skill/router.js.map +1 -0
- package/dist/cjs/skill/types.d.ts.map +1 -0
- package/dist/cjs/skill/types.js +6 -0
- package/dist/cjs/skill/types.js.map +1 -0
- package/dist/cjs/tool/delegate.d.ts.map +1 -0
- package/dist/cjs/tool/delegate.js +78 -0
- package/dist/cjs/tool/delegate.js.map +1 -0
- package/dist/cjs/tool/registry.d.ts +49 -0
- package/dist/cjs/tool/registry.d.ts.map +1 -0
- package/dist/cjs/tool/registry.js +87 -0
- package/dist/cjs/tool/registry.js.map +1 -0
- package/dist/cjs/tool/types.d.ts.map +1 -0
- package/dist/cjs/tool/types.js +6 -0
- package/dist/cjs/tool/types.js.map +1 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils/token-counter.d.ts.map +1 -0
- package/dist/cjs/utils/token-counter.js +104 -0
- package/dist/cjs/utils/token-counter.js.map +1 -0
- package/dist/esm/agent/engine.d.ts +113 -0
- package/dist/esm/agent/engine.d.ts.map +1 -0
- package/dist/esm/agent/engine.js +762 -0
- package/dist/esm/agent/engine.js.map +1 -0
- package/dist/esm/agent/history-manager.d.ts +78 -0
- package/dist/esm/agent/history-manager.d.ts.map +1 -0
- package/dist/esm/agent/history-manager.js +267 -0
- package/dist/esm/agent/history-manager.js.map +1 -0
- package/dist/esm/agent/llm-caller.d.ts +58 -0
- package/dist/esm/agent/llm-caller.d.ts.map +1 -0
- package/dist/esm/agent/llm-caller.js +303 -0
- package/dist/esm/agent/llm-caller.js.map +1 -0
- package/dist/esm/agent/tool-executor.d.ts +95 -0
- package/dist/esm/agent/tool-executor.d.ts.map +1 -0
- package/dist/esm/agent/tool-executor.js +564 -0
- package/dist/esm/agent/tool-executor.js.map +1 -0
- package/dist/esm/agent/types.d.ts +128 -0
- package/dist/esm/agent/types.d.ts.map +1 -0
- package/dist/esm/agent/types.js +5 -0
- package/dist/esm/agent/types.js.map +1 -0
- package/dist/esm/agent/workflow.d.ts +74 -0
- package/dist/esm/agent/workflow.d.ts.map +1 -0
- package/dist/esm/agent/workflow.js +248 -0
- package/dist/esm/agent/workflow.js.map +1 -0
- package/dist/esm/context/collector.d.ts +12 -0
- package/dist/esm/context/collector.d.ts.map +1 -0
- package/dist/esm/context/collector.js +57 -0
- package/dist/esm/context/collector.js.map +1 -0
- package/dist/esm/context/manager.d.ts +16 -0
- package/dist/esm/context/manager.d.ts.map +1 -0
- package/dist/esm/context/manager.js +32 -0
- package/dist/esm/context/manager.js.map +1 -0
- package/dist/esm/context/types.d.ts +39 -0
- package/dist/esm/context/types.d.ts.map +1 -0
- package/dist/esm/context/types.js +5 -0
- package/dist/esm/context/types.js.map +1 -0
- package/dist/esm/hooks/types.d.ts +47 -0
- package/dist/esm/hooks/types.d.ts.map +1 -0
- package/dist/esm/hooks/types.js +5 -0
- package/dist/esm/hooks/types.js.map +1 -0
- package/{src/index.ts → dist/esm/index.d.ts} +16 -140
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +39 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/llm/anthropic-provider.d.ts +28 -0
- package/dist/esm/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/esm/llm/anthropic-provider.js +352 -0
- package/dist/esm/llm/anthropic-provider.js.map +1 -0
- package/{src/llm/factory.ts → dist/esm/llm/factory.d.ts} +3 -18
- package/dist/esm/llm/factory.d.ts.map +1 -0
- package/dist/esm/llm/factory.js +30 -0
- package/dist/esm/llm/factory.js.map +1 -0
- package/dist/esm/llm/ollama-provider.d.ts +13 -0
- package/dist/esm/llm/ollama-provider.d.ts.map +1 -0
- package/dist/esm/llm/ollama-provider.js +30 -0
- package/dist/esm/llm/ollama-provider.js.map +1 -0
- package/dist/esm/llm/openai-provider.d.ts +18 -0
- package/dist/esm/llm/openai-provider.d.ts.map +1 -0
- package/dist/esm/llm/openai-provider.js +182 -0
- package/dist/esm/llm/openai-provider.js.map +1 -0
- package/{src/llm/provider.ts → dist/esm/llm/provider.d.ts} +1 -9
- package/dist/esm/llm/provider.d.ts.map +1 -0
- package/dist/esm/llm/provider.js +10 -0
- package/dist/esm/llm/provider.js.map +1 -0
- package/dist/esm/llm/types.d.ts +78 -0
- package/dist/esm/llm/types.d.ts.map +1 -0
- package/dist/esm/llm/types.js +5 -0
- package/dist/esm/llm/types.js.map +1 -0
- package/dist/esm/mcp/base-client.d.ts +50 -0
- package/dist/esm/mcp/base-client.d.ts.map +1 -0
- package/dist/esm/mcp/base-client.js +108 -0
- package/dist/esm/mcp/base-client.js.map +1 -0
- package/dist/esm/mcp/client.d.ts +27 -0
- package/dist/esm/mcp/client.d.ts.map +1 -0
- package/dist/esm/mcp/client.js +70 -0
- package/dist/esm/mcp/client.js.map +1 -0
- package/dist/esm/mcp/factory.d.ts +16 -0
- package/dist/esm/mcp/factory.d.ts.map +1 -0
- package/dist/esm/mcp/factory.js +39 -0
- package/dist/esm/mcp/factory.js.map +1 -0
- package/dist/esm/mcp/http-client.d.ts +24 -0
- package/dist/esm/mcp/http-client.d.ts.map +1 -0
- package/dist/esm/mcp/http-client.js +138 -0
- package/dist/esm/mcp/http-client.js.map +1 -0
- package/dist/esm/mcp/proxy-agent.d.ts +49 -0
- package/dist/esm/mcp/proxy-agent.d.ts.map +1 -0
- package/dist/esm/mcp/proxy-agent.js +187 -0
- package/dist/esm/mcp/proxy-agent.js.map +1 -0
- package/dist/esm/mcp/stdio-client.d.ts +16 -0
- package/dist/esm/mcp/stdio-client.d.ts.map +1 -0
- package/dist/esm/mcp/stdio-client.js +91 -0
- package/dist/esm/mcp/stdio-client.js.map +1 -0
- package/dist/esm/mcp/types.d.ts +60 -0
- package/dist/esm/mcp/types.d.ts.map +1 -0
- package/dist/esm/mcp/types.js +5 -0
- package/dist/esm/mcp/types.js.map +1 -0
- package/dist/esm/memory/checkpoint.d.ts +62 -0
- package/dist/esm/memory/checkpoint.d.ts.map +1 -0
- package/dist/esm/memory/checkpoint.js +121 -0
- package/dist/esm/memory/checkpoint.js.map +1 -0
- package/dist/esm/memory/extractor.d.ts +59 -0
- package/dist/esm/memory/extractor.d.ts.map +1 -0
- package/dist/esm/memory/extractor.js +117 -0
- package/dist/esm/memory/extractor.js.map +1 -0
- package/dist/esm/memory/persona.d.ts +38 -0
- package/dist/esm/memory/persona.d.ts.map +1 -0
- package/dist/esm/memory/persona.js +75 -0
- package/dist/esm/memory/persona.js.map +1 -0
- package/dist/esm/memory/pipeline.d.ts +50 -0
- package/dist/esm/memory/pipeline.d.ts.map +1 -0
- package/dist/esm/memory/pipeline.js +144 -0
- package/dist/esm/memory/pipeline.js.map +1 -0
- package/dist/esm/memory/prompts.d.ts +9 -0
- package/dist/esm/memory/prompts.d.ts.map +1 -0
- package/{src/memory/prompts.ts → dist/esm/memory/prompts.js} +6 -13
- package/dist/esm/memory/prompts.js.map +1 -0
- package/dist/esm/memory/recall.d.ts +66 -0
- package/dist/esm/memory/recall.d.ts.map +1 -0
- package/dist/esm/memory/recall.js +159 -0
- package/dist/esm/memory/recall.js.map +1 -0
- package/dist/esm/memory/scene.d.ts +49 -0
- package/dist/esm/memory/scene.d.ts.map +1 -0
- package/dist/esm/memory/scene.js +97 -0
- package/dist/esm/memory/scene.js.map +1 -0
- package/dist/esm/memory/types.d.ts +43 -0
- package/dist/esm/memory/types.d.ts.map +1 -0
- package/dist/esm/memory/types.js +5 -0
- package/dist/esm/memory/types.js.map +1 -0
- package/dist/esm/middleware/types.d.ts +52 -0
- package/dist/esm/middleware/types.d.ts.map +1 -0
- package/dist/esm/middleware/types.js +5 -0
- package/dist/esm/middleware/types.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/sandbox/types.d.ts +59 -0
- package/dist/esm/sandbox/types.d.ts.map +1 -0
- package/dist/esm/sandbox/types.js +125 -0
- package/dist/esm/sandbox/types.js.map +1 -0
- package/dist/esm/security/guard.d.ts +36 -0
- package/dist/esm/security/guard.d.ts.map +1 -0
- package/dist/esm/security/guard.js +287 -0
- package/dist/esm/security/guard.js.map +1 -0
- package/dist/esm/security/types.d.ts +40 -0
- package/dist/esm/security/types.d.ts.map +1 -0
- package/dist/esm/security/types.js +5 -0
- package/dist/esm/security/types.js.map +1 -0
- package/dist/esm/skill/manager.d.ts +95 -0
- package/dist/esm/skill/manager.d.ts.map +1 -0
- package/dist/esm/skill/manager.js +376 -0
- package/dist/esm/skill/manager.js.map +1 -0
- package/dist/esm/skill/router.d.ts +26 -0
- package/dist/esm/skill/router.d.ts.map +1 -0
- package/dist/esm/skill/router.js +135 -0
- package/dist/esm/skill/router.js.map +1 -0
- package/dist/esm/skill/types.d.ts +55 -0
- package/dist/esm/skill/types.d.ts.map +1 -0
- package/dist/esm/skill/types.js +5 -0
- package/dist/esm/skill/types.js.map +1 -0
- package/dist/esm/tool/delegate.d.ts +34 -0
- package/dist/esm/tool/delegate.d.ts.map +1 -0
- package/dist/esm/tool/delegate.js +75 -0
- package/dist/esm/tool/delegate.js.map +1 -0
- package/dist/esm/tool/registry.d.ts +49 -0
- package/dist/esm/tool/registry.d.ts.map +1 -0
- package/dist/esm/tool/registry.js +83 -0
- package/dist/esm/tool/registry.js.map +1 -0
- package/dist/esm/tool/types.d.ts +101 -0
- package/dist/esm/tool/types.d.ts.map +1 -0
- package/dist/esm/tool/types.js +5 -0
- package/dist/esm/tool/types.js.map +1 -0
- package/dist/esm/types.d.ts +150 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +5 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils/token-counter.d.ts +22 -0
- package/dist/esm/utils/token-counter.d.ts.map +1 -0
- package/dist/esm/utils/token-counter.js +99 -0
- package/dist/esm/utils/token-counter.js.map +1 -0
- package/package.json +16 -10
- package/dist/agent/engine.d.ts.map +0 -1
- package/dist/agent/history-manager.d.ts.map +0 -1
- package/dist/agent/llm-caller.d.ts.map +0 -1
- package/dist/agent/tool-executor.d.ts.map +0 -1
- package/dist/agent/types.d.ts.map +0 -1
- package/dist/agent/workflow.d.ts.map +0 -1
- package/dist/context/collector.d.ts.map +0 -1
- package/dist/context/manager.d.ts.map +0 -1
- package/dist/context/types.d.ts.map +0 -1
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/llm/anthropic-provider.d.ts.map +0 -1
- package/dist/llm/factory.d.ts.map +0 -1
- package/dist/llm/ollama-provider.d.ts.map +0 -1
- package/dist/llm/openai-provider.d.ts.map +0 -1
- package/dist/llm/provider.d.ts.map +0 -1
- package/dist/llm/types.d.ts.map +0 -1
- package/dist/mcp/base-client.d.ts.map +0 -1
- package/dist/mcp/client.d.ts.map +0 -1
- package/dist/mcp/factory.d.ts.map +0 -1
- package/dist/mcp/http-client.d.ts.map +0 -1
- package/dist/mcp/proxy-agent.d.ts.map +0 -1
- package/dist/mcp/stdio-client.d.ts.map +0 -1
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/memory/checkpoint.d.ts.map +0 -1
- package/dist/memory/extractor.d.ts.map +0 -1
- package/dist/memory/persona.d.ts.map +0 -1
- package/dist/memory/pipeline.d.ts.map +0 -1
- package/dist/memory/prompts.d.ts.map +0 -1
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/scene.d.ts.map +0 -1
- package/dist/memory/types.d.ts.map +0 -1
- package/dist/middleware/types.d.ts.map +0 -1
- package/dist/sandbox/types.d.ts.map +0 -1
- package/dist/security/guard.d.ts.map +0 -1
- package/dist/security/types.d.ts.map +0 -1
- package/dist/skill/manager.d.ts.map +0 -1
- package/dist/skill/router.d.ts.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- package/dist/tool/delegate.d.ts.map +0 -1
- package/dist/tool/registry.d.ts +0 -24
- package/dist/tool/registry.d.ts.map +0 -1
- package/dist/tool/types.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/token-counter.d.ts.map +0 -1
- package/src/agent/engine.ts +0 -875
- package/src/agent/history-manager.ts +0 -323
- package/src/agent/llm-caller.ts +0 -383
- package/src/agent/tool-executor.ts +0 -713
- package/src/agent/types.ts +0 -136
- package/src/agent/workflow.ts +0 -339
- package/src/context/collector.ts +0 -59
- package/src/context/manager.ts +0 -40
- package/src/context/types.ts +0 -51
- package/src/hooks/types.ts +0 -77
- package/src/llm/anthropic-provider.ts +0 -412
- package/src/llm/ollama-provider.ts +0 -39
- package/src/llm/openai-provider.ts +0 -200
- package/src/llm/types.ts +0 -91
- package/src/mcp/base-client.ts +0 -159
- package/src/mcp/client.ts +0 -81
- package/src/mcp/factory.ts +0 -45
- package/src/mcp/http-client.ts +0 -149
- package/src/mcp/proxy-agent.ts +0 -227
- package/src/mcp/stdio-client.ts +0 -104
- package/src/mcp/types.ts +0 -65
- package/src/memory/checkpoint.ts +0 -146
- package/src/memory/extractor.ts +0 -164
- package/src/memory/persona.ts +0 -106
- package/src/memory/pipeline.ts +0 -192
- package/src/memory/recall.ts +0 -217
- package/src/memory/scene.ts +0 -137
- package/src/memory/types.ts +0 -54
- package/src/middleware/types.ts +0 -62
- package/src/sandbox/types.ts +0 -185
- package/src/security/guard.ts +0 -249
- package/src/security/types.ts +0 -46
- package/src/skill/manager.ts +0 -420
- package/src/skill/router.ts +0 -158
- package/src/skill/types.ts +0 -67
- package/src/tool/delegate.ts +0 -105
- package/src/tool/registry.ts +0 -64
- package/src/tool/types.ts +0 -124
- package/src/types.ts +0 -188
- package/src/utils/token-counter.ts +0 -108
- /package/dist/{agent → cjs/agent}/engine.d.ts +0 -0
- /package/dist/{agent → cjs/agent}/history-manager.d.ts +0 -0
- /package/dist/{agent → cjs/agent}/llm-caller.d.ts +0 -0
- /package/dist/{agent → cjs/agent}/tool-executor.d.ts +0 -0
- /package/dist/{agent → cjs/agent}/types.d.ts +0 -0
- /package/dist/{agent → cjs/agent}/workflow.d.ts +0 -0
- /package/dist/{context → cjs/context}/collector.d.ts +0 -0
- /package/dist/{context → cjs/context}/manager.d.ts +0 -0
- /package/dist/{context → cjs/context}/types.d.ts +0 -0
- /package/dist/{hooks → cjs/hooks}/types.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/anthropic-provider.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/factory.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/ollama-provider.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/openai-provider.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/provider.d.ts +0 -0
- /package/dist/{llm → cjs/llm}/types.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/base-client.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/client.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/factory.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/http-client.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/proxy-agent.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/stdio-client.d.ts +0 -0
- /package/dist/{mcp → cjs/mcp}/types.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/checkpoint.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/extractor.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/persona.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/pipeline.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/prompts.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/recall.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/scene.d.ts +0 -0
- /package/dist/{memory → cjs/memory}/types.d.ts +0 -0
- /package/dist/{middleware → cjs/middleware}/types.d.ts +0 -0
- /package/dist/{sandbox → cjs/sandbox}/types.d.ts +0 -0
- /package/dist/{skill → cjs/skill}/manager.d.ts +0 -0
- /package/dist/{skill → cjs/skill}/router.d.ts +0 -0
- /package/dist/{skill → cjs/skill}/types.d.ts +0 -0
- /package/dist/{tool → cjs/tool}/delegate.d.ts +0 -0
- /package/dist/{tool → cjs/tool}/types.d.ts +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{utils → cjs/utils}/token-counter.d.ts +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MemoryPipeline — L1→L2→L3 记忆管道调度器
|
|
3
|
+
// ============================================================
|
|
4
|
+
// 调度记忆层级的渐进式提炼:
|
|
5
|
+
// L1 (原子事实) → L2 (场景聚合) → L3 (用户画像)
|
|
6
|
+
// 在对话结束后 fire-and-forget 触发
|
|
7
|
+
import { MemoryExtractor } from "./extractor.js";
|
|
8
|
+
import { SceneAggregator } from "./scene.js";
|
|
9
|
+
import { PersonaGenerator } from "./persona.js";
|
|
10
|
+
import { getMemoryCheckpoint } from "./checkpoint.js";
|
|
11
|
+
/**
|
|
12
|
+
* 记忆管道调度器
|
|
13
|
+
*
|
|
14
|
+
* 调度策略:
|
|
15
|
+
* 1. 每次对话结束:提取 L1 原子事实
|
|
16
|
+
* 2. L1 累积达到阈值:触发 L2 场景聚合
|
|
17
|
+
* 3. L2 累积达到阈值:触发 L3 画像生成
|
|
18
|
+
*
|
|
19
|
+
* 所有操作均为 fire-and-forget,不阻塞对话响应
|
|
20
|
+
*/
|
|
21
|
+
export class MemoryPipeline {
|
|
22
|
+
llmProvider;
|
|
23
|
+
l2Threshold;
|
|
24
|
+
l3Threshold;
|
|
25
|
+
constructor(opts) {
|
|
26
|
+
this.llmProvider = opts.llmProvider;
|
|
27
|
+
this.l2Threshold = opts.l2Threshold ?? 5;
|
|
28
|
+
this.l3Threshold = opts.l3Threshold ?? 3;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 执行完整管道(L1 提取 → 条件触发 L2 → 条件触发 L3)
|
|
32
|
+
*
|
|
33
|
+
* @param messages 对话消息
|
|
34
|
+
* @param sessionId 会话 ID
|
|
35
|
+
* @param memoryService MemoryService 实例(延迟导入避免循环依赖)
|
|
36
|
+
*/
|
|
37
|
+
async run(messages, sessionId, memoryService) {
|
|
38
|
+
const result = {
|
|
39
|
+
l1Extracted: 0,
|
|
40
|
+
l2Triggered: false,
|
|
41
|
+
l3Triggered: false,
|
|
42
|
+
};
|
|
43
|
+
// === Phase 1: L1 提取 ===
|
|
44
|
+
const existingKeys = memoryService.getKeys();
|
|
45
|
+
const extractor = new MemoryExtractor({ llmProvider: this.llmProvider });
|
|
46
|
+
const facts = await extractor.extract(messages, sessionId, existingKeys);
|
|
47
|
+
// 写入 L1 条目
|
|
48
|
+
for (const fact of facts) {
|
|
49
|
+
memoryService.save(fact.key, fact.content, fact.category, fact.importance, {
|
|
50
|
+
memoryLayer: 'L1',
|
|
51
|
+
sourceSessionId: sessionId,
|
|
52
|
+
sourceTimestamp: new Date().toISOString(),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
result.l1Extracted = facts.length;
|
|
56
|
+
if (facts.length === 0)
|
|
57
|
+
return result;
|
|
58
|
+
console.log(`[Pipeline] L1: extracted ${facts.length} facts from session ${sessionId}`);
|
|
59
|
+
// === Phase 2: 条件触发 L2 聚合 ===
|
|
60
|
+
const l1Entries = memoryService.getAllEntries('L1');
|
|
61
|
+
const l1Count = l1Entries.length;
|
|
62
|
+
const checkpoint = getMemoryCheckpoint();
|
|
63
|
+
if (checkpoint.shouldTriggerL2(l1Count, this.l2Threshold)) {
|
|
64
|
+
try {
|
|
65
|
+
const existingL2 = memoryService.getAllEntries('L2');
|
|
66
|
+
const existingScenes = existingL2.map(e => ({
|
|
67
|
+
sceneId: e.sceneId || e.key,
|
|
68
|
+
title: e.key,
|
|
69
|
+
description: e.content,
|
|
70
|
+
atomIds: e.sourceIds || [],
|
|
71
|
+
}));
|
|
72
|
+
const aggregator = new SceneAggregator({ llmProvider: this.llmProvider });
|
|
73
|
+
const atoms = l1Entries.map(e => ({
|
|
74
|
+
id: e.id,
|
|
75
|
+
key: e.key,
|
|
76
|
+
content: e.content,
|
|
77
|
+
category: e.category,
|
|
78
|
+
}));
|
|
79
|
+
const scenes = await aggregator.aggregate(atoms, existingScenes);
|
|
80
|
+
result.l2Triggered = true;
|
|
81
|
+
result.newScenes = scenes;
|
|
82
|
+
// 写入 L2 条目(upsert by sceneId)
|
|
83
|
+
for (const scene of scenes) {
|
|
84
|
+
memoryService.save(scene.sceneId, `${scene.title}\n${scene.description}`, 'scene', 4, {
|
|
85
|
+
memoryLayer: 'L2',
|
|
86
|
+
sceneId: scene.sceneId,
|
|
87
|
+
sourceLayer: 'L1',
|
|
88
|
+
sourceIds: scene.atomIds,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// 回填 L1 条目的 sceneId
|
|
92
|
+
for (const scene of scenes) {
|
|
93
|
+
for (const atomId of scene.atomIds) {
|
|
94
|
+
const entry = l1Entries.find(e => e.id === atomId);
|
|
95
|
+
if (entry && entry.sceneId !== scene.sceneId) {
|
|
96
|
+
memoryService.save(entry.key, entry.content, entry.category, entry.importance, {
|
|
97
|
+
memoryLayer: 'L1',
|
|
98
|
+
sceneId: scene.sceneId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log(`[Pipeline] L2: aggregated ${scenes.length} scenes from ${l1Count} atoms`);
|
|
104
|
+
// 更新检查点
|
|
105
|
+
checkpoint.updateL2(l1Count);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.warn(`[Pipeline] L2 aggregation failed:`, err?.message);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// === Phase 3: 条件触发 L3 画像 ===
|
|
112
|
+
const l2Entries = memoryService.getAllEntries('L2');
|
|
113
|
+
if (checkpoint.shouldTriggerL3(l2Entries.length, this.l3Threshold)) {
|
|
114
|
+
try {
|
|
115
|
+
const existingL3 = memoryService.getAllEntries('L3');
|
|
116
|
+
const existingPersona = existingL3.length > 0 ? existingL3[0].content : '';
|
|
117
|
+
const generator = new PersonaGenerator({ llmProvider: this.llmProvider });
|
|
118
|
+
const scenes = l2Entries.map(e => ({
|
|
119
|
+
sceneId: e.sceneId || e.key,
|
|
120
|
+
title: e.key,
|
|
121
|
+
description: e.content,
|
|
122
|
+
atomIds: e.sourceIds || [],
|
|
123
|
+
}));
|
|
124
|
+
const persona = await generator.generate(scenes, existingPersona);
|
|
125
|
+
result.l3Triggered = true;
|
|
126
|
+
result.newPersona = persona;
|
|
127
|
+
if (persona) {
|
|
128
|
+
memoryService.save('user_persona', persona, 'persona', 5, {
|
|
129
|
+
memoryLayer: 'L3',
|
|
130
|
+
sourceLayer: 'L2',
|
|
131
|
+
sourceIds: l2Entries.map(e => e.id),
|
|
132
|
+
});
|
|
133
|
+
console.log(`[Pipeline] L3: persona updated (${persona.length} chars)`);
|
|
134
|
+
checkpoint.updateL3(l2Entries.length);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
console.warn(`[Pipeline] L3 generation failed:`, err?.message);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/memory/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** 原子事实提取 Prompt(系统提示) */
|
|
2
|
+
export declare const EXTRACTION_SYSTEM_PROMPT = "You are a memory extraction engine. Analyze the conversation and extract persistent, reusable facts.\n\n**Rules:**\n- Only extract OBJECTIVE, PERSISTENT facts that will be useful in future conversations\n- Extract: user preferences, project knowledge, technical stack, learned patterns, important decisions\n- DO NOT extract: one-off task details (e.g. \"fix bug X\"), temporary state, debugging logs\n- Each fact must be atomic (one discrete piece of knowledge)\n- Use concise, declarative language\n- Prefer updating existing keys over creating duplicates\n\n**Categories:**\n- user_preference: User's working habits, tool preferences, coding style\n- project_knowledge: Project architecture, tech stack, conventions\n- learned_fact: New knowledge gained during the conversation\n\n**Output format (strict JSON array):**\n[\n { \"key\": \"snake_case_key\", \"content\": \"Brief factual statement\", \"category\": \"user_preference|project_knowledge|learned_fact\", \"importance\": 1-5 }\n]\n\nIf no extractable facts exist, output an empty array: []\nDo not add explanations or markdown outside the JSON.";
|
|
3
|
+
/** 构建提取用户提示 */
|
|
4
|
+
export declare function buildExtractionUserPrompt(messagesSummary: string, existingKeys: string[]): string;
|
|
5
|
+
/** 场景聚合 Prompt(Phase 4 L2) */
|
|
6
|
+
export declare const SCENE_AGGREGATION_SYSTEM_PROMPT = "You are a memory organizer. Group related atomic facts into thematic scenario blocks.\n\n**Rules:**\n- Each scenario should have a clear title and description\n- Group facts by topic/project/domain (e.g. \"\u8FDE\u63A5\u5668\u529F\u80FD\u5F00\u53D1\", \"\u9879\u76EE\u67B6\u6784\u51B3\u7B56\")\n- Max 15 scenarios total. Merge or archive old scenarios if needed.\n- A fact can belong to only one scenario\n\n**Output format (strict JSON array):**\n[\n {\n \"sceneId\": \"snake_case_id\",\n \"title\": \"\u573A\u666F\u6807\u9898\",\n \"description\": \"\u573A\u666F\u63CF\u8FF0\uFF081-2\u53E5\uFF09\",\n \"atomIds\": [\"atom_id_1\", \"atom_id_2\"]\n }\n]";
|
|
7
|
+
/** 画像生成 Prompt(Phase 4 L3) */
|
|
8
|
+
export declare const PERSONA_GENERATION_SYSTEM_PROMPT = "You are a user profiling engine. Based on the scenario blocks provided, generate or incrementally update a user persona.\n\n**Rules:**\n- Focus on stable, enduring traits: working style, technical preferences, communication patterns\n- Use clear section headers (## \u6280\u672F\u504F\u597D, ## \u5DE5\u4F5C\u98CE\u683C, ## \u9879\u76EE\u80CC\u666F, etc.)\n- Keep the persona concise (max 800 words)\n- When updating: preserve existing content, only modify sections affected by new scenarios\n\n**Output format: Markdown**\nWrite the persona directly as markdown text.";
|
|
9
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/memory/prompts.ts"],"names":[],"mappings":"AAIA,0BAA0B;AAC1B,eAAO,MAAM,wBAAwB,wlCAqBiB,CAAC;AAEvD,eAAe;AACf,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CASR;AAED,8BAA8B;AAC9B,eAAO,MAAM,+BAA+B,gqBAgB1C,CAAC;AAEH,8BAA8B;AAC9B,eAAO,MAAM,gCAAgC,6jBASA,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// ============================================================
|
|
2
2
|
// Memory Extraction Prompt Templates
|
|
3
3
|
// ============================================================
|
|
4
|
-
|
|
5
4
|
/** 原子事实提取 Prompt(系统提示) */
|
|
6
5
|
export const EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction engine. Analyze the conversation and extract persistent, reusable facts.
|
|
7
6
|
|
|
@@ -25,22 +24,16 @@ export const EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction engine. Ana
|
|
|
25
24
|
|
|
26
25
|
If no extractable facts exist, output an empty array: []
|
|
27
26
|
Do not add explanations or markdown outside the JSON.`;
|
|
28
|
-
|
|
29
27
|
/** 构建提取用户提示 */
|
|
30
|
-
export function buildExtractionUserPrompt(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
? `**Existing memory keys (avoid duplicates, update if needed):**\n${existingKeys.map(k => `- ${k}`).join('\n')}\n\n`
|
|
36
|
-
: '';
|
|
37
|
-
|
|
38
|
-
return `${keysSection}**Conversation to analyze:**
|
|
28
|
+
export function buildExtractionUserPrompt(messagesSummary, existingKeys) {
|
|
29
|
+
const keysSection = existingKeys.length > 0
|
|
30
|
+
? `**Existing memory keys (avoid duplicates, update if needed):**\n${existingKeys.map(k => `- ${k}`).join('\n')}\n\n`
|
|
31
|
+
: '';
|
|
32
|
+
return `${keysSection}**Conversation to analyze:**
|
|
39
33
|
${messagesSummary}
|
|
40
34
|
|
|
41
35
|
Extract persistent facts from the above conversation. Output ONLY a JSON array.`;
|
|
42
36
|
}
|
|
43
|
-
|
|
44
37
|
/** 场景聚合 Prompt(Phase 4 L2) */
|
|
45
38
|
export const SCENE_AGGREGATION_SYSTEM_PROMPT = `You are a memory organizer. Group related atomic facts into thematic scenario blocks.
|
|
46
39
|
|
|
@@ -59,7 +52,6 @@ export const SCENE_AGGREGATION_SYSTEM_PROMPT = `You are a memory organizer. Grou
|
|
|
59
52
|
"atomIds": ["atom_id_1", "atom_id_2"]
|
|
60
53
|
}
|
|
61
54
|
]`;
|
|
62
|
-
|
|
63
55
|
/** 画像生成 Prompt(Phase 4 L3) */
|
|
64
56
|
export const PERSONA_GENERATION_SYSTEM_PROMPT = `You are a user profiling engine. Based on the scenario blocks provided, generate or incrementally update a user persona.
|
|
65
57
|
|
|
@@ -71,3 +63,4 @@ export const PERSONA_GENERATION_SYSTEM_PROMPT = `You are a user profiling engine
|
|
|
71
63
|
|
|
72
64
|
**Output format: Markdown**
|
|
73
65
|
Write the persona directly as markdown text.`;
|
|
66
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/memory/prompts.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qCAAqC;AACrC,+DAA+D;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;sDAqBc,CAAC;AAEvD,eAAe;AACf,MAAM,UAAU,yBAAyB,CACvC,eAAuB,EACvB,YAAsB;IAEtB,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC,mEAAmE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QACrH,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,GAAG,WAAW;EACrB,eAAe;;gFAE+D,CAAC;AACjF,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;EAgB7C,CAAC;AAEH,8BAA8B;AAC9B,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;;;6CASH,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { MemoryEntry, MemoryLayer } from './types.ts';
|
|
2
|
+
/** 召回结果 */
|
|
3
|
+
export interface RecallResult {
|
|
4
|
+
/** 召回的记忆条目(按相关度排序) */
|
|
5
|
+
entries: ScoredMemoryEntry[];
|
|
6
|
+
/** 是否超时 */
|
|
7
|
+
timedOut: boolean;
|
|
8
|
+
/** 召回策略描述 */
|
|
9
|
+
strategy: string;
|
|
10
|
+
}
|
|
11
|
+
/** 带分数的记忆条目 */
|
|
12
|
+
export interface ScoredMemoryEntry extends MemoryEntry {
|
|
13
|
+
/** 相关度分数 0-1 */
|
|
14
|
+
relevanceScore: number;
|
|
15
|
+
}
|
|
16
|
+
/** 召回配置 */
|
|
17
|
+
export interface RecallOptions {
|
|
18
|
+
/** 最大返回条数,默认 5 */
|
|
19
|
+
maxResults?: number;
|
|
20
|
+
/** 召回超时(毫秒),默认 3000 */
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
/** 仅召回指定层级 */
|
|
23
|
+
layers?: MemoryLayer[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 智能记忆召回引擎
|
|
27
|
+
*
|
|
28
|
+
* 召回策略(优先级排序):
|
|
29
|
+
* 1. 关键词匹配:userText 分词后与 key/content 做模糊匹配
|
|
30
|
+
* 2. 重要性加权:importance 高的记忆权重更大
|
|
31
|
+
* 3. 时效性衰减:近期更新的记忆优先(updatedAt 越新分数越高)
|
|
32
|
+
*
|
|
33
|
+
* 超时保护:超过 timeoutMs 立即返回空结果,不阻塞对话
|
|
34
|
+
*/
|
|
35
|
+
export declare class MemoryRecallEngine {
|
|
36
|
+
/**
|
|
37
|
+
* 召回相关记忆(带超时保护)
|
|
38
|
+
*/
|
|
39
|
+
recall(userText: string, allMemories: MemoryEntry[], options?: RecallOptions): Promise<RecallResult>;
|
|
40
|
+
private recallInner;
|
|
41
|
+
/**
|
|
42
|
+
* 提取查询词项(简单分词)
|
|
43
|
+
* 支持中英文混合:英文按空格,中文按字
|
|
44
|
+
*/
|
|
45
|
+
private extractTerms;
|
|
46
|
+
/**
|
|
47
|
+
* 计算关键词匹配分数(TF-IDF 加权)
|
|
48
|
+
* 稀有词(出现在少量记忆中)获得更高权重,常见词权重降低
|
|
49
|
+
*/
|
|
50
|
+
private computeKeywordScore;
|
|
51
|
+
/**
|
|
52
|
+
* 构建 IDF 映射表:term → IDF 分数
|
|
53
|
+
* IDF = log(N / df),N=总文档数,df=包含该 term 的文档数
|
|
54
|
+
*/
|
|
55
|
+
private buildIDFMap;
|
|
56
|
+
/**
|
|
57
|
+
* 计算时效性分数(0-1)
|
|
58
|
+
* 24 小时内的记忆得 1.0,30 天前的记忆得 ~0.1
|
|
59
|
+
*/
|
|
60
|
+
private computeRecencyScore;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 将召回结果格式化为可注入 system prompt 的文本
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatRecallForPrompt(result: RecallResult): string;
|
|
66
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,WAAW;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAe;AACf,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,gBAAgB;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAE7B;;OAEG;IACG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EAAE,EAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;YAWV,WAAW;IAgDzB;;;OAGG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAS5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CASlE"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// MemoryRecallEngine — 智能记忆召回引擎(带超时保护)
|
|
3
|
+
// ============================================================
|
|
4
|
+
/**
|
|
5
|
+
* 智能记忆召回引擎
|
|
6
|
+
*
|
|
7
|
+
* 召回策略(优先级排序):
|
|
8
|
+
* 1. 关键词匹配:userText 分词后与 key/content 做模糊匹配
|
|
9
|
+
* 2. 重要性加权:importance 高的记忆权重更大
|
|
10
|
+
* 3. 时效性衰减:近期更新的记忆优先(updatedAt 越新分数越高)
|
|
11
|
+
*
|
|
12
|
+
* 超时保护:超过 timeoutMs 立即返回空结果,不阻塞对话
|
|
13
|
+
*/
|
|
14
|
+
export class MemoryRecallEngine {
|
|
15
|
+
/**
|
|
16
|
+
* 召回相关记忆(带超时保护)
|
|
17
|
+
*/
|
|
18
|
+
async recall(userText, allMemories, options = {}) {
|
|
19
|
+
const timeoutMs = options.timeoutMs ?? 3000;
|
|
20
|
+
return Promise.race([
|
|
21
|
+
this.recallInner(userText, allMemories, options),
|
|
22
|
+
new Promise((resolve) => setTimeout(() => resolve({ entries: [], timedOut: true, strategy: 'timeout' }), timeoutMs)),
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
async recallInner(userText, allMemories, options) {
|
|
26
|
+
const maxResults = options.maxResults ?? 5;
|
|
27
|
+
const layers = options.layers;
|
|
28
|
+
// 层级过滤
|
|
29
|
+
let candidates = layers
|
|
30
|
+
? allMemories.filter(e => layers.includes(e.memoryLayer))
|
|
31
|
+
: allMemories;
|
|
32
|
+
if (candidates.length === 0) {
|
|
33
|
+
return { entries: [], timedOut: false, strategy: 'empty' };
|
|
34
|
+
}
|
|
35
|
+
// 提取查询关键词(简单分词:空格 + 标点切分,过滤短词)
|
|
36
|
+
const queryTerms = this.extractTerms(userText);
|
|
37
|
+
// 构建 IDF 映射表(TF-IDF 加权)
|
|
38
|
+
const idfMap = this.buildIDFMap(queryTerms, candidates);
|
|
39
|
+
// 对每条记忆计算分数
|
|
40
|
+
const scored = candidates.map(entry => {
|
|
41
|
+
const keywordScore = this.computeKeywordScore(entry, queryTerms, idfMap);
|
|
42
|
+
const importanceScore = (entry.importance || 3) / 5; // 0.2 ~ 1.0
|
|
43
|
+
const recencyScore = this.computeRecencyScore(entry.updatedAt); // 0.0 ~ 1.0
|
|
44
|
+
// 加权合成
|
|
45
|
+
const relevanceScore = keywordScore * 0.6 + importanceScore * 0.2 + recencyScore * 0.2;
|
|
46
|
+
return { ...entry, relevanceScore };
|
|
47
|
+
});
|
|
48
|
+
// 过滤低分(阈值 0.05)并排序
|
|
49
|
+
const filtered = scored
|
|
50
|
+
.filter(e => e.relevanceScore > 0.05)
|
|
51
|
+
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
|
52
|
+
.slice(0, maxResults);
|
|
53
|
+
return {
|
|
54
|
+
entries: filtered,
|
|
55
|
+
timedOut: false,
|
|
56
|
+
strategy: filtered.length > 0 ? 'keyword+importance+recency' : 'no_match',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 提取查询词项(简单分词)
|
|
61
|
+
* 支持中英文混合:英文按空格,中文按字
|
|
62
|
+
*/
|
|
63
|
+
extractTerms(text) {
|
|
64
|
+
if (!text)
|
|
65
|
+
return [];
|
|
66
|
+
// 英文:小写 + 按空格/标点切分
|
|
67
|
+
const englishTerms = text
|
|
68
|
+
.toLowerCase()
|
|
69
|
+
.split(/[\s,.!?;:,。!?;:]+/)
|
|
70
|
+
.filter(t => t.length >= 2);
|
|
71
|
+
// 中文:提取连续中文片段,再按 2-gram 切分
|
|
72
|
+
const chineseSegments = text.match(/[\u4e00-\u9fff]{2,}/g) || [];
|
|
73
|
+
const chineseTerms = [];
|
|
74
|
+
for (const seg of chineseSegments) {
|
|
75
|
+
for (let i = 0; i < seg.length - 1; i++) {
|
|
76
|
+
chineseTerms.push(seg.slice(i, i + 2));
|
|
77
|
+
}
|
|
78
|
+
if (seg.length >= 3) {
|
|
79
|
+
for (let i = 0; i < seg.length - 2; i++) {
|
|
80
|
+
chineseTerms.push(seg.slice(i, i + 3));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return [...new Set([...englishTerms, ...chineseTerms])];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 计算关键词匹配分数(TF-IDF 加权)
|
|
88
|
+
* 稀有词(出现在少量记忆中)获得更高权重,常见词权重降低
|
|
89
|
+
*/
|
|
90
|
+
computeKeywordScore(entry, terms, idfMap) {
|
|
91
|
+
if (terms.length === 0)
|
|
92
|
+
return 0;
|
|
93
|
+
const text = `${entry.key} ${entry.content} ${entry.category}`.toLowerCase();
|
|
94
|
+
let weightedScore = 0;
|
|
95
|
+
let totalWeight = 0;
|
|
96
|
+
for (const term of terms) {
|
|
97
|
+
if (text.includes(term.toLowerCase())) {
|
|
98
|
+
const idf = idfMap?.get(term) ?? 1.0;
|
|
99
|
+
weightedScore += idf;
|
|
100
|
+
}
|
|
101
|
+
totalWeight += idfMap?.get(term) ?? 1.0;
|
|
102
|
+
}
|
|
103
|
+
return totalWeight > 0 ? weightedScore / totalWeight : 0;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 构建 IDF 映射表:term → IDF 分数
|
|
107
|
+
* IDF = log(N / df),N=总文档数,df=包含该 term 的文档数
|
|
108
|
+
*/
|
|
109
|
+
buildIDFMap(terms, candidates) {
|
|
110
|
+
const N = candidates.length;
|
|
111
|
+
if (N === 0)
|
|
112
|
+
return new Map();
|
|
113
|
+
const df = new Map();
|
|
114
|
+
for (const term of terms) {
|
|
115
|
+
let count = 0;
|
|
116
|
+
const lowerTerm = term.toLowerCase();
|
|
117
|
+
for (const entry of candidates) {
|
|
118
|
+
const text = `${entry.key} ${entry.content} ${entry.category}`.toLowerCase();
|
|
119
|
+
if (text.includes(lowerTerm))
|
|
120
|
+
count++;
|
|
121
|
+
}
|
|
122
|
+
df.set(term, count);
|
|
123
|
+
}
|
|
124
|
+
const idf = new Map();
|
|
125
|
+
for (const [term, count] of df) {
|
|
126
|
+
// 加 1 平滑避免除零
|
|
127
|
+
idf.set(term, Math.log((N + 1) / (count + 1)) + 1);
|
|
128
|
+
}
|
|
129
|
+
return idf;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 计算时效性分数(0-1)
|
|
133
|
+
* 24 小时内的记忆得 1.0,30 天前的记忆得 ~0.1
|
|
134
|
+
*/
|
|
135
|
+
computeRecencyScore(updatedAt) {
|
|
136
|
+
const age = Date.now() - new Date(updatedAt).getTime();
|
|
137
|
+
const dayMs = 24 * 60 * 60 * 1000;
|
|
138
|
+
if (age < dayMs)
|
|
139
|
+
return 1.0; // 24 小时内
|
|
140
|
+
if (age < 7 * dayMs)
|
|
141
|
+
return 0.8; // 7 天内
|
|
142
|
+
if (age < 30 * dayMs)
|
|
143
|
+
return 0.5; // 30 天内
|
|
144
|
+
return 0.2; // 超过 30 天
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 将召回结果格式化为可注入 system prompt 的文本
|
|
149
|
+
*/
|
|
150
|
+
export function formatRecallForPrompt(result) {
|
|
151
|
+
if (result.entries.length === 0)
|
|
152
|
+
return '';
|
|
153
|
+
const lines = result.entries.map(e => {
|
|
154
|
+
const score = e.relevanceScore.toFixed(2);
|
|
155
|
+
return `- [${e.category}] ${e.key}: ${e.content}(相关度: ${score})`;
|
|
156
|
+
});
|
|
157
|
+
return `## Long-term Memory (auto-recalled, ${result.entries.length} entries)\n${lines.join('\n')}`;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/memory/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { LLMProvider } from '../llm/types.ts';
|
|
2
|
+
/** 场景块(L2) */
|
|
3
|
+
export interface SceneBlock {
|
|
4
|
+
/** 场景 ID(snake_case) */
|
|
5
|
+
sceneId: string;
|
|
6
|
+
/** 场景标题 */
|
|
7
|
+
title: string;
|
|
8
|
+
/** 场景描述 */
|
|
9
|
+
description: string;
|
|
10
|
+
/** 归属的原子事实 ID 列表 */
|
|
11
|
+
atomIds: string[];
|
|
12
|
+
}
|
|
13
|
+
/** 聚合器配置 */
|
|
14
|
+
export interface SceneAggregatorOptions {
|
|
15
|
+
llmProvider: LLMProvider;
|
|
16
|
+
/** 最大场景数,默认 15 */
|
|
17
|
+
maxScenes?: number;
|
|
18
|
+
/** 超时(毫秒),默认 30000 */
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* L2 场景聚合器
|
|
23
|
+
*
|
|
24
|
+
* 工作流程:
|
|
25
|
+
* 1. 收集所有 L1 原子事实
|
|
26
|
+
* 2. 通过 LLM 将相关事实分组为场景块
|
|
27
|
+
* 3. 输出 SceneBlock[],供 MemoryService 更新 L2 条目
|
|
28
|
+
*/
|
|
29
|
+
export declare class SceneAggregator {
|
|
30
|
+
private llmProvider;
|
|
31
|
+
private maxScenes;
|
|
32
|
+
private timeoutMs;
|
|
33
|
+
constructor(opts: SceneAggregatorOptions);
|
|
34
|
+
/**
|
|
35
|
+
* 聚合原子事实为场景块
|
|
36
|
+
* @param atoms L1 原子事实列表(key + content + id)
|
|
37
|
+
* @param existingScenes 已有场景(用于增量更新)
|
|
38
|
+
*/
|
|
39
|
+
aggregate(atoms: Array<{
|
|
40
|
+
id: string;
|
|
41
|
+
key: string;
|
|
42
|
+
content: string;
|
|
43
|
+
category: string;
|
|
44
|
+
}>, existingScenes?: SceneBlock[]): Promise<SceneBlock[]>;
|
|
45
|
+
private buildUserPrompt;
|
|
46
|
+
private callLLM;
|
|
47
|
+
private parseScenes;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/memory/scene.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,sBAAsB;IAMxC;;;;OAIG;IACG,SAAS,CACb,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAC5E,cAAc,GAAE,UAAU,EAAO,GAChC,OAAO,CAAC,UAAU,EAAE,CAAC;IAcxB,OAAO,CAAC,eAAe;YAqBT,OAAO;IAqBrB,OAAO,CAAC,WAAW;CAsBpB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// SceneAggregator — L2 场景聚合器
|
|
3
|
+
// ============================================================
|
|
4
|
+
// 将 L1 原子事实聚合为主题场景块(L2 Scene),
|
|
5
|
+
// 便于召回时按主题整体命中,提升上下文注入效率
|
|
6
|
+
import { SCENE_AGGREGATION_SYSTEM_PROMPT } from "./prompts.js";
|
|
7
|
+
/**
|
|
8
|
+
* L2 场景聚合器
|
|
9
|
+
*
|
|
10
|
+
* 工作流程:
|
|
11
|
+
* 1. 收集所有 L1 原子事实
|
|
12
|
+
* 2. 通过 LLM 将相关事实分组为场景块
|
|
13
|
+
* 3. 输出 SceneBlock[],供 MemoryService 更新 L2 条目
|
|
14
|
+
*/
|
|
15
|
+
export class SceneAggregator {
|
|
16
|
+
llmProvider;
|
|
17
|
+
maxScenes;
|
|
18
|
+
timeoutMs;
|
|
19
|
+
constructor(opts) {
|
|
20
|
+
this.llmProvider = opts.llmProvider;
|
|
21
|
+
this.maxScenes = opts.maxScenes ?? 15;
|
|
22
|
+
this.timeoutMs = opts.timeoutMs ?? 30000;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 聚合原子事实为场景块
|
|
26
|
+
* @param atoms L1 原子事实列表(key + content + id)
|
|
27
|
+
* @param existingScenes 已有场景(用于增量更新)
|
|
28
|
+
*/
|
|
29
|
+
async aggregate(atoms, existingScenes = []) {
|
|
30
|
+
if (atoms.length === 0)
|
|
31
|
+
return existingScenes;
|
|
32
|
+
const userPrompt = this.buildUserPrompt(atoms, existingScenes);
|
|
33
|
+
try {
|
|
34
|
+
const raw = await this.callLLM(userPrompt);
|
|
35
|
+
return this.parseScenes(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.warn(`[SceneAggregator] Aggregation failed: ${err?.message || err}`);
|
|
39
|
+
return existingScenes;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
buildUserPrompt(atoms, existingScenes) {
|
|
43
|
+
const atomsText = atoms
|
|
44
|
+
.map(a => `- [${a.id}] (${a.category}) ${a.key}: ${a.content}`)
|
|
45
|
+
.join('\n');
|
|
46
|
+
let prompt = `**Atomic facts to organize:**\n${atomsText}\n`;
|
|
47
|
+
if (existingScenes.length > 0) {
|
|
48
|
+
const scenesText = existingScenes
|
|
49
|
+
.map(s => `- ${s.sceneId}: ${s.title} (${s.atomIds.length} atoms)`)
|
|
50
|
+
.join('\n');
|
|
51
|
+
prompt += `\n**Existing scenes (merge/update as needed):**\n${scenesText}\n`;
|
|
52
|
+
}
|
|
53
|
+
prompt += `\nGroup these facts into at most ${this.maxScenes} thematic scenarios. Output ONLY a JSON array.`;
|
|
54
|
+
return prompt;
|
|
55
|
+
}
|
|
56
|
+
async callLLM(userPrompt) {
|
|
57
|
+
const messages = [
|
|
58
|
+
{ role: 'system', content: SCENE_AGGREGATION_SYSTEM_PROMPT },
|
|
59
|
+
{ role: 'user', content: userPrompt },
|
|
60
|
+
];
|
|
61
|
+
const chunks = [];
|
|
62
|
+
const stream = this.llmProvider.chatStream({
|
|
63
|
+
messages,
|
|
64
|
+
abortSignal: AbortSignal.timeout(this.timeoutMs),
|
|
65
|
+
});
|
|
66
|
+
for await (const chunk of stream) {
|
|
67
|
+
if (chunk.delta.content) {
|
|
68
|
+
chunks.push(chunk.delta.content);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return chunks.join('');
|
|
72
|
+
}
|
|
73
|
+
parseScenes(raw) {
|
|
74
|
+
const jsonMatch = raw.match(/\[[\s\S]*\]/);
|
|
75
|
+
if (!jsonMatch)
|
|
76
|
+
return [];
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
79
|
+
if (!Array.isArray(parsed))
|
|
80
|
+
return [];
|
|
81
|
+
return parsed
|
|
82
|
+
.filter((item) => item.sceneId && item.title)
|
|
83
|
+
.slice(0, this.maxScenes)
|
|
84
|
+
.map((item) => ({
|
|
85
|
+
sceneId: String(item.sceneId).replace(/[^a-z0-9_]/g, '_').toLowerCase(),
|
|
86
|
+
title: String(item.title),
|
|
87
|
+
description: String(item.description || ''),
|
|
88
|
+
atomIds: Array.isArray(item.atomIds) ? item.atomIds.map(String) : [],
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
console.warn('[SceneAggregator] Failed to parse LLM output');
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../../../src/memory/scene.ts"],"names":[],"mappings":"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"}
|