openmeld 0.3.294 → 0.3.295

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 (56) hide show
  1. package/dist/{add-me-membership-C4nE3q77.js → add-me-membership-CM0Z3OIU.js} +2 -2
  2. package/dist/{add-me-membership-C4nE3q77.js.map → add-me-membership-CM0Z3OIU.js.map} +1 -1
  3. package/dist/{agents-n8zJg-mP.js → agents-DMy2nQul.js} +3 -3
  4. package/dist/{agents-n8zJg-mP.js.map → agents-DMy2nQul.js.map} +1 -1
  5. package/dist/{command-tf3JS9zQ.js → command-BzMRuqeP.js} +6 -6
  6. package/dist/{command-tf3JS9zQ.js.map → command-BzMRuqeP.js.map} +1 -1
  7. package/dist/{computer-connection-review-Du83vbfo.js → computer-connection-review-DKKoSgNl.js} +2 -2
  8. package/dist/{computer-connection-review-Du83vbfo.js.map → computer-connection-review-DKKoSgNl.js.map} +1 -1
  9. package/dist/{computer-disconnect-DwEkzrH8.js → computer-disconnect-Cd6qNdlo.js} +3 -3
  10. package/dist/{computer-disconnect-DwEkzrH8.js.map → computer-disconnect-Cd6qNdlo.js.map} +1 -1
  11. package/dist/{computer-setup-continuation-D1OrA5G_.js → computer-setup-continuation-DEi94Jzc.js} +3 -3
  12. package/dist/{computer-setup-continuation-D1OrA5G_.js.map → computer-setup-continuation-DEi94Jzc.js.map} +1 -1
  13. package/dist/{daemon-lifecycle-journal-BV6D0rSF.js → daemon-lifecycle-journal-D1dCp8bJ.js} +2 -2
  14. package/dist/{daemon-lifecycle-journal-BV6D0rSF.js.map → daemon-lifecycle-journal-D1dCp8bJ.js.map} +1 -1
  15. package/dist/{daemon-service-runtime-BKUCCet9.js → daemon-service-runtime-C1o0PjSJ.js} +2 -2
  16. package/dist/{daemon-service-runtime-BKUCCet9.js.map → daemon-service-runtime-C1o0PjSJ.js.map} +1 -1
  17. package/dist/{dist-BQj7QeWU.js → dist-CQRhcL_T.js} +9 -9
  18. package/dist/{dual-view-guide-catalog-cokJ8-5D.js → dual-view-guide-catalog-DljFCp4Y.js} +2 -2
  19. package/dist/{dual-view-guide-catalog-cokJ8-5D.js.map → dual-view-guide-catalog-DljFCp4Y.js.map} +1 -1
  20. package/dist/{entry-Dej02SVj.js → entry-DvVWq0E3.js} +2 -2
  21. package/dist/{entry-Dej02SVj.js.map → entry-DvVWq0E3.js.map} +1 -1
  22. package/dist/{installation-inventory-C8O-r8eI.js → installation-inventory-D6L-BdIi.js} +2 -2
  23. package/dist/{installation-inventory-C8O-r8eI.js.map → installation-inventory-D6L-BdIi.js.map} +1 -1
  24. package/dist/{installer-B_Vvfk67.js → installer-CW2tqKD4.js} +2 -2
  25. package/dist/{installer-B_Vvfk67.js.map → installer-CW2tqKD4.js.map} +1 -1
  26. package/dist/{meta-api-brhELEyk.js → meta-api-CaQ0OVVz.js} +2 -2
  27. package/dist/{meta-api-brhELEyk.js.map → meta-api-CaQ0OVVz.js.map} +1 -1
  28. package/dist/{openmeld-BtdOh4Rn.js → openmeld-ChVuhWd4.js} +20 -20
  29. package/dist/{openmeld-BtdOh4Rn.js.map → openmeld-ChVuhWd4.js.map} +1 -1
  30. package/dist/{openmeld-maintenance-worker-Cu-c8PjX.js → openmeld-maintenance-worker-18yNz_T9.js} +8 -8
  31. package/dist/{openmeld-maintenance-worker-Cu-c8PjX.js.map → openmeld-maintenance-worker-18yNz_T9.js.map} +1 -1
  32. package/dist/{openmeld-tools-update-coordinator-y37jBxio.js → openmeld-tools-update-coordinator-Doj6V0Qx.js} +3 -3
  33. package/dist/{openmeld-tools-update-coordinator-y37jBxio.js.map → openmeld-tools-update-coordinator-Doj6V0Qx.js.map} +1 -1
  34. package/dist/openmeld.js +4 -4
  35. package/dist/{prepare-session-executor-BnBsq6Vg.js → prepare-session-executor-ChlTN4_s.js} +10 -10
  36. package/dist/{prepare-session-executor-BnBsq6Vg.js.map → prepare-session-executor-ChlTN4_s.js.map} +1 -1
  37. package/dist/{runtime-MZYGkNRp.js → runtime-DxUsqAl4.js} +6 -6
  38. package/dist/{runtime-MZYGkNRp.js.map → runtime-DxUsqAl4.js.map} +1 -1
  39. package/dist/{service-account-control-Sh8RsnY4.js → service-account-control-DZReqRJV.js} +4 -4
  40. package/dist/{service-account-control-Sh8RsnY4.js.map → service-account-control-DZReqRJV.js.map} +1 -1
  41. package/dist/{service-control-capabilities-BqgOUxQ-.js → service-control-capabilities-CuDpVm5i.js} +2 -2
  42. package/dist/{service-control-capabilities-BqgOUxQ-.js.map → service-control-capabilities-CuDpVm5i.js.map} +1 -1
  43. package/dist/{service-control-capabilities-_-vnkLh1.js → service-control-capabilities-D2RMffJQ.js} +1 -1
  44. package/dist/{service-B-jrhCpV.js → service-l9DU4V5Q.js} +15 -8
  45. package/dist/service-l9DU4V5Q.js.map +1 -0
  46. package/dist/{state-Dz2UWXBu.js → state-nzWj4_Pk.js} +2 -2
  47. package/dist/{state-Dz2UWXBu.js.map → state-nzWj4_Pk.js.map} +1 -1
  48. package/dist/{updates-api-CXRhfS1w.js → updates-api-Bgme-Wrv.js} +2 -2
  49. package/dist/{updates-api-CXRhfS1w.js.map → updates-api-Bgme-Wrv.js.map} +1 -1
  50. package/dist/upgrade-BminOoZS.js +3 -0
  51. package/dist/{upgrade-BtpXCy-Y.js → upgrade-i_sFuGdy.js} +5 -5
  52. package/dist/{upgrade-BtpXCy-Y.js.map → upgrade-i_sFuGdy.js.map} +1 -1
  53. package/dist/windows/openmeld-windows-process.exe +0 -0
  54. package/package.json +9 -9
  55. package/dist/service-B-jrhCpV.js.map +0 -1
  56. package/dist/upgrade-CvNhk6zk.js +0 -3
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import "./daemon-device-id-DLKuN3Eo.js";
4
- import { C as createQuietPresenter, d as runDaemonServiceDetached, ht as fetchAuthUserSnapshot, m as runDaemonStop } from "./service-B-jrhCpV.js";
4
+ import { C as createQuietPresenter, d as runDaemonServiceDetached, ht as fetchAuthUserSnapshot, m as runDaemonStop } from "./service-l9DU4V5Q.js";
5
5
  import { i as serviceAccountControlRequestSchema } from "./service-account-admission-DN33uHmt.js";
6
- import { r as readCurrentDaemonRuntimeContext } from "./daemon-service-runtime-BKUCCet9.js";
6
+ import { r as readCurrentDaemonRuntimeContext } from "./daemon-service-runtime-C1o0PjSJ.js";
7
7
  import { r as readDaemonRuntimeLease } from "./daemon-runtime-lease-BMT2SIW9.js";
8
- import { Ht as resolveInstalledDaemonSystemServiceCommandSpec } from "./openmeld-tools-update-coordinator-y37jBxio.js";
8
+ import { Ht as resolveInstalledDaemonSystemServiceCommandSpec } from "./openmeld-tools-update-coordinator-Doj6V0Qx.js";
9
9
  import { E as withAdmittedServiceSession, M as readServiceAccountAdmission, N as reserveServiceAccountAdmission, P as withAuthSessionTransitionMutationLock, d as getAuthSessionState, j as cancelServiceAccountAdmission, k as ServiceAccountAdmissionError, o as buildStoredAuthSessionIdentity, x as readServiceAdmissionSessionWithOwnership } from "./auth-session-QFK36vfX.js";
10
10
  import { i as readProcessStartIdentity } from "./process-identity-DsKKbftl.js";
11
11
  import { n as resolveRuntimeContext } from "./context-DqEUJy_k.js";
@@ -155,4 +155,4 @@ async function requestAccountCheckedServiceStop({ id, manager, contract }) {
155
155
  //#endregion
156
156
  export { runServiceAccountControl as t };
157
157
 
158
- //# sourceMappingURL=service-account-control-Sh8RsnY4.js.map
158
+ //# sourceMappingURL=service-account-control-DZReqRJV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-account-control-Sh8RsnY4.js","names":["delay"],"sources":["../src/commands/service-account-control.ts"],"sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport {\n SERVICE_ACCOUNT_STOP_REFUSED_CODE,\n type ServiceAccountControlRequest,\n serviceAccountControlRequestSchema,\n} from \"@openmeld/schemas\";\nimport {\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n readServiceAdmissionSessionWithOwnership,\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../config/auth-session\";\nimport { withAuthSessionTransitionMutationLock } from \"../config/auth-session-transition-lock\";\nimport { readDaemonRuntimeLease } from \"../config/daemon-runtime-lease\";\nimport {\n readDaemonServiceContract,\n restoreRefusedDaemonStopIntent,\n upsertDaemonServiceContract,\n} from \"../config/daemon-service-contract\";\nimport { withDaemonServiceRunLock } from \"../config/daemon-state\";\nimport {\n cancelServiceAccountAdmission,\n readServiceAccountAdmission,\n reserveServiceAccountAdmission,\n ServiceAccountAdmissionError,\n} from \"../config/service-account-admission\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../local-service/control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../local-service/core/constants\";\nimport { resolveInstalledDaemonSystemServiceCommandSpec } from \"../local-service/lifecycle/daemon-service-command-spec\";\nimport {\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveServiceAccountIdentity } from \"../local-service/lifecycle/service-account-authorization\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { readProcessStartIdentity } from \"../system/process-identity\";\nimport { fetchAuthUserSnapshot } from \"./auth-device-session-client\";\nimport { runDaemonServiceDetached, runDaemonStop } from \"./service\";\nimport { createQuietPresenter } from \"./service-output\";\n\ntype Contract = NonNullable<\n Awaited<ReturnType<typeof readDaemonServiceContract>>\n>;\n\nfunction refused(reason: string, message: string): never {\n throw new ServiceAccountAdmissionError(reason, message);\n}\n\nexport async function runServiceAccountControl(\n request: ServiceAccountControlRequest,\n expectedSessionIdentity?: string\n): Promise<void> {\n const parsed = serviceAccountControlRequestSchema.safeParse(request);\n if (!parsed.success) {\n refused(\n \"missing_account\",\n \"Choose a signed-in account before controlling this Service.\"\n );\n }\n const input = parsed.data;\n const auth = await getAuthSessionState();\n if (auth.state !== \"valid\" || !auth.session) {\n refused(\n \"authentication_required\",\n \"Sign in to the CLI with the matching account and try again.\"\n );\n }\n const preparedSession = auth.session;\n if (preparedSession.user?.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI is signed in to a different account. Sign in with the matching account and try again.\"\n );\n }\n // The shared Auth endpoint proves the principal. Local metadata alone does not.\n const user = await fetchAuthUserSnapshot({\n authBaseUrl: preparedSession.authBaseUrl,\n accessToken: preparedSession.accessToken,\n });\n if (user.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI session belongs to a different account. Sign in again and retry.\"\n );\n }\n\n await withDaemonServiceRunLock(async () => {\n const contract = await readDaemonServiceContract();\n if (!contract) {\n refused(\n \"ownership_unknown\",\n \"Connect this computer through OpenMeld setup before controlling its Service.\"\n );\n }\n const observed = await readCurrentDaemonRuntimeContext();\n const lease = await readDaemonRuntimeLease();\n if (\n input.operation === \"start\" &&\n observed.effectiveRuntimeStatus !== \"not_running\"\n ) {\n refused(\n \"busy\",\n \"The Service is already running or its state is uncertain. Check Service status before trying again.\"\n );\n }\n if (\n input.operation === \"stop\" &&\n (observed.effectiveRuntimeStatus !== \"running\" ||\n !lease ||\n lease.generation !== contract.generation)\n ) {\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not verify the running Service. Check Service status before trying again.\"\n );\n }\n\n let boundSession: StoredAuthSession = preparedSession;\n const reservation = await withAuthSessionTransitionMutationLock(\n async () => {\n boundSession = await readServiceAdmissionSessionWithOwnership();\n if (\n (expectedSessionIdentity !== undefined &&\n buildStoredAuthSessionIdentity(boundSession) !==\n expectedSessionIdentity) ||\n boundSession.accessToken !== preparedSession.accessToken ||\n boundSession.createdAt !== preparedSession.createdAt ||\n boundSession.user?.id !== input.expectedAccount\n ) {\n refused(\n \"account_changed\",\n \"The CLI sign-in changed before this action was accepted. Check the account and try again.\"\n );\n }\n const current = await readDaemonServiceContract();\n if (!current || JSON.stringify(current) !== JSON.stringify(contract)) {\n refused(\n \"ownership_changed\",\n \"The Service changed before this action was accepted. Check its status and try again.\"\n );\n }\n const identity = await resolveServiceAccountIdentity(\n boundSession,\n contract\n );\n if (\n input.operation === \"start\" &&\n contract.desiredState !== \"background\"\n ) {\n identity.contractGeneration += 1;\n }\n return await reserveServiceAccountAdmission({\n operation: input.operation,\n identity,\n ...(input.operation === \"stop\" && lease\n ? {\n target: {\n ownerPid: lease.pid,\n ownerProcessStartedAt:\n readProcessStartIdentity(lease.pid) ??\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not identify the Service process. Check its status and try again.\"\n ),\n },\n }\n : {}),\n });\n }\n );\n\n try {\n await withAdmittedServiceSession(boundSession, async () => {\n if (input.operation === \"stop\") {\n await stopReservedService(contract, reservation.id, lease?.pid ?? 0);\n return;\n }\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n if (\n contract.serviceController !== \"legacy-detached\" &&\n !(manager && (await manager.status()).installed)\n ) {\n refused(\n \"installation_required\",\n \"This Service needs setup before it can start. Run OpenMeld setup and try again.\"\n );\n }\n await upsertDaemonServiceContract({\n ...contract,\n desiredState: \"background\",\n });\n if (contract.serviceController === \"legacy-detached\") {\n const runtime = await resolveRuntimeContext({ view: \"agent\" });\n await runDaemonServiceDetached({\n accountAdmissionId: reservation.id,\n deviceId: contract.deviceId,\n gatewayUrl: contract.gatewayUrl,\n heartbeatMs: contract.heartbeatMs,\n runtime,\n presenter: createQuietPresenter(runtime),\n mode: \"background\",\n });\n } else if (manager) {\n // Refresh the existing stopped supervisor definition with an immutable\n // generation argument. Never install a missing Service.\n await manager.deactivate();\n await manager.install(\n await resolveInstalledDaemonSystemServiceCommandSpec({\n controller: manager.controller,\n accountAdmissionId: reservation.id,\n })\n );\n await manager.start();\n }\n await waitForAdmittedService(reservation.id);\n });\n } finally {\n await cancelServiceAccountAdmission(reservation.id);\n }\n });\n}\n\nasync function waitForAdmittedService(id: string): Promise<void> {\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n const current = await readServiceAccountAdmission();\n const runtime = await readCurrentDaemonRuntimeContext();\n if (\n current?.id === id &&\n current.state === \"admitted\" &&\n current.carrier?.ownerPid === runtime.runtimeStatus.pid &&\n runtime.effectiveRuntimeStatus === \"running\"\n ) {\n return;\n }\n await delay(50);\n }\n refused(\n \"startup_unconfirmed\",\n \"OpenMeld could not confirm that this Service started. Check Service status before trying again.\"\n );\n}\n\nasync function stopReservedService(\n contract: Contract,\n id: string,\n pid: number\n): Promise<void> {\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n await requestAccountCheckedServiceStop({ id, manager, contract });\n const admitted = await readServiceAccountAdmission();\n if (\n admitted?.id !== id ||\n admitted.state !== \"admitted\" ||\n admitted.carrier?.ownerPid !== pid\n ) {\n refused(\n \"admission_unconfirmed\",\n \"OpenMeld could not verify that the matching Service accepted Stop. Check Service status before trying again.\"\n );\n }\n const current = await readCurrentDaemonRuntimeContext();\n if (current.runtimeStatus.pid !== null && current.runtimeStatus.pid !== pid) {\n refused(\n \"ownership_changed\",\n \"Another Service instance is now running. Its state was left unchanged.\"\n );\n }\n await runDaemonStop(\n { json: true, view: \"agent\" },\n {\n completedControlledShutdownOwnerPid: pid,\n }\n );\n}\n\nexport async function requestAccountCheckedServiceStop({\n id,\n manager,\n contract,\n}: {\n id: string;\n contract: Contract;\n manager: Pick<\n DaemonServiceManager,\n \"status\" | \"disableAutostart\" | \"enableAutostart\"\n > | null;\n}): Promise<void> {\n const wasEnabled = manager ? (await manager.status()).enabled : false;\n // Persist intent before contacting the carrier. A timeout is ambiguous and\n // must leave autostart disabled; only a proven pre-commit refusal can undo it.\n const stopped = await upsertDaemonServiceContract(\n { ...contract, desiredState: \"stopped\", autoStart: false },\n {},\n { expectedCurrentContract: contract }\n );\n if (manager) {\n await manager.disableAutostart();\n }\n // No compatibility fallback: only the verified carrier may admit this stop.\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n accountAdmissionId: id,\n mode: \"graceful\",\n gracePeriodMs: 2000,\n },\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n if (!shutdown.accepted) {\n throw new Error(\"The Service did not confirm controlled shutdown.\");\n }\n } catch (error) {\n if (\n !(\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === SERVICE_ACCOUNT_STOP_REFUSED_CODE\n )\n ) {\n const detail = error instanceof Error ? error.message : String(error);\n refused(\n \"stop_unconfirmed\",\n `Stop may already be in progress. ${manager ? \"Autostart remains disabled. \" : \"\"}Check Service status before trying again. ${detail}`\n );\n }\n try {\n await restoreRefusedDaemonStopIntent({ previous: contract, stopped });\n if (manager && wasEnabled) {\n await manager.enableAutostart();\n }\n } catch (restoreError) {\n throw new AggregateError(\n [error, restoreError],\n \"Stop was refused and its previous autostart setting could not be restored.\"\n );\n }\n throw error;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service-account-control-DZReqRJV.js","names":["delay"],"sources":["../src/commands/service-account-control.ts"],"sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport {\n SERVICE_ACCOUNT_STOP_REFUSED_CODE,\n type ServiceAccountControlRequest,\n serviceAccountControlRequestSchema,\n} from \"@openmeld/schemas\";\nimport {\n buildStoredAuthSessionIdentity,\n getAuthSessionState,\n readServiceAdmissionSessionWithOwnership,\n type StoredAuthSession,\n withAdmittedServiceSession,\n} from \"../config/auth-session\";\nimport { withAuthSessionTransitionMutationLock } from \"../config/auth-session-transition-lock\";\nimport { readDaemonRuntimeLease } from \"../config/daemon-runtime-lease\";\nimport {\n readDaemonServiceContract,\n restoreRefusedDaemonStopIntent,\n upsertDaemonServiceContract,\n} from \"../config/daemon-service-contract\";\nimport { withDaemonServiceRunLock } from \"../config/daemon-state\";\nimport {\n cancelServiceAccountAdmission,\n readServiceAccountAdmission,\n reserveServiceAccountAdmission,\n ServiceAccountAdmissionError,\n} from \"../config/service-account-admission\";\nimport {\n LocalDaemonControlPlaneClientError,\n requestLocalDaemonShutdown,\n} from \"../local-service/control-plane/client\";\nimport { CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS } from \"../local-service/core/constants\";\nimport { resolveInstalledDaemonSystemServiceCommandSpec } from \"../local-service/lifecycle/daemon-service-command-spec\";\nimport {\n type DaemonServiceManager,\n resolveDaemonServiceManager,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveServiceAccountIdentity } from \"../local-service/lifecycle/service-account-authorization\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { readProcessStartIdentity } from \"../system/process-identity\";\nimport { fetchAuthUserSnapshot } from \"./auth-device-session-client\";\nimport { runDaemonServiceDetached, runDaemonStop } from \"./service\";\nimport { createQuietPresenter } from \"./service-output\";\n\ntype Contract = NonNullable<\n Awaited<ReturnType<typeof readDaemonServiceContract>>\n>;\n\nfunction refused(reason: string, message: string): never {\n throw new ServiceAccountAdmissionError(reason, message);\n}\n\nexport async function runServiceAccountControl(\n request: ServiceAccountControlRequest,\n expectedSessionIdentity?: string\n): Promise<void> {\n const parsed = serviceAccountControlRequestSchema.safeParse(request);\n if (!parsed.success) {\n refused(\n \"missing_account\",\n \"Choose a signed-in account before controlling this Service.\"\n );\n }\n const input = parsed.data;\n const auth = await getAuthSessionState();\n if (auth.state !== \"valid\" || !auth.session) {\n refused(\n \"authentication_required\",\n \"Sign in to the CLI with the matching account and try again.\"\n );\n }\n const preparedSession = auth.session;\n if (preparedSession.user?.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI is signed in to a different account. Sign in with the matching account and try again.\"\n );\n }\n // The shared Auth endpoint proves the principal. Local metadata alone does not.\n const user = await fetchAuthUserSnapshot({\n authBaseUrl: preparedSession.authBaseUrl,\n accessToken: preparedSession.accessToken,\n });\n if (user.id !== input.expectedAccount) {\n refused(\n \"account_mismatch\",\n \"The CLI session belongs to a different account. Sign in again and retry.\"\n );\n }\n\n await withDaemonServiceRunLock(async () => {\n const contract = await readDaemonServiceContract();\n if (!contract) {\n refused(\n \"ownership_unknown\",\n \"Connect this computer through OpenMeld setup before controlling its Service.\"\n );\n }\n const observed = await readCurrentDaemonRuntimeContext();\n const lease = await readDaemonRuntimeLease();\n if (\n input.operation === \"start\" &&\n observed.effectiveRuntimeStatus !== \"not_running\"\n ) {\n refused(\n \"busy\",\n \"The Service is already running or its state is uncertain. Check Service status before trying again.\"\n );\n }\n if (\n input.operation === \"stop\" &&\n (observed.effectiveRuntimeStatus !== \"running\" ||\n !lease ||\n lease.generation !== contract.generation)\n ) {\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not verify the running Service. Check Service status before trying again.\"\n );\n }\n\n let boundSession: StoredAuthSession = preparedSession;\n const reservation = await withAuthSessionTransitionMutationLock(\n async () => {\n boundSession = await readServiceAdmissionSessionWithOwnership();\n if (\n (expectedSessionIdentity !== undefined &&\n buildStoredAuthSessionIdentity(boundSession) !==\n expectedSessionIdentity) ||\n boundSession.accessToken !== preparedSession.accessToken ||\n boundSession.createdAt !== preparedSession.createdAt ||\n boundSession.user?.id !== input.expectedAccount\n ) {\n refused(\n \"account_changed\",\n \"The CLI sign-in changed before this action was accepted. Check the account and try again.\"\n );\n }\n const current = await readDaemonServiceContract();\n if (!current || JSON.stringify(current) !== JSON.stringify(contract)) {\n refused(\n \"ownership_changed\",\n \"The Service changed before this action was accepted. Check its status and try again.\"\n );\n }\n const identity = await resolveServiceAccountIdentity(\n boundSession,\n contract\n );\n if (\n input.operation === \"start\" &&\n contract.desiredState !== \"background\"\n ) {\n identity.contractGeneration += 1;\n }\n return await reserveServiceAccountAdmission({\n operation: input.operation,\n identity,\n ...(input.operation === \"stop\" && lease\n ? {\n target: {\n ownerPid: lease.pid,\n ownerProcessStartedAt:\n readProcessStartIdentity(lease.pid) ??\n refused(\n \"ownership_unknown\",\n \"OpenMeld could not identify the Service process. Check its status and try again.\"\n ),\n },\n }\n : {}),\n });\n }\n );\n\n try {\n await withAdmittedServiceSession(boundSession, async () => {\n if (input.operation === \"stop\") {\n await stopReservedService(contract, reservation.id, lease?.pid ?? 0);\n return;\n }\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n if (\n contract.serviceController !== \"legacy-detached\" &&\n !(manager && (await manager.status()).installed)\n ) {\n refused(\n \"installation_required\",\n \"This Service needs setup before it can start. Run OpenMeld setup and try again.\"\n );\n }\n await upsertDaemonServiceContract({\n ...contract,\n desiredState: \"background\",\n });\n if (contract.serviceController === \"legacy-detached\") {\n const runtime = await resolveRuntimeContext({ view: \"agent\" });\n await runDaemonServiceDetached({\n accountAdmissionId: reservation.id,\n deviceId: contract.deviceId,\n gatewayUrl: contract.gatewayUrl,\n heartbeatMs: contract.heartbeatMs,\n runtime,\n presenter: createQuietPresenter(runtime),\n mode: \"background\",\n });\n } else if (manager) {\n // Refresh the existing stopped supervisor definition with an immutable\n // generation argument. Never install a missing Service.\n await manager.deactivate();\n await manager.install(\n await resolveInstalledDaemonSystemServiceCommandSpec({\n controller: manager.controller,\n accountAdmissionId: reservation.id,\n })\n );\n await manager.start();\n }\n await waitForAdmittedService(reservation.id);\n });\n } finally {\n await cancelServiceAccountAdmission(reservation.id);\n }\n });\n}\n\nasync function waitForAdmittedService(id: string): Promise<void> {\n const deadline = Date.now() + 15_000;\n while (Date.now() < deadline) {\n const current = await readServiceAccountAdmission();\n const runtime = await readCurrentDaemonRuntimeContext();\n if (\n current?.id === id &&\n current.state === \"admitted\" &&\n current.carrier?.ownerPid === runtime.runtimeStatus.pid &&\n runtime.effectiveRuntimeStatus === \"running\"\n ) {\n return;\n }\n await delay(50);\n }\n refused(\n \"startup_unconfirmed\",\n \"OpenMeld could not confirm that this Service started. Check Service status before trying again.\"\n );\n}\n\nasync function stopReservedService(\n contract: Contract,\n id: string,\n pid: number\n): Promise<void> {\n const manager =\n contract.serviceController === \"legacy-detached\"\n ? null\n : await resolveDaemonServiceManager(contract.serviceController);\n await requestAccountCheckedServiceStop({ id, manager, contract });\n const admitted = await readServiceAccountAdmission();\n if (\n admitted?.id !== id ||\n admitted.state !== \"admitted\" ||\n admitted.carrier?.ownerPid !== pid\n ) {\n refused(\n \"admission_unconfirmed\",\n \"OpenMeld could not verify that the matching Service accepted Stop. Check Service status before trying again.\"\n );\n }\n const current = await readCurrentDaemonRuntimeContext();\n if (current.runtimeStatus.pid !== null && current.runtimeStatus.pid !== pid) {\n refused(\n \"ownership_changed\",\n \"Another Service instance is now running. Its state was left unchanged.\"\n );\n }\n await runDaemonStop(\n { json: true, view: \"agent\" },\n {\n completedControlledShutdownOwnerPid: pid,\n }\n );\n}\n\nexport async function requestAccountCheckedServiceStop({\n id,\n manager,\n contract,\n}: {\n id: string;\n contract: Contract;\n manager: Pick<\n DaemonServiceManager,\n \"status\" | \"disableAutostart\" | \"enableAutostart\"\n > | null;\n}): Promise<void> {\n const wasEnabled = manager ? (await manager.status()).enabled : false;\n // Persist intent before contacting the carrier. A timeout is ambiguous and\n // must leave autostart disabled; only a proven pre-commit refusal can undo it.\n const stopped = await upsertDaemonServiceContract(\n { ...contract, desiredState: \"stopped\", autoStart: false },\n {},\n { expectedCurrentContract: contract }\n );\n if (manager) {\n await manager.disableAutostart();\n }\n // No compatibility fallback: only the verified carrier may admit this stop.\n try {\n const shutdown = await requestLocalDaemonShutdown({\n payload: {\n accountAdmissionId: id,\n mode: \"graceful\",\n gracePeriodMs: 2000,\n },\n timeoutMs: CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS,\n });\n if (!shutdown.accepted) {\n throw new Error(\"The Service did not confirm controlled shutdown.\");\n }\n } catch (error) {\n if (\n !(\n error instanceof LocalDaemonControlPlaneClientError &&\n error.code === SERVICE_ACCOUNT_STOP_REFUSED_CODE\n )\n ) {\n const detail = error instanceof Error ? error.message : String(error);\n refused(\n \"stop_unconfirmed\",\n `Stop may already be in progress. ${manager ? \"Autostart remains disabled. \" : \"\"}Check Service status before trying again. ${detail}`\n );\n }\n try {\n await restoreRefusedDaemonStopIntent({ previous: contract, stopped });\n if (manager && wasEnabled) {\n await manager.enableAutostart();\n }\n } catch (restoreError) {\n throw new AggregateError(\n [error, restoreError],\n \"Stop was refused and its previous autostart setting could not be restored.\"\n );\n }\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { a as serviceControlCapabilitiesSchema, o as serviceControlCarrierCapabilitySchema } from "./service-account-admission-DN33uHmt.js";
4
- import { M as resolveAlignedDaemonActiveBundleEntryPath, S as daemonServiceBinaryExecutablePath, j as readDaemonActiveBundleState, r as readCurrentDaemonRuntimeContext } from "./daemon-service-runtime-BKUCCet9.js";
4
+ import { M as resolveAlignedDaemonActiveBundleEntryPath, S as daemonServiceBinaryExecutablePath, j as readDaemonActiveBundleState, r as readCurrentDaemonRuntimeContext } from "./daemon-service-runtime-C1o0PjSJ.js";
5
5
  import { i as readDaemonServiceContract } from "./daemon-service-contract-B1EbK5p7.js";
6
6
  import { s as sendLocalDaemonControlPlaneRequest } from "./client-BPUPVl9o.js";
7
7
  import { S as resolveDaemonServiceManager } from "./daemon-service-manager-CSD613gh.js";
@@ -73,4 +73,4 @@ async function readServiceControlCapabilities(platform = process.platform) {
73
73
  //#endregion
74
74
  export { readServiceControlCapabilities as t };
75
75
 
76
- //# sourceMappingURL=service-control-capabilities-BqgOUxQ-.js.map
76
+ //# sourceMappingURL=service-control-capabilities-CuDpVm5i.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-control-capabilities-BqgOUxQ-.js","names":[],"sources":["../src/commands/service-control-capabilities.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { realpath } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport {\n serviceControlCapabilitiesSchema,\n serviceControlCarrierCapabilitySchema,\n} from \"@openmeld/schemas\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { sendLocalDaemonControlPlaneRequest } from \"../local-service/control-plane/client\";\nimport {\n daemonServiceBinaryExecutablePath,\n readDaemonActiveBundleState,\n resolveAlignedDaemonActiveBundleEntryPath,\n} from \"../local-service/lifecycle/daemon-service-bundle\";\nimport { resolveDaemonServiceManager } from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\n\nasync function resolveCarrierProbe(\n platform: \"darwin\" | \"win32\",\n expectedVersion: string,\n binary: boolean\n) {\n if (platform === \"darwin\") {\n return {\n executable: await realpath(daemonServiceBinaryExecutablePath()),\n canonicalEntry: null,\n protocol: \"account-checked-service-control-v1\",\n };\n }\n // Probe the aligned immutable GUI carrier directly. For npm, bypass the\n // repairing launcher and use its verified JS entry with Start's exact Node.\n const entry = await resolveAlignedDaemonActiveBundleEntryPath({\n expectedVersion,\n });\n return entry\n ? {\n executable: await realpath(binary ? entry : process.execPath),\n canonicalEntry: binary ? null : await realpath(entry),\n protocol: binary\n ? \"account-checked-service-control-v3\"\n : \"account-checked-service-control-v2\",\n }\n : null;\n}\n\n/** Read only: never invoke the repairing npm launcher or a lifecycle operation. */\nexport async function readServiceControlCapabilities(\n platform: NodeJS.Platform = process.platform\n) {\n const unsupported = { deviceId: null, start: false, stop: false };\n if (platform !== \"darwin\" && platform !== \"win32\") {\n return unsupported;\n }\n const contract = await readDaemonServiceContract();\n const bundle = await readDaemonActiveBundleState();\n const binary = bundle?.bundleFormat === \"binary_v1\";\n if (\n contract?.serviceController !==\n (platform === \"win32\" ? \"windows-service\" : \"launchd\") ||\n !(\n binary ||\n (platform === \"win32\" && bundle?.bundleFormat === \"self_contained_v1\")\n )\n ) {\n return unsupported;\n }\n const manager = await resolveDaemonServiceManager(contract.serviceController);\n if (!(manager && (await manager.status()).installed)) {\n return unsupported;\n }\n // Guarded Start refreshes the supervisor command to this canonical executable.\n // Verify the executable that answered, so an old CLI delegating elsewhere\n // cannot advertise another binary's capability as its own.\n const probe = await resolveCarrierProbe(\n platform,\n contract.daemonVersion,\n binary\n );\n if (!probe) {\n return unsupported;\n }\n const { executable, canonicalEntry, protocol } = probe;\n const { stdout } = await promisify(execFile)(\n executable,\n [\n ...(canonicalEntry ? [canonicalEntry] : []),\n \"service\",\n \"control-carrier-capability\",\n \"--json\",\n ],\n { timeout: 10_000, maxBuffer: 16_384, windowsHide: true }\n );\n const carrier = serviceControlCarrierCapabilitySchema.safeParse(\n JSON.parse(stdout)\n );\n if (\n !carrier.success ||\n carrier.data.protocol !== protocol ||\n (await realpath(carrier.data.executable)) !== executable\n ) {\n return unsupported;\n }\n if (\n carrier.data.protocol === \"account-checked-service-control-v2\" &&\n (await realpath(carrier.data.entryScript)) !== canonicalEntry\n ) {\n return unsupported;\n }\n if (\n JSON.stringify(await readDaemonActiveBundleState()) !==\n JSON.stringify(bundle)\n ) {\n return unsupported;\n }\n const runtime = await readCurrentDaemonRuntimeContext();\n if (runtime.effectiveRuntimeStatus === \"not_running\") {\n return { deviceId: contract.deviceId, start: true, stop: false };\n }\n if (runtime.effectiveRuntimeStatus !== \"running\") {\n return unsupported;\n }\n const response = await sendLocalDaemonControlPlaneRequest({\n request: { v: 1, command: \"account_control_capabilities\" },\n });\n return serviceControlCapabilitiesSchema.parse({\n deviceId: contract.deviceId,\n start: false,\n stop:\n response.code === \"service.account_control_capabilities\" &&\n response.payload.supported,\n });\n}\n"],"mappings":";;;;;;;;;;;AAiBA,eAAe,oBACb,UACA,iBACA,QACA;CACA,IAAI,aAAa,UACf,OAAO;EACL,YAAY,MAAM,SAAS,kCAAkC,CAAC;EAC9D,gBAAgB;EAChB,UAAU;CACZ;CAIF,MAAM,QAAQ,MAAM,0CAA0C,EAC5D,gBACF,CAAC;CACD,OAAO,QACH;EACE,YAAY,MAAM,SAAS,SAAS,QAAQ,QAAQ,QAAQ;EAC5D,gBAAgB,SAAS,OAAO,MAAM,SAAS,KAAK;EACpD,UAAU,SACN,uCACA;CACN,IACA;AACN;;AAGA,eAAsB,+BACpB,WAA4B,QAAQ,UACpC;CACA,MAAM,cAAc;EAAE,UAAU;EAAM,OAAO;EAAO,MAAM;CAAM;CAChE,IAAI,aAAa,YAAY,aAAa,SACxC,OAAO;CAET,MAAM,WAAW,MAAM,0BAA0B;CACjD,MAAM,SAAS,MAAM,4BAA4B;CACjD,MAAM,SAAS,QAAQ,iBAAiB;CACxC,IACE,UAAU,uBACP,aAAa,UAAU,oBAAoB,cAC9C,EACE,UACC,aAAa,WAAW,QAAQ,iBAAiB,sBAGpD,OAAO;CAET,MAAM,UAAU,MAAM,4BAA4B,SAAS,iBAAiB;CAC5E,IAAI,EAAE,YAAY,MAAM,QAAQ,OAAO,EAAA,CAAG,YACxC,OAAO;CAKT,MAAM,QAAQ,MAAM,oBAClB,UACA,SAAS,eACT,MACF;CACA,IAAI,CAAC,OACH,OAAO;CAET,MAAM,EAAE,YAAY,gBAAgB,aAAa;CACjD,MAAM,EAAE,WAAW,MAAM,UAAU,QAAQ,CAAC,CAC1C,YACA;EACE,GAAI,iBAAiB,CAAC,cAAc,IAAI,CAAC;EACzC;EACA;EACA;CACF,GACA;EAAE,SAAS;EAAQ,WAAW;EAAQ,aAAa;CAAK,CAC1D;CACA,MAAM,UAAU,sCAAsC,UACpD,KAAK,MAAM,MAAM,CACnB;CACA,IACE,CAAC,QAAQ,WACT,QAAQ,KAAK,aAAa,YACzB,MAAM,SAAS,QAAQ,KAAK,UAAU,MAAO,YAE9C,OAAO;CAET,IACE,QAAQ,KAAK,aAAa,wCACzB,MAAM,SAAS,QAAQ,KAAK,WAAW,MAAO,gBAE/C,OAAO;CAET,IACE,KAAK,UAAU,MAAM,4BAA4B,CAAC,MAClD,KAAK,UAAU,MAAM,GAErB,OAAO;CAET,MAAM,UAAU,MAAM,gCAAgC;CACtD,IAAI,QAAQ,2BAA2B,eACrC,OAAO;EAAE,UAAU,SAAS;EAAU,OAAO;EAAM,MAAM;CAAM;CAEjE,IAAI,QAAQ,2BAA2B,WACrC,OAAO;CAET,MAAM,WAAW,MAAM,mCAAmC,EACxD,SAAS;EAAE,GAAG;EAAG,SAAS;CAA+B,EAC3D,CAAC;CACD,OAAO,iCAAiC,MAAM;EAC5C,UAAU,SAAS;EACnB,OAAO;EACP,MACE,SAAS,SAAS,0CAClB,SAAS,QAAQ;CACrB,CAAC;AACH"}
1
+ {"version":3,"file":"service-control-capabilities-CuDpVm5i.js","names":[],"sources":["../src/commands/service-control-capabilities.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { realpath } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport {\n serviceControlCapabilitiesSchema,\n serviceControlCarrierCapabilitySchema,\n} from \"@openmeld/schemas\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { sendLocalDaemonControlPlaneRequest } from \"../local-service/control-plane/client\";\nimport {\n daemonServiceBinaryExecutablePath,\n readDaemonActiveBundleState,\n resolveAlignedDaemonActiveBundleEntryPath,\n} from \"../local-service/lifecycle/daemon-service-bundle\";\nimport { resolveDaemonServiceManager } from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readCurrentDaemonRuntimeContext } from \"../local-service/lifecycle/daemon-service-runtime\";\n\nasync function resolveCarrierProbe(\n platform: \"darwin\" | \"win32\",\n expectedVersion: string,\n binary: boolean\n) {\n if (platform === \"darwin\") {\n return {\n executable: await realpath(daemonServiceBinaryExecutablePath()),\n canonicalEntry: null,\n protocol: \"account-checked-service-control-v1\",\n };\n }\n // Probe the aligned immutable GUI carrier directly. For npm, bypass the\n // repairing launcher and use its verified JS entry with Start's exact Node.\n const entry = await resolveAlignedDaemonActiveBundleEntryPath({\n expectedVersion,\n });\n return entry\n ? {\n executable: await realpath(binary ? entry : process.execPath),\n canonicalEntry: binary ? null : await realpath(entry),\n protocol: binary\n ? \"account-checked-service-control-v3\"\n : \"account-checked-service-control-v2\",\n }\n : null;\n}\n\n/** Read only: never invoke the repairing npm launcher or a lifecycle operation. */\nexport async function readServiceControlCapabilities(\n platform: NodeJS.Platform = process.platform\n) {\n const unsupported = { deviceId: null, start: false, stop: false };\n if (platform !== \"darwin\" && platform !== \"win32\") {\n return unsupported;\n }\n const contract = await readDaemonServiceContract();\n const bundle = await readDaemonActiveBundleState();\n const binary = bundle?.bundleFormat === \"binary_v1\";\n if (\n contract?.serviceController !==\n (platform === \"win32\" ? \"windows-service\" : \"launchd\") ||\n !(\n binary ||\n (platform === \"win32\" && bundle?.bundleFormat === \"self_contained_v1\")\n )\n ) {\n return unsupported;\n }\n const manager = await resolveDaemonServiceManager(contract.serviceController);\n if (!(manager && (await manager.status()).installed)) {\n return unsupported;\n }\n // Guarded Start refreshes the supervisor command to this canonical executable.\n // Verify the executable that answered, so an old CLI delegating elsewhere\n // cannot advertise another binary's capability as its own.\n const probe = await resolveCarrierProbe(\n platform,\n contract.daemonVersion,\n binary\n );\n if (!probe) {\n return unsupported;\n }\n const { executable, canonicalEntry, protocol } = probe;\n const { stdout } = await promisify(execFile)(\n executable,\n [\n ...(canonicalEntry ? [canonicalEntry] : []),\n \"service\",\n \"control-carrier-capability\",\n \"--json\",\n ],\n { timeout: 10_000, maxBuffer: 16_384, windowsHide: true }\n );\n const carrier = serviceControlCarrierCapabilitySchema.safeParse(\n JSON.parse(stdout)\n );\n if (\n !carrier.success ||\n carrier.data.protocol !== protocol ||\n (await realpath(carrier.data.executable)) !== executable\n ) {\n return unsupported;\n }\n if (\n carrier.data.protocol === \"account-checked-service-control-v2\" &&\n (await realpath(carrier.data.entryScript)) !== canonicalEntry\n ) {\n return unsupported;\n }\n if (\n JSON.stringify(await readDaemonActiveBundleState()) !==\n JSON.stringify(bundle)\n ) {\n return unsupported;\n }\n const runtime = await readCurrentDaemonRuntimeContext();\n if (runtime.effectiveRuntimeStatus === \"not_running\") {\n return { deviceId: contract.deviceId, start: true, stop: false };\n }\n if (runtime.effectiveRuntimeStatus !== \"running\") {\n return unsupported;\n }\n const response = await sendLocalDaemonControlPlaneRequest({\n request: { v: 1, command: \"account_control_capabilities\" },\n });\n return serviceControlCapabilitiesSchema.parse({\n deviceId: contract.deviceId,\n start: false,\n stop:\n response.code === \"service.account_control_capabilities\" &&\n response.payload.supported,\n });\n}\n"],"mappings":";;;;;;;;;;;AAiBA,eAAe,oBACb,UACA,iBACA,QACA;CACA,IAAI,aAAa,UACf,OAAO;EACL,YAAY,MAAM,SAAS,kCAAkC,CAAC;EAC9D,gBAAgB;EAChB,UAAU;CACZ;CAIF,MAAM,QAAQ,MAAM,0CAA0C,EAC5D,gBACF,CAAC;CACD,OAAO,QACH;EACE,YAAY,MAAM,SAAS,SAAS,QAAQ,QAAQ,QAAQ;EAC5D,gBAAgB,SAAS,OAAO,MAAM,SAAS,KAAK;EACpD,UAAU,SACN,uCACA;CACN,IACA;AACN;;AAGA,eAAsB,+BACpB,WAA4B,QAAQ,UACpC;CACA,MAAM,cAAc;EAAE,UAAU;EAAM,OAAO;EAAO,MAAM;CAAM;CAChE,IAAI,aAAa,YAAY,aAAa,SACxC,OAAO;CAET,MAAM,WAAW,MAAM,0BAA0B;CACjD,MAAM,SAAS,MAAM,4BAA4B;CACjD,MAAM,SAAS,QAAQ,iBAAiB;CACxC,IACE,UAAU,uBACP,aAAa,UAAU,oBAAoB,cAC9C,EACE,UACC,aAAa,WAAW,QAAQ,iBAAiB,sBAGpD,OAAO;CAET,MAAM,UAAU,MAAM,4BAA4B,SAAS,iBAAiB;CAC5E,IAAI,EAAE,YAAY,MAAM,QAAQ,OAAO,EAAA,CAAG,YACxC,OAAO;CAKT,MAAM,QAAQ,MAAM,oBAClB,UACA,SAAS,eACT,MACF;CACA,IAAI,CAAC,OACH,OAAO;CAET,MAAM,EAAE,YAAY,gBAAgB,aAAa;CACjD,MAAM,EAAE,WAAW,MAAM,UAAU,QAAQ,CAAC,CAC1C,YACA;EACE,GAAI,iBAAiB,CAAC,cAAc,IAAI,CAAC;EACzC;EACA;EACA;CACF,GACA;EAAE,SAAS;EAAQ,WAAW;EAAQ,aAAa;CAAK,CAC1D;CACA,MAAM,UAAU,sCAAsC,UACpD,KAAK,MAAM,MAAM,CACnB;CACA,IACE,CAAC,QAAQ,WACT,QAAQ,KAAK,aAAa,YACzB,MAAM,SAAS,QAAQ,KAAK,UAAU,MAAO,YAE9C,OAAO;CAET,IACE,QAAQ,KAAK,aAAa,wCACzB,MAAM,SAAS,QAAQ,KAAK,WAAW,MAAO,gBAE/C,OAAO;CAET,IACE,KAAK,UAAU,MAAM,4BAA4B,CAAC,MAClD,KAAK,UAAU,MAAM,GAErB,OAAO;CAET,MAAM,UAAU,MAAM,gCAAgC;CACtD,IAAI,QAAQ,2BAA2B,eACrC,OAAO;EAAE,UAAU,SAAS;EAAU,OAAO;EAAM,MAAM;CAAM;CAEjE,IAAI,QAAQ,2BAA2B,WACrC,OAAO;CAET,MAAM,WAAW,MAAM,mCAAmC,EACxD,SAAS;EAAE,GAAG;EAAG,SAAS;CAA+B,EAC3D,CAAC;CACD,OAAO,iCAAiC,MAAM;EAC5C,UAAU,SAAS;EACnB,OAAO;EACP,MACE,SAAS,SAAS,0CAClB,SAAS,QAAQ;CACrB,CAAC;AACH"}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- export { t as readServiceControlCapabilities } from "./service-control-capabilities-BqgOUxQ-.js";
3
+ export { t as readServiceControlCapabilities } from "./service-control-capabilities-CuDpVm5i.js";
@@ -13,12 +13,12 @@ import { c as resolveCliBinaryPlatform } from "./cli-binary-manifest-DhSiC1mr.js
13
13
  import { A as DAEMON_STREAM_KEEPALIVE_PONG_TIMEOUT_MS, F as PROVIDER_CONVERSATION_PROOF_SYNC_RETRY_INTERVAL_MS, I as REGISTER_RESPONSE_TIMEOUT_MS, L as RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_INTERVAL_MS, M as HEARTBEAT_RESPONSE_TIMEOUT_MS, N as MAX_RECONNECT_DELAY_MS, O as DAEMON_STREAM_CONNECT_TIMEOUT_MS, P as PROVIDER_CONVERSATION_PROOF_SYNC_INTERVAL_MS, R as RUNTIME_AGENT_CONTROLLER_REPORT_SYNC_RETRY_INTERVAL_MS, S as CONTROLLED_SHUTDOWN_REQUEST_TIMEOUT_MS, T as DAEMON_RUNTIME_CONTRACT_EPOCH, b as CATALOG_SYNC_RETRY_INTERVAL_MS, c as logComputerControlStage, d as normalizeOptionalText$2, f as normalizeText$1, i as resolvePreferredDaemonDeviceId, j as DEFAULT_RECONNECT_DELAY_MS, k as DAEMON_STREAM_KEEPALIVE_INTERVAL_MS, l as normalizeHeartbeatIntervalMs, n as ensureDaemonRuntimePaths, p as nowIsoString, r as resolveDaemonDeviceId, s as emitRunLine, v as toErrorMessage$6, w as CONTROLLED_SHUTDOWN_SOCKET_CLOSE_TIMEOUT_MS, x as CATALOG_SYNC_SIGNAL_POLL_INTERVAL_MS, y as warnDaemonEvent, z as RUNTIME_STATE_PERSIST_MIN_INTERVAL_MS } from "./daemon-device-id-DLKuN3Eo.js";
14
14
  import { d as openMeldDaemonControlPlaneRequestSchema, f as openMeldDaemonControlPlaneResponseSchema } from "./control-plane-CDbk-45J.js";
15
15
  import { _ as localExecutionInputFrameSchema, b as localExecutionInputResponseSchema, h as LOCAL_EXECUTION_INPUT_CAPABILITY_HEADER, m as serviceExecutionHostSnapshotSchema, n as createExecutionHostClient, t as ExecutionHostError, u as serviceExecutionHostMethods } from "./channel-D1NKTdY0.js";
16
- import { m as hashBundledSkillAssets, p as computeDirectoryContentHash, u as loadSelectedSkillAssets } from "./state-Dz2UWXBu.js";
16
+ import { m as hashBundledSkillAssets, p as computeDirectoryContentHash, u as loadSelectedSkillAssets } from "./state-nzWj4_Pk.js";
17
17
  import { $ as resolveNextRuntimeAgentControllerReportSyncAtMs, Ln as cliJsonOutputEnvelopeSchema, V as buildRepositoryFingerprint, a as createCodexJsonRpcClient, at as updateComputerFileAccessPolicy, c as sendDaemonFrame, et as emitDaemonDispatchJournalEvent, it as resolveComputerFileAccessStorePath, l as ProfileFolderOperationError, n as assertDispatchOwnedRuntimeServiceMutationAllowed, nt as ComputerFileAccessStoreError, o as handleDaemonTransportFrame, ot as isSameOrDescendantPath, p as collectObservedSessionWorkingDirectories, rt as readComputerFileAccessPolicy, s as parseDaemonFrame, u as applyProfileFolderOperation, w as resolveOpenCodeDatabasePath, x as queryOpenCodeReadOnly, z as createServiceGitEnvironment } from "./dispatch-owned-runtime-B6VEu6Ak.js";
18
- import { A as prepareDaemonServiceBundle, H as readOpenMeldToolsUpdateContextFromEnv, M as resolveAlignedDaemonActiveBundleEntryPath, N as resolveDaemonBundleEntryPathFromState, U as readUpdateStep, Y as readManagedCliInstallation, a as resolveDaemonRuntimeState, b as cleanupInactiveDaemonServiceBundles, f as listDaemonOwnedProcesses, h as resolveDaemonBundleIdFromEntryPath, i as readCurrentObservedDaemonRuntimeStatus, j as readDaemonActiveBundleState, n as getEffectiveDaemonRuntimeStatus, o as resolveDaemonServiceManagerForRuntimeState, p as extractDaemonCommandEntryPath, r as readCurrentDaemonRuntimeContext, s as waitForDaemonSystemServiceToStop, t as clearDaemonRuntimeStateIfDefinitelyStopped, u as cleanupLegacySharedDaemonServiceState, v as isOpenMeldManagedBinaryPath } from "./daemon-service-runtime-BKUCCet9.js";
18
+ import { A as prepareDaemonServiceBundle, H as readOpenMeldToolsUpdateContextFromEnv, M as resolveAlignedDaemonActiveBundleEntryPath, N as resolveDaemonBundleEntryPathFromState, U as readUpdateStep, Y as readManagedCliInstallation, a as resolveDaemonRuntimeState, b as cleanupInactiveDaemonServiceBundles, f as listDaemonOwnedProcesses, h as resolveDaemonBundleIdFromEntryPath, i as readCurrentObservedDaemonRuntimeStatus, j as readDaemonActiveBundleState, n as getEffectiveDaemonRuntimeStatus, o as resolveDaemonServiceManagerForRuntimeState, p as extractDaemonCommandEntryPath, r as readCurrentDaemonRuntimeContext, s as waitForDaemonSystemServiceToStop, t as clearDaemonRuntimeStateIfDefinitelyStopped, u as cleanupLegacySharedDaemonServiceState, v as isOpenMeldManagedBinaryPath } from "./daemon-service-runtime-C1o0PjSJ.js";
19
19
  import { i as writeDaemonRuntimeLease, r as readDaemonRuntimeLease } from "./daemon-runtime-lease-BMT2SIW9.js";
20
20
  import { a as readPendingDaemonServiceUpdate } from "./daemon-service-update-state-CtzTzni1.js";
21
- import { A as resolveDaemonStatusAttention, At as writeDaemonServiceContract, B as formatDaemonServiceUpdateRequiredMessage, Bt as classifyDaemonServiceWakeability, C as resolveSystemServiceStartupWaitMs, Ct as ensureDaemonRuntimeContractState, D as captureDaemonServiceEvidenceBestEffort, E as captureDaemonServiceEvidence, F as buildDaemonServiceRefreshPromptMessage, Ft as DAEMON_SERVICE_AUTO_HEAL_ANOMALIES, G as buildDaemonServiceDependencyMeaning, H as clearDaemonStartFailureState, Ht as resolveInstalledDaemonSystemServiceCommandSpec, It as DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES, J as buildDaemonServiceDependencyTitle, K as buildDaemonServiceDependencyNextStep, L as buildDaemonServiceStatusReadOnlyDetail, Lt as DAEMON_SERVICE_REPAIR_ANOMALIES, M as resolveServiceReadiness, Mt as resolveDaemonServiceAlignmentDecision, Nt as isVersionDowngrade, O as formatDaemonFailureContextText, P as buildDaemonServiceRefreshNextStep, R as buildDaemonServiceUpdateRequiredNextStep, Rt as DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES, S as isSystemServiceStartupTimeoutError, T as startDaemonSystemServiceWithAutoRepair, Tt as resolveCurrentDaemonExpectedVersion, U as writeDaemonStartFailureState, Vt as ensureDaemonSystemServiceCommandFiles, W as buildDaemonServiceDependencyDetails, Y as resolveDaemonServiceDependencyDiagnostics, _ as ensureDaemonServiceMaintenanceInstalled, _t as readCurrentDaemonOwnerSnapshot, a as resolveServiceUpdateUrgency, b as uninstallDaemonServiceUpdateWorker, bt as summarizeDaemonOwnerSnapshot, c as readCurrentLocalRuntimeReplyReadiness, d as assessCliUpdate, ft as resolveLocalServiceDemand, g as runDaemonServiceLifecycle, gt as hasActiveDaemonOwners, h as DaemonServiceLifecycleDrainTimeoutError, ht as formatDaemonOwnerSummaryLabel, i as writeOpenMeldToolsMaintenancePolicy, j as resolveDaemonStatusAuthenticationAttention, jt as buildDaemonServiceTargetSpec, k as resolveDaemonStatusSnapshot, m as scheduleDaemonServiceUpdate, mt as buildDaemonOwnerSnapshotFromObservedState, n as readOpenMeldToolsMaintenancePolicy, o as assessServerRequiredVersion, pt as inspectDaemonServiceInventory, q as buildDaemonServiceDependencySummary, r as resolveOpenMeldToolsMaintenanceProjection, s as describeServerRequiredVersionUnavailableReason, t as createOpenMeldToolsUpdateCoordinator, vt as resolveDaemonStopStrategy, w as waitForSystemServiceStartup$1, wt as readDaemonRuntimeContractRepairReport, x as isDaemonInventoryRunningAndStartReady$1, y as startDaemonServiceUpdateWorker, yt as resolveStoppedContractWriteBlockedReason, z as formatDaemonServiceRefreshReliabilityMessage, zt as classifyDaemonServiceRunStartability } from "./openmeld-tools-update-coordinator-y37jBxio.js";
21
+ import { A as resolveDaemonStatusAttention, At as writeDaemonServiceContract, B as formatDaemonServiceUpdateRequiredMessage, Bt as classifyDaemonServiceWakeability, C as resolveSystemServiceStartupWaitMs, Ct as ensureDaemonRuntimeContractState, D as captureDaemonServiceEvidenceBestEffort, E as captureDaemonServiceEvidence, F as buildDaemonServiceRefreshPromptMessage, Ft as DAEMON_SERVICE_AUTO_HEAL_ANOMALIES, G as buildDaemonServiceDependencyMeaning, H as clearDaemonStartFailureState, Ht as resolveInstalledDaemonSystemServiceCommandSpec, It as DAEMON_SERVICE_FULL_ALIGNMENT_ANOMALIES, J as buildDaemonServiceDependencyTitle, K as buildDaemonServiceDependencyNextStep, L as buildDaemonServiceStatusReadOnlyDetail, Lt as DAEMON_SERVICE_REPAIR_ANOMALIES, M as resolveServiceReadiness, Mt as resolveDaemonServiceAlignmentDecision, Nt as isVersionDowngrade, O as formatDaemonFailureContextText, P as buildDaemonServiceRefreshNextStep, R as buildDaemonServiceUpdateRequiredNextStep, Rt as DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES, S as isSystemServiceStartupTimeoutError, T as startDaemonSystemServiceWithAutoRepair, Tt as resolveCurrentDaemonExpectedVersion, U as writeDaemonStartFailureState, Vt as ensureDaemonSystemServiceCommandFiles, W as buildDaemonServiceDependencyDetails, Y as resolveDaemonServiceDependencyDiagnostics, _ as ensureDaemonServiceMaintenanceInstalled, _t as readCurrentDaemonOwnerSnapshot, a as resolveServiceUpdateUrgency, b as uninstallDaemonServiceUpdateWorker, bt as summarizeDaemonOwnerSnapshot, c as readCurrentLocalRuntimeReplyReadiness, d as assessCliUpdate, ft as resolveLocalServiceDemand, g as runDaemonServiceLifecycle, gt as hasActiveDaemonOwners, h as DaemonServiceLifecycleDrainTimeoutError, ht as formatDaemonOwnerSummaryLabel, i as writeOpenMeldToolsMaintenancePolicy, j as resolveDaemonStatusAuthenticationAttention, jt as buildDaemonServiceTargetSpec, k as resolveDaemonStatusSnapshot, m as scheduleDaemonServiceUpdate, mt as buildDaemonOwnerSnapshotFromObservedState, n as readOpenMeldToolsMaintenancePolicy, o as assessServerRequiredVersion, pt as inspectDaemonServiceInventory, q as buildDaemonServiceDependencySummary, r as resolveOpenMeldToolsMaintenanceProjection, s as describeServerRequiredVersionUnavailableReason, t as createOpenMeldToolsUpdateCoordinator, vt as resolveDaemonStopStrategy, w as waitForSystemServiceStartup$1, wt as readDaemonRuntimeContractRepairReport, x as isDaemonInventoryRunningAndStartReady$1, y as startDaemonServiceUpdateWorker, yt as resolveStoppedContractWriteBlockedReason, z as formatDaemonServiceRefreshReliabilityMessage, zt as classifyDaemonServiceRunStartability } from "./openmeld-tools-update-coordinator-Doj6V0Qx.js";
22
22
  import { E as withAdmittedServiceSession, S as recordInterruptedComputerAuthSessionRecoveryFailure, a as beginAuthSessionTransition, c as completeInterruptedComputerAuthSessionRecovery, ct as formatOpenMeldCliCommands, d as getAuthSessionState, g as markInterruptedComputerAuthSessionRecovery, i as assertAuthSessionMutationAvailable, k as ServiceAccountAdmissionError, m as hasInterruptedComputerAuthSessionTransition, n as AuthSessionRecoveryInProgressError, o as buildStoredAuthSessionIdentity, ot as formatInlineOpenMeldCliCommands, p as getInterruptedComputerAuthSessionRecovery, s as clearAuthSession, st as formatOpenMeldCliCommand, ut as formatOpenMeldCliTextBlock, v as onAuthSessionCredentialAvailable, w as setAuthSession, y as onAuthSessionCredentialObservation } from "./auth-session-QFK36vfX.js";
23
23
  import { D as createServiceSpawnPendingIssue, S as resolveOpenMeldLaneDescriptor, a as isOpenMeldLockError, d as resolveOpenMeldOrphanedLockIssue, j as formatLocalMachineIssueMessage, w as assessLocalMachineFailure } from "./lock-B0YzvcUu.js";
24
24
  import { i as readProcessStartIdentity, n as isPreciseProcessStartIdentity, t as CURRENT_PROCESS_START_IDENTITY } from "./process-identity-DsKKbftl.js";
@@ -34,16 +34,16 @@ import { i as readDaemonServiceContract, n as isDaemonServiceContractIdentityReu
34
34
  import { t as resolveOpenMeldEnvironmentTarget } from "./openmeld-environment-target-mLK2dK1_.js";
35
35
  import { t as admitServiceAccountStop } from "./service-account-authorization-CdUOvV3c.js";
36
36
  import { i as requestLocalDaemonShutdown, r as requestLocalDaemonServiceUpdateReadiness, s as sendLocalDaemonControlPlaneRequest, t as LocalDaemonControlPlaneClientError } from "./client-BPUPVl9o.js";
37
- import { c as runWithDaemonLifecycleCommandJournal, d as compareSemver, i as readLatestDaemonLifecycleOriginEvent, l as OPENMELD_VERSION, n as formatDaemonLifecycleOriginSummary, o as resolveRecentDaemonSignalStopCause, r as readLatestDaemonLifecycleConnectionStateEvent, s as runDaemonServiceManagerAction, t as emitDaemonLifecycleEvent } from "./daemon-lifecycle-journal-BV6D0rSF.js";
37
+ import { c as runWithDaemonLifecycleCommandJournal, d as compareSemver, i as readLatestDaemonLifecycleOriginEvent, l as OPENMELD_VERSION, n as formatDaemonLifecycleOriginSummary, o as resolveRecentDaemonSignalStopCause, r as readLatestDaemonLifecycleConnectionStateEvent, s as runDaemonServiceManagerAction, t as emitDaemonLifecycleEvent } from "./daemon-lifecycle-journal-D1dCp8bJ.js";
38
38
  import { r as readWindowsManagedCliInstallation } from "./windows-managed-install-BVlswqjA.js";
39
39
  import { S as resolveDaemonServiceManager, _ as readDaemonServiceJobCrashExitCode, a as disableDaemonServiceAutostartIfConfigured, c as getDaemonSystemServiceLogPath, f as isDaemonServiceJobSpawnPending, o as formatDaemonServiceJobDiagnosticsEvidence, s as getDaemonServiceLaunchdLabel } from "./daemon-service-manager-CSD613gh.js";
40
- import { P as getCommandEntryContract, Z as validateDaemonControlTargetInput, at as buildAgentOverviewFromContract, t as createAuthLoginGuideError } from "./dual-view-guide-catalog-cokJ8-5D.js";
40
+ import { P as getCommandEntryContract, Z as validateDaemonControlTargetInput, at as buildAgentOverviewFromContract, t as createAuthLoginGuideError } from "./dual-view-guide-catalog-DljFCp4Y.js";
41
41
  import { a as formatDaemonServiceDowngradeBlockedRecommendation, d as formatDaemonServiceMissingStatus, f as getDaemonDowngradeBlockedTitle, i as formatDaemonInstallFailedMessage, l as formatDaemonServiceMissingRunStepOne, m as canUseInteractivePrompts, n as resolveElapsedTimeMs, o as formatDaemonServiceMissingAction, p as runDaemonInstallDecisionPrompt, r as formatDaemonDowngradeBlockedNextStep, s as formatDaemonServiceMissingMeaning, t as formatElapsedTime, u as formatDaemonServiceMissingRunStepTwo } from "./elapsed-time-CviuvW6T.js";
42
42
  import { a as readPendingOpenMeldToolsUpdateAttempt } from "./openmeld-tools-update-attempt-state--4fS27OC.js";
43
43
  import { i as resolveOpenMeldToolsUpdateOperationProjection, n as waitForExternalOpenMeldToolsUpdate, r as waitForOpenMeldToolsUpdateCompletion, t as resolveExternalOpenMeldToolsUpdate } from "./openmeld-tools-update-join-B6HcSSiK.js";
44
44
  import { t as createSetupUpdateObserver } from "./setup-update-progress-pq_ZnoqB.js";
45
45
  import { t as childExecutionHostChannel } from "./process-channel-Vz_ntXXU.js";
46
- import { n as collectSkillsReadinessSnapshot } from "./installation-inventory-C8O-r8eI.js";
46
+ import { n as collectSkillsReadinessSnapshot } from "./installation-inventory-D6L-BdIi.js";
47
47
  import { createHash, randomUUID } from "node:crypto";
48
48
  import { homedir } from "node:os";
49
49
  import { delimiter, dirname, isAbsolute, join, resolve } from "node:path";
@@ -62,6 +62,7 @@ import { getSessionInfo, getSessionMessages } from "@anthropic-ai/claude-agent-s
62
62
  import WebSocket from "ws";
63
63
  //#region ../../packages/schemas/dist/schemas/daemon/service-connection-correlation.js
64
64
  const SERVICE_CONNECTION_ID_QUERY_PARAMETER = "connectionId";
65
+ const SERVICE_PREVIOUS_CONNECTION_ID_HEADER = "x-openmeld-previous-connection-id";
65
66
  z$1.uuid();
66
67
  //#endregion
67
68
  //#region src/commands/auth-device-session-client.ts
@@ -5528,6 +5529,7 @@ function readServiceConnectionFailureEvidence(error) {
5528
5529
  function createServiceConnectionEvidenceObserver(input) {
5529
5530
  const recorder = createServiceConnectionEvidenceRecorder(input);
5530
5531
  let connectionId = randomUUID();
5532
+ let lastAcknowledgedConnectionId;
5531
5533
  let phase = "credentials";
5532
5534
  let lastHeartbeatAckAtMs;
5533
5535
  let attemptStartedAtMs = Date.now();
@@ -5551,6 +5553,9 @@ function createServiceConnectionEvidenceObserver(input) {
5551
5553
  get connectionDiagnosticId() {
5552
5554
  return connectionId;
5553
5555
  },
5556
+ get lastAcknowledgedConnectionId() {
5557
+ return lastAcknowledgedConnectionId;
5558
+ },
5554
5559
  beginAttempt() {
5555
5560
  recorder.setOnline(false);
5556
5561
  connectionId = randomUUID();
@@ -5591,6 +5596,7 @@ function createServiceConnectionEvidenceObserver(input) {
5591
5596
  const timestamp = Date.parse(heartbeatAt);
5592
5597
  if (Number.isFinite(timestamp)) lastHeartbeatAckAtMs = timestamp;
5593
5598
  phase = "online";
5599
+ lastAcknowledgedConnectionId = acknowledgedId;
5594
5600
  if (transitioned) record({
5595
5601
  kind: "registered",
5596
5602
  reason: "recovered",
@@ -10876,6 +10882,7 @@ const runAccountBoundDaemonServiceLoop = async (input) => {
10876
10882
  const ws = await connectWebSocket(wsUrl, {
10877
10883
  headers: {
10878
10884
  ...authContext.headers,
10885
+ ...connectionEvidence.lastAcknowledgedConnectionId ? { [SERVICE_PREVIOUS_CONNECTION_ID_HEADER]: connectionEvidence.lastAcknowledgedConnectionId } : {},
10879
10886
  ...buildLocalServiceCapabilityHeaders({ localFolderPickerAvailable: localFolderPicker.available })
10880
10887
  },
10881
10888
  openTimeoutMs: DAEMON_STREAM_CONNECT_TIMEOUT_MS
@@ -18295,6 +18302,6 @@ function parseDaemonRunMode(rawMode) {
18295
18302
  return DEFAULT_DAEMON_RUN_MODE;
18296
18303
  }
18297
18304
  //#endregion
18298
- export { renderHumanTextErrorCard as $, resolveLocalComponentsStatus as A, runAuthMenu as B, createQuietPresenter as C, emitCliJsonEnvelope as D, shouldEmitAgentOverview as E, buildCommandAuthenticationPromptMessage as F, recoverInterruptedComputerAuthHandoff as G, exchangeOneTimeTokenAuthSession as H, ensureCommandAuthenticationOrCancel as I, runDaemonServiceParticipationGate as J, exchangeComputerAuthorizationGrant as K, evaluateCommandAuthentication as L, LocalProjectConnectionError as M, validateLocalProjectConnectionPath as N, runDaemonStartupPreflight as O, connectWebSocket as P, renderHumanErrorCard as Q, runAuthLogin as R, reconcileCliVersionView as S, createDelayedSpinner as T, emitUnusedSetupSessionCleanupWarning as U, runAuthStatus as V, formatComputerAuthCleanupFailureSuffix as W, runDaemonStartDecisionPrompt as X, resolveDaemonServiceParticipationStatus as Y, buildHumanErrorCopy as Z, formatServiceParticipationReadinessLabel as _, runDaemonBackgroundStartForDecision as a, renderTextInfoCard as at, buildProfileWorkspacePresentation as b, runDaemonInterrupt as c, isReturnKeypress as ct, runDaemonServiceDetached as d, getCurrentCommandCheckState as dt, buildAuthStatusRows as et, runDaemonSnapshot as f, isCurrentCommandCheckScopeActive as ft, runDaemonUninstall as g, SERVICE_CONNECTION_ID_QUERY_PARAMETER as gt, runDaemonTeardownStrict as h, fetchAuthUserSnapshot as ht, runDaemonAutostart as i, renderInfoCard as it, writeInstalledLocalComponentsSnapshot as j, readDaemonIncidentLogTail as k, runDaemonReinstall as l, runInteractivePrompt as lt, runDaemonStop as m, startCurrentCommandCheckScope as mt, isManagedSystemServiceBootstrapRun as n, formatActiveOrganizationLabel as nt, runDaemonCancel as o, buildUnifiedCardFrame as ot, runDaemonStatusFlow as p, resetCurrentCommandCheckState as pt, revokePreparedAuthSession as q, runDaemon as r, buildTextInfoCardLines as rt, runDaemonInstall as s, promptTextEntry as st, bestEffortStopCurrentLaneDaemonService as t, buildAuthStatusSnapshot as tt, runDaemonRunAfterEntryChecks as u, finishCurrentCommandCheckScope as ut, formatServiceRuntimeHeadline as v, emitDaemonAgentOverview as w, buildProfileWorkspaceRows as x, resolveServiceParticipationReadiness as y, runAuthLogout as z };
18305
+ export { renderHumanTextErrorCard as $, resolveLocalComponentsStatus as A, runAuthMenu as B, createQuietPresenter as C, emitCliJsonEnvelope as D, shouldEmitAgentOverview as E, buildCommandAuthenticationPromptMessage as F, recoverInterruptedComputerAuthHandoff as G, exchangeOneTimeTokenAuthSession as H, ensureCommandAuthenticationOrCancel as I, runDaemonServiceParticipationGate as J, exchangeComputerAuthorizationGrant as K, evaluateCommandAuthentication as L, LocalProjectConnectionError as M, validateLocalProjectConnectionPath as N, runDaemonStartupPreflight as O, connectWebSocket as P, renderHumanErrorCard as Q, runAuthLogin as R, reconcileCliVersionView as S, createDelayedSpinner as T, emitUnusedSetupSessionCleanupWarning as U, runAuthStatus as V, formatComputerAuthCleanupFailureSuffix as W, runDaemonStartDecisionPrompt as X, resolveDaemonServiceParticipationStatus as Y, buildHumanErrorCopy as Z, formatServiceParticipationReadinessLabel as _, SERVICE_PREVIOUS_CONNECTION_ID_HEADER as _t, runDaemonBackgroundStartForDecision as a, renderTextInfoCard as at, buildProfileWorkspacePresentation as b, runDaemonInterrupt as c, isReturnKeypress as ct, runDaemonServiceDetached as d, getCurrentCommandCheckState as dt, buildAuthStatusRows as et, runDaemonSnapshot as f, isCurrentCommandCheckScopeActive as ft, runDaemonUninstall as g, SERVICE_CONNECTION_ID_QUERY_PARAMETER as gt, runDaemonTeardownStrict as h, fetchAuthUserSnapshot as ht, runDaemonAutostart as i, renderInfoCard as it, writeInstalledLocalComponentsSnapshot as j, readDaemonIncidentLogTail as k, runDaemonReinstall as l, runInteractivePrompt as lt, runDaemonStop as m, startCurrentCommandCheckScope as mt, isManagedSystemServiceBootstrapRun as n, formatActiveOrganizationLabel as nt, runDaemonCancel as o, buildUnifiedCardFrame as ot, runDaemonStatusFlow as p, resetCurrentCommandCheckState as pt, revokePreparedAuthSession as q, runDaemon as r, buildTextInfoCardLines as rt, runDaemonInstall as s, promptTextEntry as st, bestEffortStopCurrentLaneDaemonService as t, buildAuthStatusSnapshot as tt, runDaemonRunAfterEntryChecks as u, finishCurrentCommandCheckScope as ut, formatServiceRuntimeHeadline as v, emitDaemonAgentOverview as w, buildProfileWorkspaceRows as x, resolveServiceParticipationReadiness as y, runAuthLogout as z };
18299
18306
 
18300
- //# sourceMappingURL=service-B-jrhCpV.js.map
18307
+ //# sourceMappingURL=service-l9DU4V5Q.js.map