@skaile/workspaces 6.1.0 → 6.3.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 +57 -0
- package/dist/ai-sdk.d.ts +2 -0
- package/dist/ai-sdk.js +111 -0
- package/dist/ai-sdk.js.map +1 -0
- package/dist/{asset-feeds-HJFV7UPW.js → asset-feeds-3YO2352Y.js} +26 -26
- package/dist/{asset-feeds-HJFV7UPW.js.map → asset-feeds-3YO2352Y.js.map} +1 -1
- package/dist/asset-manager/catalog-deployer.js +10 -10
- package/dist/asset-manager/fragments.js +1 -1
- package/dist/asset-manager/index.js +18 -18
- package/dist/asset-manager/installer.js +13 -13
- package/dist/asset-manager/renderers.js +11 -11
- package/dist/asset-manager/src/index.d.ts +149 -16
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts +9 -0
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/asset-manager/src/renderers.d.ts +7 -0
- package/dist/asset-manager/src/renderers.d.ts.map +1 -1
- package/dist/bridge/harnesses/claude-sdk.js +16 -15
- package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
- package/dist/bridge/harnesses/codex.js +25 -17
- package/dist/bridge/harnesses/codex.js.map +1 -1
- package/dist/bridge/harnesses/continue.js +15 -14
- package/dist/bridge/harnesses/continue.js.map +1 -1
- package/dist/bridge/harnesses/echo.js +5 -4
- package/dist/bridge/harnesses/echo.js.map +1 -1
- package/dist/bridge/harnesses/gemini.js +11 -10
- package/dist/bridge/harnesses/goose.js +15 -14
- package/dist/bridge/harnesses/goose.js.map +1 -1
- package/dist/bridge/harnesses/omp.js +16 -8
- package/dist/bridge/harnesses/omp.js.map +1 -1
- package/dist/bridge/harnesses/opencode.js +15 -14
- package/dist/bridge/harnesses/opencode.js.map +1 -1
- package/dist/bridge/harnesses/qwen.js +11 -10
- package/dist/bridge/harnesses/qwen.js.map +1 -1
- package/dist/bridge/index.js +21 -19
- package/dist/bridge/src/ai-sdk.d.ts +46 -0
- package/dist/bridge/src/ai-sdk.d.ts.map +1 -0
- package/dist/bridge/src/harness-model-check.d.ts +15 -0
- package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
- package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
- package/dist/bridge/src/index.d.ts +2 -1
- package/dist/bridge/src/index.d.ts.map +1 -1
- package/dist/bridge/src/provider-registry-load.d.ts +30 -0
- package/dist/bridge/src/provider-registry-load.d.ts.map +1 -0
- package/dist/bridge/src/runner-private-env.d.ts +7 -0
- package/dist/bridge/src/runner-private-env.d.ts.map +1 -1
- package/dist/{chunk-SVTMNSPI.js → chunk-2TFKXSB5.js} +5 -5
- package/dist/{chunk-SVTMNSPI.js.map → chunk-2TFKXSB5.js.map} +1 -1
- package/dist/{chunk-NB7SYQYP.js → chunk-32FYVSSW.js} +9 -28
- package/dist/chunk-32FYVSSW.js.map +1 -0
- package/dist/{chunk-QAKUD6QN.js → chunk-4QRJBY2P.js} +3 -3
- package/dist/{chunk-QAKUD6QN.js.map → chunk-4QRJBY2P.js.map} +1 -1
- package/dist/{chunk-XFIEVEU7.js → chunk-6OHZUUR7.js} +5 -4
- package/dist/chunk-6OHZUUR7.js.map +1 -0
- package/dist/{chunk-ILLTBKDJ.js → chunk-6UP2EDFN.js} +4 -313
- package/dist/chunk-6UP2EDFN.js.map +1 -0
- package/dist/{chunk-ZDLUQLI6.js → chunk-6WH2WE4B.js} +15 -5
- package/dist/chunk-6WH2WE4B.js.map +1 -0
- package/dist/{chunk-HPMQRAIF.js → chunk-72NT2TJU.js} +8 -7
- package/dist/chunk-72NT2TJU.js.map +1 -0
- package/dist/{chunk-E572OHGY.js → chunk-76FLBODK.js} +4 -3
- package/dist/chunk-76FLBODK.js.map +1 -0
- package/dist/{chunk-5Y2KGB4H.js → chunk-7MV3NHPT.js} +35 -9
- package/dist/chunk-7MV3NHPT.js.map +1 -0
- package/dist/{chunk-QEULL4Q3.js → chunk-7QG2WRSN.js} +77 -18
- package/dist/chunk-7QG2WRSN.js.map +1 -0
- package/dist/{chunk-6YR4ALVX.js → chunk-7RH6E332.js} +7 -7
- package/dist/{chunk-6YR4ALVX.js.map → chunk-7RH6E332.js.map} +1 -1
- package/dist/{chunk-BBBCJSSU.js → chunk-7TSNR5H5.js} +4 -4
- package/dist/{chunk-BBBCJSSU.js.map → chunk-7TSNR5H5.js.map} +1 -1
- package/dist/{chunk-3GMOPFWH.js → chunk-AMJ6KEV7.js} +4 -4
- package/dist/{chunk-3GMOPFWH.js.map → chunk-AMJ6KEV7.js.map} +1 -1
- package/dist/{chunk-X3YGUKCG.js → chunk-BPTWWKGF.js} +3 -3
- package/dist/{chunk-X3YGUKCG.js.map → chunk-BPTWWKGF.js.map} +1 -1
- package/dist/{chunk-Z7ZEZZB6.js → chunk-C5HFK34M.js} +3 -3
- package/dist/chunk-C5HFK34M.js.map +1 -0
- package/dist/{chunk-EJPMNDTP.js → chunk-COUJOTAJ.js} +3 -3
- package/dist/{chunk-EJPMNDTP.js.map → chunk-COUJOTAJ.js.map} +1 -1
- package/dist/{chunk-J72MO2WA.js → chunk-DU26AVK2.js} +10 -9
- package/dist/chunk-DU26AVK2.js.map +1 -0
- package/dist/{chunk-YLLVSR2U.js → chunk-E5NQRHEB.js} +30 -7
- package/dist/chunk-E5NQRHEB.js.map +1 -0
- package/dist/{chunk-XGULGQA3.js → chunk-ELSGFI3I.js} +5 -4
- package/dist/chunk-ELSGFI3I.js.map +1 -0
- package/dist/{chunk-IHFGPHCT.js → chunk-EQNIBBB6.js} +49 -25
- package/dist/chunk-EQNIBBB6.js.map +1 -0
- package/dist/{chunk-BFMYYNDT.js → chunk-F3D25RGM.js} +11 -3
- package/dist/chunk-F3D25RGM.js.map +1 -0
- package/dist/{chunk-GNZBFSRB.js → chunk-H622YULS.js} +5 -4
- package/dist/chunk-H622YULS.js.map +1 -0
- package/dist/{chunk-FKQNBCDW.js → chunk-HDVLBEEX.js} +4 -4
- package/dist/{chunk-FKQNBCDW.js.map → chunk-HDVLBEEX.js.map} +1 -1
- package/dist/{chunk-AATHJRKL.js → chunk-HGOJEVHY.js} +4 -4
- package/dist/{chunk-AATHJRKL.js.map → chunk-HGOJEVHY.js.map} +1 -1
- package/dist/{chunk-CEKW3KXP.js → chunk-HH2H2ZV7.js} +18 -15
- package/dist/chunk-HH2H2ZV7.js.map +1 -0
- package/dist/{chunk-ZFUZ5AKM.js → chunk-HTGTNN2B.js} +3 -3
- package/dist/{chunk-ZFUZ5AKM.js.map → chunk-HTGTNN2B.js.map} +1 -1
- package/dist/{chunk-LSSYC5IC.js → chunk-IZQOO6MN.js} +2 -2
- package/dist/{chunk-LSSYC5IC.js.map → chunk-IZQOO6MN.js.map} +1 -1
- package/dist/{chunk-VMVDAZLA.js → chunk-J5JRGBKK.js} +108 -19
- package/dist/chunk-J5JRGBKK.js.map +1 -0
- package/dist/{chunk-7LP7RCZI.js → chunk-JGH7NB47.js} +5 -5
- package/dist/{chunk-7LP7RCZI.js.map → chunk-JGH7NB47.js.map} +1 -1
- package/dist/{chunk-RHN5MRQO.js → chunk-JMIKGAUA.js} +27 -5
- package/dist/chunk-JMIKGAUA.js.map +1 -0
- package/dist/{chunk-HWNK3F3X.js → chunk-KGHYXXXV.js} +588 -76
- package/dist/chunk-KGHYXXXV.js.map +1 -0
- package/dist/{chunk-7HX6FNKL.js → chunk-KIPCBIFJ.js} +41 -56
- package/dist/chunk-KIPCBIFJ.js.map +1 -0
- package/dist/{chunk-ZBHZLWV3.js → chunk-KPKGWXUJ.js} +4 -4
- package/dist/{chunk-ZBHZLWV3.js.map → chunk-KPKGWXUJ.js.map} +1 -1
- package/dist/{chunk-ABFPSVIS.js → chunk-LD6O6QKU.js} +31 -7
- package/dist/chunk-LD6O6QKU.js.map +1 -0
- package/dist/{chunk-AZ2H6R5I.js → chunk-LEJQAX7G.js} +74 -39
- package/dist/chunk-LEJQAX7G.js.map +1 -0
- package/dist/{chunk-ZAELRYKS.js → chunk-MD3FUZS3.js} +3 -3
- package/dist/{chunk-ZAELRYKS.js.map → chunk-MD3FUZS3.js.map} +1 -1
- package/dist/{chunk-NUA33BYO.js → chunk-MYXFR27L.js} +42 -15
- package/dist/chunk-MYXFR27L.js.map +1 -0
- package/dist/{chunk-KUQAJVYT.js → chunk-PHAMYCZH.js} +142 -28
- package/dist/chunk-PHAMYCZH.js.map +1 -0
- package/dist/{chunk-NOA6EJXE.js → chunk-PKE3PXOK.js} +3 -3
- package/dist/{chunk-NOA6EJXE.js.map → chunk-PKE3PXOK.js.map} +1 -1
- package/dist/{chunk-RDTLPOPD.js → chunk-PL52CI4U.js} +4 -4
- package/dist/{chunk-RDTLPOPD.js.map → chunk-PL52CI4U.js.map} +1 -1
- package/dist/{chunk-VYVTEMAW.js → chunk-PNUM7GUY.js} +3 -3
- package/dist/{chunk-VYVTEMAW.js.map → chunk-PNUM7GUY.js.map} +1 -1
- package/dist/{chunk-DIGFA7Z5.js → chunk-Q7CU5GQO.js} +13 -5
- package/dist/chunk-Q7CU5GQO.js.map +1 -0
- package/dist/chunk-QFFMFZIR.js +32 -0
- package/dist/chunk-QFFMFZIR.js.map +1 -0
- package/dist/{chunk-HMISULVD.js → chunk-QK7AG5AV.js} +4 -4
- package/dist/{chunk-HMISULVD.js.map → chunk-QK7AG5AV.js.map} +1 -1
- package/dist/{chunk-2LAPHLDH.js → chunk-QTLUZUF2.js} +45 -35
- package/dist/chunk-QTLUZUF2.js.map +1 -0
- package/dist/{chunk-4MUDQCBP.js → chunk-RFQONXET.js} +3 -3
- package/dist/{chunk-4MUDQCBP.js.map → chunk-RFQONXET.js.map} +1 -1
- package/dist/{chunk-AITJ7ELM.js → chunk-ROVZCGTN.js} +59 -23
- package/dist/chunk-ROVZCGTN.js.map +1 -0
- package/dist/{chunk-LSI2IVFT.js → chunk-RXGPFAMN.js} +4 -3
- package/dist/chunk-RXGPFAMN.js.map +1 -0
- package/dist/chunk-S6KZHPR4.js +315 -0
- package/dist/chunk-S6KZHPR4.js.map +1 -0
- package/dist/{chunk-EX3GLAL6.js → chunk-TGV2EWGL.js} +5 -5
- package/dist/{chunk-EX3GLAL6.js.map → chunk-TGV2EWGL.js.map} +1 -1
- package/dist/{chunk-QSYQOTWN.js → chunk-TO5SSMRI.js} +58 -5
- package/dist/chunk-TO5SSMRI.js.map +1 -0
- package/dist/{chunk-Z3VKUWAX.js → chunk-TSTRH4SM.js} +3 -3
- package/dist/{chunk-Z3VKUWAX.js.map → chunk-TSTRH4SM.js.map} +1 -1
- package/dist/{chunk-5J4NPGFM.js → chunk-U3SXCVR7.js} +5 -5
- package/dist/{chunk-5J4NPGFM.js.map → chunk-U3SXCVR7.js.map} +1 -1
- package/dist/{chunk-IRYKRKVQ.js → chunk-URCJIV7T.js} +3 -3
- package/dist/{chunk-IRYKRKVQ.js.map → chunk-URCJIV7T.js.map} +1 -1
- package/dist/{chunk-ASWTQQ7E.js → chunk-V5BPDB4J.js} +3 -3
- package/dist/{chunk-ASWTQQ7E.js.map → chunk-V5BPDB4J.js.map} +1 -1
- package/dist/{chunk-ADPM6AYF.js → chunk-VSX2G7LA.js} +3 -3
- package/dist/{chunk-ADPM6AYF.js.map → chunk-VSX2G7LA.js.map} +1 -1
- package/dist/{chunk-4FVIT5DI.js → chunk-VUWRGMT6.js} +3 -3
- package/dist/{chunk-4FVIT5DI.js.map → chunk-VUWRGMT6.js.map} +1 -1
- package/dist/{chunk-ZHGKAZJ7.js → chunk-XBQTXGY4.js} +56 -8
- package/dist/chunk-XBQTXGY4.js.map +1 -0
- package/dist/{chunk-UI745XC3.js → chunk-XEVFSDIF.js} +13 -7
- package/dist/chunk-XEVFSDIF.js.map +1 -0
- package/dist/{chunk-S2XHGWQC.js → chunk-Y3I4KGLX.js} +44 -15
- package/dist/chunk-Y3I4KGLX.js.map +1 -0
- package/dist/{chunk-COYF6IG2.js → chunk-YW4ASEUP.js} +5 -5
- package/dist/{chunk-COYF6IG2.js.map → chunk-YW4ASEUP.js.map} +1 -1
- package/dist/{chunk-DGTI65OC.js → chunk-ZEH4WFEG.js} +17 -11
- package/dist/chunk-ZEH4WFEG.js.map +1 -0
- package/dist/{claude-code-RE46FJXI.js → claude-code-EUKDGOOO.js} +5 -5
- package/dist/{claude-code-RE46FJXI.js.map → claude-code-EUKDGOOO.js.map} +1 -1
- package/dist/cli/index.js +350 -141
- 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/diff.d.ts.map +1 -1
- package/dist/cli/src/commands/harness.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-index.d.ts +8 -1
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
- package/dist/cli/src/commands/outdated.d.ts.map +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/providers.d.ts.map +1 -1
- package/dist/cli/src/commands/rebuild.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 +31 -1
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/serve.d.ts +10 -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 +19 -7
- package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
- package/dist/cli/src/commands/validate-instances.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/config-checks.d.ts +23 -5
- package/dist/cli/src/config-checks.d.ts.map +1 -1
- package/dist/cli/src/harness-error.d.ts +12 -1
- package/dist/cli/src/harness-error.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts +18 -8
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/index.d.ts +10 -1
- package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/spec.d.ts +8 -0
- package/dist/cli/src/plugin-store/spec.d.ts.map +1 -1
- package/dist/cli/src/skill-checks.d.ts +2 -2
- package/dist/cli/src/skill-checks.d.ts.map +1 -1
- package/dist/connectors/config.js +5 -5
- package/dist/connectors/index.js +24 -22
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors-XYPE2DCQ.js +50 -0
- package/dist/{connectors-7THEF7YA.js.map → connectors-XYPE2DCQ.js.map} +1 -1
- package/dist/core/framework.js +1 -1
- package/dist/core/index.js +9 -9
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/provider-registry-credentials.js +2 -2
- package/dist/core/provider-registry.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/framework.d.ts +5 -3
- package/dist/core/src/framework.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +2 -1
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +12 -0
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +15 -0
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +7 -0
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/provider-registry.d.ts +6 -0
- package/dist/core/src/provider-registry.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +10 -1
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
- package/dist/core/workspace-config.js +4 -4
- package/dist/deploy/index.js +9 -9
- package/dist/discovery/index.js +5 -5
- package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
- package/dist/{ensure-sources-IH7CHSJF.js → ensure-sources-IN3VKHUA.js} +37 -21
- package/dist/ensure-sources-IN3VKHUA.js.map +1 -0
- package/dist/factory-assets/connectors/box.js +24 -22
- package/dist/factory-assets/connectors/deploy.js +24 -22
- package/dist/factory-assets/connectors/devserver.js +24 -22
- package/dist/factory-assets/connectors/flow/adapter.js +24 -22
- package/dist/factory-assets/connectors/flow/engine.js +10 -10
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +26 -24
- package/dist/factory-assets/connectors/flow.js +24 -22
- package/dist/factory-assets/connectors/git.js +24 -22
- package/dist/factory-assets/connectors/gmail.js +24 -22
- package/dist/factory-assets/connectors/googledrive.js +24 -22
- package/dist/factory-assets/connectors/local.js +24 -22
- package/dist/factory-assets/connectors/mattermost.js +24 -22
- package/dist/factory-assets/connectors/memory.js +24 -22
- package/dist/factory-assets/connectors/minio.js +24 -22
- package/dist/factory-assets/connectors/postgres.js +24 -22
- package/dist/factory-assets/connectors/s3.js +24 -22
- package/dist/factory-assets/connectors/sharepoint.js +24 -22
- package/dist/factory-assets/connectors/sqlite.js +24 -22
- package/dist/factory-assets/connectors/static-server.js +24 -22
- package/dist/factory-assets/connectors/tunnel.js +24 -22
- package/dist/factory-assets/connectors/webdav.js +24 -22
- package/dist/factory-assets/connectors/xstate-store.js +24 -22
- package/dist/factory-assets/connectors/xstate.js +24 -22
- package/dist/flows-QAO63TDV.js +26 -0
- package/dist/{flows-4JZQ3XFK.js.map → flows-QAO63TDV.js.map} +1 -1
- package/dist/helpers-HDVGCF3M.js +54 -0
- package/dist/{helpers-JNMK3FC2.js.map → helpers-HDVGCF3M.js.map} +1 -1
- package/dist/library/index.js +14 -14
- package/dist/library/install.js +5 -5
- package/dist/library/src/index.d.ts +1 -1
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/install/index.d.ts +1 -1
- package/dist/library/src/install/index.d.ts.map +1 -1
- package/dist/library/src/install/install-from-manifest.d.ts +13 -0
- package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
- package/dist/library/src/install/source-fetch-github.d.ts.map +1 -1
- package/dist/library/src/manifest-writer.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +3 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/library/src/remote/rest-catalog-source.d.ts +3 -2
- package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
- package/dist/{library-publish-I3UWXAHI.js → library-publish-62OWCNB5.js} +56 -55
- package/dist/library-publish-62OWCNB5.js.map +1 -0
- package/dist/model-endpoint/index.js +13 -12
- package/dist/model-endpoint/src/openai-chat.d.ts +7 -2
- package/dist/model-endpoint/src/openai-chat.d.ts.map +1 -1
- package/dist/model-endpoint/src/openai-shared.d.ts +8 -0
- package/dist/model-endpoint/src/openai-shared.d.ts.map +1 -1
- package/dist/model-endpoint/src/server.d.ts.map +1 -1
- package/dist/model-endpoint/src/types.d.ts +1 -1
- package/dist/model-endpoint/src/types.d.ts.map +1 -1
- package/dist/model-endpoint/src/usage-cost.d.ts +23 -0
- package/dist/model-endpoint/src/usage-cost.d.ts.map +1 -0
- package/dist/open-library-TZ7OSDEJ.js +58 -0
- package/dist/{open-library-NKKUJLWA.js.map → open-library-TZ7OSDEJ.js.map} +1 -1
- package/dist/open-registry-RLZKTJG3.js +32 -0
- package/dist/{open-registry-BYAXSHUI.js.map → open-registry-RLZKTJG3.js.map} +1 -1
- package/dist/paths-D6LBQETQ.js +22 -0
- package/dist/{paths-UKWE35XS.js.map → paths-D6LBQETQ.js.map} +1 -1
- package/dist/plugin-store-A5J4TLCH.js +23 -0
- package/dist/{plugin-store-ABE35NRX.js.map → plugin-store-A5J4TLCH.js.map} +1 -1
- package/dist/project-4AVRES3M.js +88 -0
- package/dist/{project-BIPK47JK.js.map → project-4AVRES3M.js.map} +1 -1
- package/dist/resolver/index.js +10 -10
- package/dist/runner/index.js +41 -39
- package/dist/runner/src/capability-roundtrip.d.ts +7 -6
- package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +6 -5
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +18 -18
- package/dist/sdk/bridge.js +21 -19
- package/dist/sdk/core.js +9 -9
- package/dist/sdk/flow.js +10 -10
- package/dist/sdk/index.js +41 -39
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +10 -10
- package/dist/sdk/runner.js +41 -39
- package/dist/sdk/transport/ws/server.js +10 -10
- package/dist/sdk/transport/ws.js +10 -10
- package/dist/sdk/transport.js +10 -10
- package/dist/{serve-preflight-FLTIBTEX.js → serve-preflight-H2AYMGJ6.js} +65 -35
- package/dist/serve-preflight-H2AYMGJ6.js.map +1 -0
- package/dist/{setup-AG6NFHSN.js → setup-NSPQD4V4.js} +33 -31
- package/dist/setup-NSPQD4V4.js.map +1 -0
- package/dist/skills-B533SRVZ.js +26 -0
- package/dist/{skills-UQYUHVKO.js.map → skills-B533SRVZ.js.map} +1 -1
- package/dist/source-VTECABUO.js +87 -0
- package/dist/{source-ASEHI2XS.js.map → source-VTECABUO.js.map} +1 -1
- package/dist/source-fetch-github-RWHV4I5Z.js +4 -0
- package/dist/{source-fetch-github-ST4MFL3D.js.map → source-fetch-github-RWHV4I5Z.js.map} +1 -1
- package/dist/{source-manifest-publish-IEVV3W6J.js → source-manifest-publish-YORI42MN.js} +56 -56
- package/dist/source-manifest-publish-YORI42MN.js.map +1 -0
- package/dist/transport/index.js +10 -10
- package/dist/transport/ws/server.js +10 -10
- package/dist/transport/ws.js +10 -10
- package/dist/tui/index.js +49 -40
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/src/repl.d.ts.map +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/manifests/index.d.ts +1 -1
- package/dist/types/src/manifests/index.d.ts.map +1 -1
- package/dist/types/src/manifests/scaffold-body.d.ts +2 -0
- package/dist/types/src/manifests/scaffold-body.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +31 -29
- package/dist/workspace-plugin/adapters/omp.js +15 -15
- package/dist/workspace-plugin/index.js +2 -2
- package/package.json +27 -1
- package/dist/chunk-2LAPHLDH.js.map +0 -1
- package/dist/chunk-5Y2KGB4H.js.map +0 -1
- package/dist/chunk-7HX6FNKL.js.map +0 -1
- package/dist/chunk-ABFPSVIS.js.map +0 -1
- package/dist/chunk-AITJ7ELM.js.map +0 -1
- package/dist/chunk-AZ2H6R5I.js.map +0 -1
- package/dist/chunk-BFMYYNDT.js.map +0 -1
- package/dist/chunk-CEKW3KXP.js.map +0 -1
- package/dist/chunk-DGTI65OC.js.map +0 -1
- package/dist/chunk-DIGFA7Z5.js.map +0 -1
- package/dist/chunk-E572OHGY.js.map +0 -1
- package/dist/chunk-GNZBFSRB.js.map +0 -1
- package/dist/chunk-HPMQRAIF.js.map +0 -1
- package/dist/chunk-HWNK3F3X.js.map +0 -1
- package/dist/chunk-IHFGPHCT.js.map +0 -1
- package/dist/chunk-ILLTBKDJ.js.map +0 -1
- package/dist/chunk-J72MO2WA.js.map +0 -1
- package/dist/chunk-KUQAJVYT.js.map +0 -1
- package/dist/chunk-LSI2IVFT.js.map +0 -1
- package/dist/chunk-NB7SYQYP.js.map +0 -1
- package/dist/chunk-NUA33BYO.js.map +0 -1
- package/dist/chunk-QEULL4Q3.js.map +0 -1
- package/dist/chunk-QSYQOTWN.js.map +0 -1
- package/dist/chunk-RHN5MRQO.js.map +0 -1
- package/dist/chunk-S2XHGWQC.js.map +0 -1
- package/dist/chunk-UI745XC3.js.map +0 -1
- package/dist/chunk-VMVDAZLA.js.map +0 -1
- package/dist/chunk-XFIEVEU7.js.map +0 -1
- package/dist/chunk-XGULGQA3.js.map +0 -1
- package/dist/chunk-YLLVSR2U.js.map +0 -1
- package/dist/chunk-Z7ZEZZB6.js.map +0 -1
- package/dist/chunk-ZDLUQLI6.js.map +0 -1
- package/dist/chunk-ZHGKAZJ7.js.map +0 -1
- package/dist/connectors-7THEF7YA.js +0 -48
- package/dist/ensure-sources-IH7CHSJF.js.map +0 -1
- package/dist/flows-4JZQ3XFK.js +0 -26
- package/dist/helpers-JNMK3FC2.js +0 -38
- package/dist/library-publish-I3UWXAHI.js.map +0 -1
- package/dist/open-library-NKKUJLWA.js +0 -42
- package/dist/open-registry-BYAXSHUI.js +0 -32
- package/dist/paths-UKWE35XS.js +0 -22
- package/dist/plugin-store-ABE35NRX.js +0 -23
- package/dist/project-BIPK47JK.js +0 -86
- package/dist/serve-preflight-FLTIBTEX.js.map +0 -1
- package/dist/setup-AG6NFHSN.js.map +0 -1
- package/dist/skills-UQYUHVKO.js +0 -26
- package/dist/source-ASEHI2XS.js +0 -85
- package/dist/source-fetch-github-ST4MFL3D.js +0 -4
- package/dist/source-manifest-publish-IEVV3W6J.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../model-endpoint/src/types.ts","../model-endpoint/src/resolve.ts","../model-endpoint/src/openai-shared.ts","../model-endpoint/src/openai-chat.ts","../model-endpoint/src/openai-responses.ts","../model-endpoint/src/server.ts"],"names":["parseTools","item","isRecord","chunk"],"mappings":"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","file":"chunk-KUQAJVYT.js","sourcesContent":["/**\n * Shared types of the model endpoint.\n *\n * No import from pi-ai lives here, not even a type-only one: this file is part of\n * the public `.d.ts` of `@skaile/workspaces/model-endpoint`, and pi-ai is an\n * optional peer. A consumer without it must still type-check (p1007). The shapes\n * below describe what the server needs of pi-ai structurally; `server.ts` and\n * `resolve.ts` cast to pi-ai's own types at the call into pi-ai.\n */\n\nimport type { MergedAIProviderRegistry } from \"@skaile/workspaces/core/provider-registry\";\n\n/** The fields of a pi-ai `Model` the endpoint sets (pi-ai's own type is assignable to it). */\nexport interface PiModel {\n /** Provider-side model id (`model_map`). */\n id: string;\n /** Logical id the caller asked for. */\n name: string;\n /** Surface of the registry entry (pi-ai `Api`). */\n api: string;\n /** Registry id of the entry. */\n provider: string;\n /** pi-ready entry endpoint. */\n baseUrl: string;\n input: Array<\"text\" | \"image\">;\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number };\n reasoning: boolean;\n contextWindow: number;\n maxTokens: number;\n headers?: Record<string, string>;\n}\n\n/** Everything one upstream call needs. */\nexport interface ResolvedModel {\n /** Registry id of the entry the model routes to. */\n providerId: string;\n /** Model id the caller asked for, after `@role` / provider-prefix stripping. */\n logicalId: string;\n /** pi model: `api` = entry surface, `baseUrl` = pi-ready entry endpoint, `id` = provider-side id (`model_map`). */\n model: PiModel;\n /** Resolved credential; `undefined` only for entries with an ambient credential chain. */\n apiKey?: string;\n /** Static `entry.headers`. */\n headers?: Record<string, string>;\n}\n\n/** One request-log line sink. */\nexport type ModelEndpointLog = (line: string) => void;\n\n/**\n * pi-ai's per-surface `stream`, widened to the shape the server calls. The\n * context and the event type are pi-ai's `TranscriptContext` and\n * `AssistantMessageEventStream`.\n */\nexport type StreamFn = (\n model: PiModel,\n context: unknown,\n options?: Record<string, unknown>,\n) => AsyncIterable<unknown>;\n\n/** The parts of a pi-ai `api/<surface>` module the server calls. */\nexport interface PiApiModule {\n stream: StreamFn;\n streamSimple?: StreamFn;\n}\n\n/** Options of `startModelEndpoint`. */\nexport interface ModelEndpointOptions {\n /** Live registry view; read on every request so a `session_init` can swap it. */\n getRegistry(): MergedAIProviderRegistry;\n /** Env that credential refs and `SKAILE_AIP_<ID>_KEY` values resolve against; read per request. */\n getLookupEnv(): Record<string, string | undefined>;\n /** Roles table for `@role` selectors. */\n getRoles?(): Record<string, string> | undefined;\n /** Bearer token every request must present. */\n token: string;\n /** Bind address. Default `\"127.0.0.1\"`. */\n host?: string;\n /** Bind port. Default `0` (ephemeral). */\n port?: number;\n /**\n * Project directory pi-ai is looked up from first (`<projectDir>/node_modules`);\n * the copy next to skaile is the fallback. Default: the current directory.\n */\n projectDir?: string;\n /** Request-log sink. */\n log?: ModelEndpointLog;\n /**\n * Test seam: override pi-ai api loading. Default: dynamic import of `@earendil-works/pi-ai/api/<surface>`.\n * `streamSimple` (every pi api module exports it) is used when the request asks for reasoning:\n * only it maps a provider-neutral thinking level onto the surface's own effort field.\n */\n loadApi?(surface: string): Promise<PiApiModule>;\n /** Test seam for the `/v1/embeddings` pass-through. Default `globalThis.fetch`. */\n fetch?: typeof fetch;\n}\n\n/** A running endpoint. */\nexport interface ModelEndpointHandle {\n /** `http://${host}:${port}/v1` — what an OpenAI SDK takes as `baseURL`. */\n url: string;\n port: number;\n token: string;\n close(): Promise<void>;\n}\n\n/** The OpenAI error `type` values the endpoint emits. */\nexport type ModelEndpointErrorType =\n | \"invalid_request_error\"\n | \"authentication_error\"\n | \"not_found_error\"\n | \"upstream_error\"\n | \"server_error\";\n\n/**\n * A failure with a defined HTTP shape. Translators and the resolver throw it\n * so the server can render the OpenAI-style `{ error: {...} }` body without\n * each call site knowing about HTTP.\n */\nexport class ModelEndpointError extends Error {\n readonly status: number;\n readonly type: ModelEndpointErrorType;\n readonly code?: string;\n\n constructor(status: number, message: string, code?: string, type?: ModelEndpointErrorType) {\n super(message);\n this.name = \"ModelEndpointError\";\n this.status = status;\n this.type = type ?? defaultErrorType(status);\n if (code !== undefined) this.code = code;\n }\n}\n\n/** Default OpenAI `type` for an HTTP status. */\nfunction defaultErrorType(status: number): ModelEndpointErrorType {\n if (status === 401 || status === 403) return \"authentication_error\";\n if (status === 404) return \"not_found_error\";\n if (status === 502 || status === 503 || status === 504) return \"upstream_error\";\n if (status >= 500 && status !== 501) return \"server_error\";\n return \"invalid_request_error\";\n}\n","/**\n * Registry → pi `Model` + request auth.\n *\n * Reuses the registry's own resolution (`parseModelRef`, `entrySurface`,\n * `entryBaseUrl`, `entryCredentialValue`) so the endpoint routes exactly like a\n * harness does; the only logic added here is the pi-specific base-URL\n * spelling and the \"unknown model\" check `parseModelRef` does not make.\n */\n\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n type MergedAIProviderRegistry,\n parseModelRef,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { entryCredentialValue } from \"../../bridge/src/provider-materialize/credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n selectableEntries,\n} from \"../../bridge/src/provider-materialize/env-harnesses.js\";\nimport { ModelEndpointError, type ResolvedModel } from \"./types.js\";\n\n/** What {@link resolveModel} reads from the live session. */\nexport interface ResolveDeps {\n registry: MergedAIProviderRegistry;\n lookupEnv: Record<string, string | undefined>;\n roles?: Record<string, string>;\n}\n\n/** Context window assumed when an entry declares no `capabilities`. */\nconst DEFAULT_CONTEXT_WINDOW = 128_000;\n/** pi requires a max-token figure; the caller's `max_tokens` overrides it per request. */\nconst DEFAULT_MAX_TOKENS = 8192;\n/** Placeholder for keyless entries: pi's OpenAI adapter refuses an empty key. */\nconst KEYLESS_PLACEHOLDER = \"unused\";\n\n/**\n * The `baseUrl` pi-ai wants for a registry endpoint — the registry's canonical\n * value, minus trailing slashes. Verified against pi-ai 1.3.0 `dist/api/*`:\n *\n * - `anthropic-messages`: `new Anthropic({ baseURL: model.baseUrl })`; the SDK\n * appends `/v1/messages`. The registry stores Anthropic as its host root\n * (`normalizeEntryBaseUrl` strips a trailing `/v1`), which is what the SDK needs.\n * - `openai-completions` / `openai-responses`: `new OpenAI({ baseURL })`; the SDK\n * appends `/chat/completions` / `/responses`. OpenAI-style presets already carry\n * their `/v1` (openai, groq, openrouter, mistral, xai); deepseek serves the\n * same paths at its host root.\n * - `google-generative-ai`: pi sets `apiVersion: \"\"` and expects the version in\n * `baseUrl`; the preset already ends in `/v1beta`.\n * - Other surfaces (azure, bedrock, vertex, codex) are passed through unverified.\n *\n * Trailing slashes are dropped because Google's client concatenates `baseUrl` and\n * the path without normalising.\n */\nfunction piBaseUrl(_surface: AIProviderSurface, registryBaseUrl: string): string {\n return registryBaseUrl.replace(/\\/+$/, \"\");\n}\n\n/**\n * Resolve a request's `model` selector to everything one upstream call needs.\n *\n * The selector is `<providerId>/<model>`, a bare model id, or `@role`\n * (see `parseModelRef`). An entry that declares models (`model_map` /\n * `capabilities`) is a closed list: ids outside it are 404, matching what\n * `/v1/models` advertises. An entry that declares none is open and forwards the\n * id to the provider unchanged (discovery-based presets).\n */\nexport function resolveModel(selector: string, deps: ResolveDeps): ResolvedModel {\n assertKnownProviderPrefix(selector, deps);\n const ref = parseModelRef(selector, deps.registry, deps.roles);\n if (!ref || ref.modelId === undefined) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const found = selectableEntries(deps.registry).find(([id]) => id === ref.providerId);\n if (!found) {\n throw new ModelEndpointError(404, `model '${selector}' not found`, \"model_not_found\");\n }\n const [providerId, entry] = found;\n const logicalId = ref.modelId;\n\n const declared = entryModelIds(entry);\n if (declared.length > 0 && !declared.some(([id]) => id === logicalId)) {\n throw new ModelEndpointError(\n 404,\n `model '${logicalId}' is not declared by provider '${providerId}'`,\n \"model_not_found\",\n );\n }\n\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n if (!surface || !baseUrl) {\n throw new ModelEndpointError(\n 502,\n `provider '${providerId}' is incomplete: it needs a surface and a base_url`,\n \"provider_incomplete\",\n );\n }\n\n const providerModelId = ref.providerModelId ?? logicalId;\n const caps = entry.capabilities?.[logicalId];\n const model: Model<Api> = {\n id: providerModelId,\n name: logicalId,\n api: surface,\n provider: providerId,\n baseUrl: piBaseUrl(surface, baseUrl),\n input: caps?.images === false ? [\"text\"] : [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n reasoning: true,\n contextWindow: caps?.context_window ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: DEFAULT_MAX_TOKENS,\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n\n const apiKey =\n entryCredentialValue(providerId, entry, { env: deps.lookupEnv, allowCommand: false }) ??\n (isKeyless(entry) ? KEYLESS_PLACEHOLDER : undefined);\n\n return {\n providerId,\n logicalId,\n model,\n ...(apiKey !== undefined ? { apiKey } : {}),\n ...(entry.headers ? { headers: entry.headers } : {}),\n };\n}\n\n/**\n * `<x>/<y>` whose `<x>` is no entry is a typo, not a vendor-scoped bare id: sent\n * upstream it would reach the first entry and fail there (or worse, succeed). It\n * is 404, unless an entry declares the whole string in its `model_map` /\n * `capabilities`. A model of an open entry is named `<entry>/<id>`\n * (`openrouter/meta-llama/x`).\n */\nfunction assertKnownProviderPrefix(selector: string, deps: ResolveDeps): void {\n let target = selector.trim();\n if (target.startsWith(\"@\")) target = deps.roles?.[target.slice(1)]?.trim() ?? \"\";\n const slash = target.indexOf(\"/\");\n if (slash <= 0 || target.startsWith(\"@\")) return;\n const entries = selectableEntries(deps.registry);\n const head = target.slice(0, slash);\n if (entries.some(([id]) => id === head)) return;\n if (\n entries.some(\n ([, entry]) => entry.model_map?.[target] !== undefined || entry.capabilities?.[target],\n )\n ) {\n return;\n }\n throw new ModelEndpointError(\n 404,\n `model '${selector}' not found: '${head}' is not a provider of this endpoint (providers: ${entries.map(([id]) => id).join(\", \")})`,\n \"model_not_found\",\n );\n}\n\n/** True when the entry names no credential at all (local runtimes such as Ollama). */\nfunction isKeyless(entry: AIProviderLlmEntry): boolean {\n return !entry.preset && (!entry.credential || entry.credential.kind === \"none\");\n}\n\n/**\n * Ids of the entries that declare no models: any `<id>/<model>` is forwarded to\n * them as is, so `/v1/models` cannot list models for them.\n */\nexport function listPassThroughProviders(registry: MergedAIProviderRegistry): string[] {\n return selectableEntries(registry)\n .filter(([, entry]) => entryModelIds(entry).length === 0)\n .map(([providerId]) => providerId);\n}\n\n/**\n * Every model a caller can name, as `/v1/models` entries: ids are\n * `<providerId>/<logicalId>` so two providers serving the same logical id stay\n * distinguishable. Bare logical ids remain accepted on request.\n */\nexport function listModels(\n registry: MergedAIProviderRegistry,\n): Array<{ id: string; owned_by: string }> {\n return selectableEntries(registry).flatMap(([providerId, entry]) =>\n entryModelIds(entry).map(([logicalId]) => ({\n id: `${providerId}/${logicalId}`,\n owned_by: providerId,\n })),\n );\n}\n","import type {\n AssistantMessage,\n Context,\n ImageContent,\n JsonObject,\n Message,\n SamplingParams,\n ThinkingLevel,\n Tool,\n ToolResultMessage,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Model-call options both OpenAI surfaces translate into pi `stream()` options. */\nexport interface ModelRequestOptions {\n temperature?: number;\n maxTokens?: number;\n samplingParams?: SamplingParams;\n reasoning?: ThinkingLevel;\n}\n\n/**\n * Surface-independent result of parsing an OpenAI request. Both translators\n * return this so the server can drive pi without knowing which wire format\n * the caller spoke.\n */\nexport interface ParsedModelRequest {\n model: string;\n context: Context;\n options: ModelRequestOptions;\n stream: boolean;\n includeUsage: boolean;\n}\n\nconst THINKING_LEVELS: readonly ThinkingLevel[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n/** `400 invalid_request_error` for malformed or unsupported caller input. */\nexport function badRequest(message: string): ModelEndpointError {\n return new ModelEndpointError(400, message);\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function requireModel(body: Record<string, unknown>): string {\n if (typeof body.model !== \"string\" || body.model.length === 0) {\n throw badRequest(\"model is required\");\n }\n return body.model;\n}\n\nexport function optionalBoolean(value: unknown, field: string): boolean {\n if (value === undefined || value === null) return false;\n if (typeof value !== \"boolean\") throw badRequest(`${field} must be a boolean`);\n return value;\n}\n\nexport function optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw badRequest(`${field} must be a number`);\n return value;\n}\n\nexport function optionalPositiveInt(value: unknown, field: string): number | undefined {\n const n = optionalNumber(value, field);\n if (n === undefined) return undefined;\n if (!Number.isInteger(n) || n <= 0) throw badRequest(`${field} must be a positive integer`);\n return n;\n}\n\nfunction isThinkingLevel(value: string): value is ThinkingLevel {\n return (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n/** `none` (or absent) disables reasoning; anything else must be a pi thinking level. */\nexport function parseReasoningEffort(value: unknown, field: string): ThinkingLevel | undefined {\n if (value === undefined || value === null || value === \"none\") return undefined;\n if (typeof value === \"string\" && isThinkingLevel(value)) return value;\n throw badRequest(`${field} must be one of none, ${THINKING_LEVELS.join(\", \")}`);\n}\n\n/**\n * Copies request fields pi has no named option for (top_p, seed, stop, ...)\n * into `samplingParams`, which OpenAI-compatible pi adapters merge into the\n * upstream body as-is.\n */\nexport function pickSamplingParams(\n body: Record<string, unknown>,\n keys: readonly string[],\n): SamplingParams | undefined {\n const picked: SamplingParams = {};\n for (const key of keys) {\n const value = body[key];\n if (value === undefined || value === null) continue;\n const ok =\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n (Array.isArray(value) && value.every((v) => typeof v === \"string\"));\n if (!ok) throw badRequest(`${key} has an unsupported type`);\n picked[key] = value;\n }\n return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\nexport function buildOptions(parts: {\n temperature: number | undefined;\n maxTokens: number | undefined;\n samplingParams: SamplingParams | undefined;\n reasoning: ThinkingLevel | undefined;\n}): ModelRequestOptions {\n const options: ModelRequestOptions = {};\n if (parts.temperature !== undefined) options.temperature = parts.temperature;\n if (parts.maxTokens !== undefined) options.maxTokens = parts.maxTokens;\n if (parts.samplingParams !== undefined) options.samplingParams = parts.samplingParams;\n if (parts.reasoning !== undefined) options.reasoning = parts.reasoning;\n return options;\n}\n\nconst DATA_URL = /^data:([^;,]+)(?:;[^;,]*)*;base64,(.*)$/s;\n\n/**\n * Decodes a `data:` image URL into pi `ImageContent`. Remote URLs are rejected\n * on purpose: fetching caller-supplied URLs from the runner would be an SSRF\n * vector and the endpoint has no business doing I/O during translation.\n */\nexport function imageFromUrl(url: unknown, field: string): ImageContent {\n if (typeof url !== \"string\" || url.length === 0)\n throw badRequest(`${field} must be a non-empty string`);\n const match = DATA_URL.exec(url);\n if (!match) {\n throw badRequest(\n `${field}: only base64 data: image URLs are supported; http(s) image URLs are not fetched`,\n );\n }\n const mimeType = match[1] as string;\n if (!mimeType.startsWith(\"image/\"))\n throw badRequest(`${field}: data URL is not an image (${mimeType})`);\n return { type: \"image\", data: match[2] as string, mimeType };\n}\n\n/**\n * Tool `arguments` arrive as a JSON string; pi wants an object. Invalid JSON or a\n * non-object value becomes `{}` so one malformed history entry cannot fail the call.\n */\nexport function parseToolArguments(value: unknown): JsonObject {\n if (isRecord(value)) return value as JsonObject;\n if (typeof value !== \"string\" || value.trim().length === 0) return {};\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? (parsed as JsonObject) : {};\n } catch {\n return {};\n }\n}\n\nexport const DEFAULT_TOOL_PARAMETERS = { type: \"object\", properties: {} } as const;\n\nexport function toPiTool(name: string, description: unknown, parameters: unknown): Tool {\n return {\n name,\n description: typeof description === \"string\" ? description : \"\",\n parameters: (isRecord(parameters) ? parameters : DEFAULT_TOOL_PARAMETERS) as Tool[\"parameters\"],\n };\n}\n\n/**\n * Applies OpenAI `tool_choice` to the tool list. pi's `stream()` has no\n * tool-choice option, so the choice is enforced by what we declare: `none`\n * declares nothing, a named function declares only that function.\n */\nexport function selectTools(\n tools: Tool[],\n choice: unknown,\n forcedName: (choice: Record<string, unknown>) => unknown,\n): Tool[] {\n if (choice === undefined || choice === null || choice === \"auto\" || choice === \"required\")\n return tools;\n if (choice === \"none\") return [];\n if (isRecord(choice)) {\n const name = forcedName(choice);\n const matched = tools.filter((tool) => tool.name === name);\n if (typeof name !== \"string\" || matched.length === 0) {\n throw badRequest(\"tool_choice references an unknown function\");\n }\n return matched;\n }\n throw badRequest(\"tool_choice is not supported\");\n}\n\nexport function buildContext(systemParts: string[], messages: Message[], tools: Tool[]): Context {\n const context: Context = { messages };\n if (systemParts.length > 0) context.systemPrompt = systemParts.join(\"\\n\\n\");\n if (tools.length > 0) context.tools = tools;\n return context;\n}\n\nexport function emptyUsage(): Usage {\n return {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n };\n}\n\n/** OpenAI counts cache reads/writes as prompt tokens; pi reports them separately. */\nexport function promptTokens(usage: Usage): number {\n return usage.input + usage.cacheRead + usage.cacheWrite;\n}\n\nexport function totalTokens(usage: Usage): number {\n return usage.totalTokens > 0 ? usage.totalTokens : promptTokens(usage) + usage.output;\n}\n\n/**\n * An assistant turn replayed from the caller's history. It is stamped with a\n * foreign api/provider so pi treats it as cross-provider history (dropping\n * provider-specific signatures) rather than as its own output.\n */\nexport function historyAssistant(\n model: string,\n content: AssistantMessage[\"content\"],\n): AssistantMessage {\n return {\n role: \"assistant\",\n content,\n api: \"openai-completions\",\n provider: \"openai\",\n model,\n usage: emptyUsage(),\n stopReason: content.some((block) => block.type === \"toolCall\") ? \"toolUse\" : \"stop\",\n timestamp: Date.now(),\n };\n}\n\nexport function historyToolResult(\n toolCallId: string,\n toolName: string,\n text: string,\n): ToolResultMessage {\n return {\n role: \"toolResult\",\n toolCallId,\n toolName,\n content: [{ type: \"text\", text }],\n isError: false,\n timestamp: Date.now(),\n };\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n StopReason,\n TextContent,\n Tool,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/chat/completions` body, in pi terms. */\nexport type ChatCompletionRequest = ParsedModelRequest;\n\nexport type ChatFinishReason = \"stop\" | \"length\" | \"tool_calls\";\n\nexport interface ChatCompletionToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\nexport interface ChatCompletionMessage {\n role: \"assistant\";\n content: string | null;\n reasoning_content?: string;\n tool_calls?: ChatCompletionToolCall[];\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details: { cached_tokens: number };\n completion_tokens_details?: { reasoning_tokens: number };\n}\n\nexport interface ChatCompletion {\n id: string;\n object: \"chat.completion\";\n created: number;\n model: string;\n choices: Array<{ index: 0; message: ChatCompletionMessage; finish_reason: ChatFinishReason }>;\n usage: ChatCompletionUsage;\n}\n\nexport interface ChatCompletionChunkDelta {\n role?: \"assistant\";\n content?: string;\n reasoning_content?: string;\n tool_calls?: Array<{ index: number } & ChatCompletionToolCall>;\n}\n\nexport interface ChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: 0;\n delta: ChatCompletionChunkDelta;\n finish_reason: ChatFinishReason | null;\n }>;\n usage?: ChatCompletionUsage;\n}\n\nexport interface ChatResponseMeta {\n id: string;\n created: number;\n model: string;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction textOfParts(content: unknown, field: string, allowed: readonly string[]): string {\n if (content === undefined || content === null) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of text parts`);\n let text = \"\";\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n if (!isRecord(part) || typeof part.type !== \"string\" || !allowed.includes(part.type)) {\n throw badRequest(`${field}[${i}]: unsupported content part`);\n }\n const value = part.type === \"refusal\" ? part.refusal : part.text;\n if (typeof value !== \"string\")\n throw badRequest(\n `${field}[${i}].${part.type === \"refusal\" ? \"refusal\" : \"text\"} must be a string`,\n );\n text += value;\n }\n return text;\n}\n\nfunction parseUserContent(\n content: unknown,\n field: string,\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part)) throw badRequest(`${partField} must be an object`);\n if (part.type === \"text\") {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image_url\") {\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url.url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${String(part.type)}\"`);\n }\n }\n return parts;\n}\n\nfunction parseAssistantMessage(\n raw: Record<string, unknown>,\n field: string,\n model: string,\n toolNames: Map<string, string>,\n): AssistantMessage | undefined {\n const blocks: AssistantMessage[\"content\"] = [];\n const text = textOfParts(raw.content, `${field}.content`, [\"text\", \"refusal\"]);\n if (text.length > 0) blocks.push({ type: \"text\", text });\n if (raw.tool_calls !== undefined && raw.tool_calls !== null) {\n if (!Array.isArray(raw.tool_calls)) throw badRequest(`${field}.tool_calls must be an array`);\n for (let i = 0; i < raw.tool_calls.length; i++) {\n const call: unknown = raw.tool_calls[i];\n const callField = `${field}.tool_calls[${i}]`;\n if (!isRecord(call) || !isRecord(call.function))\n throw badRequest(`${callField} must be a function tool call`);\n if (call.type !== undefined && call.type !== \"function\")\n throw badRequest(`${callField}.type must be \"function\"`);\n if (typeof call.id !== \"string\" || call.id.length === 0)\n throw badRequest(`${callField}.id is required`);\n if (typeof call.function.name !== \"string\" || call.function.name.length === 0) {\n throw badRequest(`${callField}.function.name is required`);\n }\n toolNames.set(call.id, call.function.name);\n blocks.push({\n type: \"toolCall\",\n id: call.id,\n name: call.function.name,\n arguments: parseToolArguments(call.function.arguments),\n });\n }\n }\n // An empty assistant turn carries no information and some upstreams reject it.\n return blocks.length > 0 ? historyAssistant(model, blocks) : undefined;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\" || !isRecord(tool.function)) {\n throw badRequest(`tools[${i}] must be {type:\"function\", function:{...}}`);\n }\n const fn = tool.function;\n if (typeof fn.name !== \"string\" || fn.name.length === 0)\n throw badRequest(`tools[${i}].function.name is required`);\n tools.push(toPiTool(fn.name, fn.description, fn.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI chat-completions body and maps it to a pi `Context`.\n * System/developer messages collapse into `systemPrompt`; a tool message's\n * `toolName` is recovered from the earlier assistant `tool_calls` entry with the\n * same id because pi tool results carry the tool name and OpenAI's do not.\n * Unsupported features fail loudly with 400 instead of being silently dropped.\n */\nexport function parseChatCompletionRequest(body: unknown): ChatCompletionRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (!Array.isArray(body.messages) || body.messages.length === 0) {\n throw badRequest(\"messages must be a non-empty array\");\n }\n if (body.n !== undefined && body.n !== null && body.n !== 1) {\n throw badRequest(\"n must be 1; multiple choices are not supported\");\n }\n\n const systemParts: string[] = [];\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < body.messages.length; i++) {\n const raw: unknown = body.messages[i];\n const field = `messages[${i}]`;\n if (!isRecord(raw)) throw badRequest(`${field} must be an object`);\n switch (raw.role) {\n case \"system\":\n case \"developer\": {\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n if (text.length > 0) systemParts.push(text);\n break;\n }\n case \"user\":\n messages.push({\n role: \"user\",\n content: parseUserContent(raw.content, `${field}.content`),\n timestamp: Date.now(),\n });\n break;\n case \"assistant\": {\n const assistant = parseAssistantMessage(raw, field, model, toolNames);\n if (assistant) messages.push(assistant);\n break;\n }\n case \"tool\": {\n if (typeof raw.tool_call_id !== \"string\" || raw.tool_call_id.length === 0) {\n throw badRequest(`${field}.tool_call_id is required`);\n }\n const text = textOfParts(raw.content, `${field}.content`, [\"text\"]);\n messages.push(\n historyToolResult(raw.tool_call_id, toolNames.get(raw.tool_call_id) ?? \"\", text),\n );\n break;\n }\n default:\n throw badRequest(`${field}.role \"${String(raw.role)}\" is not supported`);\n }\n }\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" && isRecord(choice.function) ? choice.function.name : undefined,\n );\n\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(\n body.max_completion_tokens ?? body.max_tokens,\n \"max_completion_tokens\",\n ),\n samplingParams: pickSamplingParams(body, [\n \"top_p\",\n \"frequency_penalty\",\n \"presence_penalty\",\n \"seed\",\n \"stop\",\n ]),\n reasoning: parseReasoningEffort(body.reasoning_effort, \"reasoning_effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: isRecord(body.stream_options) && body.stream_options.include_usage === true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction finishReason(stopReason: StopReason, errorMessage: string | undefined): ChatFinishReason {\n switch (stopReason) {\n case \"length\":\n return \"length\";\n case \"toolUse\":\n return \"tool_calls\";\n case \"error\":\n case \"aborted\":\n throw new ModelEndpointError(502, errorMessage ?? `upstream request ${stopReason}`);\n default:\n return \"stop\";\n }\n}\n\nfunction toChatUsage(usage: AssistantMessage[\"usage\"]): ChatCompletionUsage {\n const prompt = promptTokens(usage);\n const result: ChatCompletionUsage = {\n prompt_tokens: prompt,\n completion_tokens: usage.output,\n total_tokens: totalTokens(usage),\n prompt_tokens_details: { cached_tokens: usage.cacheRead },\n };\n if (usage.reasoning !== undefined)\n result.completion_tokens_details = { reasoning_tokens: usage.reasoning };\n return result;\n}\n\n/**\n * Maps a finished pi message to a non-streaming chat completion. `error` /\n * `aborted` messages throw 502 so the caller sees an upstream failure rather\n * than an empty \"successful\" completion.\n */\nexport function toChatCompletion(\n message: AssistantMessage,\n meta: ChatResponseMeta,\n): ChatCompletion {\n const reason = finishReason(message.stopReason, message.errorMessage);\n let text = \"\";\n let thinking = \"\";\n const toolCalls: ChatCompletionToolCall[] = [];\n for (const block of message.content) {\n if (block.type === \"text\") text += block.text;\n else if (block.type === \"thinking\") thinking += block.thinking;\n else {\n toolCalls.push({\n id: block.id,\n type: \"function\",\n function: { name: block.name, arguments: JSON.stringify(block.arguments) },\n });\n }\n }\n const out: ChatCompletionMessage = { role: \"assistant\", content: text.length > 0 ? text : null };\n if (thinking.length > 0) out.reasoning_content = thinking;\n if (toolCalls.length > 0) out.tool_calls = toolCalls;\n return {\n id: meta.id,\n object: \"chat.completion\",\n created: meta.created,\n model: meta.model,\n choices: [{ index: 0, message: out, finish_reason: reason }],\n usage: toChatUsage(message.usage),\n };\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting a chunk on upstream failure. */\nexport interface ChatStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n readonly includeUsage: boolean;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE error event. */\n error?: string;\n nextToolIndex: number;\n toolIndexByContent: Map<number, number>;\n}\n\nexport function createChatStreamState(init: {\n id: string;\n created: number;\n model: string;\n includeUsage: boolean;\n}): ChatStreamState {\n return { ...init, nextToolIndex: 0, toolIndexByContent: new Map() };\n}\n\nfunction chunk(\n state: ChatStreamState,\n delta: ChatCompletionChunkDelta,\n finish: ChatFinishReason | null = null,\n): ChatCompletionChunk {\n return {\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [{ index: 0, delta, finish_reason: finish }],\n };\n}\n\n/**\n * Stateful pi-event → OpenAI chunk mapper. Tool calls are buffered and emitted as\n * a single complete chunk at `toolcall_end` because pi only knows the call id and\n * name once the call is finished; OpenAI clients accept a whole call in one delta.\n */\nexport function chatCompletionChunks(\n event: AssistantMessageEvent,\n state: ChatStreamState,\n): ChatCompletionChunk[] {\n switch (event.type) {\n case \"start\":\n return [chunk(state, { role: \"assistant\", content: \"\" })];\n case \"text_delta\":\n return event.delta.length > 0 ? [chunk(state, { content: event.delta })] : [];\n case \"thinking_delta\":\n return event.delta.length > 0 ? [chunk(state, { reasoning_content: event.delta })] : [];\n case \"toolcall_start\":\n state.toolIndexByContent.set(event.contentIndex, state.nextToolIndex++);\n return [];\n case \"toolcall_end\": {\n let index = state.toolIndexByContent.get(event.contentIndex);\n if (index === undefined) {\n index = state.nextToolIndex++;\n state.toolIndexByContent.set(event.contentIndex, index);\n }\n return [\n chunk(state, {\n tool_calls: [\n {\n index,\n id: event.toolCall.id,\n type: \"function\",\n function: {\n name: event.toolCall.name,\n arguments: JSON.stringify(event.toolCall.arguments),\n },\n },\n ],\n }),\n ];\n }\n case \"done\": {\n const chunks = [chunk(state, {}, finishReason(event.reason, undefined))];\n if (state.includeUsage) {\n chunks.push({\n id: state.id,\n object: \"chat.completion.chunk\",\n created: state.created,\n model: state.model,\n choices: [],\n usage: toChatUsage(event.message.usage),\n });\n }\n return chunks;\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","import type {\n AssistantMessage,\n AssistantMessageEvent,\n ImageContent,\n Message,\n TextContent,\n Tool,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport {\n badRequest,\n buildContext,\n buildOptions,\n historyAssistant,\n historyToolResult,\n imageFromUrl,\n isRecord,\n optionalBoolean,\n optionalNumber,\n optionalPositiveInt,\n type ParsedModelRequest,\n parseReasoningEffort,\n parseToolArguments,\n pickSamplingParams,\n promptTokens,\n requireModel,\n selectTools,\n toPiTool,\n totalTokens,\n} from \"./openai-shared.js\";\nimport { ModelEndpointError } from \"./types.js\";\n\n/** Parsed `POST /v1/responses` body, in pi terms (`includeUsage` is always true: Responses always reports usage). */\nexport type ResponsesRequest = ParsedModelRequest;\n\nexport interface ResponseSummaryPart {\n type: \"summary_text\";\n text: string;\n}\n\nexport interface ResponseReasoningItem {\n type: \"reasoning\";\n id: string;\n summary: ResponseSummaryPart[];\n}\n\nexport interface ResponseMessageItem {\n type: \"message\";\n id: string;\n role: \"assistant\";\n status: \"in_progress\" | \"completed\";\n content: Array<{ type: \"output_text\"; text: string; annotations: never[] }>;\n}\n\nexport interface ResponseFunctionCallItem {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: \"in_progress\" | \"completed\";\n}\n\nexport type ResponseOutputItem =\n | ResponseReasoningItem\n | ResponseMessageItem\n | ResponseFunctionCallItem;\n\nexport interface ResponseUsage {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n input_tokens_details: { cached_tokens: number };\n output_tokens_details: { reasoning_tokens: number };\n}\n\nexport interface ResponseObject {\n id: string;\n object: \"response\";\n created_at: number;\n model: string;\n status: \"in_progress\" | \"completed\" | \"incomplete\";\n incomplete_details: { reason: \"max_output_tokens\" } | null;\n error: null;\n output: ResponseOutputItem[];\n usage: ResponseUsage | null;\n}\n\nexport interface ResponsesMeta {\n id: string;\n created: number;\n model: string;\n}\n\n/** One SSE event; `sequence_number` increases by one per event within a response. */\nexport interface ResponsesStreamEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\n// ── request ─────────────────────────────────────────────────────────────────\n\nfunction parseParts(\n content: unknown,\n field: string,\n role: \"user\" | \"system\" | \"assistant\",\n): string | (TextContent | ImageContent)[] {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content))\n throw badRequest(`${field} must be a string or an array of content parts`);\n const textTypes = role === \"assistant\" ? [\"output_text\", \"text\"] : [\"input_text\", \"text\"];\n const parts: (TextContent | ImageContent)[] = [];\n for (let i = 0; i < content.length; i++) {\n const part: unknown = content[i];\n const partField = `${field}[${i}]`;\n if (!isRecord(part) || typeof part.type !== \"string\")\n throw badRequest(`${partField} must be a content part`);\n if (textTypes.includes(part.type)) {\n if (typeof part.text !== \"string\") throw badRequest(`${partField}.text must be a string`);\n parts.push({ type: \"text\", text: part.text });\n } else if (\n part.type === \"refusal\" &&\n role === \"assistant\" &&\n typeof part.refusal === \"string\"\n ) {\n parts.push({ type: \"text\", text: part.refusal });\n } else if (part.type === \"input_image\" && role === \"user\") {\n if (part.file_id !== undefined && part.file_id !== null)\n throw badRequest(`${partField}.file_id is not supported`);\n const url = isRecord(part.image_url) ? part.image_url.url : part.image_url;\n parts.push(imageFromUrl(url, `${partField}.image_url`));\n } else {\n throw badRequest(`${partField}: unsupported content part type \"${part.type}\"`);\n }\n }\n return parts;\n}\n\nfunction joinText(parts: string | (TextContent | ImageContent)[]): string {\n if (typeof parts === \"string\") return parts;\n return parts.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\");\n}\n\nfunction parseOutputText(output: unknown, field: string): string {\n if (typeof output === \"string\") return output;\n if (output === undefined || output === null) return \"\";\n return joinText(parseParts(output, field, \"user\"));\n}\n\nfunction parseInput(input: unknown, model: string, systemParts: string[]): Message[] {\n if (typeof input === \"string\") return [{ role: \"user\", content: input, timestamp: Date.now() }];\n if (!Array.isArray(input)) throw badRequest(\"input must be a string or an array of items\");\n const messages: Message[] = [];\n const toolNames = new Map<string, string>();\n\n for (let i = 0; i < input.length; i++) {\n const item: unknown = input[i];\n const field = `input[${i}]`;\n if (!isRecord(item)) throw badRequest(`${field} must be an object`);\n const type = item.type ?? \"message\";\n switch (type) {\n case \"message\": {\n const role = item.role;\n if (role === \"system\" || role === \"developer\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"system\"));\n if (text.length > 0) systemParts.push(text);\n } else if (role === \"user\") {\n messages.push({\n role: \"user\",\n content: parseParts(item.content, `${field}.content`, \"user\"),\n timestamp: Date.now(),\n });\n } else if (role === \"assistant\") {\n const text = joinText(parseParts(item.content, `${field}.content`, \"assistant\"));\n if (text.length > 0) messages.push(historyAssistant(model, [{ type: \"text\", text }]));\n } else {\n throw badRequest(`${field}.role \"${String(role)}\" is not supported`);\n }\n break;\n }\n case \"function_call\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n if (typeof item.name !== \"string\" || item.name.length === 0)\n throw badRequest(`${field}.name is required`);\n toolNames.set(item.call_id, item.name);\n const call = {\n type: \"toolCall\" as const,\n id: item.call_id,\n name: item.name,\n arguments: parseToolArguments(item.arguments),\n };\n // Parallel calls arrive as consecutive items and belong to one assistant turn.\n const last = messages.at(-1);\n if (last?.role === \"assistant\") {\n last.content.push(call);\n last.stopReason = \"toolUse\";\n } else {\n messages.push(historyAssistant(model, [call]));\n }\n break;\n }\n case \"function_call_output\": {\n if (typeof item.call_id !== \"string\" || item.call_id.length === 0)\n throw badRequest(`${field}.call_id is required`);\n messages.push(\n historyToolResult(\n item.call_id,\n toolNames.get(item.call_id) ?? \"\",\n parseOutputText(item.output, `${field}.output`),\n ),\n );\n break;\n }\n case \"reasoning\":\n // Encrypted/summary reasoning from earlier turns is not replayable across providers.\n break;\n default:\n throw badRequest(`${field}.type \"${String(type)}\" is not supported`);\n }\n }\n return messages;\n}\n\nfunction parseTools(value: unknown): Tool[] {\n if (value === undefined || value === null) return [];\n if (!Array.isArray(value)) throw badRequest(\"tools must be an array\");\n const tools: Tool[] = [];\n for (let i = 0; i < value.length; i++) {\n const tool: unknown = value[i];\n if (!isRecord(tool) || tool.type !== \"function\") {\n throw badRequest(`tools[${i}]: only function tools are supported`);\n }\n if (typeof tool.name !== \"string\" || tool.name.length === 0)\n throw badRequest(`tools[${i}].name is required`);\n tools.push(toPiTool(tool.name, tool.description, tool.parameters));\n }\n return tools;\n}\n\n/**\n * Validates an OpenAI Responses body (stateless subset) and maps it to a pi `Context`.\n * `previous_response_id` is rejected because the endpoint keeps no response state.\n */\nexport function parseResponsesRequest(body: unknown): ResponsesRequest {\n if (!isRecord(body)) throw badRequest(\"request body must be a JSON object\");\n const model = requireModel(body);\n if (body.input === undefined || body.input === null) throw badRequest(\"input is required\");\n if (body.previous_response_id !== undefined && body.previous_response_id !== null) {\n throw badRequest(\"previous_response_id is not supported; the endpoint is stateless\");\n }\n\n const systemParts: string[] = [];\n if (body.instructions !== undefined && body.instructions !== null) {\n if (typeof body.instructions !== \"string\") throw badRequest(\"instructions must be a string\");\n if (body.instructions.length > 0) systemParts.push(body.instructions);\n }\n\n const messages = parseInput(body.input, model, systemParts);\n if (messages.length === 0) throw badRequest(\"input must contain at least one message\");\n\n const tools = selectTools(parseTools(body.tools), body.tool_choice, (choice) =>\n choice.type === \"function\" ? choice.name : undefined,\n );\n\n const reasoning = isRecord(body.reasoning) ? body.reasoning.effort : undefined;\n const options = buildOptions({\n temperature: optionalNumber(body.temperature, \"temperature\"),\n maxTokens: optionalPositiveInt(body.max_output_tokens, \"max_output_tokens\"),\n samplingParams: pickSamplingParams(body, [\"top_p\"]),\n reasoning: parseReasoningEffort(reasoning, \"reasoning.effort\"),\n });\n\n return {\n model,\n context: buildContext(systemParts, messages, tools),\n options,\n stream: optionalBoolean(body.stream, \"stream\"),\n includeUsage: true,\n };\n}\n\n// ── response ────────────────────────────────────────────────────────────────\n\nfunction itemId(prefix: string, responseId: string, index: number): string {\n return `${prefix}_${responseId.replace(/^resp_/, \"\")}_${index}`;\n}\n\nfunction toResponseUsage(usage: Usage): ResponseUsage {\n return {\n input_tokens: promptTokens(usage),\n output_tokens: usage.output,\n total_tokens: totalTokens(usage),\n input_tokens_details: { cached_tokens: usage.cacheRead },\n output_tokens_details: { reasoning_tokens: usage.reasoning ?? 0 },\n };\n}\n\nfunction messageItem(\n id: string,\n text: string,\n status: \"in_progress\" | \"completed\",\n): ResponseMessageItem {\n return {\n type: \"message\",\n id,\n role: \"assistant\",\n status,\n content: status === \"completed\" ? [{ type: \"output_text\", text, annotations: [] }] : [],\n };\n}\n\nfunction buildOutput(message: AssistantMessage, responseId: string): ResponseOutputItem[] {\n const output: ResponseOutputItem[] = [];\n const summaries: ResponseSummaryPart[] = [];\n let text = \"\";\n const calls: ResponseFunctionCallItem[] = [];\n for (const block of message.content) {\n if (block.type === \"thinking\") {\n if (block.thinking.length > 0) summaries.push({ type: \"summary_text\", text: block.thinking });\n } else if (block.type === \"text\") {\n text += block.text;\n } else {\n calls.push({\n type: \"function_call\",\n id: \"\",\n call_id: block.id,\n name: block.name,\n arguments: JSON.stringify(block.arguments),\n status: \"completed\",\n });\n }\n }\n if (summaries.length > 0) {\n output.push({\n type: \"reasoning\",\n id: itemId(\"rs\", responseId, output.length),\n summary: summaries,\n });\n }\n if (text.length > 0) {\n output.push(messageItem(itemId(\"msg\", responseId, output.length), text, \"completed\"));\n }\n for (const call of calls) {\n call.id = itemId(\"fc\", responseId, output.length);\n output.push(call);\n }\n return output;\n}\n\nfunction responseObject(\n meta: ResponsesMeta,\n status: ResponseObject[\"status\"],\n output: ResponseOutputItem[],\n usage: Usage | undefined,\n): ResponseObject {\n return {\n id: meta.id,\n object: \"response\",\n created_at: meta.created,\n model: meta.model,\n status,\n incomplete_details: status === \"incomplete\" ? { reason: \"max_output_tokens\" } : null,\n error: null,\n output,\n usage: usage ? toResponseUsage(usage) : null,\n };\n}\n\n/**\n * Maps a finished pi message to a non-streaming Responses object. Output order is\n * reasoning, message, then function calls. `error`/`aborted` throw 502.\n */\nexport function toResponse(message: AssistantMessage, meta: ResponsesMeta): ResponseObject {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream request ${message.stopReason}`,\n );\n }\n const status = message.stopReason === \"length\" ? \"incomplete\" : \"completed\";\n return responseObject(meta, status, buildOutput(message, meta.id), message.usage);\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\ninterface OpenBlock {\n kind: \"message\" | \"reasoning\";\n outputIndex: number;\n itemId: string;\n text: string;\n}\n\n/** Mutable per-stream mapper state; `error` is set instead of emitting an event on upstream failure. */\nexport interface ResponsesStreamState {\n readonly id: string;\n readonly created: number;\n readonly model: string;\n /** Set when pi reports `error`/`aborted`; the server turns it into an SSE `error` event. */\n error?: string;\n sequence: number;\n nextOutputIndex: number;\n open: Map<number, OpenBlock>;\n completed: Map<number, ResponseOutputItem>;\n}\n\nexport function createResponsesStreamState(init: ResponsesMeta): ResponsesStreamState {\n return {\n ...init,\n sequence: 0,\n nextOutputIndex: 0,\n open: new Map(),\n completed: new Map(),\n };\n}\n\nfunction ev(\n state: ResponsesStreamState,\n type: string,\n fields: Record<string, unknown>,\n): ResponsesStreamEvent {\n return { type, sequence_number: state.sequence++, ...fields };\n}\n\nfunction openBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n): { block: OpenBlock; events: ResponsesStreamEvent[] } {\n const existing = state.open.get(contentIndex);\n if (existing) return { block: existing, events: [] };\n const outputIndex = state.nextOutputIndex++;\n const block: OpenBlock = {\n kind,\n outputIndex,\n itemId: itemId(kind === \"message\" ? \"msg\" : \"rs\", state.id, outputIndex),\n text: \"\",\n };\n state.open.set(contentIndex, block);\n if (kind === \"message\") {\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: messageItem(block.itemId, \"\", \"in_progress\"),\n }),\n ev(state, \"response.content_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: \"\", annotations: [] },\n }),\n ],\n };\n }\n return {\n block,\n events: [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { type: \"reasoning\", id: block.itemId, summary: [] },\n }),\n ev(state, \"response.reasoning_summary_part.added\", {\n item_id: block.itemId,\n output_index: outputIndex,\n summary_index: 0,\n part: { type: \"summary_text\", text: \"\" },\n }),\n ],\n };\n}\n\nfunction closeBlock(\n state: ResponsesStreamState,\n contentIndex: number,\n kind: OpenBlock[\"kind\"],\n finalText: string,\n): ResponsesStreamEvent[] {\n const { block, events } = openBlock(state, contentIndex, kind);\n state.open.delete(contentIndex);\n if (kind === \"message\") {\n const item = messageItem(block.itemId, finalText, \"completed\");\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.output_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n text: finalText,\n }),\n ev(state, \"response.content_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n part: { type: \"output_text\", text: finalText, annotations: [] },\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n }\n const part: ResponseSummaryPart = { type: \"summary_text\", text: finalText };\n const item: ResponseReasoningItem = { type: \"reasoning\", id: block.itemId, summary: [part] };\n state.completed.set(block.outputIndex, item);\n events.push(\n ev(state, \"response.reasoning_summary_text.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n text: finalText,\n }),\n ev(state, \"response.reasoning_summary_part.done\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n part,\n }),\n ev(state, \"response.output_item.done\", { output_index: block.outputIndex, item }),\n );\n return events;\n}\n\n/**\n * Stateful pi-event → Responses SSE mapper. Function calls are buffered until\n * `toolcall_end` (pi only knows call id and name then) and then emitted as a\n * complete added/arguments/done sequence. A length stop ends with\n * `response.incomplete`, everything else with `response.completed`.\n */\nexport function responsesEvents(\n event: AssistantMessageEvent,\n state: ResponsesStreamState,\n): ResponsesStreamEvent[] {\n const meta: ResponsesMeta = { id: state.id, created: state.created, model: state.model };\n switch (event.type) {\n case \"start\": {\n const response = responseObject(meta, \"in_progress\", [], undefined);\n return [\n ev(state, \"response.created\", { response }),\n ev(state, \"response.in_progress\", { response }),\n ];\n }\n case \"text_start\":\n return openBlock(state, event.contentIndex, \"message\").events;\n case \"text_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"message\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.output_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n content_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"text_end\":\n return closeBlock(state, event.contentIndex, \"message\", event.content);\n case \"thinking_start\":\n return openBlock(state, event.contentIndex, \"reasoning\").events;\n case \"thinking_delta\": {\n const { block, events } = openBlock(state, event.contentIndex, \"reasoning\");\n block.text += event.delta;\n events.push(\n ev(state, \"response.reasoning_summary_text.delta\", {\n item_id: block.itemId,\n output_index: block.outputIndex,\n summary_index: 0,\n delta: event.delta,\n }),\n );\n return events;\n }\n case \"thinking_end\":\n return closeBlock(state, event.contentIndex, \"reasoning\", event.content);\n case \"toolcall_end\": {\n const outputIndex = state.nextOutputIndex++;\n const id = itemId(\"fc\", state.id, outputIndex);\n const args = JSON.stringify(event.toolCall.arguments);\n const item: ResponseFunctionCallItem = {\n type: \"function_call\",\n id,\n call_id: event.toolCall.id,\n name: event.toolCall.name,\n arguments: args,\n status: \"completed\",\n };\n state.completed.set(outputIndex, item);\n return [\n ev(state, \"response.output_item.added\", {\n output_index: outputIndex,\n item: { ...item, arguments: \"\", status: \"in_progress\" },\n }),\n ev(state, \"response.function_call_arguments.delta\", {\n item_id: id,\n output_index: outputIndex,\n delta: args,\n }),\n ev(state, \"response.function_call_arguments.done\", {\n item_id: id,\n output_index: outputIndex,\n name: item.name,\n arguments: args,\n }),\n ev(state, \"response.output_item.done\", { output_index: outputIndex, item }),\n ];\n }\n case \"done\": {\n const streamed = [...state.completed.entries()]\n .sort(([a], [b]) => a - b)\n .map(([, item]) => item);\n const output = streamed.length > 0 ? streamed : buildOutput(event.message, state.id);\n const incomplete = event.reason === \"length\";\n const response = responseObject(\n meta,\n incomplete ? \"incomplete\" : \"completed\",\n output,\n event.message.usage,\n );\n return [ev(state, incomplete ? \"response.incomplete\" : \"response.completed\", { response })];\n }\n case \"error\":\n state.error = event.error.errorMessage ?? `upstream request ${event.reason}`;\n return [];\n default:\n return [];\n }\n}\n","/**\n * The loopback OpenAI-compatible HTTP server.\n *\n * Plain `node:http` so it runs identically under Node and Bun. pi-ai is\n * imported lazily inside the handlers: the package is an optional peer, and\n * merely importing `@skaile/workspaces/model-endpoint` must not fail without it.\n */\n\nimport { createHash, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport type { AssistantMessage, AssistantMessageEvent } from \"@earendil-works/pi-ai\";\nimport { listenWithProbe, loadHarnessSdk, loadHarnessSdkSubpath } from \"@skaile/workspaces/core\";\nimport {\n chatCompletionChunks,\n createChatStreamState,\n parseChatCompletionRequest,\n toChatCompletion,\n} from \"./openai-chat.js\";\nimport {\n createResponsesStreamState,\n parseResponsesRequest,\n responsesEvents,\n toResponse,\n} from \"./openai-responses.js\";\nimport { listModels, listPassThroughProviders, type ResolveDeps, resolveModel } from \"./resolve.js\";\nimport {\n ModelEndpointError,\n type ModelEndpointHandle,\n type ModelEndpointOptions,\n type PiApiModule,\n type ResolvedModel,\n} from \"./types.js\";\n\n/** Largest accepted request body. Chat transcripts with inline images get big. */\nconst MAX_BODY_BYTES = 10 * 1024 * 1024;\n/** Surfaces whose upstream serves `POST <base>/embeddings`. */\nconst EMBEDDING_SURFACES = new Set([\"openai-completions\", \"openai-responses\"]);\n\ntype GenerationRequest = ReturnType<typeof parseChatCompletionRequest>;\n\n/** Per-request facts the access log reports. */\ninterface Trace {\n target?: string;\n}\n\n/**\n * Start the endpoint. Resolves once the socket is listening.\n *\n * Registry, env and roles are read per request through the getters so a\n * session swap is visible immediately.\n */\nexport async function startModelEndpoint(\n options: ModelEndpointOptions,\n): Promise<ModelEndpointHandle> {\n if (!options.token) throw new Error(\"model endpoint requires a non-empty token\");\n const host = options.host ?? \"127.0.0.1\";\n const log = options.log ?? (() => {});\n const projectDir = options.projectDir ?? process.cwd();\n const loadApi = options.loadApi ?? ((surface: string) => defaultLoadApi(surface, projectDir));\n const tokenDigest = digest(options.token);\n\n const deps = (): ResolveDeps => ({\n registry: options.getRegistry(),\n lookupEnv: options.getLookupEnv(),\n roles: options.getRoles?.(),\n });\n\n function authenticate(req: IncomingMessage): void {\n const match = /^Bearer\\s+(.+)$/i.exec(req.headers.authorization ?? \"\");\n // Hash both sides so the comparison is constant-time regardless of length.\n if (!match || !timingSafeEqual(digest(match[1] ?? \"\"), tokenDigest)) {\n throw new ModelEndpointError(401, \"invalid or missing bearer token\", \"invalid_api_key\");\n }\n }\n\n /** Start the upstream pi stream for a parsed chat/responses request. */\n async function startUpstream(\n request: GenerationRequest,\n resolved: ResolvedModel,\n signal: AbortSignal,\n ): Promise<AsyncIterable<AssistantMessageEvent>> {\n const pi = await loadPi(projectDir);\n const surface = resolved.model.api;\n let api: PiApiModule;\n try {\n api = await loadApi(surface);\n } catch (cause) {\n throw new ModelEndpointError(\n 501,\n `surface '${surface}' is not supported by the installed pi-ai: ${errorText(cause)}`,\n \"surface_unsupported\",\n );\n }\n const { temperature, maxTokens, samplingParams, reasoning } = request.options;\n const common = {\n ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),\n ...(resolved.headers ? { headers: resolved.headers } : {}),\n signal,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxTokens } : {}),\n ...(samplingParams !== undefined ? { samplingParams } : {}),\n };\n const context = pi.normalizeContext(request.context);\n // Only `streamSimple` maps a provider-neutral thinking level onto the\n // surface's own effort field (`reasoning_effort`, Anthropic `effort`, …).\n if (reasoning !== undefined && api.streamSimple) {\n return api.streamSimple(resolved.model, context, {\n ...common,\n reasoning,\n }) as AsyncIterable<AssistantMessageEvent>;\n }\n return api.stream(resolved.model, context, common) as AsyncIterable<AssistantMessageEvent>;\n }\n\n async function handleChat(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseChatCompletionRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `chatcmpl-${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toChatCompletion(message, { id, created, model: request.model }));\n return;\n }\n const state = createChatStreamState({\n id,\n created,\n model: request.model,\n includeUsage: request.includeUsage,\n });\n await pipeSse(res, events, {\n frames: (event) => chatCompletionChunks(event, state),\n errorFrame: (message) => ({ error: { message, type: \"upstream_error\" } }),\n terminator: \"[DONE]\",\n });\n }\n\n async function handleResponses(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const request = parseResponsesRequest(await readJson(req));\n const resolved = resolveModel(request.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n const events = await startUpstream(request, resolved, signal);\n const id = `resp_${randomUUID().replaceAll(\"-\", \"\")}`;\n const created = Math.floor(Date.now() / 1000);\n\n if (!request.stream) {\n const message = await collectFinal(events);\n sendJson(res, 200, toResponse(message, { id, created, model: request.model }));\n return;\n }\n const state = createResponsesStreamState({ id, created, model: request.model });\n await pipeSse(res, events, {\n frames: (event) => responsesEvents(event, state),\n errorFrame: (message) => ({ type: \"error\", code: \"upstream_error\", message, param: null }),\n eventName: (frame) =>\n isRecord(frame) && typeof frame.type === \"string\" ? frame.type : undefined,\n });\n }\n\n async function handleEmbeddings(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n trace: Trace,\n ): Promise<void> {\n const body = await readJson(req);\n if (!isRecord(body) || typeof body.model !== \"string\" || body.model === \"\") {\n throw new ModelEndpointError(400, \"`model` is required\", \"missing_model\");\n }\n const resolved = resolveModel(body.model, deps());\n trace.target = `${resolved.providerId}/${resolved.logicalId}`;\n if (!EMBEDDING_SURFACES.has(resolved.model.api)) {\n throw new ModelEndpointError(\n 501,\n `embeddings not supported for surface ${resolved.model.api}`,\n \"embeddings_unsupported\",\n );\n }\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n ...resolved.headers,\n };\n if (resolved.apiKey) headers.authorization = `Bearer ${resolved.apiKey}`;\n\n let upstream: Response;\n try {\n upstream = await (options.fetch ?? globalThis.fetch)(`${resolved.model.baseUrl}/embeddings`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ ...body, model: resolved.model.id }),\n signal,\n });\n } catch (cause) {\n if (signal.aborted) return;\n throw new ModelEndpointError(\n 502,\n `embeddings upstream unreachable: ${errorText(cause)}`,\n \"upstream_unreachable\",\n );\n }\n // fetch has already decoded the body, so content-encoding/length are not copied.\n const payload = Buffer.from(await upstream.arrayBuffer());\n res.writeHead(upstream.status, {\n \"content-type\": upstream.headers.get(\"content-type\") ?? \"application/json\",\n \"content-length\": payload.length,\n });\n res.end(payload);\n }\n\n async function dispatch(\n req: IncomingMessage,\n res: ServerResponse,\n signal: AbortSignal,\n path: string,\n trace: Trace,\n ): Promise<void> {\n if (!path.startsWith(\"/v1/\")) throw notFound(path);\n authenticate(req);\n switch (`${req.method} ${path}`) {\n case \"GET /v1/models\":\n sendJson(res, 200, {\n object: \"list\",\n data: listModels(options.getRegistry()).map((m) => ({\n id: m.id,\n object: \"model\",\n created: 0,\n owned_by: m.owned_by,\n })),\n // Entries that declare no models forward any `<id>/<model>`: nothing to list.\n pass_through_providers: listPassThroughProviders(options.getRegistry()),\n });\n return;\n case \"POST /v1/chat/completions\":\n return handleChat(req, res, signal, trace);\n case \"POST /v1/responses\":\n return handleResponses(req, res, signal, trace);\n case \"POST /v1/embeddings\":\n return handleEmbeddings(req, res, signal, trace);\n default:\n throw notFound(path);\n }\n }\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const started = performance.now();\n const controller = new AbortController();\n // `req` 'close' fires once the body is read; the response closing early is\n // the reliable \"client went away\" signal.\n res.on(\"close\", () => {\n if (!res.writableFinished) controller.abort();\n });\n const trace: Trace = {};\n let path = req.url ?? \"/\";\n try {\n path = requestPath(req);\n await dispatch(req, res, controller.signal, path, trace);\n } catch (err) {\n if (!(err instanceof ModelEndpointError)) {\n log(\n `error ${req.method} ${path}: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n }\n sendError(res, err);\n } finally {\n const ms = Math.round(performance.now() - started);\n log(`${req.method} ${path} ${trace.target ?? \"-\"} ${res.statusCode} ${ms}ms`);\n }\n }\n\n const server = createServer((req, res) => {\n void handle(req, res);\n });\n try {\n await listenWithProbe(server, options.port ?? 0, host);\n } catch (err) {\n if (!(err instanceof Error && \"code\" in err && err.code === \"EADDRINUSE\")) throw err;\n // The same one-line form the WebSocket port gets (transport/ws/server.ts).\n throw Object.assign(\n new Error(\n `${host}:${options.port ?? 0} is already in use: another process listens there. Pick another port for the model endpoint (--model-endpoint <port>, or model_endpoint.port in skaile.yaml).`,\n ),\n { code: \"EADDRINUSE\" },\n );\n }\n const address = server.address() as AddressInfo;\n const hostPart = host.includes(\":\") ? `[${host}]` : host;\n return {\n url: `http://${hostPart}:${address.port}/v1`,\n port: address.port,\n token: options.token,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n server.closeAllConnections?.();\n }),\n };\n}\n\n// ── pi-ai loading ───────────────────────────────────────────────────────────\n\n/** What a pi-ai load failure says. One line; names both places pi-ai was looked for. */\nfunction piAiNotInstalled(cause: unknown): ModelEndpointError {\n return new ModelEndpointError(500, errorText(cause), \"pi_ai_not_installed\", \"server_error\");\n}\n\nconst PI_AI = \"@earendil-works/pi-ai\";\nconst PI_AI_LABEL = `the model endpoint needs ${PI_AI}, which is`;\n\n/**\n * pi-ai root, loaded on first use: from `<projectDir>/node_modules` first, then\n * next to skaile. A missing peer becomes a clear 500 that names both places.\n */\nasync function loadPi(projectDir: string): Promise<typeof import(\"@earendil-works/pi-ai\")> {\n try {\n return await loadHarnessSdk(\n PI_AI,\n projectDir,\n () => import(\"@earendil-works/pi-ai\"),\n PI_AI_LABEL,\n );\n } catch (cause) {\n throw piAiNotInstalled(cause);\n }\n}\n\n/**\n * Check that pi-ai can be loaded for `projectDir`; `skaile serve --model-endpoint`\n * runs it before its ready line.\n *\n * @returns The one-line problem (both places looked in, the install command), or `null`.\n */\nexport async function checkPiAiInstalled(projectDir: string): Promise<string | null> {\n try {\n await loadPi(projectDir);\n return null;\n } catch (err) {\n return errorText(err);\n }\n}\n\n/** Default api loader: the surface is runtime-selected per entry and pi-ai is an optional peer. */\nasync function defaultLoadApi(surface: string, projectDir: string): Promise<PiApiModule> {\n if (!/^[a-z0-9-]+$/.test(surface)) throw new Error(`invalid surface '${surface}'`);\n return loadHarnessSdkSubpath<PiApiModule>(\n PI_AI,\n `api/${surface}`,\n projectDir,\n () => import(/* @vite-ignore */ `${PI_AI}/api/${surface}`) as Promise<PiApiModule>,\n `${PI_AI} (surface ${surface})`,\n );\n}\n\n// ── streaming ───────────────────────────────────────────────────────────────\n\n/** Drain the stream to its final message; an `error` event becomes a 502. */\nasync function collectFinal(\n events: AsyncIterable<AssistantMessageEvent>,\n): Promise<AssistantMessage> {\n for await (const event of events) {\n if (event.type === \"done\") return event.message;\n if (event.type === \"error\") throw upstreamFailure(event.error);\n }\n throw new ModelEndpointError(\n 502,\n \"upstream ended without a final message\",\n \"upstream_incomplete\",\n );\n}\n\nfunction upstreamFailure(message: AssistantMessage): ModelEndpointError {\n return new ModelEndpointError(\n 502,\n message.errorMessage ?? `upstream ${message.stopReason}`,\n \"upstream_error\",\n );\n}\n\ninterface SsePipe {\n /** Map one pi event to wire frames. Never called with `error` events. */\n frames(event: AssistantMessageEvent): unknown[];\n /** Frame announcing a failure once the stream has started. */\n errorFrame(message: string): unknown;\n /** SSE `event:` name for a frame, when the protocol uses one. */\n eventName?(frame: unknown): string | undefined;\n /** Sentinel written after the last frame. */\n terminator?: \"[DONE]\";\n}\n\n/**\n * Relay pi events as SSE. Headers go out with the first event, not before: an\n * upstream failure that precedes it (bad credential, unknown model) then\n * surfaces as a real HTTP 502 instead of a 200 stream carrying an error.\n */\nasync function pipeSse(\n res: ServerResponse,\n events: AsyncIterable<AssistantMessageEvent>,\n pipe: SsePipe,\n): Promise<void> {\n let sse: Sse | undefined;\n const sendAll = async (frames: unknown[]) => {\n for (const frame of frames) await sse?.send(frame, pipe.eventName?.(frame));\n };\n try {\n for await (const event of events) {\n if (!sse) {\n if (event.type === \"error\") throw upstreamFailure(event.error);\n sse = openSse(res);\n }\n if (event.type === \"error\") {\n await sendAll([pipe.errorFrame(event.error.errorMessage ?? `upstream ${event.reason}`)]);\n break;\n }\n await sendAll(pipe.frames(event));\n }\n } catch (err) {\n if (!sse) throw err;\n await sendAll([pipe.errorFrame(errorText(err))]);\n }\n if (!sse)\n throw new ModelEndpointError(502, \"upstream ended without events\", \"upstream_incomplete\");\n if (pipe.terminator) await sse.raw(pipe.terminator);\n res.end();\n}\n\ninterface Sse {\n send(frame: unknown, eventName?: string): Promise<void>;\n raw(data: string): Promise<void>;\n}\n\nfunction openSse(res: ServerResponse): Sse {\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n });\n res.flushHeaders();\n const write = async (text: string): Promise<void> => {\n if (res.destroyed || res.writableEnded) return;\n if (res.write(text)) return;\n await new Promise<void>((resolve) => {\n const done = () => {\n res.off(\"drain\", done);\n res.off(\"close\", done);\n resolve();\n };\n res.once(\"drain\", done);\n res.once(\"close\", done);\n });\n };\n return {\n send: (frame, eventName) =>\n write(`${eventName ? `event: ${eventName}\\n` : \"\"}data: ${JSON.stringify(frame)}\\n\\n`),\n raw: (data) => write(`data: ${data}\\n\\n`),\n };\n}\n\n// ── HTTP plumbing ───────────────────────────────────────────────────────────\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n if (res.writableEnded) return;\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"content-type\": \"application/json\",\n \"content-length\": Buffer.byteLength(payload),\n });\n res.end(payload);\n}\n\nfunction sendError(res: ServerResponse, err: unknown): void {\n if (res.writableEnded || res.destroyed) return;\n if (res.headersSent) {\n res.end();\n return;\n }\n const failure =\n err instanceof ModelEndpointError\n ? err\n : new ModelEndpointError(500, \"internal server error\", undefined, \"server_error\");\n if (failure.status === 413) res.setHeader(\"connection\", \"close\");\n sendJson(res, failure.status, {\n error: {\n message: failure.message,\n type: failure.type,\n ...(failure.code !== undefined ? { code: failure.code } : {}),\n },\n });\n}\n\nfunction notFound(path: string): ModelEndpointError {\n return new ModelEndpointError(404, `unknown route '${path}'`, undefined, \"invalid_request_error\");\n}\n\nfunction requestPath(req: IncomingMessage): string {\n if (!URL.canParse(req.url ?? \"/\", \"http://localhost\")) {\n throw new ModelEndpointError(400, \"invalid request target\");\n }\n const path = new URL(req.url ?? \"/\", \"http://localhost\").pathname;\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nasync function readJson(req: IncomingMessage): Promise<unknown> {\n const tooLarge = () =>\n new ModelEndpointError(413, `request body exceeds ${MAX_BODY_BYTES} bytes`, \"body_too_large\");\n if (Number(req.headers[\"content-length\"]) > MAX_BODY_BYTES) throw tooLarge();\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n const buffer = chunk as Buffer;\n size += buffer.length;\n if (size > MAX_BODY_BYTES) throw tooLarge();\n chunks.push(buffer);\n }\n const text = Buffer.concat(chunks).toString(\"utf8\");\n if (text.trim() === \"\") throw new ModelEndpointError(400, \"request body is empty\", \"empty_body\");\n try {\n return JSON.parse(text);\n } catch {\n throw new ModelEndpointError(400, \"request body is not valid JSON\", \"invalid_json\");\n }\n}\n\nfunction digest(value: string): Buffer {\n return createHash(\"sha256\").update(value).digest();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction errorText(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../core/src/provider-registry.ts"],"names":["ok","providerId","entry"],"mappings":";AA+BO,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAO,KAAA,EAAO,OAAO,OAAO;AAMvD,IAAM,uBAAA,GAA0B,CAAC,KAAA,EAAO,KAAK;AAS7C,IAAM,oBAAA,GAAuB;AAAA,EAClC,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,wBAAA;AAAA,EACA,wBAAA;AAAA,EACA,yBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF;AAMO,IAAM,sBAAA,GAAyB;AAAA,EACpC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AASO,IAAM,4BAAA,GAA+B;AAAA,EAC1C,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAUA,IAAM,uBAAA,GAA2E;AAAA,EAC/E,cAAA,EAAgB,IAAA;AAAA,EAChB,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAGO,IAAM,2BAAA,GAA8B;AAAA,EACzC,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF;AAUO,IAAM,qBAAqB,CAAC,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAa,WAAW,SAAS;AAmOvF,IAAM,OAAA,GAAU,uBAAA;AAGhB,IAAM,QAAA,GAAW,0BAAA;AAGjB,IAAM,cAAA,GAAiB,wCAAA;AAGvB,IAAM,UAAA,GACJ,2HAAA;AAGF,IAAM,qBAAA,GAAkC;AAAA,EACtC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,yBAAA;AAAA,EACA,kCAAA;AAAA;AAAA,EAEA;AACF,CAAA;AAGA,IAAM,aAAA,GAAgB,aAAA;AAGtB,IAAM,QAAA,GAAiC;AAAA,EACrC,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,YAAA,EAAc,IAAA;AAAA,EACd,UAAA,EAAY,IAAA;AAAA,EACZ,SAAA,EAAW,IAAA;AAAA,EACX,YAAA,EAAc,IAAA;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAGA,IAAM,UAAA,GAAmC;AAAA,EACvC,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,OAAA,EAAS,IAAA;AAAA,EACT,UAAA,EAAY,IAAA;AAAA,EACZ,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAQA,IAAM,UAAA,GAAmC,EAAE,GAAG,QAAA,EAAU,GAAG,UAAA,EAAW;AAGtE,IAAM,gBAAgB,CAAC,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,gBAAgB,WAAW,CAAA;AAEvF,IAAM,eAAA,GAAwC;AAAA,EAC5C,cAAA,EAAgB,IAAA;AAAA,EAChB,KAAA,EAAO,IAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,YAAA,EAAc;AAChB,CAAA;AAGA,IAAM,gBAAA,GAGF;AAAA,EACF,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,QAAQ,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC9C,MAAA,EAAQ,EAAE,QAAA,EAAU,CAAC,SAAA,EAAW,UAAU,CAAA,EAAG,QAAA,EAAU,CAAC,WAAW,CAAA,EAAE;AAAA,EACrE,OAAA,EAAS,EAAE,QAAA,EAAU,CAAC,UAAU,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAChD,cAAA,EAAgB,EAAE,QAAA,EAAU,CAAC,UAAA,EAAY,cAAc,aAAa,CAAA,EAAG,QAAA,EAAU,EAAC;AACpF,CAAA;AAMO,IAAM,8BAAA,GAGT;AAAA,EACF,OAAA,EAAS,gDAAA;AAAA,EACT,MAAA,EACE,gHAAA;AAAA,EACF,OAAA,EAAS,oDAAA;AAAA,EACT,cAAA,EAAgB;AAClB;AAEA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,iBAAiB,EAAA,EAAqB;AACpD,EAAA,OAAO,OAAA,CAAQ,KAAK,EAAE,CAAA;AACxB;AAcO,SAAS,sBAAA,CAAuB,KAAa,KAAA,EAAwB;AAC1E,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,KAAA;AAC3B,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,OAAO,sBAAsB,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5D;AAMA,SAAS,GAAA,CAAI,GAAA,EAAU,IAAA,EAAc,IAAA,EAAc,OAAA,EAAuB;AACxE,EAAA,GAAA,CAAI,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AACjE;AAEA,SAAS,IAAA,CAAK,GAAA,EAAU,IAAA,EAAc,IAAA,EAAc,OAAA,EAAuB;AACzE,EAAA,GAAA,CAAI,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AACnE;AAGA,SAAS,aAAA,CACP,GAAA,EACA,GAAA,EACA,IAAA,EACA,IAAA,EACoC;AACpC,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,+BAAA,CAAiC,CAAA;AACvE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC9B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,iBAAA,CAAmB,CAAA;AAC/D,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,sBAAA,CAAuB,GAAA,EAAK,KAAK,CAAA,EAAG;AACzD,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAG,OAAO,CAAA,2JAAA;AAAA,OAGZ;AACA,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACb;AACA,EAAA,OAAO,KAAK,GAAA,GAAM,MAAA;AACpB;AAEA,SAAS,cAAA,CACP,GAAA,EACA,GAAA,EACA,IAAA,EAC+C;AAC/C,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,4BAAA,CAA8B,CAAA;AACpE,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,KAAA,EAAO;AACnC,MAAA,GAAA,CAAI,GAAA,EAAK,aAAA,EAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,wBAAA,CAA0B,CAAA;AAClF,MAAA,EAAA,GAAK,KAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IACE,OAAO,IAAA,KAAS,QAAA,IAChB,CAAE,4BAAA,CAAmD,QAAA,CAAS,IAAI,CAAA,EAClE;AACA,IAAA,GAAA;AAAA,MACE,GAAA;AAAA,MACA,yBAAA;AAAA,MACA,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,MACP,GAAG,IAAI,CAAA,qBAAA,EAAwB,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACxE;AACA,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,EAAA,MAAM,SAAS,GAAA,CAAI,GAAA;AACnB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,GAAA,CAAI,KAAK,cAAA,EAAgB,CAAA,EAAG,IAAI,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACtE,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAA,IAAW,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG;AACtC,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,GAAG,IAAI,CAAA,IAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,mIAAA;AAAA,OAET;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,MAAA;AAAA,IACR;AAAA,EACF,CAAA,MAAA,IAAW,uBAAA,CAAwB,cAAc,CAAA,EAAG;AAClD,IAAA,GAAA;AAAA,MACE,GAAA;AAAA,MACA,wBAAA;AAAA,MACA,GAAG,IAAI,CAAA,IAAA,CAAA;AAAA,MACP,CAAA,EAAG,IAAI,CAAA,sCAAA,EAAyC,cAAc,CAAA,CAAA;AAAA,KAChE;AACA,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AAEA,EAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAE,IAAI,KAAA,EAAM;AAC5B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,GAAA,KAAQ,MAAA,GAAY,EAAE,IAAA,EAAM,gBAAe,GAAI,EAAE,IAAA,EAAM,cAAA,EAAgB,GAAA;AAAI,GACpF;AACF;AAcA,SAAS,kBAAA,CACP,GAAA,EACA,SAAA,EACA,MAAA,EACA,MACA,OAAA,EACkD;AAElD,EAAA,IAAI,SAAA,KAAc,MAAA,IAAa,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,EAAA,EAAI,KAAA,EAAM;AACvF,EAAA,MAAM,WAAW,SAAA,KAAc,MAAA;AAC/B,EAAA,MAAM,YAAY,SAAA,IAAa,QAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,MAAA,KAAW,MAAA,IAAa,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAEnE,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,IAAIA,GAAAA,GAAK,IAAA;AACT,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,EAAG;AAC3C,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,eAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA;AAAA,QACrB,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,kEAAA;AAAA,OACvB;AACA,MAAAA,GAAAA,GAAK,KAAA;AAAA,IACP;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,GAAW,EAAE,SAAA,EAAW,UAAS,GAAI,EAAC,EAAG,EAAA,EAAAA,GAAAA,EAAG;AAAA,EAC9D;AAEA,EAAA,MAAM,IAAA,GAAO,iBAAiB,SAAS,CAAA;AACvC,EAAA,IAAI,WAAW,MAAA,EAAW;AAExB,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,GAAG,IAAI,CAAA,OAAA,CAAA;AAAA,QACP,CAAA,EAAG,IAAI,CAAA,mCAAA,EAAsC,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,OACtF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,IAAI,KAAA,EAAM;AAAA,EAChC;AAEA,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAChE,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,eAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA;AAAA,QACrB,GAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,6BAAA,EAAgC,SAAS,CAAA,aAAA,EAC9C,CAAC,GAAG,IAAA,CAAK,UAAU,GAAG,IAAA,CAAK,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,OACjE;AACA,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,iBAAA,CAAmB,CAAA;AAC1F,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,EAChB;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,EAAW;AAC7B,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,eAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA;AAAA,QACrB,CAAA,EAAG,IAAI,CAAA,QAAA,EAAW,GAAG,+BAA+B,SAAS,CAAA,CAAA;AAAA,OAC/D;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,IAAI,CAAC,IAAI,OAAO,EAAE,OAAO,EAAC,EAAG,IAAI,KAAA,EAAM;AAGvC,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,EAAE,EAAG,IAAI,IAAA,EAAK;AAAA,IACxF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,SAAA;AAAA,UACX,MAAA,EAAQ;AAAA,YACN,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,GAAI,OAAO,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA;AAAU;AAC1E,SACF;AAAA,QACA,EAAA,EAAI;AAAA,OACN;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS,EAAE,EAAG,IAAI,IAAA,EAAK;AAAA,IAC5F,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,SAAA;AAAA,UACX,MAAA,EAAQ;AAAA,YACN,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,aAAa,MAAA,CAAO;AAAA;AACtB,SACF;AAAA,QACA,EAAA,EAAI;AAAA,OACN;AAAA;AAEN;AAQA,SAAS,UAAA,CACP,GAAA,EACA,GAAA,EACA,IAAA,EACoE;AACpE,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,cAAA,CAAgB,CAAA;AACtD,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,MAAM,MAAiD,EAAC;AACxD,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AACxF,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,cAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,oCAAA;AAAA,OAChB;AACA,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,sBAAA,CAAuB,GAAA,EAAK,KAAK,CAAA,EAAG;AACnE,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,sEAAA;AAAA,OAChB;AACA,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAA,GAAK,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,GAAA,EAAI,GAAI,EAAE,EAAA,EAAI,KAAA,EAAM;AACrD;AAEA,SAAS,WAAA,CAAY,GAAA,EAAU,GAAA,EAAc,IAAA,EAA+C;AAC1F,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,CAAmB,CAAA;AACzD,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,GAAA,CAAI,KAAK,kBAAA,EAAoB,IAAA,EAAM,GAAG,IAAI,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AACvE,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,IAAA,GAAA;AAAA,MACE,GAAA;AAAA,MACA,kBAAA;AAAA,MACA,IAAA;AAAA,MACA,CAAA,EAAG,IAAI,CAAA,mCAAA,EAAsC,MAAA,CAAO,QAAQ,CAAA,GAAA;AAAA,KAC9D;AACA,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,EAAU;AACtC,IAAA,GAAA;AAAA,MACE,GAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG,IAAI,CAAA,gFAAA;AAAA,KACT;AACA,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAChC;AAEA,SAAS,WAAA,CAAY,GAAA,EAAU,GAAA,EAAc,IAAA,EAAgD;AAC3F,EAAA,IAAI,OAAO,QAAQ,SAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,sBAAA,CAAwB,CAAA;AAC9D,IAAA,OAAO,EAAE,IAAI,KAAA,EAAM;AAAA,EACrB;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAChC;AAqBA,SAAS,SAAA,CAAU,GAAA,EAAU,GAAA,EAAc,IAAA,EAA2C;AACpF,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,cAAA,CAAgB,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAA+B,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAC7D,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,IAAI,EAAA,GAAK,IAAA;AAET,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAW;AAC1B,IAAA,IACE,OAAO,IAAI,IAAA,KAAS,QAAA,IACpB,CAAE,iBAAA,CAAwC,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAC3D;AACA,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,cAAA;AAAA,QACA,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,qBAAA,EAAwB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC7D;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,OAAO,GAAA,CAAI,IAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,GAAA,CAAI,GAAA,EAAK,aAAA,EAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,sBAAA,CAAwB,CAAA;AAChF,MAAA,EAAA,GAAK,KAAA;AAAA,IACP;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAW;AAC3B,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU;AACjC,MAAA,GAAA,CAAI,KAAK,cAAA,EAAgB,CAAA,EAAG,IAAI,CAAA,MAAA,CAAA,EAAU,CAAA,EAAG,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAC1E,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAW;AAC5B,IAAA,IAAI,OAAO,IAAI,MAAA,KAAW,QAAA,IAAY,CAAC,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,EAAG;AACnE,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,GAAG,IAAI,CAAA,OAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,gEAAA;AAAA,OACT;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAS,GAAA,CAAI,MAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW;AAC9B,IAAA,MAAM,MAAM,WAAA,CAAY,GAAA,EAAK,IAAI,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,SAAA,CAAW,CAAA;AAC7D,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,SACb,KAAA,CAAM,WAAW,GAAA,CAAI,KAAA;AAAA,EAC5B;AACA,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,EAAW;AAC7B,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,GAAA,EAAK,GAAA,CAAI,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACvF,IAAA,IAAI,CAAC,SAAS,EAAA,GAAK,KAAA;AAAA,eACR,OAAA,GAAU,OAAA;AAAA,EACvB;AACA,EAAA,IAAI,GAAA,CAAI,eAAe,MAAA,EAAW;AAChC,IAAA,MAAM,MAAM,cAAA,CAAe,GAAA,EAAK,IAAI,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,WAAA,CAAa,CAAA;AACpE,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,SACb,KAAA,CAAM,aAAa,GAAA,CAAI,KAAA;AAAA,EAC9B;AACA,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,EAAW;AAC7B,IAAA,MAAM,MAAM,WAAA,CAAY,GAAA,EAAK,IAAI,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,QAAA,CAAU,CAAA;AAC3D,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,SACb,KAAA,CAAM,UAAU,GAAA,CAAI,KAAA;AAAA,EAC3B;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAW;AAC5B,IAAA,MAAM,MAAM,WAAA,CAAY,GAAA,EAAK,IAAI,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACzD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,SACb,KAAA,CAAM,SAAS,GAAA,CAAI,KAAA;AAAA,EAC1B;AACA,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,EAAW;AAC7B,IAAA,IACE,OAAO,IAAI,OAAA,KAAY,QAAA,IACvB,CAAE,oBAAA,CAA2C,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EACjE;AACA,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,iBAAA;AAAA,QACA,GAAG,IAAI,CAAA,QAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,wBAAA,EAA2B,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACnE;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,UAAU,GAAA,CAAI,OAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAW;AAC/B,IAAA,IACE,OAAO,IAAI,SAAA,KAAc,QAAA,IACzB,CAAE,sBAAA,CAA6C,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EACrE;AACA,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,mBAAA;AAAA,QACA,GAAG,IAAI,CAAA,UAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,0BAAA,EAA6B,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACvE;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,YAAY,GAAA,CAAI,SAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAW;AAC5B,IAAA,MAAM,MAAM,UAAA,CAAW,GAAA,EAAK,IAAI,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACxD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,SACb,KAAA,CAAM,SAAS,GAAA,CAAI,KAAA;AAAA,EAC1B;AACA,EAAA,IAAI,GAAA,CAAI,iBAAiB,MAAA,EAAW;AAClC,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,GAAA,EAAK,GAAA,CAAI,YAAA,EAAc,CAAA,EAAG,IAAI,CAAA,aAAA,CAAA,EAAiB,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAC5F,IAAA,IAAI,CAAC,IAAI,EAAA,GAAK,KAAA;AAAA,eACH,YAAA,GAAe,EAAA;AAAA,EAC5B;AACA,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAW;AAC/B,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,EAAK,GAAA,CAAI,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA,UAAA,CAAA,EAAc,EAAE,UAAA,EAAY,KAAA,EAAO,CAAA;AACxF,IAAA,IAAI,CAAC,KAAK,EAAA,GAAK,KAAA;AAAA,eACJ,SAAA,GAAY,GAAA;AAAA,EACzB;AACA,EAAA,IAAI,GAAA,CAAI,iBAAiB,MAAA,EAAW;AAClC,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA,EAAG;AACpC,MAAA,GAAA,CAAI,KAAK,cAAA,EAAgB,CAAA,EAAG,IAAI,CAAA,aAAA,CAAA,EAAiB,CAAA,EAAG,IAAI,CAAA,2BAAA,CAA6B,CAAA;AACrF,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,MAAM,OAA+C,EAAC;AACtD,MAAA,KAAA,MAAW,CAAC,SAAS,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC/D,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAA;AAC/C,QAAA,IAAI,CAAC,aAAA,CAAc,KAAK,CAAA,EAAG;AACzB,UAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,cAAA,CAAgB,CAAA;AAC5D,UAAA,EAAA,GAAK,KAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAA8B,EAAC;AACrC,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtD,UAAA,IAAI,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC5B,YAAA,GAAA;AAAA,cACE,GAAA;AAAA,cACA,aAAA;AAAA,cACA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,cACpB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,aACtF;AACA,YAAA,EAAA,GAAK,KAAA;AACL,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAA,GAAW,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,WAAW,SAAA,GAAY,QAAA;AACzE,UAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,YAAA,GAAA;AAAA,cACE,GAAA;AAAA,cACA,cAAA;AAAA,cACA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,cACpB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAM,cAAc,QAAQ,CAAA;AAAA,aAC5C;AACA,YAAA,EAAA,GAAK,KAAA;AACL,YAAA;AAAA,UACF;AACA,UAAC,GAAA,CAAgC,MAAM,CAAA,GAAI,QAAA;AAAA,QAC7C;AACA,QAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAAA,MAClB;AACA,MAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAW;AAC/B,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,MAAA,GAAA,CAAI,KAAK,cAAA,EAAgB,CAAA,EAAG,IAAI,CAAA,UAAA,CAAA,EAAc,CAAA,EAAG,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAC/E,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,IAAI,SAAA,CAAU,IAAA;AAC3B,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,QAAA,GAAA;AAAA,UACE,GAAA;AAAA,UACA,cAAA;AAAA,UACA,GAAG,IAAI,CAAA,eAAA,CAAA;AAAA,UACP,GAAG,IAAI,CAAA,gCAAA;AAAA,SACT;AACA,QAAA,EAAA,GAAK,KAAA;AAAA,MACP,CAAA,MAAO;AACL,QAAA,IAAI,CAAE,2BAAA,CAAkD,QAAA,CAAS,IAAI,CAAA,EAAG;AACtE,UAAA,IAAA;AAAA,YACE,GAAA;AAAA,YACA,wBAAA;AAAA,YACA,GAAG,IAAI,CAAA,eAAA,CAAA;AAAA,YACP,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,IAAI,2BACzB,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAC,CAAA,4BAAA;AAAA,WAC9C;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAiC,EAAE,IAAA,EAAK;AAC9C,QAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,IAAA;AAC/B,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,YAAA,GAAA;AAAA,cACE,GAAA;AAAA,cACA,cAAA;AAAA,cACA,GAAG,IAAI,CAAA,eAAA,CAAA;AAAA,cACP,GAAG,IAAI,CAAA,gCAAA;AAAA,aACT;AACA,YAAA,EAAA,GAAK,KAAA;AAAA,UACP,CAAA,MAAO;AACL,YAAA,SAAA,CAAU,IAAA,GAAO,QAAA;AAAA,UACnB;AAAA,QACF;AACA,QAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AAC5C,UAAA,IAAI,GAAA,KAAQ,MAAA,IAAU,GAAA,KAAQ,MAAA,EAAQ;AACpC,YAAA,GAAA;AAAA,cACE,GAAA;AAAA,cACA,aAAA;AAAA,cACA,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,GAAG,CAAA,CAAA;AAAA,cACxB,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,GAAG,CAAA,uBAAA;AAAA,aAC1B;AACA,YAAA,EAAA,GAAK,KAAA;AAAA,UACP;AAAA,QACF;AACA,QAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAA,GAAK,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,MAAA;AACnC;AAGA,SAAS,YAAY,KAAA,EAAoD;AACvE,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AACtD,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,KAAA,CAAM,QAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AACxD,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,aAAa,KAAA,CAAM,UAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AACxD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAgBA,SAAS,UAAA,CACP,GAAA,EACA,KAAA,EACA,IAAA,EACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,IAAI,SAAS,MAAA,EAAW;AAEtB,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,cAAA;AAAA,QACA,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,QACP,GAAG,IAAI,CAAA,wEAAA,EACoB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACzD;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,EAAA,GAAK,IAAA;AACT,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAMhC,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,IAAa,CAAC,WAAA,CAAY,GAAA,EAAK,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,SAAA,CAAW,CAAA,CAAE,EAAA,EAAI;AAC5F,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AACA,EAAA,IACE,KAAA,CAAM,OAAA,KAAY,MAAA,IAClB,aAAA,CAAc,KAAK,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,IAAI,YAAY,EAAE,UAAA,EAAY,IAAA,EAAM,MAAM,MAAA,EAC/E;AACA,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AACA,EAAA,IACE,KAAA,CAAM,YAAA,KAAiB,MAAA,IACvB,aAAA,CAAc,KAAK,KAAA,CAAM,YAAA,EAAc,CAAA,EAAG,IAAI,iBAAiB,EAAE,UAAA,EAAY,IAAA,EAAM,MACjF,MAAA,EACF;AACA,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AACA,EAAA,IACE,KAAA,CAAM,UAAA,KAAe,MAAA,IACrB,CAAC,cAAA,CAAe,GAAA,EAAK,KAAA,CAAM,UAAA,EAAY,CAAA,EAAG,IAAI,CAAA,WAAA,CAAa,CAAA,CAAE,EAAA,EAC7D;AACA,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,MAAM,MAAM,UAAA,CAAW,GAAA,EAAK,MAAM,MAAA,EAAQ,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AAC1D,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,kBACJ,GAAA,CAAI,KAAA;AAAA,EACpB;AAEA,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,KAAA,EAAO;AAGpC,IAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,cAAA;AAAA,QACA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,QACd,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,0CAA0C,IAAI,CAAA,0FAAA;AAAA,OAE9D;AACA,MAAA,EAAA,GAAK,KAAA;AAAA,IACP;AACA,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,WAAW,GAAG,CAAA,IAAM,aAAA,CAAoC,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3E,MAAA,GAAA,CAAI,GAAA,EAAK,aAAA,EAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,sBAAA,CAAwB,CAAA;AAChF,MAAA,EAAA,GAAK,KAAA;AAAA,IACP;AACA,IAAA,MAAM,KAAA,GAA8B,EAAE,IAAA,EAAM,GAAG,MAAA,EAAO;AACtD,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,MAAA,GAAS,MAAA;AACzC,IAAA,OAAO,KAAK,KAAA,GAAQ,MAAA;AAAA,EACtB;AAEA,EAAA,MAAM,GAAA,GAA0B,EAAE,IAAA,EAAM,GAAG,MAAA,EAAO;AAElD,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,IAAA,GAAA,CAAI,UAAU,KAAA,CAAM,OAAA;AAAA,EACtB,CAAA,MAAA,IAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,KAAA,CAAM,WAAW,MAAA,EAAW;AAChE,IAAA,GAAA;AAAA,MACE,GAAA;AAAA,MACA,iBAAA;AAAA,MACA,GAAG,IAAI,CAAA,QAAA,CAAA;AAAA,MACP,GAAG,IAAI,CAAA,gEAAA;AAAA,KACT;AACA,IAAA,EAAA,GAAK,KAAA;AAAA,EACP;AAEA,EAAA,MAAM,kBAAkB,kBAAA,CAAmB,GAAA,EAAK,MAAM,SAAA,EAAW,MAAA,EAAQ,MAAM,OAAO,CAAA;AACtF,EAAA,IAAI,CAAC,eAAA,CAAgB,EAAA,EAAI,EAAA,GAAK,KAAA;AAAA,OACzB,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,eAAA,CAAgB,KAAK,CAAA;AAE7C,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,eAAe,KAAA,CAAM,YAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,GAAA,CAAI,YAAY,KAAA,CAAM,SAAA;AACzD,EAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW,GAAA,CAAI,eAAe,KAAA,CAAM,YAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,GAAA,CAAI,YAAY,KAAA,CAAM,SAAA;AAEzD,EAAA,OAAO,KAAK,GAAA,GAAM,MAAA;AACpB;AA4CO,SAAS,gBAAA,CACd,GAAA,EACA,OAAA,GAAmC,EAAC,EAChB;AACpB,EAAA,MAAM,GAAA,GAAW,EAAE,WAAA,EAAa,EAAC,EAAE;AACnC,EAAA,MAAM,WAAuC,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,EAAC,EAAE;AACzE,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAA,CAAA,GAAO,EAAA;AAGxD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,QAAQ,KAAA,KAAU,SAAA;AAEjE,EAAA,IAAI,GAAA,KAAQ,UAAa,GAAA,KAAQ,IAAA,SAAa,EAAE,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AACvF,EAAA,IAAI,CAAC,aAAA,CAAc,GAAG,CAAA,EAAG;AACvB,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAiC,CAAA;AACvE,IAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AAAA,EAClD;AAEA,EAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,YAAY,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,GAAA,EAAK,uBAAuB,SAAA,EAAW,CAAA,uBAAA,EAA0B,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3F,IAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AAAA,EAClD;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,WAAA,EAAa;AAC9C,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA;AAAA,QACE,GAAA;AAAA,QACA,gBAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,EAAK,aAAA,EAAe,GAAA,EAAK,CAAA,EAAG,GAAG,CAAA,8CAAA,CAA2C,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAW,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,IAAI,WAAA,EAAY;AACjF,EAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,IAAA,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,WAAA,EAAa,kDAA6C,CAAA;AACnF,IAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AAAA,EAClD;AAEA,EAAA,KAAA,MAAW,CAAC,IAAI,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAA,GAAO,aAAa,EAAE,CAAA,CAAA;AAC5B,IAAA,IAAI,CAAC,gBAAA,CAAiB,EAAE,CAAA,EAAG;AACzB,MAAA,GAAA;AAAA,QACE,GAAA;AAAA,QACA,YAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAI,EAAE,CAAA,2GAAA;AAAA,OAER;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,EAAK,QAAA,EAAU,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA,GAAI,IAAA,CAAK,KAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,UAAA,CAAW,GAAA,EAAK,KAAK,KAAA,EAAO,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,IAAA,IAAI,KAAA,EAAO,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA,GAAI,KAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,KAAA,MAAW,UAAA,IAAc,IAAI,WAAA,EAAa;AACxC,MAAA,UAAA,CAAW,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,EAAG,WAAW,OAAO,CAAA,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,WAAA,EAAY;AAClD;AAKO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,OAAO,MAAM,OAAA,KAAY,KAAA;AAC3B;AAGO,SAAS,eAAe,KAAA,EAAyD;AACtF,EAAA,IAAI,MAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,SAAS,OAAO,MAAA;AAC3D,EAAA,OAAO,MAAM,SAAA,IAAa,QAAA;AAC5B;AAWO,SAAS,oBAAoB,KAAA,EAA4C;AAC9E,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA;AACjC,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,QAAA,EAAU,OAAO,MAAA;AACjD,EAAA,MAAM,QAAA,GAAW,+BAA+B,SAAS,CAAA;AACzD,EAAA,MAAM,SAAU,KAAA,CAA6B,MAAA;AAC7C,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,MAAA,GAAiC,EAAE,GAAG,MAAA,EAAO;AACnD,EAAA,IAAI,SAAA,KAAc,QAAA,EAAU,MAAA,CAAO,SAAA,KAAc,QAAA;AACjD,EAAA,IAAI,GAAA,GAAM,QAAA;AACV,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,CAAA,CAAA,EAAI,GAAG,KAAK,KAAK,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,GAAY,GAAA;AAC/C;AAcO,SAAS,0BAA0B,GAAA,EAA6C;AACrF,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,MAAA,GAAS,4BAA4B,OAAO,CAAA;AAClD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,MAAA;AAAA,EAClF;AAGA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACzF,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,IAAI,GAAG,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA;AAC9D;AAOA,SAAS,4BAA4B,GAAA,EAA8B;AACjE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,QAAA,KAAa,UAAU,OAAO,MAAA;AACxE,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,EAAU,OAAO,MAAA;AAC/C,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,qBAAA,CACd,KACA,OAAA,EACoB;AACpB,EAAA,OAAO,OAAA,KAAY,oBAAA,GAAuB,yBAAA,CAA0B,GAAG,CAAA,GAAI,GAAA;AAC7E;AAIA,IAAM,UAAA,GAAgD;AAAA,EACpD,OAAA,EAAS,CAAA;AAAA,EACT,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAMA,SAAS,SAAA,CAAU,MAAe,GAAA,EAAuB;AACvD,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,GAAA;AAC/B,EAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,IAAA;AAC9B,EAAA,IAAI,CAAC,cAAc,IAAI,CAAA,IAAK,CAAC,aAAA,CAAc,GAAG,GAAG,OAAO,IAAA;AACxD,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,GAAA,EAAI;AAC9C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA,CAAU,KAAA,EAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACT;AAqBO,SAAS,gBAAgB,MAAA,EAA6D;AAC3F,EAAA,MAAM,OAAA,GAAU,MAAA,CACb,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW,EAAE,KAAA,EAAO,KAAA,EAAM,CAAE,CAAA,CACxC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,IAAA,GAAO,WAAW,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AACjE,IAAA,OAAO,IAAA,KAAS,CAAA,GAAI,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAAA,EACzC,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAErB,EAAA,MAAM,YAAqC,EAAC;AAC5C,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,MAAa,OAAA,EAAS;AACnD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjD,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,MAAA,IAAI,SAAA,CAAU,EAAE,CAAA,KAAM,MAAA,EAAW;AAC/B,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,EAAE,GAAG,KAAA,EAAM;AAC3B,QAAA,MAAA,CAAO,EAAE,CAAA,GAAI,KAAA;AACb,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,EAAE,CAAA,GAAI,SAAA,CAAU,SAAA,CAAU,EAAE,GAAG,KAAK,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA,IAGT,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,EAAQ,CAAC,GAAG,MAAM;AAAA,GACpB;AACF;AAyCO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,GAAyC,EAAC,EAChB;AAC1B,EAAA,MAAM,GAAA,GAAW,EAAE,WAAA,EAAa,EAAC,EAAE;AACnC,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,KAAA,EAAO;AAC7B,IAAA,MAAM,KAAA,GAA0C,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AACnE,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,UAA+B,IAAI,GAAA;AAAA,MACvC,OAAO,OAAA,CAAQ,KAAK,EACjB,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS,CAAA,CACzC,GAAA,CAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AAAA,KACvB;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,MAAA;AAC7B,IAAA,MAAM,QAAQ,UAAA,CAAW,GAAA,EAAK,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,OAAO,CAAA;AAG/D,IAAA,MAAM,gBAAgB,OAAA,CAAQ,OAAA,IAAW,EAAC,EACvC,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,SAAA,CAAU,EAAE,MAAM,MAAS,CAAA,CACrD,IAAI,CAAC,MAAA,KAAW,OAAO,KAAK,CAAA;AAC/B,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,MAAM,KAAA,GAAQ,CAAA,iBAAA,EAAoB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACzD,MAAA,KAAA,MAAW,cAAc,GAAA,CAAI,WAAA,CAAY,MAAM,IAAI,CAAA,aAAc,OAAA,IAAW,KAAA;AAAA,IAC9E;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,SAAA,CAAU,EAAE,CAAA,GAAI,KAAA;AAChB,IAAA,MAAA,CAAO,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA,KAAM,MAAS;AAAA,KAClE;AAAA,IACA,aAAa,GAAA,CAAI;AAAA,GACnB;AACF;AAWO,SAAS,mBAAA,CACd,QACA,GAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAA8B,IAAI,GAAA,CAAI,GAAG,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,EAAA,KAAO,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,IAAK,MAAA,CAAO,SAAA,CAAU,EAAE,MAAM,MAAS,CAAA;AAC9F,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,MAAM,SAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,SAAA,CAAU,EAAE,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AACnC,IAAA,MAAA,CAAO,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA,KAAM,MAAS;AAAA,GAClE;AACF;AAGO,SAAS,gBACd,QAAA,EACkC;AAClC,EAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,EAAI,QAAA,CAAS,SAAA,CAAU,EAAE,CAAC,CAA8B,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAChC;AAEA,SAAS,iBACP,QAAA,EACsC;AACtC,EAAA,OAAO,KAAA,CAAM,OAAA,CAAS,QAAA,CAAsC,KAAK,CAAA;AACnE;AAeO,SAAS,mBAAmB,GAAA,EAAkD;AACnF,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC5C,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,GAAG,IAAA,EAAM,IAAI,CAAA,GAAI,KAAA;AACvB,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,EAAA,IAAI,IAAA,KAAS,IAAI,OAAO,MAAA;AACxB,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA,GAAI,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,GAAI,MAAA;AAAA,IAC7D,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK;AAAA,IACtC,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,IAAA,EAAK;AAAA,IAC5C,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,MAAA,IAAI,SAAS,CAAA,IAAK,KAAA,KAAU,IAAA,CAAK,MAAA,GAAS,GAAG,OAAO,MAAA;AACpD,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,EAAE;AAAA,IAC1F;AAAA,IACA;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAGO,SAAS,oBAAoB,GAAA,EAAsC;AACxE,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,IAAI,IAAI,CAAA,CAAA;AAAA,IACxB,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,IAAI,OAAO,CAAA,CAAA;AAAA,IAC3B,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,IAAI,QAAQ,CAAA,CAAA;AAAA,IACjC,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,CAAA;AAAA;AAElD;AAuBA,SAAS,kBACP,QAAA,EACqC;AACrC,EAAA,OAAO,eAAA,CAAgB,QAAQ,CAAA,CAAE,MAAA;AAAA,IAC/B,CAAC,IAAA,KAAA,CACE,IAAA,CAAK,CAAC,EAAE,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,CAAC,EAAE,IAAA,KAAS,OAAA,KAAY,cAAA,CAAe,IAAA,CAAK,CAAC,CAAC;AAAA,GAClF;AACF;AAEA,SAAS,mBAAA,CACP,UAAA,EACA,KAAA,EACA,OAAA,EACA,KAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAiB,OAAA,KAAY,MAAA,GAAY,SAAa,KAAA,CAAM,SAAA,GAAY,OAAO,CAAA,IAAK,OAAA;AAAA,IACpF,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,UAAU,KAAA,CAAM;AAAA,GAClB;AACF;AAmBO,SAAS,aAAA,CACd,GAAA,EACA,QAAA,EACA,KAAA,EAC8B;AAC9B,EAAA,MAAM,OAAA,GAAU,kBAAkB,QAAQ,CAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEjC,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,QAAA,GAAW,IAAI,IAAA,EAAK;AACxB,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,IAAA,IAAA,GAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,+DAAA,CAA4D,CAAA;AACxF,MAAA,MAAM,CAACC,WAAAA,EAAYC,MAAK,CAAA,GAAI,QAAQ,CAAC,CAAA;AACrC,MAAA,OAAO,oBAAoBD,WAAAA,EAAYC,MAAAA,EAAO,QAAW,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IAC7E;AACA,IAAA,QAAA,GAAW,OAAO,IAAA,EAAK;AACvB,IAAA,IAAI,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,2BAAA,EAA8B,QAAQ,CAAA,4BAAA,CAAyB,CAAA;AAC3F,MAAA,MAAM,CAACD,WAAAA,EAAYC,MAAK,CAAA,GAAI,QAAQ,CAAC,CAAA;AACrC,MAAA,OAAO,oBAAoBD,WAAAA,EAAYC,MAAAA,EAAO,QAAW,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IAC7E;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,CAAK,CAAC,CAAC,EAAE,CAAA,KAAM,OAAO,IAAI,CAAA;AAChD,IAAA,IAAI,KAAA,IAAS,SAAS,EAAA,EAAI;AACxB,MAAA,OAAO,mBAAA,CAAoB,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,CAAC,KAAA,IAAS,eAAA,CAAgB,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,EAAE,CAAA,KAAM,EAAA,KAAO,IAAI,CAAA,EAAG;AACnE,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,CAAA,qDAAA,CAAkD,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,IACrB,CAAC,GAAGA,MAAK,CAAA,KAAMA,MAAAA,CAAM,SAAA,GAAY,QAAQ,CAAA,KAAM,MAAA,IAAaA,MAAAA,CAAM,YAAA,GAAe,QAAQ;AAAA,GAC3F;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,MAAA,IAAU,QAAQ,CAAC,CAAA;AAC/C,EAAA,OAAO,oBAAoB,UAAA,EAAY,KAAA,EAAO,UAAU,EAAE,IAAA,EAAM,UAAU,CAAA;AAC5E","file":"chunk-LSI2IVFT.js","sourcesContent":["/**\n * The AI provider registry — one keyed definition of every LLM / voice endpoint\n * the runtime may talk to.\n *\n * This module is the **single canonical home** of the registry record: its\n * types, its validation, the layered merge (§1.5), the `base_url` derivation\n * (§1.3), the credential-reference grammar (§1.4) and the model-reference\n * parser. Nothing here is duplicated in `bridge`, `runner` or `platform` — the\n * structurally-identical-copy pattern that `CloudConfig` fell into is exactly\n * what this module exists to avoid.\n *\n * Vocabulary: this is the **AI provider** registry. It is unrelated to the\n * platform's connector `ProviderType` / `ProviderLink` (git, SharePoint,\n * Drive…). Types are named `AIProvider*` throughout, never bare `Provider*`.\n *\n * The `surface` enum is omp's `api` vocabulary verbatim, so the omp adapter is\n * a serializer rather than a translator.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1\n */\n\n// No runtime imports: this module is the schema, and it must stay loadable in a\n// browser bundle. Credential *resolution* (which spawns processes and reads\n// `process.env`) lives in `./provider-registry-credentials.ts`.\n\n// ── Enums ──────────────────────────────────────────────────────────────────\n\n/**\n * What an entry produces. `llm` and `embed` carry a wire `surface`; `stt` and\n * `tts` use the reduced voice record (§1.7).\n */\nexport const AI_PROVIDER_KINDS = [\"llm\", \"stt\", \"tts\", \"embed\"] as const;\n\n/** Union of {@link AI_PROVIDER_KINDS}. */\nexport type AIProviderKind = (typeof AI_PROVIDER_KINDS)[number];\n\n/** Kinds that use the voice subset of the record (§1.7). */\nexport const AI_PROVIDER_VOICE_KINDS = [\"stt\", \"tts\"] as const;\n\n/** Union of {@link AI_PROVIDER_VOICE_KINDS}. */\nexport type AIProviderVoiceKind = (typeof AI_PROVIDER_VOICE_KINDS)[number];\n\n/**\n * Wire protocol — the discriminator a harness adapter switches on. These are\n * omp's `api` values verbatim (Codex CLI calls the same concept `wire_api`).\n */\nexport const AI_PROVIDER_SURFACES = [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"openai-codex-responses\",\n \"azure-openai-responses\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_SURFACES}. */\nexport type AIProviderSurface = (typeof AI_PROVIDER_SURFACES)[number];\n\n/** How the request reaches the surface — selects the `params` shape (§1.3). */\nexport const AI_PROVIDER_TRANSPORTS = [\n \"direct\",\n \"bedrock\",\n \"vertex\",\n \"foundry\",\n \"azure-openai\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_TRANSPORTS}. */\nexport type AIProviderTransport = (typeof AI_PROVIDER_TRANSPORTS)[number];\n\n/**\n * How the credential is presented (§1.4). `command` is a reserved grammar slot:\n * the schema accepts it, no refresh loop ships yet.\n */\nexport const AI_PROVIDER_CREDENTIAL_KINDS = [\n \"api_key_header\",\n \"bearer\",\n \"sigv4\",\n \"google_adc\",\n \"azure_entra\",\n \"oauth\",\n \"none\",\n \"command\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_CREDENTIAL_KINDS}. */\nexport type AIProviderCredentialKind = (typeof AI_PROVIDER_CREDENTIAL_KINDS)[number];\n\n/**\n * Credential kinds that cannot work without a `ref`. The rest either sign from\n * an ambient chain (`sigv4`, `google_adc`, `azure_entra`) or need nothing\n * (`none`).\n */\nconst CREDENTIAL_REF_REQUIRED: Partial<Record<AIProviderCredentialKind, true>> = {\n api_key_header: true,\n bearer: true,\n oauth: true,\n command: true,\n};\n\n/** omp-compatible model-discovery probes. Unknown values are tolerated with a warning. */\nexport const AI_PROVIDER_DISCOVERY_TYPES = [\n \"openai-models-list\",\n \"anthropic-models-list\",\n \"google-models-list\",\n \"none\",\n] as const;\n\n/** Union of {@link AI_PROVIDER_DISCOVERY_TYPES}. */\nexport type AIProviderDiscoveryType = (typeof AI_PROVIDER_DISCOVERY_TYPES)[number];\n\n/**\n * Configuration layers, **lowest precedence first** (§1.5). `runtime` is the\n * CLI/runtime override layer (`--model`, `--api-key`); `session` is the\n * control-plane layer the platform injects into `session_init`.\n */\nexport const AI_PROVIDER_LAYERS = [\"catalog\", \"user\", \"workspace\", \"runtime\", \"session\"] as const;\n\n/** Union of {@link AI_PROVIDER_LAYERS}. */\nexport type AIProviderLayerId = (typeof AI_PROVIDER_LAYERS)[number];\n\n// ── Record ─────────────────────────────────────────────────────────────────\n\n/** `transport: bedrock` routing parameters. */\nexport interface AIProviderBedrockParams {\n /** AWS region, e.g. `us-east-1`. */\n region: string;\n}\n\n/** `transport: vertex` routing parameters. */\nexport interface AIProviderVertexParams {\n /** GCP project id. */\n project: string;\n /** Vertex location, e.g. `europe-west4`. */\n location: string;\n /** Model publisher; defaults to `google` (use `anthropic` for Claude on Vertex). */\n publisher?: string;\n}\n\n/** `transport: foundry` routing parameters. */\nexport interface AIProviderFoundryParams {\n /** Azure AI Foundry resource name (the `{resource}` in the endpoint host). */\n resource: string;\n}\n\n/**\n * `transport: azure-openai` routing parameters. `resource` is required even\n * though the plan's §1.3 table lists only `deployment`/`api_version`: the\n * derived `base_url` in that same row interpolates `{resource}`.\n */\nexport interface AIProviderAzureOpenAIParams {\n /** Azure OpenAI resource name (the `{resource}` in the endpoint host). */\n resource: string;\n /** Deployment name the request is routed to. */\n deployment: string;\n /** `api-version` query value; mirrored into `query_params` by the adapter. */\n api_version: string;\n}\n\n/** Free-form voice parameters, typed per preset (Deepgram, ElevenLabs, …). */\nexport type AIProviderVoiceParams = Record<string, string | number | boolean>;\n\n/**\n * The `transport` → `params` discriminated union (§1.3, decision §9.9). An open\n * `Record<string, string>` would lose per-transport field rendering in the\n * admin UI, so the pairing is encoded in the type.\n */\nexport type AIProviderTransportSlice =\n | { transport?: \"direct\"; params?: Record<string, never> }\n | { transport: \"bedrock\"; params: AIProviderBedrockParams }\n | { transport: \"vertex\"; params: AIProviderVertexParams }\n | { transport: \"foundry\"; params: AIProviderFoundryParams }\n | { transport: \"azure-openai\"; params: AIProviderAzureOpenAIParams };\n\n/** Reference to a secret. Never the secret itself — see {@link parseCredentialRef}. */\nexport interface AIProviderCredential {\n kind: AIProviderCredentialKind;\n /**\n * `env:NAME` · `cmd:<shell>` · `platform:<configId>` · `keyring:<service>/<account>`.\n * A literal secret here is a validation error.\n */\n ref?: string;\n}\n\n/** Per-model capability facts; unknown ids otherwise truncate silently. */\nexport interface AIProviderCapabilities {\n context_window?: number;\n tools?: boolean;\n images?: boolean;\n thinking_max?: number;\n}\n\n/** omp-compatible discovery descriptor. */\nexport interface AIProviderDiscovery {\n type: AIProviderDiscoveryType | (string & {});\n /** Path appended to `base_url` when the surface default does not apply. */\n path?: string;\n}\n\n/** Fields every entry carries, whatever its `kind`. */\nexport interface AIProviderEntryCommon {\n /** Display name. Never load-bearing. */\n label?: string;\n /** Catalog preset this entry inherits from (`bridge/src/provider-catalog.ts`). */\n preset?: string;\n /** Literal endpoint; wins over the preset value and the transport derivation. */\n base_url?: string;\n /** Static, non-secret request headers. */\n headers?: Record<string, string>;\n credential?: AIProviderCredential;\n /** Default `true`; read it through {@link isEntryEnabled}. */\n enabled?: boolean;\n /** Set by the control plane: lower layers cannot override this entry (§1.5). */\n locked?: boolean;\n}\n\n/** An `llm`/`embed` entry — the full record. */\nexport type AIProviderLlmEntry = AIProviderEntryCommon &\n AIProviderTransportSlice & {\n kind: \"llm\" | \"embed\";\n /** Required unless a `preset` supplies it. */\n surface?: AIProviderSurface;\n /** Azure's `api-version` lives here. */\n query_params?: Record<string, string>;\n /** Logical id → provider-side id. */\n model_map?: Record<string, string>;\n /** Keyed by the *logical* id, i.e. the `model_map` key. */\n capabilities?: Record<string, AIProviderCapabilities>;\n discovery?: AIProviderDiscovery;\n };\n\n/**\n * An `stt`/`tts` entry — the reduced record (§1.7). `surface`, `transport`,\n * `model_map`, `capabilities` and `discovery` are `llm`-only and rejected here:\n * a TTS voice is not a wire protocol.\n */\nexport type AIProviderVoiceEntry = AIProviderEntryCommon & {\n kind: AIProviderVoiceKind;\n /** Preset-typed: Deepgram `{model, language}`, ElevenLabs `{voice_id, output_format}`. */\n params?: AIProviderVoiceParams;\n};\n\n/** One registry entry. */\nexport type AIProviderEntry = AIProviderLlmEntry | AIProviderVoiceEntry;\n\n/** Entry id → entry. Iteration order is registry order. */\nexport type AIProviderRegistry = Record<string, AIProviderEntry>;\n\n/**\n * Any entry's `params`: transport routing parameters (§1.3) or voice options\n * (§1.7). Which of them applies is decided by `transport` and `kind`, and a\n * layer may not carry either — so a patch holds the union and\n * {@link validateMergedRegistry} narrows it.\n */\nexport type AIProviderParams =\n | AIProviderBedrockParams\n | AIProviderVertexParams\n | AIProviderFoundryParams\n | AIProviderAzureOpenAIParams\n | AIProviderVoiceParams;\n\n/**\n * An entry as a single layer may write it (§1.5): any subset of the record,\n * `kind` included. A `<workspace>/.skaile/providers.yml` that names `base_url`\n * alone is an override of one field, not a redefinition — so a layer holds\n * patches, and completeness is gated on the merged entry\n * ({@link validateMergedRegistry}) rather than per layer.\n *\n * Every {@link AIProviderEntry} is a patch; the reverse needs the gate. The\n * `transport`/`params` pairing is deliberately un-discriminated here, because\n * the two halves may come from different layers.\n */\nexport type AIProviderEntryPatch = AIProviderEntryCommon & {\n kind?: AIProviderKind;\n surface?: AIProviderSurface;\n transport?: AIProviderTransport;\n params?: AIProviderParams;\n query_params?: Record<string, string>;\n model_map?: Record<string, string>;\n capabilities?: Record<string, AIProviderCapabilities>;\n discovery?: AIProviderDiscovery;\n};\n\n/** Entry id → partial entry: one layer's contribution to the registry. */\nexport type AIProviderRegistryPatch = Record<string, AIProviderEntryPatch>;\n\n/** A parsed `providers.yml` document — one layer, so entries may be partial. */\nexport interface AIProviderRegistryDocument {\n version: 1;\n providers: AIProviderRegistryPatch;\n}\n\n/** One input to {@link mergeRegistries}. */\nexport interface AIProviderRegistryLayer {\n layer: AIProviderLayerId;\n providers: AIProviderRegistryPatch;\n}\n\n/** The merged view every consumer reads. */\nexport interface MergedAIProviderRegistry {\n version: 1;\n providers: AIProviderRegistry;\n /**\n * Registry order: highest-precedence layer first, document order within a\n * layer. Bare model ids resolve down this list (§1.6).\n */\n order: string[];\n /** Highest-precedence layer that contributed to each entry. */\n origin: Record<string, AIProviderLayerId>;\n /** Entries frozen by `locked: true`; lower layers were ignored for these. */\n locked: string[];\n}\n\n// ── Diagnostics ────────────────────────────────────────────────────────────\n\n/** Severity of an {@link AIProviderDiagnostic}. */\nexport type AIProviderDiagnosticSeverity = \"error\" | \"warning\";\n\n/**\n * A structured note about a registry document. {@link validateRegistry} never\n * throws: every problem is reported here with the offending key in `path`, and\n * each caller (CLI, runner, platform) decides how loud to be.\n */\nexport interface AIProviderDiagnostic {\n /** Stable machine code, e.g. `\"literal_secret\"` / `\"unknown_surface\"`. */\n code: string;\n severity: AIProviderDiagnosticSeverity;\n /** Human-readable, actionable message. */\n message: string;\n /** Dotted path to the offending key, e.g. `providers.groq.headers.x-api-key`. */\n path: string;\n}\n\n/** Result of {@link validateRegistry}: the surviving document plus every note. */\nexport interface RegistryValidation {\n /** Entries that produced an error diagnostic are omitted. */\n document: AIProviderRegistryDocument;\n diagnostics: AIProviderDiagnostic[];\n}\n\n// ── Validation ─────────────────────────────────────────────────────────────\n\n/** Entry ids are file-safe, env-var-derivable keys. */\nconst SAFE_ID = /^[a-z0-9][a-z0-9_-]*$/;\n\n/** POSIX environment variable name. */\nconst ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** The four `credential.ref` forms (§1.4). */\nconst CREDENTIAL_REF = /^(env|cmd|platform|keyring):([\\s\\S]+)$/;\n\n/** Header/query keys whose value must be an indirection, never a literal. */\nconst SECRET_KEY =\n /(^|[-_])(api[-_]?key|apikey|authorization|auth|token|secret|password|passwd|credential|credentials|cookie)([-_]|$)|^key$/i;\n\n/** Value shapes that are a secret whatever the key is called. */\nconst SECRET_VALUE_PATTERNS: RegExp[] = [\n /^sk-/i,\n /^xai-/i,\n /^gsk_/,\n /^(ghp|gho|ghu|ghs)_/,\n /^github_pat_/,\n /^xox[baprs]-/,\n /^AIza[0-9A-Za-z_-]{10,}/,\n /^(Bearer|Token|Basic)\\s+\\S{8,}$/i,\n // Long opaque blob: no spaces, no dots, no scheme punctuation.\n /^[A-Za-z0-9+/_-]{40,}={0,2}$/,\n];\n\n/** `${...}` interpolation — the escape hatch for a templated, non-literal value. */\nconst INTERPOLATION = /\\$\\{[^}]+\\}/;\n\n/** Every key the `llm`/`embed` record accepts. */\nconst LLM_KEYS: Record<string, true> = {\n kind: true,\n label: true,\n preset: true,\n surface: true,\n transport: true,\n base_url: true,\n params: true,\n headers: true,\n query_params: true,\n credential: true,\n model_map: true,\n capabilities: true,\n discovery: true,\n enabled: true,\n locked: true,\n};\n\n/** Every key the `stt`/`tts` record accepts (§1.7). */\nconst VOICE_KEYS: Record<string, true> = {\n kind: true,\n label: true,\n preset: true,\n base_url: true,\n params: true,\n headers: true,\n credential: true,\n enabled: true,\n locked: true,\n};\n\n/**\n * Every key either record accepts. This is the allow-list a *layer* is read\n * against: which of the two records applies is only known once `kind` is, and\n * a layer may leave `kind` to a lower one (§1.5). The `llm`-only keys are\n * rejected on a voice entry by {@link checkEntry}, at merge time.\n */\nconst ENTRY_KEYS: Record<string, true> = { ...LLM_KEYS, ...VOICE_KEYS };\n\n/** Keys that exist only on `llm`/`embed` — named individually when rejected. */\nconst LLM_ONLY_KEYS = [\"surface\", \"transport\", \"model_map\", \"capabilities\", \"discovery\"] as const;\n\nconst CAPABILITY_KEYS: Record<string, true> = {\n context_window: true,\n tools: true,\n images: true,\n thinking_max: true,\n};\n\n/** Required `params` keys per transport (§1.3). */\nconst TRANSPORT_PARAMS: Record<\n Exclude<AIProviderTransport, \"direct\">,\n { required: string[]; optional: string[] }\n> = {\n bedrock: { required: [\"region\"], optional: [] },\n vertex: { required: [\"project\", \"location\"], optional: [\"publisher\"] },\n foundry: { required: [\"resource\"], optional: [] },\n \"azure-openai\": { required: [\"resource\", \"deployment\", \"api_version\"], optional: [] },\n};\n\n/**\n * `transport` → `base_url` template (§1.3). Placeholders are `params` keys.\n * `direct` has no template: it uses the preset literal or an explicit value.\n */\nexport const AI_PROVIDER_BASE_URL_TEMPLATES: Record<\n Exclude<AIProviderTransport, \"direct\">,\n string\n> = {\n bedrock: \"https://bedrock-runtime.{region}.amazonaws.com\",\n vertex:\n \"https://{location}-aiplatform.googleapis.com/v1/projects/{project}/locations/{location}/publishers/{publisher}\",\n foundry: \"https://{resource}.services.ai.azure.com/anthropic\",\n \"azure-openai\": \"https://{resource}.openai.azure.com/openai\",\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True when `id` is usable as a registry key (`[a-z0-9][a-z0-9_-]*`). */\nexport function isSafeProviderId(id: string): boolean {\n return SAFE_ID.test(id);\n}\n\n/**\n * True when `value` must not appear literally under `key`.\n *\n * A value is acceptable when it is an indirection — a `${...}` interpolation or\n * one of the four `credential.ref` forms. Otherwise a value is a literal secret\n * when the key names a credential-bearing header (`authorization`, `x-api-key`,\n * the bare `key` query param Google uses…) or when the value itself has the\n * shape of a token (`sk-…`, `AIza…`, a 40-char opaque blob…).\n *\n * Non-secret literals stay legal: `anthropic-version: 2023-06-01`,\n * `api-version: 2026-01-01`, `HTTP-Referer: https://skaile.ai`.\n */\nexport function looksLikeLiteralSecret(key: string, value: string): boolean {\n const trimmed = value.trim();\n if (trimmed === \"\") return false;\n if (INTERPOLATION.test(trimmed)) return false;\n if (CREDENTIAL_REF.test(trimmed)) return false;\n if (SECRET_KEY.test(key)) return true;\n return SECRET_VALUE_PATTERNS.some((re) => re.test(trimmed));\n}\n\ninterface Ctx {\n diagnostics: AIProviderDiagnostic[];\n}\n\nfunction err(ctx: Ctx, code: string, path: string, message: string): void {\n ctx.diagnostics.push({ code, severity: \"error\", message, path });\n}\n\nfunction warn(ctx: Ctx, code: string, path: string, message: string): void {\n ctx.diagnostics.push({ code, severity: \"warning\", message, path });\n}\n\n/** Validate a `Record<string, string>` field and reject literal secrets in it. */\nfunction readStringMap(\n ctx: Ctx,\n raw: unknown,\n path: string,\n opts: { secretScan: boolean },\n): Record<string, string> | undefined {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map of string values`);\n return undefined;\n }\n const out: Record<string, string> = {};\n let ok = true;\n for (const [key, value] of Object.entries(raw)) {\n const keyPath = `${path}.${key}`;\n if (typeof value !== \"string\") {\n err(ctx, \"invalid_type\", keyPath, `${keyPath} must be a string`);\n ok = false;\n continue;\n }\n if (opts.secretScan && looksLikeLiteralSecret(key, value)) {\n err(\n ctx,\n \"literal_secret\",\n keyPath,\n `${keyPath} holds a literal secret — use a reference instead ` +\n `(env:NAME, cmd:<shell>, platform:<configId>, keyring:<service>/<account>) ` +\n `or a \\${...} interpolation`,\n );\n ok = false;\n continue;\n }\n out[key] = value;\n }\n return ok ? out : undefined;\n}\n\nfunction readCredential(\n ctx: Ctx,\n raw: unknown,\n path: string,\n): { value?: AIProviderCredential; ok: boolean } {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map with a 'kind'`);\n return { ok: false };\n }\n let ok = true;\n for (const key of Object.keys(raw)) {\n if (key !== \"kind\" && key !== \"ref\") {\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a credential key`);\n ok = false;\n }\n }\n const kind = raw.kind;\n if (\n typeof kind !== \"string\" ||\n !(AI_PROVIDER_CREDENTIAL_KINDS as readonly string[]).includes(kind)\n ) {\n err(\n ctx,\n \"unknown_credential_kind\",\n `${path}.kind`,\n `${path}.kind must be one of ${AI_PROVIDER_CREDENTIAL_KINDS.join(\", \")}`,\n );\n return { ok: false };\n }\n const credentialKind = kind as AIProviderCredentialKind;\n\n const rawRef = raw.ref;\n let ref: string | undefined;\n if (rawRef !== undefined) {\n if (typeof rawRef !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.ref`, `${path}.ref must be a string`);\n ok = false;\n } else if (!parseCredentialRef(rawRef)) {\n err(\n ctx,\n \"literal_secret\",\n `${path}.ref`,\n `${path}.ref must be a reference, not a literal secret — ` +\n `use env:NAME, cmd:<shell>, platform:<configId> or keyring:<service>/<account>`,\n );\n ok = false;\n } else {\n ref = rawRef;\n }\n } else if (CREDENTIAL_REF_REQUIRED[credentialKind]) {\n err(\n ctx,\n \"missing_credential_ref\",\n `${path}.ref`,\n `${path}.ref is required for credential kind '${credentialKind}'`,\n );\n ok = false;\n }\n\n if (!ok) return { ok: false };\n return {\n ok: true,\n value: ref === undefined ? { kind: credentialKind } : { kind: credentialKind, ref },\n };\n}\n\n/**\n * Validate `transport` + `params` against §1.3 and rebuild the discriminated\n * union from the merged values.\n *\n * This runs at merge time, not per layer: `params` and the `transport` that\n * types them may be written in different layers (§1.5), so a layer on its own\n * cannot tell a foreign parameter from an override of a legal one.\n *\n * @param present keys the source wrote — a `transport` or `params` that was\n * written and rejected is already reported, and must not also be reported as\n * missing.\n */\nfunction readTransportSlice(\n ctx: Ctx,\n transport: AIProviderTransport | undefined,\n params: Record<string, string | number | boolean> | undefined,\n path: string,\n present: ReadonlySet<string>,\n): { slice: AIProviderTransportSlice; ok: boolean } {\n // Re-deriving `params` against the default would bury the enum diagnostic.\n if (transport === undefined && present.has(\"transport\")) return { slice: {}, ok: false };\n const explicit = transport !== undefined;\n const effective = transport ?? \"direct\";\n const rejectedParams = params === undefined && present.has(\"params\");\n\n if (effective === \"direct\") {\n let ok = true;\n for (const key of Object.keys(params ?? {})) {\n err(\n ctx,\n \"unknown_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is not valid for transport 'direct' — it takes no parameters`,\n );\n ok = false;\n }\n return { slice: explicit ? { transport: \"direct\" } : {}, ok };\n }\n\n const spec = TRANSPORT_PARAMS[effective];\n if (params === undefined) {\n // Written and rejected by the per-layer read — its diagnostic already stands.\n if (!rejectedParams) {\n err(\n ctx,\n \"missing_params\",\n `${path}.params`,\n `${path}.params is required for transport '${effective}' (${spec.required.join(\", \")})`,\n );\n }\n return { slice: {}, ok: false };\n }\n\n let ok = true;\n const values: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n if (!spec.required.includes(key) && !spec.optional.includes(key)) {\n err(\n ctx,\n \"unknown_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is not valid for transport '${effective}' ` +\n `(accepted: ${[...spec.required, ...spec.optional].join(\", \")})`,\n );\n ok = false;\n continue;\n }\n if (typeof value !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.params.${key}`, `${path}.params.${key} must be a string`);\n ok = false;\n continue;\n }\n values[key] = value;\n }\n for (const key of spec.required) {\n if (values[key] === undefined) {\n err(\n ctx,\n \"missing_param\",\n `${path}.params.${key}`,\n `${path}.params.${key} is required for transport '${effective}'`,\n );\n ok = false;\n }\n }\n if (!ok) return { slice: {}, ok: false };\n // Rebuilt field by field so the discriminated union narrows without a cast;\n // every `required` key is present by the check above.\n switch (effective) {\n case \"bedrock\":\n return { slice: { transport: effective, params: { region: values.region } }, ok: true };\n case \"vertex\":\n return {\n slice: {\n transport: effective,\n params: {\n project: values.project,\n location: values.location,\n ...(values.publisher === undefined ? {} : { publisher: values.publisher }),\n },\n },\n ok: true,\n };\n case \"foundry\":\n return { slice: { transport: effective, params: { resource: values.resource } }, ok: true };\n case \"azure-openai\":\n return {\n slice: {\n transport: effective,\n params: {\n resource: values.resource,\n deployment: values.deployment,\n api_version: values.api_version,\n },\n },\n ok: true,\n };\n }\n}\n\n/**\n * `params` as a layer may write them: scalars, and no literal secret. Which\n * keys are legal depends on `transport` (§1.3) or on the voice preset (§1.7),\n * so that half waits for the merge — the secret scan does not, because its\n * diagnostic has to name the file the secret was written into.\n */\nfunction readParams(\n ctx: Ctx,\n raw: unknown,\n path: string,\n): { value?: Record<string, string | number | boolean>; ok: boolean } {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map`);\n return { ok: false };\n }\n const out: Record<string, string | number | boolean> = {};\n let ok = true;\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.${key}`,\n `${path}.${key} must be a string, number or boolean`,\n );\n ok = false;\n continue;\n }\n if (typeof value === \"string\" && looksLikeLiteralSecret(key, value)) {\n err(\n ctx,\n \"literal_secret\",\n `${path}.${key}`,\n `${path}.${key} holds a literal secret — put it in credential.ref as a reference`,\n );\n ok = false;\n continue;\n }\n out[key] = value;\n }\n return ok ? { ok: true, value: out } : { ok: false };\n}\n\nfunction readBaseUrl(ctx: Ctx, raw: unknown, path: string): { value?: string; ok: boolean } {\n if (typeof raw !== \"string\") {\n err(ctx, \"invalid_type\", path, `${path} must be a string`);\n return { ok: false };\n }\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n err(ctx, \"invalid_base_url\", path, `${path} is not a valid URL: ${raw}`);\n return { ok: false };\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n err(\n ctx,\n \"invalid_base_url\",\n path,\n `${path} must use http:// or https:// (got ${parsed.protocol}//)`,\n );\n return { ok: false };\n }\n if (parsed.username || parsed.password) {\n err(\n ctx,\n \"literal_secret\",\n path,\n `${path} embeds credentials in the URL — move them to credential.ref as a reference`,\n );\n return { ok: false };\n }\n return { ok: true, value: raw };\n}\n\nfunction readBoolean(ctx: Ctx, raw: unknown, path: string): { value?: boolean; ok: boolean } {\n if (typeof raw !== \"boolean\") {\n err(ctx, \"invalid_type\", path, `${path} must be true or false`);\n return { ok: false };\n }\n return { ok: true, value: raw };\n}\n\n/** What one layer wrote for an entry, before the kind-dependent half runs. */\ninterface ReadEntryResult {\n entry: AIProviderEntryPatch;\n /**\n * Keys this layer wrote, valid or not. A field that was written and rejected\n * here must not be reported a second time as missing.\n */\n present: ReadonlySet<string>;\n}\n\n/**\n * Read one entry as a **patch**: every check that does not depend on `kind` —\n * types, URLs, the credential grammar, literal secrets, unknown keys.\n *\n * A layer may hold a partial entry (§1.5), so `kind` is optional here and the\n * checks that need it are {@link checkEntry}'s, which runs on the merged\n * entry. A `kind` that *is* written still has to be one of\n * {@link AI_PROVIDER_KINDS}: a typo is malformed input, not an override.\n */\nfunction readEntry(ctx: Ctx, raw: unknown, path: string): ReadEntryResult | undefined {\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", path, `${path} must be a map`);\n return undefined;\n }\n\n const present: ReadonlySet<string> = new Set(Object.keys(raw));\n const entry: AIProviderEntryPatch = {};\n let ok = true;\n\n if (raw.kind !== undefined) {\n if (\n typeof raw.kind !== \"string\" ||\n !(AI_PROVIDER_KINDS as readonly string[]).includes(raw.kind)\n ) {\n err(\n ctx,\n \"unknown_kind\",\n `${path}.kind`,\n `${path}.kind must be one of ${AI_PROVIDER_KINDS.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.kind = raw.kind as AIProviderKind;\n }\n }\n\n for (const key of present) {\n if (!ENTRY_KEYS[key]) {\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a registry key`);\n ok = false;\n }\n }\n\n if (raw.label !== undefined) {\n if (typeof raw.label !== \"string\") {\n err(ctx, \"invalid_type\", `${path}.label`, `${path}.label must be a string`);\n ok = false;\n } else {\n entry.label = raw.label;\n }\n }\n if (raw.preset !== undefined) {\n if (typeof raw.preset !== \"string\" || !isSafeProviderId(raw.preset)) {\n err(\n ctx,\n \"invalid_preset\",\n `${path}.preset`,\n `${path}.preset must be a catalog preset id matching [a-z0-9][a-z0-9_-]*`,\n );\n ok = false;\n } else {\n entry.preset = raw.preset;\n }\n }\n if (raw.base_url !== undefined) {\n const res = readBaseUrl(ctx, raw.base_url, `${path}.base_url`);\n if (!res.ok) ok = false;\n else entry.base_url = res.value;\n }\n if (raw.headers !== undefined) {\n const headers = readStringMap(ctx, raw.headers, `${path}.headers`, { secretScan: true });\n if (!headers) ok = false;\n else entry.headers = headers;\n }\n if (raw.credential !== undefined) {\n const res = readCredential(ctx, raw.credential, `${path}.credential`);\n if (!res.ok) ok = false;\n else entry.credential = res.value;\n }\n if (raw.enabled !== undefined) {\n const res = readBoolean(ctx, raw.enabled, `${path}.enabled`);\n if (!res.ok) ok = false;\n else entry.enabled = res.value;\n }\n if (raw.locked !== undefined) {\n const res = readBoolean(ctx, raw.locked, `${path}.locked`);\n if (!res.ok) ok = false;\n else entry.locked = res.value;\n }\n if (raw.surface !== undefined) {\n if (\n typeof raw.surface !== \"string\" ||\n !(AI_PROVIDER_SURFACES as readonly string[]).includes(raw.surface)\n ) {\n err(\n ctx,\n \"unknown_surface\",\n `${path}.surface`,\n `${path}.surface must be one of ${AI_PROVIDER_SURFACES.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.surface = raw.surface as AIProviderSurface;\n }\n }\n if (raw.transport !== undefined) {\n if (\n typeof raw.transport !== \"string\" ||\n !(AI_PROVIDER_TRANSPORTS as readonly string[]).includes(raw.transport)\n ) {\n err(\n ctx,\n \"unknown_transport\",\n `${path}.transport`,\n `${path}.transport must be one of ${AI_PROVIDER_TRANSPORTS.join(\", \")}`,\n );\n ok = false;\n } else {\n entry.transport = raw.transport as AIProviderTransport;\n }\n }\n if (raw.params !== undefined) {\n const res = readParams(ctx, raw.params, `${path}.params`);\n if (!res.ok) ok = false;\n else entry.params = res.value;\n }\n if (raw.query_params !== undefined) {\n const qp = readStringMap(ctx, raw.query_params, `${path}.query_params`, { secretScan: true });\n if (!qp) ok = false;\n else entry.query_params = qp;\n }\n if (raw.model_map !== undefined) {\n const map = readStringMap(ctx, raw.model_map, `${path}.model_map`, { secretScan: false });\n if (!map) ok = false;\n else entry.model_map = map;\n }\n if (raw.capabilities !== undefined) {\n if (!isPlainObject(raw.capabilities)) {\n err(ctx, \"invalid_type\", `${path}.capabilities`, `${path}.capabilities must be a map`);\n ok = false;\n } else {\n const caps: Record<string, AIProviderCapabilities> = {};\n for (const [modelId, value] of Object.entries(raw.capabilities)) {\n const capPath = `${path}.capabilities.${modelId}`;\n if (!isPlainObject(value)) {\n err(ctx, \"invalid_type\", capPath, `${capPath} must be a map`);\n ok = false;\n continue;\n }\n const cap: AIProviderCapabilities = {};\n for (const [capKey, capValue] of Object.entries(value)) {\n if (!CAPABILITY_KEYS[capKey]) {\n err(\n ctx,\n \"unknown_key\",\n `${capPath}.${capKey}`,\n `${capPath}.${capKey} is not a capability (${Object.keys(CAPABILITY_KEYS).join(\", \")})`,\n );\n ok = false;\n continue;\n }\n const expected = capKey === \"tools\" || capKey === \"images\" ? \"boolean\" : \"number\";\n if (typeof capValue !== expected) {\n err(\n ctx,\n \"invalid_type\",\n `${capPath}.${capKey}`,\n `${capPath}.${capKey} must be a ${expected}`,\n );\n ok = false;\n continue;\n }\n (cap as Record<string, unknown>)[capKey] = capValue;\n }\n caps[modelId] = cap;\n }\n entry.capabilities = caps;\n }\n }\n if (raw.discovery !== undefined) {\n if (!isPlainObject(raw.discovery)) {\n err(ctx, \"invalid_type\", `${path}.discovery`, `${path}.discovery must be a map`);\n ok = false;\n } else {\n const type = raw.discovery.type;\n if (typeof type !== \"string\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.discovery.type`,\n `${path}.discovery.type must be a string`,\n );\n ok = false;\n } else {\n if (!(AI_PROVIDER_DISCOVERY_TYPES as readonly string[]).includes(type)) {\n warn(\n ctx,\n \"unknown_discovery_type\",\n `${path}.discovery.type`,\n `${path}.discovery.type '${type}' is not a known probe ` +\n `(${AI_PROVIDER_DISCOVERY_TYPES.join(\", \")}) — it is kept verbatim`,\n );\n }\n const discovery: AIProviderDiscovery = { type };\n const discPath = raw.discovery.path;\n if (discPath !== undefined) {\n if (typeof discPath !== \"string\") {\n err(\n ctx,\n \"invalid_type\",\n `${path}.discovery.path`,\n `${path}.discovery.path must be a string`,\n );\n ok = false;\n } else {\n discovery.path = discPath;\n }\n }\n for (const key of Object.keys(raw.discovery)) {\n if (key !== \"type\" && key !== \"path\") {\n err(\n ctx,\n \"unknown_key\",\n `${path}.discovery.${key}`,\n `${path}.discovery.${key} is not a discovery key`,\n );\n ok = false;\n }\n }\n entry.discovery = discovery;\n }\n }\n }\n\n return ok ? { entry, present } : undefined;\n}\n\n/** The seven fields both records share, in document order. */\nfunction entryCommon(patch: AIProviderEntryPatch): AIProviderEntryCommon {\n const common: AIProviderEntryCommon = {};\n if (patch.label !== undefined) common.label = patch.label;\n if (patch.preset !== undefined) common.preset = patch.preset;\n if (patch.base_url !== undefined) common.base_url = patch.base_url;\n if (patch.headers !== undefined) common.headers = patch.headers;\n if (patch.credential !== undefined) common.credential = patch.credential;\n if (patch.enabled !== undefined) common.enabled = patch.enabled;\n if (patch.locked !== undefined) common.locked = patch.locked;\n return common;\n}\n\n/**\n * Complete a patch into an entry, or report why it cannot be one.\n *\n * This is the kind-dependent half of validation — the `stt`/`tts` record split\n * (§1.7), the `surface` requirement, the per-transport `params` union (§1.3) —\n * plus the completeness gate itself. It runs on the **merged** entry, because\n * `kind` decides which record applies and a layer is allowed to leave `kind`\n * to a lower one (§1.5).\n *\n * Diagnostics name the entry, not the layers that fed it: the caller that\n * knows the sources ({@link validateMergedRegistry}) attributes them.\n *\n * @param present keys the source wrote, valid or not.\n */\nfunction checkEntry(\n ctx: Ctx,\n patch: AIProviderEntryPatch,\n path: string,\n present: ReadonlySet<string>,\n): AIProviderEntry | undefined {\n const kind = patch.kind;\n if (kind === undefined) {\n // A written-but-rejected `kind` already has its `unknown_kind` diagnostic.\n if (!present.has(\"kind\")) {\n err(\n ctx,\n \"missing_kind\",\n `${path}.kind`,\n `${path}.kind is required and no layer supplies it — ` +\n `an entry needs one of ${AI_PROVIDER_KINDS.join(\", \")}`,\n );\n }\n return undefined;\n }\n\n let ok = true;\n const common = entryCommon(patch);\n // Re-read through the scalar/secret gate: a patch that came from a file has\n // already passed it, but a programmatically injected layer (the control\n // plane's `session`) has not — and the no-literal-secrets rule is one rule,\n // so every site the per-file read scans (`credential.ref`, `headers`,\n // `query_params`, `base_url` userinfo, `params`) is scanned here too.\n if (patch.base_url !== undefined && !readBaseUrl(ctx, patch.base_url, `${path}.base_url`).ok) {\n ok = false;\n }\n if (\n patch.headers !== undefined &&\n readStringMap(ctx, patch.headers, `${path}.headers`, { secretScan: true }) === undefined\n ) {\n ok = false;\n }\n if (\n patch.query_params !== undefined &&\n readStringMap(ctx, patch.query_params, `${path}.query_params`, { secretScan: true }) ===\n undefined\n ) {\n ok = false;\n }\n if (\n patch.credential !== undefined &&\n !readCredential(ctx, patch.credential, `${path}.credential`).ok\n ) {\n ok = false;\n }\n let params: Record<string, string | number | boolean> | undefined;\n if (patch.params !== undefined) {\n const res = readParams(ctx, patch.params, `${path}.params`);\n if (!res.ok) ok = false;\n else params = res.value;\n }\n\n if (kind === \"stt\" || kind === \"tts\") {\n // §1.7 is the whole point of the reduced record, so the message says which\n // key and why.\n for (const key of LLM_ONLY_KEYS) {\n if (!present.has(key)) continue;\n err(\n ctx,\n \"llm_only_key\",\n `${path}.${key}`,\n `${path}.${key} is llm-only and not accepted on kind '${kind}' ` +\n `(voice entries take kind, label, preset, base_url, headers, credential, params, enabled)`,\n );\n ok = false;\n }\n for (const key of present) {\n if (VOICE_KEYS[key] || (LLM_ONLY_KEYS as readonly string[]).includes(key)) continue;\n err(ctx, \"unknown_key\", `${path}.${key}`, `${path}.${key} is not a registry key`);\n ok = false;\n }\n const voice: AIProviderVoiceEntry = { kind, ...common };\n if (params !== undefined) voice.params = params;\n return ok ? voice : undefined;\n }\n\n const llm: AIProviderLlmEntry = { kind, ...common };\n\n if (patch.surface !== undefined) {\n llm.surface = patch.surface;\n } else if (!present.has(\"surface\") && patch.preset === undefined) {\n err(\n ctx,\n \"missing_surface\",\n `${path}.surface`,\n `${path}.surface is required unless the entry inherits one from a preset`,\n );\n ok = false;\n }\n\n const transportResult = readTransportSlice(ctx, patch.transport, params, path, present);\n if (!transportResult.ok) ok = false;\n else Object.assign(llm, transportResult.slice);\n\n if (patch.query_params !== undefined) llm.query_params = patch.query_params;\n if (patch.model_map !== undefined) llm.model_map = patch.model_map;\n if (patch.capabilities !== undefined) llm.capabilities = patch.capabilities;\n if (patch.discovery !== undefined) llm.discovery = patch.discovery;\n\n return ok ? llm : undefined;\n}\n\n/** Options for {@link validateRegistry}. */\nexport interface ValidateRegistryOptions {\n /** Prefix for diagnostic paths — normally the file the document came from. */\n source?: string;\n /**\n * The layer this document feeds. Given — and not `catalog` — the document is\n * read as **one layer** of the §1.5 stack: an entry may be a partial\n * override, so a `kind`, `surface` or transport `params` that another layer\n * supplies is not an error here. {@link validateMergedRegistry} gates the\n * merged entry instead.\n *\n * Omitted, the document has to stand on its own: every entry must be\n * complete, which is what a writer (`skaile providers add`) checks the entry\n * it just built against.\n */\n layer?: AIProviderLayerId;\n}\n\n/**\n * Validate a parsed `providers.yml` document (§1.1–§1.7).\n *\n * Total: never throws. Entries that produce an error are omitted from\n * `document`, mirroring the resolver's per-entry skip semantics — one bad entry\n * must not take the whole registry down. Every diagnostic names the offending\n * key in `path`.\n *\n * Enforced here whatever the mode: safe entry ids, the `kind`/`surface`/\n * `transport`/`credential.kind` enums, the value types, and the\n * no-literal-secrets rule for `credential.ref`, `headers`, `query_params`,\n * `params` and `base_url` userinfo — a secret must be caught in the file it\n * was written into, not in an anonymous merged document.\n *\n * Enforced only when {@link ValidateRegistryOptions.layer} says this document\n * is complete on its own: that an entry has a `kind`, that an `llm` entry has a\n * `surface`, the voice subset (§1.7), and the per-transport `params` union\n * (§1.3). Those depend on `kind`, which a layer may leave to a lower one.\n *\n * Defaults are deliberately **not** materialized: writing `enabled: true` or\n * `transport: direct` into a layer would let that layer's implicit default\n * override a lower layer's explicit value during the merge. Read them through\n * {@link isEntryEnabled} / {@link entryTransport}.\n */\nexport function validateRegistry(\n raw: unknown,\n options: ValidateRegistryOptions = {},\n): RegistryValidation {\n const ctx: Ctx = { diagnostics: [] };\n const document: AIProviderRegistryDocument = { version: 1, providers: {} };\n const prefix = options.source ? `${options.source}: ` : \"\";\n // The catalog layer is generated from presets, never hand-written, so it is\n // held to the same completeness bar as a standalone document.\n const partial = options.layer !== undefined && options.layer !== \"catalog\";\n\n if (raw === undefined || raw === null) return { document, diagnostics: ctx.diagnostics };\n if (!isPlainObject(raw)) {\n err(ctx, \"invalid_type\", \"\", `${prefix}registry document must be a map`);\n return { document, diagnostics: ctx.diagnostics };\n }\n\n if (raw.version !== undefined && raw.version !== 1) {\n err(ctx, \"unsupported_version\", \"version\", `version must be 1 (got ${String(raw.version)})`);\n return { document, diagnostics: ctx.diagnostics };\n }\n\n for (const key of Object.keys(raw)) {\n if (key === \"version\" || key === \"providers\") continue;\n if (key === \"roles\") {\n warn(\n ctx,\n \"roles_not_here\",\n \"roles\",\n \"roles are read from skaile.yaml, not from providers.yml — this block is ignored\",\n );\n continue;\n }\n warn(ctx, \"unknown_key\", key, `${key} is not a registry document key — ignored`);\n }\n\n if (raw.providers === undefined) return { document, diagnostics: ctx.diagnostics };\n if (!isPlainObject(raw.providers)) {\n err(ctx, \"invalid_type\", \"providers\", \"providers must be a map of entry id → entry\");\n return { document, diagnostics: ctx.diagnostics };\n }\n\n for (const [id, rawEntry] of Object.entries(raw.providers)) {\n const path = `providers.${id}`;\n if (!isSafeProviderId(id)) {\n err(\n ctx,\n \"invalid_id\",\n path,\n `'${id}' is not a valid entry id — use lowercase letters, digits, '-' and '_' ` +\n `starting with a letter or digit`,\n );\n continue;\n }\n const read = readEntry(ctx, rawEntry, path);\n if (!read) continue;\n if (partial) {\n document.providers[id] = read.entry;\n continue;\n }\n const entry = checkEntry(ctx, read.entry, path, read.present);\n if (entry) document.providers[id] = entry;\n }\n\n if (options.source) {\n for (const diagnostic of ctx.diagnostics) {\n diagnostic.message = `${prefix}${diagnostic.message}`;\n }\n }\n return { document, diagnostics: ctx.diagnostics };\n}\n\n// ── Reading defaults ───────────────────────────────────────────────────────\n\n/** `enabled` defaults to `true`. */\nexport function isEntryEnabled(entry: AIProviderEntry): boolean {\n return entry.enabled !== false;\n}\n\n/** `transport` defaults to `direct`; voice entries have none. */\nexport function entryTransport(entry: AIProviderEntry): AIProviderTransport | undefined {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") return undefined;\n return entry.transport ?? \"direct\";\n}\n\n/**\n * Resolve an entry's endpoint (§1.3).\n *\n * An explicit `base_url` always wins. Otherwise the transport's template is\n * interpolated from `params` (`publisher` defaults to `google` for Vertex).\n * `transport: direct` has no derivation — an entry that reaches here without a\n * `base_url` inherits one from its preset, which the catalog layer supplies\n * during the merge.\n */\nexport function resolveEntryBaseUrl(entry: AIProviderEntry): string | undefined {\n if (entry.base_url) return entry.base_url;\n const transport = entryTransport(entry);\n if (!transport || transport === \"direct\") return undefined;\n const template = AI_PROVIDER_BASE_URL_TEMPLATES[transport];\n const params = (entry as AIProviderLlmEntry).params as Record<string, string> | undefined;\n if (!params) return undefined;\n const filled: Record<string, string> = { ...params };\n if (transport === \"vertex\") filled.publisher ??= \"google\";\n let out = template;\n for (const [key, value] of Object.entries(filled)) {\n out = out.replaceAll(`{${key}}`, value);\n }\n return /\\{[a-z_]+\\}/.test(out) ? undefined : out;\n}\n\n/**\n * The canonical spelling of an `anthropic-messages` endpoint: the host root\n * that `ANTHROPIC_BASE_URL` takes. Trims, then drops trailing slashes and one\n * trailing `/v1` path segment (case-insensitive), keeping any query or\n * fragment.\n *\n * The Claude CLI, the Anthropic SDK and Goose append `/v1/messages`, so a\n * stored `https://api.anthropic.com/v1` would reach `/v1/v1/messages` and 404.\n * Clients that want the versioned base (`@ai-sdk/anthropic`, Continue) add the\n * `/v1` back themselves. Never apply this to another surface: an OpenAI-style\n * base URL legitimately ends in `/v1` — use {@link normalizeEntryBaseUrl}.\n */\nexport function normalizeAnthropicBaseUrl(url: string | undefined): string | undefined {\n const trimmed = url?.trim();\n if (!trimmed) return undefined;\n const parsed = parseHttpUrlWithoutUserinfo(trimmed);\n if (!parsed) {\n return trimmed.replace(/\\/+$/, \"\").replace(/\\/v1$/i, \"\").replace(/\\/+$/, \"\") || undefined;\n }\n // Work on the path, so a query or fragment does not hide the `/v1`. Built by\n // hand because an emptied path would serialize as \"/\".\n const path = parsed.pathname.replace(/\\/+$/, \"\").replace(/\\/v1$/i, \"\").replace(/\\/+$/, \"\");\n return `${parsed.origin}${path}${parsed.search}${parsed.hash}`;\n}\n\n/**\n * `url` parsed, when rebuilding it from `origin` loses nothing: an http(s)\n * URL without userinfo. `origin` is the string \"null\" for other schemes, and a\n * registry that skipped `readBaseUrl` can still carry either shape.\n */\nfunction parseHttpUrlWithoutUserinfo(url: string): URL | undefined {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return undefined;\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return undefined;\n if (parsed.username || parsed.password) return undefined;\n return parsed;\n}\n\n/**\n * An entry's endpoint in the registry's canonical spelling for its wire\n * `surface`: {@link normalizeAnthropicBaseUrl} for `anthropic-messages`, the\n * URL unchanged for every other surface.\n *\n * `surface` is a parameter, not read off an entry, because an entry may\n * inherit it from a catalog preset that this module cannot see.\n */\nexport function normalizeEntryBaseUrl(\n url: string | undefined,\n surface: AIProviderSurface | undefined,\n): string | undefined {\n return surface === \"anthropic-messages\" ? normalizeAnthropicBaseUrl(url) : url;\n}\n\n// ── Merge ──────────────────────────────────────────────────────────────────\n\nconst LAYER_RANK: Record<AIProviderLayerId, number> = {\n catalog: 0,\n user: 1,\n workspace: 2,\n runtime: 3,\n session: 4,\n};\n\n/**\n * Per-key deep merge with `high` winning. Plain objects recurse; everything\n * else (scalars, arrays) is taken wholesale from whichever side defines it.\n */\nfunction deepMerge(high: unknown, low: unknown): unknown {\n if (high === undefined) return low;\n if (low === undefined) return high;\n if (!isPlainObject(high) || !isPlainObject(low)) return high;\n const out: Record<string, unknown> = { ...low };\n for (const [key, value] of Object.entries(high)) {\n out[key] = deepMerge(value, low[key]);\n }\n return out;\n}\n\n/**\n * Merge registry layers into one view (§1.5).\n *\n * Precedence is taken from each layer's `layer` id, not from array position:\n * `catalog` < `user` < `workspace` < `runtime` < `session`. Two layers with the\n * same id are applied in array order, earliest winning. The merge is per key\n * and deep — a workspace entry that sets only `base_url` keeps the user\n * entry's credential, headers and model map.\n *\n * `locked: true` freezes an entry: every **lower** layer's contribution to that\n * id is dropped silently, which is what makes a control-plane-pinned endpoint\n * un-overridable from a checkout. (`skaile providers set` refuses loudly\n * instead — silence is only correct for the merge.)\n *\n * This is a fold over layer *patches* and checks nothing: an entry no layer\n * completed comes out of here incomplete. {@link validateMergedRegistry} is\n * the gate — {@link loadProviderRegistry} runs it, and any other caller that\n * merges hand-written layers has to as well.\n */\nexport function mergeRegistries(layers: AIProviderRegistryLayer[]): MergedAIProviderRegistry {\n const ordered = layers\n .map((layer, index) => ({ layer, index }))\n .sort((a, b) => {\n const rank = LAYER_RANK[b.layer.layer] - LAYER_RANK[a.layer.layer];\n return rank !== 0 ? rank : a.index - b.index;\n })\n .map((x) => x.layer);\n\n const providers: AIProviderRegistryPatch = {};\n const origin: Record<string, AIProviderLayerId> = {};\n const order: string[] = [];\n const frozen = new Set<string>();\n\n for (const { layer, providers: entries } of ordered) {\n for (const [id, entry] of Object.entries(entries)) {\n if (frozen.has(id)) continue;\n if (providers[id] === undefined) {\n providers[id] = { ...entry };\n origin[id] = layer;\n order.push(id);\n } else {\n providers[id] = deepMerge(providers[id], entry) as AIProviderEntryPatch;\n }\n if (entry.locked) frozen.add(id);\n }\n }\n\n return {\n version: 1,\n // The fold cannot narrow a patch into an entry; `validateMergedRegistry`\n // is what turns this view into one every consumer can read as complete.\n providers: providers as AIProviderRegistry,\n order,\n origin,\n locked: [...frozen],\n };\n}\n\n/** One labelled input to {@link validateMergedRegistry}. */\nexport interface AIProviderRegistrySource {\n /** Where the layer came from — the file path, for the two on-disk layers. */\n label: string;\n providers: AIProviderRegistryPatch;\n}\n\n/** Options for {@link validateMergedRegistry}. */\nexport interface ValidateMergedRegistryOptions {\n /**\n * The layers that were merged, labelled. A merge-time diagnostic names the\n * files that contributed the entry, because those are what the operator has\n * to edit — collapsing the layers into one anonymous document would lose\n * exactly the information the error is about.\n */\n sources?: AIProviderRegistrySource[];\n}\n\n/** Result of {@link validateMergedRegistry}. */\nexport interface MergedRegistryValidation {\n /** The merged view, with every entry no layer completed removed. */\n registry: MergedAIProviderRegistry;\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Gate the **merged** registry (§1.5) — the completeness half of validation.\n *\n * {@link validateRegistry} in layer mode accepts a partial entry, because a\n * workspace file that names `base_url` alone is an override, not a\n * redefinition. This is where an entry has to be whole: only here has every\n * layer folded in, so only here is `kind` known and with it which record\n * applies (§1.7), whether a `surface` is missing, and which transport the\n * `params` belong to (§1.3).\n *\n * Entries that fail are dropped, so a consumer never sees a half-defined\n * endpoint. Every diagnostic names the entry id and — when `sources` are\n * given — the layers that fed the entry, whatever the check that raised it.\n */\nexport function validateMergedRegistry(\n merged: MergedAIProviderRegistry,\n options: ValidateMergedRegistryOptions = {},\n): MergedRegistryValidation {\n const ctx: Ctx = { diagnostics: [] };\n const providers: AIProviderRegistry = {};\n const origin: Record<string, AIProviderLayerId> = {};\n const order: string[] = [];\n\n for (const id of merged.order) {\n const patch: AIProviderEntryPatch | undefined = merged.providers[id];\n if (patch === undefined) continue;\n const present: ReadonlySet<string> = new Set(\n Object.entries(patch)\n .filter(([, value]) => value !== undefined)\n .map(([key]) => key),\n );\n const from = ctx.diagnostics.length;\n const entry = checkEntry(ctx, patch, `providers.${id}`, present);\n // Attributed once over everything this entry raised, so no message site\n // can forget to say which files the operator has to edit.\n const contributors = (options.sources ?? [])\n .filter((source) => source.providers[id] !== undefined)\n .map((source) => source.label);\n if (contributors.length > 0) {\n const where = ` (contributed by ${contributors.join(\", \")})`;\n for (const diagnostic of ctx.diagnostics.slice(from)) diagnostic.message += where;\n }\n if (entry === undefined) continue;\n providers[id] = entry;\n origin[id] = merged.origin[id];\n order.push(id);\n }\n\n return {\n registry: {\n version: 1,\n providers,\n order,\n origin,\n locked: merged.locked.filter((id) => providers[id] !== undefined),\n },\n diagnostics: ctx.diagnostics,\n };\n}\n\n/**\n * Narrow a merged registry to the entries named in `ids`.\n *\n * Registry order is kept (the order of `merged.order`, not of `ids`), so bare\n * model ids still resolve down the same precedence list. `origin` and\n * `locked` are restricted to the picked entries. An id the registry does not\n * hold is ignored here; the caller that wants to warn about it compares `ids`\n * with the result's `order`.\n */\nexport function pickRegistryEntries(\n merged: MergedAIProviderRegistry,\n ids: readonly string[],\n): MergedAIProviderRegistry {\n const wanted: ReadonlySet<string> = new Set(ids);\n const order = merged.order.filter((id) => wanted.has(id) && merged.providers[id] !== undefined);\n const providers: AIProviderRegistry = {};\n const origin: Record<string, AIProviderLayerId> = {};\n for (const id of order) {\n providers[id] = merged.providers[id];\n origin[id] = merged.origin[id];\n }\n return {\n version: 1,\n providers,\n order,\n origin,\n locked: merged.locked.filter((id) => providers[id] !== undefined),\n };\n}\n\n/** Entries of a registry in registry order, as `[id, entry]` pairs. */\nexport function registryEntries(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderEntry]> {\n if (isMergedRegistry(registry)) {\n return registry.order.map((id) => [id, registry.providers[id]] as [string, AIProviderEntry]);\n }\n return Object.entries(registry);\n}\n\nfunction isMergedRegistry(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): registry is MergedAIProviderRegistry {\n return Array.isArray((registry as MergedAIProviderRegistry).order);\n}\n\n// ── Credential references ──────────────────────────────────────────────────\n\n/** A parsed `credential.ref` (§1.4). */\nexport type AIProviderCredentialRef =\n | { form: \"env\"; name: string }\n | { form: \"cmd\"; command: string }\n | { form: \"platform\"; configId: string }\n | { form: \"keyring\"; service: string; account: string };\n\n/**\n * Parse a `credential.ref`. Returns `undefined` for anything that is not one of\n * the four reference forms — which, in a registry file, means a literal secret.\n */\nexport function parseCredentialRef(ref: string): AIProviderCredentialRef | undefined {\n const match = CREDENTIAL_REF.exec(ref.trim());\n if (!match) return undefined;\n const [, form, rest] = match;\n const body = rest.trim();\n if (body === \"\") return undefined;\n switch (form) {\n case \"env\":\n return ENV_NAME.test(body) ? { form: \"env\", name: body } : undefined;\n case \"cmd\":\n return { form: \"cmd\", command: body };\n case \"platform\":\n return { form: \"platform\", configId: body };\n case \"keyring\": {\n const slash = body.indexOf(\"/\");\n if (slash <= 0 || slash === body.length - 1) return undefined;\n return { form: \"keyring\", service: body.slice(0, slash), account: body.slice(slash + 1) };\n }\n default:\n return undefined;\n }\n}\n\n/** Render a parsed reference back to its `<form>:<body>` string. */\nexport function formatCredentialRef(ref: AIProviderCredentialRef): string {\n switch (ref.form) {\n case \"env\":\n return `env:${ref.name}`;\n case \"cmd\":\n return `cmd:${ref.command}`;\n case \"platform\":\n return `platform:${ref.configId}`;\n case \"keyring\":\n return `keyring:${ref.service}/${ref.account}`;\n }\n}\n\n// ── Model references ───────────────────────────────────────────────────────\n\n/** A model selector resolved against a registry. */\nexport interface ResolvedModelRef {\n /** Entry the model routes to. */\n providerId: string;\n /**\n * Logical model id, after `@role` expansion and before `model_map`. Absent\n * only when a dangling role left the provider without a named model — the\n * harness then uses its own default.\n */\n modelId?: string;\n /** Provider-side id: `model_map[modelId] ?? modelId`. */\n providerModelId?: string;\n /** The role name, when the selector was `@role`. */\n role?: string;\n /** Non-fatal notes: a dangling role, a role pointing at an unknown provider. */\n warnings: string[];\n}\n\n/** Entries a model reference may resolve to: enabled, and not a voice endpoint. */\nfunction selectableEntries(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\nfunction resolveAgainstEntry(\n providerId: string,\n entry: AIProviderLlmEntry,\n modelId: string | undefined,\n extra: { role?: string; warnings: string[] },\n): ResolvedModelRef {\n return {\n providerId,\n modelId,\n providerModelId: modelId === undefined ? undefined : (entry.model_map?.[modelId] ?? modelId),\n role: extra.role,\n warnings: extra.warnings,\n };\n}\n\n/**\n * Resolve a model selector against a registry (§1.6, §9.8).\n *\n * Three forms:\n * - `\"<providerId>/<modelId>\"` — explicit. The leading segment is only treated\n * as a provider when the registry actually has that entry, so vendor-scoped\n * ids (`meta-llama/Llama-3.3-70B`, `openai/gpt-oss-120b`) still resolve as\n * bare model ids.\n * - `\"<modelId>\"` — bare; the first entry in registry order that maps the id\n * wins, else the first entry in registry order.\n * - `\"@role\"` — resolved through `roles` (which lives in `skaile.yaml`). A\n * dangling role is **not** fatal: it falls back to registry order and reports\n * a warning.\n *\n * Returns `undefined` when no entry can serve the reference at all (an empty or\n * fully-disabled registry).\n */\nexport function parseModelRef(\n ref: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n roles?: Record<string, string>,\n): ResolvedModelRef | undefined {\n const entries = selectableEntries(registry);\n if (entries.length === 0) return undefined;\n\n const warnings: string[] = [];\n let selector = ref.trim();\n let role: string | undefined;\n\n if (selector.startsWith(\"@\")) {\n role = selector.slice(1);\n const target = roles?.[role];\n if (!target) {\n warnings.push(`role '@${role}' is not defined in roles — falling back to registry order`);\n const [providerId, entry] = entries[0];\n return resolveAgainstEntry(providerId, entry, undefined, { role, warnings });\n }\n selector = target.trim();\n if (selector.startsWith(\"@\")) {\n warnings.push(`role '@${role}' points at another role ('${selector}') — roles do not chain`);\n const [providerId, entry] = entries[0];\n return resolveAgainstEntry(providerId, entry, undefined, { role, warnings });\n }\n }\n\n const slash = selector.indexOf(\"/\");\n if (slash > 0) {\n const head = selector.slice(0, slash);\n const tail = selector.slice(slash + 1);\n const match = entries.find(([id]) => id === head);\n if (match && tail !== \"\") {\n return resolveAgainstEntry(match[0], match[1], tail, { role, warnings });\n }\n if (!match && registryEntries(registry).some(([id]) => id === head)) {\n warnings.push(`provider '${head}' is disabled or not an llm entry — falling back`);\n }\n }\n\n const mapped = entries.find(\n ([, entry]) => entry.model_map?.[selector] !== undefined || entry.capabilities?.[selector],\n );\n const [providerId, entry] = mapped ?? entries[0];\n return resolveAgainstEntry(providerId, entry, selector, { role, warnings });\n}\n"]}
|