@skaile/workspaces 6.11.0 → 6.13.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 +21 -0
- package/dist/app-sdk/index.js +47 -4
- package/dist/app-sdk/index.js.map +1 -1
- package/dist/app-sdk/src/app.d.ts.map +1 -1
- package/dist/app-sdk/src/define-app-capability.d.ts +48 -1
- package/dist/app-sdk/src/define-app-capability.d.ts.map +1 -1
- package/dist/app-sdk/src/index.d.ts +2 -2
- package/dist/app-sdk/src/index.d.ts.map +1 -1
- package/dist/app-sdk/src/transport.d.ts +13 -1
- package/dist/app-sdk/src/transport.d.ts.map +1 -1
- package/dist/{asset-feeds-PO2WC75V.js → asset-feeds-3USSYLBS.js} +6 -6
- package/dist/{asset-feeds-PO2WC75V.js.map → asset-feeds-3USSYLBS.js.map} +1 -1
- package/dist/asset-manager/index.js +1 -1
- package/dist/bridge/harnesses/claude-sdk.js +5 -5
- package/dist/bridge/harnesses/codex.js +3 -3
- package/dist/bridge/harnesses/continue.js +4 -4
- package/dist/bridge/harnesses/echo.js +4 -4
- package/dist/bridge/harnesses/gemini.js +5 -5
- package/dist/bridge/harnesses/goose.js +4 -4
- package/dist/bridge/harnesses/omp.js +34 -33
- package/dist/bridge/harnesses/omp.js.map +1 -1
- package/dist/bridge/harnesses/opencode.js +4 -4
- package/dist/bridge/harnesses/qwen.js +5 -5
- package/dist/bridge/index.js +9 -9
- package/dist/bridge/src/harnesses/omp.d.ts +2 -0
- package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
- package/dist/channels/adapters/msteams/activity.d.ts +2 -2
- package/dist/channels/adapters/msteams/activity.d.ts.map +1 -1
- package/dist/channels/adapters/msteams.js +21 -6
- package/dist/channels/adapters/msteams.js.map +1 -1
- package/dist/channels/index.js +175 -26
- package/dist/channels/index.js.map +1 -1
- package/dist/channels/src/context-batch.d.ts +63 -0
- package/dist/channels/src/context-batch.d.ts.map +1 -0
- package/dist/channels/src/egress/output-mirror.d.ts +7 -0
- package/dist/channels/src/egress/output-mirror.d.ts.map +1 -1
- package/dist/channels/src/engine.d.ts +21 -2
- package/dist/channels/src/engine.d.ts.map +1 -1
- package/dist/channels/src/index.d.ts +1 -0
- package/dist/channels/src/index.d.ts.map +1 -1
- package/dist/channels/src/ports.d.ts +9 -0
- package/dist/channels/src/ports.d.ts.map +1 -1
- package/dist/channels/src/types.d.ts +6 -0
- package/dist/channels/src/types.d.ts.map +1 -1
- package/dist/{chunk-5M3S6DLV.js → chunk-2LDLQWYI.js} +3 -3
- package/dist/{chunk-5M3S6DLV.js.map → chunk-2LDLQWYI.js.map} +1 -1
- package/dist/{chunk-RRKJHADP.js → chunk-42CN5YMX.js} +3 -3
- package/dist/{chunk-RRKJHADP.js.map → chunk-42CN5YMX.js.map} +1 -1
- package/dist/{chunk-DKRD6CZL.js → chunk-4CNJFSCM.js} +3 -3
- package/dist/{chunk-DKRD6CZL.js.map → chunk-4CNJFSCM.js.map} +1 -1
- package/dist/{chunk-WCHGUS7X.js → chunk-4QIVQAOP.js} +4 -4
- package/dist/{chunk-WCHGUS7X.js.map → chunk-4QIVQAOP.js.map} +1 -1
- package/dist/{chunk-L74W5TVC.js → chunk-6JAFK4ZU.js} +4 -4
- package/dist/{chunk-L74W5TVC.js.map → chunk-6JAFK4ZU.js.map} +1 -1
- package/dist/{chunk-CH6UVEM5.js → chunk-6M4BE42A.js} +7 -7
- package/dist/{chunk-CH6UVEM5.js.map → chunk-6M4BE42A.js.map} +1 -1
- package/dist/{chunk-WPTNYDDS.js → chunk-6OM5QDPA.js} +8 -5
- package/dist/chunk-6OM5QDPA.js.map +1 -0
- package/dist/{chunk-FVOQPTK2.js → chunk-7MISTEMW.js} +3 -3
- package/dist/{chunk-FVOQPTK2.js.map → chunk-7MISTEMW.js.map} +1 -1
- package/dist/{chunk-6NNXBXYI.js → chunk-DOG3YBRL.js} +3 -3
- package/dist/{chunk-6NNXBXYI.js.map → chunk-DOG3YBRL.js.map} +1 -1
- package/dist/{chunk-342UX2MG.js → chunk-DWPQBMCY.js} +2 -2
- package/dist/{chunk-342UX2MG.js.map → chunk-DWPQBMCY.js.map} +1 -1
- package/dist/{chunk-FO2GU5L7.js → chunk-DY52RNLI.js} +18 -17
- package/dist/chunk-DY52RNLI.js.map +1 -0
- package/dist/{chunk-YPX7LQSW.js → chunk-ERJOSW4V.js} +6 -6
- package/dist/{chunk-YPX7LQSW.js.map → chunk-ERJOSW4V.js.map} +1 -1
- package/dist/{chunk-IPCRQWNC.js → chunk-G2ZWIYZR.js} +3 -3
- package/dist/{chunk-IPCRQWNC.js.map → chunk-G2ZWIYZR.js.map} +1 -1
- package/dist/{chunk-7ZL23M3X.js → chunk-GJT2Q5XD.js} +3 -3
- package/dist/{chunk-7ZL23M3X.js.map → chunk-GJT2Q5XD.js.map} +1 -1
- package/dist/{chunk-PZS55HOX.js → chunk-GK5H52WR.js} +3 -3
- package/dist/{chunk-PZS55HOX.js.map → chunk-GK5H52WR.js.map} +1 -1
- package/dist/{chunk-CI4I34F4.js → chunk-GUKIUBMF.js} +4 -4
- package/dist/{chunk-CI4I34F4.js.map → chunk-GUKIUBMF.js.map} +1 -1
- package/dist/{chunk-RZQCBFIU.js → chunk-JPUKRWWS.js} +2 -2
- package/dist/{chunk-RZQCBFIU.js.map → chunk-JPUKRWWS.js.map} +1 -1
- package/dist/{chunk-S6NS3I3P.js → chunk-JTJYM3XT.js} +2 -2
- package/dist/{chunk-S6NS3I3P.js.map → chunk-JTJYM3XT.js.map} +1 -1
- package/dist/{chunk-GQQIMKEP.js → chunk-L4G7AAKM.js} +8 -8
- package/dist/{chunk-GQQIMKEP.js.map → chunk-L4G7AAKM.js.map} +1 -1
- package/dist/{chunk-IIELRGIZ.js → chunk-MPBLRRPK.js} +2 -2
- package/dist/{chunk-IIELRGIZ.js.map → chunk-MPBLRRPK.js.map} +1 -1
- package/dist/{chunk-GYRIO6RA.js → chunk-MVUXBWNW.js} +3 -3
- package/dist/{chunk-GYRIO6RA.js.map → chunk-MVUXBWNW.js.map} +1 -1
- package/dist/{chunk-7O6SCI7B.js → chunk-NGJAB5OS.js} +5 -5
- package/dist/{chunk-7O6SCI7B.js.map → chunk-NGJAB5OS.js.map} +1 -1
- package/dist/{chunk-5XYZNMMC.js → chunk-NJAE5DOC.js} +3 -3
- package/dist/{chunk-5XYZNMMC.js.map → chunk-NJAE5DOC.js.map} +1 -1
- package/dist/{chunk-4NJVF3DV.js → chunk-RFYL2HRA.js} +4 -4
- package/dist/{chunk-4NJVF3DV.js.map → chunk-RFYL2HRA.js.map} +1 -1
- package/dist/{chunk-UHTCOYFJ.js → chunk-RNQ26SKJ.js} +6 -6
- package/dist/{chunk-UHTCOYFJ.js.map → chunk-RNQ26SKJ.js.map} +1 -1
- package/dist/{chunk-FECB7RI7.js → chunk-SGCSP3GI.js} +5 -5
- package/dist/{chunk-FECB7RI7.js.map → chunk-SGCSP3GI.js.map} +1 -1
- package/dist/{chunk-MRTOKIEJ.js → chunk-T73IL57H.js} +3 -3
- package/dist/{chunk-MRTOKIEJ.js.map → chunk-T73IL57H.js.map} +1 -1
- package/dist/{chunk-ZRKU7BRI.js → chunk-U2JQ2EMW.js} +3 -3
- package/dist/{chunk-ZRKU7BRI.js.map → chunk-U2JQ2EMW.js.map} +1 -1
- package/dist/{chunk-GODUKPGD.js → chunk-UDH4KZ53.js} +3 -3
- package/dist/{chunk-GODUKPGD.js.map → chunk-UDH4KZ53.js.map} +1 -1
- package/dist/{chunk-F2IBDVBP.js → chunk-VHRGCLCR.js} +2 -2
- package/dist/{chunk-F2IBDVBP.js.map → chunk-VHRGCLCR.js.map} +1 -1
- package/dist/{chunk-SZ3XCZHC.js → chunk-WIZZUJ6R.js} +3 -3
- package/dist/{chunk-SZ3XCZHC.js.map → chunk-WIZZUJ6R.js.map} +1 -1
- package/dist/{chunk-LXD37LHF.js → chunk-XECD7XZT.js} +4 -4
- package/dist/{chunk-LXD37LHF.js.map → chunk-XECD7XZT.js.map} +1 -1
- package/dist/{chunk-45XL75RO.js → chunk-ZAU7IXIX.js} +9 -9
- package/dist/{chunk-45XL75RO.js.map → chunk-ZAU7IXIX.js.map} +1 -1
- package/dist/{chunk-CLMIZ4N6.js → chunk-ZCKZHOOU.js} +3 -3
- package/dist/{chunk-CLMIZ4N6.js.map → chunk-ZCKZHOOU.js.map} +1 -1
- package/dist/{claude-code-TDMSETH6.js → claude-code-IQHO7PGX.js} +4 -4
- package/dist/{claude-code-TDMSETH6.js.map → claude-code-IQHO7PGX.js.map} +1 -1
- package/dist/cli/index.js +54 -54
- package/dist/connectors/index.js +11 -11
- package/dist/{connectors-IUJRBTCW.js → connectors-S4W2HZ2J.js} +14 -14
- package/dist/{connectors-IUJRBTCW.js.map → connectors-S4W2HZ2J.js.map} +1 -1
- package/dist/connectors-shared/index.js +2 -2
- package/dist/{ensure-sources-Q2TTZVLX.js → ensure-sources-Z4PSTQE4.js} +13 -13
- package/dist/{ensure-sources-Q2TTZVLX.js.map → ensure-sources-Z4PSTQE4.js.map} +1 -1
- package/dist/factory-assets/connectors/box.js +11 -11
- package/dist/factory-assets/connectors/deploy.js +11 -11
- package/dist/factory-assets/connectors/devserver.js +11 -11
- package/dist/factory-assets/connectors/flow/adapter.js +11 -11
- package/dist/factory-assets/connectors/flow/run-flow.js +12 -12
- package/dist/factory-assets/connectors/flow.js +11 -11
- package/dist/factory-assets/connectors/git.js +11 -11
- package/dist/factory-assets/connectors/gmail.js +11 -11
- package/dist/factory-assets/connectors/googledrive.js +11 -11
- package/dist/factory-assets/connectors/local.js +11 -11
- package/dist/factory-assets/connectors/mattermost.js +11 -11
- package/dist/factory-assets/connectors/memory.js +11 -11
- package/dist/factory-assets/connectors/minio.js +11 -11
- package/dist/factory-assets/connectors/postgres.js +11 -11
- package/dist/factory-assets/connectors/s3.js +11 -11
- package/dist/factory-assets/connectors/sharepoint.js +11 -11
- package/dist/factory-assets/connectors/sqlite.js +11 -11
- package/dist/factory-assets/connectors/static-server.js +11 -11
- package/dist/factory-assets/connectors/tunnel.js +11 -11
- package/dist/factory-assets/connectors/webdav.js +11 -11
- package/dist/factory-assets/connectors/xstate-store.js +11 -11
- package/dist/factory-assets/connectors/xstate.js +11 -11
- package/dist/{helpers-S6AQGXRH.js → helpers-I537VC5V.js} +13 -13
- package/dist/{helpers-S6AQGXRH.js.map → helpers-I537VC5V.js.map} +1 -1
- package/dist/{library-publish-7U4TJNQX.js → library-publish-IS56MNSL.js} +26 -26
- package/dist/{library-publish-7U4TJNQX.js.map → library-publish-IS56MNSL.js.map} +1 -1
- package/dist/model-endpoint/index.js +3 -3
- package/dist/{open-library-K6O6OVW5.js → open-library-P7ESNVXK.js} +14 -14
- package/dist/{open-library-K6O6OVW5.js.map → open-library-P7ESNVXK.js.map} +1 -1
- package/dist/{project-ZWIZZIUT.js → project-XX4ZJ3IS.js} +22 -22
- package/dist/{project-ZWIZZIUT.js.map → project-XX4ZJ3IS.js.map} +1 -1
- package/dist/runner/index.js +17 -17
- package/dist/runner/src/capability-registry.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +1 -1
- package/dist/sdk/bridge.js +9 -9
- package/dist/sdk/index.js +17 -17
- package/dist/sdk/runner.js +17 -17
- package/dist/sdk/session.js +2 -2
- package/dist/sdk/types.js +1 -1
- package/dist/{serve-preflight-E3IEZTTF.js → serve-preflight-SHTST6WR.js} +15 -15
- package/dist/{serve-preflight-E3IEZTTF.js.map → serve-preflight-SHTST6WR.js.map} +1 -1
- package/dist/session/index.js +2 -2
- package/dist/{setup-V4EXOMVQ.js → setup-OBBZYSBG.js} +14 -14
- package/dist/{setup-V4EXOMVQ.js.map → setup-OBBZYSBG.js.map} +1 -1
- package/dist/{source-O7XXDX55.js → source-3STGEDUY.js} +24 -24
- package/dist/{source-O7XXDX55.js.map → source-3STGEDUY.js.map} +1 -1
- package/dist/{source-manifest-publish-GUU4LX2S.js → source-manifest-publish-EL5SCBGK.js} +26 -26
- package/dist/{source-manifest-publish-GUU4LX2S.js.map → source-manifest-publish-EL5SCBGK.js.map} +1 -1
- package/dist/tui/index.js +17 -17
- package/dist/types/index.js +1 -1
- package/dist/types/src/capabilities.d.ts +26 -0
- package/dist/types/src/capabilities.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +13 -13
- package/dist/workspace-plugin/adapters/omp.js +7 -7
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-FO2GU5L7.js.map +0 -1
- package/dist/chunk-WPTNYDDS.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../bridge/src/harnesses/_subprocess-cli.ts"],"names":[],"mappings":";;;;;;AA2CO,IAAe,oBAAA,GAAf,cAA4C,YAAA,CAAa;AAAA;AAAA,EAe3C,IAAA,GAA6B,OAAA;AAAA,EAEtC,MAAA;AAAA,EACO,QAAA;AAAA,EAET,IAAA,GAA4B,IAAA;AAAA,EAC5B,EAAA,GAAuB,IAAA;AAAA,EACvB,eAAyB,EAAC;AAAA,EAC1B,YAAA,GAAe,EAAA;AAAA,EACf,OAAA,GAAU,KAAA;AAAA;AAAA,EAGV,QAAA,GAAW,EAAA;AAAA,EACX,eAAA,GAAkB,KAAA;AAAA,EAClB,qBAAqC,EAAC;AAAA,EACtC,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAmC,IAAA;AAAA,EACnC,UAAA,GAA4C,IAAA;AAAA,EAE1C,UAAA;AAAA,EACA,WAAA,GAAiC,IAAA;AAAA,EAE3C,YAAY,MAAA,EAAqB;AAC/B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,iBAAA,CAAkB;AAAA,MACpC,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,SAAA,EAAW,CAAC,OAAA,KAAY,IAAA,CAAK,eAAe,OAAO;AAAA,KACpD,CAAA;AAAA,EACH;AAAA,EAEA,IAAa,gBAAA,GAAuC;AAClD,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAES,QAAA,GAA+B;AACtC,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACrB;AAAA,EAES,aAAA,GAAmC;AAC1C,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,YAAY,KAAA,EAAsD;AACzE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,eAAe,OAAA,EAAmC;AACrD,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,KAAS,IAAA,IAAQ,CAAC,KAAK,IAAA,CAAK,MAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,IAAI,IAAA,CAAK,MAAM,MAAM,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,yBAAA,CAA2B,CAAA;AAC7E,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,KAAK,KAAA,EAAM;AAEpC,IAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,qBAAqB,EAAC;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,eAAe,EAAC;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAEnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAC3C,IAAA,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,WAAA,CAAa,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,SAAS,CAAA,eAAA,CAAiB,IACzD,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAA,CAAK,SAAS,iBAAiB,CAAA,CAAa,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACvF,EAAC;AACL,IAAA,MAAM,GAAA,GAAM,eAAe,IAAA,CAAK,UAAA;AAChC,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,OAAA,EAAS,GAAG,KAAK,SAAA,CAAU,QAAA,EAAU,IAAA,CAAK,UAAU,CAAC,CAAA;AACtE,IAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAE1B,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,cAAA,EAAgB;AAAA,QAC5B,GAAA;AAAA,QACA,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU;AAAA,OAChC,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,IAAA,EAAM,kBAAkB,CAAA;AAC7D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,OAAO,IAAA,EAAM;AAAA,QAC9C,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,QACjB,GAAA;AAAA,QACA,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,OACjC,CAAA;AACD,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,MAAM,WAAA,GAAc,IAAA;AAEpB,MAAA,WAAA,CAAY,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AACtC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,GAA4B,CAAA;AACrE,QAAA,IAAA,CAAK,IAAI,KAAA,CAAM,aAAA,EAAe,GAAA,EAAK,EAAE,QAAQ,CAAA;AAE7C,QAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAI,CAAA;AAC3B,QAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,IAAA,EAAM,aAAkC,CAAA;AACnE,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,MACxE,CAAC,CAAA;AAED,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,UAAA,MAAM,KAAK,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AACjD,UAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,UAAC,EAAA,CAA+B,GAAG,MAAA,EAAQ,CAAC,SAAiB,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,QACtF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,CAAA;AAC9B,UAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACxC,YAAA,IAAA,CAAK,YAAA,IAAgB,KAAA;AAAA,UACvB,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,MAAM,WAAW,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA;AACvD,QAAC,QAAA,CAAqC,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACjE,UAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,EAAE,MAAM,CAAA;AACjC,UAAA,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AAC3B,UAAA,IAAI,KAAK,YAAA,CAAa,MAAA,GAAS,EAAA,EAAI,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,QAC7D,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,WAAA,CAAY,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAqB,MAAA,KAAkC;AAC7E,QAAA,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,EAAc,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC5C,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,IAAA,EAAM,KAAK,SAAS,CAAA;AAAA,EAC3B;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,IAAA,EAAM,KAAK,SAAS,CAAA;AACzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,MAAM,YAAA,GAA8B;AAClC,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA,EAWU,WAAW,KAAA,EAAsB;AAAA,EAAC;AAAA;AAAA,EAGlC,eAAe,IAAA,EAAoB;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUpC,YAAA,CAAa,MAAqB,MAAA,EAAkD;AAC5F,IAAA,IAAI,SAAS,CAAA,IAAM,IAAA,KAAS,IAAA,IAAQ,MAAA,KAAW,MAAO,OAAO,IAAA;AAC7D,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACnD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,kBAAA,EAAqB,IAAA,IAAQ,MAAM,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MACzF,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM,IAAA,IAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,WAAW,CAAA,mDAAA;AAAA,KACvC;AAAA,EACF;AAAA;AAAA;AAAA,EAKU,cAAc,OAAA,EAAyB;AAC/C,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG,IAAA,CAAK,OAAO,YAAY;;AAAA;;AAAA,EAAc,OAAO,CAAA,CAAA,GAAK,OAAA;AAAA,EACzF;AAAA,EAEU,mBAAmB,QAAA,EAAwB;AACnD,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAChB,MAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,QACvB,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,YAAY,EAAE;AAAA,OACH,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,GAC3C,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GACnC,QAAA;AACJ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,QACvB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,QAC7B,UAAA,EAAY;AAAA,OACQ,CAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEU,iBAAiB,QAAA,EAAyB;AAClD,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,MAAM,IAAA,GAAO,YAAY,IAAA,CAAK,QAAA;AAC9B,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,YAAY,IAAI;AAAA,KACL,CAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,QAAA,GAAW,EAAA;AAAA,EAClB;AAAA,EAEU,YAAA,CAAa,MAAc,KAAA,EAAsB;AACzD,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,MACb;AAAA,KACoB,CAAA;AAAA,EACxB;AAAA,EAEU,cAAA,CAAe,IAAA,EAAc,IAAA,EAAe,OAAA,GAAU,KAAA,EAAa;AAC3E,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,CAAA;AACzF,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,oBAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACU,CAAA;AAAA,EACxB;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EAAa,CAAC,GAAG,IAAA,CAAK,kBAAkB;AAAA,KACpB,CAAA;AACtB,IAAA,IAAA,CAAK,qBAAqB,EAAC;AAAA,EAC7B;AAAA,EAEU,WAAW,IAAA,EAKZ;AACP,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,MAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,KAAK,OAAA,IAAW,SAAA;AAAA,MACzB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAA,EAAS,KAAK,OAAA,IAAW,CAAA;AAAA,MACzB,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,KACzB,CAAA;AAAA,EACxB;AAAA,EAEU,SAAA,CAAU,MAAA,EAAoB,KAAA,GAAQ,KAAA,EAAa;AAC3D,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,MAAA,CAAO,OAAA;AAAA,MACd,MAAA;AAAA,MACA;AAAA,KACoB,CAAA;AAAA,EACxB;AAAA,EAEU,cAAA,CAAe,IAAa,IAAA,EAAqB;AACzD,IAAA,IAAI,CAAC,EAAA,IAAM,EAAA,KAAO,IAAA,CAAK,UAAA,EAAY;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,EAAA;AAClB,IAAA,IAAA,CAAK,KAAK,aAAA,EAAe;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,gBAAA,EAAkB,EAAA;AAAA,MAClB,GAAI,IAAA,GAAO,EAAE,WAAA,EAAa,IAAA,KAAS;AAAC,KAChB,CAAA;AAAA,EACxB;AAAA;AAAA,EAGU,gBAAgB,OAAA,EAA6B;AACrD,IAAA,MAAM,OAAA,GAAU,4BAA4B,OAAO,CAAA;AACnD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,IAAA;AAAA,QACX,IAAA,EAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,WAAW,CAAA,sCAAA;AAAA,OACzC;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GACJ,QAAQ,QAAA,KAAa,MAAA,GACjB,4CAA4C,IAAA,CAAK,WAAW,MAC5D,OAAA,CAAQ,QAAA,KAAa,eACnB,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,wDAAA,CAAA,GACnB,OAAA,CAAQ,aAAa,OAAA,GACnB,wGAAA,GACA,CAAA,0CAAA,EAA6C,IAAA,CAAK,WAAW,CAAA,CAAA,CAAA;AACvE,IAAA,OAAO,EAAE,SAAS,QAAA,EAAU,OAAA,CAAQ,UAAU,SAAA,EAAW,OAAA,CAAQ,WAAW,IAAA,EAAK;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBU,OAAA,CAAQ,SAAA,GAAsB,EAAC,EAA2B;AAClE,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAA;AAAA,MACA,GAAG,qBAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACzB,MAAA,IAAI,CAAA,KAAM,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA;AAAA,IAClC;AACA,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtD,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC/B,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9E,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AAC1B,MAAA,GAAA,CAAI,eAAA,GAAkB,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,qCAAA,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,IAAA,CAAK,OAAO,GAAA,EAAK,MAAA,CAAO,OAAO,GAAA,EAAK,IAAA,CAAK,OAAO,GAAG,CAAA;AACvD,IAAA,OAAO,sBAAsB,GAAG,CAAA;AAAA,EAClC;AAAA;AAAA,EAIQ,aAAa,IAAA,EAAoB;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,sBAAA,EAAwB,EAAE,MAAM,CAAA;AAC/C,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,IACtB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,kBAAA,EAAoB,EAAE,OAAO,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,MAAA,CAAO,MAAqB,MAAA,EAAqC;AACvE,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,IAAA,EAAM,aAAkC,CAAA;AACnE,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,IAAA,KAAS,UAAA,KAAe,IAAA,KAAS,CAAA,IAAK,SAAS,IAAA,CAAA,EAAO;AAC7D,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,YAAY,CAAA;AAAA,MACvC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,GAAA,CAAI,KAAK,sBAAA,EAAwB,EAAE,OAAO,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAC9C,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,CAAK,SAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,SAAA,CAAU,SAAS,IAAI,CAAA;AAC5B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,IAAA,EAAM,aAAkC,CAAA;AACnE,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA;AAChF,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,kBAAkB,CAAA;AAAA,SAC7D;AACH,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,EAAE,IAAA,EAAM,aAAkC,CAAA;AACnE,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,MAAM,UAAU,IAAA,CAAK,WAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAA,IAAU;AAAA,EACZ;AAAA,EAEQ,aAAa,GAAA,EAAkB;AACrC,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,MAAA,GAAS,GAAG,CAAA;AAAA,EACd;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,qBAAqB,GAAA,EAAwC;AACnE,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,kBAAA,CAAA;AAAA,QAC3B,QAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,KAAA;AAAA,QACX,IAAA,EAAM,KAAK,WAAA;AAAY,OACzB;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAA,0BAAA,EAA6B,IAAA,CAAK,UAAU,CAAA,CAAA;AAAA,QACrD,QAAA,EAAU,QAAA;AAAA,QACV,SAAA,EAAW,KAAA;AAAA,QACX,IAAA,EAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,UAAU,CAAA,QAAA;AAAA,OACzD;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,IAAA,EAAM,CAAA,6CAAA,EAAgD,IAAA,CAAK,WAAW,CAAA,YAAA;AAAA,KACxE;AAAA,EACF;AACF;AAOA,SAAS,YAAY,IAAA,EAA4B;AAC/C,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAE;AAChE;AAGO,SAAS,YAAY,IAAA,EAAmB;AAC7C,EAAA,IAAI,OAAO,IAAA,EAAM,IAAA,KAAS,QAAA,SAAiB,IAAA,CAAK,IAAA;AAChD,EAAA,IAAI,OAAO,IAAA,EAAM,KAAA,KAAU,QAAA,SAAiB,IAAA,CAAK,KAAA;AACjD,EAAA,IAAI,OAAO,IAAA,EAAM,OAAA,KAAY,QAAA,SAAiB,IAAA,CAAK,OAAA;AACnD,EAAA,IAAI,OAAO,IAAA,EAAM,QAAA,KAAa,QAAA,SAAiB,IAAA,CAAK,QAAA;AACpD,EAAA,MAAM,MAAM,IAAA,EAAM,OAAA;AAClB,EAAA,IAAI,OAAO,GAAA,EAAK,OAAA,KAAY,QAAA,SAAiB,GAAA,CAAI,OAAA;AACjD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,IAAI,OAAA,CACR,MAAA;AAAA,MACC,CAAC,CAAA,KAAA,CAAY,CAAA,EAAG,IAAA,KAAS,MAAA,IAAU,GAAG,IAAA,KAAS,MAAA,KAAc,OAAO,CAAA,EAAG,IAAA,KAAS;AAAA,KAClF,CACC,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CACtB,KAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,EAAG;AAC9B,IAAA,OAAO,KAAK,KAAA,CACT,MAAA,CAAO,CAAC,CAAA,KAAW,OAAO,CAAA,EAAG,IAAA,KAAS,QAAQ,CAAA,CAC9C,IAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CACtB,KAAK,EAAE,CAAA;AAAA,EACZ;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM,IAAA,EAAM,SAAS,QAAA,EAAU,OAAO,KAAK,IAAA,CAAK,IAAA;AAC3D,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,cAAc,IAAA,EAA8B;AAC1D,EAAA,MAAM,CAAA,GAAI,MAAM,KAAA,IAAS,IAAA,EAAM,OAAO,KAAA,IAAS,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,MAAA,IAAU,IAAA;AAC9E,EAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,IAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,EAAE,YAAA,IAAgB,CAAA,CAAE,eAAe,CAAA,CAAE,aAAA,IAAiB,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE,KAAA;AAC5F,EAAA,MAAM,MAAA,GACJ,EAAE,aAAA,IAAiB,CAAA,CAAE,gBAAgB,CAAA,CAAE,iBAAA,IAAqB,CAAA,CAAE,oBAAA,IAAwB,CAAA,CAAE,MAAA;AAC1F,EAAA,MAAM,SAAA,GAAY,CAAA,CAAE,mBAAA,IAAuB,CAAA,CAAE,mBAAmB,CAAA,CAAE,uBAAA;AAClE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW,OAAO,IAAA;AACxD,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,MAAA,CAAO,WAAA,GAAc,KAAA;AACpD,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,MAAA,CAAO,YAAA,GAAe,MAAA;AACtD,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,EAAU,MAAA,CAAO,eAAA,GAAkB,SAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,YAAY,IAAA,EAA+B;AACzD,EAAA,MAAM,CAAA,GACJ,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,OAAA,IAAW,IAAA,EAAM,cAAA,IAAkB,IAAA,EAAM,KAAA,EAAO,IAAA,IAAQ,IAAA,EAAM,KAAA,EAAO,IAAA;AAC3F,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AACrC","file":"chunk-GODUKPGD.js","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport { resolveAgentExec, wrapAgentCommand } from \"../agent-exec.js\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { ReconfigureLedger } from \"../reconfigure-ledger.js\";\nimport { RUNNER_AGENT_ENV_KEYS, stripRunnerPrivateEnv } from \"../runner-private-env.js\";\nimport {\n type AgentConfig,\n AgentHarness,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type ReconfigureApplied,\n type ReconfigureOutcome,\n type ReconfigurePatch,\n} from \"../types.js\";\n\n/**\n * Shared base for one-shot **subprocess CLI** agent harnesses (Gemini, Qwen,\n * OpenCode, Goose, Continue).\n *\n * These harnesses are neither persistent JSON-RPC subprocesses (`omp`) nor\n * in-process SDKs (`claude-sdk`, `codex`). In headless mode each is invoked\n * **once per turn** — `prompt()` spawns the CLI fresh, a `readline` loop maps\n * newline-delimited JSON on stdout to the unified {@link AgentEvent} stream, and\n * **process exit marks the end of the turn**. Multi-turn continuity comes from\n * capturing a harness session id (emitted as `session_info`) and replaying it\n * via a resume flag on the next spawn.\n *\n * Subclasses implement {@link buildArgs}, {@link buildEnv}, and either\n * {@link handleJson} (streaming JSONL, the default) or {@link handleBuffered}\n * (`mode = \"buffered\"`, for CLIs that print a single JSON blob at the end).\n *\n * **Terminal-sequence invariant.** Subclasses MUST NOT emit `agent_end`. The\n * base emits exactly one `result` (synthesizing a success result when the\n * stream produced none) followed by a single `agent_end` on clean exit, or an\n * `error` + `agent_end` on crash. This keeps the turn-completion contract\n * (`prompt()` resolves after `agent_end`) identical across every CLI harness.\n *\n * @docLink packages/bridge/harnesses#subprocess-cli\n */\nexport abstract class SubprocessCliHarness extends AgentHarness {\n /** Per-harness logger, constructed once by the subclass. */\n protected abstract readonly log: Logger;\n /** Default binary name spawned in production (e.g. `\"gemini\"`). */\n protected abstract readonly defaultBin: string;\n /** Human product name used in error messages / hints (e.g. `\"Gemini CLI\"`). */\n protected abstract readonly productName: string;\n /**\n * Test-seam env prefix. `<PREFIX>_BRIDGE_BIN` overrides the spawn binary and\n * `<PREFIX>_BRIDGE_PREARGS` (space-delimited) supplies leading argv — used by\n * the fake-CLI harness to redirect spawn without monkey-patching\n * `child_process`. Both are ignored in production.\n */\n protected abstract readonly envPrefix: string;\n /** `\"jsonl\"` streams events line-by-line; `\"buffered\"` parses all stdout once on exit. */\n protected readonly mode: \"jsonl\" | \"buffered\" = \"jsonl\";\n\n protected config: AgentConfig;\n private readonly reconfig: ReconfigureLedger;\n\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private stderrBuffer: string[] = [];\n private stdoutBuffer = \"\";\n private started = false;\n\n // ── Per-turn state ──────────────────────────────────────────────────────\n private prevText = \"\";\n private activeAssistant = false;\n private pendingToolResults: AgentMessage[] = [];\n private sawResult = false;\n private aborting = false;\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n\n protected _sessionId?: string;\n protected _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n this.reconfig = new ReconfigureLedger({\n config: () => this.config,\n onDesired: (applied) => this.onReconfigured(applied),\n });\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._sessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * A one-shot CLI has no resident process: a patch is stored and the next\n * spawn reads it. The ledger scopes the model and writes the config.\n */\n override reconfigure(patch: ReconfigurePatch): Promise<ReconfigureOutcome> {\n return this.reconfig.reconfigure(patch);\n }\n\n /**\n * A patch was stored in {@link config}. Subclasses that cache something derived\n * from the model (rendered provider files, bindings) invalidate it here.\n */\n protected onReconfigured(applied: ReconfigureApplied): void {\n void applied;\n }\n\n /**\n * No-op for one-shot CLIs — there is no long-lived process to spawn until the\n * first prompt. Kept so the runner's `start()` → `prompt()` ordering works\n * uniformly; binary-presence failures surface as a `config` error on the\n * first spawn (see {@link classifyProcessError}).\n */\n async start(): Promise<void> {\n this.started = true;\n }\n\n get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends a user message to the CLI and resolves after the turn completes\n * (`agent_end`). Spawns a fresh child per call; rejects if the child exits\n * non-zero before emitting a result, so the caller never hangs.\n */\n async prompt(message: string): Promise<void> {\n if (this.proc) throw new Error(`${this.productName} turn already in progress`);\n if (!this.started) await this.start();\n\n this.prevText = \"\";\n this.activeAssistant = false;\n this.pendingToolResults = [];\n this.sawResult = false;\n this.aborting = false;\n this.stderrBuffer = [];\n this.stdoutBuffer = \"\";\n this._lastTokens = null;\n\n const composed = this.composePrompt(message);\n const overrideBin = process.env[`${this.envPrefix}_BRIDGE_BIN`];\n const preArgs = process.env[`${this.envPrefix}_BRIDGE_PREARGS`]\n ? (process.env[`${this.envPrefix}_BRIDGE_PREARGS`] as string).split(/\\s+/).filter(Boolean)\n : [];\n const bin = overrideBin || this.defaultBin;\n const args = [...preArgs, ...this.buildArgs(composed, this._sessionId)];\n const env = this.buildEnv();\n\n return new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n this.log.info(\"spawning CLI\", {\n bin,\n cwd: this.config.cwd,\n resume: Boolean(this._sessionId),\n });\n\n // With the uid split on, the CLI runs as the agent uid through the launch shim.\n const target = wrapAgentCommand(bin, args, resolveAgentExec());\n const proc = spawn(target.command, target.args, {\n cwd: this.config.cwd,\n env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"spawn error\", err, { detail });\n // Fatal: the turn did not run, so the host gets one fatal error, then finished, then idle.\n this.pushError(detail, true);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(detail.message), { detail }));\n });\n\n if (proc.stdout) {\n if (this.mode === \"jsonl\") {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => this.onStdoutLine(line));\n } else {\n proc.stdout.setEncoding(\"utf8\");\n proc.stdout.on(\"data\", (chunk: string) => {\n this.stdoutBuffer += chunk;\n });\n }\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.debug(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"CLI exited\", { code, signal });\n this.onExit(code, signal);\n });\n });\n }\n\n /** Out-of-band abort: terminates the current child. Harness stays usable for the next prompt. */\n async abort(): Promise<void> {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n }\n\n kill(): void {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n this.cleanup();\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this._sessionId = undefined;\n this._lastTokens = null;\n }\n\n // ── Subclass hooks ────────────────────────────────────────────────────────\n\n /** Build the CLI argv (binary excluded) for one turn. `resumeId` is the captured session id, if any. */\n protected abstract buildArgs(message: string, resumeId: string | undefined): string[];\n\n /** Build the child-process env (explicit allowlist — see {@link baseEnv}). */\n protected abstract buildEnv(): Record<string, string>;\n\n /** Map one parsed stdout JSON object to events via the `push*` helpers. Streaming (`jsonl`) mode only. */\n protected handleJson(_json: unknown): void {}\n\n /** Parse the full stdout blob once on clean exit. `buffered` mode only. */\n protected handleBuffered(_raw: string): void {}\n\n /** Install-failure hint surfaced when the binary is missing. */\n protected abstract installHint(): string;\n\n /**\n * Classify a non-zero exit into an {@link AgentError}, or `null` to treat the\n * exit as success (e.g. a turn-limit code where a result was already\n * emitted). Default: code `0` / clean signal → success; otherwise `process`.\n */\n protected classifyExit(code: number | null, signal: NodeJS.Signals | null): AgentError | null {\n if (code === 0 || (code === null && signal === null)) return null;\n const tail = this.stderrBuffer.slice(-10).join(\"\\n\");\n return {\n message: `${this.productName} exited with code ${code ?? \"null\"}${tail ? `: ${tail}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint: tail || `The ${this.productName} process exited unexpectedly. Try the prompt again.`,\n };\n }\n\n // ── Protected emit helpers (used by handleJson / handleBuffered) ────────────\n\n /** Prepend `systemPrompt` to the user message — uniform across CLIs lacking a reliable system flag. */\n protected composePrompt(message: string): string {\n return this.config.systemPrompt ? `${this.config.systemPrompt}\\n\\n---\\n\\n${message}` : message;\n }\n\n protected pushAssistantDelta(fullText: string): void {\n if (!this.activeAssistant) {\n this.activeAssistant = true;\n this.prevText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: asstMessage(\"\"),\n } satisfies AgentEvent);\n }\n const delta = fullText.startsWith(this.prevText)\n ? fullText.slice(this.prevText.length)\n : fullText;\n this.prevText = fullText;\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: asstMessage(fullText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n }\n\n protected pushAssistantEnd(fullText?: string): void {\n if (!this.activeAssistant) return;\n const text = fullText ?? this.prevText;\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: asstMessage(text),\n } satisfies AgentEvent);\n this.activeAssistant = false;\n this.prevText = \"\";\n }\n\n protected pushToolCall(name: string, input: unknown): void {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name,\n tool: { name },\n input,\n } satisfies AgentEvent);\n }\n\n protected pushToolResult(name: string, data: unknown, isError = false): void {\n this.pendingToolResults.push({ role: \"tool\", toolName: name, content: \"\", data, isError });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: name,\n } satisfies AgentEvent);\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n protected pushResult(opts: {\n tokens?: TokenUsage | null;\n costUsd?: number;\n summary?: string;\n subtype?: string;\n }): void {\n this.pushAssistantEnd();\n this.flushToolResults();\n if (opts.tokens) this._lastTokens = opts.tokens;\n this.sawResult = true;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: opts.subtype ?? \"success\",\n summary: opts.summary,\n costUsd: opts.costUsd ?? 0,\n ...(opts.tokens ? { tokens: opts.tokens } : {}),\n } satisfies AgentEvent);\n }\n\n protected pushError(detail: AgentError, fatal = false): void {\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n fatal,\n } satisfies AgentEvent);\n }\n\n protected captureSession(id?: string, file?: string): void {\n if (!id || id === this._sessionId) return;\n this._sessionId = id;\n this.emit(\"agent-event\", {\n type: \"session_info\",\n harnessSessionId: id,\n ...(file ? { sessionFile: file } : {}),\n } satisfies AgentEvent);\n }\n\n /** Shared keyword classification + per-harness hint copy (mirrors omp/codex). */\n protected classifyMessage(message: string): AgentError {\n const generic = classifyGenericErrorMessage(message);\n if (!generic) {\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: `An unexpected ${this.productName} error occurred. Try the prompt again.`,\n };\n }\n const hint =\n generic.category === \"auth\"\n ? `Check the API key / login configured for ${this.productName}.`\n : generic.category === \"rate_limit\"\n ? `${this.productName} hit a provider rate limit. Wait a moment and try again.`\n : generic.category === \"model\"\n ? \"The selected model is unavailable or the context is too long. Change the model or start a new session.\"\n : `A network error occurred while talking to ${this.productName}.`;\n return { message, category: generic.category, retryable: generic.retryable, hint };\n }\n\n // ── Env allowlist ──────────────────────────────────────────────────────────\n\n /**\n * Explicit env whitelist forwarded to the child. Omits anything provisioned\n * by `provision_secrets` so user credentials stay out of the subprocess\n * environment. Always passes through the harness's test-seam vars and\n * `FAKE_CLI_*`.\n *\n * `config.env` is merged **over** the whitelist, not in place of it. It used\n * to replace it wholesale, which meant any caller that set a single variable\n * silently dropped `PATH` and `HOME` and the spawn failed with ENOENT —\n * unusable as the delivery channel for registry-derived endpoint variables\n * (plan §2.3, \"Delivery rule\"). Widening keeps both: the caller's variables\n * win per key, the process still has a `PATH`.\n */\n protected baseEnv(extraKeys: string[] = []): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ...RUNNER_AGENT_ENV_KEYS,\n ...extraKeys,\n ];\n for (const key of explicit) {\n const v = process.env[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(`${this.envPrefix}_BRIDGE_`) || key.startsWith(\"FAKE_CLI_\")) {\n out[key] = value;\n }\n }\n if (this.config.sshKeyPath) {\n out.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n if (this.config.env) Object.assign(out, this.config.env);\n return stripRunnerPrivateEnv(out);\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private onStdoutLine(line: string): void {\n if (!line.trim()) return;\n let json: unknown;\n try {\n json = JSON.parse(line);\n } catch {\n this.log.debug(\"non-JSON stdout line\", { line });\n return;\n }\n try {\n this.handleJson(json);\n } catch (err) {\n this.log.warn(\"handleJson threw\", { error: String(err) });\n }\n }\n\n private onExit(code: number | null, signal: NodeJS.Signals | null): void {\n this.cleanup();\n\n if (this.aborting) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n return;\n }\n\n if (this.mode === \"buffered\" && (code === 0 || code === null)) {\n try {\n this.handleBuffered(this.stdoutBuffer);\n } catch (err) {\n this.log.warn(\"handleBuffered threw\", { error: String(err) });\n }\n }\n\n const exitErr = this.classifyExit(code, signal);\n if (exitErr && !this.sawResult) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.pushError(exitErr, true);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(exitErr.message), { detail: exitErr }));\n return;\n }\n\n // Clean exit (or non-zero exit after a result already streamed): close any\n // open assistant message, synthesize a success result if none arrived, end.\n if (!this.sawResult) this.pushResult({ summary: \"Task completed\" });\n else {\n this.pushAssistantEnd();\n this.flushToolResults();\n }\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n }\n\n private settleResolve(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n private settleReject(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: `${this.defaultBin} command not found`,\n category: \"config\",\n retryable: false,\n hint: this.installHint(),\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: `Permission denied running ${this.defaultBin}`,\n category: \"config\",\n retryable: false,\n hint: `Check file permissions for the ${this.defaultBin} binary.`,\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: `An unexpected process error occurred running ${this.productName}. Try again.`,\n };\n }\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Tolerant JSON extractors — shared because the upstream stream-json schemas\n// are not fully pinned; read the common field-name variants defensively.\n// ───────────────────────────────────────────────────────────────────────────\n\nfunction asstMessage(text: string): AgentMessage {\n return { role: \"assistant\", content: [{ type: \"text\", text }] };\n}\n\n/** Pull assistant text out of a CLI event, trying the common field names. */\nexport function extractText(json: any): string {\n if (typeof json?.text === \"string\") return json.text;\n if (typeof json?.delta === \"string\") return json.delta;\n if (typeof json?.content === \"string\") return json.content;\n if (typeof json?.response === \"string\") return json.response;\n const msg = json?.message;\n if (typeof msg?.content === \"string\") return msg.content;\n if (Array.isArray(msg?.content)) {\n return msg.content\n .filter(\n (b: any) => (b?.type === \"text\" || b?.type === undefined) && typeof b?.text === \"string\",\n )\n .map((b: any) => b.text)\n .join(\"\");\n }\n if (Array.isArray(json?.parts)) {\n return json.parts\n .filter((p: any) => typeof p?.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\");\n }\n // OpenCode (`run --format json`) nests the payload under `part`.\n if (typeof json?.part?.text === \"string\") return json.part.text;\n return \"\";\n}\n\n/** Map a CLI usage/stats object onto {@link TokenUsage}, trying common field names. */\nexport function extractTokens(json: any): TokenUsage | null {\n const u = json?.usage ?? json?.stats?.usage ?? json?.stats ?? json?.tokens ?? json;\n if (!u || typeof u !== \"object\") return null;\n const input = u.input_tokens ?? u.inputTokens ?? u.prompt_tokens ?? u.promptTokenCount ?? u.input;\n const output =\n u.output_tokens ?? u.outputTokens ?? u.completion_tokens ?? u.candidatesTokenCount ?? u.output;\n const cacheRead = u.cached_input_tokens ?? u.cacheReadTokens ?? u.cachedContentTokenCount;\n if (input === undefined && output === undefined) return null;\n const tokens: TokenUsage = {};\n if (typeof input === \"number\") tokens.inputTokens = input;\n if (typeof output === \"number\") tokens.outputTokens = output;\n if (typeof cacheRead === \"number\") tokens.cacheReadTokens = cacheRead;\n return tokens;\n}\n\n/** Pull a per-turn USD cost from a CLI result object, or `undefined`. */\nexport function extractCost(json: any): number | undefined {\n const c =\n json?.cost ?? json?.costUsd ?? json?.total_cost_usd ?? json?.stats?.cost ?? json?.usage?.cost;\n return typeof c === \"number\" ? c : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../bridge/src/harnesses/_subprocess-cli.ts"],"names":[],"mappings":"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","file":"chunk-UDH4KZ53.js","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport { resolveAgentExec, wrapAgentCommand } from \"../agent-exec.js\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\nimport { ReconfigureLedger } from \"../reconfigure-ledger.js\";\nimport { RUNNER_AGENT_ENV_KEYS, stripRunnerPrivateEnv } from \"../runner-private-env.js\";\nimport {\n type AgentConfig,\n AgentHarness,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type ReconfigureApplied,\n type ReconfigureOutcome,\n type ReconfigurePatch,\n} from \"../types.js\";\n\n/**\n * Shared base for one-shot **subprocess CLI** agent harnesses (Gemini, Qwen,\n * OpenCode, Goose, Continue).\n *\n * These harnesses are neither persistent JSON-RPC subprocesses (`omp`) nor\n * in-process SDKs (`claude-sdk`, `codex`). In headless mode each is invoked\n * **once per turn** — `prompt()` spawns the CLI fresh, a `readline` loop maps\n * newline-delimited JSON on stdout to the unified {@link AgentEvent} stream, and\n * **process exit marks the end of the turn**. Multi-turn continuity comes from\n * capturing a harness session id (emitted as `session_info`) and replaying it\n * via a resume flag on the next spawn.\n *\n * Subclasses implement {@link buildArgs}, {@link buildEnv}, and either\n * {@link handleJson} (streaming JSONL, the default) or {@link handleBuffered}\n * (`mode = \"buffered\"`, for CLIs that print a single JSON blob at the end).\n *\n * **Terminal-sequence invariant.** Subclasses MUST NOT emit `agent_end`. The\n * base emits exactly one `result` (synthesizing a success result when the\n * stream produced none) followed by a single `agent_end` on clean exit, or an\n * `error` + `agent_end` on crash. This keeps the turn-completion contract\n * (`prompt()` resolves after `agent_end`) identical across every CLI harness.\n *\n * @docLink packages/bridge/harnesses#subprocess-cli\n */\nexport abstract class SubprocessCliHarness extends AgentHarness {\n /** Per-harness logger, constructed once by the subclass. */\n protected abstract readonly log: Logger;\n /** Default binary name spawned in production (e.g. `\"gemini\"`). */\n protected abstract readonly defaultBin: string;\n /** Human product name used in error messages / hints (e.g. `\"Gemini CLI\"`). */\n protected abstract readonly productName: string;\n /**\n * Test-seam env prefix. `<PREFIX>_BRIDGE_BIN` overrides the spawn binary and\n * `<PREFIX>_BRIDGE_PREARGS` (space-delimited) supplies leading argv — used by\n * the fake-CLI harness to redirect spawn without monkey-patching\n * `child_process`. Both are ignored in production.\n */\n protected abstract readonly envPrefix: string;\n /** `\"jsonl\"` streams events line-by-line; `\"buffered\"` parses all stdout once on exit. */\n protected readonly mode: \"jsonl\" | \"buffered\" = \"jsonl\";\n\n protected config: AgentConfig;\n private readonly reconfig: ReconfigureLedger;\n\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private stderrBuffer: string[] = [];\n private stdoutBuffer = \"\";\n private started = false;\n\n // ── Per-turn state ──────────────────────────────────────────────────────\n private prevText = \"\";\n private activeAssistant = false;\n private pendingToolResults: AgentMessage[] = [];\n private sawResult = false;\n private aborting = false;\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\n\n protected _sessionId?: string;\n protected _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n this.reconfig = new ReconfigureLedger({\n config: () => this.config,\n onDesired: (applied) => this.onReconfigured(applied),\n });\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._sessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * A one-shot CLI has no resident process: a patch is stored and the next\n * spawn reads it. The ledger scopes the model and writes the config.\n */\n override reconfigure(patch: ReconfigurePatch): Promise<ReconfigureOutcome> {\n return this.reconfig.reconfigure(patch);\n }\n\n /**\n * A patch was stored in {@link config}. Subclasses that cache something derived\n * from the model (rendered provider files, bindings) invalidate it here.\n */\n protected onReconfigured(applied: ReconfigureApplied): void {\n void applied;\n }\n\n /**\n * No-op for one-shot CLIs — there is no long-lived process to spawn until the\n * first prompt. Kept so the runner's `start()` → `prompt()` ordering works\n * uniformly; binary-presence failures surface as a `config` error on the\n * first spawn (see {@link classifyProcessError}).\n */\n async start(): Promise<void> {\n this.started = true;\n }\n\n get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends a user message to the CLI and resolves after the turn completes\n * (`agent_end`). Spawns a fresh child per call; rejects if the child exits\n * non-zero before emitting a result, so the caller never hangs.\n */\n async prompt(message: string): Promise<void> {\n if (this.proc) throw new Error(`${this.productName} turn already in progress`);\n if (!this.started) await this.start();\n\n this.prevText = \"\";\n this.activeAssistant = false;\n this.pendingToolResults = [];\n this.sawResult = false;\n this.aborting = false;\n this.stderrBuffer = [];\n this.stdoutBuffer = \"\";\n this._lastTokens = null;\n\n const composed = this.composePrompt(message);\n const overrideBin = process.env[`${this.envPrefix}_BRIDGE_BIN`];\n const preArgs = process.env[`${this.envPrefix}_BRIDGE_PREARGS`]\n ? (process.env[`${this.envPrefix}_BRIDGE_PREARGS`] as string).split(/\\s+/).filter(Boolean)\n : [];\n const bin = overrideBin || this.defaultBin;\n const args = [...preArgs, ...this.buildArgs(composed, this._sessionId)];\n const env = this.buildEnv();\n\n return new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n this.log.info(\"spawning CLI\", {\n bin,\n cwd: this.config.cwd,\n resume: Boolean(this._sessionId),\n });\n\n // With the uid split on, the CLI runs as the agent uid through the launch shim.\n const target = wrapAgentCommand(bin, args, resolveAgentExec());\n const proc = spawn(target.command, target.args, {\n cwd: this.config.cwd,\n env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"spawn error\", err, { detail });\n // Fatal: the turn did not run, so the host gets one fatal error, then finished, then idle.\n this.pushError(detail, true);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(detail.message), { detail }));\n });\n\n if (proc.stdout) {\n if (this.mode === \"jsonl\") {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => this.onStdoutLine(line));\n } else {\n proc.stdout.setEncoding(\"utf8\");\n proc.stdout.on(\"data\", (chunk: string) => {\n this.stdoutBuffer += chunk;\n });\n }\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.debug(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"CLI exited\", { code, signal });\n this.onExit(code, signal);\n });\n });\n }\n\n /** Out-of-band abort: terminates the current child. Harness stays usable for the next prompt. */\n async abort(): Promise<void> {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n }\n\n kill(): void {\n this.aborting = true;\n this.proc?.kill(\"SIGTERM\");\n this.cleanup();\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this._sessionId = undefined;\n this._lastTokens = null;\n }\n\n // ── Subclass hooks ────────────────────────────────────────────────────────\n\n /** Build the CLI argv (binary excluded) for one turn. `resumeId` is the captured session id, if any. */\n protected abstract buildArgs(message: string, resumeId: string | undefined): string[];\n\n /** Build the child-process env (explicit allowlist — see {@link baseEnv}). */\n protected abstract buildEnv(): Record<string, string>;\n\n /** Map one parsed stdout JSON object to events via the `push*` helpers. Streaming (`jsonl`) mode only. */\n protected handleJson(_json: unknown): void {}\n\n /** Parse the full stdout blob once on clean exit. `buffered` mode only. */\n protected handleBuffered(_raw: string): void {}\n\n /** Install-failure hint surfaced when the binary is missing. */\n protected abstract installHint(): string;\n\n /**\n * Classify a non-zero exit into an {@link AgentError}, or `null` to treat the\n * exit as success (e.g. a turn-limit code where a result was already\n * emitted). Default: code `0` / clean signal → success; otherwise `process`.\n */\n protected classifyExit(code: number | null, signal: NodeJS.Signals | null): AgentError | null {\n if (code === 0 || (code === null && signal === null)) return null;\n const tail = this.stderrBuffer.slice(-10).join(\"\\n\");\n return {\n message: `${this.productName} exited with code ${code ?? \"null\"}${tail ? `: ${tail}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint: tail || `The ${this.productName} process exited unexpectedly. Try the prompt again.`,\n };\n }\n\n // ── Protected emit helpers (used by handleJson / handleBuffered) ────────────\n\n /** Prepend `systemPrompt` to the user message — uniform across CLIs lacking a reliable system flag. */\n protected composePrompt(message: string): string {\n return this.config.systemPrompt ? `${this.config.systemPrompt}\\n\\n---\\n\\n${message}` : message;\n }\n\n protected pushAssistantDelta(fullText: string): void {\n if (!this.activeAssistant) {\n this.activeAssistant = true;\n this.prevText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: asstMessage(\"\"),\n } satisfies AgentEvent);\n }\n const delta = fullText.startsWith(this.prevText)\n ? fullText.slice(this.prevText.length)\n : fullText;\n this.prevText = fullText;\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: asstMessage(fullText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n }\n\n protected pushAssistantEnd(fullText?: string): void {\n if (!this.activeAssistant) return;\n const text = fullText ?? this.prevText;\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: asstMessage(text),\n } satisfies AgentEvent);\n this.activeAssistant = false;\n this.prevText = \"\";\n }\n\n protected pushToolCall(name: string, input: unknown): void {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name,\n tool: { name },\n input,\n } satisfies AgentEvent);\n }\n\n protected pushToolResult(name: string, data: unknown, isError = false): void {\n this.pendingToolResults.push({ role: \"tool\", toolName: name, content: \"\", data, isError });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: name,\n } satisfies AgentEvent);\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n protected pushResult(opts: {\n tokens?: TokenUsage | null;\n costUsd?: number;\n summary?: string;\n subtype?: string;\n }): void {\n this.pushAssistantEnd();\n this.flushToolResults();\n if (opts.tokens) this._lastTokens = opts.tokens;\n this.sawResult = true;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: opts.subtype ?? \"success\",\n summary: opts.summary,\n costUsd: opts.costUsd ?? 0,\n ...(opts.tokens ? { tokens: opts.tokens } : {}),\n } satisfies AgentEvent);\n }\n\n protected pushError(detail: AgentError, fatal = false): void {\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n fatal,\n } satisfies AgentEvent);\n }\n\n protected captureSession(id?: string, file?: string): void {\n if (!id || id === this._sessionId) return;\n this._sessionId = id;\n this.emit(\"agent-event\", {\n type: \"session_info\",\n harnessSessionId: id,\n ...(file ? { sessionFile: file } : {}),\n } satisfies AgentEvent);\n }\n\n /** Shared keyword classification + per-harness hint copy (mirrors omp/codex). */\n protected classifyMessage(message: string): AgentError {\n const generic = classifyGenericErrorMessage(message);\n if (!generic) {\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: `An unexpected ${this.productName} error occurred. Try the prompt again.`,\n };\n }\n const hint =\n generic.category === \"auth\"\n ? `Check the API key / login configured for ${this.productName}.`\n : generic.category === \"rate_limit\"\n ? `${this.productName} hit a provider rate limit. Wait a moment and try again.`\n : generic.category === \"model\"\n ? \"The selected model is unavailable or the context is too long. Change the model or start a new session.\"\n : `A network error occurred while talking to ${this.productName}.`;\n return { message, category: generic.category, retryable: generic.retryable, hint };\n }\n\n // ── Env allowlist ──────────────────────────────────────────────────────────\n\n /**\n * Explicit env whitelist forwarded to the child. Omits anything provisioned\n * by `provision_secrets` so user credentials stay out of the subprocess\n * environment. Always passes through the harness's test-seam vars and\n * `FAKE_CLI_*`.\n *\n * `config.env` is merged **over** the whitelist, not in place of it. It used\n * to replace it wholesale, which meant any caller that set a single variable\n * silently dropped `PATH` and `HOME` and the spawn failed with ENOENT —\n * unusable as the delivery channel for registry-derived endpoint variables\n * (plan §2.3, \"Delivery rule\"). Widening keeps both: the caller's variables\n * win per key, the process still has a `PATH`.\n */\n protected baseEnv(extraKeys: string[] = []): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ...RUNNER_AGENT_ENV_KEYS,\n ...extraKeys,\n ];\n for (const key of explicit) {\n const v = process.env[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(`${this.envPrefix}_BRIDGE_`) || key.startsWith(\"FAKE_CLI_\")) {\n out[key] = value;\n }\n }\n if (this.config.sshKeyPath) {\n out.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n if (this.config.env) Object.assign(out, this.config.env);\n return stripRunnerPrivateEnv(out);\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private onStdoutLine(line: string): void {\n if (!line.trim()) return;\n let json: unknown;\n try {\n json = JSON.parse(line);\n } catch {\n this.log.debug(\"non-JSON stdout line\", { line });\n return;\n }\n try {\n this.handleJson(json);\n } catch (err) {\n this.log.warn(\"handleJson threw\", { error: String(err) });\n }\n }\n\n private onExit(code: number | null, signal: NodeJS.Signals | null): void {\n this.cleanup();\n\n if (this.aborting) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n return;\n }\n\n if (this.mode === \"buffered\" && (code === 0 || code === null)) {\n try {\n this.handleBuffered(this.stdoutBuffer);\n } catch (err) {\n this.log.warn(\"handleBuffered threw\", { error: String(err) });\n }\n }\n\n const exitErr = this.classifyExit(code, signal);\n if (exitErr && !this.sawResult) {\n this.pushAssistantEnd();\n this.flushToolResults();\n this.pushError(exitErr, true);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleReject(Object.assign(new Error(exitErr.message), { detail: exitErr }));\n return;\n }\n\n // Clean exit (or non-zero exit after a result already streamed): close any\n // open assistant message, synthesize a success result if none arrived, end.\n if (!this.sawResult) this.pushResult({ summary: \"Task completed\" });\n else {\n this.pushAssistantEnd();\n this.flushToolResults();\n }\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n this.settleResolve();\n }\n\n private settleResolve(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n private settleReject(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: `${this.defaultBin} command not found`,\n category: \"config\",\n retryable: false,\n hint: this.installHint(),\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: `Permission denied running ${this.defaultBin}`,\n category: \"config\",\n retryable: false,\n hint: `Check file permissions for the ${this.defaultBin} binary.`,\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: `An unexpected process error occurred running ${this.productName}. Try again.`,\n };\n }\n}\n\n// ───────────────────────────────────────────────────────────────────────────\n// Tolerant JSON extractors — shared because the upstream stream-json schemas\n// are not fully pinned; read the common field-name variants defensively.\n// ───────────────────────────────────────────────────────────────────────────\n\nfunction asstMessage(text: string): AgentMessage {\n return { role: \"assistant\", content: [{ type: \"text\", text }] };\n}\n\n/** Pull assistant text out of a CLI event, trying the common field names. */\nexport function extractText(json: any): string {\n if (typeof json?.text === \"string\") return json.text;\n if (typeof json?.delta === \"string\") return json.delta;\n if (typeof json?.content === \"string\") return json.content;\n if (typeof json?.response === \"string\") return json.response;\n const msg = json?.message;\n if (typeof msg?.content === \"string\") return msg.content;\n if (Array.isArray(msg?.content)) {\n return msg.content\n .filter(\n (b: any) => (b?.type === \"text\" || b?.type === undefined) && typeof b?.text === \"string\",\n )\n .map((b: any) => b.text)\n .join(\"\");\n }\n if (Array.isArray(json?.parts)) {\n return json.parts\n .filter((p: any) => typeof p?.text === \"string\")\n .map((p: any) => p.text)\n .join(\"\");\n }\n // OpenCode (`run --format json`) nests the payload under `part`.\n if (typeof json?.part?.text === \"string\") return json.part.text;\n return \"\";\n}\n\n/** Map a CLI usage/stats object onto {@link TokenUsage}, trying common field names. */\nexport function extractTokens(json: any): TokenUsage | null {\n const u = json?.usage ?? json?.stats?.usage ?? json?.stats ?? json?.tokens ?? json;\n if (!u || typeof u !== \"object\") return null;\n const input = u.input_tokens ?? u.inputTokens ?? u.prompt_tokens ?? u.promptTokenCount ?? u.input;\n const output =\n u.output_tokens ?? u.outputTokens ?? u.completion_tokens ?? u.candidatesTokenCount ?? u.output;\n const cacheRead = u.cached_input_tokens ?? u.cacheReadTokens ?? u.cachedContentTokenCount;\n if (input === undefined && output === undefined) return null;\n const tokens: TokenUsage = {};\n if (typeof input === \"number\") tokens.inputTokens = input;\n if (typeof output === \"number\") tokens.outputTokens = output;\n if (typeof cacheRead === \"number\") tokens.cacheReadTokens = cacheRead;\n return tokens;\n}\n\n/** Pull a per-turn USD cost from a CLI result object, or `undefined`. */\nexport function extractCost(json: any): number | undefined {\n const c =\n json?.cost ?? json?.costUsd ?? json?.total_cost_usd ?? json?.stats?.cost ?? json?.usage?.cost;\n return typeof c === \"number\" ? c : undefined;\n}\n"]}
|
|
@@ -68,5 +68,5 @@ function parseConversationKey(key) {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
export { CHANNEL_PLATFORMS, makeConversationKey, makeQuestionCard, markdownToTeamsText, mentionsAgent, normalizeMentions, parseConversationKey, teamsFormatConverter };
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
71
|
+
//# sourceMappingURL=chunk-VHRGCLCR.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-VHRGCLCR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../channels/src/mention/normalize.ts","../channels/src/format/adaptive-card.ts","../channels/src/types.ts"],"names":[],"mappings":"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","file":"chunk-F2IBDVBP.js","sourcesContent":["/**\n * Inbound mention normalization (spec §6.1): adapter-parsed platform mention\n * entities → the existing `Mention` union. This touches INBOUND platform\n * entities only — the platform's session-member mention grammar is untouched\n * (spec §12).\n */\nimport type { Mention } from \"@skaile/workspaces/types\";\nimport type { IdentityPort } from \"../ports.js\";\nimport type { ChannelActor } from \"../types.js\";\n\n/** A platform mention entity as the adapter parsed it, pre-identity-resolution. */\nexport type ChannelMentionEntity = {\n externalId: string;\n displayName: string;\n /** True when the entity is the bot itself (adapter compares against its own id). */\n isBot: boolean;\n offset: number;\n length: number;\n};\n\n/**\n * Normalizes adapter-parsed mention entities into the existing Mention union\n * (spec §6.1): bot → { type:\"group\", group:\"agent\" }; mapped user → user;\n * unmapped → { type:\"custom\", kind:\"external\", data:{ platform, externalUserId } }.\n */\nexport async function normalizeMentions(\n entities: ChannelMentionEntity[],\n actorOf: (e: ChannelMentionEntity) => ChannelActor,\n identity: IdentityPort,\n): Promise<Mention[]> {\n return Promise.all(\n entities.map(async (e): Promise<Mention> => {\n const position = { offset: e.offset, length: e.length };\n if (e.isBot) return { type: \"group\", group: \"agent\", resolved: [], ...position };\n const actor = actorOf(e);\n const host = await identity.resolveActor(actor);\n if (host) return { type: \"user\", userId: host.id, name: host.displayName, ...position };\n return {\n type: \"custom\",\n kind: \"external\",\n resolved: [],\n data: { platform: actor.platform, externalUserId: actor.externalId },\n ...position,\n };\n }),\n );\n}\n\n/** True when any normalized mention addresses the agent (bot-mention gate, spec §7.1.6). */\nexport function mentionsAgent(mentions: Mention[]): boolean {\n return mentions.some((m) => m.type === \"group\" && m.group === \"agent\");\n}\n","/**\n * Teams-facing formatting: text normalization for the markdown subset Teams\n * renders, plus Adaptive Card construction for question posts with options.\n */\nimport type { FormatConverter } from \"./types.js\";\n\n/**\n * Teams' supported markdown subset pass-through: normalizes constructs Teams\n * cannot render (~~strike~~ → plain, heading # → bold line); everything else\n * verbatim. Line-based on purpose — no markdown parser; fenced code passes\n * through untouched.\n */\nexport function markdownToTeamsText(markdown: string): string {\n let inFence = false;\n return markdown\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n const heading = line.match(/^#{1,6}\\s+(.*)$/);\n const text = heading ? `**${heading[1]}**` : line;\n return text.replace(/~~(.+?)~~/g, \"$1\");\n })\n .join(\"\\n\");\n}\n\n/** Adaptive Card 1.4 JSON for a question with option buttons (Action.Submit, data: { option }). */\nexport function makeQuestionCard(markdown: string, options: string[]): Record<string, unknown> {\n return {\n type: \"AdaptiveCard\",\n version: \"1.4\",\n $schema: \"http://adaptivecards.io/schemas/adaptive-card.json\",\n body: [{ type: \"TextBlock\", text: markdownToTeamsText(markdown), wrap: true }],\n actions: options.map((option) => ({\n type: \"Action.Submit\",\n title: option,\n data: { option },\n })),\n };\n}\n\n/** {@link FormatConverter} for adapters whose `textFormat` is `\"adaptive-card\"` (Teams). */\nexport const teamsFormatConverter: FormatConverter = { toPlatformText: markdownToTeamsText };\n","/**\n * Core value and message types for the channels layer — the bridge between\n * external chat platforms (Teams, Mattermost, Slack) and workspace sessions.\n *\n * Everything here is transport-neutral: no platform SDK types leak in, and\n * platform-native payloads only appear as opaque `raw`/`messageRef` slots.\n */\nimport type { MessageV2 } from \"@skaile/workspaces/types\";\n\n/** Chat platforms the channels layer can bridge. */\nexport const CHANNEL_PLATFORMS = [\"msteams\", \"mattermost\", \"slack\"] as const;\n\n/** One of the supported chat platforms (`\"msteams\" | \"mattermost\" | \"slack\"`). */\nexport type ChannelPlatform = (typeof CHANNEL_PLATFORMS)[number];\n\n/**\n * Canonical identifier of a place in a chat app: `\"<platform>:<conversationId>\"`,\n * optionally `\"…/<threadRootId>\"`. Never a session id — the Binding is the only\n * join between the two (spec §5.1).\n */\nexport type ConversationKey = string;\n\n/**\n * Builds a {@link ConversationKey} from its parts.\n *\n * Invariant: `parseConversationKey(makeConversationKey(p, c, t))` round-trips\n * exactly, provided `threadRootId` itself contains no `/`.\n */\nexport function makeConversationKey(\n platform: ChannelPlatform,\n conversationId: string,\n threadRootId?: string,\n): ConversationKey {\n return threadRootId\n ? `${platform}:${conversationId}/${threadRootId}`\n : `${platform}:${conversationId}`;\n}\n\n/**\n * Splits a {@link ConversationKey} into platform, conversation id, and optional\n * thread root. Throws on an unknown platform prefix.\n *\n * Gotcha: the thread separator is the LAST `/` — conversation ids may\n * themselves contain slashes (e.g. Mattermost `team/channel`).\n */\nexport function parseConversationKey(key: ConversationKey): {\n platform: ChannelPlatform;\n conversationId: string;\n threadRootId?: string;\n} {\n const sep = key.indexOf(\":\");\n const platform = key.slice(0, sep) as ChannelPlatform;\n if (!CHANNEL_PLATFORMS.includes(platform)) {\n throw new Error(`ConversationKey has unknown platform: ${key}`);\n }\n const rest = key.slice(sep + 1);\n // Thread separator is the LAST \"/\" — conversation ids may themselves contain slashes.\n const slash = rest.lastIndexOf(\"/\");\n if (slash === -1) return { platform, conversationId: rest };\n return { platform, conversationId: rest.slice(0, slash), threadRootId: rest.slice(slash + 1) };\n}\n\n/** A person (or bot) as the chat platform sees them — pre-IdentityPort resolution. */\nexport type ChannelActor = {\n platform: ChannelPlatform;\n /** Platform-native user id (Teams AAD object id, Slack user id, MM user id). */\n externalId: string;\n displayName: string;\n /** Teams tenant / MM team / Slack workspace, when known. */\n tenantId?: string;\n /** Identity hint for IdentityPort mapping, when the platform exposes it. */\n email?: string;\n isBot?: boolean;\n};\n\n/** Reference to a posted platform message. `raw` carries platform-native extras (e.g. Teams serviceUrl). */\nexport type MessageRef = {\n platform: ChannelPlatform;\n conversationKey: ConversationKey;\n /** Platform-native message id (Teams activity id, Slack ts, MM post id). */\n messageId: string;\n raw?: unknown;\n};\n\n/** Where to post: a conversation, optionally threaded under an existing message. */\nexport type ReplyTarget = {\n conversationKey: ConversationKey;\n /** Platform-native thread anchor; adapters thread under it where supported. */\n threadRef?: MessageRef;\n};\n\n/**\n * Declarative surface description consumed by the engine + egress pipeline.\n * Finalized per spec §13.1 by this plan — the conformance kit asserts adapters\n * honor `maxMessageLength` and `ackDeadlineMs`.\n */\nexport type SurfaceCapabilities = {\n canEditMessages: boolean;\n canDeleteMessages: boolean;\n supportsThreads: boolean;\n supportsCards: boolean;\n supportsTyping: boolean;\n supportsEphemeral: boolean;\n supportsReactions: boolean;\n /** Hard cap on a single posted message's text length; egress chunks at this. */\n maxMessageLength: number;\n /** IngressSink.onMessage must resolve within this (Slack ~3000, Teams 15000). */\n ackDeadlineMs: number;\n /** Minimum interval between successive edits of one message (egress throttle). */\n editThrottleMs: number;\n /** Outbound text dialect the adapter expects from the format layer. */\n textFormat: \"markdown\" | \"mrkdwn\" | \"adaptive-card\";\n};\n\n/** Per-binding egress policy (spec §7.2.4). */\nexport type MirrorMode = \"agent-only\" | \"full\" | \"chat-initiated\";\n\n/**\n * The conversationKey ↔ sessionId join, persisted by the host's BindingStore.\n * Deliberately not 1:1 (spec §5.1). Session ids never leak into chat payloads.\n */\nexport type Binding = {\n conversationKey: ConversationKey;\n sessionId: string;\n platform: ChannelPlatform;\n tenantId?: string;\n mirrorMode: MirrorMode;\n enabled: boolean;\n /** Host user id that created the binding (audit; authority stays with the host). */\n createdBy: string;\n /** ISO 8601. */\n createdAt: string;\n};\n\n/**\n * The one genuinely new meta type (spec §5) — rides on MessageMeta's extension\n * slot; hosts persist it untouched via the round-trip preservation contract.\n */\nexport type ChannelMetaExtensions = {\n channel?: {\n platform: ChannelPlatform;\n conversationKey: ConversationKey;\n /** Platform event id — the inbound dedupe key. */\n eventId: string;\n tenantId?: string;\n /** Pre-IdentityPort resolution attribution. */\n actor?: { externalId: string; displayName: string };\n /** Opaque platform-native ref of the source message. */\n messageRef?: unknown;\n };\n};\n\n/** A workspace message envelope whose meta block carries {@link ChannelMetaExtensions}. */\nexport type ChannelMessage = MessageV2<ChannelMetaExtensions>;\n\n/** What the engine hands an adapter to post. Format conversion is the adapter's job. */\nexport type OutboundMessage = {\n /** Markdown source; adapters convert via the format layer per their textFormat. */\n markdown: string;\n /** Rendering intent. Default \"text\". */\n kind?: \"text\" | \"question\" | \"status\" | \"error\";\n /** Options rendered as buttons where supportsCards; appended as a list otherwise. */\n options?: string[];\n};\n\n/** Fast-ack result of IngressSink.onMessage (spec §7.1.3). */\nexport type IngressAck = {\n status: \"accepted\" | \"duplicate\" | \"ignored\" | \"rejected\";\n reason?: string;\n};\n\n/** Inbound reaction event. Engine behavior deferred this milestone (Decision 7). */\nexport type InboundReaction = {\n conversationKey: ConversationKey;\n messageRef: MessageRef;\n emoji: string;\n actor: ChannelActor;\n action: \"added\" | \"removed\";\n eventId: string;\n};\n\n/** Non-message conversation lifecycle signals adapters may surface. */\nexport type ConversationEvent = {\n conversationKey: ConversationKey;\n kind: \"member_joined\" | \"member_left\" | \"conversation_renamed\" | \"conversation_deleted\";\n eventId: string;\n raw?: unknown;\n};\n\n/** Query for ChannelAdapter.lookupActor — backs the mentions-as-a-tool helper. */\nexport type ActorQuery = {\n externalId?: string;\n email?: string;\n /** Display-name substring match, platform semantics. */\n name?: string;\n};\n\n/** Result of verifyConversation — actionable problems, forge-tui preflight pattern. */\nexport type ConversationHealth = {\n ok: boolean;\n /** Human-actionable problem descriptions (\"bot is not a member of #x — invite it\"). */\n problems: string[];\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../channels/src/mention/normalize.ts","../channels/src/format/adaptive-card.ts","../channels/src/types.ts"],"names":[],"mappings":"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","file":"chunk-VHRGCLCR.js","sourcesContent":["/**\n * Inbound mention normalization (spec §6.1): adapter-parsed platform mention\n * entities → the existing `Mention` union. This touches INBOUND platform\n * entities only — the platform's session-member mention grammar is untouched\n * (spec §12).\n */\nimport type { Mention } from \"@skaile/workspaces/types\";\nimport type { IdentityPort } from \"../ports.js\";\nimport type { ChannelActor } from \"../types.js\";\n\n/** A platform mention entity as the adapter parsed it, pre-identity-resolution. */\nexport type ChannelMentionEntity = {\n externalId: string;\n displayName: string;\n /** True when the entity is the bot itself (adapter compares against its own id). */\n isBot: boolean;\n offset: number;\n length: number;\n};\n\n/**\n * Normalizes adapter-parsed mention entities into the existing Mention union\n * (spec §6.1): bot → { type:\"group\", group:\"agent\" }; mapped user → user;\n * unmapped → { type:\"custom\", kind:\"external\", data:{ platform, externalUserId } }.\n */\nexport async function normalizeMentions(\n entities: ChannelMentionEntity[],\n actorOf: (e: ChannelMentionEntity) => ChannelActor,\n identity: IdentityPort,\n): Promise<Mention[]> {\n return Promise.all(\n entities.map(async (e): Promise<Mention> => {\n const position = { offset: e.offset, length: e.length };\n if (e.isBot) return { type: \"group\", group: \"agent\", resolved: [], ...position };\n const actor = actorOf(e);\n const host = await identity.resolveActor(actor);\n if (host) return { type: \"user\", userId: host.id, name: host.displayName, ...position };\n return {\n type: \"custom\",\n kind: \"external\",\n resolved: [],\n data: { platform: actor.platform, externalUserId: actor.externalId },\n ...position,\n };\n }),\n );\n}\n\n/** True when any normalized mention addresses the agent (bot-mention gate, spec §7.1.6). */\nexport function mentionsAgent(mentions: Mention[]): boolean {\n return mentions.some((m) => m.type === \"group\" && m.group === \"agent\");\n}\n","/**\n * Teams-facing formatting: text normalization for the markdown subset Teams\n * renders, plus Adaptive Card construction for question posts with options.\n */\nimport type { FormatConverter } from \"./types.js\";\n\n/**\n * Teams' supported markdown subset pass-through: normalizes constructs Teams\n * cannot render (~~strike~~ → plain, heading # → bold line); everything else\n * verbatim. Line-based on purpose — no markdown parser; fenced code passes\n * through untouched.\n */\nexport function markdownToTeamsText(markdown: string): string {\n let inFence = false;\n return markdown\n .split(\"\\n\")\n .map((line) => {\n if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n const heading = line.match(/^#{1,6}\\s+(.*)$/);\n const text = heading ? `**${heading[1]}**` : line;\n return text.replace(/~~(.+?)~~/g, \"$1\");\n })\n .join(\"\\n\");\n}\n\n/** Adaptive Card 1.4 JSON for a question with option buttons (Action.Submit, data: { option }). */\nexport function makeQuestionCard(markdown: string, options: string[]): Record<string, unknown> {\n return {\n type: \"AdaptiveCard\",\n version: \"1.4\",\n $schema: \"http://adaptivecards.io/schemas/adaptive-card.json\",\n body: [{ type: \"TextBlock\", text: markdownToTeamsText(markdown), wrap: true }],\n actions: options.map((option) => ({\n type: \"Action.Submit\",\n title: option,\n data: { option },\n })),\n };\n}\n\n/** {@link FormatConverter} for adapters whose `textFormat` is `\"adaptive-card\"` (Teams). */\nexport const teamsFormatConverter: FormatConverter = { toPlatformText: markdownToTeamsText };\n","/**\n * Core value and message types for the channels layer — the bridge between\n * external chat platforms (Teams, Mattermost, Slack) and workspace sessions.\n *\n * Everything here is transport-neutral: no platform SDK types leak in, and\n * platform-native payloads only appear as opaque `raw`/`messageRef` slots.\n */\nimport type { MessageV2 } from \"@skaile/workspaces/types\";\n\n/** Chat platforms the channels layer can bridge. */\nexport const CHANNEL_PLATFORMS = [\"msteams\", \"mattermost\", \"slack\"] as const;\n\n/** One of the supported chat platforms (`\"msteams\" | \"mattermost\" | \"slack\"`). */\nexport type ChannelPlatform = (typeof CHANNEL_PLATFORMS)[number];\n\n/**\n * Canonical identifier of a place in a chat app: `\"<platform>:<conversationId>\"`,\n * optionally `\"…/<threadRootId>\"`. Never a session id — the Binding is the only\n * join between the two (spec §5.1).\n */\nexport type ConversationKey = string;\n\n/**\n * Builds a {@link ConversationKey} from its parts.\n *\n * Invariant: `parseConversationKey(makeConversationKey(p, c, t))` round-trips\n * exactly, provided `threadRootId` itself contains no `/`.\n */\nexport function makeConversationKey(\n platform: ChannelPlatform,\n conversationId: string,\n threadRootId?: string,\n): ConversationKey {\n return threadRootId\n ? `${platform}:${conversationId}/${threadRootId}`\n : `${platform}:${conversationId}`;\n}\n\n/**\n * Splits a {@link ConversationKey} into platform, conversation id, and optional\n * thread root. Throws on an unknown platform prefix.\n *\n * Gotcha: the thread separator is the LAST `/` — conversation ids may\n * themselves contain slashes (e.g. Mattermost `team/channel`).\n */\nexport function parseConversationKey(key: ConversationKey): {\n platform: ChannelPlatform;\n conversationId: string;\n threadRootId?: string;\n} {\n const sep = key.indexOf(\":\");\n const platform = key.slice(0, sep) as ChannelPlatform;\n if (!CHANNEL_PLATFORMS.includes(platform)) {\n throw new Error(`ConversationKey has unknown platform: ${key}`);\n }\n const rest = key.slice(sep + 1);\n // Thread separator is the LAST \"/\" — conversation ids may themselves contain slashes.\n const slash = rest.lastIndexOf(\"/\");\n if (slash === -1) return { platform, conversationId: rest };\n return { platform, conversationId: rest.slice(0, slash), threadRootId: rest.slice(slash + 1) };\n}\n\n/** A person (or bot) as the chat platform sees them — pre-IdentityPort resolution. */\nexport type ChannelActor = {\n platform: ChannelPlatform;\n /** Platform-native user id (Teams AAD object id, Slack user id, MM user id). */\n externalId: string;\n displayName: string;\n /** Teams tenant / MM team / Slack workspace, when known. */\n tenantId?: string;\n /** Identity hint for IdentityPort mapping, when the platform exposes it. */\n email?: string;\n isBot?: boolean;\n};\n\n/** Reference to a posted platform message. `raw` carries platform-native extras (e.g. Teams serviceUrl). */\nexport type MessageRef = {\n platform: ChannelPlatform;\n conversationKey: ConversationKey;\n /** Platform-native message id (Teams activity id, Slack ts, MM post id). */\n messageId: string;\n raw?: unknown;\n};\n\n/** Where to post: a conversation, optionally threaded under an existing message. */\nexport type ReplyTarget = {\n conversationKey: ConversationKey;\n /** Platform-native thread anchor; adapters thread under it where supported. */\n threadRef?: MessageRef;\n};\n\n/**\n * Declarative surface description consumed by the engine + egress pipeline.\n * Finalized per spec §13.1 by this plan — the conformance kit asserts adapters\n * honor `maxMessageLength` and `ackDeadlineMs`.\n */\nexport type SurfaceCapabilities = {\n canEditMessages: boolean;\n canDeleteMessages: boolean;\n supportsThreads: boolean;\n supportsCards: boolean;\n supportsTyping: boolean;\n supportsEphemeral: boolean;\n supportsReactions: boolean;\n /** Hard cap on a single posted message's text length; egress chunks at this. */\n maxMessageLength: number;\n /** IngressSink.onMessage must resolve within this (Slack ~3000, Teams 15000). */\n ackDeadlineMs: number;\n /** Minimum interval between successive edits of one message (egress throttle). */\n editThrottleMs: number;\n /** Outbound text dialect the adapter expects from the format layer. */\n textFormat: \"markdown\" | \"mrkdwn\" | \"adaptive-card\";\n};\n\n/** Per-binding egress policy (spec §7.2.4). */\nexport type MirrorMode = \"agent-only\" | \"full\" | \"chat-initiated\";\n\n/**\n * The conversationKey ↔ sessionId join, persisted by the host's BindingStore.\n * Deliberately not 1:1 (spec §5.1). Session ids never leak into chat payloads.\n */\nexport type Binding = {\n conversationKey: ConversationKey;\n sessionId: string;\n platform: ChannelPlatform;\n tenantId?: string;\n mirrorMode: MirrorMode;\n enabled: boolean;\n /** Host user id that created the binding (audit; authority stays with the host). */\n createdBy: string;\n /** ISO 8601. */\n createdAt: string;\n};\n\n/**\n * The one genuinely new meta type (spec §5) — rides on MessageMeta's extension\n * slot; hosts persist it untouched via the round-trip preservation contract.\n */\nexport type ChannelMetaExtensions = {\n channel?: {\n platform: ChannelPlatform;\n conversationKey: ConversationKey;\n /** Platform event id — the inbound dedupe key. */\n eventId: string;\n tenantId?: string;\n /** Pre-IdentityPort resolution attribution. */\n actor?: { externalId: string; displayName: string };\n /** Opaque platform-native ref of the source message. */\n messageRef?: unknown;\n /**\n * True when the message is addressed to the bot (an @mention, or a 1:1\n * chat with it); only such messages start an agent turn (spec §5.2, §5.7).\n * When an adapter leaves it unset, the engine falls back to `meta.mentions`.\n */\n mentioned?: boolean;\n };\n};\n\n/** A workspace message envelope whose meta block carries {@link ChannelMetaExtensions}. */\nexport type ChannelMessage = MessageV2<ChannelMetaExtensions>;\n\n/** What the engine hands an adapter to post. Format conversion is the adapter's job. */\nexport type OutboundMessage = {\n /** Markdown source; adapters convert via the format layer per their textFormat. */\n markdown: string;\n /** Rendering intent. Default \"text\". */\n kind?: \"text\" | \"question\" | \"status\" | \"error\";\n /** Options rendered as buttons where supportsCards; appended as a list otherwise. */\n options?: string[];\n};\n\n/** Fast-ack result of IngressSink.onMessage (spec §7.1.3). */\nexport type IngressAck = {\n status: \"accepted\" | \"duplicate\" | \"ignored\" | \"rejected\";\n reason?: string;\n};\n\n/** Inbound reaction event. Engine behavior deferred this milestone (Decision 7). */\nexport type InboundReaction = {\n conversationKey: ConversationKey;\n messageRef: MessageRef;\n emoji: string;\n actor: ChannelActor;\n action: \"added\" | \"removed\";\n eventId: string;\n};\n\n/** Non-message conversation lifecycle signals adapters may surface. */\nexport type ConversationEvent = {\n conversationKey: ConversationKey;\n kind: \"member_joined\" | \"member_left\" | \"conversation_renamed\" | \"conversation_deleted\";\n eventId: string;\n raw?: unknown;\n};\n\n/** Query for ChannelAdapter.lookupActor — backs the mentions-as-a-tool helper. */\nexport type ActorQuery = {\n externalId?: string;\n email?: string;\n /** Display-name substring match, platform semantics. */\n name?: string;\n};\n\n/** Result of verifyConversation — actionable problems, forge-tui preflight pattern. */\nexport type ConversationHealth = {\n ok: boolean;\n /** Human-actionable problem descriptions (\"bot is not a member of #x — invite it\"). */\n problems: string[];\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mcpNotRunnableReason } from './chunk-
|
|
1
|
+
import { mcpNotRunnableReason } from './chunk-MPBLRRPK.js';
|
|
2
2
|
import { fetchAssetFilesFromGitHub } from './chunk-F3D25RGM.js';
|
|
3
3
|
import { isValidAssetName } from './chunk-7HRZACI4.js';
|
|
4
4
|
import { createHash } from 'crypto';
|
|
@@ -27,5 +27,5 @@ async function mcpNotRunnableHere(manifest, name, fetcher = fetchAssetFilesFromG
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export { mcpNotRunnableHere, storeNotInstallableReason };
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
30
|
+
//# sourceMappingURL=chunk-WIZZUJ6R.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-WIZZUJ6R.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/src/store-addable.ts"],"names":[],"mappings":";;;;;AAsBO,SAAS,0BACd,CAAA,EACoB;AACpB,EAAA,IAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,mDAAA,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,kBAAA,CACpB,QAAA,EACA,IAAA,EACA,OAAA,GAAwB,yBAAA,EACK;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ;AAAA,MAC1B,GAAA,EAAK,SAAS,MAAA,CAAO,GAAA;AAAA,MACrB,SAAA,EAAW,SAAS,MAAA,CAAO,SAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,IAAA,CAAK,IAAI;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,KAAM,IAAA,CAAK,QAAQ,OAAO,KAAA,CAAA;AACnF,IAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../cli/src/store-addable.ts"],"names":[],"mappings":";;;;;AAsBO,SAAS,0BACd,CAAA,EACoB;AACpB,EAAA,IAAI,CAAC,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAO,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,mDAAA,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,kBAAA,CACpB,QAAA,EACA,IAAA,EACA,OAAA,GAAwB,yBAAA,EACK;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ;AAAA,MAC1B,GAAA,EAAK,SAAS,MAAA,CAAO,GAAA;AAAA,MACrB,SAAA,EAAW,SAAS,MAAA,CAAO,SAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,IAAA,CAAK,IAAI;AAAA,KAClB,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,KAAM,IAAA,CAAK,QAAQ,OAAO,KAAA,CAAA;AACnF,IAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-WIZZUJ6R.js","sourcesContent":["/**\n * Which store entries `skaile add` can take. The store lists only what `add` can install\n * (owner decision, RCV p385): one rule for `search`, `store search`, `store show` and the\n * `manage` store feed, so a listing never offers a ref that then fails.\n *\n * Every store kind is installable (owner decision, RCW p610): `add` stages the pointer's files\n * into the store cache and deploys them (skills, agents, contracts) or composes them at session\n * start (mcp-server). Only a name that is no canonical asset name cannot be added.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mcpNotRunnableReason } from \"@skaile/workspaces/asset-manager\";\nimport { isValidAssetName } from \"@skaile/workspaces/core\";\nimport { type AssetFetcher, fetchAssetFilesFromGitHub } from \"@skaile/workspaces/library\";\nimport type { CatalogAsset } from \"@skaile/workspaces/plugins\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\n\n/**\n * Why `skaile add` cannot take a store row as printed, or `undefined` when it can: a name that\n * is not a canonical asset name (`UI Rendering` copied from a listing is two shell arguments\n * and no ref).\n */\nexport function storeNotInstallableReason(\n a: Pick<CatalogAsset, \"kind\" | \"name\">,\n): string | undefined {\n if (!isValidAssetName(a.name)) {\n return `the name \"${a.name}\" is not a canonical asset name, so no ref names it`;\n }\n return undefined;\n}\n\n/**\n * Why the `mcp-server` of `manifest` gets no `.mcp.json` entry from this CLI (a Nix-recipe\n * server, a placeholder url), read from its pinned `MCP.md`: the catalog row carries no manifest\n * fields. `undefined` when it would get one, or when the file cannot be fetched or does not match\n * the recorded sha256: nothing is claimed then (p1491).\n *\n * @param fetcher - Fetches the file at the pinned commit; GitHub's raw host by default.\n */\nexport async function mcpNotRunnableHere(\n manifest: Pick<InstallManifest, \"files\" | \"source\">,\n name: string,\n fetcher: AssetFetcher = fetchAssetFilesFromGitHub,\n): Promise<string | undefined> {\n const file = manifest.files.find((f) => f.path === \"MCP.md\" || f.path.endsWith(\"/MCP.md\"));\n if (!file) return undefined;\n try {\n const bytes = await fetcher({\n url: manifest.source.url,\n commitSha: manifest.source.commitSha,\n paths: [file.path],\n });\n const buf = bytes[file.path];\n if (!buf || createHash(\"sha256\").update(buf).digest(\"hex\") !== file.sha256) return undefined;\n return mcpNotRunnableReason(buf.toString(\"utf8\"), name);\n } catch {\n return undefined;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadDeclaredPlugins } from './chunk-2PVYDAFN.js';
|
|
2
|
-
import { listHarnesses } from './chunk-
|
|
3
|
-
import { softDepName } from './chunk-
|
|
2
|
+
import { listHarnesses } from './chunk-JTJYM3XT.js';
|
|
3
|
+
import { softDepName } from './chunk-MPBLRRPK.js';
|
|
4
4
|
import { readLock, LockParseError } from './chunk-MEU2HHGV.js';
|
|
5
5
|
import { resolveRuntimeAssets } from './chunk-CJO3XKO7.js';
|
|
6
6
|
import { resolveAgentDefinitionDir, AgentRefResolutionError, normalizeAgentInstances, agentBlockKeyDiagnostics, agentInstanceDiagnostics, localConnectorMountDir, symlinkEscapeOfProject, isInsideProject, loadSkWorkspaceConfig, SKAILE_YAML_DEFAULT, resolveSkWorkspaceConfig } from './chunk-BNLXZXZN.js';
|
|
@@ -684,5 +684,5 @@ function warnFilesOnlyDelegates(projectDir, target) {
|
|
|
684
684
|
}
|
|
685
685
|
|
|
686
686
|
export { KIND_COL_WIDTH, S, TARGET_DEFAULT_HINT, agentDefinitionProblem, agentInstanceErrorLines, bareSoftDepName, canonicalHarnessId, checkAgentInstances, colorRef, connectorErrorLines, connectorMountPathChecks, deferredWarnings, driverAliasOption, fitWidth, foldDriverFlag, formatRelativeTime, formatSoftDepAddPreview, formatSoftDepHint, formatSoftDepRemovePreview, formatSoftDepSection, friendlyHarnessError, harnessErrorNotes, instanceRefProblem, isRecord, kindColor, kindColorPad, logErr, logInfo, logNoProject, logOk, logWarn, logWarnErr, parseHarnessFilter, reportLegacyOmpCopies, reportProjectConfig, reportUnknownHarnesses, requireProjectConfig, setActiveCommand, unknownConnectorDriverErrors, unknownHarnessErrors, unknownHarnessMessage, unknownHarnessTargetMessage, unknownKeyWarnings, warnFilesOnlyDelegates, warnPlaceholderBodies, warnProjectConfig, warnStaleHarnessCopies };
|
|
687
|
-
//# sourceMappingURL=chunk-
|
|
688
|
-
//# sourceMappingURL=chunk-
|
|
687
|
+
//# sourceMappingURL=chunk-XECD7XZT.js.map
|
|
688
|
+
//# sourceMappingURL=chunk-XECD7XZT.js.map
|