@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
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import { writeFileSync } from "node:fs";
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
2
3
|
import type * as LlmsProviders from "@clinebot/llms";
|
|
3
4
|
import type { AgentConfig, AgentEvent, AgentResult } from "@clinebot/shared";
|
|
4
5
|
import { normalizeUserInput } from "@clinebot/shared";
|
|
5
6
|
import { nanoid } from "nanoid";
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import {
|
|
8
|
+
parseSubSessionId,
|
|
9
|
+
parseTeamTaskSubSessionId,
|
|
10
|
+
} from "../session/session-graph";
|
|
9
11
|
import {
|
|
10
12
|
type SessionManifest,
|
|
11
13
|
SessionManifestSchema,
|
|
12
|
-
} from "../session-manifest";
|
|
13
|
-
import type { SessionRow } from "../session-service";
|
|
14
|
-
import type {
|
|
14
|
+
} from "../session/session-manifest";
|
|
15
|
+
import type { SessionRow } from "../session/session-service";
|
|
16
|
+
import type { SessionSource, SessionStatus } from "../types/common";
|
|
17
|
+
import type { StoredMessageWithMetadata } from "../types/session";
|
|
18
|
+
import type { SessionRecord } from "../types/sessions";
|
|
15
19
|
|
|
16
20
|
export function hasRuntimeHooks(hooks: AgentConfig["hooks"]): boolean {
|
|
17
21
|
if (!hooks) {
|
|
@@ -197,15 +201,11 @@ export function toSessionRecord(row: SessionRow): SessionRecord {
|
|
|
197
201
|
isSubagent: row.isSubagent,
|
|
198
202
|
prompt: row.prompt ?? undefined,
|
|
199
203
|
metadata: row.metadata ?? undefined,
|
|
200
|
-
transcriptPath: row.transcriptPath,
|
|
201
|
-
hookPath: row.hookPath,
|
|
202
204
|
messagesPath: row.messagesPath ?? undefined,
|
|
203
205
|
updatedAt: row.updatedAt,
|
|
204
206
|
};
|
|
205
207
|
}
|
|
206
208
|
|
|
207
|
-
// ── Metadata helpers ──────────────────────────────────────────────────
|
|
208
|
-
|
|
209
209
|
const MAX_TITLE_LENGTH = 120;
|
|
210
210
|
|
|
211
211
|
export function normalizeTitle(title?: string | null): string | undefined {
|
|
@@ -251,38 +251,59 @@ export function resolveMetadataWithTitle(input: {
|
|
|
251
251
|
return Object.keys(base).length > 0 ? base : undefined;
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
-
// ── Messages file helpers ─────────────────────────────────────────────
|
|
255
|
-
|
|
256
254
|
export type MessagesFileContext = {
|
|
257
255
|
agent: "lead" | "subagent" | "teammate";
|
|
258
256
|
sessionId: string;
|
|
259
257
|
taskType?: string;
|
|
260
258
|
};
|
|
261
259
|
|
|
262
|
-
export
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
260
|
+
export function resolveMessagesFileContext(
|
|
261
|
+
sessionId: string,
|
|
262
|
+
): MessagesFileContext {
|
|
263
|
+
const teamTaskMatch = parseTeamTaskSubSessionId(sessionId);
|
|
264
|
+
if (teamTaskMatch) {
|
|
265
|
+
return {
|
|
266
|
+
agent: "teammate",
|
|
267
|
+
sessionId: teamTaskMatch.rootSessionId,
|
|
268
|
+
taskType: "team",
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
const subSessionMatch = parseSubSessionId(sessionId);
|
|
272
|
+
if (subSessionMatch) {
|
|
273
|
+
return {
|
|
274
|
+
agent: "subagent",
|
|
275
|
+
sessionId: subSessionMatch.rootSessionId,
|
|
276
|
+
taskType: "subagent_task",
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
agent: "lead",
|
|
281
|
+
sessionId,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
271
284
|
|
|
272
285
|
export function buildMessagesFilePayload(input: {
|
|
273
286
|
updatedAt: string;
|
|
274
287
|
context: MessagesFileContext;
|
|
275
|
-
messages: LlmsProviders.
|
|
288
|
+
messages: LlmsProviders.MessageWithMetadata[];
|
|
276
289
|
systemPrompt?: string;
|
|
277
|
-
}):
|
|
290
|
+
}): {
|
|
291
|
+
version: 1;
|
|
292
|
+
updated_at: string;
|
|
293
|
+
agent: "lead" | "subagent" | "teammate";
|
|
294
|
+
sessionId: string;
|
|
295
|
+
taskType?: string;
|
|
296
|
+
messages: StoredMessageWithMetadata[];
|
|
297
|
+
system_prompt?: string;
|
|
298
|
+
} {
|
|
278
299
|
return {
|
|
279
300
|
version: 1,
|
|
280
301
|
updated_at: input.updatedAt,
|
|
281
302
|
agent: input.context.agent,
|
|
282
303
|
sessionId: input.context.sessionId,
|
|
283
304
|
...(input.context.taskType ? { taskType: input.context.taskType } : {}),
|
|
284
|
-
|
|
285
|
-
|
|
305
|
+
messages: normalizeStoredMessagesForPersistence(input.messages),
|
|
306
|
+
...(input.systemPrompt ? { system_prompt: input.systemPrompt } : {}),
|
|
286
307
|
};
|
|
287
308
|
}
|
|
288
309
|
|
|
@@ -291,6 +312,7 @@ export function writeEmptyMessagesFile(
|
|
|
291
312
|
startedAt: string,
|
|
292
313
|
context: MessagesFileContext,
|
|
293
314
|
): void {
|
|
315
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
294
316
|
writeFileSync(
|
|
295
317
|
path,
|
|
296
318
|
`${JSON.stringify(
|
|
@@ -306,40 +328,12 @@ export function writeEmptyMessagesFile(
|
|
|
306
328
|
);
|
|
307
329
|
}
|
|
308
330
|
|
|
309
|
-
export function resolveMessagesFileContext(
|
|
310
|
-
sessionId: string,
|
|
311
|
-
): MessagesFileContext {
|
|
312
|
-
const teamTask = parseTeamTaskSubSessionId(sessionId);
|
|
313
|
-
if (teamTask) {
|
|
314
|
-
return {
|
|
315
|
-
agent: "teammate",
|
|
316
|
-
sessionId: teamTask.rootSessionId,
|
|
317
|
-
taskType: "team",
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const subagent = parseSubSessionId(sessionId);
|
|
322
|
-
if (subagent) {
|
|
323
|
-
return {
|
|
324
|
-
agent: "subagent",
|
|
325
|
-
sessionId: subagent.rootSessionId,
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
return {
|
|
330
|
-
agent: "lead",
|
|
331
|
-
sessionId,
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// ── Manifest helper ───────────────────────────────────────────────────
|
|
336
|
-
|
|
337
331
|
export function buildManifestFromRow(
|
|
338
332
|
row: SessionRow,
|
|
339
333
|
overrides?: {
|
|
340
334
|
status?: SessionStatus;
|
|
341
|
-
endedAt?: string
|
|
342
|
-
exitCode?: number
|
|
335
|
+
endedAt?: string;
|
|
336
|
+
exitCode?: number;
|
|
343
337
|
metadata?: Record<string, unknown>;
|
|
344
338
|
},
|
|
345
339
|
): SessionManifest {
|
|
@@ -351,7 +345,7 @@ export function buildManifestFromRow(
|
|
|
351
345
|
started_at: row.startedAt,
|
|
352
346
|
ended_at: overrides?.endedAt ?? row.endedAt ?? undefined,
|
|
353
347
|
exit_code: overrides?.exitCode ?? row.exitCode ?? undefined,
|
|
354
|
-
status: overrides?.status ?? row.status,
|
|
348
|
+
status: (overrides?.status ?? row.status) as SessionStatus,
|
|
355
349
|
interactive: row.interactive,
|
|
356
350
|
provider: row.provider,
|
|
357
351
|
model: row.model,
|
|
@@ -367,20 +361,30 @@ export function buildManifestFromRow(
|
|
|
367
361
|
});
|
|
368
362
|
}
|
|
369
363
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
364
|
+
export async function withOccRetry<TFetch, TResult>(
|
|
365
|
+
load: () => Promise<TFetch | undefined>,
|
|
366
|
+
update: (loaded: TFetch) => Promise<TResult>,
|
|
367
|
+
maxRetries: number,
|
|
368
|
+
): Promise<TResult | { updated: false }> {
|
|
369
|
+
let attempt = 0;
|
|
370
|
+
while (true) {
|
|
371
|
+
const loaded = await load();
|
|
372
|
+
if (loaded === undefined) {
|
|
373
|
+
return { updated: false };
|
|
374
|
+
}
|
|
375
|
+
const result = await update(loaded);
|
|
376
|
+
if (
|
|
377
|
+
typeof result === "object" &&
|
|
378
|
+
result !== null &&
|
|
379
|
+
"updated" in result &&
|
|
380
|
+
(result as { updated?: boolean }).updated === false
|
|
381
|
+
) {
|
|
382
|
+
attempt += 1;
|
|
383
|
+
if (attempt >= maxRetries) {
|
|
384
|
+
return result as TResult;
|
|
385
|
+
}
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
return result;
|
|
384
389
|
}
|
|
385
|
-
return { updated: false } as { updated: false };
|
|
386
390
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { ITelemetryService } from "@clinebot/shared";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "../
|
|
6
|
-
import type { enrichPromptWithMentions } from "../input";
|
|
2
|
+
import { resolveDocumentsExtensionPath } from "@clinebot/shared/storage";
|
|
3
|
+
import { listHookConfigFiles } from "../extensions/config/hooks-config-loader";
|
|
4
|
+
import type { SessionSource } from "../types/common";
|
|
5
|
+
import type { CoreSessionConfig } from "../types/config";
|
|
7
6
|
import {
|
|
8
7
|
captureHookDiscovery,
|
|
9
8
|
captureMentionFailed,
|
|
@@ -12,9 +11,8 @@ import {
|
|
|
12
11
|
captureTaskCreated,
|
|
13
12
|
captureTaskRestarted,
|
|
14
13
|
type TelemetryAgentIdentityProperties,
|
|
15
|
-
} from "
|
|
16
|
-
import type {
|
|
17
|
-
import type { CoreSessionConfig } from "../types/config";
|
|
14
|
+
} from "./telemetry/core-events";
|
|
15
|
+
import type { enrichPromptWithMentions } from "./workspace";
|
|
18
16
|
|
|
19
17
|
export function emitSessionCreationTelemetry(
|
|
20
18
|
config: CoreSessionConfig,
|
|
@@ -57,7 +55,7 @@ export function captureHookDiscoveryTelemetry(
|
|
|
57
55
|
telemetry: ITelemetryService | undefined,
|
|
58
56
|
options: { workspacePath: string },
|
|
59
57
|
): void {
|
|
60
|
-
const globalHooksDir =
|
|
58
|
+
const globalHooksDir = resolveDocumentsExtensionPath("Hooks");
|
|
61
59
|
const entries = listHookConfigFiles(options.workspacePath);
|
|
62
60
|
const counts = new Map<string, { global: number; workspace: number }>();
|
|
63
61
|
for (const entry of entries) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { ArtifactStore } from "../../types/storage";
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import type { TeamRuntimeState, TeamTeammateSpec } from "@clinebot/shared";
|
|
12
12
|
import { resolveTeamDataDir } from "@clinebot/shared/storage";
|
|
13
|
-
import type { TeamEvent } from "
|
|
14
|
-
import type { TeamStore } from "
|
|
13
|
+
import type { TeamEvent } from "../../extensions/tools/team";
|
|
14
|
+
import type { TeamStore } from "../../types/storage";
|
|
15
15
|
|
|
16
16
|
function nowIso(): string {
|
|
17
17
|
return new Date().toISOString();
|
|
@@ -111,7 +111,7 @@ describe("migrateLegacyProviderSettings", () => {
|
|
|
111
111
|
);
|
|
112
112
|
expect(manager.getProviderSettings("anthropic")).toEqual({
|
|
113
113
|
provider: "anthropic",
|
|
114
|
-
model: "claude-
|
|
114
|
+
model: "claude-opus-4-7",
|
|
115
115
|
apiKey: "legacy-key",
|
|
116
116
|
});
|
|
117
117
|
expect(manager.read().providers.openai?.tokenSource).toBe("manual");
|
|
@@ -3,8 +3,8 @@ import { dirname, join } from "node:path";
|
|
|
3
3
|
import * as LlmsModels from "@clinebot/llms";
|
|
4
4
|
import * as LlmsProviders from "@clinebot/llms";
|
|
5
5
|
import { resolveClineDataDir } from "@clinebot/shared/storage";
|
|
6
|
-
import type { ProviderSettings } from "
|
|
7
|
-
import { emptyStoredProviderSettings } from "
|
|
6
|
+
import type { ProviderSettings } from "../../types/provider-settings";
|
|
7
|
+
import { emptyStoredProviderSettings } from "../../types/provider-settings";
|
|
8
8
|
import type { ProviderSettingsManager } from "./provider-settings-manager";
|
|
9
9
|
|
|
10
10
|
type LegacyMode = "plan" | "act";
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { basename, dirname } from "node:path";
|
|
3
3
|
import { resolveProviderSettingsPath } from "@clinebot/shared/storage";
|
|
4
|
-
import { ensureCustomProvidersLoadedSync } from "../providers/local-provider-registry";
|
|
5
4
|
import {
|
|
6
5
|
emptyStoredProviderSettings,
|
|
7
6
|
type ProviderConfig,
|
|
@@ -11,7 +10,8 @@ import {
|
|
|
11
10
|
type StoredProviderSettings,
|
|
12
11
|
StoredProviderSettingsSchema,
|
|
13
12
|
toProviderConfig,
|
|
14
|
-
} from "
|
|
13
|
+
} from "../../types/provider-settings";
|
|
14
|
+
import { ensureCustomProvidersLoadedSync } from "../providers/local-provider-registry";
|
|
15
15
|
import { migrateLegacyProviderSettings } from "./provider-settings-legacy-migration";
|
|
16
16
|
|
|
17
17
|
function nowIso(): string {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { SessionStore } from "../../types/storage";
|
|
@@ -10,14 +10,10 @@ import {
|
|
|
10
10
|
type SqliteDb,
|
|
11
11
|
toBoolInt,
|
|
12
12
|
} from "@clinebot/shared/db";
|
|
13
|
-
import {
|
|
14
|
-
import type { SessionStatus } from "
|
|
15
|
-
import type { SessionRecord } from "
|
|
16
|
-
import type { SessionStore } from "
|
|
17
|
-
|
|
18
|
-
function defaultSessionsDir(): string {
|
|
19
|
-
return resolveSessionDataDir();
|
|
20
|
-
}
|
|
13
|
+
import { resolveDbDataDir } from "@clinebot/shared/storage";
|
|
14
|
+
import type { SessionStatus } from "../../types/common";
|
|
15
|
+
import type { SessionRecord } from "../../types/sessions";
|
|
16
|
+
import type { SessionStore } from "../../types/storage";
|
|
21
17
|
|
|
22
18
|
export interface SqliteSessionStoreOptions {
|
|
23
19
|
sessionsDir?: string;
|
|
@@ -28,7 +24,7 @@ export class SqliteSessionStore implements SessionStore {
|
|
|
28
24
|
private db: SqliteDb | undefined;
|
|
29
25
|
|
|
30
26
|
constructor(options: SqliteSessionStoreOptions = {}) {
|
|
31
|
-
this.sessionsDirPath = options.sessionsDir ??
|
|
27
|
+
this.sessionsDirPath = options.sessionsDir ?? resolveDbDataDir();
|
|
32
28
|
}
|
|
33
29
|
|
|
34
30
|
init(): void {
|
|
@@ -115,7 +111,7 @@ export class SqliteSessionStore implements SessionStore {
|
|
|
115
111
|
toBoolInt(record.isSubagent),
|
|
116
112
|
record.prompt ?? null,
|
|
117
113
|
record.metadata ? JSON.stringify(record.metadata) : null,
|
|
118
|
-
|
|
114
|
+
"",
|
|
119
115
|
record.hookPath ?? "",
|
|
120
116
|
record.messagesPath ?? null,
|
|
121
117
|
now,
|
|
@@ -196,7 +192,7 @@ export class SqliteSessionStore implements SessionStore {
|
|
|
196
192
|
provider, model, cwd, workspace_root, team_name,
|
|
197
193
|
enable_tools, enable_spawn, enable_teams,
|
|
198
194
|
parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent,
|
|
199
|
-
prompt, metadata_json,
|
|
195
|
+
prompt, metadata_json, hook_path, messages_path, updated_at
|
|
200
196
|
FROM sessions WHERE session_id = ?`,
|
|
201
197
|
[sessionId],
|
|
202
198
|
);
|
|
@@ -241,7 +237,6 @@ export class SqliteSessionStore implements SessionStore {
|
|
|
241
237
|
}
|
|
242
238
|
return undefined;
|
|
243
239
|
})(),
|
|
244
|
-
transcriptPath: asOptionalString(row.transcript_path),
|
|
245
240
|
hookPath: asOptionalString(row.hook_path),
|
|
246
241
|
messagesPath: asOptionalString(row.messages_path),
|
|
247
242
|
updatedAt: asOptionalString(row.updated_at) ?? nowIso(),
|
|
@@ -6,12 +6,12 @@ import {
|
|
|
6
6
|
type TeamTeammateSpec,
|
|
7
7
|
} from "@clinebot/shared";
|
|
8
8
|
import { loadSqliteDb, nowIso, type SqliteDb } from "@clinebot/shared/db";
|
|
9
|
-
import {
|
|
10
|
-
import type { TeamEvent } from "
|
|
11
|
-
import type { TeamStore } from "
|
|
9
|
+
import { resolveDbDataDir } from "@clinebot/shared/storage";
|
|
10
|
+
import type { TeamEvent } from "../../extensions/tools/team";
|
|
11
|
+
import type { TeamStore } from "../../types/storage";
|
|
12
12
|
|
|
13
13
|
function defaultTeamDir(): string {
|
|
14
|
-
return
|
|
14
|
+
return resolveDbDataDir();
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
function sanitizeTeamName(name: string): string {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
1
|
+
import { chmod, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { describe, expect, it, vi } from "vitest";
|
|
@@ -85,6 +85,35 @@ describe("file indexer", () => {
|
|
|
85
85
|
}
|
|
86
86
|
});
|
|
87
87
|
|
|
88
|
+
it("skips unreadable directories during fallback indexing", async () => {
|
|
89
|
+
const cwd = await createTempWorkspace();
|
|
90
|
+
const unreadableDir = path.join(cwd, "private");
|
|
91
|
+
try {
|
|
92
|
+
await mkdir(unreadableDir, { recursive: true });
|
|
93
|
+
await writeFile(
|
|
94
|
+
path.join(cwd, "visible.ts"),
|
|
95
|
+
"export const ok = 1\n",
|
|
96
|
+
"utf8",
|
|
97
|
+
);
|
|
98
|
+
await writeFile(
|
|
99
|
+
path.join(unreadableDir, "hidden.ts"),
|
|
100
|
+
"export const hidden = 1\n",
|
|
101
|
+
"utf8",
|
|
102
|
+
);
|
|
103
|
+
await chmod(unreadableDir, 0o000);
|
|
104
|
+
|
|
105
|
+
await expect(
|
|
106
|
+
prewarmFileIndex(cwd, { ttlMs: 0 }),
|
|
107
|
+
).resolves.toBeUndefined();
|
|
108
|
+
|
|
109
|
+
const index = await getFileIndex(cwd, { ttlMs: 0 });
|
|
110
|
+
expect(index.has("visible.ts")).toBe(true);
|
|
111
|
+
} finally {
|
|
112
|
+
await chmod(unreadableDir, 0o755).catch(() => undefined);
|
|
113
|
+
await rm(cwd, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
88
117
|
it("evicts stale workspace indexes after 10 minutes when multiple workspaces exist", async () => {
|
|
89
118
|
vi.useFakeTimers();
|
|
90
119
|
const firstWorkspace = await createTempWorkspace();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import type { Dirent } from "node:fs";
|
|
2
3
|
import { readdir } from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { isMainThread, parentPort, Worker } from "node:worker_threads";
|
|
@@ -19,6 +20,14 @@ const DEFAULT_EXCLUDE_DIRS = new Set([
|
|
|
19
20
|
"out",
|
|
20
21
|
]);
|
|
21
22
|
|
|
23
|
+
function shouldSkipWalkError(error: unknown): boolean {
|
|
24
|
+
const code =
|
|
25
|
+
error && typeof error === "object" && "code" in error
|
|
26
|
+
? String((error as { code?: unknown }).code ?? "")
|
|
27
|
+
: "";
|
|
28
|
+
return code === "EACCES" || code === "EPERM" || code === "ENOENT";
|
|
29
|
+
}
|
|
30
|
+
|
|
22
31
|
interface CacheEntry {
|
|
23
32
|
files: Set<string>;
|
|
24
33
|
lastBuiltAt: number;
|
|
@@ -103,14 +112,29 @@ async function walkDir(
|
|
|
103
112
|
dir: string,
|
|
104
113
|
files: Set<string>,
|
|
105
114
|
): Promise<void> {
|
|
106
|
-
|
|
115
|
+
let entries: Dirent[];
|
|
116
|
+
try {
|
|
117
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
118
|
+
} catch (error) {
|
|
119
|
+
if (shouldSkipWalkError(error)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
107
124
|
for (const entry of entries) {
|
|
108
125
|
const absolutePath = path.join(dir, entry.name);
|
|
109
126
|
if (entry.isDirectory()) {
|
|
110
127
|
if (DEFAULT_EXCLUDE_DIRS.has(entry.name)) {
|
|
111
128
|
continue;
|
|
112
129
|
}
|
|
113
|
-
|
|
130
|
+
try {
|
|
131
|
+
await walkDir(cwd, absolutePath, files);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (shouldSkipWalkError(error)) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
114
138
|
continue;
|
|
115
139
|
}
|
|
116
140
|
if (entry.isFile()) {
|
|
@@ -82,4 +82,25 @@ describe("enrichPromptWithMentions", () => {
|
|
|
82
82
|
await rm(cwd, { recursive: true, force: true });
|
|
83
83
|
}
|
|
84
84
|
});
|
|
85
|
+
|
|
86
|
+
it("does not over-count totalBytes across multiple mentions", async () => {
|
|
87
|
+
const cwd = await createTempWorkspace();
|
|
88
|
+
try {
|
|
89
|
+
await writeFile(path.join(cwd, "a.ts"), "aaa", "utf8");
|
|
90
|
+
await writeFile(path.join(cwd, "b.ts"), "bbb", "utf8");
|
|
91
|
+
await writeFile(path.join(cwd, "c.ts"), "ccc", "utf8");
|
|
92
|
+
|
|
93
|
+
const result = await enrichPromptWithMentions(
|
|
94
|
+
"Use @a.ts @b.ts @c.ts",
|
|
95
|
+
cwd,
|
|
96
|
+
{ maxTotalBytes: 15, maxFiles: 5, maxFileBytes: 5 },
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(result.mentions).toEqual(["a.ts", "b.ts", "c.ts"]);
|
|
100
|
+
expect(result.matchedFiles).toEqual(["a.ts", "b.ts", "c.ts"]);
|
|
101
|
+
expect(result.ignoredMentions).toEqual([]);
|
|
102
|
+
} finally {
|
|
103
|
+
await rm(cwd, { recursive: true, force: true });
|
|
104
|
+
}
|
|
105
|
+
});
|
|
85
106
|
});
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { resolveSessionDataDir } from "@clinebot/shared/storage";
|
|
10
|
+
import type { SessionMessagesArtifactUploader } from "../types/session";
|
|
10
11
|
import type {
|
|
11
12
|
PersistedSessionUpdateInput,
|
|
12
13
|
SessionPersistenceAdapter,
|
|
@@ -45,13 +46,9 @@ function atomicWriteJson(path: string, value: unknown): void {
|
|
|
45
46
|
renameSync(tempPath, path);
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
function defaultSessionsDir(): string {
|
|
49
|
-
return resolveSessionDataDir();
|
|
50
|
-
}
|
|
51
|
-
|
|
52
49
|
class FileSessionPersistenceAdapter implements SessionPersistenceAdapter {
|
|
53
50
|
constructor(
|
|
54
|
-
private readonly sessionsDirPath: string =
|
|
51
|
+
private readonly sessionsDirPath: string = resolveSessionDataDir(),
|
|
55
52
|
) {}
|
|
56
53
|
|
|
57
54
|
ensureSessionsDir(): string {
|
|
@@ -270,8 +267,13 @@ class FileSessionPersistenceAdapter implements SessionPersistenceAdapter {
|
|
|
270
267
|
}
|
|
271
268
|
|
|
272
269
|
export class FileSessionService extends UnifiedSessionPersistenceService {
|
|
273
|
-
constructor(
|
|
274
|
-
|
|
270
|
+
constructor(
|
|
271
|
+
sessionsDir?: string,
|
|
272
|
+
options: {
|
|
273
|
+
messagesArtifactUploader?: SessionMessagesArtifactUploader;
|
|
274
|
+
} = {},
|
|
275
|
+
) {
|
|
276
|
+
super(new FileSessionPersistenceAdapter(sessionsDir), options);
|
|
275
277
|
}
|
|
276
278
|
|
|
277
279
|
override ensureSessionsDir(): string {
|
package/src/session/index.ts
CHANGED
|
@@ -7,8 +7,32 @@ export {
|
|
|
7
7
|
export type {
|
|
8
8
|
ClineCore,
|
|
9
9
|
ClineCoreOptions,
|
|
10
|
+
ClineCoreStartInput,
|
|
10
11
|
} from "../ClineCore";
|
|
11
|
-
export {
|
|
12
|
+
export type { SessionBackend } from "../runtime/host";
|
|
13
|
+
export {
|
|
14
|
+
createRuntimeHost,
|
|
15
|
+
resolveSessionBackend,
|
|
16
|
+
} from "../runtime/host";
|
|
17
|
+
export type {
|
|
18
|
+
LocalRuntimeConfigOverrides,
|
|
19
|
+
LocalRuntimeStartOptions,
|
|
20
|
+
RuntimeHost,
|
|
21
|
+
RuntimeHost as SessionHost,
|
|
22
|
+
RuntimeHostMode,
|
|
23
|
+
RuntimeSessionConfig,
|
|
24
|
+
SendSessionInput,
|
|
25
|
+
SessionAccumulatedUsage,
|
|
26
|
+
StartSessionInput,
|
|
27
|
+
StartSessionResult,
|
|
28
|
+
} from "../runtime/runtime-host";
|
|
29
|
+
export { splitCoreSessionConfig } from "../runtime/runtime-host";
|
|
30
|
+
export {
|
|
31
|
+
generateWorkspaceInfo,
|
|
32
|
+
normalizeWorkspacePath,
|
|
33
|
+
} from "../services/workspace-manifest";
|
|
34
|
+
export { LocalRuntimeHost } from "../transports/local";
|
|
35
|
+
export { RpcRuntimeHost } from "../transports/rpc";
|
|
12
36
|
export { RpcCoreSessionService } from "./rpc-session-service";
|
|
13
37
|
export {
|
|
14
38
|
deriveSubsessionStatus,
|
|
@@ -16,18 +40,6 @@ export {
|
|
|
16
40
|
makeTeamTaskSubSessionId,
|
|
17
41
|
sanitizeSessionToken,
|
|
18
42
|
} from "./session-graph";
|
|
19
|
-
export type {
|
|
20
|
-
SessionBackend,
|
|
21
|
-
SessionHost,
|
|
22
|
-
} from "./session-host";
|
|
23
|
-
export { createSessionHost, resolveSessionBackend } from "./session-host";
|
|
24
|
-
export type {
|
|
25
|
-
SendSessionInput,
|
|
26
|
-
SessionAccumulatedUsage,
|
|
27
|
-
SessionManager,
|
|
28
|
-
StartSessionInput,
|
|
29
|
-
StartSessionResult,
|
|
30
|
-
} from "./session-manager";
|
|
31
43
|
export type { SessionManifest } from "./session-manifest";
|
|
32
44
|
export type {
|
|
33
45
|
CreateRootSessionWithArtifactsInput,
|
|
@@ -39,7 +51,3 @@ export type {
|
|
|
39
51
|
WorkspaceManagerEvent,
|
|
40
52
|
} from "./workspace-manager";
|
|
41
53
|
export { InMemoryWorkspaceManager } from "./workspace-manager";
|
|
42
|
-
export {
|
|
43
|
-
generateWorkspaceInfo,
|
|
44
|
-
normalizeWorkspacePath,
|
|
45
|
-
} from "./workspace-manifest";
|