@makaio/framework 1.0.0-dev-1781117225170 → 1.0.0-dev-1781260968078
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/README.md +29 -0
- package/dist/.makaio-build.json +2 -2
- package/dist/adapters/config/index.d.mts +1 -1
- package/dist/adapters/config/index.mjs +1 -1
- package/dist/adapters/index.d.mts +3 -3
- package/dist/adapters/index.mjs +1 -1
- package/dist/adapters/node.d.mts +1 -1
- package/dist/adapters/node.mjs +1 -1
- package/dist/bus/index.mjs +1 -1
- package/dist/client-BJVDImPV.d.mts +175 -0
- package/dist/clients/index.d.mts +105 -2
- package/dist/clients/index.mjs +2 -2
- package/dist/contracts/adapter/index.d.mts +2 -2
- package/dist/contracts/adapter/schemas/session-lineage.d.mts +1 -1
- package/dist/contracts/artifact/index.d.mts +1 -1
- package/dist/contracts/client/index.d.mts +2 -2
- package/dist/contracts/common/index.d.mts +1 -1
- package/dist/contracts/config/index.d.mts +1 -1
- package/dist/contracts/extension/index.d.mts +4 -4
- package/dist/contracts/extension/index.mjs +1 -1
- package/dist/contracts/facet/index.d.mts +1 -1
- package/dist/contracts/harness/index.d.mts +1 -1
- package/dist/contracts/host/index.d.mts +1 -1
- package/dist/contracts/index.d.mts +575 -62
- package/dist/contracts/index.mjs +1 -1
- package/dist/contracts/materialization/index.d.mts +3 -3
- package/dist/contracts/model-registry/index.d.mts +1 -1
- package/dist/contracts/native-session-supervisor/index.d.mts +1 -1
- package/dist/contracts/platform/index.d.mts +1 -1
- package/dist/contracts/provider/index.d.mts +2 -2
- package/dist/contracts/session/index.d.mts +2 -2
- package/dist/contracts/shared/index.d.mts +1 -1
- package/dist/contracts/skill/index.d.mts +1 -1
- package/dist/contracts/telemetry/index.d.mts +1 -1
- package/dist/contracts/timeout/index.d.mts +1 -1
- package/dist/contracts/variant/index.d.mts +1 -1
- package/dist/{definition-Cp-5xJp_.d.mts → definition-SiimP25_.d.mts} +1 -1
- package/dist/{detached-extension-handle-oXbjv1tA.mjs → detached-extension-handle-Diiwgm13.mjs} +1 -1
- package/dist/drizzle/0001_messages_content_tsv.na.md +18 -0
- package/dist/drizzle/0012_legal_kate_bishop.sql +3 -0
- package/dist/drizzle/0013_eager_rhodey.sql +56 -0
- package/dist/drizzle/0014_fancy_ultimo.sql +1 -0
- package/dist/drizzle/meta/0012_snapshot.json +2934 -0
- package/dist/drizzle/meta/0013_snapshot.json +2954 -0
- package/dist/drizzle/meta/0014_snapshot.json +2959 -0
- package/dist/drizzle/meta/_journal.json +21 -0
- package/dist/drizzle-wjquQK2m.mjs +1 -0
- package/dist/extension-DfNcE0zm.mjs +1 -0
- package/dist/extension-ZBN4BGre.mjs +1 -0
- package/dist/{filesystem-service-CBJT7A5w.mjs → filesystem-service-BjfrUmGS.mjs} +1 -1
- package/dist/{globby-C0lgTOUl.mjs → globby-BIH65cbN.mjs} +1 -1
- package/dist/handler-DSfSAlxx.mjs +1 -0
- package/dist/handlers-C8EtpSqK.mjs +41 -0
- package/dist/{index-DfUBcVtG.d.mts → index-B2xbnMZe.d.mts} +1 -1
- package/dist/{index-uQl_1wQO.d.mts → index-BAhJKQLX.d.mts} +8 -8
- package/dist/{index-i7o6FtS0.d.mts → index-BDRKAxIV.d.mts} +129 -2
- package/dist/{index-kLBWooVu.d.mts → index-BQiHs8EF.d.mts} +12 -12
- package/dist/{index-SFkbbDxs.d.mts → index-BYkOUd0x.d.mts} +1 -1
- package/dist/{index-C1uZLARQ.d.mts → index-BvSyOgTY.d.mts} +1314 -46
- package/dist/{index-Bw8SkcWG.d.mts → index-Bw_zL7Rs.d.mts} +1 -1
- package/dist/{index-CXfWW8cP.d.mts → index-CARxIllg.d.mts} +7 -7
- package/dist/{index-t9Vt4Jbb.d.mts → index-Cb64d5c5.d.mts} +6 -6
- package/dist/{index-hWzUQtDn.d.mts → index-CgjslA5-.d.mts} +92 -19
- package/dist/{index-ClgVA8Rz.d.mts → index-D5CI1V5d.d.mts} +22 -22
- package/dist/{index-BY-fz0Jy.d.mts → index-DDQkhhRo.d.mts} +149 -141
- package/dist/{index-v2kRZnfw2.d.mts → index-DTdqGAfH2.d.mts} +20 -10
- package/dist/{index-CT-zFurA.d.mts → index-Drz_a7kW.d.mts} +1 -1
- package/dist/{index-BELri1Hy.d.mts → index-IekAD8Gp.d.mts} +8 -8
- package/dist/{index-C_jIVT40.d.mts → index-fVgKVvta.d.mts} +1 -1
- package/dist/kernel/cli/index.d.mts +2 -2
- package/dist/kernel/cli/register.d.mts +1 -1
- package/dist/kernel/extension/index.d.mts +1 -1
- package/dist/kernel/extension/index.mjs +1 -1
- package/dist/kernel/index.d.mts +5 -5
- package/dist/kernel/index.mjs +1 -1
- package/dist/kernel/namespace/index.d.mts +1 -1
- package/dist/kernel/observability/index.d.mts +1 -1
- package/dist/kernel/providers/index.d.mts +1 -1
- package/dist/kernel/window/index.d.mts +1 -1
- package/dist/{lib-zuQKc8ym.mjs → lib-Cq5R6Tx9.mjs} +1 -1
- package/dist/{lib-IkUYa2Qs.mjs → lib-nlcl5kRW.mjs} +1 -1
- package/dist/{load-extensions-DE8qDIqi.d.mts → load-extensions-D9nbDIiW.d.mts} +1 -1
- package/dist/{load-extensions-CwxilDj1.mjs → load-extensions-wELQ4BBN.mjs} +1 -1
- package/dist/mcp-http-server/index.mjs +1 -1
- package/dist/{namespace-CZPu_jvy.d.mts → namespace-7tsuJhQ9.d.mts} +66 -66
- package/dist/{namespace-ffepZB8Y.d.mts → namespace-B73Sxj5L.d.mts} +6 -6
- package/dist/{namespace-Da_dHfdm.d.mts → namespace-Ba4bxtHQ.d.mts} +11 -11
- package/dist/{namespace-DvHoeMUV.d.mts → namespace-DDCjoQUj.d.mts} +3 -3
- package/dist/namespace-DwE2g8Wm.mjs +1 -0
- package/dist/node/bus-server/index.d.mts +1 -1
- package/dist/node/bus-server/index.mjs +1 -1
- package/dist/node/bus-server/server-lifecycle.d.mts +1 -1
- package/dist/node/bus-server/server-lifecycle.mjs +1 -1
- package/dist/{orchestrator-shared-FnWrPS09.mjs → orchestrator-shared-Dt4WDse7.mjs} +1 -1
- package/dist/package-Be2Ez4vv.mjs +1 -0
- package/dist/package.json +1 -1
- package/dist/primitive-runtime-Xrc9xh6p.mjs +1 -0
- package/dist/registry-RG-bkw3c.mjs +146 -0
- package/dist/rules/index.d.mts +1 -1
- package/dist/rules/index.mjs +1 -1
- package/dist/rules/schemas.d.mts +1 -1
- package/dist/runtime-bun/index.mjs +1 -1
- package/dist/runtime-node/extension-discovery.d.mts +1 -1
- package/dist/runtime-node/extension-validation.d.mts +1 -1
- package/dist/runtime-node/extension-validation.mjs +1 -1
- package/dist/runtime-node/index.d.mts +59 -38
- package/dist/runtime-node/index.mjs +26 -53
- package/dist/runtime-node/makaio-config.d.mts +1 -1
- package/dist/runtime-node/makaio-config.mjs +1 -1
- package/dist/runtime-node/workflow-worker/index.d.mts +1 -1
- package/dist/runtime-node/workflow-worker/index.mjs +1 -1
- package/dist/runtime-node/workflow-worker/worker-entry.mjs +1 -1
- package/dist/{schema-CfuF2cXW.d.mts → schema-BNrM9LWb.d.mts} +218 -12
- package/dist/schema-BerZmr2q.mjs +1 -0
- package/dist/schema-BrnYlDwZ.mjs +1 -0
- package/dist/{schemas-SPI-Y87l2.d.mts → schemas-DAFYpgHk2.d.mts} +12 -12
- package/dist/services/adapter-runtime/index.d.mts +3 -3
- package/dist/services/adapter-runtime/namespace.d.mts +1 -1
- package/dist/services/adapter-runtime/schemas.d.mts +1 -1
- package/dist/services/adapter-subsystem/index.d.mts +2 -2
- package/dist/services/adapter-subsystem/namespace.d.mts +1 -1
- package/dist/services/agent-runtime/index.d.mts +2 -2
- package/dist/services/agent-runtime/namespace.d.mts +1 -1
- package/dist/services/agent-runtime/schemas.d.mts +1 -1
- package/dist/services/capability/index.d.mts +1 -1
- package/dist/services/codebase/index.d.mts +2 -2
- package/dist/services/codebase/namespace.d.mts +1 -1
- package/dist/services/codebase/schemas.d.mts +1 -1
- package/dist/services/compression/index.d.mts +2 -2
- package/dist/services/compression/namespace.d.mts +1 -1
- package/dist/services/compression/schemas.d.mts +1 -1
- package/dist/services/context-rules/index.d.mts +4 -4
- package/dist/services/execution-target/index.d.mts +3 -3
- package/dist/services/execution-target/namespace.d.mts +1 -1
- package/dist/services/execution-target/schemas.d.mts +1 -1
- package/dist/services/filesystem/index.d.mts +1 -1
- package/dist/services/filesystem/index.mjs +1 -1
- package/dist/services/filesystem/namespace.d.mts +12 -12
- package/dist/services/filesystem/schemas.d.mts +6 -6
- package/dist/services/git/namespace.d.mts +2 -2
- package/dist/services/git/schemas.d.mts +2 -2
- package/dist/services/harness/index.d.mts +32 -20
- package/dist/services/harness/index.mjs +1 -1
- package/dist/services/harness/storage/schema.d.mts +60 -16
- package/dist/services/harness/storage/schema.mjs +1 -1
- package/dist/services/index.d.mts +73 -73
- package/dist/services/index.mjs +1 -1
- package/dist/services/log-import/browser.d.mts +2 -2
- package/dist/services/log-import/index.d.mts +7 -12
- package/dist/services/log-import/index.mjs +2 -2
- package/dist/services/log-import/log-import.d.mts +1 -1
- package/dist/services/log-import/namespace.d.mts +2 -2
- package/dist/services/log-import/schemas.d.mts +1 -1
- package/dist/services/model-registry/index.d.mts +1 -1
- package/dist/services/preferences/index.d.mts +2 -2
- package/dist/services/preferences/schemas.d.mts +1 -1
- package/dist/services/preferences/storage-namespace.d.mts +2 -2
- package/dist/services/provider-context/index.d.mts +1 -1
- package/dist/services/session/handlers/index.d.mts +1 -1
- package/dist/services/session/handlers/index.mjs +1 -1
- package/dist/services/session/index.d.mts +10 -10
- package/dist/services/session/index.mjs +1 -1
- package/dist/services/session/messages/namespace.d.mts +1 -1
- package/dist/services/session/messages/namespace.mjs +1 -1
- package/dist/services/session/orchestrator-testing/index.d.mts +1 -1
- package/dist/services/session/orchestrator-testing/index.mjs +1 -1
- package/dist/services/session/session-events/namespace.d.mts +1 -1
- package/dist/services/session/session-events/namespace.mjs +1 -1
- package/dist/services/session/storage/namespace.d.mts +1 -1
- package/dist/services/session/storage/schema.d.mts +2 -2
- package/dist/services/session/storage/schema.mjs +1 -1
- package/dist/services/session/testing/index.d.mts +18 -2
- package/dist/services/session/testing/index.mjs +52 -3
- package/dist/services/session/testing/orchestrator-shared.d.mts +1 -1
- package/dist/services/session/testing/orchestrator-shared.mjs +1 -1
- package/dist/services/session/turns/namespace.d.mts +1 -1
- package/dist/services/session/turns/namespace.mjs +1 -1
- package/dist/services/session-editor/index.d.mts +1 -1
- package/dist/services/settings/index.d.mts +3 -3
- package/dist/services/settings/namespace.d.mts +12 -12
- package/dist/services/settings/storage/clients-namespace.d.mts +1 -1
- package/dist/services/settings/storage/index.d.mts +3 -3
- package/dist/services/settings/storage/providers-namespace.d.mts +1 -1
- package/dist/services/subagent/index.d.mts +1 -1
- package/dist/services/subagent-template/index.d.mts +2 -2
- package/dist/services/subagent-template/namespace.d.mts +1 -1
- package/dist/services/subagent-template/schemas.d.mts +1 -1
- package/dist/services/tool-approval/index.d.mts +1 -1
- package/dist/services/tool-approval/index.mjs +1 -1
- package/dist/services/tools/index.d.mts +1 -1
- package/dist/services/tools/index.mjs +1 -1
- package/dist/services/tray-menu/index.d.mts +3 -3
- package/dist/services/tray-menu/namespace.d.mts +1 -1
- package/dist/services/tray-menu/schemas.d.mts +1 -1
- package/dist/services/turn/index.d.mts +1 -1
- package/dist/services/turn/namespace.d.mts +1 -1
- package/dist/session-KnewDVxt.mjs +39 -0
- package/dist/{session-lineage-CxHc3_bm.d.mts → session-lineage-CXzV_hAP.d.mts} +1 -1
- package/dist/{src-DI5TcYUW.mjs → src-CBG3IHUl.mjs} +1 -1
- package/dist/storage/drizzle/client.d.mts +2 -78
- package/dist/storage/drizzle/client.mjs +1 -1
- package/dist/storage/drizzle/columns/postgres.d.mts +88 -0
- package/dist/storage/drizzle/columns/postgres.mjs +1 -0
- package/dist/storage/drizzle/columns/sqlite.d.mts +81 -0
- package/dist/storage/drizzle/columns/sqlite.mjs +1 -0
- package/dist/storage/drizzle/index.d.mts +976 -23
- package/dist/storage/drizzle/index.mjs +1 -1
- package/dist/storage/handlers/drizzle/index.d.mts +1 -1
- package/dist/storage/handlers/drizzle/index.mjs +1 -1
- package/dist/storage/handlers/index.d.mts +1 -1
- package/dist/storage/handlers/index.mjs +1 -1
- package/dist/testing/drizzle-harness.d.mts +52 -6
- package/dist/testing/drizzle-harness.mjs +1 -1
- package/dist/testing/index.d.mts +34 -2
- package/dist/testing/index.mjs +1 -1
- package/dist/{tool-approval-service-BgNcJvKx.mjs → tool-approval-service-Cb2F1yT6.mjs} +1 -1
- package/dist/tools-D5DVHC-R.mjs +1 -0
- package/dist/{types-C5Uy3WEy.d.mts → types-D5IMwOkJ.d.mts} +1 -1
- package/dist/{types-CZHV05Lu.d.mts → types-DLVitCZP.d.mts} +51 -51
- package/dist/ui-kernel/index.d.mts +1 -1
- package/dist/ui-kernel/pages/schemas.d.mts +1 -1
- package/dist/workflow-engine/index.d.mts +482 -86
- package/dist/workflow-engine/index.mjs +1 -1
- package/dist/workflow-engine/package.d.mts +1 -1
- package/dist/workflow-engine/package.mjs +1 -1
- package/dist/workflow-engine/workflow-orchestrator.mjs +1 -1
- package/dist/{workflow-worker-hDaQzTBl.mjs → workflow-worker-CK9Sqj7D.mjs} +1 -1
- package/package.json +40 -1
- package/dist/drizzle-DpjZFY_j.mjs +0 -1
- package/dist/extension--5Q190u_.mjs +0 -1
- package/dist/extension-DFIZ3FCJ.mjs +0 -1
- package/dist/handlers-Bev7-xjL.mjs +0 -41
- package/dist/namespace-CDiM5Bcr.mjs +0 -1
- package/dist/namespace-h0HIuqx0.mjs +0 -1
- package/dist/package-C9wOiMK9.mjs +0 -1
- package/dist/primitive-runtime-1Z3JbRUj.mjs +0 -1
- package/dist/schema-DCJyzRHe.mjs +0 -1
- package/dist/schema-DOnJmAPw.mjs +0 -1
- package/dist/session-BnfsJoZi.mjs +0 -134
- package/dist/tools-B8d8Iqqx.mjs +0 -1
- package/dist/types-yTKQTAok.d.mts +0 -31
- /package/dist/{ajv-0JG5NFEd.mjs → ajv-BA2z5ztb.mjs} +0 -0
- /package/dist/{await-trigger-CHuOd5co.mjs → await-trigger-DREnXCEJ.mjs} +0 -0
- /package/dist/{base-orchestrator-D-S9v5VY.d.mts → base-orchestrator-M5mAB5-w.d.mts} +0 -0
- /package/dist/{cleanEnvForAdapter-BlpmyXYk.mjs → cleanEnvForAdapter-vZfPGi0X.mjs} +0 -0
- /package/dist/{clients-namespace-E97p_GKF.d.mts → clients-namespace-SFk7OTop.d.mts} +0 -0
- /package/dist/{config-namespace-R_34Wfps.d.mts → config-namespace-BzAvE2nY.d.mts} +0 -0
- /package/dist/{create-static-mount-B9Szo_7y.mjs → create-static-mount-BB1MIQ9J.mjs} +0 -0
- /package/dist/{cross-spawn-CTptpCy4.mjs → cross-spawn-BL6EvJBv.mjs} +0 -0
- /package/dist/{cursor-storage-YikwAZR5.mjs → cursor-storage-CmKjSvKY.mjs} +0 -0
- /package/dist/{definition-CYzWS2eR.d.mts → definition-BSghHJpQ.d.mts} +0 -0
- /package/dist/{definition-CvOuzWNT.d.mts → definition-q6iLw11H.d.mts} +0 -0
- /package/dist/{descriptor-to-package-9nrAH_D5.mjs → descriptor-to-package-CY8oc2gl.mjs} +0 -0
- /package/dist/{esm-CglYG5aA.mjs → esm-CQVFKEW5.mjs} +0 -0
- /package/dist/{extension-discovery-BD1-oNU_.d.mts → extension-discovery-CkV_VRdJ.d.mts} +0 -0
- /package/dist/{filesystem-service-BcwRp4k1.d.mts → filesystem-service-Ddngll0j.d.mts} +0 -0
- /package/dist/{index-DJQew2k-.d.mts → index-9IDJUJ4X.d.mts} +0 -0
- /package/dist/{index-CNYPKkyH.d.mts → index-BBvcP-P0.d.mts} +0 -0
- /package/dist/{index-BFaeVdsn2.d.mts → index-BKKNWqkP2.d.mts} +0 -0
- /package/dist/{index-Dn9Uum3F.d.mts → index-BMpRB6iE.d.mts} +0 -0
- /package/dist/{index-CdNDnxXR.d.mts → index-BbCjtc3h.d.mts} +0 -0
- /package/dist/{index-B6RGNugn.d.mts → index-BnQSPC6c.d.mts} +0 -0
- /package/dist/{index-DUPZKsd3.d.mts → index-BpXX9WZJ.d.mts} +0 -0
- /package/dist/{index-DUhXk_q6.d.mts → index-BpniJgxu.d.mts} +0 -0
- /package/dist/{index-ChG8ZUNP.d.mts → index-Bsp0O_sI.d.mts} +0 -0
- /package/dist/{index-CmGvjpUG.d.mts → index-BtztOqaF.d.mts} +0 -0
- /package/dist/{index-CF7dnqQj.d.mts → index-Buo9H8RK.d.mts} +0 -0
- /package/dist/{index-9KnLzPYu.d.mts → index-BxFA1XcP.d.mts} +0 -0
- /package/dist/{index-AZ4iLe7O2.d.mts → index-C33Tq1ei2.d.mts} +0 -0
- /package/dist/{index--0CnhN0g.d.mts → index-C6BhKRnH.d.mts} +0 -0
- /package/dist/{index-BV8rSmDZ.d.mts → index-CDU_s69P.d.mts} +0 -0
- /package/dist/{index-BDlpFEsp2.d.mts → index-CGJjA-hR2.d.mts} +0 -0
- /package/dist/{index-Dsu1tPHm.d.mts → index-CZ_TcT6J.d.mts} +0 -0
- /package/dist/{index-DNGUXQGC.d.mts → index-Cz9JMjZK.d.mts} +0 -0
- /package/dist/{index-C-YBGCCG.d.mts → index-D0SUjZmU.d.mts} +0 -0
- /package/dist/{index-yNb7G73-.d.mts → index-D6Iyvz9T.d.mts} +0 -0
- /package/dist/{index-ziQTLYUO.d.mts → index-DOfq0qqv.d.mts} +0 -0
- /package/dist/{index-BYxgW2i0.d.mts → index-DSV1aFgK.d.mts} +0 -0
- /package/dist/{index-Dbwm5Y-Q.d.mts → index-Dsq2zKvu.d.mts} +0 -0
- /package/dist/{jsonl-transport-DBHQgcIm.mjs → jsonl-transport-C21tpVfe.mjs} +0 -0
- /package/dist/{lib-CaOdTS9F.mjs → lib-CNOQJtgs.mjs} +0 -0
- /package/dist/{namespace-DnZ4rS6T2.d.mts → namespace-B60mn8J-2.d.mts} +0 -0
- /package/dist/{namespace-DfYutvMT.d.mts → namespace-BBVtD1gu.d.mts} +0 -0
- /package/dist/{namespace-BaJJxBsI.d.mts → namespace-CHMszppN.d.mts} +0 -0
- /package/dist/{namespace-uGw5nK6d.d.mts → namespace-CqUGzG53.d.mts} +0 -0
- /package/dist/{namespace-Dik_dNeE.d.mts → namespace-D1Iw_d1P.d.mts} +0 -0
- /package/dist/{namespace-13uMtVGj.d.mts → namespace-DRFJN-_z.d.mts} +0 -0
- /package/dist/{namespace-TfZGCy7N.d.mts → namespace-DzVf1hVH.d.mts} +0 -0
- /package/dist/{namespace-QTFnJWHC.d.mts → namespace-XTGCaSXj.d.mts} +0 -0
- /package/dist/{namespace-CTrNKkxY.d.mts → namespace-nlsvvMtD.d.mts} +0 -0
- /package/dist/{namespace-DkDvQJhB.d.mts → namespace-uuR0Fg5r.d.mts} +0 -0
- /package/dist/{orchestrator-shared-BZVeoRfr.d.mts → orchestrator-shared-D91Wk7z-.d.mts} +0 -0
- /package/dist/{out-CiFds_ap.mjs → out-C1JFb2Bp.mjs} +0 -0
- /package/dist/{package-B2HkKyRz.d.mts → package-BSnp1zOR.d.mts} +0 -0
- /package/dist/{providers-namespace-Cc9FQ-Zt.d.mts → providers-namespace-BqWYkydw.d.mts} +0 -0
- /package/dist/{schemas-BD-1NGmS.d.mts → schemas-B5ToLwIs.d.mts} +0 -0
- /package/dist/{schemas-Hy-lsBpg.d.mts → schemas-B77Gi8Xr.d.mts} +0 -0
- /package/dist/{schemas-BzK1I1eX.d.mts → schemas-C792eVAZ.d.mts} +0 -0
- /package/dist/{schemas-CYS6bkht.d.mts → schemas-Chyj6HuZ.d.mts} +0 -0
- /package/dist/{schemas-BiMxSTUx.d.mts → schemas-CkOSG2eJ.d.mts} +0 -0
- /package/dist/{schemas-DL_bGYyZ.d.mts → schemas-DZUaRcYl.d.mts} +0 -0
- /package/dist/{schemas-DdZwjeF0.d.mts → schemas-Dv5FxHDT.d.mts} +0 -0
- /package/dist/{schemas-CsjB6gel.d.mts → schemas-Dyk7JuVl.d.mts} +0 -0
- /package/dist/{schemas-DFWGb4uj.d.mts → schemas-Kq33MTPY.d.mts} +0 -0
- /package/dist/{schemas-BFeP62V4.d.mts → schemas-lqvZ6UpK.d.mts} +0 -0
- /package/dist/{server-lifecycle-DVAbXQzg.d.mts → server-lifecycle-47mygK3E.d.mts} +0 -0
- /package/dist/{server-lifecycle-JTFuSJhg.mjs → server-lifecycle-Cg47L59Q.mjs} +0 -0
- /package/dist/{src-4_2jBceX.mjs → src-DedDL9iv.mjs} +0 -0
- /package/dist/{storage-namespace-I30TaZP7.d.mts → storage-namespace-BXmMUd7a.d.mts} +0 -0
- /package/dist/{storage-namespace-definition-ZNBL3v2h.d.mts → storage-namespace-definition-C3XbpiP8.d.mts} +0 -0
- /package/dist/{types-11QnNmpW.d.mts → types-5Gw3iVpK.d.mts} +0 -0
- /package/dist/{types-BKNpS4Xw.d.mts → types-B0BtvVAq.d.mts} +0 -0
- /package/dist/{types-0u6hpELc.d.mts → types-BMpIa4fx.d.mts} +0 -0
- /package/dist/{types-BtMNh2FS.d.mts → types-D-bP8RRE.d.mts} +0 -0
- /package/dist/{window-registry-QD1rTk_f.d.mts → window-registry-CfEi_Ji4.d.mts} +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { StorageDialect as StorageDialect$1 } from "@makaio/framework/contracts";
|
|
2
|
+
import { LibSQLDatabase } from "drizzle-orm/libsql";
|
|
3
|
+
|
|
4
|
+
//#region storage/drizzle/src/types.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Brand key attached to database handles by `createDatabaseClient`.
|
|
7
|
+
*
|
|
8
|
+
* Declared via `Symbol.for` so the brand survives duplicated module instances
|
|
9
|
+
* (a bundled dist copy and a workspace copy of this package resolve the same
|
|
10
|
+
* symbol through the global symbol registry).
|
|
11
|
+
*/
|
|
12
|
+
declare const DATABASE_DIALECT: unique symbol;
|
|
13
|
+
/**
|
|
14
|
+
* Canonical database type alias for all Makaio storage consumers: the
|
|
15
|
+
* dialect-portable Drizzle query-builder surface.
|
|
16
|
+
*
|
|
17
|
+
* Typed as the shared async-compatible Drizzle surface, which keeps the
|
|
18
|
+
* cross-driver query contract stable while excluding libsql-only members such
|
|
19
|
+
* as `$client`, `batch()`, and `resultKind`.
|
|
20
|
+
*
|
|
21
|
+
* Raw statement members (`run`, `all`, `get`, `values`) are intentionally
|
|
22
|
+
* excluded as well — they exist only on the SQLite drivers. Raw SQL goes
|
|
23
|
+
* through the executor resolved by `getRawSqlExecutor(db)` instead. This
|
|
24
|
+
* narrowing turns "would crash on Postgres" into "does not compile".
|
|
25
|
+
*
|
|
26
|
+
* At runtime, the factory in `client.ts` may return a `BunSQLiteDatabase`
|
|
27
|
+
* instance (sync dialect) cast to this type. That is safe because:
|
|
28
|
+
* - All query-builder methods (`select`, `insert`, `update`, `delete`) exist
|
|
29
|
+
* on both drivers with compatible call signatures.
|
|
30
|
+
* - Awaiting Bun's synchronous return values still preserves the existing
|
|
31
|
+
* async call sites, even though it introduces the normal microtask boundary
|
|
32
|
+
* of `await`.
|
|
33
|
+
*
|
|
34
|
+
* **All consumers must import this type** instead of importing
|
|
35
|
+
* `LibSQLDatabase` directly from `drizzle-orm/libsql`. This single import
|
|
36
|
+
* seam is what makes the runtime driver swap transparent to callers.
|
|
37
|
+
*
|
|
38
|
+
* **Caveat:** Consumers must not access libsql-only members such as
|
|
39
|
+
* `db.$client` directly — use the `close()` function returned by
|
|
40
|
+
* `createDatabaseClient` instead. The factory handles driver-specific teardown
|
|
41
|
+
* internally.
|
|
42
|
+
* @typeParam TSchema - Drizzle table schema record. Defaults to an empty schema.
|
|
43
|
+
*/
|
|
44
|
+
type MakaioDatabase<TSchema extends Record<string, unknown> = Record<string, never>> = Omit<LibSQLDatabase<TSchema>, '$client' | 'batch' | 'resultKind' | 'run' | 'all' | 'get' | 'values'> & {
|
|
45
|
+
/**
|
|
46
|
+
* Dialect brand attached by `createDatabaseClient`. Optional because
|
|
47
|
+
* hand-rolled handles (e.g. in-memory test clients) are never branded —
|
|
48
|
+
* they resolve to `'sqlite'` via {@link getDatabaseDialect}.
|
|
49
|
+
*/
|
|
50
|
+
readonly [DATABASE_DIALECT]?: StorageDialect$1;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Read the active storage dialect of a database handle.
|
|
54
|
+
*
|
|
55
|
+
* Unbranded handles default to `'sqlite'` — a safe default, not a guess: only
|
|
56
|
+
* `createDatabaseClient` produces Postgres handles and it always brands them.
|
|
57
|
+
* Hand-rolled test clients (e.g. raw in-memory drizzle instances) therefore
|
|
58
|
+
* keep SQLite semantics without any extra setup.
|
|
59
|
+
* @param db - Database handle to inspect. The brand is schema-independent, so
|
|
60
|
+
* handles of any schema generic are accepted (plain `MakaioDatabase` is
|
|
61
|
+
* assignable to this parameter type).
|
|
62
|
+
* @returns The branded dialect, or `'sqlite'` when the handle is unbranded.
|
|
63
|
+
*/
|
|
64
|
+
declare function getDatabaseDialect(db: MakaioDatabase<Record<string, unknown>>): StorageDialect$1;
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region storage/drizzle/src/client.d.ts
|
|
67
|
+
/**
|
|
68
|
+
* Postgres-only connection pool tuning. Self-owned type — the published
|
|
69
|
+
* declaration file never references `import('pg')` types.
|
|
70
|
+
*
|
|
71
|
+
* This is the typed engine-options seam: engine packages read it off
|
|
72
|
+
* {@link DatabaseClientConfig.postgres} when creating Postgres clients.
|
|
73
|
+
*/
|
|
74
|
+
interface PostgresClientOptions {
|
|
75
|
+
/**
|
|
76
|
+
* Maximum pooled connections. Defaults to 4 — sized for direct connections
|
|
77
|
+
* to a small managed Postgres tier without an external connection pooler.
|
|
78
|
+
*/
|
|
79
|
+
poolMax?: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Configuration options for the database client.
|
|
83
|
+
*/
|
|
84
|
+
interface DatabaseClientConfig {
|
|
85
|
+
/**
|
|
86
|
+
* Database URL. Driver selection is engine-based: the URL is resolved
|
|
87
|
+
* against the storage engine registry. A registered engine that claims the
|
|
88
|
+
* URL serves it (`postgres://` / `postgresql://` URLs are claimed by the
|
|
89
|
+
* `@makaio/storage-pg` engine, which must be registered); every other URL
|
|
90
|
+
* goes to the built-in default SQLite engine:
|
|
91
|
+
* - `file:./path/to/db.db` — local SQLite file via the runtime SQLite driver.
|
|
92
|
+
* - `libsql://host` — remote libSQL/Turso via `@libsql/client`.
|
|
93
|
+
* - `http://localhost:8080` — local libSQL server via `@libsql/client`.
|
|
94
|
+
* - `:memory:` — in-process in-memory SQLite database.
|
|
95
|
+
*
|
|
96
|
+
* Defaults to `'file:./makaio.db'`.
|
|
97
|
+
*/
|
|
98
|
+
url?: string;
|
|
99
|
+
/**
|
|
100
|
+
* Authentication token for remote databases (Turso).
|
|
101
|
+
* Not required for local file-based or in-memory databases.
|
|
102
|
+
*/
|
|
103
|
+
authToken?: string;
|
|
104
|
+
/**
|
|
105
|
+
* Postgres-only connection pool tuning. Self-owned type — no `pg` type
|
|
106
|
+
* dependency in the published declaration. Ignored for SQLite targets;
|
|
107
|
+
* read by engine packages (`config.postgres`) when creating clients.
|
|
108
|
+
*/
|
|
109
|
+
postgres?: PostgresClientOptions;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Result of creating a database client.
|
|
113
|
+
*/
|
|
114
|
+
interface DatabaseClient {
|
|
115
|
+
/** The drizzle ORM instance */
|
|
116
|
+
db: MakaioDatabase;
|
|
117
|
+
/** Storage dialect served by this client. Matches the brand on {@link DatabaseClient.db}. */
|
|
118
|
+
readonly dialect: StorageDialect$1;
|
|
119
|
+
/**
|
|
120
|
+
* Close the database connection. Safe to call multiple times.
|
|
121
|
+
*
|
|
122
|
+
* May return a promise when the underlying driver tears down asynchronously;
|
|
123
|
+
* shutdown call sites must await the result — awaiting a synchronous `void`
|
|
124
|
+
* is harmless.
|
|
125
|
+
*/
|
|
126
|
+
close(): void | Promise<void>;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Creates a drizzle ORM instance backed by the appropriate driver for the URL
|
|
130
|
+
* and current runtime.
|
|
131
|
+
*
|
|
132
|
+
* **Driver selection is engine-based:** the URL is resolved against the
|
|
133
|
+
* storage engine registry.
|
|
134
|
+
* - A registered engine that claims the URL creates the client. `postgres://`
|
|
135
|
+
* / `postgresql://` URLs require the registered `@makaio/storage-pg` engine
|
|
136
|
+
* (which owns the node-postgres driver glue and declares `pg` as a regular
|
|
137
|
+
* dependency); without it they fail with an actionable install error
|
|
138
|
+
* instead of being misrouted to SQLite.
|
|
139
|
+
* - **Every other URL** (including the `'file:./makaio.db'` default applied
|
|
140
|
+
* when `url` is omitted) — the registered default SQLite engine, which
|
|
141
|
+
* dispatches between the Bun-native `bun:sqlite` driver (local URLs under
|
|
142
|
+
* Bun) and `@libsql/client` (everything else) and applies local-database
|
|
143
|
+
* PRAGMAs (WAL journal mode, busy timeout, and foreign key enforcement for
|
|
144
|
+
* `file:` URLs; foreign key enforcement for `:memory:`).
|
|
145
|
+
*
|
|
146
|
+
* SEAM: This factory allows swapping the database backend by providing
|
|
147
|
+
* different connection URLs (local file, Turso, libSQL server, Postgres) and
|
|
148
|
+
* by registering additional storage engines that claim their own URL shapes.
|
|
149
|
+
* @param config - Database configuration options
|
|
150
|
+
* @returns Database client with drizzle ORM instance and close method
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* import { createDatabaseClient } from '@makaio/framework/storage/drizzle/client';
|
|
154
|
+
*
|
|
155
|
+
* // Local development with file-based SQLite
|
|
156
|
+
* const { db, close } = await createDatabaseClient();
|
|
157
|
+
*
|
|
158
|
+
* // Production with Postgres
|
|
159
|
+
* const { db, close } = await createDatabaseClient({
|
|
160
|
+
* url: process.env.DATABASE_URL, // postgres://user:pw@host:5432/db
|
|
161
|
+
* });
|
|
162
|
+
*
|
|
163
|
+
* // Production with Turso
|
|
164
|
+
* const { db, close } = await createDatabaseClient({
|
|
165
|
+
* url: process.env.TURSO_DATABASE_URL,
|
|
166
|
+
* authToken: process.env.TURSO_AUTH_TOKEN,
|
|
167
|
+
* });
|
|
168
|
+
*
|
|
169
|
+
* // Close when done (close may resolve asynchronously — await is always safe)
|
|
170
|
+
* await close();
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
declare function createDatabaseClient(config?: DatabaseClientConfig): Promise<DatabaseClient>;
|
|
174
|
+
//#endregion
|
|
175
|
+
export { DATABASE_DIALECT as a, getDatabaseDialect as c, createDatabaseClient as i, DatabaseClientConfig as n, MakaioDatabase as o, PostgresClientOptions as r, StorageDialect$1 as s, DatabaseClient as t };
|
package/dist/clients/index.d.mts
CHANGED
|
@@ -4,8 +4,13 @@ import * as _$_makaio_core0 from "@makaio/framework/core";
|
|
|
4
4
|
import { EventMessagePayload, RequestMessagePayload, SchemaRecord, SubjectDefinition, SubjectRecord } from "@makaio/framework/core";
|
|
5
5
|
import { IMakaioBus } from "@makaio/framework/bus";
|
|
6
6
|
import * as _$_makaio_contracts0 from "@makaio/framework/contracts";
|
|
7
|
-
import { ClientDefinition, ExtensionServiceLifecycle, MakaioNodeExtension } from "@makaio/framework/contracts";
|
|
7
|
+
import { ClientDefinition, ExtensionContext, ExtensionServiceLifecycle, MakaioNodeExtension } from "@makaio/framework/contracts";
|
|
8
8
|
import { BaseService } from "@makaio/framework/service-base";
|
|
9
|
+
import * as _$drizzle_orm_sqlite_core0 from "drizzle-orm/sqlite-core";
|
|
10
|
+
import * as _$drizzle_orm_pg_core0 from "drizzle-orm/pg-core";
|
|
11
|
+
import * as _$_makaio_storage_drizzle0 from "@makaio/framework/storage/drizzle";
|
|
12
|
+
import { MakaioDatabase } from "@makaio/framework/storage/drizzle";
|
|
13
|
+
import * as _$drizzle_orm0 from "drizzle-orm";
|
|
9
14
|
import { ClientAccountIdentifier, ClientDefinition as ClientDefinition$1, ClientExecutionContext, ClientInstallCompleted, ClientInstallProgress, ClientRuntimeObserveRequest, ClientSessionObservedBase, ClientSubjects, ClientUsageSnapshot, ClientWiringEntry, ClientWiringEntrySchema, ManagedInstallDescriptor, ManagedInstallStrategy, PostInstallDescriptor } from "@makaio/framework/contracts/client";
|
|
10
15
|
import * as _$zod_v4_core0 from "zod/v4/core";
|
|
11
16
|
|
|
@@ -2557,6 +2562,104 @@ declare const ClientProfileStorageSubjects: _$_makaio_core0.BusSubjects<_$_makai
|
|
|
2557
2562
|
/** Persisted client profile record as exchanged over the bus. */
|
|
2558
2563
|
type ClientProfileRecord = z.infer<typeof ClientProfileRecordSchema>;
|
|
2559
2564
|
//#endregion
|
|
2565
|
+
//#region subsystems/client/src/storage/client-binary-drizzle-handler.d.ts
|
|
2566
|
+
/**
|
|
2567
|
+
* Registers Drizzle-backed bus handlers for client binary storage.
|
|
2568
|
+
*
|
|
2569
|
+
* The following subjects are handled:
|
|
2570
|
+
* - `client-binary:storage.insertVersion` — insert a new installed-version row.
|
|
2571
|
+
* - `client-binary:storage.recordInstalledVersion` — atomically insert and optionally activate a version.
|
|
2572
|
+
* - `client-binary:storage.listVersions` — return all versions for a client.
|
|
2573
|
+
* - `client-binary:storage.getSnapshot` — return one client's state and versions from one read transaction.
|
|
2574
|
+
* - `client-binary:storage.loadAllVersions` — return all version rows.
|
|
2575
|
+
* - `client-binary:storage.upsertState` — upsert the per-client state row.
|
|
2576
|
+
* - `client-binary:storage.setActiveVersion` — update active version only.
|
|
2577
|
+
* - `client-binary:storage.getState` — return the per-client state row.
|
|
2578
|
+
* - `client-binary:storage.loadAllState` — return all state rows.
|
|
2579
|
+
* - `client-binary:storage.loadSnapshot` — return all state and version rows from one read transaction.
|
|
2580
|
+
* - `client-binary:storage.removeVersionAndClearActive` — atomic uninstall in one transaction.
|
|
2581
|
+
* @param bus - Bus instance to register handlers on
|
|
2582
|
+
* @param db - Drizzle database instance
|
|
2583
|
+
* @param _ctx - Extension context (unused; reserved for future use)
|
|
2584
|
+
* @returns Cleanup function to unregister all handlers
|
|
2585
|
+
*/
|
|
2586
|
+
declare function registerDrizzleClientBinaryStorage(bus: IMakaioBus, db: MakaioDatabase, _ctx: ExtensionContext): () => void;
|
|
2587
|
+
//#endregion
|
|
2588
|
+
//#region subsystems/client/src/storage/runtime-drizzle-handler.d.ts
|
|
2589
|
+
/**
|
|
2590
|
+
* Registers Drizzle-backed bus handlers for client runtime storage.
|
|
2591
|
+
*
|
|
2592
|
+
* Two subjects are handled:
|
|
2593
|
+
* - `client-runtime:storage.upsert` — insert or update a runtime record by ID.
|
|
2594
|
+
* - `client-runtime:storage.loadAll` — return all persisted runtime records.
|
|
2595
|
+
*
|
|
2596
|
+
* The registry calls `upsert` after every mutation so that state survives
|
|
2597
|
+
* restarts. `loadAll` is called once at registry boot to hydrate the in-memory
|
|
2598
|
+
* map.
|
|
2599
|
+
* @param bus - Bus instance to register handlers on
|
|
2600
|
+
* @param db - Drizzle database instance
|
|
2601
|
+
* @param _ctx - Extension context (unused; reserved for future use)
|
|
2602
|
+
* @returns Cleanup function to unregister all handlers
|
|
2603
|
+
*/
|
|
2604
|
+
declare function registerDrizzleRuntimeStorage(bus: IMakaioBus, db: MakaioDatabase, _ctx: ExtensionContext): () => void;
|
|
2605
|
+
//#endregion
|
|
2606
|
+
//#region subsystems/client/src/storage/profile-drizzle-handler.d.ts
|
|
2607
|
+
/**
|
|
2608
|
+
* Registers Drizzle-backed bus handlers for client profile storage.
|
|
2609
|
+
*
|
|
2610
|
+
* The following subjects are handled:
|
|
2611
|
+
* - `client-profile:storage.get` — return a profile by `(clientId, name)`.
|
|
2612
|
+
* - `client-profile:storage.getById` — return a profile by stable row ID.
|
|
2613
|
+
* - `client-profile:storage.list` — return all profiles for a client.
|
|
2614
|
+
* - `client-profile:storage.set` — insert or update a profile by stable row ID.
|
|
2615
|
+
* - `client-profile:storage.delete` — delete a profile by `(clientId, name)`.
|
|
2616
|
+
* - `client-profile:storage.clearDefault` — reset the default flag for all profiles of a client.
|
|
2617
|
+
* - `client-profile:storage.setDefault` — atomically promote one profile to default.
|
|
2618
|
+
* @param bus - Bus instance to register handlers on
|
|
2619
|
+
* @param db - Drizzle database instance
|
|
2620
|
+
* @param _ctx - Extension context (unused; reserved for future use)
|
|
2621
|
+
* @returns Cleanup function to unregister all handlers
|
|
2622
|
+
*/
|
|
2623
|
+
declare function registerDrizzleProfileStorage(bus: IMakaioBus, db: MakaioDatabase, _ctx: ExtensionContext): () => void;
|
|
2624
|
+
//#endregion
|
|
2625
|
+
//#region subsystems/client/src/storage/runtime-schema.d.ts
|
|
2626
|
+
/**
|
|
2627
|
+
* Drizzle schema for the `client_runtimes` table.
|
|
2628
|
+
*
|
|
2629
|
+
* Persists metadata and lifecycle status for each observed client runtime
|
|
2630
|
+
* instance. The `id` column holds the stable `clientRuntimeId` UUID assigned
|
|
2631
|
+
* by the registry. Evidence fields are nullable because they accumulate
|
|
2632
|
+
* incrementally across multiple observations.
|
|
2633
|
+
* @packageDocumentation
|
|
2634
|
+
*/
|
|
2635
|
+
/**
|
|
2636
|
+
* Persistent store for client runtime records.
|
|
2637
|
+
*
|
|
2638
|
+
* Each row represents one observed client process instance. Rows are created
|
|
2639
|
+
* on first observation and enriched as stronger evidence arrives. The registry
|
|
2640
|
+
* never deletes rows — termination signals are out of scope for v1.
|
|
2641
|
+
*/
|
|
2642
|
+
declare const clientRuntimesDual: _$_makaio_storage_drizzle0.DualTable<"client_runtimes", {
|
|
2643
|
+
/** Stable runtime identifier (UUID v4) assigned by the registry. */id: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.IsPrimaryKey<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"id", [string, ...string[]], number | undefined>>>, _$drizzle_orm0.IsPrimaryKey<_$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgTextBuilderInitial<"id", [string, ...string[]]>>>>; /** Stable client identifier (e.g. `'claude-code'`). */
|
|
2644
|
+
clientId: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"client_id", [string, ...string[]], number | undefined>>, _$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgTextBuilderInitial<"client_id", [string, ...string[]]>>>;
|
|
2645
|
+
/**
|
|
2646
|
+
* Lifecycle status of the runtime.
|
|
2647
|
+
* Either `'observed'` (weak evidence) or `'started'` (strong evidence).
|
|
2648
|
+
*/
|
|
2649
|
+
status: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"status", [string, ...string[]], number | undefined>>, _$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgTextBuilderInitial<"status", [string, ...string[]]>>>; /** Supervisor-assigned session ID, when the supervisor detected the runtime. */
|
|
2650
|
+
supervisorSessionId: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"supervisor_session_id", [string, ...string[]], number | undefined>, _$drizzle_orm_pg_core0.PgTextBuilderInitial<"supervisor_session_id", [string, ...string[]]>>; /** OS process ID of the client binary. */
|
|
2651
|
+
pid: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteIntegerBuilderInitial<string>, _$drizzle_orm_pg_core0.PgIntegerBuilderInitial<string>>; /** OS process ID of the parent process. */
|
|
2652
|
+
parentPid: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteIntegerBuilderInitial<string>, _$drizzle_orm_pg_core0.PgIntegerBuilderInitial<string>>; /** Raw session identifier from the client runtime. */
|
|
2653
|
+
adapterSessionId: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"adapter_session_id", [string, ...string[]], number | undefined>, _$drizzle_orm_pg_core0.PgTextBuilderInitial<"adapter_session_id", [string, ...string[]]>>; /** Framework session ID, if already resolved at observation time. */
|
|
2654
|
+
sessionId: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"session_id", [string, ...string[]], number | undefined>, _$drizzle_orm_pg_core0.PgTextBuilderInitial<"session_id", [string, ...string[]]>>; /** Working directory of the client process. */
|
|
2655
|
+
cwd: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm_sqlite_core0.SQLiteTextBuilderInitial<"cwd", [string, ...string[]], number | undefined>, _$drizzle_orm_pg_core0.PgTextBuilderInitial<"cwd", [string, ...string[]]>>; /** Full argv of the client process as a JSON array. */
|
|
2656
|
+
argv: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.$Type<_$drizzle_orm_sqlite_core0.SQLiteTextJsonBuilderInitial<string>, string[]>, _$drizzle_orm0.$Type<_$drizzle_orm_pg_core0.PgJsonbBuilderInitial<string>, string[]>>; /** Arbitrary pass-through metadata from the most recent observation. */
|
|
2657
|
+
metadata: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.$Type<_$drizzle_orm_sqlite_core0.SQLiteTextJsonBuilderInitial<string>, Record<string, unknown>>, _$drizzle_orm0.$Type<_$drizzle_orm_pg_core0.PgJsonbBuilderInitial<string>, Record<string, unknown>>>; /** Unix epoch timestamp in milliseconds of the latest captured observation while the row was observed. */
|
|
2658
|
+
observedAt: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteIntegerBuilderInitial<string>>, _$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgBigInt53BuilderInitial<string>>>; /** Unix epoch timestamp in milliseconds when this record was created. */
|
|
2659
|
+
createdAt: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteIntegerBuilderInitial<string>>, _$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgBigInt53BuilderInitial<string>>>; /** Unix epoch timestamp in milliseconds of the last mutation. */
|
|
2660
|
+
updatedAt: _$_makaio_storage_drizzle0.DualBuilder<_$drizzle_orm0.NotNull<_$drizzle_orm_sqlite_core0.SQLiteIntegerBuilderInitial<string>>, _$drizzle_orm0.NotNull<_$drizzle_orm_pg_core0.PgBigInt53BuilderInitial<string>>>;
|
|
2661
|
+
}>;
|
|
2662
|
+
//#endregion
|
|
2560
2663
|
//#region subsystems/client/src/resolve-client-binary.d.ts
|
|
2561
2664
|
/**
|
|
2562
2665
|
* Resolve the execution context for a client binary via the bus.
|
|
@@ -2636,4 +2739,4 @@ declare function buildHookCommand(makaioCommand: string, sentinel: string, event
|
|
|
2636
2739
|
*/
|
|
2637
2740
|
declare function deriveSessionEventDescriptors(clientDefinition: ClientDefinition$1): ReadonlyArray<SessionEventDescriptor>;
|
|
2638
2741
|
//#endregion
|
|
2639
|
-
export { AbsolutePathSchema, type AtomicContentParser, type AtomicModifier, type AtomicModifyOutcome, BinaryNotFoundError, type BuildClientSessionBaseOpts, CLIENT_RUNTIME_STATUSES, ClientAccountRegistry, type ClientAccountUpsertResult, ClientBinaryJobRunner, ClientBinaryManager, type ClientBinaryManagerConfig, type ClientBinaryStateRecord, ClientBinaryStateRecordSchema, ClientBinaryStorageNamespace, ClientBinaryStorageSubjects, type ClientBinaryVersionRecord, ClientBinaryVersionRecordSchema, ClientBinaryVersionResolver, ClientConfigPrimeService, type ClientDefinitionLookup, ClientDefinitionRegistry, type ClientHookHandleResponse, ClientHookHandleResponseSchema, type ClientNamespaceResult, type ClientProfileRecord, ClientProfileRecordSchema, ClientProfileService, ClientProfileStorageNamespace, ClientProfileStorageSubjects, type ClientRuntimeRecord, ClientRuntimeRegistry, ClientRuntimeService, type ClientRuntimeStatus, ClientRuntimeStorageNamespace, ClientRuntimeStorageSubjects, ClientSessionConfigService, ClientSubjects, type ClientWiringAggregatedResult, ClientWiringAggregatedResultSchema, type ClientWiringApplyResponse, ClientWiringApplyResponseSchema, type ClientWiringEntry, ClientWiringEntrySchema, type ClientWiringListResponse, ClientWiringListResponseSchema, type ClientWiringListSubjectDef, type ClientWiringRemoveResponse, ClientWiringRemoveResponseSchema, type ClientWiringSubjectDefBase, type ClientsCorePackageOptions, ClientsCoreService, ClientsCoreToken, DEFAULT_HOOK_HANDLE_TIMEOUT_MS, type InstallJob, type JobCompletedCallback, type JobCompletionCallback, type JobCompletionResult, type JobProgressCallback, type PostInstallContext, type PostInstallHandler, type RawClientHookHandleSubject, type RawClientHookPayload, RawClientHookPayloadSchema, type RawClientHookReceivedSubject, type ResolvedInstallVersion, RuntimeRecordSchema, type RuntimeUpsertResult, type SessionEventDescriptor, type StrategyDependencies, assertAbsoluteProjectDir, atomicModifyFile, buildClientCommand, buildClientSessionBase, buildHookCommand, canonicalizeClientId, createClientNamespace, createClientWiringListSubjectDef, createClientWiringSubjectDef, createClientsCorePackage, createRawClientHookHandleSubject, createRawClientHookReceivedSubject, deriveSessionEventDescriptors, emitBestEffort, isPathWithinBase, pickNonEmptyString, pickNonEmptyStringValue, registerStorageHandlersWithRollback, resolveAndValidateBasePath, resolveClientBinary };
|
|
2742
|
+
export { AbsolutePathSchema, type AtomicContentParser, type AtomicModifier, type AtomicModifyOutcome, BinaryNotFoundError, type BuildClientSessionBaseOpts, CLIENT_RUNTIME_STATUSES, ClientAccountRegistry, type ClientAccountUpsertResult, ClientBinaryJobRunner, ClientBinaryManager, type ClientBinaryManagerConfig, type ClientBinaryStateRecord, ClientBinaryStateRecordSchema, ClientBinaryStorageNamespace, ClientBinaryStorageSubjects, type ClientBinaryVersionRecord, ClientBinaryVersionRecordSchema, ClientBinaryVersionResolver, ClientConfigPrimeService, type ClientDefinitionLookup, ClientDefinitionRegistry, type ClientHookHandleResponse, ClientHookHandleResponseSchema, type ClientNamespaceResult, type ClientProfileRecord, ClientProfileRecordSchema, ClientProfileService, ClientProfileStorageNamespace, ClientProfileStorageSubjects, type ClientRuntimeRecord, ClientRuntimeRegistry, ClientRuntimeService, type ClientRuntimeStatus, ClientRuntimeStorageNamespace, ClientRuntimeStorageSubjects, ClientSessionConfigService, ClientSubjects, type ClientWiringAggregatedResult, ClientWiringAggregatedResultSchema, type ClientWiringApplyResponse, ClientWiringApplyResponseSchema, type ClientWiringEntry, ClientWiringEntrySchema, type ClientWiringListResponse, ClientWiringListResponseSchema, type ClientWiringListSubjectDef, type ClientWiringRemoveResponse, ClientWiringRemoveResponseSchema, type ClientWiringSubjectDefBase, type ClientsCorePackageOptions, ClientsCoreService, ClientsCoreToken, DEFAULT_HOOK_HANDLE_TIMEOUT_MS, type InstallJob, type JobCompletedCallback, type JobCompletionCallback, type JobCompletionResult, type JobProgressCallback, type PostInstallContext, type PostInstallHandler, type RawClientHookHandleSubject, type RawClientHookPayload, RawClientHookPayloadSchema, type RawClientHookReceivedSubject, type ResolvedInstallVersion, RuntimeRecordSchema, type RuntimeUpsertResult, type SessionEventDescriptor, type StrategyDependencies, assertAbsoluteProjectDir, atomicModifyFile, buildClientCommand, buildClientSessionBase, buildHookCommand, canonicalizeClientId, clientRuntimesDual, createClientNamespace, createClientWiringListSubjectDef, createClientWiringSubjectDef, createClientsCorePackage, createRawClientHookHandleSubject, createRawClientHookReceivedSubject, deriveSessionEventDescriptors, emitBestEffort, isPathWithinBase, pickNonEmptyString, pickNonEmptyStringValue, registerDrizzleClientBinaryStorage, registerDrizzleProfileStorage, registerDrizzleRuntimeStorage, registerStorageHandlersWithRollback, resolveAndValidateBasePath, resolveClientBinary };
|
package/dist/clients/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{z as e}from"zod";import*as t from"node:fs/promises";import*as n from"node:path";import{randomUUID as r}from"node:crypto";import{createBusNamespace as i}from"@makaio/framework/core";import{MakaioBus as a}from"@makaio/framework/bus";import{extensionToken as o,isUniversalRange as s,versionSatisfies as c}from"@makaio/framework/contracts";import{BaseService as l}from"@makaio/framework/service-base";import{index as u,
|
|
2
|
-
`)){let e=t.split(`:`);if(e[0]===`fpr`&&e[9]!==void 0&&e[9].length>0)return e[9]}throw Error(`Could not extract GPG key fingerprint from output`)}};function Pe(e,t){let n=oe.safeParse(e);if(n.success)switch(n.data.type){case`npm`:return new Ee(n.data,t);case`signed-binary-bucket`:return new Ne(n.data,t)}}function Fe(e,t){let r=n.relative(e,t);return r!==``&&!r.startsWith(`..${n.sep}`)&&r!==`..`&&!n.isAbsolute(r)}function E(e,t){return!n.isAbsolute(e)||!n.isAbsolute(t)?!1:Fe(n.resolve(e),n.resolve(t))}function D(e,t){if(!e||!n.isAbsolute(e))throw Error(`${t} requires a non-empty absolute basePath`);return n.resolve(e)}async function Ie(e,r,i,a){let[o,...s]=i;if(Re(o))throw Error(`versionCommand[0] must be a relative path; received absolute path "${o}"`);if(o.split(/[/\\]/).includes(`..`))throw Error(`versionCommand[0] must not contain path traversal segments; received "${o}"`);let c=n.normalize(o),l=n.join(r,c),u=await t.realpath(r),d=await t.realpath(l);if(!Fe(u,d))throw Error(`versionCommand[0] must not escape the install directory; "${o}" resolves outside installPath`);let f;try{f=await e(d,s,{cwd:u})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Version verification failed: command "${l}" exited with an error: ${t}`,{cause:e})}let p=Le(a);if(!ze(f,p))throw Error(`Version mismatch: expected "${a}" but command output was "${f.trim()}"`)}function Le(e){return e[0]===`v`||e[0]===`V`?e.slice(1):e}function Re(e){return e.startsWith(`/`)||/^[A-Za-z]:[/\\]/.test(e)||e.startsWith(`\\`)}function ze(e,t){return(e.match(/[A-Za-z0-9][A-Za-z0-9._+-]*/g)??[]).some(e=>Le(e)===t)}var Be=class{strategyDeps;config;jobs=new Map;#e=!1;resolvedBasePath;constructor(e,t){this.strategyDeps=e,this.config=t,this.resolvedBasePath=D(t.basePath,`ClientBinaryJobRunner`)}startJob(e,t,n,r,i,a,o){let s={...e,status:`running`};return this.jobs.set(e.jobId,s),this.runJob(s,t,n,r,i,a,o),e.jobId}cancelAll(){this.#e=!0,this.jobs.clear()}safeOnProgress(e,t){try{e(t)}catch{}}emitProgressIfActive(e,t){return this.#e?!1:(this.safeOnProgress(e,t),!this.#e)}async runJob(e,t,n,r,i,a,o){try{let s=this.resolveTargetDir(e.clientId,e.version),c=Pe(t,this.strategyDeps);if(c===void 0)throw Error(`Unsupported managed install descriptor type: ${t.type}`);let l=await this.executeStrategy(e,c,s,n);if(this.#e)return;let u;try{if(u=await this.runPostInstall(e,l.installPath,a,n),this.#e)return;o!==void 0&&await this.runVersionVerification(e,l.installPath,o,n)}catch(e){throw this.#e||await this.cleanupStagedArtifact(l.installPath),e}if(this.#e)return;await this.finalizeSuccess(e,l,u,n,r,i)}catch(t){if(this.#e)return;let n=t instanceof Error?t.message:String(t),r=t instanceof Error&&`code`in t?String(t.code):void 0;try{await i({jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,status:`error`,activeVersion:null,error:{message:n,...r===void 0?{}:{code:r}}})}catch{}}finally{this.jobs.delete(e.jobId)}}async finalizeSuccess(e,t,n,r,i,a){if(!(e.makeActive&&!this.emitProgressIfActive(r,{jobId:e.jobId,clientId:e.clientId,version:t.version,strategy:e.strategy,stage:`activating`,progress:null,installPath:t.installPath,activeAfterCompletion:!0}))&&!this.#e){try{await i({jobId:e.jobId,clientId:e.clientId,version:t.version,installPath:t.installPath,makeActive:e.makeActive,reason:e.reason})}catch(e){try{await this.strategyDeps.removeDirectory(t.installPath)}catch{}throw e}if(!this.#e)try{await a({jobId:e.jobId,clientId:e.clientId,version:t.version,strategy:e.strategy,status:`success`,installPath:t.installPath,activeVersion:e.makeActive?t.version:null,...n===void 0?{}:{metadata:{postInstall:n}}})}catch{}}}async cleanupStagedArtifact(e){try{await this.strategyDeps.removeDirectory(e)}catch{}}async executeStrategy(e,t,n,r){try{return await t.execute(e.version,n,(t,i)=>{this.emitProgressIfActive(r,{jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,stage:t,progress:i,installPath:t===`installing`?n:void 0,activeAfterCompletion:e.makeActive})})}catch(e){throw this.#e||await this.cleanupStagedArtifact(n),e}}async runPostInstall(e,t,n,r){if(n===void 0)return;let i=this.resolvePostInstallHandler(n),a=this.buildProgressPayload(e,`post-install`,null,t,{kind:n.kind});if(!this.emitProgressIfActive(r,a))return;let o=await i({clientId:e.clientId,version:e.version,installPath:t,descriptor:n});return this.emitProgressIfActive(r,this.buildProgressPayload(e,`post-install`,100,t,{kind:n.kind,...o??{}})),o??void 0}async runVersionVerification(e,t,n,r){this.emitProgressIfActive(r,this.buildProgressPayload(e,`verifying`,null,t,{kind:`version-command`}))&&(this.#e||await Ie(this.strategyDeps.exec,t,n,e.version))}resolvePostInstallHandler(e){let t=this.config.postInstallHandlers?.get(e.kind);if(t===void 0)throw Error(`No post-install handler registered for kind "${e.kind}"`);return t}buildProgressPayload(e,t,n,r,i){return{jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,stage:t,progress:n,installPath:r,activeAfterCompletion:e.makeActive,...i===void 0?{}:{metadata:i}}}resolveTargetDir(e,t){let r=n.resolve(this.resolvedBasePath,e,t);if(!E(this.resolvedBasePath,r))throw Error(`Invalid install target path for client "${e}" and version "${t}"`);return r}};const O=e.object({id:e.string(),clientId:e.string(),version:e.string(),installPath:e.string(),installedAt:e.number().int().nonnegative(),createdAt:e.number().int().nonnegative()}),k=e.object({clientId:e.string(),activeVersion:e.string().nullable(),updatedAt:e.number().int().nonnegative()}),A=e.object({previousActiveVersion:e.string().nullable(),activeVersion:e.string().nullable()}),j=i(`client-binary:storage`,{insertVersion:{request:O,response:e.object({success:e.boolean()})},recordInstalledVersion:{request:e.object({versionRecord:O,makeActive:e.boolean(),updatedAt:e.number().int().nonnegative()}),response:A},listVersions:{request:e.object({clientId:e.string()}),response:e.object({versions:e.array(O)})},getSnapshot:{request:e.object({clientId:e.string()}),response:e.object({state:k.nullable(),versions:e.array(O)})},loadAllVersions:{request:e.object({}),response:e.object({versions:e.array(O)})},upsertState:{request:k,response:e.object({success:e.boolean()})},setActiveVersion:{request:e.object({clientId:e.string(),activeVersion:e.string().nullable(),updatedAt:e.number().int().nonnegative()}),response:A},getState:{request:e.object({clientId:e.string()}),response:e.object({state:k.nullable()})},loadAllState:{request:e.object({}),response:e.object({states:e.array(k)})},loadSnapshot:{request:e.object({}),response:e.object({states:e.array(k),versions:e.array(O)})},removeVersionAndClearActive:{request:e.object({clientId:e.string(),version:e.string(),updatedAt:e.number().int().nonnegative()}),response:A.extend({removedVersion:e.string().nullable()})}}),M=j.subjects;var N=class{definitions=new Map;constructor(e=[]){for(let t of e)this.registerUnique(t)}getDefinition(e){return this.definitions.get(e)}listDefinitions(){return[...this.definitions.values()]}register(e){this.definitions.set(e.id,e)}registerUnique(e){if(this.definitions.has(e.id))throw Error(`ClientDefinitionRegistry: duplicate client definition id '${e.id}'`);this.definitions.set(e.id,e)}};function P(e,t,n,r,i){if(n===null){if(s(r))return;throw Error(`${e}: ${i} for client '${t}' did not report a version; requires ${r}`)}if(!c(n,r))throw Error(`${e}: ${i} ${n} for client '${t}' does not satisfy ${r}`)}var Ve=class{bus;resolvedBasePath;resolvedConfigBasePath;definitionLookup;constructor(e){this.bus=e.bus,this.resolvedBasePath=e.resolvedBasePath,this.resolvedConfigBasePath=e.resolvedConfigBasePath,this.definitionLookup=e.definitionLookup}async resolve(e){let t=this.definitionLookup.getDefinition(e);if(t===void 0)throw Error(`client.resolveBinary: no definition registered for client '${e}'`);let{state:n,versions:r}=await this.bus.request(M.getSnapshot,{clientId:e}),i=n?.activeVersion??null;return i===null?this.buildGlobalContext(e,t):this.buildManagedContext(e,i,t,r)}isInstallPathWithinBase(e){return E(this.resolvedBasePath,e)}async isExpectedInstallPath(e,r,i){if(!n.isAbsolute(e)||!this.isInstallPathWithinBase(e))return!1;let a=n.resolve(this.resolvedBasePath,r,i);if(!this.isInstallPathWithinBase(a))return!1;try{let[n,r,i]=await Promise.all([t.realpath(this.resolvedBasePath),t.realpath(a),t.realpath(e)]);return E(n,r)?i===r||E(r,i):!1}catch{return!1}}async buildManagedContext(e,t,r,i){let a=i.find(e=>e.version===t);if(a===void 0)throw Error(`client.resolveBinary: active version '${t}' is not installed for client '${e}'`);if(!await this.isExpectedInstallPath(a.installPath,e,t))throw Error(`client.resolveBinary: stored installPath "${a.installPath}" does not match the expected install directory for ${e}@${t}`);r.binary!==void 0&&P(`client.resolveBinary`,e,t,r.binary.supportedVersions,`managed binary version`);let o=F(r.versionCommand)?.[0];if(o===void 0)throw Error(`client.resolveBinary: definition for '${e}' has no versionCommand — cannot derive binary path`);let s=n.resolve(a.installPath,o),c=n.resolve(a.installPath);if(!s.startsWith(c+n.sep)&&s!==c)throw Error(`client.resolveBinary: versionCommand for '${e}' resolves outside the install directory`);let{configDir:l,env:u}=this.resolveIsolatedConfig(e,r);return{binaryPath:s,env:u,configDir:l,source:`managed`,version:t}}async buildGlobalContext(e,t){if(!t.binary?.name)throw Error(`client.resolveBinary: definition for '${e}' has no binary.name — cannot scan PATH`);let n={clientId:e,binaryName:t.binary.name,supportedVersions:t.binary.supportedVersions},{results:r}=await this.bus.request(b.scan,{targets:[n]}),i=r.find(t=>t.clientId===e);if(i===void 0||!i.found)throw new me(e);let a=i.version??null;return P(`client.resolveBinary`,e,a,t.binary.supportedVersions,`detected global binary version`),{binaryPath:null,env:{},configDir:this.resolveGlobalConfigDir(t),source:`global`,version:a}}resolveIsolatedConfig(e,t){let{configIsolation:r}=t;if(r===void 0)return{configDir:null,env:{}};let i=n.join(this.resolvedConfigBasePath,e,`config`),a=r.pathKind===`file`?n.join(i,n.basename(r.defaultPath)):i;return{configDir:i,env:{[r.envVar]:a}}}resolveGlobalConfigDir(e){let{configIsolation:t}=e;if(t===void 0)return null;let r=t.defaultPath,i=r===`~`?S.homedir():r.startsWith(`~/`)?n.join(S.homedir(),r.slice(2)):r,a=t.pathKind===`file`?n.dirname(i):i;if(!n.isAbsolute(a))throw Error(`ConfigIsolation defaultPath for '${e.id}' resolved to non-absolute path '${i}'; use an absolute or tilde-expanded path (e.g. '~/.myapp')`);return a}};function F(e){if(e===void 0)return;let{executable:t,args:n}=e,r=typeof t==`string`?t:t[process.platform]??t.default;if(typeof r!=`string`||r.trim()===``)throw Error(`client.resolveBinary: versionCommand executable is missing for this platform`);return[r,...n]}async function He(e,t){let{versions:n,states:r}=await e.request(M.loadSnapshot,{}),i=Map.groupBy(n,e=>e.clientId),a=new Map;for(let e of r)a.set(e.clientId,e.activeVersion);let o=new Map;for(let e of t.listDefinitions())e.managedInstall!==void 0&&o.set(e.id,e.managedInstall);return[...new Set(o.keys())].map(e=>{let t=o.get(e);if(t===void 0)throw Error(`assembleBinaryList: missing descriptor for client '${e}'`);let n=a.get(e)??null,r=(i.get(e)??[]).map(e=>({version:e.version,installPath:e.installPath,installedAt:e.installedAt,isActive:e.version===n})),s=t.version;return{clientId:e,installedVersions:r,activeVersion:n,pinnedVersion:s,updateAvailable:n!==null&&n!==s}})}var Ue=class extends l{config;definitionLookup;versionResolver;jobRunner;strategyDeps;resolvedBasePath;resolvedConfigBasePath;resolver;pendingClients=new Set;constructor(e=a,t,n=new N([]),r=Ce()){super(e),this.config=t,this.definitionLookup=n,this.resolvedBasePath=D(t.basePath,`ClientBinaryManager`),this.resolvedConfigBasePath=D(t.configBasePath,`ClientBinaryManager configBasePath`),this.strategyDeps=r,this.versionResolver=new we,this.jobRunner=new Be(r,t),this.resolver=new Ve({bus:e,resolvedBasePath:this.resolvedBasePath,resolvedConfigBasePath:this.resolvedConfigBasePath,definitionLookup:n})}async onInit(){this.registerHandler(b.list,async e=>{let t=await this.handleList();e.setResult({clients:t})}),this.registerHandler(b.install,async e=>{let t=await this.handleInstall(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(b.update,async e=>{let t=await this.handleUpdate(e.payload.clientId);e.setResult(t)}),this.registerHandler(b.setActive,async e=>{let t=await this.handleSetActive(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(b.uninstall,async e=>{let t=await this.handleUninstall(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(b.resolveBinary,async e=>{let t=await this.resolver.resolve(e.payload.clientId);e.setResult(t)})}onDestroy(){this.jobRunner.cancelAll(),this.pendingClients.clear()}async handleList(){return He(this.bus,this.definitionLookup)}async handleInstall(e,t){let{definition:n,descriptor:r}=this.requireManagedDefinition(e,`client.install`);return this.withClientLock(e,async()=>{let{version:i}=this.versionResolver.resolveInstallVersion(e,r,t);return n.binary!==void 0&&P(`client.install`,e,i,n.binary.supportedVersions,t===void 0?`resolved binary version`:`requested binary version`),{jobId:this.startInstallJob(e,i,r,n,!1,`install`),requestedVersion:t??null,resolvedVersion:i}})}async handleUpdate(e){let{definition:t,descriptor:n}=this.requireManagedDefinition(e,`client.update`);return this.withClientLock(e,async()=>{let{version:r}=this.versionResolver.resolveInstallVersion(e,n);return t.binary!==void 0&&P(`client.update`,e,r,t.binary.supportedVersions,`resolved binary version`),{jobId:this.startInstallJob(e,r,n,t,!0,`update`),resolvedVersion:r}})}async handleSetActive(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{let{versions:n}=await this.bus.request(M.listVersions,{clientId:e}),r=n.find(e=>e.version===t);if(r===void 0)throw Error(`client.setActive: version '${t}' is not installed for client '${e}'`);let i=this.definitionLookup.getDefinition(e);if(i===void 0)throw Error(`client.setActive: no definition registered for client '${e}'`);i.binary!==void 0&&P(`client.setActive`,e,t,i.binary.supportedVersions,`requested binary version`);let a=F(i.versionCommand);if(a===void 0)throw Error(`client.setActive: no versionCommand registered for client '${e}'`);if(!await this.resolver.isExpectedInstallPath(r.installPath,e,t))throw Error(`client.setActive: stored installPath "${r.installPath}" does not match the expected install directory for ${e}@${t}`);return await Ie(this.strategyDeps.exec,r.installPath,a,t),await this.patchActiveVersion(e,t,`set-active`),{clientId:e,activeVersion:t}}finally{this.pendingClients.delete(e)}}async handleUninstall(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{let{versions:r}=await this.bus.request(M.listVersions,{clientId:e}),i=r.find(e=>e.version===t);if(i===void 0)throw Error(`client.uninstall: version '${t}' is not installed for client '${e}'`);let{removedVersion:a,previousActiveVersion:o,activeVersion:s}=await this.bus.request(M.removeVersionAndClearActive,{clientId:e,version:t,updatedAt:Date.now()});if(a===null)throw Error(`client.uninstall: failed to delete version '${t}' for client '${e}'`);let c=i.installPath,l=typeof c==`string`&&c.length>0?n.resolve(c):null;if(typeof c!=`string`||c.length===0||l===null||!n.isAbsolute(c)||!await this.resolver.isExpectedInstallPath(l,e,t)?console.warn(`[ClientBinaryManager] Skipping removeDirectory: stored installPath "${String(c)}" does not match the expected install directory for ${e}@${t}`):await this.strategyDeps.removeDirectory(l).catch(n=>{console.warn(`[ClientBinaryManager] Failed to remove binary directory "${l}" for ${e}@${t}:`,n)}),o!==null&&s===null)try{await this.bus.emit(b.version.changed,{clientId:e,previousActiveVersion:o,activeVersion:null,reason:`uninstall`})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}return{clientId:e,removedVersion:t,activeVersion:s}}finally{this.pendingClients.delete(e)}}async patchActiveVersion(e,t,n){let r=(await this.bus.request(M.setActiveVersion,{clientId:e,activeVersion:t,updatedAt:Date.now()})).previousActiveVersion;if(r!==t)try{await this.bus.emit(b.version.changed,{clientId:e,previousActiveVersion:r,activeVersion:t,reason:n})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}return r}requireManagedDefinition(e,t){let n=this.definitionLookup.getDefinition(e);if(n===void 0)throw Error(`${t}: no definition registered for client '${e}'`);let r=n.managedInstall;if(r===void 0)throw Error(`${t}: client '${e}' does not declare a managed install descriptor`);return{definition:n,descriptor:r}}async withClientLock(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{return await t()}catch(t){throw this.pendingClients.delete(e),t}}startInstallJob(e,t,n,r,i,a){let o={jobId:crypto.randomUUID(),clientId:e,version:t,strategy:n.type,status:`pending`,makeActive:i,reason:a};return this.jobRunner.startJob(o,n,e=>{this.bus.emit(b.installJob.progress,e).catch(e=>{console.warn(`[ClientBinaryManager] Failed to emit client.installJob.progress:`,e)})},this.makeCompletionCallback(),async e=>{this.pendingClients.delete(e.clientId),await this.bus.emit(b.installJob.completed,e).catch(e=>{console.warn(`[ClientBinaryManager] Failed to emit client.installJob.completed:`,e)})},r.postInstall,F(r.versionCommand)),o.jobId}makeCompletionCallback(){return async({clientId:e,version:t,installPath:n,makeActive:r,reason:i})=>{let a=Date.now();await w(this.bus,{clientId:e,configDir:this.resolveManagedConfigDir(e),phase:`managed-install`,binaryVersion:t});let o=await this.bus.request(M.recordInstalledVersion,{versionRecord:{id:crypto.randomUUID(),clientId:e,version:t,installPath:n,installedAt:a,createdAt:a},makeActive:r,updatedAt:a});if(r&&o.previousActiveVersion!==o.activeVersion)try{await this.bus.emit(b.version.changed,{clientId:e,previousActiveVersion:o.previousActiveVersion,activeVersion:o.activeVersion,reason:i})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}}}resolveManagedConfigDir(e){return n.join(this.resolvedConfigBasePath,e,`config`)}};function I(e,t){return`${e}${t}`}function L(e,t){return`${e}${t}`}var We=class{records=new Map;bySupervisorSessionId=new Map;byPidClientId=new Map;byAdapterSessionClientId=new Map;set(e){let t=this.records.get(e.clientRuntimeId);t&&this.removeIndexEntries(t),this.records.set(e.clientRuntimeId,e),this.addIndexEntries(e)}setFromStorage(e,t,n){this.records.set(e.clientRuntimeId,e),e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.set(e.supervisorSessionId,e.clientRuntimeId),t-e.updatedAt<=n&&(e.pid!==void 0&&this.byPidClientId.set(I(e.pid,e.clientId),e.clientRuntimeId),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.set(L(e.adapterSessionId,e.clientId),e.clientRuntimeId))}delete(e){let t=this.records.get(e);t&&(this.removeIndexEntries(t),this.records.delete(e))}get(e){return this.records.get(e)}findByEvidence(e,t,n,r){if(e!==void 0){let t=this.bySupervisorSessionId.get(e);if(t!==void 0)return this.records.get(t)}if(t!==void 0){let e=this.byPidClientId.get(I(t,r));if(e!==void 0)return this.records.get(e)}if(n!==void 0){let e=this.byAdapterSessionClientId.get(L(n,r));if(e!==void 0)return this.records.get(e)}}values(){return this.records.values()}clear(){this.records.clear(),this.bySupervisorSessionId.clear(),this.byPidClientId.clear(),this.byAdapterSessionClientId.clear()}get size(){return this.records.size}addIndexEntries(e){e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.set(e.supervisorSessionId,e.clientRuntimeId),e.pid!==void 0&&this.byPidClientId.set(I(e.pid,e.clientId),e.clientRuntimeId),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.set(L(e.adapterSessionId,e.clientId),e.clientRuntimeId)}removeIndexEntries(e){e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.delete(e.supervisorSessionId),e.pid!==void 0&&this.byPidClientId.delete(I(e.pid,e.clientId)),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.delete(L(e.adapterSessionId,e.clientId))}};const R=[`observed`,`started`],z=e.object({clientRuntimeId:e.string(),clientId:e.string(),status:e.enum(R),supervisorSessionId:e.string().optional(),pid:e.number().int().positive().optional(),parentPid:e.number().int().positive().optional(),adapterSessionId:e.string().optional(),sessionId:e.string().optional(),cwd:e.string().optional(),argv:e.array(e.string()).optional(),metadata:e.record(e.string(),e.unknown()).optional(),observedAt:e.number().int().nonnegative(),createdAt:e.number().int().nonnegative(),updatedAt:e.number().int().nonnegative()}),B=i(`client-runtime:storage`,{upsert:{request:z,response:e.object({success:e.boolean()})},loadAll:{request:e.object({}),response:e.object({records:e.array(z)})}}),V=B.subjects;function Ge(e){return e.supervisorSessionId!==void 0||e.adapterSessionId!==void 0}function H(e){return{...e,argv:e.argv===void 0?void 0:[...e.argv],metadata:e.metadata===void 0?void 0:structuredClone(e.metadata)}}function Ke(e){return Math.max(Date.now(),e+1)}function qe(e,t){let n=!1;return t.supervisorSessionId!==void 0&&e.supervisorSessionId!==t.supervisorSessionId&&(e.supervisorSessionId=t.supervisorSessionId,n=!0),t.pid!==void 0&&e.pid!==t.pid&&(e.pid=t.pid,n=!0),t.parentPid!==void 0&&e.parentPid!==t.parentPid&&(e.parentPid=t.parentPid,n=!0),t.adapterSessionId!==void 0&&e.adapterSessionId!==t.adapterSessionId&&(e.adapterSessionId=t.adapterSessionId,n=!0),t.sessionId!==void 0&&e.sessionId!==t.sessionId&&(e.sessionId=t.sessionId,n=!0),t.cwd!==void 0&&e.cwd!==t.cwd&&(e.cwd=t.cwd,n=!0),t.argv!==void 0&&JSON.stringify(e.argv)!==JSON.stringify(t.argv)&&(e.argv=[...t.argv],n=!0),t.metadata!==void 0&&JSON.stringify(e.metadata)!==JSON.stringify(t.metadata)&&(e.metadata=structuredClone(t.metadata),n=!0),n}var Je=class{runtimeMap=new We;bus;constructor(e){this.bus=e}async loadFromStorage(){if(!this.bus)return;let e=await this.bus.requestOptional(V.loadAll,{});if(!e.handled)return;let t=Date.now();for(let n of e.data.records)this.runtimeMap.setFromStorage(H(n),t,864e5)}async upsertRuntime(e){let t=this.runtimeMap.findByEvidence(e.supervisorSessionId,e.pid,e.adapterSessionId,e.clientId);if(t){let n=t.status===`observed`,r=n&&Ge(e),i=qe(t,e),a=n&&e.observedAt>t.observedAt;return r&&(t.status=`started`),(i||r||a)&&(t.updatedAt=Ke(t.updatedAt),a&&(t.observedAt=e.observedAt),this.runtimeMap.set(t),await this.persistRecord(t)),{clientRuntimeId:t.clientRuntimeId,created:!1,promoted:r,record:H(t)}}let n=Date.now(),i=r(),a=Ge(e)?`started`:`observed`,o={clientRuntimeId:i,clientId:e.clientId,status:a,supervisorSessionId:e.supervisorSessionId,pid:e.pid,parentPid:e.parentPid,adapterSessionId:e.adapterSessionId,sessionId:e.sessionId,cwd:e.cwd,argv:e.argv?[...e.argv]:void 0,metadata:e.metadata?structuredClone(e.metadata):void 0,observedAt:e.observedAt,createdAt:n,updatedAt:n};return this.runtimeMap.set(o),await this.persistRecord(o),{clientRuntimeId:i,created:!0,promoted:!1,record:H(o)}}getRuntime(e){let t=this.runtimeMap.get(e);return t?H(t):void 0}clear(){this.runtimeMap.clear()}get size(){return this.runtimeMap.size}async persistRecord(e){this.bus&&await this.bus.requestOptional(V.upsert,H(e))}};const Ye=e.object({eventName:e.string(),receivedAt:e.number().int().finite().nonnegative().describe(`Unix epoch timestamp in milliseconds`),payload:e.record(e.string(),e.unknown()),metadata:e.record(e.string(),e.unknown()).optional()}),Xe=/^[a-z0-9-]+$/;function U(e,t=`canonicalizeClientId`){let n=e.trim().toLowerCase(),r=n.startsWith(`client:`)?n.slice(7):n;if(r.length===0)throw Error(`[${t}] clientId must be a non-empty string`);if(!Xe.test(r))throw Error(`[${t}] clientId must contain only lowercase letters, numbers, and hyphens after an optional client: prefix`);return r}function Ze(e){return{subject:`hook.received`,$meta:{namespace:`client:${U(e,`createRawClientHookReceivedSubject`)}`,isRequest:!1,local:!1,channel:!1}}}const Qe=5e3,$e=e.object({exitCode:e.number().int().min(0).max(255).default(0),stdout:e.string().default(``),stderr:e.string().default(``)});function et(e){return{subject:`hook.handle`,$meta:{namespace:`client:${U(e,`createRawClientHookHandleSubject`)}`,isRequest:!0,local:!1,channel:!1}}}function tt(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function nt(e,t){return tt(e[t])}function rt(e){return{clientId:e.clientId,source:`adapter-derived`,observedAt:Date.now(),...e.sessionId!==void 0&&{sessionId:e.sessionId},...e.adapterSessionId!==void 0&&{adapterSessionId:e.adapterSessionId}}}function it(e){try{e().catch(at)}catch(e){at(e)}}function at(e){(process.env.DEBUG||process.env.MAKAIO_DEBUG)&&console.debug(`[emitBestEffort] observed-semantics emission failed`,e)}function ot(e,t){return{subject:t,$meta:{namespace:`client:${U(e,`createClientWiringSubjectDef`)}`,isRequest:!0,local:!1,channel:!1}}}function st(e){return ot(e,`wiring.list`)}const ct=e.string().min(1).refine(n.isAbsolute,{message:`projectDir must be an absolute path`}),lt=e.object({entries:e.array(x)}),ut=e.object({applied:e.number().int().nonnegative(),skipped:e.number().int().nonnegative()}),dt=e.object({removed:e.number().int().nonnegative()}),ft=e.object({clientId:e.string().trim().min(1),entries:e.array(x)});function pt(e){if(e!==void 0&&!n.isAbsolute(e))throw Error(`projectDir must be an absolute path, got: ${e}`)}var mt=class extends l{accountRegistry;runtimeRegistry;latestSnapshots=new Map;activeIdentities=new Map;constructor(e=a,t=new he,n=new Je(e)){super(e),this.accountRegistry=t,this.runtimeRegistry=n}async onInit(){await this.runtimeRegistry.loadFromStorage(),this.registerHandler(b.account.observe,e=>this.handleAccountObserve(e)),this.registerHandler(b.usage.ingest,e=>this.handleUsageIngest(e)),this.registerHandler(b.scan,async e=>{let t=await this.scanClients(e.payload.targets);e.setResult({results:t})}),this.registerHandler(b.runtime.observe,e=>this.handleRuntimeObserve(e)),this.registerHandler(b.wiring.list,async e=>{let t=await this.listWirings(e.payload);e.setResult({results:t})}),this.registerHandler(b.account.activate,e=>{this.activeIdentities.set(e.payload.clientId,{clientAccountId:e.payload.clientAccountId,identifiers:e.payload.identifiers,displayLabel:e.payload.displayLabel}),e.setResult({accepted:!0})}),this.registerHandler(b.account.getActive,e=>{let t=this.activeIdentities.get(e.payload.clientId);e.setResult({identity:t??null})})}onDestroy(){this.latestSnapshots.clear(),this.activeIdentities.clear(),this.accountRegistry.clear(),this.runtimeRegistry.clear()}getLatestSnapshot(e){return this.latestSnapshots.get(e)}async handleAccountObserve(e){let t=this.accountRegistry.upsertAccount({clientId:e.payload.clientId,identifiers:e.payload.identifiers,displayLabel:e.payload.displayLabel}),n=this.latestSnapshots.get(t.clientAccountId),r=_t(this.consolidateMergedSnapshots(t.clientAccountId,t.mergedAccountIds)??n,t.displayLabel);r&&this.latestSnapshots.set(t.clientAccountId,r),r&&(t.mergedAccountIds.length>0||r!==n)&&await this.bus.emit(b.usage.snapshot,r),e.setResult({clientAccountId:t.clientAccountId,displayLabel:t.displayLabel})}async handleUsageIngest(e){let t=this.accountRegistry.upsertAccount({clientId:e.payload.clientId,identifiers:e.payload.account.identifiers,displayLabel:e.payload.account.displayLabel});this.consolidateMergedSnapshots(t.clientAccountId,t.mergedAccountIds);let n=ht(t.clientAccountId,e.payload,t.displayLabel),r=_t(gt(this.latestSnapshots.get(t.clientAccountId),n),t.displayLabel);this.latestSnapshots.set(t.clientAccountId,r),await this.bus.emit(b.usage.snapshot,r),e.setResult({clientAccountId:t.clientAccountId,snapshot:r})}async handleRuntimeObserve(e){let{payload:t}=e;if(t.supervisorSessionId===void 0&&t.pid===void 0&&t.adapterSessionId===void 0)throw Error(`client.runtime.observe: at least one hard-evidence field is required (supervisorSessionId, pid, or adapterSessionId)`);let{record:n,...r}=await this.runtimeRegistry.upsertRuntime(t);(r.created||r.promoted)&&await this.bus.emit(b.runtime.started,{clientRuntimeId:n.clientRuntimeId,clientId:n.clientId,status:n.status,source:t.source,observedAt:t.observedAt,supervisorSessionId:n.supervisorSessionId,pid:n.pid,parentPid:n.parentPid,adapterSessionId:n.adapterSessionId,sessionId:n.sessionId,cwd:n.cwd,argv:n.argv,metadata:n.metadata}),e.setResult({clientRuntimeId:r.clientRuntimeId,created:r.created,promoted:r.promoted})}async scanClients(e){let t=e??await this.listScannableStoredClients();if(t.length===0)return[];let n=Array.from(new Set(t.map(e=>e.binaryName))),{results:r}=await this.bus.request(ce.scan,{binaries:n}),i=new Map(r.map(e=>[e.binary,e]));return t.map(e=>{let t=i.get(e.binaryName),n=t?.found??!1,r=t?.version;return{clientId:e.clientId,found:n,version:r,warningMessage:yt(n,r,e.supportedVersions)}})}async listScannableStoredClients(){let{clients:e}=await this.bus.request(le.list,{});return e.filter(vt).map(e=>({clientId:e.id,binaryName:e.binary.name,supportedVersions:e.binary.supportedVersions}))}async listWirings(e){pt(e.projectDir);let{clients:t}=await this.bus.request(le.list,{}),n=e.clientId===void 0?void 0:U(e.clientId,`listWirings`),r=t.filter(e=>e.enabled).filter(e=>n===void 0||e.id===n),i=await Promise.allSettled(r.map(async t=>{let n=st(t.id),r=await this.bus.requestOptional(n,{projectDir:e.projectDir,makaioCommand:e.makaioCommand});return r.handled?{clientId:t.id,entries:r.data.entries}:null}));for(let e=0;e<i.length;e++){let t=i[e];if(t.status===`rejected`){let n=t.reason instanceof Error?t.reason.message:String(t.reason);console.warn(`[ClientRuntimeService] wiring.list for ${r[e].id} failed: ${n}`)}}return i.filter(e=>e.status===`fulfilled`).map(e=>e.value).filter(e=>e!==null)}consolidateMergedSnapshots(e,t){let n=this.latestSnapshots.get(e),r=!1;for(let i of t){if(i===e)continue;let t=this.latestSnapshots.get(i);t&&(n===void 0||t.observedAt>n.observedAt)&&(n={...t,clientAccountId:e},r=!0),this.latestSnapshots.delete(i)}return n&&this.latestSnapshots.set(e,n),r?n:void 0}};function ht(e,t,n){return{clientAccountId:e,clientId:t.clientId,observedAt:t.observedAt,source:t.source,displayLabel:n,usage:{windows:t.usage.windows.map(e=>({...e}))},metadata:t.metadata?{...t.metadata}:void 0}}function gt(e,t){return e&&e.observedAt>t.observedAt?e:t}function _t(e,t){return!e||t===void 0||e.displayLabel===t?e:{...e,displayLabel:t}}function vt(e){return e.enabled&&e.binary!==void 0}function yt(e,t,n){if(e&&t!==void 0&&t!==`unknown`&&n!==void 0&&!c(t,n))return`Unsupported version: requires ${n}`}var bt=class extends l{constructor(e=a){super(e)}onInit(){this.registerHandler(b.config.prime,async e=>{e.setResult(await w(this.bus,e.payload))})}};const W=ie,G=e.string().trim().min(1),xt=i(`client-profile:storage`,{get:{request:e.object({clientId:G,name:y}),response:e.object({record:W.nullable()})},getById:{request:e.object({id:G}),response:e.object({record:W.nullable()})},list:{request:e.object({clientId:G}),response:e.object({records:e.array(W)})},set:{request:W,response:e.object({success:e.boolean()})},delete:{request:e.object({clientId:G,name:y}),response:e.object({success:e.boolean()})},clearDefault:{request:e.object({clientId:G}),response:e.object({success:e.boolean()})},setDefault:{request:e.object({clientId:G,name:y}),response:e.object({record:W.nullable()})}}),K=xt.subjects;function St(e,t,r){let i=n.resolve(e),a=n.resolve(t),o=n.relative(i,a);if(o!==``&&!o.startsWith(`..`)&&!n.isAbsolute(o))return a;throw Error(`${r} refused to access path outside client profile root`)}var Ct=class extends l{clientsBasePath;constructor(e,t){super(e),this.clientsBasePath=t}async onInit(){this.registerCreateHandler(),this.registerListHandler(),this.registerGetHandler(),this.registerUpdateHandler(),this.registerDeleteHandler(),this.registerSetDefaultHandler()}registerCreateHandler(){this.registerHandler(b.profile.create,async e=>{let i=U(e.payload.clientId,`profile.create`),{name:a,description:o}=e.payload;if((await this.bus.request(K.get,{clientId:i,name:a})).record!==null)throw Error(`Profile '${a}' already exists for client '${i}'`);let s=n.join(this.clientsBasePath,i,`profiles`),c=St(s,n.join(s,a),`profile.create`);await t.mkdir(c,{recursive:!0});try{await w(this.bus,{clientId:i,configDir:c,phase:`profile-create`});let t=Date.now(),n={id:r(),clientId:i,name:a,description:o??null,configDir:c,isDefault:!1,createdAt:t,updatedAt:t};await this.bus.request(K.set,n),e.setResult({profile:n})}catch(e){throw await t.rm(c,{recursive:!0,force:!0}),e}})}registerListHandler(){this.registerHandler(b.profile.list,async e=>{let t=U(e.payload.clientId,`profile.list`),n=await this.bus.request(K.list,{clientId:t});e.setResult({profiles:n.records})})}registerGetHandler(){this.registerHandler(b.profile.get,async e=>{let t=U(e.payload.clientId,`profile.get`),n=await this.bus.request(K.get,{clientId:t,name:e.payload.name});e.setResult({profile:n.record})})}registerUpdateHandler(){this.registerHandler(b.profile.update,async e=>{let t=U(e.payload.clientId,`profile.update`),{name:n,description:r}=e.payload,i=await this.bus.request(K.get,{clientId:t,name:n});if(i.record===null)throw Error(`Profile '${n}' not found for client '${t}'`);let a={...i.record,description:r===void 0?i.record.description:r,updatedAt:Date.now()};await this.bus.request(K.set,a),e.setResult({profile:a})})}registerDeleteHandler(){this.registerHandler(b.profile.delete,async e=>{let r=U(e.payload.clientId,`profile.delete`),{name:i}=e.payload,a=await this.bus.request(K.get,{clientId:r,name:i});a.record!==null&&(St(n.join(this.clientsBasePath,r,`profiles`),a.record.configDir,`profile.delete`),await t.rm(a.record.configDir,{recursive:!0,force:!0}));let o=await this.bus.request(K.delete,{clientId:r,name:i});e.setResult({success:o.success})})}registerSetDefaultHandler(){this.registerHandler(b.profile.setDefault,async e=>{let t=U(e.payload.clientId,`profile.setDefault`),{name:n}=e.payload,r=await this.bus.request(K.setDefault,{clientId:t,name:n});if(r.record===null)throw Error(`Profile '${n}' not found for client '${t}'`);e.setResult({profile:r.record})})}};function wt(e){return{subject:`sessionConfig.setup`,$meta:{namespace:`client:${e}`,isRequest:!0,local:!1,channel:!1}}}function Tt(e){return{subject:`sessionConfig.destroy`,$meta:{namespace:`client:${e}`,isRequest:!0,local:!1,channel:!1}}}const Et=()=>Date.now();function Dt(){let e=S.platform();if(e===`darwin`||e===`linux`||e===`win32`)return e;throw Error(`client.sessionConfig does not support platform '${e}'`)}function Ot(e,t,r){let i=se.safeParse(t);if(!i.success)throw Error(`${r} received an unsafe session ID`);let a=n.resolve(e),o=n.resolve(a,i.data),s=n.relative(a,o);if(s===``||!s.startsWith(`..`)&&!n.isAbsolute(s))return o;throw Error(`${r} refused to access path outside client sessions root`)}var kt=class extends l{clientsBasePath;getNow;constructor(e,t,n=Et){super(e),this.clientsBasePath=t,this.getNow=n}async onInit(){this.registerHandler(b.sessionConfig.create,async e=>{let{clientId:n,sessionId:r,profileName:i,baseConfigDir:a,projectDir:o,configInheritance:s=`full`}=e.payload,c=U(n,`sessionConfig.create`),l=this.resolveClientSessionDir(c,r,`sessionConfig.create`);await t.mkdir(l,{recursive:!0});try{let t=await this.resolveBaseConfigDir(c,l,i,a),n=wt(c),r=await this.bus.requestOptional(n,{sessionDir:l,baseConfigDir:t,projectDir:o,platform:Dt(),configInheritance:s}),u=r.handled?r.data.env??{}:{};await w(this.bus,{clientId:c,configDir:l,phase:`session-create`,projectDir:o}),e.setResult({sessionDir:l,env:u})}catch(e){throw await t.rm(l,{recursive:!0,force:!0}),e}}),this.registerHandler(b.sessionConfig.destroy,async e=>{let{clientId:t,sessionId:n}=e.payload,r=U(t,`sessionConfig.destroy`),i=this.resolveClientSessionDir(r,n,`sessionConfig.destroy`);await this.destroyClientSessionDir(r,i),e.setResult({success:!0})}),this.registerHandler(b.sessionConfig.cleanup,async e=>{let{clientId:t}=e.payload,n=t===void 0?void 0:U(t,`sessionConfig.cleanup`),r=await this.cleanupOrphanedDirs(n);e.setResult({removed:r})}),this.registerHandler(ue.closed,async e=>{await this.destroySessionDirsForSessionId(e.payload.sessionId)}),await this.cleanupOrphanedDirs()}async resolveBaseConfigDir(e,t,n,r){if(r!==void 0)return r;if(n!==void 0){let t=await this.bus.request(K.get,{clientId:e,name:n});if(t.record!==null)return t.record.configDir;throw Error(`Profile '${n}' not found for client '${e}'`)}let i=(await this.bus.request(K.list,{clientId:e})).records.find(e=>e.isDefault);return i?i.configDir:t}async cleanupOrphanedDirs(e){let r=[],i=this.getNow(),a=e===void 0?await this.listClientIds():[e];return await Promise.all(a.map(async e=>{let a=n.join(this.clientsBasePath,e,`sessions`),o=await t.readdir(a).catch(()=>[]);await Promise.all(o.map(async n=>{try{let o=Ot(a,n,`sessionConfig.cleanup`),s=await t.stat(o),c=s.birthtimeMs>0?s.birthtimeMs:s.ctimeMs;s.isDirectory()&&i-c>36e5&&!await this.isActiveSession(n)&&(await this.destroyClientSessionDir(e,o),r.push(o))}catch{}}))})),r}async destroySessionDirsForSessionId(e){if(!se.safeParse(e).success)return;let t=await this.listClientIds();await Promise.all(t.map(async t=>{let n=this.resolveClientSessionDir(t,e,`session.closed`);await this.destroyClientSessionDir(t,n)}))}async destroyClientSessionDir(e,n){await t.stat(n).then(e=>e.isDirectory(),e=>{let t=e.code;if(t===`ENOENT`||t===`ENOTDIR`)return!1;throw e})&&(await this.bus.requestOptional(Tt(e),{sessionDir:n,platform:Dt()}),await t.rm(n,{recursive:!0,force:!0}))}async isActiveSession(e){let t=await this.bus.requestOptional(ue.get,{sessionId:e});return t.handled&&t.data.session?.status===`active`}resolveClientSessionDir(e,t,r){return Ot(n.join(this.clientsBasePath,e,`sessions`),t,r)}async listClientIds(){return(await t.readdir(this.clientsBasePath,{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>e.name)}};const At=new Set([`hook.received`,`hook.handle`]);function jt(e,t){return a.registerNamespace(i(`client:${e}`,{"hook.received":Ye,"hook.handle":{request:Ye,response:$e},...t})).subjects}function Mt(e,t){let n=Object.keys(t).filter(e=>At.has(e));if(n.length===0)return;let r=n.join(`, `);throw Error([`[createClientNamespace] additionalSchemas for client:${e}`,`cannot override reserved shared hook subjects: ${r}`].join(` `))}function Nt(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||!(e in n))return!1;n=n[e]}return!0}function Pt(e,t,n){let r=Object.keys(n).filter(e=>!Nt(t,e));if(r.length!==0)throw Error(`[createClientNamespace] client:${e} was already registered without required subjects: ${r.join(`, `)}`)}function Ft(e,t){let n=U(e,`createClientNamespace`),r=t??{};Mt(n,r);let i=jt(n,r);return Pt(n,i,r),{namespaceDomain:`client:${n}`,subjects:i}}const q=f(`client_runtimes`,{id:p(`id`).primaryKey(),clientId:p(`client_id`).notNull(),status:p(`status`).notNull(),supervisorSessionId:p(`supervisor_session_id`),pid:d(`pid`),parentPid:d(`parent_pid`),adapterSessionId:p(`adapter_session_id`),sessionId:p(`session_id`),cwd:p(`cwd`),argv:p(`argv`,{mode:`json`}).$type(),metadata:p(`metadata`,{mode:`json`}).$type(),observedAt:d(`observed_at`).notNull(),createdAt:d(`created_at`).notNull(),updatedAt:d(`updated_at`).notNull()},e=>[u(`idx_client_runtimes_supervisor_session_id`).on(e.supervisorSessionId),u(`idx_client_runtimes_pid_client_id`).on(e.pid,e.clientId),u(`idx_client_runtimes_adapter_session_id_client_id`).on(e.adapterSessionId,e.clientId)]),It=new Set(R);function Lt(e){if(!It.has(e.status))throw Error(`Unknown ClientRuntimeStatus in DB: '${e.status}'`);return{clientRuntimeId:e.id,clientId:e.clientId,status:e.status,supervisorSessionId:e.supervisorSessionId??void 0,pid:e.pid??void 0,parentPid:e.parentPid??void 0,adapterSessionId:e.adapterSessionId??void 0,sessionId:e.sessionId??void 0,cwd:e.cwd??void 0,argv:e.argv??void 0,metadata:e.metadata??void 0,observedAt:e.observedAt,createdAt:e.createdAt,updatedAt:e.updatedAt}}function Rt(e,t,n){let r=e.on(V.upsert,async e=>{let n=e.payload,r={clientId:n.clientId,status:n.status,supervisorSessionId:n.supervisorSessionId??null,pid:n.pid??null,parentPid:n.parentPid??null,adapterSessionId:n.adapterSessionId??null,sessionId:n.sessionId??null,cwd:n.cwd??null,argv:n.argv??null,metadata:n.metadata??null,observedAt:n.observedAt,updatedAt:n.updatedAt};await t.insert(q).values({id:n.clientRuntimeId,createdAt:n.createdAt,...r}).onConflictDoUpdate({target:q.id,set:r,setWhere:ee(te`excluded.updated_at`,q.updatedAt)}),e.setResult({success:!0})}),i=e.on(V.loadAll,async e=>{let n=await t.select().from(q);e.setResult({records:n.map(Lt)})});return()=>{r(),i()}}const J=f(`client_binary_versions`,{id:p(`id`).primaryKey(),clientId:p(`client_id`).notNull(),version:p(`version`).notNull(),installPath:p(`install_path`).notNull(),installedAt:d(`installed_at`).notNull(),createdAt:d(`created_at`).notNull()},e=>[m(`uq_client_binary_versions_client_version`).on(e.clientId,e.version)]),Y=f(`client_binary_state`,{clientId:p(`client_id`).primaryKey(),activeVersion:p(`active_version`),updatedAt:d(`updated_at`).notNull()});function X(e){return{id:e.id,clientId:e.clientId,version:e.version,installPath:e.installPath,installedAt:e.installedAt,createdAt:e.createdAt}}function Z(e){return{clientId:e.clientId,activeVersion:e.activeVersion??null,updatedAt:e.updatedAt}}function zt(e){return{id:e.id,clientId:e.clientId,version:e.version,installPath:e.installPath,installedAt:e.installedAt,createdAt:e.createdAt}}async function Bt(e,t){await e.insert(J).values(zt(t)).onConflictDoNothing({target:[J.clientId,J.version]})}function Vt(e,t,n){return{clientId:e,activeVersion:t,updatedAt:n}}async function Ht(e,t,n,r){await e.insert(Y).values(Vt(t,n,r)).onConflictDoUpdate({target:Y.clientId,set:{activeVersion:n,updatedAt:r}})}async function Ut(e,t){await Bt(e,t)}async function Wt(e,t,n,r){return v(e,async e=>{let[i]=await e.select().from(Y).where(_(Y.clientId,t.clientId)).limit(1),a=i?.activeVersion??null;return await Bt(e,t),n?(await Ht(e,t.clientId,t.version,r),{previousActiveVersion:a,activeVersion:t.version}):{previousActiveVersion:a,activeVersion:a}})}async function Gt(e,t){return v(e,async e=>{let[n]=await e.select().from(Y).where(_(Y.clientId,t)).limit(1),r=await e.select().from(J).where(_(J.clientId,t));return{state:n?Z(n):null,versions:r.map(X)}})}async function Kt(e){return v(e,async e=>{let t=await e.select().from(Y),n=await e.select().from(J);return{states:t.map(Z),versions:n.map(X)}})}async function qt(e,t){let n={clientId:t.clientId,activeVersion:t.activeVersion??null,updatedAt:t.updatedAt};await e.insert(Y).values(n).onConflictDoUpdate({target:Y.clientId,set:n})}async function Jt(e,t,n,r){return v(e,async e=>{let[i]=await e.select().from(Y).where(_(Y.clientId,t)).limit(1),a=i?.activeVersion??null;return await Ht(e,t,n,r),{previousActiveVersion:a,activeVersion:n}})}async function Yt(e,t,n,r){return v(e,async e=>{let[i]=await e.select().from(Y).where(_(Y.clientId,t)).limit(1),a=i?.activeVersion??null;if(!ne(await e.delete(J).where(g(_(J.clientId,t),_(J.version,n)))))return{removedVersion:null,previousActiveVersion:a,activeVersion:a};await e.update(Y).set({activeVersion:null,updatedAt:r}).where(g(_(Y.clientId,t),_(Y.activeVersion,n)));let[o]=await e.select().from(Y).where(_(Y.clientId,t)).limit(1);return{removedVersion:n,previousActiveVersion:a,activeVersion:o?.activeVersion??null}})}function Xt(e,t,n){let r=[e.on(M.insertVersion,async e=>{await Ut(t,e.payload),e.setResult({success:!0})}),e.on(M.recordInstalledVersion,async e=>{let{versionRecord:n,makeActive:r,updatedAt:i}=e.payload,a=await Wt(t,n,r,i);e.setResult(a)}),e.on(M.listVersions,async e=>{let n=await t.select().from(J).where(_(J.clientId,e.payload.clientId));e.setResult({versions:n.map(X)})}),e.on(M.getSnapshot,async e=>{let{state:n,versions:r}=await Gt(t,e.payload.clientId);e.setResult({state:n,versions:r})}),e.on(M.loadAllVersions,async e=>{let n=await t.select().from(J);e.setResult({versions:n.map(X)})}),e.on(M.upsertState,async e=>{await qt(t,e.payload),e.setResult({success:!0})}),e.on(M.setActiveVersion,async e=>{let{clientId:n,activeVersion:r,updatedAt:i}=e.payload,a=await Jt(t,n,r,i);e.setResult(a)}),e.on(M.getState,async e=>{let[n]=await t.select().from(Y).where(_(Y.clientId,e.payload.clientId)).limit(1);e.setResult({state:n?Z(n):null})}),e.on(M.loadAllState,async e=>{let n=await t.select().from(Y);e.setResult({states:n.map(Z)})}),e.on(M.loadSnapshot,async e=>{let{states:n,versions:r}=await Kt(t);e.setResult({states:n,versions:r})}),e.on(M.removeVersionAndClearActive,async e=>{let{clientId:n,version:r,updatedAt:i}=e.payload,a=await Yt(t,n,r,i);e.setResult(a)})];return()=>{for(let e of r)e()}}const Q=f(`client_profiles`,{id:p(`id`).primaryKey(),clientId:p(`client_id`).notNull(),name:p(`name`).notNull(),description:p(`description`),configDir:p(`config_dir`).notNull(),isDefault:d(`is_default`,{mode:`boolean`}).notNull().default(!1),createdAt:d(`created_at`).notNull(),updatedAt:d(`updated_at`).notNull()},e=>[h(`uq_client_profiles_client_name`).on(e.clientId,e.name),h(`uq_client_profiles_default`).on(e.clientId).where(te`${e.isDefault} = 1`)]);function $(e){return{id:e.id,clientId:e.clientId,name:e.name,description:e.description??null,configDir:e.configDir,isDefault:e.isDefault,createdAt:e.createdAt,updatedAt:e.updatedAt}}async function Zt(e,t,n){let r=Date.now();return v(e,async e=>{let[i]=await e.select().from(Q).where(g(_(Q.clientId,t),_(Q.name,n))).limit(1);if(i===void 0)return null;await e.update(Q).set({isDefault:!1,updatedAt:r}).where(g(_(Q.clientId,t),_(Q.isDefault,!0))),await e.update(Q).set({isDefault:!0,updatedAt:r}).where(g(_(Q.clientId,t),_(Q.name,n)));let[a]=await e.select().from(Q).where(g(_(Q.clientId,t),_(Q.name,n))).limit(1);return a===void 0?null:$(a)})}function Qt(e,t,n){let r=[e.on(K.get,async e=>{let{clientId:n,name:r}=e.payload,[i]=await t.select().from(Q).where(g(_(Q.clientId,n),_(Q.name,r))).limit(1);e.setResult({record:i?$(i):null})}),e.on(K.getById,async e=>{let[n]=await t.select().from(Q).where(_(Q.id,e.payload.id)).limit(1);e.setResult({record:n?$(n):null})}),e.on(K.list,async e=>{let n=await t.select().from(Q).where(_(Q.clientId,e.payload.clientId));e.setResult({records:n.map($)})}),e.on(K.set,async e=>{let n=e.payload,r={id:n.id,clientId:n.clientId,name:n.name,description:n.description??null,configDir:n.configDir,isDefault:n.isDefault,createdAt:n.createdAt,updatedAt:n.updatedAt};await t.insert(Q).values(r).onConflictDoUpdate({target:Q.id,set:{name:n.name,description:n.description??null,configDir:n.configDir,isDefault:n.isDefault,updatedAt:n.updatedAt}}),e.setResult({success:!0})}),e.on(K.delete,async e=>{let{clientId:n,name:r}=e.payload,i=await t.delete(Q).where(g(_(Q.clientId,n),_(Q.name,r)));e.setResult({success:ne(i)})}),e.on(K.clearDefault,async e=>{await t.update(Q).set({isDefault:!1,updatedAt:Date.now()}).where(g(_(Q.clientId,e.payload.clientId),_(Q.isDefault,!0))),e.setResult({success:!0})}),e.on(K.setDefault,async e=>{let{clientId:n,name:r}=e.payload,i=await Zt(t,n,r);e.setResult({record:i})})];return()=>{for(let e of r)e()}}var $t=class{runtimeService;binaryManager;configPrimeService;profileService;sessionConfigService;constructor(e,t,n,r,i){this.runtimeService=e,this.binaryManager=t,this.configPrimeService=n,this.profileService=r,this.sessionConfigService=i}async init(){let e=(await Promise.allSettled([this.runtimeService.init(),this.binaryManager.init(),this.configPrimeService.init(),this.profileService.init(),this.sessionConfigService.init()])).filter(e=>e.status===`rejected`);if(e.length>0){for(let t=1;t<e.length;t++)console.warn(`[ClientsCoreService] Multiple init failures, secondary:`,e[t].reason);throw e[0].reason}}async destroy(){let e=(await Promise.allSettled([this.runtimeService.destroy(),this.binaryManager.destroy(),this.configPrimeService.destroy(),this.profileService.destroy(),this.sessionConfigService.destroy()])).filter(e=>e.status===`rejected`);for(let t of e)console.warn(`[ClientsCoreService] destroy failure:`,t.reason)}};const en=o(`makaio.clients-core`);function tn(e){let t=[],n=()=>{for(let e of[...t].reverse())e()};try{for(let n of e)t.push(n())}catch(e){throw n(),e}return n}function nn(e={}){let{definitions:t=[],strategyDependencies:r,postInstallHandlers:i}=e,a=[...t];return{name:`makaio.clients-core`,displayName:`Clients Core`,version:`0.1.0`,critical:!0,namespaces:[j,B,xt],storage:{registerHandlers:re((e,t,n)=>tn([()=>Rt(e,t,n),()=>Xt(e,t,n),()=>Qt(e,t,n)]))},create:e=>{let t=new N(a),o=n.join(e.makaioHome,`clients`),s=new Ue(e.bus,{basePath:n.join(e.makaioHome,`binaries`),configBasePath:o,postInstallHandlers:i},t,r),c=new Ct(e.bus,o),l=new kt(e.bus,o);return new $t(new mt(e.bus),s,new bt(e.bus),c,l)}}}async function rn(e){let t=await a.requestOptional(b.resolveBinary,{clientId:e});return t.handled?t.data:void 0}function an(e,t,n){return[...n??[],e,...t].map(cn).join(` `)}function on(e,t,n,r,i){return an(e,[...i??[],...t.split(` `),n],r)}function sn(e){return e.runtimeCapabilities.hookEvents.filter(e=>e.frameworkSubject!==void 0).map(e=>({eventName:e.name,mode:e.mode}))}function cn(e){return/^[A-Za-z0-9_@%+=:,./-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`}export{ct as AbsolutePathSchema,me as BinaryNotFoundError,R as CLIENT_RUNTIME_STATUSES,he as ClientAccountRegistry,Be as ClientBinaryJobRunner,Ue as ClientBinaryManager,k as ClientBinaryStateRecordSchema,j as ClientBinaryStorageNamespace,M as ClientBinaryStorageSubjects,O as ClientBinaryVersionRecordSchema,we as ClientBinaryVersionResolver,bt as ClientConfigPrimeService,N as ClientDefinitionRegistry,$e as ClientHookHandleResponseSchema,W as ClientProfileRecordSchema,Ct as ClientProfileService,xt as ClientProfileStorageNamespace,K as ClientProfileStorageSubjects,Je as ClientRuntimeRegistry,mt as ClientRuntimeService,B as ClientRuntimeStorageNamespace,V as ClientRuntimeStorageSubjects,kt as ClientSessionConfigService,ae as ClientSubjects,ft as ClientWiringAggregatedResultSchema,ut as ClientWiringApplyResponseSchema,x as ClientWiringEntrySchema,lt as ClientWiringListResponseSchema,dt as ClientWiringRemoveResponseSchema,$t as ClientsCoreService,en as ClientsCoreToken,Qe as DEFAULT_HOOK_HANDLE_TIMEOUT_MS,Ye as RawClientHookPayloadSchema,z as RuntimeRecordSchema,pt as assertAbsoluteProjectDir,de as atomicModifyFile,an as buildClientCommand,rt as buildClientSessionBase,on as buildHookCommand,U as canonicalizeClientId,Ft as createClientNamespace,st as createClientWiringListSubjectDef,ot as createClientWiringSubjectDef,nn as createClientsCorePackage,et as createRawClientHookHandleSubject,Ze as createRawClientHookReceivedSubject,sn as deriveSessionEventDescriptors,it as emitBestEffort,E as isPathWithinBase,nt as pickNonEmptyString,tt as pickNonEmptyStringValue,tn as registerStorageHandlersWithRollback,D as resolveAndValidateBasePath,rn as resolveClientBinary};
|
|
1
|
+
import{z as e}from"zod";import*as t from"node:fs/promises";import*as n from"node:path";import{randomUUID as r}from"node:crypto";import{createBusNamespace as i}from"@makaio/framework/core";import{MakaioBus as a}from"@makaio/framework/bus";import{extensionToken as o,isUniversalRange as s,versionSatisfies as c}from"@makaio/framework/contracts";import{BaseService as l}from"@makaio/framework/service-base";import{index as u,unique as d,uniqueIndex as f}from"drizzle-orm/sqlite-core";import{index as p,unique as m,uniqueIndex as h}from"drizzle-orm/pg-core";import{defineDialectSchema as ee,defineDualTable as g,didAffectRows as te,executeTransaction as _,registerDrizzleHandlers as ne,resolveSchema as v}from"@makaio/framework/storage/drizzle";import{and as y,eq as b,gt as re,sql as ie}from"drizzle-orm";import{ClientProfileNameSchema as x,ClientProfileSchema as ae,ClientSubjects as oe,ClientSubjects as S,ClientWiringEntrySchema as C,ManagedInstallDescriptorSchema as se,SessionConfigIdSchema as ce}from"@makaio/framework/contracts/client";import*as w from"node:os";import{CLIDetectionSubjects as le}from"@makaio/framework/services/cli-detection/namespace";import{ClientStorageSubjects as ue}from"@makaio/framework/services/settings/storage";import{SessionSubjects as de}from"@makaio/framework/contracts/session";async function fe(e,t,n,r,i){let a,o=(n.get(e)??Promise.resolve()).then(async()=>{let n=await i(r(await pe(e,t)));n.changed&&await me(e,n.content),a=n.result}),s=o.then(()=>void 0,()=>void 0);n.set(e,s);try{await o}finally{n.get(e)===s&&n.delete(e)}return a}async function pe(e,n){let r;try{r=await t.readFile(e,`utf-8`)}catch(e){if(e.code===`ENOENT`)return n;throw e}return JSON.parse(r)}async function me(e,i){let a=n.dirname(e),o=n.join(a,`${n.basename(e)}.${r()}.tmp`);await t.mkdir(a,{recursive:!0});try{await t.writeFile(o,`${JSON.stringify(i,null,2)}\n`,`utf-8`),await t.rename(o,e)}catch(e){throw await t.unlink(o).catch(()=>void 0),e}}var he=class e extends Error{code=`BINARY_NOT_FOUND`;constructor(t){super(`client.resolveBinary: no binary found for client '${t}' — install a managed version or ensure the binary is on PATH`),this.name=`BinaryNotFoundError`,Error.captureStackTrace?.(this,e)}},ge=class{nextAccountSequence=1;accountIdsByIdentifier=new Map;accounts=new Map;upsertAccount(e){let t=ve(e.displayLabel),n=new Map;for(let t of e.identifiers)n.set(_e(e.clientId,t.scheme,t.value),t);let r=ye(n,this.accountIdsByIdentifier,`strong`),i=ye(n,this.accountIdsByIdentifier,`alias`),a=r[0]??(i.length===1?i[0]:i.length>1?be(i):this.createAccount()),o=(r.length>0?Ce(a,r,i):[]).flatMap(e=>this.mergeInto(a,e)),s=this.accounts.get(a);if(!s)throw Error(`Client account registry invariant violated: missing account ${a}`);for(let[e,t]of n){let n=this.accountIdsByIdentifier.get(e);r.length===0&&t.strength===`alias`&&n!==void 0&&n!==a||(s.identifiers.set(e,t),this.accountIdsByIdentifier.set(e,a))}return t!==void 0&&(s.displayLabel=t),{clientAccountId:a,displayLabel:s.displayLabel,mergedAccountIds:o}}clear(){this.accountIdsByIdentifier.clear(),this.accounts.clear(),this.nextAccountSequence=1}createAccount(){let e=`client-account-${this.nextAccountSequence}`;return this.nextAccountSequence+=1,this.accounts.set(e,{clientAccountId:e,identifiers:new Map}),e}mergeInto(e,t){if(e===t)return[];let n=this.accounts.get(e),r=this.accounts.get(t);if(!n||!r)return[];for(let[t,i]of r.identifiers)n.identifiers.set(t,i),this.accountIdsByIdentifier.set(t,e);return n.displayLabel===void 0&&r.displayLabel!==void 0&&(n.displayLabel=r.displayLabel),this.accounts.delete(t),[t]}};function _e(e,t,n){return`${e}\u0000${t}\u0000${n}`}function ve(e){return e?.trim()||void 0}function ye(e,t,n){let r=new Set;for(let[i,a]of e){if(a.strength!==n)continue;let e=t.get(i);e!==void 0&&r.add(e)}return Array.from(r).sort(xe)}function be(e){return[...e].sort(xe)[0]}function xe(e,t){let n=Se(e),r=Se(t);return n!==null&&r!==null&&n!==r?n-r:e.localeCompare(t)}function Se(e){let t=e.match(/^client-account-(\d+)$/);return t?Number(t[1]):null}function Ce(e,t,n){let r=new Set([...t,...n]);return r.delete(e),Array.from(r).sort(xe)}function we(e){return{subject:`config.prime`,$meta:{namespace:`client:${e}`,isRequest:!0,local:!1,channel:!1}}}async function T(e,t){let n=await e.requestOptional(we(t.clientId),t);return n.handled?n.data:{primed:!1}}function Te(){let e=e=>async()=>{throw Error(`StrategyDependencies.${e} is not implemented`)};return{fetchText:e(`fetchText`),fetchJson:e(`fetchJson`),downloadFile:e(`downloadFile`),exec:e(`exec`),extractArchive:e(`extractArchive`),deleteFile:e(`deleteFile`),computeChecksum:e(`computeChecksum`),removeDirectory:e(`removeDirectory`)}}var Ee=class{resolveInstallVersion(e,t,n){let r=t.version;if(n===void 0)return{version:r,explicit:!1};let i=n.trim();if(i.length===0)throw Error(`Explicit version returned an empty version string`);if(i!==r)throw Error(`client.install: requested version ${i} for client '${e}' does not match pinned version ${r}`);return{version:i,explicit:!0}}};function De(e){if(e!==void 0)return(t,n)=>{n!==null&&n>0?e(`downloading`,t/n*100):e(`downloading`,null)}}var Oe=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t}async execute(e,t,n){if(e!==this.#e.version)throw Error(`npm managed install requested version ${e} but descriptor pins ${this.#e.version}`);n?.(`installing`,null);let r=`${this.#e.package}@${this.#e.version}`;return await this.#t.exec(`npm`,[`install`,r,`--prefix`,t,`--no-save`,`--ignore-scripts`]),n?.(`installing`,100),{installPath:t,version:this.#e.version,strategy:`npm`}}};function ke(){if(process.platform!==`linux`)return!1;try{let e=process.report?.getReport?.();if(typeof e!=`object`||!e||!(`header`in e))return!0;let{header:t}=e;return typeof t!=`object`||!t?!0:!(`glibcVersionRuntime`in t)}catch{return!1}}function Ae(e){return e.replace(/[^0-9a-fA-F]/g,``).toUpperCase()}function E(e,t,n,r){let i=e.replaceAll(`{version}`,t);return n!==void 0&&(i=i.replaceAll(`{platform}`,n)),r!==void 0&&(i=i.replaceAll(`{binary}`,r)),i}function je(e){let t=`${e.platform}-${e.arch}`;return e.platform===`linux`&&e.isMusl?`${t}-musl`:t}function Me(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Signed manifest must be a JSON object`);let n=e,r=n.version;if(r!==t)throw Error(`Signed manifest version ${String(r)} does not match descriptor pin ${t}`);let i=n.platforms;if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`Signed manifest must contain a platforms object`);return{version:r,platforms:i}}function Ne(e,t){let n=e.platforms[t];if(typeof n!=`object`||!n||Array.isArray(n))throw Error(`Signed manifest does not contain a platform entry for '${t}'`);let{binary:r,checksum:i}=n;if(typeof r!=`string`||!Pe(r))throw Error(`Manifest entry for '${t}' has unsafe binary filename`);if(typeof i!=`string`||i.length===0)throw Error(`Manifest entry for '${t}' is missing a valid 'checksum' field`);return{binary:r,checksum:i}}function Pe(e){return e.length>0&&e!==`.`&&e!==`..`&&!e.includes(`/`)&&!e.includes(`\\`)}var Fe=class{#e;#t;#n;constructor(e,t,n){this.#e=e,this.#t=t,this.#n={platform:n?.platform??process.platform,arch:n?.arch??process.arch,isMusl:n?.isMusl??ke()}}async execute(e,r,i){if(e!==this.#e.version)throw Error(`signed-binary-bucket managed install requested version ${e} but descriptor pins ${this.#e.version}`);let{config:a}=this.#e,o=je(this.#n),s=a.platforms[o];if(s===void 0)throw Error(`signed-binary-bucket descriptor has no platform entry for '${o}'. Supported platforms: ${Object.keys(a.platforms).join(`, `)}`);await t.mkdir(r,{recursive:!0});let c=n.join(r,`.gnupg`),l=n.join(r,`signing-key.asc`),u=n.join(r,`manifest.json`),d=n.join(r,`manifest.json.sig`);i?.(`resolving`,null),await this.#r(a,e,l,u,d),i?.(`verifying`,null);let f=await this.#i(a,c,l,u,d,o);i?.(`downloading`,null);let p=E(a.binaryPathTemplate,e,s,f.binary),m=n.resolve(r,f.binary);await this.#t.downloadFile(`${a.baseUrl}/${p}`,m,De(i)),i?.(`verifying`,null);let h=await this.#t.computeChecksum(m);if(h!==f.checksum)throw Error(`Binary checksum mismatch: expected ${f.checksum} but computed ${h}`);return i?.(`installing`,null),this.#n.platform!==`win32`&&await t.chmod(m,493),await this.#t.removeDirectory(c),await this.#t.deleteFile(l),await this.#t.deleteFile(d),i?.(`installing`,100),{installPath:r,version:this.#e.version,strategy:`signed-binary-bucket`}}async#r(e,n,r,i,a){let o=`${e.baseUrl}/${E(e.manifestPathTemplate,n)}`,s=`${e.baseUrl}/${E(e.manifestSignaturePathTemplate,n)}`,c=await this.#t.fetchText(e.publicKeyUrl);await t.writeFile(r,c,`utf-8`),await this.#t.downloadFile(o,i),await this.#t.downloadFile(s,a)}async#i(e,n,r,i,a,o){await t.mkdir(n,{recursive:!0,mode:448}),await this.#t.exec(`gpg`,[`--homedir`,n,`--import`,r]);let s=await this.#t.exec(`gpg`,[`--homedir`,n,`--with-colons`,`--fingerprint`,`--list-keys`]),c=this.#a(s);if(Ae(c)!==Ae(e.publicKeyFingerprint))throw Error(`GPG key fingerprint mismatch: expected ${e.publicKeyFingerprint} but got ${c}`);await this.#t.exec(`gpg`,[`--homedir`,n,`--verify`,a,i]).catch(e=>{throw Error(`Manifest GPG signature verification failed: ${e.message}`)});let l=await t.readFile(i,`utf-8`);return Ne(Me(JSON.parse(l),this.#e.version),o)}#a(e){for(let t of e.split(`
|
|
2
|
+
`)){let e=t.split(`:`);if(e[0]===`fpr`&&e[9]!==void 0&&e[9].length>0)return e[9]}throw Error(`Could not extract GPG key fingerprint from output`)}};function Ie(e,t){let n=se.safeParse(e);if(n.success)switch(n.data.type){case`npm`:return new Oe(n.data,t);case`signed-binary-bucket`:return new Fe(n.data,t)}}function Le(e,t){let r=n.relative(e,t);return r!==``&&!r.startsWith(`..${n.sep}`)&&r!==`..`&&!n.isAbsolute(r)}function D(e,t){return!n.isAbsolute(e)||!n.isAbsolute(t)?!1:Le(n.resolve(e),n.resolve(t))}function O(e,t){if(!e||!n.isAbsolute(e))throw Error(`${t} requires a non-empty absolute basePath`);return n.resolve(e)}async function Re(e,r,i,a){let[o,...s]=i;if(Be(o))throw Error(`versionCommand[0] must be a relative path; received absolute path "${o}"`);if(o.split(/[/\\]/).includes(`..`))throw Error(`versionCommand[0] must not contain path traversal segments; received "${o}"`);let c=n.normalize(o),l=n.join(r,c),u=await t.realpath(r),d=await t.realpath(l);if(!Le(u,d))throw Error(`versionCommand[0] must not escape the install directory; "${o}" resolves outside installPath`);let f;try{f=await e(d,s,{cwd:u})}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Version verification failed: command "${l}" exited with an error: ${t}`,{cause:e})}let p=ze(a);if(!Ve(f,p))throw Error(`Version mismatch: expected "${a}" but command output was "${f.trim()}"`)}function ze(e){return e[0]===`v`||e[0]===`V`?e.slice(1):e}function Be(e){return e.startsWith(`/`)||/^[A-Za-z]:[/\\]/.test(e)||e.startsWith(`\\`)}function Ve(e,t){return(e.match(/[A-Za-z0-9][A-Za-z0-9._+-]*/g)??[]).some(e=>ze(e)===t)}var He=class{strategyDeps;config;jobs=new Map;#e=!1;resolvedBasePath;constructor(e,t){this.strategyDeps=e,this.config=t,this.resolvedBasePath=O(t.basePath,`ClientBinaryJobRunner`)}startJob(e,t,n,r,i,a,o){let s={...e,status:`running`};return this.jobs.set(e.jobId,s),this.runJob(s,t,n,r,i,a,o),e.jobId}cancelAll(){this.#e=!0,this.jobs.clear()}safeOnProgress(e,t){try{e(t)}catch{}}emitProgressIfActive(e,t){return this.#e?!1:(this.safeOnProgress(e,t),!this.#e)}async runJob(e,t,n,r,i,a,o){try{let s=this.resolveTargetDir(e.clientId,e.version),c=Ie(t,this.strategyDeps);if(c===void 0)throw Error(`Unsupported managed install descriptor type: ${t.type}`);let l=await this.executeStrategy(e,c,s,n);if(this.#e)return;let u;try{if(u=await this.runPostInstall(e,l.installPath,a,n),this.#e)return;o!==void 0&&await this.runVersionVerification(e,l.installPath,o,n)}catch(e){throw this.#e||await this.cleanupStagedArtifact(l.installPath),e}if(this.#e)return;await this.finalizeSuccess(e,l,u,n,r,i)}catch(t){if(this.#e)return;let n=t instanceof Error?t.message:String(t),r=t instanceof Error&&`code`in t?String(t.code):void 0;try{await i({jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,status:`error`,activeVersion:null,error:{message:n,...r===void 0?{}:{code:r}}})}catch{}}finally{this.jobs.delete(e.jobId)}}async finalizeSuccess(e,t,n,r,i,a){if(!(e.makeActive&&!this.emitProgressIfActive(r,{jobId:e.jobId,clientId:e.clientId,version:t.version,strategy:e.strategy,stage:`activating`,progress:null,installPath:t.installPath,activeAfterCompletion:!0}))&&!this.#e){try{await i({jobId:e.jobId,clientId:e.clientId,version:t.version,installPath:t.installPath,makeActive:e.makeActive,reason:e.reason})}catch(e){try{await this.strategyDeps.removeDirectory(t.installPath)}catch{}throw e}if(!this.#e)try{await a({jobId:e.jobId,clientId:e.clientId,version:t.version,strategy:e.strategy,status:`success`,installPath:t.installPath,activeVersion:e.makeActive?t.version:null,...n===void 0?{}:{metadata:{postInstall:n}}})}catch{}}}async cleanupStagedArtifact(e){try{await this.strategyDeps.removeDirectory(e)}catch{}}async executeStrategy(e,t,n,r){try{return await t.execute(e.version,n,(t,i)=>{this.emitProgressIfActive(r,{jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,stage:t,progress:i,installPath:t===`installing`?n:void 0,activeAfterCompletion:e.makeActive})})}catch(e){throw this.#e||await this.cleanupStagedArtifact(n),e}}async runPostInstall(e,t,n,r){if(n===void 0)return;let i=this.resolvePostInstallHandler(n),a=this.buildProgressPayload(e,`post-install`,null,t,{kind:n.kind});if(!this.emitProgressIfActive(r,a))return;let o=await i({clientId:e.clientId,version:e.version,installPath:t,descriptor:n});return this.emitProgressIfActive(r,this.buildProgressPayload(e,`post-install`,100,t,{kind:n.kind,...o??{}})),o??void 0}async runVersionVerification(e,t,n,r){this.emitProgressIfActive(r,this.buildProgressPayload(e,`verifying`,null,t,{kind:`version-command`}))&&(this.#e||await Re(this.strategyDeps.exec,t,n,e.version))}resolvePostInstallHandler(e){let t=this.config.postInstallHandlers?.get(e.kind);if(t===void 0)throw Error(`No post-install handler registered for kind "${e.kind}"`);return t}buildProgressPayload(e,t,n,r,i){return{jobId:e.jobId,clientId:e.clientId,version:e.version,strategy:e.strategy,stage:t,progress:n,installPath:r,activeAfterCompletion:e.makeActive,...i===void 0?{}:{metadata:i}}}resolveTargetDir(e,t){let r=n.resolve(this.resolvedBasePath,e,t);if(!D(this.resolvedBasePath,r))throw Error(`Invalid install target path for client "${e}" and version "${t}"`);return r}};const k=e.object({id:e.string(),clientId:e.string(),version:e.string(),installPath:e.string(),installedAt:e.number().int().nonnegative(),createdAt:e.number().int().nonnegative()}),A=e.object({clientId:e.string(),activeVersion:e.string().nullable(),updatedAt:e.number().int().nonnegative()}),j=e.object({previousActiveVersion:e.string().nullable(),activeVersion:e.string().nullable()}),M=i(`client-binary:storage`,{insertVersion:{request:k,response:e.object({success:e.boolean()})},recordInstalledVersion:{request:e.object({versionRecord:k,makeActive:e.boolean(),updatedAt:e.number().int().nonnegative()}),response:j},listVersions:{request:e.object({clientId:e.string()}),response:e.object({versions:e.array(k)})},getSnapshot:{request:e.object({clientId:e.string()}),response:e.object({state:A.nullable(),versions:e.array(k)})},loadAllVersions:{request:e.object({}),response:e.object({versions:e.array(k)})},upsertState:{request:A,response:e.object({success:e.boolean()})},setActiveVersion:{request:e.object({clientId:e.string(),activeVersion:e.string().nullable(),updatedAt:e.number().int().nonnegative()}),response:j},getState:{request:e.object({clientId:e.string()}),response:e.object({state:A.nullable()})},loadAllState:{request:e.object({}),response:e.object({states:e.array(A)})},loadSnapshot:{request:e.object({}),response:e.object({states:e.array(A),versions:e.array(k)})},removeVersionAndClearActive:{request:e.object({clientId:e.string(),version:e.string(),updatedAt:e.number().int().nonnegative()}),response:j.extend({removedVersion:e.string().nullable()})}}),N=M.subjects;var P=class{definitions=new Map;constructor(e=[]){for(let t of e)this.registerUnique(t)}getDefinition(e){return this.definitions.get(e)}listDefinitions(){return[...this.definitions.values()]}register(e){this.definitions.set(e.id,e)}registerUnique(e){if(this.definitions.has(e.id))throw Error(`ClientDefinitionRegistry: duplicate client definition id '${e.id}'`);this.definitions.set(e.id,e)}};function F(e,t,n,r,i){if(n===null){if(s(r))return;throw Error(`${e}: ${i} for client '${t}' did not report a version; requires ${r}`)}if(!c(n,r))throw Error(`${e}: ${i} ${n} for client '${t}' does not satisfy ${r}`)}var Ue=class{bus;resolvedBasePath;resolvedConfigBasePath;definitionLookup;constructor(e){this.bus=e.bus,this.resolvedBasePath=e.resolvedBasePath,this.resolvedConfigBasePath=e.resolvedConfigBasePath,this.definitionLookup=e.definitionLookup}async resolve(e){let t=this.definitionLookup.getDefinition(e);if(t===void 0)throw Error(`client.resolveBinary: no definition registered for client '${e}'`);let{state:n,versions:r}=await this.bus.request(N.getSnapshot,{clientId:e}),i=n?.activeVersion??null;return i===null?this.buildGlobalContext(e,t):this.buildManagedContext(e,i,t,r)}isInstallPathWithinBase(e){return D(this.resolvedBasePath,e)}async isExpectedInstallPath(e,r,i){if(!n.isAbsolute(e)||!this.isInstallPathWithinBase(e))return!1;let a=n.resolve(this.resolvedBasePath,r,i);if(!this.isInstallPathWithinBase(a))return!1;try{let[n,r,i]=await Promise.all([t.realpath(this.resolvedBasePath),t.realpath(a),t.realpath(e)]);return D(n,r)?i===r||D(r,i):!1}catch{return!1}}async buildManagedContext(e,t,r,i){let a=i.find(e=>e.version===t);if(a===void 0)throw Error(`client.resolveBinary: active version '${t}' is not installed for client '${e}'`);if(!await this.isExpectedInstallPath(a.installPath,e,t))throw Error(`client.resolveBinary: stored installPath "${a.installPath}" does not match the expected install directory for ${e}@${t}`);r.binary!==void 0&&F(`client.resolveBinary`,e,t,r.binary.supportedVersions,`managed binary version`);let o=I(r.versionCommand)?.[0];if(o===void 0)throw Error(`client.resolveBinary: definition for '${e}' has no versionCommand — cannot derive binary path`);let s=n.resolve(a.installPath,o),c=n.resolve(a.installPath);if(!s.startsWith(c+n.sep)&&s!==c)throw Error(`client.resolveBinary: versionCommand for '${e}' resolves outside the install directory`);let{configDir:l,env:u}=this.resolveIsolatedConfig(e,r);return{binaryPath:s,env:u,configDir:l,source:`managed`,version:t}}async buildGlobalContext(e,t){if(!t.binary?.name)throw Error(`client.resolveBinary: definition for '${e}' has no binary.name — cannot scan PATH`);let n={clientId:e,binaryName:t.binary.name,supportedVersions:t.binary.supportedVersions},{results:r}=await this.bus.request(S.scan,{targets:[n]}),i=r.find(t=>t.clientId===e);if(i===void 0||!i.found)throw new he(e);let a=i.version??null;return F(`client.resolveBinary`,e,a,t.binary.supportedVersions,`detected global binary version`),{binaryPath:null,env:{},configDir:this.resolveGlobalConfigDir(t),source:`global`,version:a}}resolveIsolatedConfig(e,t){let{configIsolation:r}=t;if(r===void 0)return{configDir:null,env:{}};let i=n.join(this.resolvedConfigBasePath,e,`config`),a=r.pathKind===`file`?n.join(i,n.basename(r.defaultPath)):i;return{configDir:i,env:{[r.envVar]:a}}}resolveGlobalConfigDir(e){let{configIsolation:t}=e;if(t===void 0)return null;let r=t.defaultPath,i=r===`~`?w.homedir():r.startsWith(`~/`)?n.join(w.homedir(),r.slice(2)):r,a=t.pathKind===`file`?n.dirname(i):i;if(!n.isAbsolute(a))throw Error(`ConfigIsolation defaultPath for '${e.id}' resolved to non-absolute path '${i}'; use an absolute or tilde-expanded path (e.g. '~/.myapp')`);return a}};function I(e){if(e===void 0)return;let{executable:t,args:n}=e,r=typeof t==`string`?t:t[process.platform]??t.default;if(typeof r!=`string`||r.trim()===``)throw Error(`client.resolveBinary: versionCommand executable is missing for this platform`);return[r,...n]}async function We(e,t){let{versions:n,states:r}=await e.request(N.loadSnapshot,{}),i=Map.groupBy(n,e=>e.clientId),a=new Map;for(let e of r)a.set(e.clientId,e.activeVersion);let o=new Map;for(let e of t.listDefinitions())e.managedInstall!==void 0&&o.set(e.id,e.managedInstall);return[...new Set(o.keys())].map(e=>{let t=o.get(e);if(t===void 0)throw Error(`assembleBinaryList: missing descriptor for client '${e}'`);let n=a.get(e)??null,r=(i.get(e)??[]).map(e=>({version:e.version,installPath:e.installPath,installedAt:e.installedAt,isActive:e.version===n})),s=t.version;return{clientId:e,installedVersions:r,activeVersion:n,pinnedVersion:s,updateAvailable:n!==null&&n!==s}})}var Ge=class extends l{config;definitionLookup;versionResolver;jobRunner;strategyDeps;resolvedBasePath;resolvedConfigBasePath;resolver;pendingClients=new Set;constructor(e=a,t,n=new P([]),r=Te()){super(e),this.config=t,this.definitionLookup=n,this.resolvedBasePath=O(t.basePath,`ClientBinaryManager`),this.resolvedConfigBasePath=O(t.configBasePath,`ClientBinaryManager configBasePath`),this.strategyDeps=r,this.versionResolver=new Ee,this.jobRunner=new He(r,t),this.resolver=new Ue({bus:e,resolvedBasePath:this.resolvedBasePath,resolvedConfigBasePath:this.resolvedConfigBasePath,definitionLookup:n})}async onInit(){this.registerHandler(S.list,async e=>{let t=await this.handleList();e.setResult({clients:t})}),this.registerHandler(S.install,async e=>{let t=await this.handleInstall(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(S.update,async e=>{let t=await this.handleUpdate(e.payload.clientId);e.setResult(t)}),this.registerHandler(S.setActive,async e=>{let t=await this.handleSetActive(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(S.uninstall,async e=>{let t=await this.handleUninstall(e.payload.clientId,e.payload.version);e.setResult(t)}),this.registerHandler(S.resolveBinary,async e=>{let t=await this.resolver.resolve(e.payload.clientId);e.setResult(t)})}onDestroy(){this.jobRunner.cancelAll(),this.pendingClients.clear()}async handleList(){return We(this.bus,this.definitionLookup)}async handleInstall(e,t){let{definition:n,descriptor:r}=this.requireManagedDefinition(e,`client.install`);return this.withClientLock(e,async()=>{let{version:i}=this.versionResolver.resolveInstallVersion(e,r,t);return n.binary!==void 0&&F(`client.install`,e,i,n.binary.supportedVersions,t===void 0?`resolved binary version`:`requested binary version`),{jobId:this.startInstallJob(e,i,r,n,!1,`install`),requestedVersion:t??null,resolvedVersion:i}})}async handleUpdate(e){let{definition:t,descriptor:n}=this.requireManagedDefinition(e,`client.update`);return this.withClientLock(e,async()=>{let{version:r}=this.versionResolver.resolveInstallVersion(e,n);return t.binary!==void 0&&F(`client.update`,e,r,t.binary.supportedVersions,`resolved binary version`),{jobId:this.startInstallJob(e,r,n,t,!0,`update`),resolvedVersion:r}})}async handleSetActive(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{let{versions:n}=await this.bus.request(N.listVersions,{clientId:e}),r=n.find(e=>e.version===t);if(r===void 0)throw Error(`client.setActive: version '${t}' is not installed for client '${e}'`);let i=this.definitionLookup.getDefinition(e);if(i===void 0)throw Error(`client.setActive: no definition registered for client '${e}'`);i.binary!==void 0&&F(`client.setActive`,e,t,i.binary.supportedVersions,`requested binary version`);let a=I(i.versionCommand);if(a===void 0)throw Error(`client.setActive: no versionCommand registered for client '${e}'`);if(!await this.resolver.isExpectedInstallPath(r.installPath,e,t))throw Error(`client.setActive: stored installPath "${r.installPath}" does not match the expected install directory for ${e}@${t}`);return await Re(this.strategyDeps.exec,r.installPath,a,t),await this.patchActiveVersion(e,t,`set-active`),{clientId:e,activeVersion:t}}finally{this.pendingClients.delete(e)}}async handleUninstall(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{let{versions:r}=await this.bus.request(N.listVersions,{clientId:e}),i=r.find(e=>e.version===t);if(i===void 0)throw Error(`client.uninstall: version '${t}' is not installed for client '${e}'`);let{removedVersion:a,previousActiveVersion:o,activeVersion:s}=await this.bus.request(N.removeVersionAndClearActive,{clientId:e,version:t,updatedAt:Date.now()});if(a===null)throw Error(`client.uninstall: failed to delete version '${t}' for client '${e}'`);let c=i.installPath,l=typeof c==`string`&&c.length>0?n.resolve(c):null;if(typeof c!=`string`||c.length===0||l===null||!n.isAbsolute(c)||!await this.resolver.isExpectedInstallPath(l,e,t)?console.warn(`[ClientBinaryManager] Skipping removeDirectory: stored installPath "${String(c)}" does not match the expected install directory for ${e}@${t}`):await this.strategyDeps.removeDirectory(l).catch(n=>{console.warn(`[ClientBinaryManager] Failed to remove binary directory "${l}" for ${e}@${t}:`,n)}),o!==null&&s===null)try{await this.bus.emit(S.version.changed,{clientId:e,previousActiveVersion:o,activeVersion:null,reason:`uninstall`})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}return{clientId:e,removedVersion:t,activeVersion:s}}finally{this.pendingClients.delete(e)}}async patchActiveVersion(e,t,n){let r=(await this.bus.request(N.setActiveVersion,{clientId:e,activeVersion:t,updatedAt:Date.now()})).previousActiveVersion;if(r!==t)try{await this.bus.emit(S.version.changed,{clientId:e,previousActiveVersion:r,activeVersion:t,reason:n})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}return r}requireManagedDefinition(e,t){let n=this.definitionLookup.getDefinition(e);if(n===void 0)throw Error(`${t}: no definition registered for client '${e}'`);let r=n.managedInstall;if(r===void 0)throw Error(`${t}: client '${e}' does not declare a managed install descriptor`);return{definition:n,descriptor:r}}async withClientLock(e,t){if(this.pendingClients.has(e))throw Error(`Operation already in progress for client "${e}"`);this.pendingClients.add(e);try{return await t()}catch(t){throw this.pendingClients.delete(e),t}}startInstallJob(e,t,n,r,i,a){let o={jobId:crypto.randomUUID(),clientId:e,version:t,strategy:n.type,status:`pending`,makeActive:i,reason:a};return this.jobRunner.startJob(o,n,e=>{this.bus.emit(S.installJob.progress,e).catch(e=>{console.warn(`[ClientBinaryManager] Failed to emit client.installJob.progress:`,e)})},this.makeCompletionCallback(),async e=>{this.pendingClients.delete(e.clientId),await this.bus.emit(S.installJob.completed,e).catch(e=>{console.warn(`[ClientBinaryManager] Failed to emit client.installJob.completed:`,e)})},r.postInstall,I(r.versionCommand)),o.jobId}makeCompletionCallback(){return async({clientId:e,version:t,installPath:n,makeActive:r,reason:i})=>{let a=Date.now();await T(this.bus,{clientId:e,configDir:this.resolveManagedConfigDir(e),phase:`managed-install`,binaryVersion:t});let o=await this.bus.request(N.recordInstalledVersion,{versionRecord:{id:crypto.randomUUID(),clientId:e,version:t,installPath:n,installedAt:a,createdAt:a},makeActive:r,updatedAt:a});if(r&&o.previousActiveVersion!==o.activeVersion)try{await this.bus.emit(S.version.changed,{clientId:e,previousActiveVersion:o.previousActiveVersion,activeVersion:o.activeVersion,reason:i})}catch(e){console.warn(`[ClientBinaryManager] Failed to emit client.version.changed:`,e)}}}resolveManagedConfigDir(e){return n.join(this.resolvedConfigBasePath,e,`config`)}};function L(e,t){return`${e}${t}`}function R(e,t){return`${e}${t}`}var Ke=class{records=new Map;bySupervisorSessionId=new Map;byPidClientId=new Map;byAdapterSessionClientId=new Map;set(e){let t=this.records.get(e.clientRuntimeId);t&&this.removeIndexEntries(t),this.records.set(e.clientRuntimeId,e),this.addIndexEntries(e)}setFromStorage(e,t,n){this.records.set(e.clientRuntimeId,e),e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.set(e.supervisorSessionId,e.clientRuntimeId),t-e.updatedAt<=n&&(e.pid!==void 0&&this.byPidClientId.set(L(e.pid,e.clientId),e.clientRuntimeId),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.set(R(e.adapterSessionId,e.clientId),e.clientRuntimeId))}delete(e){let t=this.records.get(e);t&&(this.removeIndexEntries(t),this.records.delete(e))}get(e){return this.records.get(e)}findByEvidence(e,t,n,r){if(e!==void 0){let t=this.bySupervisorSessionId.get(e);if(t!==void 0)return this.records.get(t)}if(t!==void 0){let e=this.byPidClientId.get(L(t,r));if(e!==void 0)return this.records.get(e)}if(n!==void 0){let e=this.byAdapterSessionClientId.get(R(n,r));if(e!==void 0)return this.records.get(e)}}values(){return this.records.values()}clear(){this.records.clear(),this.bySupervisorSessionId.clear(),this.byPidClientId.clear(),this.byAdapterSessionClientId.clear()}get size(){return this.records.size}addIndexEntries(e){e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.set(e.supervisorSessionId,e.clientRuntimeId),e.pid!==void 0&&this.byPidClientId.set(L(e.pid,e.clientId),e.clientRuntimeId),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.set(R(e.adapterSessionId,e.clientId),e.clientRuntimeId)}removeIndexEntries(e){e.supervisorSessionId!==void 0&&this.bySupervisorSessionId.delete(e.supervisorSessionId),e.pid!==void 0&&this.byPidClientId.delete(L(e.pid,e.clientId)),e.adapterSessionId!==void 0&&this.byAdapterSessionClientId.delete(R(e.adapterSessionId,e.clientId))}};const qe=[`observed`,`started`],z=e.object({clientRuntimeId:e.string(),clientId:e.string(),status:e.enum(qe),supervisorSessionId:e.string().optional(),pid:e.number().int().positive().optional(),parentPid:e.number().int().positive().optional(),adapterSessionId:e.string().optional(),sessionId:e.string().optional(),cwd:e.string().optional(),argv:e.array(e.string()).optional(),metadata:e.record(e.string(),e.unknown()).optional(),observedAt:e.number().int().nonnegative(),createdAt:e.number().int().nonnegative(),updatedAt:e.number().int().nonnegative()}),B=i(`client-runtime:storage`,{upsert:{request:z,response:e.object({success:e.boolean()})},loadAll:{request:e.object({}),response:e.object({records:e.array(z)})}}),V=B.subjects;function Je(e){return e.supervisorSessionId!==void 0||e.adapterSessionId!==void 0}function H(e){return{...e,argv:e.argv===void 0?void 0:[...e.argv],metadata:e.metadata===void 0?void 0:structuredClone(e.metadata)}}function Ye(e){return Math.max(Date.now(),e+1)}function Xe(e,t){let n=!1;return t.supervisorSessionId!==void 0&&e.supervisorSessionId!==t.supervisorSessionId&&(e.supervisorSessionId=t.supervisorSessionId,n=!0),t.pid!==void 0&&e.pid!==t.pid&&(e.pid=t.pid,n=!0),t.parentPid!==void 0&&e.parentPid!==t.parentPid&&(e.parentPid=t.parentPid,n=!0),t.adapterSessionId!==void 0&&e.adapterSessionId!==t.adapterSessionId&&(e.adapterSessionId=t.adapterSessionId,n=!0),t.sessionId!==void 0&&e.sessionId!==t.sessionId&&(e.sessionId=t.sessionId,n=!0),t.cwd!==void 0&&e.cwd!==t.cwd&&(e.cwd=t.cwd,n=!0),t.argv!==void 0&&JSON.stringify(e.argv)!==JSON.stringify(t.argv)&&(e.argv=[...t.argv],n=!0),t.metadata!==void 0&&JSON.stringify(e.metadata)!==JSON.stringify(t.metadata)&&(e.metadata=structuredClone(t.metadata),n=!0),n}var Ze=class{runtimeMap=new Ke;bus;constructor(e){this.bus=e}async loadFromStorage(){if(!this.bus)return;let e=await this.bus.requestOptional(V.loadAll,{});if(!e.handled)return;let t=Date.now();for(let n of e.data.records)this.runtimeMap.setFromStorage(H(n),t,864e5)}async upsertRuntime(e){let t=this.runtimeMap.findByEvidence(e.supervisorSessionId,e.pid,e.adapterSessionId,e.clientId);if(t){let n=t.status===`observed`,r=n&&Je(e),i=Xe(t,e),a=n&&e.observedAt>t.observedAt;return r&&(t.status=`started`),(i||r||a)&&(t.updatedAt=Ye(t.updatedAt),a&&(t.observedAt=e.observedAt),this.runtimeMap.set(t),await this.persistRecord(t)),{clientRuntimeId:t.clientRuntimeId,created:!1,promoted:r,record:H(t)}}let n=Date.now(),i=r(),a=Je(e)?`started`:`observed`,o={clientRuntimeId:i,clientId:e.clientId,status:a,supervisorSessionId:e.supervisorSessionId,pid:e.pid,parentPid:e.parentPid,adapterSessionId:e.adapterSessionId,sessionId:e.sessionId,cwd:e.cwd,argv:e.argv?[...e.argv]:void 0,metadata:e.metadata?structuredClone(e.metadata):void 0,observedAt:e.observedAt,createdAt:n,updatedAt:n};return this.runtimeMap.set(o),await this.persistRecord(o),{clientRuntimeId:i,created:!0,promoted:!1,record:H(o)}}getRuntime(e){let t=this.runtimeMap.get(e);return t?H(t):void 0}clear(){this.runtimeMap.clear()}get size(){return this.runtimeMap.size}async persistRecord(e){this.bus&&await this.bus.requestOptional(V.upsert,H(e))}};const U=e.object({eventName:e.string(),receivedAt:e.number().int().finite().nonnegative().describe(`Unix epoch timestamp in milliseconds`),payload:e.record(e.string(),e.unknown()),metadata:e.record(e.string(),e.unknown()).optional()}),Qe=/^[a-z0-9-]+$/;function W(e,t=`canonicalizeClientId`){let n=e.trim().toLowerCase(),r=n.startsWith(`client:`)?n.slice(7):n;if(r.length===0)throw Error(`[${t}] clientId must be a non-empty string`);if(!Qe.test(r))throw Error(`[${t}] clientId must contain only lowercase letters, numbers, and hyphens after an optional client: prefix`);return r}function $e(e){return{subject:`hook.received`,$meta:{namespace:`client:${W(e,`createRawClientHookReceivedSubject`)}`,isRequest:!1,local:!1,channel:!1}}}const et=5e3,tt=e.object({exitCode:e.number().int().min(0).max(255).default(0),stdout:e.string().default(``),stderr:e.string().default(``)});function nt(e){return{subject:`hook.handle`,$meta:{namespace:`client:${W(e,`createRawClientHookHandleSubject`)}`,isRequest:!0,local:!1,channel:!1}}}function rt(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function it(e,t){return rt(e[t])}function at(e){return{clientId:e.clientId,source:`adapter-derived`,observedAt:Date.now(),...e.sessionId!==void 0&&{sessionId:e.sessionId},...e.adapterSessionId!==void 0&&{adapterSessionId:e.adapterSessionId}}}function ot(e){try{e().catch(st)}catch(e){st(e)}}function st(e){(process.env.DEBUG||process.env.MAKAIO_DEBUG)&&console.debug(`[emitBestEffort] observed-semantics emission failed`,e)}function ct(e,t){return{subject:t,$meta:{namespace:`client:${W(e,`createClientWiringSubjectDef`)}`,isRequest:!0,local:!1,channel:!1}}}function lt(e){return ct(e,`wiring.list`)}const ut=e.string().min(1).refine(n.isAbsolute,{message:`projectDir must be an absolute path`}),dt=e.object({entries:e.array(C)}),ft=e.object({applied:e.number().int().nonnegative(),skipped:e.number().int().nonnegative()}),pt=e.object({removed:e.number().int().nonnegative()}),mt=e.object({clientId:e.string().trim().min(1),entries:e.array(C)});function ht(e){if(e!==void 0&&!n.isAbsolute(e))throw Error(`projectDir must be an absolute path, got: ${e}`)}var gt=class extends l{accountRegistry;runtimeRegistry;latestSnapshots=new Map;activeIdentities=new Map;constructor(e=a,t=new ge,n=new Ze(e)){super(e),this.accountRegistry=t,this.runtimeRegistry=n}async onInit(){await this.runtimeRegistry.loadFromStorage(),this.registerHandler(S.account.observe,e=>this.handleAccountObserve(e)),this.registerHandler(S.usage.ingest,e=>this.handleUsageIngest(e)),this.registerHandler(S.scan,async e=>{let t=await this.scanClients(e.payload.targets);e.setResult({results:t})}),this.registerHandler(S.runtime.observe,e=>this.handleRuntimeObserve(e)),this.registerHandler(S.wiring.list,async e=>{let t=await this.listWirings(e.payload);e.setResult({results:t})}),this.registerHandler(S.account.activate,e=>{this.activeIdentities.set(e.payload.clientId,{clientAccountId:e.payload.clientAccountId,identifiers:e.payload.identifiers,displayLabel:e.payload.displayLabel}),e.setResult({accepted:!0})}),this.registerHandler(S.account.getActive,e=>{let t=this.activeIdentities.get(e.payload.clientId);e.setResult({identity:t??null})})}onDestroy(){this.latestSnapshots.clear(),this.activeIdentities.clear(),this.accountRegistry.clear(),this.runtimeRegistry.clear()}getLatestSnapshot(e){return this.latestSnapshots.get(e)}async handleAccountObserve(e){let t=this.accountRegistry.upsertAccount({clientId:e.payload.clientId,identifiers:e.payload.identifiers,displayLabel:e.payload.displayLabel}),n=this.latestSnapshots.get(t.clientAccountId),r=yt(this.consolidateMergedSnapshots(t.clientAccountId,t.mergedAccountIds)??n,t.displayLabel);r&&this.latestSnapshots.set(t.clientAccountId,r),r&&(t.mergedAccountIds.length>0||r!==n)&&await this.bus.emit(S.usage.snapshot,r),e.setResult({clientAccountId:t.clientAccountId,displayLabel:t.displayLabel})}async handleUsageIngest(e){let t=this.accountRegistry.upsertAccount({clientId:e.payload.clientId,identifiers:e.payload.account.identifiers,displayLabel:e.payload.account.displayLabel});this.consolidateMergedSnapshots(t.clientAccountId,t.mergedAccountIds);let n=_t(t.clientAccountId,e.payload,t.displayLabel),r=yt(vt(this.latestSnapshots.get(t.clientAccountId),n),t.displayLabel);this.latestSnapshots.set(t.clientAccountId,r),await this.bus.emit(S.usage.snapshot,r),e.setResult({clientAccountId:t.clientAccountId,snapshot:r})}async handleRuntimeObserve(e){let{payload:t}=e;if(t.supervisorSessionId===void 0&&t.pid===void 0&&t.adapterSessionId===void 0)throw Error(`client.runtime.observe: at least one hard-evidence field is required (supervisorSessionId, pid, or adapterSessionId)`);let{record:n,...r}=await this.runtimeRegistry.upsertRuntime(t);(r.created||r.promoted)&&await this.bus.emit(S.runtime.started,{clientRuntimeId:n.clientRuntimeId,clientId:n.clientId,status:n.status,source:t.source,observedAt:t.observedAt,supervisorSessionId:n.supervisorSessionId,pid:n.pid,parentPid:n.parentPid,adapterSessionId:n.adapterSessionId,sessionId:n.sessionId,cwd:n.cwd,argv:n.argv,metadata:n.metadata}),e.setResult({clientRuntimeId:r.clientRuntimeId,created:r.created,promoted:r.promoted})}async scanClients(e){let t=e??await this.listScannableStoredClients();if(t.length===0)return[];let n=Array.from(new Set(t.map(e=>e.binaryName))),{results:r}=await this.bus.request(le.scan,{binaries:n}),i=new Map(r.map(e=>[e.binary,e]));return t.map(e=>{let t=i.get(e.binaryName),n=t?.found??!1,r=t?.version;return{clientId:e.clientId,found:n,version:r,warningMessage:xt(n,r,e.supportedVersions)}})}async listScannableStoredClients(){let{clients:e}=await this.bus.request(ue.list,{});return e.filter(bt).map(e=>({clientId:e.id,binaryName:e.binary.name,supportedVersions:e.binary.supportedVersions}))}async listWirings(e){ht(e.projectDir);let{clients:t}=await this.bus.request(ue.list,{}),n=e.clientId===void 0?void 0:W(e.clientId,`listWirings`),r=t.filter(e=>e.enabled).filter(e=>n===void 0||e.id===n),i=await Promise.allSettled(r.map(async t=>{let n=lt(t.id),r=await this.bus.requestOptional(n,{projectDir:e.projectDir,makaioCommand:e.makaioCommand});return r.handled?{clientId:t.id,entries:r.data.entries}:null}));for(let e=0;e<i.length;e++){let t=i[e];if(t.status===`rejected`){let n=t.reason instanceof Error?t.reason.message:String(t.reason);console.warn(`[ClientRuntimeService] wiring.list for ${r[e].id} failed: ${n}`)}}return i.filter(e=>e.status===`fulfilled`).map(e=>e.value).filter(e=>e!==null)}consolidateMergedSnapshots(e,t){let n=this.latestSnapshots.get(e),r=!1;for(let i of t){if(i===e)continue;let t=this.latestSnapshots.get(i);t&&(n===void 0||t.observedAt>n.observedAt)&&(n={...t,clientAccountId:e},r=!0),this.latestSnapshots.delete(i)}return n&&this.latestSnapshots.set(e,n),r?n:void 0}};function _t(e,t,n){return{clientAccountId:e,clientId:t.clientId,observedAt:t.observedAt,source:t.source,displayLabel:n,usage:{windows:t.usage.windows.map(e=>({...e}))},metadata:t.metadata?{...t.metadata}:void 0}}function vt(e,t){return e&&e.observedAt>t.observedAt?e:t}function yt(e,t){return!e||t===void 0||e.displayLabel===t?e:{...e,displayLabel:t}}function bt(e){return e.enabled&&e.binary!==void 0}function xt(e,t,n){if(e&&t!==void 0&&t!==`unknown`&&n!==void 0&&!c(t,n))return`Unsupported version: requires ${n}`}var St=class extends l{constructor(e=a){super(e)}onInit(){this.registerHandler(S.config.prime,async e=>{e.setResult(await T(this.bus,e.payload))})}};const G=ae,K=e.string().trim().min(1),q=i(`client-profile:storage`,{get:{request:e.object({clientId:K,name:x}),response:e.object({record:G.nullable()})},getById:{request:e.object({id:K}),response:e.object({record:G.nullable()})},list:{request:e.object({clientId:K}),response:e.object({records:e.array(G)})},set:{request:G,response:e.object({success:e.boolean()})},delete:{request:e.object({clientId:K,name:x}),response:e.object({success:e.boolean()})},clearDefault:{request:e.object({clientId:K}),response:e.object({success:e.boolean()})},setDefault:{request:e.object({clientId:K,name:x}),response:e.object({record:G.nullable()})}}),J=q.subjects;function Ct(e,t,r){let i=n.resolve(e),a=n.resolve(t),o=n.relative(i,a);if(o!==``&&!o.startsWith(`..`)&&!n.isAbsolute(o))return a;throw Error(`${r} refused to access path outside client profile root`)}var wt=class extends l{clientsBasePath;constructor(e,t){super(e),this.clientsBasePath=t}async onInit(){this.registerCreateHandler(),this.registerListHandler(),this.registerGetHandler(),this.registerUpdateHandler(),this.registerDeleteHandler(),this.registerSetDefaultHandler()}registerCreateHandler(){this.registerHandler(S.profile.create,async e=>{let i=W(e.payload.clientId,`profile.create`),{name:a,description:o}=e.payload;if((await this.bus.request(J.get,{clientId:i,name:a})).record!==null)throw Error(`Profile '${a}' already exists for client '${i}'`);let s=n.join(this.clientsBasePath,i,`profiles`),c=Ct(s,n.join(s,a),`profile.create`);await t.mkdir(c,{recursive:!0});try{await T(this.bus,{clientId:i,configDir:c,phase:`profile-create`});let t=Date.now(),n={id:r(),clientId:i,name:a,description:o??null,configDir:c,isDefault:!1,createdAt:t,updatedAt:t};await this.bus.request(J.set,n),e.setResult({profile:n})}catch(e){throw await t.rm(c,{recursive:!0,force:!0}),e}})}registerListHandler(){this.registerHandler(S.profile.list,async e=>{let t=W(e.payload.clientId,`profile.list`),n=await this.bus.request(J.list,{clientId:t});e.setResult({profiles:n.records})})}registerGetHandler(){this.registerHandler(S.profile.get,async e=>{let t=W(e.payload.clientId,`profile.get`),n=await this.bus.request(J.get,{clientId:t,name:e.payload.name});e.setResult({profile:n.record})})}registerUpdateHandler(){this.registerHandler(S.profile.update,async e=>{let t=W(e.payload.clientId,`profile.update`),{name:n,description:r}=e.payload,i=await this.bus.request(J.get,{clientId:t,name:n});if(i.record===null)throw Error(`Profile '${n}' not found for client '${t}'`);let a={...i.record,description:r===void 0?i.record.description:r,updatedAt:Date.now()};await this.bus.request(J.set,a),e.setResult({profile:a})})}registerDeleteHandler(){this.registerHandler(S.profile.delete,async e=>{let r=W(e.payload.clientId,`profile.delete`),{name:i}=e.payload,a=await this.bus.request(J.get,{clientId:r,name:i});a.record!==null&&(Ct(n.join(this.clientsBasePath,r,`profiles`),a.record.configDir,`profile.delete`),await t.rm(a.record.configDir,{recursive:!0,force:!0}));let o=await this.bus.request(J.delete,{clientId:r,name:i});e.setResult({success:o.success})})}registerSetDefaultHandler(){this.registerHandler(S.profile.setDefault,async e=>{let t=W(e.payload.clientId,`profile.setDefault`),{name:n}=e.payload,r=await this.bus.request(J.setDefault,{clientId:t,name:n});if(r.record===null)throw Error(`Profile '${n}' not found for client '${t}'`);e.setResult({profile:r.record})})}};function Tt(e){return{subject:`sessionConfig.setup`,$meta:{namespace:`client:${e}`,isRequest:!0,local:!1,channel:!1}}}function Et(e){return{subject:`sessionConfig.destroy`,$meta:{namespace:`client:${e}`,isRequest:!0,local:!1,channel:!1}}}const Dt=()=>Date.now();function Ot(){let e=w.platform();if(e===`darwin`||e===`linux`||e===`win32`)return e;throw Error(`client.sessionConfig does not support platform '${e}'`)}function kt(e,t,r){let i=ce.safeParse(t);if(!i.success)throw Error(`${r} received an unsafe session ID`);let a=n.resolve(e),o=n.resolve(a,i.data),s=n.relative(a,o);if(s===``||!s.startsWith(`..`)&&!n.isAbsolute(s))return o;throw Error(`${r} refused to access path outside client sessions root`)}var At=class extends l{clientsBasePath;getNow;constructor(e,t,n=Dt){super(e),this.clientsBasePath=t,this.getNow=n}async onInit(){this.registerHandler(S.sessionConfig.create,async e=>{let{clientId:n,sessionId:r,profileName:i,baseConfigDir:a,projectDir:o,configInheritance:s=`full`}=e.payload,c=W(n,`sessionConfig.create`),l=this.resolveClientSessionDir(c,r,`sessionConfig.create`);await t.mkdir(l,{recursive:!0});try{let t=await this.resolveBaseConfigDir(c,l,i,a),n=Tt(c),r=await this.bus.requestOptional(n,{sessionDir:l,baseConfigDir:t,projectDir:o,platform:Ot(),configInheritance:s}),u=r.handled?r.data.env??{}:{};await T(this.bus,{clientId:c,configDir:l,phase:`session-create`,projectDir:o}),e.setResult({sessionDir:l,env:u})}catch(e){throw await t.rm(l,{recursive:!0,force:!0}),e}}),this.registerHandler(S.sessionConfig.destroy,async e=>{let{clientId:t,sessionId:n}=e.payload,r=W(t,`sessionConfig.destroy`),i=this.resolveClientSessionDir(r,n,`sessionConfig.destroy`);await this.destroyClientSessionDir(r,i),e.setResult({success:!0})}),this.registerHandler(S.sessionConfig.cleanup,async e=>{let{clientId:t}=e.payload,n=t===void 0?void 0:W(t,`sessionConfig.cleanup`),r=await this.cleanupOrphanedDirs(n);e.setResult({removed:r})}),this.registerHandler(de.closed,async e=>{await this.destroySessionDirsForSessionId(e.payload.sessionId)}),await this.cleanupOrphanedDirs()}async resolveBaseConfigDir(e,t,n,r){if(r!==void 0)return r;if(n!==void 0){let t=await this.bus.request(J.get,{clientId:e,name:n});if(t.record!==null)return t.record.configDir;throw Error(`Profile '${n}' not found for client '${e}'`)}let i=(await this.bus.request(J.list,{clientId:e})).records.find(e=>e.isDefault);return i?i.configDir:t}async cleanupOrphanedDirs(e){let r=[],i=this.getNow(),a=e===void 0?await this.listClientIds():[e];return await Promise.all(a.map(async e=>{let a=n.join(this.clientsBasePath,e,`sessions`),o=await t.readdir(a).catch(()=>[]);await Promise.all(o.map(async n=>{try{let o=kt(a,n,`sessionConfig.cleanup`),s=await t.stat(o),c=s.birthtimeMs>0?s.birthtimeMs:s.ctimeMs;s.isDirectory()&&i-c>36e5&&!await this.isActiveSession(n)&&(await this.destroyClientSessionDir(e,o),r.push(o))}catch{}}))})),r}async destroySessionDirsForSessionId(e){if(!ce.safeParse(e).success)return;let t=await this.listClientIds();await Promise.all(t.map(async t=>{let n=this.resolveClientSessionDir(t,e,`session.closed`);await this.destroyClientSessionDir(t,n)}))}async destroyClientSessionDir(e,n){await t.stat(n).then(e=>e.isDirectory(),e=>{let t=e.code;if(t===`ENOENT`||t===`ENOTDIR`)return!1;throw e})&&(await this.bus.requestOptional(Et(e),{sessionDir:n,platform:Ot()}),await t.rm(n,{recursive:!0,force:!0}))}async isActiveSession(e){let t=await this.bus.requestOptional(de.get,{sessionId:e});return t.handled&&t.data.session?.status===`active`}resolveClientSessionDir(e,t,r){return kt(n.join(this.clientsBasePath,e,`sessions`),t,r)}async listClientIds(){return(await t.readdir(this.clientsBasePath,{withFileTypes:!0}).catch(()=>[])).filter(e=>e.isDirectory()).map(e=>e.name)}};const jt=new Set([`hook.received`,`hook.handle`]);function Mt(e,t){return a.registerNamespace(i(`client:${e}`,{"hook.received":U,"hook.handle":{request:U,response:tt},...t})).subjects}function Nt(e,t){let n=Object.keys(t).filter(e=>jt.has(e));if(n.length===0)return;let r=n.join(`, `);throw Error([`[createClientNamespace] additionalSchemas for client:${e}`,`cannot override reserved shared hook subjects: ${r}`].join(` `))}function Pt(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n!=`object`||!n||!(e in n))return!1;n=n[e]}return!0}function Ft(e,t,n){let r=Object.keys(n).filter(e=>!Pt(t,e));if(r.length!==0)throw Error(`[createClientNamespace] client:${e} was already registered without required subjects: ${r.join(`, `)}`)}function It(e,t){let n=W(e,`createClientNamespace`),r=t??{};Nt(n,r);let i=Mt(n,r);return Ft(n,i,r),{namespaceDomain:`client:${n}`,subjects:i}}const Y=g(`client_runtimes`,e=>({id:e.text(`id`).primaryKey(),clientId:e.text(`client_id`).notNull(),status:e.text(`status`).notNull(),supervisorSessionId:e.text(`supervisor_session_id`),pid:e.int4(`pid`),parentPid:e.int4(`parent_pid`),adapterSessionId:e.text(`adapter_session_id`),sessionId:e.text(`session_id`),cwd:e.text(`cwd`),argv:e.jsonCol(`argv`),metadata:e.jsonCol(`metadata`),observedAt:e.epochMs(`observed_at`).notNull(),createdAt:e.epochMs(`created_at`).notNull(),updatedAt:e.epochMs(`updated_at`).notNull()}),{sqlite:e=>[u(`idx_client_runtimes_supervisor_session_id`).on(e.supervisorSessionId),u(`idx_client_runtimes_pid_client_id`).on(e.pid,e.clientId),u(`idx_client_runtimes_adapter_session_id_client_id`).on(e.adapterSessionId,e.clientId)],postgres:e=>[p(`idx_client_runtimes_supervisor_session_id`).on(e.supervisorSessionId),p(`idx_client_runtimes_pid_client_id`).on(e.pid,e.clientId),p(`idx_client_runtimes_adapter_session_id_client_id`).on(e.adapterSessionId,e.clientId)]}),Lt=Y.sqlite,Rt=Y.postgres,zt=ee({clientRuntimes:Lt},{clientRuntimes:Rt}),Bt=new Set(qe);function Vt(e){if(!Bt.has(e.status))throw Error(`Unknown ClientRuntimeStatus in DB: '${e.status}'`);return{clientRuntimeId:e.id,clientId:e.clientId,status:e.status,supervisorSessionId:e.supervisorSessionId??void 0,pid:e.pid??void 0,parentPid:e.parentPid??void 0,adapterSessionId:e.adapterSessionId??void 0,sessionId:e.sessionId??void 0,cwd:e.cwd??void 0,argv:e.argv??void 0,metadata:e.metadata??void 0,observedAt:e.observedAt,createdAt:e.createdAt,updatedAt:e.updatedAt}}function Ht(e,t,n){let{clientRuntimes:r}=v(t,zt),i=e.on(V.upsert,async e=>{let n=e.payload,i={clientId:n.clientId,status:n.status,supervisorSessionId:n.supervisorSessionId??null,pid:n.pid??null,parentPid:n.parentPid??null,adapterSessionId:n.adapterSessionId??null,sessionId:n.sessionId??null,cwd:n.cwd??null,argv:n.argv??null,metadata:n.metadata??null,observedAt:n.observedAt,updatedAt:n.updatedAt};await t.insert(r).values({id:n.clientRuntimeId,createdAt:n.createdAt,...i}).onConflictDoUpdate({target:r.id,set:i,setWhere:re(ie`excluded.updated_at`,r.updatedAt)}),e.setResult({success:!0})}),a=e.on(V.loadAll,async e=>{let n=await t.select().from(r);e.setResult({records:n.map(Vt)})});return()=>{i(),a()}}const Ut=g(`client_binary_versions`,e=>({id:e.text(`id`).primaryKey(),clientId:e.text(`client_id`).notNull(),version:e.text(`version`).notNull(),installPath:e.text(`install_path`).notNull(),installedAt:e.epochMs(`installed_at`).notNull(),createdAt:e.epochMs(`created_at`).notNull()}),{sqlite:e=>[d(`uq_client_binary_versions_client_version`).on(e.clientId,e.version)],postgres:e=>[m(`uq_client_binary_versions_client_version`).on(e.clientId,e.version)]}),Wt=Ut.sqlite,Gt=g(`client_binary_state`,e=>({clientId:e.text(`client_id`).primaryKey(),activeVersion:e.text(`active_version`),updatedAt:e.epochMs(`updated_at`).notNull()})),Kt=Gt.sqlite,qt=Ut.postgres,Jt=Gt.postgres,X=ee({clientBinaryVersions:Wt,clientBinaryState:Kt},{clientBinaryVersions:qt,clientBinaryState:Jt});function Z(e){return{id:e.id,clientId:e.clientId,version:e.version,installPath:e.installPath,installedAt:e.installedAt,createdAt:e.createdAt}}function Q(e){return{clientId:e.clientId,activeVersion:e.activeVersion??null,updatedAt:e.updatedAt}}function Yt(e){return{id:e.id,clientId:e.clientId,version:e.version,installPath:e.installPath,installedAt:e.installedAt,createdAt:e.createdAt}}async function Xt(e,t,n){await e.insert(n).values(Yt(t)).onConflictDoNothing({target:[n.clientId,n.version]})}function Zt(e,t,n){return{clientId:e,activeVersion:t,updatedAt:n}}async function Qt(e,t,n,r,i){await e.insert(i).values(Zt(t,n,r)).onConflictDoUpdate({target:i.clientId,set:{activeVersion:n,updatedAt:r}})}async function $t(e,t){let{clientBinaryVersions:n}=v(e,X);await Xt(e,t,n)}async function en(e,t,n,r){let{clientBinaryVersions:i,clientBinaryState:a}=v(e,X);return _(e,async e=>{let[o]=await e.select().from(a).where(b(a.clientId,t.clientId)).limit(1),s=o?.activeVersion??null;return await Xt(e,t,i),n?(await Qt(e,t.clientId,t.version,r,a),{previousActiveVersion:s,activeVersion:t.version}):{previousActiveVersion:s,activeVersion:s}})}async function tn(e,t){let{clientBinaryVersions:n,clientBinaryState:r}=v(e,X);return _(e,async e=>{let[i]=await e.select().from(r).where(b(r.clientId,t)).limit(1),a=await e.select().from(n).where(b(n.clientId,t));return{state:i?Q(i):null,versions:a.map(Z)}})}async function nn(e){let{clientBinaryVersions:t,clientBinaryState:n}=v(e,X);return _(e,async e=>{let r=await e.select().from(n),i=await e.select().from(t);return{states:r.map(Q),versions:i.map(Z)}})}async function rn(e,t){let{clientBinaryState:n}=v(e,X),r={clientId:t.clientId,activeVersion:t.activeVersion??null,updatedAt:t.updatedAt};await e.insert(n).values(r).onConflictDoUpdate({target:n.clientId,set:r})}async function an(e,t,n,r){let{clientBinaryState:i}=v(e,X);return _(e,async e=>{let[a]=await e.select().from(i).where(b(i.clientId,t)).limit(1),o=a?.activeVersion??null;return await Qt(e,t,n,r,i),{previousActiveVersion:o,activeVersion:n}})}async function on(e,t,n,r){let{clientBinaryVersions:i,clientBinaryState:a}=v(e,X);return _(e,async e=>{let[o]=await e.select().from(a).where(b(a.clientId,t)).limit(1),s=o?.activeVersion??null;if(!te(await e.delete(i).where(y(b(i.clientId,t),b(i.version,n)))))return{removedVersion:null,previousActiveVersion:s,activeVersion:s};await e.update(a).set({activeVersion:null,updatedAt:r}).where(y(b(a.clientId,t),b(a.activeVersion,n)));let[c]=await e.select().from(a).where(b(a.clientId,t)).limit(1);return{removedVersion:n,previousActiveVersion:s,activeVersion:c?.activeVersion??null}})}function sn(e,t,n){let{clientBinaryVersions:r,clientBinaryState:i}=v(t,X),a=[e.on(N.insertVersion,async e=>{await $t(t,e.payload),e.setResult({success:!0})}),e.on(N.recordInstalledVersion,async e=>{let{versionRecord:n,makeActive:r,updatedAt:i}=e.payload,a=await en(t,n,r,i);e.setResult(a)}),e.on(N.listVersions,async e=>{let n=await t.select().from(r).where(b(r.clientId,e.payload.clientId));e.setResult({versions:n.map(Z)})}),e.on(N.getSnapshot,async e=>{let{state:n,versions:r}=await tn(t,e.payload.clientId);e.setResult({state:n,versions:r})}),e.on(N.loadAllVersions,async e=>{let n=await t.select().from(r);e.setResult({versions:n.map(Z)})}),e.on(N.upsertState,async e=>{await rn(t,e.payload),e.setResult({success:!0})}),e.on(N.setActiveVersion,async e=>{let{clientId:n,activeVersion:r,updatedAt:i}=e.payload,a=await an(t,n,r,i);e.setResult(a)}),e.on(N.getState,async e=>{let[n]=await t.select().from(i).where(b(i.clientId,e.payload.clientId)).limit(1);e.setResult({state:n?Q(n):null})}),e.on(N.loadAllState,async e=>{let n=await t.select().from(i);e.setResult({states:n.map(Q)})}),e.on(N.loadSnapshot,async e=>{let{states:n,versions:r}=await nn(t);e.setResult({states:n,versions:r})}),e.on(N.removeVersionAndClearActive,async e=>{let{clientId:n,version:r,updatedAt:i}=e.payload,a=await on(t,n,r,i);e.setResult(a)})];return()=>{for(let e of a)e()}}const cn=g(`client_profiles`,e=>({id:e.text(`id`).primaryKey(),clientId:e.text(`client_id`).notNull(),name:e.text(`name`).notNull(),description:e.text(`description`),configDir:e.text(`config_dir`).notNull(),isDefault:e.bool(`is_default`).notNull().default(!1),createdAt:e.epochMs(`created_at`).notNull(),updatedAt:e.epochMs(`updated_at`).notNull()}),{sqlite:e=>[f(`uq_client_profiles_client_name`).on(e.clientId,e.name),f(`uq_client_profiles_default`).on(e.clientId).where(ie`${e.isDefault} = 1`)],postgres:e=>[h(`uq_client_profiles_client_name`).on(e.clientId,e.name),h(`uq_client_profiles_default`).on(e.clientId).where(ie`${e.isDefault} = true`)]}),ln=cn.sqlite,un=cn.postgres,dn=ee({clientProfiles:ln},{clientProfiles:un});function $(e){return{id:e.id,clientId:e.clientId,name:e.name,description:e.description??null,configDir:e.configDir,isDefault:e.isDefault,createdAt:e.createdAt,updatedAt:e.updatedAt}}async function fn(e,t,n){let{clientProfiles:r}=v(e,dn),i=Date.now();return _(e,async e=>{let[a]=await e.select().from(r).where(y(b(r.clientId,t),b(r.name,n))).limit(1);if(a===void 0)return null;await e.update(r).set({isDefault:!1,updatedAt:i}).where(y(b(r.clientId,t),b(r.isDefault,!0))),await e.update(r).set({isDefault:!0,updatedAt:i}).where(y(b(r.clientId,t),b(r.name,n)));let[o]=await e.select().from(r).where(y(b(r.clientId,t),b(r.name,n))).limit(1);return o===void 0?null:$(o)})}function pn(e,t,n){let{clientProfiles:r}=v(t,dn),i=[e.on(J.get,async e=>{let{clientId:n,name:i}=e.payload,[a]=await t.select().from(r).where(y(b(r.clientId,n),b(r.name,i))).limit(1);e.setResult({record:a?$(a):null})}),e.on(J.getById,async e=>{let[n]=await t.select().from(r).where(b(r.id,e.payload.id)).limit(1);e.setResult({record:n?$(n):null})}),e.on(J.list,async e=>{let n=await t.select().from(r).where(b(r.clientId,e.payload.clientId));e.setResult({records:n.map($)})}),e.on(J.set,async e=>{let n=e.payload,i={id:n.id,clientId:n.clientId,name:n.name,description:n.description??null,configDir:n.configDir,isDefault:n.isDefault,createdAt:n.createdAt,updatedAt:n.updatedAt};await t.insert(r).values(i).onConflictDoUpdate({target:r.id,set:{name:n.name,description:n.description??null,configDir:n.configDir,isDefault:n.isDefault,updatedAt:n.updatedAt}}),e.setResult({success:!0})}),e.on(J.delete,async e=>{let{clientId:n,name:i}=e.payload,a=await t.delete(r).where(y(b(r.clientId,n),b(r.name,i)));e.setResult({success:te(a)})}),e.on(J.clearDefault,async e=>{await t.update(r).set({isDefault:!1,updatedAt:Date.now()}).where(y(b(r.clientId,e.payload.clientId),b(r.isDefault,!0))),e.setResult({success:!0})}),e.on(J.setDefault,async e=>{let{clientId:n,name:r}=e.payload,i=await fn(t,n,r);e.setResult({record:i})})];return()=>{for(let e of i)e()}}var mn=class{runtimeService;binaryManager;configPrimeService;profileService;sessionConfigService;constructor(e,t,n,r,i){this.runtimeService=e,this.binaryManager=t,this.configPrimeService=n,this.profileService=r,this.sessionConfigService=i}async init(){let e=(await Promise.allSettled([this.runtimeService.init(),this.binaryManager.init(),this.configPrimeService.init(),this.profileService.init(),this.sessionConfigService.init()])).filter(e=>e.status===`rejected`);if(e.length>0){for(let t=1;t<e.length;t++)console.warn(`[ClientsCoreService] Multiple init failures, secondary:`,e[t].reason);throw e[0].reason}}async destroy(){let e=(await Promise.allSettled([this.runtimeService.destroy(),this.binaryManager.destroy(),this.configPrimeService.destroy(),this.profileService.destroy(),this.sessionConfigService.destroy()])).filter(e=>e.status===`rejected`);for(let t of e)console.warn(`[ClientsCoreService] destroy failure:`,t.reason)}};const hn=o(`makaio.clients-core`);function gn(e){let t=[],n=()=>{for(let e of[...t].reverse())e()};try{for(let n of e)t.push(n())}catch(e){throw n(),e}return n}function _n(e={}){let{definitions:t=[],strategyDependencies:r,postInstallHandlers:i}=e,a=[...t];return{name:`makaio.clients-core`,displayName:`Clients Core`,version:`0.1.0`,critical:!0,namespaces:[M,B,q],storage:{registerHandlers:ne((e,t,n)=>gn([()=>Ht(e,t,n),()=>sn(e,t,n),()=>pn(e,t,n)]))},create:e=>{let t=new P(a),o=n.join(e.makaioHome,`clients`),s=new Ge(e.bus,{basePath:n.join(e.makaioHome,`binaries`),configBasePath:o,postInstallHandlers:i},t,r),c=new wt(e.bus,o),l=new At(e.bus,o);return new mn(new gt(e.bus),s,new St(e.bus),c,l)}}}async function vn(e){let t=await a.requestOptional(S.resolveBinary,{clientId:e});return t.handled?t.data:void 0}function yn(e,t,n){return[...n??[],e,...t].map(Sn).join(` `)}function bn(e,t,n,r,i){return yn(e,[...i??[],...t.split(` `),n],r)}function xn(e){return e.runtimeCapabilities.hookEvents.filter(e=>e.frameworkSubject!==void 0).map(e=>({eventName:e.name,mode:e.mode}))}function Sn(e){return/^[A-Za-z0-9_@%+=:,./-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`}export{ut as AbsolutePathSchema,he as BinaryNotFoundError,qe as CLIENT_RUNTIME_STATUSES,ge as ClientAccountRegistry,He as ClientBinaryJobRunner,Ge as ClientBinaryManager,A as ClientBinaryStateRecordSchema,M as ClientBinaryStorageNamespace,N as ClientBinaryStorageSubjects,k as ClientBinaryVersionRecordSchema,Ee as ClientBinaryVersionResolver,St as ClientConfigPrimeService,P as ClientDefinitionRegistry,tt as ClientHookHandleResponseSchema,G as ClientProfileRecordSchema,wt as ClientProfileService,q as ClientProfileStorageNamespace,J as ClientProfileStorageSubjects,Ze as ClientRuntimeRegistry,gt as ClientRuntimeService,B as ClientRuntimeStorageNamespace,V as ClientRuntimeStorageSubjects,At as ClientSessionConfigService,oe as ClientSubjects,mt as ClientWiringAggregatedResultSchema,ft as ClientWiringApplyResponseSchema,C as ClientWiringEntrySchema,dt as ClientWiringListResponseSchema,pt as ClientWiringRemoveResponseSchema,mn as ClientsCoreService,hn as ClientsCoreToken,et as DEFAULT_HOOK_HANDLE_TIMEOUT_MS,U as RawClientHookPayloadSchema,z as RuntimeRecordSchema,ht as assertAbsoluteProjectDir,fe as atomicModifyFile,yn as buildClientCommand,at as buildClientSessionBase,bn as buildHookCommand,W as canonicalizeClientId,Y as clientRuntimesDual,It as createClientNamespace,lt as createClientWiringListSubjectDef,ct as createClientWiringSubjectDef,_n as createClientsCorePackage,nt as createRawClientHookHandleSubject,$e as createRawClientHookReceivedSubject,xn as deriveSessionEventDescriptors,ot as emitBestEffort,D as isPathWithinBase,it as pickNonEmptyString,rt as pickNonEmptyStringValue,sn as registerDrizzleClientBinaryStorage,pn as registerDrizzleProfileStorage,Ht as registerDrizzleRuntimeStorage,gn as registerStorageHandlersWithRollback,O as resolveAndValidateBasePath,vn as resolveClientBinary};
|