@google/gemini-cli-core 0.37.2 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -50
- package/dist/docs/changelogs/index.md +25 -0
- package/dist/docs/changelogs/latest.md +353 -362
- package/dist/docs/changelogs/preview.md +399 -366
- package/dist/docs/cli/plan-mode.md +1 -0
- package/dist/docs/cli/sandbox.md +52 -0
- package/dist/docs/cli/settings.md +17 -14
- package/dist/docs/core/remote-agents.md +14 -18
- package/dist/docs/core/subagents.md +63 -27
- package/dist/docs/get-started/authentication.md +2 -2
- package/dist/docs/get-started/installation.md +7 -0
- package/dist/docs/hooks/index.md +6 -6
- package/dist/docs/reference/configuration.md +41 -11
- package/dist/docs/reference/keyboard-shortcuts.md +14 -9
- package/dist/docs/reference/tools.md +4 -4
- package/dist/docs/release-confidence.md +0 -6
- package/dist/docs/releases.md +4 -0
- package/dist/docs/tools/mcp-server.md +3 -3
- package/dist/docs/tools/web-fetch.md +3 -0
- package/dist/src/agent/agent-session.test.js +14 -6
- package/dist/src/agent/agent-session.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +2 -1
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +1 -0
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.d.ts +47 -4
- package/dist/src/agent/legacy-agent-session.js +38 -15
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +60 -73
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/mock.js +7 -1
- package/dist/src/agent/mock.js.map +1 -1
- package/dist/src/agent/mock.test.js +1 -1
- package/dist/src/agent/mock.test.js.map +1 -1
- package/dist/src/agent/types.d.ts +34 -1
- package/dist/src/agents/agent-scheduler.js +6 -1
- package/dist/src/agents/agent-scheduler.js.map +1 -1
- package/dist/src/agents/agent-scheduler.test.js +38 -0
- package/dist/src/agents/agent-scheduler.test.js.map +1 -1
- package/dist/src/agents/auth-provider/api-key-provider.test.js +18 -2
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -1
- package/dist/src/agents/auth-provider/value-resolver.test.js +30 -0
- package/dist/src/agents/auth-provider/value-resolver.test.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js +36 -6
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.test.js +35 -3
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.d.ts +8 -0
- package/dist/src/agents/browser/browserAgentFactory.js +174 -118
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js +70 -1
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.js +29 -2
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +51 -5
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/browserManager.d.ts +38 -0
- package/dist/src/agents/browser/browserManager.js +117 -6
- package/dist/src/agents/browser/browserManager.js.map +1 -1
- package/dist/src/agents/browser/browserManager.test.js +156 -2
- package/dist/src/agents/browser/browserManager.test.js.map +1 -1
- package/dist/src/agents/browser/modelAvailability.d.ts +5 -0
- package/dist/src/agents/browser/modelAvailability.js +12 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +5 -0
- package/dist/src/agents/local-executor.js +98 -181
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +386 -101
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.js +1 -0
- package/dist/src/agents/memory-manager-agent.js.map +1 -1
- package/dist/src/agents/memory-manager-agent.test.js +6 -0
- package/dist/src/agents/memory-manager-agent.test.js.map +1 -1
- package/dist/src/agents/registry.js +3 -10
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.d.ts +24 -0
- package/dist/src/agents/skill-extraction-agent.js +269 -0
- package/dist/src/agents/skill-extraction-agent.js.map +1 -0
- package/dist/src/agents/types.d.ts +11 -0
- package/dist/src/code_assist/admin/admin_controls.js +1 -1
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +1 -0
- package/dist/src/code_assist/experiments/flagNames.js +1 -0
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/code_assist/server.js +1 -1
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/commands/memory.js +1 -1
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/config/config.d.ts +34 -31
- package/dist/src/config/config.js +101 -38
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +102 -15
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extensions/integrity.js +1 -1
- package/dist/src/config/extensions/integrity.js.map +1 -1
- package/dist/src/config/projectRegistry.js +5 -3
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/scoped-config.d.ts +30 -0
- package/dist/src/config/scoped-config.js +69 -0
- package/dist/src/config/scoped-config.js.map +1 -0
- package/dist/src/config/scoped-config.test.d.ts +6 -0
- package/dist/src/config/scoped-config.test.js +161 -0
- package/dist/src/config/scoped-config.test.js.map +1 -0
- package/dist/src/config/storage.d.ts +2 -0
- package/dist/src/config/storage.js +7 -2
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +7 -7
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +2 -2
- package/dist/src/context/agentHistoryProvider.d.ts +1 -1
- package/dist/src/context/agentHistoryProvider.js +1 -5
- package/dist/src/context/agentHistoryProvider.js.map +1 -1
- package/dist/src/context/agentHistoryProvider.test.js +2 -39
- package/dist/src/context/agentHistoryProvider.test.js.map +1 -1
- package/dist/src/context/contextCompressionService.d.ts +30 -0
- package/dist/src/context/contextCompressionService.js +405 -0
- package/dist/src/context/contextCompressionService.js.map +1 -0
- package/dist/src/context/contextCompressionService.test.d.ts +1 -0
- package/dist/src/context/contextCompressionService.test.js +253 -0
- package/dist/src/context/contextCompressionService.test.js.map +1 -0
- package/dist/src/context/{contextManager.d.ts → memoryContextManager.d.ts} +1 -1
- package/dist/src/context/{contextManager.js → memoryContextManager.js} +2 -2
- package/dist/src/context/memoryContextManager.js.map +1 -0
- package/dist/src/context/{contextManager.test.js → memoryContextManager.test.js} +22 -28
- package/dist/src/context/memoryContextManager.test.js.map +1 -0
- package/dist/src/context/profiles.d.ts +7 -0
- package/dist/src/context/profiles.js +21 -0
- package/dist/src/context/profiles.js.map +1 -0
- package/dist/src/context/toolDistillationService.test.js +3 -0
- package/dist/src/context/toolDistillationService.test.js.map +1 -1
- package/dist/src/context/types.d.ts +36 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/core/baseLlmClient.js +1 -1
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +1 -0
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +1 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +7 -6
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +8 -0
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +1 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +1 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/logger.js +4 -4
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +1 -1
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookEventHandler.js +8 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookRunner.js +9 -5
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +20 -3
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +2 -0
- package/dist/src/hooks/hookSystem.js +1 -0
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +20 -13
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/hookTranslator.test.js +36 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -1
- package/dist/src/hooks/types.d.ts +2 -0
- package/dist/src/ide/ide-client.js +3 -3
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +1 -1
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-installer.js +3 -3
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.js +3 -3
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/json-formatter.js +2 -1
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/policy/config.test.js +21 -20
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/policies/memory-manager.toml +11 -1
- package/dist/src/policy/policies/plan.toml +4 -3
- package/dist/src/policy/policies/read-only.toml +6 -0
- package/dist/src/policy/policies/sandbox-default.toml +2 -3
- package/dist/src/policy/policy-engine.js +23 -0
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +129 -1
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.d.ts +26 -1
- package/dist/src/policy/sandboxPolicyManager.js +41 -12
- package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.test.d.ts +6 -0
- package/dist/src/policy/sandboxPolicyManager.test.js +61 -0
- package/dist/src/policy/sandboxPolicyManager.test.js.map +1 -0
- package/dist/src/policy/workspace-policy.test.js +18 -15
- package/dist/src/policy/workspace-policy.test.js.map +1 -1
- package/dist/src/prompts/snippets.js +6 -3
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.js +6 -2
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/prompts/utils.test.js +7 -5
- package/dist/src/prompts/utils.test.js.map +1 -1
- package/dist/src/safety/built-in.js +1 -1
- package/dist/src/safety/built-in.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +4 -4
- package/dist/src/sandbox/linux/LinuxSandboxManager.js +47 -191
- package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +33 -395
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +24 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js +200 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.d.ts +6 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +247 -0
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.d.ts +3 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +12 -5
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +20 -0
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/macos/baseProfile.d.ts +1 -1
- package/dist/src/sandbox/macos/baseProfile.js +28 -4
- package/dist/src/sandbox/macos/baseProfile.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +2 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.js +8 -6
- package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.test.d.ts +6 -0
- package/dist/src/sandbox/utils/fsUtils.test.js +43 -0
- package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.d.ts +19 -0
- package/dist/src/sandbox/utils/proactivePermissions.js +163 -0
- package/dist/src/sandbox/utils/proactivePermissions.js.map +1 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.d.ts +6 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js +145 -0
- package/dist/src/sandbox/utils/proactivePermissions.test.js.map +1 -0
- package/dist/src/sandbox/utils/sandboxDenialUtils.d.ts +16 -1
- package/dist/src/sandbox/utils/sandboxDenialUtils.js +98 -24
- package/dist/src/sandbox/utils/sandboxDenialUtils.js.map +1 -1
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js +152 -1
- package/dist/src/sandbox/utils/sandboxDenialUtils.test.js.map +1 -1
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js +4 -0
- package/dist/src/sandbox/utils/sandboxReadWriteUtils.js.map +1 -1
- package/dist/src/sandbox/windows/GeminiSandbox.cs +90 -42
- package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -0
- package/dist/src/sandbox/windows/WindowsSandboxManager.js +65 -60
- package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +99 -54
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.d.ts +2 -1
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js +19 -18
- package/dist/src/sandbox/windows/windowsSandboxDenialUtils.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +1 -1
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler_hooks.test.js +1 -1
- package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +1 -1
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/tool-executor.test.js +1 -1
- package/dist/src/scheduler/tool-executor.test.js.map +1 -1
- package/dist/src/services/executionLifecycleService.d.ts +1 -0
- package/dist/src/services/executionLifecycleService.js +3 -0
- package/dist/src/services/executionLifecycleService.js.map +1 -1
- package/dist/src/services/gitService.js +1 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/memoryService.d.ts +65 -0
- package/dist/src/services/memoryService.js +511 -0
- package/dist/src/services/memoryService.js.map +1 -0
- package/dist/src/services/memoryService.test.d.ts +6 -0
- package/dist/src/services/memoryService.test.js +563 -0
- package/dist/src/services/memoryService.test.js.map +1 -0
- package/dist/src/services/sandboxManager.d.ts +17 -0
- package/dist/src/services/sandboxManager.integration.test.js +18 -11
- package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
- package/dist/src/services/sandboxManager.js +20 -0
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +84 -56
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxManagerFactory.js +2 -5
- package/dist/src/services/sandboxManagerFactory.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.js +14 -3
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.test.js +29 -14
- package/dist/src/services/sandboxedFileSystemService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +16 -1
- package/dist/src/services/shellExecutionService.js +70 -10
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +65 -4
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/worktreeService.test.js +7 -7
- package/dist/src/services/worktreeService.test.js.map +1 -1
- package/dist/src/skills/skillLoader.d.ts +8 -0
- package/dist/src/skills/skillLoader.js +1 -1
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +29 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +101 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +167 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +9 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +20 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +22 -0
- package/dist/src/telemetry/loggers.js +40 -1
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +108 -0
- package/dist/src/telemetry/metrics.js +177 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +254 -0
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/tools/complete-task.d.ts +29 -0
- package/dist/src/tools/complete-task.js +123 -0
- package/dist/src/tools/complete-task.js.map +1 -0
- package/dist/src/tools/complete-task.test.d.ts +6 -0
- package/dist/src/tools/complete-task.test.js +114 -0
- package/dist/src/tools/complete-task.test.js.map +1 -0
- package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
- package/dist/src/tools/definitions/base-declarations.js +3 -0
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +1 -1
- package/dist/src/tools/definitions/coreTools.js +1 -1
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js +4 -0
- package/dist/src/tools/definitions/dynamic-declaration-helpers.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +3 -3
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +3 -3
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/grep.test.js +2 -2
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/jit-context.js +3 -3
- package/dist/src/tools/jit-context.js.map +1 -1
- package/dist/src/tools/jit-context.test.js +15 -13
- package/dist/src/tools/jit-context.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +1 -1
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +1 -1
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +1 -1
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +7 -4
- package/dist/src/tools/shell.js +255 -37
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +182 -8
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.d.ts +38 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js +86 -0
- package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.js +186 -0
- package/dist/src/tools/shellBackgroundTools.js.map +1 -0
- package/dist/src/tools/shellBackgroundTools.test.d.ts +6 -0
- package/dist/src/tools/shellBackgroundTools.test.js +230 -0
- package/dist/src/tools/shellBackgroundTools.test.js.map +1 -0
- package/dist/src/tools/shell_proactive.test.d.ts +6 -0
- package/dist/src/tools/shell_proactive.test.js +122 -0
- package/dist/src/tools/shell_proactive.test.js.map +1 -0
- package/dist/src/tools/tool-names.d.ts +3 -3
- package/dist/src/tools/tool-names.js +3 -2
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tools.js +1 -1
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +8 -8
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +5 -5
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js +1 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +3 -6
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/checkpointUtils.js +11 -8
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/compatibility.js +0 -7
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +0 -9
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/editor.js +3 -0
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/errorParsing.js +2 -2
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/events.d.ts +12 -0
- package/dist/src/utils/events.js +7 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +1 -0
- package/dist/src/utils/fetch.js +22 -6
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +26 -1
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +1 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.js +1 -1
- package/dist/src/utils/filesearch/crawler.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +7 -2
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/getPty.js +2 -2
- package/dist/src/utils/getPty.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +2 -2
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitUtils.js +2 -2
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/googleErrors.js +5 -5
- package/dist/src/utils/googleErrors.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.js +1 -1
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -7
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/paths.d.ts +8 -0
- package/dist/src/utils/paths.js +37 -6
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +61 -3
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/process-utils.js +2 -2
- package/dist/src/utils/process-utils.js.map +1 -1
- package/dist/src/utils/retry.js +7 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +41 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.js +1 -1
- package/dist/src/utils/secure-browser-launcher.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +9 -0
- package/dist/src/utils/shell-utils.integration.test.js +1 -1
- package/dist/src/utils/shell-utils.integration.test.js.map +1 -1
- package/dist/src/utils/shell-utils.js +43 -4
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +13 -1
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/terminalSerializer.d.ts +1 -0
- package/dist/src/utils/terminalSerializer.js +31 -8
- package/dist/src/utils/terminalSerializer.js.map +1 -1
- package/dist/src/utils/terminalSerializer.test.js +3 -2
- package/dist/src/utils/terminalSerializer.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.js +2 -2
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/google-gemini-cli-core-0.37.1.tgz +0 -0
- package/dist/src/context/contextManager.js.map +0 -1
- package/dist/src/context/contextManager.test.js.map +0 -1
- package/dist/src/services/types.d.ts +0 -14
- package/dist/src/services/types.js.map +0 -1
- /package/dist/src/context/{contextManager.test.d.ts → memoryContextManager.test.d.ts} +0 -0
- /package/dist/src/{services → context}/types.js +0 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { constants as fsConstants } from 'node:fs';
|
|
9
|
+
import { randomUUID } from 'node:crypto';
|
|
10
|
+
import { SESSION_FILE_PREFIX, } from './chatRecordingService.js';
|
|
11
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
12
|
+
import { isNodeError } from '../utils/errors.js';
|
|
13
|
+
import { FRONTMATTER_REGEX, parseFrontmatter } from '../skills/skillLoader.js';
|
|
14
|
+
import { LocalAgentExecutor } from '../agents/local-executor.js';
|
|
15
|
+
import { SkillExtractionAgent } from '../agents/skill-extraction-agent.js';
|
|
16
|
+
import { getModelConfigAlias } from '../agents/registry.js';
|
|
17
|
+
import { ExecutionLifecycleService } from './executionLifecycleService.js';
|
|
18
|
+
import { PromptRegistry } from '../prompts/prompt-registry.js';
|
|
19
|
+
import { ResourceRegistry } from '../resources/resource-registry.js';
|
|
20
|
+
import { PolicyEngine } from '../policy/policy-engine.js';
|
|
21
|
+
import { PolicyDecision } from '../policy/types.js';
|
|
22
|
+
import { MessageBus } from '../confirmation-bus/message-bus.js';
|
|
23
|
+
import { Storage } from '../config/storage.js';
|
|
24
|
+
const LOCK_FILENAME = '.extraction.lock';
|
|
25
|
+
const STATE_FILENAME = '.extraction-state.json';
|
|
26
|
+
const LOCK_STALE_MS = 35 * 60 * 1000; // 35 minutes (exceeds agent's 30-min time limit)
|
|
27
|
+
const MIN_USER_MESSAGES = 10;
|
|
28
|
+
const MIN_IDLE_MS = 3 * 60 * 60 * 1000; // 3 hours
|
|
29
|
+
const MAX_SESSION_INDEX_SIZE = 50;
|
|
30
|
+
/**
|
|
31
|
+
* Returns all session IDs that have been processed across all runs.
|
|
32
|
+
*/
|
|
33
|
+
export function getProcessedSessionIds(state) {
|
|
34
|
+
const ids = new Set();
|
|
35
|
+
for (const run of state.runs) {
|
|
36
|
+
for (const id of run.sessionIds) {
|
|
37
|
+
ids.add(id);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return ids;
|
|
41
|
+
}
|
|
42
|
+
function isLockInfo(value) {
|
|
43
|
+
return (typeof value === 'object' &&
|
|
44
|
+
value !== null &&
|
|
45
|
+
'pid' in value &&
|
|
46
|
+
typeof value.pid === 'number' &&
|
|
47
|
+
'startedAt' in value &&
|
|
48
|
+
typeof value.startedAt === 'string');
|
|
49
|
+
}
|
|
50
|
+
function isConversationRecord(value) {
|
|
51
|
+
return (typeof value === 'object' &&
|
|
52
|
+
value !== null &&
|
|
53
|
+
'sessionId' in value &&
|
|
54
|
+
typeof value.sessionId === 'string' &&
|
|
55
|
+
'messages' in value &&
|
|
56
|
+
Array.isArray(value.messages) &&
|
|
57
|
+
'projectHash' in value &&
|
|
58
|
+
'startTime' in value &&
|
|
59
|
+
'lastUpdated' in value);
|
|
60
|
+
}
|
|
61
|
+
function isExtractionRun(value) {
|
|
62
|
+
return (typeof value === 'object' &&
|
|
63
|
+
value !== null &&
|
|
64
|
+
'runAt' in value &&
|
|
65
|
+
typeof value.runAt === 'string' &&
|
|
66
|
+
'sessionIds' in value &&
|
|
67
|
+
Array.isArray(value.sessionIds) &&
|
|
68
|
+
'skillsCreated' in value &&
|
|
69
|
+
Array.isArray(value.skillsCreated));
|
|
70
|
+
}
|
|
71
|
+
function isExtractionState(value) {
|
|
72
|
+
return (typeof value === 'object' &&
|
|
73
|
+
value !== null &&
|
|
74
|
+
'runs' in value &&
|
|
75
|
+
Array.isArray(value.runs));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Attempts to acquire an exclusive lock file using O_CREAT | O_EXCL.
|
|
79
|
+
* Returns true if the lock was acquired, false if another instance owns it.
|
|
80
|
+
*/
|
|
81
|
+
export async function tryAcquireLock(lockPath, retries = 1) {
|
|
82
|
+
const lockInfo = {
|
|
83
|
+
pid: process.pid,
|
|
84
|
+
startedAt: new Date().toISOString(),
|
|
85
|
+
};
|
|
86
|
+
try {
|
|
87
|
+
// Atomic create-if-not-exists
|
|
88
|
+
const fd = await fs.open(lockPath, fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_WRONLY);
|
|
89
|
+
try {
|
|
90
|
+
await fd.writeFile(JSON.stringify(lockInfo));
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
await fd.close();
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (isNodeError(error) && error.code === 'EEXIST') {
|
|
99
|
+
// Lock exists — check if it's stale
|
|
100
|
+
if (retries > 0 && (await isLockStale(lockPath))) {
|
|
101
|
+
debugLogger.debug('[MemoryService] Cleaning up stale lock file');
|
|
102
|
+
await releaseLock(lockPath);
|
|
103
|
+
return tryAcquireLock(lockPath, retries - 1);
|
|
104
|
+
}
|
|
105
|
+
debugLogger.debug('[MemoryService] Lock held by another instance, skipping');
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checks if a lock file is stale (owner PID is dead or lock is too old).
|
|
113
|
+
*/
|
|
114
|
+
export async function isLockStale(lockPath) {
|
|
115
|
+
try {
|
|
116
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
117
|
+
const parsed = JSON.parse(content);
|
|
118
|
+
if (!isLockInfo(parsed)) {
|
|
119
|
+
return true; // Invalid lock data — treat as stale
|
|
120
|
+
}
|
|
121
|
+
const lockInfo = parsed;
|
|
122
|
+
// Check if PID is still alive
|
|
123
|
+
try {
|
|
124
|
+
process.kill(lockInfo.pid, 0);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// PID is dead — lock is stale
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
// Check if lock is too old
|
|
131
|
+
const lockAge = Date.now() - new Date(lockInfo.startedAt).getTime();
|
|
132
|
+
if (lockAge > LOCK_STALE_MS) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Can't read lock — treat as stale
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Releases the lock file.
|
|
144
|
+
*/
|
|
145
|
+
export async function releaseLock(lockPath) {
|
|
146
|
+
try {
|
|
147
|
+
await fs.unlink(lockPath);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (isNodeError(error) && error.code === 'ENOENT') {
|
|
151
|
+
return; // Already removed
|
|
152
|
+
}
|
|
153
|
+
debugLogger.warn(`[MemoryService] Failed to release lock: ${error instanceof Error ? error.message : String(error)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Reads the extraction state file, or returns a default state.
|
|
158
|
+
*/
|
|
159
|
+
export async function readExtractionState(statePath) {
|
|
160
|
+
try {
|
|
161
|
+
const content = await fs.readFile(statePath, 'utf-8');
|
|
162
|
+
const parsed = JSON.parse(content);
|
|
163
|
+
if (!isExtractionState(parsed)) {
|
|
164
|
+
return { runs: [] };
|
|
165
|
+
}
|
|
166
|
+
const runs = [];
|
|
167
|
+
for (const run of parsed.runs) {
|
|
168
|
+
if (!isExtractionRun(run))
|
|
169
|
+
continue;
|
|
170
|
+
runs.push({
|
|
171
|
+
runAt: run.runAt,
|
|
172
|
+
sessionIds: run.sessionIds.filter((sid) => typeof sid === 'string'),
|
|
173
|
+
skillsCreated: run.skillsCreated.filter((sk) => typeof sk === 'string'),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return { runs };
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
debugLogger.debug('[MemoryService] Failed to read extraction state:', error);
|
|
180
|
+
return { runs: [] };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Writes the extraction state atomically (temp file + rename).
|
|
185
|
+
*/
|
|
186
|
+
export async function writeExtractionState(statePath, state) {
|
|
187
|
+
const tmpPath = `${statePath}.tmp`;
|
|
188
|
+
await fs.writeFile(tmpPath, JSON.stringify(state, null, 2));
|
|
189
|
+
await fs.rename(tmpPath, statePath);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Determines if a conversation record should be considered for processing.
|
|
193
|
+
* Filters out subagent sessions, sessions that haven't been idle long enough,
|
|
194
|
+
* and sessions with too few user messages.
|
|
195
|
+
*/
|
|
196
|
+
function shouldProcessConversation(parsed) {
|
|
197
|
+
// Skip subagent sessions
|
|
198
|
+
if (parsed.kind === 'subagent')
|
|
199
|
+
return false;
|
|
200
|
+
// Skip sessions that are still active (not idle for 3+ hours)
|
|
201
|
+
const lastUpdated = new Date(parsed.lastUpdated).getTime();
|
|
202
|
+
if (Date.now() - lastUpdated < MIN_IDLE_MS)
|
|
203
|
+
return false;
|
|
204
|
+
// Skip sessions with too few user messages
|
|
205
|
+
const userMessageCount = parsed.messages.filter((m) => m.type === 'user').length;
|
|
206
|
+
if (userMessageCount < MIN_USER_MESSAGES)
|
|
207
|
+
return false;
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Scans the chats directory for eligible session files (sorted most-recent-first,
|
|
212
|
+
* capped at MAX_SESSION_INDEX_SIZE). Shared by buildSessionIndex.
|
|
213
|
+
*/
|
|
214
|
+
async function scanEligibleSessions(chatsDir) {
|
|
215
|
+
let allFiles;
|
|
216
|
+
try {
|
|
217
|
+
allFiles = await fs.readdir(chatsDir);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
const sessionFiles = allFiles.filter((f) => f.startsWith(SESSION_FILE_PREFIX) && f.endsWith('.json'));
|
|
223
|
+
// Sort by filename descending (most recent first)
|
|
224
|
+
sessionFiles.sort((a, b) => b.localeCompare(a));
|
|
225
|
+
const results = [];
|
|
226
|
+
for (const file of sessionFiles) {
|
|
227
|
+
if (results.length >= MAX_SESSION_INDEX_SIZE)
|
|
228
|
+
break;
|
|
229
|
+
const filePath = path.join(chatsDir, file);
|
|
230
|
+
try {
|
|
231
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
232
|
+
const parsed = JSON.parse(content);
|
|
233
|
+
if (!isConversationRecord(parsed))
|
|
234
|
+
continue;
|
|
235
|
+
if (!shouldProcessConversation(parsed))
|
|
236
|
+
continue;
|
|
237
|
+
results.push({ conversation: parsed, filePath });
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Skip unreadable files
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return results;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Builds a session index for the extraction agent: a compact listing of all
|
|
247
|
+
* eligible sessions with their summary, file path, and new/previously-processed status.
|
|
248
|
+
* The agent can use read_file on paths to inspect sessions that look promising.
|
|
249
|
+
*
|
|
250
|
+
* Returns the index text and the list of new (unprocessed) session IDs.
|
|
251
|
+
*/
|
|
252
|
+
export async function buildSessionIndex(chatsDir, state) {
|
|
253
|
+
const processedSet = getProcessedSessionIds(state);
|
|
254
|
+
const eligible = await scanEligibleSessions(chatsDir);
|
|
255
|
+
if (eligible.length === 0) {
|
|
256
|
+
return { sessionIndex: '', newSessionIds: [] };
|
|
257
|
+
}
|
|
258
|
+
const lines = [];
|
|
259
|
+
const newSessionIds = [];
|
|
260
|
+
for (const { conversation, filePath } of eligible) {
|
|
261
|
+
const userMessageCount = conversation.messages.filter((m) => m.type === 'user').length;
|
|
262
|
+
const isNew = !processedSet.has(conversation.sessionId);
|
|
263
|
+
if (isNew) {
|
|
264
|
+
newSessionIds.push(conversation.sessionId);
|
|
265
|
+
}
|
|
266
|
+
const status = isNew ? '[NEW]' : '[old]';
|
|
267
|
+
const summary = conversation.summary ?? '(no summary)';
|
|
268
|
+
lines.push(`${status} ${summary} (${userMessageCount} user msgs) — ${filePath}`);
|
|
269
|
+
}
|
|
270
|
+
return { sessionIndex: lines.join('\n'), newSessionIds };
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Builds a summary of all existing skills — both memory-extracted skills
|
|
274
|
+
* in the skillsDir and globally/workspace-discovered skills from the SkillManager.
|
|
275
|
+
* This prevents the extraction agent from duplicating already-available skills.
|
|
276
|
+
*/
|
|
277
|
+
async function buildExistingSkillsSummary(skillsDir, config) {
|
|
278
|
+
const sections = [];
|
|
279
|
+
// 1. Memory-extracted skills (from previous runs)
|
|
280
|
+
const memorySkills = [];
|
|
281
|
+
try {
|
|
282
|
+
const entries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
283
|
+
for (const entry of entries) {
|
|
284
|
+
if (!entry.isDirectory())
|
|
285
|
+
continue;
|
|
286
|
+
const skillPath = path.join(skillsDir, entry.name, 'SKILL.md');
|
|
287
|
+
try {
|
|
288
|
+
const content = await fs.readFile(skillPath, 'utf-8');
|
|
289
|
+
const match = content.match(FRONTMATTER_REGEX);
|
|
290
|
+
if (match) {
|
|
291
|
+
const parsed = parseFrontmatter(match[1]);
|
|
292
|
+
const name = parsed?.name ?? entry.name;
|
|
293
|
+
const desc = parsed?.description ?? '';
|
|
294
|
+
memorySkills.push(`- **${name}**: ${desc}`);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
memorySkills.push(`- **${entry.name}**`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Skill directory without SKILL.md, skip
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Skills directory doesn't exist yet
|
|
307
|
+
}
|
|
308
|
+
if (memorySkills.length > 0) {
|
|
309
|
+
sections.push(`## Previously Extracted Skills (in ${skillsDir})\n${memorySkills.join('\n')}`);
|
|
310
|
+
}
|
|
311
|
+
// 2. Discovered skills — categorize by source location
|
|
312
|
+
try {
|
|
313
|
+
const discoveredSkills = config.getSkillManager().getSkills();
|
|
314
|
+
if (discoveredSkills.length > 0) {
|
|
315
|
+
const userSkillsDir = Storage.getUserSkillsDir();
|
|
316
|
+
const globalSkills = [];
|
|
317
|
+
const workspaceSkills = [];
|
|
318
|
+
const extensionSkills = [];
|
|
319
|
+
const builtinSkills = [];
|
|
320
|
+
for (const s of discoveredSkills) {
|
|
321
|
+
const entry = `- **${s.name}**: ${s.description}`;
|
|
322
|
+
const loc = s.location;
|
|
323
|
+
if (loc.includes('/bundle/') || loc.includes('\\bundle\\')) {
|
|
324
|
+
builtinSkills.push(entry);
|
|
325
|
+
}
|
|
326
|
+
else if (loc.startsWith(userSkillsDir)) {
|
|
327
|
+
globalSkills.push(entry);
|
|
328
|
+
}
|
|
329
|
+
else if (loc.includes('/extensions/') ||
|
|
330
|
+
loc.includes('\\extensions\\')) {
|
|
331
|
+
extensionSkills.push(entry);
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
workspaceSkills.push(entry);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (globalSkills.length > 0) {
|
|
338
|
+
sections.push(`## Global Skills (~/.gemini/skills — do NOT duplicate)\n${globalSkills.join('\n')}`);
|
|
339
|
+
}
|
|
340
|
+
if (workspaceSkills.length > 0) {
|
|
341
|
+
sections.push(`## Workspace Skills (.gemini/skills — do NOT duplicate)\n${workspaceSkills.join('\n')}`);
|
|
342
|
+
}
|
|
343
|
+
if (extensionSkills.length > 0) {
|
|
344
|
+
sections.push(`## Extension Skills (from installed extensions — do NOT duplicate)\n${extensionSkills.join('\n')}`);
|
|
345
|
+
}
|
|
346
|
+
if (builtinSkills.length > 0) {
|
|
347
|
+
sections.push(`## Builtin Skills (bundled with CLI — do NOT duplicate)\n${builtinSkills.join('\n')}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// SkillManager not available
|
|
353
|
+
}
|
|
354
|
+
return sections.join('\n\n');
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Builds an AgentLoopContext from a Config for background agent execution.
|
|
358
|
+
*/
|
|
359
|
+
function buildAgentLoopContext(config) {
|
|
360
|
+
// Create a PolicyEngine that auto-approves all tool calls so the
|
|
361
|
+
// background sub-agent never prompts the user for confirmation.
|
|
362
|
+
const autoApprovePolicy = new PolicyEngine({
|
|
363
|
+
rules: [
|
|
364
|
+
{
|
|
365
|
+
toolName: '*',
|
|
366
|
+
decision: PolicyDecision.ALLOW,
|
|
367
|
+
priority: 100,
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
});
|
|
371
|
+
const autoApproveBus = new MessageBus(autoApprovePolicy);
|
|
372
|
+
return {
|
|
373
|
+
config,
|
|
374
|
+
promptId: `skill-extraction-${randomUUID().slice(0, 8)}`,
|
|
375
|
+
toolRegistry: config.getToolRegistry(),
|
|
376
|
+
promptRegistry: new PromptRegistry(),
|
|
377
|
+
resourceRegistry: new ResourceRegistry(),
|
|
378
|
+
messageBus: autoApproveBus,
|
|
379
|
+
geminiClient: config.getGeminiClient(),
|
|
380
|
+
sandboxManager: config.sandboxManager,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Main entry point for the skill extraction background task.
|
|
385
|
+
* Designed to be called fire-and-forget on session startup.
|
|
386
|
+
*
|
|
387
|
+
* Coordinates across multiple CLI instances via a lock file,
|
|
388
|
+
* scans past sessions for reusable patterns, and runs a sub-agent
|
|
389
|
+
* to extract and write SKILL.md files.
|
|
390
|
+
*/
|
|
391
|
+
export async function startMemoryService(config) {
|
|
392
|
+
const memoryDir = config.storage.getProjectMemoryTempDir();
|
|
393
|
+
const skillsDir = config.storage.getProjectSkillsMemoryDir();
|
|
394
|
+
const lockPath = path.join(memoryDir, LOCK_FILENAME);
|
|
395
|
+
const statePath = path.join(memoryDir, STATE_FILENAME);
|
|
396
|
+
const chatsDir = path.join(config.storage.getProjectTempDir(), 'chats');
|
|
397
|
+
// Ensure directories exist
|
|
398
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
399
|
+
debugLogger.log(`[MemoryService] Starting. Skills dir: ${skillsDir}`);
|
|
400
|
+
// Try to acquire exclusive lock
|
|
401
|
+
if (!(await tryAcquireLock(lockPath))) {
|
|
402
|
+
debugLogger.log('[MemoryService] Skipped: lock held by another instance');
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
debugLogger.log('[MemoryService] Lock acquired');
|
|
406
|
+
// Register with ExecutionLifecycleService for background tracking
|
|
407
|
+
const abortController = new AbortController();
|
|
408
|
+
const handle = ExecutionLifecycleService.createExecution('', // no initial output
|
|
409
|
+
() => abortController.abort(), // onKill
|
|
410
|
+
'none', undefined, // no format injection
|
|
411
|
+
'Skill extraction', 'silent');
|
|
412
|
+
const executionId = handle.pid;
|
|
413
|
+
const startTime = Date.now();
|
|
414
|
+
let completionResult;
|
|
415
|
+
try {
|
|
416
|
+
// Read extraction state
|
|
417
|
+
const state = await readExtractionState(statePath);
|
|
418
|
+
const previousRuns = state.runs.length;
|
|
419
|
+
const previouslyProcessed = getProcessedSessionIds(state).size;
|
|
420
|
+
debugLogger.log(`[MemoryService] State loaded: ${previousRuns} previous run(s), ${previouslyProcessed} session(s) already processed`);
|
|
421
|
+
// Build session index: all eligible sessions with summaries + file paths.
|
|
422
|
+
// The agent decides which to read in full via read_file.
|
|
423
|
+
const { sessionIndex, newSessionIds } = await buildSessionIndex(chatsDir, state);
|
|
424
|
+
const totalInIndex = sessionIndex ? sessionIndex.split('\n').length : 0;
|
|
425
|
+
debugLogger.log(`[MemoryService] Session scan: ${totalInIndex} eligible session(s) found, ${newSessionIds.length} new`);
|
|
426
|
+
if (newSessionIds.length === 0) {
|
|
427
|
+
debugLogger.log('[MemoryService] Skipped: no new sessions to process');
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
// Snapshot existing skill directories before extraction
|
|
431
|
+
const skillsBefore = new Set();
|
|
432
|
+
try {
|
|
433
|
+
const entries = await fs.readdir(skillsDir);
|
|
434
|
+
for (const e of entries) {
|
|
435
|
+
skillsBefore.add(e);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
// Empty skills dir
|
|
440
|
+
}
|
|
441
|
+
debugLogger.log(`[MemoryService] ${skillsBefore.size} existing skill(s) in memory`);
|
|
442
|
+
// Read existing skills for context (memory-extracted + global/workspace)
|
|
443
|
+
const existingSkillsSummary = await buildExistingSkillsSummary(skillsDir, config);
|
|
444
|
+
if (existingSkillsSummary) {
|
|
445
|
+
debugLogger.log(`[MemoryService] Existing skills context:\n${existingSkillsSummary}`);
|
|
446
|
+
}
|
|
447
|
+
// Build agent definition and context
|
|
448
|
+
const agentDefinition = SkillExtractionAgent(skillsDir, sessionIndex, existingSkillsSummary);
|
|
449
|
+
const context = buildAgentLoopContext(config);
|
|
450
|
+
// Register the agent's model config since it's not going through AgentRegistry.
|
|
451
|
+
const modelAlias = getModelConfigAlias(agentDefinition);
|
|
452
|
+
config.modelConfigService.registerRuntimeModelConfig(modelAlias, {
|
|
453
|
+
modelConfig: agentDefinition.modelConfig,
|
|
454
|
+
});
|
|
455
|
+
debugLogger.log(`[MemoryService] Starting extraction agent (model: ${agentDefinition.modelConfig.model}, maxTurns: 30, maxTime: 30min)`);
|
|
456
|
+
// Create and run the extraction agent
|
|
457
|
+
const executor = await LocalAgentExecutor.create(agentDefinition, context);
|
|
458
|
+
await executor.run({ request: 'Extract skills from the provided sessions.' }, abortController.signal);
|
|
459
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
460
|
+
// Diff skills directory to find newly created skills
|
|
461
|
+
const skillsCreated = [];
|
|
462
|
+
try {
|
|
463
|
+
const entriesAfter = await fs.readdir(skillsDir);
|
|
464
|
+
for (const e of entriesAfter) {
|
|
465
|
+
if (!skillsBefore.has(e)) {
|
|
466
|
+
skillsCreated.push(e);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
// Skills dir read failed
|
|
472
|
+
}
|
|
473
|
+
// Record the run with full metadata
|
|
474
|
+
const run = {
|
|
475
|
+
runAt: new Date().toISOString(),
|
|
476
|
+
sessionIds: newSessionIds,
|
|
477
|
+
skillsCreated,
|
|
478
|
+
};
|
|
479
|
+
const updatedState = {
|
|
480
|
+
runs: [...state.runs, run],
|
|
481
|
+
};
|
|
482
|
+
await writeExtractionState(statePath, updatedState);
|
|
483
|
+
if (skillsCreated.length > 0) {
|
|
484
|
+
debugLogger.log(`[MemoryService] Completed in ${elapsed}s. Created ${skillsCreated.length} skill(s): ${skillsCreated.join(', ')}`);
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
debugLogger.log(`[MemoryService] Completed in ${elapsed}s. No new skills created (processed ${newSessionIds.length} session(s))`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
492
|
+
if (abortController.signal.aborted) {
|
|
493
|
+
debugLogger.log(`[MemoryService] Cancelled after ${elapsed}s`);
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
debugLogger.log(`[MemoryService] Failed after ${elapsed}s: ${error instanceof Error ? error.message : String(error)}`);
|
|
497
|
+
}
|
|
498
|
+
completionResult = {
|
|
499
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
500
|
+
};
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
finally {
|
|
504
|
+
await releaseLock(lockPath);
|
|
505
|
+
debugLogger.log('[MemoryService] Lock released');
|
|
506
|
+
if (executionId !== undefined) {
|
|
507
|
+
ExecutionLifecycleService.completeExecution(executionId, completionResult);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=memoryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryService.js","sourceRoot":"","sources":["../../../src/services/memoryService.ts"],"names":[],"mappings":"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"}
|