openmeld 0.3.222 → 0.3.224

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.
Files changed (177) hide show
  1. package/dist/{add-me-membership-Wc69O6rA.js → add-me-membership-CGISMRPF.js} +2 -2
  2. package/dist/{add-me-membership-Wc69O6rA.js.map → add-me-membership-CGISMRPF.js.map} +1 -1
  3. package/dist/{agents-B8zhQnGw.js → agents-CR7BebgO.js} +12 -12
  4. package/dist/{agents-B8zhQnGw.js.map → agents-CR7BebgO.js.map} +1 -1
  5. package/dist/{api-client-foundation-DTiFoGpI.js → api-client-foundation-CqbIn_de.js} +1 -1
  6. package/dist/{api-client-foundation-DnJ_JYli.js → api-client-foundation-DpVwrgh-.js} +3 -3
  7. package/dist/{api-client-foundation-DnJ_JYli.js.map → api-client-foundation-DpVwrgh-.js.map} +1 -1
  8. package/dist/auth-session-BJfKu74u.js +4 -0
  9. package/dist/{auth-session-nhS8jyux.js → auth-session-uEk_Tx6T.js} +8 -8
  10. package/dist/auth-session-uEk_Tx6T.js.map +1 -0
  11. package/dist/{base-url-CMBApK1J.js → base-url-DXrUiSMI.js} +1 -1
  12. package/dist/{base-url-D7uE_xTo.js → base-url-DvjOkKPs.js} +2 -2
  13. package/dist/{base-url-D7uE_xTo.js.map → base-url-DvjOkKPs.js.map} +1 -1
  14. package/dist/{channel-ggx0o_aG.js → channel-B2fD2_be.js} +4 -4
  15. package/dist/{channel-ggx0o_aG.js.map → channel-B2fD2_be.js.map} +1 -1
  16. package/dist/{cli-binary-manifest-DiUulkp0.js → cli-binary-manifest-CT5X05lk.js} +30 -4
  17. package/dist/cli-binary-manifest-CT5X05lk.js.map +1 -0
  18. package/dist/{command-Bz9x7V2T.js → command-CQ9XRwqf.js} +22 -165
  19. package/dist/command-CQ9XRwqf.js.map +1 -0
  20. package/dist/{computer-connection-M3N6plkj.js → computer-connection-Dm7iTnRK.js} +2 -2
  21. package/dist/{computer-connection-M3N6plkj.js.map → computer-connection-Dm7iTnRK.js.map} +1 -1
  22. package/dist/{computer-connection-review-DY5BK_27.js → computer-connection-review-RHAoddSS.js} +6 -6
  23. package/dist/{computer-connection-review-DY5BK_27.js.map → computer-connection-review-RHAoddSS.js.map} +1 -1
  24. package/dist/{computer-disconnect-DR1WDSPK.js → computer-disconnect-BWRsge_2.js} +10 -10
  25. package/dist/{computer-disconnect-DR1WDSPK.js.map → computer-disconnect-BWRsge_2.js.map} +1 -1
  26. package/dist/{computer-setup-continuation-2gs8z-nB.js → computer-setup-continuation-BOCRH0qq.js} +4 -4
  27. package/dist/{computer-setup-continuation-2gs8z-nB.js.map → computer-setup-continuation-BOCRH0qq.js.map} +1 -1
  28. package/dist/context-Bdh3nAzw.js +162 -0
  29. package/dist/context-Bdh3nAzw.js.map +1 -0
  30. package/dist/{control-plane-e3W6PD2M.js → control-plane-rTE2rHZ5.js} +2 -2
  31. package/dist/{control-plane-e3W6PD2M.js.map → control-plane-rTE2rHZ5.js.map} +1 -1
  32. package/dist/{daemon-device-id-DWO9_QW6.js → daemon-device-id-B1Af2Zmn.js} +344 -36
  33. package/dist/daemon-device-id-B1Af2Zmn.js.map +1 -0
  34. package/dist/{daemon-frame-transport-D2-tazuK.js → daemon-frame-transport-WiB73yhT.js} +519 -12
  35. package/dist/daemon-frame-transport-WiB73yhT.js.map +1 -0
  36. package/dist/{daemon-lifecycle-journal-DyKx1xzm.js → daemon-lifecycle-journal-CDZLWgMj.js} +11 -11
  37. package/dist/daemon-lifecycle-journal-CDZLWgMj.js.map +1 -0
  38. package/dist/{daemon-runtime-lease-BUr4qsLo.js → daemon-runtime-lease-1LMeZ6IS.js} +2 -2
  39. package/dist/{daemon-runtime-lease-BUr4qsLo.js.map → daemon-runtime-lease-1LMeZ6IS.js.map} +1 -1
  40. package/dist/{daemon-runtime-lease-C9X8xV_F.js → daemon-runtime-lease-Bz0ucJj3.js} +1 -1
  41. package/dist/{daemon-service-contract-BpOBMGX0.js → daemon-service-contract-GLmAxsq-.js} +4 -4
  42. package/dist/{daemon-service-contract-BpOBMGX0.js.map → daemon-service-contract-GLmAxsq-.js.map} +1 -1
  43. package/dist/{daemon-service-manager-HL4VKbIU.js → daemon-service-manager-C8RUCMDo.js} +9 -7
  44. package/dist/daemon-service-manager-C8RUCMDo.js.map +1 -0
  45. package/dist/{daemon-service-manager-B-QrDe5p.js → daemon-service-manager-CU-79a4z.js} +1 -1
  46. package/dist/{daemon-service-runtime-bKt0YjC7.js → daemon-service-runtime-CBJtgM4P.js} +397 -51
  47. package/dist/daemon-service-runtime-CBJtgM4P.js.map +1 -0
  48. package/dist/{daemon-service-update-coordinator-D8O1uTtu.js → daemon-service-update-coordinator-0LB_XGVZ.js} +48 -33
  49. package/dist/daemon-service-update-coordinator-0LB_XGVZ.js.map +1 -0
  50. package/dist/{daemon-state-B44aq2nm.js → daemon-state-Ca0WK5x0.js} +3 -3
  51. package/dist/{daemon-state-B44aq2nm.js.map → daemon-state-Ca0WK5x0.js.map} +1 -1
  52. package/dist/{dist-B07ziN_u.js → dist-BeJcIdCZ.js} +25 -17
  53. package/dist/dist-BeJcIdCZ.js.map +1 -0
  54. package/dist/dist-C32frPV2.js +4 -0
  55. package/dist/{dist-B2EauBG6.js → dist-YbTZ-Y-2.js} +16 -12
  56. package/dist/dist-YbTZ-Y-2.js.map +1 -0
  57. package/dist/{elapsed-time-Ooo4IC25.js → elapsed-time-q8lSPcfm.js} +6 -6
  58. package/dist/{elapsed-time-Ooo4IC25.js.map → elapsed-time-q8lSPcfm.js.map} +1 -1
  59. package/dist/{entry-DeIRMCiW.js → entry-CpS6tnIk.js} +12 -12
  60. package/dist/{entry-DeIRMCiW.js.map → entry-CpS6tnIk.js.map} +1 -1
  61. package/dist/{installation-inventory-DThnBEhV.js → installation-inventory-C5FsAvrf.js} +5 -5
  62. package/dist/{installation-inventory-DThnBEhV.js.map → installation-inventory-C5FsAvrf.js.map} +1 -1
  63. package/dist/{installer-D2bWZT88.js → installer-054NLJg6.js} +2 -2
  64. package/dist/{installer-D2bWZT88.js.map → installer-054NLJg6.js.map} +1 -1
  65. package/dist/io-DT66typ4.js +16 -0
  66. package/dist/io-DT66typ4.js.map +1 -0
  67. package/dist/{local-components-B6SCXZf9.js → local-components-DleLEzSU.js} +2 -1
  68. package/dist/local-components-DleLEzSU.js.map +1 -0
  69. package/dist/{lock-Bsl_ElWy.js → lock-iue1J2xy.js} +8 -5
  70. package/dist/lock-iue1J2xy.js.map +1 -0
  71. package/dist/{cli-space-api-CQtKu9Zt.js → meta-api-B1k3mwHN.js} +203 -19
  72. package/dist/meta-api-B1k3mwHN.js.map +1 -0
  73. package/dist/{openmeld-BQy0nMox.js → openmeld-BFO3sfC_.js} +93 -1027
  74. package/dist/openmeld-BFO3sfC_.js.map +1 -0
  75. package/dist/openmeld-dev.js +1 -1
  76. package/dist/{openmeld-environment-target-B6HqY0_a.js → openmeld-environment-target-BBn5Ko6p.js} +3 -3
  77. package/dist/{openmeld-environment-target-B6HqY0_a.js.map → openmeld-environment-target-BBn5Ko6p.js.map} +1 -1
  78. package/dist/{openmeld-maintenance-worker-BSODPHbn.js → openmeld-maintenance-worker-Ce4ehQ-c.js} +15 -14
  79. package/dist/openmeld-maintenance-worker-Ce4ehQ-c.js.map +1 -0
  80. package/dist/{openmeld-tools-update-join-BfY0GnDs.js → openmeld-tools-update-join-D24llJ9L.js} +4 -4
  81. package/dist/{openmeld-tools-update-join-BfY0GnDs.js.map → openmeld-tools-update-join-D24llJ9L.js.map} +1 -1
  82. package/dist/{openmeld-tools-update-process-frame-B-XB4dmO.js → openmeld-tools-update-process-frame-BtFKp70p.js} +2 -2
  83. package/dist/{openmeld-tools-update-process-frame-B-XB4dmO.js.map → openmeld-tools-update-process-frame-BtFKp70p.js.map} +1 -1
  84. package/dist/{openmeld-tools-update-process-frame-j-RXwFsK.js → openmeld-tools-update-process-frame-DbEZ3fEh.js} +1 -1
  85. package/dist/openmeld.js +9 -5
  86. package/dist/openmeld.js.map +1 -1
  87. package/dist/{prepare-provider-runtime-CWZcuMF6.js → prepare-provider-runtime-MB-BxOgt.js} +3342 -1327
  88. package/dist/prepare-provider-runtime-MB-BxOgt.js.map +1 -0
  89. package/dist/{prepare-session-executor-CkDxstsf.js → prepare-session-executor-zvSZ6jqy.js} +29 -28
  90. package/dist/prepare-session-executor-zvSZ6jqy.js.map +1 -0
  91. package/dist/{presenter-BcxiQyJg.js → presenter-MJ5YgsOT.js} +3 -13
  92. package/dist/presenter-MJ5YgsOT.js.map +1 -0
  93. package/dist/{process-channel-BQwtOlRc.js → process-channel-CgbduFCz.js} +2 -2
  94. package/dist/{process-channel-BQwtOlRc.js.map → process-channel-CgbduFCz.js.map} +1 -1
  95. package/dist/process-environment-BWSFeUu6.js +49 -0
  96. package/dist/process-environment-BWSFeUu6.js.map +1 -0
  97. package/dist/process-identity-BQLdaZdB.js +190 -0
  98. package/dist/process-identity-BQLdaZdB.js.map +1 -0
  99. package/dist/process-launch-B0pHlkV_.js +173 -0
  100. package/dist/process-launch-B0pHlkV_.js.map +1 -0
  101. package/dist/{published-production-safety-dp-fOmmB.js → published-production-safety-C40hKrBA.js} +2 -2
  102. package/dist/{published-production-safety-dp-fOmmB.js.map → published-production-safety-C40hKrBA.js.map} +1 -1
  103. package/dist/{runtime-BYaFkkLK.js → runtime-D6jItuQ-.js} +155 -702
  104. package/dist/runtime-D6jItuQ-.js.map +1 -0
  105. package/dist/{runtime-agent-controller-reporting-submission-BUUub9_1.js → runtime-agent-controller-reporting-submission-D9ysbi7R.js} +9 -9
  106. package/dist/{runtime-agent-controller-reporting-submission-BUUub9_1.js.map → runtime-agent-controller-reporting-submission-D9ysbi7R.js.map} +1 -1
  107. package/dist/{runtime-reporting-health-state-BgwfrH7f.js → runtime-reporting-health-state-DA-_vW-n.js} +2210 -60
  108. package/dist/runtime-reporting-health-state-DA-_vW-n.js.map +1 -0
  109. package/dist/{runtime-transport-Cc_RN-PL.js → runtime-transport-YIYHSJPn.js} +99 -14
  110. package/dist/runtime-transport-YIYHSJPn.js.map +1 -0
  111. package/dist/{service-CfO38_a-.js → service-Dz2MsvGr.js} +126 -550
  112. package/dist/service-Dz2MsvGr.js.map +1 -0
  113. package/dist/{service-account-admission-Dy2W3n3_.js → service-account-admission-BfdJ-kKR.js} +18 -10
  114. package/dist/service-account-admission-BfdJ-kKR.js.map +1 -0
  115. package/dist/{service-account-authorization-DKpIpxXo.js → service-account-authorization-DZbUOD29.js} +6 -6
  116. package/dist/{service-account-authorization-DKpIpxXo.js.map → service-account-authorization-DZbUOD29.js.map} +1 -1
  117. package/dist/{service-account-control-CCPQAZzn.js → service-account-control-DCMOKXDT.js} +16 -16
  118. package/dist/service-account-control-DCMOKXDT.js.map +1 -0
  119. package/dist/{service-control-capabilities-C9UHSMPz.js → service-control-capabilities-3_bdeHXu.js} +1 -1
  120. package/dist/{service-control-capabilities-xGylBNoH.js → service-control-capabilities-Bb738e_d.js} +19 -15
  121. package/dist/service-control-capabilities-Bb738e_d.js.map +1 -0
  122. package/dist/{service-control-carrier-capability-DDNyE5cB.js → service-control-carrier-capability-gMk5gMKU.js} +11 -4
  123. package/dist/service-control-carrier-capability-gMk5gMKU.js.map +1 -0
  124. package/dist/{state-CQG3k9eh.js → state-GxF_KAM1.js} +4 -4
  125. package/dist/{state-CQG3k9eh.js.map → state-GxF_KAM1.js.map} +1 -1
  126. package/dist/{upgrade-D5FxGbh1.js → upgrade-DfJwCD5H.js} +52 -32
  127. package/dist/upgrade-DfJwCD5H.js.map +1 -0
  128. package/dist/upgrade-DgmYWeNu.js +4 -0
  129. package/dist/windows/openmeld-windows-process.exe +0 -0
  130. package/dist/windows-artifact-DJ9DKjfc.js +16 -0
  131. package/dist/windows-artifact-DJ9DKjfc.js.map +1 -0
  132. package/dist/windows-task-command-COu_6Ke3.js +74 -0
  133. package/dist/windows-task-command-COu_6Ke3.js.map +1 -0
  134. package/dist/windows-task-entry-CtRpUbiK.js +50 -0
  135. package/dist/windows-task-entry-CtRpUbiK.js.map +1 -0
  136. package/dist/{windows-user-task-Bx2yYnOM.js → windows-user-task-B8NcRg_u.js} +1 -1
  137. package/dist/{windows-user-task-CRGbKggi.js → windows-user-task-Io5QuEVR.js} +108 -51
  138. package/dist/windows-user-task-Io5QuEVR.js.map +1 -0
  139. package/package.json +12 -12
  140. package/skills/openmeld-cli/playbooks/space-ops.md +9 -3
  141. package/skills/openmeld-cli/references/commands.md +0 -1
  142. package/dist/auth-session-D8dbMpaK.js +0 -4
  143. package/dist/auth-session-nhS8jyux.js.map +0 -1
  144. package/dist/cli-binary-manifest-DiUulkp0.js.map +0 -1
  145. package/dist/cli-space-api-CQtKu9Zt.js.map +0 -1
  146. package/dist/command-Bz9x7V2T.js.map +0 -1
  147. package/dist/context-l_31Mn4X.js +0 -473
  148. package/dist/context-l_31Mn4X.js.map +0 -1
  149. package/dist/daemon-device-id-DWO9_QW6.js.map +0 -1
  150. package/dist/daemon-frame-transport-D2-tazuK.js.map +0 -1
  151. package/dist/daemon-lifecycle-journal-DyKx1xzm.js.map +0 -1
  152. package/dist/daemon-service-manager-HL4VKbIU.js.map +0 -1
  153. package/dist/daemon-service-runtime-bKt0YjC7.js.map +0 -1
  154. package/dist/daemon-service-update-coordinator-D8O1uTtu.js.map +0 -1
  155. package/dist/dist-B07ziN_u.js.map +0 -1
  156. package/dist/dist-B2EauBG6.js.map +0 -1
  157. package/dist/dist-DhWI1iyi.js +0 -4
  158. package/dist/local-components-B6SCXZf9.js.map +0 -1
  159. package/dist/lock-Bsl_ElWy.js.map +0 -1
  160. package/dist/openmeld-BQy0nMox.js.map +0 -1
  161. package/dist/openmeld-maintenance-worker-BSODPHbn.js.map +0 -1
  162. package/dist/prepare-provider-runtime-CWZcuMF6.js.map +0 -1
  163. package/dist/prepare-session-executor-CkDxstsf.js.map +0 -1
  164. package/dist/presenter-BcxiQyJg.js.map +0 -1
  165. package/dist/process-identity-CNus0e6E.js +0 -146
  166. package/dist/process-identity-CNus0e6E.js.map +0 -1
  167. package/dist/runtime-BYaFkkLK.js.map +0 -1
  168. package/dist/runtime-reporting-health-state-BgwfrH7f.js.map +0 -1
  169. package/dist/runtime-transport-Cc_RN-PL.js.map +0 -1
  170. package/dist/service-CfO38_a-.js.map +0 -1
  171. package/dist/service-account-admission-Dy2W3n3_.js.map +0 -1
  172. package/dist/service-account-control-CCPQAZzn.js.map +0 -1
  173. package/dist/service-control-capabilities-xGylBNoH.js.map +0 -1
  174. package/dist/service-control-carrier-capability-DDNyE5cB.js.map +0 -1
  175. package/dist/upgrade-D5FxGbh1.js.map +0 -1
  176. package/dist/upgrade-DhFEu0k6.js +0 -4
  177. package/dist/windows-user-task-CRGbKggi.js.map +0 -1
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { gt as systemDir, lt as resolveOpenMeldRootDir, s as releaseLock, t as acquireLock } from "./lock-Bsl_ElWy.js";
4
- import { d as getAuthSessionState, o as buildStoredAuthSessionIdentity, w as withAdmittedServiceSession } from "./auth-session-nhS8jyux.js";
5
- import { n as ensureDaemonRuntimePaths } from "./daemon-device-id-DWO9_QW6.js";
6
- import { o as serviceExecutionHostMethods, r as serveExecutionHost, s as serviceExecutionHostOwnerSchema, t as ExecutionHostError } from "./channel-ggx0o_aG.js";
7
- import { a as resolveBaseUrl } from "./base-url-D7uE_xTo.js";
8
- import { i as readProcessStartIdentity } from "./process-identity-CNus0e6E.js";
9
- import { i as readDaemonServiceContract } from "./daemon-service-contract-BpOBMGX0.js";
10
- import { n as resolveRuntimeContext } from "./context-l_31Mn4X.js";
11
- import { t as createPresenter } from "./presenter-BcxiQyJg.js";
12
- import { n as parentExecutionHostChannel } from "./process-channel-BQwtOlRc.js";
3
+ import { _t as systemDir, s as releaseLock, t as acquireLock, ut as resolveOpenMeldRootDir } from "./lock-iue1J2xy.js";
4
+ import { d as getAuthSessionState, o as buildStoredAuthSessionIdentity, w as withAdmittedServiceSession } from "./auth-session-uEk_Tx6T.js";
5
+ import { n as ensureDaemonRuntimePaths } from "./daemon-device-id-B1Af2Zmn.js";
6
+ import { i as readProcessStartIdentity } from "./process-identity-BQLdaZdB.js";
7
+ import { o as serviceExecutionHostMethods, r as serveExecutionHost, s as serviceExecutionHostOwnerSchema, t as ExecutionHostError } from "./channel-B2fD2_be.js";
8
+ import { a as resolveBaseUrl } from "./base-url-DvjOkKPs.js";
9
+ import { i as readDaemonServiceContract } from "./daemon-service-contract-GLmAxsq-.js";
10
+ import { n as resolveRuntimeContext } from "./context-Bdh3nAzw.js";
11
+ import { t as createPresenter } from "./presenter-MJ5YgsOT.js";
12
+ import { n as parentExecutionHostChannel } from "./process-channel-CgbduFCz.js";
13
13
  import { randomUUID } from "node:crypto";
14
14
  import { dirname, join, resolve } from "node:path";
15
15
  import { readFile } from "node:fs/promises";
@@ -196,7 +196,7 @@ function runExecutionHost(hostInstanceId) {
196
196
  ownership = verifiedOwnership;
197
197
  session = verified.session;
198
198
  await withAdmittedServiceSession(session, async () => {
199
- const { createExecutionHostRuntime, createExecutionHostResources } = await import("./runtime-BYaFkkLK.js");
199
+ const { createExecutionHostRuntime, createExecutionHostResources } = await import("./runtime-D6jItuQ-.js");
200
200
  const runtimePaths = await ensureDaemonRuntimePaths();
201
201
  const presenter = createPresenter(await resolveRuntimeContext({ view: "agent" }));
202
202
  runtime = await createExecutionHostRuntime({
@@ -250,4 +250,4 @@ function runExecutionHost(hostInstanceId) {
250
250
  //#endregion
251
251
  export { runExecutionHost };
252
252
 
253
- //# sourceMappingURL=entry-DeIRMCiW.js.map
253
+ //# sourceMappingURL=entry-CpS6tnIk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-DeIRMCiW.js","names":[],"sources":["../src/local-service/execution-host/identity.ts","../src/local-service/execution-host/ownership.ts","../src/local-service/execution-host/entry.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport type { ServiceExecutionHostIdentity } from \"@openmeld/schemas\";\nimport {\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n} from \"../../config/auth-session\";\nimport { resolveBaseUrl } from \"../../config/base-url\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { resolveOpenMeldRootDir } from \"../../config/paths\";\nimport { readProcessStartIdentity } from \"../../system/process-identity\";\nimport { ExecutionHostError } from \"./channel\";\n\nexport async function validateExecutionHostIdentity(\n identity: ServiceExecutionHostIdentity\n) {\n if (\n process.ppid !== identity.parentPid ||\n (process.platform !== \"win32\" &&\n readProcessStartIdentity(process.ppid) !==\n identity.parentProcessStartedAt) ||\n resolve(resolveOpenMeldRootDir()) !== resolve(identity.stateRoot)\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"The Host's parent or installation changed.\"\n );\n }\n const [auth, contract, gateway] = await Promise.all([\n getAuthSessionState(),\n readDaemonServiceContract(),\n resolveBaseUrl(),\n ]);\n const session = auth.session;\n if (\n auth.state !== \"valid\" ||\n !session ||\n !contract ||\n session.user?.id !== identity.ownerUserId ||\n buildStoredAuthSessionIdentity(session) !== identity.sessionIdentity ||\n session.authBaseUrl !== identity.authBaseUrl ||\n gateway !== identity.gatewayBaseUrl ||\n contract.gatewayUrl !== identity.gatewayBaseUrl ||\n contract.ownerUserId !== identity.ownerUserId ||\n contract.deviceId !== identity.deviceId ||\n contract.lane !== identity.lane ||\n contract.generation !== identity.serviceContractGeneration\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"The Host's account, device or Service generation changed.\"\n );\n }\n return { session, contract };\n}\n","import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { serviceExecutionHostOwnerSchema } from \"@openmeld/schemas\";\nimport { z } from \"zod/v4\";\nimport { acquireLock, releaseLock } from \"../../config/lock\";\nimport { systemDir } from \"../../config/paths\";\nimport { ExecutionHostError } from \"./channel\";\n\nconst run = promisify(execFile);\nconst WINDOWS_BOOT_EVENT = /^\\d+:\\d+$/;\nconst DECIMAL = /^\\d+$/;\n\nexport async function readExecutionHostBootIdentity(): Promise<string | null> {\n try {\n return await readBootIdentity();\n } catch {\n // Fresh/quiescent starts do not require reboot evidence. Unknown evidence\n // can never clear an unsafe previous owner, and is not another boot.\n console.warn(\n \"[openmeld.execution_host.boot_unknown] Automatic recovery of unconfirmed work requires operating-system restart evidence.\"\n );\n return null;\n }\n}\n\nasync function readBootIdentity(): Promise<string | null> {\n if (process.platform === \"linux\") {\n const id = z\n .uuid()\n .parse(\n (await readFile(\"/proc/sys/kernel/random/boot_id\", \"utf8\")).trim()\n );\n return `linux:${id.toLowerCase()}`;\n }\n let stdout = \"\";\n if (process.platform === \"darwin\") {\n // XNU's immutable boot-session UUID, not its clock-adjustable boot time.\n ({ stdout } = await run(\n \"/usr/sbin/sysctl\",\n [\"-n\", \"kern.bootsessionuuid\"],\n {\n timeout: 5000,\n }\n ));\n return `darwin:${z.uuid().parse(stdout.trim()).toLowerCase()}`;\n }\n if (process.platform === \"win32\") {\n ({ stdout } = await run(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"$ErrorActionPreference='Stop'; $e=Get-WinEvent -FilterHashtable @{LogName='System';ProviderName='Microsoft-Windows-Kernel-General';Id=12} -MaxEvents 1; if($null -eq $e.RecordId -or $null -eq $e.TimeCreated){throw 'Boot event unavailable'}; [Console]::WriteLine(([string]$e.RecordId)+':'+([string]$e.TimeCreated.ToUniversalTime().Ticks))\",\n ],\n { timeout: 5000, windowsHide: true }\n ));\n if (!WINDOWS_BOOT_EVENT.test(stdout.trim())) {\n throw new Error(\"Invalid Windows boot event\");\n }\n return `win32:${stdout.trim()}`;\n }\n return null;\n}\n\nfunction confirmsNewBoot(\n previous: string | null,\n current: string | null\n): boolean {\n if (!(previous && current) || previous === current) {\n return false;\n }\n const [priorSource, priorId, priorTime] = previous.split(\":\");\n const [source, id, time] = current.split(\":\");\n if (source !== priorSource) {\n return false;\n }\n if (source === \"linux\" || source === \"darwin\") {\n return (\n z.uuid().safeParse(id).success && z.uuid().safeParse(priorId).success\n );\n }\n // Kernel-General 12 records OS startup, not EventLog-service restarts or\n // wall-clock corrections. Require a later retained event in both fields;\n // missing/cleared/rotated evidence cannot authorize replacing unknown work.\n if (\n source !== \"win32\" ||\n !id ||\n !time ||\n !priorId ||\n !priorTime ||\n ![id, time, priorId, priorTime].every((value) => DECIMAL.test(value))\n ) {\n return false;\n }\n return BigInt(id) > BigInt(priorId) && BigInt(time) > BigInt(priorTime);\n}\n\nexport async function acquireExecutionHostOwnership(input: {\n hostInstanceId: string;\n ownerUserId: string;\n deviceId: string;\n lane: \"prod\" | \"dev-local\" | \"canary\";\n stateRoot: string;\n bootIdentity: string | null;\n}) {\n const lock = await acquireLock({\n openMeldProfileId: \"service-execution-host\",\n key: \"process-owner\",\n pathResolution: { env: { ...process.env, OPENMELD_HOME: input.stateRoot } },\n meta: {\n hostInstanceId: input.hostInstanceId,\n ownerUserId: input.ownerUserId,\n },\n });\n const path = join(\n systemDir({ env: { OPENMELD_HOME: input.stateRoot } }),\n \"execution-host-owner.json\"\n );\n try {\n const previous = readOwner(path);\n if (\n previous &&\n !previous.localQuiescent &&\n !confirmsNewBoot(previous.bootIdentity, input.bootIdentity)\n ) {\n throw new ExecutionHostError(\n \"host.previous_work_unconfirmed\",\n \"The previous execution host ended before its local work was confirmed stopped. Restart this Computer, then check its connection. If restart evidence is unavailable, inspect the retained Host diagnostics before recovery. Existing results remain saved; no task will be restarted automatically.\"\n );\n }\n let owner = serviceExecutionHostOwnerSchema.parse({\n schema: \"service-execution-host-owner-v1\",\n hostInstanceId: input.hostInstanceId,\n ownerUserId: input.ownerUserId,\n deviceId: input.deviceId,\n lane: input.lane,\n pid: process.pid,\n bootIdentity: input.bootIdentity,\n localQuiescent: true,\n });\n persist(owner);\n function persist(next: typeof owner) {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n const temporary = `${path}.${randomUUID()}.tmp`;\n writeFileSync(temporary, JSON.stringify(next), {\n mode: 0o600,\n flag: \"wx\",\n });\n renameSync(temporary, path);\n }\n return {\n observeLocalQuiescence(quiescent: boolean) {\n if (owner.localQuiescent === quiescent) {\n return;\n }\n const next = { ...owner, localQuiescent: quiescent };\n // The unsafe transition is durable before any provider operation. A\n // failed write refuses that operation rather than weakening the fence.\n persist(next);\n owner = next;\n },\n release: () => releaseLock(lock),\n };\n } catch (error) {\n await releaseLock(lock);\n throw error;\n }\n}\n\nfunction readOwner(path: string) {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n const parsed = serviceExecutionHostOwnerSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new ExecutionHostError(\n \"host.owner_corrupt\",\n \"The Host ownership record cannot be verified. Preserve it for diagnostics; automatic replacement is refused.\"\n );\n }\n return parsed.data;\n}\n","import {\n type ServiceExecutionHostIdentity,\n serviceExecutionHostMethods,\n} from \"@openmeld/schemas\";\nimport {\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../../config/auth-session\";\nimport { resolveRuntimeContext } from \"../../runtime/context\";\nimport { createPresenter } from \"../../runtime/presenter/index\";\nimport { ensureDaemonRuntimePaths } from \"../state/daemon-device-id\";\nimport {\n ExecutionHostError,\n type ExecutionHostHandlers,\n serveExecutionHost,\n} from \"./channel\";\nimport { validateExecutionHostIdentity } from \"./identity\";\nimport {\n acquireExecutionHostOwnership,\n readExecutionHostBootIdentity,\n} from \"./ownership\";\nimport { parentExecutionHostChannel } from \"./process-channel\";\n\n// This entry has no public listener and accepts no executable/path override.\n// The inherited pipe, parent incarnation and current Service account are all\n// required before the provider graph or any local runtime state is opened.\nexport function runExecutionHost(hostInstanceId: string): Promise<void> {\n const channel = parentExecutionHostChannel();\n const done = Promise.withResolvers<void>();\n let runtime: Awaited<\n ReturnType<typeof import(\"./runtime\").createExecutionHostRuntime>\n > | null = null;\n let ownership: Awaited<\n ReturnType<typeof acquireExecutionHostOwnership>\n > | null = null;\n let session: StoredAuthSession | null = null;\n let acceptedIdentity: ServiceExecutionHostIdentity | null = null;\n let initializing: Promise<void> | null = null;\n let closing: Promise<void> | null = null;\n let disconnected = false;\n\n const close = (): Promise<void> => {\n if (!closing) {\n closing = (async () => {\n try {\n await initializing;\n if (runtime && session) {\n const currentRuntime = runtime;\n await withAdmittedServiceSession(session, () =>\n currentRuntime.closeAfterConnectorLoss()\n );\n }\n } finally {\n await ownership?.release();\n server.dispose();\n if (process.connected) {\n process.disconnect();\n }\n }\n })();\n closing.then(\n () => done.resolve(),\n (error) => done.reject(error)\n );\n }\n return closing;\n };\n\n const handlers = {\n initialize: async (identity: ServiceExecutionHostIdentity) => {\n if (\n acceptedIdentity &&\n JSON.stringify(acceptedIdentity) !== JSON.stringify(identity)\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"This Host is already assigned to a different Service incarnation.\"\n );\n }\n if (!initializing) {\n acceptedIdentity = identity;\n initializing = (async () => {\n const verified = await validateExecutionHostIdentity(identity);\n if (disconnected) {\n throw new ExecutionHostError(\n \"host.disconnected\",\n \"The supervising Service left before Host initialization.\"\n );\n }\n const verifiedOwnership = await acquireExecutionHostOwnership({\n ...identity,\n hostInstanceId,\n bootIdentity: await readExecutionHostBootIdentity(),\n });\n ownership = verifiedOwnership;\n session = verified.session;\n await withAdmittedServiceSession(session, async () => {\n const { createExecutionHostRuntime, createExecutionHostResources } =\n await import(\"./runtime\");\n const runtimePaths = await ensureDaemonRuntimePaths();\n const presenter = createPresenter(\n await resolveRuntimeContext({ view: \"agent\" })\n );\n runtime = await createExecutionHostRuntime({\n resources: await createExecutionHostResources({\n runtimePaths,\n presenter,\n }),\n hostInstanceId,\n identity,\n runtimePaths,\n serviceBundleId: verified.contract.bundleId,\n profileOwnerName: verified.session.user?.name ?? null,\n presenter,\n emit: (event) => {\n if (!disconnected) {\n server.emit(event);\n }\n },\n onWorkStateChange: (quiescent) =>\n verifiedOwnership.observeLocalQuiescence(quiescent),\n });\n });\n })();\n }\n await initializing;\n if (!runtime || disconnected) {\n throw new ExecutionHostError(\n \"host.disconnected\",\n \"The execution Host is not available.\"\n );\n }\n return runtime.snapshot();\n },\n } as ExecutionHostHandlers;\n\n // Each concrete method is still decoded by the shared method table at both\n // ends; the forwarding bridge cannot select a new account or mutate identity.\n for (const method of Object.keys(serviceExecutionHostMethods) as Array<\n keyof ExecutionHostHandlers\n >) {\n if (method === \"initialize\") {\n continue;\n }\n const target = handlers as unknown as Record<\n string,\n (payload: unknown) => Promise<unknown>\n >;\n target[method] = async (payload) => {\n if (!(runtime && session) || disconnected) {\n throw new ExecutionHostError(\n \"host.not_initialized\",\n \"Initialize this Host through its supervising Service first.\"\n );\n }\n const invoke = runtime.handlers[method] as (value: unknown) => unknown;\n return await withAdmittedServiceSession(\n session,\n async () => await invoke(payload)\n );\n };\n }\n\n const server = serveExecutionHost({\n channel,\n hostInstanceId,\n handlers,\n onFailure: (error) => {\n console.error(\"[openmeld.execution_host.channel_failed]\", error);\n disconnected = true;\n close().catch(() => undefined);\n },\n onDisconnect: () => {\n disconnected = true;\n close().catch(() => undefined);\n },\n });\n return done.promise;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"entry-CpS6tnIk.js","names":[],"sources":["../src/local-service/execution-host/identity.ts","../src/local-service/execution-host/ownership.ts","../src/local-service/execution-host/entry.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport type { ServiceExecutionHostIdentity } from \"@openmeld/schemas\";\nimport {\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n} from \"../../config/auth-session\";\nimport { resolveBaseUrl } from \"../../config/base-url\";\nimport { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { resolveOpenMeldRootDir } from \"../../config/paths\";\nimport { readProcessStartIdentity } from \"../../system/process-identity\";\nimport { ExecutionHostError } from \"./channel\";\n\nexport async function validateExecutionHostIdentity(\n identity: ServiceExecutionHostIdentity\n) {\n if (\n process.ppid !== identity.parentPid ||\n (process.platform !== \"win32\" &&\n readProcessStartIdentity(process.ppid) !==\n identity.parentProcessStartedAt) ||\n resolve(resolveOpenMeldRootDir()) !== resolve(identity.stateRoot)\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"The Host's parent or installation changed.\"\n );\n }\n const [auth, contract, gateway] = await Promise.all([\n getAuthSessionState(),\n readDaemonServiceContract(),\n resolveBaseUrl(),\n ]);\n const session = auth.session;\n if (\n auth.state !== \"valid\" ||\n !session ||\n !contract ||\n session.user?.id !== identity.ownerUserId ||\n buildStoredAuthSessionIdentity(session) !== identity.sessionIdentity ||\n session.authBaseUrl !== identity.authBaseUrl ||\n gateway !== identity.gatewayBaseUrl ||\n contract.gatewayUrl !== identity.gatewayBaseUrl ||\n contract.ownerUserId !== identity.ownerUserId ||\n contract.deviceId !== identity.deviceId ||\n contract.lane !== identity.lane ||\n contract.generation !== identity.serviceContractGeneration\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"The Host's account, device or Service generation changed.\"\n );\n }\n return { session, contract };\n}\n","import { execFile } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { serviceExecutionHostOwnerSchema } from \"@openmeld/schemas\";\nimport { z } from \"zod/v4\";\nimport { acquireLock, releaseLock } from \"../../config/lock\";\nimport { systemDir } from \"../../config/paths\";\nimport { ExecutionHostError } from \"./channel\";\n\nconst run = promisify(execFile);\nconst WINDOWS_BOOT_EVENT = /^\\d+:\\d+$/;\nconst DECIMAL = /^\\d+$/;\n\nexport async function readExecutionHostBootIdentity(): Promise<string | null> {\n try {\n return await readBootIdentity();\n } catch {\n // Fresh/quiescent starts do not require reboot evidence. Unknown evidence\n // can never clear an unsafe previous owner, and is not another boot.\n console.warn(\n \"[openmeld.execution_host.boot_unknown] Automatic recovery of unconfirmed work requires operating-system restart evidence.\"\n );\n return null;\n }\n}\n\nasync function readBootIdentity(): Promise<string | null> {\n if (process.platform === \"linux\") {\n const id = z\n .uuid()\n .parse(\n (await readFile(\"/proc/sys/kernel/random/boot_id\", \"utf8\")).trim()\n );\n return `linux:${id.toLowerCase()}`;\n }\n let stdout = \"\";\n if (process.platform === \"darwin\") {\n // XNU's immutable boot-session UUID, not its clock-adjustable boot time.\n ({ stdout } = await run(\n \"/usr/sbin/sysctl\",\n [\"-n\", \"kern.bootsessionuuid\"],\n {\n timeout: 5000,\n }\n ));\n return `darwin:${z.uuid().parse(stdout.trim()).toLowerCase()}`;\n }\n if (process.platform === \"win32\") {\n ({ stdout } = await run(\n \"powershell.exe\",\n [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"$ErrorActionPreference='Stop'; $e=Get-WinEvent -FilterHashtable @{LogName='System';ProviderName='Microsoft-Windows-Kernel-General';Id=12} -MaxEvents 1; if($null -eq $e.RecordId -or $null -eq $e.TimeCreated){throw 'Boot event unavailable'}; [Console]::WriteLine(([string]$e.RecordId)+':'+([string]$e.TimeCreated.ToUniversalTime().Ticks))\",\n ],\n { timeout: 5000, windowsHide: true }\n ));\n if (!WINDOWS_BOOT_EVENT.test(stdout.trim())) {\n throw new Error(\"Invalid Windows boot event\");\n }\n return `win32:${stdout.trim()}`;\n }\n return null;\n}\n\nfunction confirmsNewBoot(\n previous: string | null,\n current: string | null\n): boolean {\n if (!(previous && current) || previous === current) {\n return false;\n }\n const [priorSource, priorId, priorTime] = previous.split(\":\");\n const [source, id, time] = current.split(\":\");\n if (source !== priorSource) {\n return false;\n }\n if (source === \"linux\" || source === \"darwin\") {\n return (\n z.uuid().safeParse(id).success && z.uuid().safeParse(priorId).success\n );\n }\n // Kernel-General 12 records OS startup, not EventLog-service restarts or\n // wall-clock corrections. Require a later retained event in both fields;\n // missing/cleared/rotated evidence cannot authorize replacing unknown work.\n if (\n source !== \"win32\" ||\n !id ||\n !time ||\n !priorId ||\n !priorTime ||\n ![id, time, priorId, priorTime].every((value) => DECIMAL.test(value))\n ) {\n return false;\n }\n return BigInt(id) > BigInt(priorId) && BigInt(time) > BigInt(priorTime);\n}\n\nexport async function acquireExecutionHostOwnership(input: {\n hostInstanceId: string;\n ownerUserId: string;\n deviceId: string;\n lane: \"prod\" | \"dev-local\" | \"canary\";\n stateRoot: string;\n bootIdentity: string | null;\n}) {\n const lock = await acquireLock({\n openMeldProfileId: \"service-execution-host\",\n key: \"process-owner\",\n pathResolution: { env: { ...process.env, OPENMELD_HOME: input.stateRoot } },\n meta: {\n hostInstanceId: input.hostInstanceId,\n ownerUserId: input.ownerUserId,\n },\n });\n const path = join(\n systemDir({ env: { OPENMELD_HOME: input.stateRoot } }),\n \"execution-host-owner.json\"\n );\n try {\n const previous = readOwner(path);\n if (\n previous &&\n !previous.localQuiescent &&\n !confirmsNewBoot(previous.bootIdentity, input.bootIdentity)\n ) {\n throw new ExecutionHostError(\n \"host.previous_work_unconfirmed\",\n \"The previous execution host ended before its local work was confirmed stopped. Restart this Computer, then check its connection. If restart evidence is unavailable, inspect the retained Host diagnostics before recovery. Existing results remain saved; no task will be restarted automatically.\"\n );\n }\n let owner = serviceExecutionHostOwnerSchema.parse({\n schema: \"service-execution-host-owner-v1\",\n hostInstanceId: input.hostInstanceId,\n ownerUserId: input.ownerUserId,\n deviceId: input.deviceId,\n lane: input.lane,\n pid: process.pid,\n bootIdentity: input.bootIdentity,\n localQuiescent: true,\n });\n persist(owner);\n function persist(next: typeof owner) {\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n const temporary = `${path}.${randomUUID()}.tmp`;\n writeFileSync(temporary, JSON.stringify(next), {\n mode: 0o600,\n flag: \"wx\",\n });\n renameSync(temporary, path);\n }\n return {\n observeLocalQuiescence(quiescent: boolean) {\n if (owner.localQuiescent === quiescent) {\n return;\n }\n const next = { ...owner, localQuiescent: quiescent };\n // The unsafe transition is durable before any provider operation. A\n // failed write refuses that operation rather than weakening the fence.\n persist(next);\n owner = next;\n },\n release: () => releaseLock(lock),\n };\n } catch (error) {\n await releaseLock(lock);\n throw error;\n }\n}\n\nfunction readOwner(path: string) {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n const parsed = serviceExecutionHostOwnerSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new ExecutionHostError(\n \"host.owner_corrupt\",\n \"The Host ownership record cannot be verified. Preserve it for diagnostics; automatic replacement is refused.\"\n );\n }\n return parsed.data;\n}\n","import {\n type ServiceExecutionHostIdentity,\n serviceExecutionHostMethods,\n} from \"@openmeld/schemas\";\nimport {\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../../config/auth-session\";\nimport { resolveRuntimeContext } from \"../../runtime/context\";\nimport { createPresenter } from \"../../runtime/presenter/index\";\nimport { ensureDaemonRuntimePaths } from \"../state/daemon-device-id\";\nimport {\n ExecutionHostError,\n type ExecutionHostHandlers,\n serveExecutionHost,\n} from \"./channel\";\nimport { validateExecutionHostIdentity } from \"./identity\";\nimport {\n acquireExecutionHostOwnership,\n readExecutionHostBootIdentity,\n} from \"./ownership\";\nimport { parentExecutionHostChannel } from \"./process-channel\";\n\n// This entry has no public listener and accepts no executable/path override.\n// The inherited pipe, parent incarnation and current Service account are all\n// required before the provider graph or any local runtime state is opened.\nexport function runExecutionHost(hostInstanceId: string): Promise<void> {\n const channel = parentExecutionHostChannel();\n const done = Promise.withResolvers<void>();\n let runtime: Awaited<\n ReturnType<typeof import(\"./runtime\").createExecutionHostRuntime>\n > | null = null;\n let ownership: Awaited<\n ReturnType<typeof acquireExecutionHostOwnership>\n > | null = null;\n let session: StoredAuthSession | null = null;\n let acceptedIdentity: ServiceExecutionHostIdentity | null = null;\n let initializing: Promise<void> | null = null;\n let closing: Promise<void> | null = null;\n let disconnected = false;\n\n const close = (): Promise<void> => {\n if (!closing) {\n closing = (async () => {\n try {\n await initializing;\n if (runtime && session) {\n const currentRuntime = runtime;\n await withAdmittedServiceSession(session, () =>\n currentRuntime.closeAfterConnectorLoss()\n );\n }\n } finally {\n await ownership?.release();\n server.dispose();\n if (process.connected) {\n process.disconnect();\n }\n }\n })();\n closing.then(\n () => done.resolve(),\n (error) => done.reject(error)\n );\n }\n return closing;\n };\n\n const handlers = {\n initialize: async (identity: ServiceExecutionHostIdentity) => {\n if (\n acceptedIdentity &&\n JSON.stringify(acceptedIdentity) !== JSON.stringify(identity)\n ) {\n throw new ExecutionHostError(\n \"host.identity_mismatch\",\n \"This Host is already assigned to a different Service incarnation.\"\n );\n }\n if (!initializing) {\n acceptedIdentity = identity;\n initializing = (async () => {\n const verified = await validateExecutionHostIdentity(identity);\n if (disconnected) {\n throw new ExecutionHostError(\n \"host.disconnected\",\n \"The supervising Service left before Host initialization.\"\n );\n }\n const verifiedOwnership = await acquireExecutionHostOwnership({\n ...identity,\n hostInstanceId,\n bootIdentity: await readExecutionHostBootIdentity(),\n });\n ownership = verifiedOwnership;\n session = verified.session;\n await withAdmittedServiceSession(session, async () => {\n const { createExecutionHostRuntime, createExecutionHostResources } =\n await import(\"./runtime\");\n const runtimePaths = await ensureDaemonRuntimePaths();\n const presenter = createPresenter(\n await resolveRuntimeContext({ view: \"agent\" })\n );\n runtime = await createExecutionHostRuntime({\n resources: await createExecutionHostResources({\n runtimePaths,\n presenter,\n }),\n hostInstanceId,\n identity,\n runtimePaths,\n serviceBundleId: verified.contract.bundleId,\n profileOwnerName: verified.session.user?.name ?? null,\n presenter,\n emit: (event) => {\n if (!disconnected) {\n server.emit(event);\n }\n },\n onWorkStateChange: (quiescent) =>\n verifiedOwnership.observeLocalQuiescence(quiescent),\n });\n });\n })();\n }\n await initializing;\n if (!runtime || disconnected) {\n throw new ExecutionHostError(\n \"host.disconnected\",\n \"The execution Host is not available.\"\n );\n }\n return runtime.snapshot();\n },\n } as ExecutionHostHandlers;\n\n // Each concrete method is still decoded by the shared method table at both\n // ends; the forwarding bridge cannot select a new account or mutate identity.\n for (const method of Object.keys(serviceExecutionHostMethods) as Array<\n keyof ExecutionHostHandlers\n >) {\n if (method === \"initialize\") {\n continue;\n }\n const target = handlers as unknown as Record<\n string,\n (payload: unknown) => Promise<unknown>\n >;\n target[method] = async (payload) => {\n if (!(runtime && session) || disconnected) {\n throw new ExecutionHostError(\n \"host.not_initialized\",\n \"Initialize this Host through its supervising Service first.\"\n );\n }\n const invoke = runtime.handlers[method] as (value: unknown) => unknown;\n return await withAdmittedServiceSession(\n session,\n async () => await invoke(payload)\n );\n };\n }\n\n const server = serveExecutionHost({\n channel,\n hostInstanceId,\n handlers,\n onFailure: (error) => {\n console.error(\"[openmeld.execution_host.channel_failed]\", error);\n disconnected = true;\n close().catch(() => undefined);\n },\n onDisconnect: () => {\n disconnected = true;\n close().catch(() => undefined);\n },\n });\n return done.promise;\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { mt as skillsDir } from "./lock-Bsl_ElWy.js";
4
- import { $ as canManageRegistryAgentSkillTargets, et as detectInstalledSkillsAgents, tt as resolveSkillsAgentRegistry } from "./prepare-provider-runtime-CWZcuMF6.js";
5
- import { n as resolveSkillsInstallStates, r as ensureLocalSkills, t as resolveSkillInstallStateForTarget } from "./state-CQG3k9eh.js";
6
- import { T as updateConfiguredSkillsConfig, g as getConfiguredSkillsConfig, y as resolveRuntimeSkillsCustomTargetId } from "./base-url-D7uE_xTo.js";
3
+ import { ht as skillsDir } from "./lock-iue1J2xy.js";
4
+ import { $ as canManageRegistryAgentSkillTargets, et as detectInstalledSkillsAgents, tt as resolveSkillsAgentRegistry } from "./prepare-provider-runtime-MB-BxOgt.js";
5
+ import { n as resolveSkillsInstallStates, r as ensureLocalSkills, t as resolveSkillInstallStateForTarget } from "./state-GxF_KAM1.js";
6
+ import { T as updateConfiguredSkillsConfig, g as getConfiguredSkillsConfig, y as resolveRuntimeSkillsCustomTargetId } from "./base-url-DvjOkKPs.js";
7
7
  import { stat } from "node:fs/promises";
8
8
  //#region src/skills/installation-inventory.ts
9
9
  async function collectSkillsReadinessSnapshot() {
@@ -240,4 +240,4 @@ function normalizeInstallRecordForCompare(input) {
240
240
  //#endregion
241
241
  export { mergeTargetsByDir as a, summarizeSkillState as c, filterTargetsWithInstalledOpenMeldSkills as i, collectSkillsReadinessSnapshot as n, persistDetectedInstallStateFromCheck as o, compareInstallRecords as r, resolveTrackedInstallTargets as s, buildAgentTargets as t };
242
242
 
243
- //# sourceMappingURL=installation-inventory-DThnBEhV.js.map
243
+ //# sourceMappingURL=installation-inventory-C5FsAvrf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installation-inventory-DThnBEhV.js","names":[],"sources":["../src/skills/installation-inventory.ts"],"sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { skillsDir } from \"../config/paths\";\nimport {\n getConfiguredSkillsConfig,\n type RuntimeSkillsConfig,\n type RuntimeSkillsCustomTarget,\n type RuntimeSkillsInstallRecord,\n resolveRuntimeSkillsCustomTargetId,\n updateConfiguredSkillsConfig,\n} from \"../config/runtime-config\";\nimport {\n canManageRegistryAgentSkillTargets,\n detectInstalledSkillsAgents,\n resolveSkillsAgentRegistry,\n} from \"./agents\";\nimport type { SkillsInstallTarget } from \"./installer\";\nimport {\n resolveSkillInstallStateForTarget,\n resolveSkillsInstallStates,\n type SkillInstallStateResult,\n} from \"./state\";\nimport { ensureLocalSkills, type LocalSkill } from \"./store\";\n\nexport type SkillsReadinessSnapshot = {\n status: \"up_to_date\" | \"action_required\" | \"no_targets\";\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n};\n\nexport async function collectSkillsReadinessSnapshot(): Promise<SkillsReadinessSnapshot> {\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const installedAgents = await detectInstalledSkillsAgents(registry);\n const localSkills = await ensureLocalSkills();\n const detectedAgentTargets = buildAgentTargets(installedAgents, registry);\n const trackedTargets = await resolveTrackedInstallTargets({\n skillsConfig,\n registry,\n localSkills,\n onlyOpenMeldInstalledTargets: false,\n });\n const checkTargets = mergeTargetsByDir({\n primary: detectedAgentTargets,\n secondary: trackedTargets,\n });\n const states = await resolveSkillsInstallStates({\n skills: localSkills,\n targets: checkTargets,\n });\n await persistDetectedInstallStateFromCheck({ states });\n const summary = summarizeSkillState(states);\n const hasIssues =\n summary.outdated > 0 || summary.missing > 0 || summary.externalConflict > 0;\n let status: SkillsReadinessSnapshot[\"status\"] = \"up_to_date\";\n if (checkTargets.length === 0) {\n status = \"no_targets\";\n } else if (hasIssues) {\n status = \"action_required\";\n }\n return {\n status,\n targetCount: checkTargets.length,\n summary,\n };\n}\n\nexport function buildAgentTargets(\n agents: string[],\n registry: ReturnType<typeof resolveSkillsAgentRegistry>\n): SkillsInstallTarget[] {\n return agents.flatMap((agentName) => {\n const config = registry[agentName];\n if (!config?.globalSkillsDir || config.skillsInstallable !== true) {\n return [];\n }\n return [\n {\n id: agentName,\n dir: config.globalSkillsDir,\n type: \"agent\" as const,\n },\n ];\n });\n}\n\nfunction isLikelyCustomTargetId(value: string): boolean {\n return value.startsWith(\"custom-\");\n}\n\nexport function resolveTrackedInstallTargets(input: {\n skillsConfig: RuntimeSkillsConfig | null;\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n localSkills: LocalSkill[];\n onlyOpenMeldInstalledTargets: boolean;\n}): Promise<SkillsInstallTarget[]> {\n const installs = input.skillsConfig?.installs ?? [];\n const customTargets = input.skillsConfig?.customTargets ?? [];\n const customTargetByDir = buildCustomTargetByDir(customTargets);\n const byTargetDir = new Map<string, SkillsInstallTarget>();\n seedTrackedTargetsFromCustomTargets({\n byTargetDir,\n customTargetByDir,\n });\n seedTrackedTargetsFromInstallRecords({\n byTargetDir,\n installs,\n registry: input.registry,\n customTargetByDir,\n });\n\n const candidates = sortTrackedTargets([...byTargetDir.values()]);\n const allowRegistryDefaults = canManageRegistryAgentSkillTargets();\n const laneSafeCandidates = allowRegistryDefaults\n ? candidates\n : candidates.filter(\n (target) =>\n target.type === \"custom\" ||\n input.registry[target.id]?.globalSkillsDirSource === \"config-override\"\n );\n return filterTrackedTargetsByState({\n candidates: laneSafeCandidates,\n localSkills: input.localSkills,\n onlyOpenMeldInstalledTargets: input.onlyOpenMeldInstalledTargets,\n });\n}\n\nfunction buildCustomTargetByDir(\n customTargets: RuntimeSkillsCustomTarget[]\n): Map<string, RuntimeSkillsCustomTarget> {\n const customTargetByDir = new Map<string, RuntimeSkillsCustomTarget>();\n for (const customTarget of customTargets) {\n const id = resolveRuntimeSkillsCustomTargetId({\n dir: customTarget.dir,\n ...(customTarget.id ? { id: customTarget.id } : {}),\n });\n customTargetByDir.set(customTarget.dir, {\n id,\n name: customTarget.name,\n dir: customTarget.dir,\n });\n }\n return customTargetByDir;\n}\n\nfunction seedTrackedTargetsFromCustomTargets(input: {\n byTargetDir: Map<string, SkillsInstallTarget>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): void {\n for (const customTarget of input.customTargetByDir.values()) {\n input.byTargetDir.set(customTarget.dir, {\n id:\n customTarget.id ??\n resolveRuntimeSkillsCustomTargetId({ dir: customTarget.dir }),\n dir: customTarget.dir,\n type: \"custom\",\n });\n }\n}\n\nfunction seedTrackedTargetsFromInstallRecords(input: {\n byTargetDir: Map<string, SkillsInstallTarget>;\n installs: RuntimeSkillsInstallRecord[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): void {\n for (const install of input.installs) {\n const trackedTarget = buildTrackedTargetFromInstallRecord({\n install,\n registry: input.registry,\n customTargetByDir: input.customTargetByDir,\n });\n input.byTargetDir.set(install.targetDir, trackedTarget);\n }\n}\n\nfunction buildTrackedTargetFromInstallRecord(input: {\n install: RuntimeSkillsInstallRecord;\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): SkillsInstallTarget {\n const knownAgentDir = input.registry[input.install.targetId]?.globalSkillsDir;\n const targetType: SkillsInstallTarget[\"type\"] =\n knownAgentDir && knownAgentDir === input.install.targetDir\n ? \"agent\"\n : \"custom\";\n if (targetType === \"agent\") {\n return {\n id: input.install.targetId,\n dir: input.install.targetDir,\n type: \"agent\",\n };\n }\n\n const customTarget = input.customTargetByDir.get(input.install.targetDir);\n const fallbackCustomId = isLikelyCustomTargetId(input.install.targetId)\n ? input.install.targetId\n : undefined;\n const resolvedCustomId = customTarget?.id ?? fallbackCustomId;\n return {\n id: resolveRuntimeSkillsCustomTargetId({\n dir: input.install.targetDir,\n ...(resolvedCustomId ? { id: resolvedCustomId } : {}),\n }),\n dir: input.install.targetDir,\n type: \"custom\",\n };\n}\n\nfunction sortTrackedTargets(\n targets: SkillsInstallTarget[]\n): SkillsInstallTarget[] {\n return [...targets].sort((a, b) =>\n `${a.id}:${a.dir}`.localeCompare(`${b.id}:${b.dir}`)\n );\n}\n\nexport function mergeTargetsByDir(input: {\n primary: SkillsInstallTarget[];\n secondary: SkillsInstallTarget[];\n}): SkillsInstallTarget[] {\n const byDir = new Map<string, SkillsInstallTarget>();\n for (const target of input.secondary) {\n byDir.set(target.dir, target);\n }\n for (const target of input.primary) {\n byDir.set(target.dir, target);\n }\n return sortTrackedTargets([...byDir.values()]);\n}\n\nasync function filterInstalledTrackedTargets(input: {\n candidates: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n}): Promise<SkillsInstallTarget[]> {\n const installedOnly: SkillsInstallTarget[] = [];\n for (const candidate of input.candidates) {\n const hasInstalledOpenMeldSkill = await targetHasInstalledOpenMeldSkill({\n target: candidate,\n localSkills: input.localSkills,\n });\n if (!hasInstalledOpenMeldSkill) {\n continue;\n }\n installedOnly.push(candidate);\n }\n return installedOnly;\n}\n\nexport async function filterTargetsWithInstalledOpenMeldSkills(input: {\n targets: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n}): Promise<SkillsInstallTarget[]> {\n const existingTargets = await filterExistingTargetDirs(input.targets);\n return filterInstalledTrackedTargets({\n candidates: existingTargets,\n localSkills: input.localSkills,\n });\n}\n\nasync function filterTrackedTargetsByState(input: {\n candidates: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n onlyOpenMeldInstalledTargets: boolean;\n}): Promise<SkillsInstallTarget[]> {\n const existingTargets = await filterExistingTargetDirs(input.candidates);\n if (!input.onlyOpenMeldInstalledTargets) {\n return existingTargets;\n }\n\n return filterInstalledTrackedTargets({\n candidates: existingTargets,\n localSkills: input.localSkills,\n });\n}\n\nasync function filterExistingTargetDirs(\n candidates: SkillsInstallTarget[]\n): Promise<SkillsInstallTarget[]> {\n const existing: SkillsInstallTarget[] = [];\n for (const candidate of candidates) {\n const targetDirStats = await stat(candidate.dir).catch(() => null);\n if (!targetDirStats?.isDirectory()) {\n continue;\n }\n existing.push(candidate);\n }\n return existing;\n}\n\nexport function summarizeSkillState(states: SkillInstallStateResult[]): {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n} {\n return {\n upToDate: states.filter((state) => state.state === \"up_to_date\").length,\n outdated: states.filter((state) => state.state === \"outdated\").length,\n missing: states.filter((state) => state.state === \"missing\").length,\n externalConflict: states.filter(\n (state) => state.state === \"external_conflict\"\n ).length,\n };\n}\n\nasync function targetHasInstalledOpenMeldSkill(input: {\n target: SkillsInstallTarget;\n localSkills: LocalSkill[];\n}): Promise<boolean> {\n const targetDirStats = await stat(input.target.dir).catch(() => null);\n if (!targetDirStats?.isDirectory()) {\n return false;\n }\n\n for (const skill of input.localSkills) {\n const state = await resolveSkillInstallStateForTarget({\n skill,\n target: input.target,\n });\n if (state.state === \"up_to_date\" || state.state === \"outdated\") {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function persistDetectedInstallStateFromCheck(input: {\n states: SkillInstallStateResult[];\n}): Promise<void> {\n const discoveredByTargetDir = new Map<string, SkillInstallStateResult[]>();\n for (const state of input.states) {\n if (!(state.state === \"up_to_date\" || state.state === \"outdated\")) {\n continue;\n }\n const list = discoveredByTargetDir.get(state.targetDir) ?? [];\n list.push(state);\n discoveredByTargetDir.set(state.targetDir, list);\n }\n\n if (discoveredByTargetDir.size === 0) {\n return;\n }\n\n await updateConfiguredSkillsConfig((currentSkillsConfig) => {\n const byTargetDir = new Map<string, RuntimeSkillsInstallRecord>();\n for (const record of currentSkillsConfig?.installs ?? []) {\n byTargetDir.set(record.targetDir, record);\n }\n\n const now = new Date().toISOString();\n for (const [targetDir, group] of discoveredByTargetDir) {\n const first = group[0];\n if (!first) {\n continue;\n }\n const mode: RuntimeSkillsInstallRecord[\"mode\"] = group.some(\n (state) => state.targetMode === \"copy\"\n )\n ? \"copy\"\n : \"symlink\";\n const skillIds = Array.from(\n new Set(group.map((state) => state.skillId))\n ).sort((a, b) => a.localeCompare(b));\n\n byTargetDir.set(targetDir, {\n targetId: first.targetId,\n targetDir,\n mode,\n status: \"installed\",\n skillIds,\n updatedAt: now,\n });\n }\n\n const nextInstalls = [...byTargetDir.values()].sort(compareInstallRecords);\n const previousInstalls = [...(currentSkillsConfig?.installs ?? [])]\n .sort(compareInstallRecords)\n .map(normalizeInstallRecordForCompare);\n const nextComparable = nextInstalls.map(normalizeInstallRecordForCompare);\n if (JSON.stringify(previousInstalls) === JSON.stringify(nextComparable)) {\n return currentSkillsConfig;\n }\n\n return {\n storeDir: currentSkillsConfig?.storeDir ?? skillsDir(),\n ...(currentSkillsConfig?.agents\n ? { agents: currentSkillsConfig.agents }\n : {}),\n ...(currentSkillsConfig?.customTargets\n ? { customTargets: currentSkillsConfig.customTargets }\n : {}),\n installs: nextInstalls,\n };\n });\n}\n\nexport function compareInstallRecords(\n left: RuntimeSkillsInstallRecord,\n right: RuntimeSkillsInstallRecord\n): number {\n const byTargetId = left.targetId.localeCompare(right.targetId);\n if (byTargetId !== 0) {\n return byTargetId;\n }\n return left.targetDir.localeCompare(right.targetDir);\n}\n\nfunction normalizeInstallRecordForCompare(\n input: RuntimeSkillsInstallRecord\n): Omit<RuntimeSkillsInstallRecord, \"updatedAt\"> {\n return {\n targetId: input.targetId,\n targetDir: input.targetDir,\n mode: input.mode,\n status: input.status,\n skillIds: [...input.skillIds].sort((a, b) => a.localeCompare(b)),\n ...(input.reason ? { reason: input.reason } : {}),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"installation-inventory-C5FsAvrf.js","names":[],"sources":["../src/skills/installation-inventory.ts"],"sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { skillsDir } from \"../config/paths\";\nimport {\n getConfiguredSkillsConfig,\n type RuntimeSkillsConfig,\n type RuntimeSkillsCustomTarget,\n type RuntimeSkillsInstallRecord,\n resolveRuntimeSkillsCustomTargetId,\n updateConfiguredSkillsConfig,\n} from \"../config/runtime-config\";\nimport {\n canManageRegistryAgentSkillTargets,\n detectInstalledSkillsAgents,\n resolveSkillsAgentRegistry,\n} from \"./agents\";\nimport type { SkillsInstallTarget } from \"./installer\";\nimport {\n resolveSkillInstallStateForTarget,\n resolveSkillsInstallStates,\n type SkillInstallStateResult,\n} from \"./state\";\nimport { ensureLocalSkills, type LocalSkill } from \"./store\";\n\nexport type SkillsReadinessSnapshot = {\n status: \"up_to_date\" | \"action_required\" | \"no_targets\";\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n};\n\nexport async function collectSkillsReadinessSnapshot(): Promise<SkillsReadinessSnapshot> {\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const installedAgents = await detectInstalledSkillsAgents(registry);\n const localSkills = await ensureLocalSkills();\n const detectedAgentTargets = buildAgentTargets(installedAgents, registry);\n const trackedTargets = await resolveTrackedInstallTargets({\n skillsConfig,\n registry,\n localSkills,\n onlyOpenMeldInstalledTargets: false,\n });\n const checkTargets = mergeTargetsByDir({\n primary: detectedAgentTargets,\n secondary: trackedTargets,\n });\n const states = await resolveSkillsInstallStates({\n skills: localSkills,\n targets: checkTargets,\n });\n await persistDetectedInstallStateFromCheck({ states });\n const summary = summarizeSkillState(states);\n const hasIssues =\n summary.outdated > 0 || summary.missing > 0 || summary.externalConflict > 0;\n let status: SkillsReadinessSnapshot[\"status\"] = \"up_to_date\";\n if (checkTargets.length === 0) {\n status = \"no_targets\";\n } else if (hasIssues) {\n status = \"action_required\";\n }\n return {\n status,\n targetCount: checkTargets.length,\n summary,\n };\n}\n\nexport function buildAgentTargets(\n agents: string[],\n registry: ReturnType<typeof resolveSkillsAgentRegistry>\n): SkillsInstallTarget[] {\n return agents.flatMap((agentName) => {\n const config = registry[agentName];\n if (!config?.globalSkillsDir || config.skillsInstallable !== true) {\n return [];\n }\n return [\n {\n id: agentName,\n dir: config.globalSkillsDir,\n type: \"agent\" as const,\n },\n ];\n });\n}\n\nfunction isLikelyCustomTargetId(value: string): boolean {\n return value.startsWith(\"custom-\");\n}\n\nexport function resolveTrackedInstallTargets(input: {\n skillsConfig: RuntimeSkillsConfig | null;\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n localSkills: LocalSkill[];\n onlyOpenMeldInstalledTargets: boolean;\n}): Promise<SkillsInstallTarget[]> {\n const installs = input.skillsConfig?.installs ?? [];\n const customTargets = input.skillsConfig?.customTargets ?? [];\n const customTargetByDir = buildCustomTargetByDir(customTargets);\n const byTargetDir = new Map<string, SkillsInstallTarget>();\n seedTrackedTargetsFromCustomTargets({\n byTargetDir,\n customTargetByDir,\n });\n seedTrackedTargetsFromInstallRecords({\n byTargetDir,\n installs,\n registry: input.registry,\n customTargetByDir,\n });\n\n const candidates = sortTrackedTargets([...byTargetDir.values()]);\n const allowRegistryDefaults = canManageRegistryAgentSkillTargets();\n const laneSafeCandidates = allowRegistryDefaults\n ? candidates\n : candidates.filter(\n (target) =>\n target.type === \"custom\" ||\n input.registry[target.id]?.globalSkillsDirSource === \"config-override\"\n );\n return filterTrackedTargetsByState({\n candidates: laneSafeCandidates,\n localSkills: input.localSkills,\n onlyOpenMeldInstalledTargets: input.onlyOpenMeldInstalledTargets,\n });\n}\n\nfunction buildCustomTargetByDir(\n customTargets: RuntimeSkillsCustomTarget[]\n): Map<string, RuntimeSkillsCustomTarget> {\n const customTargetByDir = new Map<string, RuntimeSkillsCustomTarget>();\n for (const customTarget of customTargets) {\n const id = resolveRuntimeSkillsCustomTargetId({\n dir: customTarget.dir,\n ...(customTarget.id ? { id: customTarget.id } : {}),\n });\n customTargetByDir.set(customTarget.dir, {\n id,\n name: customTarget.name,\n dir: customTarget.dir,\n });\n }\n return customTargetByDir;\n}\n\nfunction seedTrackedTargetsFromCustomTargets(input: {\n byTargetDir: Map<string, SkillsInstallTarget>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): void {\n for (const customTarget of input.customTargetByDir.values()) {\n input.byTargetDir.set(customTarget.dir, {\n id:\n customTarget.id ??\n resolveRuntimeSkillsCustomTargetId({ dir: customTarget.dir }),\n dir: customTarget.dir,\n type: \"custom\",\n });\n }\n}\n\nfunction seedTrackedTargetsFromInstallRecords(input: {\n byTargetDir: Map<string, SkillsInstallTarget>;\n installs: RuntimeSkillsInstallRecord[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): void {\n for (const install of input.installs) {\n const trackedTarget = buildTrackedTargetFromInstallRecord({\n install,\n registry: input.registry,\n customTargetByDir: input.customTargetByDir,\n });\n input.byTargetDir.set(install.targetDir, trackedTarget);\n }\n}\n\nfunction buildTrackedTargetFromInstallRecord(input: {\n install: RuntimeSkillsInstallRecord;\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetByDir: Map<string, RuntimeSkillsCustomTarget>;\n}): SkillsInstallTarget {\n const knownAgentDir = input.registry[input.install.targetId]?.globalSkillsDir;\n const targetType: SkillsInstallTarget[\"type\"] =\n knownAgentDir && knownAgentDir === input.install.targetDir\n ? \"agent\"\n : \"custom\";\n if (targetType === \"agent\") {\n return {\n id: input.install.targetId,\n dir: input.install.targetDir,\n type: \"agent\",\n };\n }\n\n const customTarget = input.customTargetByDir.get(input.install.targetDir);\n const fallbackCustomId = isLikelyCustomTargetId(input.install.targetId)\n ? input.install.targetId\n : undefined;\n const resolvedCustomId = customTarget?.id ?? fallbackCustomId;\n return {\n id: resolveRuntimeSkillsCustomTargetId({\n dir: input.install.targetDir,\n ...(resolvedCustomId ? { id: resolvedCustomId } : {}),\n }),\n dir: input.install.targetDir,\n type: \"custom\",\n };\n}\n\nfunction sortTrackedTargets(\n targets: SkillsInstallTarget[]\n): SkillsInstallTarget[] {\n return [...targets].sort((a, b) =>\n `${a.id}:${a.dir}`.localeCompare(`${b.id}:${b.dir}`)\n );\n}\n\nexport function mergeTargetsByDir(input: {\n primary: SkillsInstallTarget[];\n secondary: SkillsInstallTarget[];\n}): SkillsInstallTarget[] {\n const byDir = new Map<string, SkillsInstallTarget>();\n for (const target of input.secondary) {\n byDir.set(target.dir, target);\n }\n for (const target of input.primary) {\n byDir.set(target.dir, target);\n }\n return sortTrackedTargets([...byDir.values()]);\n}\n\nasync function filterInstalledTrackedTargets(input: {\n candidates: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n}): Promise<SkillsInstallTarget[]> {\n const installedOnly: SkillsInstallTarget[] = [];\n for (const candidate of input.candidates) {\n const hasInstalledOpenMeldSkill = await targetHasInstalledOpenMeldSkill({\n target: candidate,\n localSkills: input.localSkills,\n });\n if (!hasInstalledOpenMeldSkill) {\n continue;\n }\n installedOnly.push(candidate);\n }\n return installedOnly;\n}\n\nexport async function filterTargetsWithInstalledOpenMeldSkills(input: {\n targets: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n}): Promise<SkillsInstallTarget[]> {\n const existingTargets = await filterExistingTargetDirs(input.targets);\n return filterInstalledTrackedTargets({\n candidates: existingTargets,\n localSkills: input.localSkills,\n });\n}\n\nasync function filterTrackedTargetsByState(input: {\n candidates: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n onlyOpenMeldInstalledTargets: boolean;\n}): Promise<SkillsInstallTarget[]> {\n const existingTargets = await filterExistingTargetDirs(input.candidates);\n if (!input.onlyOpenMeldInstalledTargets) {\n return existingTargets;\n }\n\n return filterInstalledTrackedTargets({\n candidates: existingTargets,\n localSkills: input.localSkills,\n });\n}\n\nasync function filterExistingTargetDirs(\n candidates: SkillsInstallTarget[]\n): Promise<SkillsInstallTarget[]> {\n const existing: SkillsInstallTarget[] = [];\n for (const candidate of candidates) {\n const targetDirStats = await stat(candidate.dir).catch(() => null);\n if (!targetDirStats?.isDirectory()) {\n continue;\n }\n existing.push(candidate);\n }\n return existing;\n}\n\nexport function summarizeSkillState(states: SkillInstallStateResult[]): {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n} {\n return {\n upToDate: states.filter((state) => state.state === \"up_to_date\").length,\n outdated: states.filter((state) => state.state === \"outdated\").length,\n missing: states.filter((state) => state.state === \"missing\").length,\n externalConflict: states.filter(\n (state) => state.state === \"external_conflict\"\n ).length,\n };\n}\n\nasync function targetHasInstalledOpenMeldSkill(input: {\n target: SkillsInstallTarget;\n localSkills: LocalSkill[];\n}): Promise<boolean> {\n const targetDirStats = await stat(input.target.dir).catch(() => null);\n if (!targetDirStats?.isDirectory()) {\n return false;\n }\n\n for (const skill of input.localSkills) {\n const state = await resolveSkillInstallStateForTarget({\n skill,\n target: input.target,\n });\n if (state.state === \"up_to_date\" || state.state === \"outdated\") {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function persistDetectedInstallStateFromCheck(input: {\n states: SkillInstallStateResult[];\n}): Promise<void> {\n const discoveredByTargetDir = new Map<string, SkillInstallStateResult[]>();\n for (const state of input.states) {\n if (!(state.state === \"up_to_date\" || state.state === \"outdated\")) {\n continue;\n }\n const list = discoveredByTargetDir.get(state.targetDir) ?? [];\n list.push(state);\n discoveredByTargetDir.set(state.targetDir, list);\n }\n\n if (discoveredByTargetDir.size === 0) {\n return;\n }\n\n await updateConfiguredSkillsConfig((currentSkillsConfig) => {\n const byTargetDir = new Map<string, RuntimeSkillsInstallRecord>();\n for (const record of currentSkillsConfig?.installs ?? []) {\n byTargetDir.set(record.targetDir, record);\n }\n\n const now = new Date().toISOString();\n for (const [targetDir, group] of discoveredByTargetDir) {\n const first = group[0];\n if (!first) {\n continue;\n }\n const mode: RuntimeSkillsInstallRecord[\"mode\"] = group.some(\n (state) => state.targetMode === \"copy\"\n )\n ? \"copy\"\n : \"symlink\";\n const skillIds = Array.from(\n new Set(group.map((state) => state.skillId))\n ).sort((a, b) => a.localeCompare(b));\n\n byTargetDir.set(targetDir, {\n targetId: first.targetId,\n targetDir,\n mode,\n status: \"installed\",\n skillIds,\n updatedAt: now,\n });\n }\n\n const nextInstalls = [...byTargetDir.values()].sort(compareInstallRecords);\n const previousInstalls = [...(currentSkillsConfig?.installs ?? [])]\n .sort(compareInstallRecords)\n .map(normalizeInstallRecordForCompare);\n const nextComparable = nextInstalls.map(normalizeInstallRecordForCompare);\n if (JSON.stringify(previousInstalls) === JSON.stringify(nextComparable)) {\n return currentSkillsConfig;\n }\n\n return {\n storeDir: currentSkillsConfig?.storeDir ?? skillsDir(),\n ...(currentSkillsConfig?.agents\n ? { agents: currentSkillsConfig.agents }\n : {}),\n ...(currentSkillsConfig?.customTargets\n ? { customTargets: currentSkillsConfig.customTargets }\n : {}),\n installs: nextInstalls,\n };\n });\n}\n\nexport function compareInstallRecords(\n left: RuntimeSkillsInstallRecord,\n right: RuntimeSkillsInstallRecord\n): number {\n const byTargetId = left.targetId.localeCompare(right.targetId);\n if (byTargetId !== 0) {\n return byTargetId;\n }\n return left.targetDir.localeCompare(right.targetDir);\n}\n\nfunction normalizeInstallRecordForCompare(\n input: RuntimeSkillsInstallRecord\n): Omit<RuntimeSkillsInstallRecord, \"updatedAt\"> {\n return {\n targetId: input.targetId,\n targetDir: input.targetDir,\n mode: input.mode,\n status: input.status,\n skillIds: [...input.skillIds].sort((a, b) => a.localeCompare(b)),\n ...(input.reason ? { reason: input.reason } : {}),\n };\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { c as replaceSkillDirectory, f as withSkillsInstallLock, o as writeOpenMeldSkillMarker, s as recoverSkillReplacement, t as resolveSkillInstallStateForTarget } from "./state-CQG3k9eh.js";
3
+ import { c as replaceSkillDirectory, f as withSkillsInstallLock, o as writeOpenMeldSkillMarker, s as recoverSkillReplacement, t as resolveSkillInstallStateForTarget } from "./state-GxF_KAM1.js";
4
4
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
5
5
  import { cp, mkdir, readFile, realpath, symlink } from "node:fs/promises";
6
6
  import process from "node:process";
@@ -122,4 +122,4 @@ async function tryCreateSymlink(input) {
122
122
  //#endregion
123
123
  export { installSkillsToTargets as t };
124
124
 
125
- //# sourceMappingURL=installer-D2bWZT88.js.map
125
+ //# sourceMappingURL=installer-054NLJg6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer-D2bWZT88.js","names":[],"sources":["../src/skills/installer.ts"],"sourcesContent":["import { cp, mkdir, readFile, realpath, symlink } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { withSkillsInstallLock } from \"./install-lock\";\n\n// biome-ignore lint/performance/noBarrelFile: Keep the existing installer lock API while the source store shares its owner.\nexport { withSkillsInstallLock } from \"./install-lock\";\n\nimport {\n recoverSkillReplacement,\n replaceSkillDirectory,\n} from \"./replace-directory\";\nimport type { SkillInstallStateResult } from \"./state\";\nimport { resolveSkillInstallStateForTarget } from \"./state\";\nimport type { LocalSkill } from \"./store\";\nimport { writeOpenMeldSkillMarker } from \"./store\";\n\nexport type SkillsInstallMode = \"symlink\" | \"copy\" | \"unknown\";\nexport type SkillsInstallStatus = \"installed\" | \"skipped\" | \"failed\";\n\nexport type SkillsInstallTarget = {\n id: string;\n dir: string;\n type: \"agent\" | \"custom\";\n};\n\nexport type SkillsInstallResult = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillId: string;\n status: SkillsInstallStatus;\n mode: SkillsInstallMode;\n degraded: boolean;\n reason?: string;\n};\n\nexport function installSkillsToTargets(input: {\n skills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<SkillsInstallResult[]> {\n return withSkillsInstallLock(() => installSkillsToTargetsLocked(input));\n}\n\nasync function installSkillsToTargetsLocked(input: {\n skills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<SkillsInstallResult[]> {\n const results: SkillsInstallResult[] = [];\n\n for (const target of input.targets) {\n for (const skill of input.skills) {\n const result = await installOneSkillToTarget({\n skill,\n target,\n });\n results.push(result);\n }\n }\n\n return results;\n}\n\nasync function installOneSkillToTarget(input: {\n skill: LocalSkill;\n target: SkillsInstallTarget;\n}): Promise<SkillsInstallResult> {\n const targetDir = input.target.dir;\n const failInstall = (reason: string): SkillsInstallResult => ({\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"failed\",\n mode: \"unknown\",\n degraded: false,\n reason,\n });\n\n if (!isAbsolute(targetDir)) {\n return failInstall(\"target dir must be an absolute path\");\n }\n\n const skillId = input.skill.id;\n if (\n skillId.trim().length === 0 ||\n isAbsolute(skillId) ||\n skillId === \".\" ||\n skillId === \"..\" ||\n skillId.includes(\"/\") ||\n skillId.includes(\"\\\\\")\n ) {\n return failInstall(\"skill id would escape target dir\");\n }\n\n const resolvedTargetDir = resolve(targetDir);\n const resolvedSkillDir = resolve(resolvedTargetDir, skillId);\n const skillRelativePath = relative(resolvedTargetDir, resolvedSkillDir);\n if (\n skillRelativePath === \"..\" ||\n skillRelativePath.startsWith(\"../\") ||\n skillRelativePath.startsWith(\"..\\\\\")\n ) {\n return failInstall(\"skill id would escape target dir\");\n }\n\n const skillTargetDir = resolvedSkillDir;\n\n await mkdir(targetDir, { recursive: true });\n await recoverSkillReplacement(skillTargetDir);\n const state = await resolveSkillInstallStateForTarget({\n skill: input.skill,\n target: input.target,\n });\n if (state.state === \"external_conflict\") {\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"skipped\",\n mode: resolveSkippedInstallMode(state),\n degraded: false,\n reason: state.reason,\n };\n }\n\n if (state.state === \"up_to_date\") {\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"skipped\",\n mode: resolveSkippedInstallMode(state),\n degraded: false,\n reason: state.reason,\n };\n }\n\n const installation: { mode: SkillsInstallMode } = { mode: \"symlink\" };\n try {\n await readFile(join(input.skill.absolutePath, \"SKILL.md\"), \"utf8\");\n await replaceSkillDirectory(skillTargetDir, async (stagedDir) => {\n const symlinked = await tryCreateSymlink({\n sourceDir: input.skill.absolutePath,\n targetDir: stagedDir,\n });\n if (symlinked) {\n return;\n }\n installation.mode = \"copy\";\n await cp(input.skill.absolutePath, stagedDir, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await writeOpenMeldSkillMarker({\n skillDir: stagedDir,\n skillId: input.skill.id,\n mode: \"copy\",\n ...(input.skill.contentHash\n ? { contentHash: input.skill.contentHash }\n : {}),\n ...(input.skill.version ? { version: input.skill.version } : {}),\n });\n });\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"installed\",\n mode: installation.mode,\n degraded: installation.mode === \"copy\",\n ...(installation.mode === \"copy\"\n ? { reason: \"symlink failed; fell back to copy\" }\n : {}),\n };\n } catch (error) {\n return failInstall(\n error instanceof Error\n ? error.message\n : \"failed to install skill to target\"\n );\n }\n}\n\nfunction resolveSkippedInstallMode(\n state: SkillInstallStateResult\n): SkillsInstallMode {\n if (state.targetMode === \"copy\") {\n return \"copy\";\n }\n if (state.targetMode === \"symlink\") {\n return \"symlink\";\n }\n return \"unknown\";\n}\n\nasync function tryCreateSymlink(input: {\n sourceDir: string;\n targetDir: string;\n}): Promise<boolean> {\n try {\n await mkdir(dirname(input.targetDir), { recursive: true });\n\n const targetParentDir = dirname(input.targetDir);\n const resolvedTargetParentDir = await realpath(targetParentDir).catch(\n () => targetParentDir\n );\n const resolvedSourceDir = await realpath(input.sourceDir).catch(\n () => input.sourceDir\n );\n const relativeTarget = relative(resolvedTargetParentDir, resolvedSourceDir);\n await symlink(\n process.platform === \"win32\" ? resolvedSourceDir : relativeTarget,\n input.targetDir,\n process.platform === \"win32\" ? \"junction\" : undefined\n );\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"installer-054NLJg6.js","names":[],"sources":["../src/skills/installer.ts"],"sourcesContent":["import { cp, mkdir, readFile, realpath, symlink } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { withSkillsInstallLock } from \"./install-lock\";\n\n// biome-ignore lint/performance/noBarrelFile: Keep the existing installer lock API while the source store shares its owner.\nexport { withSkillsInstallLock } from \"./install-lock\";\n\nimport {\n recoverSkillReplacement,\n replaceSkillDirectory,\n} from \"./replace-directory\";\nimport type { SkillInstallStateResult } from \"./state\";\nimport { resolveSkillInstallStateForTarget } from \"./state\";\nimport type { LocalSkill } from \"./store\";\nimport { writeOpenMeldSkillMarker } from \"./store\";\n\nexport type SkillsInstallMode = \"symlink\" | \"copy\" | \"unknown\";\nexport type SkillsInstallStatus = \"installed\" | \"skipped\" | \"failed\";\n\nexport type SkillsInstallTarget = {\n id: string;\n dir: string;\n type: \"agent\" | \"custom\";\n};\n\nexport type SkillsInstallResult = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillId: string;\n status: SkillsInstallStatus;\n mode: SkillsInstallMode;\n degraded: boolean;\n reason?: string;\n};\n\nexport function installSkillsToTargets(input: {\n skills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<SkillsInstallResult[]> {\n return withSkillsInstallLock(() => installSkillsToTargetsLocked(input));\n}\n\nasync function installSkillsToTargetsLocked(input: {\n skills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<SkillsInstallResult[]> {\n const results: SkillsInstallResult[] = [];\n\n for (const target of input.targets) {\n for (const skill of input.skills) {\n const result = await installOneSkillToTarget({\n skill,\n target,\n });\n results.push(result);\n }\n }\n\n return results;\n}\n\nasync function installOneSkillToTarget(input: {\n skill: LocalSkill;\n target: SkillsInstallTarget;\n}): Promise<SkillsInstallResult> {\n const targetDir = input.target.dir;\n const failInstall = (reason: string): SkillsInstallResult => ({\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"failed\",\n mode: \"unknown\",\n degraded: false,\n reason,\n });\n\n if (!isAbsolute(targetDir)) {\n return failInstall(\"target dir must be an absolute path\");\n }\n\n const skillId = input.skill.id;\n if (\n skillId.trim().length === 0 ||\n isAbsolute(skillId) ||\n skillId === \".\" ||\n skillId === \"..\" ||\n skillId.includes(\"/\") ||\n skillId.includes(\"\\\\\")\n ) {\n return failInstall(\"skill id would escape target dir\");\n }\n\n const resolvedTargetDir = resolve(targetDir);\n const resolvedSkillDir = resolve(resolvedTargetDir, skillId);\n const skillRelativePath = relative(resolvedTargetDir, resolvedSkillDir);\n if (\n skillRelativePath === \"..\" ||\n skillRelativePath.startsWith(\"../\") ||\n skillRelativePath.startsWith(\"..\\\\\")\n ) {\n return failInstall(\"skill id would escape target dir\");\n }\n\n const skillTargetDir = resolvedSkillDir;\n\n await mkdir(targetDir, { recursive: true });\n await recoverSkillReplacement(skillTargetDir);\n const state = await resolveSkillInstallStateForTarget({\n skill: input.skill,\n target: input.target,\n });\n if (state.state === \"external_conflict\") {\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"skipped\",\n mode: resolveSkippedInstallMode(state),\n degraded: false,\n reason: state.reason,\n };\n }\n\n if (state.state === \"up_to_date\") {\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"skipped\",\n mode: resolveSkippedInstallMode(state),\n degraded: false,\n reason: state.reason,\n };\n }\n\n const installation: { mode: SkillsInstallMode } = { mode: \"symlink\" };\n try {\n await readFile(join(input.skill.absolutePath, \"SKILL.md\"), \"utf8\");\n await replaceSkillDirectory(skillTargetDir, async (stagedDir) => {\n const symlinked = await tryCreateSymlink({\n sourceDir: input.skill.absolutePath,\n targetDir: stagedDir,\n });\n if (symlinked) {\n return;\n }\n installation.mode = \"copy\";\n await cp(input.skill.absolutePath, stagedDir, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await writeOpenMeldSkillMarker({\n skillDir: stagedDir,\n skillId: input.skill.id,\n mode: \"copy\",\n ...(input.skill.contentHash\n ? { contentHash: input.skill.contentHash }\n : {}),\n ...(input.skill.version ? { version: input.skill.version } : {}),\n });\n });\n return {\n targetId: input.target.id,\n targetDir,\n targetType: input.target.type,\n skillId: input.skill.id,\n status: \"installed\",\n mode: installation.mode,\n degraded: installation.mode === \"copy\",\n ...(installation.mode === \"copy\"\n ? { reason: \"symlink failed; fell back to copy\" }\n : {}),\n };\n } catch (error) {\n return failInstall(\n error instanceof Error\n ? error.message\n : \"failed to install skill to target\"\n );\n }\n}\n\nfunction resolveSkippedInstallMode(\n state: SkillInstallStateResult\n): SkillsInstallMode {\n if (state.targetMode === \"copy\") {\n return \"copy\";\n }\n if (state.targetMode === \"symlink\") {\n return \"symlink\";\n }\n return \"unknown\";\n}\n\nasync function tryCreateSymlink(input: {\n sourceDir: string;\n targetDir: string;\n}): Promise<boolean> {\n try {\n await mkdir(dirname(input.targetDir), { recursive: true });\n\n const targetParentDir = dirname(input.targetDir);\n const resolvedTargetParentDir = await realpath(targetParentDir).catch(\n () => targetParentDir\n );\n const resolvedSourceDir = await realpath(input.sourceDir).catch(\n () => input.sourceDir\n );\n const relativeTarget = relative(resolvedTargetParentDir, resolvedSourceDir);\n await symlink(\n process.platform === \"win32\" ? resolvedSourceDir : relativeTarget,\n input.targetDir,\n process.platform === \"win32\" ? \"junction\" : undefined\n );\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+
3
+ //#region src/ui/io.ts
4
+ function outLine(line) {
5
+ process.stdout.write(`${line}\n`);
6
+ }
7
+ function outJsonLine(value) {
8
+ process.stdout.write(`${JSON.stringify(value)}\n`);
9
+ }
10
+ function errLine(line) {
11
+ process.stderr.write(`${line}\n`);
12
+ }
13
+ //#endregion
14
+ export { outJsonLine as n, outLine as r, errLine as t };
15
+
16
+ //# sourceMappingURL=io-DT66typ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io-DT66typ4.js","names":[],"sources":["../src/ui/io.ts"],"sourcesContent":["export function outLine(line: string) {\n process.stdout.write(`${line}\\n`);\n}\n\nexport function outJsonLine(value: unknown) {\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n}\n\nexport function errLine(line: string) {\n process.stderr.write(`${line}\\n`);\n}\n"],"mappings":";;;AAAA,SAAgB,QAAQ,MAAc;CACpC,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;AAClC;AAEA,SAAgB,YAAY,OAAgB;CAC1C,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,EAAE,GAAG;AACnD;AAEA,SAAgB,QAAQ,MAAc;CACpC,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;AAClC"}
@@ -415,6 +415,7 @@ strictObject({
415
415
  }),
416
416
  service: strictObject({
417
417
  bundleHash: nullableNonEmptyStringSchema,
418
+ portableBundleHash: nullableNonEmptyStringSchema.optional(),
418
419
  bundleVersion: nonEmptyStringSchema,
419
420
  runtimeContractEpoch: nonEmptyStringSchema,
420
421
  serviceContractVersion: nonEmptyStringSchema,
@@ -572,4 +573,4 @@ function formatLocalSetupActionDescription(action) {
572
573
  //#endregion
573
574
  export { coerce as A, number as B, openMeldToolsUpdateRequestResultSchema as C, ZodIssueCode as D, NEVER as E, iso as F, string as G, preprocess as H, lazySchema as I, union as J, tuple as K, literal as L, email as M, enumFactory as N, array as O, int as P, neverFactory as R, openMeldToolsUpdateProcessFailureFrameSchema as S, resolveOpenMeldToolsUpdateTargetVersions as T, record as U, object as V, strictObject as W, url as X, unknown as Y, openMeldToolsMaintenanceProjectionSchema as _, formatLocalSetupActionLabel as a, openMeldToolsUpdateOperationPhaseSchema as b, localComponentUpdatePolicySchema as c, localComponentsStatusSchema as d, localServiceComponentUpdateProjectionSchema as f, openMeldToolsMaintenanceMutationResultSchema as g, openMeldToolsControlResultSchema as h, formatLocalSetupActionDescription as i, discriminatedUnion as j, boolean as k, localComponentUpdateProjectionSchema as l, openMeldToolsControlRequestSchema as m, formatLocalComponentsSummaryDescription as n, installedLocalComponentsSnapshotSchema as o, openMeldToolsControlCapabilitySchema as p, undefinedFactory as q, formatLocalComponentsSummaryLabel as r, localCliComponentUpdateProjectionSchema as s, OPEN_MELD_TOOLS_UPDATE_FAILURE_DETAIL_MAX_CHARS as t, localComponentUpdateStatusSchema as u, openMeldToolsUpdateAttemptSchema as v, openMeldToolsUpdateRequestSourceSchema as w, openMeldToolsUpdateOperationSchema as x, openMeldToolsUpdateFailureCodeSchema as y, nullFactory as z };
574
575
 
575
- //# sourceMappingURL=local-components-B6SCXZf9.js.map
576
+ //# sourceMappingURL=local-components-DleLEzSU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-components-DleLEzSU.js","names":[],"sources":["../../../packages/schemas/dist/lazy-zod.js","../../../packages/schemas/dist/schemas/local-components.js"],"sourcesContent":["import * as zod from \"zod/v4\";\n//#region src/lazy-zod.ts\nconst NEVER = zod.NEVER;\nconst ZodIssueCode = zod.ZodIssueCode;\nconst DEFERRED_SCHEMA_METHODS = /* @__PURE__ */ new Set([\n\t\"and\",\n\t\"array\",\n\t\"base64\",\n\t\"base64url\",\n\t\"catch\",\n\t\"catchall\",\n\t\"check\",\n\t\"cidrv4\",\n\t\"cidrv6\",\n\t\"clone\",\n\t\"cuid\",\n\t\"cuid2\",\n\t\"date\",\n\t\"datetime\",\n\t\"default\",\n\t\"duration\",\n\t\"e164\",\n\t\"email\",\n\t\"emoji\",\n\t\"endsWith\",\n\t\"exactOptional\",\n\t\"exclude\",\n\t\"extend\",\n\t\"extract\",\n\t\"gt\",\n\t\"gte\",\n\t\"guid\",\n\t\"includes\",\n\t\"input\",\n\t\"int\",\n\t\"ipv4\",\n\t\"ipv6\",\n\t\"jwt\",\n\t\"keyof\",\n\t\"ksuid\",\n\t\"length\",\n\t\"loose\",\n\t\"lowercase\",\n\t\"lt\",\n\t\"lte\",\n\t\"max\",\n\t\"merge\",\n\t\"mime\",\n\t\"min\",\n\t\"multipleOf\",\n\t\"nanoid\",\n\t\"negative\",\n\t\"nonempty\",\n\t\"nonnegative\",\n\t\"nonoptional\",\n\t\"nonpositive\",\n\t\"normalize\",\n\t\"nullable\",\n\t\"nullish\",\n\t\"omit\",\n\t\"optional\",\n\t\"or\",\n\t\"output\",\n\t\"overwrite\",\n\t\"partial\",\n\t\"passthrough\",\n\t\"pick\",\n\t\"pipe\",\n\t\"positive\",\n\t\"prefault\",\n\t\"readonly\",\n\t\"refine\",\n\t\"regex\",\n\t\"removeCatch\",\n\t\"removeDefault\",\n\t\"required\",\n\t\"rest\",\n\t\"safe\",\n\t\"safeExtend\",\n\t\"size\",\n\t\"slugify\",\n\t\"startsWith\",\n\t\"step\",\n\t\"strict\",\n\t\"strip\",\n\t\"superRefine\",\n\t\"time\",\n\t\"toLowerCase\",\n\t\"toUpperCase\",\n\t\"transform\",\n\t\"trim\",\n\t\"ulid\",\n\t\"unwrap\",\n\t\"uppercase\",\n\t\"url\",\n\t\"uuid\",\n\t\"uuidv4\",\n\t\"uuidv6\",\n\t\"uuidv7\",\n\t\"with\",\n\t\"xid\"\n]);\nconst SELF_RETURNING_METHODS = /* @__PURE__ */ new Set([\"brand\", \"finite\"]);\nconst UNHANDLED_PROPERTY = Symbol(\"unhandled lazy Zod property\");\nconst globalRegistry = zod.globalRegistry;\nfunction lazySchema(createSchema) {\n\tlet schema;\n\tlet proxy;\n\tconst target = Object.create(null);\n\tlet targetIsMaterialized = false;\n\tconst resolveSchema = () => {\n\t\tschema ??= createSchema();\n\t\treturn schema;\n\t};\n\tconst readResolvedProperty = (property) => {\n\t\tconst resolved = resolveSchema();\n\t\tconst value = Reflect.get(resolved, property, resolved);\n\t\treturn typeof value === \"function\" ? value.bind(resolved) : value;\n\t};\n\tconst deferSchemaMethod = (property, args) => lazySchema(() => {\n\t\tconst resolved = resolveSchema();\n\t\tconst method = Reflect.get(resolved, property, resolved);\n\t\tif (typeof method !== \"function\") throw new TypeError(`Lazy Zod property ${String(property)} is not callable`);\n\t\tconst result = Reflect.apply(method, resolved, args);\n\t\tif (!(result instanceof zod.ZodType)) throw new TypeError(`Lazy Zod method ${String(property)} did not return a schema`);\n\t\treturn result;\n\t});\n\tconst materializeTarget = () => {\n\t\tconst resolved = resolveSchema();\n\t\tif (targetIsMaterialized) return resolved;\n\t\tReflect.setPrototypeOf(target, Reflect.getPrototypeOf(resolved));\n\t\tfor (const property of Reflect.ownKeys(resolved)) {\n\t\t\tconst descriptor = Reflect.getOwnPropertyDescriptor(resolved, property);\n\t\t\tif (descriptor) Reflect.defineProperty(target, property, descriptor);\n\t\t}\n\t\ttargetIsMaterialized = true;\n\t\treturn resolved;\n\t};\n\tconst readSpecialProperty = (property) => {\n\t\tswitch (property) {\n\t\t\tcase \"description\": {\n\t\t\t\tconst metadata = globalRegistry.get(proxy);\n\t\t\t\treturn metadata && typeof metadata === \"object\" ? Reflect.get(metadata, \"description\") : void 0;\n\t\t\t}\n\t\t\tcase \"apply\": return (operation) => operation(proxy);\n\t\t\tcase \"register\": return (registry, ...metadata) => {\n\t\t\t\tregistry.add(proxy, ...metadata);\n\t\t\t\treturn proxy;\n\t\t\t};\n\t\t\tcase \"meta\": return (...metadata) => {\n\t\t\t\tif (metadata.length === 0) return globalRegistry.get(proxy);\n\t\t\t\tconst registered = deferSchemaMethod(property, withoutRegistryIdentity(metadata));\n\t\t\t\tglobalRegistry.add(registered, ...metadata);\n\t\t\t\treturn registered;\n\t\t\t};\n\t\t\tcase \"describe\": return (description) => {\n\t\t\t\tconst described = deferSchemaMethod(property, [description]);\n\t\t\t\tglobalRegistry.add(described, { description });\n\t\t\t\treturn described;\n\t\t\t};\n\t\t\tcase \"toJSONSchema\": return (...args) => Reflect.apply(zod.toJSONSchema, zod, [proxy, ...args]);\n\t\t\tdefault: return UNHANDLED_PROPERTY;\n\t\t}\n\t};\n\tproxy = new Proxy(target, {\n\t\tdeleteProperty(_target, property) {\n\t\t\tconst deletedFromTarget = Reflect.deleteProperty(target, property);\n\t\t\tconst deletedFromSchema = Reflect.deleteProperty(resolveSchema(), property);\n\t\t\treturn deletedFromTarget && deletedFromSchema;\n\t\t},\n\t\tget(_target, property, receiver) {\n\t\t\tconst specialProperty = readSpecialProperty(property);\n\t\t\tif (specialProperty !== UNHANDLED_PROPERTY) return specialProperty;\n\t\t\tif (SELF_RETURNING_METHODS.has(property)) return () => proxy;\n\t\t\tif (DEFERRED_SCHEMA_METHODS.has(property)) return (...args) => deferSchemaMethod(property, args);\n\t\t\treturn Reflect.getOwnPropertyDescriptor(target, property) ? Reflect.get(target, property, receiver) : readResolvedProperty(property);\n\t\t},\n\t\tgetOwnPropertyDescriptor(_target, property) {\n\t\t\tconst targetDescriptor = Reflect.getOwnPropertyDescriptor(target, property);\n\t\t\tif (targetDescriptor || targetIsMaterialized) return targetDescriptor;\n\t\t\tconst descriptor = Reflect.getOwnPropertyDescriptor(resolveSchema(), property);\n\t\t\treturn descriptor ? {\n\t\t\t\t...descriptor,\n\t\t\t\tconfigurable: true\n\t\t\t} : void 0;\n\t\t},\n\t\tgetPrototypeOf() {\n\t\t\treturn targetIsMaterialized ? Reflect.getPrototypeOf(target) : Reflect.getPrototypeOf(resolveSchema());\n\t\t},\n\t\thas(_target, property) {\n\t\t\treturn Reflect.has(target, property) || Reflect.has(resolveSchema(), property);\n\t\t},\n\t\townKeys() {\n\t\t\tif (targetIsMaterialized) return Reflect.ownKeys(target);\n\t\t\treturn [.../* @__PURE__ */ new Set([...Reflect.ownKeys(target), ...Reflect.ownKeys(resolveSchema())])];\n\t\t},\n\t\tpreventExtensions() {\n\t\t\tconst resolved = materializeTarget();\n\t\t\treturn Reflect.preventExtensions(resolved) && Reflect.preventExtensions(target);\n\t\t},\n\t\tset(_target, property, value) {\n\t\t\tconst resolved = resolveSchema();\n\t\t\tif (!targetIsMaterialized) return Reflect.set(resolved, property, value);\n\t\t\treturn Reflect.set(resolved, property, value) && Reflect.set(target, property, value);\n\t\t}\n\t});\n\treturn proxy;\n}\nfunction withoutRegistryIdentity(metadata) {\n\tconst [firstMetadata] = metadata;\n\tif (!(firstMetadata && typeof firstMetadata === \"object\" && \"id\" in firstMetadata)) return metadata;\n\treturn [Object.fromEntries(Object.entries(firstMetadata).filter(([key]) => key !== \"id\")), ...metadata.slice(1)];\n}\nfunction snapshotFactoryArgument(value) {\n\treturn Array.isArray(value) ? [...value] : value;\n}\nfunction lazyFactory(factory) {\n\tconst invoke = factory;\n\treturn ((...args) => {\n\t\tconst declaredArgs = args.map(snapshotFactoryArgument);\n\t\treturn lazySchema(() => invoke(...declaredArgs));\n\t});\n}\nconst array = lazyFactory(zod.array);\nconst boolean = lazyFactory(zod.boolean);\nconst discriminatedUnion = lazyFactory(zod.discriminatedUnion);\nconst email = lazyFactory(zod.email);\nconst enumFactory = lazyFactory(zod.enum);\nconst int = lazyFactory(zod.int);\nconst literal = lazyFactory(zod.literal);\nconst neverFactory = lazyFactory(zod.never);\nconst nullFactory = lazyFactory(zod.null);\nconst number = lazyFactory(zod.number);\nconst object = lazyFactory(zod.object);\nconst preprocess = lazyFactory(zod.preprocess);\nconst record = lazyFactory(zod.record);\nconst strictObject = lazyFactory(zod.strictObject);\nconst string = lazyFactory(zod.string);\nconst tuple = lazyFactory(zod.tuple);\nconst union = lazyFactory(zod.union);\nconst undefinedFactory = lazyFactory(zod.undefined);\nconst unknown = lazyFactory(zod.unknown);\nconst url = lazyFactory(zod.url);\nconst coerce = {\n\t...zod.coerce,\n\tbigint: lazyFactory(zod.coerce.bigint),\n\tboolean: lazyFactory(zod.coerce.boolean),\n\tdate: lazyFactory(zod.coerce.date),\n\tnumber: lazyFactory(zod.coerce.number),\n\tstring: lazyFactory(zod.coerce.string)\n};\nconst iso = {\n\t...zod.iso,\n\tdate: lazyFactory(zod.iso.date),\n\tdatetime: lazyFactory(zod.iso.datetime),\n\tduration: lazyFactory(zod.iso.duration),\n\ttime: lazyFactory(zod.iso.time)\n};\n//#endregion\nexport { NEVER, ZodIssueCode, array, boolean, coerce, discriminatedUnion, email, enumFactory as enum, int, iso, lazySchema, literal, neverFactory as never, nullFactory as null, number, object, preprocess, record, strictObject, string, tuple, undefinedFactory as undefined, union, unknown, url };\n\n//# sourceMappingURL=lazy-zod.js.map","import { array, boolean, discriminatedUnion, enum as enumFactory, iso, literal, number, strictObject, string } from \"../lazy-zod.js\";\n//#region src/schemas/local-components.ts\nconst LOCAL_COMPONENTS_SCHEMA_VERSION = 1;\nconst nonEmptyStringSchema = string().trim().min(1);\nconst nullableNonEmptyStringSchema = nonEmptyStringSchema.nullable();\nconst localComponentStatusSchema = enumFactory([\n\t\"ok\",\n\t\"update_available\",\n\t\"update_required\"\n]);\nconst localComponentUpdatePolicySchema = enumFactory([\n\t\"ok\",\n\t\"available\",\n\t\"required\"\n]);\nconst localComponentUpdateStatusSchema = enumFactory([\n\t\"current\",\n\t\"update_available\",\n\t\"update_required\",\n\t\"unknown\"\n]);\nconst openMeldToolsUpdateOperationPhaseSchema = enumFactory([\n\t\"waiting_for_work\",\n\t\"updating\",\n\t\"updated\",\n\t\"restored\",\n\t\"needs_help\"\n]);\nconst openMeldToolsUpdateRequestSourceSchema = enumFactory([\n\t\"automatic\",\n\t\"center_agent\",\n\t\"cli\",\n\t\"web\"\n]);\nconst OPEN_MELD_TOOLS_UPDATE_FAILURE_DETAIL_MAX_CHARS = 2048;\nconst openMeldToolsUpdateFailureCodeSchema = enumFactory([\n\t\"cli.update.download_stalled\",\n\t\"cli.update.download_timed_out\",\n\t\"cli.update.download_failed\",\n\t\"cli.update.integrity_check_failed\",\n\t\"cli.update.install_failed\",\n\t\"cli.update.service_alignment_failed\",\n\t\"cli.update.failed\"\n]);\nconst openMeldToolsUpdateProcessFailureFrameSchema = strictObject({\n\tdetail: nonEmptyStringSchema.max(OPEN_MELD_TOOLS_UPDATE_FAILURE_DETAIL_MAX_CHARS),\n\tfailureCode: openMeldToolsUpdateFailureCodeSchema,\n\tschema: literal(\"openmeld-tools-update-process-failure-v1\"),\n\tv: literal(1)\n});\nconst openMeldToolsUpdateOperationSchema = strictObject({\n\toperationId: nonEmptyStringSchema,\n\tphase: openMeldToolsUpdateOperationPhaseSchema,\n\trequestSource: openMeldToolsUpdateRequestSourceSchema,\n\trequestedAt: iso.datetime({ offset: true }),\n\ttargetCliVersion: nonEmptyStringSchema.optional(),\n\ttargetServiceVersion: nonEmptyStringSchema.optional(),\n\ttargetVersion: nonEmptyStringSchema,\n\tupdatedAt: iso.datetime({ offset: true }),\n\turgency: enumFactory([\"available\", \"required\"])\n});\nfunction resolveOpenMeldToolsUpdateTargetVersions(operation) {\n\treturn {\n\t\tcliVersion: operation.targetCliVersion ?? operation.targetVersion,\n\t\tserviceVersion: operation.targetServiceVersion ?? operation.targetVersion\n\t};\n}\nconst openMeldToolsMaintenanceProjectionSchema = strictObject({\n\tautomaticUpdatesEnabled: boolean(),\n\tstatus: enumFactory([\"ready\", \"needs_help\"])\n});\nconst openMeldToolsControlCapabilitySchema = strictObject({\n\trequestAutomaticUpdate: literal(true).optional(),\n\trequestUpdate: literal(true).optional(),\n\tsetAutomaticUpdates: literal(true).optional()\n});\nconst openMeldToolsUpdateRequestResultSchema = discriminatedUnion(\"status\", [\n\tstrictObject({ status: literal(\"disabled\") }),\n\tstrictObject({ status: literal(\"unavailable\") }),\n\tstrictObject({\n\t\tcurrentVersion: nonEmptyStringSchema,\n\t\tstatus: literal(\"current\")\n\t}),\n\tstrictObject({\n\t\toperation: openMeldToolsUpdateOperationSchema,\n\t\tstatus: enumFactory([\"started\", \"already_running\"])\n\t})\n]);\nconst openMeldToolsMaintenanceMutationResultSchema = strictObject({\n\tautomaticUpdatesEnabled: boolean(),\n\tstatus: enumFactory([\"updated\", \"unchanged\"])\n});\nconst openMeldToolsControlRequestSchema = discriminatedUnion(\"operation\", [strictObject({\n\toperation: literal(\"request_update\"),\n\trequestSource: enumFactory([\n\t\t\"automatic\",\n\t\t\"center_agent\",\n\t\t\"web\"\n\t])\n}), strictObject({\n\tautomaticUpdatesEnabled: boolean(),\n\toperation: literal(\"set_automatic_updates\"),\n\trequestSource: enumFactory([\"center_agent\", \"web\"])\n})]);\nconst openMeldToolsControlResultSchema = discriminatedUnion(\"operation\", [strictObject({\n\toperation: literal(\"request_update\"),\n\tresult: openMeldToolsUpdateRequestResultSchema\n}), strictObject({\n\toperation: literal(\"set_automatic_updates\"),\n\tresult: openMeldToolsMaintenanceMutationResultSchema\n})]);\nconst openMeldToolsUpdateAttemptSchema = strictObject({\n\tv: literal(1),\n\tattempts: number().int().nonnegative(),\n\terrorMessage: nullableNonEmptyStringSchema,\n\toperation: openMeldToolsUpdateOperationSchema\n});\nconst localSetupActionSchema = enumFactory([\n\t\"none\",\n\t\"connect_service\",\n\t\"reconnect_service\",\n\t\"update_service\",\n\t\"connect_local_agent\",\n\t\"update_skills\",\n\t\"update_cli\"\n]);\nconst localSetupEntrypointSchema = literal(\"setup\");\nconst localComponentsManifestSchema = strictObject({\n\tschemaVersion: literal(1),\n\topenMeldReleaseVersion: nonEmptyStringSchema,\n\tcli: strictObject({\n\t\tpackageVersion: nonEmptyStringSchema,\n\t\tcommandContractVersion: nonEmptyStringSchema\n\t}),\n\tservice: strictObject({\n\t\tbundleHash: nullableNonEmptyStringSchema,\n\t\tbundleVersion: nonEmptyStringSchema,\n\t\truntimeContractEpoch: nonEmptyStringSchema,\n\t\tserviceContractVersion: nonEmptyStringSchema\n\t}),\n\tskills: strictObject({\n\t\tbundleHash: nullableNonEmptyStringSchema,\n\t\tskillContractVersion: nonEmptyStringSchema,\n\t\tskillIds: array(nonEmptyStringSchema)\n\t})\n});\nconst localComponentsReleaseManifestSchema = strictObject({\n\tschemaVersion: literal(1),\n\tupdatedAt: iso.datetime({ offset: true }),\n\tcomponents: strictObject({\n\t\tcli: strictObject({\n\t\t\tpackageVersion: nonEmptyStringSchema,\n\t\t\tcommandContractVersion: nonEmptyStringSchema,\n\t\t\tupdatePolicy: localComponentUpdatePolicySchema,\n\t\t\treason: nonEmptyStringSchema\n\t\t}),\n\t\tservice: strictObject({\n\t\t\tbundleHash: nullableNonEmptyStringSchema,\n\t\t\tportableBundleHash: nullableNonEmptyStringSchema.optional(),\n\t\t\tbundleVersion: nonEmptyStringSchema,\n\t\t\truntimeContractEpoch: nonEmptyStringSchema,\n\t\t\tserviceContractVersion: nonEmptyStringSchema,\n\t\t\tupdatePolicy: localComponentUpdatePolicySchema,\n\t\t\treason: nonEmptyStringSchema\n\t\t}),\n\t\tskills: strictObject({\n\t\t\tbundleHash: nullableNonEmptyStringSchema,\n\t\t\tskillContractVersion: nonEmptyStringSchema,\n\t\t\tskillIds: array(nonEmptyStringSchema),\n\t\t\tupdatePolicy: localComponentUpdatePolicySchema,\n\t\t\treason: nonEmptyStringSchema\n\t\t})\n\t})\n});\nconst installedLocalComponentsSnapshotSchema = strictObject({\n\tschemaVersion: literal(1),\n\tinstalledAt: iso.datetime({ offset: true }),\n\tsource: enumFactory([\n\t\t\"setup\",\n\t\t\"repair\",\n\t\t\"manual\"\n\t]),\n\tmanifest: localComponentsManifestSchema\n});\nconst localComponentProjectionSchema = strictObject({\n\treasonCodes: array(nonEmptyStringSchema),\n\tstatus: localComponentStatusSchema\n});\nconst localCliComponentProjectionSchema = localComponentProjectionSchema.extend({\n\tcommandContractVersion: nonEmptyStringSchema,\n\tlatestPackageVersion: nullableNonEmptyStringSchema,\n\tpackageVersion: nonEmptyStringSchema,\n\trequiredCommandContractVersion: nullableNonEmptyStringSchema\n});\nconst localServiceComponentProjectionSchema = localComponentProjectionSchema.extend({\n\texpectedBundleHash: nullableNonEmptyStringSchema,\n\texpectedBundleVersion: nonEmptyStringSchema,\n\tinstalledBundleHash: nullableNonEmptyStringSchema,\n\tinstalledBundleVersion: nullableNonEmptyStringSchema,\n\truntimeContractEpoch: nonEmptyStringSchema,\n\tserviceContractVersion: nonEmptyStringSchema\n});\nconst localSkillsComponentProjectionSchema = localComponentProjectionSchema.extend({\n\tcontentRelease: strictObject({\n\t\trevision: number().int().positive(),\n\t\tminimumCliVersion: string().regex(/^\\d+\\.\\d+\\.\\d+$/)\n\t}).optional(),\n\texpectedBundleHash: nullableNonEmptyStringSchema,\n\tinstalledBundleHash: nullableNonEmptyStringSchema,\n\tskillContractVersion: nonEmptyStringSchema,\n\ttargetCount: number().int().nonnegative()\n});\nconst localComponentsStatusSchema = strictObject({\n\tschemaVersion: literal(1),\n\tgeneratedAt: iso.datetime({ offset: true }),\n\tentrypoint: localSetupEntrypointSchema,\n\tsummaryLabel: nonEmptyStringSchema,\n\tsummaryDescription: nonEmptyStringSchema,\n\tsetupAction: localSetupActionSchema,\n\tsetupActionLabel: nonEmptyStringSchema,\n\tsetupActionDescription: nonEmptyStringSchema,\n\tmaintenance: openMeldToolsMaintenanceProjectionSchema.optional(),\n\tupdateOperation: openMeldToolsUpdateOperationSchema.optional(),\n\tcli: localCliComponentProjectionSchema,\n\tservice: localServiceComponentProjectionSchema,\n\tskills: localSkillsComponentProjectionSchema\n});\nconst localServiceComponentUpdateProjectionSchema = strictObject({\n\tinstalledVersion: nullableNonEmptyStringSchema,\n\tlatestVersion: nullableNonEmptyStringSchema,\n\treasonCodes: array(nonEmptyStringSchema),\n\trequiredVersion: nullableNonEmptyStringSchema,\n\tstatus: localComponentUpdateStatusSchema,\n\tupdatePolicy: localComponentUpdatePolicySchema,\n\twakeBlocked: boolean()\n});\nconst localCliComponentUpdateProjectionSchema = strictObject({\n\tcommandContractVersion: nullableNonEmptyStringSchema,\n\tinstalledPackageVersion: nullableNonEmptyStringSchema,\n\tlatestPackageVersion: nullableNonEmptyStringSchema,\n\treasonCodes: array(nonEmptyStringSchema),\n\trequiredCommandContractVersion: nullableNonEmptyStringSchema,\n\tstatus: localComponentUpdateStatusSchema,\n\tupdatePolicy: localComponentUpdatePolicySchema,\n\twakeBlocked: boolean()\n});\nconst localSkillsComponentUpdateProjectionSchema = strictObject({\n\texpectedBundleHash: nullableNonEmptyStringSchema,\n\texpectedTargetCount: number().int().nonnegative(),\n\tinstalledBundleHash: nullableNonEmptyStringSchema,\n\treasonCodes: array(nonEmptyStringSchema),\n\tskillContractVersion: nullableNonEmptyStringSchema,\n\tstatus: localComponentUpdateStatusSchema,\n\ttargetCount: number().int().nonnegative().nullable(),\n\tupdatePolicy: localComponentUpdatePolicySchema,\n\twakeBlocked: boolean()\n});\nconst localComponentUpdateProjectionSchema = strictObject({\n\tschemaVersion: literal(1),\n\tgeneratedAt: iso.datetime({ offset: true }),\n\tsetupAction: localSetupActionSchema,\n\tsetupActionLabel: nonEmptyStringSchema,\n\tsetupActionDescription: nonEmptyStringSchema,\n\thumanSetupCommand: nonEmptyStringSchema,\n\tagentSetupCommand: nonEmptyStringSchema,\n\tmaintenance: openMeldToolsMaintenanceProjectionSchema.optional(),\n\tupdateOperation: openMeldToolsUpdateOperationSchema.optional(),\n\tcli: localCliComponentUpdateProjectionSchema,\n\tservice: localServiceComponentUpdateProjectionSchema,\n\tskills: localSkillsComponentUpdateProjectionSchema\n});\nfunction formatLocalSetupActionLabel(action) {\n\tswitch (action) {\n\t\tcase \"connect_service\": return \"Connect Computer\";\n\t\tcase \"reconnect_service\": return \"Reconnect Computer\";\n\t\tcase \"update_service\": return \"Update OpenMeld on Computer\";\n\t\tcase \"connect_local_agent\": return \"Connect local agent\";\n\t\tcase \"update_skills\": return \"Update OpenMeld skills\";\n\t\tcase \"update_cli\": return \"Update OpenMeld CLI\";\n\t\tcase \"none\": return \"Everything is up to date\";\n\t\tdefault: return action;\n\t}\n}\nfunction formatOpenMeldToolsUpdateFailureMessage(code) {\n\tswitch (code) {\n\t\tcase \"cli.update.download_stalled\": return \"The update download stopped making progress. Check this computer's connection and try again.\";\n\t\tcase \"cli.update.download_timed_out\": return \"The update download exceeded its recovery time. Check this computer's connection and try again.\";\n\t\tcase \"cli.update.download_failed\": return \"The update could not be downloaded. Check this computer's connection and try again.\";\n\t\tcase \"cli.update.integrity_check_failed\": return \"The downloaded update did not pass integrity checks, so it was not installed.\";\n\t\tcase \"cli.update.install_failed\": return \"The update could not be installed.\";\n\t\tcase \"cli.update.service_alignment_failed\": return \"OpenMeld Service could not finish updating.\";\n\t\tcase \"cli.update.failed\": return \"The update could not be completed. Try again or update manually.\";\n\t\tdefault: return code;\n\t}\n}\nfunction findOpenMeldToolsUpdateFailureCode(reasonCodes) {\n\tfor (const reasonCode of reasonCodes) {\n\t\tconst parsed = openMeldToolsUpdateFailureCodeSchema.safeParse(reasonCode);\n\t\tif (parsed.success) return parsed.data;\n\t}\n\treturn null;\n}\nfunction formatLocalComponentsSummaryLabel(input) {\n\tif (input.setupAction !== \"none\") return formatLocalSetupActionLabel(input.setupAction);\n\tswitch (input.cliStatus) {\n\t\tcase \"update_required\": return \"Update OpenMeld CLI\";\n\t\tcase \"update_available\": return \"OpenMeld CLI update available\";\n\t\tcase \"ok\": return \"Everything is up to date\";\n\t\tdefault: return input.cliStatus;\n\t}\n}\nfunction formatLocalComponentsSummaryDescription(input) {\n\tif (input.setupAction !== \"none\") return formatLocalSetupActionDescription(input.setupAction);\n\tswitch (input.cliStatus) {\n\t\tcase \"update_required\": return \"Update OpenMeld CLI before running this setup flow.\";\n\t\tcase \"update_available\": return \"OpenMeld CLI can be updated, but this setup flow can continue.\";\n\t\tcase \"ok\": return \"OpenMeld local components are aligned for this computer.\";\n\t\tdefault: return input.cliStatus;\n\t}\n}\nfunction formatLocalSetupActionDescription(action) {\n\tswitch (action) {\n\t\tcase \"connect_service\": return \"Connect this computer to OpenMeld so local agents can reply in Spaces.\";\n\t\tcase \"reconnect_service\": return \"Reconnect this computer to the current OpenMeld account.\";\n\t\tcase \"update_service\": return \"Update OpenMeld on this computer.\";\n\t\tcase \"connect_local_agent\": return \"Connect this Agent Profile to a local agent runtime on this computer.\";\n\t\tcase \"update_skills\": return \"Update OpenMeld skills through setup on this computer.\";\n\t\tcase \"update_cli\": return \"Update OpenMeld CLI before running this setup flow.\";\n\t\tcase \"none\": return \"OpenMeld local components are aligned for this computer.\";\n\t\tdefault: return action;\n\t}\n}\n//#endregion\nexport { LOCAL_COMPONENTS_SCHEMA_VERSION, OPEN_MELD_TOOLS_UPDATE_FAILURE_DETAIL_MAX_CHARS, findOpenMeldToolsUpdateFailureCode, formatLocalComponentsSummaryDescription, formatLocalComponentsSummaryLabel, formatLocalSetupActionDescription, formatLocalSetupActionLabel, formatOpenMeldToolsUpdateFailureMessage, installedLocalComponentsSnapshotSchema, localCliComponentProjectionSchema, localCliComponentUpdateProjectionSchema, localComponentProjectionSchema, localComponentStatusSchema, localComponentUpdatePolicySchema, localComponentUpdateProjectionSchema, localComponentUpdateStatusSchema, localComponentsManifestSchema, localComponentsReleaseManifestSchema, localComponentsStatusSchema, localServiceComponentProjectionSchema, localServiceComponentUpdateProjectionSchema, localSetupActionSchema, localSetupEntrypointSchema, localSkillsComponentProjectionSchema, localSkillsComponentUpdateProjectionSchema, openMeldToolsControlCapabilitySchema, openMeldToolsControlRequestSchema, openMeldToolsControlResultSchema, openMeldToolsMaintenanceMutationResultSchema, openMeldToolsMaintenanceProjectionSchema, openMeldToolsUpdateAttemptSchema, openMeldToolsUpdateFailureCodeSchema, openMeldToolsUpdateOperationPhaseSchema, openMeldToolsUpdateOperationSchema, openMeldToolsUpdateProcessFailureFrameSchema, openMeldToolsUpdateRequestResultSchema, openMeldToolsUpdateRequestSourceSchema, resolveOpenMeldToolsUpdateTargetVersions };\n\n//# sourceMappingURL=local-components.js.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { i as readProcessStartIdentity, n as isPreciseProcessStartIdentity, r as isProcessIdentityAlive, t as CURRENT_PROCESS_START_IDENTITY } from "./process-identity-CNus0e6E.js";
3
+ import { i as readProcessStartIdentity, n as isPreciseProcessStartIdentity, r as isProcessIdentityAlive, t as CURRENT_PROCESS_START_IDENTITY } from "./process-identity-BQLdaZdB.js";
4
4
  import { createHash, randomUUID } from "node:crypto";
5
5
  import { homedir } from "node:os";
6
6
  import { basename, dirname, join, parse, resolve } from "node:path";
@@ -89,6 +89,9 @@ function openMeldBackupsDir() {
89
89
  const root = openMeldRootDir();
90
90
  return join(dirname(root), `${basename(root)}-backups`);
91
91
  }
92
+ function openMeldManagedBinaryName() {
93
+ return process.platform === "win32" ? "openmeld.exe" : "openmeld";
94
+ }
92
95
  function openMeldVersionsDir(input = {}) {
93
96
  return join(resolveOpenMeldRootDir(input), "versions");
94
97
  }
@@ -96,13 +99,13 @@ function openMeldManagedVersionDir(version, input = {}) {
96
99
  return join(openMeldVersionsDir(input), normalizePathSegment(version, "unknown"));
97
100
  }
98
101
  function openMeldManagedVersionBinaryPath(version, input = {}) {
99
- return join(openMeldManagedVersionDir(version, input), "openmeld");
102
+ return join(openMeldManagedVersionDir(version, input), openMeldManagedBinaryName());
100
103
  }
101
104
  function openMeldBinDir(input = {}) {
102
105
  return join(resolveOpenMeldRootDir(input), "bin");
103
106
  }
104
107
  function openMeldManagedBinaryPath(input = {}) {
105
- return join(openMeldBinDir(input), "openmeld");
108
+ return join(openMeldBinDir(input), openMeldManagedBinaryName());
106
109
  }
107
110
  function accountsDir() {
108
111
  return join(openMeldRootDir(), "accounts");
@@ -1215,6 +1218,6 @@ function toErrorMessage(error) {
1215
1218
  return error instanceof Error ? error.message : String(error);
1216
1219
  }
1217
1220
  //#endregion
1218
- export { openMeldManagedVersionDir as $, OPENMELD_HOME_ENV_KEY as A, devicePreferencesPath as B, assessLocalMachineFailure as C, isLocalMachineFailureError as D, createServiceSpawnPendingIssue as E, accountsDir as F, legacyAccountProfileSpacesDir as G, deviceSkillsInstallsPath as H, deviceAgentRuntimePath as I, normalizeOpenMeldProfileId as J, legacyRuntimeConfigPath as K, deviceOpenClawProfileBootstrapPath as L, accountProfileSpaceCacheDir as M, accountProfileViewPath as N, toRecognizedLocalMachineFailureError as O, accountProfileWorkspacePath as P, openMeldManagedVersionBinaryPath as Q, deviceOpenClawProfileDir as R, LocalMachineFailureError as S, createOrphanedSetupConcurrencyIssue as T, deviceSkillsStorePath as U, deviceSkillsCustomTargetsPath as V, isPublishedOpenMeldHome as W, openMeldBinDir as X, openMeldBackupsDir as Y, openMeldManagedBinaryPath as Z, resolveCliContext as _, isOpenMeldOrphanedLockError as a, resolveDefaultOpenMeldHomeDirname as at, formatLaneScopeSentence as b, releaseLockSync as c, resolveOpenMeldEnvPreset as ct, runWithHeldLock as d, resolveOpenMeldServiceScope as dt, openMeldRootDir as et, tryCleanupStaleLock as f, runtimeDir as ft, readCliContextState as g, systemDir as gt, listCliContextStates as h, spacesDir as ht, isOpenMeldLockError as i, profileViewPath as it, accountProfileLocalMetaPath as j, formatLocalMachineIssueMessage as k, repairOrphanedLegacyLocks as l, resolveOpenMeldRootDir as lt, OPENMELD_CLI_CONTEXT_ENV_KEY as m, skillsDir as mt, attachLockProcess as n, organizationSkillReleaseDir as nt, readLockMeta as o, resolveExplicitOpenMeldEnvPreset as ot, LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY as p, runtimeLogsDir as pt, normalizeAccountKey as q, buildOpenMeldOrphanedLockAction as r, profileDir as rt, releaseLock as s, resolveOpenMeldCliEntryNameFromArgv as st, acquireLock as t, openMeldVersionsDir as tt, resolveOpenMeldOrphanedLockIssue as u, resolveOpenMeldServiceOwnedPathInput as ut, resolveCliContextId as v, createActiveSetupConcurrencyIssue as w, resolveOpenMeldLaneDescriptor as x, writeCliContextState as y, deviceOpenClawProfileWorkspaceDir as z };
1221
+ export { openMeldManagedVersionBinaryPath as $, OPENMELD_HOME_ENV_KEY as A, devicePreferencesPath as B, assessLocalMachineFailure as C, isLocalMachineFailureError as D, createServiceSpawnPendingIssue as E, accountsDir as F, legacyAccountProfileSpacesDir as G, deviceSkillsInstallsPath as H, deviceAgentRuntimePath as I, normalizeOpenMeldProfileId as J, legacyRuntimeConfigPath as K, deviceOpenClawProfileBootstrapPath as L, accountProfileSpaceCacheDir as M, accountProfileViewPath as N, toRecognizedLocalMachineFailureError as O, accountProfileWorkspacePath as P, openMeldManagedBinaryPath as Q, deviceOpenClawProfileDir as R, LocalMachineFailureError as S, createOrphanedSetupConcurrencyIssue as T, deviceSkillsStorePath as U, deviceSkillsCustomTargetsPath as V, isPublishedOpenMeldHome as W, openMeldBinDir as X, openMeldBackupsDir as Y, openMeldManagedBinaryName as Z, resolveCliContext as _, systemDir as _t, isOpenMeldOrphanedLockError as a, profileViewPath as at, formatLaneScopeSentence as b, releaseLockSync as c, resolveOpenMeldCliEntryNameFromArgv as ct, runWithHeldLock as d, resolveOpenMeldServiceOwnedPathInput as dt, openMeldManagedVersionDir as et, tryCleanupStaleLock as f, resolveOpenMeldServiceScope as ft, readCliContextState as g, spacesDir as gt, listCliContextStates as h, skillsDir as ht, isOpenMeldLockError as i, profileDir as it, accountProfileLocalMetaPath as j, formatLocalMachineIssueMessage as k, repairOrphanedLegacyLocks as l, resolveOpenMeldEnvPreset as lt, OPENMELD_CLI_CONTEXT_ENV_KEY as m, runtimeLogsDir as mt, attachLockProcess as n, openMeldVersionsDir as nt, readLockMeta as o, resolveDefaultOpenMeldHomeDirname as ot, LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY as p, runtimeDir as pt, normalizeAccountKey as q, buildOpenMeldOrphanedLockAction as r, organizationSkillReleaseDir as rt, releaseLock as s, resolveExplicitOpenMeldEnvPreset as st, acquireLock as t, openMeldRootDir as tt, resolveOpenMeldOrphanedLockIssue as u, resolveOpenMeldRootDir as ut, resolveCliContextId as v, createActiveSetupConcurrencyIssue as w, resolveOpenMeldLaneDescriptor as x, writeCliContextState as y, deviceOpenClawProfileWorkspaceDir as z };
1219
1222
 
1220
- //# sourceMappingURL=lock-Bsl_ElWy.js.map
1223
+ //# sourceMappingURL=lock-iue1J2xy.js.map