@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.1
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 +13 -10
- package/dist/agent/agent-definition-registry.d.ts +3 -0
- package/dist/agent/agent-definition-registry.js +3 -1
- package/dist/agent/agent-definition.d.ts +15 -0
- package/dist/agent/agent-definition.js +27 -3
- package/dist/arena/context/context-tools.js +47 -4
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -84
- package/dist/automation/cron-expr.d.ts +10 -0
- package/dist/automation/cron-expr.js +23 -5
- package/dist/automation/runner.d.ts +21 -4
- package/dist/automation/runner.js +48 -12
- package/dist/automation/scheduler.d.ts +38 -0
- package/dist/automation/scheduler.js +89 -12
- package/dist/automation/store.js +5 -2
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/overlay.d.ts +15 -0
- package/dist/capability-control/overlay.js +27 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +15 -1
- package/dist/cli/agent-server-stdio.js +115 -17
- package/dist/cli/agent-server-tcp.js +40 -26
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +186 -0
- package/dist/context/manager.js +25 -4
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +267 -138
- package/dist/engine/engine.js +957 -191
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +145 -0
- package/dist/engine/goal.js +144 -0
- package/dist/engine/image-policy.d.ts +13 -0
- package/dist/engine/image-policy.js +24 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +2 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +67 -3
- package/dist/engine/turn-loop.js +292 -41
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/utils.js +11 -6
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +86 -10
- package/dist/hooks/goal-stop-hook.d.ts +28 -0
- package/dist/hooks/goal-stop-hook.js +186 -9
- package/dist/hooks/registry.d.ts +8 -0
- package/dist/hooks/registry.js +19 -0
- package/dist/hooks/shell-runner.js +10 -21
- package/dist/index.d.ts +49 -6
- package/dist/index.js +60 -4
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/rules.js +4 -0
- package/dist/llm/capabilities/types.d.ts +10 -0
- package/dist/llm/client-base.d.ts +28 -1
- package/dist/llm/client-base.js +119 -13
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +14 -0
- package/dist/llm/model-pool.js +13 -0
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +4 -0
- package/dist/llm/providers/anthropic.js +64 -14
- package/dist/llm/providers/openai.d.ts +36 -0
- package/dist/llm/providers/openai.js +257 -51
- package/dist/llm/reasoning-setting.d.ts +3 -3
- package/dist/llm/reasoning-setting.js +9 -1
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +4 -0
- package/dist/logging/sanitize-messages.js +22 -0
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +40 -10
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +61 -326
- package/dist/plugins/gitOps.d.ts +19 -0
- package/dist/plugins/gitOps.js +73 -4
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
- package/dist/plugins/installer/codex/convertMcp.js +45 -5
- package/dist/plugins/installer/install.js +25 -1
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.js +8 -2
- package/dist/plugins/installer/loadPluginAgents.js +6 -2
- package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
- package/dist/plugins/installer/loadPluginMcp.js +35 -2
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +5 -2
- package/dist/plugins/installer/types.js +1 -0
- package/dist/plugins/installer/uninstall.js +4 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +14 -0
- package/dist/plugins/installer/update.js +53 -21
- package/dist/plugins/loadPluginHooks.d.ts +47 -1
- package/dist/plugins/loadPluginHooks.js +73 -1
- package/dist/plugins/marketplaceManager.d.ts +7 -0
- package/dist/plugins/marketplaceManager.js +20 -0
- package/dist/plugins/pluginCommandHook.js +4 -18
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +13 -0
- package/dist/plugins/pluginInstaller.js +42 -8
- package/dist/plugins/schemas.js +1 -0
- package/dist/plugins/types.d.ts +6 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +96 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +27 -0
- package/dist/prompt/composer.js +67 -21
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/protocol/chat-session-manager.d.ts +8 -2
- package/dist/protocol/chat-session-manager.js +36 -0
- package/dist/protocol/chat-session.d.ts +65 -0
- package/dist/protocol/chat-session.js +94 -2
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/server.d.ts +112 -0
- package/dist/protocol/server.js +586 -16
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +46 -0
- package/dist/protocol/types.js +16 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/FileRunStore.js +8 -3
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +35 -0
- package/dist/run/factory.d.ts +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -50
- package/dist/services/session-memory.js +24 -12
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +222 -6
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +40 -0
- package/dist/session/session-manager.js +113 -3
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +9 -2
- package/dist/settings/disk-defaults.js +11 -2
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +68 -1
- package/dist/settings/manager.js +266 -29
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1186 -771
- package/dist/settings/schema.js +268 -97
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
- package/dist/tool-system/builtin/agent-registry.js +8 -0
- package/dist/tool-system/builtin/agent.d.ts +21 -1
- package/dist/tool-system/builtin/agent.js +489 -42
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +0 -15
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +55 -3
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.js +20 -16
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +35 -0
- package/dist/tool-system/builtin/generate-image.js +278 -50
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/glob.js +0 -7
- package/dist/tool-system/builtin/grep.js +6 -8
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +7 -1
- package/dist/tool-system/builtin/index.js +249 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -7
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.js +10 -10
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +3 -2
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.js +21 -7
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.js +0 -6
- package/dist/tool-system/context.d.ts +154 -6
- package/dist/tool-system/executor.d.ts +3 -1
- package/dist/tool-system/executor.js +172 -88
- package/dist/tool-system/investigation-guard.js +1 -1
- package/dist/tool-system/mcp-manager.d.ts +42 -4
- package/dist/tool-system/mcp-manager.js +186 -20
- package/dist/tool-system/path-policy.d.ts +5 -0
- package/dist/tool-system/path-policy.js +307 -8
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +281 -69
- package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
- package/dist/tool-system/plan-mode-allowlist.js +24 -2
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +16 -2
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/types.d.ts +217 -6
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/theme.d.ts +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +13 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
|
@@ -4,12 +4,20 @@
|
|
|
4
4
|
* Stores snapshots in the session directory under file-history/.
|
|
5
5
|
* Supports restoring files to a previous state.
|
|
6
6
|
*/
|
|
7
|
-
import { mkdirSync, existsSync, readFileSync, writeFileSync, copyFileSync } from "node:fs";
|
|
7
|
+
import { mkdirSync, existsSync, readFileSync, writeFileSync, copyFileSync, rmSync, } from "node:fs";
|
|
8
8
|
import { join, resolve } from "node:path";
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
|
+
import { earliestSnapshotsPerFile } from "./undo-target.js";
|
|
10
11
|
export class FileHistory {
|
|
11
12
|
historyDir;
|
|
12
13
|
snapshots = [];
|
|
14
|
+
/**
|
|
15
|
+
* Redo material for undone turns, kept SEPARATE from `snapshots` so it never
|
|
16
|
+
* pollutes undo selection (latestTurnUndoTargets / earliestSnapshotsPerFile).
|
|
17
|
+
*/
|
|
18
|
+
redoRecords = [];
|
|
19
|
+
/** Per-turn "this file was created" markers (see CreatedMarker). */
|
|
20
|
+
created = [];
|
|
13
21
|
constructor(sessionDir) {
|
|
14
22
|
this.historyDir = join(sessionDir, "file-history");
|
|
15
23
|
mkdirSync(this.historyDir, { recursive: true });
|
|
@@ -17,16 +25,23 @@ export class FileHistory {
|
|
|
17
25
|
/**
|
|
18
26
|
* Save a snapshot of a file before it is modified.
|
|
19
27
|
* Returns the snapshot record, or null if the file doesn't exist.
|
|
28
|
+
*
|
|
29
|
+
* `turnSeq` tags the snapshot with the current conversation turn so a later
|
|
30
|
+
* `/undo` can revert exactly the files that turn changed (see
|
|
31
|
+
* latestTurnUndoTargets). Omit it for callers without turn context.
|
|
20
32
|
*/
|
|
21
|
-
saveSnapshot(filePath) {
|
|
33
|
+
saveSnapshot(filePath, turnSeq) {
|
|
22
34
|
const absPath = resolve(filePath);
|
|
23
35
|
if (!existsSync(absPath))
|
|
24
36
|
return null;
|
|
25
37
|
try {
|
|
26
38
|
const content = readFileSync(absPath);
|
|
27
39
|
const hash = createHash("md5").update(content).digest("hex");
|
|
28
|
-
// Check if we already have this exact
|
|
29
|
-
|
|
40
|
+
// Check if we already have this exact (path, content) for this turn. Dedup
|
|
41
|
+
// is per-turn: the same content re-snapshotted in a later turn is a real
|
|
42
|
+
// new pre-turn baseline and must be recorded, or turn-level undo would
|
|
43
|
+
// miss it. Within a turn, re-snapshotting unchanged content is a no-op.
|
|
44
|
+
const existing = this.snapshots.find((s) => s.filePath === absPath && s.hash === hash && s.turnSeq === turnSeq);
|
|
30
45
|
if (existing)
|
|
31
46
|
return existing;
|
|
32
47
|
// Create backup. The filename must uniquely identify (path, content): a
|
|
@@ -47,6 +62,7 @@ export class FileHistory {
|
|
|
47
62
|
backupPath,
|
|
48
63
|
hash,
|
|
49
64
|
size: content.length,
|
|
65
|
+
...(turnSeq === undefined ? {} : { turnSeq }),
|
|
50
66
|
};
|
|
51
67
|
this.snapshots.push(snapshot);
|
|
52
68
|
// Write index
|
|
@@ -57,6 +73,26 @@ export class FileHistory {
|
|
|
57
73
|
return null;
|
|
58
74
|
}
|
|
59
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Record that `filePath` was CREATED in `turnSeq` — called by the engine hook
|
|
78
|
+
* when the pre-edit saveSnapshot returns null (file did not exist yet). Idempotent
|
|
79
|
+
* per (path, turn): a file built then edited again in the same turn is recorded
|
|
80
|
+
* once, so undo deletes it (rather than restoring an intra-turn snapshot). A
|
|
81
|
+
* marker already flipped `undone` from a prior undo is reused as-is (not
|
|
82
|
+
* re-armed) — only fresh turns create new markers.
|
|
83
|
+
*/
|
|
84
|
+
recordCreated(filePath, turnSeq) {
|
|
85
|
+
const absPath = resolve(filePath);
|
|
86
|
+
const existing = this.created.find((c) => c.filePath === absPath && c.turnSeq === turnSeq);
|
|
87
|
+
if (existing)
|
|
88
|
+
return;
|
|
89
|
+
this.created.push({ filePath: absPath, turnSeq });
|
|
90
|
+
this.saveIndex();
|
|
91
|
+
}
|
|
92
|
+
/** Redo material captured by past undos (see RedoRecord). Returns a copy. */
|
|
93
|
+
getRedoRecords() {
|
|
94
|
+
return [...this.redoRecords];
|
|
95
|
+
}
|
|
60
96
|
/**
|
|
61
97
|
* Get all snapshots for a specific file.
|
|
62
98
|
*/
|
|
@@ -97,10 +133,180 @@ export class FileHistory {
|
|
|
97
133
|
getTrackedFiles() {
|
|
98
134
|
return [...new Set(this.snapshots.map((s) => s.filePath))];
|
|
99
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Restore EVERY tracked file to its earliest snapshot — the state before the
|
|
138
|
+
* first AI edit this session. Powers `/undo all`. Targets are computed up
|
|
139
|
+
* front (restore() appends a new snapshot, so reading them lazily mid-loop
|
|
140
|
+
* would be unstable). Returns a per-file result so a partial failure doesn't
|
|
141
|
+
* hide which files reverted.
|
|
142
|
+
*/
|
|
143
|
+
restoreAllToEarliest() {
|
|
144
|
+
const targets = earliestSnapshotsPerFile(this.snapshots);
|
|
145
|
+
return targets.map((snap) => ({ filePath: snap.filePath, ok: this.restore(snap) }));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Capture the file's CURRENT on-disk content into a fresh redo backup and
|
|
149
|
+
* append a RedoRecord. `existedBefore` distinguishes a modified file (true,
|
|
150
|
+
* redo re-applies content) from a turn-created file (false, redo recreates it).
|
|
151
|
+
* Returns false if the file can't be read (then no record is added).
|
|
152
|
+
*/
|
|
153
|
+
captureRedoBackup(filePath, turnSeq, existedBefore) {
|
|
154
|
+
try {
|
|
155
|
+
if (!existsSync(filePath))
|
|
156
|
+
return false;
|
|
157
|
+
const content = readFileSync(filePath);
|
|
158
|
+
const hash = createHash("md5").update(content).digest("hex");
|
|
159
|
+
const timestamp = Date.now();
|
|
160
|
+
const pathHash = createHash("md5").update(filePath).digest("hex").slice(0, 8);
|
|
161
|
+
const safeName = filePath.replace(/[/\\:]/g, "_").slice(-80);
|
|
162
|
+
const backupPath = join(this.historyDir, `redo_${timestamp}_${pathHash}_${hash.slice(0, 8)}_${safeName}`);
|
|
163
|
+
copyFileSync(filePath, backupPath);
|
|
164
|
+
this.redoRecords.push({ filePath, turnSeq, backupPath, existedBefore });
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Turn-level undo: revert every file the most recent conversation turn changed
|
|
173
|
+
* back to its pre-turn state. Unlike the earlier "delete on undo" approach this
|
|
174
|
+
* now (a) captures the turn's RESULT as redo material so `redoLatestTurn` can
|
|
175
|
+
* re-apply it, and (b) MARKS the turn's snapshots `undone` rather than deleting
|
|
176
|
+
* them — `latestTurnUndoTargets` skips undone turns, so a subsequent `/undo`
|
|
177
|
+
* still peels the previous turn ("onion"). Powers `/undo`.
|
|
178
|
+
*
|
|
179
|
+
* Files the turn CREATED (recorded via recordCreated) are DELETED on undo (with
|
|
180
|
+
* existedBefore:false redo material) instead of restored. `targets` come from
|
|
181
|
+
* latestTurnUndoTargets so preview and restore agree. Returns per-file results.
|
|
182
|
+
*/
|
|
183
|
+
undoLatestTurn(targets) {
|
|
184
|
+
// The turn being undone = the turnSeq shared by the targets (all from the
|
|
185
|
+
// same latest live turn). Created-only turns may have no snapshot targets, so
|
|
186
|
+
// fall back to the created markers' turn.
|
|
187
|
+
const undoneTurn = targets[0]?.turnSeq ?? this.latestLiveCreatedTurn();
|
|
188
|
+
if (undoneTurn === undefined)
|
|
189
|
+
return [];
|
|
190
|
+
const results = [];
|
|
191
|
+
// Files created this turn: delete them (after stashing redo material). Skip
|
|
192
|
+
// files that are also a restore target — created wins (the file didn't exist
|
|
193
|
+
// pre-turn, so its "pre-turn state" is "absent" → delete, not restore).
|
|
194
|
+
const createdThisTurn = this.created.filter((c) => !c.undone && c.turnSeq === undoneTurn);
|
|
195
|
+
const createdPaths = new Set(createdThisTurn.map((c) => c.filePath));
|
|
196
|
+
for (const c of createdThisTurn) {
|
|
197
|
+
this.captureRedoBackup(c.filePath, undoneTurn, false);
|
|
198
|
+
let ok = true;
|
|
199
|
+
try {
|
|
200
|
+
if (existsSync(c.filePath))
|
|
201
|
+
rmSync(c.filePath, { force: true });
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
ok = false;
|
|
205
|
+
}
|
|
206
|
+
results.push({ filePath: c.filePath, ok });
|
|
207
|
+
}
|
|
208
|
+
// Modified (pre-existing) files: stash the current result as redo material,
|
|
209
|
+
// then restore the pre-turn content.
|
|
210
|
+
for (const snap of targets) {
|
|
211
|
+
if (createdPaths.has(snap.filePath))
|
|
212
|
+
continue;
|
|
213
|
+
this.captureRedoBackup(snap.filePath, undoneTurn, true);
|
|
214
|
+
results.push({ filePath: snap.filePath, ok: this.restore(snap) });
|
|
215
|
+
}
|
|
216
|
+
// Mark the turn undone (snapshots + created markers) — keep them on disk so
|
|
217
|
+
// redo has material and the turn is re-applyable.
|
|
218
|
+
for (const s of this.snapshots) {
|
|
219
|
+
if (s.turnSeq === undoneTurn)
|
|
220
|
+
s.undone = true;
|
|
221
|
+
}
|
|
222
|
+
for (const c of this.created) {
|
|
223
|
+
if (c.turnSeq === undoneTurn)
|
|
224
|
+
c.undone = true;
|
|
225
|
+
}
|
|
226
|
+
this.saveIndex();
|
|
227
|
+
return results;
|
|
228
|
+
}
|
|
229
|
+
/** Greatest turnSeq among not-yet-undone created markers, or undefined. */
|
|
230
|
+
latestLiveCreatedTurn() {
|
|
231
|
+
let max;
|
|
232
|
+
for (const c of this.created) {
|
|
233
|
+
if (c.undone)
|
|
234
|
+
continue;
|
|
235
|
+
if (max === undefined || c.turnSeq > max)
|
|
236
|
+
max = c.turnSeq;
|
|
237
|
+
}
|
|
238
|
+
return max;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Turn-level redo: re-apply a previously undone turn. For each redo target,
|
|
242
|
+
* write the stashed post-turn content back to disk (existedBefore:false
|
|
243
|
+
* records RECREATE a turn-created file). Then clear the `undone` flags on that
|
|
244
|
+
* turn's snapshots and created markers, and drop the consumed redo records.
|
|
245
|
+
*
|
|
246
|
+
* `redoTargets` come from latestRedoTargets (which guarantees they are the
|
|
247
|
+
* latest still-undone turn). Returns per-file results.
|
|
248
|
+
*/
|
|
249
|
+
redoLatestTurn(redoTargets) {
|
|
250
|
+
if (redoTargets.length === 0)
|
|
251
|
+
return [];
|
|
252
|
+
const turn = redoTargets[0].turnSeq;
|
|
253
|
+
const results = redoTargets.map((rec) => {
|
|
254
|
+
let ok = false;
|
|
255
|
+
try {
|
|
256
|
+
if (existsSync(rec.backupPath)) {
|
|
257
|
+
copyFileSync(rec.backupPath, rec.filePath);
|
|
258
|
+
ok = true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
ok = false;
|
|
263
|
+
}
|
|
264
|
+
return { filePath: rec.filePath, ok };
|
|
265
|
+
});
|
|
266
|
+
// Un-mark the turn: it is live again, so undo can re-target it.
|
|
267
|
+
for (const s of this.snapshots) {
|
|
268
|
+
if (s.turnSeq === turn)
|
|
269
|
+
s.undone = false;
|
|
270
|
+
}
|
|
271
|
+
for (const c of this.created) {
|
|
272
|
+
if (c.turnSeq === turn)
|
|
273
|
+
c.undone = false;
|
|
274
|
+
}
|
|
275
|
+
// Consume the redo records for this turn (and remove their backups).
|
|
276
|
+
const consumed = new Set(redoTargets);
|
|
277
|
+
this.redoRecords = this.redoRecords.filter((r) => {
|
|
278
|
+
if (consumed.has(r) || r.turnSeq === turn) {
|
|
279
|
+
try {
|
|
280
|
+
if (existsSync(r.backupPath))
|
|
281
|
+
rmSync(r.backupPath, { force: true });
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// best-effort cleanup
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
return true;
|
|
289
|
+
});
|
|
290
|
+
this.saveIndex();
|
|
291
|
+
return results;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* All snapshots in record (chronological) order. Used by undo to pick the
|
|
295
|
+
* single most-recent modification across every file (see latestUndoTarget).
|
|
296
|
+
* Returns a copy so callers can't mutate the internal list.
|
|
297
|
+
*/
|
|
298
|
+
getAllSnapshots() {
|
|
299
|
+
return [...this.snapshots];
|
|
300
|
+
}
|
|
100
301
|
saveIndex() {
|
|
101
302
|
try {
|
|
102
303
|
const indexPath = join(this.historyDir, "index.json");
|
|
103
|
-
|
|
304
|
+
const index = {
|
|
305
|
+
snapshots: this.snapshots,
|
|
306
|
+
redoRecords: this.redoRecords,
|
|
307
|
+
created: this.created,
|
|
308
|
+
};
|
|
309
|
+
writeFileSync(indexPath, JSON.stringify(index, null, 2), "utf-8");
|
|
104
310
|
}
|
|
105
311
|
catch {
|
|
106
312
|
// Silent fail
|
|
@@ -111,7 +317,17 @@ export class FileHistory {
|
|
|
111
317
|
const indexPath = join(history.historyDir, "index.json");
|
|
112
318
|
if (existsSync(indexPath)) {
|
|
113
319
|
try {
|
|
114
|
-
|
|
320
|
+
const parsed = JSON.parse(readFileSync(indexPath, "utf-8"));
|
|
321
|
+
if (Array.isArray(parsed)) {
|
|
322
|
+
// Legacy v1: bare FileSnapshot[]. No redo/created material existed yet.
|
|
323
|
+
history.snapshots = parsed;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
const index = parsed;
|
|
327
|
+
history.snapshots = index.snapshots ?? [];
|
|
328
|
+
history.redoRecords = index.redoRecords ?? [];
|
|
329
|
+
history.created = index.created ?? [];
|
|
330
|
+
}
|
|
115
331
|
}
|
|
116
332
|
catch {
|
|
117
333
|
// Start fresh
|
package/dist/session/memory.d.ts
CHANGED
|
@@ -19,7 +19,16 @@
|
|
|
19
19
|
* Deletes are SOFT — files are moved to <baseDir>/memory-trash/<ISO>/<scope>/
|
|
20
20
|
* rather than removed, so accidental deletions are recoverable.
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Memory scopes (storage subdirs under a memory root):
|
|
24
|
+
* - user user-owned; tool writes here are permission-gated
|
|
25
|
+
* - dream the auto-consolidation workspace (LLM free-write)
|
|
26
|
+
* - pending 待审批门 (用户拍板): auto-extracted memories the LLM 判为"提全局"
|
|
27
|
+
* land here (global root only) and are NOT injected. The user
|
|
28
|
+
* approves (→ moves to user/) or rejects (→ trash) in the settings
|
|
29
|
+
* panel. Keeps the global layer curated — nothing auto-lands global.
|
|
30
|
+
*/
|
|
31
|
+
export type MemoryScope = "user" | "dream" | "pending";
|
|
23
32
|
export interface MemoryEntry {
|
|
24
33
|
name: string;
|
|
25
34
|
description: string;
|
|
@@ -27,7 +36,45 @@ export interface MemoryEntry {
|
|
|
27
36
|
content: string;
|
|
28
37
|
fileName: string;
|
|
29
38
|
scope: MemoryScope;
|
|
39
|
+
/** File mtime in epoch ms — drives maxAge filtering (TODO 8.1). 0 if unknown. */
|
|
40
|
+
updatedAt?: number;
|
|
41
|
+
/**
|
|
42
|
+
* 固定/置顶 (feedback#18 方案 A): a pinned memory is exempt from maxAge
|
|
43
|
+
* injection filtering and sorts first in the injected context. UI surfaces
|
|
44
|
+
* pin/unpin; auto flows never set it.
|
|
45
|
+
*/
|
|
46
|
+
pinned?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Provenance (方案 C): "auto" = written by the end-of-session extractor,
|
|
49
|
+
* "manual" (or absent — legacy files) = written by the user/UI. Lets the
|
|
50
|
+
* UI distinguish curated memories from extractor noise.
|
|
51
|
+
*/
|
|
52
|
+
origin?: "auto" | "manual";
|
|
53
|
+
/**
|
|
54
|
+
* Recall lifecycle (召回 TTL). `usageCount` increments each time MemoryRead
|
|
55
|
+
* hits this entry; `lastUsed` is the ISO timestamp of that last hit; `created`
|
|
56
|
+
* is set on first save and preserved across UPDATE. Drives recall-based TTL:
|
|
57
|
+
* a `project`-type memory not read for N days is pruned. Stored in frontmatter
|
|
58
|
+
* — no SQLite. Legacy files lacking these fields read back as
|
|
59
|
+
* {usageCount:0, lastUsed/created ← mtime}, never hidden.
|
|
60
|
+
*/
|
|
61
|
+
usageCount?: number;
|
|
62
|
+
lastUsed?: string;
|
|
63
|
+
created?: string;
|
|
64
|
+
/**
|
|
65
|
+
* 审批门 (用户拍板): for `pending`-scope entries, the project cwd the memory
|
|
66
|
+
* was extracted in. On "不批准/降级" the entry falls back to THIS project's
|
|
67
|
+
* user store (not the current one). Absent → fall back to no-repo / global.
|
|
68
|
+
*/
|
|
69
|
+
originProject?: string;
|
|
30
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Drop memories older than `maxAgeDays` (by file mtime) for context injection
|
|
73
|
+
* (TODO 8.1). A non-positive/undefined maxAge means no filtering. Entries with
|
|
74
|
+
* an unknown mtime (updatedAt 0/undefined) are KEPT — we never hide a memory
|
|
75
|
+
* just because we couldn't read its timestamp. Pure + testable.
|
|
76
|
+
*/
|
|
77
|
+
export declare function filterByAge(entries: MemoryEntry[], maxAgeDays?: number, now?: number): MemoryEntry[];
|
|
31
78
|
export interface MemoryManagerOptions {
|
|
32
79
|
/** Project root path; when set, memories are scoped under projects/<hash>/memory. */
|
|
33
80
|
projectDir?: string;
|
|
@@ -61,12 +108,57 @@ export declare class MemoryManager {
|
|
|
61
108
|
* Load a single memory file.
|
|
62
109
|
*/
|
|
63
110
|
private loadFile;
|
|
111
|
+
/**
|
|
112
|
+
* Parse a memory file's frontmatter + body into a MemoryEntry. Shared by both
|
|
113
|
+
* loadFile (own scope) and loadScope (cross-scope) so the parsing of every
|
|
114
|
+
* field — including the lifecycle fields — lives in exactly one place.
|
|
115
|
+
* Returns null on missing file / unparseable frontmatter.
|
|
116
|
+
*/
|
|
117
|
+
private parseMemoryFile;
|
|
64
118
|
/**
|
|
65
119
|
* Soft-delete a memory by name or filename — moves the file into
|
|
66
120
|
* <baseDir>/memory-trash/<ISO>/<scope>/ instead of unlinking it. The user
|
|
67
121
|
* can recover by moving it back; we never hard-delete from this code path.
|
|
68
122
|
*/
|
|
69
123
|
delete(nameOrFile: string): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Record a recall: a MemoryRead hit this entry. Bumps usageCount and sets
|
|
126
|
+
* lastUsed=now, rewriting only the frontmatter (content untouched). This is
|
|
127
|
+
* the signal that drives recall-based TTL — a memory that keeps getting read
|
|
128
|
+
* never ages out. Idempotent-safe: missing entry → false, no throw.
|
|
129
|
+
*/
|
|
130
|
+
recordRecall(nameOrFile: string, now?: Date): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Recall-based TTL sweep. Soft-deletes `project`-type memories not read for
|
|
133
|
+
* more than `ttlDays` (by lastUsed). Stable types (user/feedback/reference)
|
|
134
|
+
* and pinned entries are NEVER pruned — only ephemeral project events age out.
|
|
135
|
+
* Returns the names pruned. ttlDays<=0 disables the sweep.
|
|
136
|
+
*/
|
|
137
|
+
pruneByRecall(ttlDays: number, now?: Date): string[];
|
|
138
|
+
/**
|
|
139
|
+
* Approve a pending memory: move it from the pending scope into the user scope
|
|
140
|
+
* of the SAME memory root (pending only ever exists at the global root — the
|
|
141
|
+
* approval门 only gates global writes). Must be called on a pending-scope
|
|
142
|
+
* manager. Returns the new user filename, or null if not found / wrong scope.
|
|
143
|
+
*
|
|
144
|
+
* 审批门 (用户拍板): the only path that moves an auto-extracted memory into the
|
|
145
|
+
* curated, injected global user store.
|
|
146
|
+
*/
|
|
147
|
+
approvePending(nameOrFile: string): string | null;
|
|
148
|
+
/**
|
|
149
|
+
* Demote a pending memory: 不批准升全局,但它仍是有用记忆 → 落回它来源项目的
|
|
150
|
+
* user store (originProject)。无 originProject 时落全局 user(兜底,不丢)。
|
|
151
|
+
*/
|
|
152
|
+
demotePending(nameOrFile: string): string | null;
|
|
153
|
+
/** Shared move for approve(→global user)/demote(→origin-project user). */
|
|
154
|
+
private movePending;
|
|
155
|
+
/**
|
|
156
|
+
* Promote a project-level user memory to the GLOBAL user store (用户手动点
|
|
157
|
+
* "提升到全局")。Must be called on a project-scoped user manager. Copies the
|
|
158
|
+
* entry into global user/ and soft-deletes the project copy. Returns the new
|
|
159
|
+
* global filename, or null if not found.
|
|
160
|
+
*/
|
|
161
|
+
promoteToGlobal(nameOrFile: string): string | null;
|
|
70
162
|
/**
|
|
71
163
|
* Get the MEMORY.md index content for injection into prompts.
|
|
72
164
|
*/
|
|
@@ -78,7 +170,29 @@ export declare class MemoryManager {
|
|
|
78
170
|
* tagged with their origin so the model can tell user-owned from
|
|
79
171
|
* dream-generated.
|
|
80
172
|
*/
|
|
81
|
-
buildMemoryContext(
|
|
173
|
+
buildMemoryContext(opts?: {
|
|
174
|
+
maxAgeDays?: number;
|
|
175
|
+
now?: number;
|
|
176
|
+
}): string;
|
|
177
|
+
/**
|
|
178
|
+
* Two-layer injection index (用户拍板). Merges GLOBAL (cross-project
|
|
179
|
+
* experience) + PROJECT (this repo's facts) memories into a compact index —
|
|
180
|
+
* one line per entry, name + description only, NO body. The model reads a
|
|
181
|
+
* specific entry's full content on demand via MemoryRead (which records a
|
|
182
|
+
* recall → drives TTL + UI visibility).
|
|
183
|
+
*
|
|
184
|
+
* This is what fixes "global memory never shows up": global memories are now
|
|
185
|
+
* injected alongside project ones, every session, regardless of cwd.
|
|
186
|
+
*
|
|
187
|
+
* Static because it must construct two managers (global = no projectDir,
|
|
188
|
+
* project = with projectDir). `projectDir` undefined → only global is shown.
|
|
189
|
+
*/
|
|
190
|
+
static buildInjectionIndex(opts: {
|
|
191
|
+
projectDir?: string;
|
|
192
|
+
baseDir?: string;
|
|
193
|
+
maxAgeDays?: number;
|
|
194
|
+
now?: number;
|
|
195
|
+
}): string;
|
|
82
196
|
/**
|
|
83
197
|
* Load every entry belonging to the given scope, without changing the
|
|
84
198
|
* manager's own scope. Used by buildMemoryContext to merge user + dream
|