@skaile/workspaces 6.9.0 → 6.10.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 +32 -0
- package/dist/ai-sdk.js +8 -8
- package/dist/{asset-feeds-JWRIWLVX.js → asset-feeds-UG3PG423.js} +22 -22
- package/dist/{asset-feeds-JWRIWLVX.js.map → asset-feeds-UG3PG423.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +8 -8
- package/dist/asset-manager/history.js +8 -8
- package/dist/asset-manager/index.js +14 -14
- package/dist/asset-manager/installer.js +9 -9
- package/dist/asset-manager/renderers.js +8 -8
- package/dist/asset-manager/src/harness-switch-state.d.ts +30 -0
- package/dist/asset-manager/src/harness-switch-state.d.ts.map +1 -0
- package/dist/asset-manager/src/index.d.ts +49 -12
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/mcp-config.d.ts +6 -0
- package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
- package/dist/bridge/codex-app-server.js +1 -2
- package/dist/bridge/harnesses/claude-sdk.js +11 -11
- package/dist/bridge/harnesses/codex.js +15 -1926
- package/dist/bridge/harnesses/codex.js.map +1 -1
- package/dist/bridge/harnesses/continue.js +11 -11
- package/dist/bridge/harnesses/echo.js +3 -3
- package/dist/bridge/harnesses/gemini.js +6 -6
- package/dist/bridge/harnesses/goose.js +11 -11
- package/dist/bridge/harnesses/omp.js +61 -9
- package/dist/bridge/harnesses/omp.js.map +1 -1
- package/dist/bridge/harnesses/opencode.js +11 -11
- package/dist/bridge/harnesses/qwen.js +6 -6
- package/dist/bridge/index.js +17 -16
- package/dist/bridge/src/harness-model-check.d.ts +5 -4
- package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/codex.d.ts +13 -0
- package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/omp.d.ts +22 -0
- package/dist/bridge/src/harnesses/omp.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/{chunk-XPKUFOS3.js → chunk-2D6HZAO5.js} +8 -8
- package/dist/{chunk-XPKUFOS3.js.map → chunk-2D6HZAO5.js.map} +1 -1
- package/dist/chunk-2MUUPRIG.js +688 -0
- package/dist/chunk-2MUUPRIG.js.map +1 -0
- package/dist/{chunk-TMQFOJ6F.js → chunk-2PVYDAFN.js} +3 -3
- package/dist/{chunk-TMQFOJ6F.js.map → chunk-2PVYDAFN.js.map} +1 -1
- package/dist/{chunk-YGT3CGPD.js → chunk-2U67XYZM.js} +3 -3
- package/dist/{chunk-YGT3CGPD.js.map → chunk-2U67XYZM.js.map} +1 -1
- package/dist/{chunk-5NTB64PW.js → chunk-375HN3FD.js} +18 -14
- package/dist/chunk-375HN3FD.js.map +1 -0
- package/dist/{chunk-23Q5LT4U.js → chunk-4I4SBOCS.js} +345 -88
- package/dist/chunk-4I4SBOCS.js.map +1 -0
- package/dist/{chunk-WPLZGT5Z.js → chunk-4Z4RULWQ.js} +59 -31
- package/dist/chunk-4Z4RULWQ.js.map +1 -0
- package/dist/{chunk-72BDCGBB.js → chunk-5JBMYZNA.js} +3 -3
- package/dist/{chunk-72BDCGBB.js.map → chunk-5JBMYZNA.js.map} +1 -1
- package/dist/{chunk-3EPRTMXY.js → chunk-5KQFR4D7.js} +6 -6
- package/dist/{chunk-3EPRTMXY.js.map → chunk-5KQFR4D7.js.map} +1 -1
- package/dist/{chunk-KNY356I3.js → chunk-5KSGZP3E.js} +11 -4
- package/dist/chunk-5KSGZP3E.js.map +1 -0
- package/dist/{chunk-DZRN3SNG.js → chunk-5P7LTPBR.js} +5 -5
- package/dist/{chunk-DZRN3SNG.js.map → chunk-5P7LTPBR.js.map} +1 -1
- package/dist/{chunk-PTJZCOBH.js → chunk-6O7VDKX3.js} +2 -2
- package/dist/{chunk-PTJZCOBH.js.map → chunk-6O7VDKX3.js.map} +1 -1
- package/dist/{chunk-B2DGCYVC.js → chunk-7DUOKE73.js} +27 -33
- package/dist/chunk-7DUOKE73.js.map +1 -0
- package/dist/{chunk-V5KG6CCV.js → chunk-7HRZACI4.js} +7 -2
- package/dist/chunk-7HRZACI4.js.map +1 -0
- package/dist/{chunk-U3FI4DVT.js → chunk-7K73MCI6.js} +7 -5
- package/dist/chunk-7K73MCI6.js.map +1 -0
- package/dist/{chunk-SE6OL7Y5.js → chunk-BCID52M5.js} +6 -6
- package/dist/{chunk-SE6OL7Y5.js.map → chunk-BCID52M5.js.map} +1 -1
- package/dist/{chunk-FZO64PLQ.js → chunk-BNLXZXZN.js} +81 -8
- package/dist/chunk-BNLXZXZN.js.map +1 -0
- package/dist/{chunk-O3FYOS64.js → chunk-C5UKYTTD.js} +13 -23
- package/dist/chunk-C5UKYTTD.js.map +1 -0
- package/dist/{chunk-LYVLDGML.js → chunk-CG63XGVV.js} +3 -3
- package/dist/{chunk-LYVLDGML.js.map → chunk-CG63XGVV.js.map} +1 -1
- package/dist/{chunk-4ROXSQEG.js → chunk-CJO3XKO7.js} +4 -4
- package/dist/{chunk-4ROXSQEG.js.map → chunk-CJO3XKO7.js.map} +1 -1
- package/dist/{chunk-OSABUEWA.js → chunk-CVUMZTNO.js} +4 -4
- package/dist/{chunk-OSABUEWA.js.map → chunk-CVUMZTNO.js.map} +1 -1
- package/dist/{chunk-E675QKFG.js → chunk-DOMRBOJZ.js} +5 -5
- package/dist/{chunk-E675QKFG.js.map → chunk-DOMRBOJZ.js.map} +1 -1
- package/dist/{chunk-GTAHU4N4.js → chunk-EB2LKPI6.js} +4 -4
- package/dist/{chunk-GTAHU4N4.js.map → chunk-EB2LKPI6.js.map} +1 -1
- package/dist/{chunk-GZL6RN4Z.js → chunk-FXBKBOI5.js} +169 -49
- package/dist/chunk-FXBKBOI5.js.map +1 -0
- package/dist/{chunk-AERQFD6T.js → chunk-GA4GUDTL.js} +4 -4
- package/dist/{chunk-AERQFD6T.js.map → chunk-GA4GUDTL.js.map} +1 -1
- package/dist/{chunk-NJVHGS7X.js → chunk-HE3TZYNG.js} +4 -4
- package/dist/{chunk-NJVHGS7X.js.map → chunk-HE3TZYNG.js.map} +1 -1
- package/dist/chunk-HLFLET7S.js +2443 -0
- package/dist/chunk-HLFLET7S.js.map +1 -0
- package/dist/{chunk-Y2BQWZXT.js → chunk-HQUF6O4B.js} +27 -56
- package/dist/chunk-HQUF6O4B.js.map +1 -0
- package/dist/{chunk-T5EIWWEJ.js → chunk-IMO4EHND.js} +5 -5
- package/dist/{chunk-T5EIWWEJ.js.map → chunk-IMO4EHND.js.map} +1 -1
- package/dist/{chunk-TUOHA6BM.js → chunk-IOXFT5D7.js} +3 -3
- package/dist/{chunk-TUOHA6BM.js.map → chunk-IOXFT5D7.js.map} +1 -1
- package/dist/{chunk-5AQLCRR7.js → chunk-JDZUQFN7.js} +4 -4
- package/dist/{chunk-5AQLCRR7.js.map → chunk-JDZUQFN7.js.map} +1 -1
- package/dist/{chunk-SQMDFM4N.js → chunk-KE5HDORU.js} +2 -2
- package/dist/{chunk-SQMDFM4N.js.map → chunk-KE5HDORU.js.map} +1 -1
- package/dist/{chunk-PTJTOPE5.js → chunk-KOI7QFDH.js} +3 -3
- package/dist/{chunk-PTJTOPE5.js.map → chunk-KOI7QFDH.js.map} +1 -1
- package/dist/{chunk-NDBHEOIA.js → chunk-KRL53RZB.js} +8 -8
- package/dist/{chunk-NDBHEOIA.js.map → chunk-KRL53RZB.js.map} +1 -1
- package/dist/{chunk-7QYBKUAS.js → chunk-LKBRBVVS.js} +3 -3
- package/dist/{chunk-7QYBKUAS.js.map → chunk-LKBRBVVS.js.map} +1 -1
- package/dist/{chunk-USSP43U3.js → chunk-LQWOU7S2.js} +3 -3
- package/dist/{chunk-USSP43U3.js.map → chunk-LQWOU7S2.js.map} +1 -1
- package/dist/{chunk-4KPQ6ILH.js → chunk-MEU2HHGV.js} +18 -9
- package/dist/chunk-MEU2HHGV.js.map +1 -0
- package/dist/{chunk-QC5BYUED.js → chunk-MS2IXLTC.js} +4 -4
- package/dist/{chunk-QC5BYUED.js.map → chunk-MS2IXLTC.js.map} +1 -1
- package/dist/{chunk-X2B5GMJO.js → chunk-NCJSYU6A.js} +16 -14
- package/dist/chunk-NCJSYU6A.js.map +1 -0
- package/dist/{chunk-CFTTXUM2.js → chunk-NFFBYG2W.js} +3 -3
- package/dist/{chunk-CFTTXUM2.js.map → chunk-NFFBYG2W.js.map} +1 -1
- package/dist/{chunk-AVRTZAH2.js → chunk-NTFP2XF4.js} +10 -10
- package/dist/chunk-NTFP2XF4.js.map +1 -0
- package/dist/{chunk-V2CONXKD.js → chunk-PSPFWTJI.js} +4 -4
- package/dist/{chunk-V2CONXKD.js.map → chunk-PSPFWTJI.js.map} +1 -1
- package/dist/{chunk-C7L5MFUL.js → chunk-PTXQMTCG.js} +3 -3
- package/dist/{chunk-C7L5MFUL.js.map → chunk-PTXQMTCG.js.map} +1 -1
- package/dist/{chunk-Y242OE4B.js → chunk-QBJQ426X.js} +3 -3
- package/dist/{chunk-Y242OE4B.js.map → chunk-QBJQ426X.js.map} +1 -1
- package/dist/{chunk-QBUJTVMY.js → chunk-R3ZNAPBV.js} +3 -3
- package/dist/{chunk-QBUJTVMY.js.map → chunk-R3ZNAPBV.js.map} +1 -1
- package/dist/{chunk-4WB4KSSQ.js → chunk-RTFH2QR2.js} +3 -3
- package/dist/{chunk-4WB4KSSQ.js.map → chunk-RTFH2QR2.js.map} +1 -1
- package/dist/{chunk-5KWQMCH7.js → chunk-RZ5R6GDJ.js} +5 -5
- package/dist/{chunk-5KWQMCH7.js.map → chunk-RZ5R6GDJ.js.map} +1 -1
- package/dist/{chunk-MDCI4RSG.js → chunk-RZL4TOK3.js} +20 -6
- package/dist/chunk-RZL4TOK3.js.map +1 -0
- package/dist/{chunk-LMADWO4Q.js → chunk-SBAUZ7XH.js} +4 -4
- package/dist/{chunk-LMADWO4Q.js.map → chunk-SBAUZ7XH.js.map} +1 -1
- package/dist/{chunk-MPRWVZXF.js → chunk-SKG6G4HO.js} +108 -44
- package/dist/chunk-SKG6G4HO.js.map +1 -0
- package/dist/{chunk-HQAPUPBE.js → chunk-V2VDTQ7A.js} +3 -3
- package/dist/{chunk-HQAPUPBE.js.map → chunk-V2VDTQ7A.js.map} +1 -1
- package/dist/{chunk-GNUA7XT2.js → chunk-VS6XC5JE.js} +3 -3
- package/dist/{chunk-GNUA7XT2.js.map → chunk-VS6XC5JE.js.map} +1 -1
- package/dist/{chunk-5J6JWGY4.js → chunk-WDG5IVEA.js} +3 -3
- package/dist/{chunk-5J6JWGY4.js.map → chunk-WDG5IVEA.js.map} +1 -1
- package/dist/{chunk-M4G2SVXI.js → chunk-XWCV2A2F.js} +4 -4
- package/dist/{chunk-M4G2SVXI.js.map → chunk-XWCV2A2F.js.map} +1 -1
- package/dist/{chunk-UWD7YBDR.js → chunk-ZLDAPZIX.js} +4 -4
- package/dist/{chunk-UWD7YBDR.js.map → chunk-ZLDAPZIX.js.map} +1 -1
- package/dist/{claude-code-YRJIGXTL.js → claude-code-CMFGCDMX.js} +5 -5
- package/dist/{claude-code-YRJIGXTL.js.map → claude-code-CMFGCDMX.js.map} +1 -1
- package/dist/cli/index.js +322 -196
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/config.d.ts.map +1 -1
- package/dist/cli/src/commands/connector.d.ts.map +1 -1
- package/dist/cli/src/commands/harness-preflight.d.ts +3 -1
- package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/harness.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 +3 -3
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-files.d.ts +8 -0
- package/dist/cli/src/commands/migrate-files.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-providers.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate.d.ts.map +1 -1
- package/dist/cli/src/commands/outdated.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +7 -5
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/config-checks.d.ts +50 -12
- package/dist/cli/src/config-checks.d.ts.map +1 -1
- package/dist/cli/src/ensure-sources.d.ts.map +1 -1
- package/dist/cli/src/harness-error.d.ts +7 -0
- package/dist/cli/src/harness-error.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/connectors/config.js +5 -5
- package/dist/connectors/index.js +20 -19
- package/dist/connectors/src/index.d.ts +1 -1
- package/dist/connectors/src/index.d.ts.map +1 -1
- package/dist/connectors/src/managed-gitconfig.d.ts +12 -0
- package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
- package/dist/{connectors-JKT32HZT.js → connectors-P5M2D4MH.js} +23 -22
- package/dist/{connectors-JKT32HZT.js.map → connectors-P5M2D4MH.js.map} +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/logging.js +1 -1
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/publish-manifest.js +3 -3
- package/dist/core/ref.js +1 -1
- package/dist/core/runtime-assets.js +5 -5
- package/dist/core/src/index.d.ts +2 -2
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +7 -1
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +28 -0
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/run-state-ignore.d.ts +5 -3
- package/dist/core/src/run-state-ignore.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +4 -4
- package/dist/deploy/index.js +7 -7
- package/dist/discovery/index.js +4 -4
- package/dist/{ensure-sources-GUJODKY5.js → ensure-sources-MOGLBEUF.js} +31 -29
- package/dist/ensure-sources-MOGLBEUF.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +20 -19
- package/dist/factory-assets/connectors/deploy.js +20 -19
- package/dist/factory-assets/connectors/devserver.js +20 -19
- package/dist/factory-assets/connectors/flow/adapter.js +20 -19
- package/dist/factory-assets/connectors/flow/engine.js +8 -8
- package/dist/factory-assets/connectors/flow/run-flow.js +22 -21
- package/dist/factory-assets/connectors/flow.js +20 -19
- package/dist/factory-assets/connectors/git/exec.d.ts +7 -0
- package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
- package/dist/factory-assets/connectors/git/repo.d.ts.map +1 -1
- package/dist/factory-assets/connectors/git.js +20 -19
- package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/gmail.js +20 -19
- package/dist/factory-assets/connectors/googledrive.js +20 -19
- package/dist/factory-assets/connectors/local.js +20 -19
- package/dist/factory-assets/connectors/mattermost.js +20 -19
- package/dist/factory-assets/connectors/memory.js +20 -19
- package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/minio.js +20 -19
- package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/postgres.js +20 -19
- package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
- package/dist/factory-assets/connectors/s3.js +20 -19
- package/dist/factory-assets/connectors/sharepoint.js +20 -19
- package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/sqlite.js +20 -19
- package/dist/factory-assets/connectors/static-server.js +20 -19
- package/dist/factory-assets/connectors/tunnel.js +20 -19
- package/dist/factory-assets/connectors/webdav.js +20 -19
- package/dist/factory-assets/connectors/xstate-store.js +20 -19
- package/dist/factory-assets/connectors/xstate.js +20 -19
- package/dist/{flows-UCP6ZUYS.js → flows-J64L5MGJ.js} +12 -12
- package/dist/{flows-UCP6ZUYS.js.map → flows-J64L5MGJ.js.map} +1 -1
- package/dist/{helpers-SO53MRHF.js → helpers-JL5AEGDT.js} +28 -26
- package/dist/{helpers-SO53MRHF.js.map → helpers-JL5AEGDT.js.map} +1 -1
- package/dist/library/index.js +10 -10
- package/dist/library/install.js +4 -4
- package/dist/library/src/index.d.ts +2 -2
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/library.d.ts +6 -2
- package/dist/library/src/library.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +10 -3
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts +0 -9
- package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
- package/dist/library/src/local/schema.d.ts +27 -20
- package/dist/library/src/local/schema.d.ts.map +1 -1
- package/dist/library/src/manifest-writer.d.ts +13 -0
- package/dist/library/src/manifest-writer.d.ts.map +1 -1
- package/dist/library/src/remote/index.d.ts +1 -1
- package/dist/library/src/remote/index.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +6 -0
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/library/src/sync/git-driver.d.ts.map +1 -1
- package/dist/{library-publish-Z5E3YZCZ.js → library-publish-DZNNZNMB.js} +49 -50
- package/dist/library-publish-DZNNZNMB.js.map +1 -0
- package/dist/model-endpoint/index.js +10 -10
- package/dist/open-library-OJREQ22B.js +61 -0
- package/dist/{open-library-A5OB72FD.js.map → open-library-OJREQ22B.js.map} +1 -1
- package/dist/{open-registry-BHBHQMBA.js → open-registry-OEU6QUK2.js} +14 -14
- package/dist/{open-registry-BHBHQMBA.js.map → open-registry-OEU6QUK2.js.map} +1 -1
- package/dist/paths-PXBWY532.js +22 -0
- package/dist/{paths-77PXOXZY.js.map → paths-PXBWY532.js.map} +1 -1
- package/dist/{plugin-store-XQP2CRYH.js → plugin-store-ZC3EGZ3D.js} +10 -10
- package/dist/{plugin-store-XQP2CRYH.js.map → plugin-store-ZC3EGZ3D.js.map} +1 -1
- package/dist/{project-KTEUN7KR.js → project-52UABBD5.js} +45 -46
- package/dist/{project-KTEUN7KR.js.map → project-52UABBD5.js.map} +1 -1
- package/dist/resolver/index.js +8 -8
- package/dist/runner/index.js +35 -35
- package/dist/runner/src/agent-loop.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/turn-end-contract.d.ts.map +1 -1
- package/dist/runner/src/turn-scheduler.d.ts +8 -0
- package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +14 -14
- package/dist/sdk/bridge.js +17 -16
- package/dist/sdk/core.js +7 -7
- package/dist/sdk/flow.js +8 -8
- package/dist/sdk/index.js +35 -35
- package/dist/sdk/resolver.js +8 -8
- package/dist/sdk/runner.js +35 -35
- package/dist/sdk/transport/ws/server.js +8 -8
- package/dist/sdk/transport/ws.js +8 -8
- package/dist/sdk/transport.js +8 -8
- package/dist/{serve-preflight-ODQGVUFL.js → serve-preflight-HOQ7CGYR.js} +30 -30
- package/dist/{serve-preflight-ODQGVUFL.js.map → serve-preflight-HOQ7CGYR.js.map} +1 -1
- package/dist/{setup-QJDI5YAW.js → setup-JIDZ372C.js} +29 -27
- package/dist/setup-JIDZ372C.js.map +1 -0
- package/dist/{skills-DE2BDQ6G.js → skills-5D4KDVPJ.js} +13 -13
- package/dist/{skills-DE2BDQ6G.js.map → skills-5D4KDVPJ.js.map} +1 -1
- package/dist/{source-FKOUYMEM.js → source-P6ZFSSZZ.js} +47 -46
- package/dist/{source-FKOUYMEM.js.map → source-P6ZFSSZZ.js.map} +1 -1
- package/dist/{source-manifest-publish-JA4TY4Z6.js → source-manifest-publish-Y36FHVDS.js} +49 -48
- package/dist/source-manifest-publish-Y36FHVDS.js.map +1 -0
- package/dist/transport/index.js +8 -8
- package/dist/transport/src/ws/server.d.ts.map +1 -1
- package/dist/transport/ws/server.js +8 -8
- package/dist/transport/ws.js +8 -8
- package/dist/tui/index.js +35 -35
- package/dist/workspace-plugin/adapters/mcp.js +27 -26
- package/dist/workspace-plugin/adapters/omp.js +14 -14
- package/dist/workspace-plugin/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-23Q5LT4U.js.map +0 -1
- package/dist/chunk-4KPQ6ILH.js.map +0 -1
- package/dist/chunk-5NTB64PW.js.map +0 -1
- package/dist/chunk-AVRTZAH2.js.map +0 -1
- package/dist/chunk-B2DGCYVC.js.map +0 -1
- package/dist/chunk-FZO64PLQ.js.map +0 -1
- package/dist/chunk-GYBDWW6K.js +0 -160
- package/dist/chunk-GYBDWW6K.js.map +0 -1
- package/dist/chunk-GYPPVANR.js +0 -357
- package/dist/chunk-GYPPVANR.js.map +0 -1
- package/dist/chunk-GZL6RN4Z.js.map +0 -1
- package/dist/chunk-JY2JXCL6.js +0 -334
- package/dist/chunk-JY2JXCL6.js.map +0 -1
- package/dist/chunk-KNY356I3.js.map +0 -1
- package/dist/chunk-LOO5CB5M.js +0 -12
- package/dist/chunk-LOO5CB5M.js.map +0 -1
- package/dist/chunk-MDCI4RSG.js.map +0 -1
- package/dist/chunk-MPRWVZXF.js.map +0 -1
- package/dist/chunk-O3FYOS64.js.map +0 -1
- package/dist/chunk-U3FI4DVT.js.map +0 -1
- package/dist/chunk-V3EJYOP2.js +0 -299
- package/dist/chunk-V3EJYOP2.js.map +0 -1
- package/dist/chunk-V5KG6CCV.js.map +0 -1
- package/dist/chunk-WPLZGT5Z.js.map +0 -1
- package/dist/chunk-X2B5GMJO.js.map +0 -1
- package/dist/chunk-Y2BQWZXT.js.map +0 -1
- package/dist/ensure-sources-GUJODKY5.js.map +0 -1
- package/dist/library-publish-Z5E3YZCZ.js.map +0 -1
- package/dist/open-library-A5OB72FD.js +0 -59
- package/dist/paths-77PXOXZY.js +0 -22
- package/dist/setup-QJDI5YAW.js.map +0 -1
- package/dist/source-manifest-publish-JA4TY4Z6.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/src/agent-pins.ts","../cli/src/commands/project.ts"],"names":["path","confirm"],"mappings":"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","file":"chunk-5NTB64PW.js","sourcesContent":["/**\n * The compile pin of the agents `skaile add` keeps under `.skaile/cache/agents/<name>/`.\n *\n * An agent that composes an `inline-snapshot` item (a persona, a ruleset, …) runs from\n * `compile_manifest.json`, so it cannot run without one. `add`, `install` and `update` pin\n * such an agent themselves, once per lock revision: a pin that still matches the bytes the\n * lock serves (one `skaile rebuild` wrote, or an earlier add/install) is left alone, and\n * `skaile rebuild` only refreshes it. `update` also re-runs the rebuild for any\n * agent that holds a pin, a convention-only agent (SOUL.md) included, because the update\n * moved the bytes the pin hashes.\n */\n\nimport { existsSync, readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { agentSourceCacheDir } from \"@skaile/workspaces/core\";\nimport {\n CompositionError,\n type CompositionContentSource,\n compileComposition,\n createCompositionContentSource,\n hashAgentFiles,\n isCompilePinCurrent,\n loadAgentManifest,\n loadCompileManifestFromDir,\n resolveBinding,\n} from \"@skaile/workspaces/runner\";\nimport { type AgentComposeItem, effectiveComposes } from \"@skaile/workspaces/types/manifests\";\nimport { logInfo, logWarn } from \"./helpers.ts\";\nimport { getKindRegistry } from \"./open-registry.ts\";\n\n/**\n * Whether `run` cannot start the agent without a compile pin: it declares an `inline-snapshot`\n * item (a persona, a ruleset bound so, ...). The convention files and the other bindings read\n * their source when no pin exists, so such an agent is left unpinned until `skaile rebuild`.\n */\nfunction needsPin(composes: readonly AgentComposeItem[]): boolean {\n try {\n return composes.some((item) => resolveBinding(item) === \"inline-snapshot\");\n } catch {\n // An item of a kind that has no binding: `run` and `rebuild` name it; nothing to pin here.\n return false;\n }\n}\n\n/**\n * Compile every cached agent of the project that declares an `inline-snapshot` composition item\n * and has no current pin. A compile that fails (an item no library or lock serves) is a warning\n * here: `skaile check` and `skaile run` raise the same error for the agent.\n *\n * @returns The names of the agents that were compiled.\n */\nexport async function pinComposedAgents(\n projectDir: string,\n opts: { repin?: boolean } = {},\n): Promise<string[]> {\n return (await pinComposedAgentsReport(projectDir, opts)).pinned;\n}\n\n/**\n * The `Missing:` line `install` prints for a composed asset the lock pins but no copy serves:\n * the same words as for a locked skill the library moved past (p1510).\n */\nfunction missingLine(err: CompositionError, agentName: string): string {\n if (err.moved) {\n const m = err.moved;\n return `${m.key} (library \"${m.library}\" is at ${m.libraryVersion}, locked ${m.lockedVersion}; \\`skaile update\\` moves the lock to it)`;\n }\n return `${err.ref ?? agentName} (agent ${agentName}: ${err.message})`;\n}\n\n/**\n * {@link pinComposedAgents}, plus the agents `run` could not start. An agent with no usable pin\n * whose locked persona or ruleset no library copy serves any more (the library moved on, or the\n * project is a fresh clone) is a `missing` line, not a warning: `install` exits 1 for it and\n * names `skaile update`, the only command that moves the lock (p1510). An agent that still has\n * its pin keeps running from it, so a library bump alone is silent.\n */\nexport async function pinComposedAgentsReport(\n projectDir: string,\n opts: { repin?: boolean } = {},\n): Promise<{ pinned: string[]; missing: string[] }> {\n const cacheDir = agentSourceCacheDir(projectDir);\n const pinned: string[] = [];\n const missing: string[] = [];\n if (!existsSync(cacheDir)) return { pinned, missing };\n for (const entry of readdirSync(cacheDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const agentDir = path.join(cacheDir, entry.name);\n const manifest = await loadAgentManifest(agentDir);\n if (!manifest) continue;\n const wanted = !!manifest.composes?.length && needsPin(manifest.composes);\n // `update` re-runs the rebuild for an agent that was pinned: the pin hashes bytes it moved.\n if (!wanted && !(opts.repin && (await hasCompilePin(agentDir)))) continue;\n const composes = manifest.composes ?? [];\n let items: AgentComposeItem[] = [];\n const source = createCompositionContentSource({\n agentDir,\n projectDir,\n registry: getKindRegistry(),\n });\n try {\n const files = await hashAgentFiles(agentDir);\n items = effectiveComposes(\n composes,\n files.map((f) => f.path),\n );\n if (await isCompilePinCurrent({ agentDir, items, source })) continue;\n const result = await compileComposition({ agentDir, items, source });\n pinned.push(entry.name);\n logInfo(\n `Compiled agent ${manifest.name ?? entry.name} (${result.resolvedCount} composition items) → prompt v${result.manifest.prompt_version}`,\n );\n } catch (err) {\n if (err instanceof CompositionError && err.code === \"composition_asset_missing\") {\n // The bytes the lock pins are gone, but the pin that was compiled from them still\n // serves `run`: nothing for install to report.\n if (await hasCompilePin(agentDir)) continue;\n for (const line of await missingLines(items, source, err, entry.name)) {\n if (!missing.includes(line)) missing.push(line);\n }\n continue;\n }\n const reason = err instanceof Error ? err.message : String(err);\n const code = err && typeof err === \"object\" && \"code\" in err ? `${String(err.code)}: ` : \"\";\n logWarn(`Could not compile agent ${entry.name}: ${code}${reason}`);\n }\n }\n return { pinned, missing };\n}\n\n/** Whether the agent folder holds a readable compile pin. */\nasync function hasCompilePin(agentDir: string): Promise<boolean> {\n try {\n return (await loadCompileManifestFromDir(agentDir)) !== undefined;\n } catch {\n return false;\n }\n}\n\n/** One line per item the source cannot serve (the compile names only the first). */\nasync function missingLines(\n items: readonly AgentComposeItem[],\n source: CompositionContentSource,\n first: CompositionError,\n agentName: string,\n): Promise<string[]> {\n const lines = [missingLine(first, agentName)];\n for (const item of items) {\n try {\n await source.load(item.ref, item.kind);\n } catch (err) {\n if (err instanceof CompositionError && err.code === \"composition_asset_missing\") {\n lines.push(missingLine(err, agentName));\n }\n }\n }\n return [...new Set(lines)];\n}\n\n/**\n * The items of the agent that a rebuild could not serve because a registered library moved past\n * the version the lock pins: each error names `skaile update`, the command that moves the lock.\n * `check` prints these instead of sending the user to a `skaile rebuild` that would fail with\n * the same lines. Empty when a rebuild can read every item.\n */\nexport async function lockBehindLibraryErrors(\n agentDir: string,\n projectDir: string,\n): Promise<CompositionError[]> {\n const manifest = await loadAgentManifest(agentDir);\n if (!manifest) return [];\n const files = await hashAgentFiles(agentDir);\n const items = effectiveComposes(\n manifest.composes,\n files.map((f) => f.path),\n );\n const source = createCompositionContentSource({\n agentDir,\n projectDir,\n registry: getKindRegistry(),\n });\n const out: CompositionError[] = [];\n for (const item of items) {\n try {\n await source.load(item.ref, item.kind);\n } catch (err) {\n if (\n err instanceof CompositionError &&\n err.code === \"composition_asset_missing\" &&\n err.moved\n ) {\n out.push(err);\n }\n }\n }\n return out;\n}\n","import { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n AssetManager,\n type ContentHeld,\n type InstalledAgentInstance,\n type LibraryMove,\n type ReplacedAsset,\n type RewrittenAgent,\n} from \"@skaile/workspaces/asset-manager\";\nimport {\n type AgentInstanceConfig,\n AgentRefResolutionError,\n type HarnessName,\n effectiveAgentInstances,\n globalSkaileDir,\n type PresetExpansion,\n parseAssetRef,\n readLock,\n resolveAgentDefinitionDir,\n resolveSkWorkspaceConfig,\n SourceEntryError,\n userConfigPath,\n} from \"@skaile/workspaces/core\";\nimport {\n isCompositionError,\n loadAgentManifest,\n resolveAgentInstance,\n verifyConventionItems,\n} from \"@skaile/workspaces/runner\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\nimport { Command } from \"commander\";\nimport {\n colorRef,\n requireProjectConfig,\n formatSoftDepHint,\n deferredWarnings,\n logErr,\n logInfo,\n logOk,\n logWarn,\n parseHarnessFilter,\n reportLegacyOmpCopies,\n S,\n TARGET_DEFAULT_HINT,\n warnFilesOnlyDelegates,\n warnStaleHarnessCopies,\n warnPlaceholderBodies,\n} from \"../helpers.ts\";\nimport {\n agentInstanceErrorLines,\n agentInstanceWarningLines,\n reportProjectConfig,\n reportUnknownHarnesses,\n} from \"../config-checks.ts\";\nimport { createSpinner } from \"../spinner.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport { lockBehindLibraryErrors, pinComposedAgentsReport } from \"../agent-pins.ts\";\n\n/**\n * Canonical asset-ref shape accepted by `skaile install <ref>`:\n * `kind:@<publisher>/<name>#<version>` (the `#` version sigil). Validated via\n * `parseAssetRef` so the CLI shares the single canonical grammar; the legacy\n * trailing-`@version` shape is rejected.\n */\nexport const REF_HINT = \"kind:@<publisher>/<name>#<version> (e.g. skill:@skaile-ai/use-exa#1.0.0)\";\n\n/** True when `ref` parses as a canonical asset ref. */\nfunction isValidAssetRef(ref: string): boolean {\n try {\n parseAssetRef(ref);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Minimal catalog-source surface the pointer-only install path needs.\n * `RemoteCatalogSource` satisfies this — narrowing keeps {@link runPointerOnlyInstall}\n * testable with a hand-rolled stub.\n */\nexport interface InstallManifestSource {\n getInstallManifest(ref: string): Promise<InstallManifest>;\n}\n\n/**\n * Capability check: is this catalog source able to serve install manifests?\n *\n * `openCatalogSource` returns a `RemoteCatalogSource | RestCatalogSource`.\n * Only the tRPC-framed `RemoteCatalogSource` implements `getInstallManifest`;\n * the REST-framed `RestCatalogSource` (the default for any catalog URL other\n * than `https://skaile.store`) does not. Calling it unconditionally would be a\n * runtime `TypeError`, so the pointer-only install path must capability-detect\n * first and fail with a clear, actionable message.\n */\nexport function supportsInstallManifest(source: unknown): source is InstallManifestSource {\n return (\n typeof (source as { getInstallManifest?: unknown } | null | undefined)?.getInstallManifest ===\n \"function\"\n );\n}\n\n/**\n * Minimal library surface the pointer-only install path needs.\n * `LocalIndex` satisfies this.\n */\nexport interface InstallLibrary {\n install(manifest: InstallManifest): Promise<{ installPath: string }>;\n}\n\n/**\n * Result of a pointer-only catalog install.\n */\nexport interface PointerOnlyInstallResult {\n /** Absolute path the verified asset bytes were written to. */\n installPath: string;\n /** The pinned upstream commit SHA the asset was fetched at. */\n commitSha: string;\n /** Number of files in the install manifest. */\n fileCount: number;\n}\n\n/**\n * Pointer-only catalog install — the `skaile install <ref>` code path.\n *\n * 1. Resolves the pointer-only {@link InstallManifest} from the Catalog.\n * 2. Hands it to the library, which fetches each file's bytes directly from\n * the upstream repo at the pinned commit, verifies every per-file SHA256\n * plus the composite SHA256, and only then writes the verified files.\n *\n * Both dependencies are injected so the function is unit-testable without a\n * network round-trip. In production the CLI passes a `RemoteCatalogSource`\n * and a `LocalIndex`.\n *\n * @param ref - Canonical asset ref (`kind:@<publisher>/<name>#<version>`).\n * @param deps - Injected catalog source + library.\n * @returns The install path, pinned commit SHA, and file count.\n * @throws When the ref is malformed, the manifest cannot be resolved, or any\n * hash verification fails. The underlying error message is surfaced as-is.\n */\nexport async function runPointerOnlyInstall(\n ref: string,\n deps: { catalog: InstallManifestSource; library: InstallLibrary },\n): Promise<PointerOnlyInstallResult> {\n let requested: ReturnType<typeof parseAssetRef>;\n try {\n requested = parseAssetRef(ref);\n } catch (e) {\n throw new Error(\n `malformed asset ref '${ref}' — expected ${REF_HINT}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n const manifest = await deps.catalog.getInstallManifest(ref);\n // [M1] Identity check: the catalog must not install a different asset than\n // requested. Compare the PARSED refs (kind/publisher/name/pin) so equivalent\n // spellings (optional `kind:`, default `skill`) are treated as the same ref.\n const got = parseAssetRef(manifest.ref);\n if (\n got.kind !== requested.kind ||\n got.publisher !== requested.publisher ||\n got.name !== requested.name ||\n got.pin !== requested.pin\n ) {\n throw new Error(\n `catalog identity mismatch: requested '${ref}' but the catalog returned a manifest for '${manifest.ref}'`,\n );\n }\n const { installPath } = await deps.library.install(manifest);\n return {\n installPath,\n commitSha: manifest.source.commitSha,\n fileCount: manifest.files.length,\n };\n}\n\n/**\n * Print one summary line per `preset:` dependency `skaile install` expanded: how many\n * asset items joined the install set and how many instance items (`library://`,\n * placeholders) were skipped, which only `skaile preset apply` materialises.\n */\nexport function reportPresetExpansions(\n presets: readonly PresetExpansion[] | undefined,\n onLine: (line: string) => void = logInfo,\n): void {\n for (const preset of presets ?? []) {\n onLine(\n `preset ${preset.ref}: ${preset.assets} assets, ${preset.skipped} instance items skipped (apply with skaile preset apply)`,\n );\n }\n}\n\n/**\n * Print one line per agent instance `skaile install` rendered (with the files\n * written) and one per native agent file removed because its instance left `skaile.yaml`.\n */\nexport function reportAgentInstances(\n instances: readonly InstalledAgentInstance[] | undefined,\n removedFiles: readonly string[] | undefined,\n onLine: (line: string) => void = logInfo,\n onRemoved: (line: string) => void = logWarn,\n): void {\n for (const instance of instances ?? []) {\n onLine(`agent ${instance.id}: ${instance.files.join(\", \")}`);\n }\n for (const file of removedFiles ?? []) onRemoved(`Removed: ${file}`);\n}\n\n/** One `Re-locked` line per lock entry `install`/`update` rewrote for an already-locked asset. */\nexport function reportRelocked(\n relocked: string[] | undefined,\n onLine: (line: string) => void = logInfo,\n): void {\n for (const ref of relocked ?? []) onLine(`Re-locked ${ref}`);\n}\n\n/**\n * One line per locked library asset whose library holds the locked version with other bytes.\n * `install` keeps the lock and the deployed copy; only `update` takes the edit (OQ13, p1911).\n * The project does not match its library, as `check` says, so the run exits 1.\n */\nexport function reportContentHeld(\n held: ContentHeld[] | undefined,\n onLine: (line: string) => void = logWarn,\n): void {\n for (const h of held ?? []) {\n onLine(\n `${h.ref.split(\"#\")[0]}: library \"${h.library}\" changed since lock (same version ${h.version}). Run ${S.cmd(\"skaile update\")} to take the change.`,\n );\n process.exitCode = 1;\n }\n}\n\n/** One line per global entry `install --global` limited to the one harness that holds its copy (p1442). */\nexport function reportInferredHarnesses(\n inferred: readonly { ref: string; harnesses: readonly string[] }[] | undefined,\n onLine: (line: string) => void = logInfo,\n): void {\n for (const i of inferred ?? []) {\n onLine(\n `${i.ref} stays on ${i.harnesses.join(\", \")} (its only copy); add it to another harness with \\`skaile add ${i.ref} --global --harness <id>\\``,\n );\n }\n}\n\n/** One `! <ref> moved from <a> to <b>` line per locked asset that now resolves from another library. */\nexport function reportMoved(\n moved: readonly LibraryMove[] | undefined,\n onLine: (line: string) => void = logWarn,\n): void {\n for (const m of moved ?? []) onLine(`${m.ref} moved from ${m.from} to ${m.to}`);\n}\n\n/** One `replaced <old> → <new>` line per asset `install`/`update` moved to another locked version. */\nexport function reportReplaced(\n replaced: readonly ReplacedAsset[] | undefined,\n onLine: (line: string) => void = logInfo,\n): void {\n for (const r of replaced ?? []) onLine(`${r.ref} replaced ${r.from} → ${r.to}`);\n}\n\n/** One `Rewrote <file> (agent render changed)` line per rendered agent file whose bytes the CLI's render changed. */\nexport function reportRewritten(\n rewritten: readonly RewrittenAgent[] | undefined,\n onLine: (line: string) => void = logInfo,\n): void {\n for (const r of rewritten ?? []) {\n for (const f of r.files) onLine(`Rewrote ${f} (agent render changed)`);\n }\n}\n\n/**\n * Say which locked store assets `install`/`update` did not check against the store (p792,\n * p799). A chosen mode (air-gapped, `--no-catalog`) is one info line per asset; a store that\n * did not answer is an error line `store unreachable: could not check <ref> for updates`.\n *\n * @returns Whether any asset could not be checked because the store was unreachable: the\n * command then ends `Failed` with exit 1.\n */\nexport function reportStoreNotChecked(\n notChecked: readonly { ref: string; reason: string; detail: string }[] | undefined,\n): boolean {\n let unreachable = false;\n for (const n of notChecked ?? []) {\n if (n.reason === \"unreachable\") {\n unreachable = true;\n logErr(`store unreachable: could not check ${n.ref} for updates (${n.detail})`);\n } else if (n.reason === \"air-gapped\") {\n logInfo(`${n.ref} kept as locked (air-gapped: not checked against the store)`);\n } else {\n logInfo(`${n.ref} kept as locked (${n.detail})`);\n }\n }\n return unreachable;\n}\n\n/**\n * Say which refs `outdated`, `check` or `doctor` could not check against the store\n * (`AssetManager.takeStoreNotChecked`). A store that did not answer is one error\n * line per ref (`store unreachable: <ref> not checked (<why>)`); an air-gapped client\n * (`catalog.cache_ttl: 0`) chose not to ask, so its refs are one info line each.\n *\n * @returns Whether any ref was not checked because the store was unreachable: the command then\n * exits 1, as `install` and `update` do.\n */\nexport function reportStoreNotCheckedForUpdates(\n notChecked: readonly { ref: string; reason: string; detail: string }[],\n): boolean {\n let unreachable = false;\n for (const n of notChecked) {\n if (n.reason === \"air-gapped\") {\n logInfo(`${n.ref} not checked (air-gapped: the store was not asked)`);\n } else {\n unreachable = true;\n logErr(`store unreachable: ${n.ref} not checked (${n.detail})`);\n }\n }\n return unreachable;\n}\n\n/**\n * Creates the `skaile install` command.\n *\n * Two modes, selected by argument shape:\n *\n * - `skaile install` (no positional arg) — reads `skaile.yaml` and deploys all\n * declared assets (and their transitive dependencies) to the configured\n * harness target directory. Supports `--locked` for CI-mode install from a\n * lock file.\n * - `skaile install kind:@<publisher>/<name>#<version>` — pointer-only catalog\n * install: resolves the pointer-only install manifest from the configured\n * Catalog, fetches each file's bytes directly from the upstream repo at the\n * pinned commit, verifies every per-file + the composite SHA256, then writes\n * the verified files into the local Library.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-install-command\n */\nexport function makeInstallCommand(): Command {\n return new Command(\"install\")\n .description(`Install dependencies from skaile.yaml, or a single asset by ref (${REF_HINT})`)\n .argument(\"[ref]\", `Asset ref to install from the Catalog (${REF_HINT})`)\n .option(\"--locked\", \"Install from lock file (CI mode — fails on drift)\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .option(\"--target <agent>\", `Agent framework (${TARGET_DEFAULT_HINT})`)\n .option(\n \"--global\",\n \"Install the global SSOT (~/.skaile/skaile.yaml), fanning out to every global harness\",\n )\n .option(\n \"--harness <ids>\",\n \"Comma-separated global harnesses to install into (default: all resolved); implies --global\",\n )\n .option(\n \"--link\",\n \"symlink local-path assets instead of copying (dev loop; machine-local, not for committing)\",\n )\n .option(\n \"--force\",\n \"Deploy over a folder no lock entry owns (a hand-made skill of the same name), and prune an undeclared asset whose folder holds your edits, instead of refusing\",\n )\n .option(\n \"--verbose\",\n \"also print the resolver's searched directories for an agent it cannot find\",\n )\n .action(runInstallCommand);\n}\n\n/** Options shape accepted by the `skaile install` command action. */\nexport interface InstallCommandOptions {\n locked?: boolean;\n projectDir: string;\n target?: string;\n global?: boolean;\n harness?: string;\n link?: boolean;\n force?: boolean;\n verbose?: boolean;\n}\n\n/**\n * `skaile install` action body. Dispatches by argument shape:\n * a positional `ref` selects pointer-only catalog install, otherwise the\n * legacy `skaile.yaml` install path runs.\n */\nasync function runInstallCommand(\n ref: string | undefined,\n opts: InstallCommandOptions,\n): Promise<void> {\n // ── Pointer-only catalog install: `skaile install <ref>` ──────────────\n if (ref !== undefined) {\n await runRefInstall(ref, opts);\n return;\n }\n\n // ── Legacy install: `skaile install` reads skaile.yaml ────────────────\n await runYamlInstall(opts);\n}\n\n/** Pointer-only catalog install path for `skaile install <ref>`. */\nasync function runRefInstall(ref: string, opts: InstallCommandOptions): Promise<void> {\n if (!isValidAssetRef(ref)) {\n logErr(`malformed asset ref '${ref}' — expected ${REF_HINT}`);\n process.exit(1);\n }\n // The store installs one exact version; without `#<version>` it answers a bare 400, so say\n // what is missing before the call.\n if (!parseAssetRef(ref).pin) {\n logErr(\n `${ref} needs a version: use ${ref}#<version>. A library asset is deployed with \\`skaile add ${ref}\\`, not \\`skaile install\\`.`,\n );\n process.exit(1);\n }\n const spinner = createSpinner();\n spinner.start(`Installing ${ref}`);\n try {\n const { openCatalogSource, openLibrary } = await import(\"../open-library.ts\");\n const catalog = await openCatalogSource({ projectDir: path.resolve(opts.projectDir) });\n // [H2] REST-framed catalogs (the default for any catalog URL other\n // than https://skaile.store) cannot serve install manifests. Detect\n // and fail clearly rather than throwing a runtime TypeError.\n if (!supportsInstallManifest(catalog)) {\n throw new Error(\n \"pointer-only install (skaile install <ref>) requires a tRPC-framed Catalog. \" +\n \"The configured catalog uses REST framing, which does not serve install \" +\n \"manifests. Set catalog.url to https://skaile.store, or catalog.framing: trpc, \" +\n `in ${userConfigPath()}.`,\n );\n }\n const library = await openLibrary();\n try {\n const result = await runPointerOnlyInstall(ref, { catalog, library });\n spinner.stop(\"Done\");\n logOk(`Installed ${colorRef(ref)}`);\n logInfo(`Path: ${S.dim(result.installPath)}`);\n logInfo(`Commit: ${S.dim(result.commitSha)}`);\n logInfo(`Files: ${S.dim(String(result.fileCount))}`);\n logInfo(\n S.dim(\n `Installed globally (see Path above) — use \\`skaile add ${ref}\\` to deploy into this project.`,\n ),\n );\n } finally {\n library.close();\n }\n } catch (err) {\n spinner.stop(\"Failed\");\n const msg = err instanceof Error ? err.message : String(err);\n if (/failed: 404\\b/.test(msg)) {\n logErr(\n `${ref} is not in the store. For a library asset use \\`skaile add ${ref.replace(/#.*$/, \"\")}\\`.`,\n );\n } else if (/unreachable/i.test(msg)) {\n logErr(`asset uninstallable — source commit no longer available (${msg})`);\n } else {\n logErr(msg);\n }\n process.exit(1);\n }\n}\n\n/** Legacy install path for bare `skaile install` (reads skaile.yaml). Also runs `skaile harness set`. */\nexport async function runYamlInstall(opts: InstallCommandOptions): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n\n const harnesses = parseHarnessFilter(opts.harness);\n // `--harness` implies `--global`.\n if (opts.global || harnesses) {\n await runGlobalInstall(opts, harnesses);\n return;\n }\n\n // A project without a readable skaile.yaml stops here, before sources are cloned, assets\n // are deployed or undeployed, or the lock is written.\n requireProjectConfig(projectDir);\n\n // Refuse what `validate` rejects for the `agents:` map, before anything is written (p1512);\n // a key of `agent:` or `agents:` that nothing reads warns (p1712).\n for (const line of agentInstanceWarningLines(projectDir)) logWarn(line);\n const instanceErrors = agentInstanceErrorLines(projectDir);\n if (instanceErrors.length > 0) {\n for (const line of instanceErrors) logErr(line);\n process.exit(1);\n }\n // A `harness:` nothing registers fails as in `validate` and `check` (p1754).\n if ((await reportUnknownHarnesses(projectDir)) > 0) process.exit(1);\n\n // Hydrate sources declared in skaile.yaml before resolving assets, so\n // freshly checked-out projects pull their source clones automatically.\n try {\n const { ensureSourcesCloned } = await import(\"../ensure-sources.ts\");\n const hydrate = ensureSourcesCloned(projectDir, { quiet: true });\n if (hydrate.cloned.length > 0) {\n logOk(`Cloned source(s): ${hydrate.cloned.join(\", \")}`);\n }\n if (hydrate.failed.length > 0) {\n logErr(`Failed to clone source(s): ${hydrate.failed.join(\", \")}`);\n }\n } catch (err) {\n logWarn(`source hydration skipped: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const warnings = deferredWarnings();\n const am = new AssetManager({\n registry: getKindRegistry(),\n projectDir,\n harness: opts.target as HarnessName,\n onLibraryCollision: warnings.push,\n });\n const spinner = createSpinner();\n spinner.start(opts.locked ? \"Installing from lock file\" : \"Installing dependencies\");\n try {\n const result = await am.install({ locked: opts.locked, link: opts.link, force: opts.force });\n const storeUnreachable = result.storeNotChecked?.some((n) => n.reason === \"unreachable\");\n spinner.stop(\n result.agentInstanceErrors?.length ||\n result.missing.length > 0 ||\n storeUnreachable ||\n result.contentHeld?.length\n ? \"Failed\"\n : \"Done\",\n );\n warnings.flush();\n if (result.deployed.length > 0) {\n for (const d of result.deployed) logOk(d);\n }\n warnPlaceholderBodies(result.placeholderBodies, result.placeholderDescriptions);\n for (const r of result.restored ?? []) {\n for (const f of r.restored) logInfo(`Restored ${f}`);\n for (const f of r.removed) logInfo(`Removed ${f} (not part of ${r.ref})`);\n }\n reportRewritten(result.rewritten);\n for (const line of result.libraryNotices ?? []) logInfo(line);\n reportPresetExpansions(result.presets);\n reportAgentInstances(result.agentInstances, result.agentFilesRemoved);\n // Said when this install wrote an agent file (a fresh clone, a changed agent), not when it only\n // restored a skill or did nothing (p1673).\n if (\n result.deployed.some((d) => d.startsWith(\"agent:\")) ||\n result.replaced?.some((r) => r.ref.startsWith(\"agent:\")) ||\n result.agentInstancesChanged?.length\n ) {\n warnFilesOnlyDelegates(am.projectDir, am.harness);\n }\n if (result.removed.length > 0) {\n for (const r of result.removed) logWarn(`Removed: ${r}`);\n }\n reportReplaced(result.replaced);\n reportRelocked(result.relocked);\n reportMoved(result.moved);\n reportContentHeld(result.contentHeld);\n const pins = await pinComposedAgentsReport(projectDir);\n const missing = [...result.missing, ...pins.missing];\n if (\n result.deployed.length === 0 &&\n result.removed.length === 0 &&\n !result.replaced?.length &&\n missing.length === 0 &&\n !result.storeNotChecked?.length &&\n !result.restored?.length &&\n !result.relocked?.length &&\n !result.contentHeld?.length &&\n !result.moved?.length &&\n !result.agentInstanceErrors?.length\n ) {\n logInfo(\"Nothing to install (already up to date).\");\n }\n if (result.agentInstanceErrors?.length) {\n if (opts.verbose) for (const d of result.agentInstanceDetails ?? []) logInfo(S.dim(d));\n logErr(\n `${result.agentInstanceErrors.length} agent instance(s) could not be rendered (see above)`,\n );\n process.exitCode = 1;\n }\n if (missing.length > 0) {\n for (const m of missing) logErr(`Missing: ${m}${result.missingHints?.[m] ?? \"\"}`);\n // Partial-miss must fail the process — CI can't otherwise distinguish a\n // clean install from \"half the assets never resolved\".\n process.exitCode = 1;\n }\n if (reportStoreNotChecked(result.storeNotChecked)) process.exitCode = 1;\n // A ref that only resolved once the assets were installed (a catalog agent) is checked now.\n const lateInstanceErrors = agentInstanceErrorLines(projectDir);\n for (const line of lateInstanceErrors) logErr(line);\n if (lateInstanceErrors.length > 0) process.exitCode = 1;\n if (result.lockWritten) {\n logInfo(`Lock file written: ${S.dim(\"skaile.lock.yaml\")}`);\n }\n warnStaleHarnessCopies(am);\n // Report-only: surface soft deps the declared assets reference but aren't\n // present. Never a prompt — install is a batch/CI path. Skipped under\n // --locked: that mode is \"restore exactly\", so an `add` nudge would jar.\n if (!opts.locked) await reportInstalledSoftDeps(am);\n } catch (err) {\n spinner.stop(\"Failed\");\n logErr(err instanceof SourceEntryError ? err.message : String(err));\n process.exit(1);\n }\n}\n\n/**\n * Report (never prompt) the body-link soft deps that the declared assets\n * reference but that aren't in the project — the `install` counterpart to the\n * `add`-time soft-dep surface. `install` is a batch/CI path (often non-TTY), so\n * it only ever prints a hint: pulling stays an explicit `skaile add`. Best-effort\n * — `reportSoftDeps` swallows any index failure and returns `[]`.\n */\nexport async function reportInstalledSoftDeps(\n am: Pick<AssetManager, \"listDeclared\" | \"reportSoftDeps\">,\n onHint: (line: string) => void = (l) => logInfo(S.dim(l)),\n): Promise<void> {\n try {\n const declared = (await am.listDeclared()).map((d) => d.ref);\n if (declared.length === 0) return;\n const edges = await am.reportSoftDeps(declared);\n for (const edge of edges) onHint(formatSoftDepHint(edge));\n } catch {\n // Best-effort: a soft-dep report must never fail an install that succeeded.\n }\n}\n\n/**\n * Global cross-harness install: deploy every dep declared in the global SSOT\n * (`~/.skaile/skaile.yaml`) into each resolved global harness's dir under `~`,\n * write the global lock (`~/.skaile/skaile.lock.yaml`), then print per-harness\n * state. `harnesses` is the `--harness` filter (omit for the full resolved set).\n */\nasync function runGlobalInstall(\n opts: InstallCommandOptions,\n harnesses: HarnessName[] | undefined,\n): Promise<void> {\n const am = new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.resolve(opts.projectDir),\n global: true,\n harnesses,\n });\n const spinner = createSpinner();\n spinner.start(\"Installing global dependencies\");\n try {\n const result = await am.install({ locked: opts.locked, link: opts.link, force: opts.force });\n const storeUnreachable = result.storeNotChecked?.some((n) => n.reason === \"unreachable\");\n spinner.stop(\n result.missing.length > 0 || storeUnreachable || result.contentHeld?.length\n ? \"Failed\"\n : \"Done\",\n );\n if (result.deployed.length > 0) for (const d of result.deployed) logOk(d);\n warnPlaceholderBodies(result.placeholderBodies, result.placeholderDescriptions);\n reportPresetExpansions(result.presets);\n if (result.removed.length > 0) for (const r of result.removed) logWarn(`Removed: ${r}`);\n reportReplaced(result.replaced);\n reportRelocked(result.relocked);\n reportInferredHarnesses(result.inferredHarnesses);\n reportMoved(result.moved);\n reportContentHeld(result.contentHeld);\n if (\n result.deployed.length === 0 &&\n result.removed.length === 0 &&\n !result.replaced?.length &&\n result.missing.length === 0 &&\n !result.storeNotChecked?.length &&\n !result.relocked?.length &&\n !result.contentHeld?.length &&\n !result.moved?.length\n )\n logInfo(\"Nothing to install (already up to date).\");\n if (reportStoreNotChecked(result.storeNotChecked)) process.exitCode = 1;\n if (result.missing.length > 0) {\n for (const m of result.missing) logErr(`Missing: ${m}${result.missingHints?.[m] ?? \"\"}`);\n process.exitCode = 1;\n }\n if (result.lockWritten) logInfo(`Global lock written: ${S.dim(\"~/.skaile/skaile.lock.yaml\")}`);\n reportLegacyOmpCopies(am.takeLegacyCopiesRemoved(), am.takeLegacyCopiesKept());\n\n // Per-harness reconciliation summary so a partial fan-out is visible.\n const state = am.globalState({});\n const byHarness = new Map<string, number>();\n for (const s of state)\n if (s.state === \"installed\") byHarness.set(s.harness, (byHarness.get(s.harness) ?? 0) + 1);\n for (const [harness, n] of byHarness) logInfo(`${harness}: ${n} installed`);\n } catch (err) {\n spinner.stop(\"Failed\");\n logErr(String(err));\n process.exit(1);\n }\n}\n\n/** The `--global` options of `check`, `doctor` and `clean`. */\ninterface GlobalScopeOptions {\n global?: boolean;\n harness?: string;\n projectDir: string;\n}\n\n/** A manager over the user-scope SSOT (`~/.skaile`), limited to `--harness` when given. */\nfunction globalManager(opts: GlobalScopeOptions): AssetManager {\n return new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.resolve(opts.projectDir),\n global: true,\n harnesses: parseHarnessFilter(opts.harness),\n });\n}\n\n/**\n * What is wrong with the global install: one line per declared asset a harness does not hold\n * (`list --global` calls these `declared` and `drift`), per invalid entry, and per old\n * `~/.omp/<dir>` copy a 5.12.0 install left behind. Empty when the global state is clean (p911).\n */\nexport function globalProblems(am: AssetManager): string[] {\n const lines = new Set<string>();\n for (const row of am.globalState({})) {\n if (row.state === \"declared\") {\n lines.add(\n `${row.ref} is declared in ~/.skaile/skaile.yaml but not installed: run skaile install --global`,\n );\n } else if (row.state === \"drift\") {\n lines.add(\n `${row.ref} is missing from ${row.harness}: run skaile install --global --harness ${row.harness}`,\n );\n } else if (row.state === \"invalid\") {\n lines.add(`${row.ref} in ~/.skaile/skaile.yaml is not a valid asset ref`);\n }\n }\n for (const stale of am.staleLegacyOmpCopies()) {\n lines.add(\n `${stale.path.replace(homedir(), \"~\")} is an old omp copy of ${stale.ref} (omp reads ~/.omp/agent): run skaile install --global --harness omp, or delete it`,\n );\n }\n return [...lines];\n}\n\n/**\n * Creates the `skaile check` command.\n *\n * Fails (exit 1) on every problem {@link AssetManager.projectState} reports: unmet\n * requirements of deployed assets, a declared dep that never resolved into the lock (its\n * library or source is gone, like `skaile list` showing it as `declared`) or never\n * materialized (e.g. a store-sourced `mcp-server`, #462), a locked asset whose library is\n * gone or whose deployed copy or files are missing, a locked library asset whose files\n * changed since the lock (or whose lock hash predates the shared asset hash), and an\n * `agents.<id>.ref` that binds to no agent. `doctor`, `outdated`, `diff` and\n * `install --locked` take their verdict from the same state.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-check-command\n */\nexport function makeCheckCommand(): Command {\n return new Command(\"check\")\n .description(\"Check for unmet requirements\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .option(\"--global\", \"Check the global install (~/.skaile) instead of the project\")\n .option(\"--harness <ids>\", \"With --global: only these harnesses (comma-separated)\")\n .action(async (opts) => {\n if (opts.global || opts.harness) {\n const problems = globalProblems(globalManager({ ...opts, global: true }));\n if (problems.length === 0) {\n logOk(\"All global dependencies satisfied.\");\n return;\n }\n for (const line of problems) logErr(line);\n process.exit(1);\n }\n requireProjectConfig(opts.projectDir);\n // A mistyped key warns; a `harness:` nothing registers fails like a gap (p1474, p1022).\n const configErrors = await reportProjectConfig(path.resolve(opts.projectDir), {\n harness: true,\n instances: true,\n });\n const am = new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.resolve(opts.projectDir),\n });\n const { gaps } = await am.projectState();\n const edited = await editedConventionFiles(path.resolve(opts.projectDir));\n // A skipped `mcp-server` or an unset required field fails nothing: a `!` line each.\n const notices = [\n ...(await am.mcpNotices()).map((n) => n.text),\n // A library that went back past the lock is no drift either (p1257).\n ...(await am.libraryOlderNotices()),\n // A lock written before it listed the instance files: the next write replaces them.\n ...am.legacyLockNotices(),\n ];\n // A store-origin ref the store could not be asked about is not \"satisfied\".\n await am.probeStoreOrigins();\n const notChecked = am.takeStoreNotChecked();\n const storeUnreachable = notChecked.some((n) => n.reason === \"unreachable\");\n if (gaps.length === 0 && edited.length === 0 && configErrors === 0 && !storeUnreachable) {\n logOk(\"All dependencies satisfied.\");\n for (const n of notices) logWarn(n);\n reportStoreNotCheckedForUpdates(notChecked);\n } else {\n for (const g of gaps) logErr(g.message);\n for (const e of edited) logErr(e);\n for (const n of notices) logWarn(n);\n reportStoreNotCheckedForUpdates(notChecked);\n process.exit(1);\n }\n });\n}\n\n/**\n * One message per convention file (SOUL.md, knowledge/, …) of a bound agent that was edited\n * after `skaile rebuild` pinned it: the compile manifest, not the file, is what the agent\n * runs from, so the edit never reaches it. Also one message per bound agent that `skaile run`\n * would refuse with `composition_rebuild_required` (an `inline-snapshot` item with no compile\n * pin, or a pin that is stale or malformed), in the words `run` prints (p1310). Instances bound\n * to the same agent directory share the files, so one message names every instance that runs\n * from them. A binding that resolves to no agent is a `projectState` gap, not reported here.\n * Shared by `check` and `doctor`.\n */\nexport async function editedConventionFiles(projectDir: string): Promise<string[]> {\n const instances = effectiveAgentInstances(resolveSkWorkspaceConfig(projectDir));\n const byDir = new Map<string, { ref: string; ids: string[]; instance: AgentInstanceConfig }>();\n for (const [id, instance] of Object.entries(instances)) {\n let agentDir: string | undefined;\n try {\n agentDir = resolveAgentDefinitionDir(projectDir, instance.ref);\n } catch (err) {\n if (err instanceof AgentRefResolutionError) continue;\n throw err;\n }\n if (!agentDir) continue;\n if (path.basename(agentDir) === \"agent.yaml\") agentDir = path.dirname(agentDir);\n const bound = byDir.get(agentDir);\n if (bound) bound.ids.push(id);\n else byDir.set(agentDir, { ref: instance.ref, ids: [id], instance });\n }\n const messages: string[] = [];\n for (const [agentDir, { ref, ids, instance }] of byDir) {\n const label = `${ids.length === 1 ? \"instance\" : \"instances\"} ${ids.join(\", \")}`;\n try {\n const drifted = await verifyConventionItems({\n agentDir,\n projectDir,\n registry: getKindRegistry(),\n });\n for (const err of drifted) messages.push(`${ref} (${label}): ${err.message}`);\n const manifest = await loadAgentManifest(agentDir);\n if (manifest) {\n await resolveAgentInstance({\n instanceId: ids[0]!,\n instance,\n asset: { manifest, dir: agentDir },\n projectDir,\n registry: getKindRegistry(),\n host: { nativeSubagents: true },\n dryRun: true,\n });\n }\n } catch (err) {\n if (!isCompositionError(err)) throw err;\n // Only the error `run` raises for a missing pin; other composition errors are not `check`'s.\n if (err.code === \"composition_rebuild_required\") {\n // A lock behind the library (a fresh clone after a persona bump): `rebuild` would fail\n // on it, so name `update` here, the same line `rebuild` and `install` give.\n const behind = await lockBehindLibraryErrors(agentDir, projectDir);\n if (behind.length > 0) {\n for (const e of behind) {\n messages.push(`${ref} (${label}): ${e.code}: ${e.message}`);\n }\n } else {\n messages.push(`${ref} (${label}): ${err.code}: ${err.message}`);\n }\n }\n }\n }\n return messages;\n}\n\n/**\n * Creates the `skaile clean` command.\n *\n * Removes all skaile-managed assets tracked in `skaile.lock.yaml` from the\n * workspace. With `--all` also removes history, patches, repos, and the lock\n * file itself. Preserves unmanaged (manually placed) assets.\n *\n * @returns Configured {@link Command} ready for `program.addCommand()`.\n * @docLink cli/commands/project#make-clean-command\n */\nexport function makeCleanCommand(): Command {\n return new Command(\"clean\")\n .description(\"Remove all skaile-managed assets from the workspace\")\n .option(\"--all\", \"Full reset: also remove history, patches, repos, and lock file\")\n .option(\"--dry-run\", \"Show what would be removed without doing it\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .option(\"--target <agent>\", `Agent framework (${TARGET_DEFAULT_HINT})`)\n .option(\"--global\", \"Clean the global install (~/.skaile and every global harness)\")\n .option(\"--harness <ids>\", \"With --global: only these harnesses (comma-separated)\")\n .action(async (opts) => {\n const isGlobal = Boolean(opts.global || opts.harness);\n // A skaile.yaml that does not parse stops `clean` with one `✗` line (p910).\n if (!isGlobal) requireProjectConfig(opts.projectDir, { allowMissing: true });\n const am = isGlobal\n ? globalManager({ ...opts, global: true })\n : new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.resolve(opts.projectDir),\n harness: opts.target as HarnessName,\n });\n\n // Preview: load lock file to show what will be cleaned\n const lock = readLock(\n isGlobal\n ? path.join(globalSkaileDir(), \"skaile.lock.yaml\")\n : path.resolve(opts.projectDir, \"skaile.lock.yaml\"),\n );\n\n if (!lock || Object.keys(lock.assets).length === 0) {\n logInfo(\"Nothing to clean (no skaile-managed assets found).\");\n return;\n }\n\n const assetRefs = Object.keys(lock.assets);\n console.log();\n console.log(` ${S.heading(\"Assets to remove:\")} ${S.dim(`(${assetRefs.length})`)}`);\n for (const ref of assetRefs) {\n console.log(` ${colorRef(ref)}`);\n }\n\n if (opts.all) {\n console.log();\n console.log(` ${S.heading(\"Also removing:\")}`);\n if (!isGlobal) {\n console.log(` ${S.dim(\".skaile/history.yaml\")}`);\n console.log(` ${S.dim(\".skaile/patches/\")}`);\n }\n console.log(` ${S.dim(isGlobal ? \"~/.skaile/skaile.lock.yaml\" : \"skaile.lock.yaml\")}`);\n }\n\n if (opts.dryRun) {\n console.log();\n logInfo(\"Dry run — no changes made.\");\n return;\n }\n\n if (!opts.yes) {\n const confirm = await p.confirm({ message: \"Proceed?\" });\n if (p.isCancel(confirm) || !confirm) {\n logInfo(\"Cancelled.\");\n return;\n }\n }\n\n const result = am.clean({ all: opts.all });\n\n console.log();\n for (const r of result.removed) {\n logOk(`Removed ${r}`);\n }\n for (const s of result.skipped) {\n logWarn(`Skipped ${s.ref}: ${s.reason}`);\n }\n if (result.unmanaged.length > 0) {\n console.log();\n logInfo(`Kept ${result.unmanaged.length} unmanaged asset(s):`);\n for (const u of result.unmanaged) {\n console.log(` ${S.dim(u)}`);\n }\n }\n if (opts.all) {\n console.log();\n logOk(\"Full reset complete.\");\n }\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../bridge/src/harness-model-check.ts","../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":["path"],"mappings":"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","file":"chunk-AVRTZAH2.js","sourcesContent":["/**\n * Pre-flight model check: would the harness refuse the selected model before it starts a turn?\n *\n * `skaile run --dry-run` uses it so a setup check learns about a refusal that a real run would\n * print. The codex harness refuses a selection up front when it cannot address the AI provider\n * surface; codex, omp and the Claude SDK refuse a provider nothing serves\n * ({@link checkModelProvider}); every other harness answers `undefined`.\n */\nimport { execFile } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { openSqlite } from \"@skaile/workspaces/core/logging\";\nimport { parse } from \"yaml\";\nimport { buildCodexConfigDocument } from \"./codex/config-toml.js\";\nimport { ompRegistryModelRefusal, registryModelEntries } from \"./harnesses/omp-models-yml.js\";\nimport { sessionSurfaceNotice } from \"./claude-sdk-surface.js\";\nimport { bindSingleProviderEntry } from \"./provider-materialize/env-harnesses.js\";\nimport { AI_PROVIDER_PRESETS } from \"./provider-catalog.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"./registry.js\";\n\n/** What {@link checkHarnessModel} reads. */\nexport interface HarnessModelCheckInput {\n registry?: AIProviderRegistry | MergedAIProviderRegistry;\n /** The model selector: `<providerId>/<modelId>`, a bare id or `@role`. */\n model?: string;\n roles?: Record<string, string>;\n}\n\n/**\n * Providers a harness reaches with its own login, without a registry entry: codex talks to\n * OpenAI, the Claude SDK to Anthropic, omp to every vendor it ships a login for. A harness not\n * listed here (a plugin's, `echo`) is not checked.\n */\nfunction nativeProviders(harnessId: string): ReadonlySet<string> | undefined {\n if (harnessId === \"codex\") return new Set([\"openai\"]);\n if (harnessId === \"claude-sdk\") return new Set([\"anthropic\"]);\n if (harnessId === \"omp\") return new Set(Object.keys(AI_PROVIDER_PRESETS));\n return undefined;\n}\n\n/**\n * What omp can serve on the user's own agent directory (`PI_CODING_AGENT_DIR`, else\n * `~/.omp/agent`): the provider ids their `models.yml` defines, and whether they have a login\n * (a usable credential in `agent.db`), which may carry built-in providers this list cannot name\n * (p1111). The file alone is no login: omp creates an empty `agent.db` on its first start (p1470).\n */\nfunction ompOwnHome(): { providers: ReadonlySet<string>; hasLogin: boolean } {\n const dir = process.env.PI_CODING_AGENT_DIR || path.join(os.homedir(), \".omp\", \"agent\");\n const providers = new Set<string>();\n try {\n const doc = parse(readFileSync(path.join(dir, \"models.yml\"), \"utf-8\")) as {\n providers?: unknown;\n } | null;\n const block = doc?.providers;\n if (block && typeof block === \"object\" && !Array.isArray(block)) {\n for (const id of Object.keys(block)) providers.add(id);\n }\n } catch {\n // no models.yml, or one omp itself will reject\n }\n return { providers, hasLogin: ompHasCredential(path.join(dir, \"agent.db\")) };\n}\n\n/**\n * True when omp's auth store holds a credential that is not disabled. A missing, unreadable or\n * schema-less file holds none. Reads the `auth_credentials` table and its `disabled_cause`\n * column as omp 18.12.6 writes them (checked against that version); a different layout reads\n * as \"no login\", which is the safe side. Read-only: the check never creates or changes the file.\n */\nfunction ompHasCredential(authDb: string): boolean {\n if (!existsSync(authDb)) return false;\n try {\n const db = openSqlite(authDb, { readonly: true });\n try {\n return (\n db\n .prepare(\"SELECT 1 AS found FROM auth_credentials WHERE disabled_cause IS NULL LIMIT 1\")\n .get<{ found: number }>() != null\n );\n } finally {\n db.close();\n }\n } catch {\n return false;\n }\n}\n\n/**\n * `<provider>/<model>` whose provider nothing can serve: not a registry entry and not a\n * provider the harness has its own login for. Without this the id goes to the harness's default\n * provider verbatim and fails there with a message that blames the login.\n *\n * The rule differs per harness (p1111). omp and the Claude SDK route through a registry entry,\n * so while any enabled registry entry is left they take an unknown head as a vendor-scoped\n * model id (`meta-llama/Llama-3.3-70B`). codex talks to OpenAI only and cannot, so it refuses\n * a head that is neither a registered provider nor `openai`, whatever else is registered.\n */\nexport function checkModelProvider(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const native = nativeProviders(harnessId);\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n const slash = selector.indexOf(\"/\");\n if (!native || slash <= 0 || selector.startsWith(\"@\")) return undefined;\n const head = selector.slice(0, slash);\n if (native.has(head)) return undefined;\n const entries = input.registry ? registryEntries(input.registry) : [];\n if (entries.some(([id]) => id === head)) return undefined;\n const servesVendorIds =\n harnessId !== \"codex\" &&\n entries.some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n if (servesVendorIds) return undefined;\n if (harnessId === \"omp\") {\n // With no registry entry omp runs on the user's own agent directory: their `models.yml`\n // providers and the logins omp ships are served there.\n const own = ompOwnHome();\n if (own.providers.has(head) || own.hasLogin) return undefined;\n }\n return `provider '${head}' is not configured: run skaile providers list`;\n}\n\n/**\n * The surface problem of the entry the selected model routes to, for the harnesses that route\n * the model through one registry entry and cannot speak every surface: the Claude Agent SDK\n * (`sessionSurfaceNotice`), and Gemini CLI and Qwen Code (the check they run at start,\n * `bindSingleProviderEntry`). `undefined` for the others and for an entry they speak. `skaile run`\n * and `run --dry-run` print it; `config set model` and `serve` do not judge it.\n */\nexport function checkModelSurface(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const registry = input.registry;\n if (!registry) return undefined;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (harnessId === \"claude-sdk\")\n return selector ? sessionSurfaceNotice(registry, selector) : undefined;\n if (harnessId !== \"gemini\" && harnessId !== \"qwen\") return undefined;\n const merged: MergedAIProviderRegistry = Array.isArray(\n (registry as MergedAIProviderRegistry).order,\n )\n ? (registry as MergedAIProviderRegistry)\n : {\n version: 1,\n providers: registry as AIProviderRegistry,\n order: Object.keys(registry),\n origin: {},\n locked: [],\n };\n try {\n bindSingleProviderEntry(harnessId, BUILTIN_HARNESS_CATALOG[harnessId]?.name ?? harnessId, {\n registry: merged,\n lookupEnv: process.env,\n ...(selector ? { modelRef: selector } : {}),\n });\n } catch (err) {\n return err instanceof Error ? err.message : String(err);\n }\n return undefined;\n}\n\n/**\n * The refusal message the harness prints for this model, or `undefined` when it takes it.\n * The text matches the one the harness throws at start. The provider surface the Claude SDK,\n * Gemini CLI and Qwen Code cannot speak is {@link checkModelSurface}, which `run` adds.\n */\nexport function checkHarnessModel(\n harnessId: string,\n input: HarnessModelCheckInput,\n): string | undefined {\n const unknownProvider = checkModelProvider(harnessId, input);\n if (unknownProvider) return unknownProvider;\n if (harnessId === \"omp\") {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n return ompRegistryModelRefusal(input.registry, selector, nativeProviders(\"omp\") ?? new Set());\n }\n if (harnessId !== \"codex\") return undefined;\n const build = buildCodexConfigDocument({\n registry: input.registry,\n ...(input.model ? { modelRef: input.model, model: input.model } : {}),\n ...(input.roles ? { roles: input.roles } : {}),\n });\n if (!build.unaddressable) return undefined;\n const { id, reason } = build.unaddressable;\n return `AI provider '${id}' cannot be used with the codex harness: ${reason}. Pick a model of another provider.`;\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready, or `undefined`\n * when omp can take the model (p1334). Stricter than {@link checkHarnessModel}, which `run --dry-run`\n * shares: a server answers its first prompt long after start, so a model omp reports as \"not\n * found\" must fail at start.\n *\n * It judges exactly what the harness sends. `materializeOmpProviders` resolves the selector with\n * `parseModelRef` and passes `--model <entry>/<model>` to omp: an `<entry>/<model>` selector goes\n * to that entry, and so does a bare id an entry maps; omp then refuses a model that entry does\n * not declare. An id no entry names or maps (`anthropic/claude-sonnet-4-5`,\n * `meta-llama/Llama-3.3-70B`, `nosuch/foo`) goes on exactly as typed: the registry\n * cannot judge it, so this check answers `undefined` for it, and {@link isUnlistedModel} tells\n * the caller to ask omp itself ({@link checkOmpListedModel}). The refusal names the selector the\n * user typed, never the rewritten one alone.\n */\nexport function checkOmpServeModel(input: HarnessModelCheckInput): string | undefined {\n const registry = input.registry;\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!registry || !selector) return undefined;\n const ref = parseModelRef(selector, registry, input.roles);\n if (!ref?.providerModelId || ref.fallback) return undefined;\n const sent = `${ref.providerId}/${ref.providerModelId}`;\n const refusal = ompRegistryModelRefusal(registry, sent, nativeProviders(\"omp\") ?? new Set());\n if (!refusal) return undefined;\n if (sent === selector) return refusal;\n const detail = refusal.slice(refusal.indexOf(\"': \") + 3);\n return `omp cannot serve model '${selector}': it is sent to omp as '${sent}'; ${detail}`;\n}\n\n/**\n * True when `model` is an id the registry does not list: no entry is named by its head, none maps\n * it, and it is not an `@role`. Such an id goes to the harness as typed, so only the\n * harness itself can say whether it takes it. False with no registry entry to judge against.\n */\nexport function isUnlistedModel(input: HarnessModelCheckInput): boolean {\n let selector = input.model?.trim() ?? \"\";\n if (selector.startsWith(\"@\")) selector = input.roles?.[selector.slice(1)]?.trim() ?? \"\";\n if (!input.registry || !selector) return false;\n return parseModelRef(selector, input.registry, input.roles)?.fallback === true;\n}\n\n/** Thinking levels omp takes as a `:<level>` suffix of a model selector. */\nconst OMP_THINKING_SUFFIX = /:(off|minimal|low|medium|high|xhigh)$/i;\n\n/** Run `omp <args> --json` and return the `models` of its answer, or `undefined` for no answer. */\nfunction ompModels(args: string[], timeoutMs: number): Promise<unknown[] | undefined> {\n const bin = process.env.OMP_BRIDGE_BIN || \"omp\";\n const pre = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n return new Promise((resolve) => {\n execFile(\n bin,\n [...pre, ...args, \"--json\"],\n { timeout: timeoutMs, maxBuffer: 64 * 1024 * 1024, env: process.env },\n (error, out) => {\n if (error) return resolve(undefined);\n try {\n const parsed: unknown = JSON.parse(out);\n const models = Array.isArray(parsed)\n ? parsed\n : parsed && typeof parsed === \"object\" && \"models\" in parsed\n ? parsed.models\n : undefined;\n resolve(Array.isArray(models) ? models : undefined);\n } catch {\n resolve(undefined);\n }\n },\n );\n });\n}\n\n/**\n * The refusal `skaile serve --harness omp --model <x>` prints before it is ready when no registry\n * entry is involved and omp runs on the user's own agent directory, or `undefined` when omp may\n * take the model (p1334). The registry check ({@link checkOmpServeModel}) cannot judge that\n * case: omp's catalog (built-in vendors, `models.yml`, logins) lives in omp.\n *\n * Asks omp itself. `omp models find` is a substring search, but `omp --model` also takes forms it\n * does not match (`anthropic/sonnet-4-5`, `openrouter/~anthropic/claude-sonnet-latest:high`), so\n * a selector is refused only when omp cannot know it: a `:<thinking level>` suffix is dropped, a\n * non-empty `find` answer passes, and an empty one passes too when the selector's `<provider>/`\n * head is a provider omp lists models for. A bare id that matches nothing, or a provider omp does\n * not list, is refused. Anything else (omp missing, a timeout, output that is not the expected\n * JSON) is no verdict, and the harness reports its own failure at start. Honours the\n * `OMP_BRIDGE_BIN` / `OMP_BRIDGE_PREARGS` test seam the harness uses.\n *\n * @param selector - The model as typed (`<provider>/<model>` or a bare id); `@role` is not judged.\n * @param timeoutMs - Total time to wait for omp across both calls (default 20 s).\n */\nexport async function checkOmpListedModel(\n selector: string,\n timeoutMs = 20_000,\n): Promise<string | undefined> {\n const wanted = selector.trim();\n if (!wanted || wanted.startsWith(\"@\")) return undefined;\n const deadline = Date.now() + timeoutMs;\n const query = wanted.replace(OMP_THINKING_SUFFIX, \"\");\n const found = await ompModels([\"models\", \"find\", query], timeoutMs);\n if (!found || found.length > 0) return undefined;\n const refusal = `omp cannot serve model '${wanted}': omp lists no model that matches it. Run \\`omp models\\` to see what it can serve.`;\n const slash = query.indexOf(\"/\");\n if (slash <= 0) return refusal;\n // The budget covers both calls: with no time left there is no verdict.\n const left = deadline - Date.now();\n if (left <= 0) return undefined;\n const all = await ompModels([\"models\"], left);\n if (!all) return undefined;\n const provider = query.slice(0, slash).toLowerCase();\n const known = all.some(\n (m) =>\n typeof m === \"object\" &&\n m !== null &&\n \"provider\" in m &&\n typeof m.provider === \"string\" &&\n m.provider.toLowerCase() === provider,\n );\n return known ? undefined : refusal;\n}\n","/**\n * EventNormalizer — converts bridge-level AgentEvent (raw harness events) to\n * skaile-agent-types AgentEvent (normalized, human-readable events).\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call reset() between sessions.\n */\n\nimport {\n type AgentEvent as NormalizedEvent,\n type NativeApprovalDescription,\n stripActivityLabel,\n TOOL_ACTIVITY_LABEL_MAX_CHARS,\n TOOL_ACTIVITY_LABEL_PARAM,\n} from \"@skaile/workspaces/types\";\nimport { classifyClaudeSdkError } from \"./error-classifier.js\";\nimport type { AgentMessage, AgentEvent as BridgeEvent, ContentBlock } from \"./types.js\";\n\n/**\n * The optional usage keys a `result` event carries, in the shape both\n * `finished` and a result-sourced `error` emit them. Absent keys stay absent.\n */\nfunction resultUsageFields(\n event: Pick<\n Extract<BridgeEvent, { type: \"result\" | \"error\" }>,\n \"tokens\" | \"modelUsage\" | \"contextTokens\" | \"contextWindow\"\n >,\n) {\n return {\n ...(event.tokens ? { tokens: event.tokens } : {}),\n ...(event.modelUsage ? { modelUsage: event.modelUsage } : {}),\n ...(typeof event.contextTokens === \"number\" ? { contextTokens: event.contextTokens } : {}),\n ...(typeof event.contextWindow === \"number\" ? { contextWindow: event.contextWindow } : {}),\n };\n}\n\n/**\n * The tool a harness uses to park a turn on a human answer. Both branches that\n * recognise it must use this constant: `message_start` turns it into a\n * `question`, and `tool_call` must then stay silent about it.\n */\nconst QUESTION_TOOL = \"AskUserQuestion\";\n\nconst MAX_ANNOUNCED_TOOL_USES = 64;\n\n/**\n * Bridge `tool_call` inputs are loosely typed: Codex MCP arguments may arrive\n * as a JSON string, and the echo harness passes a bare path.\n */\nfunction toolInputRecord(input: unknown): Record<string, unknown> {\n let value = input;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n return { input };\n }\n }\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return value === undefined ? {} : { input };\n}\n\n/**\n * Converts raw bridge-level {@link BridgeEvent} payloads into normalized\n * `@skaile/workspaces/types` `AgentEvent` payloads consumed by the runner and transport.\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call {@link EventNormalizer.reset} between sessions to clear accumulated state.\n *\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport class EventNormalizer {\n private activeSubagents = new Map<string, string>();\n private devServerStartingEmitted = false;\n /** Dev-server URLs already announced as ready: each server once, a second one too. */\n private announcedDevServers = new Set<string>();\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n /**\n * True once a `_thinkingDelta` run has been reported as `status: thinking`;\n * cleared by the next text delta or assistant message, so a run reports once.\n */\n private thinkingAnnounced = false;\n /**\n * tool_use blocks `message_start` already reported, awaiting the harness's\n * matching bridge `tool_call` — which must then not report the call again.\n */\n private announcedToolUses: Array<{ id?: string; name: string }> = [];\n\n /**\n * Convert a single bridge event into zero or more normalized events.\n * One bridge event can produce multiple normalized events (e.g., a message_start\n * with text + tool_use blocks produces both text and tool_call events).\n */\n normalize(event: BridgeEvent): NormalizedEvent[] {\n switch (event.type) {\n case \"message_start\":\n return this.handleMessageStart(event.message);\n\n case \"message_update\":\n return this.handleMessageUpdate(event);\n\n case \"message_end\":\n return [];\n\n case \"message_retract\":\n // The replay streams its reply afresh, so its deltas (or, failing\n // those, its message_start text) must count as a new message.\n this.hasStreamedText = false;\n return event.text ? [{ type: \"text_retract\", content: event.text }] : [];\n\n case \"turn_end\":\n return this.handleTurnEnd(event.toolResults);\n\n case \"result\":\n return this.handleResult(event);\n\n case \"error\":\n this.announcedToolUses = [];\n return [\n {\n type: \"error\",\n message: event.error,\n fatal: event.fatal ?? true,\n category: event.detail?.category,\n ...(event.detail?.hint ? { hint: event.detail.hint } : {}),\n ...resultUsageFields(event),\n ...(event.retrying === true\n ? { retrying: true, ...(event.retryReason ? { retryReason: event.retryReason } : {}) }\n : {}),\n ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n\n case \"background_task_started\":\n return [{ type: \"background_task_started\", taskId: event.taskId }];\n\n case \"self_turn_started\":\n return [{ type: \"self_turn_started\", taskIds: [...event.taskIds] }];\n\n case \"tool_call\": {\n // The question tool parks the turn on the user's answer, so reporting\n // work here would undo the idle its `question` event just set, and\n // nothing follows to correct it while the user reads the prompt.\n const toolName = event.name ?? event.tool?.name;\n if (toolName === QUESTION_TOOL) return [];\n // A harness that also sent the call as a `message_start` tool_use block\n // (Claude) was already reported there; the rest only ever send this.\n if (!toolName || this.consumeAnnouncedToolUse(toolName, event.toolCallId)) {\n return [{ type: \"status\", phase: \"working\" }];\n }\n return this.handleToolUse(\n {\n type: \"tool_use\",\n id: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n name: toolName,\n input: toolInputRecord(event.input),\n },\n typeof event.parentToolUseId === \"string\" ? event.parentToolUseId : undefined,\n );\n }\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n this.announcedToolUses = [];\n return [{ type: \"status\", phase: \"idle\" }];\n\n case \"commands_available\":\n // Pass through to transport — the gateway caches this event\n return [event as unknown as NormalizedEvent];\n\n case \"session_info\":\n // Pass through to transport — the forge layer stores the OMP session ID\n return [event as unknown as NormalizedEvent];\n\n case \"ui_render\":\n case \"ui_render_update\":\n case \"ui_clear\":\n // Pass through verbatim — harnesses that implement the Agent UI Protocol emit these directly\n return [event as unknown as NormalizedEvent];\n\n default:\n return [];\n }\n }\n\n /** Clear all stateful tracking between sessions. */\n reset(): void {\n this.activeSubagents.clear();\n this.devServerStartingEmitted = false;\n this.announcedDevServers.clear();\n this.hasStreamedText = false;\n this.thinkingAnnounced = false;\n this.announcedToolUses = [];\n }\n\n private consumeAnnouncedToolUse(name: string, id: unknown): boolean {\n const callId = typeof id === \"string\" ? id : undefined;\n const index = this.announcedToolUses.findIndex(\n (entry) => entry.name === name && (!callId || !entry.id || entry.id === callId),\n );\n if (index === -1) return false;\n this.announcedToolUses.splice(index, 1);\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Harnesses (e.g. omp) may echo the user's\n // message as a message_start with role:\"user\" before streaming the response.\n // Emitting a text event for that echo would prepend the user's input to the\n // assistant bubble on the frontend.\n if (message.role !== \"assistant\") return [];\n\n // A subagent's message is not the main reply: its text belongs to the\n // subagent's own result, and it must not reset the main stream's state.\n const parentToolUseId = message.parentToolUseId;\n const events: NormalizedEvent[] = [];\n const blocks = this.getContentBlocks(message);\n\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n if (parentToolUseId) continue;\n // Skip full text if we already streamed it via message_update deltas\n if (!this.hasStreamedText) {\n events.push({ type: \"text\", content: block.text });\n }\n } else if (block.type === \"tool_use\" && block.name) {\n if (block.name !== QUESTION_TOOL) {\n this.announcedToolUses.push({ id: block.id, name: block.name });\n // Bounded in case a harness never echoes a block as a tool_call.\n if (this.announcedToolUses.length > MAX_ANNOUNCED_TOOL_USES) {\n this.announcedToolUses.shift();\n }\n }\n events.push(...this.handleToolUse(block, parentToolUseId));\n }\n }\n\n if (!parentToolUseId) this.hasStreamedText = false;\n if (!parentToolUseId) this.thinkingAnnounced = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock, parentToolUseId?: string): NormalizedEvent[] {\n const name = block.name!;\n const input = (block.input ?? {}) as Record<string, unknown>;\n\n if (name === QUESTION_TOOL) {\n return this.handleAskUserQuestion(input);\n }\n if (name === \"Agent\") {\n return this.handleAgentToolUse(block, input);\n }\n return this.handleGenericToolUse(name, input, parentToolUseId);\n }\n\n private handleAskUserQuestion(input: Record<string, unknown>): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const candidate = input.approval as Partial<NativeApprovalDescription> | undefined;\n const approval =\n candidate &&\n [\"command\", \"file\", \"permissions\", \"mcp\"].includes(candidate.kind ?? \"\") &&\n Array.isArray(candidate.details) &&\n candidate.details.length > 0 &&\n candidate.details.length <= 64 &&\n candidate.details.every((detail) => typeof detail === \"string\" && detail.length <= 8192) &&\n candidate.details.reduce((total, detail) => total + detail.length, 0) <= 65536\n ? (candidate as NativeApprovalDescription)\n : undefined;\n if (Object.hasOwn(input, \"approval\") && !approval) return [];\n // Claude SDK sends { questions: [{ question, header, options: [{ label, description }] }] }\n // Legacy/simple format sends { question: string, options?: string[] }\n const questions = input.questions;\n if (Array.isArray(questions)) {\n for (const q of questions) {\n const qObj = q as Record<string, unknown>;\n const question = String(qObj.question ?? \"\");\n const rawOpts = qObj.options;\n const options = Array.isArray(rawOpts)\n ? rawOpts.map((o: any) => (typeof o === \"string\" ? o : String(o.label ?? o)))\n : undefined;\n events.push({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\n }\n } else {\n const question = String(input.question ?? input.text ?? \"\");\n const rawOptions = input.options;\n const options = Array.isArray(rawOptions) ? rawOptions.map(String) : undefined;\n events.push({\n type: \"question\",\n question,\n options,\n ...(typeof input.requestId === \"string\" ? { requestId: input.requestId } : {}),\n ...(approval ? { approval } : {}),\n });\n }\n return events;\n }\n\n private handleAgentToolUse(\n block: ContentBlock,\n input: Record<string, unknown>,\n ): NormalizedEvent[] {\n const agentName = String(input.subagent_type ?? input.description ?? \"unknown\");\n const description = String(input.description ?? input.prompt ?? \"\").slice(0, 200);\n if (block.id) {\n this.activeSubagents.set(block.id, agentName);\n }\n return [\n { type: \"subagent\", name: agentName, status: \"started\", description },\n { type: \"status\", phase: \"working\" },\n ];\n }\n\n private handleGenericToolUse(\n name: string,\n input: Record<string, unknown>,\n parentToolUseId?: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const label = labelToolCall(name, input);\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n // Summarize without the label: it would eat the default branch's\n // 100-char argument budget and push the real args out.\n summary: summarizeToolCall(name, stripActivityLabel(input)),\n ...(label ? { label } : {}),\n ...(parentToolUseId ? { parentToolUseId } : {}),\n });\n events.push({ type: \"status\", phase: \"working\" });\n\n if (name === \"Bash\" && typeof input.command === \"string\") {\n const devEvent = this.detectDevServerStarting(input.command);\n if (devEvent) events.push(devEvent);\n }\n\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // message_update → streaming text\n // ---------------------------------------------------------------------------\n\n private handleMessageUpdate(event: BridgeEvent): NormalizedEvent[] {\n // Bridge deltas carry no subagent tag: a harness must drop a subagent's\n // partials itself (claude-sdk does in handleStreamEvent), or they read as main text.\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n this.thinkingAnnounced = false;\n return [{ type: \"text\", content: delta }];\n }\n // The protocol has no thinking-content event, so reasoning surfaces as the\n // existing `thinking` phase, once per run. The text is never forwarded as\n // `text`; a harness keeps it out of `_textDelta`.\n const thinking: unknown = \"_thinkingDelta\" in event ? event._thinkingDelta : undefined;\n if (typeof thinking === \"string\" && thinking && !this.thinkingAnnounced) {\n this.thinkingAnnounced = true;\n return [{ type: \"status\", phase: \"thinking\" }];\n }\n return [];\n }\n\n // ---------------------------------------------------------------------------\n // turn_end → tool_result, subagent finished, file_changed, dev_server\n // ---------------------------------------------------------------------------\n\n private handleTurnEnd(toolResults?: AgentMessage[]): NormalizedEvent[] {\n if (!toolResults?.length) return [];\n\n const events: NormalizedEvent[] = [];\n\n for (const result of toolResults) {\n const toolName = result.toolName ?? \"unknown\";\n const outputData = result.data ?? result.content;\n const output = typeof outputData === \"string\" ? outputData : JSON.stringify(outputData);\n\n // Check if this is a subagent result\n if (toolName === \"Agent\" || this.isSubagentResult(result)) {\n events.push(...this.handleSubagentResult(result, output));\n } else {\n events.push(...this.handleToolResult(toolName, outputData, output, result.parentToolUseId));\n }\n }\n\n return events;\n }\n\n private handleSubagentResult(result: AgentMessage, output: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n const agentName = this.resolveSubagentName(result);\n const description = output.slice(0, 200);\n events.push({ type: \"subagent\", name: agentName, status: \"finished\", description });\n\n if (agentName === \"dev-server\") events.push(...this.detectDevServerReady(output));\n return events;\n }\n\n private handleToolResult(\n toolName: string,\n outputData: unknown,\n output: string,\n parentToolUseId?: string,\n ): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n events.push({\n type: \"tool_result\",\n tool: toolName,\n output: outputData,\n summary: summarizeToolResult(toolName, outputData),\n ...(parentToolUseId ? { parentToolUseId } : {}),\n });\n\n // Detect file changes from Write/Edit results\n const fileEvents = detectFileChanges(toolName, outputData);\n if (fileEvents.length > 0) events.push(...fileEvents);\n\n // Detect dev servers from Bash output\n if (toolName === \"Bash\") events.push(...this.detectDevServerReady(output));\n return events;\n }\n\n private isSubagentResult(result: AgentMessage): boolean {\n // Check if the tool result's id maps to a tracked subagent\n if (result.toolName && this.activeSubagents.has(result.toolName)) return true;\n return false;\n }\n\n private resolveSubagentName(result: AgentMessage): string {\n // toolName on bridge AgentMessage is resolved from toolIdToName in the harness\n const name = result.toolName ? this.activeSubagents.get(result.toolName) : undefined;\n if (name) {\n this.activeSubagents.delete(result.toolName!);\n return name;\n }\n return result.toolName ?? \"unknown\";\n }\n\n // ---------------------------------------------------------------------------\n // result → finished or error\n // ---------------------------------------------------------------------------\n\n private handleResult(event: BridgeEvent & { type: \"result\" }): NormalizedEvent[] {\n const usage = resultUsageFields(event);\n if (event.subtype === \"success\") {\n return [\n {\n type: \"finished\",\n summary: event.summary ?? \"Task completed\",\n costUsd: event.costUsd ?? 0,\n ...usage,\n ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk harness uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (harnesses other than claude-sdk emit `result` without a paired\n // `error`, so this is the only place they get classified).\n const detail = classifyClaudeSdkError({ errors, subtype: event.subtype });\n // The turn billed even though it failed: carry its usage so a ledger\n // that only writes on `finished` can write here too. Unlike the finished\n // branch, no `costUsd: 0` fallback — an absent figure stays absent.\n return [\n {\n type: \"error\",\n message: `Agent stopped: ${event.subtype}${errors.length ? ` — ${errors.join(\"; \")}` : \"\"}`,\n fatal: event.subtype === \"error_during_execution\",\n category: detail.category,\n ...(detail.hint ? { hint: detail.hint } : {}),\n ...(typeof event.costUsd === \"number\" ? { costUsd: event.costUsd } : {}),\n ...usage,\n ...(event.selfStarted === true ? { selfStarted: true as const } : {}),\n },\n ];\n }\n\n // ---------------------------------------------------------------------------\n // Dev server detection\n // ---------------------------------------------------------------------------\n\n private detectDevServerStarting(command: string): NormalizedEvent | null {\n if (this.devServerStartingEmitted) return null;\n const cmd = command.toLowerCase();\n const isFrontendStart =\n (cmd.includes(\"pnpm run dev\") || cmd.includes(\"pnpm dev\") || cmd.includes(\"vite\")) &&\n (cmd.includes(\"frontend\") || cmd.includes(\"dev:preview\"));\n if (isFrontendStart) {\n this.devServerStartingEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"starting\" };\n }\n return null;\n }\n\n /** One `ready` event per URL in `text` not announced before in this session. */\n private detectDevServerReady(text: string): NormalizedEvent[] {\n const events: NormalizedEvent[] = [];\n for (const url of devServerReadyUrls(text)) {\n if (this.announcedDevServers.has(url)) continue;\n this.announcedDevServers.add(url);\n events.push({ type: \"dev_server\", url, status: \"ready\" });\n }\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private getContentBlocks(message: AgentMessage): ContentBlock[] {\n if (Array.isArray(message.content)) return message.content;\n if (typeof message.content === \"string\" && message.content) {\n return [{ type: \"text\", text: message.content }];\n }\n return [];\n }\n}\n\nconst ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n/**\n * CSI (`ESC [ … m`, cursor moves) and OSC (`ESC ] … BEL`, hyperlinks) escape sequences, plus\n * CSI written as the text `\\u001b[` / `\\x1b[`: a non-string tool result reaches the detector\n * JSON-encoded, which spells ESC out.\n */\nconst ANSI_ESCAPE = new RegExp(\n `(?:${ESC}|\\\\\\\\u001b|\\\\\\\\x1b)\\\\[[0-?]*[ -/]*[@-~]|${ESC}\\\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\\\\\)`,\n \"g\",\n);\n\n/** A dev server's `Local:` line on a loopback host (Vite, Nuxt, Storybook, Next). */\nconst LOCAL_URL = /Local:\\s+(https?):\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0):(\\d+)\\/?/g;\nconst EXPLICIT_URL = /DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/g;\n\n/**\n * The URLs a dev server's ready output announces, without duplicates; empty\n * when there are none. One output can hold several servers\n * (`concurrently \"vite\" \"storybook dev\"`, a combined log). Explicit\n * `DEVSERVER_READY:<url>` lines come first (a bare trailing `/` after the\n * port dropped, so it matches the `Local:` form), then every `Local:` line, after\n * stripping ANSI colours, on any loopback host, announced as `localhost` (what\n * a browser opens; `0.0.0.0` is not one). `FRONTEND_READY` →\n * `http://localhost:3000` only when neither is present. A `Network:` line (LAN\n * address) never matches.\n */\nfunction devServerReadyUrls(text: string): string[] {\n const explicit = [...text.matchAll(EXPLICIT_URL)].map((m) =>\n m[1]!.replace(/^(https?:\\/\\/[^/]+)\\/$/, \"$1\"),\n );\n const local = [...text.replace(ANSI_ESCAPE, \"\").matchAll(LOCAL_URL)].map(\n (m) => `${m[1]}://localhost:${m[2]}`,\n );\n const urls = [...new Set([...explicit, ...local])];\n if (urls.length > 0) return urls;\n return text.includes(\"FRONTEND_READY\") ? [\"http://localhost:3000\"] : [];\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable one-line summary of a tool call for the activity log.\n *\n * Returns a string like `$ git status` for Bash, `Read src/index.ts` for Read, etc.\n * Falls back to `ToolName({...input...})` for unrecognised tools.\n *\n * @param tool - Tool name (e.g. `\"Bash\"`, `\"Write\"`, `\"Grep\"`).\n * @param input - Tool input record passed to the call.\n * @returns A short display string suitable for the activity feed.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolCall(tool: string, input: Record<string, unknown>): string {\n // A harness that sent a bare value instead of named args has it under `input`.\n const arg = (key: string) => String(input[key] ?? input.input);\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? input.input ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${arg(\"file_path\")}`;\n case \"Edit\":\n return `Edit ${arg(\"file_path\")}`;\n case \"Read\":\n return `Read ${arg(\"file_path\")}`;\n case \"Glob\":\n return `Find ${arg(\"pattern\")}`;\n case \"Grep\":\n return `Search for ${arg(\"pattern\")}`;\n case \"ApplyPatch\": {\n // Paths only: stringifying the input would serialize every full diff.\n const changes = Array.isArray(input.changes) ? input.changes : [];\n const paths = changes\n .map((change) => (change as { path?: unknown } | null)?.path)\n .filter((path): path is string => typeof path === \"string\");\n return `Edit ${paths.join(\", \").slice(0, 200) || \"files\"}`;\n }\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/**\n * Produce the plain-language label shown to non-technical users while a tool\n * call runs: the agent's own `activity_label`, Bash's `description`, else a\n * derived phrase for Claude Code built-ins. `undefined` for any other tool —\n * the UI then falls back to a generic \"working\" line rather than raw input.\n *\n * @param tool - Tool name as the model called it.\n * @param input - Tool input record, still carrying `activity_label`.\n * @returns A trimmed label capped at `TOOL_ACTIVITY_LABEL_MAX_CHARS`, or `undefined`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function labelToolCall(tool: string, input: Record<string, unknown>): string | undefined {\n const authored =\n nonEmpty(input[TOOL_ACTIVITY_LABEL_PARAM]) ??\n (tool === \"Bash\" ? nonEmpty(input.description) : undefined);\n const label = authored ?? builtinToolLabel(tool, input);\n if (!label) return undefined;\n return label.length > TOOL_ACTIVITY_LABEL_MAX_CHARS\n ? `${label.slice(0, TOOL_ACTIVITY_LABEL_MAX_CHARS - 1).trimEnd()}…`\n : label;\n}\n\nfunction nonEmpty(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction builtinToolLabel(tool: string, input: Record<string, unknown>): string | undefined {\n switch (tool) {\n case \"Read\":\n return withTarget(\"Reading\", baseName(input.file_path));\n case \"Edit\":\n case \"MultiEdit\":\n case \"NotebookEdit\":\n return withTarget(\"Editing\", baseName(input.file_path ?? input.notebook_path));\n case \"Write\":\n return withTarget(\"Creating\", baseName(input.file_path));\n case \"Grep\":\n case \"Glob\":\n return \"Searching files\";\n case \"WebSearch\":\n return \"Searching the web\";\n case \"WebFetch\":\n return withTarget(\"Fetching\", hostOf(input.url), \"a web page\");\n case \"TodoWrite\":\n return \"Updating the task list\";\n case \"ApplyPatch\":\n return \"Editing files\";\n default:\n return undefined;\n }\n}\n\nfunction withTarget(verb: string, target: string | undefined, fallback = \"a file\"): string {\n return `${verb} ${target ?? fallback}`;\n}\n\nfunction baseName(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n return value.split(/[\\\\/]/).filter(Boolean).pop();\n}\n\nfunction hostOf(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n try {\n return new URL(value).host || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Extract plain text from an Anthropic content-block array (e.g. tool results returned by Claude SDK). */\nfunction extractContentBlockText(blocks: unknown[]): string | null {\n const textBlocks = blocks.filter(\n (b): b is { type: \"text\"; text: string } =>\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\" &&\n typeof (b as Record<string, unknown>).text === \"string\",\n );\n if (textBlocks.length === 0) return null;\n return textBlocks.map((b) => b.text).join(\"\\n\");\n}\n\n/**\n * Produce a human-readable one-line summary of a tool result for the activity log.\n *\n * Handles Bash stdout/stderr, Write/Edit file paths, ApplyPatch change counts, and\n * Anthropic content-block arrays. Falls back to `JSON.stringify` for unknown shapes.\n *\n * @param tool - Tool name.\n * @param result - Raw tool result payload.\n * @returns A short display string, truncated to 200 characters.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolResult(tool: string, result: unknown): string {\n // Handle Anthropic content-block arrays: [{ type: \"text\", text: \"...\" }, ...]\n if (Array.isArray(result)) {\n const text = extractContentBlockText(result);\n return (text ?? JSON.stringify(result)).slice(0, 200);\n }\n if (typeof result !== \"object\" || !result) {\n return String(result).slice(0, 200);\n }\n const r = result as Record<string, unknown>;\n switch (tool) {\n case \"Bash\": {\n const stderr = String(r.stderr ?? \"\").trim();\n if (stderr) return `stderr: ${stderr.slice(0, 200)}`;\n return (\n String(r.stdout ?? \"\")\n .trim()\n .slice(0, 200) || \"(no output)\"\n );\n }\n case \"Write\":\n return `${String(r.type)}: ${String(r.filePath)}`;\n case \"Edit\":\n return `Edited ${String(r.filePath)}`;\n case \"ApplyPatch\":\n return `${Array.isArray(r.changes) ? r.changes.length : 0} file changes`;\n default:\n return JSON.stringify(result).slice(0, 200);\n }\n}\n\n/**\n * Detect file-change events from a tool result, returning zero or more `file_changed` events.\n *\n * Handles `Write` (single create/edit), `Edit` (single edit), and `ApplyPatch` (multi-file\n * patch with per-change `kind` classification). Returns an empty array for all other tools.\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns Array of `file_changed` normalized events.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChanges(toolName: string, result: unknown): NormalizedEvent[] {\n if (typeof result !== \"object\" || !result) return [];\n const r = result as Record<string, unknown>;\n\n if (toolName === \"Write\" && r.filePath) {\n return [\n {\n type: \"file_changed\",\n path: String(r.filePath),\n action: r.type === \"create\" ? \"create\" : \"edit\",\n },\n ];\n }\n if (toolName === \"Edit\" && r.filePath) {\n return [{ type: \"file_changed\", path: String(r.filePath), action: \"edit\" }];\n }\n if (toolName === \"ApplyPatch\" && Array.isArray(r.changes)) {\n return r.changes\n .filter(\n (change): change is { path: string; kind: \"add\" | \"delete\" | \"update\" } =>\n typeof change === \"object\" &&\n change !== null &&\n typeof (change as Record<string, unknown>).path === \"string\" &&\n typeof (change as Record<string, unknown>).kind === \"string\",\n )\n .map((change) => ({\n type: \"file_changed\" as const,\n path: change.path,\n action: change.kind === \"add\" ? \"create\" : change.kind === \"delete\" ? \"delete\" : \"edit\",\n }));\n }\n\n return [];\n}\n\n/**\n * Backward-compatible single-event helper; returns the first `file_changed` event or `null`.\n *\n * Prefer {@link detectFileChanges} for multi-file patches (e.g. `ApplyPatch`).\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns First detected `file_changed` event, or `null`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChange(toolName: string, result: unknown): NormalizedEvent | null {\n return detectFileChanges(toolName, result)[0] ?? null;\n}\n","/**\n * BridgeRuntime — implements IAgentRuntime from @skaile/workspaces/types by wrapping\n * an AgentHarness + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any harness.\n */\n\nimport type {\n AgentEvent,\n AgentPromptInput,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { toMergedRegistry } from \"./provider-registry-derive.js\";\nimport { createHarness } from \"./registry.js\";\nimport type { AgentConfig, AgentHarness } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentHarness}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any harness without managing the harness lifecycle directly. Create via\n * {@link createRuntime} to avoid coupling to `BridgeRuntime` directly.\n *\n * @docLink packages/bridge/api-reference#runtime\n */\nexport class BridgeRuntime implements IAgentRuntime {\n private harness: AgentHarness | null = null;\n private normalizer = new EventNormalizer();\n private handlers = new Set<(event: AgentEvent) => void>();\n private boundEventHandler: ((event: any) => void) | null = null;\n private harnessId: string;\n\n constructor(harnessId: string = \"claude-sdk\") {\n this.harnessId = harnessId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous harness if any\n if (this.harness) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n model: config.model,\n systemPrompt: config.systemPrompt,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n ...(config.registry ? { registry: toMergedRegistry(config.registry, \"runtime\") } : {}),\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n };\n\n this.harness = await createHarness(this.harnessId, bridgeConfig);\n\n // Wire bridge events through normalizer to handlers\n this.boundEventHandler = (bridgeEvent: any) => {\n const normalized = this.normalizer.normalize(bridgeEvent);\n for (const event of normalized) {\n for (const handler of this.handlers) {\n handler(event);\n }\n }\n };\n this.harness.on(\"agent-event\", this.boundEventHandler);\n\n await this.harness.start();\n }\n\n async configure(_config: AgentReconfigureOptions): Promise<void> {\n // Runtime reconfiguration for BridgeRuntime is a no-op for now.\n // Future: reconnect connectors, reload ai-assets, update subagents.\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.prompt(message);\n }\n\n async promptInput(input: AgentPromptInput): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\n await this.harness.promptInput(input);\n }\n\n async reply(answer: string, question?: string, requestId?: string): Promise<void> {\n if (!this.harness) throw new Error(\"Runtime not started — call start() first\");\n // Mirror serve.ts handleReply: an answer must resume the paused turn. Falling through to\n // prompt() would deny the question as superseded and drop the structured answer.\n if (\n this.harness?.hasPendingQuestion() &&\n this.harness.answerQuestion(answer, question, requestId)\n )\n return;\n if (this.harness?.acceptsReplyAsPrompt) await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.harness) {\n await this.harness.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.harness) {\n if (this.boundEventHandler) {\n this.harness.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.harness.kill();\n this.harness = null;\n }\n this.normalizer.reset();\n }\n\n onEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.add(handler);\n }\n\n offEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.delete(handler);\n }\n\n get isRunning(): boolean {\n return this.harness?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified harness.\n *\n * @param harnessId - Registered harness id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected harness with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(harnessId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(harnessId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\nimport {\n buildCredentialHeaders,\n expandPreset,\n getProviderPreset,\n resolvePresetBaseUrl,\n resolveProbeUrl,\n} from \"./provider-catalog.js\";\n\n/**\n * Result of an API key validation check performed by {@link validateApiKey}.\n *\n * @docLink packages/bridge/api-reference#validation\n */\nexport interface ValidationResult {\n /** `true` when the API key was accepted by the provider's models endpoint. */\n ok: boolean;\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n}\n\n/**\n * Validate an API key by sending a lightweight GET request to the provider's models endpoint.\n *\n * Returns `{ ok: true }` when the provider accepts the key (HTTP 2xx). Returns\n * `{ ok: false, error }` on 401/403 (invalid key), other HTTP errors, network failures,\n * or unsupported providers. Requests time out after 8 seconds.\n *\n * @param provider - Catalog preset id (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param key - API key to validate.\n * @param options - Optional base-URL / environment overrides; defaults to the\n * provider's own API, or its `base_url_env` value when one is set.\n * @returns Validation result with optional error description.\n * @docLink packages/bridge/api-reference#validation\n */\nexport async function validateApiKey(\n provider: string,\n key: string,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): Promise<ValidationResult> {\n const preset = getProviderPreset(provider);\n if (!preset) return { ok: false, error: `Unknown provider: ${provider}` };\n\n // Validate against the same endpoint discovery/dispatch use: behind a gateway\n // the key is the gateway's, and the provider's public API would reject it.\n const baseUrl = resolvePresetBaseUrl(preset, {\n ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),\n env: options.env ?? process.env,\n });\n const entry = expandPreset(preset, baseUrl ? { baseUrl } : {});\n const url = resolveProbeUrl(entry);\n if (!url) return { ok: false, error: `Provider ${provider} exposes no models endpoint` };\n // Static non-secret headers (Anthropic's `anthropic-version`) plus the\n // credential carrier the preset's `auth_header` names.\n const headers = { ...entry.headers, ...buildCredentialHeaders(entry, key) };\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) return { ok: true };\n\n const status = response.status;\n if (status === 401 || status === 403) {\n return { ok: false, error: \"Invalid API key (authentication failed)\" };\n }\n return { ok: false, error: `API returned HTTP ${status}` };\n } catch (err: any) {\n if (err.name === \"AbortError\") return { ok: false, error: \"Request timed out (8s)\" };\n return { ok: false, error: err.message ?? \"Network error\" };\n }\n}\n"]}
|