aws-runtime-bridge 1.9.79 → 1.9.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/AcodeSdkAdapter.js +11 -1986
- package/dist/adapter/AdapterRegistry.d.ts +0 -1
- package/dist/adapter/AdapterRegistry.js +2 -100
- package/dist/adapter/ClaudeSdkAdapter.d.ts +0 -1
- package/dist/adapter/ClaudeSdkAdapter.js +4 -1300
- package/dist/adapter/CodexSdkAdapter.d.ts +0 -1
- package/dist/adapter/CodexSdkAdapter.js +4 -836
- package/dist/adapter/OpencodeSdkAdapter.d.ts +0 -1
- package/dist/adapter/OpencodeSdkAdapter.js +4 -879
- package/dist/adapter/SdkProviderSpi.d.ts +0 -1
- package/dist/adapter/SdkProviderSpi.js +2 -55
- package/dist/adapter/acode-tool-names.d.ts +0 -1
- package/dist/adapter/acode-tool-names.js +2 -37
- package/dist/adapter/idle-poll-loop.d.ts +0 -1
- package/dist/adapter/idle-poll-loop.js +2 -59
- package/dist/adapter/index.d.ts +0 -1
- package/dist/adapter/index.js +2 -11
- package/dist/adapter/instance-ai-config-resolver.d.ts +0 -1
- package/dist/adapter/instance-ai-config-resolver.js +2 -46
- package/dist/adapter/types.d.ts +0 -1
- package/dist/adapter/types.js +2 -443
- package/dist/adapters/cc-switch/common.d.ts +0 -1
- package/dist/adapters/cc-switch/common.js +2 -61
- package/dist/adapters/cc-switch/index.d.ts +0 -1
- package/dist/adapters/cc-switch/index.js +2 -57
- package/dist/adapters/cc-switch/mcp-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-acode.js +2 -71
- package/dist/adapters/cc-switch/mcp-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claude.js +2 -89
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.js +2 -77
- package/dist/adapters/cc-switch/mcp-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-codex.js +11 -249
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.js +2 -97
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.js +2 -19
- package/dist/adapters/cc-switch/skill-acode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-acode.js +2 -12
- package/dist/adapters/cc-switch/skill-claude.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claude.js +2 -11
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.js +2 -11
- package/dist/adapters/cc-switch/skill-codex.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-codex.js +2 -6
- package/dist/adapters/cc-switch/skill-directory.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-directory.js +3 -137
- package/dist/adapters/cc-switch/skill-opencode.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-opencode.js +2 -11
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.js +2 -19
- package/dist/config.d.ts +0 -1
- package/dist/config.js +2 -290
- package/dist/index.d.ts +0 -1
- package/dist/index.js +2 -573
- package/dist/middleware/auth.d.ts +0 -1
- package/dist/middleware/auth.js +2 -98
- package/dist/routes/acode-todos.d.ts +0 -1
- package/dist/routes/acode-todos.js +2 -75
- package/dist/routes/ai-sources.d.ts +0 -1
- package/dist/routes/ai-sources.js +2 -132
- package/dist/routes/dashboard.d.ts +0 -1
- package/dist/routes/dashboard.js +182 -649
- package/dist/routes/events.d.ts +0 -1
- package/dist/routes/events.js +2 -22
- package/dist/routes/file-browser.d.ts +0 -1
- package/dist/routes/file-browser.js +2 -781
- package/dist/routes/file-diff-rollback.d.ts +0 -1
- package/dist/routes/file-diff-rollback.js +2 -301
- package/dist/routes/file-snapshot.d.ts +0 -1
- package/dist/routes/file-snapshot.js +2 -156
- package/dist/routes/git.d.ts +0 -1
- package/dist/routes/git.js +28 -1900
- package/dist/routes/instance.d.ts +0 -1
- package/dist/routes/instance.js +3 -748
- package/dist/routes/mcp.d.ts +0 -1
- package/dist/routes/mcp.js +2 -196
- package/dist/routes/processes.d.ts +0 -1
- package/dist/routes/processes.js +2 -252
- package/dist/routes/properties.d.ts +0 -1
- package/dist/routes/properties.js +2 -72
- package/dist/routes/pty.d.ts +0 -1
- package/dist/routes/pty.js +6 -560
- package/dist/routes/runtime-binding.d.ts +0 -1
- package/dist/routes/runtime-binding.js +2 -263
- package/dist/routes/sessions.d.ts +0 -1
- package/dist/routes/sessions.js +2 -758
- package/dist/routes/skills.d.ts +0 -1
- package/dist/routes/skills.js +2 -187
- package/dist/routes/sub-agents.d.ts +0 -1
- package/dist/routes/sub-agents.js +20 -279
- package/dist/routes/system-metrics.d.ts +0 -1
- package/dist/routes/system-metrics.js +2 -20
- package/dist/routes/task-context.d.ts +0 -1
- package/dist/routes/task-context.js +2 -78
- package/dist/routes/terminal.d.ts +0 -1
- package/dist/routes/terminal.js +54 -2882
- package/dist/routes/yml.d.ts +0 -1
- package/dist/routes/yml.js +2 -223
- package/dist/services/acode-package.d.ts +0 -1
- package/dist/services/acode-package.js +2 -111
- package/dist/services/agent-event-store.d.ts +0 -1
- package/dist/services/agent-event-store.js +2 -81
- package/dist/services/agent-process-manager.d.ts +0 -1
- package/dist/services/agent-process-manager.js +2 -796
- package/dist/services/ai-source-apply.d.ts +0 -1
- package/dist/services/ai-source-apply.js +2 -83
- package/dist/services/auto-register.d.ts +0 -1
- package/dist/services/auto-register.js +2 -1053
- package/dist/services/aws-client-agent-mcp.d.ts +0 -1
- package/dist/services/aws-client-agent-mcp.js +3 -337
- package/dist/services/bridge-package-publish-hooks.d.ts +0 -1
- package/dist/services/bridge-package-publish-hooks.js +2 -115
- package/dist/services/cc-switch-sdk.d.ts +0 -1
- package/dist/services/cc-switch-sdk.js +2 -135
- package/dist/services/cli-commands.d.ts +6 -1
- package/dist/services/cli-commands.js +6 -645
- package/dist/services/event-delta-pusher.d.ts +0 -1
- package/dist/services/event-delta-pusher.js +2 -95
- package/dist/services/fileSnapshotStore.d.ts +0 -1
- package/dist/services/fileSnapshotStore.js +2 -500
- package/dist/services/instance-ai-config-service.d.ts +0 -1
- package/dist/services/instance-ai-config-service.js +2 -174
- package/dist/services/instance-init-service.d.ts +0 -1
- package/dist/services/instance-init-service.js +2 -193
- package/dist/services/instance-service.d.ts +0 -1
- package/dist/services/instance-service.js +2 -237
- package/dist/services/instance-state.d.ts +0 -1
- package/dist/services/instance-state.js +2 -94
- package/dist/services/legacy-path-migration.d.ts +0 -1
- package/dist/services/legacy-path-migration.js +2 -66
- package/dist/services/lifecycle-state.d.ts +0 -1
- package/dist/services/lifecycle-state.js +3 -110
- package/dist/services/mcp-launch-binding-queue.d.ts +0 -1
- package/dist/services/mcp-launch-binding-queue.js +2 -175
- package/dist/services/orphan-monitor.d.ts +0 -1
- package/dist/services/orphan-monitor.js +2 -382
- package/dist/services/panel-auth.d.ts +0 -1
- package/dist/services/panel-auth.js +2 -168
- package/dist/services/process-detector.d.ts +0 -1
- package/dist/services/process-detector.js +18 -1019
- package/dist/services/process-registry.d.ts +0 -1
- package/dist/services/process-registry.js +2 -375
- package/dist/services/ring-buffer.d.ts +0 -1
- package/dist/services/ring-buffer.js +2 -103
- package/dist/services/runtime-binding.d.ts +0 -1
- package/dist/services/runtime-binding.js +6 -363
- package/dist/services/runtime-lifecycle-policy.d.ts +0 -1
- package/dist/services/runtime-lifecycle-policy.js +2 -35
- package/dist/services/session-output.d.ts +0 -1
- package/dist/services/session-output.js +5 -539
- package/dist/services/startup-config-wizard.d.ts +0 -1
- package/dist/services/startup-config-wizard.js +14 -258
- package/dist/services/sub-agent-manager-instance.d.ts +0 -1
- package/dist/services/sub-agent-manager-instance.js +2 -12
- package/dist/services/system-metrics.d.ts +0 -1
- package/dist/services/system-metrics.js +2 -252
- package/dist/services/terminal-persistence.d.ts +0 -1
- package/dist/services/terminal-persistence.js +2 -176
- package/dist/services/tool-installer.d.ts +0 -1
- package/dist/services/tool-installer.js +5 -751
- package/dist/services/tunnel-client.d.ts +0 -1
- package/dist/services/tunnel-client.js +2 -402
- package/dist/services/windows-service-manager.d.ts +3 -3
- package/dist/services/windows-service-manager.js +2 -59
- package/dist/services/workspace-files.d.ts +0 -1
- package/dist/services/workspace-files.js +2 -1275
- package/dist/services/workspace-watch.d.ts +0 -1
- package/dist/services/workspace-watch.js +2 -123
- package/dist/services/workspaceTaskChangeWatcher.d.ts +0 -1
- package/dist/services/workspaceTaskChangeWatcher.js +2 -483
- package/dist/types.d.ts +0 -1
- package/dist/types.js +1 -1
- package/dist/utils/file-utils.d.ts +0 -1
- package/dist/utils/file-utils.js +3 -208
- package/dist/utils/instance-ai-config-debug-logger.d.ts +0 -1
- package/dist/utils/instance-ai-config-debug-logger.js +4 -63
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.js +2 -154
- package/dist/utils/mcp-utils.d.ts +0 -1
- package/dist/utils/mcp-utils.js +2 -187
- package/dist/utils/path-utils.d.ts +0 -1
- package/dist/utils/path-utils.js +2 -44
- package/dist/utils/sdk-package-loader.d.ts +0 -1
- package/dist/utils/sdk-package-loader.js +2 -78
- package/dist/utils/validation.d.ts +0 -1
- package/dist/utils/validation.js +2 -53
- package/dist/utils/yaml-utils.d.ts +0 -1
- package/dist/utils/yaml-utils.js +2 -312
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.js +2 -63
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.js +2 -8
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.js +2 -38
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.js +2 -470
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.js +4 -307
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.js +2 -37
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.js +2 -41
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.js +2 -9
- package/node_modules/@cc-switch/sdk/dist/state.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.js +2 -19
- package/node_modules/@cc-switch/sdk/dist/types.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.js +1 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.js +3 -114
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.js +2 -12
- package/node_modules/@cc-switch/sdk/package.json +1 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +0 -1
- package/package/acode/dist/ask-user-question-tool.js +4 -233
- package/package/acode/dist/built-in-file-tools.d.ts +0 -1
- package/package/acode/dist/built-in-file-tools.js +4 -966
- package/package/acode/dist/built-in-symbols-tool.d.ts +0 -1
- package/package/acode/dist/built-in-symbols-tool.js +2 -117
- package/package/acode/dist/builtins/commandArtifacts.d.ts +0 -1
- package/package/acode/dist/builtins/commandArtifacts.js +9 -97
- package/package/acode/dist/builtins/commandOutputEvents.d.ts +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.js +2 -56
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.js +5 -44
- package/package/acode/dist/builtins/shellCommandResult.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandResult.js +2 -71
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +2 -115
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.js +2 -94
- package/package/acode/dist/cli.d.ts +0 -1
- package/package/acode/dist/cli.js +4 -38
- package/package/acode/dist/commands/commandLoader.d.ts +0 -1
- package/package/acode/dist/commands/commandLoader.js +2 -33
- package/package/acode/dist/commands/commandParser.d.ts +0 -1
- package/package/acode/dist/commands/commandParser.js +3 -77
- package/package/acode/dist/commands/commandRegistry.d.ts +0 -1
- package/package/acode/dist/commands/commandRegistry.js +2 -30
- package/package/acode/dist/compaction.d.ts +0 -1
- package/package/acode/dist/compaction.js +7 -919
- package/package/acode/dist/config.d.ts +0 -1
- package/package/acode/dist/config.js +5 -105
- package/package/acode/dist/fs-utils.d.ts +0 -1
- package/package/acode/dist/fs-utils.js +2 -79
- package/package/acode/dist/hooks/hookBus.d.ts +0 -1
- package/package/acode/dist/hooks/hookBus.js +2 -40
- package/package/acode/dist/index.d.ts +0 -1
- package/package/acode/dist/index.js +2 -19
- package/package/acode/dist/mcpToolNames.d.ts +0 -1
- package/package/acode/dist/mcpToolNames.js +2 -17
- package/package/acode/dist/parsers/ast-cache.d.ts +0 -1
- package/package/acode/dist/parsers/ast-cache.js +2 -76
- package/package/acode/dist/parsers/language-detector.d.ts +0 -1
- package/package/acode/dist/parsers/language-detector.js +2 -44
- package/package/acode/dist/parsers/language-queries.d.ts +0 -1
- package/package/acode/dist/parsers/language-queries.js +12 -602
- package/package/acode/dist/parsers/symbol-extractor.d.ts +0 -1
- package/package/acode/dist/parsers/symbol-extractor.js +3 -164
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.js +2 -64
- package/package/acode/dist/parsers/types.d.ts +0 -1
- package/package/acode/dist/parsers/types.js +1 -7
- package/package/acode/dist/runtime.d.ts +0 -1
- package/package/acode/dist/runtime.js +86 -3771
- package/package/acode/dist/skill-tool.d.ts +0 -1
- package/package/acode/dist/skill-tool.js +5 -174
- package/package/acode/dist/sub-agent-manager.d.ts +0 -1
- package/package/acode/dist/sub-agent-manager.js +2 -1159
- package/package/acode/dist/sub-agent-store.d.ts +0 -1
- package/package/acode/dist/sub-agent-store.js +4 -236
- package/package/acode/dist/sub-agent-tools.d.ts +0 -1
- package/package/acode/dist/sub-agent-tools.js +15 -369
- package/package/acode/dist/sub-agent-types.d.ts +0 -1
- package/package/acode/dist/sub-agent-types.js +1 -8
- package/package/acode/dist/todo-store.d.ts +0 -1
- package/package/acode/dist/todo-store.js +2 -73
- package/package/acode/dist/todo-tool.d.ts +0 -1
- package/package/acode/dist/todo-tool.js +5 -121
- package/package/acode/dist/types.d.ts +0 -1
- package/package/acode/dist/types.js +1 -1
- package/package/acode/package.json +2 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +2 -890
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.js +2 -243
- package/package/aws-client-agent-mcp/dist/config.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js +2 -24
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +2 -477
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +2 -446
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/index.js +2 -34
- package/package/aws-client-agent-mcp/dist/logger.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js +3 -178
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +38 -2709
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +22 -562
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +4 -826
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -294
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +2 -288
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js +2 -125
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +2 -103
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +2 -96
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +3 -327
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/types.js +2 -9
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +2 -677
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js +0 -1
- package/package/aws-client-agent-mcp/package.json +1 -1
- package/package/cc-switch-sdk/dist/constants.d.ts +0 -1
- package/package/cc-switch-sdk/dist/constants.js +2 -63
- package/package/cc-switch-sdk/dist/errors.d.ts +0 -1
- package/package/cc-switch-sdk/dist/errors.js +2 -8
- package/package/cc-switch-sdk/dist/index.d.ts +0 -1
- package/package/cc-switch-sdk/dist/index.js +2 -9
- package/package/cc-switch-sdk/dist/schemas.d.ts +0 -1
- package/package/cc-switch-sdk/dist/schemas.js +2 -38
- package/package/cc-switch-sdk/dist/sdk.d.ts +0 -1
- package/package/cc-switch-sdk/dist/sdk.js +2 -470
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.js +4 -307
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.js +2 -37
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.js +2 -9
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.js +2 -41
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.js +2 -9
- package/package/cc-switch-sdk/dist/state.d.ts +0 -1
- package/package/cc-switch-sdk/dist/state.js +2 -19
- package/package/cc-switch-sdk/dist/types.d.ts +0 -1
- package/package/cc-switch-sdk/dist/types.js +1 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.js +3 -114
- package/package/cc-switch-sdk/dist/utils/id.d.ts +0 -1
- package/package/cc-switch-sdk/dist/utils/id.js +2 -12
- package/package/cc-switch-sdk/package.json +1 -1
- package/package.json +4 -2
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +0 -1
- package/dist/adapter/SdkProviderSpi.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +0 -1
- package/dist/adapter/index.d.ts.map +0 -1
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +0 -1
- package/dist/adapter/types.d.ts.map +0 -1
- package/dist/adapters/cc-switch/common.d.ts.map +0 -1
- package/dist/adapters/cc-switch/index.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-acode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claude.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-claudecode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-codex.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-opencode.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-placeholder.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/routes/acode-todos.d.ts.map +0 -1
- package/dist/routes/ai-sources.d.ts.map +0 -1
- package/dist/routes/dashboard.d.ts.map +0 -1
- package/dist/routes/events.d.ts.map +0 -1
- package/dist/routes/file-browser.d.ts.map +0 -1
- package/dist/routes/file-diff-rollback.d.ts.map +0 -1
- package/dist/routes/file-snapshot.d.ts.map +0 -1
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/instance.d.ts.map +0 -1
- package/dist/routes/mcp.d.ts.map +0 -1
- package/dist/routes/processes.d.ts.map +0 -1
- package/dist/routes/properties.d.ts.map +0 -1
- package/dist/routes/pty.d.ts.map +0 -1
- package/dist/routes/runtime-binding.d.ts.map +0 -1
- package/dist/routes/sessions.d.ts.map +0 -1
- package/dist/routes/skills.d.ts.map +0 -1
- package/dist/routes/sub-agents.d.ts.map +0 -1
- package/dist/routes/system-metrics.d.ts.map +0 -1
- package/dist/routes/task-context.d.ts.map +0 -1
- package/dist/routes/terminal.d.ts.map +0 -1
- package/dist/routes/yml.d.ts.map +0 -1
- package/dist/services/acode-package.d.ts.map +0 -1
- package/dist/services/agent-event-store.d.ts.map +0 -1
- package/dist/services/agent-process-manager.d.ts.map +0 -1
- package/dist/services/ai-source-apply.d.ts.map +0 -1
- package/dist/services/auto-register.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.d.ts.map +0 -1
- package/dist/services/cc-switch-sdk.d.ts.map +0 -1
- package/dist/services/cli-commands.d.ts.map +0 -1
- package/dist/services/event-delta-pusher.d.ts.map +0 -1
- package/dist/services/fileSnapshotStore.d.ts.map +0 -1
- package/dist/services/instance-ai-config-service.d.ts.map +0 -1
- package/dist/services/instance-init-service.d.ts.map +0 -1
- package/dist/services/instance-service.d.ts.map +0 -1
- package/dist/services/instance-state.d.ts.map +0 -1
- package/dist/services/legacy-path-migration.d.ts.map +0 -1
- package/dist/services/lifecycle-state.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.d.ts.map +0 -1
- package/dist/services/orphan-monitor.d.ts.map +0 -1
- package/dist/services/panel-auth.d.ts.map +0 -1
- package/dist/services/process-detector.d.ts.map +0 -1
- package/dist/services/process-registry.d.ts.map +0 -1
- package/dist/services/ring-buffer.d.ts.map +0 -1
- package/dist/services/runtime-binding.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.d.ts.map +0 -1
- package/dist/services/session-output.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.d.ts.map +0 -1
- package/dist/services/sub-agent-manager-instance.d.ts.map +0 -1
- package/dist/services/system-metrics.d.ts.map +0 -1
- package/dist/services/terminal-persistence.d.ts.map +0 -1
- package/dist/services/tool-installer.d.ts.map +0 -1
- package/dist/services/tunnel-client.d.ts.map +0 -1
- package/dist/services/windows-service-manager.d.ts.map +0 -1
- package/dist/services/workspace-files.d.ts.map +0 -1
- package/dist/services/workspace-watch.d.ts.map +0 -1
- package/dist/services/workspaceTaskChangeWatcher.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/file-utils.d.ts.map +0 -1
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/mcp-utils.d.ts.map +0 -1
- package/dist/utils/path-utils.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/yaml-utils.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/constants.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/errors.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/index.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/schemas.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-model.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/services/skill-service.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/state.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/types.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/fs.d.ts.map +0 -1
- package/node_modules/@cc-switch/sdk/dist/utils/id.d.ts.map +0 -1
- package/package/acode/dist/ask-user-question-tool.d.ts.map +0 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +0 -1
- package/package/acode/dist/built-in-symbols-tool.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +0 -1
- package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +0 -1
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +0 -1
- package/package/acode/dist/cli.d.ts.map +0 -1
- package/package/acode/dist/commands/commandLoader.d.ts.map +0 -1
- package/package/acode/dist/commands/commandParser.d.ts.map +0 -1
- package/package/acode/dist/commands/commandRegistry.d.ts.map +0 -1
- package/package/acode/dist/compaction.d.ts.map +0 -1
- package/package/acode/dist/config.d.ts.map +0 -1
- package/package/acode/dist/fs-utils.d.ts.map +0 -1
- package/package/acode/dist/hooks/hookBus.d.ts.map +0 -1
- package/package/acode/dist/index.d.ts.map +0 -1
- package/package/acode/dist/mcpToolNames.d.ts.map +0 -1
- package/package/acode/dist/parsers/ast-cache.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-detector.d.ts.map +0 -1
- package/package/acode/dist/parsers/language-queries.d.ts.map +0 -1
- package/package/acode/dist/parsers/symbol-extractor.d.ts.map +0 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts.map +0 -1
- package/package/acode/dist/parsers/types.d.ts.map +0 -1
- package/package/acode/dist/runtime.d.ts.map +0 -1
- package/package/acode/dist/skill-tool.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-tools.d.ts.map +0 -1
- package/package/acode/dist/sub-agent-types.d.ts.map +0 -1
- package/package/acode/dist/todo-store.d.ts.map +0 -1
- package/package/acode/dist/todo-tool.d.ts.map +0 -1
- package/package/acode/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/config.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/http-client.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/index.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/logger.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/messageContent.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +0 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +0 -1
- package/package/cc-switch-sdk/dist/constants.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/errors.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/index.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/schemas.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/sdk.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/ai-config-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/mcp-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-model.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/services/skill-service.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/state.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/types.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/fs.d.ts.map +0 -1
- package/package/cc-switch-sdk/dist/utils/id.d.ts.map +0 -1
|
@@ -1,826 +1,4 @@
|
|
|
1
|
-
const ALL_MEMORY_TYPES = ['recently_memory', 'agent_memory', 'project_memory', 'session_context'];
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
const LISTABLE_MEMORY_TOTAL_HARD_LIMIT = LISTABLE_MEMORY_TOTAL_LIMIT * 2;
|
|
6
|
-
const LISTABLE_MEMORY_TYPE_HARD_LIMIT = LISTABLE_MEMORY_TYPE_LIMIT * 2;
|
|
7
|
-
/** session_context 类型的硬限制(每 domain),避免无限增长 */
|
|
8
|
-
const SESSION_CONTEXT_HARD_LIMIT = 1024;
|
|
9
|
-
/**
|
|
10
|
-
* 规范化绑定的文件路径。
|
|
11
|
-
* 项目约定以下前缀都表示工作区根路径:
|
|
12
|
-
* ./xxx → ./xxx (已是相对路径)
|
|
13
|
-
* /xxx → ./xxx (/ 视为工作区根路径)
|
|
14
|
-
* @/xxx → ./xxx (@/ 视为工作区根路径别名)
|
|
15
|
-
* xxx → ./xxx (裸路径视为当前工作区相对)
|
|
16
|
-
*/
|
|
17
|
-
export function normalizeBoundFilePath(filePath) {
|
|
18
|
-
const trimmed = String(filePath || "").trim().replace(/\\/g, "/");
|
|
19
|
-
if (!trimmed)
|
|
20
|
-
return trimmed;
|
|
21
|
-
// 去掉 @/ 前缀(@ 视为工作区根路径)
|
|
22
|
-
const noAt = trimmed.startsWith("@/") ? trimmed.substring(1) : trimmed;
|
|
23
|
-
if (noAt.startsWith("./"))
|
|
24
|
-
return noAt;
|
|
25
|
-
// /xxx 和 xxx 都统一成 ./xxx(与 Java normalizeBoundFilePath 保持一致,处理多前导斜杠)
|
|
26
|
-
return `./${noAt.replace(/^\/+/, "")}`;
|
|
27
|
-
}
|
|
28
|
-
export class MemoryCapacityError extends Error {
|
|
29
|
-
details;
|
|
30
|
-
constructor(message, details) {
|
|
31
|
-
super(message);
|
|
32
|
-
this.name = 'MemoryCapacityError';
|
|
33
|
-
this.details = details;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const URI_PATTERN = /^([a-zA-Z_][a-zA-Z0-9_]*):\/\/(.*)$/;
|
|
37
|
-
/** 解析 query 为 OR-AND 词组:
|
|
38
|
-
* 1. 按 `|` 分隔得到 OR 词组列表
|
|
39
|
-
* 2. 每个 OR 词组内按空白分隔得到 AND 词列表
|
|
40
|
-
* 例如: "架构|技术 设计" → [["架构"], ["技术", "设计"]]
|
|
41
|
-
* "架构 技术" → [["架构", "技术"]]
|
|
42
|
-
* "架构" → [["架构"]]
|
|
43
|
-
*/
|
|
44
|
-
function parseQueryTerms(rawQuery) {
|
|
45
|
-
const trimmed = (rawQuery || '').trim();
|
|
46
|
-
if (!trimmed)
|
|
47
|
-
return [];
|
|
48
|
-
return trimmed
|
|
49
|
-
.split('|')
|
|
50
|
-
.map(orPart => orPart.trim())
|
|
51
|
-
.filter(Boolean)
|
|
52
|
-
.map(orPart => orPart.split(/\s+/).filter(Boolean));
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 检查一段文本是否匹配指定词组。
|
|
56
|
-
* @param terms OR-AND 词组列表,外层 OR、内层 AND
|
|
57
|
-
* @param haystack 要搜索的文本(已小写)
|
|
58
|
-
* @returns true 如果任意 OR 组内的所有 AND 词都匹配
|
|
59
|
-
*/
|
|
60
|
-
function matchTerms(terms, haystack) {
|
|
61
|
-
if (terms.length === 0)
|
|
62
|
-
return false;
|
|
63
|
-
return terms.some(andGroup => andGroup.every(word => haystack.includes(word)));
|
|
64
|
-
}
|
|
65
|
-
export class MemoryStore {
|
|
66
|
-
storePath;
|
|
67
|
-
constructor(storePath) {
|
|
68
|
-
this.storePath = storePath;
|
|
69
|
-
}
|
|
70
|
-
nowIso() {
|
|
71
|
-
return new Date().toISOString();
|
|
72
|
-
}
|
|
73
|
-
normalizeUri(input) {
|
|
74
|
-
const value = String(input || '').trim();
|
|
75
|
-
const matched = URI_PATTERN.exec(value);
|
|
76
|
-
if (!matched) {
|
|
77
|
-
throw new Error(`Invalid memory uri: ${input}`);
|
|
78
|
-
}
|
|
79
|
-
const domainPart = matched[1];
|
|
80
|
-
const pathPart = matched[2];
|
|
81
|
-
if (!domainPart || !pathPart) {
|
|
82
|
-
throw new Error(`Invalid memory uri: ${input}`);
|
|
83
|
-
}
|
|
84
|
-
const domain = domainPart.toLowerCase();
|
|
85
|
-
const path = pathPart.replace(/^\/+|\/+$/g, '');
|
|
86
|
-
if (!path) {
|
|
87
|
-
throw new Error(`Invalid memory uri path: ${input}`);
|
|
88
|
-
}
|
|
89
|
-
return {
|
|
90
|
-
uri: `${domain}://${path}`,
|
|
91
|
-
domain,
|
|
92
|
-
path
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
normalizeMemoryType(input, allowedTypes = ALL_MEMORY_TYPES) {
|
|
96
|
-
const value = String(input || '').trim();
|
|
97
|
-
if (!allowedTypes.includes(value)) {
|
|
98
|
-
throw new Error(`Invalid memory_type: ${input}`);
|
|
99
|
-
}
|
|
100
|
-
return value;
|
|
101
|
-
}
|
|
102
|
-
ensureTypeMatch(record, expectedType) {
|
|
103
|
-
if (expectedType && record.memory_type !== expectedType) {
|
|
104
|
-
throw new Error(`Memory type mismatch: expected ${expectedType}, actual ${record.memory_type}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* 确保存储目标目录存在。
|
|
109
|
-
* 主流程:永久记忆始终按 domain 分文件,创建存储根目录。
|
|
110
|
-
*/
|
|
111
|
-
async ensureStoreDir() {
|
|
112
|
-
const { mkdir } = await import('node:fs/promises');
|
|
113
|
-
await mkdir(this.storePath, { recursive: true });
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 读取单个记忆 JSON 文件。
|
|
117
|
-
* 主流程:读取 by_uri -> 规范化 uri/type/domain/path -> 返回可合并数据。
|
|
118
|
-
*/
|
|
119
|
-
async loadMemoryFile(filePath) {
|
|
120
|
-
const { readFile } = await import('node:fs/promises');
|
|
121
|
-
try {
|
|
122
|
-
const raw = await readFile(filePath, 'utf-8');
|
|
123
|
-
const parsed = JSON.parse(raw);
|
|
124
|
-
const original = parsed.by_uri && typeof parsed.by_uri === 'object' ? parsed.by_uri : {};
|
|
125
|
-
const normalizedByUri = {};
|
|
126
|
-
for (const [uri, record] of Object.entries(original)) {
|
|
127
|
-
const memory_type = this.normalizeMemoryType(record.memory_type || 'project_memory');
|
|
128
|
-
const normalized = this.normalizeUri(record.uri || uri);
|
|
129
|
-
// v1.24.0 兼容:旧格式含 update_status / recall_status 但无 memory_status,读取时迁移
|
|
130
|
-
const oldRecord = record;
|
|
131
|
-
let memory_status = oldRecord.memory_status;
|
|
132
|
-
if (!memory_status) {
|
|
133
|
-
if (oldRecord.update_status === 'updating') {
|
|
134
|
-
memory_status = 'updating';
|
|
135
|
-
}
|
|
136
|
-
else if (oldRecord.recall_status === 'recalling') {
|
|
137
|
-
memory_status = 'recalling';
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
memory_status = 'normal';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const migrated = { ...record };
|
|
144
|
-
delete migrated.update_status;
|
|
145
|
-
delete migrated.recall_status;
|
|
146
|
-
normalizedByUri[normalized.uri] = {
|
|
147
|
-
...migrated,
|
|
148
|
-
uri: normalized.uri,
|
|
149
|
-
domain: normalized.domain,
|
|
150
|
-
path: normalized.path,
|
|
151
|
-
memory_type,
|
|
152
|
-
memory_status,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
return { by_uri: normalizedByUri };
|
|
156
|
-
}
|
|
157
|
-
catch {
|
|
158
|
-
return { by_uri: {} };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* 读取记忆数据。
|
|
163
|
-
* 主流程:读取根目录下所有 domain JSON 并合并。
|
|
164
|
-
*/
|
|
165
|
-
async loadData() {
|
|
166
|
-
const { readdir } = await import('node:fs/promises');
|
|
167
|
-
const path = await import('node:path');
|
|
168
|
-
try {
|
|
169
|
-
const entries = await readdir(this.storePath, { withFileTypes: true });
|
|
170
|
-
const data = { by_uri: {} };
|
|
171
|
-
for (const entry of entries) {
|
|
172
|
-
if (!entry.isFile() || !entry.name.endsWith('.json')) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
const fileData = await this.loadMemoryFile(path.join(this.storePath, entry.name));
|
|
176
|
-
Object.assign(data.by_uri, fileData.by_uri);
|
|
177
|
-
}
|
|
178
|
-
return data;
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
return { by_uri: {} };
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
async writeJsonAtomically(filePath, data) {
|
|
185
|
-
const { rename, rm, writeFile } = await import('node:fs/promises');
|
|
186
|
-
const temporaryPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
187
|
-
try {
|
|
188
|
-
await writeFile(temporaryPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
189
|
-
await rename(temporaryPath, filePath);
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
192
|
-
await rm(temporaryPath, { force: true });
|
|
193
|
-
throw error;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* 保存记忆数据。
|
|
198
|
-
* 主流程:按 domain 分组写入 <domain>.json 并移除空域旧文件。
|
|
199
|
-
*/
|
|
200
|
-
async saveData(data) {
|
|
201
|
-
const { readdir, rm } = await import('node:fs/promises');
|
|
202
|
-
const path = await import('node:path');
|
|
203
|
-
await this.ensureStoreDir();
|
|
204
|
-
const byDomain = new Map();
|
|
205
|
-
for (const record of Object.values(data.by_uri)) {
|
|
206
|
-
const domainData = byDomain.get(record.domain) ?? { by_uri: {} };
|
|
207
|
-
domainData.by_uri[record.uri] = record;
|
|
208
|
-
byDomain.set(record.domain, domainData);
|
|
209
|
-
}
|
|
210
|
-
for (const [domain, domainData] of byDomain.entries()) {
|
|
211
|
-
await this.writeJsonAtomically(path.join(this.storePath, `${domain}.json`), domainData);
|
|
212
|
-
}
|
|
213
|
-
const expectedFiles = new Set([...byDomain.keys()].map((domain) => `${domain}.json`));
|
|
214
|
-
const entries = await readdir(this.storePath, { withFileTypes: true });
|
|
215
|
-
for (const entry of entries) {
|
|
216
|
-
if (entry.isFile() && entry.name.endsWith('.json') && !expectedFiles.has(entry.name)) {
|
|
217
|
-
await rm(path.join(this.storePath, entry.name), { force: true });
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
createEmptyStats() {
|
|
222
|
-
return {
|
|
223
|
-
total: 0,
|
|
224
|
-
listable: {
|
|
225
|
-
count: 0,
|
|
226
|
-
limit: LISTABLE_MEMORY_TOTAL_LIMIT,
|
|
227
|
-
hardLimit: LISTABLE_MEMORY_TOTAL_HARD_LIMIT,
|
|
228
|
-
exceeded: false,
|
|
229
|
-
hardExceeded: false
|
|
230
|
-
},
|
|
231
|
-
by_type: {
|
|
232
|
-
recently_memory: {
|
|
233
|
-
count: 0,
|
|
234
|
-
limit: LISTABLE_MEMORY_TYPE_LIMIT,
|
|
235
|
-
hardLimit: LISTABLE_MEMORY_TYPE_HARD_LIMIT,
|
|
236
|
-
exceeded: false,
|
|
237
|
-
hardExceeded: false,
|
|
238
|
-
listable: true,
|
|
239
|
-
domainCount: 0,
|
|
240
|
-
by_domain: {}
|
|
241
|
-
},
|
|
242
|
-
agent_memory: {
|
|
243
|
-
count: 0,
|
|
244
|
-
limit: LISTABLE_MEMORY_TYPE_LIMIT,
|
|
245
|
-
hardLimit: LISTABLE_MEMORY_TYPE_HARD_LIMIT,
|
|
246
|
-
exceeded: false,
|
|
247
|
-
hardExceeded: false,
|
|
248
|
-
listable: true,
|
|
249
|
-
domainCount: 0,
|
|
250
|
-
by_domain: {}
|
|
251
|
-
},
|
|
252
|
-
project_memory: {
|
|
253
|
-
count: 0,
|
|
254
|
-
limit: null,
|
|
255
|
-
hardLimit: null,
|
|
256
|
-
exceeded: false,
|
|
257
|
-
hardExceeded: false,
|
|
258
|
-
listable: false,
|
|
259
|
-
domainCount: 0,
|
|
260
|
-
by_domain: {}
|
|
261
|
-
},
|
|
262
|
-
session_context: {
|
|
263
|
-
count: 0,
|
|
264
|
-
limit: null,
|
|
265
|
-
hardLimit: SESSION_CONTEXT_HARD_LIMIT,
|
|
266
|
-
exceeded: false,
|
|
267
|
-
hardExceeded: false,
|
|
268
|
-
listable: false,
|
|
269
|
-
domainCount: 0,
|
|
270
|
-
by_domain: {}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* 统计本地记忆容量。
|
|
277
|
-
* 主流程:遍历所有记录 -> 按类型计数 -> 单独汇总可 list 类型容量。
|
|
278
|
-
*/
|
|
279
|
-
calculateStats(data) {
|
|
280
|
-
const stats = this.createEmptyStats();
|
|
281
|
-
for (const record of Object.values(data.by_uri)) {
|
|
282
|
-
stats.total += 1;
|
|
283
|
-
const typeStats = stats.by_type[record.memory_type];
|
|
284
|
-
typeStats.count += 1;
|
|
285
|
-
const domainLimitFor = (mt) => {
|
|
286
|
-
if (LISTABLE_MEMORY_TYPES.includes(mt))
|
|
287
|
-
return LISTABLE_MEMORY_TYPE_LIMIT;
|
|
288
|
-
if (mt === 'session_context')
|
|
289
|
-
return null; // no soft limit
|
|
290
|
-
return null;
|
|
291
|
-
};
|
|
292
|
-
const domainHardLimitFor = (mt) => {
|
|
293
|
-
if (LISTABLE_MEMORY_TYPES.includes(mt))
|
|
294
|
-
return LISTABLE_MEMORY_TYPE_HARD_LIMIT;
|
|
295
|
-
if (mt === 'session_context')
|
|
296
|
-
return SESSION_CONTEXT_HARD_LIMIT;
|
|
297
|
-
return null;
|
|
298
|
-
};
|
|
299
|
-
const domainStats = typeStats.by_domain[record.domain] ?? {
|
|
300
|
-
count: 0,
|
|
301
|
-
limit: domainLimitFor(record.memory_type),
|
|
302
|
-
hardLimit: domainHardLimitFor(record.memory_type),
|
|
303
|
-
exceeded: false,
|
|
304
|
-
hardExceeded: false
|
|
305
|
-
};
|
|
306
|
-
domainStats.count += 1;
|
|
307
|
-
typeStats.by_domain[record.domain] = domainStats;
|
|
308
|
-
if (LISTABLE_MEMORY_TYPES.includes(record.memory_type)) {
|
|
309
|
-
stats.listable.count += 1;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
stats.listable.exceeded = stats.listable.count > stats.listable.limit;
|
|
313
|
-
stats.listable.hardExceeded = stats.listable.count >= stats.listable.hardLimit;
|
|
314
|
-
for (const memoryType of ALL_MEMORY_TYPES) {
|
|
315
|
-
const typeStats = stats.by_type[memoryType];
|
|
316
|
-
typeStats.domainCount = Object.keys(typeStats.by_domain).length;
|
|
317
|
-
if (typeStats.limit !== null && typeStats.hardLimit !== null) {
|
|
318
|
-
typeStats.exceeded = typeStats.domainCount > typeStats.limit;
|
|
319
|
-
typeStats.hardExceeded = typeStats.domainCount >= typeStats.hardLimit;
|
|
320
|
-
}
|
|
321
|
-
for (const domainStats of Object.values(typeStats.by_domain)) {
|
|
322
|
-
if (domainStats.limit !== null && domainStats.hardLimit !== null) {
|
|
323
|
-
domainStats.exceeded = domainStats.count > domainStats.limit;
|
|
324
|
-
domainStats.hardExceeded = domainStats.count >= domainStats.hardLimit;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
return stats;
|
|
329
|
-
}
|
|
330
|
-
generateId(uri) {
|
|
331
|
-
const cleaned = uri.replace(/[^a-zA-Z0-9]+/g, '_').replace(/^_+|_+$/g, '');
|
|
332
|
-
return `${cleaned}_${Date.now().toString(36)}`;
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* 校验可列出记忆容量。
|
|
336
|
-
* 主流程:仅限制 recently_memory/agent_memory/project_memory 新建 -> 先校验该类型数量 -> 再校验可 list 总量。
|
|
337
|
-
*/
|
|
338
|
-
ensureListableMemoryCapacity(data, memory_type, normalizedUri) {
|
|
339
|
-
if (!LISTABLE_MEMORY_TYPES.includes(memory_type)) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
const stats = this.calculateStats(data);
|
|
343
|
-
const typeStats = stats.by_type[memory_type];
|
|
344
|
-
const domainStats = typeStats.by_domain[normalizedUri.domain];
|
|
345
|
-
const isNewDomain = !domainStats;
|
|
346
|
-
if (isNewDomain && typeStats.domainCount >= LISTABLE_MEMORY_TYPE_HARD_LIMIT) {
|
|
347
|
-
throw new MemoryCapacityError(`Cannot create ${memory_type}: hard domain type limit ${LISTABLE_MEMORY_TYPE_HARD_LIMIT} reached. ` +
|
|
348
|
-
`Please delete an existing ${memory_type} domain type before creating a new ${memory_type}.`, {
|
|
349
|
-
code: 'MEMORY_TYPE_LIMIT_REACHED',
|
|
350
|
-
memory_type,
|
|
351
|
-
limit: LISTABLE_MEMORY_TYPE_HARD_LIMIT,
|
|
352
|
-
current: typeStats.domainCount,
|
|
353
|
-
recommended_actions: [
|
|
354
|
-
`list_memories({ memory_type: '${memory_type}' })`,
|
|
355
|
-
`delete_memory({ uri, memory_type: '${memory_type}' })`,
|
|
356
|
-
]
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
if (domainStats && domainStats.count >= LISTABLE_MEMORY_TYPE_HARD_LIMIT) {
|
|
360
|
-
throw new MemoryCapacityError(`Cannot create ${memory_type}: hard memory limit ${LISTABLE_MEMORY_TYPE_HARD_LIMIT} reached under domain ${normalizedUri.domain}. ` +
|
|
361
|
-
`Please delete or archive existing ${normalizedUri.domain}://${memory_type} memories before creating a new one.`, {
|
|
362
|
-
code: 'MEMORY_TYPE_LIMIT_REACHED',
|
|
363
|
-
memory_type,
|
|
364
|
-
domain: normalizedUri.domain,
|
|
365
|
-
limit: LISTABLE_MEMORY_TYPE_HARD_LIMIT,
|
|
366
|
-
current: domainStats.count,
|
|
367
|
-
recommended_actions: [
|
|
368
|
-
`list_memories({ memory_type: '${memory_type}' })`,
|
|
369
|
-
`delete_memory({ uri, memory_type: '${memory_type}' })`,
|
|
370
|
-
]
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* 校验 session_context 记忆容量。
|
|
376
|
-
* 主流程:按 domain 限制最多 SESSION_CONTEXT_HARD_LIMIT 条记录,拒绝超限创建。
|
|
377
|
-
*/
|
|
378
|
-
ensureSessionContextCapacity(data, memory_type, normalizedUri) {
|
|
379
|
-
if (memory_type !== 'session_context') {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
const existingCount = Object.values(data.by_uri).filter((r) => r.memory_type === 'session_context' && r.domain === normalizedUri.domain).length;
|
|
383
|
-
if (existingCount >= SESSION_CONTEXT_HARD_LIMIT) {
|
|
384
|
-
throw new MemoryCapacityError(`Cannot create session_context: hard limit ${SESSION_CONTEXT_HARD_LIMIT} reached under domain ${normalizedUri.domain}. ` +
|
|
385
|
-
`Please delete existing session_context memories before creating a new one.`, {
|
|
386
|
-
code: 'MEMORY_TYPE_LIMIT_REACHED',
|
|
387
|
-
memory_type,
|
|
388
|
-
domain: normalizedUri.domain,
|
|
389
|
-
limit: SESSION_CONTEXT_HARD_LIMIT,
|
|
390
|
-
current: existingCount,
|
|
391
|
-
recommended_actions: [
|
|
392
|
-
"list_memories({ memory_type: 'session_context' })",
|
|
393
|
-
"delete_memory({ uri, memory_type: 'session_context' })"
|
|
394
|
-
]
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
async getStats() {
|
|
399
|
-
const data = await this.loadData();
|
|
400
|
-
return this.calculateStats(data);
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* 计算 agent_memory / recently_memory 过期时间(当前时间 + 12 小时,初始 TTL)。
|
|
404
|
-
*/
|
|
405
|
-
static calcAgentMemoryExpiresAt() {
|
|
406
|
-
const expires = new Date(Date.now() + 12 * 60 * 60 * 1000);
|
|
407
|
-
return expires.toISOString();
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* 判断 memory_type 是否支持过期回忆机制。
|
|
411
|
-
* v1.19.0: recently_memory 与 agent_memory 都支持过期、续期、recalling 状态流转。
|
|
412
|
-
* project_memory 为永久记忆,不支持过期。
|
|
413
|
-
*/
|
|
414
|
-
static isExpirableType(memoryType) {
|
|
415
|
-
return memoryType === 'agent_memory' || memoryType === 'recently_memory';
|
|
416
|
-
}
|
|
417
|
-
async createMemory(input) {
|
|
418
|
-
const normalizedType = this.normalizeMemoryType(input.memory_type);
|
|
419
|
-
const normalized = this.normalizeUri(input.uri);
|
|
420
|
-
const data = await this.loadData();
|
|
421
|
-
if (data.by_uri[normalized.uri]) {
|
|
422
|
-
throw new Error(`Memory already exists: ${normalized.uri}`);
|
|
423
|
-
}
|
|
424
|
-
this.ensureListableMemoryCapacity(data, normalizedType, normalized);
|
|
425
|
-
this.ensureSessionContextCapacity(data, normalizedType, normalized);
|
|
426
|
-
const now = this.nowIso();
|
|
427
|
-
const record = {
|
|
428
|
-
id: this.generateId(normalized.uri),
|
|
429
|
-
uri: normalized.uri,
|
|
430
|
-
domain: normalized.domain,
|
|
431
|
-
path: normalized.path,
|
|
432
|
-
title: input.title || undefined,
|
|
433
|
-
content: String(input.content || ''),
|
|
434
|
-
memory_type: normalizedType,
|
|
435
|
-
createdAt: now,
|
|
436
|
-
updatedAt: now,
|
|
437
|
-
version: 1,
|
|
438
|
-
// Memory 增强字段 (v1.6.0)
|
|
439
|
-
keywords: input.keywords,
|
|
440
|
-
bound_files: input.bound_files,
|
|
441
|
-
file_md5_map: input.file_md5_map || undefined,
|
|
442
|
-
updating_agent_id: undefined,
|
|
443
|
-
last_check_time: input.last_check_time || undefined,
|
|
444
|
-
// Memory 近期记忆过期 (v1.11.0, v1.19.0 扩展)
|
|
445
|
-
// v1.19.0: recently_memory 行为对齐 agent_memory,同样默认 12h 后过期
|
|
446
|
-
expiresAt: input.expiresAt || (MemoryStore.isExpirableType(normalizedType) ? MemoryStore.calcAgentMemoryExpiresAt() : undefined),
|
|
447
|
-
// v1.24.0: update_status / recall_status 合并为 memory_status
|
|
448
|
-
memory_status: 'normal',
|
|
449
|
-
};
|
|
450
|
-
data.by_uri[normalized.uri] = record;
|
|
451
|
-
await this.saveData(data);
|
|
452
|
-
return record;
|
|
453
|
-
}
|
|
454
|
-
async readMemory(input) {
|
|
455
|
-
const normalized = this.normalizeUri(input.uri);
|
|
456
|
-
const expectedType = typeof input.memory_type === 'string'
|
|
457
|
-
? this.normalizeMemoryType(input.memory_type)
|
|
458
|
-
: undefined;
|
|
459
|
-
const data = await this.loadData();
|
|
460
|
-
const record = data.by_uri[normalized.uri] ?? null;
|
|
461
|
-
if (!record) {
|
|
462
|
-
return null;
|
|
463
|
-
}
|
|
464
|
-
this.ensureTypeMatch(record, expectedType);
|
|
465
|
-
return record;
|
|
466
|
-
}
|
|
467
|
-
async updateMemory(input) {
|
|
468
|
-
const normalized = this.normalizeUri(input.uri);
|
|
469
|
-
const expectedType = typeof input.memory_type === 'string'
|
|
470
|
-
? this.normalizeMemoryType(input.memory_type)
|
|
471
|
-
: undefined;
|
|
472
|
-
const data = await this.loadData();
|
|
473
|
-
const existing = data.by_uri[normalized.uri];
|
|
474
|
-
if (!existing) {
|
|
475
|
-
throw new Error(`Memory not found: ${normalized.uri}`);
|
|
476
|
-
}
|
|
477
|
-
this.ensureTypeMatch(existing, expectedType);
|
|
478
|
-
let nextContent = existing.content;
|
|
479
|
-
if (typeof input.old_string === 'string' && typeof input.new_string === 'string') {
|
|
480
|
-
const oldString = input.old_string;
|
|
481
|
-
if (!oldString) {
|
|
482
|
-
throw new Error('old_string cannot be empty when replacing');
|
|
483
|
-
}
|
|
484
|
-
const occurrenceCount = nextContent.split(oldString).length - 1;
|
|
485
|
-
if (occurrenceCount === 0) {
|
|
486
|
-
throw new Error('old_string not found in memory content');
|
|
487
|
-
}
|
|
488
|
-
if (occurrenceCount > 1) {
|
|
489
|
-
throw new Error('old_string appears multiple times; replace is ambiguous');
|
|
490
|
-
}
|
|
491
|
-
nextContent = nextContent.replace(oldString, input.new_string);
|
|
492
|
-
}
|
|
493
|
-
if (typeof input.append === 'string' && input.append.length > 0) {
|
|
494
|
-
nextContent = `${nextContent}${input.append}`;
|
|
495
|
-
}
|
|
496
|
-
const contentChanged = nextContent !== existing.content ||
|
|
497
|
-
(typeof input.title === 'string' && input.title !== existing.title);
|
|
498
|
-
const nowIso = this.nowIso();
|
|
499
|
-
// recently_memory / agent_memory 续期策略:
|
|
500
|
-
// - recently_memory:固定 24h TTL(短期工作记忆,定期淘汰避免陈旧,不累加)
|
|
501
|
-
// - agent_memory:TTL ×2 累加,基于上次 expiresAt 与 updatedAt 反推旧 TTL 再翻倍
|
|
502
|
-
// (v1.25.0 修复:原用 createdAt 反推会将已流逝时间累加进旧 TTL,导致涨幅失控)
|
|
503
|
-
// v1.19.0: recently_memory 纳入过期回忆流程
|
|
504
|
-
// v1.22.0: 无内容更新时也续期——调用 update_memory 本身即表示"这条记忆还有价值",
|
|
505
|
-
// 用于过期/文件变更场景下内容不需要改但需要续期避免被清理。
|
|
506
|
-
let nextExpiresAt = existing.expiresAt;
|
|
507
|
-
if (MemoryStore.isExpirableType(existing.memory_type)) {
|
|
508
|
-
if (existing.memory_type === 'recently_memory') {
|
|
509
|
-
// recently_memory:固定 24h,不累加
|
|
510
|
-
nextExpiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();
|
|
511
|
-
}
|
|
512
|
-
else {
|
|
513
|
-
// agent_memory:TTL ×2 累加,用 updatedAt 反推旧 TTL(上次设定的 TTL 总长)
|
|
514
|
-
const oldExpiresAt = existing.expiresAt ? new Date(existing.expiresAt) : null;
|
|
515
|
-
// ★ 防御:updatedAt 为 null/undefined 时 new Date(null).getTime() = NaN,
|
|
516
|
-
// Math.max(12h, NaN) = NaN,后续 toISOString() 抛 RangeError。
|
|
517
|
-
// 旧数据可能缺 updatedAt(早期版本未记录),回退为默认 12h TTL。
|
|
518
|
-
const oldUpdatedAt = existing.updatedAt ? new Date(existing.updatedAt) : null;
|
|
519
|
-
const oldTtlMs = oldExpiresAt && oldUpdatedAt && !isNaN(oldUpdatedAt.getTime())
|
|
520
|
-
? Math.max(12 * 60 * 60 * 1000, oldExpiresAt.getTime() - oldUpdatedAt.getTime())
|
|
521
|
-
: 12 * 60 * 60 * 1000;
|
|
522
|
-
nextExpiresAt = new Date(Date.now() + oldTtlMs * 2).toISOString();
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
if (input.expiresAt !== undefined) {
|
|
526
|
-
nextExpiresAt = input.expiresAt;
|
|
527
|
-
}
|
|
528
|
-
const updated = {
|
|
529
|
-
...existing,
|
|
530
|
-
content: nextContent,
|
|
531
|
-
title: input.title !== undefined ? input.title : existing.title,
|
|
532
|
-
updatedAt: nowIso,
|
|
533
|
-
version: existing.version + 1,
|
|
534
|
-
// Memory 增强字段更新 (v1.6.0)
|
|
535
|
-
keywords: input.keywords !== undefined ? input.keywords : existing.keywords,
|
|
536
|
-
bound_files: input.bound_files !== undefined ? input.bound_files : existing.bound_files,
|
|
537
|
-
// file_md5_map: 显式传入则使用新值,否则若 bound_files 变更则重置(需重新计算),否则保留原值
|
|
538
|
-
file_md5_map: input.file_md5_map !== undefined
|
|
539
|
-
? input.file_md5_map
|
|
540
|
-
: (input.bound_files !== undefined ? undefined : existing.file_md5_map),
|
|
541
|
-
// v1.24.0: memory_status 合并了原 update_status 和 recall_status
|
|
542
|
-
// 语义:显式传入则使用传入值;未传入时,若原状态为 updating 则重置为 normal(释放 claim),
|
|
543
|
-
// 其他状态(normal/recalling)保留原值。
|
|
544
|
-
memory_status: input.memory_status !== undefined
|
|
545
|
-
? input.memory_status
|
|
546
|
-
: (existing.memory_status === 'updating' ? 'normal' : (existing.memory_status || 'normal')),
|
|
547
|
-
updating_agent_id: input.memory_status !== undefined
|
|
548
|
-
? (input.updating_agent_id || undefined)
|
|
549
|
-
: (existing.memory_status === 'updating' ? undefined : existing.updating_agent_id),
|
|
550
|
-
last_check_time: input.last_check_time !== undefined
|
|
551
|
-
? input.last_check_time
|
|
552
|
-
: existing.last_check_time,
|
|
553
|
-
// Memory 近期记忆过期 (v1.11.0, v1.19.0 扩展):
|
|
554
|
-
// agent_memory / recently_memory 内容更新时 TTL ×2 续期,或显式传入 expiresAt 时使用传入值
|
|
555
|
-
expiresAt: nextExpiresAt,
|
|
556
|
-
};
|
|
557
|
-
data.by_uri[normalized.uri] = updated;
|
|
558
|
-
await this.saveData(data);
|
|
559
|
-
return updated;
|
|
560
|
-
}
|
|
561
|
-
async deleteMemory(input) {
|
|
562
|
-
const normalized = this.normalizeUri(input.uri);
|
|
563
|
-
const expectedType = typeof input.memory_type === 'string'
|
|
564
|
-
? this.normalizeMemoryType(input.memory_type)
|
|
565
|
-
: undefined;
|
|
566
|
-
const data = await this.loadData();
|
|
567
|
-
const existing = data.by_uri[normalized.uri];
|
|
568
|
-
if (!existing) {
|
|
569
|
-
return false;
|
|
570
|
-
}
|
|
571
|
-
this.ensureTypeMatch(existing, expectedType);
|
|
572
|
-
delete data.by_uri[normalized.uri];
|
|
573
|
-
await this.saveData(data);
|
|
574
|
-
return true;
|
|
575
|
-
}
|
|
576
|
-
/**
|
|
577
|
-
* 列出已过期的 agent_memory / recently_memory 记录(memory_status 为 normal 或 recalling)。
|
|
578
|
-
* 主流程:读取所有数据 -> 筛选 agent_memory / recently_memory 类型 -> 检查 expiresAt 是否已过期。
|
|
579
|
-
* v1.19.0: recently_memory 纳入过期回忆流程,行为对齐 agent_memory。
|
|
580
|
-
*/
|
|
581
|
-
async listExpiredRecentlyMemories() {
|
|
582
|
-
const data = await this.loadData();
|
|
583
|
-
const now = new Date();
|
|
584
|
-
const results = [];
|
|
585
|
-
for (const record of Object.values(data.by_uri)) {
|
|
586
|
-
if (record.memory_type !== 'agent_memory' && record.memory_type !== 'recently_memory')
|
|
587
|
-
continue;
|
|
588
|
-
if (!record.expiresAt)
|
|
589
|
-
continue; // 无过期时间视为永不过期
|
|
590
|
-
if (new Date(record.expiresAt) <= now) {
|
|
591
|
-
results.push(record);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
return results.sort((a, b) => a.expiresAt.localeCompare(b.expiresAt));
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* 搜索本地记忆。
|
|
598
|
-
* 主流程:支持 OR 分隔符(|)和空格 AND 词组搜索,支持 keyword_mode(any/all) 关键词过滤。
|
|
599
|
-
* 搜索效率:使用 5 秒内存缓存避免多次 searchMemory 重复读盘。
|
|
600
|
-
*/
|
|
601
|
-
async searchMemory(input) {
|
|
602
|
-
const data = await this.loadData();
|
|
603
|
-
const rawQuery = String(input.query || '').trim();
|
|
604
|
-
const query = rawQuery.toLowerCase();
|
|
605
|
-
const memoryTypeFilter = input.memory_type
|
|
606
|
-
? this.normalizeMemoryType(input.memory_type)
|
|
607
|
-
: undefined;
|
|
608
|
-
const limit = typeof input.limit === 'number' && input.limit > 0 ? input.limit : 10;
|
|
609
|
-
const keywordsFilter = input.keywords?.map(k => k.toLowerCase());
|
|
610
|
-
const keywordMode = input.keyword_mode === 'all' ? 'all' : 'any';
|
|
611
|
-
// 解析 OR-AND 词组
|
|
612
|
-
const terms = parseQueryTerms(query);
|
|
613
|
-
if (terms.length === 0 && (!keywordsFilter || keywordsFilter.length === 0)) {
|
|
614
|
-
return { query, results: [] };
|
|
615
|
-
}
|
|
616
|
-
const seenById = new Set();
|
|
617
|
-
const ranked = [];
|
|
618
|
-
for (const record of Object.values(data.by_uri)) {
|
|
619
|
-
if (memoryTypeFilter && record.memory_type !== memoryTypeFilter) {
|
|
620
|
-
continue;
|
|
621
|
-
}
|
|
622
|
-
if (seenById.has(record.id)) {
|
|
623
|
-
continue;
|
|
624
|
-
}
|
|
625
|
-
let score = 0;
|
|
626
|
-
// 关键词匹配(优先级最高)
|
|
627
|
-
if (keywordsFilter && keywordsFilter.length > 0 && record.keywords) {
|
|
628
|
-
const recordKeywords = record.keywords.map(k => k.toLowerCase());
|
|
629
|
-
if (keywordMode === 'all') {
|
|
630
|
-
// ALL 模式:所有关键词都需匹配
|
|
631
|
-
const allMatched = keywordsFilter.every(kw => recordKeywords.includes(kw));
|
|
632
|
-
if (allMatched) {
|
|
633
|
-
score += 10 * keywordsFilter.length;
|
|
634
|
-
}
|
|
635
|
-
else {
|
|
636
|
-
// 关键词 ALL 模式不满足时,若无 query 则跳过,有 query 则依赖 query 是否命中
|
|
637
|
-
if (terms.length === 0)
|
|
638
|
-
continue;
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
else {
|
|
642
|
-
// ANY 模式(默认):任一关键词匹配即加分
|
|
643
|
-
for (const keyword of keywordsFilter) {
|
|
644
|
-
if (recordKeywords.includes(keyword)) {
|
|
645
|
-
score += 10;
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
// 内容搜索(title + content)
|
|
651
|
-
if (terms.length > 0) {
|
|
652
|
-
const haystack = `${record.uri}\n${record.title || ''}\n${record.content}`.toLowerCase();
|
|
653
|
-
// 使用 OR-AND 词组匹配
|
|
654
|
-
if (!matchTerms(terms, haystack) && score === 0) {
|
|
655
|
-
continue; // 内容不匹配且无关键词命中,跳过
|
|
656
|
-
}
|
|
657
|
-
// 计算内容匹配分数:按每个 OR 组匹配的 AND 词数量加权
|
|
658
|
-
for (const andGroup of terms) {
|
|
659
|
-
const matchedCount = andGroup.filter(word => haystack.includes(word)).length;
|
|
660
|
-
if (matchedCount > 0) {
|
|
661
|
-
// URI 中出现的词权重更高
|
|
662
|
-
const uriLower = record.uri.toLowerCase();
|
|
663
|
-
const uriMatches = andGroup.filter(word => uriLower.includes(word)).length;
|
|
664
|
-
score += matchedCount + uriMatches;
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
if (score === 0) {
|
|
669
|
-
continue;
|
|
670
|
-
}
|
|
671
|
-
seenById.add(record.id);
|
|
672
|
-
ranked.push({ score, record });
|
|
673
|
-
}
|
|
674
|
-
ranked.sort((a, b) => {
|
|
675
|
-
if (b.score !== a.score) {
|
|
676
|
-
return b.score - a.score;
|
|
677
|
-
}
|
|
678
|
-
return b.record.updatedAt.localeCompare(a.record.updatedAt);
|
|
679
|
-
});
|
|
680
|
-
return {
|
|
681
|
-
query,
|
|
682
|
-
results: ranked.slice(0, limit).map((item) => item.record)
|
|
683
|
-
};
|
|
684
|
-
}
|
|
685
|
-
async listByType(memory_type) {
|
|
686
|
-
// session_context 和 project_memory 类型可以通过 listByType 列出
|
|
687
|
-
// project_memory 类型原本设计为仅通过 search 检索,但文件变更检测(buildMemoryFileChangeNotification)
|
|
688
|
-
// 需要枚举所有永久记忆以检查绑定文件的 MD5 变化,因此放开此限制。
|
|
689
|
-
const allowedTypes = (memory_type === 'session_context' || memory_type === 'project_memory') ? ALL_MEMORY_TYPES : LISTABLE_MEMORY_TYPES;
|
|
690
|
-
const listType = this.normalizeMemoryType(memory_type, allowedTypes);
|
|
691
|
-
const data = await this.loadData();
|
|
692
|
-
const seenById = new Set();
|
|
693
|
-
const list = [];
|
|
694
|
-
for (const record of Object.values(data.by_uri)) {
|
|
695
|
-
if (record.memory_type !== listType) {
|
|
696
|
-
continue;
|
|
697
|
-
}
|
|
698
|
-
if (seenById.has(record.id)) {
|
|
699
|
-
continue;
|
|
700
|
-
}
|
|
701
|
-
seenById.add(record.id);
|
|
702
|
-
list.push(record);
|
|
703
|
-
}
|
|
704
|
-
list.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
705
|
-
return list;
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* 按文件查询绑定了该文件的所有 Memory
|
|
709
|
-
* Memory 增强功能 (v1.6.0)
|
|
710
|
-
*/
|
|
711
|
-
async listByFile(filePath, memory_type) {
|
|
712
|
-
const data = await this.loadData();
|
|
713
|
-
// 兼容 options 对象和 bare memory_type 两种调用方式
|
|
714
|
-
const resolvedMemoryType = typeof memory_type === 'object' && memory_type !== null
|
|
715
|
-
? memory_type.memory_type
|
|
716
|
-
: memory_type;
|
|
717
|
-
const memoryTypeFilter = resolvedMemoryType
|
|
718
|
-
? this.normalizeMemoryType(resolvedMemoryType)
|
|
719
|
-
: undefined;
|
|
720
|
-
// 规范化查询路径:./xxx → ./xxx, xxx → ./xxx, /xxx → /xxx
|
|
721
|
-
const normalizedQuery = normalizeBoundFilePath(filePath);
|
|
722
|
-
const seenById = new Set();
|
|
723
|
-
const list = [];
|
|
724
|
-
for (const record of Object.values(data.by_uri)) {
|
|
725
|
-
if (memoryTypeFilter && record.memory_type !== memoryTypeFilter) {
|
|
726
|
-
continue;
|
|
727
|
-
}
|
|
728
|
-
if (seenById.has(record.id)) {
|
|
729
|
-
continue;
|
|
730
|
-
}
|
|
731
|
-
// 检查是否绑定了指定文件(两端均规范化后比较)
|
|
732
|
-
if (record.bound_files && record.bound_files.length > 0) {
|
|
733
|
-
const matched = record.bound_files.some(f => normalizeBoundFilePath(f) === normalizedQuery);
|
|
734
|
-
if (matched) {
|
|
735
|
-
seenById.add(record.id);
|
|
736
|
-
list.push(record);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
list.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
741
|
-
return list;
|
|
742
|
-
}
|
|
743
|
-
/**
|
|
744
|
-
* 标记已过期的 agent_memory 记录为 recalling 状态 (v1.13.0)。
|
|
745
|
-
* 主流程:复用 listExpiredRecentlyMemories 找出过期记录 ->
|
|
746
|
-
* 若传入 uris 则只标记指定 URI 的过期记录(分批处理用) ->
|
|
747
|
-
* 逐条更新 memory_status='recalling'。
|
|
748
|
-
* @param uris 可选,指定要标记的 URI 列表;不传时标记所有过期记忆
|
|
749
|
-
*/
|
|
750
|
-
async markExpiredMemoriesRecalling(uris) {
|
|
751
|
-
const expired = await this.listExpiredRecentlyMemories();
|
|
752
|
-
if (expired.length === 0) {
|
|
753
|
-
return { marked: 0, uris: [] };
|
|
754
|
-
}
|
|
755
|
-
// 若指定了 uris 过滤,只标记其中属于过期记忆的 URI
|
|
756
|
-
const toMark = uris
|
|
757
|
-
? expired.filter(r => uris.includes(r.uri))
|
|
758
|
-
: expired;
|
|
759
|
-
if (toMark.length === 0) {
|
|
760
|
-
return { marked: 0, uris: [] };
|
|
761
|
-
}
|
|
762
|
-
const data = await this.loadData();
|
|
763
|
-
const now = this.nowIso();
|
|
764
|
-
const markedUris = [];
|
|
765
|
-
for (const record of toMark) {
|
|
766
|
-
const existing = data.by_uri[record.uri];
|
|
767
|
-
if (!existing)
|
|
768
|
-
continue;
|
|
769
|
-
existing.memory_status = 'recalling';
|
|
770
|
-
existing.updatedAt = now;
|
|
771
|
-
existing.version = (existing.version || 1) + 1;
|
|
772
|
-
markedUris.push(record.uri);
|
|
773
|
-
}
|
|
774
|
-
if (markedUris.length > 0) {
|
|
775
|
-
await this.saveData(data);
|
|
776
|
-
}
|
|
777
|
-
return { marked: markedUris.length, uris: markedUris };
|
|
778
|
-
}
|
|
779
|
-
/**
|
|
780
|
-
* 清理所有「memory_status='recalling' + 已过期」的 agent_memory / recently_memory 记录 (v1.13.0, v1.19.0 扩展)。
|
|
781
|
-
* 主流程:遍历所有数据 -> 筛选可过期类型 + memory_status='recalling' + expiresAt 已过期 -> 删除。
|
|
782
|
-
* v1.19.0: recently_memory 纳入清理范围。
|
|
783
|
-
*/
|
|
784
|
-
async clearRecallingExpiredMemories() {
|
|
785
|
-
const data = await this.loadData();
|
|
786
|
-
const now = new Date();
|
|
787
|
-
const urisToDelete = [];
|
|
788
|
-
for (const record of Object.values(data.by_uri)) {
|
|
789
|
-
if (!MemoryStore.isExpirableType(record.memory_type))
|
|
790
|
-
continue;
|
|
791
|
-
if (record.memory_status !== 'recalling')
|
|
792
|
-
continue;
|
|
793
|
-
if (!record.expiresAt)
|
|
794
|
-
continue;
|
|
795
|
-
if (new Date(record.expiresAt) > now)
|
|
796
|
-
continue;
|
|
797
|
-
urisToDelete.push(record.uri);
|
|
798
|
-
}
|
|
799
|
-
if (urisToDelete.length === 0) {
|
|
800
|
-
return { deleted: 0, uris: [] };
|
|
801
|
-
}
|
|
802
|
-
for (const uri of urisToDelete) {
|
|
803
|
-
delete data.by_uri[uri];
|
|
804
|
-
}
|
|
805
|
-
await this.saveData(data);
|
|
806
|
-
return { deleted: urisToDelete.length, uris: urisToDelete };
|
|
807
|
-
}
|
|
808
|
-
// ========== Memory 租约管理 (v1.21.0) ==========
|
|
809
|
-
// 本地文件存储不支持租约(单实例无并发场景);调用时抛异常,由 McpServer 降级到本地直接标记。
|
|
810
|
-
async claimMemoryUpdate(_uris, _leaseMinutes, _memoryType) {
|
|
811
|
-
throw new Error("claimMemoryUpdate not supported in local MemoryStore");
|
|
812
|
-
}
|
|
813
|
-
async renewMemoryLease(_leaseMinutes) {
|
|
814
|
-
throw new Error("renewMemoryLease not supported in local MemoryStore");
|
|
815
|
-
}
|
|
816
|
-
async releaseMemoryClaim(_uri) {
|
|
817
|
-
throw new Error("releaseMemoryClaim not supported in local MemoryStore");
|
|
818
|
-
}
|
|
819
|
-
async releaseAllMemoryClaims() {
|
|
820
|
-
throw new Error("releaseAllMemoryClaims not supported in local MemoryStore");
|
|
821
|
-
}
|
|
822
|
-
async getMyClaimedUris() {
|
|
823
|
-
throw new Error("getMyClaimedUris not supported in local MemoryStore");
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
//# sourceMappingURL=memory-store.js.map
|
|
1
|
+
const T=["recently_memory","agent_memory","project_memory","session_context"],h=["recently_memory","agent_memory"],x=64,D=32,O=128,R=64,C=1024;function I(y){const e=String(y||"").trim().replace(/\\/g,"/");if(!e)return e;const t=e.startsWith("@/")?e.substring(1):e;return t.startsWith("./")?t:`./${t.replace(/^\/+/,"")}`}class E extends Error{details;constructor(e,t){super(e),this.name="MemoryCapacityError",this.details=t}}const A=/^([a-zA-Z_][a-zA-Z0-9_]*):\/\/(.*)$/;function b(y){const e=(y||"").trim();return e?e.split("|").map(t=>t.trim()).filter(Boolean).map(t=>t.split(/\s+/).filter(Boolean)):[]}function S(y,e){return y.length===0?!1:y.some(t=>t.every(i=>e.includes(i)))}class p{storePath;constructor(e){this.storePath=e}nowIso(){return new Date().toISOString()}normalizeUri(e){const t=String(e||"").trim(),i=A.exec(t);if(!i)throw new Error(`Invalid memory uri: ${e}`);const o=i[1],r=i[2];if(!o||!r)throw new Error(`Invalid memory uri: ${e}`);const n=o.toLowerCase(),s=r.replace(/^\/+|\/+$/g,"");if(!s)throw new Error(`Invalid memory uri path: ${e}`);return{uri:`${n}://${s}`,domain:n,path:s}}normalizeMemoryType(e,t=T){const i=String(e||"").trim();if(!t.includes(i))throw new Error(`Invalid memory_type: ${e}`);return i}ensureTypeMatch(e,t){if(t&&e.memory_type!==t)throw new Error(`Memory type mismatch: expected ${t}, actual ${e.memory_type}`)}async ensureStoreDir(){const{mkdir:e}=await import("node:fs/promises");await e(this.storePath,{recursive:!0})}async loadMemoryFile(e){const{readFile:t}=await import("node:fs/promises");try{const i=await t(e,"utf-8"),o=JSON.parse(i),r=o.by_uri&&typeof o.by_uri=="object"?o.by_uri:{},n={};for(const[s,a]of Object.entries(r)){const d=this.normalizeMemoryType(a.memory_type||"project_memory"),u=this.normalizeUri(a.uri||s),l=a;let c=l.memory_status;c||(l.update_status==="updating"?c="updating":l.recall_status==="recalling"?c="recalling":c="normal");const m={...a};delete m.update_status,delete m.recall_status,n[u.uri]={...m,uri:u.uri,domain:u.domain,path:u.path,memory_type:d,memory_status:c}}return{by_uri:n}}catch{return{by_uri:{}}}}async loadData(){const{readdir:e}=await import("node:fs/promises"),t=await import("node:path");try{const i=await e(this.storePath,{withFileTypes:!0}),o={by_uri:{}};for(const r of i){if(!r.isFile()||!r.name.endsWith(".json"))continue;const n=await this.loadMemoryFile(t.join(this.storePath,r.name));Object.assign(o.by_uri,n.by_uri)}return o}catch{return{by_uri:{}}}}async writeJsonAtomically(e,t){const{rename:i,rm:o,writeFile:r}=await import("node:fs/promises"),n=`${e}.${process.pid}.${Date.now()}.tmp`;try{await r(n,JSON.stringify(t,null,2),"utf-8"),await i(n,e)}catch(s){throw await o(n,{force:!0}),s}}async saveData(e){const{readdir:t,rm:i}=await import("node:fs/promises"),o=await import("node:path");await this.ensureStoreDir();const r=new Map;for(const a of Object.values(e.by_uri)){const d=r.get(a.domain)??{by_uri:{}};d.by_uri[a.uri]=a,r.set(a.domain,d)}for(const[a,d]of r.entries())await this.writeJsonAtomically(o.join(this.storePath,`${a}.json`),d);const n=new Set([...r.keys()].map(a=>`${a}.json`)),s=await t(this.storePath,{withFileTypes:!0});for(const a of s)a.isFile()&&a.name.endsWith(".json")&&!n.has(a.name)&&await i(o.join(this.storePath,a.name),{force:!0})}createEmptyStats(){return{total:0,listable:{count:0,limit:64,hardLimit:128,exceeded:!1,hardExceeded:!1},by_type:{recently_memory:{count:0,limit:32,hardLimit:64,exceeded:!1,hardExceeded:!1,listable:!0,domainCount:0,by_domain:{}},agent_memory:{count:0,limit:32,hardLimit:64,exceeded:!1,hardExceeded:!1,listable:!0,domainCount:0,by_domain:{}},project_memory:{count:0,limit:null,hardLimit:null,exceeded:!1,hardExceeded:!1,listable:!1,domainCount:0,by_domain:{}},session_context:{count:0,limit:null,hardLimit:1024,exceeded:!1,hardExceeded:!1,listable:!1,domainCount:0,by_domain:{}}}}}calculateStats(e){const t=this.createEmptyStats();for(const i of Object.values(e.by_uri)){t.total+=1;const o=t.by_type[i.memory_type];o.count+=1;const r=a=>h.includes(a)?32:null,n=a=>h.includes(a)?64:a==="session_context"?1024:null,s=o.by_domain[i.domain]??{count:0,limit:r(i.memory_type),hardLimit:n(i.memory_type),exceeded:!1,hardExceeded:!1};s.count+=1,o.by_domain[i.domain]=s,h.includes(i.memory_type)&&(t.listable.count+=1)}t.listable.exceeded=t.listable.count>t.listable.limit,t.listable.hardExceeded=t.listable.count>=t.listable.hardLimit;for(const i of T){const o=t.by_type[i];o.domainCount=Object.keys(o.by_domain).length,o.limit!==null&&o.hardLimit!==null&&(o.exceeded=o.domainCount>o.limit,o.hardExceeded=o.domainCount>=o.hardLimit);for(const r of Object.values(o.by_domain))r.limit!==null&&r.hardLimit!==null&&(r.exceeded=r.count>r.limit,r.hardExceeded=r.count>=r.hardLimit)}return t}generateId(e){return`${e.replace(/[^a-zA-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")}_${Date.now().toString(36)}`}ensureListableMemoryCapacity(e,t,i){if(!h.includes(t))return;const r=this.calculateStats(e).by_type[t],n=r.by_domain[i.domain];if(!n&&r.domainCount>=64)throw new E(`Cannot create ${t}: hard domain type limit 64 reached. Please delete an existing ${t} domain type before creating a new ${t}.`,{code:"MEMORY_TYPE_LIMIT_REACHED",memory_type:t,limit:64,current:r.domainCount,recommended_actions:[`list_memories({ memory_type: '${t}' })`,`delete_memory({ uri, memory_type: '${t}' })`]});if(n&&n.count>=64)throw new E(`Cannot create ${t}: hard memory limit 64 reached under domain ${i.domain}. Please delete or archive existing ${i.domain}://${t} memories before creating a new one.`,{code:"MEMORY_TYPE_LIMIT_REACHED",memory_type:t,domain:i.domain,limit:64,current:n.count,recommended_actions:[`list_memories({ memory_type: '${t}' })`,`delete_memory({ uri, memory_type: '${t}' })`]})}ensureSessionContextCapacity(e,t,i){if(t!=="session_context")return;const o=Object.values(e.by_uri).filter(r=>r.memory_type==="session_context"&&r.domain===i.domain).length;if(o>=1024)throw new E(`Cannot create session_context: hard limit 1024 reached under domain ${i.domain}. Please delete existing session_context memories before creating a new one.`,{code:"MEMORY_TYPE_LIMIT_REACHED",memory_type:t,domain:i.domain,limit:1024,current:o,recommended_actions:["list_memories({ memory_type: 'session_context' })","delete_memory({ uri, memory_type: 'session_context' })"]})}async getStats(){const e=await this.loadData();return this.calculateStats(e)}static calcAgentMemoryExpiresAt(){return new Date(Date.now()+432e5).toISOString()}static isExpirableType(e){return e==="agent_memory"||e==="recently_memory"}async createMemory(e){const t=this.normalizeMemoryType(e.memory_type),i=this.normalizeUri(e.uri),o=await this.loadData();if(o.by_uri[i.uri])throw new Error(`Memory already exists: ${i.uri}`);this.ensureListableMemoryCapacity(o,t,i),this.ensureSessionContextCapacity(o,t,i);const r=this.nowIso(),n={id:this.generateId(i.uri),uri:i.uri,domain:i.domain,path:i.path,title:e.title||void 0,content:String(e.content||""),memory_type:t,createdAt:r,updatedAt:r,version:1,keywords:e.keywords,bound_files:e.bound_files,file_md5_map:e.file_md5_map||void 0,updating_agent_id:void 0,last_check_time:e.last_check_time||void 0,expiresAt:e.expiresAt||(p.isExpirableType(t)?p.calcAgentMemoryExpiresAt():void 0),memory_status:"normal"};return o.by_uri[i.uri]=n,await this.saveData(o),n}async readMemory(e){const t=this.normalizeUri(e.uri),i=typeof e.memory_type=="string"?this.normalizeMemoryType(e.memory_type):void 0,r=(await this.loadData()).by_uri[t.uri]??null;return r?(this.ensureTypeMatch(r,i),r):null}async updateMemory(e){const t=this.normalizeUri(e.uri),i=typeof e.memory_type=="string"?this.normalizeMemoryType(e.memory_type):void 0,o=await this.loadData(),r=o.by_uri[t.uri];if(!r)throw new Error(`Memory not found: ${t.uri}`);this.ensureTypeMatch(r,i);let n=r.content;if(typeof e.old_string=="string"&&typeof e.new_string=="string"){const l=e.old_string;if(!l)throw new Error("old_string cannot be empty when replacing");const c=n.split(l).length-1;if(c===0)throw new Error("old_string not found in memory content");if(c>1)throw new Error("old_string appears multiple times; replace is ambiguous");n=n.replace(l,e.new_string)}typeof e.append=="string"&&e.append.length>0&&(n=`${n}${e.append}`);const s=n!==r.content||typeof e.title=="string"&&e.title!==r.title,a=this.nowIso();let d=r.expiresAt;if(p.isExpirableType(r.memory_type))if(r.memory_type==="recently_memory")d=new Date(Date.now()+24*60*60*1e3).toISOString();else{const l=r.expiresAt?new Date(r.expiresAt):null,c=r.updatedAt?new Date(r.updatedAt):null,m=l&&c&&!isNaN(c.getTime())?Math.max(12*60*60*1e3,l.getTime()-c.getTime()):12*60*60*1e3;d=new Date(Date.now()+m*2).toISOString()}e.expiresAt!==void 0&&(d=e.expiresAt);const u={...r,content:n,title:e.title!==void 0?e.title:r.title,updatedAt:a,version:r.version+1,keywords:e.keywords!==void 0?e.keywords:r.keywords,bound_files:e.bound_files!==void 0?e.bound_files:r.bound_files,file_md5_map:e.file_md5_map!==void 0?e.file_md5_map:e.bound_files!==void 0?void 0:r.file_md5_map,memory_status:e.memory_status!==void 0?e.memory_status:r.memory_status==="updating"?"normal":r.memory_status||"normal",updating_agent_id:e.memory_status!==void 0?e.updating_agent_id||void 0:r.memory_status==="updating"?void 0:r.updating_agent_id,last_check_time:e.last_check_time!==void 0?e.last_check_time:r.last_check_time,expiresAt:d};return o.by_uri[t.uri]=u,await this.saveData(o),u}async deleteMemory(e){const t=this.normalizeUri(e.uri),i=typeof e.memory_type=="string"?this.normalizeMemoryType(e.memory_type):void 0,o=await this.loadData(),r=o.by_uri[t.uri];return r?(this.ensureTypeMatch(r,i),delete o.by_uri[t.uri],await this.saveData(o),!0):!1}async listExpiredRecentlyMemories(){const e=await this.loadData(),t=new Date,i=[];for(const o of Object.values(e.by_uri))o.memory_type!=="agent_memory"&&o.memory_type!=="recently_memory"||o.expiresAt&&new Date(o.expiresAt)<=t&&i.push(o);return i.sort((o,r)=>o.expiresAt.localeCompare(r.expiresAt))}async searchMemory(e){const t=await this.loadData(),o=String(e.query||"").trim().toLowerCase(),r=e.memory_type?this.normalizeMemoryType(e.memory_type):void 0,n=typeof e.limit=="number"&&e.limit>0?e.limit:10,s=e.keywords?.map(c=>c.toLowerCase()),a=e.keyword_mode==="all"?"all":"any",d=b(o);if(d.length===0&&(!s||s.length===0))return{query:o,results:[]};const u=new Set,l=[];for(const c of Object.values(t.by_uri)){if(r&&c.memory_type!==r||u.has(c.id))continue;let m=0;if(s&&s.length>0&&c.keywords){const f=c.keywords.map(_=>_.toLowerCase());if(a==="all"){if(s.every(w=>f.includes(w)))m+=10*s.length;else if(d.length===0)continue}else for(const _ of s)f.includes(_)&&(m+=10)}if(d.length>0){const f=`${c.uri}
|
|
2
|
+
${c.title||""}
|
|
3
|
+
${c.content}`.toLowerCase();if(!S(d,f)&&m===0)continue;for(const _ of d){const w=_.filter(M=>f.includes(M)).length;if(w>0){const M=c.uri.toLowerCase(),L=_.filter(g=>M.includes(g)).length;m+=w+L}}}m!==0&&(u.add(c.id),l.push({score:m,record:c}))}return l.sort((c,m)=>m.score!==c.score?m.score-c.score:m.record.updatedAt.localeCompare(c.record.updatedAt)),{query:o,results:l.slice(0,n).map(c=>c.record)}}async listByType(e){const t=e==="session_context"||e==="project_memory"?T:h,i=this.normalizeMemoryType(e,t),o=await this.loadData(),r=new Set,n=[];for(const s of Object.values(o.by_uri))s.memory_type===i&&(r.has(s.id)||(r.add(s.id),n.push(s)));return n.sort((s,a)=>a.updatedAt.localeCompare(s.updatedAt)),n}async listByFile(e,t){const i=await this.loadData(),o=typeof t=="object"&&t!==null?t.memory_type:t,r=o?this.normalizeMemoryType(o):void 0,n=I(e),s=new Set,a=[];for(const d of Object.values(i.by_uri))r&&d.memory_type!==r||s.has(d.id)||d.bound_files&&d.bound_files.length>0&&d.bound_files.some(l=>I(l)===n)&&(s.add(d.id),a.push(d));return a.sort((d,u)=>u.updatedAt.localeCompare(d.updatedAt)),a}async markExpiredMemoriesRecalling(e){const t=await this.listExpiredRecentlyMemories();if(t.length===0)return{marked:0,uris:[]};const i=e?t.filter(s=>e.includes(s.uri)):t;if(i.length===0)return{marked:0,uris:[]};const o=await this.loadData(),r=this.nowIso(),n=[];for(const s of i){const a=o.by_uri[s.uri];a&&(a.memory_status="recalling",a.updatedAt=r,a.version=(a.version||1)+1,n.push(s.uri))}return n.length>0&&await this.saveData(o),{marked:n.length,uris:n}}async clearRecallingExpiredMemories(){const e=await this.loadData(),t=new Date,i=[];for(const o of Object.values(e.by_uri))p.isExpirableType(o.memory_type)&&o.memory_status==="recalling"&&o.expiresAt&&(new Date(o.expiresAt)>t||i.push(o.uri));if(i.length===0)return{deleted:0,uris:[]};for(const o of i)delete e.by_uri[o];return await this.saveData(e),{deleted:i.length,uris:i}}async claimMemoryUpdate(e,t,i){throw new Error("claimMemoryUpdate not supported in local MemoryStore")}async renewMemoryLease(e){throw new Error("renewMemoryLease not supported in local MemoryStore")}async releaseMemoryClaim(e){throw new Error("releaseMemoryClaim not supported in local MemoryStore")}async releaseAllMemoryClaims(){throw new Error("releaseAllMemoryClaims not supported in local MemoryStore")}async getMyClaimedUris(){throw new Error("getMyClaimedUris not supported in local MemoryStore")}}export{E as MemoryCapacityError,p as MemoryStore,I as normalizeBoundFilePath};
|
|
4
|
+
|