@makaio/framework 1.0.0-dev-1781022866275 → 1.0.0-dev-1781023871421
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/dist/.makaio-build.json +5 -0
- package/dist/account-identity-DT5NOtFi.mjs +1 -0
- package/dist/adapter-C1eI-fGV.mjs +1 -0
- package/dist/adapters/acp-client/index.d.mts +6208 -0
- package/dist/adapters/acp-client/index.mjs +3 -0
- package/dist/adapters/config/index.d.mts +429 -0
- package/dist/adapters/config/index.mjs +1 -0
- package/dist/adapters/index.d.mts +4202 -0
- package/dist/adapters/index.mjs +18 -0
- package/dist/adapters/node.d.mts +263 -0
- package/dist/adapters/node.mjs +4 -0
- package/dist/adapters/stream-session/index.d.mts +1414 -0
- package/dist/adapters/stream-session/index.mjs +1 -0
- package/dist/adapters/stream-session/testing/index.d.mts +29 -0
- package/dist/adapters/stream-session/testing/index.mjs +1 -0
- package/dist/artifact-B3npq1cy.mjs +1 -0
- package/dist/base-orchestrator-wyumsn3b.d.mts +772 -0
- package/dist/bus/index.d.mts +3994 -0
- package/dist/bus/index.mjs +1 -0
- package/dist/bus-Caz3Jpbc.mjs +1 -0
- package/dist/bus-Hb-LGzgb.mjs +2 -0
- package/dist/capability-service-CJbmhfv9.mjs +1 -0
- package/dist/chunk-DTipWd-i.mjs +1 -0
- package/dist/chunk-cpUYaJdV.mjs +1 -0
- package/dist/cleanEnvForAdapter-KkYzQa1f.mjs +1 -0
- package/dist/client-bx74gm4R.mjs +1 -0
- package/dist/clients/index.d.mts +2639 -0
- package/dist/clients/index.mjs +2 -0
- package/dist/clients-namespace-GmSJpBUV.d.mts +332 -0
- package/dist/config-namespace-CPY9YsR8.d.mts +638 -0
- package/dist/config-namespace-ncYg2ct_.mjs +1 -0
- package/dist/contracts/adapter/index.d.mts +3 -0
- package/dist/contracts/adapter/index.mjs +1 -0
- package/dist/contracts/adapter/schemas/session-lineage.d.mts +2 -0
- package/dist/contracts/adapter/schemas/session-lineage.mjs +1 -0
- package/dist/contracts/artifact/index.d.mts +2 -0
- package/dist/contracts/artifact/index.mjs +1 -0
- package/dist/contracts/client/index.d.mts +3 -0
- package/dist/contracts/client/index.mjs +1 -0
- package/dist/contracts/common/index.d.mts +2 -0
- package/dist/contracts/common/index.mjs +1 -0
- package/dist/contracts/config/index.d.mts +455 -0
- package/dist/contracts/config/index.mjs +1 -0
- package/dist/contracts/extension/index.d.mts +4 -0
- package/dist/contracts/extension/index.mjs +1 -0
- package/dist/contracts/facet/index.d.mts +2 -0
- package/dist/contracts/facet/index.mjs +1 -0
- package/dist/contracts/harness/index.d.mts +2 -0
- package/dist/contracts/harness/index.mjs +1 -0
- package/dist/contracts/host/index.d.mts +2 -0
- package/dist/contracts/host/index.mjs +1 -0
- package/dist/contracts/index.d.mts +23046 -0
- package/dist/contracts/index.mjs +1 -0
- package/dist/contracts/materialization/index.d.mts +4 -0
- package/dist/contracts/materialization/index.mjs +1 -0
- package/dist/contracts/model-registry/index.d.mts +2 -0
- package/dist/contracts/model-registry/index.mjs +1 -0
- package/dist/contracts/native-session-supervisor/index.d.mts +2 -0
- package/dist/contracts/native-session-supervisor/index.mjs +1 -0
- package/dist/contracts/platform/index.d.mts +2 -0
- package/dist/contracts/platform/index.mjs +1 -0
- package/dist/contracts/provider/index.d.mts +3 -0
- package/dist/contracts/provider/index.mjs +1 -0
- package/dist/contracts/session/index.d.mts +3 -0
- package/dist/contracts/session/index.mjs +1 -0
- package/dist/contracts/shared/index.d.mts +2 -0
- package/dist/contracts/shared/index.mjs +1 -0
- package/dist/contracts/skill/index.d.mts +2 -0
- package/dist/contracts/skill/index.mjs +1 -0
- package/dist/contracts/telemetry/index.d.mts +2 -0
- package/dist/contracts/telemetry/index.mjs +1 -0
- package/dist/contracts/timeout/index.d.mts +2 -0
- package/dist/contracts/timeout/index.mjs +1 -0
- package/dist/contracts/toast/index.d.mts +198 -0
- package/dist/contracts/toast/index.mjs +1 -0
- package/dist/contracts/variant/index.d.mts +2 -0
- package/dist/contracts/variant/index.mjs +1 -0
- package/dist/core/index.d.mts +1263 -0
- package/dist/core/index.mjs +1 -0
- package/dist/credential-ref-YWQQENEo.mjs +1 -0
- package/dist/cursor-storage-CtVJ3JzB.mjs +1 -0
- package/dist/definition-BLCdXGzh.d.mts +383 -0
- package/dist/definition-CrgHIpTK.d.mts +60 -0
- package/dist/definition-DZMXOnjX.mjs +1 -0
- package/dist/definition-pkJ6szUl.d.mts +158 -0
- package/dist/drizzle-Eq8W1EbD.mjs +1 -0
- package/dist/event-Ca2yUf5i.mjs +1 -0
- package/dist/execution-target-CRPTfZlc.mjs +1 -0
- package/dist/extension-C-4BHMRI.mjs +1 -0
- package/dist/extension-CpIUgBKI.mjs +1 -0
- package/dist/extension-namespace-cMh_mMiL.mjs +1 -0
- package/dist/facet-BuwhrThl.mjs +1 -0
- package/dist/filesystem-service-B8rhBRgB.mjs +1 -0
- package/dist/filesystem-service-p_iJVHd4.d.mts +66 -0
- package/dist/git/index.d.mts +210 -0
- package/dist/git/index.mjs +18 -0
- package/dist/globby-rtWVaFHv.mjs +41 -0
- package/dist/handlers-CkTsQLra.mjs +41 -0
- package/dist/harness-BRCMcvQN.mjs +1 -0
- package/dist/hooks/index.d.mts +423 -0
- package/dist/hooks/index.mjs +1 -0
- package/dist/host-Br9VuOyr.mjs +1 -0
- package/dist/identity-Cz2IeEtm.mjs +1 -0
- package/dist/index-472sOmsW.d.mts +218 -0
- package/dist/index-8SZkg7s6.d.mts +353 -0
- package/dist/index-B3PK4FIn.d.mts +5116 -0
- package/dist/index-B80L4YqA.d.mts +180 -0
- package/dist/index-BFg9BUpx.d.mts +355 -0
- package/dist/index-BGfWS6GE.d.mts +483 -0
- package/dist/index-BVgfS-AJ.d.mts +109 -0
- package/dist/index-B_zQC98V.d.mts +995 -0
- package/dist/index-Bh_Ne7LF.d.mts +1008 -0
- package/dist/index-Bvb2mMH6.d.mts +1730 -0
- package/dist/index-CCGVh9BF2.d.mts +749 -0
- package/dist/index-CGmcS0Ma.d.mts +412 -0
- package/dist/index-CHQ1SqT0.d.mts +117 -0
- package/dist/index-CLpjm52M.d.mts +183 -0
- package/dist/index-Caig6TeF.d.mts +6746 -0
- package/dist/index-CelJCBjk.d.mts +2992 -0
- package/dist/index-ChunCFu4.d.mts +11 -0
- package/dist/index-Cm0dUkWL.d.mts +4651 -0
- package/dist/index-CokQYGVP.d.mts +184 -0
- package/dist/index-Cs0kZXIz2.d.mts +37 -0
- package/dist/index-D5d5HeWI2.d.mts +259 -0
- package/dist/index-D90OmGmV.d.mts +389 -0
- package/dist/index-D9MwJ2Q8.d.mts +67 -0
- package/dist/index-DANINzMu.d.mts +40 -0
- package/dist/index-DBw-89vC2.d.mts +3640 -0
- package/dist/index-DGBu6bHi2.d.mts +438 -0
- package/dist/index-DKC62dY5.d.mts +146 -0
- package/dist/index-DKia0MX1.d.mts +43 -0
- package/dist/index-DMKnON5s.d.mts +28 -0
- package/dist/index-DUaw0Dw8.d.mts +14747 -0
- package/dist/index-De3kPhlN.d.mts +72 -0
- package/dist/index-L4GjJDKb.d.mts +822 -0
- package/dist/index-U-A8eyGT.d.mts +1490 -0
- package/dist/index-eemAKwsB.d.mts +362 -0
- package/dist/index-mNec7V-9.d.mts +1075 -0
- package/dist/index-soFznFCy2.d.mts +89 -0
- package/dist/index-vtXJuwrz.d.mts +40 -0
- package/dist/index-x_lVDp_J.d.mts +134 -0
- package/dist/json-value-CmhSGMLv.mjs +1 -0
- package/dist/kernel/cli/index.d.mts +143 -0
- package/dist/kernel/cli/index.mjs +1 -0
- package/dist/kernel/cli/schemas.d.mts +64 -0
- package/dist/kernel/cli/schemas.mjs +1 -0
- package/dist/kernel/extension/index.d.mts +2 -0
- package/dist/kernel/extension/index.mjs +1 -0
- package/dist/kernel/index.d.mts +296 -0
- package/dist/kernel/index.mjs +1 -0
- package/dist/kernel/namespace/index.d.mts +2 -0
- package/dist/kernel/namespace/index.mjs +1 -0
- package/dist/kernel/observability/index.d.mts +2 -0
- package/dist/kernel/observability/index.mjs +1 -0
- package/dist/kernel/providers/index.d.mts +2 -0
- package/dist/kernel/providers/index.mjs +1 -0
- package/dist/kernel/window/index.d.mts +2 -0
- package/dist/kernel/window/index.mjs +1 -0
- package/dist/materialization-CuUBu4XI.mjs +1 -0
- package/dist/model-registry-CfXytvzx.mjs +1 -0
- package/dist/model-registry-Scn_MC2d.mjs +1 -0
- package/dist/namespace-5QQqbF-B.d.mts +3133 -0
- package/dist/namespace-BM7Djng9.d.mts +189 -0
- package/dist/namespace-BoD94mrN.mjs +1 -0
- package/dist/namespace-BwzZJqTV.mjs +1 -0
- package/dist/namespace-CFLAmQfh.mjs +1 -0
- package/dist/namespace-CTm3nEvh.d.mts +51 -0
- package/dist/namespace-CaaNnKcR.d.mts +921 -0
- package/dist/namespace-CaoZ3S78.d.mts +43 -0
- package/dist/namespace-CxhsoFUP.d.mts +607 -0
- package/dist/namespace-DD8Oiqo7.d.mts +580 -0
- package/dist/namespace-DLovh2Ws.d.mts +1313 -0
- package/dist/namespace-DgqkaOVu.d.mts +768 -0
- package/dist/namespace-DkRgbZYn.mjs +1 -0
- package/dist/namespace-Dr8K0MCp.d.mts +2047 -0
- package/dist/namespace-DuXK5AYN.mjs +1 -0
- package/dist/namespace-EQniz-Aw.d.mts +142 -0
- package/dist/namespace-IV1QK__V.d.mts +159 -0
- package/dist/namespace-LViZ-EQk.mjs +1 -0
- package/dist/namespace-TyiTsLFv.d.mts +3020 -0
- package/dist/namespace-Yna5-Pws.mjs +1 -0
- package/dist/namespace-xcmbQlxh.mjs +1 -0
- package/dist/native-session-supervisor-B1TnaPUF.mjs +1 -0
- package/dist/node/bus-server/index.d.mts +178 -0
- package/dist/node/bus-server/index.mjs +1 -0
- package/dist/node/bus-server/server-lifecycle.d.mts +2 -0
- package/dist/node/bus-server/server-lifecycle.mjs +1 -0
- package/dist/node/machine-identity/index.d.mts +85 -0
- package/dist/node/machine-identity/index.mjs +3 -0
- package/dist/node/transports/index.d.mts +1945 -0
- package/dist/node/transports/index.mjs +2 -0
- package/dist/orchestrator-shared-CIDiFJMD.mjs +1 -0
- package/dist/orchestrator-shared-Dfa7FMyw.d.mts +249 -0
- package/dist/package-DKVlsMP3.mjs +1 -0
- package/dist/platform-DZ7z-wXD.mjs +1 -0
- package/dist/profile-6ynCD5k3.mjs +1 -0
- package/dist/provider-context-CK6B4X_8.mjs +1 -0
- package/dist/providers/index.d.mts +135 -0
- package/dist/providers/index.mjs +1 -0
- package/dist/providers-namespace-DSEpli4A.d.mts +583 -0
- package/dist/providers-u8i15co9.mjs +1 -0
- package/dist/schema-CoyE6mPt.mjs +1 -0
- package/dist/schema-M5YTvSAG.d.mts +949 -0
- package/dist/schema-e0wU_lcV.mjs +1 -0
- package/dist/schema-introspection-Dn1jWQs1.mjs +1 -0
- package/dist/schemas-Bd0OjRQf.d.mts +46 -0
- package/dist/schemas-C46QfKzv.d.mts +459 -0
- package/dist/schemas-CDBSjg7o.d.mts +237 -0
- package/dist/schemas-CR1Rripy.mjs +1 -0
- package/dist/schemas-CVvwIfG4.mjs +1 -0
- package/dist/schemas-CaLhkkLn.mjs +1 -0
- package/dist/schemas-ClOOT1W6.d.mts +174 -0
- package/dist/schemas-DATniTHb.d.mts +182 -0
- package/dist/schemas-DE-GNmSD.mjs +1 -0
- package/dist/schemas-DVF1A4DF.d.mts +160 -0
- package/dist/schemas-DaRSfYLf.d.mts +73 -0
- package/dist/schemas-DiYVzG6e.d.mts +315 -0
- package/dist/schemas-hSrzflwZ.mjs +1 -0
- package/dist/schemas-j7ivZ2HI.d.mts +944 -0
- package/dist/schemas-jFe1AuI-.mjs +1 -0
- package/dist/schemas-wg_6PAdV.d.mts +153 -0
- package/dist/scoped-bus-04pwo1uM.mjs +1 -0
- package/dist/server-lifecycle-FXTPW39-.mjs +1 -0
- package/dist/server-lifecycle-YoSGFGnU.d.mts +160 -0
- package/dist/service-base/index.d.mts +98 -0
- package/dist/service-base/index.mjs +1 -0
- package/dist/services/adapter-runtime/index.d.mts +4 -0
- package/dist/services/adapter-runtime/index.mjs +1 -0
- package/dist/services/adapter-runtime/namespace.d.mts +2 -0
- package/dist/services/adapter-runtime/namespace.mjs +1 -0
- package/dist/services/adapter-runtime/schemas.d.mts +2 -0
- package/dist/services/adapter-runtime/schemas.mjs +1 -0
- package/dist/services/adapter-subsystem/index.d.mts +3 -0
- package/dist/services/adapter-subsystem/index.mjs +1 -0
- package/dist/services/adapter-subsystem/namespace.d.mts +2 -0
- package/dist/services/adapter-subsystem/namespace.mjs +1 -0
- package/dist/services/agent-runtime/index.d.mts +3 -0
- package/dist/services/agent-runtime/index.mjs +1 -0
- package/dist/services/agent-runtime/namespace.d.mts +2 -0
- package/dist/services/agent-runtime/namespace.mjs +1 -0
- package/dist/services/agent-runtime/schemas.d.mts +2 -0
- package/dist/services/agent-runtime/schemas.mjs +1 -0
- package/dist/services/capability/index.d.mts +2 -0
- package/dist/services/capability/index.mjs +1 -0
- package/dist/services/cli-detection/namespace.d.mts +56 -0
- package/dist/services/cli-detection/namespace.mjs +1 -0
- package/dist/services/codebase/index.d.mts +3 -0
- package/dist/services/codebase/index.mjs +1 -0
- package/dist/services/codebase/namespace.d.mts +2 -0
- package/dist/services/codebase/namespace.mjs +1 -0
- package/dist/services/codebase/schemas.d.mts +2 -0
- package/dist/services/codebase/schemas.mjs +1 -0
- package/dist/services/compression/index.d.mts +3 -0
- package/dist/services/compression/index.mjs +1 -0
- package/dist/services/compression/namespace.d.mts +2 -0
- package/dist/services/compression/namespace.mjs +1 -0
- package/dist/services/compression/schemas.d.mts +2 -0
- package/dist/services/compression/schemas.mjs +1 -0
- package/dist/services/context-rules/index.d.mts +412 -0
- package/dist/services/context-rules/index.mjs +1 -0
- package/dist/services/credential-change/index.d.mts +17 -0
- package/dist/services/credential-change/index.mjs +1 -0
- package/dist/services/definition/index.d.mts +2 -0
- package/dist/services/definition/index.mjs +1 -0
- package/dist/services/definition/namespace.d.mts +71 -0
- package/dist/services/definition/namespace.mjs +1 -0
- package/dist/services/definition/schemas.d.mts +38 -0
- package/dist/services/definition/schemas.mjs +1 -0
- package/dist/services/dialog/namespace.d.mts +105 -0
- package/dist/services/dialog/namespace.mjs +1 -0
- package/dist/services/dialog/schemas.d.mts +109 -0
- package/dist/services/dialog/schemas.mjs +1 -0
- package/dist/services/execution-target/index.d.mts +4 -0
- package/dist/services/execution-target/index.mjs +1 -0
- package/dist/services/execution-target/namespace.d.mts +2 -0
- package/dist/services/execution-target/namespace.mjs +1 -0
- package/dist/services/execution-target/schemas.d.mts +2 -0
- package/dist/services/execution-target/schemas.mjs +1 -0
- package/dist/services/filesystem/index.d.mts +3 -0
- package/dist/services/filesystem/index.mjs +1 -0
- package/dist/services/filesystem/namespace.d.mts +432 -0
- package/dist/services/filesystem/namespace.mjs +1 -0
- package/dist/services/filesystem/schemas.d.mts +240 -0
- package/dist/services/filesystem/schemas.mjs +1 -0
- package/dist/services/git/namespace.d.mts +1163 -0
- package/dist/services/git/namespace.mjs +1 -0
- package/dist/services/git/schemas.d.mts +932 -0
- package/dist/services/git/schemas.mjs +1 -0
- package/dist/services/harness/index.d.mts +861 -0
- package/dist/services/harness/index.mjs +1 -0
- package/dist/services/harness/storage/schema.d.mts +424 -0
- package/dist/services/harness/storage/schema.mjs +1 -0
- package/dist/services/index.d.mts +6185 -0
- package/dist/services/index.mjs +1 -0
- package/dist/services/local-notification/index.d.mts +25 -0
- package/dist/services/local-notification/index.mjs +1 -0
- package/dist/services/local-notification/namespace.d.mts +73 -0
- package/dist/services/local-notification/namespace.mjs +1 -0
- package/dist/services/local-notification/schemas.d.mts +88 -0
- package/dist/services/local-notification/schemas.mjs +1 -0
- package/dist/services/log-import/browser.d.mts +3 -0
- package/dist/services/log-import/browser.mjs +1 -0
- package/dist/services/log-import/index.d.mts +274 -0
- package/dist/services/log-import/index.mjs +2 -0
- package/dist/services/log-import/log-import.d.mts +3 -0
- package/dist/services/log-import/log-import.mjs +1 -0
- package/dist/services/log-import/namespace.d.mts +327 -0
- package/dist/services/log-import/namespace.mjs +1 -0
- package/dist/services/log-import/schemas.d.mts +217 -0
- package/dist/services/log-import/schemas.mjs +1 -0
- package/dist/services/model-registry/index.d.mts +2 -0
- package/dist/services/model-registry/index.mjs +1 -0
- package/dist/services/preferences/index.d.mts +3 -0
- package/dist/services/preferences/index.mjs +1 -0
- package/dist/services/preferences/schemas.d.mts +2 -0
- package/dist/services/preferences/schemas.mjs +1 -0
- package/dist/services/preferences/storage-namespace.d.mts +3 -0
- package/dist/services/preferences/storage-namespace.mjs +1 -0
- package/dist/services/provider-context/index.d.mts +2 -0
- package/dist/services/provider-context/index.mjs +1 -0
- package/dist/services/provider-runtime/index.d.mts +136 -0
- package/dist/services/provider-runtime/index.mjs +1 -0
- package/dist/services/session/handlers/index.d.mts +2 -0
- package/dist/services/session/handlers/index.mjs +1 -0
- package/dist/services/session/index.d.mts +10 -0
- package/dist/services/session/index.mjs +1 -0
- package/dist/services/session/messages/namespace.d.mts +2 -0
- package/dist/services/session/messages/namespace.mjs +1 -0
- package/dist/services/session/orchestrator-testing/index.d.mts +2 -0
- package/dist/services/session/orchestrator-testing/index.mjs +1 -0
- package/dist/services/session/session-events/namespace.d.mts +2 -0
- package/dist/services/session/session-events/namespace.mjs +1 -0
- package/dist/services/session/storage/namespace.d.mts +2 -0
- package/dist/services/session/storage/namespace.mjs +1 -0
- package/dist/services/session/storage/schema.d.mts +2 -0
- package/dist/services/session/storage/schema.mjs +1 -0
- package/dist/services/session/testing/index.d.mts +35 -0
- package/dist/services/session/testing/index.mjs +65 -0
- package/dist/services/session/testing/orchestrator-shared.d.mts +2 -0
- package/dist/services/session/testing/orchestrator-shared.mjs +1 -0
- package/dist/services/session/turns/namespace.d.mts +2 -0
- package/dist/services/session/turns/namespace.mjs +1 -0
- package/dist/services/session-editor/index.d.mts +119 -0
- package/dist/services/session-editor/index.mjs +1 -0
- package/dist/services/settings/index.d.mts +47 -0
- package/dist/services/settings/index.mjs +1 -0
- package/dist/services/settings/namespace.d.mts +663 -0
- package/dist/services/settings/namespace.mjs +1 -0
- package/dist/services/settings/storage/clients-namespace.d.mts +2 -0
- package/dist/services/settings/storage/clients-namespace.mjs +1 -0
- package/dist/services/settings/storage/extension-configs/namespace.d.mts +184 -0
- package/dist/services/settings/storage/extension-configs/namespace.mjs +1 -0
- package/dist/services/settings/storage/index.d.mts +4 -0
- package/dist/services/settings/storage/index.mjs +1 -0
- package/dist/services/settings/storage/providers-namespace.d.mts +2 -0
- package/dist/services/settings/storage/providers-namespace.mjs +1 -0
- package/dist/services/subagent/index.d.mts +2 -0
- package/dist/services/subagent/index.mjs +1 -0
- package/dist/services/subagent-template/index.d.mts +3 -0
- package/dist/services/subagent-template/index.mjs +1 -0
- package/dist/services/subagent-template/namespace.d.mts +2 -0
- package/dist/services/subagent-template/namespace.mjs +1 -0
- package/dist/services/subagent-template/schemas.d.mts +2 -0
- package/dist/services/subagent-template/schemas.mjs +1 -0
- package/dist/services/tool-approval/index.d.mts +2 -0
- package/dist/services/tool-approval/index.mjs +1 -0
- package/dist/services/tools/index.d.mts +2 -0
- package/dist/services/tools/index.mjs +1 -0
- package/dist/services/tray-menu/index.d.mts +4 -0
- package/dist/services/tray-menu/index.mjs +1 -0
- package/dist/services/tray-menu/namespace.d.mts +2 -0
- package/dist/services/tray-menu/namespace.mjs +1 -0
- package/dist/services/tray-menu/schemas.d.mts +2 -0
- package/dist/services/tray-menu/schemas.mjs +1 -0
- package/dist/services/turn/index.d.mts +2 -0
- package/dist/services/turn/index.mjs +1 -0
- package/dist/services/turn/namespace.d.mts +2 -0
- package/dist/services/turn/namespace.mjs +1 -0
- package/dist/services/turn/schemas.d.mts +335 -0
- package/dist/services/turn/schemas.mjs +1 -0
- package/dist/session-BoldSdNZ2.mjs +134 -0
- package/dist/session-DuVOYctZ.mjs +1 -0
- package/dist/session-lineage-CRsc9g1x.d.mts +65 -0
- package/dist/shared-DpOEfD8F.mjs +1 -0
- package/dist/shared-schemas-CPShiLNp.mjs +1 -0
- package/dist/skill-CQO4mDqK.mjs +1 -0
- package/dist/storage/drizzle/client.d.mts +78 -0
- package/dist/storage/drizzle/client.mjs +1 -0
- package/dist/storage/drizzle/index.d.mts +137 -0
- package/dist/storage/drizzle/index.mjs +1 -0
- package/dist/storage/handlers/drizzle/index.d.mts +2 -0
- package/dist/storage/handlers/drizzle/index.mjs +1 -0
- package/dist/storage/handlers/index.d.mts +33 -0
- package/dist/storage/handlers/index.mjs +1 -0
- package/dist/storage/index.d.mts +192 -0
- package/dist/storage/index.mjs +1 -0
- package/dist/storage-namespace-BXkoh5Sy.d.mts +221 -0
- package/dist/storage-namespace-DWsYLAXa.mjs +1 -0
- package/dist/storage-namespace-definition-Bkx5rSto.d.mts +17 -0
- package/dist/storage-namespace-definition-CqSdsuCC.mjs +1 -0
- package/dist/style.css +3782 -0
- package/dist/telemetry-CvdLBWuk.mjs +1 -0
- package/dist/testing/drizzle-harness.d.mts +130 -0
- package/dist/testing/drizzle-harness.mjs +1 -0
- package/dist/testing/index.d.mts +106 -0
- package/dist/testing/index.mjs +1 -0
- package/dist/timeout-XsYIOKrc.mjs +1 -0
- package/dist/tool-approval-service-BvZWhYZp.mjs +1 -0
- package/dist/tools/index.d.mts +835 -0
- package/dist/tools/index.mjs +1 -0
- package/dist/tools/testing/index.d.mts +53 -0
- package/dist/tools/testing/index.mjs +1 -0
- package/dist/tools-D-luYcDw.mjs +1431 -0
- package/dist/tray-menu-service-DuXq5k22.mjs +1 -0
- package/dist/types-BCMUtBj1.d.mts +1106 -0
- package/dist/types-C2Ob9zz_.d.mts +128 -0
- package/dist/types-CCdqjeuH.d.mts +262 -0
- package/dist/types-DZHvOc_Q.d.mts +305 -0
- package/dist/types-Dy3YTcTF.d.mts +6777 -0
- package/dist/types-MfJZ67e9.d.mts +315 -0
- package/dist/types-dyP-bXXE.d.mts +31 -0
- package/dist/ui-components/index.d.mts +2342 -0
- package/dist/ui-components/index.mjs +8 -0
- package/dist/ui-config-9bDRwFZr.mjs +1 -0
- package/dist/ui-hooks/index.d.mts +1915 -0
- package/dist/ui-hooks/index.mjs +1 -0
- package/dist/ui-kernel/index.d.mts +2793 -0
- package/dist/ui-kernel/index.mjs +1 -0
- package/dist/ui-kernel/pages/namespace.d.mts +88 -0
- package/dist/ui-kernel/pages/namespace.mjs +1 -0
- package/dist/ui-kernel/pages/schemas.d.mts +2 -0
- package/dist/ui-kernel/pages/schemas.mjs +1 -0
- package/dist/ui-views/index.d.mts +487 -0
- package/dist/ui-views/index.mjs +30 -0
- package/dist/utils/health-probe.d.mts +26 -0
- package/dist/utils/health-probe.mjs +1 -0
- package/dist/utils/index.d.mts +262 -0
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/keychain.d.mts +31 -0
- package/dist/utils/keychain.mjs +1 -0
- package/dist/utils/project-manifest.d.mts +130 -0
- package/dist/utils/project-manifest.mjs +1 -0
- package/dist/utils/resolve-package-root.d.mts +12 -0
- package/dist/utils/resolve-package-root.mjs +1 -0
- package/dist/utils/scope-paths.d.mts +33 -0
- package/dist/utils/scope-paths.mjs +1 -0
- package/dist/utils/workspace-packages.d.mts +59 -0
- package/dist/utils/workspace-packages.mjs +1 -0
- package/dist/utils/workspace-root.d.mts +24 -0
- package/dist/utils/workspace-root.mjs +2 -0
- package/dist/variant-CT6XBP6T.mjs +1 -0
- package/dist/version-BeT3ASEe.mjs +1 -0
- package/dist/visibility-Cb62p9bv.mjs +1 -0
- package/dist/window-registry-CBcrGTv4.d.mts +130 -0
- package/dist/window-registry-DW-dKRjQ.mjs +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"../../chunk-DTipWd-i.mjs";import{CorrelationTracker as t,DEFAULT_REQUEST_TIMEOUT_MS as n,NoHandlerError as r,TimeoutError as i,buildSubscribeMessage as a,buildUnsubscribeMessage as o,deserializeTransportError as s,getSubjectFromBusMessage as c,handleCorrelationResponse as l,isNoHandlerErrorForSubject as u,shouldReceiveMessage as d,trackMessageCorrelation as f}from"@makaio/framework/bus";import{isRecord as p}from"@makaio/framework/utils";const m={baseMs:1e3,maxMs:1e4};function ee(e,t,n){let r=Math.max(t,100),i=Math.max(n,r);return Math.min(r*2**e,i)}function te(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=()=>{clearTimeout(i),t.removeEventListener(`abort`,r),n()},i=setTimeout(()=>{t.removeEventListener(`abort`,r),n()},e);t.addEventListener(`abort`,r)})}const ne={encode:async e=>JSON.stringify(e),decode:async e=>e};function re(e){return e===!1?!1:{baseMs:e?.baseMs??m.baseMs,maxMs:e?.maxMs??m.maxMs}}function h(e,t=`unknown error`){return`message`in e?String(e.message):t}async function g(e,t,n){let r=await t.encode(e);n.send(r)}function ie(e){return e.readyState===1?Promise.resolve():e.readyState>=2?Promise.reject(Error(`WebSocket closed before opening`)):new Promise((t,n)=>{let r=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)},i=()=>{r(),t()},a=e=>{r(),n(Error(`WebSocket connection failed — ${h(e)}`))},o=()=>{r(),n(Error(`WebSocket closed before opening`))};e.addEventListener(`open`,i),e.addEventListener(`error`,a),e.addEventListener(`close`,o)})}async function ae(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)e.status===`rejected`&&n.debug&&console.error(`[WebSocketClientTransport:${n.name}] Handler error:`,e.reason);return r.every(e=>e.status===`fulfilled`)}function oe(e,t){return{...t?.getReceiveContext?.(),transportName:e}}async function se(e,t){let{name:n,debug:r,auth:i,codec:a,messageTransform:o,correlations:s,handlers:c}=t;try{let u=JSON.parse(e.toString());if(typeof u!=`object`||!u||typeof u.type!=`string`){r&&console.error(`[WebSocketClientTransport:${n}] Invalid message structure:`,u);return}let d=u;if(i?.handleAuthMessage(d)||d.type===`heartbeat`)return;let f=await a.decode(d);if(o&&(f=await o(f)),f.type===`heartbeat`)return;if(f.type===`subscribe-sync-complete`){t.onSyncComplete();return}if(f.type===`subscription-ack`){typeof f.ackId==`string`&&t.onSubscriptionAck(f.ackId);return}if(l(f,s))return;let p=oe(n,i);await ae(f,c,{debug:r,name:n,receiveContext:p})&&(f.type===`subscribe`||f.type===`unsubscribe`)&&typeof f.ackId==`string`&&await t.sendSubscriptionAck(f.ackId)}catch(e){r&&console.error(`[WebSocketClientTransport:${n}] Failed to parse message:`,e)}}function ce(e,t){let n=n=>{se(n.data,{name:t.name,debug:t.debug,auth:t.auth,codec:t.codec,messageTransform:t.messageTransform,correlations:t.correlations,handlers:t.handlers,onSyncComplete:()=>{t.resolveReady()},onSubscriptionAck:e=>{t.resolveSubscriptionAck(e)},sendSubscriptionAck:async n=>{e.readyState===1&&await g({type:`subscription-ack`,ackId:n},t.codec,e)}})};t.setMessageListener(n),e.addEventListener(`message`,n)}function _(e,t){let n=t.getMessageListener();n!==null&&(e.removeEventListener(`message`,n),t.setMessageListener(null));let r=t.getCloseListener();r!==null&&(e.removeEventListener(`close`,r),t.setCloseListener(null))}async function v(e){e.resolveReady(),e.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: reconnecting before subscription ack`)),e.resetReadyPromise();let t=e.getSocket();t!==null&&_(t,e);let n=await e.wsFactory(e.url);e.setSocket(n),e.setAuthComplete(!1);try{ce(n,e),await ie(n),e.auth&&await e.auth.authenticateClient(e=>{if(n.readyState!==1)throw Error(`WebSocketClientTransport: cannot send auth message — socket not open`);n.send(JSON.stringify(e))}),e.setAuthComplete(!0),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Connected to ${e.url}`),e.localSubscriptions.size>0&&(await g(a(e.localSubscriptions),e.codec,n),e.debug&&console.info(`[WebSocketClientTransport:${e.name}] Replayed ${e.localSubscriptions.size} subscription(s)`)),e.notifyConnected()}catch(t){let r=e.getSocket()===n;throw r&&e.auth?.cleanup(),_(n,e),r&&e.setSocket(null),e.setAuthComplete(!1),r&&(n.readyState===0||n.readyState===1)&&n.close(),t}}function y(e,t){return new Promise(n=>{if(e.readyState===3||t.aborted){n();return}let r=()=>{t.removeEventListener(`abort`,i),n()},i=()=>{e.removeEventListener(`close`,r),n()};e.addEventListener(`close`,r),t.addEventListener(`abort`,i)})}async function le(e,t,n,r,i){i(!0);try{for(;!e.aborted;){let i=n.getSocket(),a=i!==null;if(i!==null&&i.readyState!==3&&await y(i,e),e.aborted)break;a&&(n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection lost, starting reconnect loop (maxMs=${t.maxMs})`),n.notifyDisconnected());let o=0;for(;!e.aborted;){let i=ee(o,t.baseMs,t.maxMs);n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Reconnecting in ${i}ms (attempt ${o+1})`);let a=new AbortController;if(r(a),await te(i,AbortSignal.any([e,a.signal])),r(null),e.aborted)break;try{await v(n),o=0;let t=n.getSocket();if(t!==null){let r=()=>{n.auth?.cleanup(),n.setAuthComplete(!1),n.debug&&console.info(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connection closed`),n.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`))};n.setCloseListener(r),t.addEventListener(`close`,r),await y(t,e)}break}catch(e){if(n.debug){let t=e instanceof Error?e.message:String(e);console.warn(`[WebSocketClientTransport:${n.name}] ${new Date().toISOString()} Connect attempt ${o+1} failed: ${t}`)}o++}}}}finally{i(!1)}}function ue(e,t,n){let r=()=>{t.auth?.cleanup(),_(e,t),t.setAuthComplete(!1),t.setSocket(null),n(),t.resolveReady(),t.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),t.notifyDisconnected()};t.setCloseListener(r),e.addEventListener(`close`,r)}async function de(e,t,n,r){let i=r.localSubscriptions.get(e)?.filter,o=t??i;if(r.localSubscriptions.set(e,{filter:o,priorities:n}),r.socket!==null&&r.socket.readyState===1){let t=r.beginSubscriptionAck?.(),i=a(new Map([[e,{filter:o,priorities:n}]]),t?.ackId);try{await g(i,r.codec,r.socket),await t?.promise}catch(e){throw t?.reject(e),e}}r.debug&&console.info(`[WebSocketClientTransport:${r.name}] Subscribed to ${e}${o?` with filter`:``}`)}async function fe(e,t){let n=t.localSubscriptions.get(e);if(t.localSubscriptions.delete(e),t.socket!==null&&t.socket.readyState===1){let r=t.beginSubscriptionAck?.(),i=o({[e]:n?.priorities??[]},r?.ackId);try{await g(i,t.codec,t.socket),await r?.promise}catch(e){throw r?.reject(e),e}}t.debug&&console.info(`[WebSocketClientTransport:${t.name}] Unsubscribed from ${e}`)}var b=class{name;url;auth;codec;messageTransform;autoReconnectConfig;wsFactory;debug;onConnectedCallback;onDisconnectedCallback;socket=null;authComplete=!1;correlations=new t;handlers=new Set;localSubscriptions=new Map;pendingSubscriptionAcks=new Map;subscriptionAckSeq=0;messageListener=null;closeListener=null;reconnectAbort=null;backoffWakeAbort=null;reconnectLoopRunning=!1;readyResolve=null;ready;onNewReadySession=void 0;onConnected=void 0;onDisconnected=void 0;constructor(e){this.url=e.url,this.name=e.name??`ws-client`,this.auth=e.auth,this.codec=e.codec??ne,this.messageTransform=e.messageTransform,this.debug=e.debug??!1,this.autoReconnectConfig=re(e.autoReconnect),this.wsFactory=e.createWebSocket??this.defaultWsFactory,this.onConnectedCallback=e.onConnected,this.onDisconnectedCallback=e.onDisconnected,this.ready=new Promise(e=>{this.readyResolve=e})}async connect(){if(this.reconnectAbort!==null)throw Error(`WebSocketClientTransport: already connected`);let e=new AbortController;this.reconnectAbort=e;try{await v(this.connectionDeps())}catch(e){throw this.reconnectAbort=null,e}this.autoReconnectConfig===!1?this.socket!==null&&this.wireNoReconnectClose(this.socket):this.startReconnectLoop(e.signal)}async disconnect(){let e=this.reconnectAbort;if(this.reconnectAbort=null,e?.abort(),this.readyResolve?.(),this.readyResolve=null,this.socket!==null){_(this.socket,this.connectionDeps());let e=this.socket;this.socket=null,this.authComplete=!1,(e.readyState===0||e.readyState===1)&&e.close()}this.correlations.cleanup(),this.rejectPendingSubscriptionAcks(Error(`WebSocketClientTransport: disconnected before subscription ack`)),this.auth?.cleanup(),this.handlers.clear(),this.debug&&console.info(`[WebSocketClientTransport:${this.name}] Disconnected`)}async send(e,t){if(this.socket===null||this.socket.readyState!==1)throw Error(`WebSocketClientTransport: not connected`);let r=await this.codec.encode(e);return this.socket.send(r),f(e,this.correlations,t??n)}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}async subscribe(e,t,n=[]){await de(e,t,n,this.subscriptionDeps())}async unsubscribe(e){await fe(e,this.subscriptionDeps())}getSubscriptions(){return new Set(this.localSubscriptions.keys())}cancelRequest(e,t){this.correlations.cancel(e,t)}isReady(){return this.socket!==null&&this.socket.readyState===1&&this.authComplete}async reconnect(){if(!this.isReady()){if(this.backoffWakeAbort!==null){this.backoffWakeAbort.abort(),this.backoffWakeAbort=null;return}if(this.autoReconnectConfig!==!1){if(this.reconnectLoopRunning)return;this.reconnectAbort!==null&&this.startReconnectLoop(this.reconnectAbort.signal);return}try{await v(this.connectionDeps()),this.socket!==null&&(this.reconnectAbort=new AbortController,this.wireNoReconnectClose(this.socket))}catch{}}}startReconnectLoop(e){return le(e,this.autoReconnectConfig,this.connectionDeps(),e=>{this.backoffWakeAbort=e},e=>{this.reconnectLoopRunning=e})}subscriptionDeps(){return{name:this.name,debug:this.debug,codec:this.codec,socket:this.socket,localSubscriptions:this.localSubscriptions,beginSubscriptionAck:()=>this.beginSubscriptionAck()}}beginSubscriptionAck(){let e=`${this.name}:sub:${++this.subscriptionAckSeq}`,t,n,r=new Promise((e,r)=>{t=e,n=r});r.catch(()=>void 0);let i=t=>{this.pendingSubscriptionAcks.has(e)&&(this.pendingSubscriptionAcks.delete(e),t())};return this.pendingSubscriptionAcks.set(e,{resolve:()=>i(t),reject:e=>i(()=>n(e))}),{ackId:e,promise:r,reject:t=>this.rejectSubscriptionAck(e,t)}}resolveSubscriptionAck(e){this.pendingSubscriptionAcks.get(e)?.resolve()}rejectSubscriptionAck(e,t){this.pendingSubscriptionAcks.get(e)?.reject(t)}rejectPendingSubscriptionAcks(e){for(let t of this.pendingSubscriptionAcks.keys())this.rejectSubscriptionAck(t,e)}connectionDeps(){return{name:this.name,debug:this.debug,auth:this.auth,codec:this.codec,messageTransform:this.messageTransform,correlations:this.correlations,handlers:this.handlers,localSubscriptions:this.localSubscriptions,wsFactory:this.wsFactory,url:this.url,getSocket:()=>this.socket,setSocket:e=>{this.socket=e},setAuthComplete:e=>{this.authComplete=e},getMessageListener:()=>this.messageListener,setMessageListener:e=>{this.messageListener=e},getCloseListener:()=>this.closeListener,setCloseListener:e=>{this.closeListener=e},resolveReady:()=>{this.readyResolve?.(),this.readyResolve=null},resetReadyPromise:()=>{this.ready=new Promise(e=>{this.readyResolve=e}),this.onNewReadySession?.(this.ready)},resolveSubscriptionAck:e=>{this.resolveSubscriptionAck(e)},rejectPendingSubscriptionAcks:e=>{this.rejectPendingSubscriptionAcks(e)},notifyConnected:()=>{this.onConnectedCallback?.(),this.onConnected?.()},notifyDisconnected:()=>{this.onDisconnectedCallback?.(),this.onDisconnected?.()}}}defaultWsFactory=async e=>new(await(import(`ws`))).WebSocket(e);wireNoReconnectClose(e){ue(e,this.connectionDeps(),()=>{this.reconnectAbort=null})}};function x(e){e.timer!==void 0&&clearTimeout(e.timer)}var pe=class{pendingBroadcasts=new Map;timeout;debug;constructor(e={}){this.timeout=e.timeout??5e3,this.debug=e.debug??!1}startClientBroadcast(e,t,n,r,i){let a=t.correlationId,o=i??this.timeout,s={kind:`client`,sender:e,results:[],pendingClients:new Set(n),nodeResultsReceived:!1,timer:o===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Broadcast ${a} timed out`),this.finalizeBroadcast(a)},o)};this.pendingBroadcasts.set(a,s);let c=JSON.stringify(t);for(let e of n)r(e,c);this.debug&&console.info(`[BroadcastAggregator] Broadcast ${a} forwarded to ${n.length} clients`)}startServerBroadcast(e,t,n,r){let i=e.correlationId,a=r??this.timeout;return t.length===0?(this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} - no target clients`),Promise.resolve([])):new Promise(r=>{let o={kind:`server`,results:[],pendingClients:new Set(t),timer:a===0?void 0:setTimeout(()=>{this.debug&&console.warn(`[BroadcastAggregator] Server broadcast ${i} timed out`),this.finalizeServerBroadcast(i)},a),resolve:r};this.pendingBroadcasts.set(i,o);let s=JSON.stringify(e);for(let e of t)n(e,s);this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${i} sent to ${t.length} clients`)})}handleResponse(e,t){let n=this.pendingBroadcasts.get(t.correlationId);return n?(t.results&&n.results.push(...t.results),n.pendingClients.delete(e),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${t.correlationId} got response, ${n.pendingClients.size} pending`),this.checkBroadcastComplete(t.correlationId,n),!0):!1}handleNodeResults(e,t,n){let r=this.pendingBroadcasts.get(e);return!r||r.kind!==`client`?!1:(r.results.push(...t),r.nodeResultsReceived=!0,r.nodeError=n,this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} node results aggregated${n?` (with error)`:``}`),this.checkBroadcastComplete(e,r),!0)}handleClientDisconnect(e){for(let[t,n]of this.pendingBroadcasts)n.kind===`client`&&n.sender===e?(x(n),this.pendingBroadcasts.delete(t)):n.pendingClients.has(e)&&(n.pendingClients.delete(e),this.checkBroadcastComplete(t,n))}cleanup(){for(let e of this.pendingBroadcasts.values())x(e),e.kind===`server`&&e.resolve(e.results);this.pendingBroadcasts.clear()}checkBroadcastComplete(e,t){if(!(t.pendingClients.size>0))if(t.kind===`client`){if(!t.nodeResultsReceived)return;this.finalizeBroadcast(e)}else this.finalizeServerBroadcast(e)}finalizeBroadcast(e){let t=this.pendingBroadcasts.get(e);if(!t||t.kind!==`client`)return;x(t),this.pendingBroadcasts.delete(e);let n=t.nodeError?{type:`broadcast-response`,correlationId:e,error:t.nodeError}:{type:`broadcast-response`,correlationId:e,results:t.results};t.sender.readyState===1&&t.sender.send(JSON.stringify(n)),this.debug&&console.info(`[BroadcastAggregator] Broadcast ${e} finalized with ${t.results.length} results`)}finalizeServerBroadcast(e){let t=this.pendingBroadcasts.get(e);!t||t.kind!==`server`||(x(t),this.pendingBroadcasts.delete(e),t.resolve(t.results),this.debug&&console.info(`[BroadcastAggregator] Server broadcast ${e} finalized with ${t.results.length} results`))}},me=class{clients=new Set;authenticatingClients=new Set;clientSubscriptions=new Map;clientFilters=new Map;debug;constructor(e={}){this.debug=e.debug??!1}addAuthenticating(e){this.authenticatingClients.add(e)}removeAuthenticating(e){this.authenticatingClients.delete(e)}isAuthenticating(e){return this.authenticatingClients.has(e)}addClient(e){this.clients.add(e)}removeClient(e){this.clients.delete(e),this.authenticatingClients.delete(e),this.clientSubscriptions.delete(e),this.clientFilters.delete(e),this.debug&&console.info(`[ClientRegistry] Client removed (${this.clients.size} remaining)`)}get size(){return this.clients.size}getAllSockets(){return new Set([...this.clients,...this.authenticatingClients])}handleSubscribeMessage(e,t){let n=this.clientSubscriptions.get(e);n||(n=new Set,this.clientSubscriptions.set(e,n));let r=this.clientFilters.get(e);for(let[i]of Object.entries(t.subjects)){n.add(i);let a=t.filters?.[i];a===void 0?r?.delete(i):(r||(r=new Map,this.clientFilters.set(e,r)),r.set(i,a))}if(this.debug){let e=Object.keys(t.subjects).length,n=t.filters?Object.keys(t.filters).length:0;console.info(`[ClientRegistry] Client subscribed to ${e} subjects, ${n} filters`)}}handleUnsubscribeMessage(e,t){let n=this.clientSubscriptions.get(e),r=this.clientFilters.get(e);for(let e of Object.keys(t))n?.delete(e),r?.delete(e);this.debug&&console.info(`[ClientRegistry] Client unsubscribed from ${Object.keys(t).length} subjects`)}getReadyClients(){let e=[];for(let t of this.clients)t.readyState===1&&e.push(t);return e}getRequestRoutingPriority(e,t,n){let r=this.clientSubscriptions.get(e);return!r||r.size===0?1:this.clientWantsMessage(e,t,n)?2:0}getInterestedClients(e,t,n){let r=[];for(let i of this.clients)i!==n&&i.readyState===1&&this.clientWantsMessage(i,e,t)&&r.push(i);return r}forwardEventToClients(e,t,n){let r=c(t)??void 0,i=`payload`in t?t.payload:void 0,a=JSON.stringify(t),o=this.getInterestedClients(r,i,e);for(let e of o)n(e,a)}clientWantsMessage(e,t,n){return d(t,n,this.clientSubscriptions.get(e)??new Set,this.clientFilters.get(e)??new Map)}};async function S(e,t,n){let r=await Promise.allSettled(Array.from(t).map(t=>t(e,n.receiveContext)));for(let e of r)if(e.status===`rejected`&&n.debug){let t=n.logContext?` ${n.logContext}`:``;console.error(`[ServerTransport] Handler error${t}:`,e.reason)}return r.every(e=>e.status===`fulfilled`)}function he(e,t,n){let{correlations:r,broadcastAggregator:i,debug:a}=t;if(e.type===`heartbeat`)return!0;if(e.type===`response`){let t=e;return typeof t.correlationId==`string`?(t.error?r.reject(t.correlationId,s(t.error)):r.resolve(t.correlationId,t.result),!0):(a&&console.warn(`[ServerTransport] Malformed response message: missing correlationId`),!0)}if(e.type===`broadcast-response`){let t=e;return typeof t.correlationId==`string`?(i.handleResponse(n,t),!0):(a&&console.warn(`[ServerTransport] Malformed broadcast-response: missing correlationId`),!0)}return!1}async function ge(e,t,n){let{registry:r,broadcastAggregator:i,handlers:a,normalizeBroadcastTimeout:o,sendSafely:s,debug:c}=n;if(he(e,n,t))return;let l=n.auth?.getReceiveContext?.(t);if(e.type===`subscribe`){let n=e;if(!p(n.subjects)){c&&console.warn(`[ServerTransport] Malformed subscribe message: missing subjects record`);return}r.handleSubscribeMessage(t,n),await S(n,a,{debug:c,receiveContext:l,logContext:`dispatching subscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`unsubscribe`){let n=e;if(!p(n.subjects)){c&&console.warn(`[ServerTransport] Malformed unsubscribe message: missing subjects record`);return}r.handleUnsubscribeMessage(t,n.subjects),await S(n,a,{debug:c,receiveContext:l,logContext:`dispatching unsubscribe`})&&typeof n.ackId==`string`&&s(t,JSON.stringify({type:`subscription-ack`,ackId:n.ackId}));return}if(e.type===`broadcast`){let n=e;if(typeof n.correlationId!=`string`||typeof n.subject!=`string`){c&&console.warn(`[ServerTransport] Malformed broadcast message: missing correlationId or subject`);return}let u=r.getInterestedClients(n.subject,n.payload,t),d=o(n.timeout);i.startClientBroadcast(t,n,u,s,d),await S(e,a,{debug:c,receiveContext:l});return}e.type===`event`&&r.forwardEventToClients(t,e,s),await S(e,a,{debug:c,receiveContext:l})}function _e(e,t){let{auth:n,registry:r,debug:i}=t;return async a=>{let o;try{o=JSON.parse(a.toString())}catch(e){i&&console.error(`[ServerTransport] Failed to parse message:`,e);return}let s=o&&typeof o==`object`?o:void 0;if(!s||typeof s.type!=`string`){i&&console.error(`[ServerTransport] Invalid message structure:`,o);return}let c=o;try{if(n?.handleAuthMessage(c,e))return;if(n&&r.isAuthenticating(e)){i&&console.warn(`[ServerTransport] Ignoring message from unauthenticated client`);return}if(n?.isSocketAuthenticated?.(e)===!1){i&&console.warn(`[ServerTransport] Closing socket with expired authentication`),n.cleanupSocket(e),e.close(1008,`Authentication expired`);return}await ge(c,e,t)}catch(e){i&&console.error(`[ServerTransport] Failed to process message:`,e)}}}function ve(e){return typeof e!=`number`||!Number.isFinite(e)||e<=0?5e3:Math.min(e,6e4)}async function ye(e,t){let{registry:n,correlations:r,broadcastAggregator:i,handlers:o,auth:s,serverSubscriptions:c,sendSafely:l,debug:u}=t;s&&n.addAuthenticating(e);let d=_e(e,{registry:n,correlations:r,broadcastAggregator:i,handlers:o,auth:s,normalizeBroadcastTimeout:ve,sendSafely:l,debug:u}),f=e=>{d(e.data)},p=()=>{s?.cleanupSocket(e),n.removeClient(e),e.removeEventListener(`message`,f),e.removeEventListener(`close`,p),e.removeEventListener(`error`,m),i.handleClientDisconnect(e),u&&console.info(`[ServerTransport] Client disconnected (${n.size} remaining)`)},m=e=>{u&&console.error(`[ServerTransport] Client socket error:`,e)};e.addEventListener(`message`,f),e.addEventListener(`close`,p),e.addEventListener(`error`,m);try{if(s&&(await s.authenticateServer(e,t=>{if(e.readyState!==1)throw Error(`Cannot send auth message: socket not ready (state: ${e.readyState})`);e.send(JSON.stringify(t))}),n.removeAuthenticating(e)),e.readyState!==1)return;if(n.addClient(e),c.size>0){let t=a(c);l(e,JSON.stringify(t))}l(e,JSON.stringify({type:`subscribe-sync-complete`})),u&&console.info(`[ServerTransport] Client connected (${n.size} total)`)}catch(t){u&&console.error(`[ServerTransport] Client authentication failed:`,t),e.close(1008,`Authentication failed`)}}async function be(e,t,n){let{registry:a,correlations:o}=n,s=`${e.namespace}.${e.subject}`,c=a.getReadyClients().map(t=>({client:t,priority:a.getRequestRoutingPriority(t,s,e.payload)})).sort((e,t)=>t.priority-e.priority).map(({client:e})=>e);if(c.length===0)throw new r(s);for(let[n,r]of c.entries()){let a=`${e.correlationId}:attempt-${n+1}`,c={...e,correlationId:a};try{r.send(JSON.stringify(c))}catch{continue}try{return await o.track(a,t)}catch(e){if(u(e,s)||e instanceof i)continue;throw e}}throw new r(s)}var C=class{name;wss;auth;debug;handlers=new Set;registry;serverSubscriptions=new Map;broadcastAggregator;correlations=new t;connectionListener=null;constructor(e){let{websocket:t,name:n=`websocket`,auth:r,debug:i=!1}=e;this.wss=t,this.name=n,this.auth=r,this.debug=i,this.registry=new me({debug:i}),this.broadcastAggregator=new pe({debug:i})}sendToClientSafely(e,t){try{e.send(t)}catch(e){this.debug&&console.warn(`[ServerTransport] Failed to send message to client:`,e)}}async connect(){if(this.connectionListener!==null)throw Error(`ServerTransport.connect() called while already connected`);this.connectionListener=e=>{ye(e,{registry:this.registry,correlations:this.correlations,broadcastAggregator:this.broadcastAggregator,handlers:this.handlers,auth:this.auth,serverSubscriptions:this.serverSubscriptions,sendSafely:(e,t)=>this.sendToClientSafely(e,t),debug:this.debug})},this.wss.on(`connection`,this.connectionListener),this.debug&&console.info(`[ServerTransport] Listening for connections`)}async disconnect(){this.connectionListener&&=(this.wss.off(`connection`,this.connectionListener),null);let e=this.registry.getAllSockets();for(let t of e)t.close();await new Promise((e,t)=>{this.wss.close(n=>n?t(n):e())}),this.correlations.cleanup(),this.broadcastAggregator.cleanup(),this.auth?.cleanup(),this.handlers.clear(),this.serverSubscriptions.clear(),this.debug&&console.info(`[ServerTransport] Disconnected`)}async send(e,t){if(e.type===`broadcast`){let n=c(e)??void 0,r=`payload`in e?e.payload:void 0,i=this.registry.getInterestedClients(n,r);return this.broadcastAggregator.startServerBroadcast(e,i,(e,t)=>{this.sendToClientSafely(e,t)},t)}if(e.type===`request`)return be(e,t??n,{registry:this.registry,correlations:this.correlations});if(this.registry.size===0){if(this.debug){let t=c(e);console.debug(`[ServerTransport] No clients to receive ${e.type}${t?`: ${t}`:``}`)}return!1}let r=c(e)??void 0,i=`payload`in e?e.payload:void 0,a=JSON.stringify(e),o=this.registry.getInterestedClients(r,i);for(let e of o)this.sendToClientSafely(e,a);let s=o.length>0;if(!s){if(r&&this.debug&&console.warn(`[ServerTransport] No interested clients for subject: ${r}`),e.type===`response`)return!1;if(!r)throw Error(`No connected clients available to receive message`)}return s}onReceive(e){return this.handlers.add(e),()=>{this.handlers.delete(e)}}cancelRequest(e,t){this.correlations.cancel(e,t)}onBroadcastResults(e,t,n){this.broadcastAggregator.handleNodeResults(e,t,n)}async subscribe(e,t,n=[]){let r=this.serverSubscriptions.get(e)?.filter,i=t??r;if(this.serverSubscriptions.set(e,{filter:i,priorities:n}),this.registry.size>0){let t=a(new Map([[e,{filter:i,priorities:n}]])),r=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,r)}}getConnectionCount(){return this.registry.getReadyClients().length}async unsubscribe(e){if(this.serverSubscriptions.delete(e),this.registry.size>0){let t=o({[e]:[]}),n=JSON.stringify(t);for(let e of this.registry.getReadyClients())this.sendToClientSafely(e,n)}}};function xe(e,t){let n=new Event(`close`);return Object.defineProperties(n,{code:{value:e??1e3,enumerable:!0},reason:{value:t??``,enumerable:!0}}),n}function Se(e){if(typeof e!=`object`||!e)throw TypeError(`WebSocket transport options must be an object`);let t=e;if(t.mode!==`client`&&t.mode!==`server`)throw TypeError(`WebSocket transport mode must be "client" or "server"`);if(t.mode===`client`){if(!Ce(t.websocket))throw TypeError(`WebSocket transport client mode requires a websocket with addEventListener/removeEventListener`);return}if(!we(t.websocket))throw TypeError(`WebSocket transport server mode requires a websocket with on/off listener methods`)}function Ce(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.send==`function`&&typeof t.close==`function`&&typeof t.addEventListener==`function`&&typeof t.removeEventListener==`function`}function we(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.on==`function`&&typeof t.off==`function`&&typeof t.close==`function`}var Te=class{secret;algorithm;challengeTimeout;identityId;resolveSecret;resolvePeer;pendingChallenge;pendingResult;queuedChallengeNonce;queuedResult;clientAuthComplete=!1;serverPendingResponses=new Map;serverAuthenticatedSockets=new Set;serverAuthenticatedPeers=new Map;constructor(e){this.secret=e.secret,this.algorithm=e.algorithm??`sha256`,this.challengeTimeout=e.challengeTimeout??5e3,this.identityId=e.identityId,this.resolveSecret=e.resolveSecret,this.resolvePeer=e.resolvePeer}async authenticateServer(e,t){let n=crypto.getRandomValues(new Uint8Array(32)),r=Array.from(n).map(e=>e.toString(16).padStart(2,`0`)).join(``),i=await this.computeHmac(r);t({type:`auth-challenge`,nonce:r});let a=!1;try{let{signature:n,identityId:o}=await this.waitForAuthResponseWithIdentity(e),s;if(this.resolveSecret&&o!==void 0){let i=this.resolveSecret(o);if(i===null)throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Unknown identity`}),a=!0,Error(`HMAC authentication failed: Unknown identity '${o}'`);s=await this.computeHmacWithSecret(r,i),this.constantTimeEqual(n,s)&&this.serverAuthenticatedPeers.set(e,o)}else s=i;if(!this.constantTimeEqual(n,s))throw this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:`Invalid signature`}),a=!0,Error(`HMAC authentication failed: Invalid signature`);this.serverAuthenticatedSockets.add(e),this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!0}),a=!0}catch(n){let r=this.serverPendingResponses.has(e);throw this.serverPendingResponses.delete(e),!a&&r&&this.sendAuthResultBestEffort(t,{type:`auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingResponses.delete(e)}}async authenticateClient(e){this.clientAuthComplete=!1;let t=await this.waitForAuthChallenge();e({type:`auth-response`,signature:await this.computeHmac(t),...this.identityId!==void 0&&{identityId:this.identityId}});let n=await this.waitForAuthResult();if(!n.success)throw Error(`HMAC authentication failed: ${n.error??`Unknown error`}`);this.clientAuthComplete=!0}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`auth-challenge`)return typeof n.nonce!=`string`||this.clientAuthComplete||(this.pendingChallenge?(clearTimeout(this.pendingChallenge.timeoutHandle),this.pendingChallenge.resolve(n.nonce),this.pendingChallenge=void 0):this.queuedChallengeNonce=n.nonce),!0;if(n.type===`auth-result`){if(typeof n.success!=`boolean`||this.clientAuthComplete)return!0;let e={success:n.success,error:n.error};return this.pendingResult?(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve(e),this.pendingResult=void 0):this.queuedResult=e,!0}if(n.type===`auth-response`){if(t){let e=this.serverPendingResponses.get(t);e&&(clearTimeout(e.timeoutHandle),e.resolve({signature:n.signature,identityId:n.identityId}))}return!0}return!1}async waitForAuthChallenge(){if(this.queuedChallengeNonce!==void 0){let e=this.queuedChallengeNonce;return this.queuedChallengeNonce=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingChallenge=void 0,t(Error(`Authentication challenge timeout`))},this.challengeTimeout);this.pendingChallenge={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResponseWithIdentity(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{n(Error(`Authentication response timeout`))},this.challengeTimeout)};this.serverPendingResponses.set(e,r)})}async waitForAuthResult(){if(this.queuedResult!==void 0){let e=this.queuedResult;return this.queuedResult=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`Authentication result timeout`))},this.challengeTimeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async computeHmac(e){return this.computeHmacWithSecret(e,this.secret)}async computeHmacWithSecret(e,t){let n=new TextEncoder,r=n.encode(t),i=this.algorithm.replace(/^sha/,`SHA-`),a=await crypto.subtle.importKey(`raw`,r,{name:`HMAC`,hash:i},!1,[`sign`]),o=await crypto.subtle.sign(`HMAC`,a,n.encode(e));return Array.from(new Uint8Array(o)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}getReceiveContext(e){if(!e)return;let t=this.serverAuthenticatedPeers.get(e);if(t===void 0)return;let n=this.resolvePeer?.(t);if(this.resolvePeer!==void 0&&n===null)return;let r=n??{kind:`workflow-execution`,id:t};return{transportName:``,peer:{...r,id:r.id??t,authenticated:!0}}}isSocketAuthenticated(e){if(!this.serverAuthenticatedSockets.has(e))return!1;if(!this.resolveSecret)return!0;let t=this.serverAuthenticatedPeers.get(e);return t===void 0?!0:this.resolveSecret(t)===null?(this.cleanupSocket(e),!1):!0}constantTimeEqual(e,t){if(e.length!==t.length)return!1;let n=new Uint8Array(e.length/2),r=new Uint8Array(t.length/2);for(let i=0;i<n.length;i++)n[i]=parseInt(e.slice(i*2,i*2+2),16),r[i]=parseInt(t.slice(i*2,i*2+2),16);let i=0;for(let e=0;e<n.length;e++)i|=n[e]^r[e];return i===0}sendAuthResultBestEffort(e,t){try{e(t)}catch{}}cleanupSocket(e){let t=this.serverPendingResponses.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingResponses.delete(e),t.reject(Error(`Socket disconnected during HMAC authentication`))),this.serverAuthenticatedPeers.delete(e),this.serverAuthenticatedSockets.delete(e)}cleanup(){this.pendingChallenge&&=(clearTimeout(this.pendingChallenge.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.queuedChallengeNonce=void 0,this.queuedResult=void 0,this.clientAuthComplete=!1;for(let e of this.serverPendingResponses.values())clearTimeout(e.timeoutHandle);this.serverPendingResponses.clear(),this.serverAuthenticatedPeers.clear(),this.serverAuthenticatedSockets.clear()}};const w=new Map;function Ee(e,t,n={}){if(e.trim().length===0)throw Error(`registerHmacIdentitySecret requires a non-empty identityId`);if(t.length===0)throw Error(`registerHmacIdentitySecret requires a non-empty secret`);let r={secret:t,peerKind:n.peerKind?.trim()||`workflow-execution`};w.set(e,r);let i=!0;return()=>{i&&(i=!1,w.get(e)===r&&w.delete(e))}}function De(e){return w.get(e)?.secret??null}function Oe(e){let t=w.get(e);return t?{kind:t.peerKind,id:e,authenticated:!0}:null}function ke(){w.clear()}function T(e){let t=Array.from(e,e=>String.fromCharCode(e)).join(``);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``)}function E(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=(4-t.length%4)%4;t+=`=`.repeat(n);let r=atob(t),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function D(e){return new TextEncoder().encode(e)}function O(e){return new TextDecoder().decode(e)}async function k(e){let t=await crypto.subtle.exportKey(`spki`,e);return T(new Uint8Array(t))}async function A(e){let t=await crypto.subtle.exportKey(`raw`,e);return T(new Uint8Array(t))}async function j(e,t,n=[]){let r=E(e);return crypto.subtle.importKey(`spki`,r,t,!0,n)}async function M(e,t,n=[]){let r=E(e);return crypto.subtle.importKey(`raw`,r,t,!0,n)}async function N(e){let t=await crypto.subtle.exportKey(`pkcs8`,e),n=T(new Uint8Array(t)).replace(/-/g,`+`).replace(/_/g,`/`),r=(4-n.length%4)%4;return n+=`=`.repeat(r),`-----BEGIN PRIVATE KEY-----\n${n.match(/.{1,64}/g)?.join(`
|
|
2
|
+
`)??n}\n-----END PRIVATE KEY-----`}async function P(e,t,n){let r=E(e.replace(/-----BEGIN PRIVATE KEY-----/,``).replace(/-----END PRIVATE KEY-----/,``).replace(/\s/g,``).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=/g,``));return crypto.subtle.importKey(`pkcs8`,r,t,!0,n)}const F={name:`ECDH`,namedCurve:`P-256`};async function I(e=!0){return crypto.subtle.generateKey(F,e,[`deriveKey`,`deriveBits`])}async function L(e){return k(e)}async function Ae(e){return A(e)}async function je(e){return M(e,F)}async function R(e,t=[]){return j(e,F,t)}async function Me(e){return N(e)}async function Ne(e){return P(e,F,[`deriveKey`,`deriveBits`])}async function z(e,t){return crypto.subtle.deriveBits({name:`ECDH`,public:t},e,256)}async function B(e,t){let n=crypto.getRandomValues(new Uint8Array(12)),r=await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,t);return{ciphertext:new Uint8Array(r),nonce:n}}async function V(e,t,n){let r=await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,t);return new Uint8Array(r)}async function Pe(e){return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,[`encrypt`,`decrypt`])}async function H(e,t,n){let r=await crypto.subtle.importKey(`raw`,e,{name:`HKDF`},!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:t,info:D(n)},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}const U={name:`ECDSA`,namedCurve:`P-256`};async function Fe(e=!0){return crypto.subtle.generateKey(U,e,[`sign`,`verify`])}async function W(e,t){let n=await crypto.subtle.sign({name:`ECDSA`,hash:{name:`SHA-256`}},e,t);return new Uint8Array(n)}async function G(e,t,n){return crypto.subtle.verify({name:`ECDSA`,hash:{name:`SHA-256`}},e,t,n)}async function Ie(e){return k(e)}async function Le(e){return j(e,U,[`verify`])}async function Re(e){return A(e)}async function ze(e){return M(e,U,[`verify`])}async function Be(e){return N(e)}async function Ve(e){return P(e,U,[`sign`])}var He=e({decodeText:()=>O,decrypt:()=>V,deriveSessionKey:()=>H,deriveSharedSecret:()=>z,encodeText:()=>D,encrypt:()=>B,exportPrivateKeyPEM:()=>Me,exportPublicKey:()=>L,exportPublicKeyRaw:()=>Ae,exportSigningPrivateKeyPEM:()=>Be,exportSigningPublicKey:()=>Ie,exportSigningPublicKeyRaw:()=>Re,fromBase64Url:()=>E,generateECDHKeyPair:()=>I,generateSigningKeyPair:()=>Fe,importAESKey:()=>Pe,importPrivateKeyPEM:()=>Ne,importPublicKey:()=>R,importPublicKeyRaw:()=>je,importSigningPrivateKeyPEM:()=>Ve,importSigningPublicKey:()=>Le,importSigningPublicKeyRaw:()=>ze,sign:()=>W,toBase64Url:()=>T,verify:()=>G});function K(e){let t=e.match(/.{1,2}/g);return new Uint8Array(t?.map(e=>parseInt(e,16))??[])}function q(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function J(e,t){let n=await I(!0),r=await L(n.publicKey);return{ephemeralKeyPair:n,ephemeralPublicKey:r,signature:q(await W(e,D(r+t)))}}function Ue(){return q(crypto.getRandomValues(new Uint8Array(16)))}async function Y(e,t,n,r){let i=D(t+r);return G(e,K(n),i)}async function X(e,t,n,r){return H(await z(e,await R(t)),K(n),r)}async function We(e,t,n,r){if(e===t)throw Error(`deriveRelaySaltHex: identityId must differ from peerId`);let[i,a]=e<t?[e,t]:[t,e],[o,s]=e<t?[n,r]:[r,n],c=D(`${i}${a}${o}${s}`),l=new Uint8Array(c).buffer,u=await crypto.subtle.digest(`SHA-256`,l);return q(new Uint8Array(u))}var Ge=class{signingKeyPair;identityId;peerId;getPeerSigningKey;timeout;pendingKeyExchange;pendingResult;clientSession;clientEphemeralKeyPair;serverPendingKeyExchange=new Map;serverSessions=new Map;serverEphemeralKeyPairs=new Map;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.peerId=e.peerId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4}async authenticateClient(e){if(!this.peerId)throw Error(`E2E authentication failed: peerId is required for client authentication`);let{ephemeralKeyPair:t,ephemeralPublicKey:n,signature:r}=await J(this.signingKeyPair.privateKey,this.identityId);this.clientEphemeralKeyPair=t;try{let i=this.waitForKeyExchangeResponse(),a=this.waitForAuthResult();e({type:`e2e-key-exchange`,deviceId:this.identityId,ephemeralPublicKey:n,signature:r});let o=await i,s=await this.getPeerSigningKey(this.peerId);if(!s)throw Error(`E2E authentication failed: Unknown server`);if(!await Y(s,o.ephemeralPublicKey,o.signature,this.peerId))throw Error(`E2E authentication failed: Invalid server signature`);let c=await X(t.privateKey,o.ephemeralPublicKey,o.salt,`makaio-e2e-session-v1`);this.clientSession={sessionKey:c,peerId:this.peerId};let l=await a;if(!l.success)throw Error(`E2E authentication failed: ${l.error??`Unknown error`}`)}catch(e){throw this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0,e}}async authenticateServer(e,t){try{let n=await this.waitForClientKeyExchange(e),r=await this.getPeerSigningKey(n.deviceId);if(!r)throw t({type:`e2e-auth-result`,success:!1,error:`Unknown device`}),Error(`E2E authentication failed: Unknown device ${n.deviceId}`);if(!await Y(r,n.ephemeralPublicKey,n.signature,n.deviceId))throw t({type:`e2e-auth-result`,success:!1,error:`Invalid signature`}),Error(`E2E authentication failed: Invalid client signature`);let{ephemeralKeyPair:i,ephemeralPublicKey:a,signature:o}=await J(this.signingKeyPair.privateKey,this.identityId),s=Ue();this.serverEphemeralKeyPairs.set(e,i),t({type:`e2e-key-exchange-response`,ephemeralPublicKey:a,signature:o,salt:s});let c=await X(i.privateKey,n.ephemeralPublicKey,s,`makaio-e2e-session-v1`);this.serverSessions.set(e,{sessionKey:c,peerId:n.deviceId}),t({type:`e2e-auth-result`,success:!0})}catch(n){throw this.serverPendingKeyExchange.delete(e),this.serverEphemeralKeyPairs.delete(e),t({type:`e2e-auth-result`,success:!1,error:n instanceof Error?n.message:`Authentication failed`}),n}finally{this.serverPendingKeyExchange.delete(e)}}handleAuthMessage(e,t){if(typeof e!=`object`||!e||!(`type`in e)||typeof e.type!=`string`)return!1;let n=e;if(n.type===`e2e-key-exchange-response`)return this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),this.pendingKeyExchange.resolve({ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature,salt:n.salt}),void 0),!0;if(n.type===`e2e-auth-result`)return this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),this.pendingResult.resolve({success:n.success,error:n.error}),void 0),!0;if(n.type===`e2e-key-exchange`&&t){let e=this.serverPendingKeyExchange.get(t);return e&&(clearTimeout(e.timeoutHandle),e.resolve({deviceId:n.deviceId,ephemeralPublicKey:n.ephemeralPublicKey,signature:n.signature})),!0}return!1}async waitForKeyExchangeResponse(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingKeyExchange=void 0,t(Error(`E2E key exchange timeout`))},this.timeout);this.pendingKeyExchange={resolve:e,reject:t,timeoutHandle:n}})}async waitForAuthResult(){return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingResult=void 0,t(Error(`E2E authentication result timeout`))},this.timeout);this.pendingResult={resolve:e,reject:t,timeoutHandle:n}})}async waitForClientKeyExchange(e){return new Promise((t,n)=>{let r={resolve:t,reject:n,timeoutHandle:setTimeout(()=>{this.serverPendingKeyExchange.delete(e),n(Error(`E2E key exchange timeout`))},this.timeout)};this.serverPendingKeyExchange.set(e,r)})}getSessionKey(e){return e?this.serverSessions.get(e)?.sessionKey??null:this.clientSession?.sessionKey??null}getPeerId(e){return e?this.serverSessions.get(e)?.peerId??null:this.clientSession?.peerId??null}getReceiveContext(e){let t=this.getPeerId(e);if(t!==null)return{transportName:``,peer:{kind:`e2e`,id:t,authenticated:!0,encrypted:!0}}}cleanupSocket(e){let t=this.serverPendingKeyExchange.get(e);t&&(clearTimeout(t.timeoutHandle),this.serverPendingKeyExchange.delete(e)),this.serverSessions.delete(e),this.serverEphemeralKeyPairs.delete(e)}cleanup(){this.pendingKeyExchange&&=(clearTimeout(this.pendingKeyExchange.timeoutHandle),void 0),this.pendingResult&&=(clearTimeout(this.pendingResult.timeoutHandle),void 0),this.clientSession=void 0,this.clientEphemeralKeyPair=void 0;for(let e of this.serverPendingKeyExchange.values())clearTimeout(e.timeoutHandle);this.serverPendingKeyExchange.clear(),this.serverSessions.clear(),this.serverEphemeralKeyPairs.clear()}};const Z=`E2E relay auth session aborted by reconnect`;var Ke=class{signingKeyPair;identityId;getPeerSigningKey;timeout;mode;blocking;pendingPeer;sessionKey;peerId;localEphemeral;localExchangeMessage;sentLocalExchange=!1;earlyPeer;sendAuthMessage;authGeneration=0;processingExchange=!1;constructor(e){this.signingKeyPair=e.signingKeyPair,this.identityId=e.identityId,this.getPeerSigningKey=e.getPeerSigningKey,this.timeout=e.timeout??1e4,this.mode=e.mode??`initiator`,this.blocking=e.blocking??!0}async authenticateClient(e){let t=this.sendAuthMessage===void 0?this.earlyPeer:void 0;this.cleanup();let n=this.authGeneration;if(this.earlyPeer=t,this.sendAuthMessage=e,this.mode===`initiator`){if(await this.ensureLocalExchangeMessage(),n!==this.authGeneration)throw Error(Z);this.sendLocalExchange()}if(!this.blocking){if(this.earlyPeer){let e=this.earlyPeer;this.earlyPeer=void 0,this.dispatchPeerExchange(e,n)}return}let r=await this.waitForPeerExchange();if(await this.processPeerExchange(r,n),n!==this.authGeneration||!this.sessionKey)throw Error(Z)}async authenticateServer(e,t){throw Error(`E2ERelayAuth does not support server authentication`)}handleAuthMessage(e){let t=e;return!t||t.type!==`e2e-relay-key-exchange`?!1:t.identityId===this.identityId?!0:this.pendingPeer?(this.pendingPeer.resolve(t),this.pendingPeer=void 0,!0):(this.earlyPeer=t,!this.blocking&&this.sendAuthMessage&&!this.sessionKey&&!this.processingExchange&&this.dispatchPeerExchange(t,this.authGeneration),!0)}cleanupSocket(e){}cleanup(){this.authGeneration++,this.pendingPeer&&=(this.pendingPeer.reject(Error(Z)),void 0),this.earlyPeer&&=void 0,this.sessionKey=void 0,this.peerId=void 0,this.localEphemeral=void 0,this.localExchangeMessage=void 0,this.sentLocalExchange=!1,this.processingExchange=!1,this.sendAuthMessage=void 0}dispatchPeerExchange(e,t){this.processingExchange=!0,this.processPeerExchange(e,t).catch(e=>{e instanceof Error&&e.message===Z||console.error(`[E2ERelayAuth] Peer exchange failed:`,e)}).finally(()=>{t===this.authGeneration&&(this.processingExchange=!1,this.retryQueuedPeerExchange(t))})}getSessionKey(){return this.sessionKey??null}getPeerId(){return this.peerId??null}getReceiveContext(){let e=this.getPeerId();if(e!==null)return{transportName:``,peer:{kind:`e2e`,id:e,authenticated:!0,encrypted:!0}}}async waitForPeerExchange(){if(this.earlyPeer){let e=this.earlyPeer;return this.earlyPeer=void 0,e}return new Promise((e,t)=>{let n=setTimeout(()=>{this.pendingPeer=void 0,t(Error(`E2E relay key exchange timeout`))},this.timeout),r=()=>{clearTimeout(n),this.pendingPeer=void 0};this.pendingPeer={resolve:t=>{r(),e(t)},reject:e=>{r(),t(e)},timeoutHandle:n}})}async ensureLocalExchangeMessage(){if(this.localExchangeMessage&&this.localEphemeral)return this.localExchangeMessage;let{ephemeralKeyPair:e,ephemeralPublicKey:t,signature:n}=await J(this.signingKeyPair.privateKey,this.identityId);return this.localEphemeral=e,this.localExchangeMessage={type:`e2e-relay-key-exchange`,identityId:this.identityId,ephemeralPublicKey:t,signature:n},this.localExchangeMessage}sendLocalExchange(e=!1){!this.sendAuthMessage||!this.localExchangeMessage||!e&&this.sentLocalExchange||(this.sendAuthMessage(this.localExchangeMessage),this.sentLocalExchange=!0)}retryQueuedPeerExchange(e){if(this.blocking||!this.sendAuthMessage||this.sessionKey||this.processingExchange||e!==this.authGeneration)return;let t=this.earlyPeer;t&&(this.earlyPeer=void 0,this.dispatchPeerExchange(t,e))}async processPeerExchange(e,t){if(!this.sendAuthMessage){this.earlyPeer=e;return}let n=await this.ensureLocalExchangeMessage();if(t!==this.authGeneration)return;let r=await this.getPeerSigningKey(e.identityId);if(!r)throw Error(`E2E relay authentication failed: Unknown peer ${e.identityId}`);if(!await Y(r,e.ephemeralPublicKey,e.signature,e.identityId))throw Error(`E2E relay authentication failed: Invalid peer signature`);let i=await We(this.identityId,e.identityId,n.ephemeralPublicKey,e.ephemeralPublicKey);if(!this.localEphemeral)throw Error(`E2E relay authentication failed: Local ephemeral key missing`);let a=await X(this.localEphemeral.privateKey,e.ephemeralPublicKey,i,`makaio-e2e-relay-v1`);t===this.authGeneration&&(this.sessionKey=a,this.peerId=e.identityId,this.mode===`initiator`?this.sendLocalExchange(!0):this.sendLocalExchange())}},qe=class{hmac;e2e;socketStrategy=new Map;pendingServerAuth=new Map;hmacCancelled=new Map;constructor(e){this.hmac=e.hmac,this.e2e=e.e2e}setE2EAuth(e){this.e2e=e}async authenticateClient(e){let t=this.hmac??this.e2e;if(!t)throw Error(`DispatchingAuth: no auth strategy configured`);return t.authenticateClient(e)}async authenticateServer(e,t){let n=this.resolveSingleStrategy();if(n)return n.authenticateServer(e,t);if(!this.hmac||!this.e2e)throw Error(`DispatchingAuth: no auth strategy configured`);let r={cancelled:!1};this.hmacCancelled.set(e,r);let i=this.hmac.authenticateServer(e,e=>{r.cancelled||t(e)});return new Promise((n,a)=>{this.pendingServerAuth.set(e,{resolve:n,reject:a,send:t}),i.then(n).catch(e=>{r.cancelled||a(e instanceof Error?e:Error(String(e)))})})}handleAuthMessage(e,t){if(!t)return(this.hmac??this.e2e)?.handleAuthMessage(e)??!1;let n=this.socketStrategy.get(t);if(n)return n.handleAuthMessage(e,t);let r=this.resolveStrategy(e),i=this.pendingServerAuth.get(t);return r?(this.socketStrategy.set(t,r),this.pendingServerAuth.delete(t),r===this.hmac?this.hmacCancelled.delete(t):(this.cancelHmac(t),i&&r.authenticateServer(t,i.send).then(i.resolve).catch(e=>{i.reject(e instanceof Error?e:Error(String(e)))})),r.handleAuthMessage(e,t)):(this.cancelHmac(t),i&&(this.pendingServerAuth.delete(t),i.reject(Error(`DispatchingAuth: unrecognised auth message type "${this.peekType(e)}" — no matching strategy`))),!1)}cleanupSocket(e){let t=this.socketStrategy.get(e);t&&(t.cleanupSocket(e),this.socketStrategy.delete(e)),this.cancelHmac(e);let n=this.pendingServerAuth.get(e);n&&(this.pendingServerAuth.delete(e),n.reject(Error(`DispatchingAuth: socket disconnected before auth type was determined`)))}cleanup(){this.hmac?.cleanup(),this.e2e?.cleanup(),this.socketStrategy.clear();for(let e of this.pendingServerAuth.values())e.reject(Error(`DispatchingAuth: cleanup called before authentication completed`));this.pendingServerAuth.clear(),this.hmacCancelled.clear()}peekType(e){if(typeof e!=`object`||!e||!(`type`in e))return;let{type:t}=e;return typeof t==`string`?t:void 0}resolveSingleStrategy(){if(this.hmac&&!this.e2e)return this.hmac;if(this.e2e&&!this.hmac)return this.e2e}resolveStrategy(e){let t=this.peekType(e);if(t){if(t===`e2e-key-exchange`&&this.e2e)return this.e2e;if(t===`auth-response`&&this.hmac)return this.hmac}}cancelHmac(e){let t=this.hmacCancelled.get(e);t&&(t.cancelled=!0,this.hmacCancelled.delete(e),this.hmac?.cleanupSocket(e))}};function Je(e){return`payload`in e}async function Ye(e,t,n){if(e.type!==`response`||e.result===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.result)));t.result=T(r),t.e2e={nonce:T(i),v:1}}async function Xe(e,t,n){if(e.type!==`broadcast-response`||e.results===void 0||e.error!==void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.results)));t.results=T(r),t.e2e={nonce:T(i),v:1}}async function Ze(e,t,n){if(!Je(e)||e.payload===void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.payload)));t.payload=T(r),t.e2e={nonce:T(i),v:1}}async function Qe(e,t,n){if(e.type!==`response`&&e.type!==`broadcast-response`||e.error===void 0)return;let{ciphertext:r,nonce:i}=await B(n,D(JSON.stringify(e.error)));t.error=T(r),t.e2e={nonce:T(i),v:1}}async function $e(e,t,n,r){if(!Je(e)||typeof e.payload!=`string`)return;let i=O(await V(n,E(e.payload),r));t.payload=JSON.parse(i)}async function et(e,t,n,r){if(e.type!==`response`||typeof e.result!=`string`)return;let i=O(await V(n,E(e.result),r));t.result=JSON.parse(i)}async function tt(e,t,n,r){if(e.type!==`broadcast-response`||typeof e.results!=`string`)return;let i=O(await V(n,E(e.results),r));t.results=JSON.parse(i)}async function nt(e,t,n,r){if(e.type!==`response`&&e.type!==`broadcast-response`||typeof e.error!=`string`)return;let i=O(await V(n,E(e.error),r));t.error=JSON.parse(i)}async function rt(e,t){let n={...e};return await Ze(e,n,t),await Ye(e,n,t),await Xe(e,n,t),await Qe(e,n,t),n}async function it(e,t){if(!e.e2e)return e;let n={...e};delete n.e2e;let r=E(e.e2e.nonce);return await $e(e,n,t,r),await et(e,n,t,r),await tt(e,n,t,r),await nt(e,n,t,r),n}function at(e){return e.type===`subscription-ack`&&typeof e.ackId==`string`}function ot(e){let{e2eAuth:t,websocket:n,...r}=e,i=new b({...r,url:`<pre-connected>`,createWebSocket:()=>n,auth:t,autoReconnect:!1,messageTransform:async e=>{let n=t.getSessionKey();if(!n||at(e))return e;let r=e;if(!r.e2e)throw Error(`Received plaintext message on E2E-encrypted channel — possible injection`);return it(r,n)}});async function a(e,n){let r=t.getSessionKey();if(!r)throw Error(`E2E session key not available - authentication may have failed`);let a=await rt(e,r);return i.send(a,n)}return{name:i.name,connect:i.connect.bind(i),disconnect:i.disconnect.bind(i),send:a,cancelRequest:i.cancelRequest.bind(i),onReceive:i.onReceive.bind(i),subscribe:i.subscribe.bind(i),unsubscribe:i.unsubscribe.bind(i),getSubscriptions:i.getSubscriptions.bind(i)}}function st(e){return ot(e)}function ct(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`e2e-relay-envelope`||typeof t.payload!=`string`)return!1;let n=t.e2e;return!!n&&typeof n.nonce==`string`&&typeof n.v==`number`}async function lt(e,t){let{ciphertext:n,nonce:r}=await B(t,D(JSON.stringify(e)));return{type:`e2e-relay-envelope`,payload:T(n),e2e:{nonce:T(r),v:1}}}async function ut(e,t){let n=E(e.e2e.nonce),r=O(await V(t,E(e.payload),n));return JSON.parse(r)}function dt(e){let t=()=>{if(!e.isFrozen())throw Error(`RelayControlRegistry must be frozen before processing relay control messages`)};function n(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlEvent(t.namespace,t.subject)||typeof t.messageId!=`string`?!1:t.payload!==void 0}function r(t){return typeof t.namespace!=`string`||typeof t.subject!=`string`||!e.isControlRequest(t.namespace,t.subject)||typeof t.messageId!=`string`||typeof t.correlationId!=`string`?!1:t.payload!==void 0}function i(e){if(t(),!e||typeof e!=`object`)return!1;let i=e;return i.type===`event`?n(i):i.type===`request`?r(i):!1}function a(e){if(t(),!e||typeof e!=`object`)return!1;let n=e;return n.type!==`relay-control`||n.v!==1||!n.payload||typeof n.payload!=`object`?!1:i(n.payload)}function o(e){if(t(),!i(e))throw Error(`Invalid relay control message`);return{type:`relay-control`,v:1,payload:e}}return{createRelayControlEnvelope:o,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:i}}function Q(e){let t=Date.now()-3e5;for(let[n,r]of e)r>=t||e.delete(n);for(;e.size>2048;){let t=e.keys().next().value;if(!t)break;e.delete(t)}}const ft=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`response`&&typeof t.correlationId==`string`},pt=e=>e.type===`subscribe`||e.type===`unsubscribe`,mt=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`subscription-ack`&&typeof t.ackId==`string`};function $(e,t,n,r){if(!r.isFrozen())throw Error(`E2ERelay transport requires a frozen relay control registry`);let{createRelayControlEnvelope:i,isRelayControlEnvelopeMessage:a,isRelayControlBusMessage:o}=dt(r),s=e=>{n.delete(e),n.set(e,Date.now()),Q(n)};return{encode:async t=>{if(o(t))return t.type===`request`&&s(t.correlationId),JSON.stringify(i(t));if(Q(n),t.type===`response`&&n.has(t.correlationId))return n.delete(t.correlationId),JSON.stringify(t);let r=e.getSessionKey();if(!r&&pt(t)||!r&&mt(t))return JSON.stringify(t);if(!r)throw Error(`E2E relay session not established`);let a=await lt(t,r);return JSON.stringify(a)},decode:async r=>{let i=e.getSessionKey();if(a(r)){let e=r.payload;return t&&console.info(`[E2ERelayTransport] Decoded relay control envelope:`,e.type,e.namespace,e.subject),e.type===`request`&&s(e.correlationId),e}if(Q(n),ft(r)&&n.has(r.correlationId))return n.delete(r.correlationId),r;if(!i&&mt(r))return r;if(!i)throw Error(`E2E relay session not established`);if(!ct(r))throw Error(`Received plaintext message on relay E2E channel — possible injection`);return ut(r,i)}}}function ht(e,t,n=!1){let r=new Map;return{codec:$(e,n,r,t),reset:()=>r.clear()}}function gt(e){let{e2eAuth:t,registry:n,websocket:r,...i}=e,a=e.debug??!1,o=new Map,s=$(t,a,o,n);a&&console.info(`[E2ERelayTransport] Creating inner transport...`);let c=new b({...i,url:`<pre-connected>`,createWebSocket:()=>r,auth:t,codec:s,autoReconnect:!1});return a&&console.info(`[E2ERelayTransport] Inner transport created`),{name:c.name,connect:async()=>{if(!n.isFrozen())throw Error(`E2ERelayClientTransport: registry must be frozen before connect()`);o.clear();try{await c.connect()}catch(e){throw o.clear(),e}},disconnect:async()=>{o.clear();try{await c.disconnect()}finally{o.clear()}},send:c.send.bind(c),cancelRequest:c.cancelRequest.bind(c),onReceive:(...e)=>(a&&console.info(`[E2ERelayTransport] onReceive called, delegating to inner transport`),c.onReceive(...e)),subscribe:c.subscribe.bind(c),unsubscribe:c.unsubscribe.bind(c),getSubscriptions:c.getSubscriptions.bind(c),isReady:()=>!!t.getSessionKey()&&c.isReady()}}function _t(){let e=!1,t=new Map,n=new Map,r=()=>{if(e)throw Error(`RelayControlRegistry is frozen and cannot be modified`)};return{registerEventSubjects(e,n){r();let i=t.get(e)??new Set;for(let e of n)i.add(e);t.set(e,i)},registerRequestNamespace(e,t){if(r(),t.length===0)throw Error(`RelayControlRegistry request namespace "${e}" requires at least one subject`);let i=n.get(e)??new Set;for(let e of t)i.add(e);n.set(e,i)},freeze(){e=!0},isFrozen(){return e},isControlEvent(e,n){return t.get(e)?.has(n)??!1},isControlRequest(e,t){return n.get(e)?.has(t)??!1}}}function vt(e){if(Se(e),e.mode===`client`){if(e.connectionOptions!==void 0)throw Error(`createWebSocketTransport(client) does not support connectionOptions when wrapping a pre-created WebSocket. Use WebSocketClientTransport for reconnect or dial-time socket options.`);let t=e.websocket;return new b({url:`<pre-connected>`,createWebSocket:()=>t,auth:e.auth,debug:e.debug,autoReconnect:!1})}else return new C({websocket:e.websocket,auth:e.auth,debug:e.debug})}export{qe as DispatchingAuth,Ge as E2EAuth,Ke as E2ERelayAuth,Te as HmacAuth,C as ServerTransport,b as WebSocketClientTransport,ke as clearHmacIdentitySecretsForTesting,st as createE2EClientTransport,gt as createE2ERelayClientTransport,ht as createE2ERelayCodec,dt as createRelayControlHelpers,_t as createRelayControlRegistry,xe as createWebSocketCloseEvent,vt as createWebSocketTransport,He as crypto,h as extractSocketErrorMessage,Ee as registerHmacIdentitySecret,Oe as resolveHmacIdentityPeer,De as resolveHmacIdentitySecret};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./namespace-DuXK5AYN.mjs";import{MakaioBus as t}from"@makaio/framework/bus";import{AdapterSubjects as n,AgentSubjects as r,SessionSubjects as i}from"@makaio/framework/contracts";function a(){t.__resetHandlers?.()}function o(e=10){return new Promise(t=>setTimeout(t,e))}function s(e,t){let n=Date.now();return{agentId:e,adapterId:`adapter-${e}`,adapterName:`test-adapter`,sessionId:t?.sessionId??`test-session`,role:`member`,status:`idle`,createdAt:n,lastActivityAt:n,...t}}async function c(e,r=e){await t.emit(n.initialized,{adapterName:e,adapterId:r,capabilities:[]})}async function l(n){return(await t.request(e.getEvents,{sessionId:n})).events}function u(e,n,r){let i=[];return r.push(t.on(e,(e=>{let t=e.payload;i.push(n(t))}))),{received:i,clear:()=>{i.length=0}}}function d(e){return u(i.turn.started,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentIds:[...e.agentIds],initiator:e.initiator}),e)}function f(e){return u(i.turn.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,success:e.success,error:e.error,initiator:e.initiator}),e)}function p(e){return u(i.user_message.sent,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,content:e.content,agentIds:[...e.agentIds],origin:e.origin}),e)}function m(e){return u(i.user_message.acknowledged,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId}),e)}function h(e){return u(i.user_message.completed,e=>({sessionId:e.sessionId,turnId:e.turnId,messageId:e.messageId,agentId:e.agentId,outcome:e.outcome,error:e.error}),e)}const g=s;function _(e){let t=Date.now();return{sessionId:e.sessionId,createdAt:t,lastActivityAt:t,status:e.status??`active`,agents:e.agents??[],leadAgentId:e.leadAgentId,targetWorkingDirectory:e.targetWorkingDirectory}}function v(e){return t.on(i.create,t=>{let n=t.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`;e.set(n,_({sessionId:n,agents:[]})),t.setResult({sessionId:n})})}function y(e){return t.on(i.agent.added,t=>{let n=e.get(t.payload.sessionId);if(!n)return;let r=n.agents.length===0,i=t.payload.role??(r?`lead`:`member`);r&&(n.adapterSessionId=t.payload.adapterSessionId,n.adapterName=t.payload.adapterName,n.adapterId=t.payload.adapterId);let a=Date.now();n.agents.push({agentId:t.payload.agentId,adapterId:t.payload.adapterId,adapterName:t.payload.adapterName,sessionId:t.payload.sessionId,role:i,status:`idle`,createdAt:a,lastActivityAt:a}),i===`lead`&&(n.leadAgentId=t.payload.agentId),n.lastActivityAt=Date.now()})}function b(e){return t.on(i.get,t=>{t.setResult({session:e.get(t.payload.sessionId)??null})})}function x(e){return t.on(n.getAgent,t=>{for(let n of e.values()){let e=n.agents.find(e=>e.agentId===t.payload.agentId);if(e){t.setResult({agent:{agentId:e.agentId,sessionId:n.sessionId,adapterSessionId:``}});return}}t.setResult({agent:null})})}function S(){return t.on(n.rehydrateAgent,e=>{e.setResult({})})}function C(e=`/previous/cwd`){return t.on(r.cwd.change,t=>{t.setResult({success:!0,previousCwd:e})})}function w(){return t.on(r.model.change,e=>{e.setResult({success:!0,swapped:!1})})}function T(e){return t.on(n.startAgent,t=>{let{adapterId:n,initialMessage:r}=t.payload,i=t.payload.sessionId??`session-${crypto.randomUUID().slice(0,8)}`,a=`agent-${crypto.randomUUID().slice(0,8)}`,o=r?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,s=`adapter-session-${i}`;e?.({adapterId:n,sessionId:i,initialMessage:r}),t.setResult({success:!0,agentId:a,adapterId:n,adapterSessionId:s,sessionId:i,...o&&{messageId:o}}),j({sessionId:i,agentId:a,adapterId:n,adapterSessionId:s})})}function E(e){return t.on(n.startAgent,t=>{t.setResult({success:!1,message:e})})}function D(e){return t.on(r.sendMessage,t=>{let{agentId:n,adapterId:r,message:i,messageId:a,sessionContext:o,responseSchema:s}=t.payload,c=a??`msg-${crypto.randomUUID().slice(0,8)}`;e?.({agentId:n,adapterId:r,message:i,messageId:c,sessionContext:o,responseSchema:s}),t.setResult({messageId:c})})}function O(e,n){return t.on(r.sendMessage,t=>{if(e.has(t.payload.agentId))throw Error(n);t.setResult({messageId:t.payload.messageId??`generated-id`})})}async function k(e,n){await t.emit(r.complete,{agentId:e,adapterId:`adapter-${e}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e}`,messageId:n})}async function A(e,n){await t.emit(r.complete,{agentId:e,adapterId:`adapter-${e}`,adapterName:`test-adapter`,adapterSessionId:`adapter-session-${e}`,messageId:`msg-error-${e}`,outcome:`error`,error:n})}function j(e){setImmediate(()=>{t.emit(i.agent.added,{sessionId:e.sessionId,agentId:e.agentId,adapterId:e.adapterId,adapterName:e.adapterId,adapterSessionId:e.adapterSessionId,role:e.role})})}function M(e,r){let i=new Map,a=t.on(n.startAgent,t=>{r.payload=t.payload;let n=`agent-${crypto.randomUUID().slice(0,8)}`,a=t.payload.initialMessage?`msg-${crypto.randomUUID().slice(0,8)}`:void 0,o=`adapter-session-${e}`;i.set(n,{agentId:n,sessionId:e,adapterSessionId:o,adapterId:t.payload.adapterId}),t.setResult({success:!0,agentId:n,adapterId:t.payload.adapterId,adapterSessionId:o,sessionId:e,...a&&{messageId:a}}),j({sessionId:e,agentId:n,adapterId:t.payload.adapterId,adapterSessionId:o})}),o=t.on(n.getAgent,e=>{let t=i.get(e.payload.agentId);e.setResult({agent:t?{agentId:t.agentId,sessionId:t.sessionId,adapterSessionId:t.adapterSessionId}:null})});return()=>{a(),o()}}export{c as C,o as E,p as S,a as T,T as _,A as a,m as b,v as c,E as d,x as f,D as g,S as h,k as i,C as l,w as m,_ as n,y as o,b as p,j as r,M as s,g as t,O as u,f as v,l as w,h as x,d as y};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { IMakaioSession, MakaioSessionAgent, MakaioSessionEvent, MessageInput, MessageOutcome, ResponseSchemaDescriptor, TurnInitiator } from "@makaio/framework/contracts";
|
|
2
|
+
|
|
3
|
+
//#region services/core/src/session/__tests__/shared.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Resets all bus handlers between tests.
|
|
6
|
+
* Uses the internal __resetHandlers method available in test environment.
|
|
7
|
+
*/
|
|
8
|
+
declare function resetBusHandlers(): void;
|
|
9
|
+
/**
|
|
10
|
+
* Wait for async handler processing to complete.
|
|
11
|
+
* Useful for event-driven handlers that execute asynchronously.
|
|
12
|
+
* @param ms - Milliseconds to wait (default 10ms)
|
|
13
|
+
*/
|
|
14
|
+
declare function waitForAsync(ms?: number): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Creates a test agent with sensible defaults.
|
|
17
|
+
* @param agentId - The agent identifier
|
|
18
|
+
* @param overrides - Optional overrides for agent properties
|
|
19
|
+
* @returns A MakaioSessionAgent for testing
|
|
20
|
+
*/
|
|
21
|
+
declare function createTestAgent(agentId: string, overrides?: Partial<MakaioSessionAgent>): MakaioSessionAgent;
|
|
22
|
+
/**
|
|
23
|
+
* Emit `adapter.initialized` for tests that intentionally exercise the
|
|
24
|
+
* AdapterRegistry event cache or reverse adapter-name lookup.
|
|
25
|
+
*
|
|
26
|
+
* The framework `SessionOrchestrator` resolves name-based routing through
|
|
27
|
+
* `AdapterRuntimeSubjects.resolveId`; auto-attach tests should prefer mock
|
|
28
|
+
* runtime identity handlers unless they specifically need the event cache.
|
|
29
|
+
* @param adapterName - Adapter type name (e.g., `'test-adapter'`)
|
|
30
|
+
* @param adapterId - Adapter instance ID. Defaults to `adapterName` for test simplicity.
|
|
31
|
+
*/
|
|
32
|
+
declare function emitAdapterInitialized(adapterName: string, adapterId?: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Query stored session events.
|
|
35
|
+
* @param sessionId - Session ID to query
|
|
36
|
+
* @returns Array of stored events
|
|
37
|
+
*/
|
|
38
|
+
declare function getStoredEvents(sessionId: string): Promise<MakaioSessionEvent[]>;
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region services/core/src/session/testing/orchestrator-event-collectors.d.ts
|
|
41
|
+
/** Collected event payloads for test assertions. */
|
|
42
|
+
interface EventCollector<T> {
|
|
43
|
+
received: T[];
|
|
44
|
+
clear: () => void;
|
|
45
|
+
}
|
|
46
|
+
type UnsubscribeFunction = () => void;
|
|
47
|
+
type TurnStartedPayload = {
|
|
48
|
+
sessionId: string;
|
|
49
|
+
turnId: string;
|
|
50
|
+
messageId: string;
|
|
51
|
+
agentIds: string[];
|
|
52
|
+
};
|
|
53
|
+
type TurnCompletedPayload = {
|
|
54
|
+
sessionId: string;
|
|
55
|
+
turnId: string;
|
|
56
|
+
success: boolean;
|
|
57
|
+
error?: string;
|
|
58
|
+
initiator?: TurnInitiator;
|
|
59
|
+
};
|
|
60
|
+
type TurnStartedWithInitiatorPayload = TurnStartedPayload & {
|
|
61
|
+
initiator?: TurnCompletedPayload['initiator'];
|
|
62
|
+
};
|
|
63
|
+
type UserMessageSentPayload = {
|
|
64
|
+
sessionId: string;
|
|
65
|
+
turnId: string;
|
|
66
|
+
messageId: string;
|
|
67
|
+
content: MessageInput;
|
|
68
|
+
agentIds: string[];
|
|
69
|
+
origin?: 'voice' | 'text' | 'compact';
|
|
70
|
+
};
|
|
71
|
+
type UserMessageAcknowledgedPayload = {
|
|
72
|
+
sessionId: string;
|
|
73
|
+
turnId: string;
|
|
74
|
+
messageId: string;
|
|
75
|
+
agentId: string;
|
|
76
|
+
};
|
|
77
|
+
type UserMessageCompletedPayload = {
|
|
78
|
+
sessionId: string;
|
|
79
|
+
turnId: string;
|
|
80
|
+
messageId: string;
|
|
81
|
+
agentId: string;
|
|
82
|
+
outcome: MessageOutcome;
|
|
83
|
+
error?: string;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Collect session.turn.started events including initiator metadata.
|
|
87
|
+
* @param unsubs - Array to register the cleanup function into
|
|
88
|
+
* @returns Event collector for turn started payloads
|
|
89
|
+
*/
|
|
90
|
+
declare function collectTurnStartedEvents(unsubs: UnsubscribeFunction[]): EventCollector<TurnStartedWithInitiatorPayload>;
|
|
91
|
+
/**
|
|
92
|
+
* Collect session.turn.completed events.
|
|
93
|
+
* @param unsubs - Array to register the cleanup function into
|
|
94
|
+
* @returns Event collector for turn completed payloads
|
|
95
|
+
*/
|
|
96
|
+
declare function collectTurnCompletedEvents(unsubs: UnsubscribeFunction[]): EventCollector<TurnCompletedPayload>;
|
|
97
|
+
/**
|
|
98
|
+
* Collect session.user_message.sent events.
|
|
99
|
+
* @param unsubs - Array to register the cleanup function into
|
|
100
|
+
* @returns Event collector for user message sent payloads
|
|
101
|
+
*/
|
|
102
|
+
declare function collectUserMessageSentEvents(unsubs: UnsubscribeFunction[]): EventCollector<UserMessageSentPayload>;
|
|
103
|
+
/**
|
|
104
|
+
* Collect session.user_message.acknowledged events.
|
|
105
|
+
* @param unsubs - Array to register the cleanup function into
|
|
106
|
+
* @returns Event collector for user message acknowledged payloads
|
|
107
|
+
*/
|
|
108
|
+
declare function collectUserMessageAcknowledgedEvents(unsubs: UnsubscribeFunction[]): EventCollector<UserMessageAcknowledgedPayload>;
|
|
109
|
+
/**
|
|
110
|
+
* Collect session.user_message.completed events.
|
|
111
|
+
* @param unsubs - Array to register the cleanup function into
|
|
112
|
+
* @returns Event collector for user message completed payloads
|
|
113
|
+
*/
|
|
114
|
+
declare function collectUserMessageCompletedEvents(unsubs: UnsubscribeFunction[]): EventCollector<UserMessageCompletedPayload>;
|
|
115
|
+
//#endregion
|
|
116
|
+
//#region services/core/src/session/testing/orchestrator-shared.d.ts
|
|
117
|
+
/** Alias for {@link createTestAgent} - kept for orchestrator test naming consistency. */
|
|
118
|
+
declare const createMockAgent: typeof createTestAgent;
|
|
119
|
+
/** Configuration for creating mock sessions. */
|
|
120
|
+
interface MockSessionConfig {
|
|
121
|
+
sessionId: string;
|
|
122
|
+
status?: 'active' | 'closed';
|
|
123
|
+
agents?: MakaioSessionAgent[];
|
|
124
|
+
leadAgentId?: string;
|
|
125
|
+
targetWorkingDirectory?: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Create a mock session object for use in tests.
|
|
129
|
+
* @param config - Session configuration
|
|
130
|
+
* @returns Mock IMakaioSession
|
|
131
|
+
*/
|
|
132
|
+
declare function createMockSession(config: MockSessionConfig): IMakaioSession;
|
|
133
|
+
/**
|
|
134
|
+
* Register a bus handler for session.create that stores sessions in the provided map.
|
|
135
|
+
* @param sessions - Map to store created sessions
|
|
136
|
+
* @returns Unsubscribe function
|
|
137
|
+
*/
|
|
138
|
+
declare function registerCreateSessionHandler(sessions: Map<string, IMakaioSession>): UnsubscribeFunction;
|
|
139
|
+
/**
|
|
140
|
+
* Register a bus handler for session.agent.added that updates the sessions map.
|
|
141
|
+
* @param sessions - Map of sessions to update when agents are added
|
|
142
|
+
* @returns Unsubscribe function
|
|
143
|
+
*/
|
|
144
|
+
declare function registerAgentAddedHandler(sessions: Map<string, IMakaioSession>): UnsubscribeFunction;
|
|
145
|
+
/**
|
|
146
|
+
* Register a bus handler for session.get that looks up sessions from the provided map.
|
|
147
|
+
* @param sessions - Map of sessions to serve
|
|
148
|
+
* @returns Unsubscribe function
|
|
149
|
+
*/
|
|
150
|
+
declare function registerGetSessionHandler(sessions: Map<string, IMakaioSession>): UnsubscribeFunction;
|
|
151
|
+
/**
|
|
152
|
+
* Register a getAgent handler that reports agents as alive if they exist in any session.
|
|
153
|
+
* Prevents the liveness check from triggering recovery in tests with pre-populated sessions.
|
|
154
|
+
* @param sessions - Map of sessions containing agents to report as alive
|
|
155
|
+
* @returns Unsubscribe function
|
|
156
|
+
*/
|
|
157
|
+
declare function registerGetAgentHandler(sessions: Map<string, IMakaioSession>): UnsubscribeFunction;
|
|
158
|
+
/**
|
|
159
|
+
* Register a mock handler for adapter.rehydrateAgent.
|
|
160
|
+
* This simulates connector swap during agent recovery.
|
|
161
|
+
* @returns Unsubscribe function
|
|
162
|
+
*/
|
|
163
|
+
declare function registerRehydrateAgentHandler(): UnsubscribeFunction;
|
|
164
|
+
/**
|
|
165
|
+
* Register a mock handler for agent.cwd.change.
|
|
166
|
+
* This simulates successful cwd change.
|
|
167
|
+
* @param previousCwd - Previous cwd returned by handler
|
|
168
|
+
* @returns Unsubscribe function
|
|
169
|
+
*/
|
|
170
|
+
declare function registerCwdChangeHandler(previousCwd?: string): UnsubscribeFunction;
|
|
171
|
+
/**
|
|
172
|
+
* Register a mock handler for agent.model.change.
|
|
173
|
+
* Simulates successful model change (in-place, no swap).
|
|
174
|
+
* @returns Unsubscribe function
|
|
175
|
+
*/
|
|
176
|
+
declare function registerModelChangeHandler(): UnsubscribeFunction;
|
|
177
|
+
/**
|
|
178
|
+
* Register a bus handler for adapter.startAgent that generates agent IDs and emits agent.added.
|
|
179
|
+
* @param onStart - Optional callback receiving the start payload for assertions
|
|
180
|
+
* @returns Unsubscribe function
|
|
181
|
+
*/
|
|
182
|
+
declare function registerStartAgentHandler(onStart?: (p: {
|
|
183
|
+
adapterId: string;
|
|
184
|
+
sessionId: string;
|
|
185
|
+
initialMessage: MessageInput | undefined;
|
|
186
|
+
}) => void): UnsubscribeFunction;
|
|
187
|
+
/**
|
|
188
|
+
* Register a bus handler for adapter.startAgent that always returns failure.
|
|
189
|
+
* @param errorMessage - Error message to return
|
|
190
|
+
* @returns Unsubscribe function
|
|
191
|
+
*/
|
|
192
|
+
declare function registerFailingStartAgentHandler(errorMessage: string): UnsubscribeFunction;
|
|
193
|
+
/**
|
|
194
|
+
* Register a bus handler for agent.sendMessage that invokes an optional callback.
|
|
195
|
+
* @param onSend - Optional callback receiving the send payload for assertions
|
|
196
|
+
* @returns Unsubscribe function
|
|
197
|
+
*/
|
|
198
|
+
declare function registerSendMessageHandler(onSend?: (p: {
|
|
199
|
+
agentId: string;
|
|
200
|
+
adapterId: string;
|
|
201
|
+
message: MessageInput;
|
|
202
|
+
messageId: string;
|
|
203
|
+
sessionContext?: unknown;
|
|
204
|
+
responseSchema?: ResponseSchemaDescriptor;
|
|
205
|
+
}) => void): UnsubscribeFunction;
|
|
206
|
+
/**
|
|
207
|
+
* Register a bus handler for agent.sendMessage that throws for agents in the failing set.
|
|
208
|
+
* @param failingAgentIds - Set of agent IDs that should trigger an error
|
|
209
|
+
* @param errorMessage - Error message to throw for failing agents
|
|
210
|
+
* @returns Unsubscribe function
|
|
211
|
+
*/
|
|
212
|
+
declare function registerFailingSendMessageHandler(failingAgentIds: Set<string>, errorMessage: string): UnsubscribeFunction;
|
|
213
|
+
/**
|
|
214
|
+
* Emit an agent.complete event to simulate a successful agent turn completion.
|
|
215
|
+
* @param agentId - The agent that completed
|
|
216
|
+
* @param messageId - The message ID associated with the completion
|
|
217
|
+
* @returns Promise that resolves when the event has been emitted
|
|
218
|
+
*/
|
|
219
|
+
declare function emitAgentComplete(agentId: string, messageId: string): Promise<void>;
|
|
220
|
+
/**
|
|
221
|
+
* Emit an agent.complete event with error outcome to simulate agent failure.
|
|
222
|
+
* @param agentId - The agent that encountered an error
|
|
223
|
+
* @param error - Error message to include in the completion payload
|
|
224
|
+
* @returns Promise that resolves when the event has been emitted
|
|
225
|
+
*/
|
|
226
|
+
declare function emitAgentError(agentId: string, error: string): Promise<void>;
|
|
227
|
+
/**
|
|
228
|
+
* Helper to emit agent.added event (mimics AIAdapter behavior)
|
|
229
|
+
* @param payload - The payload for the agent.added event
|
|
230
|
+
*/
|
|
231
|
+
declare function emitAgentAdded(payload: {
|
|
232
|
+
sessionId: string;
|
|
233
|
+
agentId: string;
|
|
234
|
+
adapterId: string;
|
|
235
|
+
adapterSessionId: string;
|
|
236
|
+
role?: 'lead' | 'member';
|
|
237
|
+
}): void;
|
|
238
|
+
/**
|
|
239
|
+
* Creates a mock startAgent handler that captures the payload and emits agentAdded event.
|
|
240
|
+
* Used in resolution tests to verify what gets passed to startAgent.
|
|
241
|
+
* @param sessionId - The session ID for the test
|
|
242
|
+
* @param capture - Object to store the captured payload
|
|
243
|
+
* @returns Unsubscribe function
|
|
244
|
+
*/
|
|
245
|
+
declare function registerCapturingStartAgentHandler(sessionId: string, capture: {
|
|
246
|
+
payload?: Record<string, unknown>;
|
|
247
|
+
}): UnsubscribeFunction;
|
|
248
|
+
//#endregion
|
|
249
|
+
export { collectUserMessageAcknowledgedEvents as C, getStoredEvents as D, emitAdapterInitialized as E, resetBusHandlers as O, collectTurnStartedEvents as S, collectUserMessageSentEvents as T, registerSendMessageHandler as _, emitAgentComplete as a, UnsubscribeFunction as b, registerCapturingStartAgentHandler as c, registerFailingSendMessageHandler as d, registerFailingStartAgentHandler as f, registerRehydrateAgentHandler as g, registerModelChangeHandler as h, emitAgentAdded as i, waitForAsync as k, registerCreateSessionHandler as l, registerGetSessionHandler as m, createMockAgent as n, emitAgentError as o, registerGetAgentHandler as p, createMockSession as r, registerAgentAddedHandler as s, MockSessionConfig as t, registerCwdChangeHandler as u, registerStartAgentHandler as v, collectUserMessageCompletedEvents as w, collectTurnCompletedEvents as x, EventCollector as y };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{SessionStorageSubjects as e}from"./services/session/storage/namespace.mjs";import{ExecutionTargetSubjects as t}from"./services/execution-target/namespace.mjs";import{MakaioBus as n}from"@makaio/framework/bus";import{AdapterSubjects as r,DEFAULT_CONSTRAINTS as i,SessionSubjects as a,SpawnSubagentRpcRequestSchema as o,SubagentConfigSchema as s,SubagentError as c,SubagentErrorCode as l,SubagentSubjects as u,dep as d,extensionToken as f}from"@makaio/framework/contracts";import{BaseService as p}from"@makaio/framework/service-base";import{AdapterRuntimeSubjects as m}from"@makaio/framework/services/adapter-runtime";import{activateProviderContext as h,buildProviderContext as g}from"@makaio/framework/services/provider-context";function _(e,t){return`${e}:${t}`}function v(e,t){return e?.authenticated!==!0||!e.id?!1:e.kind===`workflow-execution`?!0:t.size===0?!1:t.has(_(e.kind,e.id))}var y=class{maxSize;items=[];constructor(e=50){this.maxSize=e}push(e){this.items.push(e),this.items.length>this.maxSize&&this.items.shift()}toArray(){return[...this.items]}get length(){return this.items.length}clear(){this.items=[]}};const b=[`completed`,`failed`,`cancelled`];function x(e){return b.includes(e)}var S=class{constraints;subagents=new Map;awaiters=new Map;constructor(e){this.constraints=e}track(e){let t=Date.now(),n={subagentId:e.subagentId,parentSessionId:e.parentSessionId,childSessionId:void 0,status:`spawning`,config:e.config,depth:e.depth,progressUpdates:new y(50),startTime:t,lastActivityAt:t};return this.subagents.set(e.subagentId,n),n}setChildSessionId(e,t){let n=this.subagents.get(e);n&&(n.childSessionId=t,n.lastActivityAt=Date.now(),n.status===`spawning`&&(n.status=`running`))}get(e){return this.subagents.get(e)}getAllNonTerminal(){let e=[];for(let t of this.subagents.values())x(t.status)||e.push(t);return e}countActiveBySession(e){let t=0;for(let n of this.subagents.values())n.parentSessionId===e&&!x(n.status)&&t++;return t}countTotalActive(){let e=0;for(let t of this.subagents.values())x(t.status)||e++;return e}updateStatus(e,t){let n=this.subagents.get(e);if(!n)return;let r=Date.now();n.status=t,n.lastActivityAt=r,x(t)&&(n.endTime=r)}addProgress(e,t){let n=this.subagents.get(e);n&&(n.progressUpdates.push(t),n.lastActivityAt=Date.now())}setPendingRequest(e,t){let n=this.subagents.get(e);if(!n)throw new c(l.NOT_FOUND,`Subagent ${e} not found`);if(n.pendingRequest)throw new c(l.REQUEST_PENDING,`Cannot call request_input while another request is pending`);n.pendingRequest=t,n.status=`waiting_input`,n.lastActivityAt=Date.now()}resolvePendingRequest(e,t){let n=this.subagents.get(e);n?.pendingRequest&&(n.pendingRequest.resolver(t),n.pendingRequest=void 0,n.lastActivityAt=Date.now(),n.status===`waiting_input`&&(n.status=`running`))}markCompleted(e,t,n){let r=this.subagents.get(e);if(!r)throw new c(l.NOT_FOUND,`Subagent ${e} not found`);if(x(r.status))throw new c(l.ALREADY_TERMINAL,`Subagent already in terminal state: ${r.status}`);let i=Date.now();r.status=`completed`,r.result=t,r.summary=n,r.endTime=i,r.lastActivityAt=i,this.resolveAwaiters(e)}markFailed(e,t){let n=this.subagents.get(e);if(!n||x(n.status))return;let r=Date.now();n.status=`failed`,n.error=t,n.endTime=r,n.lastActivityAt=r,this.resolveAwaiters(e)}markCancelled(e){let t=this.subagents.get(e);if(!t||x(t.status))return!1;let n=Date.now();return t.status=`cancelled`,t.endTime=n,t.lastActivityAt=n,t.pendingRequest&&=(t.pendingRequest.resolver(null),void 0),this.resolveAwaiters(e),!0}addAwaiter(e,t){let n=this.awaiters.get(e)??[];n.push(t),this.awaiters.set(e,n)}removeAwaiter(e,t){let n=this.awaiters.get(e);if(!n)return!1;let r=n.indexOf(t);return r===-1?!1:(n.splice(r,1),n.length===0&&this.awaiters.delete(e),!0)}resolveAwaiters(e){let t=this.subagents.get(e),n=this.awaiters.get(e);if(!n||!t)return;let r={status:t.status,result:t.result,error:t.error};for(let e of n)e(r);this.awaiters.delete(e)}cleanup(){let e=Date.now(),t=0;for(let[n,r]of this.subagents)x(r.status)&&r.endTime&&e-r.endTime>this.constraints.stateRetentionMs&&(this.subagents.delete(n),t++);return t}sweepHung(e){if(e<=0)return 0;let t=Date.now(),n=0;for(let r of this.subagents.values())x(r.status)||r.status!==`waiting_input`&&r.status!==`hung`&&t-r.lastActivityAt>=e&&(r.status=`hung`,r.lastActivityAt=t,n++);return n}};async function C(e,t,n){let r=n?.trim();if(r)return r;let{session:i}=await e.request(a.get,{sessionId:t});return(i?.agents.find(e=>e.agentId===i.leadAgentId)??i?.agents[0])?.adapterName?.trim()}function w(e,t){let n=e.manager.get(t.subagentId);if(!n)throw Error(`Subagent not found: ${t.subagentId}`);return{status:n.status,childSessionId:n.childSessionId,pendingRequest:n.pendingRequest?{messageId:n.pendingRequest.messageId,question:n.pendingRequest.question,context:n.pendingRequest.context}:void 0,progress:n.progressUpdates.toArray(),result:n.result,summary:n.summary,error:n.error}}async function T(e,t){let{parentSessionId:n,config:r,depth:i,spawningToolCallId:a}=t,{constraints:o}=e.manager,s=Math.min(r.maxDepth??o.maxDepth,o.maxDepth);if(i>s)throw new c(l.DEPTH_EXCEEDED,`Maximum subagent depth (${s}) exceeded`);if(e.manager.countActiveBySession(n)>=o.maxConcurrentPerSession)throw new c(l.SESSION_LIMIT,`Maximum concurrent subagents per session (${o.maxConcurrentPerSession}) reached`);if(e.manager.countTotalActive()>=o.maxTotalActive)throw new c(l.GLOBAL_LIMIT,`Maximum total active subagents (${o.maxTotalActive}) reached`);let d=await C(e.bus,n,r.adapterName);if(!d)throw new c(l.ADAPTER_NOT_ALLOWED,`adapterName is required for subagent spawn when parent session has no inheritable adapter`);if(o.allowedAdapters.length>0&&!o.allowedAdapters.includes(d))throw new c(l.ADAPTER_NOT_ALLOWED,`Adapter '${d}' is not allowed`);if(r.model&&o.allowedModels.length>0&&!o.allowedModels.includes(r.model))throw new c(l.MODEL_NOT_ALLOWED,`Model '${r.model}' is not allowed`);let f={...r,adapterName:d},p=crypto.randomUUID();return e.manager.track({subagentId:p,parentSessionId:n,config:f,depth:i}),await e.bus.emit(u.spawned,{subagentId:p,parentSessionId:n,task:f.task,config:f,depth:i,...a!==void 0&&{spawningToolCallId:a}}),{subagentId:p,status:`spawning`}}async function E(e,t){let{subagentId:n,timeoutMs:r}=t,i=e.manager.get(n);if(!i)throw Error(`Subagent not found: ${n}`);if([`completed`,`failed`,`cancelled`].includes(i.status))return{status:i.status,result:i.result,error:i.error};if(i.status===`waiting_input`&&i.pendingRequest)return{status:`waiting_input`,pendingRequest:{messageId:i.pendingRequest.messageId,question:i.pendingRequest.question,context:i.pendingRequest.context}};let a=r??e.manager.constraints.defaultAwaitTimeoutMs;return new Promise(t=>{let r=!1,i,o=e=>{r||(r=!0,i&&clearTimeout(i),t({status:e.status,result:e.result,error:e.error,pendingRequest:e.pendingRequest}))};e.manager.addAwaiter(n,o),a>0&&(i=setTimeout(()=>{r||(r=!0,e.manager.removeAwaiter(n,o),t({status:`timeout`}))},a))})}async function D(e,t){let{subagentId:n,content:r,inResponseTo:i}=t,a=e.manager.get(n);if(!a)throw Error(`Subagent not found: ${n}`);let o=!1;return i&&a.pendingRequest?.messageId===i&&(e.manager.resolvePendingRequest(n,r),o=!0),await e.bus.emit(u.toChild,{subagentId:n,messageId:crypto.randomUUID(),content:r,inResponseTo:i}),{sent:!0,resolvedPending:o}}async function O(e,t){let{subagentId:n,reason:r}=t,i=e.manager.markCancelled(n);return i&&await e.bus.emit(u.cancelled,{subagentId:n,reason:r??`Killed by parent`}),{killed:i}}async function k(e,t){let{subagentId:n,update:r,percentComplete:i}=t;if(!e.manager.get(n))throw Error(`Subagent not found: ${n}`);let a=i===void 0?r:`[${i}%] ${r}`;return e.manager.addProgress(n,a),await e.bus.emit(u.toParent,{subagentId:n,messageId:crypto.randomUUID(),type:`progress`,content:a}),{reported:!0}}async function A(e,t){let{subagentId:n,question:r,context:i,timeoutMs:a}=t;if(!e.manager.get(n))throw Error(`Subagent not found: ${n}`);let o=crypto.randomUUID(),s=a??e.manager.constraints.defaultRequestTimeoutMs;return await e.bus.emit(u.toParent,{subagentId:n,messageId:o,type:`request_input`,content:r,context:i}),new Promise(t=>{let a=!1,c;e.manager.setPendingRequest(n,{messageId:o,question:r,context:i,resolver:e=>{a||(a=!0,c&&clearTimeout(c),t(e===null?{responded:!1,timedOut:!0}:{responded:!0,response:e,timedOut:!1}))}}),s>0&&(c=setTimeout(()=>{a||e.manager.resolvePendingRequest(n,null)},s))})}async function j(e,t){let{subagentId:n,result:r,summary:i}=t;return e.manager.markCompleted(n,r,i),await e.bus.emit(u.completed,{subagentId:n,success:!0,result:i?`${i}\n\n${r}`:r}),{completed:!0}}function M(e,t){let{parentSessionId:n}=t;return{subagents:e.manager.getAllNonTerminal().filter(e=>e.parentSessionId===n).map(e=>({subagentId:e.subagentId,task:e.config.task,status:e.status}))}}const N={id:`system:local`,name:`Local`,description:`Default local process execution`,type:`local`,scope:`default`,enabled:!0,createdAt:Date.now(),updatedAt:Date.now()};var P=class extends p{machineId;delegationAllowSet;manager;pendingChildSessionClose=new Set;constructor(e=n,t=i,r,a=new Set){super(e),this.machineId=r,this.delegationAllowSet=a,this.manager=new S(t)}grantDelegation(e,t){this.delegationAllowSet.add(`${e}:${t}`)}revokeDelegation(e,t){this.delegationAllowSet.delete(`${e}:${t}`)}onInit(){this.registerHandler(u.spawned,async e=>{this.handleSpawned(e.payload).catch(e=>{console.error(`[SubagentService] handleSpawned error:`,e)})}),this.registerHandler(u.execute,async e=>{if(!this.isRemoteDelegationAllowed(e))return;let t=await this.handleExecute(e.payload);e.setResult(t)}),this.registerHandler(u.toChild,async e=>{await this.handleToChild(e.payload)}),this.registerHandler(u.completed,async e=>{await this.handleCompleted(e.payload.subagentId)}),this.registerHandler(u.cancelled,async e=>{await this.handleCancelled(e.payload.subagentId)}),this.registerHandler(r.session.closed,e=>{this.handleAdapterSessionClosed(e.payload.sessionId)}),this.registerRpcHandlers(),this.wirePeriodicSweep()}wirePeriodicSweep(){let{inactivityTimeoutMs:e,sweepIntervalMs:t}=this.manager.constraints;if(t<=0)return;let n=setInterval(()=>{let t=this.manager.sweepHung(e);t>0&&console.warn(`[SubagentService] Swept ${t} hung subagent(s) due to inactivity`),this.manager.cleanup()},t);this.addCleanup(()=>clearInterval(n))}registerRpcHandlers(){let e={manager:this.manager,bus:this.bus};this.registerHandler(u.getStatus,t=>{let n=w(e,t.payload);t.setResult(n)}),this.registerHandler(u.spawn,async t=>{if(!this.isRemoteDelegationAllowed(t))return;let n=await T(e,o.parse(t.payload));t.setResult(n)}),this.registerHandler(u.await,async t=>{let n=await E(e,t.payload);t.setResult(n)}),this.registerHandler(u.send,async t=>{let n=await D(e,t.payload);t.setResult(n)}),this.registerHandler(u.kill,async t=>{let n=await O(e,t.payload);t.setResult(n)}),this.registerHandler(u.reportProgress,async t=>{let n=await k(e,t.payload);t.setResult(n)}),this.registerHandler(u.requestInput,async t=>{let n=await A(e,t.payload);t.setResult(n)}),this.registerHandler(u.completeTask,async t=>{let n=await j(e,t.payload);t.setResult(n)}),this.registerHandler(u.listBySession,t=>{let n=M(e,t.payload);t.setResult(n)})}onDestroy(){this.pendingChildSessionClose.clear()}async handleSpawned(e){let{subagentId:n,parentSessionId:r,task:i,spawningToolCallId:a}=e,o=s.parse({...e.config,task:i}),c=o.adapterName?.trim();if(!c)return this.failSpawn(n,r,`adapter_start`,`Subagent spawn requires a non-empty adapterName`);this.manager.get(n)||this.manager.track({subagentId:n,parentSessionId:r,config:o,depth:e.depth??1});let l,u;try{u=await this.buildExecutionTargetResolutionParams(r,o.executionTargetId);let e=await this.bus.requestOptional(t.resolve,u),i;if(e.handled)i=e.data.executionTarget;else if(u.executionTargetId!=null)throw Error(`Execution target resolver unavailable for explicit target '${u.executionTargetId}'`);else i=N;if(i.type!==`local`)return this.failSpawn(n,r,`adapter_start`,`Execution target type '${i.type}' is not yet supported for subagents`);l=u.executionTargetId??void 0}catch(e){return this.failSpawn(n,r,`adapter_start`,e)}let d;try{d=await this.createChildSessionForSpawn(n,r,o,l,u,a)}catch(e){return this.failSpawn(n,r,`session_create`,e)}let f=this.manager.get(n);if(!(f&&this.isTerminalSubagentStatus(f.status)))try{await this.startAdapterForSubagent(c,o,d,i)}catch(e){return this.failSpawn(n,r,`adapter_start`,e)}}async createChildSessionForSpawn(e,t,n,r,i,o){let{sessionId:s}=await this.bus.request(a.create,this.buildChildSessionCreatePayload(t,n,r,o));return this.manager.setChildSessionId(e,s),this.pendingChildSessionClose.has(e)&&await this.closeChildSession(e),s}async startAdapterForSubagent(e,t,n,i){let{adapterId:a}=await this.bus.request(m.resolveId,{adapterName:e,...this.machineId!==void 0&&{machineId:this.machineId}}),o=t.providerContext??(t.providerConfigId?await g(this.bus,t.providerConfigId):void 0);o!==void 0&&await h(this.bus,o);let s=await this.bus.request(r.startAgent,{adapterId:a,role:`lead`,...o!==void 0&&{providerContext:o},sessionId:n,initialMessage:i,model:t.model,systemPrompt:t.systemPrompt,responseSchema:t.responseSchema,allowedTools:t.tools,disallowedTools:t.disallowedTools,allowedDirectories:t.allowedDirectories,...t.harnessId!==void 0&&{harnessId:t.harnessId}});if(!s||s.success!==!0)throw Error(s?.message??`Adapter start failed`)}async failSpawn(e,t,n,r){let i=r instanceof Error?r.message:String(r);return this.manager.markFailed(e,i),await this.emitExecutionFailed(e,t,n,r),i}async buildExecutionTargetResolutionParams(t,n){if(n!==void 0)return{executionTargetId:n};let{session:r}=await this.bus.request(e.get,{sessionId:t});if(!r)throw Error(`Parent session not found: ${t}`);return{executionTargetId:r.executionTargetId}}buildChildSessionCreatePayload(e,t,n,r){return{branchKind:`subagent`,parentSessionId:e,contextInheritance:t.contextMode===`fork`?`parent-history`:`none`,...n!==void 0&&{executionTargetId:n},...r!==void 0&&{spawningToolCallId:r}}}async handleExecute(e){let t=s.parse({...e.config,task:e.task});this.manager.track({subagentId:e.subagentId,parentSessionId:e.parentSessionId,config:t,depth:e.depth});let n=await this.handleSpawned({subagentId:e.subagentId,parentSessionId:e.parentSessionId,task:e.task,config:t,depth:e.depth});return n?{success:!1,error:n}:{success:!0}}async handleToChild(e){let{subagentId:t,content:n}=e,r=this.manager.get(t);if(!r){console.warn(`[SubagentService] No subagent found: ${t}`);return}if(!r.childSessionId){console.warn(`[SubagentService] No child session for subagent: ${t}`);return}try{await this.bus.request(a.sendMessage,{sessionId:r.childSessionId,message:n,source:`system`})}catch(e){console.error(`[SubagentService] Failed to route message to child session:`,e)}}async handleCompleted(e){await this.closeChildSession(e)}async handleCancelled(e){await this.closeChildSession(e)}async closeChildSession(e){let t=this.manager.get(e);if(t){if(!t.childSessionId){this.pendingChildSessionClose.add(e);return}this.pendingChildSessionClose.delete(e);try{await this.bus.request(a.close,{sessionId:t.childSessionId})}catch(t){console.error(`[SubagentService] Failed to close child session for subagent ${e}:`,t)}}}isTerminalSubagentStatus(e){return e===`completed`||e===`failed`||e===`cancelled`}handleAdapterSessionClosed(e){for(let t of this.manager.getAllNonTerminal())if(t.childSessionId===e){console.warn(`[SubagentService] Adapter session closed for subagent ${t.subagentId}: ${e}`),this.manager.markFailed(t.subagentId,`adapter-session-closed`);return}}isRemoteDelegationAllowed(e){return e.origin.local||v(e.transport?.peer,this.delegationAllowSet)}async emitExecutionFailed(e,t,n,r){let i=r instanceof Error?r.message:String(r);await this.bus.emit(u.executionFailed,{subagentId:e,parentSessionId:t,phase:n,error:i}).catch(e=>{console.error(`[SubagentService] Failed to emit executionFailed:`,e)})}};const F=f(`subagent-service`),I={name:F.name,displayName:`Subagent Service`,version:`0.1.0`,critical:!0,surface:`headless`,dependencies:[d(`session`)],create:e=>new P(e.bus,i,e.machineId)};export{v as a,S as i,I as n,P as r,F as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";import{createBusNamespace as t}from"@makaio/framework/core";const n={"autoLaunch.enable":{request:e.object({hidden:e.boolean().optional().default(!0)}),response:e.object({enabled:e.boolean(),error:e.string().optional()})},"autoLaunch.disable":{request:e.object({}),response:e.object({disabled:e.boolean(),error:e.string().optional()})},"autoLaunch.getStatus":{request:e.object({}),response:e.object({enabled:e.boolean(),supported:e.boolean(),error:e.string().optional()})}},r=t(`platform`,n),i=r.subjects;export{i as n,n as r,r as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./version-BeT3ASEe.mjs";import{z as t}from"zod";import*as n from"node:path";const r=t.string().trim().min(1),i=t.number().int().finite().nonnegative().describe(`Unix epoch timestamp in milliseconds`);function a(e){return n.posix.isAbsolute(e)||n.win32.isAbsolute(e)}const o=t.string().trim().min(1).refine(a,{message:`Path must be absolute`}),s=t.string().min(1).regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/,`Profile name must be a safe path component`),c=s,l=t.object({id:r,clientId:r,name:s,description:t.string().nullable(),configDir:o,isDefault:t.boolean(),createdAt:i,updatedAt:i}),u=t.record(t.string(),t.string()),d=t.enum([`auth-only`,`full`,`empty`]),f={"profile.create":{request:t.object({clientId:r,name:s,description:t.string().optional()}),response:t.object({profile:l})},"profile.list":{request:t.object({clientId:r}),response:t.object({profiles:t.array(l)})},"profile.get":{request:t.object({clientId:r,name:s}),response:t.object({profile:l.nullable()})},"profile.update":{request:t.object({clientId:r,name:s,description:t.string().optional()}),response:t.object({profile:l})},"profile.delete":{request:t.object({clientId:r,name:s}),response:t.object({success:t.boolean()})},"profile.setDefault":{request:t.object({clientId:r,name:s}),response:t.object({profile:l})}},p={"sessionConfig.create":{request:t.object({clientId:r,sessionId:c,profileName:s.optional(),baseConfigDir:o.optional(),projectDir:o.optional(),configInheritance:d.optional()}),response:t.object({sessionDir:o,env:u})},"sessionConfig.destroy":{request:t.object({clientId:r,sessionId:c}),response:t.object({success:t.boolean()})},"sessionConfig.cleanup":{request:t.object({clientId:r.optional()}),response:t.object({removed:t.array(o)})}},m=t.object({sessionDir:o,baseConfigDir:o,projectDir:o.optional(),platform:t.enum([`darwin`,`linux`,`win32`]),configInheritance:d}),h=t.object({sessionDir:o,platform:t.enum([`darwin`,`linux`,`win32`])}),g=t.object({success:t.boolean()}),_=t.object({env:t.record(t.string(),t.string()).optional()}),v=t.enum([`managed-install`,`profile-create`,`session-create`]),y={request:t.object({clientId:r,configDir:o,phase:v,binaryVersion:e.optional(),adapterName:t.string().min(1).optional(),projectDir:o.optional()}),response:t.object({primed:t.boolean()})};export{a as _,f as a,c,_ as d,h as f,r as g,i as h,l as i,d as l,o as m,y as n,p as o,g as p,s as r,u as s,v as t,m as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./namespace-DkRgbZYn.mjs";import{CredentialSubjects as t}from"@makaio/framework/contracts";async function n(t,n){let{context:r}=await t.request(e.buildProviderContext,{providerConfigId:n});if(!r)throw Error(`[buildProviderContext] ProviderConfig '${n}' not found`);return r}function r(e){return{providerConfigId:e.providerConfigId,definitionId:e.definitionId,credentialRefs:e.credentialRefs}}async function i(e,n){await e.request(t.activate,r(n))}async function a(e,n){try{if(!(await e.requestOptional(t.activate,r(n))).handled)return}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[activateProviderContext] credential.activate handler failed:`,t)}}async function o(e,t){await i(e,t)}export{o as n,n as r,a as t};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { IConfigStorage } from "@makaio/framework/core";
|
|
2
|
+
import { IMakaioBus } from "@makaio/framework/bus";
|
|
3
|
+
import { Config } from "@makaio/framework/contracts";
|
|
4
|
+
|
|
5
|
+
//#region packages/providers/src/config/index.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Abstract config provider that handles bootstrap-time config loading.
|
|
8
|
+
*
|
|
9
|
+
* Delegates storage operations to IConfigStorage, adding:
|
|
10
|
+
* - Environment variable overrides
|
|
11
|
+
* - Default config merging
|
|
12
|
+
* - Validation via Zod schema
|
|
13
|
+
*
|
|
14
|
+
* Subclasses implement platform-specific concerns:
|
|
15
|
+
* - getMachineId(): Persistent machine identifier
|
|
16
|
+
* - getEnv(): Environment variable access
|
|
17
|
+
* @example Node.js implementation
|
|
18
|
+
* ```typescript
|
|
19
|
+
* class NodeConfigProvider extends ConfigProvider {
|
|
20
|
+
* constructor(storage: IConfigStorage<Config>) {
|
|
21
|
+
* super(storage);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* async getMachineId(): Promise<string> {
|
|
25
|
+
* // Load or create machine identity from ~/.makaio/keys
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* protected getEnv(key: string): string | undefined {
|
|
29
|
+
* return process.env[key];
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare abstract class ConfigProvider {
|
|
35
|
+
protected readonly storage: IConfigStorage<Config>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a ConfigProvider with the given storage backend.
|
|
38
|
+
* @param storage - Storage implementation for persisting config
|
|
39
|
+
*/
|
|
40
|
+
constructor(storage: IConfigStorage<Config>);
|
|
41
|
+
/**
|
|
42
|
+
* Get or create persistent machine identifier.
|
|
43
|
+
* Platform-specific: derived from machine key files, keychain, registry, etc.
|
|
44
|
+
* @returns Promise resolving to the unique machine identifier
|
|
45
|
+
*/
|
|
46
|
+
abstract getMachineId(): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Get config with merge logic and validation.
|
|
49
|
+
*
|
|
50
|
+
* Merge order (later wins):
|
|
51
|
+
* 1. Default config
|
|
52
|
+
* 2. Stored config (from storage)
|
|
53
|
+
* 3. Environment variables
|
|
54
|
+
* 4. Programmatic overrides
|
|
55
|
+
* @param overrides - Optional config overrides to apply
|
|
56
|
+
* @returns Promise resolving to the validated runtime configuration
|
|
57
|
+
*/
|
|
58
|
+
getConfig(overrides?: Partial<Config>): Promise<Config>;
|
|
59
|
+
/**
|
|
60
|
+
* Get persisted config with defaults applied, excluding environment and programmatic overrides.
|
|
61
|
+
*
|
|
62
|
+
* This represents the writable config surface, not the effective runtime view.
|
|
63
|
+
* @returns Promise resolving to validated stored configuration with defaults.
|
|
64
|
+
*/
|
|
65
|
+
getStoredConfig(): Promise<Config>;
|
|
66
|
+
/**
|
|
67
|
+
* Get config values derived from environment variables.
|
|
68
|
+
*
|
|
69
|
+
* The returned object is a partial config overlay and must not be persisted
|
|
70
|
+
* directly as user config.
|
|
71
|
+
* @returns Partial config derived from environment variables.
|
|
72
|
+
*/
|
|
73
|
+
getEnvironmentConfig(): Partial<Config>;
|
|
74
|
+
/**
|
|
75
|
+
* Remove environment-only values from an effective config snapshot before persistence.
|
|
76
|
+
*
|
|
77
|
+
* Values that already exist in stored config are preserved, even if they match
|
|
78
|
+
* the current environment. Values introduced only by environment overrides are
|
|
79
|
+
* omitted so a settings UI cannot accidentally write secrets or host-specific
|
|
80
|
+
* URLs into `config.json`.
|
|
81
|
+
* @param config - Effective config proposed for persistence.
|
|
82
|
+
* @returns Sanitized config suitable for `saveConfig()`.
|
|
83
|
+
*/
|
|
84
|
+
prepareConfigForPersistence(config: Config): Promise<Config>;
|
|
85
|
+
/**
|
|
86
|
+
* Save config to storage.
|
|
87
|
+
* @param config - The runtime configuration to save
|
|
88
|
+
* @returns Promise that resolves when config is saved
|
|
89
|
+
*/
|
|
90
|
+
saveConfig(config: Config): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Get environment variable value.
|
|
93
|
+
* Default returns undefined (browser/mobile might not have env vars).
|
|
94
|
+
* @param _key - The environment variable name
|
|
95
|
+
* @returns The environment variable value or undefined
|
|
96
|
+
*/
|
|
97
|
+
protected getEnv(_key: string): string | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Load config from environment variables.
|
|
100
|
+
* @returns Partial config from environment
|
|
101
|
+
*/
|
|
102
|
+
protected loadEnvConfig(): Partial<Config>;
|
|
103
|
+
/**
|
|
104
|
+
* Get default runtime configuration.
|
|
105
|
+
* @returns Default config values
|
|
106
|
+
*/
|
|
107
|
+
protected getDefaultConfig(): Config;
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
//#region packages/providers/src/webhook/index.d.ts
|
|
111
|
+
/**
|
|
112
|
+
* Webhook event structure
|
|
113
|
+
*/
|
|
114
|
+
type WebhookEvent = {
|
|
115
|
+
platform: string;
|
|
116
|
+
event: string;
|
|
117
|
+
action?: string;
|
|
118
|
+
data: unknown;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Webhook provider interface
|
|
122
|
+
*
|
|
123
|
+
* Handles incoming webhooks from platforms (GitHub, GitLab, etc.)
|
|
124
|
+
*/
|
|
125
|
+
interface IWebhookProvider {
|
|
126
|
+
readonly capabilities: {
|
|
127
|
+
platform: 'github' | 'gitlab' | 'gitea' | 'bitbucket';
|
|
128
|
+
supportedEvents: string[];
|
|
129
|
+
};
|
|
130
|
+
verifySignature(payload: string, signature: string): Promise<boolean>;
|
|
131
|
+
parseWebhook(payload: unknown): Promise<WebhookEvent>;
|
|
132
|
+
registerHandlers(bus: IMakaioBus): void;
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
export { ConfigProvider, type IWebhookProvider, type WebhookEvent };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ConfigError as e}from"@makaio/framework/core";import{ConfigSchema as t}from"@makaio/framework/contracts";import{isRecord as n,normalizeBusSecret as r}from"@makaio/framework/utils";function i(e){return Object.prototype.toString.call(e).slice(8,-1)}function a(e){if(i(e)!==`Object`)return!1;let t=Object.getPrototypeOf(e);return!!t&&t.constructor===Object&&t===Object.prototype}function o(e){return i(e)===`Symbol`}function s(e,t,n,r){let i={}.propertyIsEnumerable.call(r,t)?`enumerable`:`nonenumerable`;i===`enumerable`&&(e[t]=n),i===`nonenumerable`&&Object.defineProperty(e,t,{value:n,enumerable:!1,writable:!0,configurable:!0})}function c(e,t,n){if(!a(t))return t;let r={};if(a(e)){let n=Object.getOwnPropertyNames(e),i=Object.getOwnPropertySymbols(e);r=[...n,...i].reduce((n,r)=>{if(r===`__proto__`)return n;let i=e[r];return(!o(r)&&!Object.getOwnPropertyNames(t).includes(r)||o(r)&&!Object.getOwnPropertySymbols(t).includes(r))&&s(n,r,i,e),n},{})}let i=Object.getOwnPropertyNames(t),l=Object.getOwnPropertySymbols(t);return[...i,...l].reduce((r,i)=>{if(i===`__proto__`)return r;let o=t[i],l=a(e)?e[i]:void 0;return l!==void 0&&a(o)&&(o=c(l,o,n)),s(r,i,n?n(l,o,i):o,t),r},r)}function l(e,...t){return t.reduce((e,t)=>c(e,t),e)}function u(e){return JSON.stringify(typeof e!=`object`||!e?{present:e!=null}:{present:!0,keys:Object.keys(e)})}function d(e,t){return JSON.stringify(e)===JSON.stringify(t)}function f(e){let n=t.safeParse({[e]:{}});if(n.success)return n.data[e]}function p(e,t,r,i){if(!n(e)||!n(t))return e;let a={...e},o=n(r)?r:{},s=n(i)?i:{};for(let[e,r]of Object.entries(t)){let t=a[e],i=o[e],c=s[e]??f(e);if(n(t)&&n(r)){let o=p(t,r,i,c);n(o)&&i===void 0&&(Object.keys(o).length===0||d(o,c))?delete a[e]:a[e]=o;continue}d(t,r)&&!d(i,r)&&delete a[e]}return a}var m=class{storage;constructor(e){this.storage=e}async getConfig(n){let r,i=!1;try{i=!0,r=await this.storage.getConfig(),i=!1;let e=this.loadEnvConfig(),a=l(this.getDefaultConfig(),r??{},e,n??{});return t.parse(a)}catch(t){throw console.error(`[ConfigProvider] Config resolution failed. Default config snapshot:`,JSON.stringify(this.getDefaultConfig(),null,2)),console.error(`[ConfigProvider] Source config shape:`,u(r)),console.error(`[ConfigProvider] Override shape:`,u(n)),new e(`${i?`Failed to load config`:`Config validation failed`}: ${t instanceof Error?t.message:String(t)}`,i?`runtime.config.load`:`runtime.config.validation`)}}async getStoredConfig(){try{let e=await this.storage.getConfig();return t.parse(l(this.getDefaultConfig(),e??{}))}catch(t){throw new e(`Failed to load stored config: ${t instanceof Error?t.message:String(t)}`,`runtime.config.load`)}}getEnvironmentConfig(){return this.loadEnvConfig()}async prepareConfigForPersistence(e){let n=await this.getStoredConfig(),r=this.getEnvironmentConfig(),i=p(t.parse(e),r,n,this.getDefaultConfig());return r.bus?.remote?.url!==void 0&&n.bus?.remote?.url===void 0&&delete i.bus,t.parse(i)}async saveConfig(n){try{let e=t.parse(n);await this.storage.saveConfig(e)}catch(t){throw new e(`Failed to save config: ${t instanceof Error?t.message:String(t)}`,`runtime.config.save`)}}getEnv(e){}loadEnvConfig(){let e=this.getEnv(`MAKAIO_MODE`),t=this.getEnv(`MAKAIO_BUS_URL`),n=r(this.getEnv(`MAKAIO_BUS_SECRET`));if(n!==void 0&&!t)throw Error(`MAKAIO_BUS_SECRET requires MAKAIO_BUS_URL`);let i=this.getEnv(`MAKAIO_RELAY_URL`),a={...e&&{mode:e},...t&&{bus:{remote:{url:t,...n&&{secret:n}}}}};return i&&(a.relay={url:i}),a}getDefaultConfig(){return{$schema:`makaio/config/v1`,mode:`local`,role:`main-dev-machine`}}};export{m as ConfigProvider};
|