@skaile/workspaces 4.5.2 → 4.7.0
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/CHANGELOG.md +18 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-G4WIFRFX.js → asset-feeds-CV7EE4GI.js} +7 -7
- package/dist/{asset-feeds-G4WIFRFX.js.map → asset-feeds-CV7EE4GI.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +3 -3
- package/dist/asset-manager/index.js +6 -6
- package/dist/asset-manager/installer.js +4 -4
- package/dist/bridge/codex-app-server.js +4 -4
- package/dist/bridge/drivers/claude-sdk.js +54 -11
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +6 -6
- package/dist/bridge/drivers/continue.js +6 -6
- package/dist/bridge/drivers/echo.js +3 -3
- package/dist/bridge/drivers/gemini.js +4 -4
- package/dist/bridge/drivers/goose.js +6 -6
- package/dist/bridge/drivers/omp.js +1 -1
- package/dist/bridge/drivers/opencode.js +6 -6
- package/dist/bridge/drivers/qwen.js +4 -4
- package/dist/bridge/index.js +8 -8
- package/dist/bridge/src/drivers/claude-sdk.d.ts +16 -0
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/{chunk-NOH5UDO7.js → chunk-3GKBSHUG.js} +3 -3
- package/dist/{chunk-NOH5UDO7.js.map → chunk-3GKBSHUG.js.map} +1 -1
- package/dist/{chunk-GNXKNQPU.js → chunk-4AAEBUX7.js} +7 -7
- package/dist/{chunk-GNXKNQPU.js.map → chunk-4AAEBUX7.js.map} +1 -1
- package/dist/{chunk-JXCUUZA3.js → chunk-4ZTPYIBE.js} +9 -6
- package/dist/chunk-4ZTPYIBE.js.map +1 -0
- package/dist/{chunk-C2CYBRYJ.js → chunk-5GYFYGVW.js} +2 -2
- package/dist/{chunk-C2CYBRYJ.js.map → chunk-5GYFYGVW.js.map} +1 -1
- package/dist/{chunk-CKLCKPC7.js → chunk-7UM46L33.js} +2 -2
- package/dist/{chunk-CKLCKPC7.js.map → chunk-7UM46L33.js.map} +1 -1
- package/dist/{chunk-3OLCTLTH.js → chunk-7WVPAQPE.js} +3 -2
- package/dist/chunk-7WVPAQPE.js.map +1 -0
- package/dist/{chunk-Q5C77OZW.js → chunk-A42QGGSB.js} +3 -3
- package/dist/{chunk-Q5C77OZW.js.map → chunk-A42QGGSB.js.map} +1 -1
- package/dist/{chunk-UJPVUN6H.js → chunk-BCXZ74DM.js} +4 -4
- package/dist/{chunk-UJPVUN6H.js.map → chunk-BCXZ74DM.js.map} +1 -1
- package/dist/{chunk-PTETBRRC.js → chunk-DS7B54NF.js} +3 -3
- package/dist/{chunk-PTETBRRC.js.map → chunk-DS7B54NF.js.map} +1 -1
- package/dist/{chunk-KW7YIRYL.js → chunk-DYT3AQBM.js} +44 -4
- package/dist/chunk-DYT3AQBM.js.map +1 -0
- package/dist/{chunk-YVQZQGVW.js → chunk-HBBVWZ4T.js} +5 -5
- package/dist/{chunk-YVQZQGVW.js.map → chunk-HBBVWZ4T.js.map} +1 -1
- package/dist/{chunk-K27T47OO.js → chunk-HKOC273F.js} +71 -5
- package/dist/chunk-HKOC273F.js.map +1 -0
- package/dist/{chunk-COK4WPU4.js → chunk-HR2AGPLJ.js} +4 -4
- package/dist/{chunk-COK4WPU4.js.map → chunk-HR2AGPLJ.js.map} +1 -1
- package/dist/{chunk-6GA27VV4.js → chunk-HVTU3CVF.js} +189 -50
- package/dist/chunk-HVTU3CVF.js.map +1 -0
- package/dist/{chunk-W3YYB7K7.js → chunk-IECSLI55.js} +3 -3
- package/dist/{chunk-W3YYB7K7.js.map → chunk-IECSLI55.js.map} +1 -1
- package/dist/{chunk-VP2CACF2.js → chunk-IUVPPJ4T.js} +3 -3
- package/dist/{chunk-VP2CACF2.js.map → chunk-IUVPPJ4T.js.map} +1 -1
- package/dist/{chunk-35XUCUKZ.js → chunk-J2NEKEZK.js} +3 -3
- package/dist/{chunk-35XUCUKZ.js.map → chunk-J2NEKEZK.js.map} +1 -1
- package/dist/{chunk-VJJUKODI.js → chunk-JH63TVZG.js} +5 -5
- package/dist/{chunk-VJJUKODI.js.map → chunk-JH63TVZG.js.map} +1 -1
- package/dist/{chunk-WVSF3IEQ.js → chunk-JWWER4L5.js} +2 -2
- package/dist/{chunk-WVSF3IEQ.js.map → chunk-JWWER4L5.js.map} +1 -1
- package/dist/{chunk-AMJEPVNB.js → chunk-MHROUPZN.js} +9 -9
- package/dist/{chunk-AMJEPVNB.js.map → chunk-MHROUPZN.js.map} +1 -1
- package/dist/{chunk-NWZQMJTI.js → chunk-NIHNZC6E.js} +3 -3
- package/dist/{chunk-NWZQMJTI.js.map → chunk-NIHNZC6E.js.map} +1 -1
- package/dist/{chunk-PJP2TOCB.js → chunk-NV6R6HJR.js} +5 -5
- package/dist/{chunk-PJP2TOCB.js.map → chunk-NV6R6HJR.js.map} +1 -1
- package/dist/{chunk-Y5E6LHSQ.js → chunk-NYRLSXTB.js} +125 -67
- package/dist/chunk-NYRLSXTB.js.map +1 -0
- package/dist/{chunk-DHYIUGZW.js → chunk-P2PXD3AF.js} +6 -6
- package/dist/{chunk-DHYIUGZW.js.map → chunk-P2PXD3AF.js.map} +1 -1
- package/dist/{chunk-JF77XKD7.js → chunk-Q5WGUPC5.js} +3 -3
- package/dist/{chunk-JF77XKD7.js.map → chunk-Q5WGUPC5.js.map} +1 -1
- package/dist/{chunk-U4AA7MOV.js → chunk-QAH24E5U.js} +6 -3
- package/dist/chunk-QAH24E5U.js.map +1 -0
- package/dist/{chunk-CNYIITSZ.js → chunk-R4OMDCGZ.js} +3 -3
- package/dist/{chunk-CNYIITSZ.js.map → chunk-R4OMDCGZ.js.map} +1 -1
- package/dist/{chunk-MKJ2QYID.js → chunk-RN3N7PHY.js} +5 -5
- package/dist/{chunk-MKJ2QYID.js.map → chunk-RN3N7PHY.js.map} +1 -1
- package/dist/{chunk-XXRQHASJ.js → chunk-S5TEP5WI.js} +7 -7
- package/dist/{chunk-XXRQHASJ.js.map → chunk-S5TEP5WI.js.map} +1 -1
- package/dist/chunk-SDNGG6FB.js +32 -0
- package/dist/chunk-SDNGG6FB.js.map +1 -0
- package/dist/{chunk-REILIKVM.js → chunk-SU5LVG6T.js} +3 -3
- package/dist/{chunk-REILIKVM.js.map → chunk-SU5LVG6T.js.map} +1 -1
- package/dist/{chunk-23BTREZQ.js → chunk-TKHJXUG3.js} +4 -4
- package/dist/{chunk-23BTREZQ.js.map → chunk-TKHJXUG3.js.map} +1 -1
- package/dist/{chunk-GVOPQBGM.js → chunk-U4LC6PLI.js} +4 -4
- package/dist/{chunk-GVOPQBGM.js.map → chunk-U4LC6PLI.js.map} +1 -1
- package/dist/{chunk-YSJKLJD4.js → chunk-VRBEMXEM.js} +3 -3
- package/dist/{chunk-YSJKLJD4.js.map → chunk-VRBEMXEM.js.map} +1 -1
- package/dist/{chunk-JHPBSZIP.js → chunk-XENB453B.js} +4 -4
- package/dist/{chunk-JHPBSZIP.js.map → chunk-XENB453B.js.map} +1 -1
- package/dist/cli/index.js +53 -52
- package/dist/cli/index.js.map +1 -1
- package/dist/connectors/config.js +4 -4
- package/dist/connectors/index.js +12 -11
- package/dist/connectors/src/classify-connect-error.d.ts +20 -0
- package/dist/connectors/src/classify-connect-error.d.ts.map +1 -0
- package/dist/connectors/src/config.d.ts.map +1 -1
- package/dist/connectors/src/connect-error-kind.d.ts +47 -0
- package/dist/connectors/src/connect-error-kind.d.ts.map +1 -0
- package/dist/connectors/src/connector-manager.d.ts +9 -0
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
- package/dist/connectors/src/connector-types.d.ts +25 -0
- package/dist/connectors/src/connector-types.d.ts.map +1 -1
- package/dist/connectors/src/index.d.ts +5 -2
- package/dist/connectors/src/index.d.ts.map +1 -1
- package/dist/connectors-shared/index.js +2 -0
- package/dist/connectors-shared/index.js.map +1 -1
- package/dist/connectors-shared/src/index.d.ts +7 -2
- package/dist/connectors-shared/src/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -3
- package/dist/core/runtime-assets.js +2 -2
- package/dist/core/src/index.d.ts +1 -1
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +64 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +1 -1
- package/dist/deploy/index.js +3 -3
- package/dist/{ensure-sources-J5J2TBRA.js → ensure-sources-E5C3NAZ5.js} +9 -9
- package/dist/{ensure-sources-J5J2TBRA.js.map → ensure-sources-E5C3NAZ5.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +12 -11
- package/dist/factory-assets/connectors/deploy.js +12 -11
- package/dist/factory-assets/connectors/devserver.js +12 -11
- package/dist/factory-assets/connectors/flow/adapter.js +12 -11
- package/dist/factory-assets/connectors/flow/engine.js +4 -4
- package/dist/factory-assets/connectors/flow/run-flow.js +13 -12
- package/dist/factory-assets/connectors/flow.js +12 -11
- package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
- package/dist/factory-assets/connectors/git.js +12 -11
- package/dist/factory-assets/connectors/gmail.js +12 -11
- package/dist/factory-assets/connectors/googledrive.js +12 -11
- package/dist/factory-assets/connectors/local.js +12 -11
- package/dist/factory-assets/connectors/mattermost.js +12 -11
- package/dist/factory-assets/connectors/memory.js +12 -11
- package/dist/factory-assets/connectors/minio.js +12 -11
- package/dist/factory-assets/connectors/postgres.js +12 -11
- package/dist/factory-assets/connectors/s3.js +12 -11
- package/dist/factory-assets/connectors/sharepoint.js +12 -11
- package/dist/factory-assets/connectors/sqlite.js +12 -11
- package/dist/factory-assets/connectors/static-server.js +12 -11
- package/dist/factory-assets/connectors/tunnel.js +12 -11
- package/dist/factory-assets/connectors/webdav.js +12 -11
- package/dist/factory-assets/connectors/xstate-store.js +12 -11
- package/dist/factory-assets/connectors/xstate.js +12 -11
- package/dist/{flows-X4KJC4RH.js → flows-DAA2HPCK.js} +6 -6
- package/dist/{flows-X4KJC4RH.js.map → flows-DAA2HPCK.js.map} +1 -1
- package/dist/{helpers-OJJNDSPO.js → helpers-B37XGJHI.js} +9 -9
- package/dist/{helpers-OJJNDSPO.js.map → helpers-B37XGJHI.js.map} +1 -1
- package/dist/library/index.js +4 -4
- package/dist/library/install.js +3 -3
- package/dist/{library-publish-TDT5HCLA.js → library-publish-ANMJDDZH.js} +13 -13
- package/dist/{library-publish-TDT5HCLA.js.map → library-publish-ANMJDDZH.js.map} +1 -1
- package/dist/{open-library-OAVUUOAN.js → open-library-O5HS654Y.js} +11 -11
- package/dist/{open-library-OAVUUOAN.js.map → open-library-O5HS654Y.js.map} +1 -1
- package/dist/{paths-FRD62K2N.js → paths-LH7LD4CC.js} +6 -6
- package/dist/{paths-FRD62K2N.js.map → paths-LH7LD4CC.js.map} +1 -1
- package/dist/{plugin-store-54SEASTK.js → plugin-store-A6VLQHCT.js} +5 -5
- package/dist/{plugin-store-54SEASTK.js.map → plugin-store-A6VLQHCT.js.map} +1 -1
- package/dist/{project-PNSDEXUH.js → project-DLAPSJ36.js} +10 -10
- package/dist/{project-PNSDEXUH.js.map → project-DLAPSJ36.js.map} +1 -1
- package/dist/resolver/index.js +3 -3
- package/dist/runner/index.js +18 -17
- package/dist/runner/src/runner-capabilities.d.ts +33 -2
- package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
- package/dist/runner/src/serial-lock.d.ts +17 -0
- package/dist/runner/src/serial-lock.d.ts.map +1 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-capability-wiring.d.ts +5 -0
- package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
- package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
- package/dist/runner/src/skill-staging.d.ts +76 -0
- package/dist/runner/src/skill-staging.d.ts.map +1 -0
- package/dist/sdk/asset-manager.js +6 -6
- package/dist/sdk/bridge.js +8 -8
- package/dist/sdk/core.js +3 -3
- package/dist/sdk/flow.js +4 -4
- package/dist/sdk/index.js +18 -17
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +3 -3
- package/dist/sdk/runner.js +18 -17
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/store.js +1 -1
- package/dist/sdk/types.js +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-6FAITLPM.js → setup-TMPJSDCX.js} +15 -15
- package/dist/{setup-6FAITLPM.js.map → setup-TMPJSDCX.js.map} +1 -1
- package/dist/{skills-C6NOMIBV.js → skills-ZO66BL2Y.js} +5 -5
- package/dist/{skills-C6NOMIBV.js.map → skills-ZO66BL2Y.js.map} +1 -1
- package/dist/{source-RTVNF6GB.js → source-5WMBWNO7.js} +12 -12
- package/dist/{source-RTVNF6GB.js.map → source-5WMBWNO7.js.map} +1 -1
- package/dist/{source-manifest-publish-U2PVHXCF.js → source-manifest-publish-WBVQV3JC.js} +14 -14
- package/dist/{source-manifest-publish-U2PVHXCF.js.map → source-manifest-publish-WBVQV3JC.js.map} +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/src/resource-client.d.ts.map +1 -1
- package/dist/store/src/types.d.ts +3 -1
- package/dist/store/src/types.d.ts.map +1 -1
- package/dist/tui/index.js +18 -17
- package/dist/tui/index.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/src/events.d.ts +22 -0
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/validator-FA2PFW6N.js +5 -0
- package/dist/{validator-P5ESKTW5.js.map → validator-FA2PFW6N.js.map} +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +7 -7
- package/dist/workspace-plugin/adapters/omp.js +10 -10
- package/dist/workspace-plugin/index.js +1 -1
- package/dist/workspace-plugin/src/tools/validator.d.ts +1 -0
- package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3OLCTLTH.js.map +0 -1
- package/dist/chunk-6GA27VV4.js.map +0 -1
- package/dist/chunk-JXCUUZA3.js.map +0 -1
- package/dist/chunk-K27T47OO.js.map +0 -1
- package/dist/chunk-KW7YIRYL.js.map +0 -1
- package/dist/chunk-U4AA7MOV.js.map +0 -1
- package/dist/chunk-Y5E6LHSQ.js.map +0 -1
- package/dist/validator-P5ESKTW5.js +0 -5
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-
|
|
2
|
-
import { getStaticModels, fetchProviderModels } from './chunk-
|
|
3
|
-
import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-
|
|
1
|
+
import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-Q5WGUPC5.js';
|
|
2
|
+
import { getStaticModels, fetchProviderModels } from './chunk-IUVPPJ4T.js';
|
|
3
|
+
import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-5GYFYGVW.js';
|
|
4
4
|
import * as z from 'zod';
|
|
5
5
|
|
|
6
6
|
var GOOGLE_DEFAULT_BASE_URL = getProviderPreset("google")?.base_url;
|
|
@@ -183,5 +183,5 @@ var geminiDriverTarget = {
|
|
|
183
183
|
};
|
|
184
184
|
|
|
185
185
|
export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget };
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
187
|
-
//# sourceMappingURL=chunk-
|
|
186
|
+
//# sourceMappingURL=chunk-NV6R6HJR.js.map
|
|
187
|
+
//# sourceMappingURL=chunk-NV6R6HJR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-PJP2TOCB.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-NV6R6HJR.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { declaredConnectErrorKind, ClassifiedConnectError, withConnectErrorKind } from './chunk-SDNGG6FB.js';
|
|
2
|
+
import { OAuthRequiredError, ConnectorFieldMissingError, LegacyAuthGrammarError, resolveAuthRef, readUnavailableMarker, ConnectorStartupError } from './chunk-DYT3AQBM.js';
|
|
3
|
+
import { EventNormalizer } from './chunk-U4LC6PLI.js';
|
|
4
|
+
import { resolveModelTier } from './chunk-IUVPPJ4T.js';
|
|
5
|
+
import { createDriver } from './chunk-5GYFYGVW.js';
|
|
5
6
|
import { pluginRegistry } from './chunk-6E6PKKAD.js';
|
|
6
7
|
import { computeStimulus } from './chunk-IFGTRL2I.js';
|
|
7
|
-
import { interpolateNodeInstruction, resolveNodeBindings, getConsumedOutputSchema, validateConsumedNodeOutput, appendAttempt, resolveTerminalFailureStatus, remainingActiveExecutionMs, deriveCheckEvidence, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, countFailedAttempts, hasAutomaticRetryBudget, persistedRouterSelection } from './chunk-
|
|
8
|
+
import { interpolateNodeInstruction, resolveNodeBindings, getConsumedOutputSchema, validateConsumedNodeOutput, appendAttempt, resolveTerminalFailureStatus, remainingActiveExecutionMs, deriveCheckEvidence, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, countFailedAttempts, hasAutomaticRetryBudget, persistedRouterSelection } from './chunk-NIHNZC6E.js';
|
|
8
9
|
import { INPUT_SCHEMA_SHAPES_HINT, coerceInputSchema } from './chunk-TIOT3ZOQ.js';
|
|
9
10
|
import { classifierDecision, withoutReservedClassifierFields, parseFlowDefinition } from './chunk-53ORCYPJ.js';
|
|
10
11
|
import { describeStimulus, buildOrchestratorPrompt, renderSubpromptPrompt, renderStimulusPrompt } from './chunk-2D5BYAL6.js';
|
|
11
12
|
import { deterministicNodeKindLabel, nodeInstruction, flowDefaults, isAgentNode, isGateNode, isCheckNode, nodeRequiresApproval, isSubFlowNode, isFunctionNode, isSubpromptNode, isRouterNode, isActiveRuntimeNode, nodeIsOptional, nodeLabel, nodeAssets } from './chunk-ELPR5XBG.js';
|
|
12
|
-
import { withActivityLabelDefs } from './chunk-
|
|
13
|
-
import { processAlive } from './chunk-
|
|
13
|
+
import { withActivityLabelDefs } from './chunk-QAH24E5U.js';
|
|
14
|
+
import { processAlive } from './chunk-BCXZ74DM.js';
|
|
14
15
|
import { withFsDeadline, tryWithFsDeadline, FsDeadlineError, fsDeadlineMs } from './chunk-MKZOK4JU.js';
|
|
15
16
|
import { portableSpawn } from './chunk-KSIRR5PL.js';
|
|
16
17
|
import { createLogger } from './chunk-W4IPN3DD.js';
|
|
@@ -734,6 +735,16 @@ function runIsolatedPrompt(driver, prompt) {
|
|
|
734
735
|
driver.prompt(prompt).catch(done);
|
|
735
736
|
});
|
|
736
737
|
}
|
|
738
|
+
|
|
739
|
+
// connectors/src/classify-connect-error.ts
|
|
740
|
+
function classifyConnectError(err) {
|
|
741
|
+
const declared = declaredConnectErrorKind(err);
|
|
742
|
+
if (declared) return declared;
|
|
743
|
+
if (err instanceof OAuthRequiredError) return "credential";
|
|
744
|
+
if (err instanceof ConnectorFieldMissingError) return "config";
|
|
745
|
+
if (err instanceof LegacyAuthGrammarError) return "config";
|
|
746
|
+
return void 0;
|
|
747
|
+
}
|
|
737
748
|
var execFileAsync = promisify(execFile);
|
|
738
749
|
var GIT_REV_PARSE_TIMEOUT_MS = 15e3;
|
|
739
750
|
var DeployConnector = class extends AbstractConnector {
|
|
@@ -1663,6 +1674,15 @@ async function clearStaleIndexLock(targetDir, log) {
|
|
|
1663
1674
|
log.warn("removed an abandoned .git/index.lock", { lockPath, ageMs });
|
|
1664
1675
|
}
|
|
1665
1676
|
}
|
|
1677
|
+
function isIndexLockFailure(err) {
|
|
1678
|
+
const stderr = err?.stderr;
|
|
1679
|
+
return typeof stderr === "string" && /index\.lock/.test(stderr);
|
|
1680
|
+
}
|
|
1681
|
+
function gitLocalCheckout(args, cwd) {
|
|
1682
|
+
return git(["checkout", ...args], cwd).catch((err) => {
|
|
1683
|
+
throw typeof err?.code === "number" ? withConnectErrorKind(err, "repo-state") : err;
|
|
1684
|
+
});
|
|
1685
|
+
}
|
|
1666
1686
|
async function syncSubmodules(cwd, log) {
|
|
1667
1687
|
if (!await pathExists(join(cwd, ".gitmodules"))) return;
|
|
1668
1688
|
try {
|
|
@@ -1743,6 +1763,8 @@ async function commitAll(cwd, message) {
|
|
|
1743
1763
|
return gitCommitting(["commit", "-m", message], cwd);
|
|
1744
1764
|
}
|
|
1745
1765
|
var TokenMediatorError = class extends Error {
|
|
1766
|
+
/** Every mediator refusal is fixed where the credential lives, whatever its code. */
|
|
1767
|
+
skaileConnectErrorKind = "credential";
|
|
1746
1768
|
code;
|
|
1747
1769
|
constructor(message, code, connectorId) {
|
|
1748
1770
|
super(`Git connector '${connectorId}': backend mediator ${code} \u2014 ${message}`);
|
|
@@ -1804,10 +1826,10 @@ var GitConnector = class extends AbstractConnector {
|
|
|
1804
1826
|
let credentialAlignmentAttempted = false;
|
|
1805
1827
|
if (!url) {
|
|
1806
1828
|
this.log.error("connect failed: missing mount.source URL", void 0);
|
|
1807
|
-
throw new
|
|
1829
|
+
throw new ClassifiedConnectError("Git connector requires a mount.source URL", "config");
|
|
1808
1830
|
}
|
|
1809
1831
|
if (!isValidGitRefOrSha(branch)) {
|
|
1810
|
-
throw new
|
|
1832
|
+
throw new ClassifiedConnectError(`Git connector: invalid branch name "${branch}"`, "config");
|
|
1811
1833
|
}
|
|
1812
1834
|
try {
|
|
1813
1835
|
this.log.info("mount start", { url, branch, targetDir });
|
|
@@ -1888,6 +1910,7 @@ var GitConnector = class extends AbstractConnector {
|
|
|
1888
1910
|
}
|
|
1889
1911
|
}
|
|
1890
1912
|
this.registerUnavailableCredentialHelper(declaration, credentialScopeUrl, err);
|
|
1913
|
+
if (isIndexLockFailure(err)) withConnectErrorKind(err, "repo-state");
|
|
1891
1914
|
throw err;
|
|
1892
1915
|
}
|
|
1893
1916
|
}
|
|
@@ -1976,11 +1999,14 @@ var GitConnector = class extends AbstractConnector {
|
|
|
1976
1999
|
async checkoutSessionBranch(state, session, targetDir) {
|
|
1977
2000
|
const sessionBranch = `${session.branchPrefix}${session.slug}`;
|
|
1978
2001
|
if (!isValidGitRefOrSha(sessionBranch)) {
|
|
1979
|
-
throw new
|
|
2002
|
+
throw new ClassifiedConnectError(
|
|
2003
|
+
`Git connector: invalid session branch name "${sessionBranch}"`,
|
|
2004
|
+
"config"
|
|
2005
|
+
);
|
|
1980
2006
|
}
|
|
1981
2007
|
let created = false;
|
|
1982
2008
|
if (await localBranchExists(sessionBranch, targetDir)) {
|
|
1983
|
-
await
|
|
2009
|
+
await gitLocalCheckout([sessionBranch], targetDir);
|
|
1984
2010
|
this.log.info("reusing existing local session branch", { sessionBranch });
|
|
1985
2011
|
} else {
|
|
1986
2012
|
let originHasBranch = false;
|
|
@@ -1990,9 +2016,9 @@ var GitConnector = class extends AbstractConnector {
|
|
|
1990
2016
|
} catch {
|
|
1991
2017
|
}
|
|
1992
2018
|
if (originHasBranch) {
|
|
1993
|
-
await
|
|
2019
|
+
await gitLocalCheckout(["-B", sessionBranch, `origin/${sessionBranch}`], targetDir);
|
|
1994
2020
|
} else if (!await this.branchFromRef(session, sessionBranch, targetDir)) {
|
|
1995
|
-
await
|
|
2021
|
+
await gitLocalCheckout(["-b", sessionBranch], targetDir);
|
|
1996
2022
|
created = true;
|
|
1997
2023
|
} else {
|
|
1998
2024
|
created = true;
|
|
@@ -2312,8 +2338,9 @@ var GitConnector = class extends AbstractConnector {
|
|
|
2312
2338
|
}
|
|
2313
2339
|
if (authRef.kind === "backend") {
|
|
2314
2340
|
if (!tokenMediator) {
|
|
2315
|
-
throw new
|
|
2316
|
-
`Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead)
|
|
2341
|
+
throw new ClassifiedConnectError(
|
|
2342
|
+
`Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead).`,
|
|
2343
|
+
"config"
|
|
2317
2344
|
);
|
|
2318
2345
|
}
|
|
2319
2346
|
const result = await tokenMediator({ connectorId: declaration.id, reason: "initial" });
|
|
@@ -2342,8 +2369,9 @@ var GitConnector = class extends AbstractConnector {
|
|
|
2342
2369
|
token = inner;
|
|
2343
2370
|
}
|
|
2344
2371
|
if (!token) {
|
|
2345
|
-
throw new
|
|
2346
|
-
`PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain
|
|
2372
|
+
throw new ClassifiedConnectError(
|
|
2373
|
+
`PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain.`,
|
|
2374
|
+
"credential"
|
|
2347
2375
|
);
|
|
2348
2376
|
}
|
|
2349
2377
|
return { authRef, token, expiresAt: null };
|
|
@@ -6261,34 +6289,6 @@ function ensureBuiltinsRegistered() {
|
|
|
6261
6289
|
}
|
|
6262
6290
|
}
|
|
6263
6291
|
|
|
6264
|
-
// connectors/src/connector-types.ts
|
|
6265
|
-
var ConnectorFieldMissingError = class extends Error {
|
|
6266
|
-
connectorId;
|
|
6267
|
-
field;
|
|
6268
|
-
triedRef;
|
|
6269
|
-
availableProviders;
|
|
6270
|
-
constructor(opts) {
|
|
6271
|
-
super(
|
|
6272
|
-
`Connector "${opts.connectorId}" is missing required field "${opts.field.key}" (tried: ${opts.triedRef || "(none)"}). Available providers: ${opts.availableProviders.join(", ") || "(none)"}`
|
|
6273
|
-
);
|
|
6274
|
-
this.name = "ConnectorFieldMissingError";
|
|
6275
|
-
this.connectorId = opts.connectorId;
|
|
6276
|
-
this.field = opts.field;
|
|
6277
|
-
this.triedRef = opts.triedRef;
|
|
6278
|
-
this.availableProviders = opts.availableProviders;
|
|
6279
|
-
}
|
|
6280
|
-
};
|
|
6281
|
-
var ConnectorStartupError = class extends Error {
|
|
6282
|
-
report;
|
|
6283
|
-
failedReadWrite;
|
|
6284
|
-
constructor(message, report, failedReadWrite) {
|
|
6285
|
-
super(message);
|
|
6286
|
-
this.name = "ConnectorStartupError";
|
|
6287
|
-
this.report = report;
|
|
6288
|
-
this.failedReadWrite = failedReadWrite;
|
|
6289
|
-
}
|
|
6290
|
-
};
|
|
6291
|
-
|
|
6292
6292
|
// connectors/src/connector-manager.ts
|
|
6293
6293
|
var KNOWN_PREFIXES = ["env:", "forge:", "op:", "kp:", "oauth:"];
|
|
6294
6294
|
function hasKnownPrefix(ref) {
|
|
@@ -6491,16 +6491,18 @@ var ConnectorManager = class {
|
|
|
6491
6491
|
if (registered) return registered;
|
|
6492
6492
|
const entry = this.catalogEntries.find((e) => e.kind === "connector" && e.name === driver);
|
|
6493
6493
|
if (!entry) {
|
|
6494
|
-
throw new
|
|
6495
|
-
`Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors
|
|
6494
|
+
throw new ClassifiedConnectError(
|
|
6495
|
+
`Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors.`,
|
|
6496
|
+
"config"
|
|
6496
6497
|
);
|
|
6497
6498
|
}
|
|
6498
6499
|
const entryPoint = entry.metadata?.entry ?? "./connector.ts";
|
|
6499
6500
|
const connectorPath = resolve(dirname(entry.source), entryPoint);
|
|
6500
6501
|
const mod = await import(connectorPath);
|
|
6501
6502
|
if (typeof mod.createConnector !== "function") {
|
|
6502
|
-
throw new
|
|
6503
|
-
`Connector "${driver}" at ${connectorPath} does not export createConnector()
|
|
6503
|
+
throw new ClassifiedConnectError(
|
|
6504
|
+
`Connector "${driver}" at ${connectorPath} does not export createConnector()`,
|
|
6505
|
+
"config"
|
|
6504
6506
|
);
|
|
6505
6507
|
}
|
|
6506
6508
|
const connector = mod.createConnector();
|
|
@@ -6535,8 +6537,9 @@ var ConnectorManager = class {
|
|
|
6535
6537
|
const owner = this.mountTargets.get(absPath);
|
|
6536
6538
|
if (owner === id) return;
|
|
6537
6539
|
if (owner !== void 0) {
|
|
6538
|
-
throw new
|
|
6539
|
-
`Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target
|
|
6540
|
+
throw new ClassifiedConnectError(
|
|
6541
|
+
`Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target.`,
|
|
6542
|
+
"config"
|
|
6540
6543
|
);
|
|
6541
6544
|
}
|
|
6542
6545
|
for (const [otherPath, otherId] of this.mountTargets) {
|
|
@@ -6556,7 +6559,7 @@ var ConnectorManager = class {
|
|
|
6556
6559
|
* Remember a connect failure so the agent can be told about it. Called from
|
|
6557
6560
|
* both the bulk (`attemptConnect`) and hot-plug (`connect`) failure paths.
|
|
6558
6561
|
*/
|
|
6559
|
-
recordFailure(decl, error) {
|
|
6562
|
+
recordFailure(decl, error, unavailable) {
|
|
6560
6563
|
if (this.active.has(decl.id)) return;
|
|
6561
6564
|
let mountPath;
|
|
6562
6565
|
if (decl.mount != null) {
|
|
@@ -6572,9 +6575,29 @@ var ConnectorManager = class {
|
|
|
6572
6575
|
...decl.label !== void 0 ? { label: decl.label } : {},
|
|
6573
6576
|
...decl.mount?.source !== void 0 ? { source: decl.mount.source } : {},
|
|
6574
6577
|
...mountPath !== void 0 ? { mountPath } : {},
|
|
6575
|
-
|
|
6576
|
-
|
|
6578
|
+
// A host-declared unavailable connector is never fail-fast material.
|
|
6579
|
+
required: unavailable === void 0 && decl.access === "read-write" && decl.mount != null,
|
|
6580
|
+
error,
|
|
6581
|
+
...unavailable !== void 0 ? { unavailable } : {}
|
|
6582
|
+
});
|
|
6583
|
+
}
|
|
6584
|
+
/**
|
|
6585
|
+
* Record a host-declared unavailable connector as failed without touching its
|
|
6586
|
+
* driver or mount target. Returns the failure message.
|
|
6587
|
+
*
|
|
6588
|
+
* No `connector_status` is emitted: the host that wrote the marker already
|
|
6589
|
+
* holds this failure with its own typed reason, and an echoed event would be
|
|
6590
|
+
* newer than that record and replace it in a host's newest-wins failure view.
|
|
6591
|
+
*/
|
|
6592
|
+
recordUnavailable(decl, unavailable) {
|
|
6593
|
+
const msg = `Not attached by the host (${unavailable.reason})` + (unavailable.detail ? `: ${unavailable.detail}` : "");
|
|
6594
|
+
this.recordFailure(decl, msg, unavailable);
|
|
6595
|
+
this.mgrLog.warn("connector declared unavailable by the host", {
|
|
6596
|
+
id: decl.id,
|
|
6597
|
+
driver: decl.driver,
|
|
6598
|
+
reason: unavailable.reason
|
|
6577
6599
|
});
|
|
6600
|
+
return msg;
|
|
6578
6601
|
}
|
|
6579
6602
|
/** Release every mount target owned by `id` (on disconnect). */
|
|
6580
6603
|
releaseMountTarget(id) {
|
|
@@ -6656,7 +6679,7 @@ var ConnectorManager = class {
|
|
|
6656
6679
|
const claimed = [];
|
|
6657
6680
|
try {
|
|
6658
6681
|
for (const decl of declarations) {
|
|
6659
|
-
if (decl.mount == null) continue;
|
|
6682
|
+
if (decl.mount == null || readUnavailableMarker(decl.unavailable)) continue;
|
|
6660
6683
|
const absPath = this.resolveMountTarget(decl);
|
|
6661
6684
|
const isNew = !this.mountTargets.has(absPath);
|
|
6662
6685
|
this.reserveMountTarget(decl.id, absPath);
|
|
@@ -6677,9 +6700,10 @@ var ConnectorManager = class {
|
|
|
6677
6700
|
});
|
|
6678
6701
|
if (options?.failOnReadWriteError) {
|
|
6679
6702
|
const declById = new Map(declarations.map((d) => [d.id, d]));
|
|
6680
|
-
const failedRw = results.filter(
|
|
6681
|
-
|
|
6682
|
-
|
|
6703
|
+
const failedRw = results.filter((r) => {
|
|
6704
|
+
const decl = declById.get(r.id);
|
|
6705
|
+
return !r.connected && r.access === "read-write" && decl?.mount != null && !readUnavailableMarker(decl.unavailable);
|
|
6706
|
+
}).map((r) => ({ id: r.id, error: r.error ?? "unknown error" }));
|
|
6683
6707
|
if (failedRw.length > 0) {
|
|
6684
6708
|
const summary = failedRw.map((f) => `"${f.id}": ${f.error}`).join("; ");
|
|
6685
6709
|
this.mgrLog.error("connectAll failed: required read-write connector(s) failed", void 0, {
|
|
@@ -6700,6 +6724,11 @@ var ConnectorManager = class {
|
|
|
6700
6724
|
* can keep going.
|
|
6701
6725
|
*/
|
|
6702
6726
|
async attemptConnect(decl, preResolved) {
|
|
6727
|
+
const unavailable = readUnavailableMarker(decl.unavailable);
|
|
6728
|
+
if (unavailable) {
|
|
6729
|
+
const msg = this.recordUnavailable(decl, unavailable);
|
|
6730
|
+
return { id: decl.id, connected: false, error: msg, access: decl.access };
|
|
6731
|
+
}
|
|
6703
6732
|
this.opts.onStatusChange?.({
|
|
6704
6733
|
type: "connector_status",
|
|
6705
6734
|
connectorId: decl.id,
|
|
@@ -6744,12 +6773,18 @@ var ConnectorManager = class {
|
|
|
6744
6773
|
if (!this.active.has(decl.id)) this.releaseMountTarget(decl.id);
|
|
6745
6774
|
const msg = err instanceof Error ? err.message : String(err);
|
|
6746
6775
|
this.recordFailure(decl, msg);
|
|
6747
|
-
|
|
6776
|
+
const errorKind = classifyConnectError(err);
|
|
6777
|
+
this.mgrLog.error("connect failed", err, {
|
|
6778
|
+
id: decl.id,
|
|
6779
|
+
driver: decl.driver,
|
|
6780
|
+
...errorKind ? { errorKind } : {}
|
|
6781
|
+
});
|
|
6748
6782
|
this.opts.onStatusChange?.({
|
|
6749
6783
|
type: "connector_status",
|
|
6750
6784
|
connectorId: decl.id,
|
|
6751
6785
|
status: "error",
|
|
6752
|
-
error: msg
|
|
6786
|
+
error: msg,
|
|
6787
|
+
...errorKind ? { errorKind } : {}
|
|
6753
6788
|
});
|
|
6754
6789
|
return {
|
|
6755
6790
|
id: decl.id,
|
|
@@ -6799,6 +6834,20 @@ var ConnectorManager = class {
|
|
|
6799
6834
|
* @returns The `ConnectorHandle` for subsequent operations.
|
|
6800
6835
|
*/
|
|
6801
6836
|
async connect(declaration) {
|
|
6837
|
+
const unavailable = readUnavailableMarker(declaration.unavailable);
|
|
6838
|
+
if (unavailable) {
|
|
6839
|
+
if (this.active.has(declaration.id)) {
|
|
6840
|
+
try {
|
|
6841
|
+
await this.disconnect(declaration.id);
|
|
6842
|
+
} catch (err) {
|
|
6843
|
+
this.mgrLog.warn("disconnect before marking unavailable failed", {
|
|
6844
|
+
id: declaration.id,
|
|
6845
|
+
error: err instanceof Error ? err.message : String(err)
|
|
6846
|
+
});
|
|
6847
|
+
}
|
|
6848
|
+
}
|
|
6849
|
+
throw new Error(this.recordUnavailable(declaration, unavailable));
|
|
6850
|
+
}
|
|
6802
6851
|
this.opts.onStatusChange?.({
|
|
6803
6852
|
type: "connector_status",
|
|
6804
6853
|
connectorId: declaration.id,
|
|
@@ -6834,11 +6883,13 @@ var ConnectorManager = class {
|
|
|
6834
6883
|
this.releaseMountTarget(declaration.id);
|
|
6835
6884
|
const msg = err instanceof Error ? err.message : String(err);
|
|
6836
6885
|
this.recordFailure(declaration, msg);
|
|
6886
|
+
const errorKind = classifyConnectError(err);
|
|
6837
6887
|
this.opts.onStatusChange?.({
|
|
6838
6888
|
type: "connector_status",
|
|
6839
6889
|
connectorId: declaration.id,
|
|
6840
6890
|
status: "error",
|
|
6841
|
-
error: msg
|
|
6891
|
+
error: msg,
|
|
6892
|
+
...errorKind ? { errorKind } : {}
|
|
6842
6893
|
});
|
|
6843
6894
|
throw err;
|
|
6844
6895
|
}
|
|
@@ -7565,16 +7616,17 @@ function buildFailedConnectorSection(failed) {
|
|
|
7565
7616
|
const lines = [
|
|
7566
7617
|
"## Mount failures \u2014 read this first",
|
|
7567
7618
|
"",
|
|
7568
|
-
"The following connectors **failed to connect** in this session. Their directories are ordinary local folders: **not** connected, **not** synced, and **not** backend-managed git worktrees. Any other statement in this prompt \u2014 including the host platform's own description of the workspace \u2014 that describes these paths as a managed, synced, or version-controlled workspace **is superseded by this section**.",
|
|
7619
|
+
"The following connectors **failed to connect** in this session. Their directories, where they exist, are ordinary local folders: **not** connected, **not** synced, and **not** backend-managed git worktrees. Any other statement in this prompt \u2014 including the host platform's own description of the workspace \u2014 that describes these paths as a managed, synced, or version-controlled workspace **is superseded by this section**.",
|
|
7569
7620
|
"",
|
|
7570
7621
|
"| Mount | Driver | Path | Access | Required | Failure |",
|
|
7571
7622
|
"|---|---|---|---|---|---|"
|
|
7572
7623
|
];
|
|
7573
7624
|
for (const f of failed) {
|
|
7574
|
-
const
|
|
7625
|
+
const where = f.mountPath ?? f.source;
|
|
7626
|
+
const path = where === void 0 ? "`(no mount)`" : f.unavailable !== void 0 ? `\`${where}\` (not created by this declaration \u2014 do not write here)` : `\`${where}\``;
|
|
7575
7627
|
const required = f.required ? "yes" : "no";
|
|
7576
7628
|
lines.push(
|
|
7577
|
-
`| ${f.id} | ${f.driver} |
|
|
7629
|
+
`| ${f.id} | ${f.driver} | ${path} | ${f.access} | ${required} | ${oneLine(f.error)} |`
|
|
7578
7630
|
);
|
|
7579
7631
|
}
|
|
7580
7632
|
lines.push("");
|
|
@@ -7585,6 +7637,12 @@ function buildFailedConnectorSection(failed) {
|
|
|
7585
7637
|
lines.push(
|
|
7586
7638
|
"**There is nothing to fix inside this workspace.** The credential for a mount is minted by the host platform, not by anything in here and not by any project setting \u2014 there is no credential field to fill in. Report the failure text above verbatim to the user and ask them to reconnect the connector's provider link on the platform, then restart the session. Do not retry the connection yourself; a connector that failed at startup stays failed until the session restarts."
|
|
7587
7639
|
);
|
|
7640
|
+
if (failed.some((f) => f.unavailable !== void 0)) {
|
|
7641
|
+
lines.push("");
|
|
7642
|
+
lines.push(
|
|
7643
|
+
"**`Not attached by the host`** means the host platform declined the mount before this session started, so no connection was attempted here. The reason and detail are the platform's own: pass them on, since the fix may be the mount's declaration in the platform's settings rather than its credential. Such a mount's directory was **not created by this declaration**, so reading it normally fails with `ENOENT` (a directory left by an earlier, replaced connection may remain). Do not create it or write there: a path inside the primary workspace would put the files into that workspace, where they are synced and committed as if they belonged to it."
|
|
7644
|
+
);
|
|
7645
|
+
}
|
|
7588
7646
|
if (failed.some((f) => f.driver === "git")) {
|
|
7589
7647
|
lines.push("");
|
|
7590
7648
|
lines.push(
|
|
@@ -11081,6 +11139,6 @@ function describeFlowOperations() {
|
|
|
11081
11139
|
return new FlowAdapter().tools.describeOperations({ access: "read-write" });
|
|
11082
11140
|
}
|
|
11083
11141
|
|
|
11084
|
-
export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner,
|
|
11085
|
-
//# sourceMappingURL=chunk-
|
|
11086
|
-
//# sourceMappingURL=chunk-
|
|
11142
|
+
export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner, ConnectorManager, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, MAX_REARM_MS, MIN_REFRESH_DELAY_MS, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NO_ACTIVE_FLOW_ERROR, PortPool, PostgresConnector, REFRESH_LEAD_MS, S3Connector, SQLiteConnector, SessionInlineSubFlowRunner, SessionNodeExecutor, SessionSubpromptRunner, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildConnectorToolDefs, buildFlowPromptEvent, buildFlowToolDefs, buildLazyFlowToolDefs, buildLazySdkFlowTools, buildSdkConnectorTools, buildSdkFlowTools, classifierQuestion, classifyConnectError, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, describeFlowOperations, driveOrchestratorTurn, ensureDirMode, ensureFleetMounted, ensureRefreshAttemptStamp, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, removeUnavailableMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock, writeUnavailableMountBlock };
|
|
11143
|
+
//# sourceMappingURL=chunk-NYRLSXTB.js.map
|
|
11144
|
+
//# sourceMappingURL=chunk-NYRLSXTB.js.map
|