@skaile/workspaces 5.11.0 → 5.12.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 +97 -0
- package/README.md +2 -2
- package/dist/{asset-feeds-CXGQIDFR.js → asset-feeds-AM6PSSGM.js} +24 -21
- package/dist/asset-feeds-AM6PSSGM.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +8 -8
- package/dist/asset-manager/fragments.js +1 -1
- package/dist/asset-manager/index.js +16 -16
- package/dist/asset-manager/installer.js +11 -11
- package/dist/asset-manager/renderers.js +9 -9
- package/dist/asset-manager/src/fragments.d.ts +5 -0
- package/dist/asset-manager/src/fragments.d.ts.map +1 -1
- package/dist/asset-manager/src/index.d.ts +95 -10
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/install-agent.d.ts +9 -1
- package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts +10 -0
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/asset-manager/src/renderers.d.ts +5 -0
- package/dist/asset-manager/src/renderers.d.ts.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +16 -13
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +43 -16
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/continue.js +10 -10
- package/dist/bridge/drivers/echo.js +2 -2
- package/dist/bridge/drivers/gemini.js +7 -7
- package/dist/bridge/drivers/goose.js +10 -10
- package/dist/bridge/drivers/omp.js +37 -10
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +10 -10
- package/dist/bridge/drivers/qwen.js +7 -7
- package/dist/bridge/index.js +12 -12
- package/dist/bridge/src/codex/config-toml.d.ts +8 -3
- package/dist/bridge/src/codex/config-toml.d.ts.map +1 -1
- package/dist/bridge/src/codex/managed-driver.d.ts.map +1 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts +1 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp.d.ts +9 -0
- package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/credential-env.d.ts +15 -0
- package/dist/bridge/src/provider-materialize/credential-env.d.ts.map +1 -1
- package/dist/{chunk-4A4OD24G.js → chunk-27L6BBAT.js} +9 -9
- package/dist/{chunk-4A4OD24G.js.map → chunk-27L6BBAT.js.map} +1 -1
- package/dist/{chunk-HCEVNYSH.js → chunk-2JFIFDDO.js} +3 -3
- package/dist/{chunk-HCEVNYSH.js.map → chunk-2JFIFDDO.js.map} +1 -1
- package/dist/{chunk-3SM2DL2T.js → chunk-2X3JBVGD.js} +11 -10
- package/dist/chunk-2X3JBVGD.js.map +1 -0
- package/dist/{chunk-G4FFOV3N.js → chunk-3HUV2LJF.js} +4 -4
- package/dist/{chunk-G4FFOV3N.js.map → chunk-3HUV2LJF.js.map} +1 -1
- package/dist/{chunk-QZNJOHN6.js → chunk-3LVB3HGH.js} +3 -3
- package/dist/{chunk-QZNJOHN6.js.map → chunk-3LVB3HGH.js.map} +1 -1
- package/dist/{chunk-ZCAJZ4B2.js → chunk-6VLHITAM.js} +145 -3
- package/dist/chunk-6VLHITAM.js.map +1 -0
- package/dist/{chunk-J4RBUFGM.js → chunk-7CR2OZPA.js} +6 -6
- package/dist/{chunk-J4RBUFGM.js.map → chunk-7CR2OZPA.js.map} +1 -1
- package/dist/{chunk-HZXUXHIV.js → chunk-7QWQTA5S.js} +89 -12
- package/dist/chunk-7QWQTA5S.js.map +1 -0
- package/dist/{chunk-TCHRMVTO.js → chunk-7XWUJC3A.js} +4 -4
- package/dist/{chunk-TCHRMVTO.js.map → chunk-7XWUJC3A.js.map} +1 -1
- package/dist/{chunk-2F5AWQX5.js → chunk-C3BMXXTN.js} +137 -31
- package/dist/chunk-C3BMXXTN.js.map +1 -0
- package/dist/{chunk-ZPWTOUTK.js → chunk-CTP3XBMF.js} +7 -4
- package/dist/chunk-CTP3XBMF.js.map +1 -0
- package/dist/{chunk-GCHPUTA3.js → chunk-DCHQ6BAZ.js} +3 -3
- package/dist/{chunk-GCHPUTA3.js.map → chunk-DCHQ6BAZ.js.map} +1 -1
- package/dist/{chunk-DALV4HHP.js → chunk-DKXNKFKP.js} +3 -2
- package/dist/{chunk-DALV4HHP.js.map → chunk-DKXNKFKP.js.map} +1 -1
- package/dist/{chunk-X77SUM4P.js → chunk-G3X4MLDB.js} +3 -3
- package/dist/{chunk-X77SUM4P.js.map → chunk-G3X4MLDB.js.map} +1 -1
- package/dist/{chunk-CAHB6MHA.js → chunk-GWD3QNVS.js} +5 -5
- package/dist/{chunk-CAHB6MHA.js.map → chunk-GWD3QNVS.js.map} +1 -1
- package/dist/chunk-H5U7LNTJ.js +122 -0
- package/dist/chunk-H5U7LNTJ.js.map +1 -0
- package/dist/{chunk-QVFAS5IO.js → chunk-HYMERG57.js} +3 -3
- package/dist/{chunk-QVFAS5IO.js.map → chunk-HYMERG57.js.map} +1 -1
- package/dist/{chunk-R7NHYEJF.js → chunk-ICIYSJBQ.js} +4 -4
- package/dist/{chunk-R7NHYEJF.js.map → chunk-ICIYSJBQ.js.map} +1 -1
- package/dist/{chunk-YOH2L76X.js → chunk-ID745F3R.js} +353 -233
- package/dist/chunk-ID745F3R.js.map +1 -0
- package/dist/{chunk-PQFHMQHQ.js → chunk-JQ3DXNQV.js} +4 -4
- package/dist/{chunk-PQFHMQHQ.js.map → chunk-JQ3DXNQV.js.map} +1 -1
- package/dist/chunk-K4VOEYOR.js +21 -0
- package/dist/chunk-K4VOEYOR.js.map +1 -0
- package/dist/{chunk-XDKH7XSA.js → chunk-KVSDRB35.js} +5 -5
- package/dist/{chunk-XDKH7XSA.js.map → chunk-KVSDRB35.js.map} +1 -1
- package/dist/{chunk-47U4GZ4M.js → chunk-MF54ZHWT.js} +20 -3
- package/dist/chunk-MF54ZHWT.js.map +1 -0
- package/dist/{chunk-VLTQGE2E.js → chunk-N5M2EISA.js} +197 -52
- package/dist/chunk-N5M2EISA.js.map +1 -0
- package/dist/{chunk-T7CTHHG7.js → chunk-NDF24LYP.js} +3 -3
- package/dist/{chunk-T7CTHHG7.js.map → chunk-NDF24LYP.js.map} +1 -1
- package/dist/{chunk-CPWLNZGJ.js → chunk-NGJIVDDD.js} +3 -3
- package/dist/{chunk-CPWLNZGJ.js.map → chunk-NGJIVDDD.js.map} +1 -1
- package/dist/{chunk-FH7W6TJ4.js → chunk-NJV5SLEK.js} +104 -23
- package/dist/chunk-NJV5SLEK.js.map +1 -0
- package/dist/{chunk-M3B6EIJD.js → chunk-NJXR5OAM.js} +4 -4
- package/dist/{chunk-M3B6EIJD.js.map → chunk-NJXR5OAM.js.map} +1 -1
- package/dist/{chunk-CGYEHQOX.js → chunk-NOA6EJXE.js} +11 -2
- package/dist/chunk-NOA6EJXE.js.map +1 -0
- package/dist/{chunk-RYYLMBA2.js → chunk-NR7H7ZJP.js} +14 -6
- package/dist/chunk-NR7H7ZJP.js.map +1 -0
- package/dist/{chunk-OBYKJB4U.js → chunk-O2SYFJWP.js} +79 -5
- package/dist/chunk-O2SYFJWP.js.map +1 -0
- package/dist/{chunk-5LKOAX7I.js → chunk-OQ5MKDS3.js} +21 -5
- package/dist/chunk-OQ5MKDS3.js.map +1 -0
- package/dist/{chunk-CJERAGFY.js → chunk-P23WJCH2.js} +37 -11
- package/dist/chunk-P23WJCH2.js.map +1 -0
- package/dist/{chunk-NWDSLXOX.js → chunk-PHRNUTSG.js} +118 -118
- package/dist/chunk-PHRNUTSG.js.map +1 -0
- package/dist/{chunk-ALEYHUC5.js → chunk-PNOGX36L.js} +104 -24
- package/dist/chunk-PNOGX36L.js.map +1 -0
- package/dist/{chunk-BNMZVPYA.js → chunk-PNTXHTBC.js} +2 -2
- package/dist/{chunk-BNMZVPYA.js.map → chunk-PNTXHTBC.js.map} +1 -1
- package/dist/{chunk-GV4DZ6MT.js → chunk-POQ6PGNE.js} +4 -4
- package/dist/{chunk-GV4DZ6MT.js.map → chunk-POQ6PGNE.js.map} +1 -1
- package/dist/{chunk-T42WRQ4O.js → chunk-QCEKGYHF.js} +3 -3
- package/dist/{chunk-T42WRQ4O.js.map → chunk-QCEKGYHF.js.map} +1 -1
- package/dist/{chunk-EDYHEMJA.js → chunk-SHQMPGOL.js} +4 -4
- package/dist/{chunk-EDYHEMJA.js.map → chunk-SHQMPGOL.js.map} +1 -1
- package/dist/{chunk-S3O3GKB7.js → chunk-SMT3LNAG.js} +4 -4
- package/dist/{chunk-S3O3GKB7.js.map → chunk-SMT3LNAG.js.map} +1 -1
- package/dist/{chunk-PBBPZYVG.js → chunk-T5TSLSRO.js} +110 -44
- package/dist/chunk-T5TSLSRO.js.map +1 -0
- package/dist/{chunk-DZMNFCWB.js → chunk-TVAR4JHA.js} +530 -126
- package/dist/chunk-TVAR4JHA.js.map +1 -0
- package/dist/{chunk-COH6FQAG.js → chunk-UTKENBB6.js} +5 -5
- package/dist/{chunk-COH6FQAG.js.map → chunk-UTKENBB6.js.map} +1 -1
- package/dist/{chunk-XUSALIEI.js → chunk-VRLKHL74.js} +6 -6
- package/dist/{chunk-XUSALIEI.js.map → chunk-VRLKHL74.js.map} +1 -1
- package/dist/{chunk-WSBKB4CJ.js → chunk-WI4T3KIS.js} +51 -16
- package/dist/chunk-WI4T3KIS.js.map +1 -0
- package/dist/{chunk-D3B36CYC.js → chunk-X3RMRJNR.js} +4 -3
- package/dist/chunk-X3RMRJNR.js.map +1 -0
- package/dist/{chunk-IER3KIPH.js → chunk-X6LKA3TJ.js} +5 -5
- package/dist/{chunk-IER3KIPH.js.map → chunk-X6LKA3TJ.js.map} +1 -1
- package/dist/{chunk-Y3HTGHJC.js → chunk-XMAJJPA4.js} +3 -3
- package/dist/{chunk-Y3HTGHJC.js.map → chunk-XMAJJPA4.js.map} +1 -1
- package/dist/{chunk-SBSA3IQA.js → chunk-XTVSNWLL.js} +19 -7
- package/dist/chunk-XTVSNWLL.js.map +1 -0
- package/dist/{chunk-MZG34MBZ.js → chunk-XZY6SBGU.js} +3 -3
- package/dist/{chunk-MZG34MBZ.js.map → chunk-XZY6SBGU.js.map} +1 -1
- package/dist/{chunk-6O2X3GPW.js → chunk-YQU2BPQD.js} +7 -5
- package/dist/chunk-YQU2BPQD.js.map +1 -0
- package/dist/cli/index.js +1077 -497
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/agent-checks.d.ts +40 -0
- package/dist/cli/src/agent-checks.d.ts.map +1 -0
- package/dist/cli/src/asset-feeds.d.ts.map +1 -1
- package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +24 -0
- 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/diff.d.ts.map +1 -1
- package/dist/cli/src/commands/integration.d.ts.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/mcp-server.d.ts +1 -1
- package/dist/cli/src/commands/migrate-assets.d.ts +2 -1
- package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin/claude-code.d.ts +1 -1
- package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin/types.d.ts +1 -1
- package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/publish-core.d.ts +5 -0
- package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts +2 -1
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +22 -0
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -0
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/cli/src/commands/store.d.ts.map +1 -1
- package/dist/cli/src/commands/tree.d.ts.map +1 -1
- package/dist/cli/src/commands/update.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/commands/why.d.ts.map +1 -1
- package/dist/cli/src/curated-manifests.d.ts +21 -0
- package/dist/cli/src/curated-manifests.d.ts.map +1 -0
- package/dist/cli/src/index-busy.d.ts +8 -0
- package/dist/cli/src/index-busy.d.ts.map +1 -0
- package/dist/cli/src/plugin-store/paths.d.ts +7 -3
- package/dist/cli/src/plugin-store/paths.d.ts.map +1 -1
- package/dist/cli/src/skill-checks.d.ts +15 -2
- package/dist/cli/src/skill-checks.d.ts.map +1 -1
- package/dist/cli/src/store-addable.d.ts +18 -0
- package/dist/cli/src/store-addable.d.ts.map +1 -0
- package/dist/connectors/config.js +5 -5
- package/dist/connectors/index.js +16 -16
- package/dist/{connectors-4QWAKPHB.js → connectors-UNKUKEPG.js} +19 -19
- package/dist/{connectors-4QWAKPHB.js.map → connectors-UNKUKEPG.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 +2 -2
- package/dist/core/ref.js +1 -1
- package/dist/core/runtime-assets.js +5 -5
- package/dist/core/src/index.d.ts +5 -4
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +15 -5
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +5 -0
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +3 -3
- package/dist/core/src/package-manager.d.ts +19 -0
- package/dist/core/src/package-manager.d.ts.map +1 -0
- package/dist/core/src/publish-manifest.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +11 -0
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/settings.d.ts +26 -6
- package/dist/core/src/settings.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +6 -1
- package/dist/core/src/walker.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 +5 -5
- package/dist/{ensure-sources-2RONZKCU.js → ensure-sources-POMEQSTM.js} +19 -19
- package/dist/{ensure-sources-2RONZKCU.js.map → ensure-sources-POMEQSTM.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +16 -16
- package/dist/factory-assets/connectors/deploy.js +16 -16
- package/dist/factory-assets/connectors/devserver.js +16 -16
- package/dist/factory-assets/connectors/flow/adapter.js +16 -16
- package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract.js +1 -1
- package/dist/factory-assets/connectors/flow/engine.js +9 -9
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +18 -18
- package/dist/factory-assets/connectors/flow.js +16 -16
- package/dist/factory-assets/connectors/git.js +16 -16
- package/dist/factory-assets/connectors/gmail.js +16 -16
- package/dist/factory-assets/connectors/googledrive.js +16 -16
- package/dist/factory-assets/connectors/local.js +16 -16
- package/dist/factory-assets/connectors/mattermost.js +16 -16
- package/dist/factory-assets/connectors/memory.js +16 -16
- package/dist/factory-assets/connectors/minio.js +16 -16
- package/dist/factory-assets/connectors/postgres.js +16 -16
- package/dist/factory-assets/connectors/s3.js +16 -16
- package/dist/factory-assets/connectors/sharepoint.js +16 -16
- package/dist/factory-assets/connectors/sqlite.js +16 -16
- package/dist/factory-assets/connectors/static-server.js +16 -16
- package/dist/factory-assets/connectors/tunnel.js +16 -16
- package/dist/factory-assets/connectors/webdav.js +16 -16
- package/dist/factory-assets/connectors/xstate-store.js +16 -16
- package/dist/factory-assets/connectors/xstate.js +16 -16
- package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +10 -8
- package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +15 -11
- package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +12 -9
- package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +2 -2
- package/dist/{flows-EQF2CH4U.js → flows-DVKMZKM4.js} +12 -12
- package/dist/{flows-EQF2CH4U.js.map → flows-DVKMZKM4.js.map} +1 -1
- package/dist/{helpers-CFK6YP6R.js → helpers-Y4OT7VIS.js} +19 -19
- package/dist/{helpers-CFK6YP6R.js.map → helpers-Y4OT7VIS.js.map} +1 -1
- package/dist/library/index.js +12 -12
- 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/install/source-fetch-github.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts +2 -0
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library-manager.d.ts +5 -0
- package/dist/library/src/local/library-manager.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +5 -3
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
- package/dist/library/src/local/store-paths.d.ts +9 -0
- package/dist/library/src/local/store-paths.d.ts.map +1 -1
- 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 +17 -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-53UTB3MB.js → library-publish-DI4Q5UOG.js} +45 -37
- package/dist/library-publish-DI4Q5UOG.js.map +1 -0
- package/dist/open-library-N6ESO6IK.js +40 -0
- package/dist/{open-library-BOSPJVID.js.map → open-library-N6ESO6IK.js.map} +1 -1
- package/dist/open-registry-CBZ5MWTT.js +32 -0
- package/dist/{open-registry-4FI7HKET.js.map → open-registry-CBZ5MWTT.js.map} +1 -1
- package/dist/paths-U6W6MQNQ.js +22 -0
- package/dist/{paths-SUS4S4YT.js.map → paths-U6W6MQNQ.js.map} +1 -1
- package/dist/{plugin-store-AGQDMING.js → plugin-store-XMZSPVBF.js} +48 -12
- package/dist/plugin-store-XMZSPVBF.js.map +1 -0
- package/dist/project-UP52HEHC.js +79 -0
- package/dist/{project-I55A4O2T.js.map → project-UP52HEHC.js.map} +1 -1
- package/dist/resolver/index.js +8 -8
- package/dist/runner/index.js +33 -33
- package/dist/runner/src/agent.d.ts.map +1 -1
- package/dist/runner/src/agents/in-process-host.d.ts.map +1 -1
- package/dist/runner/src/composition/index.d.ts +1 -0
- package/dist/runner/src/composition/index.d.ts.map +1 -1
- package/dist/runner/src/composition/prompt-sections.d.ts +7 -4
- package/dist/runner/src/composition/prompt-sections.d.ts.map +1 -1
- package/dist/runner/src/composition/resolve.d.ts +10 -1
- package/dist/runner/src/composition/resolve.d.ts.map +1 -1
- package/dist/runner/src/composition/verify.d.ts +29 -0
- package/dist/runner/src/composition/verify.d.ts.map +1 -0
- package/dist/runner/src/credential-notice.d.ts +14 -0
- package/dist/runner/src/credential-notice.d.ts.map +1 -0
- package/dist/runner/src/environment.d.ts.map +1 -1
- package/dist/runner/src/final-text.d.ts +17 -0
- package/dist/runner/src/final-text.d.ts.map +1 -0
- package/dist/runner/src/index.d.ts +2 -0
- package/dist/runner/src/index.d.ts.map +1 -1
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +13 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +16 -16
- package/dist/sdk/bridge.js +12 -12
- package/dist/sdk/core.js +7 -7
- package/dist/sdk/flow.js +9 -9
- package/dist/sdk/index.js +36 -34
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +8 -8
- package/dist/sdk/runner.js +33 -33
- package/dist/sdk/src/local-runtime.d.ts.map +1 -1
- package/dist/sdk/transport/ws/client.js +1 -1
- package/dist/sdk/transport/ws/server.js +1 -1
- package/dist/sdk/transport/ws.js +2 -2
- package/dist/sdk/transport.js +2 -2
- package/dist/serve-preflight-6P2JJEJ3.js +47 -0
- package/dist/serve-preflight-6P2JJEJ3.js.map +1 -0
- package/dist/{setup-7DQJKHUI.js → setup-5IRUH5OS.js} +24 -24
- package/dist/{setup-7DQJKHUI.js.map → setup-5IRUH5OS.js.map} +1 -1
- package/dist/{skills-NUEN5NDX.js → skills-HA36RFNM.js} +13 -13
- package/dist/{skills-NUEN5NDX.js.map → skills-HA36RFNM.js.map} +1 -1
- package/dist/source-DX5SGWEI.js +41 -0
- package/dist/{source-G2LV5LVD.js.map → source-DX5SGWEI.js.map} +1 -1
- package/dist/source-fetch-github-PIO6EMMF.js +4 -0
- package/dist/{source-fetch-github-QN4LLTL5.js.map → source-fetch-github-PIO6EMMF.js.map} +1 -1
- package/dist/{source-manifest-publish-6RM7SWLZ.js → source-manifest-publish-NMRLXWVW.js} +27 -26
- package/dist/source-manifest-publish-NMRLXWVW.js.map +1 -0
- package/dist/transport/index.js +2 -2
- package/dist/transport/src/ws/client.d.ts +6 -0
- package/dist/transport/src/ws/client.d.ts.map +1 -1
- package/dist/transport/src/ws/server.d.ts +4 -0
- package/dist/transport/src/ws/server.d.ts.map +1 -1
- package/dist/transport/ws/client.js +1 -1
- package/dist/transport/ws/server.js +1 -1
- package/dist/transport/ws.js +2 -2
- package/dist/tui/index.js +58 -41
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/src/repl-session.d.ts +1 -1
- package/dist/tui/src/repl-session.d.ts.map +1 -1
- package/dist/tui/src/repl.d.ts +3 -0
- package/dist/tui/src/repl.d.ts.map +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/manifests/agent-composition.d.ts +20 -0
- package/dist/types/src/manifests/agent-composition.d.ts.map +1 -1
- package/dist/types/src/manifests/agent.d.ts.map +1 -1
- package/dist/types/src/manifests/cron.d.ts +15 -0
- package/dist/types/src/manifests/cron.d.ts.map +1 -0
- package/dist/types/src/manifests/index.d.ts +3 -2
- package/dist/types/src/manifests/index.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +23 -23
- package/dist/workspace-plugin/adapters/omp.js +106 -51
- package/dist/workspace-plugin/adapters/omp.js.map +1 -1
- package/dist/workspace-plugin/index.js +2 -2
- package/dist/workspace-plugin/src/adapters/claude-code.d.ts.map +1 -1
- package/dist/workspace-plugin/src/adapters/omp.d.ts +11 -2
- package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/asset-feeds-CXGQIDFR.js.map +0 -1
- package/dist/chunk-2F5AWQX5.js.map +0 -1
- package/dist/chunk-3SM2DL2T.js.map +0 -1
- package/dist/chunk-47U4GZ4M.js.map +0 -1
- package/dist/chunk-5LKOAX7I.js.map +0 -1
- package/dist/chunk-6O2X3GPW.js.map +0 -1
- package/dist/chunk-ALEYHUC5.js.map +0 -1
- package/dist/chunk-CGYEHQOX.js.map +0 -1
- package/dist/chunk-CJERAGFY.js.map +0 -1
- package/dist/chunk-D3B36CYC.js.map +0 -1
- package/dist/chunk-DZMNFCWB.js.map +0 -1
- package/dist/chunk-FH7W6TJ4.js.map +0 -1
- package/dist/chunk-HZXUXHIV.js.map +0 -1
- package/dist/chunk-NWDSLXOX.js.map +0 -1
- package/dist/chunk-OBYKJB4U.js.map +0 -1
- package/dist/chunk-PBBPZYVG.js.map +0 -1
- package/dist/chunk-R7FOF242.js +0 -59
- package/dist/chunk-R7FOF242.js.map +0 -1
- package/dist/chunk-RYYLMBA2.js.map +0 -1
- package/dist/chunk-SBSA3IQA.js.map +0 -1
- package/dist/chunk-VLTQGE2E.js.map +0 -1
- package/dist/chunk-WSBKB4CJ.js.map +0 -1
- package/dist/chunk-YOH2L76X.js.map +0 -1
- package/dist/chunk-ZCAJZ4B2.js.map +0 -1
- package/dist/chunk-ZPWTOUTK.js.map +0 -1
- package/dist/library-publish-53UTB3MB.js.map +0 -1
- package/dist/open-library-BOSPJVID.js +0 -40
- package/dist/open-registry-4FI7HKET.js +0 -32
- package/dist/paths-SUS4S4YT.js +0 -22
- package/dist/plugin-store-AGQDMING.js.map +0 -1
- package/dist/project-I55A4O2T.js +0 -41
- package/dist/source-G2LV5LVD.js +0 -41
- package/dist/source-fetch-github-QN4LLTL5.js +0 -4
- package/dist/source-manifest-publish-6RM7SWLZ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/src/ws/client.ts"],"names":[],"mappings":"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","file":"chunk-O2SYFJWP.js","sourcesContent":["/**\n * WebSocketClientTransport — connects to a skaile serve WebSocket server.\n *\n * Handles connection, reconnection with exponential backoff, heartbeat,\n * and JSON serialization. Implements ClientTransport from @skaile/workspaces/types.\n */\n\nimport type * as nodeHttp from \"node:http\";\nimport type { AgentCommand, AgentEvent, ClientTransport } from \"@skaile/workspaces/types\";\nimport { encodeBearerSubprotocol } from \"./auth.js\";\n\nconst DEFAULT_RECONNECT_MAX_ATTEMPTS = 5;\nconst DEFAULT_RECONNECT_BASE_MS = 1_000;\n/** Close code the server sends the older client when a newer one connects (see the server). */\nconst CLOSE_REPLACED = 4001;\nconst DEFAULT_RECONNECT_MAX_MS = 30_000;\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_MISSED_PONGS = 2;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 10_000;\n\n/**\n * Options for {@link WebSocketClientTransport}.\n *\n * @param url - WebSocket server URL to connect to (e.g. `ws://localhost:8080`).\n * @param reconnect - Exponential-backoff reconnect policy. Defaults: 5 attempts, 1s base, 30s max.\n * @param heartbeatMs - Interval in milliseconds between WebSocket ping frames. Default: 30 000.\n * @param maxMissedPongs - Heartbeat ticks a socket may go without a pong (or any\n * inbound message) before it is judged dead and terminated, so a half-open\n * connection reaches the reconnect path. Default: 2, i.e. detection within\n * 3 x `heartbeatMs`. `0` disables the deadline. Only applies where the socket\n * exposes ping and pong (Bun, and the `ws` package used for a `tls` dial under\n * Node); Node's global WebSocket and browsers expose neither.\n * @param connectTimeoutMs - Maximum time in milliseconds to wait for the initial handshake. Default: 10 000.\n * @param onLog - Optional callback for internal log lines (connection state, errors).\n * @param auth - Optional bearer token sent via the WebSocket subprotocol; must\n * match the server's `authToken` or the handshake is rejected with HTTP 401.\n * @param tls - Optional per-connection TLS settings for a `wss://` URL. `ca`\n * (PEM) replaces the default trust store for this connection only, so the\n * server certificate must chain to it. Server-side runtimes only: Bun passes\n * it to its native `WebSocket`, Node dials through the `ws` package (the\n * global WebSocket takes no CA). Unset, the dial is exactly as before.\n *\n * @docLink packages/transport/dev-guide#websocket-client-transport\n */\nexport interface WebSocketClientOptions {\n url: string;\n reconnect?: {\n maxAttempts?: number;\n baseMs?: number;\n maxMs?: number;\n };\n heartbeatMs?: number;\n maxMissedPongs?: number;\n connectTimeoutMs?: number;\n onLog?: (line: string) => void;\n auth?: string;\n tls?: {\n ca: string | string[];\n };\n}\n\n/**\n * Optional members a server-side socket may carry beyond the browser API: Bun's\n * native WebSocket has `ping`/`terminate` and a `pong` event; the `ws` package\n * has `ping`/`terminate` and reports pongs only through `on(\"pong\")`.\n */\ntype PingCapableSocket = WebSocket & {\n ping?: () => void;\n terminate?: () => void;\n on?: (event: \"pong\", listener: () => void) => void;\n};\n\n/** The `ws` package's WebSocket constructor, as far as this client uses it. */\ntype WsPackageCtor = new (\n url: string,\n protocols: string[],\n options: { ca: string | string[] },\n) => WebSocket;\n\nconst isBun = typeof (globalThis as { Bun?: unknown }).Bun !== \"undefined\";\n\n/**\n * Load the `ws` package only when a CA pin needs it under Node, so the client\n * subpath keeps no static `ws` import (browser bundles never reach this). The\n * variable specifier keeps bundlers from inlining it.\n */\nasync function loadWsPackage(): Promise<WsPackageCtor> {\n if (typeof process === \"undefined\") {\n throw new Error(\"WebSocketClientTransport `tls` is supported under Node and Bun only\");\n }\n const specifier = \"ws\";\n const mod = (await import(/* @vite-ignore */ /* webpackIgnore: true */ specifier)) as {\n WebSocket?: WsPackageCtor;\n default?: WsPackageCtor;\n };\n const ctor = mod.WebSocket ?? mod.default;\n if (!ctor) throw new Error(\"the ws package exports no WebSocket constructor\");\n return ctor;\n}\n\n/**\n * `ClientTransport` implementation that connects to a skaile agent server over WebSocket.\n *\n * Uses the browser-standard `WebSocket` API so it works in both Bun and browser\n * environments. On an unintentional disconnect it automatically retries with\n * exponential backoff (default: 5 attempts, 1s base, 30s max). A periodic ping\n * keeps the connection alive through NAT and load-balancer idle timeouts. All\n * `AgentCommand` / `AgentEvent` messages are JSON-serialised on the wire.\n *\n * @example\n * ```ts\n * const transport = new WebSocketClientTransport({ url: 'ws://localhost:8080' });\n * await transport.connect();\n * transport.send({ type: 'prompt', prompt: 'Hello' });\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-client-transport\n */\nexport class WebSocketClientTransport implements ClientTransport {\n private ws: WebSocket | null = null;\n private readonly url: string;\n private readonly reconnectConfig: Required<NonNullable<WebSocketClientOptions[\"reconnect\"]>>;\n private readonly heartbeatMs: number;\n private readonly maxMissedPongs: number;\n private readonly connectTimeoutMs: number;\n private readonly log: (line: string) => void;\n private readonly subprotocols: string[];\n private readonly tls: WebSocketClientOptions[\"tls\"];\n /** Loaded on the first connect when {@link tls} is set under Node. */\n private wsPackage: WsPackageCtor | null = null;\n\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectAttempts = 0;\n private intentionalClose = false;\n\n private readonly messageHandlers = new Set<(event: AgentEvent) => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketClientOptions) {\n this.url = options.url;\n this.reconnectConfig = {\n maxAttempts: options.reconnect?.maxAttempts ?? DEFAULT_RECONNECT_MAX_ATTEMPTS,\n baseMs: options.reconnect?.baseMs ?? DEFAULT_RECONNECT_BASE_MS,\n maxMs: options.reconnect?.maxMs ?? DEFAULT_RECONNECT_MAX_MS,\n };\n this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;\n this.connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n this.log = options.onLog ?? (() => {});\n this.subprotocols = options.auth ? [encodeBearerSubprotocol(options.auth)] : [];\n this.tls = options.tls;\n }\n\n async connect(): Promise<void> {\n this.intentionalClose = false;\n this.reconnectAttempts = 0;\n if (this.tls && !isBun && !this.wsPackage) this.wsPackage = await loadWsPackage();\n return this.doConnect(true);\n }\n\n async disconnect(): Promise<void> {\n this.intentionalClose = true;\n this.clearHeartbeat();\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(1000, \"Client disconnect\");\n }\n this.ws = null;\n }\n }\n\n send(command: AgentCommand): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n this.log(\"[ws-client] cannot send: not connected\");\n return;\n }\n this.ws.send(JSON.stringify(command));\n }\n\n onMessage(handler: (event: AgentEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => {\n this.messageHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private doConnect(isInitial = false): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.log(`[ws-client] connecting to ${this.url}`);\n\n const ws = this.createSocket();\n this.ws = ws;\n /** Pings this socket sent since its last pong or inbound message. */\n const liveness = { missed: 0 };\n\n // Settle the connect promise exactly once. A close or error that arrives\n // before `open` is a handshake/connect failure (e.g. a rejected auth\n // upgrade, code 401, or a refused port) — reject so the caller sees it\n // instead of hanging until the connect timeout.\n let settled = false;\n let opened = false;\n const failConnect = (message: string) => {\n if (settled) return;\n settled = true;\n // The WebSocket API hides why a handshake was refused (no status, no body), so ask\n // the server once more, plainly, for the status it answers the upgrade with. Only on\n // the first connect: a probe the server accepts is a real client to it (it would evict\n // the connected one and drain the replay buffer into the probe), and background\n // reconnect attempts have no caller waiting for the reason.\n if (!isInitial) {\n reject(new Error(message));\n return;\n }\n void this.explainRefusal().then((reason) => {\n reject(new Error(reason ? `${message}: ${reason}` : message));\n });\n };\n\n const timeout = setTimeout(() => {\n if (settled) return;\n // Reject with the timeout reason first, then close — closing may\n // synchronously fire the `close` handler, whose `failConnect` is then a\n // no-op thanks to the `settled` guard (preserves the timeout message).\n settled = true;\n reject(new Error(`Connection timeout to ${this.url}`));\n ws.close();\n }, this.connectTimeoutMs);\n\n ws.addEventListener(\"open\", () => {\n clearTimeout(timeout);\n opened = true;\n this.log(\"[ws-client] connected\");\n this.reconnectAttempts = 0;\n // A socket orphaned by disconnect() or a newer dial must not take over\n // the heartbeat of the current one.\n if (this.ws === ws) this.startHeartbeat(ws, liveness, () => handleClose(1006));\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n ws.addEventListener(\"message\", (event) => {\n liveness.missed = 0;\n try {\n const data = JSON.parse(String(event.data)) as AgentEvent;\n for (const handler of this.messageHandlers) {\n handler(data);\n }\n } catch {\n this.log(\"[ws-client] failed to parse message\");\n }\n });\n\n // Runs once per socket, from its `close` event or from the pong deadline,\n // whichever comes first: `terminate()` closes synchronously in Bun but\n // later in the `ws` package, so the second caller must be a no-op.\n let closeHandled = false;\n const handleClose = (code: number, reason = \"\") => {\n if (closeHandled) return;\n closeHandled = true;\n clearTimeout(timeout);\n if (this.ws === ws) this.clearHeartbeat();\n this.log(`[ws-client] disconnected (code=${code})`);\n\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n\n // Close code 4001: the server serves one client and a newer one took over. Say so\n // instead of going quiet, and do not reconnect: that would evict the new owner in turn.\n if (code === CLOSE_REPLACED && opened && !this.intentionalClose) {\n const message = `This connection was replaced by another client (close code ${CLOSE_REPLACED}${reason ? `, \"${reason}\"` : \"\"}). The server serves one client at a time, so this client does not reconnect.`;\n this.log(`[ws-client] ${message}`);\n const event: AgentEvent = { type: \"error\", message, fatal: false, category: \"config\" };\n for (const handler of this.messageHandlers) handler(event);\n return;\n }\n\n // Closed before ever opening == connect failure. Reject the pending\n // connect; only background (reconnect) attempts chain another retry —\n // an initial connect failure is surfaced to the caller, who owns retry.\n if (!opened) {\n failConnect(`Connection to ${this.url} closed before open (code=${code})`);\n if (!isInitial && !this.intentionalClose && code !== 1000) {\n this.scheduleReconnect();\n }\n return;\n }\n\n if (!this.intentionalClose && code !== 1000) {\n this.scheduleReconnect();\n }\n };\n ws.addEventListener(\"close\", (event) => handleClose(event.code, event.reason));\n\n ws.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n // A pre-open error is a connect failure; reject now. The close event\n // (which usually follows) is idempotent via the `settled` guard.\n if (!opened) failConnect(`Connection to ${this.url} failed before open`);\n });\n });\n }\n\n /**\n * After a refused handshake, repeat the upgrade request over `node:http` and report the\n * status line the server answered with. Resolves `undefined` when nothing useful is\n * learned (a browser has no `node:http`; the server accepted this time).\n */\n private async explainRefusal(): Promise<string | undefined> {\n if (typeof process === \"undefined\" || !process.versions?.node) return undefined;\n try {\n const url = new URL(this.url);\n const secure = url.protocol === \"wss:\";\n // Variable specifier: bundlers must not pull `node:http` into browser builds.\n const specifier = secure ? \"node:https\" : \"node:http\";\n const lib = (await import(\n /* @vite-ignore */ /* webpackIgnore: true */ specifier\n )) as typeof nodeHttp;\n return await new Promise<string | undefined>((resolve) => {\n const req = lib.request(\n {\n host: url.hostname,\n port: url.port || (secure ? 443 : 80),\n path: `${url.pathname}${url.search}`,\n method: \"GET\",\n timeout: 3_000,\n headers: {\n Connection: \"Upgrade\",\n Upgrade: \"websocket\",\n \"Sec-WebSocket-Version\": \"13\",\n \"Sec-WebSocket-Key\": \"c2thaWxlLXByb2JlLWtleQ==\",\n ...(this.subprotocols.length > 0\n ? { \"Sec-WebSocket-Protocol\": this.subprotocols.join(\", \") }\n : {}),\n },\n ...(this.tls ? { ca: this.tls.ca } : {}),\n },\n (res) => {\n res.resume();\n const status = `HTTP ${res.statusCode} ${res.statusMessage ?? \"\"}`.trim();\n if (res.statusCode === 401) {\n resolve(\n this.subprotocols.length > 0\n ? `${status} (the server did not accept the token passed as \\`auth\\`)`\n : `${status} (the server requires a token: pass \\`auth\\`; \\`skaile serve\\` reads SKAILE_WS_AUTH_TOKEN)`,\n );\n } else {\n resolve(status);\n }\n },\n );\n req.on(\"upgrade\", (_res, socket) => {\n socket.destroy();\n resolve(undefined);\n });\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(undefined);\n });\n req.on(\"error\", (err: NodeJS.ErrnoException) => resolve(err.code));\n req.end();\n });\n } catch {\n return undefined;\n }\n }\n\n private createSocket(): WebSocket {\n if (this.tls) {\n const { ca } = this.tls;\n if (isBun) {\n // Bun's WebSocket takes an options object in place of the protocols.\n const init = { protocols: this.subprotocols, tls: { ca } };\n return new WebSocket(this.url, init as unknown as string[]);\n }\n if (!this.wsPackage) throw new Error(\"ws package not loaded before a pinned dial\");\n return new this.wsPackage(this.url, this.subprotocols, { ca });\n }\n // Pass the bearer subprotocol when auth is configured; an empty list keeps\n // the no-auth handshake byte-identical to before.\n return this.subprotocols.length > 0\n ? new WebSocket(this.url, this.subprotocols)\n : new WebSocket(this.url);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts) {\n this.log(`[ws-client] giving up reconnect after ${this.reconnectAttempts} attempts`);\n return;\n }\n\n this.reconnectAttempts++;\n const delay = Math.min(\n this.reconnectConfig.baseMs * 2 ** (this.reconnectAttempts - 1),\n this.reconnectConfig.maxMs,\n );\n this.log(`[ws-client] reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`);\n\n setTimeout(() => {\n if (this.intentionalClose) return;\n this.doConnect().catch(() => {\n // doConnect rejection triggers another close → scheduleReconnect cycle\n });\n }, delay);\n }\n\n /**\n * Ping every {@link heartbeatMs} and, where the socket reports pongs, give up\n * on it after {@link maxMissedPongs} unanswered ticks. A path that dies\n * without a FIN leaves the socket OPEN forever; terminating it here is what\n * lets {@link scheduleReconnect} run. `onDead` settles the close at once\n * because a terminated socket's own close event can arrive late.\n */\n private startHeartbeat(ws: WebSocket, liveness: { missed: number }, onDead: () => void): void {\n this.clearHeartbeat();\n const socket = ws as PingCapableSocket;\n const canPing = typeof socket.ping === \"function\";\n const markAlive = () => {\n liveness.missed = 0;\n };\n if (canPing && typeof socket.on === \"function\") socket.on(\"pong\", markAlive);\n else if (canPing) ws.addEventListener(\"pong\" as keyof WebSocketEventMap, markAlive);\n const judge = canPing && this.maxMissedPongs > 0;\n\n this.heartbeatTimer = setInterval(() => {\n if (ws.readyState !== WebSocket.OPEN) return;\n if (judge && liveness.missed >= this.maxMissedPongs) {\n this.log(\n `[ws-client] no pong for ${liveness.missed} heartbeats of ${this.heartbeatMs}ms; terminating ${this.url}`,\n );\n this.clearHeartbeat();\n try {\n if (typeof socket.terminate === \"function\") socket.terminate();\n else ws.close();\n } catch {\n // already gone\n }\n onDead();\n return;\n }\n try {\n socket.ping?.();\n if (judge) liveness.missed++;\n } catch {\n // A runtime whose ping throws cannot be judged on pongs either.\n }\n }, this.heartbeatMs);\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n}\n"]}
|
|
@@ -34,6 +34,7 @@ var WebSocketServerTransport = class {
|
|
|
34
34
|
activeClient = null;
|
|
35
35
|
port;
|
|
36
36
|
log;
|
|
37
|
+
host;
|
|
37
38
|
authToken;
|
|
38
39
|
heartbeatMs;
|
|
39
40
|
maxMissedPongs;
|
|
@@ -43,6 +44,7 @@ var WebSocketServerTransport = class {
|
|
|
43
44
|
constructor(options) {
|
|
44
45
|
this.port = options.port;
|
|
45
46
|
this.log = options.onLog ?? console.log;
|
|
47
|
+
this.host = options.host;
|
|
46
48
|
this.authToken = options.authToken;
|
|
47
49
|
this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;
|
|
48
50
|
this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;
|
|
@@ -75,22 +77,36 @@ var WebSocketServerTransport = class {
|
|
|
75
77
|
try {
|
|
76
78
|
await new Promise((resolve, reject) => {
|
|
77
79
|
httpServer.once("error", reject);
|
|
78
|
-
|
|
80
|
+
const onBound = () => {
|
|
79
81
|
httpServer.off("error", reject);
|
|
80
82
|
resolve();
|
|
81
|
-
}
|
|
83
|
+
};
|
|
84
|
+
if (this.host) httpServer.listen(this.port, this.host, onBound);
|
|
85
|
+
else httpServer.listen(this.port, onBound);
|
|
82
86
|
});
|
|
83
87
|
} catch (err) {
|
|
84
88
|
wss.close();
|
|
85
89
|
this.wss = null;
|
|
86
90
|
this.httpServer = null;
|
|
91
|
+
if (err instanceof Error && "code" in err && err.code === "EADDRINUSE") {
|
|
92
|
+
const where = this.host ? `${this.host}:${this.port}` : `port ${this.port}`;
|
|
93
|
+
throw Object.assign(
|
|
94
|
+
new Error(
|
|
95
|
+
`${where} is already in use: another process listens there. Pick another port.`
|
|
96
|
+
),
|
|
97
|
+
{ code: "EADDRINUSE" }
|
|
98
|
+
);
|
|
99
|
+
}
|
|
87
100
|
throw err;
|
|
88
101
|
} finally {
|
|
89
102
|
wss.off("error", swallowBindError);
|
|
90
103
|
}
|
|
91
104
|
const addr = httpServer.address();
|
|
92
105
|
const boundPort = typeof addr === "object" && addr ? addr.port : this.port;
|
|
93
|
-
this.
|
|
106
|
+
const bind = this.host ?? "all interfaces";
|
|
107
|
+
this.log(
|
|
108
|
+
`[ws-server] listening on port ${boundPort} (${bind}; ${this.authToken ? "token required" : "no authentication"})`
|
|
109
|
+
);
|
|
94
110
|
}
|
|
95
111
|
handleConnection(ws) {
|
|
96
112
|
if (this.activeClient) {
|
|
@@ -239,5 +255,5 @@ var WebSocketServerTransport = class {
|
|
|
239
255
|
};
|
|
240
256
|
|
|
241
257
|
export { WebSocketServerTransport };
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
243
|
-
//# sourceMappingURL=chunk-
|
|
258
|
+
//# sourceMappingURL=chunk-OQ5MKDS3.js.map
|
|
259
|
+
//# sourceMappingURL=chunk-OQ5MKDS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../transport/src/ws/server.ts"],"names":[],"mappings":"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","file":"chunk-OQ5MKDS3.js","sourcesContent":["/**\n * WebSocketServerTransport — `ws`-based WebSocket server.\n *\n * Accepts one client at a time. Implements ServerTransport from @skaile/workspaces/types.\n * Built on the `ws` package + `node:http`, both of which run under Node and Bun.\n */\n\nimport { createServer, type Server as HttpServer } from \"node:http\";\nimport type { AgentCommand, AgentEvent, ServerTransport } from \"@skaile/workspaces/types\";\nimport { type WebSocket, WebSocketServer } from \"ws\";\nimport { decodeBearerFromHeader, tokensEqual } from \"./auth.js\";\n\n/**\n * Options for {@link WebSocketServerTransport}.\n *\n * @param port - TCP port to bind to; `0` picks a free port (read it back via `boundPort`).\n * @param onLog - Optional callback for internal log lines (client connect/disconnect events).\n * @param host - Address to bind. Default: every interface (Node's unspecified address).\n * `127.0.0.1` accepts local clients only.\n * @param authToken - When set, every upgrade must present this token via the\n * `skaile-bearer.<base64url>` subprotocol or the handshake is rejected with\n * HTTP 401. When unset, no auth is enforced (back-compatible default).\n * @param heartbeatMs - Interval in milliseconds between pings to the active\n * client. Default: 30 000.\n * @param maxMissedPongs - Heartbeat ticks the client may go without a pong (or\n * any inbound frame) before its socket is terminated, so a client lost behind a\n * dead path (no FIN) fires `onDisconnect` instead of swallowing every event\n * sent to it. Default: 2, i.e. detection within 3 x `heartbeatMs`. `0` turns\n * the heartbeat off. Every WebSocket client answers pings on its own.\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport interface WebSocketServerOptions {\n port: number;\n host?: string;\n onLog?: (line: string) => void;\n authToken?: string;\n heartbeatMs?: number;\n maxMissedPongs?: number;\n}\n\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst DEFAULT_MAX_MISSED_PONGS = 2;\n\n/**\n * Shape-validate a `session_init` frame at ingress before forwarding to the\n * runner. Protocol v3 requires the deterministic bootstrap envelope to carry\n * an identity tuple, a semver-shaped `protocolVersion`, a resolved config\n * object, and a `credentials` map keyed by `mounts` / `connectors`. Frames\n * that fail the guard are rejected on the wire so the runner never sees a\n * malformed boot envelope.\n *\n * Returns `null` when the frame is well-formed, or a human-readable reason\n * when it should be rejected.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"SessionInitCommand schema\".\n *\n * @internal\n */\nfunction validateSessionInitShape(cmd: Record<string, unknown>): string | null {\n if (cmd.type !== \"session_init\") return \"type must be 'session_init'\";\n\n const identity = cmd.identity as Record<string, unknown> | undefined;\n if (!identity || typeof identity !== \"object\" || Array.isArray(identity)) {\n return \"identity must be an object\";\n }\n if (typeof identity.containerId !== \"string\") return \"identity.containerId must be a string\";\n if (typeof identity.sessionId !== \"string\") return \"identity.sessionId must be a string\";\n if (typeof identity.projectId !== \"string\") return \"identity.projectId must be a string\";\n\n const protocolVersion = cmd.protocolVersion as Record<string, unknown> | undefined;\n if (!protocolVersion || typeof protocolVersion !== \"object\" || Array.isArray(protocolVersion)) {\n return \"protocolVersion must be an object\";\n }\n if (typeof protocolVersion.major !== \"number\") return \"protocolVersion.major must be a number\";\n if (typeof protocolVersion.minor !== \"number\") return \"protocolVersion.minor must be a number\";\n if (typeof protocolVersion.patch !== \"number\") return \"protocolVersion.patch must be a number\";\n\n if (\n !cmd.resolvedConfig ||\n typeof cmd.resolvedConfig !== \"object\" ||\n Array.isArray(cmd.resolvedConfig)\n ) {\n return \"resolvedConfig must be an object\";\n }\n\n if (!cmd.credentials || typeof cmd.credentials !== \"object\" || Array.isArray(cmd.credentials)) {\n return \"credentials must be an object\";\n }\n\n return null;\n}\n\n/**\n * `ServerTransport` implementation backed by the `ws` package on top of a\n * `node:http` server.\n *\n * Enforces a single-client policy: if a new connection arrives while a client is\n * already connected, the stale connection is closed with code 4001 and replaced.\n * Incoming frames are parsed as JSON `AgentCommand` messages and fanned out to\n * registered `onCommand` handlers; outgoing `AgentEvent` objects are JSON-serialised\n * before sending. Call `listen()` to start accepting connections and `close()` to\n * shut down cleanly — `close()` terminates the active socket immediately rather\n * than keeping the event loop alive.\n *\n * @example\n * ```ts\n * const server = new WebSocketServerTransport({ port: 8080 });\n * await server.listen();\n * server.onCommand((cmd) => console.log(cmd));\n * server.send({ type: 'agent_end' });\n * await server.close();\n * ```\n *\n * @docLink packages/transport/dev-guide#websocket-server-transport\n */\nexport class WebSocketServerTransport implements ServerTransport {\n private httpServer: HttpServer | null = null;\n private wss: WebSocketServer | null = null;\n private activeClient: WebSocket | null = null;\n private readonly port: number;\n private readonly log: (line: string) => void;\n private readonly host?: string;\n private readonly authToken?: string;\n private readonly heartbeatMs: number;\n private readonly maxMissedPongs: number;\n\n private readonly commandHandlers = new Set<(command: AgentCommand) => void>();\n private readonly connectHandlers = new Set<() => void>();\n private readonly disconnectHandlers = new Set<() => void>();\n\n constructor(options: WebSocketServerOptions) {\n this.port = options.port;\n this.log = options.onLog ?? console.log;\n this.host = options.host;\n this.authToken = options.authToken;\n this.heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;\n this.maxMissedPongs = options.maxMissedPongs ?? DEFAULT_MAX_MISSED_PONGS;\n }\n\n /** Start the server and accept connections. */\n async listen(): Promise<void> {\n const httpServer = createServer((_req, res) => {\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"skaile agent server\");\n });\n // When an auth token is configured, reject the upgrade at handshake time\n // (HTTP 401) unless the client presents the matching bearer subprotocol.\n // Rejecting here — before `connection` — keeps unauthenticated sockets from\n // ever reaching the command handlers.\n const expected = this.authToken;\n const wss = new WebSocketServer({\n server: httpServer,\n verifyClient: expected\n ? (info, cb) => {\n const presented = decodeBearerFromHeader(info.req.headers[\"sec-websocket-protocol\"]);\n if (presented !== null && tokensEqual(presented, expected)) {\n cb(true);\n } else {\n this.log(\"[ws-server] rejecting unauthenticated upgrade\");\n cb(false, 401, \"Unauthorized\");\n }\n }\n : undefined,\n });\n wss.on(\"connection\", (ws) => this.handleConnection(ws));\n // `ws` re-emits the http server's errors on `wss`; unhandled during the bind,\n // that throws before the reject below runs and `listen()` hangs. Scoped to the\n // bind so a post-startup server error still surfaces loudly.\n const swallowBindError = () => {};\n wss.on(\"error\", swallowBindError);\n this.httpServer = httpServer;\n this.wss = wss;\n\n try {\n await new Promise<void>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n const onBound = () => {\n httpServer.off(\"error\", reject);\n resolve();\n };\n if (this.host) httpServer.listen(this.port, this.host, onBound);\n else httpServer.listen(this.port, onBound);\n });\n } catch (err) {\n wss.close();\n this.wss = null;\n this.httpServer = null;\n if (err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\") {\n const where = this.host ? `${this.host}:${this.port}` : `port ${this.port}`;\n throw Object.assign(\n new Error(\n `${where} is already in use: another process listens there. Pick another port.`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n throw err;\n } finally {\n wss.off(\"error\", swallowBindError);\n }\n\n const addr = httpServer.address();\n const boundPort = typeof addr === \"object\" && addr ? addr.port : this.port;\n const bind = this.host ?? \"all interfaces\";\n this.log(\n `[ws-server] listening on port ${boundPort} (${bind}; ${this.authToken ? \"token required\" : \"no authentication\"})`,\n );\n }\n\n private handleConnection(ws: WebSocket): void {\n if (this.activeClient) {\n // Close the stale connection instead of rejecting the new one.\n // This handles the race where waitForWsReady's probe hasn't\n // fully disconnected before the real gateway client connects.\n this.log(\"[ws-server] replacing previous connection\");\n try {\n this.activeClient.close(4001, \"Replaced by new connection\");\n } catch {\n // already closed\n }\n }\n this.log(\"[ws-server] client connected\");\n this.activeClient = ws;\n for (const handler of this.connectHandlers) {\n handler();\n }\n\n const stopHeartbeat = this.startHeartbeat(ws);\n\n ws.on(\"message\", (data) => {\n try {\n const parsed = JSON.parse(String(data)) as Record<string, unknown>;\n // Protocol v3: shape-validate `session_init` at ingress so the\n // runner never receives a malformed boot envelope. Other command\n // shapes pass through unchanged — invalid `AgentCommand`s surface\n // through the existing per-command handlers in serve.ts.\n if (parsed && typeof parsed === \"object\" && parsed.type === \"session_init\") {\n const reason = validateSessionInitShape(parsed);\n if (reason !== null) {\n this.log(`[ws-server] rejecting invalid session_init: ${reason}`);\n this.sendRaw({\n type: \"error\",\n message: `Invalid session_init: ${reason}`,\n fatal: false,\n });\n return;\n }\n }\n const cmd = parsed as unknown as AgentCommand;\n for (const handler of this.commandHandlers) {\n handler(cmd);\n }\n } catch (err) {\n this.sendRaw({\n type: \"error\",\n message: `Invalid message: ${err instanceof Error ? err.message : String(err)}`,\n fatal: false,\n });\n }\n });\n\n ws.on(\"close\", () => {\n stopHeartbeat();\n this.log(\"[ws-server] client disconnected\");\n if (this.activeClient === ws) {\n this.activeClient = null;\n for (const handler of this.disconnectHandlers) {\n handler();\n }\n }\n });\n }\n\n /**\n * Ping `ws` every {@link heartbeatMs}; terminate it after\n * {@link maxMissedPongs} unanswered ticks. `terminate()` makes `ws` emit\n * `close`, which runs the normal disconnect path. Returns the stop function.\n */\n private startHeartbeat(ws: WebSocket): () => void {\n if (this.maxMissedPongs <= 0) return () => {};\n let missed = 0;\n const markAlive = () => {\n missed = 0;\n };\n ws.on(\"pong\", markAlive);\n ws.on(\"message\", markAlive);\n const timer = setInterval(() => {\n if (ws.readyState !== ws.OPEN) return;\n if (missed >= this.maxMissedPongs) {\n this.log(\n `[ws-server] no pong for ${missed} heartbeats of ${this.heartbeatMs}ms; terminating client`,\n );\n clearInterval(timer);\n ws.terminate();\n return;\n }\n missed++;\n try {\n ws.ping();\n } catch {\n // socket closing underneath us; the close event cleans up\n }\n }, this.heartbeatMs);\n timer.unref?.();\n return () => clearInterval(timer);\n }\n\n /**\n * Stop the server.\n *\n * Terminates the active socket immediately — otherwise a still-connected\n * client would keep the event loop alive and block process shutdown.\n */\n async close(): Promise<void> {\n try {\n this.activeClient?.terminate();\n } catch {\n // already closed\n }\n this.activeClient = null;\n this.wss?.close();\n this.wss = null;\n const httpServer = this.httpServer;\n this.httpServer = null;\n if (httpServer) {\n httpServer.closeAllConnections();\n await new Promise<void>((resolve) => httpServer.close(() => resolve()));\n }\n }\n\n send(event: AgentEvent): void {\n this.sendRaw(event);\n }\n\n onCommand(handler: (command: AgentCommand) => void): () => void {\n this.commandHandlers.add(handler);\n return () => {\n this.commandHandlers.delete(handler);\n };\n }\n\n onConnect(handler: () => void): () => void {\n this.connectHandlers.add(handler);\n return () => {\n this.connectHandlers.delete(handler);\n };\n }\n\n onDisconnect(handler: () => void): () => void {\n this.disconnectHandlers.add(handler);\n return () => {\n this.disconnectHandlers.delete(handler);\n };\n }\n\n get connected(): boolean {\n return this.activeClient !== null;\n }\n\n /** The port actually bound by `listen()` (resolves `port: 0`); `undefined` when not listening. */\n get boundPort(): number | undefined {\n const addr = this.httpServer?.address();\n return typeof addr === \"object\" && addr ? addr.port : undefined;\n }\n\n private sendRaw(data: unknown): void {\n try {\n const client = this.activeClient;\n if (client && client.readyState === 1) {\n client.send(JSON.stringify(data));\n }\n } catch {\n // Silently ignore send failures\n }\n }\n}\n"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createSpinner } from './chunk-NESV47MF.js';
|
|
2
|
-
import { logInfo, logWarn, TARGET_DEFAULT_HINT, logErr, logOk, colorRef, S, requireProjectConfig, warnLegacyClaudeCopies, formatSoftDepHint } from './chunk-
|
|
3
|
-
import { getKindRegistry } from './chunk-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { logInfo, logWarn, TARGET_DEFAULT_HINT, logErr, logOk, colorRef, S, requireProjectConfig, warnLegacyClaudeCopies, formatSoftDepHint } from './chunk-POQ6PGNE.js';
|
|
3
|
+
import { getKindRegistry } from './chunk-GWD3QNVS.js';
|
|
4
|
+
import { verifyConventionItems } from './chunk-N5M2EISA.js';
|
|
5
|
+
import { AssetManager } from './chunk-TVAR4JHA.js';
|
|
6
|
+
import { readLock } from './chunk-T5TSLSRO.js';
|
|
7
|
+
import { SourceEntryError, effectiveAgentInstances, resolveSkWorkspaceConfig, resolveAgentDefinitionDir, AgentRefResolutionError } from './chunk-PNOGX36L.js';
|
|
7
8
|
import { userConfigPath } from './chunk-L5VSIPQD.js';
|
|
8
9
|
import { SUPPORTED_DRIVER_TARGETS } from './chunk-CPSIPIX7.js';
|
|
9
|
-
import { parseAssetRef } from './chunk-
|
|
10
|
+
import { parseAssetRef } from './chunk-PNTXHTBC.js';
|
|
10
11
|
import path from 'path';
|
|
11
12
|
import * as p from '@clack/prompts';
|
|
12
13
|
import { Command } from 'commander';
|
|
@@ -108,7 +109,7 @@ async function runRefInstall(ref, opts) {
|
|
|
108
109
|
const spinner = createSpinner();
|
|
109
110
|
spinner.start(`Installing ${ref}`);
|
|
110
111
|
try {
|
|
111
|
-
const { openCatalogSource, openLibrary } = await import('./open-library-
|
|
112
|
+
const { openCatalogSource, openLibrary } = await import('./open-library-N6ESO6IK.js');
|
|
112
113
|
const catalog = await openCatalogSource({ projectDir: path.resolve(opts.projectDir) });
|
|
113
114
|
if (!supportsInstallManifest(catalog)) {
|
|
114
115
|
throw new Error(
|
|
@@ -151,7 +152,7 @@ async function runYamlInstall(opts) {
|
|
|
151
152
|
}
|
|
152
153
|
requireProjectConfig(projectDir);
|
|
153
154
|
try {
|
|
154
|
-
const { ensureSourcesCloned } = await import('./ensure-sources-
|
|
155
|
+
const { ensureSourcesCloned } = await import('./ensure-sources-POMEQSTM.js');
|
|
155
156
|
const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
|
|
156
157
|
if (hydrate.cloned.length > 0) {
|
|
157
158
|
logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
|
|
@@ -266,14 +267,39 @@ function makeCheckCommand() {
|
|
|
266
267
|
projectDir: path.resolve(opts.projectDir)
|
|
267
268
|
});
|
|
268
269
|
const { gaps } = await am.projectState();
|
|
269
|
-
|
|
270
|
+
const edited = await editedConventionFiles(path.resolve(opts.projectDir));
|
|
271
|
+
if (gaps.length === 0 && edited.length === 0) {
|
|
270
272
|
logOk("All dependencies satisfied.");
|
|
271
273
|
} else {
|
|
272
274
|
for (const g of gaps) logErr(g.message);
|
|
275
|
+
for (const e of edited) logErr(e);
|
|
273
276
|
process.exit(1);
|
|
274
277
|
}
|
|
275
278
|
});
|
|
276
279
|
}
|
|
280
|
+
async function editedConventionFiles(projectDir) {
|
|
281
|
+
const instances = effectiveAgentInstances(resolveSkWorkspaceConfig(projectDir));
|
|
282
|
+
const messages = [];
|
|
283
|
+
const seen = /* @__PURE__ */ new Set();
|
|
284
|
+
for (const [id, instance] of Object.entries(instances)) {
|
|
285
|
+
let agentDir;
|
|
286
|
+
try {
|
|
287
|
+
agentDir = resolveAgentDefinitionDir(projectDir, instance.ref);
|
|
288
|
+
} catch (err) {
|
|
289
|
+
if (err instanceof AgentRefResolutionError) continue;
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
if (!agentDir || seen.has(agentDir)) continue;
|
|
293
|
+
seen.add(agentDir);
|
|
294
|
+
const drifted = await verifyConventionItems({
|
|
295
|
+
agentDir,
|
|
296
|
+
projectDir,
|
|
297
|
+
registry: getKindRegistry()
|
|
298
|
+
});
|
|
299
|
+
for (const err of drifted) messages.push(`${instance.ref} (instance ${id}): ${err.message}`);
|
|
300
|
+
}
|
|
301
|
+
return messages;
|
|
302
|
+
}
|
|
277
303
|
function makeCleanCommand() {
|
|
278
304
|
return new Command("clean").description("Remove all skaile-managed assets from the workspace").option("--all", "Full reset: also remove history, patches, repos, and lock file").option("--dry-run", "Show what would be removed without doing it").option("-y, --yes", "Skip confirmation prompt").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", `Agent framework (${TARGET_DEFAULT_HINT})`).action(async (opts) => {
|
|
279
305
|
const am = new AssetManager({
|
|
@@ -334,5 +360,5 @@ function makeCleanCommand() {
|
|
|
334
360
|
}
|
|
335
361
|
|
|
336
362
|
export { REF_HINT, makeCheckCommand, makeCleanCommand, makeInstallCommand, reportAgentInstances, reportInstalledSoftDeps, reportMoved, reportPresetExpansions, reportRelocked, reportReplaced, runPointerOnlyInstall, supportsInstallManifest };
|
|
337
|
-
//# sourceMappingURL=chunk-
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
363
|
+
//# sourceMappingURL=chunk-P23WJCH2.js.map
|
|
364
|
+
//# sourceMappingURL=chunk-P23WJCH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../cli/src/commands/project.ts"],"names":["confirm"],"mappings":"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","file":"chunk-P23WJCH2.js","sourcesContent":["import path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport {\n AssetManager,\n type InstalledAgentInstance,\n type LibraryMove,\n type ReplacedAsset,\n} from \"@skaile/workspaces/asset-manager\";\nimport {\n AgentRefResolutionError,\n type DriverTarget,\n effectiveAgentInstances,\n type PresetExpansion,\n parseAssetRef,\n readLock,\n resolveAgentDefinitionDir,\n resolveSkWorkspaceConfig,\n SUPPORTED_DRIVER_TARGETS,\n SourceEntryError,\n userConfigPath,\n} from \"@skaile/workspaces/core\";\nimport { verifyConventionItems } from \"@skaile/workspaces/runner\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\nimport { Command } from \"commander\";\nimport {\n colorRef,\n requireProjectConfig,\n formatSoftDepHint,\n logErr,\n logInfo,\n logOk,\n logWarn,\n S,\n TARGET_DEFAULT_HINT,\n warnLegacyClaudeCopies,\n} from \"../helpers.ts\";\nimport { createSpinner } from \"../spinner.ts\";\nimport { getKindRegistry } from \"../open-registry.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/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/** 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/**\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 * driver 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 .action(runInstallCommand);\n}\n\n/** Options shape accepted by the `skaile install` command action. */\ninterface InstallCommandOptions {\n locked?: boolean;\n projectDir: string;\n target?: string;\n global?: boolean;\n harness?: string;\n link?: boolean;\n}\n\n/**\n * Parse a `--harness a,b` value into validated {@link DriverTarget}s, exiting on\n * an unknown id. Returns `undefined` when the flag is absent (resolve the full\n * global set instead).\n */\nfunction parseHarnessFilter(raw: string | undefined): DriverTarget[] | undefined {\n if (!raw) return undefined;\n const ids = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const out: DriverTarget[] = [];\n for (const id of ids) {\n if (!(SUPPORTED_DRIVER_TARGETS as string[]).includes(id)) {\n logErr(`unknown harness '${id}' — expected one of: ${SUPPORTED_DRIVER_TARGETS.join(\", \")}`);\n process.exit(1);\n }\n out.push(id as DriverTarget);\n }\n return out.length > 0 ? out : undefined;\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 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 (/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). */\nasync 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 // 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 am = new AssetManager({\n registry: getKindRegistry(),\n projectDir,\n driverTarget: opts.target as DriverTarget,\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 });\n spinner.stop(\n result.agentInstanceErrors?.length || result.missing.length > 0 ? \"Failed\" : \"Done\",\n );\n if (result.deployed.length > 0) {\n for (const d of result.deployed) logOk(d);\n }\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 reportPresetExpansions(result.presets);\n reportAgentInstances(result.agentInstances, result.agentFilesRemoved);\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 if (\n result.deployed.length === 0 &&\n result.removed.length === 0 &&\n !result.replaced?.length &&\n result.missing.length === 0 &&\n !result.relocked?.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 logErr(\n `${result.agentInstanceErrors.length} agent instance(s) could not be rendered (see above)`,\n );\n process.exitCode = 1;\n }\n if (result.missing.length > 0) {\n for (const m of result.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 (result.lockWritten) {\n logInfo(`Lock file written: ${S.dim(\"skaile.lock.yaml\")}`);\n }\n warnLegacyClaudeCopies(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: DriverTarget[] | 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 });\n spinner.stop(result.missing.length > 0 ? \"Failed\" : \"Done\");\n if (result.deployed.length > 0) for (const d of result.deployed) logOk(d);\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 reportMoved(result.moved);\n if (\n result.deployed.length === 0 &&\n result.removed.length === 0 &&\n !result.replaced?.length &&\n result.missing.length === 0 &&\n !result.relocked?.length &&\n !result.moved?.length\n )\n logInfo(\"Nothing to install (already up to date).\");\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\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/**\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 .action(async (opts) => {\n requireProjectConfig(opts.projectDir);\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 if (gaps.length === 0 && edited.length === 0) {\n logOk(\"All dependencies satisfied.\");\n } else {\n for (const g of gaps) logErr(g.message);\n for (const e of edited) logErr(e);\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. A binding that resolves to no agent is a\n * `projectState` gap, not reported here.\n */\nasync function editedConventionFiles(projectDir: string): Promise<string[]> {\n const instances = effectiveAgentInstances(resolveSkWorkspaceConfig(projectDir));\n const messages: string[] = [];\n const seen = new Set<string>();\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 || seen.has(agentDir)) continue;\n seen.add(agentDir);\n const drifted = await verifyConventionItems({\n agentDir,\n projectDir,\n registry: getKindRegistry(),\n });\n for (const err of drifted) messages.push(`${instance.ref} (instance ${id}): ${err.message}`);\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 .action(async (opts) => {\n const am = new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.resolve(opts.projectDir),\n driverTarget: opts.target as DriverTarget,\n });\n\n // Preview: load lock file to show what will be cleaned\n const lock = readLock(path.resolve(opts.projectDir, \"skaile.lock.yaml\"));\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 console.log(` ${S.dim(\".skaile/history.yaml\")}`);\n console.log(` ${S.dim(\".skaile/patches/\")}`);\n console.log(` ${S.dim(\"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"]}
|