@skaile/workspaces 5.19.0 → 6.1.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 +56 -0
- package/README.md +8 -8
- package/dist/app-sdk/index.js +1 -1
- package/dist/{asset-feeds-QGLI3AXI.js → asset-feeds-HJFV7UPW.js} +32 -24
- package/dist/asset-feeds-HJFV7UPW.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +12 -12
- package/dist/asset-manager/index.js +19 -19
- package/dist/asset-manager/installer.js +14 -14
- package/dist/asset-manager/renderers.js +13 -13
- package/dist/asset-manager/src/index.d.ts +214 -27
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/install-agent.d.ts +2 -2
- package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
- package/dist/asset-manager/src/install-instances.d.ts +8 -8
- package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts +34 -3
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/asset-manager/src/mcp-config.d.ts +35 -14
- package/dist/asset-manager/src/mcp-config.d.ts.map +1 -1
- package/dist/asset-manager/src/renderers.d.ts +12 -12
- package/dist/asset-manager/src/renderers.d.ts.map +1 -1
- package/dist/bridge/codex-app-server.js +2 -2
- package/dist/bridge/harnesses/claude-sdk.d.ts +2 -0
- package/dist/bridge/{drivers → harnesses}/claude-sdk.js +69 -73
- package/dist/bridge/harnesses/claude-sdk.js.map +1 -0
- package/dist/bridge/{drivers/gemini.d.ts → harnesses/codex.d.ts} +1 -1
- package/dist/bridge/{drivers → harnesses}/codex.js +53 -53
- package/dist/bridge/harnesses/codex.js.map +1 -0
- package/dist/bridge/{drivers/claude-sdk.d.ts → harnesses/continue.d.ts} +1 -1
- package/dist/bridge/{drivers → harnesses}/continue.js +30 -30
- package/dist/bridge/harnesses/continue.js.map +1 -0
- package/dist/bridge/{drivers → harnesses}/echo.d.ts +1 -1
- package/dist/bridge/{drivers → harnesses}/echo.js +27 -27
- package/dist/bridge/harnesses/echo.js.map +1 -0
- package/dist/bridge/{drivers/continue.d.ts → harnesses/gemini.d.ts} +1 -1
- package/dist/bridge/harnesses/gemini.js +18 -0
- package/dist/bridge/{drivers → harnesses}/goose.d.ts +1 -1
- package/dist/bridge/{drivers → harnesses}/goose.js +30 -30
- package/dist/bridge/harnesses/goose.js.map +1 -0
- package/dist/bridge/{drivers → harnesses}/omp.d.ts +1 -1
- package/dist/bridge/{drivers → harnesses}/omp.js +31 -31
- package/dist/bridge/harnesses/omp.js.map +1 -0
- package/dist/bridge/{drivers → harnesses}/opencode.d.ts +1 -1
- package/dist/bridge/{drivers → harnesses}/opencode.js +31 -31
- package/dist/bridge/harnesses/opencode.js.map +1 -0
- package/dist/bridge/{drivers → harnesses}/qwen.d.ts +1 -1
- package/dist/bridge/{drivers → harnesses}/qwen.js +20 -20
- package/dist/bridge/harnesses/qwen.js.map +1 -0
- package/dist/bridge/index.js +25 -25
- package/dist/bridge/src/agent-exec.d.ts +2 -2
- package/dist/bridge/src/agent-transcript.d.ts +1 -1
- package/dist/bridge/src/agent-transcript.d.ts.map +1 -1
- package/dist/bridge/src/approval-card.d.ts +3 -3
- package/dist/bridge/src/capability-dispatch.d.ts +5 -5
- package/dist/bridge/src/claude-sdk-surface.d.ts +17 -0
- package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -0
- package/dist/bridge/src/cloud.d.ts +4 -4
- package/dist/bridge/src/codex/config-toml.d.ts +3 -3
- package/dist/bridge/src/codex/friendly-error.d.ts +1 -1
- package/dist/bridge/src/codex/friendly-error.d.ts.map +1 -1
- package/dist/bridge/src/codex/{managed-driver.d.ts → managed-harness.d.ts} +5 -5
- package/dist/bridge/src/codex/managed-harness.d.ts.map +1 -0
- package/dist/bridge/src/codex/native-approvals.d.ts +1 -1
- package/dist/bridge/src/codex/native-approvals.d.ts.map +1 -1
- package/dist/bridge/src/error-classifier.d.ts +7 -7
- package/dist/bridge/src/{driver-capabilities.d.ts → harness-capabilities.d.ts} +18 -18
- package/dist/bridge/src/harness-capabilities.d.ts.map +1 -0
- package/dist/bridge/src/harness-model-check.d.ts +40 -0
- package/dist/bridge/src/harness-model-check.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/_subprocess-cli.d.ts +8 -8
- package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/claude-context-usage.d.ts +5 -5
- package/dist/bridge/src/harnesses/claude-context-usage.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/claude-sdk.d.ts +27 -27
- package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/claude-self-turns.d.ts +5 -5
- package/dist/bridge/src/harnesses/claude-self-turns.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/claude-tool-allowlist.d.ts +4 -4
- package/dist/bridge/src/harnesses/claude-tool-allowlist.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/codex.d.ts +14 -14
- package/dist/bridge/src/harnesses/codex.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/continue.d.ts +12 -12
- package/dist/bridge/src/harnesses/continue.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/echo.d.ts +16 -16
- package/dist/bridge/src/harnesses/echo.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/flow-script.d.ts +9 -9
- package/dist/bridge/src/harnesses/flow-script.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/gemini.d.ts +15 -15
- package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/goose.d.ts +10 -10
- package/dist/bridge/src/harnesses/goose.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/omp-models-yml.d.ts +12 -12
- package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/omp.d.ts +23 -23
- package/dist/bridge/src/harnesses/omp.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/opencode.d.ts +11 -11
- package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/qwen.d.ts +12 -12
- package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/recovery-policy.d.ts +4 -4
- package/dist/bridge/src/harnesses/recovery-policy.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/resume-probe.d.ts +3 -3
- package/dist/bridge/src/harnesses/resume-probe.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/sanitize-assistant-text.d.ts +1 -1
- package/dist/bridge/src/harnesses/sanitize-assistant-text.d.ts.map +1 -0
- package/dist/bridge/src/{drivers → harnesses}/scrub-transcript.d.ts +1 -1
- package/dist/bridge/src/harnesses/scrub-transcript.d.ts.map +1 -0
- package/dist/bridge/src/index.d.ts +5 -4
- package/dist/bridge/src/index.d.ts.map +1 -1
- package/dist/bridge/src/logger.d.ts +4 -4
- package/dist/bridge/src/models.d.ts +1 -1
- package/dist/bridge/src/normalizer.d.ts +5 -3
- package/dist/bridge/src/normalizer.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts +5 -5
- package/dist/bridge/src/provider-materialize/continue-config-yaml.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/credential-env.d.ts +3 -3
- package/dist/bridge/src/provider-materialize/{env-drivers.d.ts → env-harnesses.d.ts} +19 -19
- package/dist/bridge/src/provider-materialize/env-harnesses.d.ts.map +1 -0
- package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts +5 -5
- package/dist/bridge/src/provider-materialize/goose-custom-providers.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/opencode-config.d.ts +7 -7
- package/dist/bridge/src/provider-materialize/opencode-config.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/session-config-home.d.ts +5 -5
- package/dist/bridge/src/provider-materialize/session-config-home.d.ts.map +1 -1
- package/dist/bridge/src/provider-registry-derive.d.ts +4 -4
- package/dist/bridge/src/provider-registry-derive.d.ts.map +1 -1
- package/dist/bridge/src/reconfigure-ledger.d.ts +8 -8
- package/dist/bridge/src/reconfigure-ledger.d.ts.map +1 -1
- package/dist/bridge/src/registry.d.ts +34 -41
- package/dist/bridge/src/registry.d.ts.map +1 -1
- package/dist/bridge/src/runner-private-env.d.ts +2 -2
- package/dist/bridge/src/runtime.d.ts +11 -11
- package/dist/bridge/src/runtime.d.ts.map +1 -1
- package/dist/bridge/src/types.d.ts +158 -158
- package/dist/bridge/src/types.d.ts.map +1 -1
- package/dist/{chunk-7NT4F6SR.js → chunk-2LAPHLDH.js} +587 -521
- package/dist/chunk-2LAPHLDH.js.map +1 -0
- package/dist/{chunk-25ZVWL2R.js → chunk-3GMOPFWH.js} +4 -4
- package/dist/{chunk-25ZVWL2R.js.map → chunk-3GMOPFWH.js.map} +1 -1
- package/dist/{chunk-X5YPJV4N.js → chunk-3MWQKQUB.js} +2 -2
- package/dist/{chunk-X5YPJV4N.js.map → chunk-3MWQKQUB.js.map} +1 -1
- package/dist/{chunk-EPBKISS5.js → chunk-3TG2NV2F.js} +2 -2
- package/dist/chunk-3TG2NV2F.js.map +1 -0
- package/dist/{chunk-L2AMXONH.js → chunk-3X7VTCPG.js} +2 -2
- package/dist/chunk-3X7VTCPG.js.map +1 -0
- package/dist/{chunk-VIM3PWZM.js → chunk-4FVIT5DI.js} +3 -3
- package/dist/{chunk-VIM3PWZM.js.map → chunk-4FVIT5DI.js.map} +1 -1
- package/dist/{chunk-IF6IA3PZ.js → chunk-4MUDQCBP.js} +4 -4
- package/dist/{chunk-IF6IA3PZ.js.map → chunk-4MUDQCBP.js.map} +1 -1
- package/dist/{chunk-MKRWN7XP.js → chunk-5J4NPGFM.js} +5 -5
- package/dist/chunk-5J4NPGFM.js.map +1 -0
- package/dist/{chunk-5TBFN46Z.js → chunk-5KRMNUL4.js} +4 -4
- package/dist/chunk-5KRMNUL4.js.map +1 -0
- package/dist/{chunk-7SCS64BG.js → chunk-5Y2KGB4H.js} +109 -74
- package/dist/chunk-5Y2KGB4H.js.map +1 -0
- package/dist/{chunk-YIF2IJUA.js → chunk-6GWSDPBP.js} +3 -3
- package/dist/{chunk-YIF2IJUA.js.map → chunk-6GWSDPBP.js.map} +1 -1
- package/dist/{chunk-WST6UITC.js → chunk-6YR4ALVX.js} +17 -17
- package/dist/chunk-6YR4ALVX.js.map +1 -0
- package/dist/{chunk-YROR332M.js → chunk-7DN6JKP2.js} +2 -2
- package/dist/chunk-7DN6JKP2.js.map +1 -0
- package/dist/{chunk-IZCR27MU.js → chunk-7EKQDY2T.js} +3 -3
- package/dist/chunk-7EKQDY2T.js.map +1 -0
- package/dist/chunk-7HX6FNKL.js +317 -0
- package/dist/chunk-7HX6FNKL.js.map +1 -0
- package/dist/{chunk-COJIL7G4.js → chunk-7LP7RCZI.js} +7 -7
- package/dist/chunk-7LP7RCZI.js.map +1 -0
- package/dist/{chunk-2PBSAH3Z.js → chunk-AATHJRKL.js} +4 -4
- package/dist/{chunk-2PBSAH3Z.js.map → chunk-AATHJRKL.js.map} +1 -1
- package/dist/{chunk-C7WBGSBV.js → chunk-ABFPSVIS.js} +10 -10
- package/dist/chunk-ABFPSVIS.js.map +1 -0
- package/dist/{chunk-ICSCSM5D.js → chunk-ADPM6AYF.js} +3 -3
- package/dist/{chunk-ICSCSM5D.js.map → chunk-ADPM6AYF.js.map} +1 -1
- package/dist/{chunk-WOIRYY5L.js → chunk-AITJ7ELM.js} +141 -27
- package/dist/chunk-AITJ7ELM.js.map +1 -0
- package/dist/{chunk-HU5HVKY7.js → chunk-ASWTQQ7E.js} +4 -4
- package/dist/{chunk-HU5HVKY7.js.map → chunk-ASWTQQ7E.js.map} +1 -1
- package/dist/{chunk-RO6VOM6Z.js → chunk-AZ2H6R5I.js} +51 -25
- package/dist/chunk-AZ2H6R5I.js.map +1 -0
- package/dist/{chunk-I7TWVK6N.js → chunk-BBBCJSSU.js} +4 -4
- package/dist/{chunk-I7TWVK6N.js.map → chunk-BBBCJSSU.js.map} +1 -1
- package/dist/{chunk-AJ7EGIFR.js → chunk-BIRW3HOG.js} +3 -3
- package/dist/chunk-BIRW3HOG.js.map +1 -0
- package/dist/{chunk-FPHNJE4M.js → chunk-CEKW3KXP.js} +91 -30
- package/dist/chunk-CEKW3KXP.js.map +1 -0
- package/dist/{chunk-F6AA42GW.js → chunk-COYF6IG2.js} +5 -5
- package/dist/{chunk-F6AA42GW.js.map → chunk-COYF6IG2.js.map} +1 -1
- package/dist/{chunk-HT35SQZD.js → chunk-DGTI65OC.js} +30 -30
- package/dist/chunk-DGTI65OC.js.map +1 -0
- package/dist/{chunk-W4Q6CKJ5.js → chunk-DIGFA7Z5.js} +11 -11
- package/dist/chunk-DIGFA7Z5.js.map +1 -0
- package/dist/{chunk-335ENCCS.js → chunk-E572OHGY.js} +2 -2
- package/dist/{chunk-335ENCCS.js.map → chunk-E572OHGY.js.map} +1 -1
- package/dist/{chunk-Y5MBW5EU.js → chunk-EJPMNDTP.js} +3 -3
- package/dist/{chunk-Y5MBW5EU.js.map → chunk-EJPMNDTP.js.map} +1 -1
- package/dist/chunk-EX3GLAL6.js +31 -0
- package/dist/chunk-EX3GLAL6.js.map +1 -0
- package/dist/{chunk-XWOPZW26.js → chunk-FKQNBCDW.js} +38 -38
- package/dist/chunk-FKQNBCDW.js.map +1 -0
- package/dist/{chunk-6E6PKKAD.js → chunk-G5SUWZEU.js} +18 -8
- package/dist/chunk-G5SUWZEU.js.map +1 -0
- package/dist/{chunk-2GXSSZAM.js → chunk-GNZBFSRB.js} +12 -12
- package/dist/chunk-GNZBFSRB.js.map +1 -0
- package/dist/{chunk-PYJS5K7V.js → chunk-HMISULVD.js} +5 -5
- package/dist/{chunk-PYJS5K7V.js.map → chunk-HMISULVD.js.map} +1 -1
- package/dist/{chunk-IP2IPMEH.js → chunk-HPMQRAIF.js} +18 -18
- package/dist/chunk-HPMQRAIF.js.map +1 -0
- package/dist/{chunk-MRHVPQNO.js → chunk-HWNK3F3X.js} +1015 -189
- package/dist/chunk-HWNK3F3X.js.map +1 -0
- package/dist/{chunk-ZQSOJH6I.js → chunk-IHFGPHCT.js} +141 -341
- package/dist/chunk-IHFGPHCT.js.map +1 -0
- package/dist/{chunk-CQJH4G2K.js → chunk-ILLTBKDJ.js} +101 -102
- package/dist/chunk-ILLTBKDJ.js.map +1 -0
- package/dist/{chunk-FKU57Q5Q.js → chunk-IRYKRKVQ.js} +3 -3
- package/dist/{chunk-FKU57Q5Q.js.map → chunk-IRYKRKVQ.js.map} +1 -1
- package/dist/{chunk-J24CY3PF.js → chunk-J72MO2WA.js} +39 -39
- package/dist/chunk-J72MO2WA.js.map +1 -0
- package/dist/{chunk-Y56YIT6J.js → chunk-JCPD4QRM.js} +4 -4
- package/dist/chunk-JCPD4QRM.js.map +1 -0
- package/dist/{chunk-X3RMRJNR.js → chunk-JRN5QF4C.js} +8 -3
- package/dist/chunk-JRN5QF4C.js.map +1 -0
- package/dist/{chunk-K4O6L3WH.js → chunk-KNY356I3.js} +3 -3
- package/dist/{chunk-K4O6L3WH.js.map → chunk-KNY356I3.js.map} +1 -1
- package/dist/{chunk-XJVBUDDJ.js → chunk-KUQAJVYT.js} +8 -8
- package/dist/chunk-KUQAJVYT.js.map +1 -0
- package/dist/{chunk-4ZTPYIBE.js → chunk-KW37WNXY.js} +12 -12
- package/dist/chunk-KW37WNXY.js.map +1 -0
- package/dist/{chunk-MJHSLODD.js → chunk-LSI2IVFT.js} +2 -2
- package/dist/chunk-LSI2IVFT.js.map +1 -0
- package/dist/{chunk-WDXZA7QW.js → chunk-LSSYC5IC.js} +2 -2
- package/dist/{chunk-WDXZA7QW.js.map → chunk-LSSYC5IC.js.map} +1 -1
- package/dist/{chunk-WG6V4ISA.js → chunk-NB7SYQYP.js} +7 -7
- package/dist/{chunk-WG6V4ISA.js.map → chunk-NB7SYQYP.js.map} +1 -1
- package/dist/{chunk-EAZECHPM.js → chunk-NBAGV6L2.js} +5 -5
- package/dist/chunk-NBAGV6L2.js.map +1 -0
- package/dist/{chunk-JTOWA6RS.js → chunk-NUA33BYO.js} +181 -64
- package/dist/chunk-NUA33BYO.js.map +1 -0
- package/dist/{chunk-A6SMCEEE.js → chunk-QAKUD6QN.js} +11 -11
- package/dist/{chunk-A6SMCEEE.js.map → chunk-QAKUD6QN.js.map} +1 -1
- package/dist/{chunk-QG6GHTRM.js → chunk-QEULL4Q3.js} +8 -8
- package/dist/chunk-QEULL4Q3.js.map +1 -0
- package/dist/{chunk-ZX4KRWRB.js → chunk-QSYQOTWN.js} +4 -4
- package/dist/{chunk-ZX4KRWRB.js.map → chunk-QSYQOTWN.js.map} +1 -1
- package/dist/{chunk-X4ZZTHU3.js → chunk-RDTLPOPD.js} +4 -4
- package/dist/{chunk-X4ZZTHU3.js.map → chunk-RDTLPOPD.js.map} +1 -1
- package/dist/{chunk-GOCWM7FN.js → chunk-RHN5MRQO.js} +21 -4
- package/dist/chunk-RHN5MRQO.js.map +1 -0
- package/dist/{chunk-XM6T2AZ2.js → chunk-S2XHGWQC.js} +162 -124
- package/dist/chunk-S2XHGWQC.js.map +1 -0
- package/dist/{chunk-VJ7NU7GD.js → chunk-SVTMNSPI.js} +23 -6
- package/dist/chunk-SVTMNSPI.js.map +1 -0
- package/dist/{chunk-I37INEWE.js → chunk-UI745XC3.js} +10 -23
- package/dist/chunk-UI745XC3.js.map +1 -0
- package/dist/{chunk-N46LQR46.js → chunk-VMVDAZLA.js} +53 -30
- package/dist/chunk-VMVDAZLA.js.map +1 -0
- package/dist/{chunk-IG5LZ3WU.js → chunk-VTETQCR6.js} +10 -10
- package/dist/chunk-VTETQCR6.js.map +1 -0
- package/dist/{chunk-EFLKSMCO.js → chunk-VUJXZDCY.js} +5 -5
- package/dist/{chunk-EFLKSMCO.js.map → chunk-VUJXZDCY.js.map} +1 -1
- package/dist/{chunk-H6UVIKQ2.js → chunk-VYVTEMAW.js} +3 -3
- package/dist/{chunk-H6UVIKQ2.js.map → chunk-VYVTEMAW.js.map} +1 -1
- package/dist/{chunk-M3WPBTGJ.js → chunk-WD3L5QSU.js} +2 -2
- package/dist/{chunk-M3WPBTGJ.js.map → chunk-WD3L5QSU.js.map} +1 -1
- package/dist/{chunk-R6O6YWU7.js → chunk-WYZXSJBK.js} +3 -3
- package/dist/{chunk-R6O6YWU7.js.map → chunk-WYZXSJBK.js.map} +1 -1
- package/dist/{chunk-R4I3VBSS.js → chunk-X3YGUKCG.js} +5 -5
- package/dist/{chunk-R4I3VBSS.js.map → chunk-X3YGUKCG.js.map} +1 -1
- package/dist/{chunk-RPZVHXQ3.js → chunk-XFIEVEU7.js} +4 -4
- package/dist/chunk-XFIEVEU7.js.map +1 -0
- package/dist/{chunk-VSZWNUZC.js → chunk-XGULGQA3.js} +4 -4
- package/dist/chunk-XGULGQA3.js.map +1 -0
- package/dist/{chunk-Q6E6FM7P.js → chunk-XKNXPLKR.js} +6 -6
- package/dist/{chunk-Q6E6FM7P.js.map → chunk-XKNXPLKR.js.map} +1 -1
- package/dist/{chunk-7XSAW5OC.js → chunk-YLLVSR2U.js} +4 -4
- package/dist/{chunk-7XSAW5OC.js.map → chunk-YLLVSR2U.js.map} +1 -1
- package/dist/{chunk-6Z5KTFJT.js → chunk-Z3VKUWAX.js} +3 -3
- package/dist/{chunk-6Z5KTFJT.js.map → chunk-Z3VKUWAX.js.map} +1 -1
- package/dist/{chunk-5BEFNLOR.js → chunk-Z7ZEZZB6.js} +8 -8
- package/dist/chunk-Z7ZEZZB6.js.map +1 -0
- package/dist/{chunk-2LSDMJI2.js → chunk-ZAELRYKS.js} +4 -4
- package/dist/{chunk-2LSDMJI2.js.map → chunk-ZAELRYKS.js.map} +1 -1
- package/dist/{chunk-UQ33Y4DM.js → chunk-ZBHZLWV3.js} +4 -4
- package/dist/{chunk-UQ33Y4DM.js.map → chunk-ZBHZLWV3.js.map} +1 -1
- package/dist/{chunk-TIIXG3PN.js → chunk-ZDLUQLI6.js} +4 -4
- package/dist/{chunk-TIIXG3PN.js.map → chunk-ZDLUQLI6.js.map} +1 -1
- package/dist/{chunk-PHRNUTSG.js → chunk-ZFUZ5AKM.js} +4 -4
- package/dist/{chunk-PHRNUTSG.js.map → chunk-ZFUZ5AKM.js.map} +1 -1
- package/dist/{chunk-V257LUBM.js → chunk-ZHGKAZJ7.js} +251 -26
- package/dist/chunk-ZHGKAZJ7.js.map +1 -0
- package/dist/claude-code-RE46FJXI.js +10 -0
- package/dist/{claude-code-2PU7TITZ.js.map → claude-code-RE46FJXI.js.map} +1 -1
- package/dist/cli/index.js +1066 -647
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/agent-pins.d.ts +11 -0
- package/dist/cli/src/agent-pins.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +4 -4
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
- package/dist/cli/src/commands/config.d.ts +2 -2
- 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 +24 -0
- package/dist/cli/src/commands/harness.d.ts.map +1 -0
- package/dist/cli/src/commands/integration.d.ts +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 +20 -2
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-files.d.ts +14 -0
- package/dist/cli/src/commands/migrate-files.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate-harness.d.ts +49 -0
- package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -0
- package/dist/cli/src/commands/migrate.d.ts +4 -2
- package/dist/cli/src/commands/migrate.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin/types.d.ts +1 -6
- package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin-registry-cmd.d.ts +1 -1
- package/dist/cli/src/commands/preset-export.d.ts +1 -1
- package/dist/cli/src/commands/project.d.ts +20 -2
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts +2 -2
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +11 -11
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
- package/dist/cli/src/commands/serve.d.ts +1 -1
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/cli/src/commands/session-logs/local-query.d.ts +2 -0
- package/dist/cli/src/commands/session-logs/local-query.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts +9 -2
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/cli/src/commands/store.d.ts.map +1 -1
- package/dist/cli/src/commands/update.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/config-checks.d.ts +37 -0
- package/dist/cli/src/config-checks.d.ts.map +1 -0
- package/dist/cli/src/harness-error.d.ts +47 -0
- package/dist/cli/src/harness-error.d.ts.map +1 -0
- package/dist/cli/src/helpers.d.ts +5 -5
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/index.d.ts +2 -2
- package/dist/cli/src/setup.d.ts +3 -3
- package/dist/cli/src/setup.d.ts.map +1 -1
- package/dist/cli/src/skill-checks.d.ts +27 -0
- package/dist/cli/src/skill-checks.d.ts.map +1 -1
- package/dist/cli/src/store-addable.d.ts +11 -0
- package/dist/cli/src/store-addable.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +31 -31
- package/dist/connectors/src/connector-prompt.d.ts +5 -5
- package/dist/connectors/src/connector-registry.d.ts +1 -1
- package/dist/connectors-7THEF7YA.js +48 -0
- package/dist/{connectors-RBGZ3M7G.js.map → connectors-7THEF7YA.js.map} +1 -1
- package/dist/connectors-shared/index.js +2 -2
- package/dist/core/framework.js +1 -1
- package/dist/{bridge/drivers/codex.d.ts → core/harness-targets.d.ts} +1 -1
- package/dist/core/harness-targets.js +4 -0
- package/dist/core/harness-targets.js.map +1 -0
- package/dist/core/index.js +11 -11
- 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 +6 -6
- package/dist/core/src/agent-instances.d.ts.map +1 -1
- package/dist/core/src/asset-roots.d.ts +2 -2
- package/dist/core/src/config-key-diagnostics.d.ts +9 -0
- package/dist/core/src/config-key-diagnostics.d.ts.map +1 -0
- package/dist/core/src/framework.d.ts +21 -21
- package/dist/core/src/framework.d.ts.map +1 -1
- package/dist/core/src/{driver-sdk.d.ts → harness-sdk.d.ts} +9 -9
- package/dist/core/src/harness-sdk.d.ts.map +1 -0
- package/dist/core/src/harness-targets.d.ts +71 -0
- package/dist/core/src/harness-targets.d.ts.map +1 -0
- package/dist/core/src/index.d.ts +8 -8
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +10 -0
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +8 -0
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/provider-registry.d.ts +2 -2
- package/dist/core/src/settings.d.ts +17 -16
- package/dist/core/src/settings.d.ts.map +1 -1
- package/dist/core/src/store.d.ts +12 -12
- package/dist/core/src/store.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +39 -21
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/src/workspace-yaml-editor.d.ts +10 -3
- package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
- package/dist/core/store.js +2 -2
- package/dist/core/workspace-config.js +5 -5
- package/dist/deploy/index.js +12 -12
- package/dist/discovery/index.js +5 -5
- package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
- package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
- package/dist/{ensure-sources-GKVLE6L5.js → ensure-sources-IH7CHSJF.js} +22 -22
- package/dist/{ensure-sources-GKVLE6L5.js.map → ensure-sources-IH7CHSJF.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +31 -31
- package/dist/factory-assets/connectors/deploy.js +31 -31
- package/dist/factory-assets/connectors/devserver.js +31 -31
- package/dist/factory-assets/connectors/flow/CONNECTOR.md +5 -5
- package/dist/factory-assets/connectors/flow/adapter.d.ts +3 -3
- package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/adapter.js +31 -31
- package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract.js +1 -1
- package/dist/factory-assets/connectors/flow/engine/types.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/engine.js +13 -13
- package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts +2 -2
- package/dist/factory-assets/connectors/flow/inline-sub-flow-host.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/orchestrator-turn.d.ts +4 -4
- package/dist/factory-assets/connectors/flow/orchestrator-turn.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/prompt-fragments.js +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.d.ts +12 -12
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +33 -33
- package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/sub-flow-runner.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts +22 -22
- package/dist/factory-assets/connectors/flow/subprompt-runner.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow.js +31 -31
- package/dist/factory-assets/connectors/git.js +31 -31
- package/dist/factory-assets/connectors/gmail.js +31 -31
- package/dist/factory-assets/connectors/googledrive.js +31 -31
- package/dist/factory-assets/connectors/local.js +31 -31
- package/dist/factory-assets/connectors/mattermost.js +31 -31
- package/dist/factory-assets/connectors/memory.js +31 -31
- package/dist/factory-assets/connectors/minio.js +31 -31
- package/dist/factory-assets/connectors/postgres.js +31 -31
- package/dist/factory-assets/connectors/s3.js +31 -31
- package/dist/factory-assets/connectors/sharepoint.js +31 -31
- package/dist/factory-assets/connectors/sqlite.js +31 -31
- package/dist/factory-assets/connectors/static-server.js +31 -31
- package/dist/factory-assets/connectors/tunnel.js +31 -31
- package/dist/factory-assets/connectors/webdav.js +31 -31
- package/dist/factory-assets/connectors/xstate-store.js +31 -31
- package/dist/factory-assets/connectors/xstate.js +31 -31
- package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +1 -1
- package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +2 -2
- package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +3 -3
- package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +1 -1
- package/dist/flows-4JZQ3XFK.js +26 -0
- package/dist/{flows-W2FB7WIM.js.map → flows-4JZQ3XFK.js.map} +1 -1
- package/dist/{helpers-34QNVIGB.js → helpers-JNMK3FC2.js} +22 -22
- package/dist/{helpers-34QNVIGB.js.map → helpers-JNMK3FC2.js.map} +1 -1
- package/dist/library/index.js +15 -15
- package/dist/library/install.js +4 -4
- package/dist/library/src/index.d.ts +1 -1
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/local/library-dir.d.ts +22 -5
- package/dist/library/src/local/library-dir.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +6 -0
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/{library-publish-RUQTKTJU.js → library-publish-I3UWXAHI.js} +69 -67
- package/dist/library-publish-I3UWXAHI.js.map +1 -0
- package/dist/model-endpoint/index.js +15 -15
- package/dist/model-endpoint/src/resolve.d.ts +1 -1
- package/dist/open-library-NKKUJLWA.js +42 -0
- package/dist/{open-library-PVTIUQUF.js.map → open-library-NKKUJLWA.js.map} +1 -1
- package/dist/open-registry-BYAXSHUI.js +32 -0
- package/dist/{open-registry-SOIS3TA2.js.map → open-registry-BYAXSHUI.js.map} +1 -1
- package/dist/paths-UKWE35XS.js +22 -0
- package/dist/{paths-JLNX7Y4X.js.map → paths-UKWE35XS.js.map} +1 -1
- package/dist/plugin-registry/index.js +1 -1
- package/dist/plugin-registry/src/context.d.ts +3 -3
- package/dist/plugin-registry/src/context.d.ts.map +1 -1
- package/dist/plugin-registry/src/deploy-handle.d.ts +1 -1
- package/dist/plugin-registry/src/index.d.ts +2 -2
- package/dist/plugin-registry/src/index.d.ts.map +1 -1
- package/dist/plugin-registry/src/internal.d.ts.map +1 -1
- package/dist/plugin-registry/src/registry.d.ts +3 -3
- package/dist/plugin-registry/src/registry.d.ts.map +1 -1
- package/dist/plugin-registry/src/targets.d.ts +9 -9
- package/dist/plugin-registry/src/targets.d.ts.map +1 -1
- package/dist/plugin-store-ABE35NRX.js +23 -0
- package/dist/{plugin-store-G2GWAHSD.js.map → plugin-store-ABE35NRX.js.map} +1 -1
- package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
- package/dist/project-BIPK47JK.js +86 -0
- package/dist/{project-EX47PUBN.js.map → project-BIPK47JK.js.map} +1 -1
- package/dist/resolver/index.js +12 -12
- package/dist/runner/index.js +50 -50
- package/dist/runner/src/agent.d.ts +3 -3
- package/dist/runner/src/agent.d.ts.map +1 -1
- package/dist/runner/src/agents/in-process-host.d.ts +1 -1
- package/dist/runner/src/agents/instances.d.ts +1 -1
- package/dist/runner/src/agents/instances.d.ts.map +1 -1
- package/dist/runner/src/agents/run-controller.d.ts +7 -7
- package/dist/runner/src/agents/run-controller.d.ts.map +1 -1
- package/dist/runner/src/agents/standalone-surface.d.ts +2 -2
- package/dist/runner/src/agents/standalone-surface.d.ts.map +1 -1
- package/dist/runner/src/ai-provider-switch.d.ts +7 -7
- package/dist/runner/src/assistant-home.d.ts +1 -1
- package/dist/runner/src/capability-registry.d.ts +2 -2
- package/dist/runner/src/coalesced-restart.d.ts +2 -2
- package/dist/runner/src/compaction/context-window.d.ts +8 -8
- package/dist/runner/src/compaction/context-window.d.ts.map +1 -1
- package/dist/runner/src/compaction/orchestrator.d.ts +24 -24
- package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
- package/dist/runner/src/compaction-gate.d.ts +30 -30
- package/dist/runner/src/compaction-gate.d.ts.map +1 -1
- package/dist/runner/src/composition/content-source.d.ts.map +1 -1
- package/dist/runner/src/composition/dry-run.d.ts +2 -2
- package/dist/runner/src/composition/dry-run.d.ts.map +1 -1
- package/dist/runner/src/composition/errors.d.ts +16 -1
- package/dist/runner/src/composition/errors.d.ts.map +1 -1
- package/dist/runner/src/composition/resolve-instance.d.ts +2 -2
- package/dist/runner/src/composition/resolve.d.ts +1 -1
- package/dist/runner/src/config.d.ts +3 -3
- package/dist/runner/src/config.d.ts.map +1 -1
- package/dist/runner/src/context-usage/collector.d.ts +15 -15
- package/dist/runner/src/context-usage/collector.d.ts.map +1 -1
- package/dist/runner/src/context-usage/compose.d.ts +6 -6
- package/dist/runner/src/context-usage/compose.d.ts.map +1 -1
- package/dist/runner/src/context-usage/estimator.d.ts +1 -1
- package/dist/runner/src/context-usage/index.d.ts +1 -1
- package/dist/runner/src/context-usage/index.d.ts.map +1 -1
- package/dist/runner/src/context-usage/transcript-tracker.d.ts +2 -2
- package/dist/runner/src/context-usage/transcript-tracker.d.ts.map +1 -1
- package/dist/runner/src/credential-notice.d.ts +4 -4
- package/dist/runner/src/credential-notice.d.ts.map +1 -1
- package/dist/runner/src/credential-rotated.d.ts +1 -1
- package/dist/runner/src/final-text.d.ts +1 -1
- package/dist/runner/src/{driver-swap-gate.d.ts → harness-swap-gate.d.ts} +21 -21
- package/dist/runner/src/harness-swap-gate.d.ts.map +1 -0
- package/dist/runner/src/late-mcp-rebuild.d.ts +6 -6
- package/dist/runner/src/late-mcp-rebuild.d.ts.map +1 -1
- package/dist/runner/src/lifecycle-handler.d.ts +1 -1
- package/dist/runner/src/lifecycle-handler.d.ts.map +1 -1
- package/dist/runner/src/manifest.d.ts +1 -1
- package/dist/runner/src/mcp-runtime-handlers.d.ts +6 -6
- package/dist/runner/src/mcp-runtime-handlers.d.ts.map +1 -1
- package/dist/runner/src/model-endpoint-discovery.d.ts +1 -1
- package/dist/runner/src/pending-turns.d.ts +3 -3
- package/dist/runner/src/platform-blocks.d.ts +5 -5
- package/dist/runner/src/platform-blocks.d.ts.map +1 -1
- package/dist/runner/src/prompt-turn-queue.d.ts +1 -1
- package/dist/runner/src/provider-quota-forwarder.d.ts +1 -1
- package/dist/runner/src/provider-quota-forwarder.d.ts.map +1 -1
- package/dist/runner/src/reconfigure-handler.d.ts +14 -14
- package/dist/runner/src/reconfigure-handler.d.ts.map +1 -1
- package/dist/runner/src/resource-handler.d.ts +1 -1
- package/dist/runner/src/resources.d.ts +5 -5
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/runner-capabilities.d.ts +7 -7
- package/dist/runner/src/runtime-session-emit.d.ts +5 -5
- package/dist/runner/src/runtime-session-emit.d.ts.map +1 -1
- package/dist/runner/src/s3-presign-client.d.ts +1 -1
- package/dist/runner/src/serve-credentials.d.ts +7 -7
- package/dist/runner/src/serve-credentials.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +46 -34
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +41 -41
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/session-capability-wiring.d.ts +9 -9
- package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
- package/dist/runner/src/session-stimulus.d.ts +1 -1
- package/dist/runner/src/session.d.ts +5 -5
- package/dist/runner/src/session.d.ts.map +1 -1
- package/dist/runner/src/skill-staging.d.ts +16 -16
- package/dist/runner/src/skill-staging.d.ts.map +1 -1
- package/dist/runner/src/turn-end-contract.d.ts +5 -5
- package/dist/runner/src/turn-end-contract.d.ts.map +1 -1
- package/dist/runner/src/turn-scheduler.d.ts +22 -22
- package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
- package/dist/runner/src/turn-status-replay.d.ts +1 -1
- package/dist/runner/src/usage-limit-turn-hold.d.ts +1 -1
- package/dist/sdk/asset-manager.js +19 -19
- package/dist/sdk/bridge.js +25 -25
- package/dist/sdk/core.js +11 -11
- package/dist/sdk/flow.js +13 -13
- package/dist/sdk/index.js +54 -54
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +12 -12
- package/dist/sdk/runner.js +50 -50
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/src/agent-session.d.ts +1 -1
- package/dist/sdk/src/local-runtime.d.ts +1 -1
- package/dist/sdk/src/local-runtime.d.ts.map +1 -1
- package/dist/sdk/src/types.d.ts +1 -1
- package/dist/sdk/src/types.d.ts.map +1 -1
- package/dist/sdk/store.js +2 -2
- package/dist/sdk/transport/ws/server.js +12 -12
- package/dist/sdk/transport/ws.js +12 -12
- package/dist/sdk/transport.js +12 -12
- package/dist/sdk/types.js +1 -1
- package/dist/serve-preflight-FLTIBTEX.js +107 -0
- package/dist/serve-preflight-FLTIBTEX.js.map +1 -0
- package/dist/session/index.js +2 -2
- package/dist/session/src/dispatcher.d.ts +2 -2
- package/dist/sessions-2Q7SSYPT.js +5 -0
- package/dist/{sessions-DICDEONJ.js.map → sessions-2Q7SSYPT.js.map} +1 -1
- package/dist/{setup-AFZQNGKA.js → setup-AG6NFHSN.js} +52 -52
- package/dist/setup-AG6NFHSN.js.map +1 -0
- package/dist/skills-UQYUHVKO.js +26 -0
- package/dist/{skills-YYYC6D5X.js.map → skills-UQYUHVKO.js.map} +1 -1
- package/dist/source-ASEHI2XS.js +85 -0
- package/dist/{source-DGPCT5IC.js.map → source-ASEHI2XS.js.map} +1 -1
- package/dist/{source-manifest-publish-AGJ63JF2.js → source-manifest-publish-IEVV3W6J.js} +62 -62
- package/dist/{source-manifest-publish-AGJ63JF2.js.map → source-manifest-publish-IEVV3W6J.js.map} +1 -1
- package/dist/store/index.js +2 -2
- package/dist/store/src/store.d.ts +3 -3
- package/dist/store/src/store.d.ts.map +1 -1
- package/dist/transport/index.js +12 -12
- package/dist/transport/ws/server.js +12 -12
- package/dist/transport/ws.js +12 -12
- package/dist/tui/index.js +70 -70
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/src/repl-session.d.ts +5 -5
- package/dist/tui/src/repl.d.ts +5 -5
- package/dist/tui/src/repl.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/agent-lifecycle.d.ts +1 -1
- package/dist/types/src/agent-lifecycle.d.ts.map +1 -1
- package/dist/types/src/ask-slots.d.ts +1 -1
- package/dist/types/src/capabilities.d.ts +1 -1
- package/dist/types/src/context-usage.d.ts +22 -22
- package/dist/types/src/context-usage.d.ts.map +1 -1
- package/dist/types/src/events.d.ts +49 -49
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/install-manifest.d.ts +1 -1
- package/dist/types/src/install-manifest.d.ts.map +1 -1
- package/dist/types/src/lifecycle.d.ts +6 -6
- package/dist/types/src/lifecycle.d.ts.map +1 -1
- package/dist/types/src/logging.d.ts +1 -1
- package/dist/types/src/manifests/agent.d.ts +3 -3
- package/dist/types/src/protocol.d.ts +4 -4
- package/dist/types/src/runtime.d.ts +38 -38
- package/dist/types/src/runtime.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +22 -11
- package/dist/types/src/version.d.ts.map +1 -1
- package/dist/validator-DRHMJ457.js +5 -0
- package/dist/{validator-FA2PFW6N.js.map → validator-DRHMJ457.js.map} +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +41 -41
- package/dist/workspace-plugin/adapters/omp.js +26 -26
- package/dist/workspace-plugin/adapters/omp.js.map +1 -1
- package/dist/workspace-plugin/index.js +3 -3
- package/dist/workspace-plugin/src/plugin.d.ts +5 -5
- package/dist/workspace-plugin/src/plugin.d.ts.map +1 -1
- package/dist/workspace-plugin/src/tools/flows.d.ts +1 -1
- package/dist/workspace-plugin/src/tools/validator.d.ts +6 -6
- package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
- package/dist/workspace-plugin/src/types.d.ts +2 -2
- package/dist/workspace-plugin/src/types.d.ts.map +1 -1
- package/package.json +59 -59
- package/dist/asset-feeds-QGLI3AXI.js.map +0 -1
- package/dist/bridge/drivers/claude-sdk.js.map +0 -1
- package/dist/bridge/drivers/codex.js.map +0 -1
- package/dist/bridge/drivers/continue.js.map +0 -1
- package/dist/bridge/drivers/echo.js.map +0 -1
- package/dist/bridge/drivers/gemini.js +0 -18
- package/dist/bridge/drivers/goose.js.map +0 -1
- package/dist/bridge/drivers/omp.js.map +0 -1
- package/dist/bridge/drivers/opencode.js.map +0 -1
- package/dist/bridge/drivers/qwen.js.map +0 -1
- package/dist/bridge/src/codex/managed-driver.d.ts.map +0 -1
- package/dist/bridge/src/driver-capabilities.d.ts.map +0 -1
- package/dist/bridge/src/driver-model-check.d.ts +0 -25
- package/dist/bridge/src/driver-model-check.d.ts.map +0 -1
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +0 -1
- package/dist/bridge/src/drivers/claude-context-usage.d.ts.map +0 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +0 -1
- package/dist/bridge/src/drivers/claude-self-turns.d.ts.map +0 -1
- package/dist/bridge/src/drivers/claude-tool-allowlist.d.ts.map +0 -1
- package/dist/bridge/src/drivers/codex.d.ts.map +0 -1
- package/dist/bridge/src/drivers/continue.d.ts.map +0 -1
- package/dist/bridge/src/drivers/echo.d.ts.map +0 -1
- package/dist/bridge/src/drivers/flow-script.d.ts.map +0 -1
- package/dist/bridge/src/drivers/gemini.d.ts.map +0 -1
- package/dist/bridge/src/drivers/goose.d.ts.map +0 -1
- package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +0 -1
- package/dist/bridge/src/drivers/omp.d.ts.map +0 -1
- package/dist/bridge/src/drivers/opencode.d.ts.map +0 -1
- package/dist/bridge/src/drivers/qwen.d.ts.map +0 -1
- package/dist/bridge/src/drivers/recovery-policy.d.ts.map +0 -1
- package/dist/bridge/src/drivers/resume-probe.d.ts.map +0 -1
- package/dist/bridge/src/drivers/sanitize-assistant-text.d.ts.map +0 -1
- package/dist/bridge/src/drivers/scrub-transcript.d.ts.map +0 -1
- package/dist/bridge/src/provider-materialize/env-drivers.d.ts.map +0 -1
- package/dist/chunk-2GXSSZAM.js.map +0 -1
- package/dist/chunk-4ZTPYIBE.js.map +0 -1
- package/dist/chunk-5BEFNLOR.js.map +0 -1
- package/dist/chunk-5TBFN46Z.js.map +0 -1
- package/dist/chunk-6E6PKKAD.js.map +0 -1
- package/dist/chunk-7NT4F6SR.js.map +0 -1
- package/dist/chunk-7SCS64BG.js.map +0 -1
- package/dist/chunk-AJ7EGIFR.js.map +0 -1
- package/dist/chunk-C7WBGSBV.js.map +0 -1
- package/dist/chunk-COJIL7G4.js.map +0 -1
- package/dist/chunk-CQJH4G2K.js.map +0 -1
- package/dist/chunk-EAZECHPM.js.map +0 -1
- package/dist/chunk-EPBKISS5.js.map +0 -1
- package/dist/chunk-FPHNJE4M.js.map +0 -1
- package/dist/chunk-GOCWM7FN.js.map +0 -1
- package/dist/chunk-HT35SQZD.js.map +0 -1
- package/dist/chunk-I37INEWE.js.map +0 -1
- package/dist/chunk-IG5LZ3WU.js.map +0 -1
- package/dist/chunk-IP2IPMEH.js.map +0 -1
- package/dist/chunk-IZCR27MU.js.map +0 -1
- package/dist/chunk-J24CY3PF.js.map +0 -1
- package/dist/chunk-JTOWA6RS.js.map +0 -1
- package/dist/chunk-L2AMXONH.js.map +0 -1
- package/dist/chunk-MJHSLODD.js.map +0 -1
- package/dist/chunk-MKRWN7XP.js.map +0 -1
- package/dist/chunk-MRHVPQNO.js.map +0 -1
- package/dist/chunk-N46LQR46.js.map +0 -1
- package/dist/chunk-PUK7TQT4.js +0 -13
- package/dist/chunk-PUK7TQT4.js.map +0 -1
- package/dist/chunk-QG6GHTRM.js.map +0 -1
- package/dist/chunk-RO6VOM6Z.js.map +0 -1
- package/dist/chunk-RPZVHXQ3.js.map +0 -1
- package/dist/chunk-V257LUBM.js.map +0 -1
- package/dist/chunk-VJ7NU7GD.js.map +0 -1
- package/dist/chunk-VSZWNUZC.js.map +0 -1
- package/dist/chunk-W4Q6CKJ5.js.map +0 -1
- package/dist/chunk-WOIRYY5L.js.map +0 -1
- package/dist/chunk-WST6UITC.js.map +0 -1
- package/dist/chunk-X3RMRJNR.js.map +0 -1
- package/dist/chunk-XJVBUDDJ.js.map +0 -1
- package/dist/chunk-XM6T2AZ2.js.map +0 -1
- package/dist/chunk-XWOPZW26.js.map +0 -1
- package/dist/chunk-Y56YIT6J.js.map +0 -1
- package/dist/chunk-YROR332M.js.map +0 -1
- package/dist/chunk-ZQSOJH6I.js.map +0 -1
- package/dist/claude-code-2PU7TITZ.js +0 -10
- package/dist/cli/src/driver-error.d.ts +0 -28
- package/dist/cli/src/driver-error.d.ts.map +0 -1
- package/dist/connectors-RBGZ3M7G.js +0 -48
- package/dist/core/driver-targets.d.ts +0 -2
- package/dist/core/driver-targets.js +0 -4
- package/dist/core/driver-targets.js.map +0 -1
- package/dist/core/src/driver-sdk.d.ts.map +0 -1
- package/dist/core/src/driver-targets.d.ts +0 -71
- package/dist/core/src/driver-targets.d.ts.map +0 -1
- package/dist/flows-W2FB7WIM.js +0 -26
- package/dist/library-publish-RUQTKTJU.js.map +0 -1
- package/dist/open-library-PVTIUQUF.js +0 -42
- package/dist/open-registry-SOIS3TA2.js +0 -32
- package/dist/paths-JLNX7Y4X.js +0 -22
- package/dist/plugin-store-G2GWAHSD.js +0 -23
- package/dist/project-EX47PUBN.js +0 -84
- package/dist/runner/src/driver-swap-gate.d.ts.map +0 -1
- package/dist/serve-preflight-QXRKGOI5.js +0 -108
- package/dist/serve-preflight-QXRKGOI5.js.map +0 -1
- package/dist/sessions-DICDEONJ.js +0 -5
- package/dist/setup-AFZQNGKA.js.map +0 -1
- package/dist/skills-YYYC6D5X.js +0 -26
- package/dist/source-DGPCT5IC.js +0 -85
- package/dist/validator-FA2PFW6N.js +0 -5
- /package/dist/bridge/{drivers → harnesses}/gemini.js.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/drivers/flow-script.ts","../../../bridge/src/drivers/echo.ts"],"names":["events"],"mappings":"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","file":"echo.js","sourcesContent":["/**\n * Scripted-flow decision logic for the echo driver.\n *\n * Pure, deterministic policy that maps a live {@link FlowExecution} snapshot\n * (plus an optional per-node script) to the single next flow-adapter mutation\n * the driver should emit this iteration. The echo driver calls this in a loop\n * per turn (see `echo.ts`), executing each returned action against the\n * runner-injected {@link FlowTestDriverHook} until it yields (`null`) or emits\n * a turn-ending action.\n *\n * The policy mirrors what a real LLM orchestrator would do, but without an\n * LLM: it reacts to state each turn, so a host can drive a flow to `complete`,\n * park it at an approval/input gate, and exercise the reject/recover path\n * simply by applying host mutations (`applyApproval`, `applyInput`, …) between\n * turns. No new protocol, no flow-contract change — it only calls the existing\n * FlowAdapter agent-tool operations.\n *\n * @docLink packages/bridge/drivers#scripted-flow\n * @since 3.6.0\n */\n\nimport type { FlowExecution, NodeExecution } from \"@skaile/workspaces/types\";\n\n/**\n * What the scripted driver should do when a node reaches its decision point.\n *\n * - `auto` (default): follow the flow's `autonomousMode` — `complete_node`\n * when autonomous, else `request_approval`. A mandatory approval gate always\n * resolves to `request_approval`, even when autonomous (it cannot be skipped).\n * - `complete`: always `complete_node` (autonomous-style, even if the flow's\n * autonomousMode is false — the adapter allows it only when autonomous, so\n * use with autonomous flows).\n * - `approve`: always `request_approval` (park at an approval gate).\n * - `input`: `request_input` once; after the host applies input, fall back to\n * `auto` behaviour.\n * - `skip`: `skip_node` (optional nodes only).\n * - `fail`: `fail_node`. With `recoverable: false` (default) this is terminal.\n * With `recoverable: true` the node returns to `available`; the driver\n * re-emits the recoverable failure `failCount` times (default 1) and then\n * proceeds as `auto` — it never deadlocks on a recoverable fail.\n */\nexport type OnRun = \"auto\" | \"complete\" | \"approve\" | \"input\" | \"skip\" | \"fail\";\n\n/**\n * What to do when a node returns to `available` after a rejection.\n *\n * - `retry` (default): re-drive it — `start_node` again, then its `onRun`.\n * - `fail`: `fail_node(recoverable: false)` — exercises the terminal path.\n */\nexport type OnReject = \"retry\" | \"fail\";\n\n/** Per-node scripting directive. All fields optional. */\nexport interface FlowNodeDirective {\n onRun?: OnRun;\n onReject?: OnReject;\n /** For `onRun: \"input\"` — the input request shown to the host. */\n input?: { prompt?: string; schema?: unknown };\n /** For `onRun: \"fail\"` — whether the failure is recoverable. Default false. */\n recoverable?: boolean;\n /**\n * For `onRun: \"fail\"` with `recoverable: true` — how many recoverable\n * failures to emit before the node proceeds as `auto`. Default 1. Counted\n * from the node's own `errorHistory`, so the policy stays a pure function of\n * state (no driver-instance bookkeeping) and never deadlocks.\n */\n failCount?: number;\n /** Summary text used for `complete_node` / `request_approval` / failures. */\n summary?: string;\n}\n\n/**\n * A scripted-flow program. Empty (`{}`) means \"canonical policy\": start each\n * available node, then complete (autonomous) or request approval (interactive)\n * — enough to drive the autonomous-complete, approval-gate, and reject/recover\n * scenarios with no per-node scripting at all.\n */\nexport interface FlowScript {\n /** Per-node overrides, keyed by node id. */\n nodes?: Record<string, FlowNodeDirective>;\n /** Fallback directive for any node without its own entry. */\n default?: FlowNodeDirective;\n}\n\n/** A single flow-adapter mutation the driver will execute. */\nexport type FlowAction =\n | { op: \"start_node\"; nodeId: string }\n | { op: \"complete_node\"; nodeId: string; summary: string }\n | { op: \"request_approval\"; nodeId: string; summary: string }\n | { op: \"request_input\"; nodeId: string; prompt: string; schema: string }\n | { op: \"skip_node\"; nodeId: string }\n | { op: \"fail_node\"; nodeId: string; message: string; recoverable: boolean };\n\n/** Ops that end the agent turn (the runner yields until the host acts). */\nconst TURN_ENDING: ReadonlySet<FlowAction[\"op\"]> = new Set([\n \"request_approval\",\n \"request_input\",\n \"fail_node\",\n]);\n\n/** Whether an action ends the turn (driver stops looping after emitting it). */\nexport function isTurnEnding(action: FlowAction): boolean {\n return TURN_ENDING.has(action.op);\n}\n\n/** Map a {@link FlowAction} to the `executeOp` argument bag the adapter expects. */\nexport function actionArgs(action: FlowAction): Record<string, unknown> {\n switch (action.op) {\n case \"start_node\":\n case \"skip_node\":\n return { nodeId: action.nodeId };\n case \"complete_node\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_approval\":\n return { nodeId: action.nodeId, summary: action.summary };\n case \"request_input\":\n return { nodeId: action.nodeId, prompt: action.prompt, schema: action.schema };\n case \"fail_node\":\n return {\n nodeId: action.nodeId,\n message: action.message,\n recoverable: String(action.recoverable),\n };\n }\n}\n\nfunction summaryFor(d: FlowNodeDirective, n: NodeExecution): string {\n return d.summary ?? `Scripted output for ${n.id}`;\n}\n\n/**\n * Decide the single next flow action for the current state, or `null` to yield\n * (nothing to do this iteration — wait for a host mutation).\n *\n * Priority order: resolve approved gates → advance running nodes → start (or\n * skip / terminally-fail) available nodes. Terminal flow states and gates with\n * no decision / input yet yield.\n *\n * Pure — the fail bookkeeping (how many recoverable failures a node has already\n * emitted) is read from the node's own `errorHistory`, so no external counter is\n * needed and a recoverable `fail` directive can never deadlock.\n */\nexport function decideFlowAction(\n state: FlowExecution,\n script: FlowScript,\n mandatoryGates: ReadonlySet<string> = new Set(),\n): FlowAction | null {\n // Terminal flow — never fight a completed/failed/cancelled run.\n if (state.status === \"complete\" || state.status === \"failed\" || state.status === \"cancelled\") {\n return null;\n }\n\n const dir = (id: string): FlowNodeDirective => script.nodes?.[id] ?? script.default ?? {};\n const nodes = Object.values(state.nodes);\n // A mandatory gate can never auto-complete — `auto` resolves to `approve`\n // regardless of autonomousMode so the host can drive it deterministically.\n const canAutoComplete = (id: string): boolean => state.autonomousMode && !mandatoryGates.has(id);\n\n // 1. Approved gate → complete.\n for (const n of nodes) {\n if (n.status === \"awaiting_approval\" && n.approval?.decision === \"approved\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(dir(n.id), n) };\n }\n }\n\n // 2. Running node → per directive.\n for (const n of nodes) {\n if (n.status !== \"running\") continue;\n const d = dir(n.id);\n const onRun: OnRun = d.onRun ?? \"auto\";\n const resolved: OnRun =\n onRun === \"auto\" ? (canAutoComplete(n.id) ? \"complete\" : \"approve\") : onRun;\n\n if (resolved === \"complete\") {\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"approve\") {\n return { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n if (resolved === \"input\") {\n const lastInput = n.inputHistory[n.inputHistory.length - 1];\n if (lastInput && lastInput.response !== undefined) {\n // Input already provided — proceed as if `auto`.\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n return {\n op: \"request_input\",\n nodeId: n.id,\n prompt: d.input?.prompt ?? `Provide input for ${n.id}`,\n schema: JSON.stringify(d.input?.schema ?? { kind: \"text\" }),\n };\n }\n if (resolved === \"fail\") {\n const recoverable = d.recoverable ?? false;\n if (!recoverable) {\n // Terminal fail — the adapter marks node + flow `failed`, so the\n // terminal-status guard above stops any re-fire on later turns.\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted failure for ${n.id}`,\n recoverable: false,\n };\n }\n // Recoverable fail — emit up to `failCount` times (counting the node's\n // own recorded recoverable errors), then proceed as `auto` so the node\n // is not stranded in a re-drive loop.\n const emitted = n.errorHistory.filter((e) => e.recoverable).length;\n const failCount = Math.max(1, d.failCount ?? 1);\n if (emitted < failCount) {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Scripted recoverable failure for ${n.id}`,\n recoverable: true,\n };\n }\n return canAutoComplete(n.id)\n ? { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) }\n : { op: \"request_approval\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n // `skip` while running is illegal; complete instead to avoid a deadlock.\n return { op: \"complete_node\", nodeId: n.id, summary: summaryFor(d, n) };\n }\n\n // 3. Available node → terminally-fail (post-reject), skip, or start.\n for (const n of nodes) {\n if (n.status !== \"available\") continue;\n const d = dir(n.id);\n const lastApproval = n.approvalHistory[n.approvalHistory.length - 1];\n if (lastApproval?.decision === \"rejected\" && d.onReject === \"fail\") {\n return {\n op: \"fail_node\",\n nodeId: n.id,\n message: d.summary ?? `Rejected and not recoverable: ${n.id}`,\n recoverable: false,\n };\n }\n if (d.onRun === \"skip\") {\n return { op: \"skip_node\", nodeId: n.id };\n }\n return { op: \"start_node\", nodeId: n.id };\n }\n\n // 4. Nothing actionable — awaiting_approval (no decision), awaiting_input\n // (no response), or fully drained. Yield.\n return null;\n}\n\n/**\n * Parse a `[test-flow]` sentinel body into a {@link FlowScript}. An empty body\n * yields the canonical (empty) script. Malformed JSON is a hard error so tests\n * fail loudly rather than silently running the wrong policy.\n */\nexport function parseFlowScript(body: string): FlowScript {\n const trimmed = body.trim();\n if (trimmed.length === 0) return {};\n const parsed: unknown = JSON.parse(trimmed);\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"flow script must be a JSON object\");\n }\n return parsed as FlowScript;\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentEvent,\n type BridgeCapabilityTool,\n type DriverInfo,\n} from \"../types.js\";\nimport {\n actionArgs,\n type FlowScript,\n decideFlowAction,\n isTurnEnding,\n parseFlowScript,\n} from \"./flow-script.js\";\n\n/**\n * Echo/mock driver for E2E testing in docker mode.\n *\n * Runs inside a real Docker container with real WebSocket transport and\n * session lifecycle, but generates deterministic keyword-triggered responses\n * instead of calling the Anthropic API. This lets E2E tests exercise the\n * full infrastructure (containers, WebSocket, session management, message\n * persistence) without needing real AI credentials.\n *\n * Keyword triggers match the MockAgentClient in\n * `platform/backend/libs/agent-gateway/src/mock-agent-client.ts` — the\n * same test messages (\"test toolcall\", \"test question\", etc.) produce\n * the same events.\n *\n * Enable by setting `SKAILE_AGENT_DRIVER=echo` in the container env,\n * or by passing `{ driver: 'echo' }` in the runner config.\n *\n * @docLink packages/bridge/drivers#echo-driver\n */\nexport class EchoDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n private readonly log: Logger = getBridgeLogger(\"echo\");\n private running = false;\n private readonly config: AgentConfig;\n\n /**\n * Scripted-flow mode state (workspaces#396). Enabled by a `[test-flow]`\n * sentinel chat message; once on, orchestrator-prompt turns are driven\n * deterministically against `config.flowTestDriver`. `null` script ⇒ mode\n * off (default echo behaviour, unchanged).\n */\n private flowScript: FlowScript | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Test surface: returns the tool list the LLM would see for this turn.\n * Composition: the registry hooks (Protocol v2) take precedence; legacy\n * `mcpServers` is not enumerated here (the echo driver never exposed MCP\n * tools to the LLM by name).\n */\n listCapabilityTools(): BridgeCapabilityTool[] {\n return this.config.capabilities?.composeTools() ?? [];\n }\n\n /**\n * Test surface: invoke a registered capability through the dispatch\n * helper. Mirrors what a real driver would do when the LLM produced a\n * tool_use for the given name — applies fire-and-forget, render emission,\n * and fallback text. Returns the structured dispatch result so tests can\n * assert immediate-vs-background resolution.\n */\n async invokeCapabilityForTest(\n name: string,\n input: unknown,\n ): Promise<{ result: unknown; background: boolean }> {\n const hooks = this.config.capabilities;\n if (!hooks) throw new Error(\"EchoDriver: no capability hooks configured\");\n const out = await dispatchCapability(hooks, name, input, (_err, callId) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n callId,\n // Nothing from the error: its message or name can quote the call's\n // content. The registry's `failed` row for the same call has the metadata.\n }),\n );\n return out;\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.log.info(\"driver started\");\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.running) return;\n const content = message.toLowerCase();\n this.log.info(\"received prompt\", { preview: message.slice(0, 80), length: message.length });\n\n // Small delay to simulate real agent processing\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Scripted-flow test seam (workspaces#396) — a `[test-flow]` sentinel\n // arms deterministic flow driving for this session and (optionally)\n // carries a JSON script. Format: `[test-flow] {json}`; empty body ⇒\n // canonical policy. Must be handled before the flow-turn branch below.\n //\n // Detection is LINE-anchored, not message-anchored (workspaces#401): hosts\n // decorate user messages (e.g. a prepended `<SESSION_MEMBERS>` block and a\n // wake-restoration preamble), so the sentinel is rarely at the start of the\n // composed prompt. We match `[test-flow]` at the start of ANY line (only\n // leading whitespace allowed), which is decoration-independent yet still\n // impossible to arm from ordinary prose — a line must BEGIN with the exact\n // token. The optional JSON script must sit on that same line.\n const flowMatch = /^[ \\t]*\\[test-flow\\][ \\t]*(.*)$/m.exec(message);\n if (flowMatch) {\n let summary: string;\n try {\n this.flowScript = parseFlowScript(flowMatch[1] ?? \"\");\n summary = \"echo[test-flow]: scripted-flow mode armed\";\n } catch (err) {\n this.flowScript = null;\n summary = `echo[test-flow]: invalid script — ${err instanceof Error ? err.message : String(err)}`;\n this.emit(\"agent-event\", { type: \"error\", error: summary, fatal: false });\n }\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n // Scripted-flow turn — the runner reassembles the orchestrator prompt on\n // every flow turn; when scripted-flow mode is armed and a flow driver hook\n // is present, drive nodes deterministically instead of echoing text.\n if (this.flowScript && this.config.flowTestDriver && isFlowTurn(message)) {\n await this.runScriptedFlowTurn();\n return;\n }\n\n // Phase 7B test seam — explicit capability invocation keyword. Lets E2E\n // tests drive `dispatchCapability` from a chat prompt without a real LLM.\n // Format: `[test-cap:<name>] {json}`, LINE-anchored like `[test-flow]` above\n // because hosts decorate user messages. Both flags are load-bearing and are\n // pinned by tests: no `s` (dotAll swallows the host's closing tag into the\n // JSON body), and `[ \\t]` not `\\s` (`\\s` un-anchors the token from its line).\n const capMatch = /^[ \\t]*\\[test-cap:([\\w.\\-_]+)\\][ \\t]*(.*)$/m.exec(message);\n if (capMatch) {\n const name = capMatch[1] ?? \"\";\n const rawInput = (capMatch[2] ?? \"\").trim();\n let input: unknown = {};\n if (rawInput.length > 0) {\n try {\n input = JSON.parse(rawInput);\n } catch (err) {\n this.log.warn(\"test-cap input was not valid JSON; defaulting to {}\", {\n error: String(err),\n preview: rawInput.slice(0, 80),\n });\n }\n }\n const events = await this.runCapabilityKeyword(name, input);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const events = buildEchoEvents(content, message);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n // Small gap between events to let the transport process each one\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n // Signal turn completion — the runner waits for this before accepting\n // the next prompt. Without it, the runner stays stuck after the first message.\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n /**\n * Phase 7B helper — drive a single capability through the dispatcher and\n * surface the structured outcome as a result event the LLM-side test code\n * can assert against. Used exclusively by the `[test-cap:<name>]` prompt\n * keyword above; never wired into normal chat flow.\n */\n private async runCapabilityKeyword(name: string, input: unknown): Promise<AgentEvent[]> {\n const events: AgentEvent[] = [];\n if (!this.config.capabilities) {\n return textAndResult(`echo[test-cap]: no capability hooks configured (skipping ${name})`);\n }\n try {\n const out = await this.invokeCapabilityForTest(name, input);\n const summary = `echo[test-cap]: invoked ${name} input=${safeStringify(input)} background=${String(out.background)} result=${safeStringify(out.result)}`;\n events.push(...textAndResult(summary));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n events.push({\n type: \"error\",\n error: `echo[test-cap]: ${name} failed: ${msg}`,\n fatal: false,\n });\n events.push(...textAndResult(`echo[test-cap]: ${name} errored (${msg})`));\n }\n return events;\n }\n\n /**\n * Scripted-flow turn (workspaces#396). Reads the live flow state via the\n * runner-injected `flowTestDriver` hook and executes the scripted next\n * action(s) until the policy yields or emits a turn-ending action. Each\n * mutation fires the adapter's `onChange` (→ host `state_changed`) and, when\n * the runner wires the stimulus bus, queues the follow-up turn — so the\n * driver advances one step at a time exactly like a real LLM orchestrator.\n */\n private async runScriptedFlowTurn(): Promise<void> {\n const hook = this.config.flowTestDriver;\n const script = this.flowScript;\n if (!hook || !script) {\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const executed: string[] = [];\n // Hard cap — the policy is monotonic, but never let a bug spin forever.\n const MAX_STEPS = 200;\n for (let i = 0; i < MAX_STEPS; i++) {\n const state = hook.getState();\n if (!state) break;\n const mandatoryGates = new Set(hook.mandatoryGates?.() ?? []);\n const action = decideFlowAction(state, script, mandatoryGates);\n if (!action) break;\n\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: action.op,\n tool: { name: action.op },\n input: action.nodeId,\n });\n try {\n await hook.execute(action.op, actionArgs(action));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.log.warn(\"scripted flow op failed\", {\n op: action.op,\n nodeId: action.nodeId,\n error: msg,\n });\n this.emit(\"agent-event\", {\n type: \"error\",\n error: `echo[test-flow]: ${action.op}(${action.nodeId}) failed: ${msg}`,\n fatal: false,\n });\n break;\n }\n this.emit(\"agent-event\", { type: \"tool_execution_end\", toolName: action.op });\n executed.push(`${action.op}(${action.nodeId})`);\n if (isTurnEnding(action)) break;\n }\n\n const summary =\n executed.length > 0\n ? `echo[test-flow]: ${executed.join(\" → \")}`\n : \"echo[test-flow]: no action (yielding to host)\";\n for (const event of textAndResult(summary)) this.emit(\"agent-event\", event);\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n async abort(): Promise<void> {\n this.log.info(\"abort requested\");\n }\n\n kill(): void {\n this.running = false;\n this.log.info(\"killed\");\n }\n\n async resetSession(): Promise<void> {\n this.log.info(\"session reset\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Echo response generation — mirrors MockAgentClient.buildMockEvents\n// ---------------------------------------------------------------------------\n\n/**\n * A flow turn is recognised by the orchestrator prompt's stable header\n * (`buildOrchestratorPrompt` in the flow connector). Detection is header-only —\n * the driver reads live state through the injected hook, never by parsing the\n * prompt body.\n */\nfunction isFlowTurn(message: string): boolean {\n return message.startsWith(\"# Flow Execution Context\");\n}\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction textAndResult(summary: string): AgentEvent[] {\n return [\n {\n type: \"message_start\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"message_end\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"result\",\n subtype: \"success\",\n summary,\n costUsd: 0,\n },\n ];\n}\n\n/** What `test question` asks; hosts' e2e specs wait on these strings. */\nexport const ECHO_QUESTION =\n \"The blueprint calls for a relational database. Which engine should I target? \" +\n \"This will affect the Prisma provider, Docker Compose setup, and the connection string.\";\nexport const ECHO_QUESTION_OPTIONS = [\"PostgreSQL\", \"MySQL\", \"SQLite\"] as const;\n\nlet echoQuestionSeq = 0;\n\n/**\n * An `AskUserQuestion` call in the shape claude-sdk, omp and codex publish, which the\n * normalizer turns into a `question` event. No text and no `result` follow: a host\n * reads a text row or a turn summary as the agent moving on, which closes the question.\n * The turn still ends (no parked answer), so the reply arrives as a fresh prompt.\n */\nfunction askUserQuestion(question: string, options: readonly string[]): AgentEvent[] {\n const toolCallId = `echo-question-${++echoQuestionSeq}`;\n const input = { questions: [{ question, options: options.map((label) => ({ label })) }] };\n return [\n {\n type: \"message_start\",\n message: {\n role: \"assistant\",\n content: [{ type: \"tool_use\", name: \"AskUserQuestion\", id: toolCallId, input }],\n },\n },\n {\n type: \"tool_call\",\n name: \"AskUserQuestion\",\n tool: { name: \"AskUserQuestion\" },\n toolCallId,\n input,\n },\n ];\n}\n\nfunction buildEchoEvents(content: string, originalPrompt: string): AgentEvent[] {\n const events: AgentEvent[] = [];\n\n if (content.includes(\"test all\")) {\n events.push(\n { type: \"tool_call\", name: \"Read\", tool: { name: \"Read\" }, input: \"prisma/schema.prisma\" },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n {\n type: \"tool_call\",\n name: \"Write\",\n tool: { name: \"Write\" },\n input: \"src/modules/sprint/sprint.service.ts\",\n },\n { type: \"tool_execution_end\", toolName: \"Write\" },\n );\n events.push(\n ...textAndResult(\n \"All operations completed successfully. Created sprint service, updated schema, started dev server, and ran E2E tests.\",\n ),\n );\n } else if (content.includes(\"test toolcall\")) {\n events.push(\n {\n type: \"tool_call\",\n name: \"Read\",\n tool: { name: \"Read\" },\n input: \"platform/prisma/schema.prisma\",\n },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n );\n events.push(\n ...textAndResult(\n \"I've read the schema and found 42 models. The data model looks well-structured.\",\n ),\n );\n } else if (content.includes(\"test question\")) {\n events.push(...askUserQuestion(ECHO_QUESTION, ECHO_QUESTION_OPTIONS));\n } else if (content.includes(\"test error\")) {\n events.push({\n type: \"error\",\n error:\n \"AI provider returned HTTP 429 — rate limit exceeded. The request will be retried automatically in 35 seconds.\",\n fatal: false,\n });\n } else if (content.includes(\"test fatal\")) {\n events.push({\n type: \"error\",\n error:\n \"Session agent was killed by the container runtime (OOM — memory limit 2 GB exceeded). The session cannot continue.\",\n fatal: true,\n });\n } else {\n // Default echo response\n const summary =\n `I received your message: \"${originalPrompt}\". I'm the Skaile AI assistant running in echo mode. ` +\n `This is a deterministic mock response for E2E testing.`;\n events.push(...textAndResult(summary));\n }\n\n return events;\n}\n\n/**\n * `DriverTarget` wrapper for the echo driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const echoDriverTarget: DriverTarget<AgentConfig> = {\n id: \"echo\",\n displayName: BUILTIN_DRIVER_CATALOG.echo?.name ?? \"Echo (E2E mock)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new EchoDriver(config),\n listModels: async (registry, options) =>\n new EchoDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-IP2IPMEH.js';
|
|
2
|
-
import '../../chunk-W4Q6CKJ5.js';
|
|
3
|
-
import '../../chunk-MKRWN7XP.js';
|
|
4
|
-
import '../../chunk-2GXSSZAM.js';
|
|
5
|
-
import '../../chunk-RPZVHXQ3.js';
|
|
6
|
-
import '../../chunk-YROR332M.js';
|
|
7
|
-
import '../../chunk-XWOPZW26.js';
|
|
8
|
-
import '../../chunk-CQJH4G2K.js';
|
|
9
|
-
import '../../chunk-6E6PKKAD.js';
|
|
10
|
-
import '../../chunk-335ENCCS.js';
|
|
11
|
-
import '../../chunk-ICSCSM5D.js';
|
|
12
|
-
import '../../chunk-DKXNKFKP.js';
|
|
13
|
-
import '../../chunk-MJHSLODD.js';
|
|
14
|
-
import '../../chunk-C3CAXQMA.js';
|
|
15
|
-
import '../../chunk-BOFL7GIF.js';
|
|
16
|
-
import '../../chunk-NSBPE2FW.js';
|
|
17
|
-
//# sourceMappingURL=gemini.js.map
|
|
18
|
-
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/provider-materialize/goose-custom-providers.ts","../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["/**\n * Goose's `custom_providers/*.json` adapter — the file half of the Goose row\n * (§2.3).\n *\n * `GOOSE_PROVIDER` can only name a provider Goose already has: one of its\n * built-in Rust providers, or one of the JSON *declarative* providers it loads\n * from `<config dir>/custom_providers/`. An endpoint of the session's own is\n * therefore a file — one per entry, named after the entry, in Goose's own\n * vocabulary:\n *\n * ```json\n * {\n * \"name\": \"corp-gateway\",\n * \"engine\": \"openai\",\n * \"display_name\": \"Corp Gateway\",\n * \"api_key_env\": \"SKAILE_AIP_CORP_GATEWAY_KEY\",\n * \"base_url\": \"https://llm.corp.example/v1\",\n * \"models\": [{ \"name\": \"corp-fast-1\" }],\n * \"requires_auth\": true\n * }\n * ```\n *\n * `name` is {@link harnessProviderName}, so the id in the file is the one the\n * env half already puts in `GOOSE_PROVIDER`. `api_key_env` is a variable\n * *name*: Goose resolves it from the child environment (its config layer reads\n * the process environment first), so no secret is ever written.\n *\n * **Engines.** A declarative provider is one of three engines — `openai`,\n * `anthropic`, `ollama` — each a request shape, not a vendor. Only the two\n * surfaces that map onto one are rendered; `google-generative-ai` and\n * `bedrock-converse-stream` are built-in Goose providers with no declarative\n * spelling, so an entry on those surfaces is reported instead of guessed at.\n *\n * **Config home.** Goose resolves its config, data and state directories from\n * one variable, `GOOSE_PATH_ROOT`, so a session that renders anything moves\n * the whole tree and never touches the developer's own — neither reading it\n * nor writing to it.\n *\n * @see https://block.github.io/goose/docs/guides/custom-providers\n * @docLink packages/bridge/drivers#one-shot-cli-drivers-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvDriverSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n} from \"./env-drivers.js\";\nimport {\n driverSessionConfigHome,\n pruneSessionConfigDir,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → Goose declarative `engine`. `openai-completions` is the only\n * OpenAI-flavoured surface here on purpose: the `openai` engine posts to\n * `<base>/v1/chat/completions`, which is not the Responses API.\n */\nconst GOOSE_ENGINE: Partial<Record<AIProviderSurface, string>> = {\n \"openai-completions\": \"openai\",\n \"anthropic-messages\": \"anthropic\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Directory, relative to `GOOSE_PATH_ROOT`, Goose reads its config from. */\nexport const GOOSE_CONFIG_DIRNAME = \"config\";\n\n/** Directory, relative to the config dir, declarative providers are loaded from. */\nexport const GOOSE_CUSTOM_PROVIDERS_DIRNAME = \"custom_providers\";\n\n/** One entry of a declarative provider's `models[]`. */\nexport interface GooseModelEntry {\n name: string;\n context_limit?: number;\n}\n\n/** One `custom_providers/<id>.json` document. */\nexport interface GooseCustomProvider {\n /** Provider id — what `GOOSE_PROVIDER` names. Must equal the file stem. */\n name: string;\n engine: string;\n display_name: string;\n /** Name of the variable carrying the credential — never the credential. */\n api_key_env?: string;\n base_url: string;\n models: GooseModelEntry[];\n headers?: Record<string, string>;\n supports_streaming?: boolean;\n requires_auth: boolean;\n /**\n * `false` keeps Goose on the static `models[]` instead of probing\n * `<base>/v1/models`; only meaningful with a non-empty list.\n */\n dynamic_models?: boolean;\n}\n\n/** An entry Goose cannot be taught, and why. */\nexport interface GooseSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildGooseCustomProviders}. */\nexport interface GooseCustomProvidersBuild {\n /** Provider id → its document, in registry order. */\n providers: Record<string, GooseCustomProvider>;\n skipped: GooseSkippedEntry[];\n}\n\n/**\n * Render one entry as a declarative provider, or explain why Goose cannot load\n * it.\n */\nexport function renderGooseCustomProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { provider: GooseCustomProvider } | { skipped: string } {\n const surface = entrySurface(entry);\n const engine = surface ? GOOSE_ENGINE[surface] : undefined;\n if (!engine)\n return {\n skipped: surface\n ? `Goose has no declarative engine for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and Goose does not know this provider\" };\n\n const credentialKind = entry.credential?.kind;\n const envDelivered = Boolean(credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind]);\n if (credentialKind && credentialKind !== \"none\" && !envDelivered)\n return {\n skipped: `Goose cannot present a '${credentialKind}' credential for a declarative provider`,\n };\n\n const models: GooseModelEntry[] = [];\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n const contextWindow = entry.capabilities?.[logicalId]?.context_window;\n models.push({\n name: providerModelId,\n ...(contextWindow ? { context_limit: contextWindow } : {}),\n });\n }\n\n const provider: GooseCustomProvider = {\n name: providerId,\n engine,\n display_name: entry.label ?? providerId,\n ...(envDelivered ? { api_key_env: providerCredentialEnvName(providerId) } : {}),\n base_url: baseUrl,\n models,\n ...(entry.headers && Object.keys(entry.headers).length > 0\n ? { headers: { ...entry.headers } }\n : {}),\n supports_streaming: true,\n requires_auth: envDelivered,\n };\n return { provider };\n}\n\n/**\n * Build one declarative provider per entry Goose cannot name on its own.\n *\n * The selected model is appended to its provider's `models[]` when the\n * registry did not enumerate it, so `GOOSE_MODEL` always names something the\n * file declares. A provider with a static list gets `dynamic_models: false` —\n * without it Goose probes `<base>/v1/models` on every run, which a gateway\n * that serves only completions answers with an error.\n *\n * An empty registry renders nothing — Goose's built-in provider table\n * already covers every stock catalog endpoint.\n */\nexport function buildGooseCustomProviders(session: EnvDriverSession): GooseCustomProvidersBuild {\n const providers: Record<string, GooseCustomProvider> = {};\n const skipped: GooseSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // Goose's built-in provider table already knows every catalog endpoint,\n // under the same name `harnessProviderName` puts in `GOOSE_PROVIDER`.\n // What it cannot know is an endpoint of the session's own — one rule,\n // read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderGooseCustomProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else providers[providerId] = rendered.provider;\n }\n\n const binding = resolveRegistryBinding(session);\n const selected = binding ? providers[binding.providerId] : undefined;\n if (\n selected &&\n binding?.providerModelId &&\n !selected.models.some((m) => m.name === binding.providerModelId)\n )\n selected.models.push({ name: binding.providerModelId });\n\n for (const provider of Object.values(providers)) {\n if (provider.models.length > 0) provider.dynamic_models = false;\n }\n\n return { providers, skipped };\n}\n\n/** What {@link materializeGooseCustomProviders} handed the driver. */\nexport interface GooseMaterialization extends GooseCustomProvidersBuild {\n /** Child env fragment: `GOOSE_PATH_ROOT`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute paths of the rendered provider files. */\n paths: string[];\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is a Goose built-in writes nothing and\n * leaves `GOOSE_PATH_ROOT` unset, so the developer's own Goose tree keeps\n * working exactly as before. Once anything *is* rendered the whole tree moves\n * — config, data and state together, because Goose derives all three from\n * that one variable — and the session stops inheriting the developer's Goose\n * settings along with their config directory. That is the price of never\n * reading or writing it.\n */\nexport function materializeGooseCustomProviders(\n session: EnvDriverSession,\n config: { cwd: string; sessionId?: string },\n): GooseMaterialization {\n const build = buildGooseCustomProviders(session);\n const root = driverSessionConfigHome(\"goose\", config);\n const providersDir = join(root, GOOSE_CONFIG_DIRNAME, GOOSE_CUSTOM_PROVIDERS_DIRNAME);\n const ids = Object.keys(build.providers);\n if (ids.length === 0) {\n pruneSessionConfigDir(providersDir, new Set());\n return { ...build, env: {}, paths: [] };\n }\n\n const paths = ids.map((id) =>\n writeSessionConfigFile(\n providersDir,\n `${id}.json`,\n `${JSON.stringify(build.providers[id], null, 2)}\\n`,\n ),\n );\n pruneSessionConfigDir(providersDir, new Set(ids.map((id) => `${id}.json`)));\n return { ...build, env: { GOOSE_PATH_ROOT: root }, paths };\n}\n","import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n credentialsForEveryProvider,\n type EnvDriverSession,\n registryModelEntries,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { materializeGooseCustomProviders } from \"../provider-materialize/goose-custom-providers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo, ReconfigureApplied } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * A `credentials-n` harness (§2.3): every enabled AI provider entry's\n * credential reaches the child environment, and the active endpoint + model\n * are named by `GOOSE_PROVIDER` / `GOOSE_MODEL`. An endpoint Goose has no\n * built-in provider for is additionally rendered as a declarative\n * `custom_providers/<id>.json`\n * (`provider-materialize/goose-custom-providers.ts`) under the session's own\n * `GOOSE_PATH_ROOT`.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n private providers?: EnvDriverSession;\n\n /** This session's AI providers, resolved once from the config. */\n private providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n protected override onReconfigured(applied: ReconfigureApplied): void {\n if (applied.model !== undefined) this.providers = undefined;\n }\n\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n /**\n * Base env plus the active endpoint (`GOOSE_PROVIDER`/`GOOSE_MODEL`) and one\n * credential variable per enabled registry entry — the canonical\n * `SKAILE_AIP_<ID>_KEY` and, for a stock catalog endpoint, the vendor\n * carrier Goose's built-in provider table reads.\n *\n * This is also where the session's custom endpoints are rendered. It runs\n * once per spawn, so a `reconfigure()` between turns re-renders rather than\n * leaving the child pointed at the previous selection.\n */\n protected buildEnv(): Record<string, string> {\n const session = this.providerSession();\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n const binding = resolveRegistryBinding(session);\n if (binding) {\n env.GOOSE_PROVIDER = binding.harnessProviderId;\n if (binding.providerModelId) env.GOOSE_MODEL = binding.providerModelId;\n else delete env.GOOSE_MODEL;\n } else if (this.config.model) {\n env.GOOSE_MODEL = this.config.model;\n }\n const materialized = materializeGooseCustomProviders(session, this.config);\n for (const entry of materialized.skipped)\n this.log.warn(\"Goose cannot address an AI provider entry\", {\n providerId: entry.id,\n reason: entry.reason,\n });\n if (materialized.paths.length > 0)\n this.log.debug(\"rendered Goose custom providers\", { paths: materialized.paths });\n return {\n ...env,\n ...credentialsForEveryProvider(session),\n ...materialized.env,\n };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n /**\n * Goose enumerates models from its own provider table and config, not from\n * an endpoint, so the session's registry is the list.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.providerSession());\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n listModels: async (registry, options) =>\n new GooseDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../bridge/src/drivers/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { EventEmitter } from \"node:events\";\nimport { rmSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport {\n type DriverContextReport,\n type Logger,\n type TokenUsage,\n withActivityLabelJsonSchema,\n} from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { checkToolInputSchema } from \"../mcp-tool-schema-filter.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport {\n type ReconfigureApplyResult,\n ReconfigureLedger,\n type ReconfigurePushContext,\n type ReconfigureSnapshot,\n} from \"../reconfigure-ledger.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport { resolveAgentExec, wrapAgentCommand } from \"../agent-exec.js\";\nimport { stripRunnerPrivateEnv } from \"../runner-private-env.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentPromptInput,\n type BridgeCapabilityTool,\n type DriverInfo,\n type ReconfigureApplied,\n type ReconfigureOutcome,\n type ReconfigurePatch,\n type SlashCommandInfo,\n TOOL_ALLOWLIST_UNSUPPORTED,\n} from \"../types.js\";\nimport {\n isCredentialOmissionWarning,\n materializeOmpIdentityDir,\n materializeOmpProviders,\n registryModelEntries,\n} from \"./omp-models-yml.js\";\n\n/**\n * omp's own `No API key found for <provider>` text ends with `or create <home>/agent.db`:\n * the home is the session's private directory, a path nobody logs in at. Say what a user\n * can do instead: add the provider to the registry, or log in once with `omp`.\n * Any other message is returned as it came.\n */\nexport function ompCredentialMessage(msg: string): string {\n const match = /^(?:Error:\\s*)?No API key found for ([A-Za-z0-9._-]+?)\\.?(?:\\s|$)/.exec(msg);\n if (!match) return msg;\n const provider = match[1];\n const envName = `${provider.toUpperCase().replace(/[^A-Z0-9]/g, \"_\")}_API_KEY`;\n return (\n `No API key found for ${provider}. Add the provider with ` +\n `\\`skaile providers add ${provider} --credential env:${envName}\\`, ` +\n \"or log in once with `omp` (type /login).\"\n );\n}\n\n/**\n * Process-level vars omp needs to run at all, independent of any provider.\n */\nconst OMP_BASE_ENV_KEYS = [\"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"] as const;\n\n/**\n * Build the explicit env allowlist forwarded to the omp child process.\n *\n * The runner's full environment is never inherited — only\n * {@link OMP_BASE_ENV_KEYS} (process essentials) and the `PI_*` prefix (omp's\n * own app config the host operator may have set).\n *\n * **Credentials are not on this list.** Every endpoint omp may address is a\n * registry entry, serialized into the session's own `models.yml` with its\n * credential named as `SKAILE_AIP_<ID>_KEY` and the value assigned after this\n * allowlist is built (`./omp-models-yml.ts`). An ambient `ANTHROPIC_API_KEY`\n * in the runner's shell is not a session's statement of intent and does not\n * reach the child; `skaile providers add anthropic --preset anthropic\n * --credential env:ANTHROPIC_API_KEY` is.\n *\n * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the\n * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp\n * script via env-driven mode flags.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nexport function buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n for (const key of OMP_BASE_ENV_KEYS) {\n const v = parent[key];\n if (typeof v === \"string\") out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"PI_\") || key.startsWith(\"OMP_BRIDGE_\") || key.startsWith(\"FAKE_OMP_\")) {\n out[key] = value;\n }\n }\n return out;\n}\n\n/**\n * omp's built-in tools, as reported by `omp --help` (\"Available Tools\").\n *\n * `computer` is the one entry omp does not enable by default; everything else\n * is on unless `--tools` narrows the set. Used to turn a manifest *deny* list\n * into the *allow* list omp's CLI actually accepts.\n */\nexport const OMP_BUILTIN_TOOLS = [\n \"read\",\n \"bash\",\n \"edit\",\n \"write\",\n \"grep\",\n \"glob\",\n \"lsp\",\n \"python\",\n \"notebook\",\n \"browser\",\n \"computer\",\n \"task\",\n \"todo\",\n \"web_search\",\n \"ask\",\n] as const;\n\n/** omp's default-enabled toolset — every built-in except `computer`. */\nexport const OMP_DEFAULT_TOOLS: readonly string[] = OMP_BUILTIN_TOOLS.filter(\n (t) => t !== \"computer\",\n);\n\n/**\n * Canonical (Claude Code) tool name → omp built-in tool name.\n *\n * Agent manifests are authored once in the canonical vocabulary and run on\n * whichever harness the workspace is configured for, so the driver owns the\n * translation. Names already in omp's own spelling pass through unchanged.\n *\n * Deliberately partial: Claude tools with no omp counterpart (`WebFetch`,\n * `BashOutput`, `KillShell`, `mcp__*` server tools) are absent and get dropped\n * from the omp `--tools` value — omp's `--tools` governs built-ins only, so\n * naming a non-built-in there would be rejected, and silently keeping it would\n * not restrict anything.\n */\nconst CANONICAL_TO_OMP_TOOL: Record<string, string> = {\n read: \"read\",\n write: \"write\",\n edit: \"edit\",\n multiedit: \"edit\",\n notebookedit: \"notebook\",\n bash: \"bash\",\n grep: \"grep\",\n glob: \"glob\",\n ls: \"glob\",\n task: \"task\",\n agent: \"task\",\n todowrite: \"todo\",\n todoread: \"todo\",\n websearch: \"web_search\",\n web_search: \"web_search\",\n notebook: \"notebook\",\n lsp: \"lsp\",\n python: \"python\",\n browser: \"browser\",\n computer: \"computer\",\n todo: \"todo\",\n ask: \"ask\",\n askuserquestion: \"ask\",\n};\n\n/**\n * Translate a manifest tool list into omp built-in tool names.\n *\n * Unknown names are dropped rather than passed through: a manifest is expected\n * to run on more than one harness, so it legitimately names tools this one has\n * never heard of.\n */\nfunction toOmpToolNames(names: readonly string[] | undefined): string[] {\n const out: string[] = [];\n for (const raw of names ?? []) {\n const mapped = CANONICAL_TO_OMP_TOOL[raw.trim().toLowerCase().replace(/[\\s-]/g, \"\")];\n if (mapped && !out.includes(mapped)) out.push(mapped);\n }\n return out;\n}\n\n/**\n * Resolve `AgentConfig.tools` into the omp CLI flags that enforce it.\n *\n * omp expresses tool restriction as a positive `--tools a,b,c` list (or\n * `--no-tools`) — there is no deny flag — so a manifest deny list is applied by\n * subtracting from {@link OMP_DEFAULT_TOOLS}.\n *\n * Returns `[]` when the manifest declares no restriction, which leaves omp on\n * its full default toolset exactly as before. That default toolset is the bulk\n * of every request's fixed token prefix, so this is the lever an agent\n * definition needs in order to shrink it.\n *\n * Pure — exported for direct testing.\n *\n * @since 1.5.0\n */\nexport function buildOmpToolArgs(tools: AgentConfig[\"tools\"]): string[] {\n const allowed = toOmpToolNames(tools?.allowed);\n const denied = new Set(toOmpToolNames(tools?.denied));\n\n const declaredAllow = (tools?.allowed?.length ?? 0) > 0;\n const declaredDeny = (tools?.denied?.length ?? 0) > 0;\n if (!declaredAllow && !declaredDeny) return [];\n\n const base = declaredAllow ? allowed : [...OMP_DEFAULT_TOOLS];\n const effective = base.filter((t) => !denied.has(t));\n\n // An allow list that named only tools omp does not have, or a deny list that\n // removed everything, both mean \"no tools\" — say so explicitly rather than\n // emitting `--tools ` and letting omp fall back to the full default set.\n if (effective.length === 0) return [\"--no-tools\"];\n return [\"--tools\", effective.join(\",\")];\n}\n\n/**\n * Longest host tool name handed to omp. omp forwards host tool names to the\n * provider verbatim; Anthropic allows 128 characters, OpenAI-compatible\n * endpoints 64, so the stricter bound keeps every provider working.\n */\nconst OMP_HOST_TOOL_NAME_MAX = 64;\n\n/** One `set_host_tools` entry (`omp://rpc.md`, \"set_host_tools payload\"). */\nexport interface OmpHostToolDefinition {\n name: string;\n label: string;\n description: string;\n parameters: Record<string, unknown>;\n loadMode: \"essential\";\n}\n\n/** Result of {@link buildOmpHostTools}. */\nexport interface OmpHostToolSet {\n /** Definitions to send in `set_host_tools`. */\n definitions: OmpHostToolDefinition[];\n /** omp host tool name → capability name, for routing `host_tool_call`. */\n capabilityNames: Map<string, string>;\n /** Capabilities left out because the provider would reject their schema. */\n dropped: Array<{ tool: string; reason: string }>;\n}\n\n/**\n * Turn the runner's capability tool list into omp host tool definitions.\n *\n * omp accepts any name in `set_host_tools` but forwards it to the provider\n * as-is, and providers reject anything outside `^[a-zA-Z0-9_-]{1,64}$` with a\n * 400 that fails the whole turn (verified against omp 18.6.0 + Anthropic:\n * `app.editor.open` → `tools.3.custom.name: String should match pattern`).\n * Names are therefore sanitised (`app.editor.open` → `app_editor_open`) and\n * the original kept in `capabilityNames`. Collisions — with another\n * capability or with an omp built-in, which omp refuses — get a numeric\n * suffix.\n *\n * omp also forwards the JSON Schema untouched, so each advertised schema is\n * checked with the same rules the claude-sdk driver applies to raw MCP\n * schemas ({@link checkToolInputSchema}); a failing tool is dropped rather\n * than turning every request into a 400. `loadMode: \"essential\"` keeps every\n * capability in the prompt instead of behind omp's tool discovery, matching\n * claude-sdk where every capability is in the tool list.\n *\n * Pure — exported for direct testing.\n */\nexport function buildOmpHostTools(tools: readonly BridgeCapabilityTool[]): OmpHostToolSet {\n const taken = new Set<string>(OMP_BUILTIN_TOOLS);\n const out: OmpHostToolSet = { definitions: [], capabilityNames: new Map(), dropped: [] };\n for (const tool of tools) {\n // Advertise-only label, as in claude-sdk and codex; `dispatchCapability`\n // strips it before the registry sees the input.\n const parameters = { ...withActivityLabelJsonSchema(tool.parameters), type: \"object\" };\n const reason = checkToolInputSchema(parameters);\n if (reason) {\n out.dropped.push({ tool: tool.name, reason });\n continue;\n }\n const base =\n tool.name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, OMP_HOST_TOOL_NAME_MAX) || \"capability\";\n let name = base;\n for (let n = 2; taken.has(name); n++) {\n const suffix = `_${n}`;\n name = `${base.slice(0, OMP_HOST_TOOL_NAME_MAX - suffix.length)}${suffix}`;\n }\n taken.add(name);\n out.capabilityNames.set(name, tool.name);\n out.definitions.push({\n name,\n label: tool.name,\n description: tool.description,\n parameters,\n loadMode: \"essential\",\n });\n }\n return out;\n}\n\n/** Thinking levels omp accepts for `--thinking` / `set_thinking_level`. omp drops anything else silently. */\nexport const OMP_THINKING_LEVELS = [\n \"off\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n \"auto\",\n] as const;\nexport type OmpThinkingLevel = (typeof OMP_THINKING_LEVELS)[number];\n\n/** Largest image attachment omp will be sent (Anthropic's 5 MB per-image limit). */\nconst OMP_MAX_IMAGE_BYTES = 5 * 1024 * 1024;\n\n/**\n * Map `AgentConfig.thinking` / `effort` to an omp thinking level.\n *\n * `disabled` wins over `effort` → `off`. Otherwise an explicit `effort`\n * (low/medium/high/xhigh/max) maps to the same-named level (omp clamps `max` to\n * `xhigh` on models without it). Without effort, `enabled` → `medium` and\n * `adaptive` → `auto`. Returns `undefined` when neither is set (omp keeps its\n * own default) or when the value is outside omp's set — `set_thinking_level`\n * accepts garbage without an error, so validation has to happen here.\n */\nexport function ompThinkingLevel(\n cfg: Pick<AgentConfig, \"thinking\" | \"effort\">,\n): OmpThinkingLevel | undefined {\n const level = (() => {\n if (cfg.thinking === \"disabled\") return \"off\";\n if (cfg.effort) return cfg.effort;\n if (cfg.thinking === \"enabled\") return \"medium\";\n if (cfg.thinking === \"adaptive\") return \"auto\";\n return undefined;\n })();\n return level !== undefined && (OMP_THINKING_LEVELS as readonly string[]).includes(level)\n ? (level as OmpThinkingLevel)\n : undefined;\n}\n\n/**\n * Split a model selector into the `provider` / `modelId` pair `set_model`\n * takes. The registry renders selectors as `<providerId>/<providerModelId>`\n * (the spawn-time `--model` value); provider ids never contain `/` but model\n * ids can, so the split is on the FIRST `/`:\n * `openrouter/anthropic/claude-sonnet-4` → `{ provider: \"openrouter\", modelId: \"anthropic/claude-sonnet-4\" }`.\n * A bare name (no `provider/` prefix) cannot be expressed: omp's `--model`\n * fuzzy matching has no RPC equivalent, so the result is `undefined`.\n */\nexport function splitOmpModel(model: string): { provider: string; modelId: string } | undefined {\n const slash = model.indexOf(\"/\");\n if (slash > 0 && slash < model.length - 1) {\n return { provider: model.slice(0, slash), modelId: model.slice(slash + 1) };\n }\n return undefined;\n}\n\ninterface OmpEvent {\n type: string;\n data?: unknown;\n id?: string;\n success?: boolean;\n error?: string;\n message?: OmpMessage;\n [key: string]: unknown;\n}\n\ninterface OmpMessage {\n role?: string;\n content?: string | OmpContentBlock[];\n /**\n * Why the turn stopped. omp reports a failed request as a normal\n * `message_end` carrying `stopReason: \"error\"` rather than as an `error`\n * event, so this is the only signal that the turn failed.\n */\n stopReason?: string;\n /** Provider/transport error text accompanying `stopReason: \"error\"`. */\n errorMessage?: string;\n /** Final usage of this model call; running partials on `message_start`/updates are ignored. */\n usage?: OmpUsage;\n}\n\n/** Token counters on an assistant `message_end`; every field is optional and unvalidated. */\ninterface OmpUsage {\n input?: unknown;\n output?: unknown;\n cacheRead?: unknown;\n cacheWrite?: unknown;\n reasoningTokens?: unknown;\n totalTokens?: unknown;\n}\n\n/** omp RPC `ImageContent`: raw base64 (no `data:` prefix) plus its MIME type. */\ninterface OmpImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\ninterface OmpContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\n/**\n * A question omp is parked on: the `extension_ui_request` the host still owes\n * an `extension_ui_response` for. One request can carry several questions;\n * the response goes out once every one has an answer.\n */\ninterface OmpPendingQuestion {\n /** Id of the `extension_ui_request`; the response must echo it. */\n id: string;\n /** `ask` answers with `answers[]`; the `select` fallback answers with `value`. */\n method: \"ask\" | \"select\";\n questions: Array<{ id: string; question: string; options: string[]; multi: boolean }>;\n /** The user's answer per question, by position; `undefined` while unanswered. */\n answers: Array<string | undefined>;\n}\n\n/** What the running omp process holds, for the reconfigure ledger. */\ninterface OmpApplied extends ReconfigureSnapshot {\n /** The omp thinking level last sent (or spawned with). */\n level?: OmpThinkingLevel;\n}\n\n/**\n * The line of omp's stderr that says why it gave up. omp prints an unrelated\n * warning first (a failed extension load) and the real cause last (`No default\n * model selected. Use /login ...`), so the cause is the last line that reads as\n * an error, else the last line. Escape sequences are stripped.\n */\nexport function ompStartFailureCause(lines: readonly string[]): string {\n const clean = lines\n // biome-ignore lint/suspicious/noControlCharactersInRegex: strips ANSI escapes\n .map((l) => l.replace(/\\u001b\\[[0-9;]*m/g, \"\").trim())\n .filter(Boolean);\n const isCause = (l: string) =>\n /\\b(error|no default model|not (?:found|installed|logged)|invalid|unauthori[sz]ed|cannot|can't|failed)\\b/i.test(\n l,\n ) && !/failed to load extension/i.test(l);\n for (let i = clean.length - 1; i >= 0; i--) {\n if (isCause(clean[i] as string)) return clean[i] as string;\n }\n return clean.at(-1) ?? \"\";\n}\n\n/**\n * Agent driver for the oh-my-pi (omp) coding agent.\n *\n * Spawns `omp --mode rpc-ui --no-ui` as a child process and communicates via newline-delimited\n * JSON-RPC over stdin/stdout. Model-agnostic: supports any LLM provider.\n *\n * @see https://github.com/can1357/oh-my-pi\n *\n * @remarks\n * **Session persistence** — omp writes JSONL session files to `<cwd>/.omp/sessions/`\n * (via `--session-dir`). After each turn (`agent_end`), sends a `get_state` RPC to\n * capture the native session ID and emits a `session_info` event so the forge layer\n * can persist it. On the next spawn, callers pass `resumeSessionId` to restore omp's\n * native context.\n *\n * **stderrBuffer** — collects the last 20 lines of stderr so they can be appended to\n * crash error messages for diagnostics without blocking the stdout readline loop.\n *\n * **systemPrompt injection** — omp does not accept a system prompt string directly.\n * The driver writes `AgentConfig.systemPrompt` to a file of its own under\n * `<cwd>/.skaile/cache/omp-system/`, passes the path via `--append-system-prompt` and deletes\n * the file when the process ends.\n *\n * **agentDir** — omp's home (`PI_CODING_AGENT_DIR`) is a private directory outside `cwd`\n * that links in the entries of the GitAgent directory (agent.yaml, RULES.md, knowledge/), so\n * omp's runtime databases never land beside the pinned agent files. omp reads no SOUL.md:\n * the runner puts the soul into `systemPrompt`.\n *\n * **Capabilities** — `AgentConfig.capabilities` (Protocol v2) is registered with omp\n * as host tools (`set_host_tools`) once the process is ready, and again whenever the\n * registry reports a change. omp calls them back with `host_tool_call`, answered via\n * `dispatchCapability` exactly as claude-sdk's `skaile-capabilities` MCP server does.\n * Names are sanitised for the provider; see {@link buildOmpHostTools}.\n *\n * **Questions** — omp's `ask` tool is enabled as one `extension_ui_request` dialog\n * (`set_ask_dialog`), published as the same `question` events as claude-sdk's\n * `AskUserQuestion` and answered through {@link OmpDriver.answerQuestion}. The turn stays\n * parked in omp until then; abort, kill and process exit release it. Dialogs the host\n * cannot answer (`confirm`, `input`, `editor`) are cancelled immediately.\n *\n * @docLink packages/bridge/drivers#omp-driver\n */\nexport class OmpDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n capabilities: BUILTIN_DRIVER_CATALOG.omp?.capabilities,\n };\n\n private readonly log: Logger = getBridgeLogger(\"omp\");\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private reqId = 0;\n private config: AgentConfig;\n private ready = false;\n private startPromise: Promise<void> | null = null;\n private stderrBuffer: string[] = [];\n private prevText = \"\";\n /** OMP session ID captured via `get_state` after each turn. */\n private _ompSessionId?: string;\n /**\n * Usage of the most recent turn, summed over every model call in it (a tool\n * loop is one prompt but many assistant messages). Cleared when a turn\n * starts, like claude-sdk, so it never mixes two turns.\n */\n private _lastTokens: TokenUsage | null = null;\n /**\n * Prompt size of the most recent model call: the real context fill, which\n * `_lastTokens` (turn-cumulative) overstates on a tool loop. omp's own\n * `get_state.contextUsage.tokens` replaces it once that reply lands.\n */\n private _lastContextTokens: number | null = null;\n /** Context window of the active model, from `get_state.contextUsage`. */\n private _contextWindow: number | null = null;\n /** Per-spawn file holding the system prompt omp was started with; removed with the process. */\n private systemPromptFile: string | null = null;\n /** The private omp home of the running process, when it is the driver's own temporary one. */\n private privateHome: string | null = null;\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n override getContextTokens(): number | null {\n return this._lastContextTokens;\n }\n\n override getContextWindow(): number | null {\n return this._contextWindow;\n }\n\n /**\n * omp reports only its fill and window (`get_state.contextUsage`), refreshed\n * here so a request between turns is current. A local RPC, so cheap. Unlike\n * `captureState` it throws on a failed reply: a stale fill must never be\n * reported as a fresh measurement.\n */\n override async getContextUsageReport(): Promise<DriverContextReport | null> {\n if (!this.proc) return null;\n const response = await this.request({ type: \"get_state\" }, { quiet: true });\n if (!response.success) {\n throw new Error(`omp get_state failed: ${response.error ?? \"no error given\"}`);\n }\n this.captureContextUsage((response.data as Record<string, unknown> | undefined)?.contextUsage);\n if (this._lastContextTokens === null && this._contextWindow === null) return null;\n return { usedTokens: this._lastContextTokens, contextWindow: this._contextWindow };\n }\n\n /** Per-turn settlement handlers; non-null only while a prompt is in flight. */\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n /** omp host tool name → capability name for the last `set_host_tools` sent. */\n private hostToolCapabilities = new Map<string, string>();\n /** In-flight `host_tool_call`s by omp request id; aborted by `host_tool_cancel`. */\n private readonly hostToolCalls = new Map<string, { controller: AbortController; name: string }>();\n /** Requests awaiting a `response`, by request id; failed when the process goes away. */\n private readonly pendingRequests = new Map<string, (err: Error) => void>();\n /** Unsubscribes the capability registry listener; set while a process runs. */\n private unsubscribeToolsChanged: (() => void) | null = null;\n /** Request ids whose failed `response` is logged by the caller, not surfaced as an error event. */\n private readonly quietRequestIds = new Set<string>();\n /** Capability tools already warned about, so a re-send logs each once. */\n private readonly warnedDroppedHostTools = new Set<string>();\n /** The `ask` (or `select` fallback) omp is parked on, until answered, cancelled or the process ends. */\n private pendingQuestion: OmpPendingQuestion | null = null;\n /**\n * Tail of the FIFO of prompts: each `prompt()`/`promptInput()` runs only after\n * the previous one settled, so one turn at a time is ever in flight (omp runs\n * a single agent loop). Never rejects.\n */\n private promptTail: Promise<void> = Promise.resolve();\n /** `true` while `agent_end` is being delivered to listeners. */\n private turnEnded = false;\n\n override get runtimeSessionId(): string | undefined {\n return this._ompSessionId;\n }\n\n /** Slash commands from omp's last `available_commands_update`. */\n private cachedCommands: SlashCommandInfo[] = [];\n\n override getSlashCommands(): SlashCommandInfo[] {\n return this.cachedCommands;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n /**\n * Owns the desired config, drift and ordering of live reconfigures. Its\n * snapshot is what the running omp process was last told: the config values\n * `model`, `modelRef`, `thinking` and `effort` came from (the rollback targets\n * when omp refuses a change) and the omp thinking `level` sent. Set at spawn,\n * updated on each successful `set_*`.\n */\n private readonly reconfig: ReconfigureLedger<OmpApplied>;\n\n /**\n * Apply `model` / `thinking` / `effort`: the {@link ReconfigureLedger} writes\n * the desired config and, when the process is up and idle, pushes it through\n * {@link applyLive} (`set_model` / `set_thinking_level`), answering from omp's\n * reply. A patch that arrives mid-turn or before `ready` is not lost: config is\n * the source of truth, flushed before the next `prompt()` and read by the next\n * spawn. A refusal (omp's, or a model `set_model` cannot express live: no\n * `provider/` prefix) rolls the config back and answers `rejected`. In registry\n * mode the patch also replaces `modelRef`, so a respawn (crash, `resetSession()`)\n * starts the reconfigured model; models.yml already lists every enabled provider.\n */\n override reconfigure(patch: ReconfigurePatch): Promise<ReconfigureOutcome> {\n return this.reconfig.reconfigure(patch);\n }\n\n /** Push drifted model / thinking settings to the running process. Never rejects. */\n private async applyLive(\n delta: ReconfigureApplied,\n applied: OmpApplied,\n { late }: ReconfigurePushContext,\n ): Promise<ReconfigureApplyResult> {\n if (delta.model !== undefined) {\n const target = splitOmpModel(delta.model);\n if (!target) {\n // `set_model` cannot express a bare name, so the running process keeps\n // its model: refuse rather than report one omp is not running.\n const message = `set_model cannot apply \"${delta.model}\" live (no provider/ prefix); model unchanged`;\n this.log.warn(\"model has no provider prefix; set_model cannot apply it live\", {\n model: delta.model,\n });\n if (!late) this.emit(\"agent-event\", { type: \"error\", error: message });\n return { rejected: message };\n }\n const refusal = await this.sendReconfigure({ type: \"set_model\", ...target }, late);\n if (refusal !== null) return { rejected: refusal };\n applied.model = delta.model;\n applied.modelRef = delta.modelRef ?? applied.modelRef;\n }\n\n if (delta.thinking !== undefined || delta.effort !== undefined) {\n const level = ompThinkingLevel(this.config);\n if (level !== undefined && level !== applied.level) {\n const refusal = await this.sendReconfigure({ type: \"set_thinking_level\", level }, late);\n if (refusal !== null) return { rejected: refusal };\n applied.level = level;\n }\n }\n return \"applied\";\n }\n\n /**\n * Send one live-reconfigure request. A failed `response` is emitted as an\n * `error` event by {@link handleEvent}, and a transport failure (timeout,\n * process gone) here, unless `late`: a refusal of a patch already answered\n * `ok` reaches the host as `reconfigure_rejected`, so it gets no `error`\n * event as well. Returns `null` when omp accepted it, else why not.\n */\n private async sendReconfigure(\n msg: { type: string; [key: string]: unknown },\n late: boolean,\n ): Promise<string | null> {\n try {\n const resp = await this.request(msg, { quiet: late });\n if (resp.success) return null;\n this.log.warn(\"omp rejected reconfigure\", { type: msg.type, error: resp.error });\n return typeof resp.error === \"string\" ? resp.error : `omp refused ${msg.type}`;\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n this.log.warn(\"reconfigure request failed\", { type: msg.type, error });\n if (!late) {\n this.emit(\"agent-event\", { type: \"error\", error: `${msg.type} failed: ${error}` });\n }\n return `${msg.type} failed: ${error}`;\n }\n }\n\n /**\n * @param config - Driver configuration. omp-relevant fields:\n * - `cwd` — working directory; omp session files are stored under `<cwd>/.omp/sessions/`.\n * - `model` — forwarded as `--model <selector>`. In registry mode `modelRef` takes precedence at spawn; `reconfigure({ model })` keeps both in step.\n * - `systemPrompt` — written to a per-spawn file under `<cwd>/.skaile/cache/omp-system/` and appended via `--append-system-prompt`.\n * - `agentDir` — its entries are linked into omp's private home (`PI_CODING_AGENT_DIR`); the directory itself is never omp's home.\n * - `sshKeyPath` — injected as `GIT_SSH_COMMAND` for authenticated git operations.\n * - `resumeSessionId` — omp session UUID to restore via `--session <id>`.\n */\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n this.reconfig = new ReconfigureLedger<OmpApplied>({\n config: () => this.config,\n isLive: () => this.proc !== null && this.ready,\n isIdle: () => !this.turnResolve,\n applyLive: (delta, applied, context) => this.applyLive(delta, applied, context),\n onLateRejection: (rollback) => this.emit(\"reconfigure-rollback\", rollback),\n log: this.log,\n });\n }\n\n public async start(): Promise<void> {\n // In-flight start first: `proc` is set before `ready` and before the host\n // tools are registered, and callers must not prompt ahead of either.\n if (this.startPromise) return this.startPromise;\n if (this.proc) return;\n // A start that fails before omp is running (home or env setup, a spawn error) must not\n // leave the per-spawn system prompt file behind.\n this.startPromise = this._start().catch((err: unknown) => {\n this.removeSystemPromptFile();\n this.removePrivateHome();\n throw err;\n });\n return this.startPromise;\n }\n\n private async _start(): Promise<void> {\n // `rpc-ui` keeps omp's tool UI (the `ask` dialog) on the wire; `--no-ui`\n // keeps its extensions headless, so no widget/notify frames or approval dialogs.\n const args = [\"--mode\", \"rpc-ui\", \"--no-ui\"];\n\n // ── Session persistence ───────────────────────────────────────────────────\n // Store OMP session files in <cwd>/.omp/sessions/ so they survive process\n // restarts. The caller passes resumeSessionId to restore a prior session.\n const sessionDir = path.join(this.config.cwd, \".omp\", \"sessions\");\n await fs.mkdir(sessionDir, { recursive: true });\n args.push(\"--session-dir\", sessionDir);\n\n if (this.config.resumeSessionId) {\n this.log.info(\"resuming OMP session\", { sessionId: this.config.resumeSessionId });\n args.push(\"--session\", this.config.resumeSessionId);\n }\n\n // ── Provider registry → session-private omp agent directory ───────────────\n // Every enabled registry entry is serialized into omp's own `models.yml`\n // inside a directory `PI_CODING_AGENT_DIR` points at, so an omp session\n // sees N selectable providers and resolves `@role` across them. Returns\n // undefined for a session that carries no registry, which keeps the\n // legacy `provider`/`model`/env path byte-identical.\n const providers = await materializeOmpProviders(this.config);\n if (providers) {\n // Known to cleanup() from here on, so a later start step that throws cannot leave it behind.\n this.privateHome = providers.ephemeral ? providers.agentDir : null;\n // A credential omission is printed once by `skaile run`/`repl` as the `! provider ... is\n // not used` line; the other warnings are plain text, not a raw JSON record (p598).\n for (const warning of providers.warnings) {\n if (isCredentialOmissionWarning(warning)) this.log.debug(warning);\n else this.log.warn(warning);\n }\n this.log.info(\"rendered omp models.yml\", {\n agentDir: providers.agentDir,\n providers: providers.providerIds,\n modelRoles: providers.modelRoles,\n seeded: providers.seeded.length,\n });\n } else if (this.config.registry) {\n // No usable entry, the selected model's entry was left out, or the session names no\n // model and the user's own omp default needs their own models.yml (p1172): omp runs on\n // the user's own agent directory and login.\n this.log.info(\"registry is not applied to omp; omp uses its own login and models\");\n }\n\n const modelArg = providers?.modelArg ?? this.config.model;\n if (modelArg) args.push(\"--model\", modelArg);\n\n // Thinking level: `--thinking <level>` (omp's default is `high`). The\n // spawn-time snapshot lets `reconfigure()` send only what has drifted.\n const thinkingLevel = ompThinkingLevel(this.config);\n if (thinkingLevel) args.push(\"--thinking\", thinkingLevel);\n this.reconfig.setSnapshot({\n model: this.config.model,\n modelRef: this.config.modelRef,\n thinking: this.config.thinking,\n effort: this.config.effort,\n level: thinkingLevel,\n });\n\n // ── Tool restrictions ─────────────────────────────────────────────────────\n // agent.yaml `tools:` reaches the driver as AgentConfig.tools. The\n // claude-sdk driver has always honoured it; omp did not, so a restricted\n // agent definition silently ran with omp's full default toolset — which\n // dominates the fixed token prefix of every request.\n const toolArgs = buildOmpToolArgs(this.config.tools);\n if (toolArgs.length > 0) {\n this.log.info(\"applying tool restrictions\", { args: toolArgs });\n args.push(...toolArgs);\n }\n\n // ── System prompt injection ───────────────────────────────────────────────\n // omp does not accept a system prompt string directly; it reads from a file.\n // The file is private to this spawn and goes away with the process: a fixed\n // `<cwd>/.omp/system.md` is loaded by every native omp session and sub-agent that\n // runs in the same project afterwards, and the nested `agent.run` child of one run\n // overwrote the parent's (last writer wins). The path is passed via\n // --append-system-prompt.\n //\n // In flow mode (factory-assets/connectors/flow/run-flow.ts conductFlow), systemPrompt carries the full agent\n // identity (SOUL + RULES + knowledge + connector docs) because no agentDir is set.\n // In REPL mode (agent.ts buildDriver), systemPrompt carries the runner's agent sections\n // (the soul included: omp reads no SOUL.md) and the connector docs.\n this.removeSystemPromptFile();\n if (this.config.systemPrompt) {\n const promptDir = path.join(this.config.cwd, \".skaile\", \"cache\", \"omp-system\");\n await fs.mkdir(promptDir, { recursive: true });\n const systemFile = path.join(promptDir, `${randomUUID()}.md`);\n await fs.writeFile(systemFile, this.config.systemPrompt);\n this.systemPromptFile = systemFile;\n args.push(\"--append-system-prompt\", systemFile);\n }\n\n // Explicit env whitelist for the omp child process. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned subprocess. `this.config.env`, when\n // supplied, is merged over the whitelist (the caller wins per key), never\n // used in its place: a replaced env drops PATH and the spawn fails with\n // ENOENT (the model endpoint hands the driver only its endpoint variables).\n const env: Record<string, string> = {\n ...buildOmpChildEnv(process.env),\n ...(this.config.env as Record<string, string> | undefined),\n };\n // ── Main-agent handoff ────────────────────────────────────────────────────\n // PI_CODING_AGENT_DIR is omp's home: its runtime databases, credential store and\n // settings live there. It is never the agent directory itself: that holds the pinned\n // agent files (`.skaile/cache/agents/<name>/`) and omp's databases do not belong\n // beside them. omp reads `RULES.md` (not `SOUL.md`) from its home, so the agent's\n // entries are linked into a private home directory (see `materializeOmpIdentityDir`).\n // A rendered registry owns that home: it already contains the agent's files\n // (linked in from `agentDir`) plus the session's `models.yml` / `config.yml`.\n if (providers) {\n env.PI_CODING_AGENT_DIR = providers.agentDir;\n // The only place a credential *value* exists in this adapter. Registry\n // credentials override the ambient allowlist unconditionally: the\n // session's registry is the statement of intent, not whatever the host\n // happened to export.\n Object.assign(env, providers.credentialEnv);\n } else if (this.config.agentDir) {\n const home = await materializeOmpIdentityDir(this.config);\n if (home) {\n this.log.info(\"omp home for the agent\", { agentDir: home.agentDir });\n env.PI_CODING_AGENT_DIR = home.agentDir;\n this.privateHome = home.ephemeral ? home.agentDir : null;\n }\n }\n if (this.config.sshKeyPath) {\n env.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n stripRunnerPrivateEnv(env);\n\n // test-only: `OMP_BRIDGE_BIN` overrides the binary name and `OMP_BRIDGE_PREARGS`\n // (space-delimited) supplies any leading args (e.g. a JS script path when the\n // override binary is `node` or `bun`). Used by the subprocess harness tests in\n // `tests/omp-driver.test.ts` to point spawn at a fake-omp script without\n // monkey-patching `node:child_process`. Both are ignored in production.\n const overrideBin = process.env.OMP_BRIDGE_BIN;\n const overridePreArgs = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n const spawnBin = overrideBin || \"omp\";\n const spawnArgs = overrideBin ? [...overridePreArgs, ...args] : args;\n\n const spawned = await new Promise<ChildProcess>((resolve, reject) => {\n const startStderr: string[] = [];\n this.log.info(\"spawning omp\", {\n bin: spawnBin,\n args: spawnArgs,\n cwd: this.config.cwd,\n });\n if (env.PI_CODING_AGENT_DIR)\n this.log.debug(\"env: PI_CODING_AGENT_DIR set\", { value: env.PI_CODING_AGENT_DIR });\n if (env.GIT_SSH_COMMAND) this.log.debug(\"env: GIT_SSH_COMMAND set\");\n\n // Cast to ChildProcess: spawn infers ChildProcessWithoutNullStreams for\n // pipe stdio, but bun-types doesn't expose EventEmitter.on on that subtype.\n // With the uid split on, omp runs as the agent uid through the launch shim.\n const target = wrapAgentCommand(spawnBin, spawnArgs, resolveAgentExec());\n const proc = spawn(target.command, target.args, {\n cwd: this.config.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n // bun-types 1.3.11 omits EventEmitter.on from ChildProcess; cast to subscribe.\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n // A process replaced (or killed) by kill()/resetSession() no longer\n // owns the turn, the ready state or the error channel.\n if (this.proc !== proc) {\n clearTimeout(readyTimeout);\n reject(err);\n return;\n }\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"process error\", err, { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n if (!this.ready) reject(err);\n // Settle any in-flight turn so a process-level error cannot hang prompt().\n this.rejectTurn(Object.assign(new Error(detail.message), { detail }));\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n if (this.proc !== proc) {\n // Killed or replaced by kill()/resetSession(): the kill settled its own\n // turn and cleaned up, and a late exit must neither reject the turn of\n // the process that succeeded it nor tear down that process's state.\n // A start still waiting for `ready` on this process is over.\n clearTimeout(readyTimeout);\n reject(new Error(\"omp process killed before it was ready\"));\n // Only a plain kill() is announced; a live successor is not exiting.\n if (this.proc === null) this.emit(\"exit\", { code, signal });\n return;\n }\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const crashed = code !== null && code !== 0;\n if (crashed) {\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${lastStderr}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint:\n lastStderr || \"The agent process exited unexpectedly. Try sending your prompt again.\",\n };\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n // An exit before `ready` ends the start: without this the start promise never\n // settles (the ready timeout skips a gone process), and a caller awaiting it\n // hangs, or the process ends on a pending top-level await. Rejected on `close`\n // so omp's last stderr lines (the reason it gave up) are read first.\n if (!this.ready) {\n clearTimeout(readyTimeout);\n // Settles once: on `close` (stdio drained), or after 1 s if `close` never fires.\n // Not unref'd, so the pending start keeps the process alive until it rejects.\n const rejectStart = () => {\n clearTimeout(fallback);\n reject(\n new Error(\n `omp exited before it was ready (${code !== null ? `exit code ${code}` : `signal ${signal}`})${startStderr.length > 0 ? `: ${ompCredentialMessage(ompStartFailureCause(startStderr))}` : \"\"}`,\n ),\n );\n };\n const fallback = setTimeout(rejectStart, 1000);\n procEmitter.once(\"close\", rejectStart);\n }\n this.cleanup();\n // Settle any in-flight turn: an exit before `agent_end` means the turn\n // can never complete normally, so reject rather than leak a pending promise.\n this.rejectTurn(\n new Error(\n crashed\n ? `omp process crashed (exit code ${code})`\n : `omp process exited before the turn completed${signal ? ` (signal ${signal})` : \"\"}`,\n ),\n );\n this.emit(\"exit\", { code, signal });\n });\n\n if (proc.stdout) {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n // bun-types 1.3.11 omits EventEmitter.on from readline.Interface; cast to subscribe.\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (!line.trim()) return;\n try {\n const event: OmpEvent = JSON.parse(line);\n this.handleEvent(event);\n } catch {\n this.log.debug(\"stdout\", { line });\n }\n });\n }\n\n // Before omp is ready its stderr is the cause of a failed start, and the start error\n // carries that cause once (p598). The lines go to the debug log meanwhile; a start that\n // succeeds replays them as warnings, so a notice of a working omp is not lost.\n const replayStartStderr = (): void => {\n for (const line of startStderr) this.log.warn(`stderr: ${line}`);\n };\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (this.ready) this.log.warn(`stderr: ${line}`);\n else this.log.debug(`stderr: ${line}`);\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n startStderr.push(line);\n if (startStderr.length > 20) startStderr.shift();\n });\n }\n\n const startTime = Date.now();\n const readyTimeout = setTimeout(() => {\n // Not for a process that was replaced or has gone: it must not mark the\n // driver (now owned by a successor, or stopped) as ready.\n if (!this.ready && this.proc === proc) {\n this.log.warn(\"ready timeout, proceeding\", { timeoutMs: 5000 });\n this.ready = true;\n replayStartStderr();\n resolve(proc);\n }\n }, 5000);\n\n this.once(\"ready\", () => {\n clearTimeout(readyTimeout);\n if (!this.ready && this.proc === proc) {\n this.log.info(\"process ready\", { elapsedMs: Date.now() - startTime });\n this.ready = true;\n replayStartStderr();\n resolve(proc);\n }\n });\n });\n\n // Every await below can span a kill()/resetSession(): the successor owns the\n // driver state then, so a start for this process must not touch it.\n const assertCurrent = (): void => {\n if (this.proc !== spawned) throw new Error(\"omp process was killed during start\");\n };\n\n assertCurrent();\n // Subscribed before the requests so a registry change that lands while they\n // are in flight is not missed. There is no await between the check and the\n // subscription, so a later kill()'s cleanup() always unsubscribes it.\n const hooks = this.config.capabilities;\n if (hooks) {\n this.unsubscribeToolsChanged =\n hooks.onToolsChanged?.(() => {\n void this.syncHostTools();\n }) ?? null;\n }\n\n // Independent of each other, so concurrent: a misbehaving omp blocks start\n // for one request timeout, not two. Both are best-effort and never throw.\n // Before start() resolves, so the first `ask` already arrives as one dialog\n // and the first prompt already sees the tools.\n await Promise.all([this.enableAskDialog(), hooks ? this.syncHostTools() : undefined]);\n assertCurrent();\n\n // Context fill is known before the first prompt (system prompt + tools);\n // best-effort and not awaited, so a slow `get_state` never delays start().\n void this.captureState({ announceSession: false });\n }\n\n /**\n * Register the runner's capabilities with omp as host tools.\n *\n * Sends the full set every time: `set_host_tools` replaces omp's previous\n * host-owned set, so a registry change that removes a capability takes\n * effect too. Best-effort — a failure is logged and the session runs\n * without host tools rather than failing to start.\n */\n private async syncHostTools(): Promise<void> {\n const hooks = this.config.capabilities;\n if (!hooks || !this.proc) return;\n const set = buildOmpHostTools(hooks.composeTools());\n for (const { tool, reason } of set.dropped) {\n const key = `${tool}\\u0000${reason}`;\n if (this.warnedDroppedHostTools.has(key)) continue;\n this.warnedDroppedHostTools.add(key);\n this.log.warn(\"host tool dropped: invalid input schema\", { tool, reason });\n }\n // Swapped before sending so a call racing the response already routes.\n this.hostToolCapabilities = set.capabilityNames;\n try {\n const response = await this.request(\n { type: \"set_host_tools\", tools: set.definitions },\n { quiet: true },\n );\n if (response.success) {\n const data = response.data as { toolNames?: unknown } | undefined;\n this.log.info(\"registered omp host tools\", { toolNames: data?.toolNames });\n } else {\n this.log.error(\"omp rejected host tools\", new Error(response.error ?? \"unknown error\"), {\n tools: set.definitions.map((t) => t.name),\n });\n }\n } catch (err) {\n this.log.error(\"registering omp host tools failed\", err as Error);\n }\n }\n\n /**\n * Execute a capability omp asked the host to run (`host_tool_call`) and\n * answer with `host_tool_result`. Goes through {@link dispatchCapability}\n * so validation, fire-and-forget and render semantics match claude-sdk.\n *\n * Emits `tool_call` / `tool_execution_end` around the dispatch: the\n * normalizer does not read omp's own tool frames, so without these the\n * call — and its `activity_label` — would never reach the chat.\n */\n private handleHostToolCall(event: OmpEvent): void {\n const id = event.id;\n if (typeof id !== \"string\") return;\n const hostName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n const name = this.hostToolCapabilities.get(hostName) ?? hostName;\n const callId = typeof event.toolCallId === \"string\" ? event.toolCallId : id;\n const input = event.arguments ?? {};\n const hooks = this.config.capabilities;\n const controller = new AbortController();\n const call = { controller, name };\n this.hostToolCalls.set(id, call);\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name,\n tool: { name },\n toolCallId: callId,\n input,\n });\n\n void (async () => {\n let text: string;\n let isError = false;\n try {\n if (!hooks) throw new Error(`no capability host for ${name}`);\n const dispatch = await dispatchCapability(\n hooks,\n name,\n input,\n (_err, dispatchCallId) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n toolCallId: callId,\n callId: dispatchCallId,\n // Nothing from the error: its message can quote the call's content.\n }),\n controller.signal,\n );\n text =\n typeof dispatch.result === \"string\"\n ? dispatch.result\n : JSON.stringify(dispatch.result ?? {});\n } catch (err) {\n isError = true;\n text = `Error: ${(err as Error)?.message ?? String(err)}`;\n }\n // Cancelled by omp or the process went away: nobody awaits a result.\n if (this.hostToolCalls.get(id) !== call) return;\n this.hostToolCalls.delete(id);\n this.emit(\"agent-event\", { type: \"tool_execution_end\", toolName: name });\n try {\n this.send({\n type: \"host_tool_result\",\n id,\n result: { content: [{ type: \"text\", text }] },\n ...(isError ? { isError: true } : {}),\n });\n } catch (err) {\n this.log.warn(\"host tool result undeliverable\", { name, callId, error: String(err) });\n }\n })();\n }\n\n /**\n * `host_tool_cancel`: omp aborted the call, so abort the capability handler\n * and close the call's chat activity (the handler's later settlement is\n * ignored, so this is the only `tool_execution_end` the call gets).\n */\n private handleHostToolCancel(event: OmpEvent): void {\n const targetId = event.targetId;\n if (typeof targetId !== \"string\") return;\n this.abortHostToolCall(targetId);\n }\n\n /** Abort one in-flight host tool call and end its activity; no-op if already settled. */\n private abortHostToolCall(id: string): void {\n const call = this.hostToolCalls.get(id);\n if (!call) return;\n this.hostToolCalls.delete(id);\n call.controller.abort();\n this.emit(\"agent-event\", { type: \"tool_execution_end\", toolName: call.name });\n }\n\n // ── Interactive questions (`ask`) ──────────────────────────────────────────\n\n /**\n * `extension_ui_request`: omp asks the host something. Only `ask` (and the\n * `select` omp falls back to when `set_ask_dialog` is unavailable) can carry\n * a user question; both park until {@link answerQuestion}. Presentation\n * frames expect no reply. Every other kind is a dialog nobody here can\n * answer, so it is cancelled at once — an unanswered dialog would leave the\n * tool call, and the turn, waiting forever.\n */\n private handleExtensionUiRequest(event: OmpEvent): void {\n const method = event.method;\n if (method === \"cancel\") {\n // omp closed a dialog itself (timeout, abort): nothing is owed any more.\n if (typeof event.targetId === \"string\" && this.pendingQuestion?.id === event.targetId) {\n this.pendingQuestion = null;\n }\n return;\n }\n if (\n method === \"notify\" ||\n method === \"setStatus\" ||\n method === \"setWidget\" ||\n method === \"setTitle\" ||\n method === \"set_editor_text\" ||\n method === \"open_url\"\n ) {\n return;\n }\n const id = event.id;\n if (typeof id !== \"string\") return;\n let parsed: OmpPendingQuestion | null = null;\n if (method === \"ask\") parsed = this.parseAskRequest(id, event);\n else if (method === \"select\") parsed = this.parseSelectRequest(id, event);\n if (!parsed) {\n this.log.debug(\"cancelling unsupported omp dialog\", { method: String(method) });\n this.sendUiResponse({ id, cancelled: true });\n return;\n }\n // omp parks on one dialog at a time; a second request means the first is dead.\n this.cancelPendingQuestion();\n this.pendingQuestion = parsed;\n this.announceQuestion(parsed, event);\n }\n\n private parseAskRequest(id: string, event: OmpEvent): OmpPendingQuestion | null {\n if (!Array.isArray(event.questions) || event.questions.length === 0) return null;\n const questions: OmpPendingQuestion[\"questions\"] = [];\n for (const raw of event.questions as unknown[]) {\n const q = raw as { id?: unknown; question?: unknown; options?: unknown; multi?: unknown };\n // The response needs one `{ id }` entry per question; without either field\n // the ask cannot be answered correctly, so refuse it rather than guess.\n if (!q || typeof q.id !== \"string\" || typeof q.question !== \"string\" || !q.question) {\n return null;\n }\n const options = (Array.isArray(q.options) ? (q.options as unknown[]) : []).flatMap((o) => {\n let label: unknown = o;\n if (o && typeof o === \"object\" && \"label\" in o) label = o.label;\n return typeof label === \"string\" ? [label] : [];\n });\n questions.push({ id: q.id, question: q.question, options, multi: q.multi === true });\n }\n return { id, method: \"ask\", questions, answers: questions.map(() => undefined) };\n }\n\n private parseSelectRequest(id: string, event: OmpEvent): OmpPendingQuestion | null {\n if (typeof event.title !== \"string\" || !event.title || !Array.isArray(event.options)) {\n return null;\n }\n const options = (event.options as unknown[]).filter((o): o is string => typeof o === \"string\");\n if (options.length === 0) return null;\n return {\n id,\n method: \"select\",\n questions: [{ id, question: event.title, options, multi: false }],\n answers: [undefined],\n };\n }\n\n /**\n * Publish the parked question the way claude-sdk does for `AskUserQuestion`:\n * an assistant `tool_use` block the normalizer turns into one `question`\n * event per question, plus the matching `tool_call`. Option descriptions and\n * `header`s survive in the tool input for consumers that render them.\n */\n private announceQuestion(pending: OmpPendingQuestion, event: OmpEvent): void {\n const rawQuestions = Array.isArray(event.questions) ? (event.questions as unknown[]) : [];\n const input = {\n requestId: pending.id,\n questions: pending.questions.map((q, i) => {\n const raw = rawQuestions[i] as\n | { header?: unknown; options?: Array<{ label?: unknown; description?: unknown }> }\n | undefined;\n return {\n question: q.question,\n ...(typeof raw?.header === \"string\" ? { header: raw.header } : {}),\n multiSelect: q.multi,\n options: q.options.map((label, j) => {\n const description = raw?.options?.[j]?.description;\n return { label, ...(typeof description === \"string\" ? { description } : {}) };\n }),\n };\n }),\n };\n const toolCallId = `omp-ask:${pending.id}`;\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: {\n role: \"assistant\",\n content: [{ type: \"tool_use\", name: \"AskUserQuestion\", id: toolCallId, input }],\n },\n });\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"AskUserQuestion\",\n tool: { name: \"AskUserQuestion\" },\n toolCallId,\n input,\n });\n this.log.debug(\"paused on omp ask\", { questions: pending.questions.length });\n }\n\n override supersedePendingQuestion(): void {\n this.cancelPendingQuestion();\n }\n\n override hasPendingQuestion(): boolean {\n return this.pendingQuestion !== null;\n }\n\n /**\n * While omp is parked on a question a reply that is not an answer must not\n * become a prompt: the turn is still running, and a second prompt would\n * collide with it.\n */\n override get acceptsReplyAsPrompt(): boolean {\n return this.pendingQuestion === null;\n }\n\n override answerQuestion(answer: string, question?: string, requestId?: string): boolean {\n const pending = this.pendingQuestion;\n if (!pending || typeof answer !== \"string\") return false;\n if (requestId !== undefined && requestId !== pending.id) return false;\n\n // A named answer binds to its own question; an unnamed one fills the next\n // unanswered slot. Same rule as claude-sdk.\n let index =\n question !== undefined ? pending.questions.findIndex((q) => q.question === question) : -1;\n if (index === -1) index = pending.answers.indexOf(undefined);\n if (index === -1) return false;\n pending.answers[index] = answer;\n if (pending.answers.some((a) => a === undefined)) return true;\n\n this.pendingQuestion = null;\n this.sendUiResponse(this.buildQuestionResponse(pending));\n this.log.debug(\"answered omp ask\", { questions: pending.questions.length });\n return true;\n }\n\n /** Shape the collected answers as the `extension_ui_response` payload for the request's method. */\n private buildQuestionResponse(pending: OmpPendingQuestion): Record<string, unknown> {\n const find = (options: string[], text: string): string | undefined =>\n options.find((o) => o === text) ??\n options.find((o) => o.toLowerCase() === text.toLowerCase());\n\n if (pending.method === \"select\") {\n const match = find(pending.questions[0]!.options, (pending.answers[0] ?? \"\").trim());\n if (match !== undefined) return { id: pending.id, value: match };\n // A `select` only takes one of its options; free text has nowhere to go.\n this.log.warn(\"select answer matches no option; cancelling it\");\n return { id: pending.id, cancelled: true };\n }\n\n const answers = pending.questions.map((q, i) => {\n const text = (pending.answers[i] ?? \"\").trim();\n const whole = find(q.options, text);\n if (whole !== undefined) return { id: q.id, selectedOptions: [whole] };\n if (q.multi) {\n // The UI hands a multi-select back as one string; take a comma-separated\n // list of labels apart, but only if every piece is a real option.\n const parts = text\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n const matched = parts.map((p) => find(q.options, p));\n if (parts.length > 0 && matched.every((m) => m !== undefined)) {\n return { id: q.id, selectedOptions: [...new Set(matched as string[])] };\n }\n }\n // Anything else is the user's own words (omp always offers free text).\n return { id: q.id, selectedOptions: [], ...(text ? { customInput: text } : {}) };\n });\n return { id: pending.id, answers };\n }\n\n /** Write an `extension_ui_response`; undeliverable (process gone) is logged, not thrown. */\n private sendUiResponse(payload: Record<string, unknown>): void {\n try {\n this.send({ type: \"extension_ui_response\", ...payload });\n } catch (err) {\n this.log.warn(\"extension ui response undeliverable\", { error: String(err) });\n }\n }\n\n /** Drop the pending question and tell omp it was cancelled, so its tool call unwinds. */\n private cancelPendingQuestion(): void {\n const pending = this.pendingQuestion;\n if (!pending) return;\n this.pendingQuestion = null;\n this.sendUiResponse({ id: pending.id, cancelled: true });\n }\n\n /**\n * Opt in to omp's single `ask` dialog request (off by default per process).\n * Best-effort: a build without the command answers with a failed response and\n * its `ask` keeps degrading to one `select` per question, which\n * {@link handleExtensionUiRequest} still surfaces as a question.\n */\n private async enableAskDialog(): Promise<void> {\n try {\n const response = await this.request(\n { type: \"set_ask_dialog\", enabled: true },\n { quiet: true },\n );\n if (!response.success) {\n this.log.warn(\"omp rejected set_ask_dialog; ask falls back to select\", {\n error: response.error,\n });\n }\n } catch (err) {\n this.log.warn(\"set_ask_dialog failed\", { error: String(err) });\n }\n }\n\n private extractMessageText(msg: OmpMessage): string {\n if (!msg) return \"\";\n const c = msg.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c))\n return c\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text)\n .join(\"\");\n return \"\";\n }\n\n /**\n * `available_commands_update`: replace the cached slash-command list and\n * publish it. Names carry no leading slash (omp's already don't), matching\n * claude-sdk's `commands_available`. Entries without a name are skipped.\n */\n private handleCommandsUpdate(event: OmpEvent): void {\n const raw = Array.isArray(event.commands) ? (event.commands as unknown[]) : [];\n const commands: SlashCommandInfo[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== \"object\") continue;\n const c = entry as { name?: unknown; description?: unknown; input?: { hint?: unknown } };\n if (typeof c.name !== \"string\" || !c.name) continue;\n const hint = c.input && typeof c.input === \"object\" ? c.input.hint : undefined;\n commands.push({\n name: c.name,\n description: typeof c.description === \"string\" ? c.description : \"\",\n argumentHint: typeof hint === \"string\" && hint ? hint : undefined,\n });\n }\n this.cachedCommands = commands;\n this.emit(\"agent-event\", { type: \"commands_available\", commands });\n this.log.debug(\"discovered slash commands\", { count: commands.length });\n }\n\n private handleEvent(event: OmpEvent) {\n if (event.type === \"ready\") {\n this.emit(\"ready\");\n return;\n }\n if (event.type === \"response\") {\n const quiet = typeof event.id === \"string\" && this.quietRequestIds.delete(event.id);\n if (!event.success && event.error && !quiet) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n this.emit(`response:${event.id}`, event);\n return;\n }\n // Host tool requests are answered here, not forwarded: they are a\n // host↔omp exchange, surfaced to consumers as `tool_call` events.\n if (event.type === \"host_tool_call\") {\n this.handleHostToolCall(event);\n return;\n }\n if (event.type === \"host_tool_cancel\") {\n this.handleHostToolCancel(event);\n return;\n }\n // UI dialogs (`ask`, …) are a host↔omp exchange: published as `question`\n // events and answered via `answerQuestion`, never forwarded raw.\n if (event.type === \"extension_ui_request\") {\n this.handleExtensionUiRequest(event);\n return;\n }\n // Slash-command list pushed by omp after `ready` and on change: published\n // as `commands_available` (like claude-sdk), never forwarded raw.\n if (event.type === \"available_commands_update\") {\n this.handleCommandsUpdate(event);\n return;\n }\n if (event.type === \"error\" && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { ...event, error: detail.message, detail });\n return;\n }\n // Compute text delta for message_update events\n if (event.type === \"message_update\" && event.message) {\n const text = this.extractMessageText(event.message);\n let delta = \"\";\n if (text.startsWith(this.prevText)) {\n delta = text.slice(this.prevText.length);\n } else {\n // Text blocks restructured — emit full text as delta\n delta = text;\n }\n this.prevText = text;\n // Thinking never enters `_textDelta` (extractMessageText sees text blocks\n // only). It travels beside it as `_thinkingDelta`, taken straight from\n // omp's `thinking_delta` sub-event so it cannot duplicate or reorder.\n const sub = event.assistantMessageEvent;\n const thinking =\n sub && typeof sub === \"object\" && \"type\" in sub && sub.type === \"thinking_delta\"\n ? \"delta\" in sub && typeof sub.delta === \"string\"\n ? sub.delta\n : \"\"\n : \"\";\n this.emit(\"agent-event\", {\n ...event,\n _textDelta: delta,\n ...(thinking ? { _thinkingDelta: thinking } : {}),\n });\n return;\n }\n // Reset delta tracking on message boundaries. `message_start` may already\n // carry content (omp 18.x puts the whole reply, or its first chunk, into the\n // start frame). That text must reach a delta consumer: seeding `prevText`\n // from it alone dropped it (the one-shot `skaile run` printed only what the\n // later updates added), and clearing it made the normalizer count it twice.\n // So the assistant's start text leaves the start frame and travels as the\n // first `_textDelta`, in a `message_update` right after it.\n if (event.type === \"message_start\") {\n const startText =\n event.message?.role === \"assistant\" ? this.extractMessageText(event.message) : \"\";\n this.prevText = startText;\n if (startText && event.message) {\n const content = event.message.content;\n const message = {\n ...event.message,\n content: Array.isArray(content) ? content.filter((b) => b.type !== \"text\") : \"\",\n };\n this.emit(\"agent-event\", { ...event, message });\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: event.message,\n _textDelta: startText,\n });\n return;\n }\n }\n if (event.type === \"message_end\" || event.type === \"agent_end\") {\n this.prevText = \"\";\n }\n\n if (event.type === \"message_end\") this.recordMessageUsage(event.message);\n\n // A failed omp request arrives as `message_end` with `stopReason: \"error\"`,\n // not as an `error` event. Without this branch the turn ended silently: the\n // caller saw a normal completion with no assistant text and no failure,\n // which reads as a hung or empty agent. Surface it on the same channel as\n // every other driver error so callers can classify and retry.\n if (\n event.type === \"message_end\" &&\n event.message?.role === \"assistant\" &&\n event.message.stopReason === \"error\"\n ) {\n const error = event.message.errorMessage || \"omp request failed\";\n const detail = this.classifyErrorMessage(error);\n this.log.error(\"omp request failed\", new Error(error), { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n\n // After each turn ends, capture the OMP session ID so callers can persist it\n // and pass it as resumeSessionId on the next spawn.\n if (event.type === \"agent_end\") {\n void this.captureState();\n }\n // A listener that kills the driver while it handles `agent_end` (the\n // one-shot `skaile run` does) ends a turn that already finished: `kill()`\n // must settle it as done, not as \"omp process killed\".\n const turnEnded = event.type === \"agent_end\";\n this.turnEnded = turnEnded;\n try {\n this.emit(\"agent-event\", event);\n } finally {\n this.turnEnded = false;\n }\n // Resolve AFTER emitting so listeners observing the turn see `agent_end`\n // before the caller's `prompt()` await unblocks.\n if (turnEnded) {\n this.resolveTurn();\n }\n }\n\n /**\n * Resolve the in-flight prompt turn (on `agent_end`). Idempotent — a turn\n * settles at most once, so a stray second `agent_end` is harmless.\n */\n private resolveTurn(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n /**\n * Reject the in-flight prompt turn (process crash/error). Settling here keeps\n * `prompt()` from hanging forever when the child dies before `agent_end`.\n */\n private rejectTurn(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n /**\n * Query OMP's current state via the `get_state` RPC.\n *\n * Always refreshes the context fill from `contextUsage`. With\n * `announceSession` (the default, used after each turn) it also records the\n * native session ID and emits a `session_info` event so the forge layer can\n * persist it. Failures are silently swallowed — both are best-effort.\n */\n private async captureState(options: { announceSession?: boolean } = {}): Promise<void> {\n const announceSession = options.announceSession ?? true;\n try {\n const response = await this.request({ type: \"get_state\" }, { quiet: !announceSession });\n\n if (response.success && response.data) {\n const data = response.data as Record<string, unknown>;\n this.captureContextUsage(data.contextUsage);\n const sessionId = data.sessionId as string | undefined;\n const sessionFile = data.sessionFile as string | undefined;\n if (announceSession && sessionId) {\n this._ompSessionId = sessionId;\n this.log.debug(\"omp session id assigned\", { sessionId });\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: sessionId,\n ...(sessionFile ? { sessionFile } : {}),\n });\n }\n }\n } catch {\n // get_state is best-effort — OMP may not support it yet or the process\n // may have exited. The short-term history injection fallback still works.\n }\n }\n\n /** `get_state.contextUsage` → context fill + window; absent or malformed values are ignored. */\n private captureContextUsage(raw: unknown): void {\n if (!raw || typeof raw !== \"object\") return;\n const tokens = \"tokens\" in raw ? raw.tokens : undefined;\n const contextWindow = \"contextWindow\" in raw ? raw.contextWindow : undefined;\n if (typeof tokens === \"number\" && Number.isFinite(tokens) && tokens >= 0) {\n this._lastContextTokens = tokens;\n }\n if (typeof contextWindow === \"number\" && Number.isFinite(contextWindow) && contextWindow > 0) {\n this._contextWindow = contextWindow;\n }\n }\n\n /** Forget the previous turn's usage; called as a new turn begins. */\n private beginUsageTurn(): void {\n this._lastTokens = null;\n this._lastContextTokens = null;\n }\n\n /**\n * Fold one finished assistant message into the turn's usage. Only the\n * `message_end` value is final (`message_start` and partials carry running\n * zeros). A message without usage, or an errored one reporting all zeros,\n * bills nothing and must neither create a reading nor wipe a good one.\n */\n private recordMessageUsage(message: OmpMessage | undefined): void {\n if (message?.role !== \"assistant\" || !message.usage) return;\n const count = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : undefined;\n const input = count(message.usage.input);\n const output = count(message.usage.output);\n const cacheRead = count(message.usage.cacheRead);\n const cacheWrite = count(message.usage.cacheWrite);\n const reasoning = count(message.usage.reasoningTokens);\n const total = count(message.usage.totalTokens);\n const callContext = (input ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0);\n if (callContext + (output ?? 0) + (total ?? 0) === 0) return;\n\n const turn: TokenUsage = { ...this._lastTokens };\n const add = (key: keyof TokenUsage, value: number | undefined) => {\n if (value !== undefined) turn[key] = (turn[key] ?? 0) + value;\n };\n add(\"inputTokens\", input);\n add(\"outputTokens\", output);\n add(\"cacheReadTokens\", cacheRead);\n add(\"cacheCreationTokens\", cacheWrite);\n add(\"reasoningTokens\", reasoning);\n add(\"totalTokens\", total);\n this._lastTokens = turn;\n // Provisional until `get_state` reports omp's own figure: that reply lands\n // after `agent_end`, and a compaction check can run before it.\n if (callContext > 0) this._lastContextTokens = callContext;\n }\n\n private nextId(): string {\n return `req-${++this.reqId}`;\n }\n\n /**\n * Send a command and await its `response` frame.\n *\n * @param options.quiet - Leave a failed response to the caller instead of\n * surfacing it as an `error` agent event.\n * @throws When the process is not running or no response arrives within\n * `options.timeoutMs` (default 5 s).\n */\n private request(\n msg: { type: string; [key: string]: unknown },\n options: { quiet?: boolean; timeoutMs?: number } = {},\n ): Promise<OmpEvent> {\n const id = this.nextId();\n const event = `response:${id}`;\n // Not `Promise.withResolvers`: the provider/connector packages that\n // typecheck this file target a lib older than es2024.\n let resolve!: (resp: OmpEvent) => void;\n let reject!: (err: Error) => void;\n const promise = new Promise<OmpEvent>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n const onResponse = (resp: OmpEvent) => {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n resolve(resp);\n };\n // A timed-out quiet request keeps its id: omp may still answer late (with a\n // failure), and that answer must stay as quiet as an in-time one. The id is\n // dropped when the response is handled or the process ends (`cleanup()`).\n const fail = (err: Error, keepQuiet = false) => {\n clearTimeout(timer);\n this.pendingRequests.delete(id);\n this.removeListener(event, onResponse);\n if (!keepQuiet) this.quietRequestIds.delete(id);\n reject(err);\n };\n const timer = setTimeout(\n () => fail(new Error(`${msg.type} timeout`), true),\n options.timeoutMs ?? 5000,\n );\n this.once(event, onResponse);\n this.pendingRequests.set(id, fail);\n if (options.quiet) this.quietRequestIds.add(id);\n try {\n this.send({ id, ...msg });\n } catch (err) {\n fail(err as Error);\n }\n return promise;\n }\n\n private send(msg: object): void {\n if (!this.proc?.stdin?.writable) {\n const detail: AgentError = {\n message: \"omp process not running\",\n category: \"process\",\n retryable: true,\n hint: \"The agent process is not available. It will restart automatically on the next prompt.\",\n };\n const err = Object.assign(new Error(detail.message), { detail });\n throw err;\n }\n this.proc.stdin.write(`${JSON.stringify(msg)}\\n`);\n }\n\n /**\n * Sends a prompt to the omp process via JSON-RPC and resolves when the turn\n * completes (after the `agent_end` event), honoring the `AgentDriver.prompt`\n * contract so driver-agnostic callers can await turn completion uniformly.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * If the child process errors or exits before `agent_end`, the returned promise\n * rejects rather than hanging.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running, its stdin is closed, or\n * the child crashes/exits before the turn completes.\n */\n public prompt(message: string): Promise<void> {\n return this.enqueuePrompt(() => this.runPrompt({ message }));\n }\n\n /**\n * Run one prompt after every earlier one settled. A question omp is parked on\n * is cancelled first, synchronously and ahead of the queue: the parked turn\n * can only finish once its `ask` is released, so the new prompt (the user\n * typing instead of answering) must not wait behind it. The runner queues chat\n * prompts too; this queue still covers callers that drive the driver directly.\n */\n private enqueuePrompt(run: () => Promise<void>): Promise<void> {\n this.cancelPendingQuestion();\n const queued = this.promptTail.then(run);\n this.promptTail = queued.then(\n () => undefined,\n () => undefined,\n );\n return queued;\n }\n\n /**\n * Structured prompt: text plus image/file/skill attachments. Images travel as\n * omp `ImageContent` (`prompt.images`, base64 + mimeType); file and skill\n * attachments are named in a text preamble, because omp reads files itself.\n * Turn settlement is shared with {@link prompt}.\n */\n public override promptInput(input: AgentPromptInput): Promise<void> {\n if (input.toolAllowlist !== undefined)\n return Promise.reject(new Error(TOOL_ALLOWLIST_UNSUPPORTED));\n return this.enqueuePrompt(async () => this.runPrompt(await this.buildPromptPayload(input)));\n }\n\n /** Resolve attachments into the `message` + `images` fields of an omp `prompt` frame. */\n private async buildPromptPayload(\n input: AgentPromptInput,\n ): Promise<{ message: string; images?: OmpImageContent[] }> {\n const attachments = input.attachments ?? [];\n if (attachments.length === 0) return { message: input.text };\n const mimeByExt: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n };\n const images: OmpImageContent[] = [];\n const preamble: string[] = [];\n let root: string | undefined;\n for (const attachment of attachments) {\n if (attachment.type !== \"image\") {\n preamble.push(`[Attached ${attachment.type}: ${attachment.name} (${attachment.path})]`);\n continue;\n }\n // Image bytes are read here, so the path must stay inside the workspace.\n root ??= await fs.realpath(this.config.cwd);\n const resolved = await fs.realpath(path.resolve(root, attachment.path));\n const rel = path.relative(root, resolved);\n const escapes = rel === \"..\" || rel.startsWith(`..${path.sep}`);\n if (rel === \"\" || escapes || path.isAbsolute(rel)) {\n throw new Error(`Image attachment is outside the workspace: ${attachment.path}`);\n }\n const mimeType = mimeByExt[path.extname(resolved).toLowerCase()];\n if (!mimeType) {\n throw new Error(`Unsupported image type for attachment: ${attachment.path}`);\n }\n // Anthropic rejects images over 5 MB; fail before reading the bytes.\n const { size } = await fs.stat(resolved);\n if (size > OMP_MAX_IMAGE_BYTES) {\n throw new Error(`Image attachment too large (${size} bytes > 5 MB): ${attachment.path}`);\n }\n images.push({\n type: \"image\",\n data: (await fs.readFile(resolved)).toString(\"base64\"),\n mimeType,\n });\n }\n const message = preamble.length ? `${preamble.join(\"\\n\")}\\n\\n${input.text}` : input.text;\n return { message, ...(images.length ? { images } : {}) };\n }\n\n /**\n * Send one `prompt` frame and resolve when the turn completes (`agent_end`).\n * Rejects if the child dies first.\n */\n private async runPrompt(payload: { message: string; images?: OmpImageContent[] }): Promise<void> {\n await this.start();\n // A reconfigure that landed mid-turn or before `ready` applies now.\n await this.reconfig.flushBeforeTurn();\n const id = this.nextId();\n\n // Install the per-turn resolver BEFORE sending: omp can stream a fast\n // `agent_end` on the next readline tick, and if the resolver isn't wired\n // yet that event would be missed and prompt() would hang forever.\n const turnPromise = new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n });\n\n this.beginUsageTurn();\n try {\n this.send({ id, type: \"prompt\", ...payload });\n } catch (err) {\n this.turnResolve = null;\n this.turnReject = null;\n throw err;\n }\n\n await turnPromise;\n }\n\n /**\n * Sends an in-band abort RPC to the omp process, requesting it to stop the\n * current turn without terminating the child process.\n *\n * @remarks This is a best-effort signal — omp may not honour the abort\n * immediately. The process remains alive after `abort()`.\n */\n public async abort(): Promise<void> {\n if (!this.proc) return;\n const id = this.nextId();\n this.send({ id, type: \"abort\" });\n // The dialog's tool call is aborted with the turn; release what it owed.\n this.cancelPendingQuestion();\n }\n\n /** `true` when the omp child process is alive and has not been killed. */\n public get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends SIGTERM to the omp child process and performs cleanup.\n *\n * The driver instance must not be reused after `kill()`. Create a new\n * `OmpDriver` to start a fresh session.\n */\n kill(): void {\n const proc = this.proc;\n if (!proc) return;\n // Settle this process's in-flight turn here: its late `exit` is ignored (the\n // process is superseded by then) and must not reach a successor's turn.\n if (this.turnEnded) this.resolveTurn();\n else this.rejectTurn(new Error(\"omp process killed\"));\n proc.kill(\"SIGTERM\");\n this.cleanup();\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n // Otherwise the respawn passes `--session` and reopens the pre-reset session.\n this.config = { ...this.config, resumeSessionId: undefined };\n this._lastTokens = null;\n this._lastContextTokens = null;\n this._contextWindow = null;\n await this.start();\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: \"omp command not found\",\n category: \"config\",\n retryable: false,\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: \"Permission denied running omp\",\n category: \"config\",\n retryable: false,\n hint: \"Check file permissions for the omp binary.\",\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: \"An unexpected process error occurred. Try sending your prompt again.\",\n };\n }\n\n private classifyErrorMessage(rawMsg: string): AgentError {\n const msg = ompCredentialMessage(rawMsg);\n // Shared keyword buckets live in error-classifier.ts; only the hint copy is omp-specific.\n const generic = classifyGenericErrorMessage(msg);\n if (!generic) return { message: msg, category: \"unknown\", retryable: true };\n\n const lower = msg.toLowerCase();\n const hint =\n generic.category === \"auth\"\n ? \"Check your API key configuration in Settings.\"\n : generic.category === \"rate_limit\"\n ? \"You have hit the provider rate limit. Wait a moment and try again.\"\n : generic.category === \"network\"\n ? \"A network error occurred. Check your connection and try again.\"\n : // model: distinguish unavailable-model from over-long-context.\n lower.includes(\"model\")\n ? \"The selected model is not available. Change the model in settings.\"\n : \"The conversation is too long. Start a new session or choose a model with a larger context window.\";\n return { message: msg, category: generic.category, retryable: generic.retryable, hint };\n }\n\n /**\n * The models this session can select.\n *\n * Answered entirely from the registry: the ids are exactly the\n * `<providerId>/<modelId>` selectors rendered into `models.yml`, so a\n * picker offers every enabled endpoint instead of whichever one the\n * ambient binary happens to be authenticated for. A registry whose\n * entries name no models yields no entries here — that gap is closed by\n * giving the entry a `discovery:` block (`PROVIDER-CONFIG-PLAN.md` §1.1),\n * not by asking the omp binary what it happens to know. omp's own catalog\n * (`omp models --json`) answers a different question — every model omp\n * knows across every provider, regardless of what this session's registry\n * enables or has credentials for — and shelling out to an ambient binary\n * from this code path is itself a liability: it can block indefinitely\n * reading a prompt from stdin when run inside another interactive session.\n */\n override async listModels(): Promise<ModelEntry[]> {\n return registryModelEntries(this.config.registry);\n }\n\n /** Delete the system prompt file of the process that is gone (or about to be replaced). */\n private removeSystemPromptFile(): void {\n const file = this.systemPromptFile;\n this.systemPromptFile = null;\n if (file) rmSync(file, { force: true });\n }\n\n /**\n * Delete the private omp home of the process that is gone: it holds symlinks to the login\n * and the agent files and omp's runtime databases, and nothing reads it afterwards (p811).\n */\n private removePrivateHome(): void {\n const home = this.privateHome;\n this.privateHome = null;\n if (home) rmSync(home, { recursive: true, force: true });\n }\n\n private cleanup(): void {\n this.removeSystemPromptFile();\n this.removePrivateHome();\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n this.ready = false;\n this.reconfig.setSnapshot(null);\n this.startPromise = null;\n this.stderrBuffer = [];\n // A respawn re-subscribes and re-registers the host tools from scratch.\n this.unsubscribeToolsChanged?.();\n this.unsubscribeToolsChanged = null;\n this.hostToolCapabilities = new Map();\n // Nothing can receive these results any more; stop the handlers and close\n // their chat activity (the handlers' later settlement is ignored).\n for (const id of [...this.hostToolCalls.keys()]) this.abortHostToolCall(id);\n // No response can arrive any more: fail the waiters now instead of at their timeout.\n for (const fail of [...this.pendingRequests.values()]) fail(new Error(\"omp process ended\"));\n this.pendingRequests.clear();\n this.quietRequestIds.clear();\n // The process that asked is gone; there is nobody to answer to.\n this.pendingQuestion = null;\n }\n}\n\n/**\n * `DriverTarget` wrapper for the omp driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const ompDriverTarget: DriverTarget<AgentConfig> = {\n id: \"omp\",\n displayName: BUILTIN_DRIVER_CATALOG.omp?.name ?? \"omp (oh-my-pi)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OmpDriver(config),\n listModels: async (registry, options) =>\n new OmpDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
|