openmeld 0.3.251 → 0.3.253
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-me-membership-BYBqiCj8.js → add-me-membership-swO7icxy.js} +2 -2
- package/dist/{add-me-membership-BYBqiCj8.js.map → add-me-membership-swO7icxy.js.map} +1 -1
- package/dist/{agents-bHN-b1TW.js → agents-ceZJuuZr.js} +13 -13
- package/dist/{agents-bHN-b1TW.js.map → agents-ceZJuuZr.js.map} +1 -1
- package/dist/{api-client-foundation-DwDF58xp.js → api-client-foundation-BEg5W5r1.js} +1 -1
- package/dist/{api-client-foundation-CZeatusO.js → api-client-foundation-CPF0nXbH.js} +4 -4
- package/dist/{api-client-foundation-CZeatusO.js.map → api-client-foundation-CPF0nXbH.js.map} +1 -1
- package/dist/auth-session-BjkIIzIz.js +4 -0
- package/dist/{auth-session-QkvUZGdB.js → auth-session-C1QlGOT-.js} +5 -5
- package/dist/{auth-session-QkvUZGdB.js.map → auth-session-C1QlGOT-.js.map} +1 -1
- package/dist/{auth-url-FexhW0NS.js → auth-url-B5qYMJO_.js} +2 -2
- package/dist/{auth-url-FexhW0NS.js.map → auth-url-B5qYMJO_.js.map} +1 -1
- package/dist/{base-url-DP8gGStx.js → base-url-BUHbVXb3.js} +3 -3
- package/dist/{base-url-DP8gGStx.js.map → base-url-BUHbVXb3.js.map} +1 -1
- package/dist/{base-url-Bxo6ZV1S.js → base-url-gA1mPiKc.js} +1 -1
- package/dist/{channel-DcFikWeZ.js → channel-BUrgmtp1.js} +2 -2
- package/dist/{channel-DcFikWeZ.js.map → channel-BUrgmtp1.js.map} +1 -1
- package/dist/{cloud-computer-DUg3S_J1.js → cloud-computer-ZO4Y_XSQ.js} +6 -6
- package/dist/{cloud-computer-DUg3S_J1.js.map → cloud-computer-ZO4Y_XSQ.js.map} +1 -1
- package/dist/{command-B8cJGIax.js → command-BHxtKcIh.js} +17 -17
- package/dist/{command-B8cJGIax.js.map → command-BHxtKcIh.js.map} +1 -1
- package/dist/{computer-connection-review-0b3KsBt2.js → computer-connection-review-D3bCNKJO.js} +6 -6
- package/dist/{computer-connection-review-0b3KsBt2.js.map → computer-connection-review-D3bCNKJO.js.map} +1 -1
- package/dist/{computer-disconnect-D7mq2PX2.js → computer-disconnect-CXjAtsKJ.js} +9 -9
- package/dist/{computer-disconnect-D7mq2PX2.js.map → computer-disconnect-CXjAtsKJ.js.map} +1 -1
- package/dist/{computer-setup-continuation-B0b1SDmb.js → computer-setup-continuation-DT01BWYg.js} +3 -3
- package/dist/{computer-setup-continuation-B0b1SDmb.js.map → computer-setup-continuation-DT01BWYg.js.map} +1 -1
- package/dist/{context-BWSn9hD9.js → context-CuCerz9H.js} +7 -7
- package/dist/{context-BWSn9hD9.js.map → context-CuCerz9H.js.map} +1 -1
- package/dist/{daemon-device-id-D193-ko0.js → daemon-device-id-D9V35Y8G.js} +4 -4
- package/dist/{daemon-device-id-D193-ko0.js.map → daemon-device-id-D9V35Y8G.js.map} +1 -1
- package/dist/{daemon-lifecycle-journal-DE6E2JnK.js → daemon-lifecycle-journal-D6sK130S.js} +6 -6
- package/dist/{daemon-lifecycle-journal-DE6E2JnK.js.map → daemon-lifecycle-journal-D6sK130S.js.map} +1 -1
- package/dist/{daemon-runtime-lease-BeA0hSy5.js → daemon-runtime-lease-Cz48mBXh.js} +3 -3
- package/dist/{daemon-runtime-lease-BeA0hSy5.js.map → daemon-runtime-lease-Cz48mBXh.js.map} +1 -1
- package/dist/{daemon-runtime-lease-DggibaVa.js → daemon-runtime-lease-WHFY3-dd.js} +1 -1
- package/dist/{daemon-service-contract-BIFpMchC.js → daemon-service-contract-Ab9x7DQh.js} +3 -3
- package/dist/{daemon-service-contract-BIFpMchC.js.map → daemon-service-contract-Ab9x7DQh.js.map} +1 -1
- package/dist/{daemon-service-manager-lsh96O9A.js → daemon-service-manager-BAo7kulx.js} +1 -1
- package/dist/{daemon-service-manager-B8Jx9kbR.js → daemon-service-manager-CB78d5SA.js} +5 -5
- package/dist/{daemon-service-manager-B8Jx9kbR.js.map → daemon-service-manager-CB78d5SA.js.map} +1 -1
- package/dist/{daemon-service-runtime-B1HJ5H_c.js → daemon-service-runtime-DDWyXhj7.js} +14 -14
- package/dist/{daemon-service-runtime-B1HJ5H_c.js.map → daemon-service-runtime-DDWyXhj7.js.map} +1 -1
- package/dist/{daemon-service-update-coordinator-BIVVKsbn.js → daemon-service-update-coordinator-B9YhE8tq.js} +20 -20
- package/dist/{daemon-service-update-coordinator-BIVVKsbn.js.map → daemon-service-update-coordinator-B9YhE8tq.js.map} +1 -1
- package/dist/{daemon-state-Be9G0RtT.js → daemon-state-BHmahVmK.js} +3 -3
- package/dist/{daemon-state-Be9G0RtT.js.map → daemon-state-BHmahVmK.js.map} +1 -1
- package/dist/{dispatch-owned-runtime-C4TnxzT5.js → dispatch-owned-runtime-D6IjJhPE.js} +10 -10
- package/dist/{dispatch-owned-runtime-C4TnxzT5.js.map → dispatch-owned-runtime-D6IjJhPE.js.map} +1 -1
- package/dist/{dist-BEx9DvPl.js → dist-BvGnlYhy.js} +383 -265
- package/dist/dist-BvGnlYhy.js.map +1 -0
- package/dist/dist-DdS110I0.js +4 -0
- package/dist/{dist-hKxdW1rL.js → dist-DuAsT5Uv.js} +23 -9
- package/dist/dist-DuAsT5Uv.js.map +1 -0
- package/dist/{dist-C7VV9_64.js → dist-QI2-yvvy.js} +1 -1
- package/dist/{dual-view-guide-catalog-rXJRXQtG.js → dual-view-guide-catalog-BusbQrrw.js} +3 -3
- package/dist/{dual-view-guide-catalog-rXJRXQtG.js.map → dual-view-guide-catalog-BusbQrrw.js.map} +1 -1
- package/dist/{elapsed-time-VkfQ84d8.js → elapsed-time-ChCfYl4r.js} +4 -4
- package/dist/{elapsed-time-VkfQ84d8.js.map → elapsed-time-ChCfYl4r.js.map} +1 -1
- package/dist/{entry-Cqcnjzyh.js → entry-BhkPD8Yq.js} +12 -12
- package/dist/{entry-Cqcnjzyh.js.map → entry-BhkPD8Yq.js.map} +1 -1
- package/dist/{installation-inventory-BJSSwtuK.js → installation-inventory-CSuX_TGs.js} +4 -4
- package/dist/{installation-inventory-BJSSwtuK.js.map → installation-inventory-CSuX_TGs.js.map} +1 -1
- package/dist/{installer-omB8O8eV.js → installer-CA2_OY13.js} +2 -2
- package/dist/{installer-omB8O8eV.js.map → installer-CA2_OY13.js.map} +1 -1
- package/dist/{lock-rqIBnZMx.js → lock-anKblZEb.js} +3 -3
- package/dist/{lock-rqIBnZMx.js.map → lock-anKblZEb.js.map} +1 -1
- package/dist/{meta-api-CtUa-Oap.js → meta-api-lWJ7qaka.js} +7 -7
- package/dist/{meta-api-CtUa-Oap.js.map → meta-api-lWJ7qaka.js.map} +1 -1
- package/dist/{openmeld-BBHUx74s.js → openmeld-BU4kFquG.js} +39 -39
- package/dist/{openmeld-BBHUx74s.js.map → openmeld-BU4kFquG.js.map} +1 -1
- package/dist/{openmeld-dev-environment-Bv8kIfdI.js → openmeld-dev-environment-DoOqw488.js} +3 -3
- package/dist/{openmeld-dev-environment-Bv8kIfdI.js.map → openmeld-dev-environment-DoOqw488.js.map} +1 -1
- package/dist/openmeld-dev.js +1 -1
- package/dist/{openmeld-environment-target-B4h8bDVy.js → openmeld-environment-target-Cv3uIT4I.js} +3 -3
- package/dist/{openmeld-environment-target-B4h8bDVy.js.map → openmeld-environment-target-Cv3uIT4I.js.map} +1 -1
- package/dist/{openmeld-maintenance-worker-D4T78j9j.js → openmeld-maintenance-worker-BE4qh4hk.js} +14 -14
- package/dist/{openmeld-maintenance-worker-D4T78j9j.js.map → openmeld-maintenance-worker-BE4qh4hk.js.map} +1 -1
- package/dist/{openmeld-tools-update-join-Dmlt6vQt.js → openmeld-tools-update-join-D80EtKhh.js} +4 -4
- package/dist/{openmeld-tools-update-join-Dmlt6vQt.js.map → openmeld-tools-update-join-D80EtKhh.js.map} +1 -1
- package/dist/{openmeld-tools-update-process-frame-C2VBW7Yh.js → openmeld-tools-update-process-frame-VsOsal5C.js} +1 -1
- package/dist/{openmeld-tools-update-process-frame-DfbCzMU_.js → openmeld-tools-update-process-frame-gQxz8eyk.js} +2 -2
- package/dist/{openmeld-tools-update-process-frame-DfbCzMU_.js.map → openmeld-tools-update-process-frame-gQxz8eyk.js.map} +1 -1
- package/dist/openmeld.js +7 -7
- package/dist/{prepare-provider-runtime-DIehKYnU.js → prepare-provider-runtime-B5ZlCaCp.js} +119 -82
- package/dist/{prepare-provider-runtime-DIehKYnU.js.map → prepare-provider-runtime-B5ZlCaCp.js.map} +1 -1
- package/dist/{prepare-session-executor-BrWhEeER.js → prepare-session-executor-kd7fBmis.js} +25 -25
- package/dist/{prepare-session-executor-BrWhEeER.js.map → prepare-session-executor-kd7fBmis.js.map} +1 -1
- package/dist/{process-channel-DuXL--wT.js → process-channel-B5adCeDd.js} +2 -2
- package/dist/{process-channel-DuXL--wT.js.map → process-channel-B5adCeDd.js.map} +1 -1
- package/dist/{process-identity-BoQm3p8R.js → process-identity-CLoTVpHt.js} +2 -2
- package/dist/{process-identity-BoQm3p8R.js.map → process-identity-CLoTVpHt.js.map} +1 -1
- package/dist/{runtime-VaJpLYlV.js → runtime-8rwcjI0p.js} +22 -18
- package/dist/runtime-8rwcjI0p.js.map +1 -0
- package/dist/{runtime-agent-controller-reporting-submission-B8CNWuE2.js → runtime-agent-controller-reporting-submission-Bf7kJ52G.js} +9 -9
- package/dist/{runtime-agent-controller-reporting-submission-B8CNWuE2.js.map → runtime-agent-controller-reporting-submission-Bf7kJ52G.js.map} +1 -1
- package/dist/{service-C_IK7xXA.js → service-CLHDlGsj.js} +30 -30
- package/dist/{service-C_IK7xXA.js.map → service-CLHDlGsj.js.map} +1 -1
- package/dist/{service-account-authorization-emCXgyyq.js → service-account-authorization-CmN8zEW6.js} +5 -5
- package/dist/{service-account-authorization-emCXgyyq.js.map → service-account-authorization-CmN8zEW6.js.map} +1 -1
- package/dist/{service-account-control-9U-xOM-6.js → service-account-control-MbDzdeDg.js} +15 -15
- package/dist/{service-account-control-9U-xOM-6.js.map → service-account-control-MbDzdeDg.js.map} +1 -1
- package/dist/{service-control-capabilities-CUBCecyI.js → service-control-capabilities-6I5kTmOk.js} +6 -6
- package/dist/{service-control-capabilities-CUBCecyI.js.map → service-control-capabilities-6I5kTmOk.js.map} +1 -1
- package/dist/{service-control-capabilities-B9KEj4VJ.js → service-control-capabilities-tpx4oP3B.js} +1 -1
- package/dist/{service-control-carrier-capability-0pMif8hF.js → service-control-carrier-capability-D0AixLdI.js} +3 -3
- package/dist/{service-control-carrier-capability-0pMif8hF.js.map → service-control-carrier-capability-D0AixLdI.js.map} +1 -1
- package/dist/{state-B1vVoNex.js → state-CK1UOUG5.js} +3 -3
- package/dist/{state-B1vVoNex.js.map → state-CK1UOUG5.js.map} +1 -1
- package/dist/{updates-api-BNlOaVUK.js → updates-api-BWmjp1PV.js} +14 -14
- package/dist/{updates-api-BNlOaVUK.js.map → updates-api-BWmjp1PV.js.map} +1 -1
- package/dist/upgrade-BhwsoUIY.js +4 -0
- package/dist/{upgrade-BBUL34o0.js → upgrade-CjAniE9L.js} +9 -9
- package/dist/{upgrade-BBUL34o0.js.map → upgrade-CjAniE9L.js.map} +1 -1
- package/dist/{windows-managed-install-DrHiUFRc.js → windows-managed-install-Ci7VP4U-.js} +2 -2
- package/dist/{windows-managed-install-DrHiUFRc.js.map → windows-managed-install-Ci7VP4U-.js.map} +1 -1
- package/dist/{windows-preview-channel-BtwDETxL.js → windows-preview-channel-5Bbmxzrc.js} +3 -3
- package/dist/{windows-preview-channel-BtwDETxL.js.map → windows-preview-channel-5Bbmxzrc.js.map} +1 -1
- package/dist/{windows-task-command-J6k_J7LF.js → windows-task-command-D3NzNfjC.js} +2 -2
- package/dist/{windows-task-command-J6k_J7LF.js.map → windows-task-command-D3NzNfjC.js.map} +1 -1
- package/dist/{windows-task-entry-DVm1isfV.js → windows-task-entry-BhpUcj36.js} +3 -3
- package/dist/{windows-task-entry-DVm1isfV.js.map → windows-task-entry-BhpUcj36.js.map} +1 -1
- package/dist/{windows-user-task-Bpdvw8fQ.js → windows-user-task-BkwJAIlf.js} +6 -6
- package/dist/{windows-user-task-Bpdvw8fQ.js.map → windows-user-task-BkwJAIlf.js.map} +1 -1
- package/dist/{windows-user-task-Bk1JEB9A.js → windows-user-task-DFNOQ9pw.js} +1 -1
- package/package.json +14 -14
- package/dist/auth-session-9bVwEpsk.js +0 -4
- package/dist/dist-BEx9DvPl.js.map +0 -1
- package/dist/dist-DQKYGAFJ.js +0 -4
- package/dist/dist-hKxdW1rL.js.map +0 -1
- package/dist/runtime-VaJpLYlV.js.map +0 -1
- package/dist/upgrade-Dg7WiPTi.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-rqIBnZMx.js","names":["resolveLocksDir","process","resolveRuntimeDir"],"sources":["../src/system/local-machine-recovery/index.ts","../src/config/openmeld-lane-descriptor.ts","../src/config/session-profile.ts","../src/config/lock.ts"],"sourcesContent":["import {\n formatLocalMachineIssueMessage,\n type LocalMachineIssue,\n type LocalMachineOperation,\n} from \"@openmeld/schemas\";\n\ntype LocalMachineFailureInput = {\n operation: LocalMachineOperation;\n error: unknown;\n};\n\nexport class LocalMachineFailureError extends Error {\n readonly code: LocalMachineIssue[\"code\"];\n readonly issue: LocalMachineIssue;\n\n constructor(input: { issue: LocalMachineIssue; cause?: unknown }) {\n super(formatLocalMachineIssueMessage(input.issue), {\n cause: input.cause,\n });\n this.name = \"LocalMachineFailureError\";\n this.code = input.issue.code;\n this.issue = input.issue;\n }\n}\n\nexport function isLocalMachineFailureError(\n error: unknown\n): error is LocalMachineFailureError {\n return error instanceof LocalMachineFailureError;\n}\n\nexport function toLocalMachineFailureError(\n input: LocalMachineFailureInput\n): LocalMachineFailureError {\n if (isLocalMachineFailureError(input.error)) {\n return input.error;\n }\n return new LocalMachineFailureError({\n issue: assessLocalMachineFailure(input),\n cause: input.error,\n });\n}\n\nexport function toRecognizedLocalMachineFailureError(\n input: LocalMachineFailureInput\n): LocalMachineFailureError | null {\n if (isLocalMachineFailureError(input.error)) {\n return input.error;\n }\n const issue = assessLocalMachineFailure(input);\n return issue.code === \"local_machine.failure.unknown\"\n ? null\n : new LocalMachineFailureError({\n issue,\n cause: input.error,\n });\n}\n\nexport function assessLocalMachineFailure(\n input: LocalMachineFailureInput\n): LocalMachineIssue {\n const systemCode = readSystemErrorCode(input.error);\n const detail = readErrorMessage(input.error);\n\n if (systemCode === \"ENOSPC\" || systemCode === \"EDQUOT\") {\n return {\n schemaVersion: 1,\n code: \"local_machine.storage.exhausted\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"Your computer is out of storage space. OpenMeld can't save the local files it needs.\",\n primaryAction: \"Free up storage, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EROFS\" ||\n ((input.operation === \"create_lock\" ||\n input.operation === \"write_local_state\") &&\n (systemCode === \"EACCES\" || systemCode === \"EPERM\"))\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.storage.not_writable\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary: \"OpenMeld can't write to its local data folder.\",\n primaryAction: \"Make sure the folder is writable, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EACCES\" ||\n systemCode === \"EPERM\" ||\n systemCode === \"EROFS\"\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.permission.denied\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"OpenMeld doesn't have permission to complete local setup on this computer.\",\n primaryAction:\n \"Allow OpenMeld to access its local files and background services, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EMFILE\" ||\n systemCode === \"ENFILE\" ||\n systemCode === \"ENOMEM\"\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.resources.exhausted\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"Your computer doesn't have enough available system resources for OpenMeld to continue.\",\n primaryAction: \"Restart your computer, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n return {\n schemaVersion: 1,\n code: \"local_machine.failure.unknown\",\n operation: input.operation,\n recoveryPolicy: \"diagnostics\",\n summary: \"OpenMeld couldn't complete a required action on this computer.\",\n primaryAction: \"Try again. If it still fails, open diagnostics.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n}\n\nexport function createServiceSpawnPendingIssue(input: {\n detail?: string | null;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.failure.unknown\",\n operation: \"start_background_service\",\n recoveryPolicy: \"diagnostics\",\n summary: \"macOS registered OpenMeld Service but hasn't started it.\",\n primaryAction:\n \"Run `openmeld service snapshot --view agent` to collect startup diagnostics.\",\n diagnostics: {\n systemCode: \"SERVICE_SPAWN_PENDING\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nexport function createActiveSetupConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.concurrency.active\",\n operation: \"create_lock\",\n recoveryPolicy: \"user_action\",\n summary: \"Another OpenMeld setup is already running on this computer.\",\n primaryAction: input.primaryAction,\n diagnostics: {\n systemCode: \"OPENMELD_LOCK_ACTIVE\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nexport function createOrphanedSetupConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n}): LocalMachineIssue {\n return createOrphanedLocalConcurrencyIssue({\n ...input,\n summary: \"OpenMeld found a setup lock left by an older version.\",\n });\n}\n\nexport function createOrphanedLocalConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n summary: string;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.concurrency.orphaned\",\n operation: \"create_lock\",\n recoveryPolicy: \"user_action\",\n summary: input.summary,\n primaryAction: input.primaryAction,\n diagnostics: {\n systemCode: \"OPENMELD_LOCK_ORPHANED\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nfunction readSystemErrorCode(error: unknown): string | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"string\" && code.trim().length > 0 ? code : null;\n}\n\nfunction readErrorMessage(error: unknown): string | null {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message.trim().slice(0, 2048);\n }\n if (typeof error === \"string\" && error.trim().length > 0) {\n return error.trim().slice(0, 2048);\n }\n return null;\n}\n","import {\n type OpenMeldEnvPreset,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"./paths\";\n\nexport type OpenMeldLaneDescriptor = {\n command: \"openmeld\" | \"openmeld-dev\" | \"openmeld-canary\";\n preset: OpenMeldEnvPreset;\n openMeldHome: string;\n destructiveResetAllowed: boolean;\n repairCommand: string;\n removeCommand: string | null;\n resetCommand: string;\n};\n\nexport function resolveOpenMeldLaneDescriptor(input?: {\n env?: NodeJS.ProcessEnv;\n argv?: string[];\n homeDir?: string;\n}): OpenMeldLaneDescriptor {\n const env = input?.env ?? process.env;\n const preset = resolveOpenMeldEnvPreset({\n argv: input?.argv,\n env,\n homeDir: input?.homeDir,\n });\n const command = resolveLaneCommand(preset);\n return {\n command,\n preset,\n openMeldHome: resolveOpenMeldRootDir({\n argv: input?.argv,\n env,\n homeDir: input?.homeDir,\n }),\n destructiveResetAllowed: true,\n repairCommand: `${command} repair local-state`,\n removeCommand: preset === \"canary\" ? \"pnpm openmeld:canary:remove\" : null,\n resetCommand: `${command} reset --yes`,\n };\n}\n\nexport function formatLaneScopeSentence(\n lane: Pick<OpenMeldLaneDescriptor, \"openMeldHome\" | \"command\">\n): string {\n return `This only affects the ${lane.command} lane at ${lane.openMeldHome}.`;\n}\n\nexport function buildLaneScopedCleanupGuidance(\n lane: Pick<\n OpenMeldLaneDescriptor,\n \"command\" | \"repairCommand\" | \"removeCommand\"\n >\n): string {\n const commands = [`\\`${lane.repairCommand}\\``];\n if (lane.removeCommand) {\n commands.unshift(`\\`${lane.removeCommand}\\``);\n }\n return `Optional cleanup for this lane: run ${commands.join(\" or \")}.`;\n}\n\nfunction resolveLaneCommand(\n preset: OpenMeldEnvPreset\n): OpenMeldLaneDescriptor[\"command\"] {\n if (preset === \"dev-local\") {\n return \"openmeld-dev\";\n }\n if (preset === \"canary\") {\n return \"openmeld-canary\";\n }\n return \"openmeld\";\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, open, readdir, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n normalizeOpenMeldProfileId,\n type OpenMeldProfileId,\n sessionsDir,\n} from \"./paths\";\n\nexport const OPENMELD_CLI_CONTEXT_ENV_KEY = \"OPENMELD_CLI_CONTEXT_ID\";\nexport const LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY =\n \"OPENMELD_AGENT_SESSION_ID\";\n\nexport const CLI_CONTEXT_ENV_KEYS = [\n OPENMELD_CLI_CONTEXT_ENV_KEY,\n LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY,\n] as const;\n\nconst SESSION_FILE_MAX_LENGTH = 128;\nconst SESSION_FILE_HASH_LENGTH = 8;\n\nexport type CliContextResolution = {\n cliContextId: string;\n source: string;\n};\n\nexport type CliContextStateV1 = {\n v: 1;\n sessionId: string;\n updatedAt: string;\n cliContextSource?: string;\n openMeldProfileId?: string;\n selectedOpenMeldProfileId?: string;\n};\n\nexport function resolveCliContext(\n profileIdInput?: string\n): CliContextResolution | null {\n const explicit = normalizeSessionId(profileIdInput);\n if (explicit) {\n return {\n cliContextId: explicit,\n source: \"manual\",\n };\n }\n\n for (const key of CLI_CONTEXT_ENV_KEYS) {\n const sessionId = normalizeSessionId(process.env[key]);\n if (sessionId) {\n return {\n cliContextId: sessionId,\n source: `environment:${key}`,\n };\n }\n }\n\n return resolveTerminalSessionId();\n}\n\nexport function resolveCliContextId(profileIdInput?: string): string | null {\n return resolveCliContext(profileIdInput)?.cliContextId ?? null;\n}\n\nexport function buildSessionProfilePayload(\n session: CliContextResolution,\n openMeldProfileId: OpenMeldProfileId\n): CliContextStateV1 {\n return {\n v: 1,\n sessionId: session.cliContextId,\n cliContextSource: session.source,\n openMeldProfileId: normalizeOpenMeldProfileId(openMeldProfileId),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function formatCliContextSource(source: string): string {\n if (source === \"manual\") {\n return \"manual\";\n }\n if (source.startsWith(\"environment:\")) {\n return `environment:${source.slice(\"environment:\".length)}`;\n }\n if (source.startsWith(\"terminal:\")) {\n return \"terminal-fingerprint\";\n }\n return source;\n}\n\nexport function normalizeCliContextResolution(\n value: unknown\n): CliContextResolution | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const maybe = value as {\n cliContextId?: unknown;\n source?: unknown;\n };\n const cliContextId = normalizeSessionId(maybe.cliContextId);\n const source = normalizeSessionSource(maybe.source);\n if (!(cliContextId && source)) {\n return null;\n }\n\n return { cliContextId, source };\n}\n\nfunction normalizeSessionSource(raw: unknown): string | null {\n const value = String(raw ?? \"\").trim();\n if (!value) {\n return null;\n }\n return value;\n}\n\nexport async function setSessionOpenMeldProfileId(\n openMeldProfileId: OpenMeldProfileId\n): Promise<boolean> {\n return await writeCliContextState({\n openMeldProfileId,\n });\n}\n\nexport async function getSessionOpenMeldProfileId(): Promise<OpenMeldProfileId | null> {\n return (await readCliContextState())?.openMeldProfileId ?? null;\n}\n\nexport async function clearSessionOpenMeldProfileId(): Promise<boolean> {\n return await writeCliContextState({\n openMeldProfileId: null,\n });\n}\n\nexport async function readCliContextState(input?: {\n sessionId?: string;\n}): Promise<CliContextStateV1 | null> {\n const cliContextId = resolveSessionStateId(input?.sessionId);\n if (!cliContextId) {\n return null;\n }\n\n const raw = await readFile(cliContextStatePath(cliContextId), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n return null;\n }\n\n return parseCliContextState(raw);\n}\n\nexport async function listCliContextStates(): Promise<CliContextStateV1[]> {\n const entryNames = await readdir(sessionsDir()).catch(() => []);\n const states: CliContextStateV1[] = [];\n for (const entryName of entryNames) {\n if (!entryName.endsWith(\".json\")) {\n continue;\n }\n const raw = await readFile(join(sessionsDir(), entryName), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n continue;\n }\n const parsed = parseCliContextState(raw);\n if (!parsed) {\n continue;\n }\n states.push(parsed);\n }\n return states.sort((left, right) =>\n left.sessionId.localeCompare(right.sessionId)\n );\n}\n\nexport async function writeCliContextState(input: {\n sessionId?: string;\n sessionSource?: string;\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n}): Promise<boolean> {\n const cliContext = resolveCliContextStateInput(input) ?? resolveCliContext();\n if (!cliContext) {\n return false;\n }\n\n await mkdir(sessionsDir(), { recursive: true });\n const existing = await readCliContextState({\n sessionId: cliContext.cliContextId,\n });\n const nextOpenMeldProfileId = resolveNextSessionOpenMeldProfileId(\n existing,\n input\n );\n const nextSelectedOpenMeldProfileId = resolveNextSelectedOpenMeldProfileId(\n existing,\n input\n );\n const outputPath = cliContextStatePath(cliContext.cliContextId);\n\n if (!(nextOpenMeldProfileId || nextSelectedOpenMeldProfileId)) {\n await rm(outputPath, { force: true });\n return true;\n }\n\n const payload: CliContextStateV1 = {\n v: 1,\n sessionId: cliContext.cliContextId,\n cliContextSource:\n cliContext.source ?? existing?.cliContextSource ?? \"manual\",\n ...(nextOpenMeldProfileId\n ? { openMeldProfileId: nextOpenMeldProfileId }\n : {}),\n ...(nextSelectedOpenMeldProfileId\n ? { selectedOpenMeldProfileId: nextSelectedOpenMeldProfileId }\n : {}),\n updatedAt: new Date().toISOString(),\n };\n\n await writeCliContextStateFile(outputPath, payload);\n return true;\n}\n\nexport function cliContextStatePath(sessionId: string): string {\n return join(sessionsDir(), `${toSafeSessionFile(sessionId)}.json`);\n}\n\nfunction toSafeSessionFile(value: string): string {\n const hash = createHash(\"sha1\")\n .update(value, \"utf8\")\n .digest(\"hex\")\n .slice(0, SESSION_FILE_HASH_LENGTH);\n const safeBaseRaw = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const safeBase = safeBaseRaw.length > 0 ? safeBaseRaw : \"session\";\n const maxBaseLength = Math.max(\n 1,\n SESSION_FILE_MAX_LENGTH - SESSION_FILE_HASH_LENGTH - 1\n );\n const truncatedBase = safeBase.slice(0, maxBaseLength);\n return `${truncatedBase}-${hash}`;\n}\n\nfunction resolveCliContextStateInput(input: {\n sessionId?: string;\n sessionSource?: string;\n}): CliContextResolution | null {\n const sessionId = normalizeSessionId(input.sessionId);\n if (!sessionId) {\n return null;\n }\n return {\n cliContextId: sessionId,\n source: normalizeSessionSource(input.sessionSource) ?? \"manual\",\n };\n}\n\nfunction resolveSessionStateId(sessionId?: string): string | null {\n const explicit = normalizeSessionId(sessionId);\n if (explicit) {\n return explicit;\n }\n return resolveCliContext()?.cliContextId ?? null;\n}\n\nfunction parseCliContextState(raw: string): CliContextStateV1 | null {\n let parsed: Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n try {\n parsed = JSON.parse(raw) as Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n } catch {\n return null;\n }\n\n if (parsed.v !== 1) {\n return null;\n }\n const sessionId = normalizeSessionId(parsed.sessionId);\n if (!sessionId) {\n return null;\n }\n const openMeldProfileId = resolveStoredSessionOpenMeldProfileId(parsed);\n const selectedOpenMeldProfileId =\n resolveStoredSelectedOpenMeldProfileId(parsed);\n if (!(openMeldProfileId || selectedOpenMeldProfileId)) {\n return null;\n }\n const cliContextSource = normalizeSessionSource(parsed.cliContextSource);\n return {\n v: 1,\n sessionId,\n ...(cliContextSource ? { cliContextSource } : {}),\n ...(openMeldProfileId ? { openMeldProfileId } : {}),\n ...(selectedOpenMeldProfileId ? { selectedOpenMeldProfileId } : {}),\n updatedAt:\n typeof parsed.updatedAt === \"string\" && parsed.updatedAt.trim().length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString(),\n };\n}\n\nfunction resolveNextSessionOpenMeldProfileId(\n existing: CliContextStateV1 | null,\n input: {\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"openMeldProfileId\" in input)) {\n return existing?.openMeldProfileId;\n }\n return (\n normalizeOptionalOpenMeldProfileId(input.openMeldProfileId) ?? undefined\n );\n}\n\nfunction resolveNextSelectedOpenMeldProfileId(\n existing: CliContextStateV1 | null,\n input: {\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"selectedOpenMeldProfileId\" in input)) {\n return existing?.selectedOpenMeldProfileId;\n }\n return (\n normalizeOptionalOpenMeldProfileId(input.selectedOpenMeldProfileId) ??\n undefined\n );\n}\n\nasync function writeCliContextStateFile(\n outputPath: string,\n payload: CliContextStateV1\n): Promise<void> {\n const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}`;\n const file = await open(tempPath, \"w\");\n let writeFailure: unknown = null;\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } catch (error) {\n writeFailure = error;\n }\n try {\n await file.close();\n } catch (error) {\n if (!writeFailure) {\n writeFailure = error;\n }\n }\n if (writeFailure) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw writeFailure;\n }\n\n try {\n await rename(tempPath, outputPath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction normalizeSessionId(value: unknown): string | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n return raw.slice(0, 256);\n}\n\nfunction resolveTerminalSessionId(): CliContextResolution | null {\n if (!(process.stdin.isTTY || process.stdout.isTTY)) {\n return null;\n }\n\n const parentPid = Number(process.ppid);\n if (!Number.isInteger(parentPid) || parentPid <= 1) {\n return null;\n }\n\n return {\n cliContextId: `terminal-ppid-${parentPid}`,\n source: `terminal:ppid-${parentPid}`,\n };\n}\n\nfunction resolveStoredSessionOpenMeldProfileId(input: {\n openMeldProfileId?: unknown;\n profile?: unknown;\n}): OpenMeldProfileId | null {\n const openMeldProfileId = normalizeOptionalOpenMeldProfileId(\n input.openMeldProfileId\n );\n const legacyProfile = normalizeOptionalOpenMeldProfileId(input.profile);\n if (\n openMeldProfileId &&\n legacyProfile &&\n openMeldProfileId !== legacyProfile\n ) {\n throw new Error(\n `conflicting stored OpenMeld profile identity: openMeldProfileId=${openMeldProfileId}, profile=${legacyProfile}. Remove or reconcile the legacy profile field so it matches openMeldProfileId.`\n );\n }\n return openMeldProfileId ?? legacyProfile;\n}\n\nfunction resolveStoredSelectedOpenMeldProfileId(input: {\n selectedOpenMeldProfileId?: unknown;\n}): OpenMeldProfileId | null {\n return normalizeOptionalOpenMeldProfileId(input.selectedOpenMeldProfileId);\n}\n\nfunction normalizeOptionalOpenMeldProfileId(\n value: unknown\n): OpenMeldProfileId | null {\n if (typeof value !== \"string\") {\n return null;\n }\n try {\n return normalizeOpenMeldProfileId(value);\n } catch {\n return null;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { rmdirSync, unlinkSync } from \"node:fs\";\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n rmdir,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport type { LocalMachineIssue } from \"@openmeld/schemas\";\nimport {\n createOrphanedLocalConcurrencyIssue,\n toRecognizedLocalMachineFailureError,\n} from \"../system/local-machine-recovery\";\nimport {\n CURRENT_PROCESS_START_IDENTITY,\n isPreciseProcessStartIdentity,\n isProcessIdentityAlive,\n readProcessStartIdentity,\n} from \"../system/process-identity\";\nimport { resolveOpenMeldLaneDescriptor } from \"./openmeld-lane-descriptor\";\nimport {\n normalizeOpenMeldProfileId,\n type OpenMeldPathResolutionInput,\n locksDir as resolveLocksDir,\n runtimeDir as resolveRuntimeDir,\n} from \"./paths\";\nimport { resolveCliContextId } from \"./session-profile\";\n\nexport type OpenMeldLock = {\n ownerId: string;\n path: string;\n};\n\nexport type OpenMeldLockMeta = Record<string, unknown>;\nexport type OpenMeldLockContentionState = \"active\" | \"orphaned\" | \"unknown\";\nexport type OpenMeldLegacyLockRepairReport = {\n removedOrphanedLegacyLocks: number;\n};\ntype HeldLockReleaseContext = Record<string, unknown>;\nconst MALFORMED_LOCK_RECOVERY_GRACE_MS = 30_000;\nconst OPENMELD_ORPHANED_LOCK_SUMMARY =\n \"OpenMeld found a local command lock left by an older version.\";\n\nexport class OpenMeldLockError extends Error {\n readonly code = \"openmeld.locked\";\n readonly lockPath: string;\n readonly lockKey: string;\n readonly metaRaw: string | null;\n readonly meta: OpenMeldLockMeta | null;\n readonly contentionState: OpenMeldLockContentionState;\n\n constructor(input: {\n path: string;\n key: string;\n metaRaw?: string;\n contentionState?: OpenMeldLockContentionState;\n }) {\n const normalizedMetaRaw = normalizeMetaRaw(input.metaRaw);\n const contentionState = input.contentionState ?? \"unknown\";\n super(\n buildOpenMeldLockErrorMessage(\n input.path,\n normalizedMetaRaw,\n contentionState\n )\n );\n this.name = \"OpenMeldLockError\";\n this.lockPath = input.path;\n this.lockKey = input.key;\n this.metaRaw = normalizedMetaRaw;\n this.meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n this.contentionState = contentionState;\n }\n}\n\nexport function isOpenMeldLockError(\n error: unknown\n): error is OpenMeldLockError {\n return error instanceof OpenMeldLockError;\n}\n\nexport function isOpenMeldOrphanedLockError(\n error: unknown\n): error is OpenMeldLockError {\n return isOpenMeldLockError(error) && error.contentionState === \"orphaned\";\n}\n\nexport function resolveOpenMeldOrphanedLockIssue(\n error: unknown\n): LocalMachineIssue | null {\n if (!isOpenMeldOrphanedLockError(error)) {\n return null;\n }\n return createOrphanedLocalConcurrencyIssue({\n summary: OPENMELD_ORPHANED_LOCK_SUMMARY,\n primaryAction: buildOpenMeldOrphanedLockAction(),\n detail: error.message,\n });\n}\n\nexport function buildOpenMeldOrphanedLockAction(): string {\n const repairCommand = resolveOpenMeldLaneDescriptor().repairCommand;\n return `Close any other OpenMeld commands, then run \\`${repairCommand}\\` and try again.`;\n}\n\nexport async function acquireLock(input: {\n openMeldProfileId: string;\n key: string;\n meta?: OpenMeldLockMeta;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<OpenMeldLock> {\n const openMeldProfileId = normalizeOpenMeldProfileId(input.openMeldProfileId);\n const sessionId = resolveCliContextId();\n const dir = resolveLocksDir(openMeldProfileId, input.pathResolution);\n const path = resolveLockPath({\n openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n });\n const ownerId = randomUUID();\n try {\n await mkdir(dir, { recursive: true });\n } catch (error) {\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n\n // A directory is the atomic ownership boundary. Its owner-specific entry\n // lets release remove only the lock it acquired, even if another process\n // publishes a replacement at the same canonical path.\n for (let attempt = 0; attempt < 2; attempt++) {\n const contents = `${JSON.stringify({\n ...(input.meta ? { ...input.meta } : {}),\n pid: process.pid,\n ownerProcessStartedAt: CURRENT_PROCESS_START_IDENTITY,\n openMeldProfileId,\n ...(sessionId ? { sessionId } : {}),\n at: new Date().toISOString(),\n ownerId,\n })}\\n`;\n let published: boolean;\n try {\n published = await tryPublishLock(path, ownerId, contents);\n } catch (error) {\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n if (published) {\n return { ownerId, path };\n }\n\n try {\n const existingLock = await readLockSnapshot(path);\n if (\n !existingLock.exists ||\n (await tryCleanupStaleLockPath(path, existingLock))\n ) {\n continue;\n }\n\n throw new OpenMeldLockError({\n path,\n key: input.key,\n metaRaw: existingLock.metaRaw ?? undefined,\n contentionState: resolveLockContentionState(existingLock),\n });\n } catch (error) {\n if (isOpenMeldLockError(error)) {\n throw error;\n }\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n }\n\n throw new OpenMeldLockError({\n path,\n key: input.key,\n });\n}\n\nexport async function releaseLock(lock: OpenMeldLock): Promise<void> {\n const removedOwnerEntry = await unlinkOwnedDirectoryEntry(lock);\n if (!removedOwnerEntry) {\n return;\n }\n await rmdir(lock.path).catch((error) => {\n if (![\"ENOENT\", \"ENOTEMPTY\"].includes(getErrorCode(error) ?? \"\")) {\n throw error;\n }\n });\n}\n\n/** Attach a waiting native process before granting it permission to exec. */\nexport async function attachLockProcess(\n lock: OpenMeldLock,\n pid: number\n): Promise<OpenMeldLock> {\n const ownerProcessStartedAt = readProcessStartIdentity(pid);\n if (!isPreciseProcessStartIdentity(ownerProcessStartedAt)) {\n throw new Error(\"Cannot establish native command process identity.\");\n }\n const parent = await open(\n resolveOwnerEntryPath(lock.path, lock.ownerId),\n \"r\"\n );\n try {\n const meta = parseOpenMeldLockMeta(await parent.readFile(\"utf8\"));\n if (\n meta?.ownerId !== lock.ownerId ||\n meta.pid !== process.pid ||\n meta.ownerProcessStartedAt !== CURRENT_PROCESS_START_IDENTITY\n ) {\n throw new Error(\"Native command does not own the lifecycle lock.\");\n }\n const participant = { path: lock.path, ownerId: randomUUID() };\n const contents = `${JSON.stringify({\n ownerId: participant.ownerId,\n parentOwnerId: lock.ownerId,\n pid,\n ownerProcessStartedAt,\n at: new Date().toISOString(),\n })}\\n`;\n await writeFile(\n resolveOwnerEntryPath(lock.path, participant.ownerId),\n contents,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n }\n );\n // A failed attachment must never grant execution. Keep its entry until\n // the waiting process exits; subsequent recovery proves that identity dead.\n const snapshot = await readLockSnapshot(lock.path);\n if (\n readProcessStartIdentity(pid) !== ownerProcessStartedAt ||\n !(snapshot.ownerEntryNames ?? [snapshot.ownerEntryName]).includes(\n `${encodeURIComponent(participant.ownerId)}.owner.json`\n )\n ) {\n throw new Error(\n \"Native command lifecycle attachment could not be verified.\"\n );\n }\n return participant;\n } finally {\n await parent.close();\n }\n}\n\nexport function releaseLockSync(lock: OpenMeldLock): void {\n try {\n unlinkSync(resolveOwnerEntryPath(lock.path, lock.ownerId));\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\") {\n return;\n }\n throw error;\n }\n\n try {\n rmdirSync(lock.path);\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return;\n }\n throw error;\n }\n}\n\nexport async function runWithCleanupPreservingRunError<T>(input: {\n run: () => Promise<T>;\n cleanup: () => Promise<void>;\n onCleanupErrorAfterRunFailure?: (cleanupError: unknown) => void;\n}): Promise<T> {\n let runResult: T | undefined;\n let runSucceeded = false;\n let runError: unknown;\n\n try {\n runResult = await input.run();\n runSucceeded = true;\n } catch (error) {\n runError = error;\n }\n\n try {\n await input.cleanup();\n } catch (cleanupError) {\n if (!runSucceeded) {\n input.onCleanupErrorAfterRunFailure?.(cleanupError);\n throw runError;\n }\n throw cleanupError;\n }\n\n if (!runSucceeded) {\n throw runError;\n }\n\n return runResult as T;\n}\n\nexport async function runWithHeldLock<T>(input: {\n lock: OpenMeldLock;\n run: () => Promise<T>;\n releaseContext?: HeldLockReleaseContext;\n}): Promise<T> {\n return await runWithCleanupPreservingRunError({\n run: input.run,\n cleanup: () => releaseLock(input.lock),\n onCleanupErrorAfterRunFailure: (releaseError) => {\n warnLockReleaseFailure({\n error: releaseError,\n lock: input.lock,\n releaseContext: input.releaseContext,\n });\n },\n });\n}\n\nexport async function readLockMeta(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<OpenMeldLockMeta | null> {\n const existingLock = await readLockSnapshot(\n resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n })\n );\n return existingLock.meta;\n}\n\nexport async function tryCleanupStaleLock(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<boolean> {\n return await tryCleanupStaleLockPath(\n resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n })\n );\n}\n\nexport async function repairOrphanedLegacyLock(input: {\n openMeldProfileId: string;\n key: string;\n}): Promise<boolean> {\n const path = resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n });\n return await repairOrphanedLegacyLockPath(path);\n}\n\nexport async function repairOrphanedLegacyLocks(): Promise<OpenMeldLegacyLockRepairReport> {\n const locksRootPath = join(resolveRuntimeDir(), \"locks\");\n const profileEntries = await readDirectoryEntries(locksRootPath);\n let removedOrphanedLegacyLocks = 0;\n\n for (const profileEntry of profileEntries.sort((left, right) =>\n left.name.localeCompare(right.name)\n )) {\n if (!profileEntry.isDirectory()) {\n continue;\n }\n const profileLocksPath = join(locksRootPath, profileEntry.name);\n const lockEntries = await readDirectoryEntries(profileLocksPath);\n for (const lockEntry of lockEntries.sort((left, right) =>\n left.name.localeCompare(right.name)\n )) {\n if (!(lockEntry.isFile() && lockEntry.name.endsWith(\".lock\"))) {\n continue;\n }\n if (\n await repairOrphanedLegacyLockPath(\n join(profileLocksPath, lockEntry.name)\n )\n ) {\n removedOrphanedLegacyLocks += 1;\n }\n }\n }\n\n return { removedOrphanedLegacyLocks };\n}\n\nasync function repairOrphanedLegacyLockPath(path: string): Promise<boolean> {\n const firstSnapshot = await readLockSnapshot(path);\n if (\n firstSnapshot.storageKind !== \"legacy_file\" ||\n !isRecoverableStaleLock(firstSnapshot)\n ) {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (!isSameRecoverableLockSnapshot(firstSnapshot, confirmedSnapshot)) {\n return false;\n }\n\n try {\n // Ordinary lock acquisition never unlinks legacy files because an older\n // client may replace one concurrently. This path is reserved for the\n // explicit local-state repair action after the user has closed other\n // OpenMeld commands that could publish a legacy lock at this path.\n await unlink(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"EISDIR\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function readDirectoryEntries(path: string) {\n return await readdir(path, { withFileTypes: true }).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n });\n}\n\ntype LockSnapshot = {\n exists: boolean;\n fileIdentity: string | null;\n ownerEntryName: string | null;\n ownerEntryNames?: string[];\n modifiedAtMs: number | null;\n metaRaw: string | null;\n meta: OpenMeldLockMeta | null;\n pid: number | null;\n hasStaleOwner: boolean;\n storageKind: \"directory\" | \"legacy_file\" | null;\n};\n\nfunction resolveLockPath(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): string {\n const openMeldProfileId = normalizeOpenMeldProfileId(input.openMeldProfileId);\n return join(\n resolveLocksDir(openMeldProfileId, input.pathResolution),\n `${sanitizeFilename(input.key)}.lock`\n );\n}\n\nfunction sanitizeFilename(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n}\n\nfunction safeParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction normalizeMetaRaw(metaRaw: string | undefined): string | null {\n if (typeof metaRaw !== \"string\") {\n return null;\n }\n const normalized = metaRaw.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction parseOpenMeldLockMeta(\n metaRaw: string | null\n): OpenMeldLockMeta | null {\n if (!metaRaw) {\n return null;\n }\n const parsed = safeParse(metaRaw);\n if (!parsed || typeof parsed !== \"object\") {\n return null;\n }\n return parsed as OpenMeldLockMeta;\n}\n\nfunction buildOpenMeldLockErrorMessage(\n path: string,\n metaRaw: string | null,\n contentionState: OpenMeldLockContentionState\n): string {\n const lockDetail = metaRaw\n ? `space is locked (${path}). Meta: ${metaRaw}`\n : `space is locked (${path})`;\n if (contentionState !== \"orphaned\") {\n return lockDetail;\n }\n return `${lockDetail}. ${OPENMELD_ORPHANED_LOCK_SUMMARY} ${buildOpenMeldOrphanedLockAction()}`;\n}\n\nfunction getPidFromMeta(meta: unknown): number | null {\n if (!meta || typeof meta !== \"object\") {\n return null;\n }\n const pid = (meta as Record<string, unknown>).pid;\n return typeof pid === \"number\" ? pid : null;\n}\n\nfunction missingLockSnapshot(): LockSnapshot {\n return {\n exists: false,\n fileIdentity: null,\n ownerEntryName: null,\n modifiedAtMs: null,\n metaRaw: null,\n meta: null,\n pid: null,\n hasStaleOwner: false,\n storageKind: null,\n };\n}\n\nasync function readLockSnapshot(\n path: string,\n remainingRaceRetries = 2\n): Promise<LockSnapshot> {\n const pathStats = await lstat(path).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (!pathStats) {\n return missingLockSnapshot();\n }\n\n if (pathStats.isDirectory()) {\n try {\n return await readDirectoryLockSnapshot(path, pathStats);\n } catch (error) {\n if (\n remainingRaceRetries > 0 &&\n (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\")\n ) {\n return await readLockSnapshot(path, remainingRaceRetries - 1);\n }\n throw error;\n }\n }\n\n const handle = await open(path, \"r\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n if (remainingRaceRetries > 0 && getErrorCode(error) === \"EISDIR\") {\n return \"retry\" as const;\n }\n throw error;\n });\n if (handle === \"retry\") {\n return await readLockSnapshot(path, remainingRaceRetries - 1);\n }\n if (!handle) {\n return missingLockSnapshot();\n }\n\n try {\n const [metaRaw, stats] = await Promise.all([\n handle.readFile(\"utf8\"),\n handle.stat(),\n ]);\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw);\n const meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n exists: true,\n fileIdentity: `${stats.dev}:${stats.ino}:${stats.mtimeMs}:${stats.size}`,\n ownerEntryName: null,\n modifiedAtMs: stats.mtimeMs,\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStaleOwner: isLockOwnerStale({ meta, pid }),\n storageKind: \"legacy_file\",\n };\n } finally {\n await handle.close();\n }\n}\n\nasync function readDirectoryLockSnapshot(\n path: string,\n pathStats: Awaited<ReturnType<typeof lstat>>,\n selectedEntry?: string\n): Promise<LockSnapshot> {\n const ownerEntries = (await readdir(path, { withFileTypes: true }))\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".owner.json\"))\n .map((entry) => entry.name)\n .sort();\n const ownerEntryName =\n selectedEntry ?? (ownerEntries.length === 1 ? ownerEntries[0] : null);\n const directoryIdentity = `${pathStats.dev}:${pathStats.ino}:${pathStats.mtimeMs}`;\n\n if (!selectedEntry && ownerEntries.length > 1) {\n const snapshots = await Promise.all(\n ownerEntries.map((entry) =>\n readDirectoryLockSnapshot(path, pathStats, entry)\n )\n );\n const recognized = snapshots.every(\n (snapshot) =>\n typeof snapshot.meta?.ownerId === \"string\" &&\n snapshot.ownerEntryName ===\n `${encodeURIComponent(snapshot.meta.ownerId)}.owner.json` &&\n isPreciseProcessStartIdentity(snapshot.meta.ownerProcessStartedAt) &&\n snapshot.pid !== null\n );\n return {\n exists: true,\n fileIdentity: snapshots\n .map((snapshot) => snapshot.fileIdentity)\n .join(\"|\"),\n ownerEntryName: null,\n ownerEntryNames: recognized ? ownerEntries : undefined,\n modifiedAtMs: Number(pathStats.mtimeMs),\n metaRaw: null,\n meta: null,\n pid: recognized ? (snapshots[0]?.pid ?? null) : null,\n hasStaleOwner:\n recognized && snapshots.every((snapshot) => snapshot.hasStaleOwner),\n storageKind: \"directory\",\n };\n }\n\n if (!ownerEntryName) {\n return {\n exists: true,\n fileIdentity: `${directoryIdentity}:empty-or-malformed`,\n ownerEntryName: null,\n modifiedAtMs: Number(pathStats.mtimeMs),\n metaRaw: null,\n meta: null,\n pid: null,\n hasStaleOwner: false,\n storageKind: \"directory\",\n };\n }\n\n const ownerEntryPath = join(path, ownerEntryName);\n const handle = await open(ownerEntryPath, \"r\");\n try {\n const [metaRaw, stats] = await Promise.all([\n handle.readFile(\"utf8\"),\n handle.stat(),\n ]);\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw);\n const meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n exists: true,\n fileIdentity: `${directoryIdentity}:${ownerEntryName}:${stats.dev}:${stats.ino}:${stats.mtimeMs}:${stats.size}`,\n ownerEntryName,\n modifiedAtMs: stats.mtimeMs,\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStaleOwner: isLockOwnerStale({ meta, pid }),\n storageKind: \"directory\",\n };\n } finally {\n await handle.close();\n }\n}\n\nasync function tryCleanupStaleLockPath(\n path: string,\n initialSnapshot?: LockSnapshot\n): Promise<boolean> {\n const firstSnapshot = initialSnapshot ?? (await readLockSnapshot(path));\n\n if (!isRecoverableStaleLock(firstSnapshot)) {\n return false;\n }\n\n // A legacy client can replace a stale file lock with a live file lock at the\n // same path between inspection and unlink. Without owner-scoped storage,\n // cleanup cannot prove that it is removing the same owner, so fail closed\n // throughout the mixed-version rollout.\n if (firstSnapshot.storageKind === \"legacy_file\") {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (!isSameRecoverableLockSnapshot(firstSnapshot, confirmedSnapshot)) {\n return false;\n }\n\n if (confirmedSnapshot.storageKind === \"directory\") {\n return await cleanupStaleDirectoryLock(path, confirmedSnapshot);\n }\n\n return false;\n}\n\nfunction isSameRecoverableLockSnapshot(\n firstSnapshot: LockSnapshot,\n confirmedSnapshot: LockSnapshot\n): boolean {\n return (\n confirmedSnapshot.exists &&\n confirmedSnapshot.fileIdentity === firstSnapshot.fileIdentity &&\n confirmedSnapshot.ownerEntryName === firstSnapshot.ownerEntryName &&\n confirmedSnapshot.metaRaw === firstSnapshot.metaRaw &&\n confirmedSnapshot.pid === firstSnapshot.pid &&\n confirmedSnapshot.storageKind === firstSnapshot.storageKind &&\n isRecoverableStaleLock(confirmedSnapshot)\n );\n}\n\nfunction resolveLockContentionState(\n snapshot: LockSnapshot\n): OpenMeldLockContentionState {\n if (\n snapshot.storageKind === \"legacy_file\" &&\n isRecoverableStaleLock(snapshot)\n ) {\n return \"orphaned\";\n }\n if (\n snapshot.storageKind !== null &&\n (snapshot.pid === null || !snapshot.hasStaleOwner)\n ) {\n return \"active\";\n }\n return \"unknown\";\n}\n\nasync function cleanupStaleDirectoryLock(\n path: string,\n snapshot: LockSnapshot\n): Promise<boolean> {\n for (const entry of snapshot.ownerEntryNames ??\n (snapshot.ownerEntryName ? [snapshot.ownerEntryName] : [])) {\n try {\n await unlink(join(path, entry));\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n try {\n await rmdir(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return true;\n }\n if (getErrorCode(error) === \"ENOTEMPTY\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function tryPublishLock(\n path: string,\n ownerId: string,\n contents: string\n): Promise<boolean> {\n try {\n await mkdir(path);\n } catch (error) {\n if (getErrorCode(error) === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n\n const ownerEntryPath = resolveOwnerEntryPath(path, ownerId);\n try {\n await writeFile(ownerEntryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return true;\n } catch (error) {\n await unlink(ownerEntryPath).catch((cleanupError) => {\n if (getErrorCode(cleanupError) !== \"ENOENT\") {\n console.warn(\"[openmeld.lock.owner_entry_cleanup_warning]\", {\n ownerEntryPath,\n cleanupError: toErrorMessage(cleanupError),\n });\n }\n });\n await rmdir(path).catch((cleanupError) => {\n if (getErrorCode(cleanupError) !== \"ENOENT\") {\n console.warn(\"[openmeld.lock.directory_cleanup_warning]\", {\n lockPath: path,\n cleanupError: toErrorMessage(cleanupError),\n });\n }\n });\n throw error;\n }\n}\n\nasync function unlinkOwnedDirectoryEntry(lock: OpenMeldLock): Promise<boolean> {\n try {\n await unlink(resolveOwnerEntryPath(lock.path, lock.ownerId));\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction resolveOwnerEntryPath(path: string, ownerId: string): string {\n return join(path, `${encodeURIComponent(ownerId)}.owner.json`);\n}\n\nfunction isRecoverableStaleLock(snapshot: LockSnapshot): boolean {\n if (!snapshot.exists) {\n return false;\n }\n if (snapshot.pid !== null) {\n return snapshot.hasStaleOwner;\n }\n return (\n snapshot.modifiedAtMs !== null &&\n Date.now() - snapshot.modifiedAtMs >= MALFORMED_LOCK_RECOVERY_GRACE_MS\n );\n}\n\nfunction isLockOwnerStale(input: {\n meta: OpenMeldLockMeta | null;\n pid: number | null;\n}): boolean {\n if (input.pid === null) {\n return false;\n }\n const ownerProcessStartedAt = getProcessStartIdentityFromMeta(input.meta);\n if (!ownerProcessStartedAt) {\n // Locks from older clients do not carry process-start identity. Keep them\n // while their PID is live, but preserve the existing dead-PID recovery.\n return !isPidAlive(input.pid);\n }\n return !isProcessIdentityAlive({\n ownerPid: input.pid,\n ownerProcessStartedAt,\n });\n}\n\nfunction getProcessStartIdentityFromMeta(meta: unknown): string | null {\n if (!(meta && typeof meta === \"object\")) {\n return null;\n }\n const value = (meta as Record<string, unknown>).ownerProcessStartedAt;\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n if (getErrorCode(err) === \"ESRCH\") {\n return false;\n }\n return true;\n }\n}\n\nfunction getErrorCode(err: unknown): string | undefined {\n if (!err || typeof err !== \"object\") {\n return undefined;\n }\n const code = (err as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nfunction throwRecognizedLocalMachineFailure(input: {\n operation: \"create_lock\";\n error: unknown;\n}): never {\n const recognizedFailure = toRecognizedLocalMachineFailureError(input);\n throw recognizedFailure ?? input.error;\n}\n\nfunction warnLockReleaseFailure(input: {\n error: unknown;\n lock: OpenMeldLock;\n releaseContext?: HeldLockReleaseContext;\n}): void {\n console.warn(\"[openmeld.lock.release.warning]\", {\n lockPath: input.lock.path,\n releaseError: toErrorMessage(input.error),\n releaseContext: input.releaseContext ?? {},\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lock-anKblZEb.js","names":["resolveLocksDir","process","resolveRuntimeDir"],"sources":["../src/system/local-machine-recovery/index.ts","../src/config/openmeld-lane-descriptor.ts","../src/config/session-profile.ts","../src/config/lock.ts"],"sourcesContent":["import {\n formatLocalMachineIssueMessage,\n type LocalMachineIssue,\n type LocalMachineOperation,\n} from \"@openmeld/schemas\";\n\ntype LocalMachineFailureInput = {\n operation: LocalMachineOperation;\n error: unknown;\n};\n\nexport class LocalMachineFailureError extends Error {\n readonly code: LocalMachineIssue[\"code\"];\n readonly issue: LocalMachineIssue;\n\n constructor(input: { issue: LocalMachineIssue; cause?: unknown }) {\n super(formatLocalMachineIssueMessage(input.issue), {\n cause: input.cause,\n });\n this.name = \"LocalMachineFailureError\";\n this.code = input.issue.code;\n this.issue = input.issue;\n }\n}\n\nexport function isLocalMachineFailureError(\n error: unknown\n): error is LocalMachineFailureError {\n return error instanceof LocalMachineFailureError;\n}\n\nexport function toLocalMachineFailureError(\n input: LocalMachineFailureInput\n): LocalMachineFailureError {\n if (isLocalMachineFailureError(input.error)) {\n return input.error;\n }\n return new LocalMachineFailureError({\n issue: assessLocalMachineFailure(input),\n cause: input.error,\n });\n}\n\nexport function toRecognizedLocalMachineFailureError(\n input: LocalMachineFailureInput\n): LocalMachineFailureError | null {\n if (isLocalMachineFailureError(input.error)) {\n return input.error;\n }\n const issue = assessLocalMachineFailure(input);\n return issue.code === \"local_machine.failure.unknown\"\n ? null\n : new LocalMachineFailureError({\n issue,\n cause: input.error,\n });\n}\n\nexport function assessLocalMachineFailure(\n input: LocalMachineFailureInput\n): LocalMachineIssue {\n const systemCode = readSystemErrorCode(input.error);\n const detail = readErrorMessage(input.error);\n\n if (systemCode === \"ENOSPC\" || systemCode === \"EDQUOT\") {\n return {\n schemaVersion: 1,\n code: \"local_machine.storage.exhausted\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"Your computer is out of storage space. OpenMeld can't save the local files it needs.\",\n primaryAction: \"Free up storage, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EROFS\" ||\n ((input.operation === \"create_lock\" ||\n input.operation === \"write_local_state\") &&\n (systemCode === \"EACCES\" || systemCode === \"EPERM\"))\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.storage.not_writable\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary: \"OpenMeld can't write to its local data folder.\",\n primaryAction: \"Make sure the folder is writable, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EACCES\" ||\n systemCode === \"EPERM\" ||\n systemCode === \"EROFS\"\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.permission.denied\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"OpenMeld doesn't have permission to complete local setup on this computer.\",\n primaryAction:\n \"Allow OpenMeld to access its local files and background services, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n if (\n systemCode === \"EMFILE\" ||\n systemCode === \"ENFILE\" ||\n systemCode === \"ENOMEM\"\n ) {\n return {\n schemaVersion: 1,\n code: \"local_machine.resources.exhausted\",\n operation: input.operation,\n recoveryPolicy: \"user_action\",\n summary:\n \"Your computer doesn't have enough available system resources for OpenMeld to continue.\",\n primaryAction: \"Restart your computer, then try again.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n }\n\n return {\n schemaVersion: 1,\n code: \"local_machine.failure.unknown\",\n operation: input.operation,\n recoveryPolicy: \"diagnostics\",\n summary: \"OpenMeld couldn't complete a required action on this computer.\",\n primaryAction: \"Try again. If it still fails, open diagnostics.\",\n diagnostics: {\n systemCode,\n detail,\n },\n };\n}\n\nexport function createServiceSpawnPendingIssue(input: {\n detail?: string | null;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.failure.unknown\",\n operation: \"start_background_service\",\n recoveryPolicy: \"diagnostics\",\n summary: \"macOS registered OpenMeld Service but hasn't started it.\",\n primaryAction:\n \"Run `openmeld service snapshot --view agent` to collect startup diagnostics.\",\n diagnostics: {\n systemCode: \"SERVICE_SPAWN_PENDING\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nexport function createActiveSetupConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.concurrency.active\",\n operation: \"create_lock\",\n recoveryPolicy: \"user_action\",\n summary: \"Another OpenMeld setup is already running on this computer.\",\n primaryAction: input.primaryAction,\n diagnostics: {\n systemCode: \"OPENMELD_LOCK_ACTIVE\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nexport function createOrphanedSetupConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n}): LocalMachineIssue {\n return createOrphanedLocalConcurrencyIssue({\n ...input,\n summary: \"OpenMeld found a setup lock left by an older version.\",\n });\n}\n\nexport function createOrphanedLocalConcurrencyIssue(input: {\n detail?: string | null;\n primaryAction: string;\n summary: string;\n}): LocalMachineIssue {\n return {\n schemaVersion: 1,\n code: \"local_machine.concurrency.orphaned\",\n operation: \"create_lock\",\n recoveryPolicy: \"user_action\",\n summary: input.summary,\n primaryAction: input.primaryAction,\n diagnostics: {\n systemCode: \"OPENMELD_LOCK_ORPHANED\",\n detail: input.detail?.trim().slice(0, 2048) || null,\n },\n };\n}\n\nfunction readSystemErrorCode(error: unknown): string | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n const code = (error as { code?: unknown }).code;\n return typeof code === \"string\" && code.trim().length > 0 ? code : null;\n}\n\nfunction readErrorMessage(error: unknown): string | null {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message.trim().slice(0, 2048);\n }\n if (typeof error === \"string\" && error.trim().length > 0) {\n return error.trim().slice(0, 2048);\n }\n return null;\n}\n","import {\n type OpenMeldEnvPreset,\n resolveOpenMeldEnvPreset,\n resolveOpenMeldRootDir,\n} from \"./paths\";\n\nexport type OpenMeldLaneDescriptor = {\n command: \"openmeld\" | \"openmeld-dev\" | \"openmeld-canary\";\n preset: OpenMeldEnvPreset;\n openMeldHome: string;\n destructiveResetAllowed: boolean;\n repairCommand: string;\n removeCommand: string | null;\n resetCommand: string;\n};\n\nexport function resolveOpenMeldLaneDescriptor(input?: {\n env?: NodeJS.ProcessEnv;\n argv?: string[];\n homeDir?: string;\n}): OpenMeldLaneDescriptor {\n const env = input?.env ?? process.env;\n const preset = resolveOpenMeldEnvPreset({\n argv: input?.argv,\n env,\n homeDir: input?.homeDir,\n });\n const command = resolveLaneCommand(preset);\n return {\n command,\n preset,\n openMeldHome: resolveOpenMeldRootDir({\n argv: input?.argv,\n env,\n homeDir: input?.homeDir,\n }),\n destructiveResetAllowed: true,\n repairCommand: `${command} repair local-state`,\n removeCommand: preset === \"canary\" ? \"pnpm openmeld:canary:remove\" : null,\n resetCommand: `${command} reset --yes`,\n };\n}\n\nexport function formatLaneScopeSentence(\n lane: Pick<OpenMeldLaneDescriptor, \"openMeldHome\" | \"command\">\n): string {\n return `This only affects the ${lane.command} lane at ${lane.openMeldHome}.`;\n}\n\nexport function buildLaneScopedCleanupGuidance(\n lane: Pick<\n OpenMeldLaneDescriptor,\n \"command\" | \"repairCommand\" | \"removeCommand\"\n >\n): string {\n const commands = [`\\`${lane.repairCommand}\\``];\n if (lane.removeCommand) {\n commands.unshift(`\\`${lane.removeCommand}\\``);\n }\n return `Optional cleanup for this lane: run ${commands.join(\" or \")}.`;\n}\n\nfunction resolveLaneCommand(\n preset: OpenMeldEnvPreset\n): OpenMeldLaneDescriptor[\"command\"] {\n if (preset === \"dev-local\") {\n return \"openmeld-dev\";\n }\n if (preset === \"canary\") {\n return \"openmeld-canary\";\n }\n return \"openmeld\";\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, open, readdir, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n normalizeOpenMeldProfileId,\n type OpenMeldProfileId,\n sessionsDir,\n} from \"./paths\";\n\nexport const OPENMELD_CLI_CONTEXT_ENV_KEY = \"OPENMELD_CLI_CONTEXT_ID\";\nexport const LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY =\n \"OPENMELD_AGENT_SESSION_ID\";\n\nexport const CLI_CONTEXT_ENV_KEYS = [\n OPENMELD_CLI_CONTEXT_ENV_KEY,\n LEGACY_OPENMELD_AGENT_SESSION_ENV_KEY,\n] as const;\n\nconst SESSION_FILE_MAX_LENGTH = 128;\nconst SESSION_FILE_HASH_LENGTH = 8;\n\nexport type CliContextResolution = {\n cliContextId: string;\n source: string;\n};\n\nexport type CliContextStateV1 = {\n v: 1;\n sessionId: string;\n updatedAt: string;\n cliContextSource?: string;\n openMeldProfileId?: string;\n selectedOpenMeldProfileId?: string;\n};\n\nexport function resolveCliContext(\n profileIdInput?: string\n): CliContextResolution | null {\n const explicit = normalizeSessionId(profileIdInput);\n if (explicit) {\n return {\n cliContextId: explicit,\n source: \"manual\",\n };\n }\n\n for (const key of CLI_CONTEXT_ENV_KEYS) {\n const sessionId = normalizeSessionId(process.env[key]);\n if (sessionId) {\n return {\n cliContextId: sessionId,\n source: `environment:${key}`,\n };\n }\n }\n\n return resolveTerminalSessionId();\n}\n\nexport function resolveCliContextId(profileIdInput?: string): string | null {\n return resolveCliContext(profileIdInput)?.cliContextId ?? null;\n}\n\nexport function buildSessionProfilePayload(\n session: CliContextResolution,\n openMeldProfileId: OpenMeldProfileId\n): CliContextStateV1 {\n return {\n v: 1,\n sessionId: session.cliContextId,\n cliContextSource: session.source,\n openMeldProfileId: normalizeOpenMeldProfileId(openMeldProfileId),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function formatCliContextSource(source: string): string {\n if (source === \"manual\") {\n return \"manual\";\n }\n if (source.startsWith(\"environment:\")) {\n return `environment:${source.slice(\"environment:\".length)}`;\n }\n if (source.startsWith(\"terminal:\")) {\n return \"terminal-fingerprint\";\n }\n return source;\n}\n\nexport function normalizeCliContextResolution(\n value: unknown\n): CliContextResolution | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const maybe = value as {\n cliContextId?: unknown;\n source?: unknown;\n };\n const cliContextId = normalizeSessionId(maybe.cliContextId);\n const source = normalizeSessionSource(maybe.source);\n if (!(cliContextId && source)) {\n return null;\n }\n\n return { cliContextId, source };\n}\n\nfunction normalizeSessionSource(raw: unknown): string | null {\n const value = String(raw ?? \"\").trim();\n if (!value) {\n return null;\n }\n return value;\n}\n\nexport async function setSessionOpenMeldProfileId(\n openMeldProfileId: OpenMeldProfileId\n): Promise<boolean> {\n return await writeCliContextState({\n openMeldProfileId,\n });\n}\n\nexport async function getSessionOpenMeldProfileId(): Promise<OpenMeldProfileId | null> {\n return (await readCliContextState())?.openMeldProfileId ?? null;\n}\n\nexport async function clearSessionOpenMeldProfileId(): Promise<boolean> {\n return await writeCliContextState({\n openMeldProfileId: null,\n });\n}\n\nexport async function readCliContextState(input?: {\n sessionId?: string;\n}): Promise<CliContextStateV1 | null> {\n const cliContextId = resolveSessionStateId(input?.sessionId);\n if (!cliContextId) {\n return null;\n }\n\n const raw = await readFile(cliContextStatePath(cliContextId), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n return null;\n }\n\n return parseCliContextState(raw);\n}\n\nexport async function listCliContextStates(): Promise<CliContextStateV1[]> {\n const entryNames = await readdir(sessionsDir()).catch(() => []);\n const states: CliContextStateV1[] = [];\n for (const entryName of entryNames) {\n if (!entryName.endsWith(\".json\")) {\n continue;\n }\n const raw = await readFile(join(sessionsDir(), entryName), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n continue;\n }\n const parsed = parseCliContextState(raw);\n if (!parsed) {\n continue;\n }\n states.push(parsed);\n }\n return states.sort((left, right) =>\n left.sessionId.localeCompare(right.sessionId)\n );\n}\n\nexport async function writeCliContextState(input: {\n sessionId?: string;\n sessionSource?: string;\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n}): Promise<boolean> {\n const cliContext = resolveCliContextStateInput(input) ?? resolveCliContext();\n if (!cliContext) {\n return false;\n }\n\n await mkdir(sessionsDir(), { recursive: true });\n const existing = await readCliContextState({\n sessionId: cliContext.cliContextId,\n });\n const nextOpenMeldProfileId = resolveNextSessionOpenMeldProfileId(\n existing,\n input\n );\n const nextSelectedOpenMeldProfileId = resolveNextSelectedOpenMeldProfileId(\n existing,\n input\n );\n const outputPath = cliContextStatePath(cliContext.cliContextId);\n\n if (!(nextOpenMeldProfileId || nextSelectedOpenMeldProfileId)) {\n await rm(outputPath, { force: true });\n return true;\n }\n\n const payload: CliContextStateV1 = {\n v: 1,\n sessionId: cliContext.cliContextId,\n cliContextSource:\n cliContext.source ?? existing?.cliContextSource ?? \"manual\",\n ...(nextOpenMeldProfileId\n ? { openMeldProfileId: nextOpenMeldProfileId }\n : {}),\n ...(nextSelectedOpenMeldProfileId\n ? { selectedOpenMeldProfileId: nextSelectedOpenMeldProfileId }\n : {}),\n updatedAt: new Date().toISOString(),\n };\n\n await writeCliContextStateFile(outputPath, payload);\n return true;\n}\n\nexport function cliContextStatePath(sessionId: string): string {\n return join(sessionsDir(), `${toSafeSessionFile(sessionId)}.json`);\n}\n\nfunction toSafeSessionFile(value: string): string {\n const hash = createHash(\"sha1\")\n .update(value, \"utf8\")\n .digest(\"hex\")\n .slice(0, SESSION_FILE_HASH_LENGTH);\n const safeBaseRaw = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const safeBase = safeBaseRaw.length > 0 ? safeBaseRaw : \"session\";\n const maxBaseLength = Math.max(\n 1,\n SESSION_FILE_MAX_LENGTH - SESSION_FILE_HASH_LENGTH - 1\n );\n const truncatedBase = safeBase.slice(0, maxBaseLength);\n return `${truncatedBase}-${hash}`;\n}\n\nfunction resolveCliContextStateInput(input: {\n sessionId?: string;\n sessionSource?: string;\n}): CliContextResolution | null {\n const sessionId = normalizeSessionId(input.sessionId);\n if (!sessionId) {\n return null;\n }\n return {\n cliContextId: sessionId,\n source: normalizeSessionSource(input.sessionSource) ?? \"manual\",\n };\n}\n\nfunction resolveSessionStateId(sessionId?: string): string | null {\n const explicit = normalizeSessionId(sessionId);\n if (explicit) {\n return explicit;\n }\n return resolveCliContext()?.cliContextId ?? null;\n}\n\nfunction parseCliContextState(raw: string): CliContextStateV1 | null {\n let parsed: Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n try {\n parsed = JSON.parse(raw) as Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n } catch {\n return null;\n }\n\n if (parsed.v !== 1) {\n return null;\n }\n const sessionId = normalizeSessionId(parsed.sessionId);\n if (!sessionId) {\n return null;\n }\n const openMeldProfileId = resolveStoredSessionOpenMeldProfileId(parsed);\n const selectedOpenMeldProfileId =\n resolveStoredSelectedOpenMeldProfileId(parsed);\n if (!(openMeldProfileId || selectedOpenMeldProfileId)) {\n return null;\n }\n const cliContextSource = normalizeSessionSource(parsed.cliContextSource);\n return {\n v: 1,\n sessionId,\n ...(cliContextSource ? { cliContextSource } : {}),\n ...(openMeldProfileId ? { openMeldProfileId } : {}),\n ...(selectedOpenMeldProfileId ? { selectedOpenMeldProfileId } : {}),\n updatedAt:\n typeof parsed.updatedAt === \"string\" && parsed.updatedAt.trim().length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString(),\n };\n}\n\nfunction resolveNextSessionOpenMeldProfileId(\n existing: CliContextStateV1 | null,\n input: {\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"openMeldProfileId\" in input)) {\n return existing?.openMeldProfileId;\n }\n return (\n normalizeOptionalOpenMeldProfileId(input.openMeldProfileId) ?? undefined\n );\n}\n\nfunction resolveNextSelectedOpenMeldProfileId(\n existing: CliContextStateV1 | null,\n input: {\n openMeldProfileId?: string | null;\n selectedOpenMeldProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"selectedOpenMeldProfileId\" in input)) {\n return existing?.selectedOpenMeldProfileId;\n }\n return (\n normalizeOptionalOpenMeldProfileId(input.selectedOpenMeldProfileId) ??\n undefined\n );\n}\n\nasync function writeCliContextStateFile(\n outputPath: string,\n payload: CliContextStateV1\n): Promise<void> {\n const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}`;\n const file = await open(tempPath, \"w\");\n let writeFailure: unknown = null;\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } catch (error) {\n writeFailure = error;\n }\n try {\n await file.close();\n } catch (error) {\n if (!writeFailure) {\n writeFailure = error;\n }\n }\n if (writeFailure) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw writeFailure;\n }\n\n try {\n await rename(tempPath, outputPath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction normalizeSessionId(value: unknown): string | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n return raw.slice(0, 256);\n}\n\nfunction resolveTerminalSessionId(): CliContextResolution | null {\n if (!(process.stdin.isTTY || process.stdout.isTTY)) {\n return null;\n }\n\n const parentPid = Number(process.ppid);\n if (!Number.isInteger(parentPid) || parentPid <= 1) {\n return null;\n }\n\n return {\n cliContextId: `terminal-ppid-${parentPid}`,\n source: `terminal:ppid-${parentPid}`,\n };\n}\n\nfunction resolveStoredSessionOpenMeldProfileId(input: {\n openMeldProfileId?: unknown;\n profile?: unknown;\n}): OpenMeldProfileId | null {\n const openMeldProfileId = normalizeOptionalOpenMeldProfileId(\n input.openMeldProfileId\n );\n const legacyProfile = normalizeOptionalOpenMeldProfileId(input.profile);\n if (\n openMeldProfileId &&\n legacyProfile &&\n openMeldProfileId !== legacyProfile\n ) {\n throw new Error(\n `conflicting stored OpenMeld profile identity: openMeldProfileId=${openMeldProfileId}, profile=${legacyProfile}. Remove or reconcile the legacy profile field so it matches openMeldProfileId.`\n );\n }\n return openMeldProfileId ?? legacyProfile;\n}\n\nfunction resolveStoredSelectedOpenMeldProfileId(input: {\n selectedOpenMeldProfileId?: unknown;\n}): OpenMeldProfileId | null {\n return normalizeOptionalOpenMeldProfileId(input.selectedOpenMeldProfileId);\n}\n\nfunction normalizeOptionalOpenMeldProfileId(\n value: unknown\n): OpenMeldProfileId | null {\n if (typeof value !== \"string\") {\n return null;\n }\n try {\n return normalizeOpenMeldProfileId(value);\n } catch {\n return null;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { rmdirSync, unlinkSync } from \"node:fs\";\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n rmdir,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport type { LocalMachineIssue } from \"@openmeld/schemas\";\nimport {\n createOrphanedLocalConcurrencyIssue,\n toRecognizedLocalMachineFailureError,\n} from \"../system/local-machine-recovery\";\nimport {\n CURRENT_PROCESS_START_IDENTITY,\n isPreciseProcessStartIdentity,\n isProcessIdentityAlive,\n readProcessStartIdentity,\n} from \"../system/process-identity\";\nimport { resolveOpenMeldLaneDescriptor } from \"./openmeld-lane-descriptor\";\nimport {\n normalizeOpenMeldProfileId,\n type OpenMeldPathResolutionInput,\n locksDir as resolveLocksDir,\n runtimeDir as resolveRuntimeDir,\n} from \"./paths\";\nimport { resolveCliContextId } from \"./session-profile\";\n\nexport type OpenMeldLock = {\n ownerId: string;\n path: string;\n};\n\nexport type OpenMeldLockMeta = Record<string, unknown>;\nexport type OpenMeldLockContentionState = \"active\" | \"orphaned\" | \"unknown\";\nexport type OpenMeldLegacyLockRepairReport = {\n removedOrphanedLegacyLocks: number;\n};\ntype HeldLockReleaseContext = Record<string, unknown>;\nconst MALFORMED_LOCK_RECOVERY_GRACE_MS = 30_000;\nconst OPENMELD_ORPHANED_LOCK_SUMMARY =\n \"OpenMeld found a local command lock left by an older version.\";\n\nexport class OpenMeldLockError extends Error {\n readonly code = \"openmeld.locked\";\n readonly lockPath: string;\n readonly lockKey: string;\n readonly metaRaw: string | null;\n readonly meta: OpenMeldLockMeta | null;\n readonly contentionState: OpenMeldLockContentionState;\n\n constructor(input: {\n path: string;\n key: string;\n metaRaw?: string;\n contentionState?: OpenMeldLockContentionState;\n }) {\n const normalizedMetaRaw = normalizeMetaRaw(input.metaRaw);\n const contentionState = input.contentionState ?? \"unknown\";\n super(\n buildOpenMeldLockErrorMessage(\n input.path,\n normalizedMetaRaw,\n contentionState\n )\n );\n this.name = \"OpenMeldLockError\";\n this.lockPath = input.path;\n this.lockKey = input.key;\n this.metaRaw = normalizedMetaRaw;\n this.meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n this.contentionState = contentionState;\n }\n}\n\nexport function isOpenMeldLockError(\n error: unknown\n): error is OpenMeldLockError {\n return error instanceof OpenMeldLockError;\n}\n\nexport function isOpenMeldOrphanedLockError(\n error: unknown\n): error is OpenMeldLockError {\n return isOpenMeldLockError(error) && error.contentionState === \"orphaned\";\n}\n\nexport function resolveOpenMeldOrphanedLockIssue(\n error: unknown\n): LocalMachineIssue | null {\n if (!isOpenMeldOrphanedLockError(error)) {\n return null;\n }\n return createOrphanedLocalConcurrencyIssue({\n summary: OPENMELD_ORPHANED_LOCK_SUMMARY,\n primaryAction: buildOpenMeldOrphanedLockAction(),\n detail: error.message,\n });\n}\n\nexport function buildOpenMeldOrphanedLockAction(): string {\n const repairCommand = resolveOpenMeldLaneDescriptor().repairCommand;\n return `Close any other OpenMeld commands, then run \\`${repairCommand}\\` and try again.`;\n}\n\nexport async function acquireLock(input: {\n openMeldProfileId: string;\n key: string;\n meta?: OpenMeldLockMeta;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<OpenMeldLock> {\n const openMeldProfileId = normalizeOpenMeldProfileId(input.openMeldProfileId);\n const sessionId = resolveCliContextId();\n const dir = resolveLocksDir(openMeldProfileId, input.pathResolution);\n const path = resolveLockPath({\n openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n });\n const ownerId = randomUUID();\n try {\n await mkdir(dir, { recursive: true });\n } catch (error) {\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n\n // A directory is the atomic ownership boundary. Its owner-specific entry\n // lets release remove only the lock it acquired, even if another process\n // publishes a replacement at the same canonical path.\n for (let attempt = 0; attempt < 2; attempt++) {\n const contents = `${JSON.stringify({\n ...(input.meta ? { ...input.meta } : {}),\n pid: process.pid,\n ownerProcessStartedAt: CURRENT_PROCESS_START_IDENTITY,\n openMeldProfileId,\n ...(sessionId ? { sessionId } : {}),\n at: new Date().toISOString(),\n ownerId,\n })}\\n`;\n let published: boolean;\n try {\n published = await tryPublishLock(path, ownerId, contents);\n } catch (error) {\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n if (published) {\n return { ownerId, path };\n }\n\n try {\n const existingLock = await readLockSnapshot(path);\n if (\n !existingLock.exists ||\n (await tryCleanupStaleLockPath(path, existingLock))\n ) {\n continue;\n }\n\n throw new OpenMeldLockError({\n path,\n key: input.key,\n metaRaw: existingLock.metaRaw ?? undefined,\n contentionState: resolveLockContentionState(existingLock),\n });\n } catch (error) {\n if (isOpenMeldLockError(error)) {\n throw error;\n }\n throwRecognizedLocalMachineFailure({\n operation: \"create_lock\",\n error,\n });\n }\n }\n\n throw new OpenMeldLockError({\n path,\n key: input.key,\n });\n}\n\nexport async function releaseLock(lock: OpenMeldLock): Promise<void> {\n const removedOwnerEntry = await unlinkOwnedDirectoryEntry(lock);\n if (!removedOwnerEntry) {\n return;\n }\n await rmdir(lock.path).catch((error) => {\n if (![\"ENOENT\", \"ENOTEMPTY\"].includes(getErrorCode(error) ?? \"\")) {\n throw error;\n }\n });\n}\n\n/** Attach a waiting native process before granting it permission to exec. */\nexport async function attachLockProcess(\n lock: OpenMeldLock,\n pid: number\n): Promise<OpenMeldLock> {\n const ownerProcessStartedAt = readProcessStartIdentity(pid);\n if (!isPreciseProcessStartIdentity(ownerProcessStartedAt)) {\n throw new Error(\"Cannot establish native command process identity.\");\n }\n const parent = await open(\n resolveOwnerEntryPath(lock.path, lock.ownerId),\n \"r\"\n );\n try {\n const meta = parseOpenMeldLockMeta(await parent.readFile(\"utf8\"));\n if (\n meta?.ownerId !== lock.ownerId ||\n meta.pid !== process.pid ||\n meta.ownerProcessStartedAt !== CURRENT_PROCESS_START_IDENTITY\n ) {\n throw new Error(\"Native command does not own the lifecycle lock.\");\n }\n const participant = { path: lock.path, ownerId: randomUUID() };\n const contents = `${JSON.stringify({\n ownerId: participant.ownerId,\n parentOwnerId: lock.ownerId,\n pid,\n ownerProcessStartedAt,\n at: new Date().toISOString(),\n })}\\n`;\n await writeFile(\n resolveOwnerEntryPath(lock.path, participant.ownerId),\n contents,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n }\n );\n // A failed attachment must never grant execution. Keep its entry until\n // the waiting process exits; subsequent recovery proves that identity dead.\n const snapshot = await readLockSnapshot(lock.path);\n if (\n readProcessStartIdentity(pid) !== ownerProcessStartedAt ||\n !(snapshot.ownerEntryNames ?? [snapshot.ownerEntryName]).includes(\n `${encodeURIComponent(participant.ownerId)}.owner.json`\n )\n ) {\n throw new Error(\n \"Native command lifecycle attachment could not be verified.\"\n );\n }\n return participant;\n } finally {\n await parent.close();\n }\n}\n\nexport function releaseLockSync(lock: OpenMeldLock): void {\n try {\n unlinkSync(resolveOwnerEntryPath(lock.path, lock.ownerId));\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\") {\n return;\n }\n throw error;\n }\n\n try {\n rmdirSync(lock.path);\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return;\n }\n throw error;\n }\n}\n\nexport async function runWithCleanupPreservingRunError<T>(input: {\n run: () => Promise<T>;\n cleanup: () => Promise<void>;\n onCleanupErrorAfterRunFailure?: (cleanupError: unknown) => void;\n}): Promise<T> {\n let runResult: T | undefined;\n let runSucceeded = false;\n let runError: unknown;\n\n try {\n runResult = await input.run();\n runSucceeded = true;\n } catch (error) {\n runError = error;\n }\n\n try {\n await input.cleanup();\n } catch (cleanupError) {\n if (!runSucceeded) {\n input.onCleanupErrorAfterRunFailure?.(cleanupError);\n throw runError;\n }\n throw cleanupError;\n }\n\n if (!runSucceeded) {\n throw runError;\n }\n\n return runResult as T;\n}\n\nexport async function runWithHeldLock<T>(input: {\n lock: OpenMeldLock;\n run: () => Promise<T>;\n releaseContext?: HeldLockReleaseContext;\n}): Promise<T> {\n return await runWithCleanupPreservingRunError({\n run: input.run,\n cleanup: () => releaseLock(input.lock),\n onCleanupErrorAfterRunFailure: (releaseError) => {\n warnLockReleaseFailure({\n error: releaseError,\n lock: input.lock,\n releaseContext: input.releaseContext,\n });\n },\n });\n}\n\nexport async function readLockMeta(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<OpenMeldLockMeta | null> {\n const existingLock = await readLockSnapshot(\n resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n })\n );\n return existingLock.meta;\n}\n\nexport async function tryCleanupStaleLock(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): Promise<boolean> {\n return await tryCleanupStaleLockPath(\n resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n pathResolution: input.pathResolution,\n })\n );\n}\n\nexport async function repairOrphanedLegacyLock(input: {\n openMeldProfileId: string;\n key: string;\n}): Promise<boolean> {\n const path = resolveLockPath({\n openMeldProfileId: input.openMeldProfileId,\n key: input.key,\n });\n return await repairOrphanedLegacyLockPath(path);\n}\n\nexport async function repairOrphanedLegacyLocks(): Promise<OpenMeldLegacyLockRepairReport> {\n const locksRootPath = join(resolveRuntimeDir(), \"locks\");\n const profileEntries = await readDirectoryEntries(locksRootPath);\n let removedOrphanedLegacyLocks = 0;\n\n for (const profileEntry of profileEntries.sort((left, right) =>\n left.name.localeCompare(right.name)\n )) {\n if (!profileEntry.isDirectory()) {\n continue;\n }\n const profileLocksPath = join(locksRootPath, profileEntry.name);\n const lockEntries = await readDirectoryEntries(profileLocksPath);\n for (const lockEntry of lockEntries.sort((left, right) =>\n left.name.localeCompare(right.name)\n )) {\n if (!(lockEntry.isFile() && lockEntry.name.endsWith(\".lock\"))) {\n continue;\n }\n if (\n await repairOrphanedLegacyLockPath(\n join(profileLocksPath, lockEntry.name)\n )\n ) {\n removedOrphanedLegacyLocks += 1;\n }\n }\n }\n\n return { removedOrphanedLegacyLocks };\n}\n\nasync function repairOrphanedLegacyLockPath(path: string): Promise<boolean> {\n const firstSnapshot = await readLockSnapshot(path);\n if (\n firstSnapshot.storageKind !== \"legacy_file\" ||\n !isRecoverableStaleLock(firstSnapshot)\n ) {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (!isSameRecoverableLockSnapshot(firstSnapshot, confirmedSnapshot)) {\n return false;\n }\n\n try {\n // Ordinary lock acquisition never unlinks legacy files because an older\n // client may replace one concurrently. This path is reserved for the\n // explicit local-state repair action after the user has closed other\n // OpenMeld commands that could publish a legacy lock at this path.\n await unlink(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"EISDIR\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function readDirectoryEntries(path: string) {\n return await readdir(path, { withFileTypes: true }).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return [];\n }\n throw error;\n });\n}\n\ntype LockSnapshot = {\n exists: boolean;\n fileIdentity: string | null;\n ownerEntryName: string | null;\n ownerEntryNames?: string[];\n modifiedAtMs: number | null;\n metaRaw: string | null;\n meta: OpenMeldLockMeta | null;\n pid: number | null;\n hasStaleOwner: boolean;\n storageKind: \"directory\" | \"legacy_file\" | null;\n};\n\nfunction resolveLockPath(input: {\n openMeldProfileId: string;\n key: string;\n pathResolution?: OpenMeldPathResolutionInput;\n}): string {\n const openMeldProfileId = normalizeOpenMeldProfileId(input.openMeldProfileId);\n return join(\n resolveLocksDir(openMeldProfileId, input.pathResolution),\n `${sanitizeFilename(input.key)}.lock`\n );\n}\n\nfunction sanitizeFilename(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n}\n\nfunction safeParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction normalizeMetaRaw(metaRaw: string | undefined): string | null {\n if (typeof metaRaw !== \"string\") {\n return null;\n }\n const normalized = metaRaw.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction parseOpenMeldLockMeta(\n metaRaw: string | null\n): OpenMeldLockMeta | null {\n if (!metaRaw) {\n return null;\n }\n const parsed = safeParse(metaRaw);\n if (!parsed || typeof parsed !== \"object\") {\n return null;\n }\n return parsed as OpenMeldLockMeta;\n}\n\nfunction buildOpenMeldLockErrorMessage(\n path: string,\n metaRaw: string | null,\n contentionState: OpenMeldLockContentionState\n): string {\n const lockDetail = metaRaw\n ? `space is locked (${path}). Meta: ${metaRaw}`\n : `space is locked (${path})`;\n if (contentionState !== \"orphaned\") {\n return lockDetail;\n }\n return `${lockDetail}. ${OPENMELD_ORPHANED_LOCK_SUMMARY} ${buildOpenMeldOrphanedLockAction()}`;\n}\n\nfunction getPidFromMeta(meta: unknown): number | null {\n if (!meta || typeof meta !== \"object\") {\n return null;\n }\n const pid = (meta as Record<string, unknown>).pid;\n return typeof pid === \"number\" ? pid : null;\n}\n\nfunction missingLockSnapshot(): LockSnapshot {\n return {\n exists: false,\n fileIdentity: null,\n ownerEntryName: null,\n modifiedAtMs: null,\n metaRaw: null,\n meta: null,\n pid: null,\n hasStaleOwner: false,\n storageKind: null,\n };\n}\n\nasync function readLockSnapshot(\n path: string,\n remainingRaceRetries = 2\n): Promise<LockSnapshot> {\n const pathStats = await lstat(path).catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (!pathStats) {\n return missingLockSnapshot();\n }\n\n if (pathStats.isDirectory()) {\n try {\n return await readDirectoryLockSnapshot(path, pathStats);\n } catch (error) {\n if (\n remainingRaceRetries > 0 &&\n (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\")\n ) {\n return await readLockSnapshot(path, remainingRaceRetries - 1);\n }\n throw error;\n }\n }\n\n const handle = await open(path, \"r\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n if (remainingRaceRetries > 0 && getErrorCode(error) === \"EISDIR\") {\n return \"retry\" as const;\n }\n throw error;\n });\n if (handle === \"retry\") {\n return await readLockSnapshot(path, remainingRaceRetries - 1);\n }\n if (!handle) {\n return missingLockSnapshot();\n }\n\n try {\n const [metaRaw, stats] = await Promise.all([\n handle.readFile(\"utf8\"),\n handle.stat(),\n ]);\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw);\n const meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n exists: true,\n fileIdentity: `${stats.dev}:${stats.ino}:${stats.mtimeMs}:${stats.size}`,\n ownerEntryName: null,\n modifiedAtMs: stats.mtimeMs,\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStaleOwner: isLockOwnerStale({ meta, pid }),\n storageKind: \"legacy_file\",\n };\n } finally {\n await handle.close();\n }\n}\n\nasync function readDirectoryLockSnapshot(\n path: string,\n pathStats: Awaited<ReturnType<typeof lstat>>,\n selectedEntry?: string\n): Promise<LockSnapshot> {\n const ownerEntries = (await readdir(path, { withFileTypes: true }))\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".owner.json\"))\n .map((entry) => entry.name)\n .sort();\n const ownerEntryName =\n selectedEntry ?? (ownerEntries.length === 1 ? ownerEntries[0] : null);\n const directoryIdentity = `${pathStats.dev}:${pathStats.ino}:${pathStats.mtimeMs}`;\n\n if (!selectedEntry && ownerEntries.length > 1) {\n const snapshots = await Promise.all(\n ownerEntries.map((entry) =>\n readDirectoryLockSnapshot(path, pathStats, entry)\n )\n );\n const recognized = snapshots.every(\n (snapshot) =>\n typeof snapshot.meta?.ownerId === \"string\" &&\n snapshot.ownerEntryName ===\n `${encodeURIComponent(snapshot.meta.ownerId)}.owner.json` &&\n isPreciseProcessStartIdentity(snapshot.meta.ownerProcessStartedAt) &&\n snapshot.pid !== null\n );\n return {\n exists: true,\n fileIdentity: snapshots\n .map((snapshot) => snapshot.fileIdentity)\n .join(\"|\"),\n ownerEntryName: null,\n ownerEntryNames: recognized ? ownerEntries : undefined,\n modifiedAtMs: Number(pathStats.mtimeMs),\n metaRaw: null,\n meta: null,\n pid: recognized ? (snapshots[0]?.pid ?? null) : null,\n hasStaleOwner:\n recognized && snapshots.every((snapshot) => snapshot.hasStaleOwner),\n storageKind: \"directory\",\n };\n }\n\n if (!ownerEntryName) {\n return {\n exists: true,\n fileIdentity: `${directoryIdentity}:empty-or-malformed`,\n ownerEntryName: null,\n modifiedAtMs: Number(pathStats.mtimeMs),\n metaRaw: null,\n meta: null,\n pid: null,\n hasStaleOwner: false,\n storageKind: \"directory\",\n };\n }\n\n const ownerEntryPath = join(path, ownerEntryName);\n const handle = await open(ownerEntryPath, \"r\");\n try {\n const [metaRaw, stats] = await Promise.all([\n handle.readFile(\"utf8\"),\n handle.stat(),\n ]);\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw);\n const meta = parseOpenMeldLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n exists: true,\n fileIdentity: `${directoryIdentity}:${ownerEntryName}:${stats.dev}:${stats.ino}:${stats.mtimeMs}:${stats.size}`,\n ownerEntryName,\n modifiedAtMs: stats.mtimeMs,\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStaleOwner: isLockOwnerStale({ meta, pid }),\n storageKind: \"directory\",\n };\n } finally {\n await handle.close();\n }\n}\n\nasync function tryCleanupStaleLockPath(\n path: string,\n initialSnapshot?: LockSnapshot\n): Promise<boolean> {\n const firstSnapshot = initialSnapshot ?? (await readLockSnapshot(path));\n\n if (!isRecoverableStaleLock(firstSnapshot)) {\n return false;\n }\n\n // A legacy client can replace a stale file lock with a live file lock at the\n // same path between inspection and unlink. Without owner-scoped storage,\n // cleanup cannot prove that it is removing the same owner, so fail closed\n // throughout the mixed-version rollout.\n if (firstSnapshot.storageKind === \"legacy_file\") {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (!isSameRecoverableLockSnapshot(firstSnapshot, confirmedSnapshot)) {\n return false;\n }\n\n if (confirmedSnapshot.storageKind === \"directory\") {\n return await cleanupStaleDirectoryLock(path, confirmedSnapshot);\n }\n\n return false;\n}\n\nfunction isSameRecoverableLockSnapshot(\n firstSnapshot: LockSnapshot,\n confirmedSnapshot: LockSnapshot\n): boolean {\n return (\n confirmedSnapshot.exists &&\n confirmedSnapshot.fileIdentity === firstSnapshot.fileIdentity &&\n confirmedSnapshot.ownerEntryName === firstSnapshot.ownerEntryName &&\n confirmedSnapshot.metaRaw === firstSnapshot.metaRaw &&\n confirmedSnapshot.pid === firstSnapshot.pid &&\n confirmedSnapshot.storageKind === firstSnapshot.storageKind &&\n isRecoverableStaleLock(confirmedSnapshot)\n );\n}\n\nfunction resolveLockContentionState(\n snapshot: LockSnapshot\n): OpenMeldLockContentionState {\n if (\n snapshot.storageKind === \"legacy_file\" &&\n isRecoverableStaleLock(snapshot)\n ) {\n return \"orphaned\";\n }\n if (\n snapshot.storageKind !== null &&\n (snapshot.pid === null || !snapshot.hasStaleOwner)\n ) {\n return \"active\";\n }\n return \"unknown\";\n}\n\nasync function cleanupStaleDirectoryLock(\n path: string,\n snapshot: LockSnapshot\n): Promise<boolean> {\n for (const entry of snapshot.ownerEntryNames ??\n (snapshot.ownerEntryName ? [snapshot.ownerEntryName] : [])) {\n try {\n await unlink(join(path, entry));\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n try {\n await rmdir(path);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return true;\n }\n if (getErrorCode(error) === \"ENOTEMPTY\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function tryPublishLock(\n path: string,\n ownerId: string,\n contents: string\n): Promise<boolean> {\n try {\n await mkdir(path);\n } catch (error) {\n if (getErrorCode(error) === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n\n const ownerEntryPath = resolveOwnerEntryPath(path, ownerId);\n try {\n await writeFile(ownerEntryPath, contents, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n return true;\n } catch (error) {\n await unlink(ownerEntryPath).catch((cleanupError) => {\n if (getErrorCode(cleanupError) !== \"ENOENT\") {\n console.warn(\"[openmeld.lock.owner_entry_cleanup_warning]\", {\n ownerEntryPath,\n cleanupError: toErrorMessage(cleanupError),\n });\n }\n });\n await rmdir(path).catch((cleanupError) => {\n if (getErrorCode(cleanupError) !== \"ENOENT\") {\n console.warn(\"[openmeld.lock.directory_cleanup_warning]\", {\n lockPath: path,\n cleanupError: toErrorMessage(cleanupError),\n });\n }\n });\n throw error;\n }\n}\n\nasync function unlinkOwnedDirectoryEntry(lock: OpenMeldLock): Promise<boolean> {\n try {\n await unlink(resolveOwnerEntryPath(lock.path, lock.ownerId));\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\" || getErrorCode(error) === \"ENOTDIR\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction resolveOwnerEntryPath(path: string, ownerId: string): string {\n return join(path, `${encodeURIComponent(ownerId)}.owner.json`);\n}\n\nfunction isRecoverableStaleLock(snapshot: LockSnapshot): boolean {\n if (!snapshot.exists) {\n return false;\n }\n if (snapshot.pid !== null) {\n return snapshot.hasStaleOwner;\n }\n return (\n snapshot.modifiedAtMs !== null &&\n Date.now() - snapshot.modifiedAtMs >= MALFORMED_LOCK_RECOVERY_GRACE_MS\n );\n}\n\nfunction isLockOwnerStale(input: {\n meta: OpenMeldLockMeta | null;\n pid: number | null;\n}): boolean {\n if (input.pid === null) {\n return false;\n }\n const ownerProcessStartedAt = getProcessStartIdentityFromMeta(input.meta);\n if (!ownerProcessStartedAt) {\n // Locks from older clients do not carry process-start identity. Keep them\n // while their PID is live, but preserve the existing dead-PID recovery.\n return !isPidAlive(input.pid);\n }\n return !isProcessIdentityAlive({\n ownerPid: input.pid,\n ownerProcessStartedAt,\n });\n}\n\nfunction getProcessStartIdentityFromMeta(meta: unknown): string | null {\n if (!(meta && typeof meta === \"object\")) {\n return null;\n }\n const value = (meta as Record<string, unknown>).ownerProcessStartedAt;\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n if (getErrorCode(err) === \"ESRCH\") {\n return false;\n }\n return true;\n }\n}\n\nfunction getErrorCode(err: unknown): string | undefined {\n if (!err || typeof err !== \"object\") {\n return undefined;\n }\n const code = (err as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nfunction throwRecognizedLocalMachineFailure(input: {\n operation: \"create_lock\";\n error: unknown;\n}): never {\n const recognizedFailure = toRecognizedLocalMachineFailureError(input);\n throw recognizedFailure ?? input.error;\n}\n\nfunction warnLockReleaseFailure(input: {\n error: unknown;\n lock: OpenMeldLock;\n releaseContext?: HeldLockReleaseContext;\n}): void {\n console.warn(\"[openmeld.lock.release.warning]\", {\n lockPath: input.lock.path,\n releaseError: toErrorMessage(input.error),\n releaseContext: input.releaseContext ?? {},\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { a as resolveBaseUrl, z as toSpaceMetaUrl } from "./base-url-
|
|
4
|
-
import {
|
|
5
|
-
import { Jn as toStructuredApiClientFailure, bn as createSpaceApi, fr as OPENMELD_HEADER_REQUEST_ID, mn as createProjectsApi, t as OpenMeldApiClientHttpError } from "./dist-
|
|
6
|
-
import { n as fetchSpaceRequestWithTimeout, s as buildOpenMeldRequestContextHeadersWithAuth, t as createCliApiClientFoundation } from "./api-client-foundation-
|
|
7
|
-
import { C as createSpaceSendInputConflictGuideError, E as createSpaceSendInputRequiredGuideError, T as createSpaceSendInputFileReadFailedGuideError, w as createSpaceSendInputEmptyGuideError } from "./dual-view-guide-catalog-
|
|
8
|
-
import { G as buildCanonicalRepositoryUrl } from "./dispatch-owned-runtime-
|
|
3
|
+
import { a as resolveBaseUrl, z as toSpaceMetaUrl } from "./base-url-BUHbVXb3.js";
|
|
4
|
+
import { HI as SPACE_FILE_MAX_SIZE_BYTES, ME as buildTargetWakeLifecycleId, PD as executionContextSelectionSchema, QI as resolveSpaceFileMimeType, _L as spaceFileNameSchema, q_ as spaceMetaSchema, si as gatewayErrorEnvelopeSchema } from "./dist-BvGnlYhy.js";
|
|
5
|
+
import { Jn as toStructuredApiClientFailure, bn as createSpaceApi, fr as OPENMELD_HEADER_REQUEST_ID, mn as createProjectsApi, t as OpenMeldApiClientHttpError } from "./dist-DuAsT5Uv.js";
|
|
6
|
+
import { n as fetchSpaceRequestWithTimeout, s as buildOpenMeldRequestContextHeadersWithAuth, t as createCliApiClientFoundation } from "./api-client-foundation-CPF0nXbH.js";
|
|
7
|
+
import { C as createSpaceSendInputConflictGuideError, E as createSpaceSendInputRequiredGuideError, T as createSpaceSendInputFileReadFailedGuideError, w as createSpaceSendInputEmptyGuideError } from "./dual-view-guide-catalog-BusbQrrw.js";
|
|
8
|
+
import { G as buildCanonicalRepositoryUrl } from "./dispatch-owned-runtime-D6IjJhPE.js";
|
|
9
9
|
import { basename } from "node:path";
|
|
10
10
|
import { access, readFile } from "node:fs/promises";
|
|
11
11
|
import { openAsBlob } from "node:fs";
|
|
@@ -509,4 +509,4 @@ async function updateSpaceMeta(input) {
|
|
|
509
509
|
//#endregion
|
|
510
510
|
export { GatewayHttpError as a, toStructuredGatewayFailure as c, resolveSpaceSendText as d, resolveSpaceTaskSelection as f, createCliSpaceApi as h, parseSpaceMetaResponse as i, parseJsonResponse as l, uploadPreparedSpaceFiles as m, updateSpaceMeta as n, readGatewayJsonResponse as o, prepareRequestedSpaceSendFiles as p, parseSpaceMetaPayload as r, readGatewayTextResponse as s, fetchSpaceMeta as t, resolveCliProjectWork as u };
|
|
511
511
|
|
|
512
|
-
//# sourceMappingURL=meta-api-
|
|
512
|
+
//# sourceMappingURL=meta-api-lWJ7qaka.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-api-CtUa-Oap.js","names":["record"],"sources":["../src/space/cli-space-api.ts","../src/space/send-files.ts","../src/space/send-input.ts","../src/space/api-json.ts","../src/space/gateway-response.ts","../src/space/space-meta-response.ts","../src/space/meta-api.ts"],"sourcesContent":["import { createSpaceApi, type SpaceApi } from \"@openmeld/api-client\";\nimport { createCliApiClientFoundation } from \"./api-client-foundation\";\n\nexport type {\n SpaceApi,\n SpaceSignalsReadQuery,\n} from \"@openmeld/api-client\";\n\nexport function createCliSpaceApi(\n baseUrl: string,\n options: Parameters<typeof createCliApiClientFoundation>[1] = {}\n): SpaceApi {\n return createSpaceApi(createCliApiClientFoundation(baseUrl, options));\n}\n","import { openAsBlob } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport {\n type StructuredApiClientFailure,\n toStructuredApiClientFailure,\n} from \"@openmeld/api-client\";\nimport {\n resolveSpaceFileMimeType,\n SPACE_FILE_MAX_SIZE_BYTES,\n SPACE_MESSAGE_FILE_MAX_COUNT,\n spaceFileNameSchema,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldRequestContext,\n SpaceMessageFileReference,\n} from \"@openmeld/schemas/types\";\nimport type { SpaceApi } from \"./cli-space-api\";\n\ntype PreparedSpaceFile = {\n bytes: Blob;\n name: string;\n mimeType: string;\n};\n\ntype SpaceFileCleanupFailure = {\n failure: StructuredApiClientFailure;\n fileId: string;\n};\n\nexport class SpaceSendFileError extends Error {\n readonly code: string;\n readonly requestId?: string;\n readonly status?: number;\n readonly upstreamCode?: string;\n\n constructor(input: {\n code: string;\n message: string;\n cause?: unknown;\n requestId?: string | null;\n status?: number | null;\n upstreamCode?: string | null;\n }) {\n super(input.message, { cause: input.cause });\n this.name = \"SpaceSendFileError\";\n this.code = input.code;\n if (input.requestId) {\n this.requestId = input.requestId;\n }\n if (input.status !== null && input.status !== undefined) {\n this.status = input.status;\n }\n if (input.upstreamCode) {\n this.upstreamCode = input.upstreamCode;\n }\n }\n}\n\nexport async function prepareRequestedSpaceSendFiles(input: {\n filePaths: readonly string[];\n}): Promise<readonly PreparedSpaceFile[]> {\n if (input.filePaths.length > SPACE_MESSAGE_FILE_MAX_COUNT) {\n throw new SpaceSendFileError({\n code: \"space.file.too_many\",\n message: `A Space message can include at most ${SPACE_MESSAGE_FILE_MAX_COUNT} files. The message was not sent.`,\n });\n }\n\n const prepared: PreparedSpaceFile[] = [];\n for (const rawPath of input.filePaths) {\n if (!rawPath.trim()) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_path\",\n message: \"File paths cannot be empty. The message was not sent.\",\n });\n }\n prepared.push(await prepareSpaceSendFile(rawPath));\n }\n return prepared;\n}\n\nexport async function uploadPreparedSpaceFiles(input: {\n files: readonly PreparedSpaceFile[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceMessageFileReference[]> {\n const uploaded: SpaceMessageFileReference[] = [];\n for (const file of input.files) {\n try {\n const descriptor = await input.spaceApi.uploadFile({\n bytes: file.bytes,\n clientMutationId: crypto.randomUUID(),\n mimeType: file.mimeType,\n name: file.name,\n origin: \"chat_upload\",\n parentId: null,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n uploaded.push({\n fileId: descriptor.id,\n revision: descriptor.latestRevision.revision,\n name: descriptor.name,\n mimeType: descriptor.latestRevision.mimeType,\n sizeBytes: descriptor.latestRevision.sizeBytes,\n });\n } catch (error) {\n const failure = toStructuredApiClientFailure(error);\n const cleanupFailures = await moveUploadedFilesToTrash({\n files: uploaded,\n password: input.password,\n requestContext: input.requestContext,\n spaceApi: input.spaceApi,\n spaceId: input.spaceId,\n });\n let cleanupMessage = \"\";\n if (uploaded.length > 0) {\n cleanupMessage =\n cleanupFailures.length === 0\n ? \" Files added earlier in this send were moved to Trash.\"\n : ` ${formatCleanupFailures({\n failures: cleanupFailures,\n passwordProtected: input.password !== undefined,\n profileId: input.requestContext.actorContext.openMeldProfileId,\n spaceId: input.spaceId,\n })}`;\n }\n throw new SpaceSendFileError({\n code: failure.code ?? \"space.file.upload_failed\",\n message: `Could not add file \"${file.name}\" to this Space. The message was not sent. ${failure.message}${cleanupMessage}`,\n cause: error,\n requestId: failure.requestId,\n status: failure.status,\n upstreamCode: failure.upstreamCode,\n });\n }\n }\n return uploaded;\n}\n\nasync function moveUploadedFilesToTrash(input: {\n files: readonly SpaceMessageFileReference[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceFileCleanupFailure[]> {\n const failures: SpaceFileCleanupFailure[] = [];\n for (const file of input.files) {\n try {\n await input.spaceApi.trashFileEntry({\n clientMutationId: crypto.randomUUID(),\n entryId: file.fileId,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n } catch (error) {\n failures.push({\n failure: toStructuredApiClientFailure(error),\n fileId: file.fileId,\n });\n }\n }\n return failures;\n}\n\nfunction formatCleanupFailures(input: {\n failures: readonly SpaceFileCleanupFailure[];\n passwordProtected: boolean;\n profileId: string;\n spaceId: string;\n}): string {\n const failureMessages = input.failures\n .map(({ failure, fileId }) => {\n const evidence = [\n failure.code ? `code ${failure.code}` : null,\n failure.requestId ? `request ${failure.requestId}` : null,\n ]\n .filter((value): value is string => value !== null)\n .join(\", \");\n const evidenceText = evidence ? ` (${evidence})` : \"\";\n return `Could not move file ${fileId} to Trash${evidenceText}: ${failure.message} Run \\`openmeld space files trash ${input.spaceId} ${fileId} --profile ${input.profileId}\\` to finish cleanup.`;\n })\n .join(\" \");\n const passwordGuidance = input.passwordProtected\n ? \" This Space is password protected. Add `--password` with the same Space password you used for this send; OpenMeld does not include the password in this message.\"\n : \"\";\n return `${failureMessages}${passwordGuidance}`;\n}\n\nasync function prepareSpaceSendFile(\n sourcePath: string\n): Promise<PreparedSpaceFile> {\n let bytes: Blob;\n try {\n // openAsBlob collapses missing paths into ERR_INVALID_ARG_VALUE on Node 24.\n // Preserve the filesystem error code for the user-facing failure category.\n await access(sourcePath);\n bytes = await openAsBlob(sourcePath);\n } catch (error) {\n const code = readNodeErrorCode(error);\n if (code === \"ENOENT\") {\n throw new SpaceSendFileError({\n code: \"space.file.file_not_found\",\n message: `File not found: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n throw new SpaceSendFileError({\n code: \"space.file.file_unreadable\",\n message: `Could not read file: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n\n if (bytes.size > SPACE_FILE_MAX_SIZE_BYTES) {\n throw new SpaceSendFileError({\n code: \"space.file.too_large\",\n message: `File exceeds the ${formatFileSizeLimit()} limit: ${sourcePath}. The message was not sent.`,\n });\n }\n\n const parsedName = spaceFileNameSchema.safeParse(basename(sourcePath));\n if (!parsedName.success) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_file_name\",\n message: `File name is invalid: ${sourcePath}. The message was not sent.`,\n });\n }\n\n return {\n bytes,\n name: parsedName.data,\n mimeType: resolveSpaceFileMimeType({ fileName: parsedName.data }),\n };\n}\n\nfunction readNodeErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n return typeof error.code === \"string\" ? error.code : null;\n}\n\nfunction formatFileSizeLimit(): string {\n return `${SPACE_FILE_MAX_SIZE_BYTES / (1024 * 1024)} MiB`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createProjectsApi } from \"@openmeld/api-client\";\nimport { buildCanonicalRepositoryUrl } from \"@openmeld/projects\";\nimport {\n buildTargetWakeLifecycleId,\n executionContextSelectionSchema,\n} from \"@openmeld/schemas\";\nimport type {\n ExecutionContextAssignment,\n ExecutionContextSelection,\n Project,\n ProjectRepositorySettings,\n} from \"@openmeld/schemas/types\";\nimport { resolveBaseUrl } from \"../config/base-url\";\nimport {\n createSpaceSendInputConflictGuideError,\n createSpaceSendInputEmptyGuideError,\n createSpaceSendInputFileReadFailedGuideError,\n createSpaceSendInputRequiredGuideError,\n} from \"../runtime/dual-view-guide-catalog\";\nimport { createCliApiClientFoundation } from \"./api-client-foundation\";\n\ntype SelectedProjectWork = NonNullable<\n ExecutionContextAssignment[\"projectWork\"]\n>;\n\ntype SpaceTaskSelectionInput = {\n space: string;\n wakeTargets?: readonly string[];\n newTask?: boolean;\n forkFrom?: string;\n continueFrom?: string;\n taskAccess?: string;\n taskWorkspace?: string;\n projectWork?: SelectedProjectWork;\n};\n\ntype ResolveSpaceSendTextInput = {\n allowEmpty?: boolean;\n text?: string;\n stdin?: boolean;\n file?: string;\n readFromStdin?: () => Promise<string>;\n readFromFile?: (path: string) => Promise<string>;\n};\n\nexport function resolveSpaceTaskSelection(\n input: SpaceTaskSelectionInput\n): ExecutionContextSelection | undefined {\n const modes =\n Number(input.newTask === true) +\n Number(Boolean(input.forkFrom)) +\n Number(Boolean(input.continueFrom));\n if (\n modes === 0 &&\n !input.taskAccess &&\n !input.taskWorkspace &&\n !input.projectWork\n ) {\n return undefined;\n }\n if (modes > 1) {\n throw new Error(\n \"Choose only one of --new-task, --fork-from, or --continue-from.\"\n );\n }\n const targetProfileId = input.wakeTargets?.[0];\n if (!targetProfileId || input.wakeTargets?.length !== 1) {\n throw new Error(\"Task selection requires exactly one --wake <profile-id>.\");\n }\n const sourceSignalId = input.forkFrom ?? input.continueFrom;\n const sourceWakeId = sourceSignalId\n ? buildTargetWakeLifecycleId({\n spaceId: input.space,\n sourceSignalId,\n targetProfileId,\n })\n : undefined;\n const preferences = resolveTaskPreferences(input);\n let value: unknown;\n if (input.continueFrom) {\n value = { mode: \"resume\", sourceWakeId };\n } else if (input.forkFrom) {\n value = { mode: \"fork\", sourceWakeId, ...preferences };\n } else {\n value = { mode: input.newTask ? \"new\" : \"auto\", ...preferences };\n }\n const parsed = executionContextSelectionSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(\n parsed.error.issues[0]?.message ?? \"Invalid task selection.\"\n );\n }\n return parsed.data;\n}\n\nfunction resolveTaskPreferences(input: SpaceTaskSelectionInput) {\n if (input.continueFrom && (input.taskAccess || input.taskWorkspace)) {\n throw new Error(\n \"A continued task keeps its original file access and workspace. Start a new task to change them.\"\n );\n }\n if (input.projectWork && !input.newTask) {\n throw new Error(\n \"Choose --new-task when selecting a Project repository. A fork keeps its source workspace.\"\n );\n }\n if (input.projectWork && input.taskAccess === \"space_context\") {\n throw new Error(\n \"Project repository work requires read_only or workspace file access.\"\n );\n }\n return {\n access: input.taskAccess,\n workspace:\n input.taskWorkspace ?? (input.projectWork ? \"isolated\" : undefined),\n ...(input.projectWork ? { projectWork: input.projectWork } : {}),\n };\n}\n\nexport async function resolveCliProjectWork(input: {\n baseUrl?: string;\n projectSlug?: string;\n repositoryUrl?: string;\n}): Promise<SelectedProjectWork | undefined> {\n const projectSlug = input.projectSlug?.trim();\n if (!projectSlug) {\n if (input.repositoryUrl) {\n throw new Error(\"--repository requires --project.\");\n }\n return undefined;\n }\n const api = createProjectsApi(\n createCliApiClientFoundation(await resolveBaseUrl(input.baseUrl))\n );\n const listed = await api.list();\n const project = listed.projects.find(\n (candidate) => candidate.slug === projectSlug\n );\n if (!project || project.organizationId !== listed.organizationId) {\n throw new Error(\n `Project \"${projectSlug}\" is unavailable in the active Organization.`\n );\n }\n const response = await api.readRepositorySettings({ projectId: project.id });\n return selectCliProjectWork({\n project,\n repositoryUrl: input.repositoryUrl,\n settings: response.settings,\n });\n}\n\nexport function selectCliProjectWork(input: {\n project: Project;\n repositoryUrl?: string;\n settings: ProjectRepositorySettings;\n}): SelectedProjectWork {\n if (input.settings.projectId !== input.project.id) {\n throw new Error(\n \"Project repository settings changed. Refresh and try again.\"\n );\n }\n const requestedUrl = input.repositoryUrl\n ? buildCanonicalRepositoryUrl(input.repositoryUrl)\n : null;\n if (input.repositoryUrl && !requestedUrl) {\n throw new Error(\"--repository must be a valid Git repository URL.\");\n }\n const repositories = input.settings.repositories;\n const selected = requestedUrl\n ? repositories.find((candidate) => candidate.repositoryUrl === requestedUrl)\n : (repositories.find((candidate) => candidate.isDefault) ??\n (repositories.length === 1 ? repositories[0] : undefined));\n if (selected) {\n return {\n projectId: input.project.id,\n repositoryFingerprint: selected.repositoryFingerprint,\n };\n }\n if (requestedUrl) {\n throw new Error(\"That repository is not associated with this Project.\");\n }\n if (repositories.length === 0 && input.settings.legacyDefaultFingerprint) {\n return {\n projectId: input.project.id,\n repositoryFingerprint: input.settings.legacyDefaultFingerprint,\n };\n }\n throw new Error(\n repositories.length === 0\n ? \"This Project has no code repository. Configure one before starting code work.\"\n : \"This Project has several repositories. Choose one with --repository.\"\n );\n}\n\nexport async function resolveSpaceSendText(\n input: ResolveSpaceSendTextInput\n): Promise<string> {\n const textValue = String(input.text ?? \"\");\n const stdinEnabled = input.stdin === true;\n const filePath = String(input.file ?? \"\").trim();\n\n const hasTextSource = textValue.length > 0;\n const hasFileSource = filePath.length > 0;\n const sourceCount =\n Number(hasTextSource) + Number(stdinEnabled) + Number(hasFileSource);\n\n if (sourceCount === 0) {\n if (input.allowEmpty) {\n return \"\";\n }\n throw createSpaceSendInputRequiredGuideError();\n }\n if (sourceCount > 1) {\n throw createSpaceSendInputConflictGuideError();\n }\n\n let resolvedText = textValue;\n if (hasFileSource) {\n const readFromFile = input.readFromFile ?? readSpaceSendFile;\n try {\n resolvedText = await readFromFile(filePath);\n } catch (error) {\n throw createSpaceSendInputFileReadFailedGuideError(\n filePath,\n toErrorMessage(error)\n );\n }\n }\n if (stdinEnabled) {\n const readFromStdin = input.readFromStdin ?? readSpaceSendStdin;\n resolvedText = await readFromStdin();\n }\n\n if (resolvedText.trim().length === 0 && !input.allowEmpty) {\n throw createSpaceSendInputEmptyGuideError();\n }\n\n return resolvedText;\n}\n\nfunction readSpaceSendFile(path: string): Promise<string> {\n return readFile(path, \"utf8\");\n}\n\nfunction readSpaceSendStdin(): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const chunks: string[] = [];\n\n const cleanup = () => {\n process.stdin.off(\"data\", onData);\n process.stdin.off(\"end\", onEnd);\n process.stdin.off(\"error\", onError);\n };\n\n const onData = (chunk: string | Buffer) => {\n if (typeof chunk === \"string\") {\n chunks.push(chunk);\n return;\n }\n chunks.push(chunk.toString(\"utf8\"));\n };\n\n const onEnd = () => {\n cleanup();\n resolve(chunks.join(\"\"));\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", onData);\n process.stdin.on(\"end\", onEnd);\n process.stdin.on(\"error\", onError);\n process.stdin.resume();\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return String(error ?? \"unknown error\");\n}\n","export function parseJsonResponse(raw: string): unknown {\n if (!raw.trim()) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import { OpenMeldApiClientHttpError } from \"@openmeld/api-client\";\nimport { OPENMELD_HEADER_REQUEST_ID } from \"@openmeld/gateway-contract\";\nimport { gatewayErrorEnvelopeSchema } from \"@openmeld/schemas\";\nimport type { GatewayErrorCode } from \"@openmeld/schemas/types\";\nimport { parseJsonResponse } from \"./api-json\";\n\nconst FALLBACK_GATEWAY_HTTP_ERROR_CODE = \"gateway.http_error\" as const;\nconst GENERIC_NETWORK_ERROR_CODES = [\n \"network.timeout\",\n \"network.request_failed\",\n] as const;\n\ntype SafeParseResult<T> = { success: true; data: T } | { success: false };\n\ntype GatewayResponseSchema<T> = {\n safeParse: (value: unknown) => SafeParseResult<T>;\n};\n\nexport type GatewayResponseErrorCode =\n | GatewayErrorCode\n | typeof FALLBACK_GATEWAY_HTTP_ERROR_CODE\n | (typeof GENERIC_NETWORK_ERROR_CODES)[number]\n | string;\n\nexport type StructuredGatewayFailure = {\n code: GatewayResponseErrorCode | null;\n message: string;\n requestId: string | null;\n status: number | null;\n upstreamCode: string | null;\n};\n\nexport class GatewayHttpError extends Error {\n readonly code: GatewayResponseErrorCode;\n readonly requestId: string | null;\n readonly status: number;\n readonly rawBody: string;\n readonly upstreamCode: string | null;\n\n constructor(input: {\n code: GatewayResponseErrorCode;\n message: string;\n requestId?: string | null;\n status: number;\n rawBody: string;\n upstreamCode?: string | null;\n }) {\n super(input.message);\n this.name = \"GatewayHttpError\";\n this.code = input.code;\n this.requestId = normalizeOptionalText(input.requestId);\n this.status = input.status;\n this.rawBody = input.rawBody;\n this.upstreamCode = normalizeOptionalText(input.upstreamCode);\n }\n}\n\nexport async function readGatewayJsonResponse<T>(input: {\n response: Response;\n schema: GatewayResponseSchema<T>;\n invalidMessage: string;\n}): Promise<T> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n\n const parsed = input.schema.safeParse(parseJsonResponse(raw));\n if (!parsed.success) {\n throw new Error(input.invalidMessage);\n }\n return parsed.data;\n}\n\nexport async function readGatewayTextResponse(input: {\n response: Response;\n}): Promise<string> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n return raw;\n}\n\nexport function assertGatewayResponseOk(input: {\n response: Response;\n raw: string;\n}): void {\n if (input.response.ok) {\n return;\n }\n throw parseGatewayErrorResponse(input);\n}\n\nexport function parseGatewayErrorResponse(input: {\n response: Pick<Response, \"headers\" | \"status\">;\n raw: string;\n}): GatewayHttpError {\n const payload = parseJsonResponse(input.raw);\n const parsed = gatewayErrorEnvelopeSchema.safeParse(payload);\n const headerRequestId = normalizeOptionalText(\n input.response.headers.get(OPENMELD_HEADER_REQUEST_ID)\n );\n\n if (parsed.success) {\n return new GatewayHttpError({\n code: parsed.data.error.code,\n message: parsed.data.error.message,\n requestId: parsed.data.error.requestId || headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: parsed.data.error.upstreamCode ?? null,\n });\n }\n\n const looseEnvelope = readLooseGatewayErrorEnvelope(payload);\n if (looseEnvelope) {\n return new GatewayHttpError({\n code: looseEnvelope.code ?? FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n looseEnvelope.message ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: looseEnvelope.requestId ?? headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: looseEnvelope.upstreamCode,\n });\n }\n\n return new GatewayHttpError({\n code: FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n normalizeOptionalText(input.raw) ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: null,\n });\n}\n\nexport function toStructuredGatewayFailure(\n error: unknown\n): StructuredGatewayFailure {\n if (error instanceof OpenMeldApiClientHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n if (error instanceof GatewayHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n const genericErrorCode = readGenericErrorCode(error);\n if (genericErrorCode) {\n return {\n code: genericErrorCode,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n }\n\n return {\n code: null,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFailureMessage(value: unknown): string {\n return normalizeOptionalText(value) ?? \"Unknown error.\";\n}\n\nfunction readGenericErrorCode(value: unknown): GatewayResponseErrorCode | null {\n if (!value || typeof value !== \"object\" || !(\"code\" in value)) {\n return null;\n }\n\n const normalized = normalizeOptionalText(\n (value as { code?: unknown }).code ?? null\n );\n return normalized as GatewayResponseErrorCode | null;\n}\n\nfunction readLooseGatewayErrorEnvelope(value: unknown): {\n code: string | null;\n message: string | null;\n requestId: string | null;\n upstreamCode: string | null;\n} | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const record = value as {\n error?: {\n code?: unknown;\n message?: unknown;\n requestId?: unknown;\n upstreamCode?: unknown;\n } | null;\n };\n const error = record.error;\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = normalizeOptionalText(error.code);\n const message = normalizeOptionalText(error.message);\n const requestId = normalizeOptionalText(error.requestId);\n const upstreamCode = normalizeOptionalText(error.upstreamCode);\n if (!(code || message || requestId || upstreamCode)) {\n return null;\n }\n\n return {\n code,\n message,\n requestId,\n upstreamCode,\n };\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport { spaceMetaSchema } from \"@openmeld/schemas\";\n\ntype SpaceMetaParseOperation =\n | \"createSpaceMeta\"\n | \"fetchSpaceMeta\"\n | \"updateSpaceMeta\";\n\nexport function parseSpaceMetaPayload(input: {\n data: unknown;\n endpoint: string;\n operation: SpaceMetaParseOperation;\n}): SpaceMeta {\n try {\n const validation = spaceMetaSchema.safeParse(input.data);\n if (!validation.success) {\n const reason =\n validation.error.issues[0]?.message ??\n \"space meta payload does not match schema\";\n throw new Error(reason);\n }\n return validation.data;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${JSON.stringify(input.data)}`\n );\n }\n}\n\nexport function parseSpaceMetaResponse(input: {\n raw: string;\n endpoint: string;\n operation: Extract<\n SpaceMetaParseOperation,\n \"fetchSpaceMeta\" | \"updateSpaceMeta\"\n >;\n}): SpaceMeta {\n try {\n return parseSpaceMetaPayload({\n data: JSON.parse(input.raw) as unknown,\n endpoint: input.endpoint,\n operation: input.operation,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${input.raw}`\n );\n }\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport { buildOpenMeldRequestContextHeadersWithAuth } from \"../config/request-headers\";\nimport { toSpaceMetaUrl } from \"../protocol/urls\";\nimport { fetchSpaceRequestWithTimeout } from \"./fetch-with-timeout\";\nimport { readGatewayTextResponse } from \"./gateway-response\";\nimport { parseSpaceMetaResponse } from \"./space-meta-response\";\n\ntype SpaceMetaApiInput = {\n requestContext: OpenMeldRequestContext;\n baseUrl: string;\n space: string;\n password?: string;\n};\n\nexport async function fetchSpaceMeta(\n input: SpaceMetaApiInput\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.fetch_meta\",\n init: {\n method: \"GET\",\n headers: await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"fetchSpaceMeta\",\n });\n}\n\nexport async function updateSpaceMeta(\n input: SpaceMetaApiInput & {\n purpose?: string;\n guide?: string;\n }\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const headers = await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n });\n headers[\"content-type\"] = \"application/json\";\n\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.update_meta\",\n init: {\n method: \"PATCH\",\n headers,\n body: JSON.stringify({\n ...(input.purpose === undefined ? {} : { purpose: input.purpose }),\n ...(input.guide === undefined ? {} : { guide: input.guide }),\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"updateSpaceMeta\",\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meta-api-lWJ7qaka.js","names":["record"],"sources":["../src/space/cli-space-api.ts","../src/space/send-files.ts","../src/space/send-input.ts","../src/space/api-json.ts","../src/space/gateway-response.ts","../src/space/space-meta-response.ts","../src/space/meta-api.ts"],"sourcesContent":["import { createSpaceApi, type SpaceApi } from \"@openmeld/api-client\";\nimport { createCliApiClientFoundation } from \"./api-client-foundation\";\n\nexport type {\n SpaceApi,\n SpaceSignalsReadQuery,\n} from \"@openmeld/api-client\";\n\nexport function createCliSpaceApi(\n baseUrl: string,\n options: Parameters<typeof createCliApiClientFoundation>[1] = {}\n): SpaceApi {\n return createSpaceApi(createCliApiClientFoundation(baseUrl, options));\n}\n","import { openAsBlob } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport {\n type StructuredApiClientFailure,\n toStructuredApiClientFailure,\n} from \"@openmeld/api-client\";\nimport {\n resolveSpaceFileMimeType,\n SPACE_FILE_MAX_SIZE_BYTES,\n SPACE_MESSAGE_FILE_MAX_COUNT,\n spaceFileNameSchema,\n} from \"@openmeld/schemas\";\nimport type {\n OpenMeldRequestContext,\n SpaceMessageFileReference,\n} from \"@openmeld/schemas/types\";\nimport type { SpaceApi } from \"./cli-space-api\";\n\ntype PreparedSpaceFile = {\n bytes: Blob;\n name: string;\n mimeType: string;\n};\n\ntype SpaceFileCleanupFailure = {\n failure: StructuredApiClientFailure;\n fileId: string;\n};\n\nexport class SpaceSendFileError extends Error {\n readonly code: string;\n readonly requestId?: string;\n readonly status?: number;\n readonly upstreamCode?: string;\n\n constructor(input: {\n code: string;\n message: string;\n cause?: unknown;\n requestId?: string | null;\n status?: number | null;\n upstreamCode?: string | null;\n }) {\n super(input.message, { cause: input.cause });\n this.name = \"SpaceSendFileError\";\n this.code = input.code;\n if (input.requestId) {\n this.requestId = input.requestId;\n }\n if (input.status !== null && input.status !== undefined) {\n this.status = input.status;\n }\n if (input.upstreamCode) {\n this.upstreamCode = input.upstreamCode;\n }\n }\n}\n\nexport async function prepareRequestedSpaceSendFiles(input: {\n filePaths: readonly string[];\n}): Promise<readonly PreparedSpaceFile[]> {\n if (input.filePaths.length > SPACE_MESSAGE_FILE_MAX_COUNT) {\n throw new SpaceSendFileError({\n code: \"space.file.too_many\",\n message: `A Space message can include at most ${SPACE_MESSAGE_FILE_MAX_COUNT} files. The message was not sent.`,\n });\n }\n\n const prepared: PreparedSpaceFile[] = [];\n for (const rawPath of input.filePaths) {\n if (!rawPath.trim()) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_path\",\n message: \"File paths cannot be empty. The message was not sent.\",\n });\n }\n prepared.push(await prepareSpaceSendFile(rawPath));\n }\n return prepared;\n}\n\nexport async function uploadPreparedSpaceFiles(input: {\n files: readonly PreparedSpaceFile[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceMessageFileReference[]> {\n const uploaded: SpaceMessageFileReference[] = [];\n for (const file of input.files) {\n try {\n const descriptor = await input.spaceApi.uploadFile({\n bytes: file.bytes,\n clientMutationId: crypto.randomUUID(),\n mimeType: file.mimeType,\n name: file.name,\n origin: \"chat_upload\",\n parentId: null,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n uploaded.push({\n fileId: descriptor.id,\n revision: descriptor.latestRevision.revision,\n name: descriptor.name,\n mimeType: descriptor.latestRevision.mimeType,\n sizeBytes: descriptor.latestRevision.sizeBytes,\n });\n } catch (error) {\n const failure = toStructuredApiClientFailure(error);\n const cleanupFailures = await moveUploadedFilesToTrash({\n files: uploaded,\n password: input.password,\n requestContext: input.requestContext,\n spaceApi: input.spaceApi,\n spaceId: input.spaceId,\n });\n let cleanupMessage = \"\";\n if (uploaded.length > 0) {\n cleanupMessage =\n cleanupFailures.length === 0\n ? \" Files added earlier in this send were moved to Trash.\"\n : ` ${formatCleanupFailures({\n failures: cleanupFailures,\n passwordProtected: input.password !== undefined,\n profileId: input.requestContext.actorContext.openMeldProfileId,\n spaceId: input.spaceId,\n })}`;\n }\n throw new SpaceSendFileError({\n code: failure.code ?? \"space.file.upload_failed\",\n message: `Could not add file \"${file.name}\" to this Space. The message was not sent. ${failure.message}${cleanupMessage}`,\n cause: error,\n requestId: failure.requestId,\n status: failure.status,\n upstreamCode: failure.upstreamCode,\n });\n }\n }\n return uploaded;\n}\n\nasync function moveUploadedFilesToTrash(input: {\n files: readonly SpaceMessageFileReference[];\n password?: string;\n requestContext: OpenMeldRequestContext;\n spaceApi: SpaceApi;\n spaceId: string;\n}): Promise<readonly SpaceFileCleanupFailure[]> {\n const failures: SpaceFileCleanupFailure[] = [];\n for (const file of input.files) {\n try {\n await input.spaceApi.trashFileEntry({\n clientMutationId: crypto.randomUUID(),\n entryId: file.fileId,\n requestContext: input.requestContext,\n spaceId: input.spaceId,\n ...(input.password === undefined\n ? {}\n : { spacePassword: input.password }),\n });\n } catch (error) {\n failures.push({\n failure: toStructuredApiClientFailure(error),\n fileId: file.fileId,\n });\n }\n }\n return failures;\n}\n\nfunction formatCleanupFailures(input: {\n failures: readonly SpaceFileCleanupFailure[];\n passwordProtected: boolean;\n profileId: string;\n spaceId: string;\n}): string {\n const failureMessages = input.failures\n .map(({ failure, fileId }) => {\n const evidence = [\n failure.code ? `code ${failure.code}` : null,\n failure.requestId ? `request ${failure.requestId}` : null,\n ]\n .filter((value): value is string => value !== null)\n .join(\", \");\n const evidenceText = evidence ? ` (${evidence})` : \"\";\n return `Could not move file ${fileId} to Trash${evidenceText}: ${failure.message} Run \\`openmeld space files trash ${input.spaceId} ${fileId} --profile ${input.profileId}\\` to finish cleanup.`;\n })\n .join(\" \");\n const passwordGuidance = input.passwordProtected\n ? \" This Space is password protected. Add `--password` with the same Space password you used for this send; OpenMeld does not include the password in this message.\"\n : \"\";\n return `${failureMessages}${passwordGuidance}`;\n}\n\nasync function prepareSpaceSendFile(\n sourcePath: string\n): Promise<PreparedSpaceFile> {\n let bytes: Blob;\n try {\n // openAsBlob collapses missing paths into ERR_INVALID_ARG_VALUE on Node 24.\n // Preserve the filesystem error code for the user-facing failure category.\n await access(sourcePath);\n bytes = await openAsBlob(sourcePath);\n } catch (error) {\n const code = readNodeErrorCode(error);\n if (code === \"ENOENT\") {\n throw new SpaceSendFileError({\n code: \"space.file.file_not_found\",\n message: `File not found: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n throw new SpaceSendFileError({\n code: \"space.file.file_unreadable\",\n message: `Could not read file: ${sourcePath}. The message was not sent.`,\n cause: error,\n });\n }\n\n if (bytes.size > SPACE_FILE_MAX_SIZE_BYTES) {\n throw new SpaceSendFileError({\n code: \"space.file.too_large\",\n message: `File exceeds the ${formatFileSizeLimit()} limit: ${sourcePath}. The message was not sent.`,\n });\n }\n\n const parsedName = spaceFileNameSchema.safeParse(basename(sourcePath));\n if (!parsedName.success) {\n throw new SpaceSendFileError({\n code: \"space.file.invalid_file_name\",\n message: `File name is invalid: ${sourcePath}. The message was not sent.`,\n });\n }\n\n return {\n bytes,\n name: parsedName.data,\n mimeType: resolveSpaceFileMimeType({ fileName: parsedName.data }),\n };\n}\n\nfunction readNodeErrorCode(error: unknown): string | null {\n if (!(error && typeof error === \"object\" && \"code\" in error)) {\n return null;\n }\n return typeof error.code === \"string\" ? error.code : null;\n}\n\nfunction formatFileSizeLimit(): string {\n return `${SPACE_FILE_MAX_SIZE_BYTES / (1024 * 1024)} MiB`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createProjectsApi } from \"@openmeld/api-client\";\nimport { buildCanonicalRepositoryUrl } from \"@openmeld/projects\";\nimport {\n buildTargetWakeLifecycleId,\n executionContextSelectionSchema,\n} from \"@openmeld/schemas\";\nimport type {\n ExecutionContextAssignment,\n ExecutionContextSelection,\n Project,\n ProjectRepositorySettings,\n} from \"@openmeld/schemas/types\";\nimport { resolveBaseUrl } from \"../config/base-url\";\nimport {\n createSpaceSendInputConflictGuideError,\n createSpaceSendInputEmptyGuideError,\n createSpaceSendInputFileReadFailedGuideError,\n createSpaceSendInputRequiredGuideError,\n} from \"../runtime/dual-view-guide-catalog\";\nimport { createCliApiClientFoundation } from \"./api-client-foundation\";\n\ntype SelectedProjectWork = NonNullable<\n ExecutionContextAssignment[\"projectWork\"]\n>;\n\ntype SpaceTaskSelectionInput = {\n space: string;\n wakeTargets?: readonly string[];\n newTask?: boolean;\n forkFrom?: string;\n continueFrom?: string;\n taskAccess?: string;\n taskWorkspace?: string;\n projectWork?: SelectedProjectWork;\n};\n\ntype ResolveSpaceSendTextInput = {\n allowEmpty?: boolean;\n text?: string;\n stdin?: boolean;\n file?: string;\n readFromStdin?: () => Promise<string>;\n readFromFile?: (path: string) => Promise<string>;\n};\n\nexport function resolveSpaceTaskSelection(\n input: SpaceTaskSelectionInput\n): ExecutionContextSelection | undefined {\n const modes =\n Number(input.newTask === true) +\n Number(Boolean(input.forkFrom)) +\n Number(Boolean(input.continueFrom));\n if (\n modes === 0 &&\n !input.taskAccess &&\n !input.taskWorkspace &&\n !input.projectWork\n ) {\n return undefined;\n }\n if (modes > 1) {\n throw new Error(\n \"Choose only one of --new-task, --fork-from, or --continue-from.\"\n );\n }\n const targetProfileId = input.wakeTargets?.[0];\n if (!targetProfileId || input.wakeTargets?.length !== 1) {\n throw new Error(\"Task selection requires exactly one --wake <profile-id>.\");\n }\n const sourceSignalId = input.forkFrom ?? input.continueFrom;\n const sourceWakeId = sourceSignalId\n ? buildTargetWakeLifecycleId({\n spaceId: input.space,\n sourceSignalId,\n targetProfileId,\n })\n : undefined;\n const preferences = resolveTaskPreferences(input);\n let value: unknown;\n if (input.continueFrom) {\n value = { mode: \"resume\", sourceWakeId };\n } else if (input.forkFrom) {\n value = { mode: \"fork\", sourceWakeId, ...preferences };\n } else {\n value = { mode: input.newTask ? \"new\" : \"auto\", ...preferences };\n }\n const parsed = executionContextSelectionSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(\n parsed.error.issues[0]?.message ?? \"Invalid task selection.\"\n );\n }\n return parsed.data;\n}\n\nfunction resolveTaskPreferences(input: SpaceTaskSelectionInput) {\n if (input.continueFrom && (input.taskAccess || input.taskWorkspace)) {\n throw new Error(\n \"A continued task keeps its original file access and workspace. Start a new task to change them.\"\n );\n }\n if (input.projectWork && !input.newTask) {\n throw new Error(\n \"Choose --new-task when selecting a Project repository. A fork keeps its source workspace.\"\n );\n }\n if (input.projectWork && input.taskAccess === \"space_context\") {\n throw new Error(\n \"Project repository work requires read_only or workspace file access.\"\n );\n }\n return {\n access: input.taskAccess,\n workspace:\n input.taskWorkspace ?? (input.projectWork ? \"isolated\" : undefined),\n ...(input.projectWork ? { projectWork: input.projectWork } : {}),\n };\n}\n\nexport async function resolveCliProjectWork(input: {\n baseUrl?: string;\n projectSlug?: string;\n repositoryUrl?: string;\n}): Promise<SelectedProjectWork | undefined> {\n const projectSlug = input.projectSlug?.trim();\n if (!projectSlug) {\n if (input.repositoryUrl) {\n throw new Error(\"--repository requires --project.\");\n }\n return undefined;\n }\n const api = createProjectsApi(\n createCliApiClientFoundation(await resolveBaseUrl(input.baseUrl))\n );\n const listed = await api.list();\n const project = listed.projects.find(\n (candidate) => candidate.slug === projectSlug\n );\n if (!project || project.organizationId !== listed.organizationId) {\n throw new Error(\n `Project \"${projectSlug}\" is unavailable in the active Organization.`\n );\n }\n const response = await api.readRepositorySettings({ projectId: project.id });\n return selectCliProjectWork({\n project,\n repositoryUrl: input.repositoryUrl,\n settings: response.settings,\n });\n}\n\nexport function selectCliProjectWork(input: {\n project: Project;\n repositoryUrl?: string;\n settings: ProjectRepositorySettings;\n}): SelectedProjectWork {\n if (input.settings.projectId !== input.project.id) {\n throw new Error(\n \"Project repository settings changed. Refresh and try again.\"\n );\n }\n const requestedUrl = input.repositoryUrl\n ? buildCanonicalRepositoryUrl(input.repositoryUrl)\n : null;\n if (input.repositoryUrl && !requestedUrl) {\n throw new Error(\"--repository must be a valid Git repository URL.\");\n }\n const repositories = input.settings.repositories;\n const selected = requestedUrl\n ? repositories.find((candidate) => candidate.repositoryUrl === requestedUrl)\n : (repositories.find((candidate) => candidate.isDefault) ??\n (repositories.length === 1 ? repositories[0] : undefined));\n if (selected) {\n return {\n projectId: input.project.id,\n repositoryFingerprint: selected.repositoryFingerprint,\n };\n }\n if (requestedUrl) {\n throw new Error(\"That repository is not associated with this Project.\");\n }\n if (repositories.length === 0 && input.settings.legacyDefaultFingerprint) {\n return {\n projectId: input.project.id,\n repositoryFingerprint: input.settings.legacyDefaultFingerprint,\n };\n }\n throw new Error(\n repositories.length === 0\n ? \"This Project has no code repository. Configure one before starting code work.\"\n : \"This Project has several repositories. Choose one with --repository.\"\n );\n}\n\nexport async function resolveSpaceSendText(\n input: ResolveSpaceSendTextInput\n): Promise<string> {\n const textValue = String(input.text ?? \"\");\n const stdinEnabled = input.stdin === true;\n const filePath = String(input.file ?? \"\").trim();\n\n const hasTextSource = textValue.length > 0;\n const hasFileSource = filePath.length > 0;\n const sourceCount =\n Number(hasTextSource) + Number(stdinEnabled) + Number(hasFileSource);\n\n if (sourceCount === 0) {\n if (input.allowEmpty) {\n return \"\";\n }\n throw createSpaceSendInputRequiredGuideError();\n }\n if (sourceCount > 1) {\n throw createSpaceSendInputConflictGuideError();\n }\n\n let resolvedText = textValue;\n if (hasFileSource) {\n const readFromFile = input.readFromFile ?? readSpaceSendFile;\n try {\n resolvedText = await readFromFile(filePath);\n } catch (error) {\n throw createSpaceSendInputFileReadFailedGuideError(\n filePath,\n toErrorMessage(error)\n );\n }\n }\n if (stdinEnabled) {\n const readFromStdin = input.readFromStdin ?? readSpaceSendStdin;\n resolvedText = await readFromStdin();\n }\n\n if (resolvedText.trim().length === 0 && !input.allowEmpty) {\n throw createSpaceSendInputEmptyGuideError();\n }\n\n return resolvedText;\n}\n\nfunction readSpaceSendFile(path: string): Promise<string> {\n return readFile(path, \"utf8\");\n}\n\nfunction readSpaceSendStdin(): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const chunks: string[] = [];\n\n const cleanup = () => {\n process.stdin.off(\"data\", onData);\n process.stdin.off(\"end\", onEnd);\n process.stdin.off(\"error\", onError);\n };\n\n const onData = (chunk: string | Buffer) => {\n if (typeof chunk === \"string\") {\n chunks.push(chunk);\n return;\n }\n chunks.push(chunk.toString(\"utf8\"));\n };\n\n const onEnd = () => {\n cleanup();\n resolve(chunks.join(\"\"));\n };\n\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", onData);\n process.stdin.on(\"end\", onEnd);\n process.stdin.on(\"error\", onError);\n process.stdin.resume();\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return String(error ?? \"unknown error\");\n}\n","export function parseJsonResponse(raw: string): unknown {\n if (!raw.trim()) {\n return null;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n","import { OpenMeldApiClientHttpError } from \"@openmeld/api-client\";\nimport { OPENMELD_HEADER_REQUEST_ID } from \"@openmeld/gateway-contract\";\nimport { gatewayErrorEnvelopeSchema } from \"@openmeld/schemas\";\nimport type { GatewayErrorCode } from \"@openmeld/schemas/types\";\nimport { parseJsonResponse } from \"./api-json\";\n\nconst FALLBACK_GATEWAY_HTTP_ERROR_CODE = \"gateway.http_error\" as const;\nconst GENERIC_NETWORK_ERROR_CODES = [\n \"network.timeout\",\n \"network.request_failed\",\n] as const;\n\ntype SafeParseResult<T> = { success: true; data: T } | { success: false };\n\ntype GatewayResponseSchema<T> = {\n safeParse: (value: unknown) => SafeParseResult<T>;\n};\n\nexport type GatewayResponseErrorCode =\n | GatewayErrorCode\n | typeof FALLBACK_GATEWAY_HTTP_ERROR_CODE\n | (typeof GENERIC_NETWORK_ERROR_CODES)[number]\n | string;\n\nexport type StructuredGatewayFailure = {\n code: GatewayResponseErrorCode | null;\n message: string;\n requestId: string | null;\n status: number | null;\n upstreamCode: string | null;\n};\n\nexport class GatewayHttpError extends Error {\n readonly code: GatewayResponseErrorCode;\n readonly requestId: string | null;\n readonly status: number;\n readonly rawBody: string;\n readonly upstreamCode: string | null;\n\n constructor(input: {\n code: GatewayResponseErrorCode;\n message: string;\n requestId?: string | null;\n status: number;\n rawBody: string;\n upstreamCode?: string | null;\n }) {\n super(input.message);\n this.name = \"GatewayHttpError\";\n this.code = input.code;\n this.requestId = normalizeOptionalText(input.requestId);\n this.status = input.status;\n this.rawBody = input.rawBody;\n this.upstreamCode = normalizeOptionalText(input.upstreamCode);\n }\n}\n\nexport async function readGatewayJsonResponse<T>(input: {\n response: Response;\n schema: GatewayResponseSchema<T>;\n invalidMessage: string;\n}): Promise<T> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n\n const parsed = input.schema.safeParse(parseJsonResponse(raw));\n if (!parsed.success) {\n throw new Error(input.invalidMessage);\n }\n return parsed.data;\n}\n\nexport async function readGatewayTextResponse(input: {\n response: Response;\n}): Promise<string> {\n const raw = await input.response.text();\n assertGatewayResponseOk({\n response: input.response,\n raw,\n });\n return raw;\n}\n\nexport function assertGatewayResponseOk(input: {\n response: Response;\n raw: string;\n}): void {\n if (input.response.ok) {\n return;\n }\n throw parseGatewayErrorResponse(input);\n}\n\nexport function parseGatewayErrorResponse(input: {\n response: Pick<Response, \"headers\" | \"status\">;\n raw: string;\n}): GatewayHttpError {\n const payload = parseJsonResponse(input.raw);\n const parsed = gatewayErrorEnvelopeSchema.safeParse(payload);\n const headerRequestId = normalizeOptionalText(\n input.response.headers.get(OPENMELD_HEADER_REQUEST_ID)\n );\n\n if (parsed.success) {\n return new GatewayHttpError({\n code: parsed.data.error.code,\n message: parsed.data.error.message,\n requestId: parsed.data.error.requestId || headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: parsed.data.error.upstreamCode ?? null,\n });\n }\n\n const looseEnvelope = readLooseGatewayErrorEnvelope(payload);\n if (looseEnvelope) {\n return new GatewayHttpError({\n code: looseEnvelope.code ?? FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n looseEnvelope.message ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: looseEnvelope.requestId ?? headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: looseEnvelope.upstreamCode,\n });\n }\n\n return new GatewayHttpError({\n code: FALLBACK_GATEWAY_HTTP_ERROR_CODE,\n message:\n normalizeOptionalText(input.raw) ??\n `Gateway request failed with HTTP ${input.response.status}.`,\n requestId: headerRequestId,\n status: input.response.status,\n rawBody: input.raw,\n upstreamCode: null,\n });\n}\n\nexport function toStructuredGatewayFailure(\n error: unknown\n): StructuredGatewayFailure {\n if (error instanceof OpenMeldApiClientHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n if (error instanceof GatewayHttpError) {\n return {\n code: error.code,\n message: normalizeFailureMessage(error.message),\n requestId: error.requestId,\n status: error.status,\n upstreamCode: error.upstreamCode,\n };\n }\n\n const genericErrorCode = readGenericErrorCode(error);\n if (genericErrorCode) {\n return {\n code: genericErrorCode,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n }\n\n return {\n code: null,\n message: normalizeFailureMessage(\n error instanceof Error ? error.message : String(error)\n ),\n requestId: null,\n status: null,\n upstreamCode: null,\n };\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeFailureMessage(value: unknown): string {\n return normalizeOptionalText(value) ?? \"Unknown error.\";\n}\n\nfunction readGenericErrorCode(value: unknown): GatewayResponseErrorCode | null {\n if (!value || typeof value !== \"object\" || !(\"code\" in value)) {\n return null;\n }\n\n const normalized = normalizeOptionalText(\n (value as { code?: unknown }).code ?? null\n );\n return normalized as GatewayResponseErrorCode | null;\n}\n\nfunction readLooseGatewayErrorEnvelope(value: unknown): {\n code: string | null;\n message: string | null;\n requestId: string | null;\n upstreamCode: string | null;\n} | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const record = value as {\n error?: {\n code?: unknown;\n message?: unknown;\n requestId?: unknown;\n upstreamCode?: unknown;\n } | null;\n };\n const error = record.error;\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const code = normalizeOptionalText(error.code);\n const message = normalizeOptionalText(error.message);\n const requestId = normalizeOptionalText(error.requestId);\n const upstreamCode = normalizeOptionalText(error.upstreamCode);\n if (!(code || message || requestId || upstreamCode)) {\n return null;\n }\n\n return {\n code,\n message,\n requestId,\n upstreamCode,\n };\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport { spaceMetaSchema } from \"@openmeld/schemas\";\n\ntype SpaceMetaParseOperation =\n | \"createSpaceMeta\"\n | \"fetchSpaceMeta\"\n | \"updateSpaceMeta\";\n\nexport function parseSpaceMetaPayload(input: {\n data: unknown;\n endpoint: string;\n operation: SpaceMetaParseOperation;\n}): SpaceMeta {\n try {\n const validation = spaceMetaSchema.safeParse(input.data);\n if (!validation.success) {\n const reason =\n validation.error.issues[0]?.message ??\n \"space meta payload does not match schema\";\n throw new Error(reason);\n }\n return validation.data;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${JSON.stringify(input.data)}`\n );\n }\n}\n\nexport function parseSpaceMetaResponse(input: {\n raw: string;\n endpoint: string;\n operation: Extract<\n SpaceMetaParseOperation,\n \"fetchSpaceMeta\" | \"updateSpaceMeta\"\n >;\n}): SpaceMeta {\n try {\n return parseSpaceMetaPayload({\n data: JSON.parse(input.raw) as unknown,\n endpoint: input.endpoint,\n operation: input.operation,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${input.operation} received invalid response payload from ${input.endpoint}: ${reason}; raw=${input.raw}`\n );\n }\n}\n","import type { SpaceMeta } from \"@openmeld/protocol\";\nimport type { OpenMeldRequestContext } from \"@openmeld/schemas/types\";\nimport { buildOpenMeldRequestContextHeadersWithAuth } from \"../config/request-headers\";\nimport { toSpaceMetaUrl } from \"../protocol/urls\";\nimport { fetchSpaceRequestWithTimeout } from \"./fetch-with-timeout\";\nimport { readGatewayTextResponse } from \"./gateway-response\";\nimport { parseSpaceMetaResponse } from \"./space-meta-response\";\n\ntype SpaceMetaApiInput = {\n requestContext: OpenMeldRequestContext;\n baseUrl: string;\n space: string;\n password?: string;\n};\n\nexport async function fetchSpaceMeta(\n input: SpaceMetaApiInput\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.fetch_meta\",\n init: {\n method: \"GET\",\n headers: await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"fetchSpaceMeta\",\n });\n}\n\nexport async function updateSpaceMeta(\n input: SpaceMetaApiInput & {\n purpose?: string;\n guide?: string;\n }\n): Promise<SpaceMeta> {\n const endpoint = toSpaceMetaUrl(input.baseUrl, input.space);\n const headers = await buildOpenMeldRequestContextHeadersWithAuth({\n requestUrl: endpoint,\n requestContext: input.requestContext,\n spacePassword: input.password,\n });\n headers[\"content-type\"] = \"application/json\";\n\n const response = await fetchSpaceRequestWithTimeout({\n url: endpoint,\n operation: \"space.update_meta\",\n init: {\n method: \"PATCH\",\n headers,\n body: JSON.stringify({\n ...(input.purpose === undefined ? {} : { purpose: input.purpose }),\n ...(input.guide === undefined ? {} : { guide: input.guide }),\n }),\n },\n });\n const raw = await readGatewayTextResponse({ response });\n\n return parseSpaceMetaResponse({\n raw,\n endpoint,\n operation: \"updateSpaceMeta\",\n });\n}\n"],"mappings":"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"}
|