@clinebot/core 0.0.34 → 0.0.35
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 +12 -8
- package/dist/ClineCore.d.ts +48 -29
- package/dist/ClineCore.d.ts.map +1 -1
- package/dist/extensions/config/agent-config-loader.d.ts +2 -2
- package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
- package/dist/extensions/config/agent-config-parser.d.ts +1 -1
- package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
- package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
- package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
- package/dist/extensions/config/index.d.ts +3 -3
- package/dist/extensions/config/index.d.ts.map +1 -1
- package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
- package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
- package/dist/extensions/plugin-sandbox-bootstrap.js +248 -248
- package/dist/extensions/tools/constants.d.ts.map +1 -0
- package/dist/extensions/tools/definitions.d.ts.map +1 -0
- package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
- package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
- package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
- package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
- package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
- package/dist/extensions/tools/executors/index.d.ts.map +1 -0
- package/dist/extensions/tools/executors/search.d.ts.map +1 -0
- package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
- package/dist/extensions/tools/helpers.d.ts.map +1 -0
- package/dist/extensions/tools/index.d.ts.map +1 -0
- package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
- package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
- package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
- package/dist/extensions/tools/presets.d.ts.map +1 -0
- package/dist/extensions/tools/schemas.d.ts.map +1 -0
- package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
- package/dist/extensions/tools/team/index.d.ts.map +1 -0
- package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
- package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
- package/dist/extensions/tools/team/projections.d.ts.map +1 -0
- package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
- package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
- package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
- package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
- package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
- package/dist/{tools → extensions/tools}/types.d.ts +4 -3
- package/dist/extensions/tools/types.d.ts.map +1 -0
- package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
- package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
- package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
- package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
- package/dist/hooks/subprocess.d.ts +3 -130
- package/dist/hooks/subprocess.d.ts.map +1 -1
- package/dist/index.d.ts +35 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +381 -379
- package/dist/runtime/history.d.ts +4 -0
- package/dist/runtime/history.d.ts.map +1 -0
- package/dist/runtime/host.d.ts +9 -0
- package/dist/runtime/host.d.ts.map +1 -0
- package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
- package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
- package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
- package/dist/runtime/runtime-builder.d.ts.map +1 -1
- package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
- package/dist/runtime/runtime-host.d.ts.map +1 -0
- package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
- package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
- package/dist/runtime/session-runtime.d.ts +2 -2
- package/dist/runtime/session-runtime.d.ts.map +1 -1
- package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
- package/dist/services/agent-events.d.ts.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/local-runtime-bootstrap.d.ts +41 -0
- package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
- package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
- package/dist/services/providers/local-provider-service.d.ts.map +1 -0
- package/dist/{session → services}/session-artifacts.d.ts +0 -4
- package/dist/services/session-artifacts.d.ts.map +1 -0
- package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
- package/dist/services/session-data.d.ts.map +1 -0
- package/dist/{session → services}/session-telemetry.d.ts +2 -2
- package/dist/services/session-telemetry.d.ts.map +1 -0
- package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
- package/dist/services/storage/file-team-store.d.ts.map +1 -0
- package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
- package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
- package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
- package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
- package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
- package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
- package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
- package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
- package/dist/{storage → services/storage}/team-store.d.ts +1 -1
- package/dist/services/storage/team-store.d.ts.map +1 -0
- package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
- package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
- package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
- package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
- package/dist/services/telemetry/core-events.d.ts.map +1 -0
- package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
- package/dist/services/telemetry/index.d.ts.map +1 -0
- package/dist/{telemetry → services/telemetry}/index.js +6 -6
- package/dist/{session/utils → services}/usage.d.ts +1 -1
- package/dist/services/usage.d.ts.map +1 -0
- package/dist/services/workspace/file-indexer.d.ts.map +1 -0
- package/dist/services/workspace/index.d.ts.map +1 -0
- package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
- package/dist/services/workspace-manifest.d.ts.map +1 -0
- package/dist/session/file-session-service.d.ts +4 -1
- package/dist/session/file-session-service.d.ts.map +1 -1
- package/dist/session/persistence-service.d.ts +8 -6
- package/dist/session/persistence-service.d.ts.map +1 -1
- package/dist/session/rpc-session-service.d.ts +3 -0
- package/dist/session/rpc-session-service.d.ts.map +1 -1
- package/dist/session/session-service.d.ts +8 -9
- package/dist/session/session-service.d.ts.map +1 -1
- package/dist/session/session-team-coordination.d.ts +4 -4
- package/dist/session/session-team-coordination.d.ts.map +1 -1
- package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
- package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
- package/dist/transports/local.d.ts.map +1 -0
- package/dist/transports/rpc.d.ts +51 -0
- package/dist/transports/rpc.d.ts.map +1 -0
- package/dist/transports/runtime-host-support.d.ts +21 -0
- package/dist/transports/runtime-host-support.d.ts.map +1 -0
- package/dist/types/chat-schema.d.ts.map +1 -0
- package/dist/types/config.d.ts +2 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/sessions.d.ts +19 -0
- package/dist/types/sessions.d.ts.map +1 -1
- package/dist/types/storage.d.ts +1 -3
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types.d.ts +7 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -12
- package/src/ClineCore.test.ts +95 -19
- package/src/ClineCore.ts +120 -50
- package/src/auth/cline.ts +1 -1
- package/src/auth/codex.ts +1 -1
- package/src/auth/oca.ts +1 -1
- package/src/extensions/config/agent-config-loader.test.ts +3 -3
- package/src/extensions/config/agent-config-loader.ts +1 -5
- package/src/extensions/config/agent-config-parser.ts +1 -1
- package/src/extensions/config/hooks-config-loader.ts +1 -2
- package/src/extensions/config/index.ts +0 -4
- package/src/extensions/config/user-instruction-config-loader.ts +0 -4
- package/src/extensions/plugin/plugin-config-loader.test.ts +6 -4
- package/src/{tools → extensions/tools}/definitions.ts +1 -1
- package/src/extensions/tools/executors/file-read.test.ts +125 -0
- package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
- package/src/{tools → extensions/tools}/executors/search.ts +1 -1
- package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
- package/src/{tools → extensions/tools}/presets.ts +2 -3
- package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
- package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
- package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
- package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
- package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
- package/src/{team → extensions/tools/team}/team-tools.test.ts +43 -31
- package/src/{team → extensions/tools/team}/team-tools.ts +63 -53
- package/src/{tools → extensions/tools}/types.ts +5 -3
- package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
- package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
- package/src/hooks/subprocess.ts +48 -257
- package/src/index.ts +167 -158
- package/src/runtime/history.test.ts +114 -0
- package/src/runtime/history.ts +237 -0
- package/src/runtime/host.test.ts +230 -0
- package/src/runtime/host.ts +362 -0
- package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
- package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
- package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
- package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
- package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
- package/src/runtime/runtime-builder.test.ts +3 -4
- package/src/runtime/runtime-builder.ts +13 -21
- package/src/runtime/runtime-host.ts +178 -0
- package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
- package/src/runtime/runtime-parity.test.ts +1 -1
- package/src/runtime/session-runtime.ts +2 -2
- package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
- package/src/services/config.ts +5 -0
- package/src/services/local-runtime-bootstrap.ts +280 -0
- package/src/{providers → services/providers}/local-provider-service.ts +4 -4
- package/src/{session → services}/session-artifacts.ts +7 -19
- package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
- package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
- package/src/{session → services}/session-telemetry.ts +7 -9
- package/src/services/storage/artifact-store.ts +1 -0
- package/src/{storage → services/storage}/file-team-store.ts +2 -2
- package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
- package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
- package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
- package/src/services/storage/session-store.ts +1 -0
- package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
- package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
- package/src/{storage → services/storage}/team-store.ts +1 -1
- package/src/{session/utils → services}/usage.ts +1 -1
- package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
- package/src/{input → services/workspace}/file-indexer.ts +26 -2
- package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
- package/src/{input → services/workspace}/mention-enricher.ts +1 -1
- package/src/session/file-session-service.ts +9 -7
- package/src/session/index.ts +25 -17
- package/src/session/persistence-service.test.ts +86 -27
- package/src/session/persistence-service.ts +104 -103
- package/src/session/rpc-session-service.ts +9 -2
- package/src/session/session-service.team-persistence.test.ts +1 -1
- package/src/session/session-service.ts +32 -19
- package/src/session/session-team-coordination.ts +13 -6
- package/src/session/sqlite-rpc-session-backend.ts +4 -6
- package/src/session/workspace-manager.ts +1 -1
- package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
- package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
- package/src/{session/default-session-manager.ts → transports/local.ts} +137 -169
- package/src/transports/rpc.test.ts +82 -0
- package/src/transports/rpc.ts +665 -0
- package/src/transports/runtime-host-support.ts +86 -0
- package/src/types/config.ts +2 -2
- package/src/{session/utils/types.ts → types/session.ts} +18 -5
- package/src/types/sessions.ts +21 -0
- package/src/types/storage.ts +1 -6
- package/src/types.ts +25 -18
- package/dist/chat/chat-schema.d.ts.map +0 -1
- package/dist/input/file-indexer.d.ts.map +0 -1
- package/dist/input/index.d.ts.map +0 -1
- package/dist/input/mention-enricher.d.ts.map +0 -1
- package/dist/prompt/default-system.d.ts +0 -2
- package/dist/prompt/default-system.d.ts.map +0 -1
- package/dist/providers/local-provider-registry.d.ts.map +0 -1
- package/dist/providers/local-provider-service.d.ts.map +0 -1
- package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
- package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
- package/dist/session/default-session-manager.d.ts.map +0 -1
- package/dist/session/session-agent-events.d.ts.map +0 -1
- package/dist/session/session-artifacts.d.ts.map +0 -1
- package/dist/session/session-config-builder.d.ts +0 -16
- package/dist/session/session-config-builder.d.ts.map +0 -1
- package/dist/session/session-host.d.ts +0 -15
- package/dist/session/session-host.d.ts.map +0 -1
- package/dist/session/session-manager.d.ts.map +0 -1
- package/dist/session/session-telemetry.d.ts.map +0 -1
- package/dist/session/utils/helpers.d.ts.map +0 -1
- package/dist/session/utils/types.d.ts.map +0 -1
- package/dist/session/utils/usage.d.ts.map +0 -1
- package/dist/session/workspace-manifest.d.ts.map +0 -1
- package/dist/storage/file-team-store.d.ts.map +0 -1
- package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
- package/dist/storage/provider-settings-manager.d.ts.map +0 -1
- package/dist/storage/sqlite-session-store.d.ts.map +0 -1
- package/dist/storage/sqlite-team-store.d.ts.map +0 -1
- package/dist/storage/team-store.d.ts.map +0 -1
- package/dist/team/delegated-agent.d.ts.map +0 -1
- package/dist/team/index.d.ts.map +0 -1
- package/dist/team/multi-agent.d.ts.map +0 -1
- package/dist/team/projections.d.ts.map +0 -1
- package/dist/team/runtime.d.ts.map +0 -1
- package/dist/team/spawn-agent-tool.d.ts.map +0 -1
- package/dist/team/subagent-prompts.d.ts.map +0 -1
- package/dist/team/team-tools.d.ts.map +0 -1
- package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
- package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
- package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
- package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
- package/dist/telemetry/TelemetryService.d.ts.map +0 -1
- package/dist/telemetry/core-events.d.ts.map +0 -1
- package/dist/telemetry/distinct-id.d.ts.map +0 -1
- package/dist/telemetry/index.d.ts.map +0 -1
- package/dist/tools/constants.d.ts.map +0 -1
- package/dist/tools/definitions.d.ts.map +0 -1
- package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
- package/dist/tools/executors/apply-patch.d.ts.map +0 -1
- package/dist/tools/executors/bash.d.ts.map +0 -1
- package/dist/tools/executors/editor.d.ts.map +0 -1
- package/dist/tools/executors/file-read.d.ts.map +0 -1
- package/dist/tools/executors/index.d.ts.map +0 -1
- package/dist/tools/executors/search.d.ts.map +0 -1
- package/dist/tools/executors/web-fetch.d.ts.map +0 -1
- package/dist/tools/helpers.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/model-tool-routing.d.ts.map +0 -1
- package/dist/tools/presets.d.ts.map +0 -1
- package/dist/tools/schemas.d.ts.map +0 -1
- package/dist/tools/types.d.ts.map +0 -1
- package/src/prompt/default-system.ts +0 -21
- package/src/session/session-config-builder.ts +0 -172
- package/src/session/session-host.test.ts +0 -89
- package/src/session/session-host.ts +0 -213
- package/src/session/session-manager.ts +0 -74
- package/src/storage/artifact-store.ts +0 -1
- package/src/storage/session-store.ts +0 -1
- package/src/team/multi-agent.lifecycle.test.ts +0 -201
- package/src/tools/executors/file-read.test.ts +0 -49
- /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
- /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
- /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
- /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
- /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
- /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
- /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
- /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
- /package/dist/{input → services/workspace}/index.d.ts +0 -0
- /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
- /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
- /package/dist/{chat → types}/chat-schema.d.ts +0 -0
- /package/src/{tools → extensions/tools}/constants.ts +0 -0
- /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
- /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
- /package/src/{tools → extensions/tools}/helpers.ts +0 -0
- /package/src/{tools → extensions/tools}/index.ts +0 -0
- /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
- /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
- /package/src/{tools → extensions/tools}/schemas.ts +0 -0
- /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
- /package/src/{team → extensions/tools/team}/index.ts +0 -0
- /package/src/{team → extensions/tools/team}/projections.ts +0 -0
- /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
- /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
- /package/src/{runtime → hooks}/hook-file-hooks.test.ts +0 -0
- /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
- /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
- /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
- /package/src/{storage → services/storage}/index.ts +0 -0
- /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
- /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
- /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
- /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
- /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
- /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
- /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
- /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
- /package/src/{telemetry → services/telemetry}/index.ts +0 -0
- /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
- /package/src/{input → services/workspace}/index.ts +0 -0
- /package/src/{session → services}/workspace-manifest.ts +0 -0
- /package/src/{chat → types}/chat-schema.ts +0 -0
|
@@ -5,11 +5,15 @@ import { join } from "node:path";
|
|
|
5
5
|
import type { AgentResult } from "@clinebot/shared";
|
|
6
6
|
import { setClineDir, setHomeDir } from "@clinebot/shared/storage";
|
|
7
7
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
type StartSessionInput,
|
|
10
|
+
splitCoreSessionConfig,
|
|
11
|
+
} from "../runtime/runtime-host";
|
|
12
|
+
import { TelemetryService } from "../services/telemetry/TelemetryService";
|
|
13
|
+
import type { SessionManifest } from "../session/session-manifest";
|
|
9
14
|
import { SessionSource } from "../types/common";
|
|
10
15
|
import type { CoreSessionConfig } from "../types/config";
|
|
11
|
-
import {
|
|
12
|
-
import type { SessionManifest } from "./session-manifest";
|
|
16
|
+
import { LocalRuntimeHost as RuntimeHostUnderTest } from "./local";
|
|
13
17
|
|
|
14
18
|
const distinctId = "test-machine-id";
|
|
15
19
|
|
|
@@ -68,7 +72,7 @@ type PluginEventTestHarness = {
|
|
|
68
72
|
};
|
|
69
73
|
|
|
70
74
|
function createPluginEventHarness(
|
|
71
|
-
manager:
|
|
75
|
+
manager: RuntimeHostUnderTest,
|
|
72
76
|
): PluginEventTestHarness {
|
|
73
77
|
const target = manager as object;
|
|
74
78
|
return {
|
|
@@ -120,6 +124,7 @@ function createConfig(
|
|
|
120
124
|
modelId: "mock-model",
|
|
121
125
|
cwd: "/tmp/project",
|
|
122
126
|
systemPrompt: "You are a test agent",
|
|
127
|
+
mode: "act",
|
|
123
128
|
enableTools: true,
|
|
124
129
|
enableSpawnAgent: true,
|
|
125
130
|
enableAgentTeams: true,
|
|
@@ -127,6 +132,18 @@ function createConfig(
|
|
|
127
132
|
};
|
|
128
133
|
}
|
|
129
134
|
|
|
135
|
+
function normalizeStartInput(
|
|
136
|
+
input: Omit<StartSessionInput, "config" | "localRuntime"> & {
|
|
137
|
+
config: CoreSessionConfig;
|
|
138
|
+
},
|
|
139
|
+
): StartSessionInput {
|
|
140
|
+
const split = splitCoreSessionConfig(input.config);
|
|
141
|
+
return {
|
|
142
|
+
...input,
|
|
143
|
+
...split,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
130
147
|
function createGitRepo(cwd: string): void {
|
|
131
148
|
execFileSync("git", ["-C", cwd, "init"], { stdio: "pipe" });
|
|
132
149
|
execFileSync("git", ["-C", cwd, "config", "user.name", "Codex Test"], {
|
|
@@ -146,7 +163,7 @@ function createGitRepo(cwd: string): void {
|
|
|
146
163
|
});
|
|
147
164
|
}
|
|
148
165
|
|
|
149
|
-
describe("
|
|
166
|
+
describe("LocalRuntimeHost", () => {
|
|
150
167
|
const envSnapshot = {
|
|
151
168
|
HOME: process.env.HOME,
|
|
152
169
|
CLINE_DIR: process.env.CLINE_DIR,
|
|
@@ -191,8 +208,6 @@ describe("DefaultSessionManager", () => {
|
|
|
191
208
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
192
209
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
193
210
|
manifestPath: "/tmp/manifest.json",
|
|
194
|
-
transcriptPath: "/tmp/transcript.log",
|
|
195
|
-
hookPath: "/tmp/hook.log",
|
|
196
211
|
messagesPath: "/tmp/messages.json",
|
|
197
212
|
manifest,
|
|
198
213
|
}),
|
|
@@ -225,7 +240,7 @@ describe("DefaultSessionManager", () => {
|
|
|
225
240
|
abort: vi.fn(),
|
|
226
241
|
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
227
242
|
};
|
|
228
|
-
const manager = new
|
|
243
|
+
const manager = new RuntimeHostUnderTest({
|
|
229
244
|
distinctId,
|
|
230
245
|
sessionService: sessionService as never,
|
|
231
246
|
runtimeBuilder: runtimeBuilder as never,
|
|
@@ -233,10 +248,12 @@ describe("DefaultSessionManager", () => {
|
|
|
233
248
|
telemetry,
|
|
234
249
|
});
|
|
235
250
|
|
|
236
|
-
await manager.start(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
251
|
+
await manager.start(
|
|
252
|
+
normalizeStartInput({
|
|
253
|
+
config: createConfig({ telemetry, sessionId }),
|
|
254
|
+
prompt: "hello",
|
|
255
|
+
}),
|
|
256
|
+
);
|
|
240
257
|
|
|
241
258
|
expect(adapter.emit).toHaveBeenCalledWith(
|
|
242
259
|
"session.started",
|
|
@@ -281,8 +298,6 @@ describe("DefaultSessionManager", () => {
|
|
|
281
298
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
282
299
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
283
300
|
manifestPath: "/tmp/manifest.json",
|
|
284
|
-
transcriptPath: "/tmp/transcript.log",
|
|
285
|
-
hookPath: "/tmp/hook.log",
|
|
286
301
|
messagesPath: "/tmp/messages.json",
|
|
287
302
|
manifest,
|
|
288
303
|
}),
|
|
@@ -312,18 +327,20 @@ describe("DefaultSessionManager", () => {
|
|
|
312
327
|
abort: vi.fn(),
|
|
313
328
|
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
314
329
|
};
|
|
315
|
-
const manager = new
|
|
330
|
+
const manager = new RuntimeHostUnderTest({
|
|
316
331
|
distinctId,
|
|
317
332
|
sessionService: sessionService as never,
|
|
318
333
|
runtimeBuilder: runtimeBuilder as never,
|
|
319
334
|
createAgent: () => agent as never,
|
|
320
335
|
});
|
|
321
336
|
|
|
322
|
-
const started = await manager.start(
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
337
|
+
const started = await manager.start(
|
|
338
|
+
normalizeStartInput({
|
|
339
|
+
source: "kanban",
|
|
340
|
+
config: createConfig({ sessionId }),
|
|
341
|
+
prompt: "hello",
|
|
342
|
+
}),
|
|
343
|
+
);
|
|
327
344
|
|
|
328
345
|
expect(sessionService.createRootSessionWithArtifacts).toHaveBeenCalledWith(
|
|
329
346
|
expect.objectContaining({
|
|
@@ -341,8 +358,6 @@ describe("DefaultSessionManager", () => {
|
|
|
341
358
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
342
359
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
343
360
|
manifestPath: "/tmp/manifest.json",
|
|
344
|
-
transcriptPath: "/tmp/transcript.log",
|
|
345
|
-
hookPath: "/tmp/hook.log",
|
|
346
361
|
messagesPath: "/tmp/messages.json",
|
|
347
362
|
manifest,
|
|
348
363
|
}),
|
|
@@ -378,8 +393,6 @@ describe("DefaultSessionManager", () => {
|
|
|
378
393
|
isSubagent: false,
|
|
379
394
|
prompt: null,
|
|
380
395
|
metadata: null,
|
|
381
|
-
transcriptPath: "/tmp/transcript.log",
|
|
382
|
-
hookPath: "/tmp/hook.log",
|
|
383
396
|
messagesPath: "/tmp/messages.json",
|
|
384
397
|
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
385
398
|
},
|
|
@@ -406,16 +419,18 @@ describe("DefaultSessionManager", () => {
|
|
|
406
419
|
abort: vi.fn(),
|
|
407
420
|
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
408
421
|
};
|
|
409
|
-
const manager = new
|
|
422
|
+
const manager = new RuntimeHostUnderTest({
|
|
410
423
|
distinctId,
|
|
411
424
|
sessionService: sessionService as never,
|
|
412
425
|
runtimeBuilder: runtimeBuilder as never,
|
|
413
426
|
createAgent: () => agent as never,
|
|
414
427
|
});
|
|
415
428
|
|
|
416
|
-
await manager.start(
|
|
417
|
-
|
|
418
|
-
|
|
429
|
+
await manager.start(
|
|
430
|
+
normalizeStartInput({
|
|
431
|
+
config: createConfig({ sessionId, teamName: undefined }),
|
|
432
|
+
}),
|
|
433
|
+
);
|
|
419
434
|
|
|
420
435
|
expect(runtimeBuilder.build).toHaveBeenCalledWith(
|
|
421
436
|
expect.objectContaining({
|
|
@@ -435,8 +450,6 @@ describe("DefaultSessionManager", () => {
|
|
|
435
450
|
const manifest = createManifest(sessionId);
|
|
436
451
|
const createRootSessionWithArtifacts = vi.fn().mockResolvedValue({
|
|
437
452
|
manifestPath: "/tmp/manifest.json",
|
|
438
|
-
transcriptPath: "/tmp/transcript.log",
|
|
439
|
-
hookPath: "/tmp/hook.log",
|
|
440
453
|
messagesPath: "/tmp/messages.json",
|
|
441
454
|
manifest,
|
|
442
455
|
});
|
|
@@ -482,18 +495,20 @@ describe("DefaultSessionManager", () => {
|
|
|
482
495
|
messages: [],
|
|
483
496
|
};
|
|
484
497
|
|
|
485
|
-
const manager = new
|
|
498
|
+
const manager = new RuntimeHostUnderTest({
|
|
486
499
|
distinctId,
|
|
487
500
|
sessionService: sessionService as never,
|
|
488
501
|
runtimeBuilder,
|
|
489
502
|
createAgent: () => agent as never,
|
|
490
503
|
});
|
|
491
504
|
|
|
492
|
-
const started = await manager.start(
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
505
|
+
const started = await manager.start(
|
|
506
|
+
normalizeStartInput({
|
|
507
|
+
config: createConfig({ sessionId }),
|
|
508
|
+
prompt: "hello",
|
|
509
|
+
interactive: false,
|
|
510
|
+
}),
|
|
511
|
+
);
|
|
497
512
|
|
|
498
513
|
expect(started.sessionId).toBe(sessionId);
|
|
499
514
|
expect(started.result?.finishReason).toBe("completed");
|
|
@@ -528,8 +543,6 @@ describe("DefaultSessionManager", () => {
|
|
|
528
543
|
};
|
|
529
544
|
const createRootSessionWithArtifacts = vi.fn().mockResolvedValue({
|
|
530
545
|
manifestPath: "/tmp/manifest-history-meta.json",
|
|
531
|
-
transcriptPath: "/tmp/transcript-history-meta.log",
|
|
532
|
-
hookPath: "/tmp/hook-history-meta.log",
|
|
533
546
|
messagesPath: "/tmp/messages-history-meta.json",
|
|
534
547
|
manifest: { ...storedManifest },
|
|
535
548
|
});
|
|
@@ -591,18 +604,20 @@ describe("DefaultSessionManager", () => {
|
|
|
591
604
|
messages: [],
|
|
592
605
|
};
|
|
593
606
|
|
|
594
|
-
const manager = new
|
|
607
|
+
const manager = new RuntimeHostUnderTest({
|
|
595
608
|
distinctId,
|
|
596
609
|
sessionService: sessionService as never,
|
|
597
610
|
runtimeBuilder,
|
|
598
611
|
createAgent: () => agent as never,
|
|
599
612
|
});
|
|
600
613
|
|
|
601
|
-
await manager.start(
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
614
|
+
await manager.start(
|
|
615
|
+
normalizeStartInput({
|
|
616
|
+
config: createConfig({ sessionId }),
|
|
617
|
+
prompt: "hello",
|
|
618
|
+
interactive: false,
|
|
619
|
+
}),
|
|
620
|
+
);
|
|
606
621
|
|
|
607
622
|
expect(updateSession).toHaveBeenCalledWith({
|
|
608
623
|
sessionId,
|
|
@@ -657,8 +672,6 @@ describe("DefaultSessionManager", () => {
|
|
|
657
672
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
658
673
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
659
674
|
manifestPath: "/tmp/manifest-checkpoint-default-off.json",
|
|
660
|
-
transcriptPath: "/tmp/transcript-checkpoint-default-off.log",
|
|
661
|
-
hookPath: "/tmp/hook-checkpoint-default-off.log",
|
|
662
675
|
messagesPath: "/tmp/messages-checkpoint-default-off.json",
|
|
663
676
|
manifest,
|
|
664
677
|
}),
|
|
@@ -689,7 +702,7 @@ describe("DefaultSessionManager", () => {
|
|
|
689
702
|
};
|
|
690
703
|
}),
|
|
691
704
|
};
|
|
692
|
-
const manager = new
|
|
705
|
+
const manager = new RuntimeHostUnderTest({
|
|
693
706
|
distinctId,
|
|
694
707
|
sessionService: sessionService as never,
|
|
695
708
|
runtimeBuilder,
|
|
@@ -720,11 +733,13 @@ describe("DefaultSessionManager", () => {
|
|
|
720
733
|
}) as never,
|
|
721
734
|
});
|
|
722
735
|
|
|
723
|
-
await manager.start(
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
736
|
+
await manager.start(
|
|
737
|
+
normalizeStartInput({
|
|
738
|
+
config: createConfig({ sessionId }),
|
|
739
|
+
prompt: "hello",
|
|
740
|
+
interactive: false,
|
|
741
|
+
}),
|
|
742
|
+
);
|
|
728
743
|
expect(updateSession).toHaveBeenCalledTimes(1);
|
|
729
744
|
expect(updateSession).toHaveBeenLastCalledWith({
|
|
730
745
|
sessionId,
|
|
@@ -744,8 +759,6 @@ describe("DefaultSessionManager", () => {
|
|
|
744
759
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
745
760
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
746
761
|
manifestPath: "/tmp/manifest-checkpoint-env-on.json",
|
|
747
|
-
transcriptPath: "/tmp/transcript-checkpoint-env-on.log",
|
|
748
|
-
hookPath: "/tmp/hook-checkpoint-env-on.log",
|
|
749
762
|
messagesPath: "/tmp/messages-checkpoint-env-on.json",
|
|
750
763
|
manifest,
|
|
751
764
|
}),
|
|
@@ -776,7 +789,7 @@ describe("DefaultSessionManager", () => {
|
|
|
776
789
|
};
|
|
777
790
|
}),
|
|
778
791
|
};
|
|
779
|
-
const manager = new
|
|
792
|
+
const manager = new RuntimeHostUnderTest({
|
|
780
793
|
distinctId,
|
|
781
794
|
sessionService: sessionService as never,
|
|
782
795
|
runtimeBuilder,
|
|
@@ -807,14 +820,16 @@ describe("DefaultSessionManager", () => {
|
|
|
807
820
|
}) as never,
|
|
808
821
|
});
|
|
809
822
|
|
|
810
|
-
await manager.start(
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
823
|
+
await manager.start(
|
|
824
|
+
normalizeStartInput({
|
|
825
|
+
config: {
|
|
826
|
+
...createConfig({ sessionId, cwd: repoCwd }),
|
|
827
|
+
checkpoint: { enabled: true },
|
|
828
|
+
},
|
|
829
|
+
prompt: "hello",
|
|
830
|
+
interactive: false,
|
|
831
|
+
}),
|
|
832
|
+
);
|
|
818
833
|
expect(updateSession).toHaveBeenCalledTimes(2);
|
|
819
834
|
expect(updateSession).toHaveBeenNthCalledWith(1, {
|
|
820
835
|
sessionId,
|
|
@@ -843,8 +858,6 @@ describe("DefaultSessionManager", () => {
|
|
|
843
858
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
844
859
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
845
860
|
manifestPath: "/tmp/manifest-meta.json",
|
|
846
|
-
transcriptPath: "/tmp/transcript-meta.log",
|
|
847
|
-
hookPath: "/tmp/hook-meta.log",
|
|
848
861
|
messagesPath: "/tmp/messages-meta.json",
|
|
849
862
|
manifest,
|
|
850
863
|
}),
|
|
@@ -890,7 +903,7 @@ describe("DefaultSessionManager", () => {
|
|
|
890
903
|
],
|
|
891
904
|
}),
|
|
892
905
|
);
|
|
893
|
-
const manager = new
|
|
906
|
+
const manager = new RuntimeHostUnderTest({
|
|
894
907
|
distinctId,
|
|
895
908
|
sessionService: sessionService as never,
|
|
896
909
|
runtimeBuilder,
|
|
@@ -905,15 +918,17 @@ describe("DefaultSessionManager", () => {
|
|
|
905
918
|
}) as never,
|
|
906
919
|
});
|
|
907
920
|
|
|
908
|
-
await manager.start(
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
921
|
+
await manager.start(
|
|
922
|
+
normalizeStartInput({
|
|
923
|
+
config: createConfig({
|
|
924
|
+
sessionId,
|
|
925
|
+
providerId: "anthropic",
|
|
926
|
+
modelId: "claude-sonnet-4-6",
|
|
927
|
+
}),
|
|
928
|
+
prompt: "hello",
|
|
929
|
+
interactive: false,
|
|
913
930
|
}),
|
|
914
|
-
|
|
915
|
-
interactive: false,
|
|
916
|
-
});
|
|
931
|
+
);
|
|
917
932
|
|
|
918
933
|
expect(persistSessionMessages).toHaveBeenCalledTimes(1);
|
|
919
934
|
const persisted = persistSessionMessages.mock.calls[0]?.[1];
|
|
@@ -943,8 +958,6 @@ describe("DefaultSessionManager", () => {
|
|
|
943
958
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
944
959
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
945
960
|
manifestPath: "/tmp/manifest.json",
|
|
946
|
-
transcriptPath: "/tmp/transcript.log",
|
|
947
|
-
hookPath: "/tmp/hook.log",
|
|
948
961
|
messagesPath: "/tmp/messages.json",
|
|
949
962
|
manifest,
|
|
950
963
|
}),
|
|
@@ -1001,18 +1014,20 @@ describe("DefaultSessionManager", () => {
|
|
|
1001
1014
|
canStartRun: vi.fn().mockReturnValue(true),
|
|
1002
1015
|
};
|
|
1003
1016
|
|
|
1004
|
-
const manager = new
|
|
1017
|
+
const manager = new RuntimeHostUnderTest({
|
|
1005
1018
|
distinctId,
|
|
1006
1019
|
sessionService: sessionService as never,
|
|
1007
1020
|
runtimeBuilder,
|
|
1008
1021
|
createAgent: () => agent as never,
|
|
1009
1022
|
});
|
|
1010
1023
|
|
|
1011
|
-
await manager.start(
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1024
|
+
await manager.start(
|
|
1025
|
+
normalizeStartInput({
|
|
1026
|
+
config: createConfig({ sessionId }),
|
|
1027
|
+
prompt: "hello",
|
|
1028
|
+
interactive: true,
|
|
1029
|
+
}),
|
|
1030
|
+
);
|
|
1016
1031
|
|
|
1017
1032
|
const harness = createPluginEventHarness(manager);
|
|
1018
1033
|
await harness.handlePluginEvent(sessionId, {
|
|
@@ -1036,8 +1051,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1036
1051
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1037
1052
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1038
1053
|
manifestPath: "/tmp/manifest.json",
|
|
1039
|
-
transcriptPath: "/tmp/transcript.log",
|
|
1040
|
-
hookPath: "/tmp/hook.log",
|
|
1041
1054
|
messagesPath: "/tmp/messages.json",
|
|
1042
1055
|
manifest,
|
|
1043
1056
|
}),
|
|
@@ -1071,18 +1084,20 @@ describe("DefaultSessionManager", () => {
|
|
|
1071
1084
|
canStartRun: vi.fn().mockReturnValue(false),
|
|
1072
1085
|
};
|
|
1073
1086
|
|
|
1074
|
-
const manager = new
|
|
1087
|
+
const manager = new RuntimeHostUnderTest({
|
|
1075
1088
|
distinctId,
|
|
1076
1089
|
sessionService: sessionService as never,
|
|
1077
1090
|
runtimeBuilder,
|
|
1078
1091
|
createAgent: () => agent as never,
|
|
1079
1092
|
});
|
|
1080
1093
|
|
|
1081
|
-
await manager.start(
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1094
|
+
await manager.start(
|
|
1095
|
+
normalizeStartInput({
|
|
1096
|
+
config: createConfig({ sessionId }),
|
|
1097
|
+
prompt: "hello",
|
|
1098
|
+
interactive: true,
|
|
1099
|
+
}),
|
|
1100
|
+
);
|
|
1086
1101
|
|
|
1087
1102
|
const harness = createPluginEventHarness(manager);
|
|
1088
1103
|
|
|
@@ -1105,6 +1120,75 @@ describe("DefaultSessionManager", () => {
|
|
|
1105
1120
|
]);
|
|
1106
1121
|
});
|
|
1107
1122
|
|
|
1123
|
+
it("drops and ignores queued prompts once a session is aborting", async () => {
|
|
1124
|
+
const sessionId = "sess-abort-pending";
|
|
1125
|
+
const manifest = createManifest(sessionId);
|
|
1126
|
+
const sessionService = {
|
|
1127
|
+
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1128
|
+
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1129
|
+
manifestPath: "/tmp/manifest.json",
|
|
1130
|
+
messagesPath: "/tmp/messages.json",
|
|
1131
|
+
manifest,
|
|
1132
|
+
}),
|
|
1133
|
+
persistSessionMessages: vi.fn(),
|
|
1134
|
+
updateSessionStatus: vi.fn().mockResolvedValue({
|
|
1135
|
+
updated: true,
|
|
1136
|
+
endedAt: "2026-01-01T00:00:05.000Z",
|
|
1137
|
+
}),
|
|
1138
|
+
writeSessionManifest: vi.fn(),
|
|
1139
|
+
listSessions: vi.fn().mockResolvedValue([]),
|
|
1140
|
+
deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
|
|
1141
|
+
};
|
|
1142
|
+
const runtimeBuilder = {
|
|
1143
|
+
build: vi.fn().mockReturnValue({
|
|
1144
|
+
tools: [],
|
|
1145
|
+
shutdown: vi.fn(),
|
|
1146
|
+
}),
|
|
1147
|
+
};
|
|
1148
|
+
const agent = {
|
|
1149
|
+
run: vi.fn().mockResolvedValue(createResult()),
|
|
1150
|
+
continue: vi.fn().mockResolvedValue(createResult()),
|
|
1151
|
+
abort: vi.fn(),
|
|
1152
|
+
shutdown: vi.fn().mockResolvedValue(undefined),
|
|
1153
|
+
getMessages: vi.fn().mockReturnValue([]),
|
|
1154
|
+
canStartRun: vi.fn().mockReturnValue(false),
|
|
1155
|
+
};
|
|
1156
|
+
|
|
1157
|
+
const manager = new RuntimeHostUnderTest({
|
|
1158
|
+
distinctId,
|
|
1159
|
+
sessionService: sessionService as never,
|
|
1160
|
+
runtimeBuilder,
|
|
1161
|
+
createAgent: () => agent as never,
|
|
1162
|
+
});
|
|
1163
|
+
|
|
1164
|
+
await manager.start(
|
|
1165
|
+
normalizeStartInput({
|
|
1166
|
+
config: createConfig({ sessionId }),
|
|
1167
|
+
prompt: "hello",
|
|
1168
|
+
interactive: true,
|
|
1169
|
+
}),
|
|
1170
|
+
);
|
|
1171
|
+
|
|
1172
|
+
const harness = createPluginEventHarness(manager);
|
|
1173
|
+
await harness.handlePluginEvent(sessionId, {
|
|
1174
|
+
name: "queue_message",
|
|
1175
|
+
payload: { prompt: "queued before abort" },
|
|
1176
|
+
});
|
|
1177
|
+
expect(harness.getPendingPrompts(sessionId)).toEqual([
|
|
1178
|
+
{ prompt: "queued before abort", delivery: "queue" },
|
|
1179
|
+
]);
|
|
1180
|
+
|
|
1181
|
+
await manager.abort(sessionId, new Error("test abort"));
|
|
1182
|
+
expect(agent.abort).toHaveBeenCalledTimes(1);
|
|
1183
|
+
expect(harness.getPendingPrompts(sessionId)).toEqual([]);
|
|
1184
|
+
|
|
1185
|
+
await harness.handlePluginEvent(sessionId, {
|
|
1186
|
+
name: "queue_message",
|
|
1187
|
+
payload: { prompt: "queued after abort" },
|
|
1188
|
+
});
|
|
1189
|
+
expect(harness.getPendingPrompts(sessionId)).toEqual([]);
|
|
1190
|
+
});
|
|
1191
|
+
|
|
1108
1192
|
it("preserves per-turn metadata on prior assistant messages across turns", async () => {
|
|
1109
1193
|
const sessionId = "sess-meta-multi";
|
|
1110
1194
|
const manifest = createManifest(sessionId);
|
|
@@ -1183,8 +1267,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1183
1267
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1184
1268
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1185
1269
|
manifestPath: "/tmp/manifest-meta-multi.json",
|
|
1186
|
-
transcriptPath: "/tmp/transcript-meta-multi.log",
|
|
1187
|
-
hookPath: "/tmp/hook-meta-multi.log",
|
|
1188
1270
|
messagesPath: "/tmp/messages-meta-multi.json",
|
|
1189
1271
|
manifest,
|
|
1190
1272
|
}),
|
|
@@ -1194,21 +1276,23 @@ describe("DefaultSessionManager", () => {
|
|
|
1194
1276
|
listSessions: vi.fn().mockResolvedValue([]),
|
|
1195
1277
|
deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
|
|
1196
1278
|
};
|
|
1197
|
-
const manager = new
|
|
1279
|
+
const manager = new RuntimeHostUnderTest({
|
|
1198
1280
|
distinctId,
|
|
1199
1281
|
sessionService: sessionService as never,
|
|
1200
1282
|
runtimeBuilder,
|
|
1201
1283
|
createAgent: () => agent as never,
|
|
1202
1284
|
});
|
|
1203
1285
|
|
|
1204
|
-
await manager.start(
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1286
|
+
await manager.start(
|
|
1287
|
+
normalizeStartInput({
|
|
1288
|
+
config: createConfig({
|
|
1289
|
+
sessionId,
|
|
1290
|
+
providerId: "anthropic",
|
|
1291
|
+
modelId: "claude-sonnet-4-6",
|
|
1292
|
+
}),
|
|
1293
|
+
interactive: true,
|
|
1209
1294
|
}),
|
|
1210
|
-
|
|
1211
|
-
});
|
|
1295
|
+
);
|
|
1212
1296
|
|
|
1213
1297
|
await manager.send({ sessionId, prompt: "hello" });
|
|
1214
1298
|
await manager.send({ sessionId, prompt: "again" });
|
|
@@ -1244,8 +1328,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1244
1328
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1245
1329
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1246
1330
|
manifestPath: "/tmp/manifest-failed-turn.json",
|
|
1247
|
-
transcriptPath: "/tmp/transcript-failed-turn.log",
|
|
1248
|
-
hookPath: "/tmp/hook-failed-turn.log",
|
|
1249
1331
|
messagesPath: "/tmp/messages-failed-turn.json",
|
|
1250
1332
|
manifest,
|
|
1251
1333
|
}),
|
|
@@ -1265,7 +1347,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1265
1347
|
{ role: "user", content: [{ type: "text", text: "hello" }] },
|
|
1266
1348
|
{ role: "assistant", content: [{ type: "text", text: "partial" }] },
|
|
1267
1349
|
];
|
|
1268
|
-
const manager = new
|
|
1350
|
+
const manager = new RuntimeHostUnderTest({
|
|
1269
1351
|
distinctId,
|
|
1270
1352
|
sessionService: sessionService as never,
|
|
1271
1353
|
runtimeBuilder,
|
|
@@ -1285,11 +1367,13 @@ describe("DefaultSessionManager", () => {
|
|
|
1285
1367
|
});
|
|
1286
1368
|
|
|
1287
1369
|
await expect(
|
|
1288
|
-
manager.start(
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1370
|
+
manager.start(
|
|
1371
|
+
normalizeStartInput({
|
|
1372
|
+
config: createConfig({ sessionId }),
|
|
1373
|
+
prompt: "hello",
|
|
1374
|
+
interactive: false,
|
|
1375
|
+
}),
|
|
1376
|
+
),
|
|
1293
1377
|
).rejects.toThrow("boom");
|
|
1294
1378
|
|
|
1295
1379
|
expect(persistSessionMessages).toHaveBeenCalledTimes(1);
|
|
@@ -1312,8 +1396,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1312
1396
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1313
1397
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1314
1398
|
manifestPath: "/tmp/manifest-2.json",
|
|
1315
|
-
transcriptPath: "/tmp/transcript-2.log",
|
|
1316
|
-
hookPath: "/tmp/hook-2.log",
|
|
1317
1399
|
messagesPath: "/tmp/messages-2.json",
|
|
1318
1400
|
manifest,
|
|
1319
1401
|
}),
|
|
@@ -1333,7 +1415,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1333
1415
|
const continueFn = vi
|
|
1334
1416
|
.fn()
|
|
1335
1417
|
.mockResolvedValue(createResult({ text: "second" }));
|
|
1336
|
-
const manager = new
|
|
1418
|
+
const manager = new RuntimeHostUnderTest({
|
|
1337
1419
|
distinctId,
|
|
1338
1420
|
sessionService: sessionService as never,
|
|
1339
1421
|
runtimeBuilder,
|
|
@@ -1348,10 +1430,12 @@ describe("DefaultSessionManager", () => {
|
|
|
1348
1430
|
}) as never,
|
|
1349
1431
|
});
|
|
1350
1432
|
|
|
1351
|
-
await manager.start(
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1433
|
+
await manager.start(
|
|
1434
|
+
normalizeStartInput({
|
|
1435
|
+
config: createConfig({ sessionId }),
|
|
1436
|
+
interactive: true,
|
|
1437
|
+
}),
|
|
1438
|
+
);
|
|
1355
1439
|
const first = await manager.send({ sessionId, prompt: "first" });
|
|
1356
1440
|
const second = await manager.send({ sessionId, prompt: "second" });
|
|
1357
1441
|
|
|
@@ -1369,8 +1453,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1369
1453
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1370
1454
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1371
1455
|
manifestPath: "/tmp/manifest-usage.json",
|
|
1372
|
-
transcriptPath: "/tmp/transcript-usage.log",
|
|
1373
|
-
hookPath: "/tmp/hook-usage.log",
|
|
1374
1456
|
messagesPath: "/tmp/messages-usage.json",
|
|
1375
1457
|
manifest,
|
|
1376
1458
|
}),
|
|
@@ -1410,7 +1492,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1410
1492
|
},
|
|
1411
1493
|
}),
|
|
1412
1494
|
);
|
|
1413
|
-
const manager = new
|
|
1495
|
+
const manager = new RuntimeHostUnderTest({
|
|
1414
1496
|
distinctId,
|
|
1415
1497
|
sessionService: sessionService as never,
|
|
1416
1498
|
runtimeBuilder,
|
|
@@ -1425,10 +1507,12 @@ describe("DefaultSessionManager", () => {
|
|
|
1425
1507
|
}) as never,
|
|
1426
1508
|
});
|
|
1427
1509
|
|
|
1428
|
-
await manager.start(
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1510
|
+
await manager.start(
|
|
1511
|
+
normalizeStartInput({
|
|
1512
|
+
config: createConfig({ sessionId }),
|
|
1513
|
+
interactive: true,
|
|
1514
|
+
}),
|
|
1515
|
+
);
|
|
1432
1516
|
|
|
1433
1517
|
await manager.send({ sessionId, prompt: "first" });
|
|
1434
1518
|
expect(await manager.getAccumulatedUsage(sessionId)).toEqual({
|
|
@@ -1456,8 +1540,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1456
1540
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1457
1541
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1458
1542
|
manifestPath: "/tmp/manifest-queue.json",
|
|
1459
|
-
transcriptPath: "/tmp/transcript-queue.log",
|
|
1460
|
-
hookPath: "/tmp/hook-queue.log",
|
|
1461
1543
|
messagesPath: "/tmp/messages-queue.json",
|
|
1462
1544
|
manifest,
|
|
1463
1545
|
}),
|
|
@@ -1478,7 +1560,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1478
1560
|
const continueFn = vi
|
|
1479
1561
|
.fn()
|
|
1480
1562
|
.mockResolvedValue(createResult({ text: "next" }));
|
|
1481
|
-
const manager = new
|
|
1563
|
+
const manager = new RuntimeHostUnderTest({
|
|
1482
1564
|
distinctId,
|
|
1483
1565
|
sessionService: sessionService as never,
|
|
1484
1566
|
runtimeBuilder,
|
|
@@ -1498,10 +1580,12 @@ describe("DefaultSessionManager", () => {
|
|
|
1498
1580
|
events.push(event);
|
|
1499
1581
|
});
|
|
1500
1582
|
|
|
1501
|
-
await manager.start(
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1583
|
+
await manager.start(
|
|
1584
|
+
normalizeStartInput({
|
|
1585
|
+
config: createConfig({ sessionId }),
|
|
1586
|
+
interactive: true,
|
|
1587
|
+
}),
|
|
1588
|
+
);
|
|
1505
1589
|
|
|
1506
1590
|
await expect(
|
|
1507
1591
|
manager.send({ sessionId, prompt: "queued first", delivery: "queue" }),
|
|
@@ -1556,7 +1640,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1556
1640
|
});
|
|
1557
1641
|
|
|
1558
1642
|
it("returns undefined accumulated usage for unknown sessions", async () => {
|
|
1559
|
-
const manager = new
|
|
1643
|
+
const manager = new RuntimeHostUnderTest({
|
|
1560
1644
|
distinctId,
|
|
1561
1645
|
sessionService: {
|
|
1562
1646
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
@@ -1592,8 +1676,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1592
1676
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1593
1677
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1594
1678
|
manifestPath: "/tmp/manifest-fail.json",
|
|
1595
|
-
transcriptPath: "/tmp/transcript-fail.log",
|
|
1596
|
-
hookPath: "/tmp/hook-fail.log",
|
|
1597
1679
|
messagesPath: "/tmp/messages-fail.json",
|
|
1598
1680
|
manifest,
|
|
1599
1681
|
}),
|
|
@@ -1612,7 +1694,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1612
1694
|
};
|
|
1613
1695
|
const run = vi.fn().mockRejectedValue(new Error("run failed"));
|
|
1614
1696
|
const agentShutdown = vi.fn().mockResolvedValue(undefined);
|
|
1615
|
-
const manager = new
|
|
1697
|
+
const manager = new RuntimeHostUnderTest({
|
|
1616
1698
|
distinctId,
|
|
1617
1699
|
sessionService: sessionService as never,
|
|
1618
1700
|
runtimeBuilder,
|
|
@@ -1628,11 +1710,13 @@ describe("DefaultSessionManager", () => {
|
|
|
1628
1710
|
});
|
|
1629
1711
|
|
|
1630
1712
|
await expect(
|
|
1631
|
-
manager.start(
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1713
|
+
manager.start(
|
|
1714
|
+
normalizeStartInput({
|
|
1715
|
+
config: createConfig({ sessionId }),
|
|
1716
|
+
prompt: "hello",
|
|
1717
|
+
interactive: false,
|
|
1718
|
+
}),
|
|
1719
|
+
),
|
|
1636
1720
|
).rejects.toThrow("run failed");
|
|
1637
1721
|
expect(sessionService.updateSessionStatus).toHaveBeenCalledWith(
|
|
1638
1722
|
sessionId,
|
|
@@ -1661,7 +1745,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1661
1745
|
}),
|
|
1662
1746
|
};
|
|
1663
1747
|
const agentShutdown = vi.fn().mockResolvedValue(undefined);
|
|
1664
|
-
const manager = new
|
|
1748
|
+
const manager = new RuntimeHostUnderTest({
|
|
1665
1749
|
distinctId,
|
|
1666
1750
|
sessionService: sessionService as never,
|
|
1667
1751
|
runtimeBuilder,
|
|
@@ -1676,10 +1760,12 @@ describe("DefaultSessionManager", () => {
|
|
|
1676
1760
|
}) as never,
|
|
1677
1761
|
});
|
|
1678
1762
|
|
|
1679
|
-
const started = await manager.start(
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1763
|
+
const started = await manager.start(
|
|
1764
|
+
normalizeStartInput({
|
|
1765
|
+
config: createConfig({ sessionId: "sess-no-prompt" }),
|
|
1766
|
+
interactive: true,
|
|
1767
|
+
}),
|
|
1768
|
+
);
|
|
1683
1769
|
await manager.stop(started.sessionId);
|
|
1684
1770
|
|
|
1685
1771
|
expect(
|
|
@@ -1697,8 +1783,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1697
1783
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1698
1784
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1699
1785
|
manifestPath: "/tmp/manifest-oauth.json",
|
|
1700
|
-
transcriptPath: "/tmp/transcript-oauth.log",
|
|
1701
|
-
hookPath: "/tmp/hook-oauth.log",
|
|
1702
1786
|
messagesPath: "/tmp/messages-oauth.json",
|
|
1703
1787
|
manifest,
|
|
1704
1788
|
}),
|
|
@@ -1722,7 +1806,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1722
1806
|
};
|
|
1723
1807
|
const run = vi.fn().mockResolvedValue(createResult({ text: "ok" }));
|
|
1724
1808
|
const updateConnection = vi.fn();
|
|
1725
|
-
const manager = new
|
|
1809
|
+
const manager = new RuntimeHostUnderTest({
|
|
1726
1810
|
distinctId,
|
|
1727
1811
|
sessionService: sessionService as never,
|
|
1728
1812
|
runtimeBuilder,
|
|
@@ -1746,14 +1830,16 @@ describe("DefaultSessionManager", () => {
|
|
|
1746
1830
|
}) as never,
|
|
1747
1831
|
});
|
|
1748
1832
|
|
|
1749
|
-
await manager.start(
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1833
|
+
await manager.start(
|
|
1834
|
+
normalizeStartInput({
|
|
1835
|
+
config: createConfig({
|
|
1836
|
+
sessionId,
|
|
1837
|
+
providerId: "openai-codex",
|
|
1838
|
+
apiKey: "oauth-access-old",
|
|
1839
|
+
}),
|
|
1840
|
+
interactive: true,
|
|
1754
1841
|
}),
|
|
1755
|
-
|
|
1756
|
-
});
|
|
1842
|
+
);
|
|
1757
1843
|
await manager.send({ sessionId, prompt: "hello" });
|
|
1758
1844
|
|
|
1759
1845
|
expect(updateConnectionDefaults).toHaveBeenCalledWith({
|
|
@@ -1772,8 +1858,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1772
1858
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1773
1859
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1774
1860
|
manifestPath: "/tmp/manifest-provider-config.json",
|
|
1775
|
-
transcriptPath: "/tmp/transcript-provider-config.log",
|
|
1776
|
-
hookPath: "/tmp/hook-provider-config.log",
|
|
1777
1861
|
messagesPath: "/tmp/messages-provider-config.json",
|
|
1778
1862
|
manifest,
|
|
1779
1863
|
}),
|
|
@@ -1800,7 +1884,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1800
1884
|
getMessages: vi.fn().mockReturnValue([]),
|
|
1801
1885
|
messages: [],
|
|
1802
1886
|
});
|
|
1803
|
-
const manager = new
|
|
1887
|
+
const manager = new RuntimeHostUnderTest({
|
|
1804
1888
|
distinctId,
|
|
1805
1889
|
sessionService: sessionService as never,
|
|
1806
1890
|
runtimeBuilder: {
|
|
@@ -1821,14 +1905,16 @@ describe("DefaultSessionManager", () => {
|
|
|
1821
1905
|
} as never,
|
|
1822
1906
|
});
|
|
1823
1907
|
|
|
1824
|
-
await manager.start(
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1908
|
+
await manager.start(
|
|
1909
|
+
normalizeStartInput({
|
|
1910
|
+
config: createConfig({
|
|
1911
|
+
sessionId,
|
|
1912
|
+
providerId: "vertex",
|
|
1913
|
+
modelId: "claude-sonnet-4@20250514",
|
|
1914
|
+
}),
|
|
1915
|
+
interactive: true,
|
|
1829
1916
|
}),
|
|
1830
|
-
|
|
1831
|
-
});
|
|
1917
|
+
);
|
|
1832
1918
|
await manager.send({ sessionId, prompt: "hello" });
|
|
1833
1919
|
|
|
1834
1920
|
expect(createAgent).toHaveBeenCalledWith(
|
|
@@ -1854,8 +1940,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1854
1940
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1855
1941
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1856
1942
|
manifestPath: "/tmp/manifest-loop.json",
|
|
1857
|
-
transcriptPath: "/tmp/transcript-loop.log",
|
|
1858
|
-
hookPath: "/tmp/hook-loop.log",
|
|
1859
1943
|
messagesPath: "/tmp/messages-loop.json",
|
|
1860
1944
|
manifest,
|
|
1861
1945
|
}),
|
|
@@ -1875,7 +1959,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1875
1959
|
getMessages: vi.fn().mockReturnValue([]),
|
|
1876
1960
|
messages: [],
|
|
1877
1961
|
});
|
|
1878
|
-
const manager = new
|
|
1962
|
+
const manager = new RuntimeHostUnderTest({
|
|
1879
1963
|
distinctId,
|
|
1880
1964
|
sessionService: sessionService as never,
|
|
1881
1965
|
runtimeBuilder: {
|
|
@@ -1887,15 +1971,17 @@ describe("DefaultSessionManager", () => {
|
|
|
1887
1971
|
createAgent: createAgent as never,
|
|
1888
1972
|
});
|
|
1889
1973
|
|
|
1890
|
-
await manager.start(
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1974
|
+
await manager.start(
|
|
1975
|
+
normalizeStartInput({
|
|
1976
|
+
config: createConfig({
|
|
1977
|
+
sessionId,
|
|
1978
|
+
execution: {
|
|
1979
|
+
loopDetection: { softThreshold: 4, hardThreshold: 8 },
|
|
1980
|
+
},
|
|
1981
|
+
}),
|
|
1982
|
+
interactive: true,
|
|
1896
1983
|
}),
|
|
1897
|
-
|
|
1898
|
-
});
|
|
1984
|
+
);
|
|
1899
1985
|
await manager.send({ sessionId, prompt: "test" });
|
|
1900
1986
|
|
|
1901
1987
|
expect(createAgent).toHaveBeenCalledWith(
|
|
@@ -1914,8 +2000,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1914
2000
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1915
2001
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1916
2002
|
manifestPath: "/tmp/manifest-compaction.json",
|
|
1917
|
-
transcriptPath: "/tmp/transcript-compaction.log",
|
|
1918
|
-
hookPath: "/tmp/hook-compaction.log",
|
|
1919
2003
|
messagesPath: "/tmp/messages-compaction.json",
|
|
1920
2004
|
manifest,
|
|
1921
2005
|
}),
|
|
@@ -1936,7 +2020,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1936
2020
|
messages: [],
|
|
1937
2021
|
});
|
|
1938
2022
|
const compact = vi.fn();
|
|
1939
|
-
const manager = new
|
|
2023
|
+
const manager = new RuntimeHostUnderTest({
|
|
1940
2024
|
distinctId,
|
|
1941
2025
|
sessionService: sessionService as never,
|
|
1942
2026
|
runtimeBuilder: {
|
|
@@ -1948,17 +2032,19 @@ describe("DefaultSessionManager", () => {
|
|
|
1948
2032
|
createAgent: createAgent as never,
|
|
1949
2033
|
});
|
|
1950
2034
|
|
|
1951
|
-
await manager.start(
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
2035
|
+
await manager.start(
|
|
2036
|
+
normalizeStartInput({
|
|
2037
|
+
config: createConfig({
|
|
2038
|
+
sessionId,
|
|
2039
|
+
compaction: {
|
|
2040
|
+
enabled: true,
|
|
2041
|
+
strategy: "basic",
|
|
2042
|
+
compact,
|
|
2043
|
+
},
|
|
2044
|
+
}),
|
|
2045
|
+
interactive: true,
|
|
1959
2046
|
}),
|
|
1960
|
-
|
|
1961
|
-
});
|
|
2047
|
+
);
|
|
1962
2048
|
await manager.send({ sessionId, prompt: "test" });
|
|
1963
2049
|
|
|
1964
2050
|
expect(createAgent).toHaveBeenCalledWith(
|
|
@@ -1986,8 +2072,6 @@ describe("DefaultSessionManager", () => {
|
|
|
1986
2072
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
1987
2073
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
1988
2074
|
manifestPath: "/tmp/manifest-format.json",
|
|
1989
|
-
transcriptPath: "/tmp/transcript-format.log",
|
|
1990
|
-
hookPath: "/tmp/hook-format.log",
|
|
1991
2075
|
messagesPath: "/tmp/messages-format.json",
|
|
1992
2076
|
manifest,
|
|
1993
2077
|
}),
|
|
@@ -1998,7 +2082,7 @@ describe("DefaultSessionManager", () => {
|
|
|
1998
2082
|
deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
|
|
1999
2083
|
};
|
|
2000
2084
|
const run = vi.fn().mockResolvedValue(createResult({ text: "ok" }));
|
|
2001
|
-
const manager = new
|
|
2085
|
+
const manager = new RuntimeHostUnderTest({
|
|
2002
2086
|
distinctId,
|
|
2003
2087
|
sessionService: sessionService as never,
|
|
2004
2088
|
runtimeBuilder: {
|
|
@@ -2018,14 +2102,16 @@ describe("DefaultSessionManager", () => {
|
|
|
2018
2102
|
}) as never,
|
|
2019
2103
|
});
|
|
2020
2104
|
|
|
2021
|
-
await manager.start(
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2105
|
+
await manager.start(
|
|
2106
|
+
normalizeStartInput({
|
|
2107
|
+
config: createConfig({
|
|
2108
|
+
sessionId,
|
|
2109
|
+
cwd: join(tempCwd, "docs"),
|
|
2110
|
+
workspaceRoot: tempCwd,
|
|
2111
|
+
}),
|
|
2112
|
+
interactive: true,
|
|
2026
2113
|
}),
|
|
2027
|
-
|
|
2028
|
-
});
|
|
2114
|
+
);
|
|
2029
2115
|
await manager.send({
|
|
2030
2116
|
sessionId,
|
|
2031
2117
|
prompt: '<user_input mode="act">explain @src/app.ts</user_input>',
|
|
@@ -2049,8 +2135,6 @@ describe("DefaultSessionManager", () => {
|
|
|
2049
2135
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
2050
2136
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
2051
2137
|
manifestPath: "/tmp/manifest-oauth-retry.json",
|
|
2052
|
-
transcriptPath: "/tmp/transcript-oauth-retry.log",
|
|
2053
|
-
hookPath: "/tmp/hook-oauth-retry.log",
|
|
2054
2138
|
messagesPath: "/tmp/messages-oauth-retry.json",
|
|
2055
2139
|
manifest,
|
|
2056
2140
|
}),
|
|
@@ -2086,7 +2170,7 @@ describe("DefaultSessionManager", () => {
|
|
|
2086
2170
|
apiKey: "oauth-access-new",
|
|
2087
2171
|
refreshed: true,
|
|
2088
2172
|
});
|
|
2089
|
-
const manager = new
|
|
2173
|
+
const manager = new RuntimeHostUnderTest({
|
|
2090
2174
|
distinctId,
|
|
2091
2175
|
sessionService: sessionService as never,
|
|
2092
2176
|
runtimeBuilder,
|
|
@@ -2106,14 +2190,16 @@ describe("DefaultSessionManager", () => {
|
|
|
2106
2190
|
}) as never,
|
|
2107
2191
|
});
|
|
2108
2192
|
|
|
2109
|
-
await manager.start(
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2193
|
+
await manager.start(
|
|
2194
|
+
normalizeStartInput({
|
|
2195
|
+
config: createConfig({
|
|
2196
|
+
sessionId,
|
|
2197
|
+
providerId: "openai-codex",
|
|
2198
|
+
apiKey: "oauth-access-old",
|
|
2199
|
+
}),
|
|
2200
|
+
interactive: true,
|
|
2114
2201
|
}),
|
|
2115
|
-
|
|
2116
|
-
});
|
|
2202
|
+
);
|
|
2117
2203
|
const result = await manager.send({ sessionId, prompt: "hello" });
|
|
2118
2204
|
|
|
2119
2205
|
expect(result?.text).toBe("retried");
|
|
@@ -2142,8 +2228,6 @@ describe("DefaultSessionManager", () => {
|
|
|
2142
2228
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
2143
2229
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
2144
2230
|
manifestPath: "/tmp/manifest-team-auto-continue.json",
|
|
2145
|
-
transcriptPath: "/tmp/transcript-team-auto-continue.log",
|
|
2146
|
-
hookPath: "/tmp/hook-team-auto-continue.log",
|
|
2147
2231
|
messagesPath: "/tmp/messages-team-auto-continue.json",
|
|
2148
2232
|
manifest,
|
|
2149
2233
|
}),
|
|
@@ -2223,7 +2307,7 @@ describe("DefaultSessionManager", () => {
|
|
|
2223
2307
|
],
|
|
2224
2308
|
}),
|
|
2225
2309
|
);
|
|
2226
|
-
const manager = new
|
|
2310
|
+
const manager = new RuntimeHostUnderTest({
|
|
2227
2311
|
distinctId,
|
|
2228
2312
|
sessionService: sessionService as never,
|
|
2229
2313
|
runtimeBuilder,
|
|
@@ -2238,10 +2322,12 @@ describe("DefaultSessionManager", () => {
|
|
|
2238
2322
|
}) as never,
|
|
2239
2323
|
});
|
|
2240
2324
|
|
|
2241
|
-
await manager.start(
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2325
|
+
await manager.start(
|
|
2326
|
+
normalizeStartInput({
|
|
2327
|
+
config: createConfig({ sessionId }),
|
|
2328
|
+
interactive: false,
|
|
2329
|
+
}),
|
|
2330
|
+
);
|
|
2245
2331
|
const result = await manager.send({
|
|
2246
2332
|
sessionId,
|
|
2247
2333
|
prompt: "run teammate work",
|
|
@@ -2282,8 +2368,6 @@ describe("DefaultSessionManager", () => {
|
|
|
2282
2368
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
2283
2369
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
2284
2370
|
manifestPath: "/tmp/manifest-team-task-failure-messages.json",
|
|
2285
|
-
transcriptPath: "/tmp/transcript-team-task-failure-messages.log",
|
|
2286
|
-
hookPath: "/tmp/hook-team-task-failure-messages.log",
|
|
2287
2371
|
messagesPath: "/tmp/messages-team-task-failure-messages.json",
|
|
2288
2372
|
manifest,
|
|
2289
2373
|
}),
|
|
@@ -2315,7 +2399,7 @@ describe("DefaultSessionManager", () => {
|
|
|
2315
2399
|
{ role: "user", content: [{ type: "text", text: "delegated prompt" }] },
|
|
2316
2400
|
{ role: "assistant", content: [{ type: "text", text: "partial work" }] },
|
|
2317
2401
|
];
|
|
2318
|
-
const manager = new
|
|
2402
|
+
const manager = new RuntimeHostUnderTest({
|
|
2319
2403
|
distinctId,
|
|
2320
2404
|
sessionService: sessionService as never,
|
|
2321
2405
|
runtimeBuilder,
|
|
@@ -2343,11 +2427,13 @@ describe("DefaultSessionManager", () => {
|
|
|
2343
2427
|
}) as never,
|
|
2344
2428
|
});
|
|
2345
2429
|
|
|
2346
|
-
await manager.start(
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2430
|
+
await manager.start(
|
|
2431
|
+
normalizeStartInput({
|
|
2432
|
+
config: createConfig({ sessionId }),
|
|
2433
|
+
prompt: "run teammate work",
|
|
2434
|
+
interactive: false,
|
|
2435
|
+
}),
|
|
2436
|
+
);
|
|
2351
2437
|
|
|
2352
2438
|
expect(sessionService.onTeamTaskStart).toHaveBeenCalledTimes(1);
|
|
2353
2439
|
expect(sessionService.onTeamTaskEnd).toHaveBeenCalledWith(
|
|
@@ -2367,8 +2453,6 @@ describe("DefaultSessionManager", () => {
|
|
|
2367
2453
|
ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
|
|
2368
2454
|
createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
|
|
2369
2455
|
manifestPath: "/tmp/manifest-team-task-progress.json",
|
|
2370
|
-
transcriptPath: "/tmp/transcript-team-task-progress.log",
|
|
2371
|
-
hookPath: "/tmp/hook-team-task-progress.log",
|
|
2372
2456
|
messagesPath: "/tmp/messages-team-task-progress.json",
|
|
2373
2457
|
manifest,
|
|
2374
2458
|
}),
|
|
@@ -2397,7 +2481,7 @@ describe("DefaultSessionManager", () => {
|
|
|
2397
2481
|
),
|
|
2398
2482
|
};
|
|
2399
2483
|
|
|
2400
|
-
const manager = new
|
|
2484
|
+
const manager = new RuntimeHostUnderTest({
|
|
2401
2485
|
distinctId,
|
|
2402
2486
|
sessionService: sessionService as never,
|
|
2403
2487
|
runtimeBuilder,
|
|
@@ -2451,11 +2535,13 @@ describe("DefaultSessionManager", () => {
|
|
|
2451
2535
|
}) as never,
|
|
2452
2536
|
});
|
|
2453
2537
|
|
|
2454
|
-
await manager.start(
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2538
|
+
await manager.start(
|
|
2539
|
+
normalizeStartInput({
|
|
2540
|
+
config: createConfig({ sessionId }),
|
|
2541
|
+
prompt: "run teammate work",
|
|
2542
|
+
interactive: false,
|
|
2543
|
+
}),
|
|
2544
|
+
);
|
|
2459
2545
|
|
|
2460
2546
|
expect(sessionService.onTeamTaskProgress).toHaveBeenCalledWith(
|
|
2461
2547
|
sessionId,
|