@clinebot/core 0.0.28 → 0.0.30
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 +7 -0
- package/dist/ClineCore.d.ts +28 -2
- package/dist/ClineCore.d.ts.map +1 -1
- package/dist/account/cline-account-service.d.ts +1 -1
- package/dist/account/cline-account-service.d.ts.map +1 -1
- package/dist/account/index.d.ts +1 -1
- package/dist/account/index.d.ts.map +1 -1
- package/dist/account/types.d.ts +5 -0
- package/dist/account/types.d.ts.map +1 -1
- package/dist/auth/bounded-ttl-cache.d.ts +14 -0
- package/dist/auth/bounded-ttl-cache.d.ts.map +1 -0
- package/dist/auth/cline.d.ts +27 -2
- package/dist/auth/cline.d.ts.map +1 -1
- package/dist/auth/oca.d.ts.map +1 -1
- package/dist/chat/chat-schema.d.ts +11 -11
- package/dist/extensions/config/agent-config-loader.d.ts.map +1 -0
- package/dist/{agents → extensions/config}/agent-config-parser.d.ts +2 -2
- package/dist/extensions/config/agent-config-parser.d.ts.map +1 -0
- package/dist/{agents → extensions/config}/hooks-config-loader.d.ts +1 -1
- package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -0
- package/dist/{agents → extensions/config}/index.d.ts +2 -4
- package/dist/extensions/config/index.d.ts.map +1 -0
- package/dist/{runtime/commands.d.ts → extensions/config/runtime-commands.d.ts} +2 -3
- package/dist/extensions/config/runtime-commands.d.ts.map +1 -0
- package/dist/extensions/config/unified-config-file-watcher.d.ts.map +1 -0
- package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -0
- package/dist/extensions/context/agentic-compaction.d.ts +13 -0
- package/dist/extensions/context/agentic-compaction.d.ts.map +1 -0
- package/dist/extensions/context/basic-compaction.d.ts +9 -0
- package/dist/extensions/context/basic-compaction.d.ts.map +1 -0
- package/dist/extensions/context/compaction-shared.d.ts +60 -0
- package/dist/extensions/context/compaction-shared.d.ts.map +1 -0
- package/dist/extensions/context/compaction.d.ts +20 -0
- package/dist/extensions/context/compaction.d.ts.map +1 -0
- package/dist/extensions/index.d.ts +5 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/mcp/client.d.ts +3 -0
- package/dist/extensions/mcp/client.d.ts.map +1 -0
- package/dist/extensions/mcp/config-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/index.d.ts +9 -0
- package/dist/extensions/mcp/index.d.ts.map +1 -0
- package/dist/{mcp → extensions/mcp}/manager.d.ts +1 -2
- package/dist/extensions/mcp/manager.d.ts.map +1 -0
- package/dist/extensions/mcp/name-transform.d.ts +3 -0
- package/dist/extensions/mcp/name-transform.d.ts.map +1 -0
- package/dist/extensions/mcp/policies.d.ts +15 -0
- package/dist/extensions/mcp/policies.d.ts.map +1 -0
- package/dist/extensions/mcp/tools.d.ts +4 -0
- package/dist/extensions/mcp/tools.d.ts.map +1 -0
- package/dist/{mcp → extensions/mcp}/types.d.ts +29 -1
- package/dist/extensions/mcp/types.d.ts.map +1 -0
- package/dist/{agents → extensions/plugin}/plugin-config-loader.d.ts +1 -1
- package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -0
- package/dist/{agents → extensions/plugin}/plugin-loader.d.ts +1 -1
- package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -0
- package/dist/extensions/plugin/plugin-module-import.d.ts +5 -0
- package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -0
- package/dist/{agents → extensions/plugin}/plugin-sandbox.d.ts +1 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -0
- package/dist/extensions/plugin-sandbox-bootstrap.js +485 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/persistent.d.ts +64 -0
- package/dist/hooks/persistent.d.ts.map +1 -0
- package/dist/hooks/subprocess-runner.d.ts +22 -0
- package/dist/hooks/subprocess-runner.d.ts.map +1 -0
- package/dist/hooks/subprocess.d.ts +189 -0
- package/dist/hooks/subprocess.d.ts.map +1 -0
- package/dist/index.d.ts +22 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +560 -447
- package/dist/prompt/default-system.d.ts +2 -0
- package/dist/prompt/default-system.d.ts.map +1 -0
- package/dist/providers/local-provider-service.d.ts +1 -1
- package/dist/providers/local-provider-service.d.ts.map +1 -1
- package/dist/runtime/checkpoint-hooks.d.ts +21 -0
- package/dist/runtime/checkpoint-hooks.d.ts.map +1 -0
- package/dist/runtime/hook-file-hooks.d.ts +1 -1
- package/dist/runtime/hook-file-hooks.d.ts.map +1 -1
- package/dist/runtime/rules.d.ts +1 -1
- package/dist/runtime/rules.d.ts.map +1 -1
- package/dist/runtime/runtime-builder.d.ts +1 -1
- package/dist/runtime/runtime-builder.d.ts.map +1 -1
- package/dist/runtime/session-runtime.d.ts +25 -5
- package/dist/runtime/session-runtime.d.ts.map +1 -1
- package/dist/runtime/subprocess-sandbox.d.ts.map +1 -0
- package/dist/runtime/team-runtime-registry.d.ts +1 -1
- package/dist/runtime/team-runtime-registry.d.ts.map +1 -1
- package/dist/runtime/tool-approval.d.ts +1 -1
- package/dist/session/default-session-manager.d.ts +9 -3
- package/dist/session/default-session-manager.d.ts.map +1 -1
- package/dist/session/file-session-service.d.ts +1 -1
- package/dist/session/file-session-service.d.ts.map +1 -1
- package/dist/session/{unified-session-persistence-service.d.ts → persistence-service.d.ts} +11 -42
- package/dist/session/persistence-service.d.ts.map +1 -0
- package/dist/session/rpc-session-service.d.ts +1 -1
- package/dist/session/rpc-session-service.d.ts.map +1 -1
- package/dist/session/session-agent-events.d.ts +1 -1
- package/dist/session/session-artifacts.d.ts.map +1 -1
- package/dist/session/session-config-builder.d.ts.map +1 -1
- package/dist/session/session-graph.d.ts +1 -1
- package/dist/session/session-graph.d.ts.map +1 -1
- package/dist/session/session-host.d.ts.map +1 -1
- package/dist/session/session-manager.d.ts +6 -5
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manifest.d.ts +1 -1
- package/dist/session/session-service.d.ts +3 -2
- package/dist/session/session-service.d.ts.map +1 -1
- package/dist/session/session-team-coordination.d.ts +2 -1
- package/dist/session/session-team-coordination.d.ts.map +1 -1
- package/dist/session/utils/helpers.d.ts +51 -3
- package/dist/session/utils/helpers.d.ts.map +1 -1
- package/dist/session/utils/types.d.ts +41 -7
- package/dist/session/utils/types.d.ts.map +1 -1
- package/dist/session/workspace-manager.d.ts +1 -2
- package/dist/session/workspace-manager.d.ts.map +1 -1
- package/dist/session/workspace-manifest.d.ts +1 -22
- package/dist/session/workspace-manifest.d.ts.map +1 -1
- package/dist/storage/file-team-store.d.ts +2 -1
- package/dist/storage/file-team-store.d.ts.map +1 -1
- package/dist/storage/sqlite-team-store.d.ts +4 -1
- package/dist/storage/sqlite-team-store.d.ts.map +1 -1
- package/dist/storage/team-store.d.ts.map +1 -1
- package/dist/team/delegated-agent.d.ts +44 -0
- package/dist/team/delegated-agent.d.ts.map +1 -0
- package/dist/team/index.d.ts +1 -0
- package/dist/team/index.d.ts.map +1 -1
- package/dist/team/multi-agent.d.ts +229 -0
- package/dist/team/multi-agent.d.ts.map +1 -0
- package/dist/team/projections.d.ts +2 -2
- package/dist/team/projections.d.ts.map +1 -1
- package/dist/team/runtime.d.ts +5 -0
- package/dist/team/runtime.d.ts.map +1 -0
- package/dist/team/spawn-agent-tool.d.ts +85 -0
- package/dist/team/spawn-agent-tool.d.ts.map +1 -0
- package/dist/team/subagent-prompts.d.ts +4 -0
- package/dist/team/subagent-prompts.d.ts.map +1 -0
- package/dist/team/team-tools.d.ts +35 -0
- package/dist/team/team-tools.d.ts.map +1 -0
- package/dist/telemetry/OpenTelemetryProvider.d.ts +11 -1
- package/dist/telemetry/OpenTelemetryProvider.d.ts.map +1 -1
- package/dist/telemetry/{LoggerTelemetryAdapter.d.ts → TelemetryLoggerSink.d.ts} +10 -4
- package/dist/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
- package/dist/telemetry/TelemetryService.d.ts.map +1 -1
- package/dist/telemetry/index.js +15 -28
- package/dist/tools/definitions.d.ts +4 -3
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/index.d.ts +5 -5
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/model-tool-routing.d.ts.map +1 -1
- package/dist/tools/presets.d.ts +26 -0
- package/dist/tools/presets.d.ts.map +1 -1
- package/dist/tools/schemas.d.ts +8 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/types.d.ts +23 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types/config.d.ts +47 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/events.d.ts +1 -1
- package/dist/types/provider-settings.d.ts +1 -1
- package/dist/types/provider-settings.d.ts.map +1 -1
- package/dist/types/storage.d.ts +2 -1
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types.d.ts +7 -16
- package/dist/types.d.ts.map +1 -1
- package/package.json +15 -12
- package/src/ClineCore.test.ts +150 -0
- package/src/ClineCore.ts +114 -8
- package/src/account/cline-account-service.test.ts +84 -0
- package/src/account/cline-account-service.ts +2 -2
- package/src/account/index.ts +1 -0
- package/src/account/types.ts +6 -0
- package/src/auth/bounded-ttl-cache.test.ts +38 -0
- package/src/auth/bounded-ttl-cache.ts +53 -0
- package/src/auth/cline.test.ts +173 -36
- package/src/auth/cline.ts +395 -93
- package/src/auth/oca.test.ts +125 -0
- package/src/auth/oca.ts +17 -4
- package/src/{agents → extensions/config}/agent-config-loader.test.ts +1 -1
- package/src/{agents → extensions/config}/agent-config-parser.ts +2 -2
- package/src/{agents → extensions/config}/hooks-config-loader.ts +1 -1
- package/src/{agents → extensions/config}/index.ts +7 -11
- package/src/{runtime/commands.test.ts → extensions/config/runtime-commands.test.ts} +20 -3
- package/src/{runtime/commands.ts → extensions/config/runtime-commands.ts} +1 -8
- package/src/{agents → extensions/config}/unified-config-file-watcher.ts +15 -2
- package/src/{agents → extensions/config}/user-instruction-config-loader.test.ts +90 -2
- package/src/{agents → extensions/config}/user-instruction-config-loader.ts +126 -12
- package/src/extensions/context/agentic-compaction.ts +119 -0
- package/src/extensions/context/basic-compaction.ts +275 -0
- package/src/extensions/context/compaction-shared.ts +458 -0
- package/src/extensions/context/compaction.test.ts +477 -0
- package/src/extensions/context/compaction.ts +203 -0
- package/src/extensions/index.ts +12 -0
- package/src/extensions/mcp/client.ts +420 -0
- package/src/{mcp → extensions/mcp}/index.ts +16 -0
- package/src/{mcp → extensions/mcp}/manager.test.ts +1 -2
- package/src/{mcp → extensions/mcp}/manager.ts +3 -5
- package/src/extensions/mcp/name-transform.ts +33 -0
- package/src/extensions/mcp/policies.ts +47 -0
- package/src/extensions/mcp/tools.ts +47 -0
- package/src/{mcp → extensions/mcp}/types.ts +35 -7
- package/src/{agents → extensions/plugin}/plugin-config-loader.test.ts +18 -13
- package/src/{agents → extensions/plugin}/plugin-config-loader.ts +1 -1
- package/src/{agents → extensions/plugin}/plugin-loader.test.ts +41 -4
- package/src/extensions/plugin/plugin-loader.ts +106 -0
- package/src/extensions/plugin/plugin-module-import.ts +278 -0
- package/src/{agents → extensions/plugin}/plugin-sandbox-bootstrap.ts +30 -92
- package/src/{agents → extensions/plugin}/plugin-sandbox.test.ts +60 -3
- package/src/{agents → extensions/plugin}/plugin-sandbox.ts +146 -56
- package/src/hooks/index.ts +25 -0
- package/src/hooks/persistent.ts +661 -0
- package/src/hooks/subprocess-runner.ts +196 -0
- package/src/hooks/subprocess.ts +669 -0
- package/src/index.ts +200 -118
- package/src/prompt/default-system.ts +21 -0
- package/src/providers/local-provider-registry.ts +1 -1
- package/src/providers/local-provider-service.test.ts +23 -2
- package/src/providers/local-provider-service.ts +2 -2
- package/src/runtime/checkpoint-hooks.test.ts +168 -0
- package/src/runtime/checkpoint-hooks.ts +186 -0
- package/src/runtime/hook-file-hooks.test.ts +40 -1
- package/src/runtime/hook-file-hooks.ts +35 -16
- package/src/runtime/index.ts +4 -19
- package/src/runtime/rules.ts +4 -1
- package/src/runtime/runtime-builder.team-persistence.test.ts +3 -6
- package/src/runtime/runtime-builder.test.ts +266 -160
- package/src/runtime/runtime-builder.ts +120 -47
- package/src/runtime/runtime-parity.test.ts +22 -22
- package/src/runtime/session-runtime.ts +36 -6
- package/src/runtime/{sandbox/subprocess-sandbox.ts → subprocess-sandbox.ts} +24 -3
- package/src/runtime/team-runtime-registry.ts +1 -4
- package/src/runtime/tool-approval.ts +1 -1
- package/src/session/default-session-manager.e2e.test.ts +2 -2
- package/src/session/default-session-manager.test.ts +553 -9
- package/src/session/default-session-manager.ts +162 -46
- package/src/session/file-session-service.ts +3 -3
- package/src/session/index.ts +6 -6
- package/src/session/persistence-service.test.ts +212 -0
- package/src/session/{unified-session-persistence-service.ts → persistence-service.ts} +106 -172
- package/src/session/rpc-session-service.ts +3 -3
- package/src/session/runtime-oauth-token-manager.ts +1 -1
- package/src/session/session-agent-events.ts +1 -1
- package/src/session/session-artifacts.ts +32 -4
- package/src/session/session-config-builder.ts +22 -9
- package/src/session/session-graph.ts +1 -1
- package/src/session/session-host.ts +19 -11
- package/src/session/session-manager.ts +11 -6
- package/src/session/session-service.team-persistence.test.ts +1 -1
- package/src/session/session-service.ts +6 -9
- package/src/session/session-team-coordination.ts +7 -3
- package/src/session/session-telemetry.ts +1 -1
- package/src/session/utils/helpers.test.ts +160 -0
- package/src/session/utils/helpers.ts +289 -42
- package/src/session/utils/types.ts +47 -7
- package/src/session/workspace-manager.ts +5 -3
- package/src/session/workspace-manifest.ts +3 -49
- package/src/storage/file-team-store.ts +2 -5
- package/src/storage/provider-settings-legacy-migration.ts +2 -2
- package/src/storage/provider-settings-manager.test.ts +1 -1
- package/src/storage/sqlite-team-store.ts +212 -125
- package/src/storage/team-store.ts +1 -5
- package/src/team/delegated-agent.ts +131 -0
- package/src/team/index.ts +1 -0
- package/src/team/multi-agent.lifecycle.test.ts +201 -0
- package/src/team/multi-agent.ts +1666 -0
- package/src/team/projections.ts +2 -4
- package/src/team/runtime.ts +54 -0
- package/src/team/spawn-agent-tool.test.ts +387 -0
- package/src/team/spawn-agent-tool.ts +207 -0
- package/src/team/subagent-prompts.ts +41 -0
- package/src/team/team-tools.test.ts +802 -0
- package/src/team/team-tools.ts +792 -0
- package/src/telemetry/OpenTelemetryAdapter.ts +1 -1
- package/src/telemetry/OpenTelemetryProvider.test.ts +216 -3
- package/src/telemetry/OpenTelemetryProvider.ts +110 -20
- package/src/telemetry/TelemetryLoggerSink.test.ts +42 -0
- package/src/telemetry/{LoggerTelemetryAdapter.ts → TelemetryLoggerSink.ts} +21 -14
- package/src/telemetry/TelemetryService.test.ts +7 -7
- package/src/telemetry/TelemetryService.ts +2 -4
- package/src/tools/definitions.test.ts +76 -0
- package/src/tools/definitions.ts +41 -2
- package/src/tools/executors/apply-patch.ts +1 -1
- package/src/tools/executors/editor.ts +1 -1
- package/src/tools/executors/file-read.ts +1 -1
- package/src/tools/executors/search.ts +1 -1
- package/src/tools/executors/web-fetch.ts +1 -1
- package/src/tools/index.ts +6 -1
- package/src/tools/model-tool-routing.ts +2 -0
- package/src/tools/presets.test.ts +8 -0
- package/src/tools/presets.ts +40 -2
- package/src/tools/schemas.ts +19 -0
- package/src/tools/types.ts +31 -2
- package/src/types/config.ts +61 -7
- package/src/types/events.ts +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/provider-settings.ts +1 -1
- package/src/types/storage.ts +2 -5
- package/src/types.ts +32 -44
- package/dist/agents/agent-config-loader.d.ts.map +0 -1
- package/dist/agents/agent-config-parser.d.ts.map +0 -1
- package/dist/agents/hooks-config-loader.d.ts.map +0 -1
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/plugin-config-loader.d.ts.map +0 -1
- package/dist/agents/plugin-loader.d.ts.map +0 -1
- package/dist/agents/plugin-sandbox-bootstrap.js +0 -446
- package/dist/agents/plugin-sandbox.d.ts.map +0 -1
- package/dist/agents/unified-config-file-watcher.d.ts.map +0 -1
- package/dist/agents/user-instruction-config-loader.d.ts.map +0 -1
- package/dist/mcp/config-loader.d.ts.map +0 -1
- package/dist/mcp/index.d.ts +0 -5
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/manager.d.ts.map +0 -1
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/runtime/commands.d.ts.map +0 -1
- package/dist/runtime/sandbox/subprocess-sandbox.d.ts.map +0 -1
- package/dist/runtime/skills.d.ts +0 -14
- package/dist/runtime/skills.d.ts.map +0 -1
- package/dist/runtime/workflows.d.ts +0 -14
- package/dist/runtime/workflows.d.ts.map +0 -1
- package/dist/session/unified-session-persistence-service.d.ts.map +0 -1
- package/dist/telemetry/LoggerTelemetryAdapter.d.ts.map +0 -1
- package/dist/types/workspace.d.ts +0 -8
- package/dist/types/workspace.d.ts.map +0 -1
- package/src/agents/plugin-loader.ts +0 -175
- package/src/runtime/skills.ts +0 -44
- package/src/runtime/workflows.test.ts +0 -119
- package/src/runtime/workflows.ts +0 -45
- package/src/session/unified-session-persistence-service.test.ts +0 -85
- package/src/telemetry/LoggerTelemetryAdapter.test.ts +0 -42
- package/src/types/workspace.ts +0 -7
- /package/dist/{agents → extensions/config}/agent-config-loader.d.ts +0 -0
- /package/dist/{agents → extensions/config}/unified-config-file-watcher.d.ts +0 -0
- /package/dist/{agents → extensions/config}/user-instruction-config-loader.d.ts +0 -0
- /package/dist/{mcp → extensions/mcp}/config-loader.d.ts +0 -0
- /package/dist/runtime/{sandbox/subprocess-sandbox.d.ts → subprocess-sandbox.d.ts} +0 -0
- /package/src/{agents → extensions/config}/agent-config-loader.ts +0 -0
- /package/src/{agents → extensions/config}/hooks-config-loader.test.ts +0 -0
- /package/src/{agents → extensions/config}/unified-config-file-watcher.test.ts +0 -0
- /package/src/{mcp → extensions/mcp}/config-loader.test.ts +0 -0
- /package/src/{mcp → extensions/mcp}/config-loader.ts +0 -0
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
import { existsSync, readdirSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
AgentTeamsRuntime,
|
|
5
|
-
bootstrapAgentTeams,
|
|
6
|
-
createDelegatedAgentConfigProvider,
|
|
7
|
-
type TeamEvent,
|
|
8
|
-
type TeamTeammateSpec,
|
|
9
|
-
type Tool,
|
|
10
|
-
} from "@clinebot/agents";
|
|
3
|
+
import type { BasicLogger, TeamTeammateSpec, Tool } from "@clinebot/shared";
|
|
11
4
|
import { resolveSkillsConfigSearchPaths } from "@clinebot/shared/storage";
|
|
12
5
|
import { nanoid } from "nanoid";
|
|
13
6
|
import {
|
|
14
7
|
createUserInstructionConfigWatcher,
|
|
15
8
|
type SkillConfig,
|
|
16
9
|
type UserInstructionConfigWatcher,
|
|
17
|
-
} from "../
|
|
18
|
-
import {
|
|
10
|
+
} from "../extensions/config";
|
|
11
|
+
import {
|
|
12
|
+
createDefaultMcpServerClientFactory,
|
|
13
|
+
createMcpTools,
|
|
14
|
+
hasMcpSettingsFile,
|
|
15
|
+
InMemoryMcpManager,
|
|
16
|
+
registerMcpServersFromSettingsFile,
|
|
17
|
+
resolveDefaultMcpSettingsPath,
|
|
18
|
+
} from "../extensions/mcp";
|
|
19
19
|
import { createLocalTeamStore } from "../storage/team-store";
|
|
20
|
+
import {
|
|
21
|
+
AgentTeamsRuntime,
|
|
22
|
+
bootstrapAgentTeams,
|
|
23
|
+
createDelegatedAgentConfigProvider,
|
|
24
|
+
type TeamEvent,
|
|
25
|
+
} from "../team";
|
|
20
26
|
import {
|
|
21
27
|
createBuiltinTools,
|
|
22
28
|
DEFAULT_MODEL_TOOL_ROUTING_RULES,
|
|
29
|
+
resolveToolPresetName,
|
|
23
30
|
resolveToolRoutingConfig,
|
|
24
31
|
type SkillsExecutor,
|
|
25
32
|
type ToolExecutors,
|
|
@@ -41,8 +48,6 @@ type SkillsExecutorMetadataItem = {
|
|
|
41
48
|
disabled: boolean;
|
|
42
49
|
};
|
|
43
50
|
|
|
44
|
-
const WORKSPACE_CONFIGURATION_MARKER = "# Workspace Configuration";
|
|
45
|
-
|
|
46
51
|
type SkillsExecutorWithMetadata = SkillsExecutor & {
|
|
47
52
|
configuredSkills?: SkillsExecutorMetadataItem[];
|
|
48
53
|
};
|
|
@@ -55,13 +60,13 @@ function createBuiltinToolsList(
|
|
|
55
60
|
cwd: string,
|
|
56
61
|
providerId: string,
|
|
57
62
|
mode: CoreAgentMode,
|
|
63
|
+
yolo: boolean | undefined,
|
|
58
64
|
modelId: string,
|
|
59
65
|
toolRoutingRules: ToolRoutingRule[] | undefined,
|
|
60
66
|
skillsExecutor?: SkillsExecutorWithMetadata,
|
|
61
67
|
executorOverrides?: Partial<ToolExecutors>,
|
|
62
68
|
): Tool[] {
|
|
63
|
-
const preset =
|
|
64
|
-
mode === "plan" ? ToolPresets.readonly : ToolPresets.development;
|
|
69
|
+
const preset = ToolPresets[resolveToolPresetName({ mode, yolo })];
|
|
65
70
|
const toolRoutingConfig = resolveToolRoutingConfig(
|
|
66
71
|
providerId,
|
|
67
72
|
modelId,
|
|
@@ -186,6 +191,64 @@ function hasSkillsFiles(workspacePath: string): boolean {
|
|
|
186
191
|
return false;
|
|
187
192
|
}
|
|
188
193
|
|
|
194
|
+
async function loadConfiguredMcpTools(logger?: BasicLogger): Promise<{
|
|
195
|
+
tools: Tool[];
|
|
196
|
+
shutdown?: () => Promise<void>;
|
|
197
|
+
}> {
|
|
198
|
+
const settingsPath = resolveDefaultMcpSettingsPath();
|
|
199
|
+
if (!hasMcpSettingsFile({ filePath: settingsPath })) {
|
|
200
|
+
return { tools: [] };
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const manager = new InMemoryMcpManager({
|
|
204
|
+
clientFactory: createDefaultMcpServerClientFactory(),
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
let registrations: Awaited<
|
|
208
|
+
ReturnType<typeof registerMcpServersFromSettingsFile>
|
|
209
|
+
>;
|
|
210
|
+
try {
|
|
211
|
+
registrations = await registerMcpServersFromSettingsFile(manager, {
|
|
212
|
+
filePath: settingsPath,
|
|
213
|
+
});
|
|
214
|
+
} catch (error) {
|
|
215
|
+
await manager.dispose().catch(() => {});
|
|
216
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
217
|
+
logger?.log(
|
|
218
|
+
`[mcp] Failed to load MCP settings, skipping MCP tools: ${message}`,
|
|
219
|
+
);
|
|
220
|
+
return { tools: [] };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const enabled = registrations.filter((r) => r.disabled !== true);
|
|
224
|
+
const results = await Promise.allSettled(
|
|
225
|
+
enabled.map((r) =>
|
|
226
|
+
createMcpTools({ serverName: r.name, provider: manager }),
|
|
227
|
+
),
|
|
228
|
+
);
|
|
229
|
+
const tools: Tool[] = [];
|
|
230
|
+
for (const [i, result] of results.entries()) {
|
|
231
|
+
if (result.status === "fulfilled") {
|
|
232
|
+
tools.push(...result.value);
|
|
233
|
+
} else {
|
|
234
|
+
const message =
|
|
235
|
+
result.reason instanceof Error
|
|
236
|
+
? result.reason.message
|
|
237
|
+
: String(result.reason);
|
|
238
|
+
logger?.log(
|
|
239
|
+
`[mcp] Failed to load tools from MCP server "${enabled[i].name}", skipping: ${message}`,
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
tools,
|
|
246
|
+
shutdown: async () => {
|
|
247
|
+
await manager.dispose();
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
189
252
|
function resolveSkillRecord(
|
|
190
253
|
watcher: UserInstructionConfigWatcher,
|
|
191
254
|
requestedSkill: string,
|
|
@@ -314,17 +377,6 @@ function shutdownTeamRuntime(
|
|
|
314
377
|
}
|
|
315
378
|
}
|
|
316
379
|
|
|
317
|
-
function extractWorkspaceMetadataFromSystemPrompt(
|
|
318
|
-
systemPrompt: string,
|
|
319
|
-
): string | undefined {
|
|
320
|
-
const markerIndex = systemPrompt.lastIndexOf(WORKSPACE_CONFIGURATION_MARKER);
|
|
321
|
-
if (markerIndex < 0) {
|
|
322
|
-
return undefined;
|
|
323
|
-
}
|
|
324
|
-
const metadata = systemPrompt.slice(markerIndex).trim();
|
|
325
|
-
return metadata.length > 0 ? metadata : undefined;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
380
|
function normalizeConfig(
|
|
329
381
|
config: CoreSessionConfig,
|
|
330
382
|
): Required<
|
|
@@ -334,17 +386,28 @@ function normalizeConfig(
|
|
|
334
386
|
| "enableTools"
|
|
335
387
|
| "enableSpawnAgent"
|
|
336
388
|
| "enableAgentTeams"
|
|
389
|
+
| "yolo"
|
|
337
390
|
| "missionLogIntervalSteps"
|
|
338
391
|
| "missionLogIntervalMs"
|
|
339
392
|
| "sessionId"
|
|
340
393
|
>
|
|
341
394
|
> {
|
|
395
|
+
const preset =
|
|
396
|
+
ToolPresets[
|
|
397
|
+
resolveToolPresetName({
|
|
398
|
+
mode: config.mode,
|
|
399
|
+
yolo: config.yolo,
|
|
400
|
+
})
|
|
401
|
+
];
|
|
342
402
|
return {
|
|
343
403
|
sessionId: config.sessionId || "",
|
|
344
404
|
mode: config.mode === "plan" ? "plan" : "act",
|
|
345
405
|
enableTools: config.enableTools !== false,
|
|
346
|
-
enableSpawnAgent:
|
|
347
|
-
|
|
406
|
+
enableSpawnAgent:
|
|
407
|
+
config.enableSpawnAgent ?? preset.enableSpawnAgent ?? true,
|
|
408
|
+
enableAgentTeams:
|
|
409
|
+
config.enableAgentTeams ?? preset.enableAgentTeams ?? true,
|
|
410
|
+
yolo: config.yolo === true,
|
|
348
411
|
missionLogIntervalSteps:
|
|
349
412
|
typeof config.missionLogIntervalSteps === "number" &&
|
|
350
413
|
Number.isFinite(config.missionLogIntervalSteps)
|
|
@@ -361,7 +424,7 @@ function normalizeConfig(
|
|
|
361
424
|
export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
362
425
|
private readonly teamRuntimeRegistry = new TeamRuntimeRegistry();
|
|
363
426
|
|
|
364
|
-
build(input: RuntimeBuilderInput): RuntimeEnvironment {
|
|
427
|
+
async build(input: RuntimeBuilderInput): Promise<RuntimeEnvironment> {
|
|
365
428
|
const {
|
|
366
429
|
config,
|
|
367
430
|
hooks,
|
|
@@ -382,6 +445,7 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
382
445
|
let userInstructionWatcher = sharedUserInstructionWatcher;
|
|
383
446
|
let watcherReady = Promise.resolve();
|
|
384
447
|
let skillsExecutor: SkillsExecutorWithMetadata | undefined;
|
|
448
|
+
let mcpShutdown: (() => Promise<void>) | undefined;
|
|
385
449
|
|
|
386
450
|
if (
|
|
387
451
|
!userInstructionWatcher &&
|
|
@@ -416,12 +480,16 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
416
480
|
config.cwd,
|
|
417
481
|
config.providerId,
|
|
418
482
|
normalized.mode,
|
|
483
|
+
normalized.yolo,
|
|
419
484
|
config.modelId,
|
|
420
485
|
config.toolRoutingRules,
|
|
421
486
|
skillsExecutor,
|
|
422
487
|
defaultToolExecutors,
|
|
423
488
|
),
|
|
424
489
|
);
|
|
490
|
+
const mcpRuntime = await loadConfiguredMcpTools(config.logger);
|
|
491
|
+
tools.push(...mcpRuntime.tools);
|
|
492
|
+
mcpShutdown = mcpRuntime.shutdown;
|
|
425
493
|
}
|
|
426
494
|
|
|
427
495
|
let teamRuntime: AgentTeamsRuntime | undefined;
|
|
@@ -435,6 +503,12 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
435
503
|
restoredTeammateSpecs.map((spec) => [spec.agentId, spec] as const),
|
|
436
504
|
);
|
|
437
505
|
const registryKey = config.sessionId || effectiveTeamName;
|
|
506
|
+
let leadAgentInstance:
|
|
507
|
+
| {
|
|
508
|
+
addTools: (tools: Tool[]) => void;
|
|
509
|
+
}
|
|
510
|
+
| undefined;
|
|
511
|
+
let pendingLeadTeamTools: Tool[] = [];
|
|
438
512
|
const delegatedAgentConfigProvider = createDelegatedAgentConfigProvider({
|
|
439
513
|
providerId: config.providerId,
|
|
440
514
|
modelId: config.modelId,
|
|
@@ -445,29 +519,13 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
445
519
|
providerConfig: config.providerConfig,
|
|
446
520
|
knownModels: config.knownModels,
|
|
447
521
|
thinking: config.thinking,
|
|
448
|
-
clineWorkspaceMetadata:
|
|
449
|
-
config.providerId === "cline"
|
|
450
|
-
? extractWorkspaceMetadataFromSystemPrompt(config.systemPrompt)
|
|
451
|
-
: undefined,
|
|
452
522
|
maxIterations: config.maxIterations,
|
|
453
523
|
hooks,
|
|
454
524
|
extensions: extensions ?? config.extensions,
|
|
455
525
|
logger: logger ?? config.logger,
|
|
456
526
|
telemetry: input.telemetry ?? config.telemetry,
|
|
527
|
+
workspaceMetadata: config.workspaceMetadata,
|
|
457
528
|
});
|
|
458
|
-
const runtimeMetadata = delegatedAgentConfigProvider.getRuntimeConfig();
|
|
459
|
-
if (
|
|
460
|
-
config.providerId === "cline" &&
|
|
461
|
-
!runtimeMetadata.clineWorkspaceMetadata
|
|
462
|
-
) {
|
|
463
|
-
buildWorkspaceMetadata(config.cwd ?? "").then((metadata) => {
|
|
464
|
-
const current = delegatedAgentConfigProvider.getRuntimeConfig();
|
|
465
|
-
if (current.clineWorkspaceMetadata) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
Object.assign(current, { clineWorkspaceMetadata: metadata });
|
|
469
|
-
});
|
|
470
|
-
}
|
|
471
529
|
this.teamRuntimeRegistry.getOrCreate(registryKey, () => ({
|
|
472
530
|
delegatedAgentConfigProvider,
|
|
473
531
|
}));
|
|
@@ -531,17 +589,25 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
531
589
|
}
|
|
532
590
|
teamToolsRegistered = true;
|
|
533
591
|
|
|
534
|
-
const
|
|
592
|
+
const factory = input.teamToolsFactory ?? bootstrapAgentTeams;
|
|
593
|
+
const teamBootstrap = factory({
|
|
535
594
|
runtime: teamRuntime,
|
|
536
595
|
leadAgentId: "lead",
|
|
537
596
|
restoredFromPersistence: Boolean(restoredTeamState),
|
|
538
597
|
restoredTeammates: restoredTeammateSpecs,
|
|
598
|
+
includeLeadSpawnTool: true,
|
|
599
|
+
includeLeadManagementTools: true,
|
|
600
|
+
onLeadToolsUnlocked: (teamTools) => {
|
|
601
|
+
pendingLeadTeamTools = teamTools;
|
|
602
|
+
leadAgentInstance?.addTools(teamTools);
|
|
603
|
+
},
|
|
539
604
|
createBaseTools: normalized.enableTools
|
|
540
605
|
? () =>
|
|
541
606
|
createBuiltinToolsList(
|
|
542
607
|
config.cwd,
|
|
543
608
|
config.providerId,
|
|
544
609
|
normalized.mode,
|
|
610
|
+
normalized.yolo,
|
|
545
611
|
config.modelId,
|
|
546
612
|
config.toolRoutingRules,
|
|
547
613
|
skillsExecutor,
|
|
@@ -618,9 +684,16 @@ export class DefaultRuntimeBuilder implements RuntimeBuilder {
|
|
|
618
684
|
this.teamRuntimeRegistry.get(registryKey)
|
|
619
685
|
?.delegatedAgentConfigProvider ?? delegatedAgentConfigProvider,
|
|
620
686
|
completionGuard,
|
|
621
|
-
|
|
687
|
+
registerLeadAgent: (agent) => {
|
|
688
|
+
leadAgentInstance = agent;
|
|
689
|
+
if (pendingLeadTeamTools.length > 0) {
|
|
690
|
+
agent.addTools(pendingLeadTeamTools);
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
shutdown: async (reason: string) => {
|
|
622
694
|
shutdownTeamRuntime(teamRuntime, reason);
|
|
623
695
|
this.teamRuntimeRegistry.delete(registryKey);
|
|
696
|
+
await mcpShutdown?.();
|
|
624
697
|
if (!watcherProvided) {
|
|
625
698
|
userInstructionWatcher?.stop();
|
|
626
699
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdtempSync } from "node:fs";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import type { Tool } from "@clinebot/
|
|
4
|
+
import type { Tool } from "@clinebot/shared";
|
|
5
5
|
import { describe, expect, it } from "vitest";
|
|
6
6
|
import { createBuiltinTools } from "../tools";
|
|
7
7
|
import { DefaultRuntimeBuilder } from "./runtime-builder";
|
|
@@ -47,9 +47,12 @@ function legacyBuildRuntimeEnvironment(
|
|
|
47
47
|
|
|
48
48
|
function normalizeParityToolNames(toolNames: string[]): string[] {
|
|
49
49
|
// Skills are discovered from user/workspace config and can appear in tests
|
|
50
|
-
// depending on the machine state.
|
|
51
|
-
// strict legacy
|
|
52
|
-
|
|
50
|
+
// depending on the machine state. MCP tools may also be configured outside
|
|
51
|
+
// the test workspace. They are intentionally excluded from strict legacy
|
|
52
|
+
// parity checks.
|
|
53
|
+
return toolNames.filter(
|
|
54
|
+
(toolName) => toolName !== "skills" && !toolName.includes("__"),
|
|
55
|
+
);
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
function makeEmptyWorkspaceCwd(): string {
|
|
@@ -66,7 +69,7 @@ function makeSpawnTool(): Tool {
|
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
describe("runtime tool parity", () => {
|
|
69
|
-
it("matches legacy tool list when tools+spawn are enabled", () => {
|
|
72
|
+
it("matches legacy tool list when tools+spawn are enabled", async () => {
|
|
70
73
|
const config: LegacyConfig = {
|
|
71
74
|
providerId: "anthropic",
|
|
72
75
|
modelId: "claude-sonnet-4-6",
|
|
@@ -83,17 +86,16 @@ describe("runtime tool parity", () => {
|
|
|
83
86
|
(tool) => tool.name,
|
|
84
87
|
),
|
|
85
88
|
);
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
.tools.map((tool) => tool.name);
|
|
89
|
+
const runtime = await new DefaultRuntimeBuilder().build({
|
|
90
|
+
config,
|
|
91
|
+
createSpawnTool,
|
|
92
|
+
});
|
|
93
|
+
const actual = runtime.tools.map((tool) => tool.name);
|
|
92
94
|
|
|
93
95
|
expect(normalizeParityToolNames(actual)).toEqual(expected);
|
|
94
96
|
});
|
|
95
97
|
|
|
96
|
-
it("matches legacy tool list when only spawn is enabled", () => {
|
|
98
|
+
it("matches legacy tool list when only spawn is enabled", async () => {
|
|
97
99
|
const config: LegacyConfig = {
|
|
98
100
|
providerId: "anthropic",
|
|
99
101
|
modelId: "claude-sonnet-4-6",
|
|
@@ -110,17 +112,16 @@ describe("runtime tool parity", () => {
|
|
|
110
112
|
(tool) => tool.name,
|
|
111
113
|
),
|
|
112
114
|
);
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
.tools.map((tool) => tool.name);
|
|
115
|
+
const runtime = await new DefaultRuntimeBuilder().build({
|
|
116
|
+
config,
|
|
117
|
+
createSpawnTool,
|
|
118
|
+
});
|
|
119
|
+
const actual = runtime.tools.map((tool) => tool.name);
|
|
119
120
|
|
|
120
121
|
expect(normalizeParityToolNames(actual)).toEqual(expected);
|
|
121
122
|
});
|
|
122
123
|
|
|
123
|
-
it("matches legacy tool list when tools+spawn are disabled", () => {
|
|
124
|
+
it("matches legacy tool list when tools+spawn are disabled", async () => {
|
|
124
125
|
const config: LegacyConfig = {
|
|
125
126
|
providerId: "anthropic",
|
|
126
127
|
modelId: "claude-sonnet-4-6",
|
|
@@ -134,9 +135,8 @@ describe("runtime tool parity", () => {
|
|
|
134
135
|
const expected = normalizeParityToolNames(
|
|
135
136
|
legacyBuildRuntimeEnvironment(config).map((tool) => tool.name),
|
|
136
137
|
);
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
.tools.map((tool) => tool.name);
|
|
138
|
+
const runtime = await new DefaultRuntimeBuilder().build({ config });
|
|
139
|
+
const actual = runtime.tools.map((tool) => tool.name);
|
|
140
140
|
|
|
141
141
|
expect(normalizeParityToolNames(actual)).toEqual(expected);
|
|
142
142
|
});
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
+
import type { Agent } from "@clinebot/agents";
|
|
1
2
|
import type {
|
|
2
3
|
AgentConfig,
|
|
3
4
|
AgentHooks,
|
|
4
5
|
AgentResult,
|
|
6
|
+
BasicLogger,
|
|
7
|
+
ITelemetryService,
|
|
8
|
+
TeamTeammateSpec,
|
|
9
|
+
Tool,
|
|
10
|
+
} from "@clinebot/shared";
|
|
11
|
+
import type { UserInstructionConfigWatcher } from "../extensions/config";
|
|
12
|
+
import type {
|
|
5
13
|
AgentTeamsRuntime,
|
|
6
14
|
DelegatedAgentConfigProvider,
|
|
7
|
-
|
|
8
|
-
} from "
|
|
9
|
-
import type { BasicLogger, ITelemetryService } from "@clinebot/shared";
|
|
10
|
-
import type { UserInstructionConfigWatcher } from "../agents";
|
|
15
|
+
TeamEvent,
|
|
16
|
+
} from "../team";
|
|
11
17
|
import type { ToolExecutors } from "../tools";
|
|
12
18
|
import type { CoreSessionConfig } from "../types/config";
|
|
13
19
|
|
|
@@ -20,24 +26,48 @@ export interface BuiltRuntime {
|
|
|
20
26
|
teamRestoredFromPersistence?: boolean;
|
|
21
27
|
delegatedAgentConfigProvider?: DelegatedAgentConfigProvider;
|
|
22
28
|
completionGuard?: () => string | undefined;
|
|
29
|
+
registerLeadAgent?: (agent: Agent) => void;
|
|
23
30
|
shutdown: (reason: string) => Promise<void> | void;
|
|
24
31
|
}
|
|
25
32
|
|
|
33
|
+
export interface TeamToolsFactoryOptions {
|
|
34
|
+
runtime: AgentTeamsRuntime;
|
|
35
|
+
teammateConfigProvider: DelegatedAgentConfigProvider;
|
|
36
|
+
createBaseTools?: () => Tool[];
|
|
37
|
+
leadAgentId?: string;
|
|
38
|
+
restoredTeammates?: TeamTeammateSpec[];
|
|
39
|
+
restoredFromPersistence?: boolean;
|
|
40
|
+
includeLeadSpawnTool?: boolean;
|
|
41
|
+
includeLeadManagementTools?: boolean;
|
|
42
|
+
onLeadToolsUnlocked?: (tools: Tool[]) => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface TeamToolsFactoryResult {
|
|
46
|
+
tools: Tool[];
|
|
47
|
+
restoredFromPersistence: boolean;
|
|
48
|
+
restoredTeammates: string[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type TeamToolsFactory = (
|
|
52
|
+
options: TeamToolsFactoryOptions,
|
|
53
|
+
) => TeamToolsFactoryResult;
|
|
54
|
+
|
|
26
55
|
export interface RuntimeBuilderInput {
|
|
27
56
|
config: CoreSessionConfig;
|
|
28
57
|
hooks?: AgentHooks;
|
|
29
58
|
extensions?: AgentConfig["extensions"];
|
|
30
|
-
onTeamEvent?: (event:
|
|
59
|
+
onTeamEvent?: (event: TeamEvent) => void;
|
|
31
60
|
createSpawnTool?: () => Tool;
|
|
32
61
|
onTeamRestored?: () => void;
|
|
33
62
|
userInstructionWatcher?: UserInstructionConfigWatcher;
|
|
34
63
|
defaultToolExecutors?: Partial<ToolExecutors>;
|
|
35
64
|
logger?: BasicLogger;
|
|
36
65
|
telemetry?: ITelemetryService;
|
|
66
|
+
teamToolsFactory?: TeamToolsFactory;
|
|
37
67
|
}
|
|
38
68
|
|
|
39
69
|
export interface RuntimeBuilder {
|
|
40
|
-
build(input: RuntimeBuilderInput): BuiltRuntime;
|
|
70
|
+
build(input: RuntimeBuilderInput): Promise<BuiltRuntime> | BuiltRuntime;
|
|
41
71
|
}
|
|
42
72
|
|
|
43
73
|
export interface SessionRuntime {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { type ChildProcess, spawn } from "node:child_process";
|
|
2
|
+
import {
|
|
3
|
+
augmentNodeCommandForDebug,
|
|
4
|
+
withResolvedClineBuildEnv,
|
|
5
|
+
} from "@clinebot/shared";
|
|
2
6
|
|
|
3
7
|
interface SandboxCallMessage {
|
|
4
8
|
type: "call";
|
|
@@ -66,10 +70,26 @@ export class SubprocessSandbox {
|
|
|
66
70
|
? [this.options.bootstrapFile]
|
|
67
71
|
: ["-e", this.options.bootstrapScript ?? ""];
|
|
68
72
|
|
|
69
|
-
const
|
|
70
|
-
|
|
73
|
+
const command = augmentNodeCommandForDebug([process.execPath, ...args], {
|
|
74
|
+
debugRole:
|
|
75
|
+
this.options.name === "plugin-sandbox" ? "plugin-sandbox" : "sandbox",
|
|
76
|
+
});
|
|
77
|
+
const child = spawn(command[0] ?? process.execPath, command.slice(1), {
|
|
78
|
+
stdio: ["ignore", "ignore", "pipe", "ipc"],
|
|
79
|
+
env: withResolvedClineBuildEnv(process.env),
|
|
71
80
|
});
|
|
72
81
|
this.process = child;
|
|
82
|
+
let stderrBuffer = "";
|
|
83
|
+
const appendStderr = (chunk: string) => {
|
|
84
|
+
const next = stderrBuffer + chunk;
|
|
85
|
+
// Keep only a small tail so errors include useful context
|
|
86
|
+
// without unbounded memory growth.
|
|
87
|
+
stderrBuffer = next.length > 4000 ? next.slice(-4000) : next;
|
|
88
|
+
};
|
|
89
|
+
child.stderr?.setEncoding("utf8");
|
|
90
|
+
child.stderr?.on("data", (chunk: string) => {
|
|
91
|
+
appendStderr(chunk);
|
|
92
|
+
});
|
|
73
93
|
child.on("message", (message) => {
|
|
74
94
|
this.onMessage(message as SandboxResponseMessage | SandboxEventMessage);
|
|
75
95
|
});
|
|
@@ -82,9 +102,10 @@ export class SubprocessSandbox {
|
|
|
82
102
|
});
|
|
83
103
|
child.on("exit", (code, signal) => {
|
|
84
104
|
this.process = null;
|
|
105
|
+
const stderrDetail = stderrBuffer.trim();
|
|
85
106
|
this.failPending(
|
|
86
107
|
new Error(
|
|
87
|
-
`${this.options.name ?? "sandbox"} process exited (code=${String(code)}, signal=${String(signal)})`,
|
|
108
|
+
`${this.options.name ?? "sandbox"} process exited (code=${String(code)}, signal=${String(signal)})${stderrDetail ? `: ${stderrDetail}` : ""}`,
|
|
88
109
|
),
|
|
89
110
|
);
|
|
90
111
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdir, readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/
|
|
3
|
+
import type { ToolApprovalRequest, ToolApprovalResult } from "@clinebot/shared";
|
|
4
4
|
|
|
5
5
|
export type DesktopToolApprovalOptions = {
|
|
6
6
|
approvalDir?: string;
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
} from "node:fs";
|
|
10
10
|
import { tmpdir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import type
|
|
13
|
-
import type
|
|
12
|
+
import type * as LlmsProviders from "@clinebot/llms";
|
|
13
|
+
import type { AgentResult } from "@clinebot/shared";
|
|
14
14
|
import { setClineDir, setHomeDir } from "@clinebot/shared/storage";
|
|
15
15
|
import { nanoid } from "nanoid";
|
|
16
16
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|