@clinebot/core 0.0.35 → 0.0.37
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 +1 -2
- package/dist/ClineCore.d.ts +362 -39
- package/dist/ClineCore.d.ts.map +1 -1
- package/dist/account/cline-account-service.d.ts.map +1 -1
- package/dist/account/index.d.ts +1 -1
- package/dist/account/index.d.ts.map +1 -1
- package/dist/account/rpc.d.ts +6 -6
- package/dist/account/rpc.d.ts.map +1 -1
- package/dist/cron/cron-event-ingress.d.ts +38 -0
- package/dist/cron/cron-event-ingress.d.ts.map +1 -0
- package/dist/cron/cron-materializer.d.ts +36 -0
- package/dist/cron/cron-materializer.d.ts.map +1 -0
- package/dist/cron/cron-reconciler.d.ts +62 -0
- package/dist/cron/cron-reconciler.d.ts.map +1 -0
- package/dist/cron/cron-report-writer.d.ts +41 -0
- package/dist/cron/cron-report-writer.d.ts.map +1 -0
- package/dist/cron/cron-runner.d.ts +43 -0
- package/dist/cron/cron-runner.d.ts.map +1 -0
- package/dist/cron/cron-schema.d.ts +3 -0
- package/dist/cron/cron-schema.d.ts.map +1 -0
- package/dist/cron/cron-service.d.ts +57 -0
- package/dist/cron/cron-service.d.ts.map +1 -0
- package/dist/cron/cron-spec-parser.d.ts +27 -0
- package/dist/cron/cron-spec-parser.d.ts.map +1 -0
- package/dist/cron/cron-watcher.d.ts +23 -0
- package/dist/cron/cron-watcher.d.ts.map +1 -0
- package/dist/cron/resource-limiter.d.ts +9 -0
- package/dist/cron/resource-limiter.d.ts.map +1 -0
- package/dist/cron/schedule-command-service.d.ts +10 -0
- package/dist/cron/schedule-command-service.d.ts.map +1 -0
- package/dist/cron/schedule-service.d.ts +100 -0
- package/dist/cron/schedule-service.d.ts.map +1 -0
- package/dist/cron/scheduler.d.ts +68 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/sqlite-cron-store.d.ts +230 -0
- package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
- package/dist/cron/sqlite-schedule-store.d.ts +52 -0
- package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
- package/dist/extensions/config/agent-config-loader.d.ts +4 -3
- package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
- package/dist/extensions/config/runtime-commands.d.ts +1 -0
- package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
- package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
- package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
- package/dist/extensions/context/agentic-compaction.d.ts +2 -2
- package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
- package/dist/extensions/context/compaction-shared.d.ts +5 -4
- package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
- package/dist/extensions/context/compaction.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-config-loader.d.ts +15 -2
- package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-loader.d.ts +13 -7
- package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts +21 -2
- package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
- package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
- package/dist/extensions/plugin-sandbox-bootstrap.js +237 -276
- package/dist/extensions/tools/constants.d.ts +1 -0
- package/dist/extensions/tools/constants.d.ts.map +1 -1
- package/dist/extensions/tools/definitions.d.ts +3 -4
- package/dist/extensions/tools/definitions.d.ts.map +1 -1
- package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
- package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
- package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
- package/dist/extensions/tools/executors/search.d.ts +1 -1
- package/dist/extensions/tools/executors/search.d.ts.map +1 -1
- package/dist/extensions/tools/helpers.d.ts +1 -0
- package/dist/extensions/tools/helpers.d.ts.map +1 -1
- package/dist/extensions/tools/index.d.ts +3 -2
- package/dist/extensions/tools/index.d.ts.map +1 -1
- package/dist/extensions/tools/presets.d.ts +27 -44
- package/dist/extensions/tools/presets.d.ts.map +1 -1
- package/dist/extensions/tools/runtime.d.ts +25 -0
- package/dist/extensions/tools/runtime.d.ts.map +1 -0
- package/dist/extensions/tools/schemas.d.ts +25 -3
- package/dist/extensions/tools/schemas.d.ts.map +1 -1
- package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
- package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
- package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
- package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
- package/dist/extensions/tools/team/team-tools.d.ts +1 -0
- package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
- package/dist/extensions/tools/types.d.ts +0 -5
- package/dist/extensions/tools/types.d.ts.map +1 -1
- package/dist/hooks/hook-bridge.d.ts +118 -0
- package/dist/hooks/hook-bridge.d.ts.map +1 -0
- package/dist/hooks/hook-file-hooks.d.ts +6 -2
- package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
- package/dist/hooks/hook-registry.d.ts +16 -0
- package/dist/hooks/hook-registry.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/subprocess.d.ts +8 -1
- package/dist/hooks/subprocess.d.ts.map +1 -1
- package/dist/hub/browser-websocket.d.ts +18 -0
- package/dist/hub/browser-websocket.d.ts.map +1 -0
- package/dist/hub/client.d.ts +51 -0
- package/dist/hub/client.d.ts.map +1 -0
- package/dist/hub/connect.d.ts +15 -0
- package/dist/hub/connect.d.ts.map +1 -0
- package/dist/hub/daemon-entry.d.ts +2 -0
- package/dist/hub/daemon-entry.d.ts.map +1 -0
- package/dist/hub/daemon-entry.js +1305 -0
- package/dist/hub/daemon.d.ts +5 -0
- package/dist/hub/daemon.d.ts.map +1 -0
- package/dist/hub/defaults.d.ts +17 -0
- package/dist/hub/defaults.d.ts.map +1 -0
- package/dist/hub/discovery.d.ts +29 -0
- package/dist/hub/discovery.d.ts.map +1 -0
- package/dist/hub/index.d.ts +15 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/index.js +1294 -0
- package/dist/hub/native-transport.d.ts +17 -0
- package/dist/hub/native-transport.d.ts.map +1 -0
- package/dist/hub/runtime-handlers.d.ts +11 -0
- package/dist/hub/runtime-handlers.d.ts.map +1 -0
- package/dist/hub/server.d.ts +104 -0
- package/dist/hub/server.d.ts.map +1 -0
- package/dist/hub/session-client.d.ts +90 -0
- package/dist/hub/session-client.d.ts.map +1 -0
- package/dist/hub/start-shared-server.d.ts +19 -0
- package/dist/hub/start-shared-server.d.ts.map +1 -0
- package/dist/hub/transport.d.ts +8 -0
- package/dist/hub/transport.d.ts.map +1 -0
- package/dist/hub/ui-client.d.ts +45 -0
- package/dist/hub/ui-client.d.ts.map +1 -0
- package/dist/hub/workspace.d.ts +4 -0
- package/dist/hub/workspace.d.ts.map +1 -0
- package/dist/index.d.ts +29 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +782 -471
- package/dist/llms/cline-recommended-models.d.ts +20 -0
- package/dist/llms/cline-recommended-models.d.ts.map +1 -0
- package/dist/llms/configured-provider-registry.d.ts +28 -0
- package/dist/llms/configured-provider-registry.d.ts.map +1 -0
- package/dist/llms/handler-factory.d.ts +16 -0
- package/dist/llms/handler-factory.d.ts.map +1 -0
- package/dist/llms/provider-defaults.d.ts +27 -0
- package/dist/llms/provider-defaults.d.ts.map +1 -0
- package/dist/llms/provider-settings.d.ts +245 -0
- package/dist/llms/provider-settings.d.ts.map +1 -0
- package/dist/llms/runtime-config.d.ts +4 -0
- package/dist/llms/runtime-config.d.ts.map +1 -0
- package/dist/llms/runtime-registry.d.ts +20 -0
- package/dist/llms/runtime-registry.d.ts.map +1 -0
- package/dist/llms/runtime-types.d.ts +85 -0
- package/dist/llms/runtime-types.d.ts.map +1 -0
- package/dist/runtime/agent-config-adapter.d.ts +148 -0
- package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
- package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
- package/dist/runtime/history.d.ts +6 -0
- package/dist/runtime/history.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +1 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/loop-detection.d.ts +59 -0
- package/dist/runtime/loop-detection.d.ts.map +1 -0
- package/dist/runtime/mistake-tracker.d.ts +69 -0
- package/dist/runtime/mistake-tracker.d.ts.map +1 -0
- package/dist/runtime/rules.d.ts +1 -0
- package/dist/runtime/rules.d.ts.map +1 -1
- package/dist/runtime/runtime-builder.d.ts.map +1 -1
- package/dist/runtime/runtime-event-adapter.d.ts +102 -0
- package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
- package/dist/runtime/runtime-host.d.ts +49 -26
- package/dist/runtime/runtime-host.d.ts.map +1 -1
- package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
- package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
- package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
- package/dist/runtime/session-runtime.d.ts +16 -21
- package/dist/runtime/session-runtime.d.ts.map +1 -1
- package/dist/runtime/user-input-builder.d.ts +24 -0
- package/dist/runtime/user-input-builder.d.ts.map +1 -0
- package/dist/services/global-settings.d.ts +12 -0
- package/dist/services/global-settings.d.ts.map +1 -0
- package/dist/services/index.js +28 -0
- package/dist/services/local-runtime-bootstrap.d.ts +9 -3
- package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
- package/dist/services/plugin-tools.d.ts +16 -0
- package/dist/services/plugin-tools.d.ts.map +1 -0
- package/dist/services/providers/local-provider-registry.d.ts +199 -23
- package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
- package/dist/services/providers/local-provider-service.d.ts +15 -13
- package/dist/services/providers/local-provider-service.d.ts.map +1 -1
- package/dist/services/session-data.d.ts +1 -1
- package/dist/services/session-data.d.ts.map +1 -1
- package/dist/services/session-telemetry.d.ts +7 -2
- package/dist/services/session-telemetry.d.ts.map +1 -1
- package/dist/services/storage/file-team-store.d.ts.map +1 -1
- package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
- package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
- package/dist/services/storage/provider-settings-manager.d.ts +1 -0
- package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
- package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
- package/dist/services/workspace-manifest.d.ts +11 -0
- package/dist/services/workspace-manifest.d.ts.map +1 -1
- package/dist/session/conversation-store.d.ts +30 -0
- package/dist/session/conversation-store.d.ts.map +1 -0
- package/dist/session/message-builder.d.ts +65 -0
- package/dist/session/message-builder.d.ts.map +1 -0
- package/dist/session/persistence-service.d.ts +11 -23
- package/dist/session/persistence-service.d.ts.map +1 -1
- package/dist/session/session-manifest-store.d.ts +22 -0
- package/dist/session/session-manifest-store.d.ts.map +1 -0
- package/dist/session/session-manifest.d.ts +1 -1
- package/dist/session/session-row.d.ts +93 -0
- package/dist/session/session-row.d.ts.map +1 -0
- package/dist/session/session-service.d.ts +2 -102
- package/dist/session/session-service.d.ts.map +1 -1
- package/dist/session/subagent-session-manager.d.ts +36 -0
- package/dist/session/subagent-session-manager.d.ts.map +1 -0
- package/dist/session/team-persistence-store.d.ts +24 -0
- package/dist/session/team-persistence-store.d.ts.map +1 -0
- package/dist/transports/hub.d.ts +58 -0
- package/dist/transports/hub.d.ts.map +1 -0
- package/dist/transports/local.d.ts +23 -9
- package/dist/transports/local.d.ts.map +1 -1
- package/dist/transports/remote.d.ts +10 -0
- package/dist/transports/remote.d.ts.map +1 -0
- package/dist/transports/runtime-host-support.d.ts +3 -2
- package/dist/transports/runtime-host-support.d.ts.map +1 -1
- package/dist/types/chat-schema.d.ts +15 -17
- package/dist/types/chat-schema.d.ts.map +1 -1
- package/dist/types/config.d.ts +17 -7
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/events.d.ts +7 -6
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/provider-settings.d.ts +4 -5
- package/dist/types/provider-settings.d.ts.map +1 -1
- package/dist/types/session.d.ts +7 -3
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types.d.ts +11 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +20 -6
- package/src/ClineCore.ts +757 -44
- package/src/account/cline-account-service.ts +44 -6
- package/src/account/index.ts +3 -3
- package/src/account/rpc.ts +12 -12
- package/src/cron/cron-event-ingress.ts +357 -0
- package/src/cron/cron-materializer.ts +97 -0
- package/src/cron/cron-reconciler.ts +241 -0
- package/src/cron/cron-report-writer.ts +153 -0
- package/src/cron/cron-runner.ts +495 -0
- package/src/cron/cron-schema.ts +127 -0
- package/src/cron/cron-service.ts +163 -0
- package/src/cron/cron-spec-parser.ts +489 -0
- package/src/cron/cron-watcher.ts +102 -0
- package/src/cron/index.ts +15 -0
- package/src/cron/resource-limiter.ts +46 -0
- package/src/cron/schedule-command-service.ts +193 -0
- package/src/cron/schedule-service.ts +703 -0
- package/src/cron/scheduler.ts +772 -0
- package/src/cron/sqlite-cron-store.ts +1286 -0
- package/src/cron/sqlite-schedule-store.ts +708 -0
- package/src/extensions/config/agent-config-loader.ts +17 -7
- package/src/extensions/config/runtime-commands.ts +6 -0
- package/src/extensions/config/user-instruction-config-loader.ts +1 -0
- package/src/extensions/context/agentic-compaction.ts +3 -3
- package/src/extensions/context/basic-compaction.ts +2 -2
- package/src/extensions/context/compaction-shared.ts +5 -4
- package/src/extensions/context/compaction.ts +3 -3
- package/src/extensions/plugin/plugin-config-loader.ts +37 -2
- package/src/extensions/plugin/plugin-loader.ts +69 -9
- package/src/extensions/plugin/plugin-module-import.ts +0 -2
- package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +243 -39
- package/src/extensions/plugin/plugin-sandbox.ts +173 -29
- package/src/extensions/plugin/plugin-targeting.ts +32 -0
- package/src/extensions/tools/constants.ts +2 -0
- package/src/extensions/tools/definitions.ts +61 -71
- package/src/extensions/tools/executors/apply-patch.ts +69 -80
- package/src/extensions/tools/executors/editor.ts +4 -3
- package/src/extensions/tools/executors/search.ts +195 -3
- package/src/extensions/tools/helpers.ts +24 -0
- package/src/extensions/tools/index.ts +11 -2
- package/src/extensions/tools/presets.ts +32 -47
- package/src/extensions/tools/runtime.ts +261 -0
- package/src/extensions/tools/schemas.ts +17 -20
- package/src/extensions/tools/team/delegated-agent.ts +8 -3
- package/src/extensions/tools/team/multi-agent.ts +135 -19
- package/src/extensions/tools/team/team-tools.ts +172 -91
- package/src/extensions/tools/types.ts +0 -6
- package/src/hooks/hook-bridge.ts +489 -0
- package/src/hooks/hook-file-hooks.ts +66 -5
- package/src/hooks/hook-registry.ts +257 -0
- package/src/hooks/index.ts +0 -7
- package/src/hooks/subprocess-runner.ts +1 -1
- package/src/hooks/subprocess.ts +9 -0
- package/src/hub/browser-websocket.ts +159 -0
- package/src/hub/client.ts +633 -0
- package/src/hub/connect.ts +156 -0
- package/src/hub/daemon-entry.ts +122 -0
- package/src/hub/daemon.ts +284 -0
- package/src/hub/defaults.ts +70 -0
- package/src/hub/discovery.ts +247 -0
- package/src/hub/index.ts +14 -0
- package/src/hub/native-transport.ts +31 -0
- package/src/hub/runtime-handlers.ts +141 -0
- package/src/hub/server.ts +2317 -0
- package/src/hub/session-client.ts +502 -0
- package/src/hub/start-shared-server.ts +61 -0
- package/src/hub/transport.ts +14 -0
- package/src/hub/ui-client.ts +126 -0
- package/src/hub/workspace.ts +19 -0
- package/src/index.ts +169 -68
- package/src/llms/cline-recommended-models.ts +167 -0
- package/src/llms/configured-provider-registry.ts +193 -0
- package/src/llms/handler-factory.ts +56 -0
- package/src/llms/provider-defaults.ts +653 -0
- package/src/llms/provider-settings.ts +310 -0
- package/src/llms/runtime-config.ts +43 -0
- package/src/llms/runtime-registry.ts +172 -0
- package/src/llms/runtime-types.ts +121 -0
- package/src/runtime/agent-config-adapter.ts +636 -0
- package/src/runtime/agent-runtime-config-builder.ts +205 -0
- package/src/runtime/error-feedback.ts +142 -0
- package/src/runtime/history.ts +137 -0
- package/src/runtime/host.ts +127 -267
- package/src/runtime/index.ts +1 -0
- package/src/runtime/loop-detection.ts +162 -0
- package/src/runtime/mistake-tracker.ts +221 -0
- package/src/runtime/rules.ts +12 -0
- package/src/runtime/runtime-builder.ts +85 -13
- package/src/runtime/runtime-event-adapter.ts +412 -0
- package/src/runtime/runtime-host.ts +134 -62
- package/src/runtime/runtime-oauth-token-manager.ts +11 -15
- package/src/runtime/session-runtime-orchestrator.ts +1253 -0
- package/src/runtime/session-runtime.ts +16 -26
- package/src/runtime/user-input-builder.ts +167 -0
- package/src/services/global-settings.ts +122 -0
- package/src/services/local-runtime-bootstrap.ts +175 -31
- package/src/services/plugin-tools.ts +86 -0
- package/src/services/providers/local-provider-registry.ts +277 -61
- package/src/services/providers/local-provider-service.ts +109 -44
- package/src/services/session-data.ts +18 -10
- package/src/services/session-telemetry.ts +6 -15
- package/src/services/storage/file-team-store.ts +1 -5
- package/src/services/storage/provider-settings-legacy-migration.ts +14 -51
- package/src/services/storage/provider-settings-manager.ts +17 -2
- package/src/services/storage/sqlite-team-store.ts +1 -5
- package/src/services/workspace-manifest.ts +18 -0
- package/src/session/conversation-store.ts +77 -0
- package/src/session/file-session-service.ts +1 -1
- package/src/session/index.ts +6 -27
- package/src/session/message-builder.ts +941 -0
- package/src/session/persistence-service.ts +119 -504
- package/src/session/session-manifest-store.ts +158 -0
- package/src/session/session-row.ts +199 -0
- package/src/session/session-service.ts +17 -376
- package/src/session/session-team-coordination.ts +1 -1
- package/src/session/subagent-session-manager.ts +397 -0
- package/src/session/team-persistence-store.ts +176 -0
- package/src/transports/hub.ts +1081 -0
- package/src/transports/local.ts +419 -93
- package/src/transports/remote.ts +27 -0
- package/src/transports/runtime-host-support.ts +63 -9
- package/src/types/chat-schema.ts +4 -5
- package/src/types/config.ts +17 -7
- package/src/types/events.ts +8 -6
- package/src/types/index.ts +3 -0
- package/src/types/provider-settings.ts +18 -7
- package/src/types/session.ts +7 -6
- package/src/types.ts +42 -2
- package/dist/hooks/persistent.d.ts +0 -64
- package/dist/hooks/persistent.d.ts.map +0 -1
- package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
- package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
- package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
- package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
- package/dist/services/telemetry/index.js +0 -15
- package/dist/session/rpc-session-service.d.ts +0 -16
- package/dist/session/rpc-session-service.d.ts.map +0 -1
- package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
- package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
- package/dist/transports/rpc.d.ts +0 -51
- package/dist/transports/rpc.d.ts.map +0 -1
- package/src/ClineCore.test.ts +0 -226
- package/src/account/cline-account-service.test.ts +0 -185
- package/src/account/featurebase-token.test.ts +0 -175
- package/src/account/rpc.test.ts +0 -63
- package/src/auth/bounded-ttl-cache.test.ts +0 -38
- package/src/auth/client.test.ts +0 -69
- package/src/auth/cline.test.ts +0 -267
- package/src/auth/codex.test.ts +0 -170
- package/src/auth/oca.test.ts +0 -340
- package/src/auth/server.test.ts +0 -287
- package/src/auth/utils.test.ts +0 -128
- package/src/extensions/config/agent-config-loader.test.ts +0 -236
- package/src/extensions/config/hooks-config-loader.test.ts +0 -20
- package/src/extensions/config/runtime-commands.test.ts +0 -115
- package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
- package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
- package/src/extensions/context/compaction.test.ts +0 -483
- package/src/extensions/mcp/config-loader.test.ts +0 -238
- package/src/extensions/mcp/manager.test.ts +0 -105
- package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
- package/src/extensions/plugin/plugin-loader.test.ts +0 -292
- package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
- package/src/extensions/tools/definitions.test.ts +0 -780
- package/src/extensions/tools/executors/bash.test.ts +0 -87
- package/src/extensions/tools/executors/editor.test.ts +0 -35
- package/src/extensions/tools/executors/file-read.test.ts +0 -125
- package/src/extensions/tools/model-tool-routing.test.ts +0 -86
- package/src/extensions/tools/presets.test.ts +0 -70
- package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
- package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
- package/src/extensions/tools/team/team-tools.test.ts +0 -918
- package/src/hooks/checkpoint-hooks.test.ts +0 -168
- package/src/hooks/hook-file-hooks.test.ts +0 -311
- package/src/hooks/persistent.ts +0 -661
- package/src/runtime/history.test.ts +0 -114
- package/src/runtime/host.test.ts +0 -230
- package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
- package/src/runtime/rpc-runtime-ensure.ts +0 -659
- package/src/runtime/rpc-spawn-lease.test.ts +0 -81
- package/src/runtime/rpc-spawn-lease.ts +0 -156
- package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
- package/src/runtime/runtime-builder.test.ts +0 -615
- package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
- package/src/runtime/runtime-parity.test.ts +0 -143
- package/src/services/providers/local-provider-service.test.ts +0 -1062
- package/src/services/session-data.test.ts +0 -160
- package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
- package/src/services/storage/provider-settings-manager.test.ts +0 -191
- package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
- package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
- package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
- package/src/services/telemetry/TelemetryService.test.ts +0 -134
- package/src/services/telemetry/distinct-id.test.ts +0 -57
- package/src/services/workspace/file-indexer.d.ts +0 -11
- package/src/services/workspace/file-indexer.test.ts +0 -156
- package/src/services/workspace/mention-enricher.test.ts +0 -106
- package/src/session/persistence-service.test.ts +0 -300
- package/src/session/rpc-session-service.ts +0 -114
- package/src/session/session-service.team-persistence.test.ts +0 -48
- package/src/session/sqlite-rpc-session-backend.ts +0 -301
- package/src/transports/local.e2e.test.ts +0 -380
- package/src/transports/local.test.ts +0 -2559
- package/src/transports/rpc.test.ts +0 -82
- package/src/transports/rpc.ts +0 -665
package/src/auth/server.test.ts
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
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/utils.test.ts
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
decodeJwtPayload,
|
|
4
|
-
isCredentialLikelyExpired,
|
|
5
|
-
parseAuthorizationInput,
|
|
6
|
-
parseOAuthError,
|
|
7
|
-
resolveAuthorizationCodeInput,
|
|
8
|
-
resolveUrl,
|
|
9
|
-
} from "./utils";
|
|
10
|
-
|
|
11
|
-
function toBase64Url(value: string): string {
|
|
12
|
-
return Buffer.from(value, "utf8").toString("base64url");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function createJwt(payload: Record<string, unknown>): string {
|
|
16
|
-
return `${toBase64Url(JSON.stringify({ alg: "none", typ: "JWT" }))}.${toBase64Url(JSON.stringify(payload))}.sig`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
describe("auth/utils", () => {
|
|
20
|
-
it("parses auth input from full URL with provider", () => {
|
|
21
|
-
const parsed = parseAuthorizationInput(
|
|
22
|
-
"http://localhost/callback?code=test-code&state=s1&provider=google",
|
|
23
|
-
{
|
|
24
|
-
includeProvider: true,
|
|
25
|
-
},
|
|
26
|
-
);
|
|
27
|
-
expect(parsed).toEqual({
|
|
28
|
-
code: "test-code",
|
|
29
|
-
state: "s1",
|
|
30
|
-
provider: "google",
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it("parses auth input from hash format when enabled", () => {
|
|
35
|
-
const parsed = parseAuthorizationInput("abc123#state1", {
|
|
36
|
-
allowHashCodeState: true,
|
|
37
|
-
});
|
|
38
|
-
expect(parsed).toEqual({ code: "abc123", state: "state1" });
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("builds resolved URLs from base + path", () => {
|
|
42
|
-
expect(resolveUrl("https://example.com/", "/token")).toBe(
|
|
43
|
-
"https://example.com/token",
|
|
44
|
-
);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it("decodes JWT payload", () => {
|
|
48
|
-
const token = createJwt({ sub: "account-1", exp: 123 });
|
|
49
|
-
expect(decodeJwtPayload(token)).toMatchObject({
|
|
50
|
-
sub: "account-1",
|
|
51
|
-
exp: 123,
|
|
52
|
-
});
|
|
53
|
-
expect(decodeJwtPayload("invalid")).toBeNull();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("parses OAuth error payloads from string and object forms", () => {
|
|
57
|
-
expect(
|
|
58
|
-
parseOAuthError(
|
|
59
|
-
JSON.stringify({
|
|
60
|
-
error: "invalid_grant",
|
|
61
|
-
error_description: "expired",
|
|
62
|
-
}),
|
|
63
|
-
),
|
|
64
|
-
).toEqual({
|
|
65
|
-
code: "invalid_grant",
|
|
66
|
-
message: "expired",
|
|
67
|
-
});
|
|
68
|
-
expect(
|
|
69
|
-
parseOAuthError(
|
|
70
|
-
JSON.stringify({ error: { type: "unauthorized", message: "denied" } }),
|
|
71
|
-
),
|
|
72
|
-
).toEqual({
|
|
73
|
-
code: "unauthorized",
|
|
74
|
-
message: "denied",
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it("resolves code from callback result", async () => {
|
|
79
|
-
const result = await resolveAuthorizationCodeInput({
|
|
80
|
-
waitForCallback: async () => ({
|
|
81
|
-
url: new URL("http://localhost"),
|
|
82
|
-
code: "from-callback",
|
|
83
|
-
state: "s1",
|
|
84
|
-
}),
|
|
85
|
-
cancelWait: () => {},
|
|
86
|
-
});
|
|
87
|
-
expect(result).toEqual({
|
|
88
|
-
code: "from-callback",
|
|
89
|
-
state: "s1",
|
|
90
|
-
provider: undefined,
|
|
91
|
-
error: undefined,
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("resolves code from manual input when callback does not provide one", async () => {
|
|
96
|
-
const cancelWait = vi.fn();
|
|
97
|
-
const result = await resolveAuthorizationCodeInput({
|
|
98
|
-
waitForCallback: async () => null,
|
|
99
|
-
cancelWait,
|
|
100
|
-
onManualCodeInput: async () => "code=manual&state=manual-state",
|
|
101
|
-
});
|
|
102
|
-
expect(cancelWait).toHaveBeenCalled();
|
|
103
|
-
expect(result).toEqual({
|
|
104
|
-
code: "manual",
|
|
105
|
-
state: "manual-state",
|
|
106
|
-
provider: undefined,
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("throws when manual input rejects", async () => {
|
|
111
|
-
await expect(
|
|
112
|
-
resolveAuthorizationCodeInput({
|
|
113
|
-
waitForCallback: async () => null,
|
|
114
|
-
cancelWait: () => {},
|
|
115
|
-
onManualCodeInput: async () => {
|
|
116
|
-
throw new Error("cancelled");
|
|
117
|
-
},
|
|
118
|
-
}),
|
|
119
|
-
).rejects.toThrow("cancelled");
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it("checks token expiry with configurable buffer", () => {
|
|
123
|
-
const nowSpy = vi.spyOn(Date, "now").mockReturnValue(1_000);
|
|
124
|
-
expect(isCredentialLikelyExpired({ expires: 1_500 }, 600)).toBe(true);
|
|
125
|
-
expect(isCredentialLikelyExpired({ expires: 3_000 }, 600)).toBe(false);
|
|
126
|
-
nowSpy.mockRestore();
|
|
127
|
-
});
|
|
128
|
-
});
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import type { Tool, ToolContext } from "@clinebot/shared";
|
|
5
|
-
import { resolveDocumentsExtensionPath } from "@clinebot/shared/storage";
|
|
6
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
-
import {
|
|
8
|
-
AGENT_CONFIG_DIRECTORY_NAME,
|
|
9
|
-
createAgentConfigDefinition,
|
|
10
|
-
parseAgentConfigFromYaml,
|
|
11
|
-
parsePartialAgentConfigFromYaml,
|
|
12
|
-
readAgentConfigsFromDisk,
|
|
13
|
-
resolveAgentConfigSearchPaths,
|
|
14
|
-
resolveAgentsConfigDirPath,
|
|
15
|
-
resolveAgentTools,
|
|
16
|
-
toPartialAgentConfig,
|
|
17
|
-
} from "./agent-config-loader";
|
|
18
|
-
|
|
19
|
-
function createMockTool(name: string): Tool {
|
|
20
|
-
return {
|
|
21
|
-
name,
|
|
22
|
-
description: `${name} tool`,
|
|
23
|
-
inputSchema: {
|
|
24
|
-
type: "object",
|
|
25
|
-
properties: {},
|
|
26
|
-
},
|
|
27
|
-
execute: async (_input: unknown, _context: ToolContext) => null,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
describe("agent config YAML loader", () => {
|
|
32
|
-
const envSnapshot = {
|
|
33
|
-
CLINE_DATA_DIR: process.env.CLINE_DATA_DIR,
|
|
34
|
-
};
|
|
35
|
-
afterEach(() => {
|
|
36
|
-
process.env.CLINE_DATA_DIR = envSnapshot.CLINE_DATA_DIR;
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("resolves default agents settings directory from CLINE_DATA_DIR", () => {
|
|
40
|
-
process.env.CLINE_DATA_DIR = "/tmp/cline-data";
|
|
41
|
-
expect(resolveAgentsConfigDirPath()).toBe(
|
|
42
|
-
join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("includes documents and settings search paths", () => {
|
|
47
|
-
process.env.CLINE_DATA_DIR = "/tmp/cline-data";
|
|
48
|
-
expect(resolveAgentConfigSearchPaths()).toEqual([
|
|
49
|
-
resolveDocumentsExtensionPath("Agents"),
|
|
50
|
-
join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
|
|
51
|
-
]);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("builds a reusable unified watcher definition with expected defaults", () => {
|
|
55
|
-
process.env.CLINE_DATA_DIR = "/tmp/cline-data";
|
|
56
|
-
const definition = createAgentConfigDefinition();
|
|
57
|
-
expect(definition.type).toBe("agent");
|
|
58
|
-
expect(definition.directories).toEqual([
|
|
59
|
-
resolveDocumentsExtensionPath("Agents"),
|
|
60
|
-
join("/tmp/cline-data", "settings", AGENT_CONFIG_DIRECTORY_NAME),
|
|
61
|
-
]);
|
|
62
|
-
expect(definition.includeFile?.("agent.yaml", "/tmp/agent.yaml")).toBe(
|
|
63
|
-
true,
|
|
64
|
-
);
|
|
65
|
-
expect(definition.includeFile?.("agent.md", "/tmp/agent.md")).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("parses yaml frontmatter and prompt body", () => {
|
|
69
|
-
const content = `---
|
|
70
|
-
name: Researcher
|
|
71
|
-
description: Focus on repository analysis
|
|
72
|
-
modelId: claude-sonnet-4-6
|
|
73
|
-
tools:
|
|
74
|
-
- read_files
|
|
75
|
-
- search_codebase
|
|
76
|
-
skills:
|
|
77
|
-
- context-gathering
|
|
78
|
-
---
|
|
79
|
-
You are a focused codebase researcher.`;
|
|
80
|
-
|
|
81
|
-
const parsed = parseAgentConfigFromYaml(content);
|
|
82
|
-
|
|
83
|
-
expect(parsed).toEqual({
|
|
84
|
-
name: "Researcher",
|
|
85
|
-
description: "Focus on repository analysis",
|
|
86
|
-
modelId: "claude-sonnet-4-6",
|
|
87
|
-
tools: ["read_files", "search_codebase"],
|
|
88
|
-
skills: ["context-gathering"],
|
|
89
|
-
systemPrompt: "You are a focused codebase researcher.",
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it("supports comma-separated tool and skill values", () => {
|
|
94
|
-
const parsed = parseAgentConfigFromYaml(`---
|
|
95
|
-
name: Reviewer
|
|
96
|
-
description: Reviews diffs
|
|
97
|
-
tools: read_files,search_codebase,read_files
|
|
98
|
-
skills: quality, quality,architecture
|
|
99
|
-
---
|
|
100
|
-
Review every patch for regressions.`);
|
|
101
|
-
|
|
102
|
-
expect(parsed.tools).toEqual(["read_files", "search_codebase"]);
|
|
103
|
-
expect(parsed.skills).toEqual(["quality", "architecture"]);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it("throws when frontmatter is missing", () => {
|
|
107
|
-
expect(() => parseAgentConfigFromYaml("No frontmatter")).toThrow(
|
|
108
|
-
"Missing YAML frontmatter block in agent config file.",
|
|
109
|
-
);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it("throws for unknown tools", () => {
|
|
113
|
-
expect(() =>
|
|
114
|
-
parseAgentConfigFromYaml(`---
|
|
115
|
-
name: UnknownTool
|
|
116
|
-
description: test
|
|
117
|
-
tools: invalid_tool
|
|
118
|
-
---
|
|
119
|
-
prompt`),
|
|
120
|
-
).toThrow("Unknown tool 'invalid_tool'.");
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it("resolves configured tool names from available tools", () => {
|
|
124
|
-
const readFiles = createMockTool("read_files");
|
|
125
|
-
const searchCodebase = createMockTool("search_codebase");
|
|
126
|
-
|
|
127
|
-
expect(
|
|
128
|
-
resolveAgentTools(
|
|
129
|
-
["read_files", "search_codebase"],
|
|
130
|
-
[searchCodebase, readFiles],
|
|
131
|
-
),
|
|
132
|
-
).toEqual([readFiles, searchCodebase]);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it("converts parsed config to partial AgentConfig", () => {
|
|
136
|
-
const readFiles = createMockTool("read_files");
|
|
137
|
-
const config = parseAgentConfigFromYaml(`---
|
|
138
|
-
name: Reader
|
|
139
|
-
description: Reads files
|
|
140
|
-
modelId: claude-sonnet-4-6
|
|
141
|
-
tools: read_files
|
|
142
|
-
skills: commit, review
|
|
143
|
-
---
|
|
144
|
-
Be precise.`);
|
|
145
|
-
|
|
146
|
-
const partial = toPartialAgentConfig(config, {
|
|
147
|
-
availableTools: [readFiles],
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
expect(partial.modelId).toBe("claude-sonnet-4-6");
|
|
151
|
-
expect(partial.systemPrompt).toBe("Be precise.");
|
|
152
|
-
expect(partial.tools).toEqual([readFiles]);
|
|
153
|
-
expect(partial.skills).toEqual(["commit", "review"]);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("throws when tool overrides are configured without available tools", () => {
|
|
157
|
-
expect(() =>
|
|
158
|
-
parsePartialAgentConfigFromYaml(`---
|
|
159
|
-
name: Reader
|
|
160
|
-
description: Reads files
|
|
161
|
-
tools: read_files
|
|
162
|
-
---
|
|
163
|
-
Be precise.`),
|
|
164
|
-
).toThrow(
|
|
165
|
-
"Configured tools cannot be converted into AgentConfig.tools without availableTools.",
|
|
166
|
-
);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it("reads agent configs from ~/.cline/data/settings/agents-compatible directory", async () => {
|
|
170
|
-
const tempRoot = await mkdtemp(join(tmpdir(), "core-agent-config-loader-"));
|
|
171
|
-
const agentsDir = join(tempRoot, "settings", AGENT_CONFIG_DIRECTORY_NAME);
|
|
172
|
-
await mkdir(agentsDir, { recursive: true });
|
|
173
|
-
try {
|
|
174
|
-
await writeFile(
|
|
175
|
-
join(agentsDir, "reviewer.yaml"),
|
|
176
|
-
`---
|
|
177
|
-
name: Reviewer
|
|
178
|
-
description: Reviews patches
|
|
179
|
-
tools: read_files
|
|
180
|
-
---
|
|
181
|
-
Review code for regressions.`,
|
|
182
|
-
);
|
|
183
|
-
await writeFile(
|
|
184
|
-
join(agentsDir, "invalid.yaml"),
|
|
185
|
-
`---
|
|
186
|
-
name:
|
|
187
|
-
---
|
|
188
|
-
`,
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
const loaded = await readAgentConfigsFromDisk(agentsDir);
|
|
192
|
-
expect([...loaded.keys()]).toEqual(["reviewer"]);
|
|
193
|
-
expect(loaded.get("reviewer")?.systemPrompt).toBe(
|
|
194
|
-
"Review code for regressions.",
|
|
195
|
-
);
|
|
196
|
-
} finally {
|
|
197
|
-
await rm(tempRoot, { recursive: true, force: true });
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it("reads from both documents and settings directories", async () => {
|
|
202
|
-
const tempRoot = await mkdtemp(join(tmpdir(), "core-agent-config-loader-"));
|
|
203
|
-
const documentsDir = join(tempRoot, "Documents", "Cline", "Agents");
|
|
204
|
-
const settingsDir = join(tempRoot, "settings", AGENT_CONFIG_DIRECTORY_NAME);
|
|
205
|
-
await mkdir(documentsDir, { recursive: true });
|
|
206
|
-
await mkdir(settingsDir, { recursive: true });
|
|
207
|
-
try {
|
|
208
|
-
await writeFile(
|
|
209
|
-
join(documentsDir, "legacy.yaml"),
|
|
210
|
-
`---
|
|
211
|
-
name: LegacyAgent
|
|
212
|
-
description: legacy
|
|
213
|
-
---
|
|
214
|
-
legacy prompt`,
|
|
215
|
-
);
|
|
216
|
-
await writeFile(
|
|
217
|
-
join(settingsDir, "new.yaml"),
|
|
218
|
-
`---
|
|
219
|
-
name: NewAgent
|
|
220
|
-
description: new
|
|
221
|
-
---
|
|
222
|
-
new prompt`,
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
const loaded = await readAgentConfigsFromDisk([
|
|
226
|
-
documentsDir,
|
|
227
|
-
settingsDir,
|
|
228
|
-
]);
|
|
229
|
-
expect([...loaded.keys()].sort()).toEqual(["legacyagent", "newagent"]);
|
|
230
|
-
expect(loaded.get("legacyagent")?.systemPrompt).toBe("legacy prompt");
|
|
231
|
-
expect(loaded.get("newagent")?.systemPrompt).toBe("new prompt");
|
|
232
|
-
} finally {
|
|
233
|
-
await rm(tempRoot, { recursive: true, force: true });
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
});
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
HookConfigFileName,
|
|
4
|
-
toHookConfigFileName,
|
|
5
|
-
} from "./hooks-config-loader";
|
|
6
|
-
|
|
7
|
-
describe("hooks config loader", () => {
|
|
8
|
-
afterEach(() => {
|
|
9
|
-
delete process.env.CLINE_DATA_DIR;
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it("recognizes PowerShell hook files", () => {
|
|
13
|
-
expect(toHookConfigFileName("PreToolUse.ps1")).toBe(
|
|
14
|
-
HookConfigFileName.PreToolUse,
|
|
15
|
-
);
|
|
16
|
-
expect(toHookConfigFileName("TaskError.ps1")).toBe(
|
|
17
|
-
HookConfigFileName.TaskError,
|
|
18
|
-
);
|
|
19
|
-
});
|
|
20
|
-
});
|