@skaile/workspaces 4.37.0 → 4.38.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 +34 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-KTRFFJYM.js → asset-feeds-UYIFZKKG.js} +16 -16
- package/dist/asset-feeds-UYIFZKKG.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +9 -8
- package/dist/asset-manager/index.js +15 -14
- package/dist/asset-manager/installer.js +11 -10
- package/dist/asset-manager/renderers.js +2 -2
- package/dist/asset-manager/src/index.d.ts +77 -18
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts +11 -1
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +14 -13
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +11 -10
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/continue.js +12 -11
- package/dist/bridge/drivers/continue.js.map +1 -1
- package/dist/bridge/drivers/echo.js +3 -3
- package/dist/bridge/drivers/gemini.js +6 -6
- package/dist/bridge/drivers/goose.js +12 -11
- package/dist/bridge/drivers/goose.js.map +1 -1
- package/dist/bridge/drivers/omp.js +4 -4
- package/dist/bridge/drivers/opencode.js +12 -11
- package/dist/bridge/drivers/opencode.js.map +1 -1
- package/dist/bridge/drivers/qwen.js +6 -6
- package/dist/bridge/index.js +15 -14
- package/dist/{chunk-SGMCSVTO.js → chunk-27DN4DZD.js} +8 -8
- package/dist/{chunk-SGMCSVTO.js.map → chunk-27DN4DZD.js.map} +1 -1
- package/dist/{chunk-VOEBLPXO.js → chunk-2EL2PBRC.js} +3 -3
- package/dist/{chunk-VOEBLPXO.js.map → chunk-2EL2PBRC.js.map} +1 -1
- package/dist/{chunk-VRFKCF3R.js → chunk-36ML6SFP.js} +4 -4
- package/dist/{chunk-VRFKCF3R.js.map → chunk-36ML6SFP.js.map} +1 -1
- package/dist/{chunk-UFBURH6K.js → chunk-4WKZEMBD.js} +4 -4
- package/dist/{chunk-UFBURH6K.js.map → chunk-4WKZEMBD.js.map} +1 -1
- package/dist/{chunk-2D3C4AJP.js → chunk-5CYEWBPB.js} +11 -4
- package/dist/chunk-5CYEWBPB.js.map +1 -0
- package/dist/{chunk-SQ7IN7KR.js → chunk-5K2VT6E2.js} +3 -3
- package/dist/{chunk-SQ7IN7KR.js.map → chunk-5K2VT6E2.js.map} +1 -1
- package/dist/{chunk-NTASYPDN.js → chunk-5NYBY6ZE.js} +3 -3
- package/dist/{chunk-NTASYPDN.js.map → chunk-5NYBY6ZE.js.map} +1 -1
- package/dist/{chunk-SOFPA4S4.js → chunk-6EMF4UZI.js} +8 -8
- package/dist/{chunk-SOFPA4S4.js.map → chunk-6EMF4UZI.js.map} +1 -1
- package/dist/{chunk-WQULDAH2.js → chunk-6KPQDP7P.js} +2 -2
- package/dist/{chunk-WQULDAH2.js.map → chunk-6KPQDP7P.js.map} +1 -1
- package/dist/{chunk-OPBGV4DX.js → chunk-6VRZ6M2L.js} +3 -3
- package/dist/{chunk-OPBGV4DX.js.map → chunk-6VRZ6M2L.js.map} +1 -1
- package/dist/{chunk-KN5Y5BXK.js → chunk-7FZSABQV.js} +5 -5
- package/dist/{chunk-KN5Y5BXK.js.map → chunk-7FZSABQV.js.map} +1 -1
- package/dist/{chunk-FLGLODDF.js → chunk-7RC37XFW.js} +3 -3
- package/dist/{chunk-FLGLODDF.js.map → chunk-7RC37XFW.js.map} +1 -1
- package/dist/{chunk-5SGS5SN2.js → chunk-7UL2SQQH.js} +4 -4
- package/dist/{chunk-5SGS5SN2.js.map → chunk-7UL2SQQH.js.map} +1 -1
- package/dist/{chunk-GEEW6SY2.js → chunk-A5EDMBFG.js} +2 -2
- package/dist/{chunk-GEEW6SY2.js.map → chunk-A5EDMBFG.js.map} +1 -1
- package/dist/{chunk-QABZZROM.js → chunk-ARUJBGAH.js} +3 -3
- package/dist/{chunk-QABZZROM.js.map → chunk-ARUJBGAH.js.map} +1 -1
- package/dist/{chunk-ENXE4BKS.js → chunk-BQ3HXZNT.js} +2 -2
- package/dist/{chunk-ENXE4BKS.js.map → chunk-BQ3HXZNT.js.map} +1 -1
- package/dist/{chunk-U4CNCL7Q.js → chunk-CACCIOQL.js} +12 -12
- package/dist/{chunk-U4CNCL7Q.js.map → chunk-CACCIOQL.js.map} +1 -1
- package/dist/{chunk-5JAO4MXA.js → chunk-DOVURNRK.js} +3 -3
- package/dist/{chunk-5JAO4MXA.js.map → chunk-DOVURNRK.js.map} +1 -1
- package/dist/{chunk-P4VHQA4N.js → chunk-DSB6X25D.js} +3 -3
- package/dist/{chunk-P4VHQA4N.js.map → chunk-DSB6X25D.js.map} +1 -1
- package/dist/{chunk-2QYQOJ2F.js → chunk-DV47JNI4.js} +3 -3
- package/dist/{chunk-2QYQOJ2F.js.map → chunk-DV47JNI4.js.map} +1 -1
- package/dist/{chunk-FZFCOQTI.js → chunk-EETXMMZS.js} +3 -3
- package/dist/{chunk-FZFCOQTI.js.map → chunk-EETXMMZS.js.map} +1 -1
- package/dist/{chunk-OEBAXTQ4.js → chunk-EOKAFBJ7.js} +3 -3
- package/dist/{chunk-OEBAXTQ4.js.map → chunk-EOKAFBJ7.js.map} +1 -1
- package/dist/{chunk-6BEGKO2Q.js → chunk-HUNZYTOS.js} +4 -3
- package/dist/chunk-HUNZYTOS.js.map +1 -0
- package/dist/{chunk-7YCPY6NC.js → chunk-HXG6IZSF.js} +6 -6
- package/dist/{chunk-7YCPY6NC.js.map → chunk-HXG6IZSF.js.map} +1 -1
- package/dist/{chunk-L7R52OOV.js → chunk-ILAZDNIA.js} +3 -3
- package/dist/{chunk-L7R52OOV.js.map → chunk-ILAZDNIA.js.map} +1 -1
- package/dist/{chunk-WTBXGJCD.js → chunk-J5UF3OOS.js} +10 -10
- package/dist/{chunk-WTBXGJCD.js.map → chunk-J5UF3OOS.js.map} +1 -1
- package/dist/{chunk-QKXDRBLL.js → chunk-JEPSP6XK.js} +11 -80
- package/dist/chunk-JEPSP6XK.js.map +1 -0
- package/dist/{chunk-KIFJWSNC.js → chunk-KAJH3XPW.js} +7 -3
- package/dist/chunk-KAJH3XPW.js.map +1 -0
- package/dist/chunk-LOHQTTUV.js +29 -0
- package/dist/chunk-LOHQTTUV.js.map +1 -0
- package/dist/{chunk-MDBAEEY5.js → chunk-MQ42OYKH.js} +159 -7
- package/dist/chunk-MQ42OYKH.js.map +1 -0
- package/dist/{chunk-YU433JEL.js → chunk-MS2JK4V7.js} +6 -6
- package/dist/{chunk-YU433JEL.js.map → chunk-MS2JK4V7.js.map} +1 -1
- package/dist/{chunk-DFZDL62S.js → chunk-OLMNDIAU.js} +14 -9
- package/dist/chunk-OLMNDIAU.js.map +1 -0
- package/dist/{chunk-3SUWLY3H.js → chunk-OQRB7JUS.js} +3 -3
- package/dist/{chunk-3SUWLY3H.js.map → chunk-OQRB7JUS.js.map} +1 -1
- package/dist/{chunk-RZXP5ZER.js → chunk-PRCUGFXV.js} +3 -3
- package/dist/{chunk-RZXP5ZER.js.map → chunk-PRCUGFXV.js.map} +1 -1
- package/dist/{chunk-MRS5YHPI.js → chunk-QBQITQAM.js} +3 -3
- package/dist/{chunk-MRS5YHPI.js.map → chunk-QBQITQAM.js.map} +1 -1
- package/dist/{chunk-R2SYODNK.js → chunk-QWWDDU5Z.js} +274 -67
- package/dist/chunk-QWWDDU5Z.js.map +1 -0
- package/dist/{chunk-UTZEHXYT.js → chunk-R2U346ER.js} +3 -3
- package/dist/{chunk-UTZEHXYT.js.map → chunk-R2U346ER.js.map} +1 -1
- package/dist/{chunk-USJWXEXS.js → chunk-R5ARWJGE.js} +46 -41
- package/dist/chunk-R5ARWJGE.js.map +1 -0
- package/dist/chunk-TLKM4M47.js +78 -0
- package/dist/chunk-TLKM4M47.js.map +1 -0
- package/dist/{chunk-NFECHLV6.js → chunk-TNWXGHLD.js} +3 -3
- package/dist/{chunk-NFECHLV6.js.map → chunk-TNWXGHLD.js.map} +1 -1
- package/dist/{chunk-H3KXUUYQ.js → chunk-VDBP6Y5M.js} +4 -4
- package/dist/{chunk-H3KXUUYQ.js.map → chunk-VDBP6Y5M.js.map} +1 -1
- package/dist/{chunk-XN7DAZB7.js → chunk-VJNTB4DN.js} +5 -5
- package/dist/chunk-VJNTB4DN.js.map +1 -0
- package/dist/{chunk-BSIHJZKN.js → chunk-XU7JET5Z.js} +107 -26
- package/dist/chunk-XU7JET5Z.js.map +1 -0
- package/dist/{chunk-A5RRXBLI.js → chunk-YCJ3PJNB.js} +5 -5
- package/dist/{chunk-A5RRXBLI.js.map → chunk-YCJ3PJNB.js.map} +1 -1
- package/dist/{chunk-VCLN2IUM.js → chunk-YCMZHL4T.js} +31 -27
- package/dist/chunk-YCMZHL4T.js.map +1 -0
- package/dist/{chunk-V2OQ3BI6.js → chunk-YNUBJY3L.js} +2 -2
- package/dist/chunk-YNUBJY3L.js.map +1 -0
- package/dist/{chunk-S63H4HDH.js → chunk-YQEF36D5.js} +4 -4
- package/dist/{chunk-S63H4HDH.js.map → chunk-YQEF36D5.js.map} +1 -1
- package/dist/{chunk-FJYOQMXT.js → chunk-YV3YI3TA.js} +32 -16
- package/dist/chunk-YV3YI3TA.js.map +1 -0
- package/dist/cli/index.js +755 -533
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/asset-feeds.d.ts.map +1 -1
- package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/cache.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +28 -3
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/complete-resolvers.d.ts +1 -7
- package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
- package/dist/cli/src/commands/complete.d.ts.map +1 -1
- package/dist/cli/src/commands/diff.d.ts +3 -1
- package/dist/cli/src/commands/diff.d.ts.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/library-index.d.ts +8 -0
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/library-publish.d.ts +7 -2
- package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/commands/outdated.d.ts +12 -2
- package/dist/cli/src/commands/outdated.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts +2 -2
- package/dist/cli/src/commands/publish-core.d.ts +21 -0
- package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
- package/dist/cli/src/commands/skailify-lib.d.ts +18 -1
- package/dist/cli/src/commands/skailify-lib.d.ts.map +1 -1
- package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/store.d.ts.map +1 -1
- package/dist/cli/src/commands/update.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/paths.d.ts +1 -1
- package/dist/cli/src/paths.d.ts.map +1 -1
- package/dist/cli/src/store-auth.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -5
- package/dist/connectors/index.js +19 -18
- package/dist/connectors-shared/index.js +2 -2
- package/dist/core/index.js +8 -7
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/publish-manifest.js +2 -2
- package/dist/core/ref.js +1 -1
- package/dist/core/runtime-assets.js +6 -5
- package/dist/core/src/asset-roots.d.ts +2 -12
- package/dist/core/src/asset-roots.d.ts.map +1 -1
- package/dist/core/src/cache-paths.d.ts +7 -3
- package/dist/core/src/cache-paths.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +3 -3
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +27 -4
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +26 -6
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/settings.d.ts +2 -1
- package/dist/core/src/settings.d.ts.map +1 -1
- package/dist/core/src/store.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/store.js +2 -1
- package/dist/core/workspace-config.js +5 -4
- package/dist/deploy/index.js +8 -7
- package/dist/deploy/index.js.map +1 -1
- package/dist/discovery/index.js +5 -5
- package/dist/discovery/src/domains.d.ts +6 -1
- package/dist/discovery/src/domains.d.ts.map +1 -1
- package/dist/discovery/src/index.d.ts +1 -1
- package/dist/discovery/src/index.d.ts.map +1 -1
- package/dist/{ensure-sources-IGU65O72.js → ensure-sources-VX63EKY7.js} +18 -17
- package/dist/ensure-sources-VX63EKY7.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +19 -18
- package/dist/factory-assets/connectors/deploy.js +19 -18
- package/dist/factory-assets/connectors/devserver.js +19 -18
- package/dist/factory-assets/connectors/flow/adapter.js +19 -18
- package/dist/factory-assets/connectors/flow/engine.js +9 -8
- package/dist/factory-assets/connectors/flow/run-flow.js +21 -20
- package/dist/factory-assets/connectors/flow.js +19 -18
- package/dist/factory-assets/connectors/git.js +19 -18
- package/dist/factory-assets/connectors/gmail.js +19 -18
- package/dist/factory-assets/connectors/googledrive.js +19 -18
- package/dist/factory-assets/connectors/local.js +19 -18
- package/dist/factory-assets/connectors/mattermost.js +19 -18
- package/dist/factory-assets/connectors/memory.js +19 -18
- package/dist/factory-assets/connectors/minio.js +19 -18
- package/dist/factory-assets/connectors/postgres.js +19 -18
- package/dist/factory-assets/connectors/s3.js +19 -18
- package/dist/factory-assets/connectors/sharepoint.js +19 -18
- package/dist/factory-assets/connectors/sqlite.js +19 -18
- package/dist/factory-assets/connectors/static-server.js +19 -18
- package/dist/factory-assets/connectors/tunnel.js +19 -18
- package/dist/factory-assets/connectors/webdav.js +19 -18
- package/dist/factory-assets/connectors/xstate-store.js +19 -18
- package/dist/factory-assets/connectors/xstate.js +19 -18
- package/dist/flows-PX53XFV7.js +25 -0
- package/dist/{flows-6MDMBQUZ.js.map → flows-PX53XFV7.js.map} +1 -1
- package/dist/{helpers-IELIL4YR.js → helpers-DF55G2YC.js} +18 -17
- package/dist/{helpers-IELIL4YR.js.map → helpers-DF55G2YC.js.map} +1 -1
- package/dist/library/index.js +12 -11
- package/dist/library/install.js +2 -2
- package/dist/library/src/config.d.ts +11 -9
- package/dist/library/src/config.d.ts.map +1 -1
- package/dist/library/src/index.d.ts +2 -2
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library-manager.d.ts +7 -0
- package/dist/library/src/local/library-manager.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +5 -4
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/schema.d.ts +2 -0
- package/dist/library/src/local/schema.d.ts.map +1 -1
- package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
- package/dist/library/src/local/store-paths.d.ts.map +1 -1
- package/dist/library/src/remote/cache.d.ts.map +1 -1
- package/dist/library/src/sync/git-driver.d.ts +34 -0
- package/dist/library/src/sync/git-driver.d.ts.map +1 -1
- package/dist/{library-publish-YKBYHZ43.js → library-publish-2PNWJJOY.js} +95 -41
- package/dist/library-publish-2PNWJJOY.js.map +1 -0
- package/dist/open-library-SUVOMIWZ.js +38 -0
- package/dist/{open-library-ULRYWTEA.js.map → open-library-SUVOMIWZ.js.map} +1 -1
- package/dist/paths-W4LDORQQ.js +21 -0
- package/dist/{paths-4MTICP3T.js.map → paths-W4LDORQQ.js.map} +1 -1
- package/dist/{plugin-store-GQ4WQZJ2.js → plugin-store-D45CREMJ.js} +10 -9
- package/dist/plugin-store-D45CREMJ.js.map +1 -0
- package/dist/project-RTLVOXUU.js +34 -0
- package/dist/{project-VKYNDEB6.js.map → project-RTLVOXUU.js.map} +1 -1
- package/dist/resolver/index.js +9 -8
- package/dist/runner/index.js +28 -27
- package/dist/runner/src/composition/bootstrap.d.ts +1 -1
- package/dist/runner/src/composition/bootstrap.d.ts.map +1 -1
- package/dist/runner/src/runtime-session-emit.d.ts +2 -1
- package/dist/runner/src/runtime-session-emit.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +15 -14
- package/dist/sdk/bridge.js +15 -14
- package/dist/sdk/core.js +8 -7
- package/dist/sdk/flow.js +9 -8
- package/dist/sdk/index.js +28 -27
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +9 -8
- package/dist/sdk/runner.js +28 -27
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/secrets/index.js +18 -1
- package/dist/secrets/src/providers/local.d.ts.map +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-INJFK3VJ.js → setup-ZA7VZL72.js} +25 -24
- package/dist/setup-ZA7VZL72.js.map +1 -0
- package/dist/skills-R3RPIPWP.js +25 -0
- package/dist/{skills-JHUY4DFE.js.map → skills-R3RPIPWP.js.map} +1 -1
- package/dist/{source-IZXICUBU.js → source-Y5YQ7M53.js} +21 -20
- package/dist/{source-IZXICUBU.js.map → source-Y5YQ7M53.js.map} +1 -1
- package/dist/{source-manifest-publish-4JHOT4PA.js → source-manifest-publish-RZIJNRIW.js} +24 -25
- package/dist/source-manifest-publish-RZIJNRIW.js.map +1 -0
- package/dist/tui/index.js +28 -27
- package/dist/tui/index.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/events.d.ts +4 -2
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/manifests/index.d.ts +1 -1
- package/dist/types/src/manifests/index.d.ts.map +1 -1
- package/dist/types/src/manifests/skill.d.ts +10 -0
- package/dist/types/src/manifests/skill.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +15 -14
- package/dist/workspace-plugin/adapters/omp.js +7 -7
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +1 -1
- package/dist/asset-feeds-KTRFFJYM.js.map +0 -1
- package/dist/chunk-2D3C4AJP.js.map +0 -1
- package/dist/chunk-6BEGKO2Q.js.map +0 -1
- package/dist/chunk-BSIHJZKN.js.map +0 -1
- package/dist/chunk-DFZDL62S.js.map +0 -1
- package/dist/chunk-FJYOQMXT.js.map +0 -1
- package/dist/chunk-KIFJWSNC.js.map +0 -1
- package/dist/chunk-MDBAEEY5.js.map +0 -1
- package/dist/chunk-MIRWAK5C.js +0 -158
- package/dist/chunk-MIRWAK5C.js.map +0 -1
- package/dist/chunk-QKXDRBLL.js.map +0 -1
- package/dist/chunk-R2SYODNK.js.map +0 -1
- package/dist/chunk-USJWXEXS.js.map +0 -1
- package/dist/chunk-V2OQ3BI6.js.map +0 -1
- package/dist/chunk-VCLN2IUM.js.map +0 -1
- package/dist/chunk-XN7DAZB7.js.map +0 -1
- package/dist/ensure-sources-IGU65O72.js.map +0 -1
- package/dist/flows-6MDMBQUZ.js +0 -24
- package/dist/library-publish-YKBYHZ43.js.map +0 -1
- package/dist/open-library-ULRYWTEA.js +0 -37
- package/dist/paths-4MTICP3T.js +0 -20
- package/dist/plugin-store-GQ4WQZJ2.js.map +0 -1
- package/dist/project-VKYNDEB6.js +0 -33
- package/dist/setup-INJFK3VJ.js.map +0 -1
- package/dist/skills-JHUY4DFE.js +0 -24
- package/dist/source-manifest-publish-4JHOT4PA.js.map +0 -1
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-
|
|
2
|
-
import { SubprocessCliDriver, extractText, extractCost, extractTokens } from '../../chunk-
|
|
3
|
-
import { resolveEnvDriverSession, continueRoleBinding, credentialsForEveryProvider, registryModelEntries, selectableEntries, entrySurface, harnessProviderName, entryBaseUrl, versionedAnthropicBaseUrl } from '../../chunk-
|
|
1
|
+
import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-ARUJBGAH.js';
|
|
2
|
+
import { SubprocessCliDriver, extractText, extractCost, extractTokens } from '../../chunk-R2U346ER.js';
|
|
3
|
+
import { resolveEnvDriverSession, continueRoleBinding, credentialsForEveryProvider, registryModelEntries, selectableEntries, entrySurface, harnessProviderName, entryBaseUrl, versionedAnthropicBaseUrl } from '../../chunk-EETXMMZS.js';
|
|
4
4
|
import '../../chunk-XBSQ4KMC.js';
|
|
5
5
|
import '../../chunk-YROR332M.js';
|
|
6
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig, providerCredentialEnvName } from '../../chunk-
|
|
6
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig, providerCredentialEnvName } from '../../chunk-6KPQDP7P.js';
|
|
7
7
|
import '../../chunk-6E6PKKAD.js';
|
|
8
|
-
import '../../chunk-
|
|
8
|
+
import '../../chunk-YV3YI3TA.js';
|
|
9
9
|
import '../../chunk-4GY63JU6.js';
|
|
10
|
-
import '../../chunk-
|
|
11
|
-
import '../../chunk-
|
|
10
|
+
import '../../chunk-36ML6SFP.js';
|
|
11
|
+
import '../../chunk-KAJH3XPW.js';
|
|
12
12
|
import '../../chunk-K5GBV4SA.js';
|
|
13
13
|
import '../../chunk-QVZA2MDT.js';
|
|
14
|
-
import '../../chunk-
|
|
14
|
+
import '../../chunk-JEPSP6XK.js';
|
|
15
|
+
import '../../chunk-TLKM4M47.js';
|
|
15
16
|
import '../../chunk-EB4ZTESQ.js';
|
|
16
|
-
import '../../chunk-
|
|
17
|
-
import '../../chunk-
|
|
18
|
-
import '../../chunk-
|
|
17
|
+
import '../../chunk-DSB6X25D.js';
|
|
18
|
+
import '../../chunk-5K2VT6E2.js';
|
|
19
|
+
import '../../chunk-A5EDMBFG.js';
|
|
19
20
|
import '../../chunk-JMKB7IB4.js';
|
|
20
21
|
import '../../chunk-ICSCSM5D.js';
|
|
21
22
|
import { parseModelRef } from '../../chunk-MJHSLODD.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/provider-materialize/continue-config-yaml.ts","../../../bridge/src/drivers/continue.ts"],"names":["stringifyYaml","text"],"mappings":"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","file":"continue.js","sourcesContent":["/**\n * Continue's `config.yaml` adapter — the file half of the Continue row (§2.3).\n *\n * `cn` has no model flag. Its assistant is a document, and the document binds\n * models to **roles** (`chat`, `edit`, `apply`, `autocomplete`, `embed`,\n * `rerank`, `summarize`); a headless `cn -p` turn runs as `chat`. So unlike\n * OpenCode and Goose, Continue needs a file for *every* endpoint, stock or\n * custom — it has no built-in provider table keyed by vendor names to fall\n * back on:\n *\n * ```yaml\n * name: Skaile session\n * version: 0.0.1\n * schema: v1\n * models:\n * - name: corp-gateway/corp-fast-1\n * provider: openai\n * model: corp-fast-1\n * apiBase: https://llm.corp.example/v1\n * apiKey: ${{ secrets.SKAILE_AIP_CORP_GATEWAY_KEY }}\n * roles:\n * - chat\n * ```\n *\n * `provider` is Continue's *adapter class*, not an endpoint name — the\n * endpoint is `apiBase`. The row's `name` carries the identity instead, and it\n * is `harnessProviderName`/`harnessModelSelector` verbatim, so a model reads\n * the same here as in every other adapter.\n *\n * **Credentials never enter the file.** `apiKey` holds Continue's own\n * `${{ secrets.NAME }}` indirection; the CLI resolves a secret from the\n * process environment before it asks Continue Hub, so `SKAILE_AIP_<ID>_KEY`\n * in the child env is what authenticates the request.\n *\n * **Roles.** The session's `roles` table is the source: every entry whose key\n * is one of Continue's roles becomes that role's binding (`default` is read as\n * `chat`, matching how the rest of the programme spells the fallback), and the\n * session's own model selection wins `chat` when it named one.\n *\n * @see https://docs.continue.dev/reference\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n parseModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessProviderName,\n continueRoleBinding,\n entryBaseUrl,\n entrySurface,\n type EnvDriverSession,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → Continue's provider class. Continue's `openai` adapter is the\n * OpenAI adapter, so both OpenAI-flavoured surfaces resolve to it; the\n * surfaces Continue has no adapter for are reported instead of guessed at.\n */\nconst CONTINUE_PROVIDER_CLASS: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"anthropic\",\n \"openai-completions\": \"openai\",\n \"openai-responses\": \"openai\",\n \"google-generative-ai\": \"gemini\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Roles a Continue `config.yaml` can bind a model to. */\nconst CONTINUE_ROLES: Record<string, true> = {\n chat: true,\n edit: true,\n apply: true,\n autocomplete: true,\n embed: true,\n rerank: true,\n summarize: true,\n};\n\n/** Filename Continue reads its local assistant from, under the global dir. */\nexport const CONTINUE_CONFIG_FILENAME = \"config.yaml\";\n\n/** One `models[]` row. */\nexport interface ContinueModelRow {\n /** `<harnessProviderName>/<providerModelId>` — the programme-wide model id. */\n name: string;\n /** Continue adapter class: `openai`, `anthropic`, `gemini`. */\n provider: string;\n /** Provider-side model id. */\n model: string;\n apiBase?: string;\n /** Continue's `${{ secrets.NAME }}` indirection — never a secret. */\n apiKey?: string;\n roles: string[];\n requestOptions?: { headers: Record<string, string> };\n}\n\n/** The `config.yaml` document this adapter owns. */\nexport interface ContinueConfigDocument {\n name: string;\n version: string;\n schema: string;\n models: ContinueModelRow[];\n}\n\n/** Result of {@link buildContinueConfigDocument}. */\nexport interface ContinueConfigBuild {\n document: ContinueConfigDocument;\n /** Role bindings that resolved to nothing Continue can run. */\n warnings: string[];\n}\n\n/** One resolved role → endpoint + model. */\ninterface RoleTarget {\n role: string;\n providerId: string;\n model: string;\n}\n\n/**\n * Render one entry + model as a `models[]` row, or explain why Continue cannot\n * run it.\n */\nexport function renderContinueModel(\n providerId: string,\n entry: AIProviderLlmEntry,\n model: string,\n roles: string[],\n): { row: ContinueModelRow } | { skipped: string } {\n const surface = entrySurface(entry);\n const providerClass = surface ? CONTINUE_PROVIDER_CLASS[surface] : undefined;\n if (!providerClass)\n return {\n skipped: surface\n ? `Continue has no provider class for surface '${surface}'`\n : \"entry declares no surface\",\n };\n\n const row: ContinueModelRow = {\n name: `${harnessProviderName(providerId, entry)}/${model}`,\n provider: providerClass,\n model,\n roles,\n };\n const baseUrl = entryBaseUrl(entry);\n // Continue posts to `new URL(\"messages\", apiBase)` after BaseLLM's constructor\n // appends a trailing `/` (continuedev/continue core/llm/index.ts), so the\n // Anthropic `/v1` belongs in `apiBase`: `…/v1` resolves to `…/v1/messages`.\n if (baseUrl) row.apiBase = versionedAnthropicBaseUrl(baseUrl, surface);\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n row.apiKey = `\\${{ secrets.${providerCredentialEnvName(providerId)} }}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n row.requestOptions = { headers: { ...entry.headers } };\n return { row };\n}\n\n/**\n * Build the document for a session: one `models[]` row per distinct endpoint +\n * model a role binds, with every role that binds it.\n *\n * Only bound models are rendered. Continue defaults an omitted `roles` to\n * `[chat, edit, apply, summarize]`, so listing the registry's other models\n * would silently make each of them a chat candidate — the document says\n * exactly what the session decided and nothing else.\n *\n * An empty registry renders nothing — `cn` then runs on whatever its own\n * `config.yaml` or Hub login provides.\n */\nexport function buildContinueConfigDocument(session: EnvDriverSession): ContinueConfigBuild {\n const warnings: string[] = [];\n const models: ContinueModelRow[] = [];\n const document: ContinueConfigDocument = {\n name: \"Skaile session\",\n version: \"0.0.1\",\n schema: \"v1\",\n models,\n };\n const targets: RoleTarget[] = [];\n\n for (const [name, selector] of Object.entries(session.roles ?? {})) {\n const role = CONTINUE_ROLES[name] ? name : name === \"default\" ? \"chat\" : undefined;\n if (!role) {\n warnings.push(`role '${name}' is not a Continue role — dropped`);\n continue;\n }\n const trimmed = selector.trim();\n if (!trimmed) continue;\n // Roles do not chain: each value is a plain selector, never another `@role`.\n const resolved = parseModelRef(trimmed, session.registry);\n if (!resolved?.providerModelId) {\n warnings.push(`role '${name}' ('${selector}') resolves to no model in this registry`);\n continue;\n }\n targets.push({ role, providerId: resolved.providerId, model: resolved.providerModelId });\n }\n\n // The session's own selection is more specific than the roles table, and an\n // absent `chat` has to come from somewhere: the env half's chat binding is\n // the same resolution `cn` would otherwise have had no way to express.\n const chat = continueRoleBinding(session);\n if (chat?.model && (session.modelRef || !targets.some((t) => t.role === \"chat\"))) {\n const existing = targets.findIndex((t) => t.role === \"chat\");\n const bound: RoleTarget = { role: \"chat\", providerId: chat.providerId, model: chat.model };\n if (existing >= 0) targets[existing] = bound;\n else targets.unshift(bound);\n }\n\n const entries = new Map(selectableEntries(session.registry));\n const rowByModel = new Map<string, ContinueModelRow>();\n for (const target of targets) {\n const entry = entries.get(target.providerId);\n if (!entry) {\n warnings.push(`role '${target.role}' names disabled or unknown entry '${target.providerId}'`);\n continue;\n }\n const key = `${target.providerId}/${target.model}`;\n const already = rowByModel.get(key);\n if (already) {\n if (!already.roles.includes(target.role)) already.roles.push(target.role);\n continue;\n }\n const rendered = renderContinueModel(target.providerId, entry, target.model, [target.role]);\n if (\"skipped\" in rendered) {\n warnings.push(`role '${target.role}' on '${target.providerId}': ${rendered.skipped}`);\n continue;\n }\n rowByModel.set(key, rendered.row);\n models.push(rendered.row);\n }\n\n return { document, warnings };\n}\n\n/** What {@link materializeContinueConfig} handed the driver. */\nexport interface ContinueMaterialization extends ContinueConfigBuild {\n /** Child env fragment: `CONTINUE_GLOBAL_DIR`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's role bindings and point the child at them.\n *\n * A session that bound no model writes nothing and leaves\n * `CONTINUE_GLOBAL_DIR` alone, so `cn` keeps resolving its Hub assistant (or\n * the developer's own `~/.continue/config.yaml`) exactly as before. A file\n * left by an earlier render of the same session is removed in that case.\n */\nexport function materializeContinueConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): ContinueMaterialization {\n const build = buildContinueConfigDocument(session);\n const home = driverSessionConfigHome(\"continue\", config);\n if (build.document.models.length === 0) {\n removeSessionConfigFile(home, CONTINUE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n home,\n CONTINUE_CONFIG_FILENAME,\n stringifyYaml(build.document),\n );\n return { ...build, env: { CONTINUE_GLOBAL_DIR: home }, path };\n}\n","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 type { ModelEntry } from \"../models.js\";\nimport { materializeContinueConfig } from \"../provider-materialize/continue-config-yaml.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n type ContinueRoleBinding,\n continueRoleBinding,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\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 * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed\n * by Continue Hub / `config.yaml` assistants.\n *\n * Unlike the other CLI drivers, `cn -p \"<prompt>\" --format json` emits a single\n * **final-result JSON wrapper**, not a streaming event log. This driver runs in\n * `mode: \"buffered\"`: the base accumulates all stdout and {@link handleBuffered}\n * parses it once on exit — so there are no incremental deltas or per-tool\n * events, only a final assistant message plus a result.\n *\n * @remarks\n * - Auth via `CONTINUE_API_KEY` / `cn login`. A `credentials-n` harness\n * (§2.3): every enabled AI provider entry's credential reaches the child\n * environment, and the active model is a **role binding** — `cn` has no\n * `--model` flag, its `config.yaml` binds models to roles — so the session's\n * selector resolves to {@link ContinueRoleBinding} rather than a flag.\n * - `--config <slug>` selects a Continue Hub assistant; session resume via\n * `--resume` (last session only — Continue has no resume-by-id in headless\n * mode).\n * @see https://docs.continue.dev/guides/cli\n * @docLink packages/bridge/drivers#continue-driver\n */\nexport class ContinueDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"continue\");\n protected readonly defaultBin = \"cn\";\n protected readonly productName = \"Continue CLI\";\n protected readonly envPrefix = \"CONTINUE\";\n protected override readonly mode = \"buffered\" as const;\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /** The entry + model bound to Continue's `chat` role for this session. */\n private roleBinding(): ContinueRoleBinding | undefined {\n return continueRoleBinding(this.providerSession());\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return this.roleBinding()?.model ?? this.config.model;\n }\n\n override async start(): Promise<void> {\n const role = this.roleBinding();\n if (role) {\n this.log.debug(\"bound Continue's chat role to an AI provider entry\", {\n providerId: role.providerId,\n provider: role.provider,\n model: role.model,\n apiKeyEnv: role.apiKeyEnv,\n });\n }\n await super.start();\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"--format\", \"json\", \"--silent\"];\n // `--config` names a Continue Hub assistant; `cn` has no model flag. A\n // selector the registry resolves is a *model*, so it must never be passed\n // here — that would point `cn` at an assistant slug that does not exist.\n const slug = this.roleBinding() ? undefined : this.config.model;\n if (slug) args.push(\"--config\", slug);\n if (resumeId) args.push(\"--resume\");\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry. The\n * Continue Hub key is its own credential, not an endpoint's: a registry\n * entry with the reserved id `continue` supplies it, otherwise an ambient\n * `CONTINUE_API_KEY` (or a `cn login`) does.\n *\n * This is also where the session's role bindings are rendered into a\n * private `config.yaml`. It runs once per spawn, so a `reconfigure()`\n * between turns re-renders rather than leaving `cn` bound to the previous\n * selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const env = this.baseEnv([\"CONTINUE_API_KEY\"]);\n const hub = session.registry.providers.continue;\n const key =\n (hub ? entryCredentialValue(\"continue\", hub, { env: session.lookupEnv }) : undefined) ??\n session.lookupEnv.CONTINUE_API_KEY;\n if (key) env.CONTINUE_API_KEY = key;\n const materialized = materializeContinueConfig(session, this.config);\n for (const warning of materialized.warnings)\n this.log.warn(\"Continue role binding\", { warning });\n if (materialized.path)\n this.log.debug(\"rendered Continue assistant\", {\n path: materialized.path,\n models: materialized.document.models.map((m) => `${m.name} [${m.roles.join(\", \")}]`),\n });\n return {\n ...env,\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\";\n }\n\n protected handleBuffered(raw: string): void {\n const json = parseLastJsonObject(raw);\n if (!json) {\n // No structured wrapper — surface the raw stdout as the assistant reply.\n const text = raw.trim();\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({ summary: text || \"Task completed\" });\n return;\n }\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n const text = extractText(json) || (typeof json.output === \"string\" ? json.output : \"\");\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: text || \"Task completed\",\n });\n }\n\n /**\n * Continue resolves models through its `config.yaml` / Hub assistant, not\n * through an endpoint, so the session's registry is the list.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * Parse the last balanced top-level JSON object in `raw`. Continue may print\n * log lines before the final `--format json` blob; we want the wrapper, which\n * is the last `{...}` in the output.\n */\nfunction parseLastJsonObject(raw: string): any | null {\n const end = raw.lastIndexOf(\"}\");\n if (end < 0) return null;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = end; i >= 0; i--) {\n const ch = raw[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === \"}\") depth++;\n else if (ch === \"{\") {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(raw.slice(i, end + 1));\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * `DriverTarget` wrapper for the continue driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const continueDriverTarget: DriverTarget<AgentConfig> = {\n id: \"continue\",\n displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? \"Continue CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new ContinueDriver(config),\n listModels: async (registry, options) =>\n new ContinueDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/provider-materialize/continue-config-yaml.ts","../../../bridge/src/drivers/continue.ts"],"names":["stringifyYaml","text"],"mappings":"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","file":"continue.js","sourcesContent":["/**\n * Continue's `config.yaml` adapter — the file half of the Continue row (§2.3).\n *\n * `cn` has no model flag. Its assistant is a document, and the document binds\n * models to **roles** (`chat`, `edit`, `apply`, `autocomplete`, `embed`,\n * `rerank`, `summarize`); a headless `cn -p` turn runs as `chat`. So unlike\n * OpenCode and Goose, Continue needs a file for *every* endpoint, stock or\n * custom — it has no built-in provider table keyed by vendor names to fall\n * back on:\n *\n * ```yaml\n * name: Skaile session\n * version: 0.0.1\n * schema: v1\n * models:\n * - name: corp-gateway/corp-fast-1\n * provider: openai\n * model: corp-fast-1\n * apiBase: https://llm.corp.example/v1\n * apiKey: ${{ secrets.SKAILE_AIP_CORP_GATEWAY_KEY }}\n * roles:\n * - chat\n * ```\n *\n * `provider` is Continue's *adapter class*, not an endpoint name — the\n * endpoint is `apiBase`. The row's `name` carries the identity instead, and it\n * is `harnessProviderName`/`harnessModelSelector` verbatim, so a model reads\n * the same here as in every other adapter.\n *\n * **Credentials never enter the file.** `apiKey` holds Continue's own\n * `${{ secrets.NAME }}` indirection; the CLI resolves a secret from the\n * process environment before it asks Continue Hub, so `SKAILE_AIP_<ID>_KEY`\n * in the child env is what authenticates the request.\n *\n * **Roles.** The session's `roles` table is the source: every entry whose key\n * is one of Continue's roles becomes that role's binding (`default` is read as\n * `chat`, matching how the rest of the programme spells the fallback), and the\n * session's own model selection wins `chat` when it named one.\n *\n * @see https://docs.continue.dev/reference\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n parseModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessProviderName,\n continueRoleBinding,\n entryBaseUrl,\n entrySurface,\n type EnvDriverSession,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → Continue's provider class. Continue's `openai` adapter is the\n * OpenAI adapter, so both OpenAI-flavoured surfaces resolve to it; the\n * surfaces Continue has no adapter for are reported instead of guessed at.\n */\nconst CONTINUE_PROVIDER_CLASS: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"anthropic\",\n \"openai-completions\": \"openai\",\n \"openai-responses\": \"openai\",\n \"google-generative-ai\": \"gemini\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Roles a Continue `config.yaml` can bind a model to. */\nconst CONTINUE_ROLES: Record<string, true> = {\n chat: true,\n edit: true,\n apply: true,\n autocomplete: true,\n embed: true,\n rerank: true,\n summarize: true,\n};\n\n/** Filename Continue reads its local assistant from, under the global dir. */\nexport const CONTINUE_CONFIG_FILENAME = \"config.yaml\";\n\n/** One `models[]` row. */\nexport interface ContinueModelRow {\n /** `<harnessProviderName>/<providerModelId>` — the programme-wide model id. */\n name: string;\n /** Continue adapter class: `openai`, `anthropic`, `gemini`. */\n provider: string;\n /** Provider-side model id. */\n model: string;\n apiBase?: string;\n /** Continue's `${{ secrets.NAME }}` indirection — never a secret. */\n apiKey?: string;\n roles: string[];\n requestOptions?: { headers: Record<string, string> };\n}\n\n/** The `config.yaml` document this adapter owns. */\nexport interface ContinueConfigDocument {\n name: string;\n version: string;\n schema: string;\n models: ContinueModelRow[];\n}\n\n/** Result of {@link buildContinueConfigDocument}. */\nexport interface ContinueConfigBuild {\n document: ContinueConfigDocument;\n /** Role bindings that resolved to nothing Continue can run. */\n warnings: string[];\n}\n\n/** One resolved role → endpoint + model. */\ninterface RoleTarget {\n role: string;\n providerId: string;\n model: string;\n}\n\n/**\n * Render one entry + model as a `models[]` row, or explain why Continue cannot\n * run it.\n */\nexport function renderContinueModel(\n providerId: string,\n entry: AIProviderLlmEntry,\n model: string,\n roles: string[],\n): { row: ContinueModelRow } | { skipped: string } {\n const surface = entrySurface(entry);\n const providerClass = surface ? CONTINUE_PROVIDER_CLASS[surface] : undefined;\n if (!providerClass)\n return {\n skipped: surface\n ? `Continue has no provider class for surface '${surface}'`\n : \"entry declares no surface\",\n };\n\n const row: ContinueModelRow = {\n name: `${harnessProviderName(providerId, entry)}/${model}`,\n provider: providerClass,\n model,\n roles,\n };\n const baseUrl = entryBaseUrl(entry);\n // Continue posts to `new URL(\"messages\", apiBase)` after BaseLLM's constructor\n // appends a trailing `/` (continuedev/continue core/llm/index.ts), so the\n // Anthropic `/v1` belongs in `apiBase`: `…/v1` resolves to `…/v1/messages`.\n if (baseUrl) row.apiBase = versionedAnthropicBaseUrl(baseUrl, surface);\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n row.apiKey = `\\${{ secrets.${providerCredentialEnvName(providerId)} }}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n row.requestOptions = { headers: { ...entry.headers } };\n return { row };\n}\n\n/**\n * Build the document for a session: one `models[]` row per distinct endpoint +\n * model a role binds, with every role that binds it.\n *\n * Only bound models are rendered. Continue defaults an omitted `roles` to\n * `[chat, edit, apply, summarize]`, so listing the registry's other models\n * would silently make each of them a chat candidate — the document says\n * exactly what the session decided and nothing else.\n *\n * An empty registry renders nothing — `cn` then runs on whatever its own\n * `config.yaml` or Hub login provides.\n */\nexport function buildContinueConfigDocument(session: EnvDriverSession): ContinueConfigBuild {\n const warnings: string[] = [];\n const models: ContinueModelRow[] = [];\n const document: ContinueConfigDocument = {\n name: \"Skaile session\",\n version: \"0.0.1\",\n schema: \"v1\",\n models,\n };\n const targets: RoleTarget[] = [];\n\n for (const [name, selector] of Object.entries(session.roles ?? {})) {\n const role = CONTINUE_ROLES[name] ? name : name === \"default\" ? \"chat\" : undefined;\n if (!role) {\n warnings.push(`role '${name}' is not a Continue role — dropped`);\n continue;\n }\n const trimmed = selector.trim();\n if (!trimmed) continue;\n // Roles do not chain: each value is a plain selector, never another `@role`.\n const resolved = parseModelRef(trimmed, session.registry);\n if (!resolved?.providerModelId) {\n warnings.push(`role '${name}' ('${selector}') resolves to no model in this registry`);\n continue;\n }\n targets.push({ role, providerId: resolved.providerId, model: resolved.providerModelId });\n }\n\n // The session's own selection is more specific than the roles table, and an\n // absent `chat` has to come from somewhere: the env half's chat binding is\n // the same resolution `cn` would otherwise have had no way to express.\n const chat = continueRoleBinding(session);\n if (chat?.model && (session.modelRef || !targets.some((t) => t.role === \"chat\"))) {\n const existing = targets.findIndex((t) => t.role === \"chat\");\n const bound: RoleTarget = { role: \"chat\", providerId: chat.providerId, model: chat.model };\n if (existing >= 0) targets[existing] = bound;\n else targets.unshift(bound);\n }\n\n const entries = new Map(selectableEntries(session.registry));\n const rowByModel = new Map<string, ContinueModelRow>();\n for (const target of targets) {\n const entry = entries.get(target.providerId);\n if (!entry) {\n warnings.push(`role '${target.role}' names disabled or unknown entry '${target.providerId}'`);\n continue;\n }\n const key = `${target.providerId}/${target.model}`;\n const already = rowByModel.get(key);\n if (already) {\n if (!already.roles.includes(target.role)) already.roles.push(target.role);\n continue;\n }\n const rendered = renderContinueModel(target.providerId, entry, target.model, [target.role]);\n if (\"skipped\" in rendered) {\n warnings.push(`role '${target.role}' on '${target.providerId}': ${rendered.skipped}`);\n continue;\n }\n rowByModel.set(key, rendered.row);\n models.push(rendered.row);\n }\n\n return { document, warnings };\n}\n\n/** What {@link materializeContinueConfig} handed the driver. */\nexport interface ContinueMaterialization extends ContinueConfigBuild {\n /** Child env fragment: `CONTINUE_GLOBAL_DIR`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's role bindings and point the child at them.\n *\n * A session that bound no model writes nothing and leaves\n * `CONTINUE_GLOBAL_DIR` alone, so `cn` keeps resolving its Hub assistant (or\n * the developer's own `~/.continue/config.yaml`) exactly as before. A file\n * left by an earlier render of the same session is removed in that case.\n */\nexport function materializeContinueConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): ContinueMaterialization {\n const build = buildContinueConfigDocument(session);\n const home = driverSessionConfigHome(\"continue\", config);\n if (build.document.models.length === 0) {\n removeSessionConfigFile(home, CONTINUE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n home,\n CONTINUE_CONFIG_FILENAME,\n stringifyYaml(build.document),\n );\n return { ...build, env: { CONTINUE_GLOBAL_DIR: home }, path };\n}\n","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 type { ModelEntry } from \"../models.js\";\nimport { materializeContinueConfig } from \"../provider-materialize/continue-config-yaml.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n type ContinueRoleBinding,\n continueRoleBinding,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\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 * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed\n * by Continue Hub / `config.yaml` assistants.\n *\n * Unlike the other CLI drivers, `cn -p \"<prompt>\" --format json` emits a single\n * **final-result JSON wrapper**, not a streaming event log. This driver runs in\n * `mode: \"buffered\"`: the base accumulates all stdout and {@link handleBuffered}\n * parses it once on exit — so there are no incremental deltas or per-tool\n * events, only a final assistant message plus a result.\n *\n * @remarks\n * - Auth via `CONTINUE_API_KEY` / `cn login`. A `credentials-n` harness\n * (§2.3): every enabled AI provider entry's credential reaches the child\n * environment, and the active model is a **role binding** — `cn` has no\n * `--model` flag, its `config.yaml` binds models to roles — so the session's\n * selector resolves to {@link ContinueRoleBinding} rather than a flag.\n * - `--config <slug>` selects a Continue Hub assistant; session resume via\n * `--resume` (last session only — Continue has no resume-by-id in headless\n * mode).\n * @see https://docs.continue.dev/guides/cli\n * @docLink packages/bridge/drivers#continue-driver\n */\nexport class ContinueDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"continue\");\n protected readonly defaultBin = \"cn\";\n protected readonly productName = \"Continue CLI\";\n protected readonly envPrefix = \"CONTINUE\";\n protected override readonly mode = \"buffered\" as const;\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /** The entry + model bound to Continue's `chat` role for this session. */\n private roleBinding(): ContinueRoleBinding | undefined {\n return continueRoleBinding(this.providerSession());\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return this.roleBinding()?.model ?? this.config.model;\n }\n\n override async start(): Promise<void> {\n const role = this.roleBinding();\n if (role) {\n this.log.debug(\"bound Continue's chat role to an AI provider entry\", {\n providerId: role.providerId,\n provider: role.provider,\n model: role.model,\n apiKeyEnv: role.apiKeyEnv,\n });\n }\n await super.start();\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"--format\", \"json\", \"--silent\"];\n // `--config` names a Continue Hub assistant; `cn` has no model flag. A\n // selector the registry resolves is a *model*, so it must never be passed\n // here — that would point `cn` at an assistant slug that does not exist.\n const slug = this.roleBinding() ? undefined : this.config.model;\n if (slug) args.push(\"--config\", slug);\n if (resumeId) args.push(\"--resume\");\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry. The\n * Continue Hub key is its own credential, not an endpoint's: a registry\n * entry with the reserved id `continue` supplies it, otherwise an ambient\n * `CONTINUE_API_KEY` (or a `cn login`) does.\n *\n * This is also where the session's role bindings are rendered into a\n * private `config.yaml`. It runs once per spawn, so a `reconfigure()`\n * between turns re-renders rather than leaving `cn` bound to the previous\n * selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const env = this.baseEnv([\"CONTINUE_API_KEY\"]);\n const hub = session.registry.providers.continue;\n const key =\n (hub ? entryCredentialValue(\"continue\", hub, { env: session.lookupEnv }) : undefined) ??\n session.lookupEnv.CONTINUE_API_KEY;\n if (key) env.CONTINUE_API_KEY = key;\n const materialized = materializeContinueConfig(session, this.config);\n for (const warning of materialized.warnings)\n this.log.warn(\"Continue role binding\", { warning });\n if (materialized.path)\n this.log.debug(\"rendered Continue assistant\", {\n path: materialized.path,\n models: materialized.document.models.map((m) => `${m.name} [${m.roles.join(\", \")}]`),\n });\n return {\n ...env,\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\";\n }\n\n protected handleBuffered(raw: string): void {\n const json = parseLastJsonObject(raw);\n if (!json) {\n // No structured wrapper — surface the raw stdout as the assistant reply.\n const text = raw.trim();\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({ summary: text || \"Task completed\" });\n return;\n }\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n const text = extractText(json) || (typeof json.output === \"string\" ? json.output : \"\");\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: text || \"Task completed\",\n });\n }\n\n /**\n * Continue resolves models through its `config.yaml` / Hub assistant, not\n * through an endpoint, so the session's registry is the list.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * Parse the last balanced top-level JSON object in `raw`. Continue may print\n * log lines before the final `--format json` blob; we want the wrapper, which\n * is the last `{...}` in the output.\n */\nfunction parseLastJsonObject(raw: string): any | null {\n const end = raw.lastIndexOf(\"}\");\n if (end < 0) return null;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = end; i >= 0; i--) {\n const ch = raw[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === \"}\") depth++;\n else if (ch === \"{\") {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(raw.slice(i, end + 1));\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * `DriverTarget` wrapper for the continue driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const continueDriverTarget: DriverTarget<AgentConfig> = {\n id: \"continue\",\n displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? \"Continue CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new ContinueDriver(config),\n listModels: async (registry, options) =>\n new ContinueDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { dispatchCapability } from '../../chunk-
|
|
2
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger, registryDriverConfig } from '../../chunk-
|
|
1
|
+
import { dispatchCapability } from '../../chunk-PRCUGFXV.js';
|
|
2
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger, registryDriverConfig } from '../../chunk-6KPQDP7P.js';
|
|
3
3
|
import '../../chunk-6E6PKKAD.js';
|
|
4
|
-
import '../../chunk-
|
|
4
|
+
import '../../chunk-YNUBJY3L.js';
|
|
5
5
|
import '../../chunk-JMKB7IB4.js';
|
|
6
6
|
import '../../chunk-ICSCSM5D.js';
|
|
7
7
|
import '../../chunk-MJHSLODD.js';
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
1
|
+
export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-HXG6IZSF.js';
|
|
2
|
+
import '../../chunk-R2U346ER.js';
|
|
3
|
+
import '../../chunk-EETXMMZS.js';
|
|
4
|
+
import '../../chunk-4WKZEMBD.js';
|
|
5
5
|
import '../../chunk-XBSQ4KMC.js';
|
|
6
6
|
import '../../chunk-YROR332M.js';
|
|
7
|
-
import '../../chunk-
|
|
7
|
+
import '../../chunk-6KPQDP7P.js';
|
|
8
8
|
import '../../chunk-6E6PKKAD.js';
|
|
9
9
|
import '../../chunk-JMKB7IB4.js';
|
|
10
10
|
import '../../chunk-ICSCSM5D.js';
|
|
11
11
|
import '../../chunk-MJHSLODD.js';
|
|
12
12
|
import '../../chunk-C3CAXQMA.js';
|
|
13
13
|
import '../../chunk-BOFL7GIF.js';
|
|
14
|
-
import '../../chunk-
|
|
14
|
+
import '../../chunk-5CYEWBPB.js';
|
|
15
15
|
import '../../chunk-NSBPE2FW.js';
|
|
16
16
|
//# sourceMappingURL=gemini.js.map
|
|
17
17
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { driverSessionConfigHome, pruneSessionConfigDir, writeSessionConfigFile } from '../../chunk-
|
|
2
|
-
import { SubprocessCliDriver, extractText, extractCost, extractTokens } from '../../chunk-
|
|
3
|
-
import { resolveEnvDriverSession, resolveRegistryBinding, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds } from '../../chunk-
|
|
1
|
+
import { driverSessionConfigHome, pruneSessionConfigDir, writeSessionConfigFile } from '../../chunk-ARUJBGAH.js';
|
|
2
|
+
import { SubprocessCliDriver, extractText, extractCost, extractTokens } from '../../chunk-R2U346ER.js';
|
|
3
|
+
import { resolveEnvDriverSession, resolveRegistryBinding, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds } from '../../chunk-EETXMMZS.js';
|
|
4
4
|
import '../../chunk-XBSQ4KMC.js';
|
|
5
5
|
import '../../chunk-YROR332M.js';
|
|
6
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-
|
|
6
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-6KPQDP7P.js';
|
|
7
7
|
import '../../chunk-6E6PKKAD.js';
|
|
8
|
-
import '../../chunk-
|
|
8
|
+
import '../../chunk-YV3YI3TA.js';
|
|
9
9
|
import '../../chunk-4GY63JU6.js';
|
|
10
|
-
import '../../chunk-
|
|
11
|
-
import '../../chunk-
|
|
10
|
+
import '../../chunk-36ML6SFP.js';
|
|
11
|
+
import '../../chunk-KAJH3XPW.js';
|
|
12
12
|
import '../../chunk-K5GBV4SA.js';
|
|
13
13
|
import '../../chunk-QVZA2MDT.js';
|
|
14
|
-
import '../../chunk-
|
|
14
|
+
import '../../chunk-JEPSP6XK.js';
|
|
15
|
+
import '../../chunk-TLKM4M47.js';
|
|
15
16
|
import '../../chunk-EB4ZTESQ.js';
|
|
16
|
-
import '../../chunk-
|
|
17
|
-
import '../../chunk-
|
|
18
|
-
import '../../chunk-
|
|
17
|
+
import '../../chunk-DSB6X25D.js';
|
|
18
|
+
import '../../chunk-5K2VT6E2.js';
|
|
19
|
+
import '../../chunk-A5EDMBFG.js';
|
|
19
20
|
import '../../chunk-JMKB7IB4.js';
|
|
20
21
|
import '../../chunk-ICSCSM5D.js';
|
|
21
22
|
import '../../chunk-MJHSLODD.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/provider-materialize/goose-custom-providers.ts","../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["/**\n * Goose's `custom_providers/*.json` adapter — the file half of the Goose row\n * (§2.3).\n *\n * `GOOSE_PROVIDER` can only name a provider Goose already has: one of its\n * built-in Rust providers, or one of the JSON *declarative* providers it loads\n * from `<config dir>/custom_providers/`. An endpoint of the session's own is\n * therefore a file — one per entry, named after the entry, in Goose's own\n * vocabulary:\n *\n * ```json\n * {\n * \"name\": \"corp-gateway\",\n * \"engine\": \"openai\",\n * \"display_name\": \"Corp Gateway\",\n * \"api_key_env\": \"SKAILE_AIP_CORP_GATEWAY_KEY\",\n * \"base_url\": \"https://llm.corp.example/v1\",\n * \"models\": [{ \"name\": \"corp-fast-1\" }],\n * \"requires_auth\": true\n * }\n * ```\n *\n * `name` is {@link harnessProviderName}, so the id in the file is the one the\n * env half already puts in `GOOSE_PROVIDER`. `api_key_env` is a variable\n * *name*: Goose resolves it from the child environment (its config layer reads\n * the process environment first), so no secret is ever written.\n *\n * **Engines.** A declarative provider is one of three engines — `openai`,\n * `anthropic`, `ollama` — each a request shape, not a vendor. Only the two\n * surfaces that map onto one are rendered; `google-generative-ai` and\n * `bedrock-converse-stream` are built-in Goose providers with no declarative\n * spelling, so an entry on those surfaces is reported instead of guessed at.\n *\n * **Config home.** Goose resolves its config, data and state directories from\n * one variable, `GOOSE_PATH_ROOT`, so a session that renders anything moves\n * the whole tree and never touches the developer's own — neither reading it\n * nor writing to it.\n *\n * @see https://block.github.io/goose/docs/guides/custom-providers\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n pruneSessionConfigDir,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → Goose declarative `engine`. `openai-completions` is the only\n * OpenAI-flavoured surface here on purpose: the `openai` engine posts to\n * `<base>/v1/chat/completions`, which is not the Responses API.\n */\nconst GOOSE_ENGINE: Partial<Record<AIProviderSurface, string>> = {\n \"openai-completions\": \"openai\",\n \"anthropic-messages\": \"anthropic\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Directory, relative to `GOOSE_PATH_ROOT`, Goose reads its config from. */\nexport const GOOSE_CONFIG_DIRNAME = \"config\";\n\n/** Directory, relative to the config dir, declarative providers are loaded from. */\nexport const GOOSE_CUSTOM_PROVIDERS_DIRNAME = \"custom_providers\";\n\n/** One entry of a declarative provider's `models[]`. */\nexport interface GooseModelEntry {\n name: string;\n context_limit?: number;\n}\n\n/** One `custom_providers/<id>.json` document. */\nexport interface GooseCustomProvider {\n /** Provider id — what `GOOSE_PROVIDER` names. Must equal the file stem. */\n name: string;\n engine: string;\n display_name: string;\n /** Name of the variable carrying the credential — never the credential. */\n api_key_env?: string;\n base_url: string;\n models: GooseModelEntry[];\n headers?: Record<string, string>;\n supports_streaming?: boolean;\n requires_auth: boolean;\n /**\n * `false` keeps Goose on the static `models[]` instead of probing\n * `<base>/v1/models`; only meaningful with a non-empty list.\n */\n dynamic_models?: boolean;\n}\n\n/** An entry Goose cannot be taught, and why. */\nexport interface GooseSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildGooseCustomProviders}. */\nexport interface GooseCustomProvidersBuild {\n /** Provider id → its document, in registry order. */\n providers: Record<string, GooseCustomProvider>;\n skipped: GooseSkippedEntry[];\n}\n\n/**\n * Render one entry as a declarative provider, or explain why Goose cannot load\n * it.\n */\nexport function renderGooseCustomProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { provider: GooseCustomProvider } | { skipped: string } {\n const surface = entrySurface(entry);\n const engine = surface ? GOOSE_ENGINE[surface] : undefined;\n if (!engine)\n return {\n skipped: surface\n ? `Goose has no declarative engine for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and Goose does not know this provider\" };\n\n const credentialKind = entry.credential?.kind;\n const envDelivered = Boolean(credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind]);\n if (credentialKind && credentialKind !== \"none\" && !envDelivered)\n return {\n skipped: `Goose cannot present a '${credentialKind}' credential for a declarative provider`,\n };\n\n const models: GooseModelEntry[] = [];\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n const contextWindow = entry.capabilities?.[logicalId]?.context_window;\n models.push({\n name: providerModelId,\n ...(contextWindow ? { context_limit: contextWindow } : {}),\n });\n }\n\n const provider: GooseCustomProvider = {\n name: providerId,\n engine,\n display_name: entry.label ?? providerId,\n ...(envDelivered ? { api_key_env: providerCredentialEnvName(providerId) } : {}),\n base_url: baseUrl,\n models,\n ...(entry.headers && Object.keys(entry.headers).length > 0\n ? { headers: { ...entry.headers } }\n : {}),\n supports_streaming: true,\n requires_auth: envDelivered,\n };\n return { provider };\n}\n\n/**\n * Build one declarative provider per entry Goose cannot name on its own.\n *\n * The selected model is appended to its provider's `models[]` when the\n * registry did not enumerate it, so `GOOSE_MODEL` always names something the\n * file declares. A provider with a static list gets `dynamic_models: false` —\n * without it Goose probes `<base>/v1/models` on every run, which a gateway\n * that serves only completions answers with an error.\n *\n * An empty registry renders nothing — Goose's built-in provider table\n * already covers every stock catalog endpoint.\n */\nexport function buildGooseCustomProviders(session: EnvDriverSession): GooseCustomProvidersBuild {\n const providers: Record<string, GooseCustomProvider> = {};\n const skipped: GooseSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // Goose's built-in provider table already knows every catalog endpoint,\n // under the same name `harnessProviderName` puts in `GOOSE_PROVIDER`.\n // What it cannot know is an endpoint of the session's own — one rule,\n // read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderGooseCustomProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else providers[providerId] = rendered.provider;\n }\n\n const binding = resolveRegistryBinding(session);\n const selected = binding ? providers[binding.providerId] : undefined;\n if (\n selected &&\n binding?.providerModelId &&\n !selected.models.some((m) => m.name === binding.providerModelId)\n )\n selected.models.push({ name: binding.providerModelId });\n\n for (const provider of Object.values(providers)) {\n if (provider.models.length > 0) provider.dynamic_models = false;\n }\n\n return { providers, skipped };\n}\n\n/** What {@link materializeGooseCustomProviders} handed the driver. */\nexport interface GooseMaterialization extends GooseCustomProvidersBuild {\n /** Child env fragment: `GOOSE_PATH_ROOT`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute paths of the rendered provider files. */\n paths: string[];\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is a Goose built-in writes nothing and\n * leaves `GOOSE_PATH_ROOT` unset, so the developer's own Goose tree keeps\n * working exactly as before. Once anything *is* rendered the whole tree moves\n * — config, data and state together, because Goose derives all three from\n * that one variable — and the session stops inheriting the developer's Goose\n * settings along with their config directory. That is the price of never\n * reading or writing it.\n */\nexport function materializeGooseCustomProviders(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): GooseMaterialization {\n const build = buildGooseCustomProviders(session);\n const root = driverSessionConfigHome(\"goose\", config);\n const providersDir = join(root, GOOSE_CONFIG_DIRNAME, GOOSE_CUSTOM_PROVIDERS_DIRNAME);\n const ids = Object.keys(build.providers);\n if (ids.length === 0) {\n pruneSessionConfigDir(providersDir, new Set());\n return { ...build, env: {}, paths: [] };\n }\n\n const paths = ids.map((id) =>\n writeSessionConfigFile(\n providersDir,\n `${id}.json`,\n `${JSON.stringify(build.providers[id], null, 2)}\\n`,\n ),\n );\n pruneSessionConfigDir(providersDir, new Set(ids.map((id) => `${id}.json`)));\n return { ...build, env: { GOOSE_PATH_ROOT: root }, paths };\n}\n","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 type { ModelEntry } from \"../models.js\";\nimport {\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeGooseCustomProviders } from \"../provider-materialize/goose-custom-providers.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 * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * A `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active endpoint + model\n * are named by `GOOSE_PROVIDER` / `GOOSE_MODEL`. An endpoint Goose has no\n * built-in provider for is additionally rendered as a declarative\n * `custom_providers/<id>.json`\n * (`provider-materialize/goose-custom-providers.ts`) under the session's own\n * `GOOSE_PATH_ROOT`.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n /**\n * Base env plus the active endpoint (`GOOSE_PROVIDER`/`GOOSE_MODEL`) and one\n * credential variable per enabled registry entry — the canonical\n * `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the vendor\n * carrier Goose's built-in provider table reads.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n const binding = resolveRegistryBinding(session);\n if (binding) {\n env.GOOSE_PROVIDER = binding.harnessProviderId;\n if (binding.providerModelId) env.GOOSE_MODEL = binding.providerModelId;\n else delete env.GOOSE_MODEL;\n } else if (this.config.model) {\n env.GOOSE_MODEL = this.config.model;\n }\n const materialized = materializeGooseCustomProviders(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"Goose cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.paths.length > 0)\n this.log.debug(\"rendered Goose custom providers\", { paths: materialized.paths });\n return {\n ...env,\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\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) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? 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 case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n /**\n * Goose enumerates models from its own provider table and config, not from\n * an endpoint, so the session's registry is the list.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n listModels: async (registry, options) =>\n new GooseDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/provider-materialize/goose-custom-providers.ts","../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["/**\n * Goose's `custom_providers/*.json` adapter — the file half of the Goose row\n * (§2.3).\n *\n * `GOOSE_PROVIDER` can only name a provider Goose already has: one of its\n * built-in Rust providers, or one of the JSON *declarative* providers it loads\n * from `<config dir>/custom_providers/`. An endpoint of the session's own is\n * therefore a file — one per entry, named after the entry, in Goose's own\n * vocabulary:\n *\n * ```json\n * {\n * \"name\": \"corp-gateway\",\n * \"engine\": \"openai\",\n * \"display_name\": \"Corp Gateway\",\n * \"api_key_env\": \"SKAILE_AIP_CORP_GATEWAY_KEY\",\n * \"base_url\": \"https://llm.corp.example/v1\",\n * \"models\": [{ \"name\": \"corp-fast-1\" }],\n * \"requires_auth\": true\n * }\n * ```\n *\n * `name` is {@link harnessProviderName}, so the id in the file is the one the\n * env half already puts in `GOOSE_PROVIDER`. `api_key_env` is a variable\n * *name*: Goose resolves it from the child environment (its config layer reads\n * the process environment first), so no secret is ever written.\n *\n * **Engines.** A declarative provider is one of three engines — `openai`,\n * `anthropic`, `ollama` — each a request shape, not a vendor. Only the two\n * surfaces that map onto one are rendered; `google-generative-ai` and\n * `bedrock-converse-stream` are built-in Goose providers with no declarative\n * spelling, so an entry on those surfaces is reported instead of guessed at.\n *\n * **Config home.** Goose resolves its config, data and state directories from\n * one variable, `GOOSE_PATH_ROOT`, so a session that renders anything moves\n * the whole tree and never touches the developer's own — neither reading it\n * nor writing to it.\n *\n * @see https://block.github.io/goose/docs/guides/custom-providers\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n pruneSessionConfigDir,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → Goose declarative `engine`. `openai-completions` is the only\n * OpenAI-flavoured surface here on purpose: the `openai` engine posts to\n * `<base>/v1/chat/completions`, which is not the Responses API.\n */\nconst GOOSE_ENGINE: Partial<Record<AIProviderSurface, string>> = {\n \"openai-completions\": \"openai\",\n \"anthropic-messages\": \"anthropic\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Directory, relative to `GOOSE_PATH_ROOT`, Goose reads its config from. */\nexport const GOOSE_CONFIG_DIRNAME = \"config\";\n\n/** Directory, relative to the config dir, declarative providers are loaded from. */\nexport const GOOSE_CUSTOM_PROVIDERS_DIRNAME = \"custom_providers\";\n\n/** One entry of a declarative provider's `models[]`. */\nexport interface GooseModelEntry {\n name: string;\n context_limit?: number;\n}\n\n/** One `custom_providers/<id>.json` document. */\nexport interface GooseCustomProvider {\n /** Provider id — what `GOOSE_PROVIDER` names. Must equal the file stem. */\n name: string;\n engine: string;\n display_name: string;\n /** Name of the variable carrying the credential — never the credential. */\n api_key_env?: string;\n base_url: string;\n models: GooseModelEntry[];\n headers?: Record<string, string>;\n supports_streaming?: boolean;\n requires_auth: boolean;\n /**\n * `false` keeps Goose on the static `models[]` instead of probing\n * `<base>/v1/models`; only meaningful with a non-empty list.\n */\n dynamic_models?: boolean;\n}\n\n/** An entry Goose cannot be taught, and why. */\nexport interface GooseSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildGooseCustomProviders}. */\nexport interface GooseCustomProvidersBuild {\n /** Provider id → its document, in registry order. */\n providers: Record<string, GooseCustomProvider>;\n skipped: GooseSkippedEntry[];\n}\n\n/**\n * Render one entry as a declarative provider, or explain why Goose cannot load\n * it.\n */\nexport function renderGooseCustomProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { provider: GooseCustomProvider } | { skipped: string } {\n const surface = entrySurface(entry);\n const engine = surface ? GOOSE_ENGINE[surface] : undefined;\n if (!engine)\n return {\n skipped: surface\n ? `Goose has no declarative engine for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and Goose does not know this provider\" };\n\n const credentialKind = entry.credential?.kind;\n const envDelivered = Boolean(credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind]);\n if (credentialKind && credentialKind !== \"none\" && !envDelivered)\n return {\n skipped: `Goose cannot present a '${credentialKind}' credential for a declarative provider`,\n };\n\n const models: GooseModelEntry[] = [];\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n const contextWindow = entry.capabilities?.[logicalId]?.context_window;\n models.push({\n name: providerModelId,\n ...(contextWindow ? { context_limit: contextWindow } : {}),\n });\n }\n\n const provider: GooseCustomProvider = {\n name: providerId,\n engine,\n display_name: entry.label ?? providerId,\n ...(envDelivered ? { api_key_env: providerCredentialEnvName(providerId) } : {}),\n base_url: baseUrl,\n models,\n ...(entry.headers && Object.keys(entry.headers).length > 0\n ? { headers: { ...entry.headers } }\n : {}),\n supports_streaming: true,\n requires_auth: envDelivered,\n };\n return { provider };\n}\n\n/**\n * Build one declarative provider per entry Goose cannot name on its own.\n *\n * The selected model is appended to its provider's `models[]` when the\n * registry did not enumerate it, so `GOOSE_MODEL` always names something the\n * file declares. A provider with a static list gets `dynamic_models: false` —\n * without it Goose probes `<base>/v1/models` on every run, which a gateway\n * that serves only completions answers with an error.\n *\n * An empty registry renders nothing — Goose's built-in provider table\n * already covers every stock catalog endpoint.\n */\nexport function buildGooseCustomProviders(session: EnvDriverSession): GooseCustomProvidersBuild {\n const providers: Record<string, GooseCustomProvider> = {};\n const skipped: GooseSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // Goose's built-in provider table already knows every catalog endpoint,\n // under the same name `harnessProviderName` puts in `GOOSE_PROVIDER`.\n // What it cannot know is an endpoint of the session's own — one rule,\n // read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderGooseCustomProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else providers[providerId] = rendered.provider;\n }\n\n const binding = resolveRegistryBinding(session);\n const selected = binding ? providers[binding.providerId] : undefined;\n if (\n selected &&\n binding?.providerModelId &&\n !selected.models.some((m) => m.name === binding.providerModelId)\n )\n selected.models.push({ name: binding.providerModelId });\n\n for (const provider of Object.values(providers)) {\n if (provider.models.length > 0) provider.dynamic_models = false;\n }\n\n return { providers, skipped };\n}\n\n/** What {@link materializeGooseCustomProviders} handed the driver. */\nexport interface GooseMaterialization extends GooseCustomProvidersBuild {\n /** Child env fragment: `GOOSE_PATH_ROOT`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute paths of the rendered provider files. */\n paths: string[];\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is a Goose built-in writes nothing and\n * leaves `GOOSE_PATH_ROOT` unset, so the developer's own Goose tree keeps\n * working exactly as before. Once anything *is* rendered the whole tree moves\n * — config, data and state together, because Goose derives all three from\n * that one variable — and the session stops inheriting the developer's Goose\n * settings along with their config directory. That is the price of never\n * reading or writing it.\n */\nexport function materializeGooseCustomProviders(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): GooseMaterialization {\n const build = buildGooseCustomProviders(session);\n const root = driverSessionConfigHome(\"goose\", config);\n const providersDir = join(root, GOOSE_CONFIG_DIRNAME, GOOSE_CUSTOM_PROVIDERS_DIRNAME);\n const ids = Object.keys(build.providers);\n if (ids.length === 0) {\n pruneSessionConfigDir(providersDir, new Set());\n return { ...build, env: {}, paths: [] };\n }\n\n const paths = ids.map((id) =>\n writeSessionConfigFile(\n providersDir,\n `${id}.json`,\n `${JSON.stringify(build.providers[id], null, 2)}\\n`,\n ),\n );\n pruneSessionConfigDir(providersDir, new Set(ids.map((id) => `${id}.json`)));\n return { ...build, env: { GOOSE_PATH_ROOT: root }, paths };\n}\n","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 type { ModelEntry } from \"../models.js\";\nimport {\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeGooseCustomProviders } from \"../provider-materialize/goose-custom-providers.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 * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * A `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active endpoint + model\n * are named by `GOOSE_PROVIDER` / `GOOSE_MODEL`. An endpoint Goose has no\n * built-in provider for is additionally rendered as a declarative\n * `custom_providers/<id>.json`\n * (`provider-materialize/goose-custom-providers.ts`) under the session's own\n * `GOOSE_PATH_ROOT`.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n /**\n * Base env plus the active endpoint (`GOOSE_PROVIDER`/`GOOSE_MODEL`) and one\n * credential variable per enabled registry entry — the canonical\n * `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the vendor\n * carrier Goose's built-in provider table reads.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n const binding = resolveRegistryBinding(session);\n if (binding) {\n env.GOOSE_PROVIDER = binding.harnessProviderId;\n if (binding.providerModelId) env.GOOSE_MODEL = binding.providerModelId;\n else delete env.GOOSE_MODEL;\n } else if (this.config.model) {\n env.GOOSE_MODEL = this.config.model;\n }\n const materialized = materializeGooseCustomProviders(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"Goose cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.paths.length > 0)\n this.log.debug(\"rendered Goose custom providers\", { paths: materialized.paths });\n return {\n ...env,\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\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) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? 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 case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n /**\n * Goose enumerates models from its own provider table and config, not from\n * an endpoint, so the session's registry is the list.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n listModels: async (registry, options) =>\n new GooseDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { checkToolInputSchema } from '../../chunk-X5O56UO4.js';
|
|
2
|
-
import { entrySurface } from '../../chunk-
|
|
2
|
+
import { entrySurface } from '../../chunk-EETXMMZS.js';
|
|
3
3
|
import { scopeReconfigureModel } from '../../chunk-EINLFFP6.js';
|
|
4
|
-
import { dispatchCapability } from '../../chunk-
|
|
4
|
+
import { dispatchCapability } from '../../chunk-PRCUGFXV.js';
|
|
5
5
|
import { stripRunnerPrivateEnv, classifyGenericErrorMessage } from '../../chunk-XBSQ4KMC.js';
|
|
6
6
|
import { wrapAgentCommand, resolveAgentExec } from '../../chunk-YROR332M.js';
|
|
7
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger, registryDriverConfig, entryCredentialValue, providerCredentialEnvName } from '../../chunk-
|
|
7
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger, registryDriverConfig, entryCredentialValue, providerCredentialEnvName } from '../../chunk-6KPQDP7P.js';
|
|
8
8
|
import '../../chunk-6E6PKKAD.js';
|
|
9
|
-
import { withActivityLabelJsonSchema } from '../../chunk-
|
|
9
|
+
import { withActivityLabelJsonSchema } from '../../chunk-YNUBJY3L.js';
|
|
10
10
|
import '../../chunk-JMKB7IB4.js';
|
|
11
11
|
import '../../chunk-ICSCSM5D.js';
|
|
12
12
|
import { AI_PROVIDER_SURFACES, registryEntries, isEntryEnabled, parseModelRef, normalizeEntryBaseUrl, resolveEntryBaseUrl } from '../../chunk-MJHSLODD.js';
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-
|
|
2
|
-
import { SubprocessCliDriver, extractText } from '../../chunk-
|
|
3
|
-
import { resolveEnvDriverSession, resolveRegistryBinding, harnessModelSelector, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from '../../chunk-
|
|
1
|
+
import { driverSessionConfigHome, removeSessionConfigFile, writeSessionConfigFile } from '../../chunk-ARUJBGAH.js';
|
|
2
|
+
import { SubprocessCliDriver, extractText } from '../../chunk-R2U346ER.js';
|
|
3
|
+
import { resolveEnvDriverSession, resolveRegistryBinding, harnessModelSelector, credentialsForEveryProvider, registryModelEntries, selectableEntries, isStockCatalogEndpoint, entrySurface, entryBaseUrl, entryModelIds, versionedAnthropicBaseUrl } from '../../chunk-EETXMMZS.js';
|
|
4
4
|
import '../../chunk-XBSQ4KMC.js';
|
|
5
5
|
import '../../chunk-YROR332M.js';
|
|
6
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-
|
|
6
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, registryDriverConfig, providerCredentialEnvName } from '../../chunk-6KPQDP7P.js';
|
|
7
7
|
import '../../chunk-6E6PKKAD.js';
|
|
8
|
-
import '../../chunk-
|
|
8
|
+
import '../../chunk-YV3YI3TA.js';
|
|
9
9
|
import '../../chunk-4GY63JU6.js';
|
|
10
|
-
import '../../chunk-
|
|
11
|
-
import '../../chunk-
|
|
10
|
+
import '../../chunk-36ML6SFP.js';
|
|
11
|
+
import '../../chunk-KAJH3XPW.js';
|
|
12
12
|
import '../../chunk-K5GBV4SA.js';
|
|
13
13
|
import '../../chunk-QVZA2MDT.js';
|
|
14
|
-
import '../../chunk-
|
|
14
|
+
import '../../chunk-JEPSP6XK.js';
|
|
15
|
+
import '../../chunk-TLKM4M47.js';
|
|
15
16
|
import '../../chunk-EB4ZTESQ.js';
|
|
16
|
-
import '../../chunk-
|
|
17
|
-
import '../../chunk-
|
|
18
|
-
import '../../chunk-
|
|
17
|
+
import '../../chunk-DSB6X25D.js';
|
|
18
|
+
import '../../chunk-5K2VT6E2.js';
|
|
19
|
+
import '../../chunk-A5EDMBFG.js';
|
|
19
20
|
import '../../chunk-JMKB7IB4.js';
|
|
20
21
|
import '../../chunk-ICSCSM5D.js';
|
|
21
22
|
import '../../chunk-MJHSLODD.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/provider-materialize/opencode-config.ts","../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link harnessProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link driverSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_DRIVER_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the driver. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvDriverSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `harnessProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? harnessModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the driver. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = driverSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n harnessModelSelector,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeOpenCodeConfig } from \"../provider-materialize/opencode-config.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractText, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * One `opencode run --format json` event, as emitted by opencode-ai 1.18.31:\n * `{type, timestamp, sessionID, part}` with the payload nested under `part`.\n * Only the fields the driver reads are pinned; other keys are stripped.\n */\nconst OpenCodeEvent = z.object({\n type: z.string(),\n sessionID: z.string().optional(),\n part: z\n .object({\n text: z.string().optional(),\n reason: z.string().optional(),\n cost: z.number().optional(),\n tokens: z\n .object({\n input: z.number().optional(),\n output: z.number().optional(),\n total: z.number().optional(),\n reasoning: z.number().optional(),\n cache: z.object({ read: z.number().optional(), write: z.number().optional() }).optional(),\n })\n .optional(),\n })\n .default({}),\n});\ntype OpenCodeTokens = NonNullable<z.infer<typeof OpenCodeEvent>[\"part\"][\"tokens\"]>;\n\n/** Map `step_finish.part.tokens` onto {@link TokenUsage}; zero cache/reasoning counts are omitted. */\nfunction opencodeTokens(t: OpenCodeTokens | undefined): TokenUsage | null {\n if (!t) return null;\n const usage: TokenUsage = {};\n if (t.input !== undefined) usage.inputTokens = t.input;\n if (t.output !== undefined) usage.outputTokens = t.output;\n if (t.total !== undefined) usage.totalTokens = t.total;\n if (t.reasoning) usage.reasoningTokens = t.reasoning;\n if (t.cache?.read) usage.cacheReadTokens = t.cache.read;\n if (t.cache?.write) usage.cacheCreationTokens = t.cache.write;\n return Object.keys(usage).length > 0 ? usage : null;\n}\n\n/** Sum two usages field by field (a turn can span several opencode steps). */\nfunction addTokens(a: TokenUsage | null, b: TokenUsage): TokenUsage {\n if (!a) return b;\n const out: TokenUsage = { ...a };\n for (const key of Object.keys(b) as (keyof TokenUsage)[])\n out[key] = (a[key] ?? 0) + (b[key] ?? 0);\n return out;\n}\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. A\n * `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active model is selected\n * as `-m <provider>/<model>`. An endpoint models.dev does not know is\n * additionally rendered into a session-private `opencode.json`\n * (`provider-materialize/opencode-config.ts`) that `XDG_CONFIG_HOME` points\n * the child at.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is read from `sessionID`,\n * present on every event, and emitted once as `session_info`.\n * - The event schema is pinned against opencode-ai 1.18.31 by a recorded\n * fixture (`tests/fixtures/opencode-1.18-events.jsonl`).\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const binding = resolveRegistryBinding(this.providerSession());\n const model = binding ? harnessModelSelector(binding) : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry — the\n * canonical `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the\n * vendor carrier OpenCode reads on its own (`ANTHROPIC_API_KEY`, …). There\n * is no per-driver key allowlist: what reaches the child is exactly what\n * the registry can authenticate.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const materialized = materializeOpenCodeConfig(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"OpenCode cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.path)\n this.log.debug(\"rendered OpenCode provider config\", { path: materialized.path });\n return {\n ...this.baseEnv(),\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n override async prompt(message: string): Promise<void> {\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n return super.prompt(message);\n }\n\n /** Assistant text of the current turn, joined across `text` parts and steps. */\n private turnText = \"\";\n /** Usage summed across the turn's `step_finish` events. */\n private turnTokens: TokenUsage | null = null;\n private turnCost: number | undefined;\n\n /**\n * Map `opencode run --format json` (pinned against opencode-ai 1.18.31,\n * fixture `tests/fixtures/opencode-1.18-events.jsonl`). Every event is\n * `{type, timestamp, sessionID, part}` with the payload under `part`;\n * observed types are `step_start`, `text` and `step_finish`. Anything else\n * is ignored rather than guessed at.\n */\n protected handleJson(json: unknown): void {\n const parsed = OpenCodeEvent.safeParse(json);\n if (!parsed.success) return;\n const { type, sessionID, part } = parsed.data;\n this.captureSession(sessionID);\n switch (type) {\n case \"text\": {\n const text = extractText(parsed.data);\n if (!text) break;\n this.turnText += text;\n this.pushAssistantDelta(this.turnText);\n break;\n }\n\n case \"step_finish\": {\n const tokens = opencodeTokens(part.tokens);\n if (tokens) this.turnTokens = addTokens(this.turnTokens, tokens);\n if (part.cost !== undefined) this.turnCost = (this.turnCost ?? 0) + part.cost;\n // [INFERENCE] a step ending in tool calls is followed by another step\n // in the same turn; only the observed terminal reason ends the turn.\n if (part.reason === \"tool-calls\") break;\n this.pushResult({\n tokens: this.turnTokens,\n costUsd: this.turnCost,\n summary: this.turnText || \"Task completed\",\n });\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n break;\n }\n }\n }\n\n /**\n * OpenCode has no model-list endpoint of its own (it reads models.dev), so\n * the session's registry is the list: every enabled entry's mapped ids,\n * namespaced exactly as `-m` takes them.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n listModels: async (registry, options) =>\n new OpenCodeDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/provider-materialize/opencode-config.ts","../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link harnessProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link driverSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_DRIVER_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the driver. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvDriverSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `harnessProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? harnessModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the driver. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = driverSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n harnessModelSelector,\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeOpenCodeConfig } from \"../provider-materialize/opencode-config.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractText, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * One `opencode run --format json` event, as emitted by opencode-ai 1.18.31:\n * `{type, timestamp, sessionID, part}` with the payload nested under `part`.\n * Only the fields the driver reads are pinned; other keys are stripped.\n */\nconst OpenCodeEvent = z.object({\n type: z.string(),\n sessionID: z.string().optional(),\n part: z\n .object({\n text: z.string().optional(),\n reason: z.string().optional(),\n cost: z.number().optional(),\n tokens: z\n .object({\n input: z.number().optional(),\n output: z.number().optional(),\n total: z.number().optional(),\n reasoning: z.number().optional(),\n cache: z.object({ read: z.number().optional(), write: z.number().optional() }).optional(),\n })\n .optional(),\n })\n .default({}),\n});\ntype OpenCodeTokens = NonNullable<z.infer<typeof OpenCodeEvent>[\"part\"][\"tokens\"]>;\n\n/** Map `step_finish.part.tokens` onto {@link TokenUsage}; zero cache/reasoning counts are omitted. */\nfunction opencodeTokens(t: OpenCodeTokens | undefined): TokenUsage | null {\n if (!t) return null;\n const usage: TokenUsage = {};\n if (t.input !== undefined) usage.inputTokens = t.input;\n if (t.output !== undefined) usage.outputTokens = t.output;\n if (t.total !== undefined) usage.totalTokens = t.total;\n if (t.reasoning) usage.reasoningTokens = t.reasoning;\n if (t.cache?.read) usage.cacheReadTokens = t.cache.read;\n if (t.cache?.write) usage.cacheCreationTokens = t.cache.write;\n return Object.keys(usage).length > 0 ? usage : null;\n}\n\n/** Sum two usages field by field (a turn can span several opencode steps). */\nfunction addTokens(a: TokenUsage | null, b: TokenUsage): TokenUsage {\n if (!a) return b;\n const out: TokenUsage = { ...a };\n for (const key of Object.keys(b) as (keyof TokenUsage)[])\n out[key] = (a[key] ?? 0) + (b[key] ?? 0);\n return out;\n}\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. A\n * `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active model is selected\n * as `-m <provider>/<model>`. An endpoint models.dev does not know is\n * additionally rendered into a session-private `opencode.json`\n * (`provider-materialize/opencode-config.ts`) that `XDG_CONFIG_HOME` points\n * the child at.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is read from `sessionID`,\n * present on every event, and emitted once as `session_info`.\n * - The event schema is pinned against opencode-ai 1.18.31 by a recorded\n * fixture (`tests/fixtures/opencode-1.18-events.jsonl`).\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const binding = resolveRegistryBinding(this.providerSession());\n const model = binding ? harnessModelSelector(binding) : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n /**\n * Base env plus one credential variable per enabled registry entry — the\n * canonical `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the\n * vendor carrier OpenCode reads on its own (`ANTHROPIC_API_KEY`, …). There\n * is no per-driver key allowlist: what reaches the child is exactly what\n * the registry can authenticate.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const materialized = materializeOpenCodeConfig(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"OpenCode cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.path)\n this.log.debug(\"rendered OpenCode provider config\", { path: materialized.path });\n return {\n ...this.baseEnv(),\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n override async prompt(message: string): Promise<void> {\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n return super.prompt(message);\n }\n\n /** Assistant text of the current turn, joined across `text` parts and steps. */\n private turnText = \"\";\n /** Usage summed across the turn's `step_finish` events. */\n private turnTokens: TokenUsage | null = null;\n private turnCost: number | undefined;\n\n /**\n * Map `opencode run --format json` (pinned against opencode-ai 1.18.31,\n * fixture `tests/fixtures/opencode-1.18-events.jsonl`). Every event is\n * `{type, timestamp, sessionID, part}` with the payload under `part`;\n * observed types are `step_start`, `text` and `step_finish`. Anything else\n * is ignored rather than guessed at.\n */\n protected handleJson(json: unknown): void {\n const parsed = OpenCodeEvent.safeParse(json);\n if (!parsed.success) return;\n const { type, sessionID, part } = parsed.data;\n this.captureSession(sessionID);\n switch (type) {\n case \"text\": {\n const text = extractText(parsed.data);\n if (!text) break;\n this.turnText += text;\n this.pushAssistantDelta(this.turnText);\n break;\n }\n\n case \"step_finish\": {\n const tokens = opencodeTokens(part.tokens);\n if (tokens) this.turnTokens = addTokens(this.turnTokens, tokens);\n if (part.cost !== undefined) this.turnCost = (this.turnCost ?? 0) + part.cost;\n // [INFERENCE] a step ending in tool calls is followed by another step\n // in the same turn; only the observed terminal reason ends the turn.\n if (part.reason === \"tool-calls\") break;\n this.pushResult({\n tokens: this.turnTokens,\n costUsd: this.turnCost,\n summary: this.turnText || \"Task completed\",\n });\n this.turnText = \"\";\n this.turnTokens = null;\n this.turnCost = undefined;\n break;\n }\n }\n }\n\n /**\n * OpenCode has no model-list endpoint of its own (it reads models.dev), so\n * the session's registry is the list: every enabled entry's mapped ids,\n * namespaced exactly as `-m` takes them.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n listModels: async (registry, options) =>\n new OpenCodeDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { GeminiFamilyDriver } from '../../chunk-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import { resolveRegistryBinding } from '../../chunk-
|
|
4
|
-
import { fetchProviderModels } from '../../chunk-
|
|
1
|
+
import { GeminiFamilyDriver } from '../../chunk-HXG6IZSF.js';
|
|
2
|
+
import '../../chunk-R2U346ER.js';
|
|
3
|
+
import { resolveRegistryBinding } from '../../chunk-EETXMMZS.js';
|
|
4
|
+
import { fetchProviderModels } from '../../chunk-4WKZEMBD.js';
|
|
5
5
|
import '../../chunk-XBSQ4KMC.js';
|
|
6
6
|
import '../../chunk-YROR332M.js';
|
|
7
|
-
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from '../../chunk-
|
|
7
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from '../../chunk-6KPQDP7P.js';
|
|
8
8
|
import '../../chunk-6E6PKKAD.js';
|
|
9
9
|
import '../../chunk-JMKB7IB4.js';
|
|
10
10
|
import '../../chunk-ICSCSM5D.js';
|
|
11
11
|
import '../../chunk-MJHSLODD.js';
|
|
12
12
|
import '../../chunk-C3CAXQMA.js';
|
|
13
13
|
import '../../chunk-BOFL7GIF.js';
|
|
14
|
-
import '../../chunk-
|
|
14
|
+
import '../../chunk-5CYEWBPB.js';
|
|
15
15
|
import '../../chunk-NSBPE2FW.js';
|
|
16
16
|
import * as z from 'zod';
|
|
17
17
|
|