@skaile/workspaces 6.2.0 → 6.4.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 +31 -0
- package/dist/ai-sdk.d.ts +2 -0
- package/dist/ai-sdk.js +123 -0
- package/dist/ai-sdk.js.map +1 -0
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-KPKCE64E.js → asset-feeds-UJSYGKCX.js} +20 -20
- package/dist/{asset-feeds-KPKCE64E.js.map → asset-feeds-UJSYGKCX.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +7 -7
- package/dist/asset-manager/index.js +12 -12
- package/dist/asset-manager/installer.js +8 -8
- package/dist/asset-manager/renderers.js +7 -7
- package/dist/asset-manager/src/index.d.ts +42 -15
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/install-instances.d.ts +2 -0
- package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/bridge/harnesses/claude-sdk.js +13 -12
- package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
- package/dist/bridge/harnesses/codex.js +12 -11
- package/dist/bridge/harnesses/codex.js.map +1 -1
- package/dist/bridge/harnesses/continue.js +11 -10
- package/dist/bridge/harnesses/continue.js.map +1 -1
- package/dist/bridge/harnesses/echo.js +6 -5
- package/dist/bridge/harnesses/echo.js.map +1 -1
- package/dist/bridge/harnesses/gemini.js +8 -7
- package/dist/bridge/harnesses/goose.js +11 -10
- package/dist/bridge/harnesses/goose.js.map +1 -1
- package/dist/bridge/harnesses/omp.js +8 -7
- package/dist/bridge/harnesses/omp.js.map +1 -1
- package/dist/bridge/harnesses/opencode.js +11 -10
- package/dist/bridge/harnesses/opencode.js.map +1 -1
- package/dist/bridge/harnesses/qwen.js +8 -7
- package/dist/bridge/harnesses/qwen.js.map +1 -1
- package/dist/bridge/index.js +18 -16
- package/dist/bridge/src/ai-sdk.d.ts +51 -0
- package/dist/bridge/src/ai-sdk.d.ts.map +1 -0
- package/dist/bridge/src/harness-model-check.d.ts +11 -7
- package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
- package/dist/bridge/src/index.d.ts +1 -0
- package/dist/bridge/src/index.d.ts.map +1 -1
- package/dist/bridge/src/provider-registry-load.d.ts +30 -0
- package/dist/bridge/src/provider-registry-load.d.ts.map +1 -0
- package/dist/{chunk-7DRFKAJZ.js → chunk-24D7IW5O.js} +8 -7
- package/dist/chunk-24D7IW5O.js.map +1 -0
- package/dist/{chunk-ITFCWMOY.js → chunk-2WOA3TKK.js} +12 -12
- package/dist/chunk-2WOA3TKK.js.map +1 -0
- package/dist/{chunk-QPWR3YMY.js → chunk-3ENE6ZOF.js} +4 -4
- package/dist/{chunk-QPWR3YMY.js.map → chunk-3ENE6ZOF.js.map} +1 -1
- package/dist/{chunk-ICSGNT5P.js → chunk-45KLCFQB.js} +8 -27
- package/dist/chunk-45KLCFQB.js.map +1 -0
- package/dist/{chunk-Q5RN4PWV.js → chunk-5NHBLKKU.js} +3 -3
- package/dist/{chunk-Q5RN4PWV.js.map → chunk-5NHBLKKU.js.map} +1 -1
- package/dist/{chunk-RQMIZONH.js → chunk-5T3DTK7A.js} +43 -24
- package/dist/chunk-5T3DTK7A.js.map +1 -0
- package/dist/{chunk-X37JUNEW.js → chunk-6UP2EDFN.js} +4 -313
- package/dist/chunk-6UP2EDFN.js.map +1 -0
- package/dist/{chunk-KJSC2ZD6.js → chunk-6WQGJF65.js} +18 -6
- package/dist/chunk-6WQGJF65.js.map +1 -0
- package/dist/{chunk-BOT64P3U.js → chunk-6X3GDPCB.js} +4 -3
- package/dist/chunk-6X3GDPCB.js.map +1 -0
- package/dist/{chunk-T2VBPVWZ.js → chunk-76WSWPOB.js} +15 -7
- package/dist/{chunk-T2VBPVWZ.js.map → chunk-76WSWPOB.js.map} +1 -1
- package/dist/{chunk-BRK5QZKI.js → chunk-ABVWUM2E.js} +27 -17
- package/dist/chunk-ABVWUM2E.js.map +1 -0
- package/dist/{chunk-MM4YO3EL.js → chunk-ACBL7X62.js} +3 -3
- package/dist/{chunk-MM4YO3EL.js.map → chunk-ACBL7X62.js.map} +1 -1
- package/dist/{chunk-VUJXZDCY.js → chunk-BOS7P2Y4.js} +3 -3
- package/dist/{chunk-VUJXZDCY.js.map → chunk-BOS7P2Y4.js.map} +1 -1
- package/dist/{chunk-PNUM7GUY.js → chunk-BUU2DLPC.js} +3 -3
- package/dist/{chunk-PNUM7GUY.js.map → chunk-BUU2DLPC.js.map} +1 -1
- package/dist/{chunk-BEYNH2LS.js → chunk-BX7PSWJA.js} +4 -4
- package/dist/{chunk-BEYNH2LS.js.map → chunk-BX7PSWJA.js.map} +1 -1
- package/dist/{chunk-URCJIV7T.js → chunk-C7TQARGC.js} +3 -3
- package/dist/{chunk-URCJIV7T.js.map → chunk-C7TQARGC.js.map} +1 -1
- package/dist/{chunk-E5NQRHEB.js → chunk-CK3CJSRY.js} +3 -3
- package/dist/{chunk-E5NQRHEB.js.map → chunk-CK3CJSRY.js.map} +1 -1
- package/dist/{chunk-GF5JXQIZ.js → chunk-DCJ4BION.js} +2 -2
- package/dist/{chunk-GF5JXQIZ.js.map → chunk-DCJ4BION.js.map} +1 -1
- package/dist/{chunk-5LQ62LNT.js → chunk-DF5WJC3Q.js} +4 -4
- package/dist/{chunk-5LQ62LNT.js.map → chunk-DF5WJC3Q.js.map} +1 -1
- package/dist/{chunk-QK7AG5AV.js → chunk-E237FGGX.js} +4 -4
- package/dist/{chunk-QK7AG5AV.js.map → chunk-E237FGGX.js.map} +1 -1
- package/dist/{chunk-K3R2UKG7.js → chunk-EXRQKOY6.js} +12 -12
- package/dist/{chunk-K3R2UKG7.js.map → chunk-EXRQKOY6.js.map} +1 -1
- package/dist/chunk-G63KOHFS.js +32 -0
- package/dist/chunk-G63KOHFS.js.map +1 -0
- package/dist/{chunk-6CYKTHNT.js → chunk-GBXQFJ4G.js} +8 -8
- package/dist/{chunk-6CYKTHNT.js.map → chunk-GBXQFJ4G.js.map} +1 -1
- package/dist/{chunk-6GWSDPBP.js → chunk-GTMANMBZ.js} +3 -3
- package/dist/{chunk-6GWSDPBP.js.map → chunk-GTMANMBZ.js.map} +1 -1
- package/dist/{chunk-JJJ2G4K2.js → chunk-HSF665NV.js} +5 -5
- package/dist/{chunk-JJJ2G4K2.js.map → chunk-HSF665NV.js.map} +1 -1
- package/dist/{chunk-I7LC5TDY.js → chunk-HTGTNN2B.js} +3 -3
- package/dist/{chunk-I7LC5TDY.js.map → chunk-HTGTNN2B.js.map} +1 -1
- package/dist/{chunk-PMWRM4EJ.js → chunk-HXZ3FQQN.js} +14 -14
- package/dist/{chunk-PMWRM4EJ.js.map → chunk-HXZ3FQQN.js.map} +1 -1
- package/dist/{chunk-2XM3ZH36.js → chunk-IYZAJ2J2.js} +16 -13
- package/dist/chunk-IYZAJ2J2.js.map +1 -0
- package/dist/{chunk-3HACK2Z7.js → chunk-IZV3HDVG.js} +5 -5
- package/dist/{chunk-3HACK2Z7.js.map → chunk-IZV3HDVG.js.map} +1 -1
- package/dist/{chunk-U673DB5U.js → chunk-JSWMRYLM.js} +4 -3
- package/dist/chunk-JSWMRYLM.js.map +1 -0
- package/dist/{chunk-TSTRH4SM.js → chunk-L45IHRDH.js} +3 -3
- package/dist/{chunk-TSTRH4SM.js.map → chunk-L45IHRDH.js.map} +1 -1
- package/dist/{chunk-27SXN33H.js → chunk-L4OYPFLB.js} +3 -3
- package/dist/{chunk-27SXN33H.js.map → chunk-L4OYPFLB.js.map} +1 -1
- package/dist/{chunk-QIHL3YPL.js → chunk-O7KAQQAI.js} +4 -4
- package/dist/{chunk-QIHL3YPL.js.map → chunk-O7KAQQAI.js.map} +1 -1
- package/dist/{chunk-Z3IRZBXB.js → chunk-P7EL7QRD.js} +14 -14
- package/dist/{chunk-Z3IRZBXB.js.map → chunk-P7EL7QRD.js.map} +1 -1
- package/dist/{chunk-QXKUFROW.js → chunk-PTBX55QF.js} +4 -4
- package/dist/{chunk-QXKUFROW.js.map → chunk-PTBX55QF.js.map} +1 -1
- package/dist/{chunk-5JPW27BI.js → chunk-Q4XWCVFA.js} +7 -7
- package/dist/{chunk-5JPW27BI.js.map → chunk-Q4XWCVFA.js.map} +1 -1
- package/dist/chunk-QJQQNBVT.js +315 -0
- package/dist/chunk-QJQQNBVT.js.map +1 -0
- package/dist/{chunk-M4OG2YN4.js → chunk-QSIFEHSN.js} +3 -3
- package/dist/{chunk-M4OG2YN4.js.map → chunk-QSIFEHSN.js.map} +1 -1
- package/dist/{chunk-7Y6S4XLL.js → chunk-RKI35EAN.js} +3 -3
- package/dist/{chunk-7Y6S4XLL.js.map → chunk-RKI35EAN.js.map} +1 -1
- package/dist/{chunk-OCQNUV4T.js → chunk-SISUT7VR.js} +7 -7
- package/dist/{chunk-OCQNUV4T.js.map → chunk-SISUT7VR.js.map} +1 -1
- package/dist/{chunk-7H6XRCPG.js → chunk-TDKZL5ZC.js} +3 -3
- package/dist/{chunk-7H6XRCPG.js.map → chunk-TDKZL5ZC.js.map} +1 -1
- package/dist/{chunk-LRBP3234.js → chunk-TF5CWJQZ.js} +5 -5
- package/dist/{chunk-LRBP3234.js.map → chunk-TF5CWJQZ.js.map} +1 -1
- package/dist/{chunk-PKBLJI23.js → chunk-TGB4E5Z6.js} +188 -52
- package/dist/chunk-TGB4E5Z6.js.map +1 -0
- package/dist/{chunk-KB56WBQ3.js → chunk-TPQKFX6X.js} +4 -4
- package/dist/{chunk-KB56WBQ3.js.map → chunk-TPQKFX6X.js.map} +1 -1
- package/dist/{chunk-TZERN27L.js → chunk-U3SXCVR7.js} +3 -3
- package/dist/{chunk-TZERN27L.js.map → chunk-U3SXCVR7.js.map} +1 -1
- package/dist/{chunk-KPKGWXUJ.js → chunk-U6S5CXKB.js} +3 -3
- package/dist/{chunk-KPKGWXUJ.js.map → chunk-U6S5CXKB.js.map} +1 -1
- package/dist/{chunk-JFLQICIU.js → chunk-UAOHR6AL.js} +4 -4
- package/dist/{chunk-JFLQICIU.js.map → chunk-UAOHR6AL.js.map} +1 -1
- package/dist/{chunk-KXJMQTOU.js → chunk-UBLZALKP.js} +3 -3
- package/dist/{chunk-KXJMQTOU.js.map → chunk-UBLZALKP.js.map} +1 -1
- package/dist/{chunk-BIRW3HOG.js → chunk-UUKCPPTQ.js} +3 -3
- package/dist/{chunk-BIRW3HOG.js.map → chunk-UUKCPPTQ.js.map} +1 -1
- package/dist/{chunk-BY5WIRCU.js → chunk-UVTN4O7N.js} +42 -17
- package/dist/chunk-UVTN4O7N.js.map +1 -0
- package/dist/{chunk-COAFAYBS.js → chunk-V4OXHEWY.js} +3 -3
- package/dist/{chunk-COAFAYBS.js.map → chunk-V4OXHEWY.js.map} +1 -1
- package/dist/{chunk-SJNZ4WPA.js → chunk-VSCLUPGZ.js} +31 -28
- package/dist/chunk-VSCLUPGZ.js.map +1 -0
- package/dist/{chunk-JMIKGAUA.js → chunk-VV2DJT4I.js} +15 -5
- package/dist/chunk-VV2DJT4I.js.map +1 -0
- package/dist/{chunk-JCPD4QRM.js → chunk-VZU67OKK.js} +2 -2
- package/dist/{chunk-JCPD4QRM.js.map → chunk-VZU67OKK.js.map} +1 -1
- package/dist/{chunk-MAZ3UXJK.js → chunk-WENTJ5KP.js} +4 -4
- package/dist/{chunk-MAZ3UXJK.js.map → chunk-WENTJ5KP.js.map} +1 -1
- package/dist/{chunk-ZWJCRHP3.js → chunk-YFGXYQW4.js} +3 -3
- package/dist/{chunk-ZWJCRHP3.js.map → chunk-YFGXYQW4.js.map} +1 -1
- package/dist/{chunk-S2H3RBK7.js → chunk-YJNE4V2M.js} +16 -9
- package/dist/chunk-YJNE4V2M.js.map +1 -0
- package/dist/{chunk-PJJSBZZP.js → chunk-ZWCGJYR7.js} +3 -3
- package/dist/{chunk-PJJSBZZP.js.map → chunk-ZWCGJYR7.js.map} +1 -1
- package/dist/{claude-code-BBMNVH2J.js → claude-code-UBT4ZME7.js} +4 -4
- package/dist/{claude-code-BBMNVH2J.js.map → claude-code-UBT4ZME7.js.map} +1 -1
- package/dist/cli/index.js +107 -91
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/preset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/providers.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts +10 -2
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/index.d.ts +1 -1
- package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/spec.d.ts +19 -14
- package/dist/cli/src/plugin-store/spec.d.ts.map +1 -1
- package/dist/cli/src/setup.d.ts.map +1 -1
- package/dist/connectors/config.js +4 -4
- package/dist/connectors/index.js +22 -20
- package/dist/{connectors-47EM6C2P.js → connectors-4WH32NK2.js} +25 -23
- package/dist/{connectors-47EM6C2P.js.map → connectors-4WH32NK2.js.map} +1 -1
- package/dist/connectors-shared/index.js +2 -2
- package/dist/core/index.js +6 -6
- package/dist/core/manifest.js +1 -1
- package/dist/core/publish-manifest.js +2 -2
- package/dist/core/runtime-assets.js +4 -4
- package/dist/core/src/index.d.ts +1 -1
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +9 -3
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +15 -0
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
- package/dist/core/workspace-config.js +3 -3
- package/dist/deploy/index.js +6 -6
- package/dist/discovery/index.js +3 -3
- package/dist/{ensure-sources-K5EFNC3L.js → ensure-sources-UC2RBYMP.js} +27 -25
- package/dist/ensure-sources-UC2RBYMP.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +22 -20
- package/dist/factory-assets/connectors/deploy.js +22 -20
- package/dist/factory-assets/connectors/devserver.js +22 -20
- package/dist/factory-assets/connectors/flow/adapter.js +22 -20
- package/dist/factory-assets/connectors/flow/engine.js +7 -7
- package/dist/factory-assets/connectors/flow/run-flow.js +24 -22
- package/dist/factory-assets/connectors/flow.js +22 -20
- package/dist/factory-assets/connectors/git.js +22 -20
- package/dist/factory-assets/connectors/gmail.js +22 -20
- package/dist/factory-assets/connectors/googledrive.js +22 -20
- package/dist/factory-assets/connectors/local.js +22 -20
- package/dist/factory-assets/connectors/mattermost.js +22 -20
- package/dist/factory-assets/connectors/memory.js +22 -20
- package/dist/factory-assets/connectors/minio.js +22 -20
- package/dist/factory-assets/connectors/postgres.js +22 -20
- package/dist/factory-assets/connectors/s3.js +22 -20
- package/dist/factory-assets/connectors/sharepoint.js +22 -20
- package/dist/factory-assets/connectors/sqlite.js +22 -20
- package/dist/factory-assets/connectors/static-server.js +22 -20
- package/dist/factory-assets/connectors/tunnel.js +22 -20
- package/dist/factory-assets/connectors/webdav.js +22 -20
- package/dist/factory-assets/connectors/xstate-store.js +22 -20
- package/dist/factory-assets/connectors/xstate.js +22 -20
- package/dist/{flows-KLBNSKLO.js → flows-LYTKNGKE.js} +11 -11
- package/dist/{flows-KLBNSKLO.js.map → flows-LYTKNGKE.js.map} +1 -1
- package/dist/{helpers-LUSV2ICC.js → helpers-SSSKT5XK.js} +27 -25
- package/dist/{helpers-LUSV2ICC.js.map → helpers-SSSKT5XK.js.map} +1 -1
- package/dist/library/index.js +9 -9
- package/dist/library/install.js +3 -3
- package/dist/{library-publish-XMRCKRNR.js → library-publish-GQMNTAKK.js} +52 -50
- package/dist/library-publish-GQMNTAKK.js.map +1 -0
- package/dist/model-endpoint/index.js +10 -9
- package/dist/open-library-XGUCUJYE.js +58 -0
- package/dist/{open-library-XBR46DJL.js.map → open-library-XGUCUJYE.js.map} +1 -1
- package/dist/{open-registry-W562DCDL.js → open-registry-DIFEPDF6.js} +13 -13
- package/dist/{open-registry-W562DCDL.js.map → open-registry-DIFEPDF6.js.map} +1 -1
- package/dist/{paths-2AZXB3QL.js → paths-G4GFJLE2.js} +9 -9
- package/dist/{paths-2AZXB3QL.js.map → paths-G4GFJLE2.js.map} +1 -1
- package/dist/{plugin-store-36SIL4TV.js → plugin-store-BBLDFD3L.js} +9 -9
- package/dist/{plugin-store-36SIL4TV.js.map → plugin-store-BBLDFD3L.js.map} +1 -1
- package/dist/{project-D7GN7WLS.js → project-LB745WVZ.js} +48 -46
- package/dist/{project-D7GN7WLS.js.map → project-LB745WVZ.js.map} +1 -1
- package/dist/resolver/index.js +7 -7
- package/dist/runner/index.js +38 -36
- package/dist/runner/src/capability-roundtrip.d.ts +4 -1
- package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +12 -12
- package/dist/sdk/bridge.js +18 -16
- package/dist/sdk/core.js +6 -6
- package/dist/sdk/flow.js +7 -7
- package/dist/sdk/index.js +38 -36
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +7 -7
- package/dist/sdk/runner.js +38 -36
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/transport/ws/server.js +7 -7
- package/dist/sdk/transport/ws.js +7 -7
- package/dist/sdk/transport.js +7 -7
- package/dist/sdk/types.js +1 -1
- package/dist/{serve-preflight-CGA5G3AE.js → serve-preflight-NPWI4MV6.js} +28 -26
- package/dist/serve-preflight-NPWI4MV6.js.map +1 -0
- package/dist/session/index.js +2 -2
- package/dist/{setup-IBDNJAOU.js → setup-X6ZYH2MW.js} +33 -28
- package/dist/setup-X6ZYH2MW.js.map +1 -0
- package/dist/{skills-CTTO7SZK.js → skills-62PXDBPJ.js} +12 -12
- package/dist/{skills-CTTO7SZK.js.map → skills-62PXDBPJ.js.map} +1 -1
- package/dist/{source-2DJ5KNOI.js → source-LAYCTRHP.js} +48 -46
- package/dist/{source-2DJ5KNOI.js.map → source-LAYCTRHP.js.map} +1 -1
- package/dist/{source-manifest-publish-IYWUMUCY.js → source-manifest-publish-3S6PJ25W.js} +50 -48
- package/dist/source-manifest-publish-3S6PJ25W.js.map +1 -0
- package/dist/transport/index.js +7 -7
- package/dist/transport/ws/server.js +7 -7
- package/dist/transport/ws.js +7 -7
- package/dist/tui/index.js +38 -36
- package/dist/tui/index.js.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/src/capabilities.d.ts +9 -1
- package/dist/types/src/capabilities.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +29 -27
- package/dist/workspace-plugin/adapters/omp.js +14 -14
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +27 -1
- package/dist/chunk-2XM3ZH36.js.map +0 -1
- package/dist/chunk-7DRFKAJZ.js.map +0 -1
- package/dist/chunk-BOT64P3U.js.map +0 -1
- package/dist/chunk-BRK5QZKI.js.map +0 -1
- package/dist/chunk-BY5WIRCU.js.map +0 -1
- package/dist/chunk-ICSGNT5P.js.map +0 -1
- package/dist/chunk-ITFCWMOY.js.map +0 -1
- package/dist/chunk-JMIKGAUA.js.map +0 -1
- package/dist/chunk-KJSC2ZD6.js.map +0 -1
- package/dist/chunk-PKBLJI23.js.map +0 -1
- package/dist/chunk-RQMIZONH.js.map +0 -1
- package/dist/chunk-S2H3RBK7.js.map +0 -1
- package/dist/chunk-SJNZ4WPA.js.map +0 -1
- package/dist/chunk-U673DB5U.js.map +0 -1
- package/dist/chunk-X37JUNEW.js.map +0 -1
- package/dist/ensure-sources-K5EFNC3L.js.map +0 -1
- package/dist/library-publish-XMRCKRNR.js.map +0 -1
- package/dist/open-library-XBR46DJL.js +0 -56
- package/dist/serve-preflight-CGA5G3AE.js.map +0 -1
- package/dist/setup-IBDNJAOU.js.map +0 -1
- package/dist/source-manifest-publish-IYWUMUCY.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/provider-materialize/goose-custom-providers.ts","../../../bridge/src/harnesses/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/harnesses#one-shot-cli-harnesses-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 EnvHarnessSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n} from \"./env-harnesses.js\";\nimport {\n harnessSessionConfigHome,\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: EnvHarnessSession): 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 harness. */\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: EnvHarnessSession,\n config: { cwd: string; sessionId?: string },\n): GooseMaterialization {\n const build = buildGooseCustomProviders(session);\n const root = harnessSessionConfigHome(\"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 { HarnessTarget } 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 EnvHarnessSession,\n registryModelEntries,\n resolveEnvHarnessSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-harnesses.js\";\nimport { materializeGooseCustomProviders } from \"../provider-materialize/goose-custom-providers.js\";\nimport { registryHarnessConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, HarnessInfo, ReconfigureApplied } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n SubprocessCliHarness,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent harness 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/harnesses#goose-harness\n */\nexport class GooseHarness extends SubprocessCliHarness {\n readonly harnessInfo: HarnessInfo = {\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?: EnvHarnessSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvHarnessSession {\n this.providers ??= resolveEnvHarnessSession(this.config);\n return this.providers;\n }\n\n protected override onReconfigured(applied: ReconfigureApplied): void {\n if (applied.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 * `HarnessTarget` wrapper for the goose harness. Registered into the plugin\n * registry by `registerBuiltinHarnesses()`.\n */\nexport const gooseHarnessTarget: HarnessTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_HARNESS_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseHarness(config),\n listModels: async (registry, options) =>\n new GooseHarness({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryHarnessConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/provider-materialize/goose-custom-providers.ts","../../../bridge/src/harnesses/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/harnesses#one-shot-cli-harnesses-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 EnvHarnessSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n} from \"./env-harnesses.js\";\nimport {\n harnessSessionConfigHome,\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: EnvHarnessSession): 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 harness. */\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: EnvHarnessSession,\n config: { cwd: string; sessionId?: string },\n): GooseMaterialization {\n const build = buildGooseCustomProviders(session);\n const root = harnessSessionConfigHome(\"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 { HarnessTarget } 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 EnvHarnessSession,\n registryModelEntries,\n resolveEnvHarnessSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-harnesses.js\";\nimport { materializeGooseCustomProviders } from \"../provider-materialize/goose-custom-providers.js\";\nimport { registryHarnessConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, HarnessInfo, ReconfigureApplied } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n SubprocessCliHarness,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent harness 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/harnesses#goose-harness\n */\nexport class GooseHarness extends SubprocessCliHarness {\n readonly harnessInfo: HarnessInfo = {\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?: EnvHarnessSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvHarnessSession {\n this.providers ??= resolveEnvHarnessSession(this.config);\n return this.providers;\n }\n\n protected override onReconfigured(applied: ReconfigureApplied): void {\n if (applied.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 * `HarnessTarget` wrapper for the goose harness. Registered into the plugin\n * registry by `registerBuiltinHarnesses()`.\n */\nexport const gooseHarnessTarget: HarnessTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_HARNESS_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseHarness(config),\n listModels: async (registry, options) =>\n new GooseHarness({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryHarnessConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { checkToolInputSchema } from '../../chunk-3X7VTCPG.js';
|
|
2
|
-
import { materializeOmpProviders, isCredentialOmissionWarning, materializeOmpIdentityDir, registryModelEntries } from '../../chunk-
|
|
3
|
-
import { dispatchCapability } from '../../chunk-
|
|
4
|
-
import '../../chunk-
|
|
2
|
+
import { materializeOmpProviders, isCredentialOmissionWarning, materializeOmpIdentityDir, registryModelEntries } from '../../chunk-UAOHR6AL.js';
|
|
3
|
+
import { dispatchCapability } from '../../chunk-UUKCPPTQ.js';
|
|
4
|
+
import '../../chunk-6X3GDPCB.js';
|
|
5
5
|
import { RUNNER_AGENT_ENV_KEYS, ReconfigureLedger, stripRunnerPrivateEnv, classifyGenericErrorMessage } from '../../chunk-6OHZUUR7.js';
|
|
6
6
|
import { wrapAgentCommand, resolveAgentExec } from '../../chunk-7DN6JKP2.js';
|
|
7
|
-
import { AgentHarness, getBridgeLogger, TOOL_ALLOWLIST_UNSUPPORTED, registryHarnessConfig } from '../../chunk-
|
|
8
|
-
import { BUILTIN_HARNESS_CATALOG } from '../../chunk-
|
|
7
|
+
import { AgentHarness, getBridgeLogger, TOOL_ALLOWLIST_UNSUPPORTED, registryHarnessConfig } from '../../chunk-QSIFEHSN.js';
|
|
8
|
+
import { BUILTIN_HARNESS_CATALOG } from '../../chunk-QJQQNBVT.js';
|
|
9
9
|
import '../../chunk-G5SUWZEU.js';
|
|
10
|
-
import
|
|
10
|
+
import '../../chunk-6UP2EDFN.js';
|
|
11
|
+
import { withActivityLabelJsonSchema } from '../../chunk-VZU67OKK.js';
|
|
11
12
|
import '../../chunk-VSX2G7LA.js';
|
|
12
|
-
import '../../chunk-DKXNKFKP.js';
|
|
13
13
|
import '../../chunk-RXGPFAMN.js';
|
|
14
|
+
import '../../chunk-DKXNKFKP.js';
|
|
14
15
|
import '../../chunk-C3CAXQMA.js';
|
|
15
16
|
import '../../chunk-BOFL7GIF.js';
|
|
16
17
|
import '../../chunk-NSBPE2FW.js';
|