@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
package/src/memory/extractor.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// MemoryExtractor — LLM 驱动的原子事实提取器
|
|
3
|
-
// ============================================================
|
|
4
|
-
|
|
5
|
-
import type { LLMProvider } from '../llm/types.ts';
|
|
6
|
-
import type { Message } from '../types.ts';
|
|
7
|
-
import {
|
|
8
|
-
EXTRACTION_SYSTEM_PROMPT,
|
|
9
|
-
buildExtractionUserPrompt,
|
|
10
|
-
} from './prompts.ts';
|
|
11
|
-
|
|
12
|
-
/** 从对话中提取的原子事实 */
|
|
13
|
-
export interface AtomFact {
|
|
14
|
-
/** 记忆键(snake_case,用于 upsert) */
|
|
15
|
-
key: string;
|
|
16
|
-
/** 事实内容 */
|
|
17
|
-
content: string;
|
|
18
|
-
/** 分类 */
|
|
19
|
-
category: 'user_preference' | 'project_knowledge' | 'learned_fact' | 'custom';
|
|
20
|
-
/** 重要程度 1-5 */
|
|
21
|
-
importance: number;
|
|
22
|
-
/** 来源会话 ID */
|
|
23
|
-
sourceSessionId: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** 提取配置 */
|
|
27
|
-
export interface ExtractorOptions {
|
|
28
|
-
/** LLM Provider 实例 */
|
|
29
|
-
llmProvider: LLMProvider;
|
|
30
|
-
/** 单次提取最大原子事实数,默认 5 */
|
|
31
|
-
maxFactsPerSession?: number;
|
|
32
|
-
/** 触发提取的最小迭代次数,默认 3 */
|
|
33
|
-
minIterations?: number;
|
|
34
|
-
/** 提取超时(毫秒),默认 30000 */
|
|
35
|
-
timeoutMs?: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* LLM 驱动的原子事实提取器
|
|
40
|
-
* 从对话历史中提取持久性、可复用的结构化事实(L1 Atom)
|
|
41
|
-
*/
|
|
42
|
-
export class MemoryExtractor {
|
|
43
|
-
private llmProvider: LLMProvider;
|
|
44
|
-
private maxFactsPerSession: number;
|
|
45
|
-
private minIterations: number;
|
|
46
|
-
private timeoutMs: number;
|
|
47
|
-
|
|
48
|
-
constructor(opts: ExtractorOptions) {
|
|
49
|
-
this.llmProvider = opts.llmProvider;
|
|
50
|
-
this.maxFactsPerSession = opts.maxFactsPerSession ?? 5;
|
|
51
|
-
this.minIterations = opts.minIterations ?? 3;
|
|
52
|
-
this.timeoutMs = opts.timeoutMs ?? 30000;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 从对话消息中提取原子事实
|
|
57
|
-
* @param messages 对话消息列表
|
|
58
|
-
* @param sessionId 当前会话 ID
|
|
59
|
-
* @param existingKeys 已有的记忆键(用于去重)
|
|
60
|
-
* @returns 提取到的原子事实数组
|
|
61
|
-
*/
|
|
62
|
-
async extract(
|
|
63
|
-
messages: Message[],
|
|
64
|
-
sessionId: string,
|
|
65
|
-
existingKeys: string[],
|
|
66
|
-
): Promise<AtomFact[]> {
|
|
67
|
-
// 构建对话摘要(避免超长对话)
|
|
68
|
-
const summary = this.buildMessagesSummary(messages);
|
|
69
|
-
|
|
70
|
-
const userPrompt = buildExtractionUserPrompt(summary, existingKeys);
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const result = await this.callLLM(userPrompt);
|
|
74
|
-
return this.parseFacts(result, sessionId);
|
|
75
|
-
} catch (err: any) {
|
|
76
|
-
console.warn(`[MemoryExtractor] Extraction failed: ${err?.message || err}`);
|
|
77
|
-
return [];
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 调用 LLM 提取事实
|
|
83
|
-
*/
|
|
84
|
-
private async callLLM(userPrompt: string): Promise<string> {
|
|
85
|
-
const messages: Message[] = [
|
|
86
|
-
{ role: 'system', content: EXTRACTION_SYSTEM_PROMPT },
|
|
87
|
-
{ role: 'user', content: userPrompt },
|
|
88
|
-
];
|
|
89
|
-
|
|
90
|
-
const chunks: string[] = [];
|
|
91
|
-
const stream = this.llmProvider.chatStream({
|
|
92
|
-
messages,
|
|
93
|
-
abortSignal: AbortSignal.timeout(this.timeoutMs),
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
for await (const chunk of stream) {
|
|
97
|
-
if (chunk.delta.content) {
|
|
98
|
-
chunks.push(chunk.delta.content);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return chunks.join('');
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* 解析 LLM 输出的 JSON 数组
|
|
107
|
-
*/
|
|
108
|
-
private parseFacts(raw: string, sessionId: string): AtomFact[] {
|
|
109
|
-
// 尝试提取 JSON 数组(LLM 可能输出额外文本)
|
|
110
|
-
const jsonMatch = raw.match(/\[[\s\S]*\]/);
|
|
111
|
-
if (!jsonMatch) return [];
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
115
|
-
if (!Array.isArray(parsed)) return [];
|
|
116
|
-
|
|
117
|
-
return parsed
|
|
118
|
-
.filter((item: any) => item.key && item.content)
|
|
119
|
-
.slice(0, this.maxFactsPerSession)
|
|
120
|
-
.map((item: any) => ({
|
|
121
|
-
key: String(item.key).replace(/[^a-z0-9_]/g, '_').toLowerCase(),
|
|
122
|
-
content: String(item.content),
|
|
123
|
-
category: this.normalizeCategory(item.category),
|
|
124
|
-
importance: Math.min(5, Math.max(1, Number(item.importance) || 3)),
|
|
125
|
-
sourceSessionId: sessionId,
|
|
126
|
-
}));
|
|
127
|
-
} catch {
|
|
128
|
-
console.warn('[MemoryExtractor] Failed to parse LLM output as JSON');
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
private normalizeCategory(cat: string): AtomFact['category'] {
|
|
134
|
-
const valid: AtomFact['category'][] = ['user_preference', 'project_knowledge', 'learned_fact', 'custom'];
|
|
135
|
-
return valid.includes(cat as AtomFact['category']) ? (cat as AtomFact['category']) : 'custom';
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* 构建对话摘要(将消息列表压缩为文本,限制总字符数)
|
|
140
|
-
*/
|
|
141
|
-
private buildMessagesSummary(messages: Message[]): string {
|
|
142
|
-
const maxChars = 6000;
|
|
143
|
-
const lines: string[] = [];
|
|
144
|
-
let totalLen = 0;
|
|
145
|
-
|
|
146
|
-
for (const msg of messages) {
|
|
147
|
-
if (msg.role === 'system') continue;
|
|
148
|
-
const role = msg.role === 'user' ? 'USER' : msg.role === 'assistant' ? 'ASSISTANT' : 'TOOL';
|
|
149
|
-
const content = typeof msg.content === 'string'
|
|
150
|
-
? msg.content.slice(0, 500)
|
|
151
|
-
: JSON.stringify(msg.content).slice(0, 500);
|
|
152
|
-
const line = `[${role}] ${content}`;
|
|
153
|
-
|
|
154
|
-
if (totalLen + line.length > maxChars) {
|
|
155
|
-
lines.push(`... (${messages.length - lines.length} more messages truncated)`);
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
lines.push(line);
|
|
159
|
-
totalLen += line.length;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return lines.join('\n');
|
|
163
|
-
}
|
|
164
|
-
}
|
package/src/memory/persona.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// PersonaGenerator — L3 用户画像生成器
|
|
3
|
-
// ============================================================
|
|
4
|
-
// 基于 L2 场景块生成/增量更新用户画像(L3 Persona),
|
|
5
|
-
// 画像以 markdown 格式存储,注入 prompt 时提供用户全貌
|
|
6
|
-
|
|
7
|
-
import type { LLMProvider } from '../llm/types.ts';
|
|
8
|
-
import type { Message } from '../types.ts';
|
|
9
|
-
import { PERSONA_GENERATION_SYSTEM_PROMPT } from './prompts.ts';
|
|
10
|
-
import type { SceneBlock } from './scene.ts';
|
|
11
|
-
|
|
12
|
-
/** 画像维度 */
|
|
13
|
-
export interface PersonaFacet {
|
|
14
|
-
/** 维度键(如 coding_style, tool_preference) */
|
|
15
|
-
key: string;
|
|
16
|
-
/** 维度内容(markdown) */
|
|
17
|
-
content: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** 画像生成器配置 */
|
|
21
|
-
export interface PersonaGeneratorOptions {
|
|
22
|
-
llmProvider: LLMProvider;
|
|
23
|
-
/** 超时(毫秒),默认 30000 */
|
|
24
|
-
timeoutMs?: number;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* L3 用户画像生成器
|
|
29
|
-
*
|
|
30
|
-
* 工作流程:
|
|
31
|
-
* 1. 接收 L2 场景块列表
|
|
32
|
-
* 2. 通过 LLM 从场景中提炼稳定用户特征
|
|
33
|
-
* 3. 增量更新画像(保留已有内容,仅修改受影响的部分)
|
|
34
|
-
*/
|
|
35
|
-
export class PersonaGenerator {
|
|
36
|
-
private llmProvider: LLMProvider;
|
|
37
|
-
private timeoutMs: number;
|
|
38
|
-
|
|
39
|
-
constructor(opts: PersonaGeneratorOptions) {
|
|
40
|
-
this.llmProvider = opts.llmProvider;
|
|
41
|
-
this.timeoutMs = opts.timeoutMs ?? 30000;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 生成或更新用户画像
|
|
46
|
-
* @param scenes L2 场景块列表
|
|
47
|
-
* @param existingPersona 已有画像(markdown 文本,用于增量更新)
|
|
48
|
-
* @returns 更新后的画像 markdown
|
|
49
|
-
*/
|
|
50
|
-
async generate(
|
|
51
|
-
scenes: SceneBlock[],
|
|
52
|
-
existingPersona: string = '',
|
|
53
|
-
): Promise<string> {
|
|
54
|
-
if (scenes.length === 0 && !existingPersona) return '';
|
|
55
|
-
|
|
56
|
-
const userPrompt = this.buildUserPrompt(scenes, existingPersona);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
return await this.callLLM(userPrompt);
|
|
60
|
-
} catch (err: any) {
|
|
61
|
-
console.warn(`[PersonaGenerator] Generation failed: ${err?.message || err}`);
|
|
62
|
-
return existingPersona;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
private buildUserPrompt(scenes: SceneBlock[], existingPersona: string): string {
|
|
67
|
-
let prompt = '';
|
|
68
|
-
|
|
69
|
-
if (scenes.length > 0) {
|
|
70
|
-
const scenesText = scenes
|
|
71
|
-
.map(s => `### ${s.title}\n${s.description}\nAtoms: ${s.atomIds.length}`)
|
|
72
|
-
.join('\n\n');
|
|
73
|
-
prompt += `**Scenario blocks:**\n${scenesText}\n\n`;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if (existingPersona) {
|
|
77
|
-
prompt += `**Existing persona (update incrementally, preserve unaffected sections):**\n${existingPersona}\n\n`;
|
|
78
|
-
prompt += `Update the persona based on the new scenario blocks above. Preserve sections not affected by new data.`;
|
|
79
|
-
} else {
|
|
80
|
-
prompt += `Generate a user persona based on the scenario blocks above. Use markdown with clear section headers.`;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return prompt;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private async callLLM(userPrompt: string): Promise<string> {
|
|
87
|
-
const messages: Message[] = [
|
|
88
|
-
{ role: 'system', content: PERSONA_GENERATION_SYSTEM_PROMPT },
|
|
89
|
-
{ role: 'user', content: userPrompt },
|
|
90
|
-
];
|
|
91
|
-
|
|
92
|
-
const chunks: string[] = [];
|
|
93
|
-
const stream = this.llmProvider.chatStream({
|
|
94
|
-
messages,
|
|
95
|
-
abortSignal: AbortSignal.timeout(this.timeoutMs),
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
for await (const chunk of stream) {
|
|
99
|
-
if (chunk.delta.content) {
|
|
100
|
-
chunks.push(chunk.delta.content);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return chunks.join('').trim();
|
|
105
|
-
}
|
|
106
|
-
}
|
package/src/memory/pipeline.ts
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// MemoryPipeline — L1→L2→L3 记忆管道调度器
|
|
3
|
-
// ============================================================
|
|
4
|
-
// 调度记忆层级的渐进式提炼:
|
|
5
|
-
// L1 (原子事实) → L2 (场景聚合) → L3 (用户画像)
|
|
6
|
-
// 在对话结束后 fire-and-forget 触发
|
|
7
|
-
|
|
8
|
-
import type { LLMProvider } from '../llm/types.ts';
|
|
9
|
-
import type { MemoryEntry, MemoryLayer, MemoryServiceLike } from './types.ts';
|
|
10
|
-
import { MemoryExtractor } from './extractor.ts';
|
|
11
|
-
import { SceneAggregator, type SceneBlock } from './scene.ts';
|
|
12
|
-
import { PersonaGenerator } from './persona.ts';
|
|
13
|
-
import { getMemoryCheckpoint } from './checkpoint.ts';
|
|
14
|
-
import type { Message } from '../types.ts';
|
|
15
|
-
|
|
16
|
-
/** 管道配置 */
|
|
17
|
-
export interface PipelineOptions {
|
|
18
|
-
llmProvider: LLMProvider;
|
|
19
|
-
/** 触发 L2 聚合的 L1 增量阈值(新 L1 条目数),默认 5 */
|
|
20
|
-
l2Threshold?: number;
|
|
21
|
-
/** 触发 L3 画像更新的 L2 增量阈值,默认 3 */
|
|
22
|
-
l3Threshold?: number;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** 管道执行结果 */
|
|
26
|
-
export interface PipelineResult {
|
|
27
|
-
/** 本次提取的 L1 原子事实数 */
|
|
28
|
-
l1Extracted: number;
|
|
29
|
-
/** 是否触发了 L2 聚合 */
|
|
30
|
-
l2Triggered: boolean;
|
|
31
|
-
/** 是否触发了 L3 画像更新 */
|
|
32
|
-
l3Triggered: boolean;
|
|
33
|
-
/** 新的场景块(如果触发了 L2) */
|
|
34
|
-
newScenes?: SceneBlock[];
|
|
35
|
-
/** 更新的画像(如果触发了 L3) */
|
|
36
|
-
newPersona?: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* 记忆管道调度器
|
|
41
|
-
*
|
|
42
|
-
* 调度策略:
|
|
43
|
-
* 1. 每次对话结束:提取 L1 原子事实
|
|
44
|
-
* 2. L1 累积达到阈值:触发 L2 场景聚合
|
|
45
|
-
* 3. L2 累积达到阈值:触发 L3 画像生成
|
|
46
|
-
*
|
|
47
|
-
* 所有操作均为 fire-and-forget,不阻塞对话响应
|
|
48
|
-
*/
|
|
49
|
-
export class MemoryPipeline {
|
|
50
|
-
private llmProvider: LLMProvider;
|
|
51
|
-
private l2Threshold: number;
|
|
52
|
-
private l3Threshold: number;
|
|
53
|
-
|
|
54
|
-
constructor(opts: PipelineOptions) {
|
|
55
|
-
this.llmProvider = opts.llmProvider;
|
|
56
|
-
this.l2Threshold = opts.l2Threshold ?? 5;
|
|
57
|
-
this.l3Threshold = opts.l3Threshold ?? 3;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 执行完整管道(L1 提取 → 条件触发 L2 → 条件触发 L3)
|
|
62
|
-
*
|
|
63
|
-
* @param messages 对话消息
|
|
64
|
-
* @param sessionId 会话 ID
|
|
65
|
-
* @param memoryService MemoryService 实例(延迟导入避免循环依赖)
|
|
66
|
-
*/
|
|
67
|
-
async run(
|
|
68
|
-
messages: Message[],
|
|
69
|
-
sessionId: string,
|
|
70
|
-
memoryService: MemoryServiceLike,
|
|
71
|
-
): Promise<PipelineResult> {
|
|
72
|
-
const result: PipelineResult = {
|
|
73
|
-
l1Extracted: 0,
|
|
74
|
-
l2Triggered: false,
|
|
75
|
-
l3Triggered: false,
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
// === Phase 1: L1 提取 ===
|
|
79
|
-
const existingKeys = memoryService.getKeys();
|
|
80
|
-
const extractor = new MemoryExtractor({ llmProvider: this.llmProvider });
|
|
81
|
-
const facts = await extractor.extract(messages, sessionId, existingKeys);
|
|
82
|
-
|
|
83
|
-
// 写入 L1 条目
|
|
84
|
-
for (const fact of facts) {
|
|
85
|
-
memoryService.save(fact.key, fact.content, fact.category, fact.importance, {
|
|
86
|
-
memoryLayer: 'L1',
|
|
87
|
-
sourceSessionId: sessionId,
|
|
88
|
-
sourceTimestamp: new Date().toISOString(),
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
result.l1Extracted = facts.length;
|
|
92
|
-
|
|
93
|
-
if (facts.length === 0) return result;
|
|
94
|
-
|
|
95
|
-
console.log(`[Pipeline] L1: extracted ${facts.length} facts from session ${sessionId}`);
|
|
96
|
-
|
|
97
|
-
// === Phase 2: 条件触发 L2 聚合 ===
|
|
98
|
-
const l1Entries = memoryService.getAllEntries('L1');
|
|
99
|
-
const l1Count = l1Entries.length;
|
|
100
|
-
const checkpoint = getMemoryCheckpoint();
|
|
101
|
-
|
|
102
|
-
if (checkpoint.shouldTriggerL2(l1Count, this.l2Threshold)) {
|
|
103
|
-
try {
|
|
104
|
-
const existingL2 = memoryService.getAllEntries('L2');
|
|
105
|
-
const existingScenes: SceneBlock[] = existingL2.map(e => ({
|
|
106
|
-
sceneId: e.sceneId || e.key,
|
|
107
|
-
title: e.key,
|
|
108
|
-
description: e.content,
|
|
109
|
-
atomIds: e.sourceIds || [],
|
|
110
|
-
}));
|
|
111
|
-
|
|
112
|
-
const aggregator = new SceneAggregator({ llmProvider: this.llmProvider });
|
|
113
|
-
const atoms = l1Entries.map(e => ({
|
|
114
|
-
id: e.id,
|
|
115
|
-
key: e.key,
|
|
116
|
-
content: e.content,
|
|
117
|
-
category: e.category,
|
|
118
|
-
}));
|
|
119
|
-
|
|
120
|
-
const scenes = await aggregator.aggregate(atoms, existingScenes);
|
|
121
|
-
result.l2Triggered = true;
|
|
122
|
-
result.newScenes = scenes;
|
|
123
|
-
|
|
124
|
-
// 写入 L2 条目(upsert by sceneId)
|
|
125
|
-
for (const scene of scenes) {
|
|
126
|
-
memoryService.save(scene.sceneId, `${scene.title}\n${scene.description}`, 'scene', 4, {
|
|
127
|
-
memoryLayer: 'L2',
|
|
128
|
-
sceneId: scene.sceneId,
|
|
129
|
-
sourceLayer: 'L1',
|
|
130
|
-
sourceIds: scene.atomIds,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// 回填 L1 条目的 sceneId
|
|
135
|
-
for (const scene of scenes) {
|
|
136
|
-
for (const atomId of scene.atomIds) {
|
|
137
|
-
const entry = l1Entries.find(e => e.id === atomId);
|
|
138
|
-
if (entry && entry.sceneId !== scene.sceneId) {
|
|
139
|
-
memoryService.save(entry.key, entry.content, entry.category, entry.importance, {
|
|
140
|
-
memoryLayer: 'L1',
|
|
141
|
-
sceneId: scene.sceneId,
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
console.log(`[Pipeline] L2: aggregated ${scenes.length} scenes from ${l1Count} atoms`);
|
|
148
|
-
|
|
149
|
-
// 更新检查点
|
|
150
|
-
checkpoint.updateL2(l1Count);
|
|
151
|
-
} catch (err: any) {
|
|
152
|
-
console.warn(`[Pipeline] L2 aggregation failed:`, err?.message);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// === Phase 3: 条件触发 L3 画像 ===
|
|
157
|
-
const l2Entries = memoryService.getAllEntries('L2');
|
|
158
|
-
if (checkpoint.shouldTriggerL3(l2Entries.length, this.l3Threshold)) {
|
|
159
|
-
try {
|
|
160
|
-
const existingL3 = memoryService.getAllEntries('L3');
|
|
161
|
-
const existingPersona = existingL3.length > 0 ? existingL3[0].content : '';
|
|
162
|
-
|
|
163
|
-
const generator = new PersonaGenerator({ llmProvider: this.llmProvider });
|
|
164
|
-
const scenes: SceneBlock[] = l2Entries.map(e => ({
|
|
165
|
-
sceneId: e.sceneId || e.key,
|
|
166
|
-
title: e.key,
|
|
167
|
-
description: e.content,
|
|
168
|
-
atomIds: e.sourceIds || [],
|
|
169
|
-
}));
|
|
170
|
-
|
|
171
|
-
const persona = await generator.generate(scenes, existingPersona);
|
|
172
|
-
result.l3Triggered = true;
|
|
173
|
-
result.newPersona = persona;
|
|
174
|
-
|
|
175
|
-
if (persona) {
|
|
176
|
-
memoryService.save('user_persona', persona, 'persona', 5, {
|
|
177
|
-
memoryLayer: 'L3',
|
|
178
|
-
sourceLayer: 'L2',
|
|
179
|
-
sourceIds: l2Entries.map(e => e.id),
|
|
180
|
-
});
|
|
181
|
-
console.log(`[Pipeline] L3: persona updated (${persona.length} chars)`);
|
|
182
|
-
checkpoint.updateL3(l2Entries.length);
|
|
183
|
-
}
|
|
184
|
-
} catch (err: any) {
|
|
185
|
-
console.warn(`[Pipeline] L3 generation failed:`, err?.message);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return result;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
package/src/memory/recall.ts
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// MemoryRecallEngine — 智能记忆召回引擎(带超时保护)
|
|
3
|
-
// ============================================================
|
|
4
|
-
|
|
5
|
-
import type { MemoryEntry, MemoryLayer } from './types.ts';
|
|
6
|
-
|
|
7
|
-
/** 召回结果 */
|
|
8
|
-
export interface RecallResult {
|
|
9
|
-
/** 召回的记忆条目(按相关度排序) */
|
|
10
|
-
entries: ScoredMemoryEntry[];
|
|
11
|
-
/** 是否超时 */
|
|
12
|
-
timedOut: boolean;
|
|
13
|
-
/** 召回策略描述 */
|
|
14
|
-
strategy: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** 带分数的记忆条目 */
|
|
18
|
-
export interface ScoredMemoryEntry extends MemoryEntry {
|
|
19
|
-
/** 相关度分数 0-1 */
|
|
20
|
-
relevanceScore: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** 召回配置 */
|
|
24
|
-
export interface RecallOptions {
|
|
25
|
-
/** 最大返回条数,默认 5 */
|
|
26
|
-
maxResults?: number;
|
|
27
|
-
/** 召回超时(毫秒),默认 3000 */
|
|
28
|
-
timeoutMs?: number;
|
|
29
|
-
/** 仅召回指定层级 */
|
|
30
|
-
layers?: MemoryLayer[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 智能记忆召回引擎
|
|
35
|
-
*
|
|
36
|
-
* 召回策略(优先级排序):
|
|
37
|
-
* 1. 关键词匹配:userText 分词后与 key/content 做模糊匹配
|
|
38
|
-
* 2. 重要性加权:importance 高的记忆权重更大
|
|
39
|
-
* 3. 时效性衰减:近期更新的记忆优先(updatedAt 越新分数越高)
|
|
40
|
-
*
|
|
41
|
-
* 超时保护:超过 timeoutMs 立即返回空结果,不阻塞对话
|
|
42
|
-
*/
|
|
43
|
-
export class MemoryRecallEngine {
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* 召回相关记忆(带超时保护)
|
|
47
|
-
*/
|
|
48
|
-
async recall(
|
|
49
|
-
userText: string,
|
|
50
|
-
allMemories: MemoryEntry[],
|
|
51
|
-
options: RecallOptions = {},
|
|
52
|
-
): Promise<RecallResult> {
|
|
53
|
-
const timeoutMs = options.timeoutMs ?? 3000;
|
|
54
|
-
|
|
55
|
-
return Promise.race([
|
|
56
|
-
this.recallInner(userText, allMemories, options),
|
|
57
|
-
new Promise<RecallResult>((resolve) =>
|
|
58
|
-
setTimeout(() => resolve({ entries: [], timedOut: true, strategy: 'timeout' }), timeoutMs),
|
|
59
|
-
),
|
|
60
|
-
]);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private async recallInner(
|
|
64
|
-
userText: string,
|
|
65
|
-
allMemories: MemoryEntry[],
|
|
66
|
-
options: RecallOptions,
|
|
67
|
-
): Promise<RecallResult> {
|
|
68
|
-
const maxResults = options.maxResults ?? 5;
|
|
69
|
-
const layers = options.layers;
|
|
70
|
-
|
|
71
|
-
// 层级过滤
|
|
72
|
-
let candidates = layers
|
|
73
|
-
? allMemories.filter(e => layers.includes(e.memoryLayer))
|
|
74
|
-
: allMemories;
|
|
75
|
-
|
|
76
|
-
if (candidates.length === 0) {
|
|
77
|
-
return { entries: [], timedOut: false, strategy: 'empty' };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 提取查询关键词(简单分词:空格 + 标点切分,过滤短词)
|
|
81
|
-
const queryTerms = this.extractTerms(userText);
|
|
82
|
-
|
|
83
|
-
// 构建 IDF 映射表(TF-IDF 加权)
|
|
84
|
-
const idfMap = this.buildIDFMap(queryTerms, candidates);
|
|
85
|
-
|
|
86
|
-
// 对每条记忆计算分数
|
|
87
|
-
const scored: ScoredMemoryEntry[] = candidates.map(entry => {
|
|
88
|
-
const keywordScore = this.computeKeywordScore(entry, queryTerms, idfMap);
|
|
89
|
-
const importanceScore = (entry.importance || 3) / 5; // 0.2 ~ 1.0
|
|
90
|
-
const recencyScore = this.computeRecencyScore(entry.updatedAt); // 0.0 ~ 1.0
|
|
91
|
-
|
|
92
|
-
// 加权合成
|
|
93
|
-
const relevanceScore = keywordScore * 0.6 + importanceScore * 0.2 + recencyScore * 0.2;
|
|
94
|
-
|
|
95
|
-
return { ...entry, relevanceScore };
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// 过滤低分(阈值 0.05)并排序
|
|
99
|
-
const filtered = scored
|
|
100
|
-
.filter(e => e.relevanceScore > 0.05)
|
|
101
|
-
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
|
102
|
-
.slice(0, maxResults);
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
entries: filtered,
|
|
106
|
-
timedOut: false,
|
|
107
|
-
strategy: filtered.length > 0 ? 'keyword+importance+recency' : 'no_match',
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* 提取查询词项(简单分词)
|
|
113
|
-
* 支持中英文混合:英文按空格,中文按字
|
|
114
|
-
*/
|
|
115
|
-
private extractTerms(text: string): string[] {
|
|
116
|
-
if (!text) return [];
|
|
117
|
-
|
|
118
|
-
// 英文:小写 + 按空格/标点切分
|
|
119
|
-
const englishTerms = text
|
|
120
|
-
.toLowerCase()
|
|
121
|
-
.split(/[\s,.!?;:,。!?;:]+/)
|
|
122
|
-
.filter(t => t.length >= 2);
|
|
123
|
-
|
|
124
|
-
// 中文:提取连续中文片段,再按 2-gram 切分
|
|
125
|
-
const chineseSegments = text.match(/[\u4e00-\u9fff]{2,}/g) || [];
|
|
126
|
-
const chineseTerms: string[] = [];
|
|
127
|
-
for (const seg of chineseSegments) {
|
|
128
|
-
for (let i = 0; i < seg.length - 1; i++) {
|
|
129
|
-
chineseTerms.push(seg.slice(i, i + 2));
|
|
130
|
-
}
|
|
131
|
-
if (seg.length >= 3) {
|
|
132
|
-
for (let i = 0; i < seg.length - 2; i++) {
|
|
133
|
-
chineseTerms.push(seg.slice(i, i + 3));
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
return [...new Set([...englishTerms, ...chineseTerms])];
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* 计算关键词匹配分数(TF-IDF 加权)
|
|
143
|
-
* 稀有词(出现在少量记忆中)获得更高权重,常见词权重降低
|
|
144
|
-
*/
|
|
145
|
-
private computeKeywordScore(entry: MemoryEntry, terms: string[], idfMap?: Map<string, number>): number {
|
|
146
|
-
if (terms.length === 0) return 0;
|
|
147
|
-
|
|
148
|
-
const text = `${entry.key} ${entry.content} ${entry.category}`.toLowerCase();
|
|
149
|
-
let weightedScore = 0;
|
|
150
|
-
let totalWeight = 0;
|
|
151
|
-
|
|
152
|
-
for (const term of terms) {
|
|
153
|
-
if (text.includes(term.toLowerCase())) {
|
|
154
|
-
const idf = idfMap?.get(term) ?? 1.0;
|
|
155
|
-
weightedScore += idf;
|
|
156
|
-
}
|
|
157
|
-
totalWeight += idfMap?.get(term) ?? 1.0;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return totalWeight > 0 ? weightedScore / totalWeight : 0;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* 构建 IDF 映射表:term → IDF 分数
|
|
165
|
-
* IDF = log(N / df),N=总文档数,df=包含该 term 的文档数
|
|
166
|
-
*/
|
|
167
|
-
private buildIDFMap(terms: string[], candidates: MemoryEntry[]): Map<string, number> {
|
|
168
|
-
const N = candidates.length;
|
|
169
|
-
if (N === 0) return new Map();
|
|
170
|
-
|
|
171
|
-
const df = new Map<string, number>();
|
|
172
|
-
for (const term of terms) {
|
|
173
|
-
let count = 0;
|
|
174
|
-
const lowerTerm = term.toLowerCase();
|
|
175
|
-
for (const entry of candidates) {
|
|
176
|
-
const text = `${entry.key} ${entry.content} ${entry.category}`.toLowerCase();
|
|
177
|
-
if (text.includes(lowerTerm)) count++;
|
|
178
|
-
}
|
|
179
|
-
df.set(term, count);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const idf = new Map<string, number>();
|
|
183
|
-
for (const [term, count] of df) {
|
|
184
|
-
// 加 1 平滑避免除零
|
|
185
|
-
idf.set(term, Math.log((N + 1) / (count + 1)) + 1);
|
|
186
|
-
}
|
|
187
|
-
return idf;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* 计算时效性分数(0-1)
|
|
192
|
-
* 24 小时内的记忆得 1.0,30 天前的记忆得 ~0.1
|
|
193
|
-
*/
|
|
194
|
-
private computeRecencyScore(updatedAt: string): number {
|
|
195
|
-
const age = Date.now() - new Date(updatedAt).getTime();
|
|
196
|
-
const dayMs = 24 * 60 * 60 * 1000;
|
|
197
|
-
|
|
198
|
-
if (age < dayMs) return 1.0; // 24 小时内
|
|
199
|
-
if (age < 7 * dayMs) return 0.8; // 7 天内
|
|
200
|
-
if (age < 30 * dayMs) return 0.5; // 30 天内
|
|
201
|
-
return 0.2; // 超过 30 天
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* 将召回结果格式化为可注入 system prompt 的文本
|
|
207
|
-
*/
|
|
208
|
-
export function formatRecallForPrompt(result: RecallResult): string {
|
|
209
|
-
if (result.entries.length === 0) return '';
|
|
210
|
-
|
|
211
|
-
const lines = result.entries.map(e => {
|
|
212
|
-
const score = e.relevanceScore.toFixed(2);
|
|
213
|
-
return `- [${e.category}] ${e.key}: ${e.content}(相关度: ${score})`;
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
return `## Long-term Memory (auto-recalled, ${result.entries.length} entries)\n${lines.join('\n')}`;
|
|
217
|
-
}
|