@clinebot/core 0.0.33 → 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/auth/client.d.ts +19 -0
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/cline.d.ts.map +1 -1
- package/dist/auth/oca.d.ts.map +1 -1
- package/dist/auth/server.d.ts +32 -0
- package/dist/auth/server.d.ts.map +1 -1
- package/dist/auth/types.d.ts +29 -0
- package/dist/auth/types.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/index.d.ts +2 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-config-loader.d.ts +2 -1
- package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-load-report.d.ts +19 -0
- package/dist/extensions/plugin/plugin-load-report.d.ts.map +1 -0
- package/dist/extensions/plugin/plugin-loader.d.ts +6 -0
- package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts +2 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
- package/dist/extensions/plugin-sandbox-bootstrap.js +242 -242
- 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 +38 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +386 -384
- 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 +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/runtime/subprocess-sandbox.d.ts +2 -0
- package/dist/runtime/subprocess-sandbox.d.ts.map +1 -1
- package/dist/runtime/tool-approval.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 +2 -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 +3 -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/client.test.ts +29 -0
- package/src/auth/client.ts +21 -0
- package/src/auth/cline.ts +3 -1
- package/src/auth/codex.ts +1 -1
- package/src/auth/oca.ts +3 -1
- package/src/auth/server.test.ts +287 -0
- package/src/auth/server.ts +50 -1
- package/src/auth/types.ts +29 -0
- 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/index.ts +6 -0
- package/src/extensions/plugin/plugin-config-loader.test.ts +39 -0
- package/src/extensions/plugin/plugin-config-loader.ts +18 -10
- package/src/extensions/plugin/plugin-load-report.ts +20 -0
- package/src/extensions/plugin/plugin-loader.test.ts +45 -0
- package/src/extensions/plugin/plugin-loader.ts +57 -3
- package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +158 -86
- package/src/extensions/plugin/plugin-sandbox.test.ts +70 -0
- package/src/extensions/plugin/plugin-sandbox.ts +17 -6
- 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 +146 -30
- package/src/{team → extensions/tools/team}/team-tools.ts +98 -69
- 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.test.ts +42 -7
- package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
- package/src/hooks/subprocess.ts +48 -257
- package/src/index.ts +178 -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 +101 -4
- package/src/runtime/runtime-builder.ts +125 -86
- 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/runtime/subprocess-sandbox.ts +26 -23
- package/src/runtime/tool-approval.ts +13 -15
- 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 +23 -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 +121 -24
- package/src/session/persistence-service.ts +118 -102
- 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} +138 -172
- 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 +3 -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/runtime/team-runtime-registry.d.ts +0 -13
- package/dist/runtime/team-runtime-registry.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/runtime/team-runtime-registry.ts +0 -43
- package/src/session/session-config-builder.ts +0 -126
- 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/{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
package/src/auth/cline.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
captureAuthStarted,
|
|
6
6
|
captureAuthSucceeded,
|
|
7
7
|
identifyAccount,
|
|
8
|
-
} from "../telemetry/core-events";
|
|
8
|
+
} from "../services/telemetry/core-events";
|
|
9
9
|
import { startLocalOAuthServer } from "./server";
|
|
10
10
|
import type {
|
|
11
11
|
OAuthCredentials,
|
|
@@ -457,6 +457,8 @@ export async function loginClineOAuth(
|
|
|
457
457
|
: await startLocalOAuthServer({
|
|
458
458
|
ports: callbackPorts,
|
|
459
459
|
callbackPath,
|
|
460
|
+
onListening: options.callbacks.onServerListening,
|
|
461
|
+
onClose: options.callbacks.onServerClose,
|
|
460
462
|
});
|
|
461
463
|
const callbackUrl =
|
|
462
464
|
localServer?.callbackUrl ||
|
package/src/auth/codex.ts
CHANGED
package/src/auth/oca.ts
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
captureAuthStarted,
|
|
7
7
|
captureAuthSucceeded,
|
|
8
8
|
identifyAccount,
|
|
9
|
-
} from "../telemetry/core-events";
|
|
9
|
+
} from "../services/telemetry/core-events";
|
|
10
10
|
import { BoundedTtlCache } from "./bounded-ttl-cache";
|
|
11
11
|
import { startLocalOAuthServer } from "./server";
|
|
12
12
|
import type {
|
|
@@ -363,6 +363,8 @@ export async function loginOcaOAuth(
|
|
|
363
363
|
const localServer = await startLocalOAuthServer({
|
|
364
364
|
ports: callbackPorts,
|
|
365
365
|
callbackPath,
|
|
366
|
+
onListening: options.callbacks.onServerListening,
|
|
367
|
+
onClose: options.callbacks.onServerClose,
|
|
366
368
|
});
|
|
367
369
|
const callbackUrl = localServer.callbackUrl;
|
|
368
370
|
if (!callbackUrl) {
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import net from "node:net";
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { startLocalOAuthServer } from "./server";
|
|
5
|
+
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
/** Bind to port 0 to let the OS pick a free port, then release it. */
|
|
11
|
+
function getFreePort(): Promise<number> {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const srv = net.createServer();
|
|
14
|
+
srv.listen(0, "127.0.0.1", () => {
|
|
15
|
+
const addr = srv.address() as net.AddressInfo;
|
|
16
|
+
srv.close(() => resolve(addr.port));
|
|
17
|
+
});
|
|
18
|
+
srv.on("error", reject);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Occupy a port so the OAuth server cannot bind to it. */
|
|
23
|
+
function occupyPort(port: number): Promise<http.Server> {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const srv = http.createServer();
|
|
26
|
+
srv.listen(port, "127.0.0.1", () => resolve(srv));
|
|
27
|
+
srv.on("error", reject);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Close an http.Server, resolving when the socket is gone. */
|
|
32
|
+
function closeServer(srv: http.Server): Promise<void> {
|
|
33
|
+
return new Promise((resolve, reject) =>
|
|
34
|
+
srv.close((err) => (err ? reject(err) : resolve())),
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Make a GET request and return status + body. */
|
|
39
|
+
function get(url: string): Promise<{ status: number; body: string }> {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
http
|
|
42
|
+
.get(url, (res) => {
|
|
43
|
+
let body = "";
|
|
44
|
+
res.on("data", (chunk: Buffer) => {
|
|
45
|
+
body += chunk.toString();
|
|
46
|
+
});
|
|
47
|
+
res.on("end", () => resolve({ status: res.statusCode ?? 0, body }));
|
|
48
|
+
})
|
|
49
|
+
.on("error", reject);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Flush microtasks + a short macro-task delay for fire-and-forget promises. */
|
|
54
|
+
function flushAsync(): Promise<void> {
|
|
55
|
+
return new Promise((resolve) => setTimeout(resolve, 20));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// onListening
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
describe("auth/server startLocalOAuthServer — onListening", () => {
|
|
63
|
+
it("is called with host, port, and callbackUrl when the server binds", async () => {
|
|
64
|
+
const port = await getFreePort();
|
|
65
|
+
const onListening = vi.fn();
|
|
66
|
+
|
|
67
|
+
const server = await startLocalOAuthServer({
|
|
68
|
+
ports: [port],
|
|
69
|
+
callbackPath: "/callback",
|
|
70
|
+
onListening,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
expect(onListening).toHaveBeenCalledOnce();
|
|
74
|
+
expect(onListening).toHaveBeenCalledWith({
|
|
75
|
+
host: "127.0.0.1",
|
|
76
|
+
port,
|
|
77
|
+
callbackUrl: `http://127.0.0.1:${port}/callback`,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
server.close();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("is not called when no port can be bound", async () => {
|
|
84
|
+
const port = await getFreePort();
|
|
85
|
+
const blocker = await occupyPort(port);
|
|
86
|
+
const onListening = vi.fn();
|
|
87
|
+
|
|
88
|
+
await startLocalOAuthServer({
|
|
89
|
+
ports: [port],
|
|
90
|
+
callbackPath: "/callback",
|
|
91
|
+
onListening,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
expect(onListening).not.toHaveBeenCalled();
|
|
95
|
+
|
|
96
|
+
await closeServer(blocker);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("fires for the first available port and skips occupied ones", async () => {
|
|
100
|
+
const [port1, port2] = await Promise.all([getFreePort(), getFreePort()]);
|
|
101
|
+
const blocker = await occupyPort(port1);
|
|
102
|
+
const onListening = vi.fn();
|
|
103
|
+
|
|
104
|
+
const server = await startLocalOAuthServer({
|
|
105
|
+
ports: [port1, port2],
|
|
106
|
+
callbackPath: "/cb",
|
|
107
|
+
onListening,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(onListening).toHaveBeenCalledOnce();
|
|
111
|
+
expect(onListening).toHaveBeenCalledWith(
|
|
112
|
+
expect.objectContaining({ port: port2 }),
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
server.close();
|
|
116
|
+
await closeServer(blocker);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("swallows errors thrown by the onListening callback", async () => {
|
|
120
|
+
const port = await getFreePort();
|
|
121
|
+
const onListening = vi
|
|
122
|
+
.fn()
|
|
123
|
+
.mockReturnValue(Promise.reject(new Error("listening boom")));
|
|
124
|
+
|
|
125
|
+
const server = await startLocalOAuthServer({
|
|
126
|
+
ports: [port],
|
|
127
|
+
callbackPath: "/callback",
|
|
128
|
+
onListening,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
await flushAsync();
|
|
132
|
+
expect(onListening).toHaveBeenCalledOnce();
|
|
133
|
+
|
|
134
|
+
server.close();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// onClose
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
|
|
142
|
+
describe("auth/server startLocalOAuthServer — onClose", () => {
|
|
143
|
+
it("is called with host and port when close() is invoked", async () => {
|
|
144
|
+
const port = await getFreePort();
|
|
145
|
+
const onClose = vi.fn();
|
|
146
|
+
|
|
147
|
+
const server = await startLocalOAuthServer({
|
|
148
|
+
ports: [port],
|
|
149
|
+
callbackPath: "/callback",
|
|
150
|
+
onClose,
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
server.close();
|
|
154
|
+
|
|
155
|
+
expect(onClose).toHaveBeenCalledOnce();
|
|
156
|
+
expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("is called with host and port when cancelWait() is invoked", async () => {
|
|
160
|
+
const port = await getFreePort();
|
|
161
|
+
const onClose = vi.fn();
|
|
162
|
+
|
|
163
|
+
const server = await startLocalOAuthServer({
|
|
164
|
+
ports: [port],
|
|
165
|
+
callbackPath: "/callback",
|
|
166
|
+
onClose,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
server.cancelWait();
|
|
170
|
+
|
|
171
|
+
expect(onClose).toHaveBeenCalledOnce();
|
|
172
|
+
expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("is called after a successful OAuth callback request", async () => {
|
|
176
|
+
const port = await getFreePort();
|
|
177
|
+
const onClose = vi.fn();
|
|
178
|
+
|
|
179
|
+
const server = await startLocalOAuthServer({
|
|
180
|
+
ports: [port],
|
|
181
|
+
callbackPath: "/callback",
|
|
182
|
+
onClose,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const waitPromise = server.waitForCallback();
|
|
186
|
+
const { status } = await get(
|
|
187
|
+
`http://127.0.0.1:${port}/callback?code=tok123`,
|
|
188
|
+
);
|
|
189
|
+
expect(status).toBe(200);
|
|
190
|
+
|
|
191
|
+
await waitPromise;
|
|
192
|
+
|
|
193
|
+
expect(onClose).toHaveBeenCalledOnce();
|
|
194
|
+
expect(onClose).toHaveBeenCalledWith({ host: "127.0.0.1", port });
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("is not called when no port was bound", async () => {
|
|
198
|
+
const port = await getFreePort();
|
|
199
|
+
const blocker = await occupyPort(port);
|
|
200
|
+
const onClose = vi.fn();
|
|
201
|
+
|
|
202
|
+
const server = await startLocalOAuthServer({
|
|
203
|
+
ports: [port],
|
|
204
|
+
callbackPath: "/callback",
|
|
205
|
+
onClose,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
server.close();
|
|
209
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
210
|
+
|
|
211
|
+
await closeServer(blocker);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it("swallows errors thrown by the onClose callback", async () => {
|
|
215
|
+
const port = await getFreePort();
|
|
216
|
+
const onClose = vi
|
|
217
|
+
.fn()
|
|
218
|
+
.mockReturnValue(Promise.reject(new Error("teardown failed")));
|
|
219
|
+
|
|
220
|
+
const server = await startLocalOAuthServer({
|
|
221
|
+
ports: [port],
|
|
222
|
+
callbackPath: "/callback",
|
|
223
|
+
onClose,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
server.close();
|
|
227
|
+
await flushAsync();
|
|
228
|
+
|
|
229
|
+
expect(onClose).toHaveBeenCalledOnce();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// onListening + onClose ordering
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
|
|
237
|
+
describe("auth/server startLocalOAuthServer — onListening + onClose together", () => {
|
|
238
|
+
afterEach(() => {
|
|
239
|
+
vi.restoreAllMocks();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it("fires onListening on bind then onClose after a successful callback", async () => {
|
|
243
|
+
const port = await getFreePort();
|
|
244
|
+
const order: string[] = [];
|
|
245
|
+
|
|
246
|
+
const server = await startLocalOAuthServer({
|
|
247
|
+
ports: [port],
|
|
248
|
+
callbackPath: "/cb",
|
|
249
|
+
onListening: vi.fn(() => {
|
|
250
|
+
order.push("listening");
|
|
251
|
+
}),
|
|
252
|
+
onClose: vi.fn(() => {
|
|
253
|
+
order.push("close");
|
|
254
|
+
}),
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
expect(order).toEqual(["listening"]);
|
|
258
|
+
|
|
259
|
+
const waitPromise = server.waitForCallback();
|
|
260
|
+
await get(`http://127.0.0.1:${port}/cb?code=mycode`);
|
|
261
|
+
const payload = await waitPromise;
|
|
262
|
+
|
|
263
|
+
expect(payload?.code).toBe("mycode");
|
|
264
|
+
expect(order).toEqual(["listening", "close"]);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it("fires onListening on bind then onClose after cancelWait()", async () => {
|
|
268
|
+
const port = await getFreePort();
|
|
269
|
+
const order: string[] = [];
|
|
270
|
+
|
|
271
|
+
const server = await startLocalOAuthServer({
|
|
272
|
+
ports: [port],
|
|
273
|
+
callbackPath: "/cb",
|
|
274
|
+
onListening: vi.fn(() => {
|
|
275
|
+
order.push("listening");
|
|
276
|
+
}),
|
|
277
|
+
onClose: vi.fn(() => {
|
|
278
|
+
order.push("close");
|
|
279
|
+
}),
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
expect(order).toEqual(["listening"]);
|
|
283
|
+
|
|
284
|
+
server.cancelWait();
|
|
285
|
+
expect(order).toEqual(["listening", "close"]);
|
|
286
|
+
});
|
|
287
|
+
});
|
package/src/auth/server.ts
CHANGED
|
@@ -19,6 +19,17 @@ function createDeferred<T>(): Deferred<T> {
|
|
|
19
19
|
return { promise, resolve };
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
export interface OAuthServerListeningInfo {
|
|
23
|
+
host: string;
|
|
24
|
+
port: number;
|
|
25
|
+
callbackUrl: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface OAuthServerCloseInfo {
|
|
29
|
+
host: string;
|
|
30
|
+
port: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
22
33
|
export interface LocalOAuthServerOptions {
|
|
23
34
|
host?: string;
|
|
24
35
|
ports: number[];
|
|
@@ -26,6 +37,29 @@ export interface LocalOAuthServerOptions {
|
|
|
26
37
|
timeoutMs?: number;
|
|
27
38
|
expectedState?: string;
|
|
28
39
|
successHtml?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Called when the local redirect server successfully binds to a port and is
|
|
42
|
+
* ready to receive the OAuth callback. Hosts can use this to display a
|
|
43
|
+
* "waiting for callback" status indicator or — in remote-development
|
|
44
|
+
* environments like JetBrains Gateway — to forward the port from the remote
|
|
45
|
+
* machine to the local machine where the user's browser is running.
|
|
46
|
+
*
|
|
47
|
+
* May be async; `startLocalOAuthServer` will **await** this callback before
|
|
48
|
+
* returning so that any setup it performs (e.g. port-forwarding) is
|
|
49
|
+
* guaranteed to complete before the caller opens the auth URL. Errors
|
|
50
|
+
* thrown by this callback are swallowed — they do not prevent the OAuth
|
|
51
|
+
* flow from proceeding.
|
|
52
|
+
*/
|
|
53
|
+
onListening?: (info: OAuthServerListeningInfo) => void | Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Called when the local redirect server closes, either because the OAuth
|
|
56
|
+
* callback was received, the flow was cancelled, or the timeout elapsed.
|
|
57
|
+
* Hosts should use this to tear down any port-forward set up in
|
|
58
|
+
* `onListening` and clear any "waiting for callback" status UI.
|
|
59
|
+
*
|
|
60
|
+
* May be async; fired after the underlying server socket is closed.
|
|
61
|
+
*/
|
|
62
|
+
onClose?: (info: OAuthServerCloseInfo) => void | Promise<void>;
|
|
29
63
|
}
|
|
30
64
|
|
|
31
65
|
export interface LocalOAuthServer {
|
|
@@ -48,6 +82,7 @@ export async function startLocalOAuthServer(
|
|
|
48
82
|
let settled = false;
|
|
49
83
|
let timeout: ReturnType<typeof setTimeout> | null = null;
|
|
50
84
|
let activeServer: import("node:http").Server | null = null;
|
|
85
|
+
let boundPort: number | null = null;
|
|
51
86
|
|
|
52
87
|
const settle = (value: OAuthCallbackPayload | null) => {
|
|
53
88
|
if (settled) return;
|
|
@@ -60,10 +95,17 @@ export async function startLocalOAuthServer(
|
|
|
60
95
|
clearTimeout(timeout);
|
|
61
96
|
timeout = null;
|
|
62
97
|
}
|
|
98
|
+
const closingPort = boundPort;
|
|
99
|
+
boundPort = null;
|
|
63
100
|
if (activeServer) {
|
|
64
101
|
activeServer.close();
|
|
65
102
|
activeServer = null;
|
|
66
103
|
}
|
|
104
|
+
if (closingPort !== null && options.onClose) {
|
|
105
|
+
void Promise.resolve(options.onClose({ host, port: closingPort })).catch(
|
|
106
|
+
() => {},
|
|
107
|
+
);
|
|
108
|
+
}
|
|
67
109
|
};
|
|
68
110
|
|
|
69
111
|
const waitForCallback = async () => {
|
|
@@ -149,8 +191,15 @@ export async function startLocalOAuthServer(
|
|
|
149
191
|
}
|
|
150
192
|
|
|
151
193
|
if (bindResult.bound) {
|
|
194
|
+
boundPort = port;
|
|
195
|
+
const callbackUrl = `http://${host}:${port}${options.callbackPath}`;
|
|
196
|
+
if (options.onListening) {
|
|
197
|
+
await Promise.resolve(
|
|
198
|
+
options.onListening({ host, port, callbackUrl }),
|
|
199
|
+
).catch(() => {});
|
|
200
|
+
}
|
|
152
201
|
return {
|
|
153
|
-
callbackUrl
|
|
202
|
+
callbackUrl,
|
|
154
203
|
waitForCallback,
|
|
155
204
|
cancelWait: () => {
|
|
156
205
|
close();
|
package/src/auth/types.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ITelemetryService } from "@clinebot/shared";
|
|
2
|
+
import type { OAuthServerCloseInfo, OAuthServerListeningInfo } from "./server";
|
|
2
3
|
|
|
3
4
|
export interface OAuthPrompt {
|
|
4
5
|
message: string;
|
|
@@ -31,6 +32,34 @@ export interface OAuthLoginCallbacks {
|
|
|
31
32
|
onPrompt: (prompt: OAuthPrompt) => Promise<string>;
|
|
32
33
|
onProgress?: (message: string) => void;
|
|
33
34
|
onManualCodeInput?: () => Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Called when the local OAuth redirect server successfully binds to a port
|
|
37
|
+
* and is ready to receive the browser callback. The `info` object contains
|
|
38
|
+
* the host, the bound port number, and the full `callbackUrl`.
|
|
39
|
+
*
|
|
40
|
+
* Use this to:
|
|
41
|
+
* - Show a "waiting for OAuth callback on port N" status indicator in your UI.
|
|
42
|
+
* - Forward the port in remote-development environments (e.g. JetBrains
|
|
43
|
+
* Gateway) from the remote machine to the machine running the browser.
|
|
44
|
+
*
|
|
45
|
+
* Paired with `onServerClose` for teardown.
|
|
46
|
+
*
|
|
47
|
+
* Only fired when the provider uses a local callback server
|
|
48
|
+
* (`OAuthProviderInterface.usesCallbackServer === true`).
|
|
49
|
+
*/
|
|
50
|
+
onServerListening?: (info: OAuthServerListeningInfo) => void | Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Called when the local OAuth redirect server closes — either because the
|
|
53
|
+
* callback was received, the flow was cancelled, or the timeout elapsed.
|
|
54
|
+
*
|
|
55
|
+
* Use this to:
|
|
56
|
+
* - Clear any "waiting for callback" status UI shown in `onServerListening`.
|
|
57
|
+
* - Tear down port-forwards set up in `onServerListening`.
|
|
58
|
+
*
|
|
59
|
+
* Only fired when the provider uses a local callback server
|
|
60
|
+
* (`OAuthProviderInterface.usesCallbackServer === true`).
|
|
61
|
+
*/
|
|
62
|
+
onServerClose?: (info: OAuthServerCloseInfo) => void | Promise<void>;
|
|
34
63
|
}
|
|
35
64
|
|
|
36
65
|
export interface OAuthProviderInterface {
|
|
@@ -2,6 +2,7 @@ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import type { Tool, ToolContext } from "@clinebot/shared";
|
|
5
|
+
import { resolveDocumentsExtensionPath } from "@clinebot/shared/storage";
|
|
5
6
|
import { afterEach, describe, expect, it } from "vitest";
|
|
6
7
|
import {
|
|
7
8
|
AGENT_CONFIG_DIRECTORY_NAME,
|
|
@@ -12,7 +13,6 @@ import {
|
|
|
12
13
|
resolveAgentConfigSearchPaths,
|
|
13
14
|
resolveAgentsConfigDirPath,
|
|
14
15
|
resolveAgentTools,
|
|
15
|
-
resolveDocumentsAgentConfigDirectoryPath,
|
|
16
16
|
toPartialAgentConfig,
|
|
17
17
|
} from "./agent-config-loader";
|
|
18
18
|
|
|
@@ -46,7 +46,7 @@ describe("agent config YAML loader", () => {
|
|
|
46
46
|
it("includes documents and settings search paths", () => {
|
|
47
47
|
process.env.CLINE_DATA_DIR = "/tmp/cline-data";
|
|
48
48
|
expect(resolveAgentConfigSearchPaths()).toEqual([
|
|
49
|
-
|
|
49
|
+
resolveDocumentsExtensionPath("Agents"),
|
|
50
50
|
join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
|
|
51
51
|
]);
|
|
52
52
|
});
|
|
@@ -56,7 +56,7 @@ describe("agent config YAML loader", () => {
|
|
|
56
56
|
const definition = createAgentConfigDefinition();
|
|
57
57
|
expect(definition.type).toBe("agent");
|
|
58
58
|
expect(definition.directories).toEqual([
|
|
59
|
-
|
|
59
|
+
resolveDocumentsExtensionPath("Agents"),
|
|
60
60
|
join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
|
|
61
61
|
]);
|
|
62
62
|
expect(definition.includeFile?.("agent.yaml", "/tmp/agent.yaml")).toBe(
|
|
@@ -2,7 +2,6 @@ import {
|
|
|
2
2
|
AGENT_CONFIG_DIRECTORY_NAME,
|
|
3
3
|
resolveAgentConfigSearchPaths as resolveAgentConfigSearchPathsFromShared,
|
|
4
4
|
resolveAgentsConfigDirPath as resolveAgentsConfigDirPathFromShared,
|
|
5
|
-
resolveDocumentsAgentConfigDirectoryPath,
|
|
6
5
|
} from "@clinebot/shared/storage";
|
|
7
6
|
import {
|
|
8
7
|
type AgentYamlConfig,
|
|
@@ -38,10 +37,7 @@ export type AgentConfigWatcherEvent = UnifiedConfigWatcherEvent<
|
|
|
38
37
|
AgentYamlConfig
|
|
39
38
|
>;
|
|
40
39
|
|
|
41
|
-
export {
|
|
42
|
-
AGENT_CONFIG_DIRECTORY_NAME,
|
|
43
|
-
resolveDocumentsAgentConfigDirectoryPath,
|
|
44
|
-
};
|
|
40
|
+
export { AGENT_CONFIG_DIRECTORY_NAME };
|
|
45
41
|
|
|
46
42
|
export function resolveAgentsConfigDirPath(): string {
|
|
47
43
|
return resolveAgentsConfigDirPathFromShared();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentConfig, Tool } from "@clinebot/shared";
|
|
2
2
|
import YAML from "yaml";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { ALL_DEFAULT_TOOL_NAMES, type DefaultToolName } from "
|
|
4
|
+
import { ALL_DEFAULT_TOOL_NAMES, type DefaultToolName } from "../tools/";
|
|
5
5
|
|
|
6
6
|
const AgentConfigFrontmatterSchema = z.object({
|
|
7
7
|
name: z.string().trim().min(1),
|
|
@@ -2,12 +2,11 @@ import { existsSync, readdirSync } from "node:fs";
|
|
|
2
2
|
import { basename, extname, join } from "node:path";
|
|
3
3
|
import {
|
|
4
4
|
HOOKS_CONFIG_DIRECTORY_NAME,
|
|
5
|
-
resolveDocumentsHooksDirectoryPath,
|
|
6
5
|
resolveHooksConfigSearchPaths as resolveHooksConfigSearchPathsFromShared,
|
|
7
6
|
} from "@clinebot/shared/storage";
|
|
8
7
|
import type { HookEventName } from "../../hooks";
|
|
9
8
|
|
|
10
|
-
export { HOOKS_CONFIG_DIRECTORY_NAME
|
|
9
|
+
export { HOOKS_CONFIG_DIRECTORY_NAME };
|
|
11
10
|
|
|
12
11
|
export function resolveHooksConfigSearchPaths(
|
|
13
12
|
workspacePath?: string,
|
|
@@ -17,7 +17,6 @@ export {
|
|
|
17
17
|
resolveAgentConfigSearchPaths,
|
|
18
18
|
resolveAgentsConfigDirPath,
|
|
19
19
|
resolveAgentTools,
|
|
20
|
-
resolveDocumentsAgentConfigDirectoryPath,
|
|
21
20
|
toPartialAgentConfig,
|
|
22
21
|
} from "./agent-config-loader";
|
|
23
22
|
export {
|
|
@@ -26,7 +25,6 @@ export {
|
|
|
26
25
|
type HookConfigFileEntry,
|
|
27
26
|
HookConfigFileName,
|
|
28
27
|
listHookConfigFiles,
|
|
29
|
-
resolveDocumentsHooksDirectoryPath,
|
|
30
28
|
resolveHooksConfigSearchPaths,
|
|
31
29
|
toHookConfigFileName,
|
|
32
30
|
} from "./hooks-config-loader";
|
|
@@ -71,8 +69,6 @@ export {
|
|
|
71
69
|
parseSkillConfigFromMarkdown,
|
|
72
70
|
parseWorkflowConfigFromMarkdown,
|
|
73
71
|
RULES_CONFIG_DIRECTORY_NAME,
|
|
74
|
-
resolveDocumentsRulesDirectoryPath,
|
|
75
|
-
resolveDocumentsWorkflowsDirectoryPath,
|
|
76
72
|
resolveRulesConfigSearchPaths,
|
|
77
73
|
resolveSkillsConfigSearchPaths,
|
|
78
74
|
resolveWorkflowsConfigSearchPaths,
|
|
@@ -2,8 +2,6 @@ import { readdir, readFile, stat } from "node:fs/promises";
|
|
|
2
2
|
import { basename, dirname, extname, join } from "node:path";
|
|
3
3
|
import {
|
|
4
4
|
RULES_CONFIG_DIRECTORY_NAME,
|
|
5
|
-
resolveDocumentsRulesDirectoryPath,
|
|
6
|
-
resolveDocumentsWorkflowsDirectoryPath,
|
|
7
5
|
resolveRulesConfigSearchPaths as resolveRulesConfigSearchPathsFromShared,
|
|
8
6
|
resolveSkillsConfigSearchPaths as resolveSkillsConfigSearchPathsFromShared,
|
|
9
7
|
resolveWorkflowsConfigSearchPaths as resolveWorkflowsConfigSearchPathsFromShared,
|
|
@@ -25,8 +23,6 @@ const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown", ".txt"]);
|
|
|
25
23
|
|
|
26
24
|
export {
|
|
27
25
|
RULES_CONFIG_DIRECTORY_NAME,
|
|
28
|
-
resolveDocumentsRulesDirectoryPath,
|
|
29
|
-
resolveDocumentsWorkflowsDirectoryPath,
|
|
30
26
|
SKILLS_CONFIG_DIRECTORY_NAME,
|
|
31
27
|
WORKFLOWS_CONFIG_DIRECTORY_NAME,
|
|
32
28
|
};
|
package/src/extensions/index.ts
CHANGED
|
@@ -5,8 +5,14 @@ export {
|
|
|
5
5
|
resolveAndLoadAgentPlugins,
|
|
6
6
|
resolvePluginConfigSearchPaths,
|
|
7
7
|
} from "./plugin/plugin-config-loader";
|
|
8
|
+
export type {
|
|
9
|
+
PluginInitializationFailure,
|
|
10
|
+
PluginInitializationWarning,
|
|
11
|
+
PluginLoadDiagnostics,
|
|
12
|
+
} from "./plugin/plugin-load-report";
|
|
8
13
|
export type { LoadAgentPluginFromPathOptions } from "./plugin/plugin-loader";
|
|
9
14
|
export {
|
|
10
15
|
loadAgentPluginFromPath,
|
|
11
16
|
loadAgentPluginsFromPaths,
|
|
17
|
+
loadAgentPluginsFromPathsWithDiagnostics,
|
|
12
18
|
} from "./plugin/plugin-loader";
|
|
@@ -6,6 +6,7 @@ import { afterEach, describe, expect, it } from "vitest";
|
|
|
6
6
|
import {
|
|
7
7
|
discoverPluginModulePaths,
|
|
8
8
|
resolveAgentPluginPaths,
|
|
9
|
+
resolveAndLoadAgentPlugins,
|
|
9
10
|
resolvePluginConfigSearchPaths,
|
|
10
11
|
} from "./plugin-config-loader";
|
|
11
12
|
|
|
@@ -142,4 +143,42 @@ describe("plugin-config-loader", () => {
|
|
|
142
143
|
await rm(workspace, { recursive: true, force: true });
|
|
143
144
|
}
|
|
144
145
|
});
|
|
146
|
+
|
|
147
|
+
it("loads valid plugins while reporting failures and duplicate overrides", async () => {
|
|
148
|
+
const root = await mkdtemp(join(tmpdir(), "core-plugin-config-loader-"));
|
|
149
|
+
try {
|
|
150
|
+
const first = join(root, "duplicate-one.js");
|
|
151
|
+
const second = join(root, "duplicate-two.js");
|
|
152
|
+
const invalid = join(root, "invalid.js");
|
|
153
|
+
await writeFile(
|
|
154
|
+
first,
|
|
155
|
+
"export default { name: 'duplicate-plugin', manifest: { capabilities: ['tools'] } };",
|
|
156
|
+
"utf8",
|
|
157
|
+
);
|
|
158
|
+
await writeFile(
|
|
159
|
+
second,
|
|
160
|
+
"export default { name: 'duplicate-plugin', manifest: { capabilities: ['commands'] } };",
|
|
161
|
+
"utf8",
|
|
162
|
+
);
|
|
163
|
+
await writeFile(invalid, "export default { name: 'broken' };", "utf8");
|
|
164
|
+
|
|
165
|
+
const loaded = await resolveAndLoadAgentPlugins({
|
|
166
|
+
mode: "in_process",
|
|
167
|
+
pluginPaths: [first, invalid, second],
|
|
168
|
+
cwd: root,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Filter to only our test plugins to ignore any discovered system plugins
|
|
172
|
+
const testPlugins = loaded.extensions.filter(
|
|
173
|
+
(plugin) => plugin.name === "duplicate-plugin",
|
|
174
|
+
);
|
|
175
|
+
expect(testPlugins).toHaveLength(1);
|
|
176
|
+
expect(testPlugins[0]?.manifest.capabilities).toEqual(["commands"]);
|
|
177
|
+
expect(loaded.failures).toHaveLength(1);
|
|
178
|
+
expect(loaded.warnings).toHaveLength(1);
|
|
179
|
+
expect(loaded.warnings[0]?.overriddenPluginPath).toBe(first);
|
|
180
|
+
} finally {
|
|
181
|
+
await rm(root, { recursive: true, force: true });
|
|
182
|
+
}
|
|
183
|
+
});
|
|
145
184
|
});
|