openmeld 0.3.201 → 0.3.202
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-Bydm456C.js → add-me-membership-D0L-Rp2b.js} +2 -2
- package/dist/{add-me-membership-Bydm456C.js.map → add-me-membership-D0L-Rp2b.js.map} +1 -1
- package/dist/{agents-BYLmArr0.js → agents-DVvxGswx.js} +44 -27
- package/dist/agents-DVvxGswx.js.map +1 -0
- package/dist/{command-Biznp-FO.js → command-BzeF8e-W.js} +4 -4
- package/dist/{command-Biznp-FO.js.map → command-BzeF8e-W.js.map} +1 -1
- package/dist/{computer-setup-continuation-DPkzUv_T.js → computer-setup-continuation-C9zIfXWR.js} +3 -3
- package/dist/{computer-setup-continuation-DPkzUv_T.js.map → computer-setup-continuation-C9zIfXWR.js.map} +1 -1
- package/dist/{elapsed-time-ChC30u7g.js → elapsed-time-D6W25QcX.js} +2 -2
- package/dist/{elapsed-time-ChC30u7g.js.map → elapsed-time-D6W25QcX.js.map} +1 -1
- package/dist/{installer-Bjx_CtON.js → installer-7q1TA-GA.js} +2 -2
- package/dist/{installer-Bjx_CtON.js.map → installer-7q1TA-GA.js.map} +1 -1
- package/dist/{openmeld-B7cwCTxb.js → openmeld-Bg8kXoGJ.js} +16 -15
- package/dist/openmeld-Bg8kXoGJ.js.map +1 -0
- package/dist/{openmeld-maintenance-worker-DHQqf3DT.js → openmeld-maintenance-worker-CWzu4s1v.js} +4 -4
- package/dist/{openmeld-maintenance-worker-DHQqf3DT.js.map → openmeld-maintenance-worker-CWzu4s1v.js.map} +1 -1
- package/dist/{openmeld-tools-update-coordinator-Bf8KyI6N.js → openmeld-tools-update-coordinator-DNMcMykJ.js} +868 -488
- package/dist/openmeld-tools-update-coordinator-DNMcMykJ.js.map +1 -0
- package/dist/openmeld.js +3 -3
- package/dist/{prepare-session-executor-BOXF8ZE2.js → prepare-session-executor-B0_X-Fy6.js} +8 -8
- package/dist/prepare-session-executor-B0_X-Fy6.js.map +1 -0
- package/dist/upgrade-C8AKw9NW.js +4 -0
- package/dist/{upgrade-CdzOmo7O.js → upgrade-GoG7-WEn.js} +17 -254
- package/dist/upgrade-GoG7-WEn.js.map +1 -0
- package/package.json +1 -1
- package/dist/agents-BYLmArr0.js.map +0 -1
- package/dist/openmeld-B7cwCTxb.js.map +0 -1
- package/dist/openmeld-tools-update-coordinator-Bf8KyI6N.js.map +0 -1
- package/dist/prepare-session-executor-BOXF8ZE2.js.map +0 -1
- package/dist/upgrade-CdzOmo7O.js.map +0 -1
- package/dist/upgrade-DxRpsPL9.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-session-executor-BOXF8ZE2.js","names":["toErrorMessage","normalizeOptionalString","process","process","execFile","execFileCallback"],"sources":["../src/config/prepare-session-api.ts","../src/commands/computer-auth-session.ts","../src/commands/computer-auth-handoff-recovery.ts","../src/guides/local-agents-guide-url.ts","../src/local-service/reporting/selected-agent-controller-reporting.ts","../src/runtime/cli-output-handled-error.ts","../src/start-local/agents-local.ts","../src/start-local/background-helper-local.ts","../src/agents/command-examples.ts","../src/skills/agent-overview.ts","../src/skills/legacy-audit.ts","../src/commands/skills-format.ts","../src/commands/skills-legacy-audit-view.ts","../src/commands/skills-target-key.ts","../src/commands/skills-check.ts","../src/commands/skills-cards.ts","../src/commands/skills.ts","../src/start-local/skills-local.ts","../src/start-local/readiness.ts","../src/ui/controlling-terminal.ts","../src/ui/setup-progress.ts","../src/system/macos-version.ts","../src/commands/prepare-step-diagnostics.ts","../src/system/observed-device-metadata.ts","../src/commands/setup-current-device.ts","../src/commands/setup-force-service-refresh.ts","../src/commands/setup-service-update-truth.ts","../src/commands/prepare-session-executor.ts"],"sourcesContent":["import {\n prepareSessionResponseSchema,\n prepareSessionWithTokenResponseSchema,\n prepareSetupBootstrapWriteSchema,\n} from \"@openmeld/schemas\";\nimport type {\n PrepareSessionResponse,\n PrepareSetupBootstrapResult,\n} from \"@openmeld/schemas/types\";\nimport { createCliApiClientFoundation } from \"../space/api-client-foundation\";\nimport { resolveOpenMeldProfile } from \"./openmeld-profiles-api\";\nimport { buildOpenMeldRequestContextFromProfile } from \"./openmeld-request-context\";\n\nexport async function mintPrepareSessionReconnectToken(input: {\n baseUrl: string;\n prepareSessionId: string;\n}) {\n return await createCliApiClientFoundation(input.baseUrl).requestJson({\n method: \"POST\",\n operation: \"prepare.session.token.mint\",\n schema: prepareSessionWithTokenResponseSchema,\n invalidMessage: \"Invalid prepare session reconnect response.\",\n url: `/v1/prepare/sessions/${encodeURIComponent(input.prepareSessionId)}/token`,\n });\n}\n\nexport async function writePrepareSessionSetupBootstrapResult(input: {\n baseUrl: string;\n prepareSessionId: string;\n setupBootstrap: PrepareSetupBootstrapResult;\n}): Promise<PrepareSessionResponse> {\n const write = requireValidSetupBootstrapWrite({\n prepareSessionId: input.prepareSessionId,\n setupBootstrap: input.setupBootstrap,\n });\n const humanProfile = await resolveOpenMeldProfile({ profileKind: \"human\" });\n return await createCliApiClientFoundation(input.baseUrl).requestJson({\n body: JSON.stringify({\n setupBootstrap: write.setupBootstrap,\n }),\n headers: {\n \"content-type\": \"application/json\",\n },\n invalidMessage: \"Invalid prepare session setup bootstrap response.\",\n method: \"PATCH\",\n operation: \"prepare.session.setup_bootstrap.write\",\n requestContext: buildOpenMeldRequestContextFromProfile({\n openMeldProfile: humanProfile,\n }),\n schema: prepareSessionResponseSchema,\n url: buildPrepareSessionSetupBootstrapRoute(write.prepareSessionId),\n });\n}\n\nfunction buildPrepareSessionSetupBootstrapRoute(\n prepareSessionId: string\n): string {\n return `/v1/prepare/sessions/${encodeURIComponent(\n prepareSessionId\n )}/setup-bootstrap`;\n}\n\nfunction requireValidSetupBootstrapWrite(input: {\n prepareSessionId: string;\n setupBootstrap: PrepareSetupBootstrapResult;\n}) {\n const parsed = prepareSetupBootstrapWriteSchema.safeParse(input);\n if (!parsed.success) {\n throw new Error(\n parsed.error.issues[0]?.message ??\n \"Invalid prepare session setup bootstrap result.\"\n );\n }\n return parsed.data;\n}\n","import { resolveAuthBaseUrl } from \"../config/auth-url\";\nimport {\n type AuthUserSnapshot,\n extractAuthApiErrorMessage,\n fetchAuthUserSnapshot,\n type RevokeAuthAccessTokenResult,\n requestDeviceToken,\n resolveDeviceAuthClientId,\n resolveDeviceTokenExpiresAt,\n revokeAuthAccessToken,\n} from \"./auth-device-session-client\";\nimport type { PreparedAuthSession } from \"./prepared-auth-session\";\n\nexport type { PreparedAuthSession } from \"./prepared-auth-session\";\n\nexport async function exchangeComputerAuthorizationGrant(input: {\n authBaseUrl?: string;\n clientId?: string;\n deviceCode: string;\n}): Promise<PreparedAuthSession> {\n const authBaseUrl = resolveAuthBaseUrl(input.authBaseUrl);\n const clientId = resolveDeviceAuthClientId(input.clientId);\n const deviceCode = normalizeRequiredString(\n input.deviceCode,\n \"computer authorization code is required\"\n );\n const tokenResult = await requestDeviceToken({\n authBaseUrl,\n clientId,\n deviceCode,\n });\n if (!tokenResult.ok) {\n throw new Error(\n `computer authorization failed: ${extractAuthApiErrorMessage(\n tokenResult.error,\n tokenResult.status\n )}. Return to OpenMeld Web and get a new setup command to try again.`\n );\n }\n\n let user: AuthUserSnapshot;\n try {\n user = await fetchAuthUserSnapshot({\n authBaseUrl,\n accessToken: tokenResult.data.access_token,\n });\n } catch (error) {\n const cleanup = await revokeAuthAccessToken({\n accessToken: tokenResult.data.access_token,\n authBaseUrl,\n tokenType: tokenResult.data.token_type,\n });\n throw new Error(\n `computer authorization could not verify its OpenMeld account: ${toErrorMessage(error)}${formatCleanupFailure(cleanup)}`,\n { cause: error }\n );\n }\n const userId = normalizeOptionalString(user?.id);\n if (!userId) {\n const cleanup = await revokeAuthAccessToken({\n accessToken: tokenResult.data.access_token,\n authBaseUrl,\n tokenType: tokenResult.data.token_type,\n });\n throw new Error(\n `computer authorization account response did not include a user id${formatCleanupFailure(cleanup)}`\n );\n }\n\n const expiresAt = resolveDeviceTokenExpiresAt(tokenResult.data.expires_in);\n const scope = normalizeOptionalString(tokenResult.data.scope);\n return {\n accessToken: tokenResult.data.access_token,\n tokenType: tokenResult.data.token_type,\n authBaseUrl,\n clientId,\n ...(expiresAt ? { expiresAt } : {}),\n ...(scope ? { scope } : {}),\n user: {\n ...user,\n id: userId,\n },\n };\n}\n\nexport function revokePreparedAuthSession(\n session: PreparedAuthSession\n): Promise<RevokeAuthAccessTokenResult> {\n return revokeAuthAccessToken(session);\n}\n\nfunction formatCleanupFailure(result: RevokeAuthAccessTokenResult): string {\n if (result.ok) {\n return \"\";\n }\n const status =\n result.error.status === null\n ? \"network error\"\n : `HTTP ${result.error.status}`;\n return `; cleanup failed at ${result.error.endpoint} (${status}): ${result.error.message}`;\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : String(error ?? \"unknown error\");\n}\n\nfunction normalizeRequiredString(value: string, message: string): string {\n const normalized = normalizeOptionalString(value);\n if (!normalized) {\n throw new Error(message);\n }\n return normalized;\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import {\n completeInterruptedComputerAuthSessionRecovery,\n getInterruptedComputerAuthSessionRecovery,\n markInterruptedComputerAuthSessionRecovery,\n recordInterruptedComputerAuthSessionRecoveryFailure,\n} from \"../config/auth-session\";\nimport { compareSemver } from \"../config/version-state\";\nimport { scheduleDaemonServiceUpdate } from \"../local-service/lifecycle/daemon-service-update-coordinator\";\nimport { readPendingDaemonServiceUpdate } from \"../local-service/lifecycle/daemon-service-update-state\";\nimport { readOpenMeldToolsUpdateContextFromEnv } from \"../local-service/maintenance/openmeld-tools-update-context\";\nimport {\n resolveExternalOpenMeldToolsUpdate,\n waitForExternalOpenMeldToolsUpdate,\n} from \"../local-service/maintenance/openmeld-tools-update-join\";\nimport type { Presenter } from \"../runtime/presenter/index\";\nimport type { RuntimeContext } from \"../runtime/types\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\nimport { runDaemonServiceParticipationGate } from \"../system/local-service-participation-gate\";\nimport { revokePreparedAuthSession } from \"./computer-auth-session\";\nimport { bestEffortStopCurrentLaneDaemonService } from \"./service\";\n\nconst UNUSED_SETUP_SESSION_CLEANUP_SUFFIX =\n \" OpenMeld also could not revoke the unused setup session.\";\n\nexport type ComputerAuthHandoffRecoveryOutcome =\n | \"none\"\n | \"completed\"\n | \"deferred\";\n\nexport async function recoverInterruptedComputerAuthHandoff(input: {\n presenter: Presenter;\n runtime: RuntimeContext;\n view?: string;\n}): Promise<ComputerAuthHandoffRecoveryOutcome> {\n await waitForOpenMeldToolsUpdateBeforeComputerHandoff(input);\n const recovery = await getInterruptedComputerAuthSessionRecovery();\n if (!recovery) {\n return \"none\";\n }\n\n const previousOwnerUserId = normalizeOptionalString(\n recovery.previousSession?.user?.id\n );\n if (!recovery.serviceReconciled) {\n const stopped = await stopCurrentLaneDaemonServiceAfterToolsUpdate(input);\n if (stopped.status === \"warning\") {\n const error = new Error(\n stopped.errorMessage ??\n \"OpenMeld could not stop the incomplete Computer connection.\"\n );\n await recordInterruptedComputerAuthSessionRecoveryFailure({\n id: recovery.id,\n message: error.message,\n phase: \"service\",\n });\n logDeferredComputerAuthHandoffRecovery({\n error: error.message,\n phase: \"service\",\n transitionId: recovery.id,\n });\n throw error;\n }\n\n if (previousOwnerUserId) {\n const restored = await runDaemonServiceParticipationGate({\n intent: \"start\",\n presenter: input.presenter,\n resolvedView: input.runtime.resolvedView,\n allowPrompt: false,\n autoRepair: true,\n expectedOwnerUserId: previousOwnerUserId,\n forcePrompt: true,\n forceRefresh: true,\n gatewayUrl: recovery.gatewayUrl,\n suppressRefreshHumanResultCard: true,\n suppressStartSpinner: true,\n view: input.view,\n });\n if (restored.status !== \"aligned\") {\n const error = new Error(\n restored.errorMessage ??\n \"OpenMeld could not reconnect the previous Computer account.\"\n );\n await recordInterruptedComputerAuthSessionRecoveryFailure({\n id: recovery.id,\n message: error.message,\n phase: \"service\",\n });\n logDeferredComputerAuthHandoffRecovery({\n error: error.message,\n phase: \"service\",\n transitionId: recovery.id,\n });\n throw error;\n }\n }\n await markInterruptedComputerAuthSessionRecovery({\n id: recovery.id,\n phase: \"service\",\n });\n }\n\n if (!recovery.remoteSessionRevoked) {\n const revoked = await revokePreparedAuthSession(recovery.candidateSession);\n if (!revoked.ok) {\n await recordInterruptedComputerAuthSessionRecoveryFailure({\n endpoint: revoked.error.endpoint,\n id: recovery.id,\n message: revoked.error.message,\n phase: \"remote_session\",\n status: revoked.error.status,\n });\n logDeferredComputerAuthHandoffRecovery({\n endpoint: revoked.error.endpoint,\n error: revoked.error.message,\n phase: \"remote_session\",\n status: revoked.error.status,\n transitionId: recovery.id,\n });\n emitUnusedSetupSessionCleanupWarning(input.presenter, revoked.error);\n return \"deferred\";\n }\n await markInterruptedComputerAuthSessionRecovery({\n id: recovery.id,\n phase: \"remote_session\",\n });\n }\n\n const completed = await completeInterruptedComputerAuthSessionRecovery(\n recovery.id\n );\n return completed ? \"completed\" : \"deferred\";\n}\n\nasync function stopCurrentLaneDaemonServiceAfterToolsUpdate(input: {\n presenter: Presenter;\n runtime: RuntimeContext;\n view?: string;\n}): Promise<\n Awaited<ReturnType<typeof bestEffortStopCurrentLaneDaemonService>>\n> {\n let stopped = await bestEffortStopCurrentLaneDaemonService({\n runtime: input.runtime,\n });\n let retriedAfterUpdateDisappeared = false;\n while (stopped.status === \"warning\") {\n const externalUpdate = await resolveExternalOpenMeldToolsUpdate({\n currentOperationId: readOpenMeldToolsUpdateContextFromEnv()?.operationId,\n });\n if (externalUpdate) {\n if (externalUpdate.phase === \"waiting_for_work\") {\n // Waiting for accepted work is not a switching lock. A failed stop\n // needs its own recovery guidance, not a tight retry loop.\n break;\n }\n await waitForOpenMeldToolsUpdateBeforeComputerHandoff(input);\n } else if (retriedAfterUpdateDisappeared) {\n break;\n } else {\n // The updater can release the lifecycle lock and remove its operation\n // between stop's warning and this inspection. Retry once so Setup does\n // not turn that successful completion into a stale failure.\n retriedAfterUpdateDisappeared = true;\n }\n stopped = await bestEffortStopCurrentLaneDaemonService({\n runtime: input.runtime,\n });\n }\n return stopped;\n}\n\nexport async function waitForOpenMeldToolsUpdateBeforeComputerHandoff(input: {\n presenter: Presenter;\n}): Promise<void> {\n const currentUpdate = readOpenMeldToolsUpdateContextFromEnv();\n const pending = await readPendingDaemonServiceUpdate();\n if (\n pending &&\n pending.jobId !== currentUpdate?.operationId &&\n pending.phase === \"waiting_for_work\" &&\n compareSemver(OPENMELD_VERSION, pending.targetVersion) > 0\n ) {\n // Keep one operation owner. A newer Setup must advance the existing job,\n // not start a replacement that the older pending worker can later undo.\n await scheduleDaemonServiceUpdate({\n targetVersion: OPENMELD_VERSION,\n urgency: pending.urgency,\n requestSource: \"cli\",\n });\n }\n await waitForExternalOpenMeldToolsUpdate({\n currentOperationId: currentUpdate?.operationId,\n onWaiting: (operation) => {\n input.presenter.line({\n code: \"setup.openmeld_tools_update.waiting\",\n text: \"OpenMeld is finishing an update already in progress. Setup will continue automatically when the update finishes.\",\n data: {\n operationId: operation.operationId,\n phase: operation.phase,\n targetVersion: operation.targetVersion,\n },\n });\n },\n });\n}\n\nfunction logDeferredComputerAuthHandoffRecovery(input: {\n endpoint?: string;\n error: string;\n phase: \"service\" | \"remote_session\";\n status?: number | null;\n transitionId: string;\n}): void {\n console.warn(\"[openmeld.auth.computer_handoff_recovery_deferred]\", {\n ...(input.endpoint ? { endpoint: input.endpoint } : {}),\n error: input.error,\n phase: input.phase,\n ...(input.status === undefined ? {} : { status: input.status }),\n transitionId: input.transitionId,\n });\n}\n\nexport function emitUnusedSetupSessionCleanupWarning(\n presenter: Presenter,\n cleanupError: Error & { endpoint?: string; status?: number | null }\n): void {\n presenter.line({\n code: \"setup.computer_authorization.cleanup_warning\",\n text: \"OpenMeld kept the current Computer sign-in, but could not revoke the unused setup session. You can remove it later from Account sessions.\",\n data: {\n endpoint: cleanupError.endpoint ?? null,\n status: cleanupError.status ?? null,\n error: cleanupError.message,\n },\n });\n}\n\nexport function formatComputerAuthCleanupFailureSuffix(\n result: Awaited<ReturnType<typeof revokePreparedAuthSession>>\n): string {\n if (result.ok) {\n return \"\";\n }\n const status =\n result.error.status === null\n ? \"network error\"\n : `HTTP ${result.error.status}`;\n return `${UNUSED_SETUP_SESSION_CLEANUP_SUFFIX} Cleanup endpoint ${result.error.endpoint} returned ${status}: ${result.error.message}`;\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : null;\n}\n","import type { Key } from \"node:readline\";\nimport { resolveGatewayWebOrigin } from \"../space/web-url\";\nimport type {\n InteractivePromptKeypressResult,\n InteractivePromptStatus,\n InteractivePromptStreams,\n} from \"../ui/interactive-prompt\";\nimport {\n isReturnKeypress,\n runInteractivePrompt,\n} from \"../ui/interactive-prompt\";\n\nexport const LOCAL_AGENTS_GUIDE_PATH = \"/guides/local-agents\";\nexport const LOCAL_AGENTS_GUIDE_AGENT_NAMES =\n \"Codex, Claude Code, Grok Build, Cursor, or OpenCode\";\n\nexport type LocalAgentsGuideConfirmationDecision = \"continue\" | \"cancelled\";\n\ntype LocalAgentsGuidePromptState = {\n guideUrl: string;\n};\n\nexport function buildLocalAgentsGuideUrl(baseUrl: string): string {\n const url = new URL(resolveGatewayWebOrigin(baseUrl));\n url.pathname = LOCAL_AGENTS_GUIDE_PATH;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nexport function buildNoLocalAgentsNoticeLines(input: {\n guideUrl: string;\n}): string[] {\n return [\n `OpenMeld did not find ${LOCAL_AGENTS_GUIDE_AGENT_NAMES} on this computer.`,\n \"Install and sign in to one of them if you want this computer to run local agents from OpenMeld.\",\n `Guide: ${input.guideUrl}`,\n ];\n}\n\nexport function appendLocalAgentsGuideUrl(input: {\n guideUrl: string;\n message: string;\n}): string {\n return `${input.message} Install guide: ${input.guideUrl}`;\n}\n\nexport async function confirmContinueWithoutLocalAgents(input: {\n guideUrl: string;\n streams?: InteractivePromptStreams;\n}): Promise<LocalAgentsGuideConfirmationDecision> {\n return await runInteractivePrompt<\n LocalAgentsGuidePromptState,\n LocalAgentsGuideConfirmationDecision\n >(\n {\n initialState: { guideUrl: input.guideUrl },\n fallbackResult: \"continue\",\n renderLines: renderLocalAgentsGuidePromptLines,\n handleKeypress: handleLocalAgentsGuidePromptKeypress,\n },\n input.streams\n );\n}\n\nexport function renderLocalAgentsGuidePromptLines(\n state: LocalAgentsGuidePromptState,\n status: InteractivePromptStatus\n): string[] {\n if (status === \"submitted\") {\n return [\"Continuing setup without local agents.\"];\n }\n if (status === \"cancelled\") {\n return [\"Setup cancelled.\"];\n }\n return [\n ...buildNoLocalAgentsNoticeLines({ guideUrl: state.guideUrl }),\n \"Continue setting up the OpenMeld service without any local agents? [Y/n]\",\n ];\n}\n\nexport function handleLocalAgentsGuidePromptKeypress(input: {\n key: Key;\n state: LocalAgentsGuidePromptState;\n str: string | undefined;\n}): InteractivePromptKeypressResult<\n LocalAgentsGuidePromptState,\n LocalAgentsGuideConfirmationDecision\n> {\n if (isReturnKeypress({ key: input.key, str: input.str })) {\n return {\n type: \"result\",\n status: \"submitted\",\n result: \"continue\",\n state: input.state,\n };\n }\n const value = String(input.str ?? \"\")\n .trim()\n .toLowerCase();\n if (value === \"y\") {\n return {\n type: \"result\",\n status: \"submitted\",\n result: \"continue\",\n state: input.state,\n };\n }\n if (value === \"n\" || input.key.name === \"escape\") {\n return {\n type: \"result\",\n status: \"cancelled\",\n result: \"cancelled\",\n state: input.state,\n };\n }\n if (input.key.ctrl && input.key.name === \"c\") {\n return {\n type: \"result\",\n status: \"cancelled\",\n result: \"cancelled\",\n state: input.state,\n };\n }\n return { type: \"ignore\" };\n}\n","import { buildAgentControllerRef } from \"@openmeld/agent-runtime\";\nimport { formatOpenMeldCliCommand } from \"../../runtime/cli-entry-command\";\nimport type { StartReadinessSnapshot } from \"../../start-local/readiness-types\";\nimport type { LocalParticipationState } from \"../../system/action-participation-planner\";\nimport {\n collectLocalAgentControllerInventory,\n type LocalAgentControllerInventoryItem,\n resolveLocalAgentControllerBlockerReasonCodes,\n resolveLocalAgentControllerLaunchability,\n resolveLocalAgentControllerReportDecision,\n} from \"../inventory/agent-controller-inventory\";\nimport {\n type RuntimeAgentControllerReportSubmission,\n submitRuntimeAgentControllerReports,\n} from \"./runtime-agent-controller-reporting-submission\";\n\nexport type SelectedAgentControllerReportResult = {\n agentId: string;\n agentControllerRef: string;\n agentControllerInterface?: LocalAgentControllerInventoryItem[\"agentControllerInterface\"];\n localParticipationState: LocalParticipationState;\n reasonCodes: readonly string[];\n runtimeReportSubmission: RuntimeAgentControllerReportSubmission;\n};\n\nexport type SelectedAgentControllerReadinessDecision = {\n agentId: string;\n agentControllerRef: string;\n agentControllerInterface?: LocalAgentControllerInventoryItem[\"agentControllerInterface\"];\n localParticipationState: LocalParticipationState;\n reasonCodes: readonly string[];\n};\n\nexport function resolveSelectedAgentControllerReadiness(input: {\n controllerInventory?: readonly LocalAgentControllerInventoryItem[];\n localAgentIds: readonly string[];\n readiness: StartReadinessSnapshot;\n}): SelectedAgentControllerReadinessDecision[] {\n const uniqueAgentIds = [...new Set(input.localAgentIds.map(normalizeId))]\n .filter(Boolean)\n .sort();\n const decisions: SelectedAgentControllerReadinessDecision[] = [];\n\n for (const agentId of uniqueAgentIds) {\n const agentControllerRef = buildAgentControllerRef({\n kind: \"builtin\",\n id: agentId,\n });\n const candidate =\n input.readiness.agents.candidates.find(\n (currentCandidate) => currentCandidate.agentId === agentId\n ) ?? null;\n const inventoryItem =\n input.controllerInventory?.find(\n (currentCapability) => currentCapability.agentId === agentId\n ) ?? null;\n const readinessDecision = resolveSelectedAgentControllerParticipation({\n candidate,\n inventoryItem,\n readiness: input.readiness,\n });\n decisions.push({\n ...(inventoryItem?.agentControllerInterface\n ? { agentControllerInterface: inventoryItem.agentControllerInterface }\n : {}),\n agentId,\n agentControllerRef,\n localParticipationState: readinessDecision.localParticipationState,\n reasonCodes: readinessDecision.reasonCodes,\n });\n }\n\n return decisions;\n}\n\nexport async function submitSelectedAgentControllerReports(input: {\n localAgentIds: readonly string[];\n readiness: StartReadinessSnapshot;\n}): Promise<SelectedAgentControllerReportResult[]> {\n // OPENMELD_SETUP_TO_WAKE_PATH: HIGHEST_FACT runtime-agent-controller-report\n // This is the highlighted local execution target handoff from CLI/Service\n // evidence into Core. Phase 2 should make this an explicit inventory fact,\n // not a side effect of Prepare wording.\n const controllerInventory = (\n await collectLocalAgentControllerInventory({\n includeControllerInterface: true,\n })\n ).capabilities;\n const decisions = resolveSelectedAgentControllerReadiness({\n ...input,\n controllerInventory,\n });\n const submissions = await submitRuntimeAgentControllerReports({\n reports: decisions.map((decision) => ({\n agentControllerRef: decision.agentControllerRef,\n ...(decision.agentControllerInterface\n ? { agentControllerInterface: decision.agentControllerInterface }\n : {}),\n localParticipationState: decision.localParticipationState,\n reasonCodes: decision.reasonCodes,\n })),\n });\n\n return decisions.map((decision, index) => {\n const runtimeReportSubmission = submissions[index];\n if (!runtimeReportSubmission) {\n throw new Error(\n `OpenMeld Agent Controller reporting did not return a submission result for ${decision.agentId}.`\n );\n }\n return {\n ...decision,\n runtimeReportSubmission,\n };\n });\n}\n\nexport function assertSelectedAgentControllerReportSubmissionsAccepted(\n results: readonly SelectedAgentControllerReportResult[]\n): void {\n const failedSubmission = results.find(\n (result) => !isSelectedAgentControllerReportSubmissionAccepted(result)\n );\n if (failedSubmission) {\n const reasonCode =\n failedSubmission.runtimeReportSubmission.reasonCodes[0] ??\n failedSubmission.runtimeReportSubmission.reason ??\n failedSubmission.reasonCodes[0] ??\n \"runtime.reporting.unavailable\";\n throw new Error(\n formatSelectedAgentControllerReportFailure(\n failedSubmission.agentId,\n reasonCode\n )\n );\n }\n\n const setupWideFailure = results.find((result) =>\n result.reasonCodes.some((reasonCode) => reasonCode.startsWith(\"service.\"))\n );\n if (!setupWideFailure) {\n return;\n }\n const reasonCode =\n setupWideFailure.reasonCodes.find((currentReasonCode) =>\n currentReasonCode.startsWith(\"service.\")\n ) ?? \"runtime.reporting.unavailable\";\n throw new Error(\n formatSelectedAgentControllerReportFailure(\n setupWideFailure.agentId,\n reasonCode\n )\n );\n}\n\nfunction isSelectedAgentControllerReportSubmissionAccepted(\n result: SelectedAgentControllerReportResult\n): boolean {\n return (\n result.runtimeReportSubmission.status === \"submitted\" &&\n result.runtimeReportSubmission.agentControllerReportStatus === \"accepted\" &&\n Boolean(result.runtimeReportSubmission.openMeldServiceRuntimeId)\n );\n}\n\nfunction formatSelectedAgentControllerReportFailure(\n agentId: string,\n reasonCode: string\n): string {\n if (reasonCode === \"service.not_running\") {\n const statusCommand = formatOpenMeldCliCommand(\"openmeld service status\");\n const runCommand = formatOpenMeldCliCommand(\"openmeld service start\");\n return `OpenMeld could not connect selected agents to OpenMeld for ${agentId} because OpenMeld Service is not running. Run \\`${statusCommand}\\` to inspect it, then \\`${runCommand}\\` to start it and retry this Web setup command.`;\n }\n\n if (reasonCode === \"service.not_installed\") {\n const installCommand = formatOpenMeldCliCommand(\"openmeld service install\");\n const runCommand = formatOpenMeldCliCommand(\"openmeld service start\");\n return `OpenMeld could not connect selected agents to OpenMeld for ${agentId} because OpenMeld Service is not installed. Run \\`${installCommand}\\`, then \\`${runCommand}\\`, and retry this Web setup command.`;\n }\n\n if (reasonCode === \"runtime.registration.device_forgotten\") {\n return `OpenMeld could not reconnect this computer for ${agentId} because this computer was previously removed from your OpenMeld account. Support code: ${reasonCode}.`;\n }\n\n if (reasonCode === \"controller.launch.choice_required\") {\n return `OpenMeld found more than one ${agentId} install on this computer. Run \\`${formatOpenMeldCliCommand(\n `openmeld agents enable --agent ${agentId}`\n )}\\` in an interactive Terminal and choose one install. If this Terminal cannot prompt, run \\`${formatOpenMeldCliCommand(\n `openmeld agents enable --agent ${agentId} --install <install-id>`\n )}\\` with one of the install IDs shown by that enable command, then return to OpenMeld Web setup.`;\n }\n\n if (reasonCode === \"controller.launch.needs_repair\") {\n return `OpenMeld could not start ${agentId} on this computer. Run \\`${formatOpenMeldCliCommand(\n `openmeld agents repair --agent ${agentId}`\n )}\\`, then return to OpenMeld Web setup.`;\n }\n\n if (\n reasonCode === \"provider_account.access_required\" ||\n reasonCode === \"controller.auth.unauthenticated\"\n ) {\n return `OpenMeld could not connect selected agents to OpenMeld for ${agentId} because this local controller is not signed in on this computer. Sign in to ${agentId}, then retry this Web setup command. Support code: ${reasonCode}.`;\n }\n\n return `OpenMeld could not connect selected agents to OpenMeld for ${agentId}. Support code: ${reasonCode}.`;\n}\n\nfunction resolveSelectedAgentControllerParticipation(input: {\n candidate: StartReadinessSnapshot[\"agents\"][\"candidates\"][number] | null;\n inventoryItem: LocalAgentControllerInventoryItem | null;\n readiness: StartReadinessSnapshot;\n}): {\n localParticipationState: LocalParticipationState;\n reasonCodes: readonly string[];\n} {\n if (!input.candidate) {\n return {\n localParticipationState: \"needs_agent_prepare\",\n reasonCodes: [\"local_agent_preparation.not_found\"],\n };\n }\n\n const launchability = resolveLocalAgentControllerLaunchability({\n detected: input.candidate.detected,\n launchStatus: input.candidate.launchStatus,\n runtimeSupported: input.candidate.selectableReason !== \"not_supported_yet\",\n selectable: input.candidate.selectable,\n selectableReason: input.candidate.selectableReason,\n });\n const runtimeDecision = resolveLocalAgentControllerReportDecision(\n {\n blockerReasonCodes:\n launchability === \"blocked\" && input.candidate.launchStatus !== \"ready\"\n ? [resolveLaunchStatusReasonCode(input.candidate)]\n : resolveLocalAgentControllerBlockerReasonCodes({\n launchability,\n selectableReason: input.candidate.selectableReason,\n }),\n enabled: input.candidate.enabled,\n agentControllerInterface: input.inventoryItem?.agentControllerInterface,\n launchability,\n selectable: input.candidate.selectable,\n selectableReason: input.candidate.selectableReason,\n },\n { requireEnabled: false }\n );\n if (runtimeDecision.localParticipationState !== \"ready\") {\n return runtimeDecision;\n }\n\n if (input.readiness.service.runtime?.status !== \"running\") {\n return {\n localParticipationState: \"needs_openmeld_service\",\n reasonCodes: [\"service.not_running\"],\n };\n }\n\n return {\n localParticipationState: \"ready\",\n reasonCodes: [],\n };\n}\n\nfunction resolveLaunchStatusReasonCode(\n candidate: StartReadinessSnapshot[\"agents\"][\"candidates\"][number]\n): string {\n if (candidate.launchStatus === \"needs_choice\") {\n return \"controller.launch.choice_required\";\n }\n if (candidate.launchStatus === \"needs_repair\") {\n return \"controller.launch.needs_repair\";\n }\n return \"local_agent_preparation.not_enabled\";\n}\n\nfunction normalizeId(value: string): string {\n return value.trim();\n}\n","export class CliOutputHandledError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliOutputHandledError\";\n }\n}\n\nexport function isCliOutputHandledError(\n error: unknown\n): error is CliOutputHandledError {\n return (\n error instanceof CliOutputHandledError ||\n (error instanceof Error && error.name === \"CliOutputHandledError\")\n );\n}\n","import {\n type AgentsEnableResult,\n runAgentsDisable,\n runAgentsEnable,\n} from \"../commands/agents\";\nimport { collectLocalAgentControllerInventory } from \"../local-service/inventory/agent-controller-inventory\";\nimport type { StartReadinessSnapshot } from \"./readiness-types\";\n\nexport type StartLocalBuiltinAgentCandidate =\n StartReadinessSnapshot[\"agents\"][\"candidates\"][number];\n\nexport async function listStartLocalBuiltinAgentCandidates(): Promise<\n StartLocalBuiltinAgentCandidate[]\n> {\n const inventory = await collectLocalAgentControllerInventory();\n return inventory.capabilities.map((capability) => ({\n agentId: capability.agentId,\n displayName: capability.displayName,\n detected: capability.detected,\n enabled: capability.enabled,\n launchStatus: capability.launchStatus,\n lifecycleStatus: capability.lifecycleStatus,\n selectable: capability.selectable,\n selectableReason: capability.selectableReason,\n }));\n}\n\nexport function collectStartLocalAgentsReadiness(): Promise<\n StartReadinessSnapshot[\"agents\"]\n> {\n return listStartLocalBuiltinAgentCandidates()\n .then((builtinCandidates) => ({\n status: \"ok\" as const,\n totalBuiltins: builtinCandidates.length,\n detectedSupported: builtinCandidates.filter(\n (candidate) => candidate.detected && candidate.launchStatus === \"ready\"\n ).length,\n needsChoice: builtinCandidates.filter(\n (candidate) =>\n candidate.detected && candidate.launchStatus === \"needs_choice\"\n ).length,\n needsRepair: builtinCandidates.filter(\n (candidate) =>\n candidate.detected && candidate.launchStatus === \"needs_repair\"\n ).length,\n detectedNotSupportedYet: builtinCandidates.filter(\n (candidate) =>\n candidate.detected &&\n candidate.launchStatus === \"not_available\" &&\n !candidate.selectable &&\n candidate.selectableReason === \"not_supported_yet\"\n ).length,\n notDetected: builtinCandidates.filter((candidate) => !candidate.detected)\n .length,\n candidates: builtinCandidates,\n }))\n .catch((error) => ({\n status: \"unknown\" as const,\n totalBuiltins: 0,\n detectedSupported: 0,\n needsChoice: 0,\n needsRepair: 0,\n detectedNotSupportedYet: 0,\n notDetected: 0,\n candidates: [],\n error:\n error instanceof Error && error.message.trim().length > 0\n ? error.message.trim()\n : \"agents readiness unavailable\",\n }));\n}\n\nexport async function listStartLocalRunnableControllerIds(): Promise<string[]> {\n const candidates = await listStartLocalBuiltinAgentCandidates();\n return candidates\n .filter((candidate) => candidate.launchStatus === \"ready\")\n .map((candidate) => candidate.agentId)\n .sort((left, right) => left.localeCompare(right));\n}\n\nexport async function runStartLocalAgentsEnable(input: {\n agent: string[];\n interactive?: boolean;\n install?: string;\n presentation?: \"handoff\" | \"standalone\";\n profile?: string;\n view?: string;\n}): Promise<AgentsEnableResult> {\n return await runAgentsEnable(input);\n}\n\nexport async function runStartLocalAgentsDisable(input: {\n agent: string[];\n profile?: string;\n view?: string;\n}): Promise<void> {\n await runAgentsDisable(input);\n}\n","import {\n runDaemonBackgroundStartForDecision,\n runDaemonInstall,\n} from \"../commands/service\";\nimport { getDaemonStatus } from \"../config/daemon-state\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport {\n resolveDaemonRuntimeContractCompatibility,\n toStartBackgroundHelperExecutionCompatibility,\n} from \"../local-service/lifecycle/daemon-runtime-contract-compatibility\";\nimport { readCurrentObservedDaemonRuntimeStatus } from \"../local-service/lifecycle/daemon-service-runtime\";\nimport { resolveLocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport type { StartReadinessSnapshot } from \"./readiness-types\";\n\nexport function collectStartLocalBackgroundHelperReadiness(): Promise<\n StartReadinessSnapshot[\"service\"]\n> {\n const expectedVersion = resolveCurrentDaemonExpectedVersion();\n return getDaemonStatus()\n .then((status) => {\n if (!status.installed) {\n return {\n status: \"not_installed\" as const,\n installedVersion: null,\n expectedVersion,\n runtime: null,\n };\n }\n return {\n status: \"installed_current\" as const,\n installedVersion: status.state.daemonVersion,\n expectedVersion,\n };\n })\n .then(async (service) => {\n const runtime = await readCurrentObservedDaemonRuntimeStatus().catch(\n () => null\n );\n const executionCompatibility =\n await resolveDaemonRuntimeContractCompatibility({\n runtimeStatus: runtime?.status ?? \"unknown\",\n });\n return {\n ...service,\n executionCompatibility: toStartBackgroundHelperExecutionCompatibility(\n executionCompatibility\n ),\n runtime,\n };\n })\n .catch((error) => ({\n status: \"unknown\" as const,\n installedVersion: null,\n expectedVersion,\n runtime: null,\n error:\n error instanceof Error && error.message.trim().length > 0\n ? error.message.trim()\n : \"service readiness unavailable\",\n }));\n}\n\nexport async function resolveStartLocalBackgroundHelperDemand(input: {\n ownerUserId?: string | null;\n}): Promise<Awaited<ReturnType<typeof resolveLocalServiceDemand>>> {\n return await resolveLocalServiceDemand(input);\n}\n\nexport async function runStartLocalBackgroundHelperInstall(input: {\n view?: string;\n}): Promise<void> {\n await runDaemonInstall({\n view: input.view,\n });\n}\n\nexport async function runStartLocalBackgroundHelperBackgroundStart(input: {\n view?: string;\n}): Promise<Awaited<ReturnType<typeof runDaemonBackgroundStartForDecision>>> {\n return await runDaemonBackgroundStartForDecision({\n view: input.view,\n });\n}\n","import type { RuntimeAgentTransportMode } from \"../config/runtime-config\";\nimport { getConfiguredSkillsConfig } from \"../config/runtime-config\";\nimport {\n resolveSkillsAgentRegistry,\n type SkillsAgentRegistryEntry,\n} from \"../skills/agents\";\nimport { listAgentTargetStates } from \"./registry\";\n\nconst AGENT_EXAMPLE_PLACEHOLDER = \"<agent-id>\";\nconst AGENT_EXAMPLE_PAIR_PLACEHOLDER = \"<agent-a> <agent-b>\";\nconst TRANSPORT_MODE_EXAMPLE_PLACEHOLDER = \"<transport-mode>\";\n\nexport type TransportModeExample = {\n modeExample: string;\n supportedModes: RuntimeAgentTransportMode[];\n};\n\nexport function resolveInstallableAgentExamplePair(\n registry?: Record<string, SkillsAgentRegistryEntry>\n): string {\n const resolvedRegistry = registry ?? resolveSkillsAgentRegistry();\n const installableIds = Object.entries(resolvedRegistry)\n .filter(\n (entry) =>\n entry[1].lifecycleStatus !== \"suspended\" &&\n entry[1].skillsInstallable === true\n )\n .map((entry) => entry[0]);\n if (installableIds.length === 0) {\n return AGENT_EXAMPLE_PAIR_PLACEHOLDER;\n }\n if (installableIds.length === 1) {\n return installableIds[0] ?? AGENT_EXAMPLE_PLACEHOLDER;\n }\n return installableIds.slice(0, 2).join(\" \");\n}\n\nexport async function resolvePreferredRunnableControllerExample(): Promise<string> {\n const registry = await resolveConfiguredSkillsRegistry();\n const builtinOrder = Object.keys(registry);\n const states = await listAgentTargetStates().catch(() => []);\n const selectableBuiltinIds = new Set(\n states\n .filter(\n (state) =>\n state.targetKind === \"builtin\" &&\n state.lifecycleStatus !== \"suspended\" &&\n state.selectable\n )\n .map((state) => state.agentId)\n );\n const selectableController = builtinOrder.find((agentId) =>\n selectableBuiltinIds.has(agentId)\n );\n if (selectableController) {\n return selectableController;\n }\n const runtimeSupportedController = builtinOrder.find(\n (agentId) =>\n registry[agentId]?.lifecycleStatus !== \"suspended\" &&\n registry[agentId]?.runtimeSupported === true\n );\n return runtimeSupportedController ?? AGENT_EXAMPLE_PLACEHOLDER;\n}\n\nexport async function resolveTransportModeExampleForController(\n controllerId?: string\n): Promise<TransportModeExample> {\n const normalizedControllerId = String(controllerId ?? \"\").trim();\n const preferredControllerId =\n normalizedControllerId ||\n (await resolvePreferredRunnableControllerExample());\n const states = await listAgentTargetStates().catch(() => []);\n const matchedState = states.find(\n (state) =>\n state.targetKind === \"builtin\" && state.agentId === preferredControllerId\n );\n if (matchedState && matchedState.transportModes.length > 0) {\n const supportedModes = matchedState.transportModes.map(\n (transportMode) => transportMode.mode\n );\n return {\n modeExample: supportedModes[0] ?? TRANSPORT_MODE_EXAMPLE_PLACEHOLDER,\n supportedModes,\n };\n }\n\n const registry = await resolveConfiguredSkillsRegistry();\n const preferredEntry = registry[preferredControllerId];\n if (preferredEntry && preferredEntry.transportModes.length > 0) {\n const supportedModes = preferredEntry.transportModes.map(\n (transportMode) => transportMode.mode\n );\n return {\n modeExample: supportedModes[0] ?? TRANSPORT_MODE_EXAMPLE_PLACEHOLDER,\n supportedModes,\n };\n }\n\n for (const [_agentId, entry] of Object.entries(registry)) {\n if (!(entry.runtimeSupported && entry.transportModes.length > 0)) {\n continue;\n }\n const supportedModes = entry.transportModes.map(\n (transportMode) => transportMode.mode\n );\n return {\n modeExample: supportedModes[0] ?? TRANSPORT_MODE_EXAMPLE_PLACEHOLDER,\n supportedModes,\n };\n }\n\n return {\n modeExample: TRANSPORT_MODE_EXAMPLE_PLACEHOLDER,\n supportedModes: [],\n };\n}\n\nasync function resolveConfiguredSkillsRegistry(): Promise<\n Record<string, SkillsAgentRegistryEntry>\n> {\n const skillsConfig = await getConfiguredSkillsConfig().catch(() => null);\n return resolveSkillsAgentRegistry(skillsConfig);\n}\n","import { buildAgentOverviewFromContract } from \"../command-contracts/helpers\";\nimport { getCommandEntryContract } from \"../command-contracts/registry\";\nimport { formatAgentOverviewPayload } from \"../runtime/agent-overview-payload\";\nimport type { Presenter } from \"../runtime/presenter\";\n\nexport type SkillsAgentOverviewCommand =\n | \"menu\"\n | \"list\"\n | \"check\"\n | \"update\"\n | \"ensure\"\n | \"install\"\n | \"uninstall\";\n\ntype SkillsAgentOverviewInput = {\n presenter: Presenter;\n command: SkillsAgentOverviewCommand;\n storeDir: string;\n knownAgentIds: string[];\n agentExampleArg: string;\n skills: Array<{\n id: string;\n name: string;\n relativePath: string;\n }>;\n};\n\ntype SkillsAgentOverviewPayload = {\n summary: string;\n requiredArguments: string[];\n optionalArguments: string[];\n commands: string[];\n stages: string[];\n notes: string[];\n humanActionRequired: boolean;\n};\n\nexport function emitSkillsAgentOverview(input: SkillsAgentOverviewInput): void {\n input.presenter.data({\n code: `skills.${input.command}.agent_overview`,\n payload: formatAgentOverviewPayload(buildSkillsAgentOverviewPayload(input)),\n });\n}\n\nfunction buildSkillsAgentOverviewPayload(\n input: SkillsAgentOverviewInput\n): SkillsAgentOverviewPayload {\n const sharedNotes = buildSharedNotes(input);\n switch (input.command) {\n case \"menu\": {\n return {\n summary:\n \"Manage the OpenMeld skills store and route installs to known or custom agent skills directories.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: buildMenuCommands(input),\n stages: [\n \"Inspect the local OpenMeld skills store.\",\n \"Choose an explicit subcommand for list, check, update, install, or uninstall.\",\n \"If a human wants the interactive menu, switch to human view.\",\n ],\n notes: [\n \"Agent view does not open the interactive skills menu.\",\n ...sharedNotes,\n ],\n humanActionRequired: true,\n };\n }\n case \"list\": {\n return {\n summary:\n \"List every OpenMeld skill currently available in the local OpenMeld skills store.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld skills list --view agent\"],\n stages: [\n \"Load the OpenMeld skills store.\",\n \"Return all local OpenMeld skills with relative and absolute paths.\",\n ],\n notes: sharedNotes,\n humanActionRequired: false,\n };\n }\n case \"check\": {\n return {\n summary:\n \"Check detected and tracked skills targets for missing OpenMeld skills, available updates, or non-OpenMeld skills that need review.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld skills check --view agent\",\n \"openmeld skills update --view agent\",\n ],\n stages: [\n \"Resolve detected and tracked skills targets.\",\n \"Compare each target with the local OpenMeld skills store.\",\n \"Return summary counts and per-target state.\",\n ],\n notes: sharedNotes,\n humanActionRequired: false,\n };\n }\n case \"update\": {\n return {\n summary:\n \"Update tracked OpenMeld skills targets that are missing or outdated.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld skills update --view agent\",\n \"openmeld skills check --view agent\",\n ],\n stages: [\n \"Resolve tracked OpenMeld skills targets.\",\n \"Find missing or outdated OpenMeld-managed skills.\",\n \"Install only the required updates.\",\n ],\n notes: sharedNotes,\n humanActionRequired: false,\n };\n }\n case \"ensure\": {\n return buildSkillsContractOverviewPayload({\n entryName: \"skills.ensure\",\n input,\n });\n }\n case \"install\": {\n return buildSkillsContractOverviewPayload({\n entryName: \"skills.install\",\n input,\n });\n }\n case \"uninstall\": {\n return buildSkillsContractOverviewPayload({\n entryName: \"skills.uninstall\",\n input,\n });\n }\n default: {\n return assertNever(input.command);\n }\n }\n}\n\nfunction buildMenuCommands(input: SkillsAgentOverviewInput): string[] {\n const context = {\n agentExampleArg: input.agentExampleArg,\n includeViewFlag: true,\n knownAgentIds: input.knownAgentIds,\n skills: input.skills.map((skill) => ({\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n storeDir: input.storeDir,\n };\n const installOverview =\n getCommandEntryContract(\"skills.install\")?.agentOverview;\n const ensureOverview =\n getCommandEntryContract(\"skills.ensure\")?.agentOverview;\n const uninstallOverview =\n getCommandEntryContract(\"skills.uninstall\")?.agentOverview;\n return [\n \"openmeld skills list --view agent\",\n \"openmeld skills check --view agent\",\n \"openmeld skills update --view agent\",\n ...(ensureOverview\n ? buildAgentOverviewFromContract({\n context,\n overview: ensureOverview,\n }).commands\n : []),\n ...(installOverview\n ? buildAgentOverviewFromContract({\n context,\n overview: installOverview,\n }).commands\n : []),\n ...(uninstallOverview\n ? buildAgentOverviewFromContract({\n context,\n overview: uninstallOverview,\n }).commands\n : []),\n ];\n}\n\nfunction buildSkillsContractOverviewPayload(input: {\n entryName: \"skills.ensure\" | \"skills.install\" | \"skills.uninstall\";\n input: SkillsAgentOverviewInput;\n}): SkillsAgentOverviewPayload {\n const contract = getCommandEntryContract(input.entryName);\n if (!contract?.agentOverview) {\n throw new Error(`missing ${input.entryName} command contract`);\n }\n const payload = buildAgentOverviewFromContract({\n context: {\n agentExampleArg: input.input.agentExampleArg,\n includeViewFlag: true,\n knownAgentIds: input.input.knownAgentIds,\n skills: input.input.skills.map((skill) => ({\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n storeDir: input.input.storeDir,\n },\n overview: contract.agentOverview,\n });\n if (typeof payload.humanActionRequired !== \"boolean\") {\n throw new Error(\n `${input.entryName} command contract must use boolean humanActionRequired`\n );\n }\n return {\n ...payload,\n humanActionRequired: payload.humanActionRequired,\n };\n}\n\nfunction buildSharedNotes(input: SkillsAgentOverviewInput): string[] {\n const knownAgentIds =\n input.knownAgentIds.length > 0\n ? input.knownAgentIds.join(\", \")\n : \"none detected\";\n const localSkills =\n input.skills.length > 0\n ? input.skills\n .map((skill) => `${skill.name} (${skill.relativePath})`)\n .join(\", \")\n : \"none\";\n return [\n `OpenMeld skills store: ${input.storeDir}`,\n `known agent ids: ${knownAgentIds}`,\n `local OpenMeld skills: ${localSkills}`,\n ];\n}\n\nfunction assertNever(value: never): never {\n throw new Error(\n `unsupported skills agent overview command: ${String(value)}`\n );\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport type { SkillsInstallTarget } from \"./installer\";\nimport type { LocalSkill } from \"./store\";\nimport { readOpenMeldSkillMarker } from \"./store\";\n\ntype SkillsRegistryEntryLike = {\n globalSkillsDir?: string;\n};\n\nexport type LegacyOpenMeldSkillFinding = {\n skillId: string;\n skillDir: string;\n parentDir: string;\n reasonCode:\n | \"legacy_openmeld_skill_id\"\n | \"unmanaged_current_openmeld_skill_copy\";\n problem: string;\n recommendation: string;\n currentInstallCommand: string;\n cleanupCommands: string[];\n verificationCommand: string;\n};\n\nconst LEGACY_OPENMELD_SKILL_IDS = new Set([\"openmeld-cli-guide\"]);\nconst LEGACY_OPENMELD_SKILL_VERIFICATION_COMMAND =\n \"openmeld skills check --view agent\";\n\nexport async function detectLegacyOpenMeldSkillCopies(input: {\n registry: Record<string, SkillsRegistryEntryLike>;\n localSkills: LocalSkill[];\n targets?: SkillsInstallTarget[];\n}): Promise<LegacyOpenMeldSkillFinding[]> {\n const currentSkillIds = new Set(input.localSkills.map((skill) => skill.id));\n const roots = resolveCandidateSkillRoots(input);\n const targetCurrentSkillDirs = resolveTargetCurrentSkillDirs({\n targets: input.targets ?? [],\n currentSkillIds,\n });\n const skillIdsToAudit = new Set([\n ...LEGACY_OPENMELD_SKILL_IDS,\n ...currentSkillIds,\n ]);\n const findings: LegacyOpenMeldSkillFinding[] = [];\n\n for (const parentDir of roots) {\n for (const skillId of skillIdsToAudit) {\n const skillDir = join(parentDir, skillId);\n const finding = await inspectPotentialLegacyOpenMeldSkill({\n skillId,\n skillDir,\n parentDir,\n currentSkillIds,\n targetCurrentSkillDirs,\n });\n if (finding) {\n findings.push(finding);\n }\n }\n }\n\n return dedupeLegacyFindings(findings);\n}\n\nfunction resolveCandidateSkillRoots(input: {\n registry: Record<string, SkillsRegistryEntryLike>;\n targets?: SkillsInstallTarget[];\n}): string[] {\n const roots = new Set<string>();\n for (const agent of Object.values(input.registry)) {\n const root = normalizeAbsolutePath(agent.globalSkillsDir);\n if (root) {\n roots.add(root);\n }\n }\n for (const target of input.targets ?? []) {\n const root = normalizeAbsolutePath(target.dir);\n if (root) {\n roots.add(root);\n }\n }\n return [...roots].sort((left, right) => left.localeCompare(right));\n}\n\nfunction resolveTargetCurrentSkillDirs(input: {\n targets: SkillsInstallTarget[];\n currentSkillIds: Set<string>;\n}): Set<string> {\n const skillDirs = new Set<string>();\n for (const target of input.targets) {\n for (const skillId of input.currentSkillIds) {\n skillDirs.add(resolve(join(target.dir, skillId)));\n }\n }\n return skillDirs;\n}\n\nasync function inspectPotentialLegacyOpenMeldSkill(input: {\n skillId: string;\n skillDir: string;\n parentDir: string;\n currentSkillIds: Set<string>;\n targetCurrentSkillDirs: Set<string>;\n}): Promise<LegacyOpenMeldSkillFinding | null> {\n const skillDir = resolve(input.skillDir);\n const parentDir = resolve(input.parentDir);\n const stats = await stat(skillDir).catch(() => null);\n if (!stats?.isDirectory()) {\n return null;\n }\n\n const rawSkill = await readFile(join(skillDir, \"SKILL.md\"), \"utf8\").catch(\n () => \"\"\n );\n if (!rawSkill) {\n return null;\n }\n\n const marker = await readOpenMeldSkillMarker(skillDir);\n if (\n marker?.managedBy === \"openmeld\" &&\n marker.skillId === input.skillId &&\n input.currentSkillIds.has(input.skillId)\n ) {\n return null;\n }\n\n if (LEGACY_OPENMELD_SKILL_IDS.has(input.skillId)) {\n return {\n skillId: input.skillId,\n skillDir,\n parentDir,\n reasonCode: \"legacy_openmeld_skill_id\",\n problem:\n \"This is an old OpenMeld skill name. Agents can still load it and learn stale OpenMeld instructions.\",\n recommendation:\n \"Do not load or follow this skill. Install the current OpenMeld skill into this skill root, then remove or rename this legacy skill directory and rerun the OpenMeld skills check.\",\n currentInstallCommand: buildCurrentSkillInstallCommand(parentDir),\n cleanupCommands: buildLegacySkillCleanupCommands(skillDir),\n verificationCommand: LEGACY_OPENMELD_SKILL_VERIFICATION_COMMAND,\n };\n }\n\n if (\n input.currentSkillIds.has(input.skillId) &&\n !input.targetCurrentSkillDirs.has(skillDir) &&\n isLikelyOpenMeldSkillDocument(rawSkill)\n ) {\n return {\n skillId: input.skillId,\n skillDir,\n parentDir,\n reasonCode: \"unmanaged_current_openmeld_skill_copy\",\n problem:\n \"This looks like an OpenMeld skill copy, but this OpenMeld installation does not manage it.\",\n recommendation:\n \"Do not load or follow this unmanaged copy until the current OpenMeld-managed skill is installed for this skill root. Install the current skill, then remove or rename this directory if this agent should not use the unmanaged copy.\",\n currentInstallCommand: buildCurrentSkillInstallCommand(parentDir),\n cleanupCommands: buildLegacySkillCleanupCommands(skillDir),\n verificationCommand: LEGACY_OPENMELD_SKILL_VERIFICATION_COMMAND,\n };\n }\n\n return null;\n}\n\nfunction buildLegacySkillCleanupCommands(skillDir: string): string[] {\n return [\n `mv ${quoteShellArg(skillDir)} ${quoteShellArg(`${skillDir}.legacy`)}`,\n `rm -rf ${quoteShellArg(skillDir)}`,\n ];\n}\n\nfunction buildCurrentSkillInstallCommand(parentDir: string): string {\n return `openmeld skills ensure --dir ${quoteShellArg(parentDir)} --view agent`;\n}\n\nfunction quoteShellArg(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction isLikelyOpenMeldSkillDocument(rawSkill: string): boolean {\n const normalized = rawSkill.toLowerCase();\n return (\n normalized.includes(\"openmeld\") ||\n normalized.includes(\"openmeld cli\") ||\n normalized.includes(\"openmeld space action\") ||\n normalized.includes(\"openmeld skills\")\n );\n}\n\nfunction dedupeLegacyFindings(\n findings: LegacyOpenMeldSkillFinding[]\n): LegacyOpenMeldSkillFinding[] {\n const byPath = new Map<string, LegacyOpenMeldSkillFinding>();\n for (const finding of findings) {\n byPath.set(finding.skillDir, finding);\n }\n return [...byPath.values()].sort((left, right) =>\n `${left.skillId}:${left.skillDir}`.localeCompare(\n `${right.skillId}:${right.skillDir}`\n )\n );\n}\n\nfunction normalizeAbsolutePath(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? resolve(normalized) : null;\n}\n","import pc from \"picocolors\";\nimport {\n formatOpenMeldCliCommand,\n formatOpenMeldCliTextBlock,\n} from \"../runtime/cli-entry-command\";\nimport { type InfoCardRow, renderTextInfoCard } from \"../ui/info-card\";\nimport { outLine } from \"../ui/io\";\n\nexport const formatSkillsCopy = (text: string): string =>\n formatOpenMeldCliTextBlock(text);\nconst SKILLS_CARD_MIN_CONTENT_WIDTH = 56;\nexport function renderSkillsTextCard(input: {\n title: string;\n rows: InfoCardRow[];\n compact?: boolean;\n minContentWidth?: number;\n}): void {\n renderTextInfoCard({\n title: input.title,\n rows: input.rows,\n emitLine: outLine,\n compact: input.compact,\n minContentWidth: input.minContentWidth ?? SKILLS_CARD_MIN_CONTENT_WIDTH,\n horizontalPadding: 1,\n });\n}\n\nexport function formatSkillsStoreValue(storeDir: string): string {\n return pc.bold(pc.cyan(storeDir));\n}\n\nexport function formatSkillsCount(\n count: number,\n tone: \"green\" | \"yellow\" | \"red\" | \"neutral\"\n): string {\n if (count === 0) {\n return pc.dim(\"0\");\n }\n const value = pc.bold(String(count));\n if (tone === \"green\") {\n return pc.green(value);\n }\n if (tone === \"yellow\") {\n return pc.yellow(value);\n }\n if (tone === \"red\") {\n return pc.red(value);\n }\n return value;\n}\n\nexport function formatInlineCommandList(commands: string[]): string {\n return commands.map((command) => `\\`${command}\\``).join(\", \");\n}\n\nexport function formatSkillsCommand(command: string): string {\n return pc.bold(pc.cyan(formatOpenMeldCliCommand(command)));\n}\n","import pc from \"picocolors\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport type { LegacyOpenMeldSkillFinding } from \"../skills/legacy-audit\";\nimport type { InfoCardRow } from \"../ui/info-card\";\nimport { outLine } from \"../ui/io\";\nimport { formatInlineCommandList, renderSkillsTextCard } from \"./skills-format\";\n\nexport function emitLegacyOpenMeldSkillFindingsHumanCard(input: {\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): void {\n if (input.legacyFindings.length === 0) {\n return;\n }\n outLine(\"\");\n renderSkillsTextCard({\n title: `Legacy OpenMeld Skill Copies (${input.legacyFindings.length})`,\n rows: input.legacyFindings.map((finding) => ({\n label: finding.skillId,\n value: [\n `path: ${finding.skillDir}`,\n \"not managed by this OpenMeld installation\",\n finding.problem,\n finding.recommendation,\n `cleanup: ${finding.cleanupCommands.join(\" or \")}`,\n ].join(\" · \"),\n })),\n compact: true,\n });\n}\n\nexport function buildLegacyOpenMeldSkillNextStepRows(\n legacyFindings: LegacyOpenMeldSkillFinding[]\n): InfoCardRow[] {\n if (legacyFindings.length === 0) {\n return [];\n }\n const installCommands = buildLegacyOpenMeldSkillInstallCommands(\n legacyFindings\n ).map((command) => formatOpenMeldCliCommand(command));\n const verificationCommand = formatOpenMeldCliCommand(\n legacyFindings[0]?.verificationCommand ??\n \"openmeld skills check --view agent\"\n );\n return [\n {\n label: \"legacy OpenMeld skills\",\n value: pc.bold(\n [\n \"Do not read the listed legacy OpenMeld skill instructions.\",\n `Run ${formatInlineCommandList(installCommands)} for each affected skill root.`,\n \"After the install succeeds, rename or remove the legacy directories.\",\n `Then rerun \\`${verificationCommand}\\`.`,\n ].join(\" \")\n ),\n },\n ];\n}\n\nexport function formatLegacyOpenMeldSkillFindingsForAgentView(\n legacyFindings: LegacyOpenMeldSkillFinding[]\n): LegacyOpenMeldSkillFinding[] {\n return legacyFindings.map((finding) => ({\n ...finding,\n currentInstallCommand: formatOpenMeldCliCommand(\n finding.currentInstallCommand\n ),\n verificationCommand: formatOpenMeldCliCommand(finding.verificationCommand),\n }));\n}\n\nexport function buildLegacyOpenMeldSkillAgentReview(\n legacyFindings: LegacyOpenMeldSkillFinding[]\n): {\n priority: \"high\";\n reason: string;\n nextStep: string;\n nextActions: string[];\n installCommands: string[];\n paths: string[];\n cleanupCommands: string[];\n verificationCommand: string;\n} {\n const installCommands =\n buildLegacyOpenMeldSkillInstallCommands(legacyFindings);\n const verificationCommand =\n legacyFindings[0]?.verificationCommand ??\n \"openmeld skills check --view agent\";\n return {\n priority: \"high\",\n reason:\n \"Legacy or unmanaged OpenMeld skill copies can make agents read old OpenMeld instructions even when the current OpenMeld-managed skill is up to date.\",\n nextStep:\n \"Do not read or follow the listed legacy OpenMeld skill instructions. Run each install command, then remove or rename each listed legacy directory, then rerun the OpenMeld skills check.\",\n nextActions: [\n \"Do not read or follow instructions from the listed legacy OpenMeld skill directories.\",\n ...installCommands.map((command) => `Run ${command}.`),\n \"After the current OpenMeld skill install succeeds for that root, rename or remove each listed legacy directory. Prefer mv ... .legacy when you need reversible cleanup.\",\n `Rerun ${verificationCommand}.`,\n ],\n installCommands,\n paths: legacyFindings.map((finding) => finding.skillDir),\n cleanupCommands: legacyFindings.flatMap(\n (finding) => finding.cleanupCommands\n ),\n verificationCommand,\n };\n}\n\nfunction buildLegacyOpenMeldSkillInstallCommands(\n legacyFindings: LegacyOpenMeldSkillFinding[]\n): string[] {\n return [\n ...new Set(legacyFindings.map((finding) => finding.currentInstallCommand)),\n ].sort((left, right) => left.localeCompare(right));\n}\n\nexport function emitLegacyOpenMeldSkillAgentAttention(input: {\n legacyFindings: LegacyOpenMeldSkillFinding[];\n presenter: ReturnType<typeof createPresenter>;\n source: \"skills.check\" | \"skills.install\";\n}): void {\n if (input.legacyFindings.length === 0) {\n return;\n }\n\n const review = buildLegacyOpenMeldSkillAgentReview(input.legacyFindings);\n const directoryLabel =\n input.legacyFindings.length === 1 ? \"directory\" : \"directories\";\n const installCommands = review.installCommands.map((command) =>\n formatOpenMeldCliCommand(command)\n );\n const verificationCommand = formatOpenMeldCliCommand(\n review.verificationCommand\n );\n input.presenter.line({\n code: `${input.source}.legacy_attention_required`,\n text: [\n `attention required: found ${input.legacyFindings.length} legacy or unmanaged OpenMeld skill ${directoryLabel}: ${review.paths.join(\", \")}.`,\n \"These copies are outside the current OpenMeld-managed skill install and can make agents read old OpenMeld instructions.\",\n \"Do not read or follow those skill instructions.\",\n `Next: run ${formatInlineCommandList(installCommands)}.`,\n \"After the current skill is installed, rename or remove each listed directory; OpenMeld will not do this automatically.\",\n `Then rerun \\`${verificationCommand}\\`.`,\n ].join(\" \"),\n data: {\n legacyFindingCount: input.legacyFindings.length,\n legacyFindings: input.legacyFindings,\n legacyReview: review,\n },\n });\n}\n","export const INSTALL_RECORD_GROUP_SEPARATOR = \"::\";\n\nexport function toTargetKey(targetId: string, targetDir: string): string {\n return `${targetId}${INSTALL_RECORD_GROUP_SEPARATOR}${targetDir}`;\n}\n","import { cancel } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { RuntimeSkillsCustomTarget } from \"../config/runtime-config\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommand,\n} from \"../runtime/cli-entry-command\";\nimport type { resolveSkillsAgentRegistry } from \"../skills/agents\";\nimport type { SkillsInstallTarget } from \"../skills/installer\";\nimport type { LegacyOpenMeldSkillFinding } from \"../skills/legacy-audit\";\nimport type { SkillInstallStateResult } from \"../skills/state\";\nimport type { InfoCardRow } from \"../ui/info-card\";\nimport { outLine } from \"../ui/io\";\nimport { promptSearchSelect, type SearchSelectItem } from \"../ui/search-select\";\nimport {\n formatSkillsCommand,\n formatSkillsCount,\n formatSkillsStoreValue,\n renderSkillsTextCard,\n} from \"./skills-format\";\nimport { buildLegacyOpenMeldSkillNextStepRows } from \"./skills-legacy-audit-view\";\nimport { toTargetKey } from \"./skills-target-key\";\n\nexport const SKILLS_CHECK_INTERACTIVE_MAX_VISIBLE = 8;\n\nexport type SkillsCheckTargetState = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n targetLabel: string;\n targetName: string;\n targetNameKind: \"agent\" | \"custom\";\n installed: boolean;\n latest: boolean;\n missingSkillIds: string[];\n outdatedSkillIds: string[];\n conflictSkillIds: string[];\n};\n\nexport type SkillsCheckTargetAccumulator = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n targetLabel: string;\n targetName: string;\n targetNameKind: \"agent\" | \"custom\";\n missingSkillIds: Set<string>;\n outdatedSkillIds: Set<string>;\n upToDateSkillIds: Set<string>;\n conflictSkillIds: Set<string>;\n};\n\nexport type SkillsCheckNavigationResult = \"completed\" | \"back\" | \"cancelled\";\n\nexport async function runInteractiveSkillsCheckViewer(input: {\n storeDir: string;\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n targetStates: SkillsCheckTargetState[];\n allowBackToCaller: boolean;\n}): Promise<SkillsCheckNavigationResult> {\n const selected = await promptSearchSelect({\n message: \"OpenMeld skills status\",\n items: buildSkillsCheckInteractiveItems(input.targetStates),\n maxVisible: SKILLS_CHECK_INTERACTIVE_MAX_VISIBLE,\n emptyLabel: \"No agents or saved OpenMeld skill targets found\",\n allowBack: true,\n backLabel: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n readOnly: true,\n summaryCard: buildSkillsCheckSummaryCard(input),\n });\n if (selected.status === \"cancelled\") {\n cancel(\"Cancelled.\");\n return \"cancelled\";\n }\n if (selected.status === \"back\") {\n if (!input.allowBackToCaller) {\n cancel(\"Cancelled.\");\n return \"cancelled\";\n }\n return \"back\";\n }\n return \"completed\";\n}\n\nfunction buildSkillsCheckInteractiveItems(\n targetStates: SkillsCheckTargetState[]\n): SearchSelectItem<string>[] {\n return targetStates.map((target) => buildSkillsCheckTargetSearchItem(target));\n}\n\nfunction buildSkillsCheckSummaryCard(input: {\n storeDir: string;\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): {\n title: string;\n rows: InfoCardRow[];\n compact: boolean;\n} {\n return {\n title: \"Summary\",\n rows: [\n {\n label: \"Status\",\n value: resolveSkillsCheckInteractiveSummaryLabel(input),\n },\n {\n label: \"Summary\",\n value: formatSkillsCheckSummaryCounts(input),\n },\n {\n label: \"Legacy OpenMeld skills\",\n value: String(input.legacyFindings.length),\n },\n {\n label: \"Store directory\",\n value: input.storeDir,\n },\n ...buildSkillsCheckSummaryNextStepRows(input),\n ],\n compact: true,\n };\n}\n\nfunction resolveSkillsCheckInteractiveSummaryLabel(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): string {\n if (input.legacyFindings.length > 0) {\n return \"⚠ Legacy OpenMeld skill copies need review\";\n }\n if (input.targetCount === 0) {\n return \"ℹ No agents or saved OpenMeld skills installs\";\n }\n if (\n input.summary.outdated === 0 &&\n input.summary.missing === 0 &&\n input.summary.externalConflict === 0\n ) {\n return \"✅ OpenMeld skills are up to date on all detected agents and saved installs\";\n }\n if (input.summary.missing > 0 || input.summary.externalConflict > 0) {\n return \"⚠ OpenMeld skills need setup\";\n }\n return \"▲ OpenMeld skill updates are available\";\n}\n\nfunction formatSkillsCheckSummaryCounts(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n}): string {\n return [\n `${input.targetCount} targets`,\n `${input.summary.upToDate} up to date`,\n `${input.summary.outdated} outdated`,\n `${input.summary.missing} missing`,\n `${input.summary.externalConflict} need review`,\n ].join(\" · \");\n}\n\nfunction buildSkillsCheckTargetSearchItem(\n target: SkillsCheckTargetState\n): SearchSelectItem<string> {\n const status = resolveSkillsCheckTargetStatus(target);\n const detailParts = [\n `${target.targetNameKind} target`,\n `ID ${target.targetId}`,\n target.targetDir,\n ];\n const issueDetail = resolveSkillsCheckTargetIssueDetail(target);\n if (issueDetail) {\n detailParts.push(issueDetail);\n }\n\n return {\n value: `target:${target.targetId}:${target.targetDir}`,\n label: `${status.icon} ${target.targetName}`,\n hint: status.label,\n detail: detailParts.join(\" · \"),\n searchText: [\n status.label,\n target.targetName,\n target.targetId,\n target.targetDir,\n target.targetType,\n ...target.outdatedSkillIds,\n ...target.missingSkillIds,\n ...target.conflictSkillIds,\n ].join(\" \"),\n };\n}\n\nfunction resolveSkillsCheckTargetStatus(target: SkillsCheckTargetState): {\n label: string;\n icon: string;\n} {\n if (target.conflictSkillIds.length > 0) {\n return { label: \"Needs review\", icon: \"✖\" };\n }\n if (target.missingSkillIds.length > 0 && target.outdatedSkillIds.length > 0) {\n return { label: \"Missing and outdated\", icon: \"⚠\" };\n }\n if (target.missingSkillIds.length > 0) {\n return { label: \"Missing\", icon: \"⚠\" };\n }\n if (target.outdatedSkillIds.length > 0) {\n return { label: \"Outdated\", icon: \"▲\" };\n }\n if (target.latest) {\n return { label: \"Up to date\", icon: \"✓\" };\n }\n if (target.installed) {\n return { label: \"Installed\", icon: \"•\" };\n }\n return { label: \"Tracked\", icon: \"•\" };\n}\n\nfunction resolveSkillsCheckTargetIssueDetail(\n target: SkillsCheckTargetState\n): string | null {\n const details: string[] = [];\n if (target.outdatedSkillIds.length > 0) {\n details.push(`outdated skills: ${target.outdatedSkillIds.join(\", \")}`);\n }\n if (target.missingSkillIds.length > 0) {\n details.push(`missing skills: ${target.missingSkillIds.join(\", \")}`);\n }\n if (target.conflictSkillIds.length > 0) {\n details.push(`non-OpenMeld skills: ${target.conflictSkillIds.join(\", \")}`);\n }\n return details.length > 0 ? details.join(\" · \") : null;\n}\n\nfunction buildSkillsCheckSummaryNextStepRows(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n}): InfoCardRow[] {\n if (input.targetCount === 0) {\n return [\n {\n label: \"Next step\",\n value: `Install first with ${formatOpenMeldCliCommand(\"openmeld skills install\")}`,\n },\n ];\n }\n\n const summary = input.summary;\n const rows: InfoCardRow[] = [];\n if (\n summary.outdated === 0 &&\n summary.missing === 0 &&\n summary.externalConflict === 0\n ) {\n return [\n {\n label: \"Next step\",\n value: \"No action needed\",\n },\n ];\n }\n if (summary.missing > 0) {\n rows.push({\n label: \"Install missing\",\n value: [\n formatOpenMeldCliCommand(\"openmeld skills install --all\"),\n formatOpenMeldCliCommand(\"openmeld skills install --agent <id...>\"),\n ].join(\" or \"),\n });\n }\n if (summary.outdated > 0) {\n rows.push({\n label: \"Update outdated\",\n value: formatOpenMeldCliCommand(\"openmeld skills update\"),\n });\n }\n if (summary.externalConflict > 0) {\n rows.push({\n label: \"Review non-OpenMeld skills\",\n value: `Rename or remove non-OpenMeld skills, then rerun ${formatOpenMeldCliCommand(\n \"openmeld skills install --all\"\n )}`,\n });\n }\n return rows;\n}\n\nexport function emitSkillsCheckHumanSummaryCard(input: {\n storeDir: string;\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Status\",\n rows: [\n {\n label: \"status\",\n value: resolveSkillsCheckHumanStatus({\n targetCount: input.targetCount,\n summary: input.summary,\n legacyFindings: input.legacyFindings,\n }),\n },\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"targets\",\n value: formatSkillsCount(input.targetCount, \"neutral\"),\n },\n {\n label: \"up-to-date\",\n value: formatSkillsCount(input.summary.upToDate, \"green\"),\n },\n {\n label: \"outdated\",\n value: formatSkillsCount(input.summary.outdated, \"yellow\"),\n },\n {\n label: \"missing\",\n value: formatSkillsCount(input.summary.missing, \"red\"),\n },\n {\n label: \"needs review\",\n value: formatSkillsCount(input.summary.externalConflict, \"red\"),\n },\n {\n label: \"legacy OpenMeld skills\",\n value: formatSkillsCount(input.legacyFindings.length, \"red\"),\n },\n ],\n });\n}\n\nfunction resolveSkillsCheckHumanStatus(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): string {\n if (input.legacyFindings.length > 0) {\n return `${pc.red(\"✖\")} Legacy OpenMeld skill copies need review.`;\n }\n if (input.targetCount === 0) {\n return `${pc.yellow(\"○\")} No agents or saved OpenMeld skills installs were found.`;\n }\n if (\n input.summary.outdated === 0 &&\n input.summary.missing === 0 &&\n input.summary.externalConflict === 0\n ) {\n return `${pc.green(\"✅\")} OpenMeld skills are up to date on all detected agents and saved installs.`;\n }\n if (input.summary.missing > 0 || input.summary.externalConflict > 0) {\n return `${pc.red(\"✖\")} OpenMeld skills need setup.`;\n }\n return `${pc.yellow(\"▲\")} OpenMeld skill updates are available.`;\n}\n\nexport function emitSkillsCheckHumanTargetCards(input: {\n targetStates: SkillsCheckTargetState[];\n}): void {\n const hasActionableTargets = input.targetStates.some(\n (target) =>\n target.outdatedSkillIds.length > 0 ||\n target.missingSkillIds.length > 0 ||\n target.conflictSkillIds.length > 0\n );\n if (!hasActionableTargets) {\n const readyTargets = input.targetStates.filter((target) => target.latest);\n if (readyTargets.length > 0) {\n emitSkillsCheckCard({\n title: \"Up-to-date Installs\",\n targets: readyTargets,\n });\n }\n return;\n }\n\n const outdatedTargets = input.targetStates.filter(\n (target) => target.outdatedSkillIds.length > 0\n );\n const missingTargets = input.targetStates.filter(\n (target) => target.missingSkillIds.length > 0\n );\n const conflictTargets = input.targetStates.filter(\n (target) => target.conflictSkillIds.length > 0\n );\n\n if (outdatedTargets.length > 0) {\n emitSkillsCheckCard({\n title: \"Updates Available\",\n targets: outdatedTargets,\n detailMode: \"outdated\",\n });\n }\n if (missingTargets.length > 0) {\n emitSkillsCheckCard({\n title: \"Missing Skills\",\n targets: missingTargets,\n detailMode: \"missing\",\n });\n }\n if (conflictTargets.length > 0) {\n emitSkillsCheckCard({\n title: \"Needs Review\",\n targets: conflictTargets,\n detailMode: \"conflict\",\n });\n }\n}\n\nfunction emitSkillsCheckCard(input: {\n title: string;\n targets: SkillsCheckTargetState[];\n detailMode?: \"outdated\" | \"missing\" | \"conflict\";\n}): void {\n outLine(\"\");\n renderSkillsTextCard({\n title: `${input.title} (${input.targets.length})`,\n rows:\n input.targets.length > 0\n ? input.targets.map((target) =>\n buildSkillsCheckHumanTargetRow({\n target,\n detailMode: input.detailMode,\n })\n )\n : [\n {\n label: \"status\",\n value: pc.dim(\"none\"),\n },\n ],\n compact: true,\n });\n}\n\nfunction buildSkillsCheckHumanTargetRow(input: {\n target: SkillsCheckTargetState;\n detailMode?: \"outdated\" | \"missing\" | \"conflict\";\n}): InfoCardRow {\n const targetMeta = [\n pc.dim(`${input.target.targetNameKind} (${input.target.targetId})`),\n pc.dim(`dir: ${input.target.targetDir}`),\n ];\n\n const issueDetail = resolveSkillsCheckHumanIssueDetail(input);\n if (issueDetail) {\n targetMeta.push(issueDetail);\n }\n\n return {\n label: [\n resolveSkillsCheckHumanTargetMarker(input),\n formatSkillsCheckTargetNameForHuman(input.target),\n ].join(\" \"),\n value: targetMeta.join(` ${pc.dim(\"·\")} `),\n };\n}\n\nfunction resolveSkillsCheckHumanTargetMarker(input: {\n target: SkillsCheckTargetState;\n detailMode?: \"outdated\" | \"missing\" | \"conflict\";\n}): string {\n if (\n input.detailMode === \"conflict\" ||\n input.target.conflictSkillIds.length > 0\n ) {\n return pc.red(\"✖\");\n }\n if (\n input.detailMode === \"missing\" ||\n input.target.missingSkillIds.length > 0\n ) {\n return pc.red(\"⚠\");\n }\n if (\n input.detailMode === \"outdated\" ||\n input.target.outdatedSkillIds.length > 0\n ) {\n return pc.yellow(\"▲\");\n }\n if (input.target.latest) {\n return pc.green(\"✓\");\n }\n if (input.target.installed) {\n return pc.cyan(\"•\");\n }\n return pc.dim(\"•\");\n}\n\nfunction formatSkillsCheckTargetNameForHuman(\n target: SkillsCheckTargetState\n): string {\n const displayName =\n target.targetNameKind === \"agent\"\n ? pc.cyan(target.targetName)\n : target.targetName;\n return pc.bold(displayName);\n}\n\nfunction resolveSkillsCheckHumanIssueDetail(input: {\n target: SkillsCheckTargetState;\n detailMode?: \"outdated\" | \"missing\" | \"conflict\";\n}): string | null {\n if (\n input.detailMode === \"outdated\" &&\n input.target.outdatedSkillIds.length > 0\n ) {\n return pc.yellow(\n `outdated skills: ${input.target.outdatedSkillIds.join(\", \")}`\n );\n }\n if (\n input.detailMode === \"missing\" &&\n input.target.missingSkillIds.length > 0\n ) {\n return pc.red(`missing skills: ${input.target.missingSkillIds.join(\", \")}`);\n }\n if (\n input.detailMode === \"conflict\" &&\n input.target.conflictSkillIds.length > 0\n ) {\n return pc.red(\n `non-OpenMeld skills: ${input.target.conflictSkillIds.join(\", \")}`\n );\n }\n return null;\n}\n\nexport function emitSkillsCheckHumanNextStepsCard(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings: LegacyOpenMeldSkillFinding[];\n}): void {\n const rows = buildSkillsCheckHumanNextStepRows(input);\n if (rows.length === 0) {\n return;\n }\n outLine(\"\");\n renderSkillsTextCard({\n title: \"Next Steps\",\n rows,\n compact: true,\n });\n}\n\nexport function buildSkillsCheckHumanNextStepRows(input: {\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n legacyFindings?: LegacyOpenMeldSkillFinding[];\n}): InfoCardRow[] {\n const legacyRows = buildLegacyOpenMeldSkillNextStepRows(\n input.legacyFindings ?? []\n );\n if (input.targetCount === 0) {\n return [\n ...legacyRows,\n {\n label: \"known agents\",\n value: formatSkillsCommand(\"openmeld skills install --all\"),\n },\n {\n label: \"custom path\",\n value: formatSkillsCommand(\n \"openmeld skills install --dir <absolute-path>\"\n ),\n },\n ];\n }\n\n const rows: InfoCardRow[] = [];\n rows.push(...legacyRows);\n if (input.summary.missing > 0) {\n rows.push({\n label: \"install missing\",\n value: pc.bold(\n formatInlineOpenMeldCliCommands(\n \"Run `openmeld skills install --all` or `openmeld skills install --agent <id...>` to install missing OpenMeld skills.\"\n )\n ),\n });\n }\n if (input.summary.outdated > 0) {\n rows.push({\n label: \"update outdated\",\n value: pc.bold(\n formatInlineOpenMeldCliCommands(\n \"Run `openmeld skills update` to update OpenMeld CLI skills to the latest version.\"\n )\n ),\n });\n }\n if (input.summary.externalConflict > 0) {\n rows.push({\n label: \"review non-OpenMeld skills\",\n value: pc.bold(\n formatInlineOpenMeldCliCommands(\n \"Review the listed non-OpenMeld skills. OpenMeld will not overwrite them automatically. Rename or remove the ones you do not need, then run `openmeld skills install --all`.\"\n )\n ),\n });\n }\n return rows;\n}\n\nexport function summarizeSkillsCheckTargets(input: {\n targets: SkillsInstallTarget[];\n states: SkillInstallStateResult[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargets: RuntimeSkillsCustomTarget[];\n}): SkillsCheckTargetState[] {\n const customTargetNameByDir = new Map(\n input.customTargets.map((target) => [target.dir, target.name])\n );\n const targetByKey = new Map<string, SkillsCheckTargetAccumulator>();\n\n for (const target of input.targets) {\n const key = toTargetKey(target.id, target.dir);\n targetByKey.set(key, {\n ...createSkillsCheckTargetAccumulator({\n targetId: target.id,\n targetDir: target.dir,\n targetType: target.type,\n registry: input.registry,\n customTargetNameByDir,\n }),\n });\n }\n\n for (const state of input.states) {\n const key = toTargetKey(state.targetId, state.targetDir);\n const target =\n targetByKey.get(key) ??\n createSkillsCheckTargetAccumulator({\n targetId: state.targetId,\n targetDir: state.targetDir,\n targetType: state.targetType,\n registry: input.registry,\n customTargetNameByDir,\n });\n if (!targetByKey.has(key)) {\n targetByKey.set(key, target);\n }\n\n applySkillStateToTargetAccumulator(target, state);\n }\n\n return [...targetByKey.values()]\n .map(projectSkillsCheckTargetState)\n .sort((left, right) =>\n `${left.targetType}:${left.targetId}:${left.targetDir}`.localeCompare(\n `${right.targetType}:${right.targetId}:${right.targetDir}`\n )\n );\n}\n\nfunction createSkillsCheckTargetAccumulator(input: {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetNameByDir: Map<string, string>;\n}): SkillsCheckTargetAccumulator {\n const identity = resolveSkillsCheckTargetIdentity({\n targetId: input.targetId,\n targetDir: input.targetDir,\n targetType: input.targetType,\n registry: input.registry,\n customTargetNameByDir: input.customTargetNameByDir,\n });\n return {\n targetId: input.targetId,\n targetDir: input.targetDir,\n targetType: input.targetType,\n targetLabel: identity.targetLabel,\n targetName: identity.targetName,\n targetNameKind: identity.targetNameKind,\n missingSkillIds: new Set<string>(),\n outdatedSkillIds: new Set<string>(),\n upToDateSkillIds: new Set<string>(),\n conflictSkillIds: new Set<string>(),\n };\n}\n\nfunction resolveSkillsCheckTargetIdentity(input: {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n customTargetNameByDir: Map<string, string>;\n}): {\n targetLabel: string;\n targetName: string;\n targetNameKind: \"agent\" | \"custom\";\n} {\n if (input.targetType === \"agent\") {\n const targetName = resolveAgentDisplayName({\n targetId: input.targetId,\n registry: input.registry,\n });\n return {\n targetLabel: `agent ${targetName} (${input.targetId})`,\n targetName,\n targetNameKind: \"agent\",\n };\n }\n\n const customName = input.customTargetNameByDir.get(input.targetDir);\n const targetName = customName ?? input.targetId;\n if (targetName === input.targetId) {\n return {\n targetLabel: `custom ${input.targetId}`,\n targetName,\n targetNameKind: \"custom\",\n };\n }\n return {\n targetLabel: `custom ${targetName} (${input.targetId})`,\n targetName,\n targetNameKind: \"custom\",\n };\n}\n\nfunction applySkillStateToTargetAccumulator(\n target: SkillsCheckTargetAccumulator,\n state: SkillInstallStateResult\n): void {\n if (state.state === \"missing\") {\n target.missingSkillIds.add(state.skillId);\n return;\n }\n if (state.state === \"outdated\") {\n target.outdatedSkillIds.add(state.skillId);\n return;\n }\n if (state.state === \"up_to_date\") {\n target.upToDateSkillIds.add(state.skillId);\n return;\n }\n target.conflictSkillIds.add(state.skillId);\n}\n\nfunction projectSkillsCheckTargetState(\n target: SkillsCheckTargetAccumulator\n): SkillsCheckTargetState {\n const missingSkillIds = [...target.missingSkillIds].sort((a, b) =>\n a.localeCompare(b)\n );\n const outdatedSkillIds = [...target.outdatedSkillIds].sort((a, b) =>\n a.localeCompare(b)\n );\n const conflictSkillIds = [...target.conflictSkillIds].sort((a, b) =>\n a.localeCompare(b)\n );\n const installed =\n target.upToDateSkillIds.size > 0 || target.outdatedSkillIds.size > 0;\n const latest =\n installed &&\n missingSkillIds.length === 0 &&\n outdatedSkillIds.length === 0 &&\n conflictSkillIds.length === 0;\n return {\n targetId: target.targetId,\n targetDir: target.targetDir,\n targetType: target.targetType,\n targetLabel: target.targetLabel,\n targetName: target.targetName,\n targetNameKind: target.targetNameKind,\n installed,\n latest,\n missingSkillIds,\n outdatedSkillIds,\n conflictSkillIds,\n };\n}\n\nfunction resolveAgentDisplayName(input: {\n targetId: string;\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n}): string {\n return input.registry[input.targetId]?.displayName ?? input.targetId;\n}\n","import pc from \"picocolors\";\nimport { skillsDir } from \"../config/paths\";\nimport { formatInlineOpenMeldCliCommands } from \"../runtime/cli-entry-command\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport type { SkillsInstallResult } from \"../skills/installer\";\nimport type { LegacyOpenMeldSkillFinding } from \"../skills/legacy-audit\";\nimport { buildSkillsTargetSelectionExamples } from \"../skills/target-selection-contract\";\nimport type { InfoCardRow } from \"../ui/info-card\";\nimport { outLine } from \"../ui/io\";\nimport { buildSkillsCheckHumanNextStepRows } from \"./skills-check\";\nimport {\n formatSkillsCommand,\n formatSkillsCopy,\n formatSkillsCount,\n formatSkillsStoreValue,\n renderSkillsTextCard,\n} from \"./skills-format\";\nimport { emitLegacyOpenMeldSkillFindingsHumanCard } from \"./skills-legacy-audit-view\";\n\nfunction buildLocalSkillsListRows(\n skills: Array<{\n name: string;\n relativePath: string;\n }>\n): InfoCardRow[] {\n if (skills.length === 0) {\n return [\n {\n label: \"status\",\n value: pc.dim(\"none\"),\n },\n ];\n }\n\n return skills.map((skill) => ({\n label: pc.bold(skill.name),\n value: pc.dim(skill.relativePath),\n }));\n}\n\nexport function emitSkillsListHumanCards(input: {\n storeDir: string;\n skills: Array<{\n id: string;\n name: string;\n relativePath: string;\n absolutePath: string;\n }>;\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Store\",\n rows: [\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"available\",\n value: formatSkillsCount(input.skills.length, \"green\"),\n },\n ],\n });\n\n outLine(\"\");\n renderSkillsTextCard({\n title: `Local OpenMeld Skills (${input.skills.length})`,\n rows: buildLocalSkillsListRows(input.skills),\n compact: true,\n });\n}\n\nexport function emitSkillsUpdateHumanResultCards(input: {\n storeDir: string;\n targetCount: number;\n summary: {\n upToDate: number;\n outdated: number;\n missing: number;\n externalConflict: number;\n };\n status: \"no_targets\" | \"up_to_date\";\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Update\",\n rows: [\n {\n label: \"status\",\n value:\n input.status === \"no_targets\"\n ? `${pc.yellow(\"○\")} No tracked OpenMeld skills install targets found.`\n : `${pc.green(\"✅\")} All tracked OpenMeld skills are up to date.`,\n },\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"tracked targets\",\n value: formatSkillsCount(input.targetCount, \"neutral\"),\n },\n {\n label: \"up-to-date\",\n value: formatSkillsCount(input.summary.upToDate, \"green\"),\n },\n {\n label: \"outdated\",\n value: formatSkillsCount(input.summary.outdated, \"yellow\"),\n },\n {\n label: \"missing\",\n value: formatSkillsCount(input.summary.missing, \"red\"),\n },\n ],\n });\n\n if (input.status === \"no_targets\") {\n outLine(\"\");\n renderSkillsTextCard({\n title: \"Next Steps\",\n rows: [\n {\n label: \"install first\",\n value: pc.bold(\n formatInlineOpenMeldCliCommands(\n \"Install first with `openmeld skills install`.\"\n )\n ),\n },\n ...buildSkillsCheckHumanNextStepRows({\n targetCount: 0,\n summary: input.summary,\n }),\n ],\n compact: true,\n });\n }\n}\n\nfunction emitSkillsHelpCards(input: {\n storeDir: string;\n commands: Array<{\n command: string;\n description: string;\n }>;\n customAgentSteps: string[];\n knownAgentIds: string[];\n skills: Array<{\n id: string;\n name: string;\n relativePath: string;\n absolutePath: string;\n }>;\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Command Reference\",\n rows: input.commands.map((entry) => ({\n label: formatSkillsCommand(entry.command),\n value: pc.dim(entry.description),\n })),\n compact: true,\n });\n\n outLine(\"\");\n renderSkillsTextCard({\n title: \"Custom Agent Install\",\n rows: input.customAgentSteps.map((step, index) => ({\n label: String(index + 1),\n value: formatSkillsCopy(step),\n })),\n compact: true,\n });\n\n outLine(\"\");\n renderSkillsTextCard({\n title: \"OpenMeld Skills Store\",\n rows: [\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"known agents\",\n value:\n input.knownAgentIds.length > 0\n ? pc.bold(input.knownAgentIds.join(\", \"))\n : pc.dim(\"none\"),\n },\n {\n label: \"local skills\",\n value: formatSkillsCount(input.skills.length, \"green\"),\n },\n ],\n });\n\n outLine(\"\");\n renderSkillsTextCard({\n title: `Local OpenMeld Skills (${input.skills.length})`,\n rows: buildLocalSkillsListRows(input.skills),\n compact: true,\n });\n}\n\nexport function emitInstallSummaryCardsForHuman(input: {\n storeDir: string;\n summary: {\n installed: number;\n skipped: number;\n failed: number;\n degradedToCopy: number;\n };\n installedTargets: Array<{\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillIds: string[];\n }>;\n legacyFindings: LegacyOpenMeldSkillFinding[];\n skipped: SkillsInstallResult[];\n failed: SkillsInstallResult[];\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Installation Summary\",\n rows: [\n { label: \"Store\", value: formatSkillsStoreValue(input.storeDir) },\n {\n label: \"Installed\",\n value: formatSkillsCount(input.summary.installed, \"green\"),\n },\n {\n label: \"Skipped\",\n value: formatSkillsCount(input.summary.skipped, \"yellow\"),\n },\n {\n label: \"Failed\",\n value: formatSkillsCount(input.summary.failed, \"red\"),\n },\n {\n label: \"Copied instead of linked\",\n value: formatSkillsCount(input.summary.degradedToCopy, \"neutral\"),\n },\n ],\n });\n\n if (input.installedTargets.length > 0) {\n outLine(\"\");\n renderSkillsTextCard({\n title: `Installed Targets (${input.installedTargets.length})`,\n rows: input.installedTargets.map((target) => ({\n label:\n target.targetType === \"agent\"\n ? `🤖 ${target.targetId}`\n : `🧩 ${target.targetDir}`,\n value: target.skillIds.join(\", \"),\n })),\n });\n }\n\n if (input.skipped.length > 0) {\n outLine(\"\");\n renderSkillsTextCard({\n title: `Skipped Items (${input.skipped.length})`,\n rows: input.skipped.map((entry) => ({\n label: `${entry.skillId} -> ${entry.targetId}`,\n value: entry.reason ?? \"skipped\",\n })),\n });\n }\n\n if (input.failed.length > 0) {\n outLine(\"\");\n renderSkillsTextCard({\n title: `Failed Items (${input.failed.length})`,\n rows: input.failed.map((entry) => ({\n label: `${entry.skillId} -> ${entry.targetId}`,\n value: entry.reason ?? \"unknown error\",\n })),\n });\n }\n\n emitLegacyOpenMeldSkillFindingsHumanCard({\n legacyFindings: input.legacyFindings,\n });\n}\n\nexport function emitManualInstallGuide(input: {\n agentExampleArg: string;\n command?: \"ensure\" | \"install\";\n resolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n}): void {\n const command = input.command ?? \"install\";\n const examples = buildSkillsTargetSelectionExamples({\n agentExampleArg: input.agentExampleArg,\n command,\n });\n const lines = [\n `OpenMeld local skills directory: ${skillsDir()}`,\n \"Use the folder above as the source of truth for OpenMeld skills.\",\n `For known agents, run: ${examples[0]}`,\n `For a custom agent path, run: ${examples[2]}`,\n ];\n\n if (input.resolvedView === \"agent\") {\n input.presenter.data({\n code: `skills.${command}.guide`,\n payload: {\n storeDir: skillsDir(),\n steps: lines,\n },\n });\n return;\n }\n\n renderSkillsTextCard({\n title: \"OpenMeld Skills Manual Install\",\n rows: [\n {\n label: \"local skills directory\",\n value: pc.bold(pc.cyan(skillsDir())),\n },\n {\n label: \"source of truth\",\n value: pc.dim(\n formatSkillsCopy(\n \"Use the folder above as the source of truth for OpenMeld skills.\"\n )\n ),\n },\n {\n label: \"\",\n value: \"\",\n },\n {\n label: \"known agents\",\n value: formatSkillsCommand(\n examples[0] ?? \"openmeld skills install --all\"\n ),\n },\n {\n label: \"custom agent path\",\n value: formatSkillsCommand(\n examples[2] ?? \"openmeld skills install --dir <absolute-path>\"\n ),\n },\n ],\n });\n}\n\nexport function emitSkillsHelp(input: {\n resolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n knownAgentIds: string[];\n agentExampleArg: string;\n skills: Array<{\n id: string;\n name: string;\n relativePath: string;\n absolutePath: string;\n }>;\n}): void {\n const installExamples = buildSkillsTargetSelectionExamples({\n agentExampleArg: input.agentExampleArg,\n command: \"install\",\n });\n const uninstallExamples = buildSkillsTargetSelectionExamples({\n agentExampleArg: input.agentExampleArg,\n command: \"uninstall\",\n });\n const commands = [\n {\n command: \"openmeld skills\",\n description:\n \"Show this guide in non-interactive mode, or open interactive skills menu in human TTY mode\",\n },\n {\n command: \"openmeld skills list\",\n description:\n \"List all OpenMeld skills available in this OpenMeld installation\",\n },\n {\n command: \"openmeld skills check\",\n description: \"Check OpenMeld skills on your agents and saved installs\",\n },\n {\n command: \"openmeld skills update\",\n description: \"Update saved OpenMeld skill installs to the latest version\",\n },\n {\n command: installExamples[0] ?? \"openmeld skills install --all\",\n description: \"Install OpenMeld skills to all detected known agents\",\n },\n {\n command:\n installExamples[1] ??\n `openmeld skills install --agent ${input.agentExampleArg}`,\n description:\n \"Install OpenMeld skills to one or more known agents by id (space-separated)\",\n },\n {\n command:\n installExamples[2] ?? \"openmeld skills install --dir <absolute-path>\",\n description:\n \"Install OpenMeld skills to a custom agent skills directory (for unknown/custom agents)\",\n },\n {\n command: installExamples[3] ?? \"openmeld skills install --guide\",\n description:\n \"Print manual install guide and source OpenMeld skills directory\",\n },\n {\n command: uninstallExamples[0] ?? \"openmeld skills uninstall --all\",\n description: \"Uninstall OpenMeld skills from all detected known agents\",\n },\n {\n command:\n uninstallExamples[1] ??\n `openmeld skills uninstall --agent ${input.agentExampleArg}`,\n description:\n \"Uninstall OpenMeld skills from one or more known agents by id (space-separated)\",\n },\n {\n command:\n uninstallExamples[2] ??\n \"openmeld skills uninstall --dir <absolute-path>\",\n description:\n \"Uninstall OpenMeld skills from a custom agent skills directory (for unknown/custom agents)\",\n },\n ];\n\n const customAgentSteps = [\n \"Find your agent's skills directory path.\",\n \"Run `openmeld skills install --dir <absolute-path>` to install OpenMeld skills.\",\n \"If you do not know the path, run `openmeld skills install --guide`.\",\n ];\n\n if (input.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"skills.help\",\n payload: {\n mode: \"non-interactive\",\n storeDir: skillsDir(),\n commands,\n customAgentSteps,\n knownAgentIds: input.knownAgentIds,\n skills: input.skills,\n },\n });\n return;\n }\n\n emitSkillsHelpCards({\n storeDir: skillsDir(),\n commands,\n customAgentSteps,\n knownAgentIds: input.knownAgentIds,\n skills: input.skills,\n });\n}\n","import { realpathSync } from \"node:fs\";\nimport { lstat, readlink, rm, stat } from \"node:fs/promises\";\nimport {\n basename,\n dirname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from \"node:path\";\nimport { cancel, isCancel, select } from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolveInstallableAgentExamplePair } from \"../agents/command-examples\";\nimport { openMeldRootDir, skillsDir } from \"../config/paths\";\nimport {\n getConfiguredSkillsConfig,\n type RuntimeSkillsConfig,\n type RuntimeSkillsCustomTarget,\n type RuntimeSkillsInstallRecord,\n resolveRuntimeSkillsCustomTargetId,\n setConfiguredSkillsConfig,\n updateConfiguredSkillsConfig,\n} from \"../config/runtime-config\";\nimport { formatInlineOpenMeldCliCommands } from \"../runtime/cli-entry-command\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport {\n createSkillsActionGuideError,\n createSkillsMenuGuideError,\n} from \"../runtime/dual-view-guide-catalog\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport { createPresenter } from \"../runtime/presenter/index\";\nimport { emitSkillsAgentOverview } from \"../skills/agent-overview\";\nimport {\n canManageRegistryAgentSkillTargets,\n detectInstalledSkillsAgents,\n resolveSkillsAgentRegistry,\n} from \"../skills/agents\";\nimport {\n installSkillsToTargets,\n type SkillsInstallResult,\n type SkillsInstallTarget,\n withSkillsInstallLock,\n} from \"../skills/installer\";\nimport {\n detectLegacyOpenMeldSkillCopies,\n type LegacyOpenMeldSkillFinding,\n} from \"../skills/legacy-audit\";\nimport { resolveSkillsInstallStates } from \"../skills/state\";\nimport {\n ensureLocalSkills,\n isOpenMeldManagedSkillDir,\n type LocalSkill,\n listLocalSkills,\n} from \"../skills/store\";\nimport {\n buildSkillsTargetSelectionExamples,\n getSkillsTargetSelectionOptionalArguments,\n getSkillsTargetSelectionRequiredArguments,\n validateSkillsTargetSelectionInput,\n} from \"../skills/target-selection-contract\";\nimport { outLine } from \"../ui/io\";\nimport {\n promptSearchMultiselect,\n type SearchSelectItem,\n} from \"../ui/search-select\";\nimport { promptTextEntry } from \"../ui/text-entry\";\nimport {\n emitInstallSummaryCardsForHuman,\n emitManualInstallGuide,\n emitSkillsHelp,\n emitSkillsListHumanCards,\n emitSkillsUpdateHumanResultCards,\n} from \"./skills-cards\";\nimport {\n emitSkillsCheckHumanNextStepsCard,\n emitSkillsCheckHumanSummaryCard,\n emitSkillsCheckHumanTargetCards,\n runInteractiveSkillsCheckViewer,\n type SkillsCheckNavigationResult,\n summarizeSkillsCheckTargets,\n} from \"./skills-check\";\nimport {\n formatSkillsCopy,\n formatSkillsCount,\n formatSkillsStoreValue,\n renderSkillsTextCard,\n} from \"./skills-format\";\nimport {\n buildLegacyOpenMeldSkillAgentReview,\n emitLegacyOpenMeldSkillAgentAttention,\n emitLegacyOpenMeldSkillFindingsHumanCard,\n formatLegacyOpenMeldSkillFindingsForAgentView,\n} from \"./skills-legacy-audit-view\";\nimport {\n INSTALL_RECORD_GROUP_SEPARATOR,\n toTargetKey,\n} from \"./skills-target-key\";\n\ntype SkillsBaseInput = {\n view?: string;\n quiet?: boolean;\n suppressAgentOverview?: boolean;\n};\n\ntype SkillsCheckInput = SkillsBaseInput & {\n allowBackToCaller?: boolean;\n};\n\ntype SkillsInstallInput = SkillsBaseInput & {\n all?: boolean;\n agent?: string[];\n command?: \"ensure\" | \"install\";\n dir?: string;\n guide?: boolean;\n allowBackToCaller?: boolean;\n};\n\ntype SkillsUninstallInput = SkillsBaseInput & {\n all?: boolean;\n agent?: string[];\n dir?: string;\n dryRun?: boolean;\n allowExternalTargets?: boolean;\n allowBackToCaller?: boolean;\n};\n\nconst SKILLS_MENU_CHOICE = {\n install: \"install\",\n uninstall: \"uninstall\",\n check: \"check\",\n update: \"update\",\n list: \"list\",\n exit: \"exit\",\n} as const;\nconst EXTERNAL_UNINSTALL_CONFIRM_TOKEN = \"uninstall\";\n\nconst INTERACTIVE_NAVIGATION_CHOICE = \"__navigation__\";\n\ntype SkillsCommandNavigationResult =\n | \"completed\"\n | \"back\"\n | \"cancelled\"\n | \"guided\";\ntype SkillsPromptResult<T> =\n | {\n status: \"submitted\";\n value: T;\n }\n | {\n status: \"back\" | \"cancelled\";\n };\ntype SkillsInteractiveInstallTargetResult =\n | SkillsPromptResult<SkillsInstallTarget[]>\n | {\n status: \"guide\";\n };\ntype SkillsTargetSelectionMode =\n | \"explicit_dir\"\n | \"all\"\n | \"agent\"\n | \"interactive\";\ntype ResolvedSkillsUninstallTargetsResult = SkillsPromptResult<{\n targets: SkillsInstallTarget[];\n targetSelectionMode: SkillsTargetSelectionMode;\n}>;\ntype InteractiveSkillsTargetChoice = \"select\" | \"all\" | \"custom\";\ntype InteractiveSkillsInstallChoice = InteractiveSkillsTargetChoice | \"guide\";\ntype InteractiveSkillsTargetChoiceResult<TChoice> =\n | {\n status: \"selected\";\n value: TChoice;\n }\n | {\n status: \"back\" | \"cancelled\";\n };\n\nconst INTERACTIVE_SKILLS_MENU: Array<{\n value: (typeof SKILLS_MENU_CHOICE)[keyof typeof SKILLS_MENU_CHOICE];\n label: string;\n hint?: string;\n}> = [\n {\n value: SKILLS_MENU_CHOICE.install,\n label: \"Install\",\n hint: \"Install OpenMeld skills into local agent skills directories\",\n },\n {\n value: SKILLS_MENU_CHOICE.uninstall,\n label: \"Uninstall\",\n hint: \"Remove OpenMeld skills from selected targets\",\n },\n {\n value: SKILLS_MENU_CHOICE.check,\n label: \"Check\",\n hint: \"Check tracked targets for OpenMeld skills updates\",\n },\n {\n value: SKILLS_MENU_CHOICE.update,\n label: \"Update\",\n hint: \"Update tracked targets with outdated OpenMeld skills\",\n },\n {\n value: SKILLS_MENU_CHOICE.list,\n label: \"List\",\n hint: \"Show all skills currently available in this OpenMeld installation\",\n },\n {\n value: SKILLS_MENU_CHOICE.exit,\n label: \"Exit\",\n },\n];\n\nexport async function runSkills(input: SkillsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const allowPrompt = canUseInteractivePrompts(runtime);\n const presenter = createPresenter(runtime);\n if (!allowPrompt) {\n await runSkillsWithoutInteractiveMenu({\n runtime,\n presenter,\n });\n return;\n }\n\n while (true) {\n const choice = await select({\n message: \"OpenMeld skills:\",\n options: INTERACTIVE_SKILLS_MENU,\n });\n if (isCancel(choice) || choice === SKILLS_MENU_CHOICE.exit) {\n cancel(\"Cancelled.\");\n return;\n }\n\n const shouldContinue = await handleInteractiveSkillsMenuChoice(\n choice,\n input\n );\n if (shouldContinue) {\n continue;\n }\n return;\n }\n}\n\nasync function runSkillsWithoutInteractiveMenu(input: {\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>;\n presenter: ReturnType<typeof createPresenter>;\n}): Promise<void> {\n await ensureLocalSkills();\n const skills = await listLocalSkills();\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const knownAgentIds = Object.keys(registry).sort((a, b) =>\n a.localeCompare(b)\n );\n const agentExampleArg = resolveInstallableAgentExamplePair(registry);\n const normalizedSkills = skills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n absolutePath: skill.absolutePath,\n }));\n if (input.runtime.resolvedView === \"agent\") {\n emitSkillsAgentOverview({\n presenter: input.presenter,\n command: \"menu\",\n storeDir: skillsDir(),\n knownAgentIds,\n agentExampleArg,\n skills: normalizedSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n throw createSkillsMenuGuideError({\n storeDir: skillsDir(),\n knownAgentIds,\n agentExampleArg,\n skills: normalizedSkills,\n });\n }\n emitSkillsHelp({\n resolvedView: input.runtime.resolvedView,\n presenter: input.presenter,\n knownAgentIds,\n agentExampleArg,\n skills: normalizedSkills,\n });\n}\n\nasync function handleInteractiveSkillsMenuChoice(\n choice: (typeof SKILLS_MENU_CHOICE)[keyof typeof SKILLS_MENU_CHOICE],\n input: SkillsBaseInput\n): Promise<boolean> {\n if (choice === SKILLS_MENU_CHOICE.list) {\n await runSkillsList(input);\n return false;\n }\n if (choice === SKILLS_MENU_CHOICE.update) {\n await runSkillsUpdate(input);\n return false;\n }\n if (choice === SKILLS_MENU_CHOICE.check) {\n const result = await runSkillsCheck({\n ...input,\n allowBackToCaller: true,\n });\n return result === \"back\";\n }\n if (choice === SKILLS_MENU_CHOICE.uninstall) {\n const result = await runSkillsUninstall({\n ...input,\n allowBackToCaller: true,\n });\n return result === \"back\";\n }\n const result = await runSkillsInstall({\n ...input,\n allowBackToCaller: true,\n });\n return result === \"back\";\n}\n\nexport async function runSkillsList(input: SkillsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n await ensureLocalSkills();\n const skills = await listLocalSkills();\n const payload = {\n storeDir: skillsDir(),\n skills: skills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n absolutePath: skill.absolutePath,\n })),\n };\n if (runtime.resolvedView === \"agent\" && !input.suppressAgentOverview) {\n emitSkillsAgentOverview({\n presenter,\n command: \"list\",\n storeDir: payload.storeDir,\n knownAgentIds: [],\n agentExampleArg: \"<id...>\",\n skills: payload.skills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"skills.list\",\n payload,\n });\n return;\n }\n\n if (payload.skills.length === 0) {\n emitSkillsListHumanCards(payload);\n return;\n }\n\n emitSkillsListHumanCards(payload);\n}\n\nexport async function runSkillsCheck(\n input: SkillsCheckInput\n): Promise<SkillsCheckNavigationResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const allowPrompt = canUseInteractivePrompts(runtime);\n const presenter = createPresenter(runtime);\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const installedAgents = await detectInstalledSkillsAgents(registry);\n const localSkills = await ensureLocalSkills();\n const detectedAgentTargets = buildAgentTargets(installedAgents, registry);\n const trackedTargets = await resolveTrackedInstallTargets({\n skillsConfig,\n registry,\n localSkills,\n onlyOpenMeldInstalledTargets: false,\n });\n const checkTargets = mergeTargetsByDir({\n primary: detectedAgentTargets,\n secondary: trackedTargets,\n });\n const states = await resolveSkillsInstallStates({\n skills: localSkills,\n targets: checkTargets,\n });\n const legacyFindings = await detectLegacyOpenMeldSkillCopies({\n registry,\n localSkills,\n targets: checkTargets,\n });\n const payloadLegacyFindings =\n runtime.resolvedView === \"agent\"\n ? formatLegacyOpenMeldSkillFindingsForAgentView(legacyFindings)\n : legacyFindings;\n await persistDetectedInstallStateFromCheck({ states });\n const summary = summarizeSkillState(states);\n const targetStates = summarizeSkillsCheckTargets({\n targets: checkTargets,\n states,\n registry,\n customTargets: skillsConfig?.customTargets ?? [],\n });\n const payload = {\n storeDir: skillsDir(),\n targets: checkTargets,\n summary,\n states,\n targetStates,\n legacyFindings: payloadLegacyFindings,\n legacyFindingCount: payloadLegacyFindings.length,\n legacyReview:\n payloadLegacyFindings.length > 0\n ? buildLegacyOpenMeldSkillAgentReview(payloadLegacyFindings)\n : null,\n requiresReview:\n summary.outdated > 0 ||\n summary.missing > 0 ||\n summary.externalConflict > 0 ||\n legacyFindings.length > 0,\n };\n if (runtime.resolvedView === \"agent\" && !input.suppressAgentOverview) {\n emitSkillsAgentOverview({\n presenter,\n command: \"check\",\n storeDir: payload.storeDir,\n knownAgentIds: Object.keys(registry).sort((a, b) => a.localeCompare(b)),\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n skills: localSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n\n if (input.quiet) {\n return \"completed\";\n }\n\n if (runtime.resolvedView === \"agent\") {\n emitLegacyOpenMeldSkillAgentAttention({\n legacyFindings: payloadLegacyFindings,\n presenter,\n source: \"skills.check\",\n });\n presenter.data({\n code: \"skills.check.summary\",\n payload,\n });\n return \"completed\";\n }\n\n if (\n allowPrompt &&\n runtime.resolvedView === \"human\" &&\n input.allowBackToCaller === true\n ) {\n return runInteractiveSkillsCheckViewer({\n storeDir: payload.storeDir,\n targetCount: checkTargets.length,\n summary,\n legacyFindings,\n targetStates,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n }\n\n emitSkillsCheckHumanSummaryCard({\n storeDir: payload.storeDir,\n targetCount: checkTargets.length,\n summary,\n legacyFindings,\n });\n if (checkTargets.length > 0) {\n emitSkillsCheckHumanTargetCards({\n targetStates,\n });\n }\n emitLegacyOpenMeldSkillFindingsHumanCard({\n legacyFindings,\n });\n emitSkillsCheckHumanNextStepsCard({\n targetCount: checkTargets.length,\n summary,\n legacyFindings,\n });\n return \"completed\";\n}\n\nexport async function runSkillsUpdate(input: SkillsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const localSkills = await ensureLocalSkills();\n if (runtime.resolvedView === \"agent\") {\n emitSkillsAgentOverview({\n presenter,\n command: \"update\",\n storeDir: skillsDir(),\n knownAgentIds: Object.keys(registry).sort((a, b) => a.localeCompare(b)),\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n skills: localSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n const trackedTargets = await resolveTrackedInstallTargets({\n skillsConfig,\n registry,\n localSkills,\n onlyOpenMeldInstalledTargets: true,\n });\n if (trackedTargets.length === 0) {\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"skills.update.summary\",\n payload: {\n storeDir: skillsDir(),\n targets: [],\n summary: {\n installed: 0,\n skipped: 0,\n failed: 0,\n degradedToCopy: 0,\n },\n results: [],\n message: \"no tracked install targets\",\n },\n });\n return;\n }\n emitSkillsUpdateHumanResultCards({\n storeDir: skillsDir(),\n targetCount: 0,\n summary: {\n upToDate: 0,\n outdated: 0,\n missing: 0,\n externalConflict: 0,\n },\n status: \"no_targets\",\n });\n return;\n }\n\n const states = await resolveSkillsInstallStates({\n skills: localSkills,\n targets: trackedTargets,\n });\n const stateSummary = summarizeSkillState(states);\n const actionableTargetKeys = new Set(\n states\n .filter(\n (state) => state.state === \"missing\" || state.state === \"outdated\"\n )\n .map(\n (state) =>\n `${state.targetId}${INSTALL_RECORD_GROUP_SEPARATOR}${state.targetDir}`\n )\n );\n\n if (actionableTargetKeys.size === 0) {\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"skills.update.summary\",\n payload: {\n storeDir: skillsDir(),\n targets: trackedTargets,\n summary: {\n installed: 0,\n skipped: 0,\n failed: 0,\n degradedToCopy: 0,\n },\n results: [],\n stateSummary,\n message: \"all tracked skills are up to date\",\n },\n });\n return;\n }\n emitSkillsUpdateHumanResultCards({\n storeDir: skillsDir(),\n targetCount: trackedTargets.length,\n summary: stateSummary,\n status: \"up_to_date\",\n });\n return;\n }\n\n const targets = trackedTargets.filter((target) =>\n actionableTargetKeys.has(\n `${target.id}${INSTALL_RECORD_GROUP_SEPARATOR}${target.dir}`\n )\n );\n\n const installResults = await withSkillsInstallLock(async () =>\n installSkillsToTargets({\n skills: localSkills,\n targets,\n })\n );\n await persistSkillsInstallState({\n previousSkillsConfig: skillsConfig,\n targets,\n installResults,\n });\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"skills.update.summary\",\n payload: {\n storeDir: skillsDir(),\n targets,\n summary: summarizeInstallResults(installResults),\n results: installResults,\n stateSummary,\n },\n });\n return;\n }\n\n emitInstallSummary({\n resolvedView: runtime.resolvedView,\n presenter,\n installResults,\n storeDir: skillsDir(),\n });\n}\n\nexport async function runSkillsEnsure(\n input: SkillsInstallInput\n): Promise<SkillsCommandNavigationResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const localSkills = await ensureLocalSkills();\n if (runtime.resolvedView === \"agent\" && !input.suppressAgentOverview) {\n emitSkillsAgentOverview({\n presenter,\n command: \"ensure\",\n storeDir: skillsDir(),\n knownAgentIds: Object.keys(registry).sort((a, b) => a.localeCompare(b)),\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n skills: localSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n const { hasExplicitInstallArgs } = resolveSkillsInstallSelectionInput(\n input,\n \"ensure\"\n );\n if (!hasExplicitInstallArgs && runtime.resolvedView === \"agent\") {\n throw createSkillsActionGuideError({\n action: \"ensure\",\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n });\n }\n\n if (input.guide) {\n emitManualInstallGuide({\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n command: \"ensure\",\n presenter,\n resolvedView: runtime.resolvedView,\n });\n return \"guided\";\n }\n\n return await runSkillsInstall({\n ...input,\n command: \"ensure\",\n suppressAgentOverview: true,\n });\n}\n\nexport async function runSkillsInstall(\n input: SkillsInstallInput\n): Promise<SkillsCommandNavigationResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const allowPrompt = canUseInteractivePrompts(runtime);\n const command = input.command ?? \"install\";\n\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const registryKeys = Object.keys(registry).sort((a, b) => a.localeCompare(b));\n const installableRegistryKeys = resolveInstallableAgentIds(registry).sort(\n (a, b) => a.localeCompare(b)\n );\n const installedAgents = await detectInstalledSkillsAgents(registry);\n const localSkills = await ensureLocalSkills();\n if (runtime.resolvedView === \"agent\" && !input.suppressAgentOverview) {\n emitSkillsAgentOverview({\n presenter,\n command,\n storeDir: skillsDir(),\n knownAgentIds: registryKeys,\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n skills: localSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n\n const { explicitAgents, explicitDir, hasExplicitInstallArgs } =\n resolveSkillsInstallSelectionInput(input, command);\n\n if (input.guide) {\n emitManualInstallGuide({\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n command,\n presenter,\n resolvedView: runtime.resolvedView,\n });\n return \"guided\";\n }\n\n let targets: SkillsInstallTarget[] = [];\n if (explicitDir.length > 0) {\n const customDir = resolve(explicitDir);\n await assertDirectoryExists(customDir);\n targets = [buildCustomSkillsTarget(customDir, skillsConfig)];\n } else if (input.all === true) {\n if (\n command === \"ensure\" &&\n installedAgents.length === 0 &&\n !canManageRegistryAgentSkillTargets()\n ) {\n // Lane-specific OpenMeld homes have no managed agent targets, and ensure\n // must stay a safe no-op there so setup completes inside dev lanes\n // instead of failing on the published home's agent directories.\n emitInstallSummary({\n resolvedView: runtime.resolvedView,\n presenter,\n installResults: [],\n quiet: input.quiet,\n storeDir: skillsDir(),\n });\n return \"completed\";\n }\n targets = resolveDetectedInstallableTargetsOrThrow({\n installedAgents,\n registry,\n action: command,\n });\n } else if (explicitAgents.length > 0) {\n targets = resolveExplicitAgentTargetsOrThrow({\n action: command,\n explicitAgents,\n registry,\n registryKeys,\n installableRegistryKeys,\n });\n } else if (!hasExplicitInstallArgs && allowPrompt) {\n const interactiveTargets = await resolveInteractiveInstallTargets({\n registry,\n installedAgents,\n skillsConfig,\n localSkills,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n if (interactiveTargets.status === \"guide\") {\n emitManualInstallGuide({\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n presenter,\n resolvedView: runtime.resolvedView,\n });\n return \"guided\";\n }\n if (interactiveTargets.status !== \"submitted\") {\n return handleSkillsCommandExit({\n status: interactiveTargets.status,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n }\n targets = interactiveTargets.value;\n } else {\n if (runtime.resolvedView === \"agent\") {\n throw createSkillsActionGuideError({\n action: command,\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n });\n }\n throw new Error(buildNonInteractiveInstallError(registry, command));\n }\n\n if (targets.length === 0) {\n throw new Error(\n formatInlineOpenMeldCliCommands(\n `no ${command} targets resolved; use \\`openmeld skills ${command} --all\\`, \\`--agent\\`, or \\`--dir\\``\n )\n );\n }\n\n const installResults = await withSkillsInstallLock(async () =>\n installSkillsToTargets({\n skills: localSkills,\n targets,\n })\n );\n const legacyFindings = await detectLegacyOpenMeldSkillCopies({\n registry,\n localSkills,\n targets,\n });\n\n await persistSkillsInstallState({\n previousSkillsConfig: skillsConfig,\n targets,\n installResults,\n });\n emitInstallSummary({\n resolvedView: runtime.resolvedView,\n presenter,\n installResults,\n legacyFindings,\n quiet: input.quiet,\n storeDir: skillsDir(),\n });\n return \"completed\";\n}\n\ntype SkillsUninstallStatus = \"removed\" | \"skipped\" | \"blocked\" | \"failed\";\n\ntype SkillsUninstallResult = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillId: string;\n status: SkillsUninstallStatus;\n reason?: string;\n};\n\nexport async function runSkillsUninstall(\n input: SkillsUninstallInput\n): Promise<SkillsCommandNavigationResult> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n });\n const presenter = createPresenter(runtime);\n const allowPrompt = canUseInteractivePrompts(runtime);\n const skillsConfig = await getConfiguredSkillsConfig();\n const registry = resolveSkillsAgentRegistry(skillsConfig);\n const registryKeys = Object.keys(registry).sort((a, b) => a.localeCompare(b));\n const installableRegistryKeys = resolveInstallableAgentIds(registry).sort(\n (a, b) => a.localeCompare(b)\n );\n const installedAgents = await detectInstalledSkillsAgents(registry);\n const localSkills = await ensureLocalSkills();\n if (runtime.resolvedView === \"agent\") {\n emitSkillsAgentOverview({\n presenter,\n command: \"uninstall\",\n storeDir: skillsDir(),\n knownAgentIds: registryKeys,\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n skills: localSkills.map((skill) => ({\n id: skill.id,\n name: skill.name,\n relativePath: skill.relativePath,\n })),\n });\n }\n\n const explicitDir = String(input.dir ?? \"\").trim();\n const explicitAgents = Array.from(\n new Set(\n (input.agent ?? [])\n .map((agent) => agent.trim().toLowerCase())\n .filter((agent) => agent.length > 0)\n )\n );\n const hasExplicitUninstallArgs =\n input.all === true || explicitAgents.length > 0 || explicitDir.length > 0;\n\n const hasInteractiveTargetSelection =\n !hasExplicitUninstallArgs && allowPrompt;\n\n while (true) {\n const targetResolution = await resolveSkillsUninstallTargets({\n runtimeResolvedView: runtime.resolvedView,\n allowPrompt,\n explicitDir,\n all: input.all === true,\n explicitAgents,\n registry,\n registryKeys,\n installableRegistryKeys,\n installedAgents,\n skillsConfig,\n localSkills,\n hasInteractiveTargetSelection,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n if (targetResolution.status !== \"submitted\") {\n return handleSkillsCommandExit({\n status: targetResolution.status,\n allowBackToCaller: input.allowBackToCaller === true,\n });\n }\n\n const { targets, targetSelectionMode } = targetResolution.value;\n assertResolvedSkillsTargets(targets, \"uninstall\");\n\n if (input.dryRun === true) {\n emitUninstallDryRunPreview({\n resolvedView: runtime.resolvedView,\n presenter,\n storeDir: skillsDir(),\n openMeldHomeDir: openMeldRootDir(),\n targetAudits: summarizeUninstallTargetAudits({\n targets,\n openMeldHomeDir: openMeldRootDir(),\n }),\n skillIds: localSkills.map((skill) => skill.id),\n });\n return \"completed\";\n }\n\n const confirmationResult = await confirmSkillsUninstallTargets({\n allowPrompt,\n allowExternalTargets: input.allowExternalTargets === true,\n hasInteractiveTargetSelection,\n targetSelectionMode,\n targets,\n });\n if (confirmationResult === \"back\") {\n continue;\n }\n if (confirmationResult === \"cancelled\") {\n return handleSkillsCommandExit({\n status: \"cancelled\",\n allowBackToCaller: input.allowBackToCaller === true,\n });\n }\n\n await executeSkillsUninstall({\n runtimeResolvedView: runtime.resolvedView,\n presenter,\n skillsConfig,\n localSkills,\n targets,\n });\n return \"completed\";\n }\n}\n\nasync function resolveSkillsUninstallTargets(input: {\n runtimeResolvedView: \"human\" | \"agent\";\n allowPrompt: boolean;\n explicitDir: string;\n all: boolean;\n explicitAgents: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n registryKeys: string[];\n installableRegistryKeys: string[];\n installedAgents: string[];\n skillsConfig: RuntimeSkillsConfig | null;\n localSkills: LocalSkill[];\n hasInteractiveTargetSelection: boolean;\n allowBackToCaller: boolean;\n}): Promise<ResolvedSkillsUninstallTargetsResult> {\n if (\n input.all ||\n input.explicitAgents.length > 0 ||\n input.explicitDir.length > 0\n ) {\n validateSkillsTargetSelectionInput({\n all: input.all,\n command: \"uninstall\",\n explicitAgentIds: input.explicitAgents,\n explicitDir: input.explicitDir.length > 0 ? input.explicitDir : null,\n });\n }\n\n if (input.explicitDir.length > 0) {\n return {\n status: \"submitted\",\n value: {\n targets: [\n buildCustomSkillsTarget(\n resolve(input.explicitDir),\n input.skillsConfig\n ),\n ],\n targetSelectionMode: \"explicit_dir\",\n },\n };\n }\n if (input.all) {\n return {\n status: \"submitted\",\n value: {\n targets: resolveDetectedInstallableTargetsOrThrow({\n installedAgents: input.installedAgents,\n registry: input.registry,\n action: \"uninstall\",\n }),\n targetSelectionMode: \"all\",\n },\n };\n }\n if (input.explicitAgents.length > 0) {\n return {\n status: \"submitted\",\n value: {\n targets: resolveExplicitAgentTargetsOrThrow({\n action: \"uninstall\",\n explicitAgents: input.explicitAgents,\n registry: input.registry,\n registryKeys: input.registryKeys,\n installableRegistryKeys: input.installableRegistryKeys,\n }),\n targetSelectionMode: \"agent\",\n },\n };\n }\n if (input.hasInteractiveTargetSelection) {\n const interactiveTargets = await resolveInteractiveUninstallTargets({\n registry: input.registry,\n installedAgents: input.installedAgents,\n skillsConfig: input.skillsConfig,\n localSkills: input.localSkills,\n allowBackToCaller: input.allowBackToCaller,\n });\n if (interactiveTargets.status !== \"submitted\") {\n return interactiveTargets;\n }\n return {\n status: \"submitted\",\n value: {\n targets: interactiveTargets.value,\n targetSelectionMode: \"interactive\",\n },\n };\n }\n if (input.runtimeResolvedView === \"agent\") {\n throw createSkillsActionGuideError({\n action: \"uninstall\",\n agentExampleArg: resolveInstallableAgentExamplePair(input.registry),\n });\n }\n throw new Error(buildNonInteractiveUninstallError(input.registry));\n}\n\nfunction assertResolvedSkillsTargets(\n targets: SkillsInstallTarget[],\n action: \"install\" | \"uninstall\"\n): void {\n if (targets.length > 0) {\n return;\n }\n throw new Error(\n formatInlineOpenMeldCliCommands(\n `no ${action} targets resolved; use \\`openmeld skills ${action} --all\\`, \\`--agent\\`, or \\`--dir\\``\n )\n );\n}\n\nasync function confirmSkillsUninstallTargets(input: {\n allowPrompt: boolean;\n allowExternalTargets: boolean;\n hasInteractiveTargetSelection: boolean;\n targetSelectionMode: SkillsTargetSelectionMode;\n targets: SkillsInstallTarget[];\n}): Promise<\"confirmed\" | \"back\" | \"cancelled\"> {\n if (input.targetSelectionMode === \"explicit_dir\") {\n return \"confirmed\";\n }\n const confirmed = await ensureExternalUninstallTargetsConfirmed({\n allowPrompt: input.allowPrompt,\n allowExternalTargets: input.allowExternalTargets,\n targetAudits: summarizeUninstallTargetAudits({\n targets: input.targets,\n openMeldHomeDir: openMeldRootDir(),\n }),\n allowBack:\n input.hasInteractiveTargetSelection &&\n input.targetSelectionMode === \"interactive\",\n });\n return confirmed.status;\n}\n\nasync function executeSkillsUninstall(input: {\n runtimeResolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n skillsConfig: RuntimeSkillsConfig | null;\n localSkills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<void> {\n const uninstallResults = await withSkillsInstallLock(async () => {\n const results = await uninstallSkillsFromTargets({\n skills: input.localSkills,\n targets: input.targets,\n });\n const successfullyUninstalledTargets = selectSuccessfullyUninstalledTargets(\n {\n targets: input.targets,\n uninstallResults: results,\n }\n );\n await persistSkillsUninstallState({\n previousSkillsConfig: input.skillsConfig,\n targets: successfullyUninstalledTargets,\n });\n return results;\n });\n emitUninstallSummary({\n resolvedView: input.runtimeResolvedView,\n presenter: input.presenter,\n uninstallResults,\n storeDir: skillsDir(),\n });\n}\n\nasync function resolveInteractiveUninstallTargets(input: {\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n installedAgents: string[];\n skillsConfig: RuntimeSkillsConfig | null;\n localSkills: LocalSkill[];\n allowBackToCaller: boolean;\n}): Promise<SkillsPromptResult<SkillsInstallTarget[]>> {\n const detectedAgentTargets = buildAgentTargets(\n input.installedAgents,\n input.registry\n );\n const uninstallableAgentTargets =\n await filterTargetsWithInstalledOpenMeldSkills({\n targets: detectedAgentTargets,\n localSkills: input.localSkills,\n });\n const uninstallableAgentIds = uninstallableAgentTargets.map(\n (target) => target.id\n );\n\n while (true) {\n const action = await promptInteractiveUninstallTargetChoice({\n hasAgentTargets: uninstallableAgentIds.length > 0,\n allowBackToCaller: input.allowBackToCaller,\n });\n if (action.status !== \"selected\") {\n return action;\n }\n\n const resolvedTargets = await resolveInteractiveUninstallTargetAction({\n action: action.value,\n uninstallableAgentTargets,\n uninstallableAgentIds,\n registry: input.registry,\n skillsConfig: input.skillsConfig,\n });\n if (resolvedTargets.status === \"back\") {\n continue;\n }\n return resolvedTargets;\n }\n}\n\nasync function promptForCustomSkillsDirForUninstall(): Promise<\n SkillsPromptResult<string>\n> {\n for (;;) {\n const answer = await promptTextEntry({\n message: \"Custom agent skills directory (absolute path)\",\n placeholder: \"/Users/<you>/.your-agent/skills\",\n allowBack: true,\n backLabel: \"Back\",\n requiredMessage: \"Path cannot be empty.\",\n });\n if (answer.status !== \"submitted\") {\n return answer;\n }\n\n const trimmed = String(answer.value ?? \"\").trim();\n if (!trimmed) {\n process.stderr.write(\"Path cannot be empty.\\n\");\n continue;\n }\n\n const resolvedDir = resolve(trimmed);\n const stats = await stat(resolvedDir).catch(() => null);\n if (!stats) {\n process.stderr.write(\n \"Path does not exist. Enter an existing directory path.\\n\"\n );\n continue;\n }\n if (!stats.isDirectory()) {\n process.stderr.write(\"Path is not a directory.\\n\");\n continue;\n }\n return {\n status: \"submitted\",\n value: resolvedDir,\n };\n }\n}\n\nfunction buildNonInteractiveUninstallError(\n registry: ReturnType<typeof resolveSkillsAgentRegistry>\n): string {\n const examples = buildSkillsTargetSelectionExamples({\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n command: \"uninstall\",\n });\n return formatSkillsCopy(\n [\n \"openmeld skills uninstall requires explicit target selection in non-interactive mode.\",\n \"\",\n \"Required:\",\n ...getSkillsTargetSelectionRequiredArguments(\"uninstall\").map(\n (argument) => ` ${argument}`\n ),\n \"\",\n \"Optional:\",\n ...getSkillsTargetSelectionOptionalArguments(\"uninstall\").map(\n (argument) => ` ${argument}`\n ),\n \"\",\n \"examples:\",\n ...examples.map((command) => ` ${command}`),\n ].join(\"\\n\")\n );\n}\n\ntype SkillsUninstallTargetAudit = {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n location: \"openmeld_home\" | \"external\";\n};\n\nfunction summarizeUninstallTargetAudits(input: {\n targets: SkillsInstallTarget[];\n openMeldHomeDir: string;\n}): SkillsUninstallTargetAudit[] {\n const openMeldHomeDir = resolve(input.openMeldHomeDir);\n return input.targets.map((target) => ({\n targetId: target.id,\n targetDir: target.dir,\n targetType: target.type,\n location: isPathInsideRoot({\n rootDir: openMeldHomeDir,\n candidatePath: target.dir,\n })\n ? \"openmeld_home\"\n : \"external\",\n }));\n}\n\nasync function ensureExternalUninstallTargetsConfirmed(input: {\n allowPrompt: boolean;\n allowExternalTargets: boolean;\n targetAudits: SkillsUninstallTargetAudit[];\n allowBack: boolean;\n}): Promise<\n | {\n status: \"confirmed\";\n }\n | {\n status: \"back\" | \"cancelled\";\n }\n> {\n const externalTargets = input.targetAudits.filter(\n (target) => target.location === \"external\"\n );\n if (externalTargets.length === 0 || input.allowExternalTargets) {\n return {\n status: \"confirmed\",\n };\n }\n\n const externalTargetLines = externalTargets\n .map((target) => ` - ${target.targetDir}`)\n .join(\"\\n\");\n if (!input.allowPrompt) {\n throw new Error(\n formatSkillsCopy(\n [\n \"skills uninstall detected targets outside this OpenMeld installation.\",\n \"external targets:\",\n externalTargetLines,\n \"re-run with one of:\",\n \" openmeld skills uninstall --all --dry-run\",\n \" openmeld skills uninstall --all --allow-external-targets\",\n ].join(\"\\n\")\n )\n );\n }\n\n while (true) {\n const firstConfirm = await select({\n message: [\n `Detected ${externalTargets.length} uninstall target(s) outside this OpenMeld installation:`,\n externalTargetLines,\n \"Continue?\",\n ].join(\"\\n\"),\n initialValue: \"continue\",\n options: [\n {\n value: \"continue\",\n label: \"Continue\",\n },\n ...(input.allowBack\n ? [\n {\n value: \"back\",\n label: \"Back\",\n },\n ]\n : []),\n {\n value: \"cancel\",\n label: \"Cancel\",\n },\n ],\n });\n if (isCancel(firstConfirm) || firstConfirm === \"cancel\") {\n return {\n status: \"cancelled\",\n };\n }\n if (firstConfirm === \"back\") {\n return {\n status: \"back\",\n };\n }\n\n const secondConfirm = await promptTextEntry({\n message: 'Type \"UNINSTALL\" to confirm external target removal',\n placeholder: \"UNINSTALL\",\n allowBack: input.allowBack,\n backLabel: \"Back\",\n requiredMessage: 'Type \"UNINSTALL\" to continue.',\n });\n if (secondConfirm.status === \"back\") {\n continue;\n }\n if (secondConfirm.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (\n normalizeExternalUninstallConfirm(secondConfirm.value) !==\n EXTERNAL_UNINSTALL_CONFIRM_TOKEN\n ) {\n process.stderr.write('Type \"UNINSTALL\" to continue.\\n');\n continue;\n }\n return {\n status: \"confirmed\",\n };\n }\n}\n\nfunction emitUninstallDryRunPreview(input: {\n resolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n storeDir: string;\n openMeldHomeDir: string;\n targetAudits: SkillsUninstallTargetAudit[];\n skillIds: string[];\n}): void {\n const externalTargets = input.targetAudits.filter(\n (target) => target.location === \"external\"\n );\n const payload = {\n storeDir: input.storeDir,\n openMeldHomeDir: input.openMeldHomeDir,\n targetCount: input.targetAudits.length,\n externalTargetCount: externalTargets.length,\n skillIds: input.skillIds,\n targets: input.targetAudits,\n };\n\n if (input.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"skills.uninstall.preview\",\n payload,\n });\n return;\n }\n\n emitSkillsUninstallDryRunCards({\n storeDir: input.storeDir,\n openMeldHomeDir: input.openMeldHomeDir,\n targetAudits: input.targetAudits,\n externalTargetCount: externalTargets.length,\n skillIds: input.skillIds,\n });\n}\n\nfunction normalizeExternalUninstallConfirm(value: unknown): string {\n return String(value ?? \"\")\n .trim()\n .toLowerCase();\n}\n\nfunction isPathInsideRoot(input: {\n rootDir: string;\n candidatePath: string;\n}): boolean {\n const rootDir = resolveAuditPath(input.rootDir);\n const candidatePath = resolveAuditPath(input.candidatePath);\n const relativePath = relative(rootDir, candidatePath);\n if (relativePath.length === 0) {\n return true;\n }\n if (relativePath.startsWith(\"..\")) {\n return false;\n }\n return !isAbsolute(relativePath);\n}\n\nfunction resolveAuditPath(path: string): string {\n const resolved = resolve(path);\n try {\n return realpathSync(resolved);\n } catch {\n return resolved;\n }\n}\n\nasync function uninstallSkillsFromTargets(input: {\n skills: LocalSkill[];\n targets: SkillsInstallTarget[];\n}): Promise<SkillsUninstallResult[]> {\n const results: SkillsUninstallResult[] = [];\n for (const target of input.targets) {\n for (const skill of input.skills) {\n const result = await uninstallOneSkillFromTarget({\n target,\n skill,\n });\n results.push(result);\n }\n }\n return results;\n}\n\nasync function uninstallOneSkillFromTarget(input: {\n target: SkillsInstallTarget;\n skill: LocalSkill;\n}): Promise<SkillsUninstallResult> {\n const skillDir = join(input.target.dir, input.skill.id);\n const targetBase = {\n targetId: input.target.id,\n targetDir: input.target.dir,\n targetType: input.target.type,\n skillId: input.skill.id,\n } as const;\n\n const skillStats = await lstat(skillDir).catch(() => null);\n if (!skillStats) {\n return {\n ...targetBase,\n status: \"skipped\",\n reason: \"skill not found\",\n };\n }\n\n const managedDirectly = await isOpenMeldManagedSkillDir(skillDir);\n const managedViaSymlink = skillStats.isSymbolicLink()\n ? await resolveSymlinkTarget(skillDir)\n .then((resolved) => isOpenMeldManagedSkillDir(resolved))\n .catch(() => false)\n : false;\n\n if (!(managedDirectly || managedViaSymlink)) {\n return {\n ...targetBase,\n status: \"blocked\",\n reason: \"existing non-OpenMeld skill detected; blocked\",\n };\n }\n\n try {\n await rm(skillDir, { recursive: true, force: true });\n return {\n ...targetBase,\n status: \"removed\",\n };\n } catch (error) {\n return {\n ...targetBase,\n status: \"failed\",\n reason:\n error instanceof Error\n ? error.message\n : \"failed to uninstall skill from target\",\n };\n }\n}\n\nasync function persistSkillsUninstallState(input: {\n previousSkillsConfig: RuntimeSkillsConfig | null;\n targets: SkillsInstallTarget[];\n}): Promise<void> {\n const removedTargetDirs = new Set(input.targets.map((target) => target.dir));\n const retainedInstalls = (input.previousSkillsConfig?.installs ?? []).filter(\n (record) => !removedTargetDirs.has(record.targetDir)\n );\n const retainedCustomTargets = (\n input.previousSkillsConfig?.customTargets ?? []\n ).filter((target) => !removedTargetDirs.has(target.dir));\n\n await setConfiguredSkillsConfig({\n storeDir: input.previousSkillsConfig?.storeDir ?? skillsDir(),\n ...(input.previousSkillsConfig?.agents\n ? { agents: input.previousSkillsConfig.agents }\n : {}),\n ...(retainedCustomTargets.length > 0\n ? { customTargets: retainedCustomTargets }\n : {}),\n installs: retainedInstalls,\n });\n}\n\nfunction selectSuccessfullyUninstalledTargets(input: {\n targets: SkillsInstallTarget[];\n uninstallResults: SkillsUninstallResult[];\n}): SkillsInstallTarget[] {\n const unsuccessfulTargetDirs = new Set(\n input.uninstallResults\n .filter(\n (result) => result.status === \"failed\" || result.status === \"blocked\"\n )\n .map((result) => result.targetDir)\n );\n return input.targets.filter(\n (target) => !unsuccessfulTargetDirs.has(target.dir)\n );\n}\n\nfunction buildCustomSkillsTarget(\n dir: string,\n skillsConfig?: RuntimeSkillsConfig | null\n): SkillsInstallTarget {\n const knownTarget = skillsConfig?.customTargets?.find(\n (target) => target.dir === dir\n );\n const id = resolveRuntimeSkillsCustomTargetId({\n dir,\n ...(knownTarget?.id ? { id: knownTarget.id } : {}),\n });\n return {\n id,\n dir,\n type: \"custom\",\n };\n}\n\nasync function filterTargetsNeedingInstallOrUpdate(input: {\n targets: SkillsInstallTarget[];\n localSkills: LocalSkill[];\n}): Promise<SkillsInstallTarget[]> {\n if (input.targets.length === 0) {\n return [];\n }\n const states = await resolveSkillsInstallStates({\n skills: input.localSkills,\n targets: input.targets,\n });\n const actionableTargetKeys = new Set(\n states\n .filter(\n (state) => state.state === \"missing\" || state.state === \"outdated\"\n )\n .map((state) => toTargetKey(state.targetId, state.targetDir))\n );\n return input.targets.filter((target) =>\n actionableTargetKeys.has(toTargetKey(target.id, target.dir))\n );\n}\n\nfunction emitSkillsUninstallDryRunCards(input: {\n storeDir: string;\n openMeldHomeDir: string;\n targetAudits: SkillsUninstallTargetAudit[];\n externalTargetCount: number;\n skillIds: string[];\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Uninstall Dry Run\",\n rows: [\n {\n label: \"status\",\n value: `${pc.cyan(\"•\")} dry-run complete: no files were removed.`,\n },\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"OpenMeld home\",\n value: pc.dim(input.openMeldHomeDir),\n },\n {\n label: \"targets\",\n value: formatSkillsCount(input.targetAudits.length, \"neutral\"),\n },\n {\n label: \"external\",\n value: formatSkillsCount(input.externalTargetCount, \"yellow\"),\n },\n {\n label: \"skills\",\n value:\n input.skillIds.length > 0\n ? pc.bold(input.skillIds.join(\", \"))\n : pc.dim(\"all OpenMeld skills\"),\n },\n ],\n });\n\n outLine(\"\");\n renderSkillsTextCard({\n title: `Target Preview (${input.targetAudits.length})`,\n rows:\n input.targetAudits.length > 0\n ? input.targetAudits.map((target) => ({\n label: [\n target.location === \"external\" ? pc.yellow(\"▲\") : pc.cyan(\"•\"),\n pc.bold(target.targetId),\n ].join(\" \"),\n value: [\n pc.dim(\n target.location === \"external\" ? \"external\" : \"OpenMeld home\"\n ),\n pc.dim(`${target.targetType} target`),\n pc.dim(`dir: ${target.targetDir}`),\n ].join(` ${pc.dim(\"·\")} `),\n }))\n : [\n {\n label: \"status\",\n value: pc.dim(\"none\"),\n },\n ],\n compact: true,\n });\n}\n\nfunction emitSkillsUninstallSummaryCardsForHuman(input: {\n storeDir: string;\n summary: {\n removed: number;\n skipped: number;\n blocked: number;\n failed: number;\n };\n failed: SkillsUninstallResult[];\n blocked: SkillsUninstallResult[];\n skipped: SkillsUninstallResult[];\n}): void {\n renderSkillsTextCard({\n title: \"OpenMeld Skills Uninstall Summary\",\n rows: [\n {\n label: \"store\",\n value: formatSkillsStoreValue(input.storeDir),\n },\n {\n label: \"removed\",\n value: formatSkillsCount(input.summary.removed, \"green\"),\n },\n {\n label: \"skipped\",\n value: formatSkillsCount(input.summary.skipped, \"yellow\"),\n },\n {\n label: \"blocked\",\n value: formatSkillsCount(input.summary.blocked, \"red\"),\n },\n {\n label: \"failed\",\n value: formatSkillsCount(input.summary.failed, \"red\"),\n },\n ],\n });\n\n emitSkillsUninstallDetailCard({\n title: \"Failed Items\",\n entries: input.failed,\n });\n emitSkillsUninstallDetailCard({\n title: \"Blocked Items\",\n entries: input.blocked,\n });\n emitSkillsUninstallDetailCard({\n title: \"Skipped Items\",\n entries: input.skipped,\n });\n}\n\nfunction emitSkillsUninstallDetailCard(input: {\n title: string;\n entries: SkillsUninstallResult[];\n}): void {\n outLine(\"\");\n renderSkillsTextCard({\n title: `${input.title} (${input.entries.length})`,\n rows:\n input.entries.length > 0\n ? input.entries.map((entry) => ({\n label: pc.bold(`${entry.skillId} -> ${entry.targetId}`),\n value: [\n pc.dim(`${entry.targetType} target`),\n pc.dim(`dir: ${entry.targetDir}`),\n entry.reason ? pc.red(entry.reason) : pc.dim(\"unknown\"),\n ].join(` ${pc.dim(\"·\")} `),\n }))\n : [\n {\n label: \"status\",\n value: pc.dim(\"none\"),\n },\n ],\n compact: true,\n });\n}\n\nfunction summarizeInstallResults(results: SkillsInstallResult[]): {\n installed: number;\n skipped: number;\n failed: number;\n degradedToCopy: number;\n} {\n return {\n installed: results.filter((item) => item.status === \"installed\").length,\n skipped: results.filter((item) => item.status === \"skipped\").length,\n failed: results.filter((item) => item.status === \"failed\").length,\n degradedToCopy: results.filter((item) => item.degraded).length,\n };\n}\n\nfunction summarizeUninstallResults(results: SkillsUninstallResult[]): {\n removed: number;\n skipped: number;\n blocked: number;\n failed: number;\n} {\n return {\n removed: results.filter((item) => item.status === \"removed\").length,\n skipped: results.filter((item) => item.status === \"skipped\").length,\n blocked: results.filter((item) => item.status === \"blocked\").length,\n failed: results.filter((item) => item.status === \"failed\").length,\n };\n}\n\nasync function resolveSymlinkTarget(linkPath: string): Promise<string> {\n const target = await readlink(linkPath);\n return resolve(dirname(linkPath), target);\n}\n\nasync function resolveInteractiveInstallTargets(input: {\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n installedAgents: string[];\n skillsConfig: RuntimeSkillsConfig | null;\n localSkills: LocalSkill[];\n allowBackToCaller: boolean;\n}): Promise<SkillsInteractiveInstallTargetResult> {\n const detectedAgentTargets = buildAgentTargets(\n input.installedAgents,\n input.registry\n );\n const trackedTargets = await resolveTrackedInstallTargets({\n skillsConfig: input.skillsConfig,\n registry: input.registry,\n localSkills: input.localSkills,\n onlyOpenMeldInstalledTargets: false,\n });\n const installCandidateTargets = mergeTargetsByDir({\n primary: detectedAgentTargets,\n secondary: trackedTargets.filter((target) => target.type === \"agent\"),\n });\n const actionableAgentTargets = await filterTargetsNeedingInstallOrUpdate({\n targets: installCandidateTargets,\n localSkills: input.localSkills,\n });\n const actionableAgentIds = actionableAgentTargets.map((target) => target.id);\n\n while (true) {\n const action = await promptInteractiveInstallTargetChoice({\n hasAgentTargets: actionableAgentIds.length > 0,\n allowBackToCaller: input.allowBackToCaller,\n });\n if (action.status !== \"selected\") {\n return action;\n }\n if (action.value === \"guide\") {\n return {\n status: \"guide\",\n };\n }\n\n const resolvedTargets = await resolveInteractiveInstallTargetAction({\n action: action.value,\n actionableAgentTargets,\n actionableAgentIds,\n registry: input.registry,\n skillsConfig: input.skillsConfig,\n });\n if (resolvedTargets.status === \"back\") {\n continue;\n }\n return resolvedTargets;\n }\n}\n\nasync function promptInteractiveUninstallTargetChoice(input: {\n hasAgentTargets: boolean;\n allowBackToCaller: boolean;\n}): Promise<\n InteractiveSkillsTargetChoiceResult<InteractiveSkillsTargetChoice>\n> {\n const action = await select({\n message: \"Choose OpenMeld skills uninstall target\",\n options: buildInteractiveUninstallTargetOptions({\n hasAgentTargets: input.hasAgentTargets,\n allowBackToCaller: input.allowBackToCaller,\n }),\n });\n return normalizeInteractiveSkillsTargetChoice({\n action,\n allowBackToCaller: input.allowBackToCaller,\n });\n}\n\nasync function resolveInteractiveUninstallTargetAction(input: {\n action: InteractiveSkillsTargetChoice;\n uninstallableAgentTargets: SkillsInstallTarget[];\n uninstallableAgentIds: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n skillsConfig: RuntimeSkillsConfig | null;\n}): Promise<SkillsPromptResult<SkillsInstallTarget[]>> {\n if (input.action === \"custom\") {\n return await resolveInteractiveCustomUninstallTarget(input.skillsConfig);\n }\n if (input.action === \"all\") {\n return {\n status: \"submitted\",\n value: input.uninstallableAgentTargets,\n };\n }\n return await promptSkillsAgentTargets({\n message: \"Select agents to uninstall OpenMeld skills from\",\n agentIds: input.uninstallableAgentIds,\n registry: input.registry,\n });\n}\n\nasync function resolveInteractiveCustomUninstallTarget(\n skillsConfig: RuntimeSkillsConfig | null\n): Promise<SkillsPromptResult<SkillsInstallTarget[]>> {\n const customDir = await promptForCustomSkillsDirForUninstall();\n if (customDir.status !== \"submitted\") {\n return customDir;\n }\n return {\n status: \"submitted\",\n value: [buildCustomSkillsTarget(customDir.value, skillsConfig)],\n };\n}\n\nasync function promptInteractiveInstallTargetChoice(input: {\n hasAgentTargets: boolean;\n allowBackToCaller: boolean;\n}): Promise<\n InteractiveSkillsTargetChoiceResult<InteractiveSkillsInstallChoice>\n> {\n const action = await select<\n InteractiveSkillsInstallChoice | typeof INTERACTIVE_NAVIGATION_CHOICE\n >({\n message: \"How do you want to install OpenMeld skills?\",\n initialValue: \"all\",\n options: buildInteractiveInstallTargetOptions({\n hasAgentTargets: input.hasAgentTargets,\n allowBackToCaller: input.allowBackToCaller,\n }),\n });\n return normalizeInteractiveSkillsTargetChoice({\n action,\n allowBackToCaller: input.allowBackToCaller,\n });\n}\n\nasync function resolveInteractiveInstallTargetAction(input: {\n action: InteractiveSkillsTargetChoice;\n actionableAgentTargets: SkillsInstallTarget[];\n actionableAgentIds: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n skillsConfig: RuntimeSkillsConfig | null;\n}): Promise<SkillsPromptResult<SkillsInstallTarget[]>> {\n if (input.action === \"custom\") {\n const customDir = await promptForCustomSkillsDir();\n if (customDir.status !== \"submitted\") {\n return customDir;\n }\n return {\n status: \"submitted\",\n value: [buildCustomSkillsTarget(customDir.value, input.skillsConfig)],\n };\n }\n if (input.action === \"all\") {\n return {\n status: \"submitted\",\n value: input.actionableAgentTargets,\n };\n }\n return promptSkillsAgentTargets({\n message: \"Choose agents to install OpenMeld skills for\",\n agentIds: input.actionableAgentIds,\n registry: input.registry,\n });\n}\n\nfunction buildInteractiveUninstallTargetOptions(input: {\n hasAgentTargets: boolean;\n allowBackToCaller: boolean;\n}): Array<{\n value: InteractiveSkillsTargetChoice | typeof INTERACTIVE_NAVIGATION_CHOICE;\n label: string;\n hint?: string;\n}> {\n if (!input.hasAgentTargets) {\n return [\n {\n value: \"custom\",\n label: \"Use a custom skills directory\",\n },\n {\n value: INTERACTIVE_NAVIGATION_CHOICE,\n label: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n },\n ];\n }\n return [\n {\n value: \"select\",\n label: \"Select agents with OpenMeld skills installed\",\n hint: \"Choose one or more agents\",\n },\n {\n value: \"all\",\n label: \"Uninstall from all installed agents\",\n },\n {\n value: \"custom\",\n label: \"Use a custom skills directory\",\n },\n {\n value: INTERACTIVE_NAVIGATION_CHOICE,\n label: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n },\n ];\n}\n\nfunction buildInteractiveInstallTargetOptions(input: {\n hasAgentTargets: boolean;\n allowBackToCaller: boolean;\n}): Array<{\n value: InteractiveSkillsInstallChoice | typeof INTERACTIVE_NAVIGATION_CHOICE;\n label: string;\n hint?: string;\n}> {\n if (!input.hasAgentTargets) {\n return [\n {\n value: \"custom\",\n label: \"Custom agent\",\n hint: \"Use a custom skills folder\",\n },\n {\n value: \"guide\",\n label: \"Manual install guide\",\n },\n {\n value: INTERACTIVE_NAVIGATION_CHOICE,\n label: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n },\n ];\n }\n return [\n {\n value: \"all\",\n label: \"Install automatically\",\n hint: \"For all detected agents that need it\",\n },\n {\n value: \"select\",\n label: \"Choose agents\",\n hint: \"Pick which agents to install or update\",\n },\n {\n value: \"custom\",\n label: \"Custom agent\",\n hint: \"Use a custom skills folder\",\n },\n {\n value: \"guide\",\n label: \"Manual install guide\",\n },\n {\n value: INTERACTIVE_NAVIGATION_CHOICE,\n label: input.allowBackToCaller ? \"Back\" : \"Cancel\",\n },\n ];\n}\n\nfunction normalizeInteractiveSkillsTargetChoice<TChoice>(input: {\n action: TChoice | typeof INTERACTIVE_NAVIGATION_CHOICE | symbol;\n allowBackToCaller: boolean;\n}): InteractiveSkillsTargetChoiceResult<TChoice> {\n if (\n isCancel(input.action) ||\n input.action === INTERACTIVE_NAVIGATION_CHOICE\n ) {\n return {\n status: input.allowBackToCaller ? \"back\" : \"cancelled\",\n };\n }\n return {\n status: \"selected\",\n value: input.action as TChoice,\n };\n}\n\nasync function promptSkillsAgentTargets(input: {\n message: string;\n agentIds: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n}): Promise<SkillsPromptResult<SkillsInstallTarget[]>> {\n const selected = await promptSearchMultiselect({\n message: input.message,\n items: input.agentIds.map((agentName) =>\n buildSkillsAgentSearchItem({\n agentId: agentName,\n displayName: input.registry[agentName]?.displayName ?? agentName,\n globalSkillsDir:\n input.registry[agentName]?.globalSkillsDir ?? \"no global skills dir\",\n })\n ),\n required: true,\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (selected.status === \"cancelled\" || selected.status === \"back\") {\n return selected;\n }\n return {\n status: \"submitted\",\n value: buildAgentTargets(\n selected.value.sort((a, b) => a.localeCompare(b)),\n input.registry\n ),\n };\n}\n\nfunction buildSkillsAgentSearchItem(input: {\n agentId: string;\n displayName: string;\n globalSkillsDir: string;\n}): SearchSelectItem<string> {\n return {\n value: input.agentId,\n label: input.displayName,\n detail: [`ID ${input.agentId}`, input.globalSkillsDir].join(\" · \"),\n searchText: [input.displayName, input.agentId, input.globalSkillsDir].join(\n \" \"\n ),\n };\n}\n\nasync function promptForCustomSkillsDir(): Promise<SkillsPromptResult<string>> {\n for (;;) {\n const answer = await promptTextEntry({\n message: \"Custom agent skills directory (absolute path)\",\n placeholder: \"/Users/<you>/.your-agent/skills\",\n allowBack: true,\n backLabel: \"Back\",\n requiredMessage: \"Path cannot be empty.\",\n });\n if (answer.status !== \"submitted\") {\n return answer;\n }\n\n const trimmed = String(answer.value ?? \"\").trim();\n if (!trimmed) {\n process.stderr.write(\"Path cannot be empty.\\n\");\n continue;\n }\n\n const resolvedDir = resolve(trimmed);\n const stats = await stat(resolvedDir).catch(() => null);\n if (!stats?.isDirectory()) {\n process.stderr.write(\n `${formatInlineOpenMeldCliCommands(\n \"Directory not found. Enter an existing directory path or run `openmeld skills install --guide`.\"\n )}\\n`\n );\n continue;\n }\n return {\n status: \"submitted\",\n value: resolvedDir,\n };\n }\n}\n\nfunction handleSkillsCommandExit(input: {\n status: \"back\" | \"cancelled\";\n allowBackToCaller: boolean;\n}): SkillsCommandNavigationResult {\n if (input.status === \"back\" && input.allowBackToCaller) {\n return \"back\";\n }\n cancel(\"Cancelled.\");\n return \"cancelled\";\n}\n\nasync function assertDirectoryExists(dir: string): Promise<void> {\n const stats = await stat(dir).catch(() => null);\n if (!stats?.isDirectory()) {\n throw new Error(\n formatSkillsCopy(\n `custom skills directory not found: ${dir}\\nuse an existing directory or run \\`openmeld skills install --guide\\``\n )\n );\n }\n}\n\nasync function persistSkillsInstallState(input: {\n previousSkillsConfig: RuntimeSkillsConfig | null;\n targets: SkillsInstallTarget[];\n installResults: SkillsInstallResult[];\n}): Promise<void> {\n const records = buildInstallRecords(input.installResults);\n\n await updateConfiguredSkillsConfig((currentSkillsConfig) => {\n const baseSkillsConfig = currentSkillsConfig ?? input.previousSkillsConfig;\n const installs = mergeInstallsByTargetDir(\n baseSkillsConfig?.installs,\n records\n );\n const customTargets = mergeCustomTargets(\n baseSkillsConfig?.customTargets,\n input.targets\n );\n return {\n storeDir: baseSkillsConfig?.storeDir ?? skillsDir(),\n ...(baseSkillsConfig?.agents ? { agents: baseSkillsConfig.agents } : {}),\n ...(customTargets.length > 0 ? { customTargets } : {}),\n installs,\n };\n });\n}\n\nfunction mergeInstallsByTargetDir(\n previous: RuntimeSkillsInstallRecord[] | undefined,\n next: RuntimeSkillsInstallRecord[]\n): RuntimeSkillsInstallRecord[] {\n const byTargetDir = new Map<string, RuntimeSkillsInstallRecord>();\n for (const record of previous ?? []) {\n byTargetDir.set(record.targetDir, record);\n }\n for (const record of next) {\n byTargetDir.set(record.targetDir, record);\n }\n return [...byTargetDir.values()].sort(compareInstallRecords);\n}\n\nfunction mergeCustomTargets(\n previous: RuntimeSkillsCustomTarget[] | undefined,\n targets: SkillsInstallTarget[]\n): RuntimeSkillsCustomTarget[] {\n const customTargetMap = new Map<string, RuntimeSkillsCustomTarget>();\n for (const target of previous ?? []) {\n customTargetMap.set(target.dir, {\n id: resolveRuntimeSkillsCustomTargetId({\n dir: target.dir,\n ...(target.id ? { id: target.id } : {}),\n }),\n name: target.name,\n dir: target.dir,\n });\n }\n\n for (const target of targets.filter((item) => item.type === \"custom\")) {\n const existingTarget = customTargetMap.get(target.dir);\n customTargetMap.set(target.dir, {\n id: resolveRuntimeSkillsCustomTargetId({\n dir: target.dir,\n ...(existingTarget?.id ? { id: existingTarget.id } : { id: target.id }),\n }),\n name: existingTarget?.name ?? basename(target.dir),\n dir: target.dir,\n });\n }\n\n return [...customTargetMap.values()];\n}\n\nfunction buildInstallRecords(\n results: SkillsInstallResult[]\n): RuntimeSkillsInstallRecord[] {\n const groups = new Map<string, SkillsInstallResult[]>();\n for (const result of results) {\n const key = `${result.targetId}${INSTALL_RECORD_GROUP_SEPARATOR}${result.targetDir}`;\n const list = groups.get(key) ?? [];\n list.push(result);\n groups.set(key, list);\n }\n\n const records: RuntimeSkillsInstallRecord[] = [];\n for (const [key, group] of groups) {\n // targetId comes from known agent ids or OpenMeld-generated custom ids like\n // \"custom-<hash>\", neither of which includes INSTALL_RECORD_GROUP_SEPARATOR.\n // Splitting on the first separator is safe for current input sources.\n const separatorIndex = key.indexOf(INSTALL_RECORD_GROUP_SEPARATOR);\n if (separatorIndex < 0) {\n continue;\n }\n const targetId = key.slice(0, separatorIndex);\n const targetDir = key.slice(\n separatorIndex + INSTALL_RECORD_GROUP_SEPARATOR.length\n );\n if (!(targetId && targetDir)) {\n continue;\n }\n const failed = group.filter((item) => item.status === \"failed\");\n const installed = group.filter((item) => item.status === \"installed\");\n const skipped = group.filter((item) => item.status === \"skipped\");\n\n let status: RuntimeSkillsInstallRecord[\"status\"] = \"skipped\";\n if (failed.length > 0) {\n status = \"failed\";\n } else if (installed.length > 0) {\n status = \"installed\";\n }\n const mode: RuntimeSkillsInstallRecord[\"mode\"] = group.some(\n (item) => item.mode === \"copy\"\n )\n ? \"copy\"\n : \"symlink\";\n const reason =\n [...failed, ...skipped]\n .map((entry) => entry.reason)\n .find((entry): entry is string => typeof entry === \"string\") ?? \"\";\n const skillIds = Array.from(\n new Set(group.map((entry) => entry.skillId))\n ).sort((a, b) => a.localeCompare(b));\n\n records.push({\n targetId,\n targetDir,\n mode,\n status,\n skillIds,\n ...(reason ? { reason } : {}),\n updatedAt: new Date().toISOString(),\n });\n }\n\n return records;\n}\n\nfunction emitInstallSummary(input: {\n resolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n installResults: SkillsInstallResult[];\n legacyFindings?: LegacyOpenMeldSkillFinding[];\n quiet?: boolean;\n storeDir: string;\n}): void {\n const summary = summarizeInstallResults(input.installResults);\n const installedTargets = summarizeInstalledTargets(input.installResults);\n const failed = input.installResults.filter(\n (item) => item.status === \"failed\"\n );\n const skipped = input.installResults.filter(\n (item) => item.status === \"skipped\"\n );\n const legacyFindings =\n input.resolvedView === \"agent\"\n ? formatLegacyOpenMeldSkillFindingsForAgentView(\n input.legacyFindings ?? []\n )\n : (input.legacyFindings ?? []);\n\n const payload = {\n storeDir: input.storeDir,\n summary,\n installedTargets,\n results: input.installResults,\n legacyFindings,\n legacyFindingCount: legacyFindings.length,\n legacyReview:\n legacyFindings.length > 0\n ? buildLegacyOpenMeldSkillAgentReview(legacyFindings)\n : null,\n requiresReview: summary.failed > 0 || legacyFindings.length > 0,\n };\n if (input.quiet && !payload.requiresReview) {\n return;\n }\n\n if (input.resolvedView === \"agent\") {\n emitLegacyOpenMeldSkillAgentAttention({\n legacyFindings,\n presenter: input.presenter,\n source: \"skills.install\",\n });\n input.presenter.data({\n code: \"skills.install.summary\",\n payload,\n });\n return;\n }\n\n emitInstallSummaryCardsForHuman({\n storeDir: input.storeDir,\n summary,\n installedTargets,\n legacyFindings: input.legacyFindings ?? [],\n skipped,\n failed,\n });\n}\n\nfunction summarizeInstalledTargets(results: SkillsInstallResult[]): Array<{\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillIds: string[];\n}> {\n const groups = new Map<\n string,\n {\n targetId: string;\n targetDir: string;\n targetType: \"agent\" | \"custom\";\n skillIds: Set<string>;\n }\n >();\n for (const result of results) {\n if (result.status !== \"installed\") {\n continue;\n }\n const key = [result.targetType, result.targetId, result.targetDir].join(\n INSTALL_RECORD_GROUP_SEPARATOR\n );\n const group = groups.get(key) ?? {\n targetId: result.targetId,\n targetDir: result.targetDir,\n targetType: result.targetType,\n skillIds: new Set<string>(),\n };\n group.skillIds.add(result.skillId);\n groups.set(key, group);\n }\n return [...groups.values()]\n .map((group) => ({\n targetId: group.targetId,\n targetDir: group.targetDir,\n targetType: group.targetType,\n skillIds: [...group.skillIds].sort((left, right) =>\n left.localeCompare(right)\n ),\n }))\n .sort((left, right) =>\n `${left.targetType}:${left.targetId}:${left.targetDir}`.localeCompare(\n `${right.targetType}:${right.targetId}:${right.targetDir}`\n )\n );\n}\n\nfunction emitUninstallSummary(input: {\n resolvedView: \"human\" | \"agent\";\n presenter: ReturnType<typeof createPresenter>;\n uninstallResults: SkillsUninstallResult[];\n storeDir: string;\n}): void {\n const summary = summarizeUninstallResults(input.uninstallResults);\n const failed = input.uninstallResults.filter(\n (item) => item.status === \"failed\"\n );\n const blocked = input.uninstallResults.filter(\n (item) => item.status === \"blocked\"\n );\n const skipped = input.uninstallResults.filter(\n (item) => item.status === \"skipped\"\n );\n const payload = {\n storeDir: input.storeDir,\n summary,\n results: input.uninstallResults,\n };\n\n if (input.resolvedView === \"agent\") {\n input.presenter.data({\n code: \"skills.uninstall.summary\",\n payload,\n });\n return;\n }\n\n emitSkillsUninstallSummaryCardsForHuman({\n storeDir: input.storeDir,\n summary,\n failed,\n blocked,\n skipped,\n });\n}\n\nfunction buildNonInteractiveInstallError(\n registry: ReturnType<typeof resolveSkillsAgentRegistry>,\n command: \"ensure\" | \"install\"\n): string {\n const examples = buildSkillsTargetSelectionExamples({\n agentExampleArg: resolveInstallableAgentExamplePair(registry),\n command,\n });\n return formatSkillsCopy(\n [\n `openmeld skills ${command} requires explicit target selection in non-interactive mode.`,\n \"\",\n \"Required:\",\n ...getSkillsTargetSelectionRequiredArguments(command).map(\n (argument) => ` ${argument}`\n ),\n \"\",\n \"Optional:\",\n ...getSkillsTargetSelectionOptionalArguments(command).map(\n (argument) => ` ${argument}`\n ),\n \"\",\n \"Examples:\",\n ...examples.map((command) => ` ${command}`),\n ].join(\"\\n\")\n );\n}\n\nfunction resolveSkillsInstallSelectionInput(\n input: SkillsInstallInput,\n command: \"ensure\" | \"install\" = \"install\"\n): {\n explicitAgents: string[];\n explicitDir: string;\n hasExplicitInstallArgs: boolean;\n} {\n const explicitDir = String(input.dir ?? \"\").trim();\n const explicitAgents = Array.from(\n new Set(\n (input.agent ?? [])\n .map((agent) => agent.trim().toLowerCase())\n .filter((agent) => agent.length > 0)\n )\n );\n const hasExplicitInstallArgs =\n input.all === true ||\n explicitAgents.length > 0 ||\n explicitDir.length > 0 ||\n input.guide === true;\n\n if (hasExplicitInstallArgs) {\n validateSkillsTargetSelectionInput({\n all: input.all === true,\n command,\n explicitAgentIds: explicitAgents,\n explicitDir: explicitDir.length > 0 ? explicitDir : null,\n guide: input.guide === true,\n });\n }\n\n return {\n explicitAgents,\n explicitDir,\n hasExplicitInstallArgs,\n };\n}\n\nfunction resolveExplicitAgentTargetsOrThrow(input: {\n action: \"ensure\" | \"install\" | \"uninstall\";\n explicitAgents: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n registryKeys: string[];\n installableRegistryKeys: string[];\n}): SkillsInstallTarget[] {\n const invalidAgents = input.explicitAgents.filter(\n (agent) => !input.registry[agent]\n );\n if (invalidAgents.length > 0) {\n throw new Error(\n `invalid agents: ${invalidAgents.join(\", \")}\\nvalid agents: ${input.registryKeys.join(\", \")}`\n );\n }\n const nonInstallableAgents = input.explicitAgents.filter(\n (agent) => !isAgentSkillsInstallable(agent, input.registry)\n );\n if (nonInstallableAgents.length > 0) {\n throw new Error(\n buildNonInstallableAgentSelectionError({\n action: input.action,\n nonInstallableAgents,\n installableAgents: input.installableRegistryKeys,\n })\n );\n }\n if (!canManageRegistryAgentSkillTargets()) {\n const laneBlockedAgents = input.explicitAgents.filter(\n (agent) =>\n input.registry[agent]?.globalSkillsDirSource !== \"config-override\"\n );\n if (laneBlockedAgents.length > 0) {\n throw new Error(\n formatInlineOpenMeldCliCommands(\n `agent skills directories for ${laneBlockedAgents.join(\", \")} are managed by the published OpenMeld home and cannot be targeted from this lane-specific OpenMeld home; use \\`openmeld skills ${input.action} --dir <absolute-path>\\` for lane-local targets`\n )\n );\n }\n }\n return buildAgentTargets(input.explicitAgents, input.registry);\n}\n\nfunction resolveDetectedInstallableTargetsOrThrow(input: {\n installedAgents: string[];\n registry: ReturnType<typeof resolveSkillsAgentRegistry>;\n action: \"ensure\" | \"install\" | \"uninstall\";\n}): SkillsInstallTarget[] {\n const targets = buildAgentTargets(input.installedAgents, input.registry);\n if (targets.length > 0) {\n return targets;\n }\n if (!canManageRegistryAgentSkillTargets()) {\n throw new Error(\n formatInlineOpenMeldCliCommands(\n `detected agent skills directories are managed by the published OpenMeld home and cannot be targeted from this lane-specific OpenMeld home; use \\`openmeld skills ${input.action} --dir <absolute-path>\\` for lane-local targets`\n )\n );\n }\n if (input.action === \"install\" || input.action === \"ensure\") {\n throw new Error(\n formatInlineOpenMeldCliCommands(\n `no installable detected agents were found in your home directory; use \\`openmeld skills ${input.action} --dir <absolute-path>\\` or \\`openmeld skills ${input.action} --guide\\``\n )\n );\n }\n throw new Error(\n formatInlineOpenMeldCliCommands(\n \"no installable detected agents were found in your home directory; use `openmeld skills uninstall --dir <absolute-path>`\"\n )\n );\n}\n\nfunction isAgentSkillsInstallable(\n agentId: string,\n registry: ReturnType<typeof resolveSkillsAgentRegistry>\n): boolean {\n return registry[agentId]?.skillsInstallable === true;\n}\n\nfunction resolveInstallableAgentIds(\n registry: ReturnType<typeof resolveSkillsAgentRegistry>\n): string[] {\n return Object.entries(registry)\n .filter((entry) => entry[1].skillsInstallable === true)\n .map((entry) => entry[0]);\n}\n\nfunction buildNonInstallableAgentSelectionError(input: {\n action: \"ensure\" | \"install\" | \"uninstall\";\n nonInstallableAgents: string[];\n installableAgents: string[];\n}): string {\n const installableAgentsLine =\n input.installableAgents.length > 0\n ? input.installableAgents.join(\", \")\n : \"(none)\";\n return [\n `unsupported agents for skills ${input.action}: ${input.nonInstallableAgents.join(\", \")}`,\n \"known agents but not installable (skillsInstallable=false)\",\n `installable agents: ${installableAgentsLine}`,\n ].join(\"\\n\");\n}\n\nimport {\n buildAgentTargets,\n compareInstallRecords,\n filterTargetsWithInstalledOpenMeldSkills,\n mergeTargetsByDir,\n persistDetectedInstallStateFromCheck,\n resolveTrackedInstallTargets,\n summarizeSkillState,\n} from \"../skills/installation-inventory\";\n","import { runSkillsInstall } from \"../commands/skills\";\nimport { collectSkillsReadinessSnapshot } from \"../skills/installation-inventory\";\nimport type { StartReadinessSnapshot } from \"./readiness-types\";\n\nexport function collectStartLocalSkillsReadiness(): Promise<\n StartReadinessSnapshot[\"skills\"]\n> {\n return collectSkillsReadinessSnapshot()\n .then((snapshot) => ({\n status: snapshot.status,\n targetCount: snapshot.targetCount,\n summary: snapshot.summary,\n }))\n .catch((error) => ({\n status: \"unknown\" as const,\n targetCount: 0,\n summary: {\n upToDate: 0,\n outdated: 0,\n missing: 0,\n externalConflict: 0,\n },\n error:\n error instanceof Error && error.message.trim().length > 0\n ? error.message.trim()\n : \"skills readiness unavailable\",\n }));\n}\n\nexport async function runStartLocalSkillsInstall(input: {\n view?: string;\n allowBackToCaller?: boolean;\n}): Promise<Awaited<ReturnType<typeof runSkillsInstall>>> {\n return await runSkillsInstall(input);\n}\n","import { collectStartLocalAgentsReadiness } from \"./agents-local\";\nimport { collectStartLocalBackgroundHelperReadiness } from \"./background-helper-local\";\nimport type { StartReadinessSnapshot } from \"./readiness-types\";\nimport { collectStartLocalSkillsReadiness } from \"./skills-local\";\n\nexport async function collectStartLocalReadiness(input: {\n auth: StartReadinessSnapshot[\"auth\"];\n}): Promise<StartReadinessSnapshot> {\n // OPENMELD_SERVICE_THIN_CORE: legacy composite input for setup.\n // This currently combines skills, local agents, and service evidence for\n // setup UX. Phase 2 should extract runtime inventory so this snapshot stops\n // acting like a readiness proof for unrelated product surfaces.\n const [skills, agents, service] = await Promise.all([\n collectStartLocalSkillsReadiness(),\n collectStartLocalAgentsReadiness(),\n collectStartLocalBackgroundHelperReadiness(),\n ]);\n\n return {\n auth: input.auth,\n skills,\n agents,\n service,\n };\n}\n","import { closeSync, openSync } from \"node:fs\";\nimport process from \"node:process\";\nimport { ReadStream, WriteStream } from \"node:tty\";\nimport type { InteractivePromptStreams } from \"./interactive-prompt\";\n\nexport type ControllingTerminalSession = {\n streams: InteractivePromptStreams;\n close: () => void;\n};\n\nconst CONTROLLING_TERMINAL_PATH = \"/dev/tty\";\n\nfunction hasUsableProcessTerminal(): boolean {\n return (\n process.stdin.isTTY === true &&\n process.stdout.isTTY === true &&\n typeof process.stdin.setRawMode === \"function\"\n );\n}\n\nfunction closeFdSafely(fd: number | null): void {\n if (fd === null) {\n return;\n }\n try {\n closeSync(fd);\n } catch {\n // The fd may already be owned/closed by a stream; ignore.\n }\n}\n\n// Resolve a terminal we can prompt on. The fast path reuses the process std\n// streams when both are real TTYs. Otherwise — most importantly under the\n// `curl | sh` setup bootstrap, where the CLI runs with stdin redirected to\n// /dev/null — we open the controlling terminal (/dev/tty) directly so an\n// interactive prompt can still read keys and render. Returns null when no\n// controlling terminal is available (Windows, CI, fully headless), so callers\n// can fall back to a non-interactive default.\nexport function resolveControllingTerminalSession(): ControllingTerminalSession | null {\n if (hasUsableProcessTerminal()) {\n return {\n streams: { input: process.stdin, output: process.stdout },\n close: () => undefined,\n };\n }\n\n // /dev/tty is POSIX-only; Windows has no equivalent device path here.\n if (process.platform === \"win32\") {\n return null;\n }\n\n let readFd: number | null = null;\n let writeFd: number | null = null;\n let input: ReadStream | null = null;\n let output: WriteStream | null = null;\n try {\n readFd = openSync(CONTROLLING_TERMINAL_PATH, \"r\");\n input = new ReadStream(readFd);\n readFd = null; // Ownership transferred to the stream.\n writeFd = openSync(CONTROLLING_TERMINAL_PATH, \"w\");\n output = new WriteStream(writeFd);\n writeFd = null; // Ownership transferred to the stream.\n\n // Belt-and-suspenders: `new ReadStream`/`WriteStream` already throws\n // ERR_TTY_INIT_FAILED on a non-tty fd (handled by the catch below), so for a\n // real /dev/tty this guard is rarely hit. It covers the exotic case where the\n // device opens and constructs but does not report as a TTY.\n if (\n input.isTTY !== true ||\n output.isTTY !== true ||\n typeof input.setRawMode !== \"function\"\n ) {\n input.destroy();\n output.destroy();\n return null;\n }\n\n const ttyInput = input;\n const ttyOutput = output;\n return {\n streams: { input: ttyInput, output: ttyOutput },\n close: () => {\n ttyInput.destroy();\n ttyOutput.destroy();\n },\n };\n } catch {\n if (input) {\n input.destroy();\n } else {\n closeFdSafely(readFd);\n }\n if (output) {\n output.destroy();\n } else {\n closeFdSafely(writeFd);\n }\n return null;\n }\n}\n","import type { RuntimeContext } from \"../runtime/context\";\nimport type { Presenter } from \"../runtime/presenter\";\nimport { createDelayedSpinner } from \"./delayed-spinner\";\nimport {\n formatElapsedTime,\n MIN_VISIBLE_ELAPSED_TIME_MS,\n resolveElapsedTimeMs,\n} from \"./elapsed-time\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\n\ntype SetupProgressLineState = \"pending\" | \"success\" | \"failed\";\ntype SetupProgressStepState = \"started\" | \"completed\" | \"failed\";\ntype SetupProgressClock = {\n now: () => number;\n};\n\nexport type SetupProgressStepHandle = {\n cancel: () => void;\n complete: (message?: string) => void;\n detail: (input: { code?: string; text: string }) => void;\n fail: (message?: string) => void;\n};\n\nexport type SetupProgressReporter = {\n detail: (input: {\n code: string;\n data?: Record<string, unknown>;\n text: string;\n }) => void;\n line: (input: {\n code: string;\n data?: Record<string, unknown>;\n state: SetupProgressLineState;\n text: string;\n }) => void;\n startStep: (input: {\n code: string;\n data?: Record<string, unknown>;\n text: string;\n }) => SetupProgressStepHandle;\n};\n\nexport function createSetupProgressReporter(input: {\n clock?: SetupProgressClock;\n presenter: Presenter;\n runtime: RuntimeContext;\n}): SetupProgressReporter {\n const mode = resolveSetupProgressRenderMode(input.runtime);\n const now = input.clock?.now ?? Date.now;\n\n return {\n detail: (detail) => {\n if (mode === \"agent\") {\n emitAgentProgressLine({\n presenter: input.presenter,\n code: detail.code,\n state: \"started\",\n text: formatSetupProgressActiveText(detail.text),\n data: detail.data,\n });\n return;\n }\n\n input.presenter.line({\n code: detail.code,\n text: ` ${formatSetupProgressActiveText(detail.text)}`,\n });\n },\n line: (line) => {\n if (mode === \"agent\") {\n emitAgentProgressLine({\n presenter: input.presenter,\n code: line.code,\n state: line.state,\n text:\n line.state === \"pending\"\n ? formatSetupProgressActiveText(line.text)\n : formatSetupProgressResultText(line.text),\n data: line.data,\n });\n return;\n }\n\n emitHumanProgressLine({\n presenter: input.presenter,\n state: line.state,\n text:\n line.state === \"pending\"\n ? formatSetupProgressActiveText(line.text)\n : formatSetupProgressResultText(line.text),\n code: line.code,\n });\n },\n startStep: (step) => {\n const startedText = formatSetupProgressActiveText(step.text);\n const startedAtMs = now();\n\n if (mode === \"agent\") {\n emitAgentProgressLine({\n presenter: input.presenter,\n code: step.code,\n state: \"started\",\n text: startedText,\n data: step.data,\n });\n return createAgentStepHandle({\n code: step.code,\n data: step.data,\n presenter: input.presenter,\n now,\n startedAtMs,\n startedText,\n });\n }\n\n if (mode === \"human_tty\") {\n return createHumanTtyStepHandle({\n presenter: input.presenter,\n code: step.code,\n now,\n startedText,\n startedAtMs,\n });\n }\n\n emitHumanProgressLine({\n presenter: input.presenter,\n code: step.code,\n state: \"pending\",\n text: startedText,\n });\n return createHumanStaticStepHandle({\n code: step.code,\n now,\n presenter: input.presenter,\n startedAtMs,\n });\n },\n };\n}\n\nexport function formatSetupProgressActiveText(text: string): string {\n const normalized = formatSetupProgressResultText(text).replaceAll(\n /\\.+$/g,\n \"\"\n );\n return `${normalized}...`;\n}\n\nfunction createAgentStepHandle(input: {\n code: string;\n data?: Record<string, unknown>;\n now: () => number;\n presenter: Presenter;\n startedAtMs: number;\n startedText: string;\n}): SetupProgressStepHandle {\n let closed = false;\n return {\n cancel: () => {\n closed = true;\n },\n complete: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, input.now());\n emitAgentProgressLine({\n presenter: input.presenter,\n code: `${input.code}.completed`,\n state: \"completed\",\n text: message\n ? formatSetupProgressResultText(message)\n : input.startedText,\n data: withStepDuration(input.data, durationMs),\n });\n },\n detail: (detail) => {\n if (closed) {\n return;\n }\n emitAgentProgressLine({\n presenter: input.presenter,\n code: detail.code ?? `${input.code}.detail`,\n state: \"started\",\n text: formatSetupProgressActiveText(detail.text),\n data: input.data,\n });\n },\n fail: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, input.now());\n emitAgentProgressLine({\n presenter: input.presenter,\n code: `${input.code}.failed`,\n state: \"failed\",\n text: message\n ? formatSetupProgressResultText(message)\n : input.startedText,\n data: withStepDuration(input.data, durationMs),\n });\n },\n };\n}\n\nfunction createHumanTtyStepHandle(input: {\n code: string;\n now: () => number;\n presenter: Presenter;\n startedAtMs: number;\n startedText: string;\n}): SetupProgressStepHandle {\n const spinner = createDelayedSpinner({\n enabled: true,\n message: input.startedText,\n });\n spinner.start();\n let closed = false;\n\n return {\n cancel: () => {\n if (closed) {\n return;\n }\n closed = true;\n spinner.fail();\n },\n complete: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const completedAtMs = input.now();\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, completedAtMs);\n const resultText = message\n ? withHumanStepDuration(\n formatSetupProgressResultText(message),\n durationMs\n )\n : null;\n spinner.complete();\n if (message) {\n emitHumanProgressLine({\n presenter: input.presenter,\n code: `${input.code}.completed`,\n completedAtMs,\n state: \"success\",\n text: resultText ?? \"\",\n });\n }\n },\n detail: (detail) => {\n if (closed) {\n return;\n }\n spinner.message(formatSetupProgressActiveText(detail.text));\n },\n fail: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const completedAtMs = input.now();\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, completedAtMs);\n spinner.fail();\n if (message) {\n emitHumanProgressLine({\n presenter: input.presenter,\n code: `${input.code}.failed`,\n completedAtMs,\n state: \"failed\",\n text: withHumanStepDuration(\n formatSetupProgressResultText(message),\n durationMs\n ),\n });\n }\n },\n };\n}\n\nfunction createHumanStaticStepHandle(input: {\n code: string;\n now: () => number;\n presenter: Presenter;\n startedAtMs: number;\n}): SetupProgressStepHandle {\n let closed = false;\n return {\n cancel: () => {\n closed = true;\n },\n complete: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const completedAtMs = input.now();\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, completedAtMs);\n if (message) {\n emitHumanProgressLine({\n presenter: input.presenter,\n code: `${input.code}.completed`,\n completedAtMs,\n state: \"success\",\n text: withHumanStepDuration(\n formatSetupProgressResultText(message),\n durationMs\n ),\n });\n }\n },\n detail: (detail) => {\n if (closed) {\n return;\n }\n input.presenter.line({\n code: detail.code ?? `${input.code}.detail`,\n text: ` ${formatSetupProgressActiveText(detail.text)}`,\n });\n },\n fail: (message) => {\n if (closed) {\n return;\n }\n closed = true;\n const completedAtMs = input.now();\n const durationMs = resolveElapsedTimeMs(input.startedAtMs, completedAtMs);\n if (message) {\n emitHumanProgressLine({\n presenter: input.presenter,\n code: `${input.code}.failed`,\n completedAtMs,\n state: \"failed\",\n text: withHumanStepDuration(\n formatSetupProgressResultText(message),\n durationMs\n ),\n });\n }\n },\n };\n}\n\nfunction resolveSetupProgressRenderMode(\n runtime: RuntimeContext\n): \"agent\" | \"human_static\" | \"human_tty\" {\n if (runtime.resolvedView === \"agent\") {\n return \"agent\";\n }\n // Setup and Prepare can open prompts while a step is in progress. Keep the\n // shared terminal single-owner: prompt-capable human sessions use durable\n // progress lines, while non-interactive sessions may animate on a TTY.\n if (runtime.interactive) {\n return \"human_static\";\n }\n if (process.stdout.isTTY === true) {\n return \"human_tty\";\n }\n return \"human_static\";\n}\n\nfunction emitAgentProgressLine(input: {\n code: string;\n data?: Record<string, unknown>;\n presenter: Presenter;\n state: SetupProgressLineState | SetupProgressStepState;\n text: string;\n}): void {\n input.presenter.line({\n code: input.code,\n text: input.text,\n data: {\n ...(input.data ?? {}),\n message: input.text,\n state: input.state,\n },\n });\n}\n\nfunction emitHumanProgressLine(input: {\n code: string;\n completedAtMs?: number;\n presenter: Presenter;\n state: SetupProgressLineState;\n text: string;\n}): void {\n const marker = resolveHumanProgressMarker(input.state);\n const completedAt =\n input.completedAtMs === undefined\n ? \"\"\n : `[${formatLocalClockTime(input.completedAtMs)}] `;\n input.presenter.line({\n code: input.code,\n text: `${completedAt}${marker} ${input.text}`,\n });\n}\n\nfunction resolveHumanProgressMarker(state: SetupProgressLineState): string {\n if (state === \"success\") {\n return \"✓\";\n }\n if (state === \"failed\") {\n return \"!\";\n }\n return \"•\";\n}\n\nfunction formatSetupProgressResultText(text: string): string {\n return sanitizeTerminalDisplayText(text, \"single-line\").trim();\n}\n\nfunction withStepDuration(\n data: Record<string, unknown> | undefined,\n durationMs: number\n): Record<string, unknown> | undefined {\n if (durationMs < MIN_VISIBLE_ELAPSED_TIME_MS) {\n return data;\n }\n return { ...(data ?? {}), durationMs };\n}\n\nfunction withHumanStepDuration(text: string, durationMs: number): string {\n return `${text} · ${formatElapsedTime(durationMs)}`;\n}\n\nfunction formatLocalClockTime(timestampMs: number): string {\n const completedAt = new Date(timestampMs);\n return [\n completedAt.getHours(),\n completedAt.getMinutes(),\n completedAt.getSeconds(),\n ]\n .map((part) => String(part).padStart(2, \"0\"))\n .join(\":\");\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execute = promisify(execFile);\nconst PRODUCT_VERSION = /^ProductVersion:\\s*([0-9]+(?:\\.[0-9]+){1,3})\\s*$/mu;\nconst BUILD_VERSION = /^BuildVersion:\\s*([A-Za-z0-9.]+)\\s*$/mu;\n\nexport function parseMacOSVersion(output: string): {\n productVersion: string;\n buildVersion: string;\n} {\n const productVersion = PRODUCT_VERSION.exec(output)?.[1];\n const buildVersion = BUILD_VERSION.exec(output)?.[1];\n if (!(productVersion && buildVersion) || buildVersion.length > 64) {\n throw new Error(\"Invalid macOS version output\");\n }\n return { productVersion, buildVersion };\n}\n\nexport async function readMacOSVersion(): Promise<{\n productVersion: string;\n buildVersion: string;\n} | null> {\n if (process.platform !== \"darwin\") {\n return null;\n }\n const { stdout } = await execute(\"/usr/bin/sw_vers\", [], {\n timeout: 1500,\n maxBuffer: 4096,\n env: { PATH: \"/usr/bin:/bin\", LANG: \"C\", LC_ALL: \"C\" },\n });\n return parseMacOSVersion(stdout);\n}\n","import os from \"node:os\";\nimport process from \"node:process\";\nimport {\n PREPARE_STEP_DIAGNOSTICS_MAX_CHARS,\n prepareStepDiagnosticsBundleSchema,\n redactPrepareStepDiagnosticsBundle,\n redactPrepareStepDiagnosticsText,\n redactPrepareStepDiagnosticsValue,\n} from \"@openmeld/schemas\";\nimport type { PrepareStepDiagnosticsBundle } from \"@openmeld/schemas/types\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { resolveCurrentDaemonExpectedVersion } from \"../local-service/lifecycle/current-daemon-version\";\nimport {\n type DaemonLifecycleEvent,\n readRecentDaemonLifecycleEvents,\n} from \"../local-service/lifecycle/daemon-lifecycle-journal\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport {\n type DaemonServiceJobDiagnostics,\n isDaemonServiceJobNeverSpawned,\n readDaemonServiceJobCrashExitCode,\n resolveDaemonServiceManager,\n} from \"../local-service/lifecycle/daemon-service-manager\";\nimport { readDaemonIncidentLogTail } from \"../local-service/lifecycle/daemon-start-failure-log\";\nimport { getCliVersionInfo } from \"../runtime/cli-version\";\nimport { collectLocalOperationFailure } from \"../system/local-operation-diagnostics\";\nimport { readMacOSVersion } from \"../system/macos-version\";\n\n// Serialized payload budget. Stays below the schema cap\n// (PREPARE_STEP_DIAGNOSTICS_MAX_CHARS) so the bundle can never be rejected\n// for size alone.\nexport const PREPARE_STEP_DIAGNOSTICS_PAYLOAD_MAX_CHARS = Math.min(\n 16_000,\n PREPARE_STEP_DIAGNOSTICS_MAX_CHARS\n);\nexport const OPENMELD_NO_DIAGNOSTICS_ENV = \"OPENMELD_NO_DIAGNOSTICS\";\n\n// Additive v3 evidence: incident window, native operation and macOS versions.\nconst PREPARE_STEP_DIAGNOSTICS_BUNDLE_VERSION = 3;\nconst INCIDENT_WINDOW_MS = 15 * 60 * 1000;\n\nconst LIFECYCLE_JOURNAL_TAIL_MAX_ENTRIES = 10;\nconst SERVICE_LOG_TAIL_MAX_LINES = 30;\nconst SERVICE_LOG_LINE_MAX_CHARS = 320;\nconst JOURNAL_ENTRY_MAX_CHARS = 700;\nconst SOURCE_TIMEOUT_MS = 2000;\nconst OS_STATUS_PATTERN = /OSStatus (-?\\d+)/u;\n\n// Only these lifecycle journal metadata keys survive into the bundle. The\n// launchd wait_running failure event carries the highest-value evidence here\n// (errorMessage plus the jobDiagnostics launchd probe); everything else is\n// dropped so the entry stays small and free of unvetted local content.\n// `processUptimeMs` is the daemon-run begin marker used to separate launchd\n// spawn-decision latency from daemon early init when a remote report explains\n// a slow startup.\nconst LIFECYCLE_JOURNAL_METADATA_WHITELIST = [\n \"action\",\n \"ok\",\n \"errorMessage\",\n \"jobDiagnostics\",\n \"durationMs\",\n \"reason\",\n \"failureStage\",\n \"reasonCodes\",\n \"processUptimeMs\",\n \"operation\",\n \"distribution\",\n \"actorPid\",\n \"parentPid\",\n \"targetCategory\",\n \"operationFailure\",\n] as const;\n\n// jobDiagnostics is the heaviest whitelisted field, and the failure\n// errorMessage already embeds the same launchd evidence in prose. When a\n// whitelisted entry still exceeds the per-entry budget, jobDiagnostics is the\n// most redundant field to shed while keeping errorMessage intact.\nconst LIFECYCLE_JOURNAL_METADATA_COMPACT_WHITELIST =\n LIFECYCLE_JOURNAL_METADATA_WHITELIST.filter(\n (key) => key !== \"jobDiagnostics\"\n );\n\n// The whole daemon-system-service.log is unreadable/absent (never-spawned) or\n// empty. Kept separate from the collected line array so the bundle can carry\n// serviceLogTail: null plus an explicit reason instead of an ambiguous [].\nexport type PrepareStepServiceLogTail = {\n lines: string[];\n note: \"file_missing\" | \"file_empty\" | null;\n window?: PrepareStepDiagnosticsBundle[\"serviceLogWindow\"];\n};\n\n// The bundle is whitelist-only: every field is either derived from the failed\n// step itself, from CLI/package metadata, or from OpenMeld-owned runtime files\n// (daemon lifecycle journal, daemon-system-service.log, service contract) and\n// structured service-manager probes. It must never carry env vars, tokens, or\n// content from files outside those sources.\nexport type PrepareStepDiagnosticsSources = {\n readLifecycleJournalTail?: () => Promise<DaemonLifecycleEvent[]>;\n readServiceLogTail?: () => Promise<PrepareStepServiceLogTail>;\n readInventoryAnomalyCodes?: () => Promise<string[]>;\n readServiceJobDiagnostics?: () => Promise<DaemonServiceJobDiagnostics | null>;\n readDeviceId?: () => Promise<string | null>;\n readMacOSVersion?: typeof readMacOSVersion;\n};\n\nexport function isPrepareStepDiagnosticsOptedOut(\n env: NodeJS.ProcessEnv = process.env\n): boolean {\n return String(env[OPENMELD_NO_DIAGNOSTICS_ENV] ?? \"\").trim() === \"1\";\n}\n\nexport async function collectPrepareStepDiagnostics(input: {\n stepId: string;\n supportCode: string;\n error?: unknown;\n env?: NodeJS.ProcessEnv;\n sources?: PrepareStepDiagnosticsSources;\n now?: Date;\n}): Promise<string | null> {\n try {\n if (isPrepareStepDiagnosticsOptedOut(input.env)) {\n return null;\n }\n const sources = input.sources ?? {};\n const now = input.now ?? new Date();\n const evidenceWindow = {\n startedAt: new Date(now.getTime() - INCIDENT_WINDOW_MS).toISOString(),\n endedAt: now.toISOString(),\n };\n const collectionErrors: string[] = [];\n const [\n lifecycleJournalTail,\n serviceLog,\n inventoryAnomalies,\n serviceJob,\n deviceId,\n macOSVersion,\n ] = await Promise.all([\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"lifecycle_journal\",\n read:\n sources.readLifecycleJournalTail ??\n (() =>\n readRecentDaemonLifecycleEvents({\n maxEntries: 100,\n })),\n }),\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"service_log\",\n read:\n sources.readServiceLogTail ??\n (() =>\n readDaemonIncidentLogTail({\n ...evidenceWindow,\n maxLines: SERVICE_LOG_TAIL_MAX_LINES,\n })),\n }),\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"inventory_anomalies\",\n read: sources.readInventoryAnomalyCodes ?? readInventoryAnomalyCodes,\n }),\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"service_job\",\n read: sources.readServiceJobDiagnostics ?? readServiceJobDiagnostics,\n }),\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"device_id\",\n read: sources.readDeviceId ?? readDaemonServiceContractDeviceId,\n }),\n collectDiagnosticsSource({\n collectionErrors,\n sourceName: \"macos_version\",\n read: sources.readMacOSVersion ?? readMacOSVersion,\n }),\n ]);\n // A note (file_missing/file_empty) or a failed collection both leave\n // serviceLogTail null; the note carries the reason without polluting\n // collectionErrors, which stays reserved for genuine collection failures.\n const serviceLogNote = serviceLog?.note ?? null;\n const serviceLogTail =\n serviceLog === null || serviceLogNote !== null\n ? null\n : serviceLog.lines.map(boundServiceLogLine);\n const cliVersion = getCliVersionInfo().version;\n const nativeFailure = resolveNativeFailure(input.error);\n const operationFailure = collectLocalOperationFailure(input.error);\n const bundle: PrepareStepDiagnosticsBundle = {\n bundleVersion: PREPARE_STEP_DIAGNOSTICS_BUNDLE_VERSION,\n collectedAt: now.toISOString(),\n supportCode: input.supportCode,\n ...(nativeFailure ? { nativeFailure } : {}),\n ...(operationFailure ? { operationFailure } : {}),\n evidenceWindow,\n ...(serviceLog?.window ? { serviceLogWindow: serviceLog.window } : {}),\n stepId: input.stepId,\n ...(deviceId ? { deviceId } : {}),\n cliVersion,\n os: {\n platform: process.platform,\n release: os.release(),\n ...macOSVersion,\n },\n inventoryAnomalies,\n serviceJob,\n lifecycleJournalTail:\n lifecycleJournalTail === null\n ? null\n : lifecycleJournalTail\n .filter((entry) => {\n const timestamp = Date.parse(entry.timestamp);\n return (\n timestamp >= Date.parse(evidenceWindow.startedAt) &&\n timestamp <= now.getTime()\n );\n })\n .map(boundLifecycleJournalEntry),\n serviceLogTail,\n ...(serviceLogNote ? { serviceLogNote } : {}),\n collectionErrors,\n truncated: false,\n };\n return serializeBoundedPrepareStepDiagnostics(bundle);\n } catch {\n // Diagnostics are strictly best-effort: collection failures must never\n // affect the setup flow or the base failure report.\n return null;\n }\n}\n\nfunction resolveNativeFailure(error: unknown): { osStatus: number } | null {\n let current = error;\n for (let depth = 0; depth < 4 && current instanceof Error; depth += 1) {\n const match = OS_STATUS_PATTERN.exec(current.message);\n if (match && Number.isSafeInteger(Number(match[1]))) {\n return { osStatus: Number(match[1]) };\n }\n current = current.cause;\n }\n return null;\n}\n\nexport function serializeBoundedPrepareStepDiagnostics(\n bundle: PrepareStepDiagnosticsBundle\n): string | null {\n const cappedForSchema =\n (bundle.inventoryAnomalies?.length ?? 0) > 32 ||\n (bundle.lifecycleJournalTail?.length ?? 0) >\n LIFECYCLE_JOURNAL_TAIL_MAX_ENTRIES ||\n (bundle.serviceLogTail?.length ?? 0) > SERVICE_LOG_TAIL_MAX_LINES ||\n bundle.collectionErrors.length > 8;\n let candidate = redactPrepareStepDiagnosticsBundle({\n ...bundle,\n inventoryAnomalies:\n bundle.inventoryAnomalies === null\n ? null\n : bundle.inventoryAnomalies.slice(-32),\n lifecycleJournalTail:\n bundle.lifecycleJournalTail === null\n ? null\n : bundle.lifecycleJournalTail.slice(\n -LIFECYCLE_JOURNAL_TAIL_MAX_ENTRIES\n ),\n serviceLogTail:\n bundle.serviceLogTail === null\n ? null\n : bundle.serviceLogTail\n .slice(-SERVICE_LOG_TAIL_MAX_LINES)\n .map(boundServiceLogLine),\n collectionErrors: bundle.collectionErrors.slice(-8),\n truncated: bundle.truncated || cappedForSchema,\n });\n let serialized = JSON.stringify(candidate);\n if (serialized.length <= PREPARE_STEP_DIAGNOSTICS_PAYLOAD_MAX_CHARS) {\n return finalizePrepareStepDiagnosticsSerialization(candidate);\n }\n\n candidate = { ...candidate, truncated: true };\n serialized = JSON.stringify(candidate);\n while (serialized.length > PREPARE_STEP_DIAGNOSTICS_PAYLOAD_MAX_CHARS) {\n const serviceLogTail = candidate.serviceLogTail;\n const lifecycleJournalTail = candidate.lifecycleJournalTail;\n if (serviceLogTail && serviceLogTail.length > 0) {\n // Drop the oldest filtered log line first; the newest lines carry the\n // failure evidence.\n candidate = { ...candidate, serviceLogTail: serviceLogTail.slice(1) };\n } else if (lifecycleJournalTail && lifecycleJournalTail.length > 0) {\n candidate = {\n ...candidate,\n lifecycleJournalTail: lifecycleJournalTail.slice(1),\n };\n } else {\n // Every remaining field is already bounded; drop the tails entirely as\n // a final guarantee.\n candidate = {\n ...candidate,\n lifecycleJournalTail: null,\n serviceLogTail: null,\n };\n serialized = JSON.stringify(candidate);\n break;\n }\n serialized = JSON.stringify(candidate);\n }\n return finalizePrepareStepDiagnosticsSerialization(candidate);\n}\n\nasync function collectDiagnosticsSource<T>(input: {\n collectionErrors: string[];\n sourceName: string;\n read: () => Promise<T>;\n}): Promise<T | null> {\n let timer: NodeJS.Timeout | null = null;\n try {\n return await Promise.race([\n input.read(),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"diagnostics source timed out\")),\n SOURCE_TIMEOUT_MS\n );\n }),\n ]);\n } catch {\n // Record only the source name: error text could echo local details that\n // are not part of the whitelist.\n input.collectionErrors.push(input.sourceName);\n return null;\n } finally {\n if (timer !== null) {\n clearTimeout(timer);\n }\n }\n}\n\nasync function readInventoryAnomalyCodes(): Promise<string[]> {\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: resolveCurrentDaemonExpectedVersion(),\n });\n return inventory.anomalies.map((anomaly) => anomaly.code);\n}\n\nasync function readServiceJobDiagnostics(): Promise<DaemonServiceJobDiagnostics | null> {\n const manager = await resolveDaemonServiceManager();\n return (await manager?.readJobDiagnostics?.()) ?? null;\n}\n\nexport type PrepareServiceJobVerdict = \"never_spawned\" | \"crashed\";\n\n// Best-effort launchd job-state verdict for a failed service startup so the\n// human-facing setup message can name the root cause — a job macOS never\n// spawned (Login Items / Background Task Management blocked) versus a crash\n// loop. Diagnostic evidence only: it must never gate any setup decision.\nexport async function resolvePrepareServiceJobVerdict(): Promise<PrepareServiceJobVerdict | null> {\n const diagnostics = await readServiceJobDiagnostics().catch(() => null);\n if (!diagnostics) {\n return null;\n }\n if (isDaemonServiceJobNeverSpawned(diagnostics)) {\n return \"never_spawned\";\n }\n if (readDaemonServiceJobCrashExitCode(diagnostics) !== null) {\n return \"crashed\";\n }\n return null;\n}\n\n// Reads the OpenMeld-internal device UUID from the local service contract. Returns\n// null (rather than throwing) for the common never-set-up case where the\n// contract file is absent, so the bundle simply omits deviceId.\nasync function readDaemonServiceContractDeviceId(): Promise<string | null> {\n const contract = await readDaemonServiceContract();\n return contract?.deviceId ?? null;\n}\n\nfunction selectWhitelistedJournalMetadata(\n metadata: Record<string, unknown>,\n keys: readonly string[]\n): Record<string, unknown> {\n const selected: Record<string, unknown> = {};\n for (const key of keys) {\n if (Object.hasOwn(metadata, key)) {\n selected[key] = metadata[key];\n }\n }\n return selected;\n}\n\nfunction boundLifecycleJournalEntry(\n entry: DaemonLifecycleEvent\n): DaemonLifecycleEvent {\n if (!entry.metadata) {\n return redactPrepareStepDiagnosticsValue(entry) as DaemonLifecycleEvent;\n }\n const whitelisted = redactPrepareStepDiagnosticsValue({\n ...entry,\n metadata: selectWhitelistedJournalMetadata(\n entry.metadata,\n LIFECYCLE_JOURNAL_METADATA_WHITELIST\n ),\n }) as DaemonLifecycleEvent;\n // Carrier errors can embed exact source/destination paths. The local journal\n // retains those; the uploaded operation evidence uses path categories.\n if (\n entry.command === \"openmeld service carrier mutation\" &&\n whitelisted.metadata\n ) {\n whitelisted.metadata.errorMessage = undefined;\n }\n if (JSON.stringify(whitelisted).length <= JOURNAL_ENTRY_MAX_CHARS) {\n return whitelisted;\n }\n // Still over the per-entry budget after whitelisting (the real launchd\n // failure entry does this because errorMessage already embeds the job\n // evidence): keep the compact human-readable metadata and shed the heaviest\n // structured field, marking the partial loss so log readers know evidence\n // was dropped.\n const compact = redactPrepareStepDiagnosticsValue({\n ...entry,\n metadata: {\n ...selectWhitelistedJournalMetadata(\n whitelisted.metadata ?? {},\n LIFECYCLE_JOURNAL_METADATA_COMPACT_WHITELIST\n ),\n truncated: true,\n },\n }) as DaemonLifecycleEvent;\n if (JSON.stringify(compact).length <= JOURNAL_ENTRY_MAX_CHARS) {\n return compact;\n }\n return { ...whitelisted, metadata: { truncated: true } };\n}\n\nfunction boundServiceLogLine(line: string): string {\n const redactedLine = redactPrepareStepDiagnosticsText(line);\n if (redactedLine.length <= SERVICE_LOG_LINE_MAX_CHARS) {\n return redactedLine;\n }\n return `${redactedLine.slice(0, SERVICE_LOG_LINE_MAX_CHARS - 1).trimEnd()}…`;\n}\n\nfunction finalizePrepareStepDiagnosticsSerialization(\n bundle: PrepareStepDiagnosticsBundle\n): string | null {\n const parsed = prepareStepDiagnosticsBundleSchema.safeParse(bundle);\n if (!parsed.success) {\n return null;\n }\n return JSON.stringify(parsed.data);\n}\n","import { execFile as execFileCallback } from \"node:child_process\";\nimport { hostname, release } from \"node:os\";\nimport { promisify } from \"node:util\";\nimport type { ObservedDeviceMetadata } from \"@openmeld/schemas/types\";\n\nconst execFile = promisify(execFileCallback);\nconst MACBOOK_DISPLAY_NAME_PATTERN = /MacBook/i;\nconst DESKTOP_MAC_DISPLAY_NAME_PATTERN = /iMac|Mac mini|Mac Studio|Mac Pro/i;\n\nexport async function collectObservedDeviceMetadata(input?: {\n now?: Date;\n}): Promise<ObservedDeviceMetadata> {\n const observedDisplayName = await resolveObservedDeviceDisplayName();\n\n return {\n observedDisplayName,\n platformFamily: resolveObservedPlatformFamily(process.platform),\n osVersion: normalizeOptionalText(release()),\n deviceType: resolveObservedDeviceType({\n platform: process.platform,\n observedDisplayName,\n }),\n observedAtMs: (input?.now ?? new Date()).getTime(),\n };\n}\n\nasync function resolveObservedDeviceDisplayName(): Promise<string | null> {\n if (process.platform === \"darwin\") {\n const computerName = await readMacComputerName();\n if (computerName) {\n return computerName;\n }\n }\n\n if (process.platform === \"win32\") {\n return (\n normalizeOptionalText(process.env.COMPUTERNAME) ??\n normalizeOptionalText(hostname())\n );\n }\n\n return normalizeOptionalText(hostname());\n}\n\nasync function readMacComputerName(): Promise<string | null> {\n try {\n const result = await execFile(\"scutil\", [\"--get\", \"ComputerName\"]);\n return normalizeOptionalText(result.stdout);\n } catch {\n return normalizeOptionalText(hostname());\n }\n}\n\nfunction resolveObservedPlatformFamily(\n platform: NodeJS.Platform\n): ObservedDeviceMetadata[\"platformFamily\"] {\n switch (platform) {\n case \"darwin\":\n return \"macOS\";\n case \"win32\":\n return \"Windows\";\n case \"linux\":\n return \"Linux\";\n default:\n return \"Unknown\";\n }\n}\n\nfunction resolveObservedDeviceType(input: {\n platform: NodeJS.Platform;\n observedDisplayName: string | null;\n}): ObservedDeviceMetadata[\"deviceType\"] {\n if (input.platform !== \"darwin\") {\n return \"unknown\";\n }\n\n if (input.observedDisplayName?.match(MACBOOK_DISPLAY_NAME_PATTERN)) {\n return \"laptop\";\n }\n\n if (input.observedDisplayName?.match(DESKTOP_MAC_DISPLAY_NAME_PATTERN)) {\n return \"desktop\";\n }\n\n return \"unknown\";\n}\n\nfunction normalizeOptionalText(\n input: string | null | undefined\n): string | null {\n const normalized = input?.trim();\n return normalized ? normalized : null;\n}\n","import { createCurrentDeviceApi } from \"@openmeld/api-client\";\nimport {\n readDaemonServiceContract,\n upsertDaemonServiceContract,\n} from \"../config/daemon-service-contract\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport { createCliApiClientFoundation } from \"../space/api-client-foundation\";\nimport { collectObservedDeviceMetadata } from \"../system/observed-device-metadata\";\n\nexport async function syncLocalSetupCurrentDeviceTargetFromServiceContract(input: {\n connectedComputerId?: string;\n gatewayUrl: string;\n}): Promise<{ deviceId: string; runtimeLane: string }> {\n const serviceContract = await readDaemonServiceContract();\n const deviceId = serviceContract?.deviceId ?? null;\n const runtimeLane = serviceContract?.lane ?? null;\n if (!(serviceContract && deviceId && runtimeLane)) {\n throw new Error(\n `OpenMeld could not reconnect this computer because OpenMeld Service has not finished starting. Keep OpenMeld Service running, then run \\`${formatOpenMeldCliCommand(\n \"openmeld setup --view agent\"\n )}\\` again. You can also run \\`${formatOpenMeldCliCommand(\n \"openmeld service status --view agent\"\n )}\\` to inspect the local service.`\n );\n }\n\n const currentDeviceApi = createCurrentDeviceApi(\n createCliApiClientFoundation(input.gatewayUrl)\n );\n\n const enrollment = await currentDeviceApi.enrollLocalRuntime({\n ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n deviceId,\n runtimeLane,\n });\n await writeConnectedComputerEnrollmentToServiceContract({\n connectedComputerId: enrollment.connectedComputerId,\n serviceContract,\n });\n\n // Enrollment and its local identity must succeed. Display-only observations\n // cannot undo that identity or establish Service/Agent readiness.\n try {\n const metadata = await collectObservedDeviceMetadata();\n await currentDeviceApi.writeObservedMetadata({ deviceId, metadata });\n } catch (error) {\n console.warn(\"[openmeld.setup.device_details_unavailable]\", {\n deviceId,\n runtimeLane,\n event: \"cli.setup.device_details_unavailable\",\n errorType: error instanceof Error ? error.name : \"UnknownError\",\n });\n }\n\n return {\n deviceId,\n runtimeLane,\n };\n}\n\nasync function writeConnectedComputerEnrollmentToServiceContract(input: {\n connectedComputerId: string | undefined;\n serviceContract: NonNullable<\n Awaited<ReturnType<typeof readDaemonServiceContract>>\n >;\n}): Promise<void> {\n if (!input.connectedComputerId) {\n return;\n }\n await upsertDaemonServiceContract({\n autoStart: input.serviceContract.autoStart,\n bundleId: input.serviceContract.bundleId,\n connectedComputerId: input.connectedComputerId,\n daemonVersion: input.serviceContract.daemonVersion,\n desiredState: input.serviceContract.desiredState,\n deviceId: input.serviceContract.deviceId,\n gatewayUrl: input.serviceContract.gatewayUrl,\n heartbeatMs: input.serviceContract.heartbeatMs,\n lane: input.serviceContract.lane,\n ...(input.serviceContract.ownerUserId\n ? { ownerUserId: input.serviceContract.ownerUserId }\n : {}),\n ...(input.serviceContract.profileId\n ? { profileId: input.serviceContract.profileId }\n : {}),\n serviceController: input.serviceContract.serviceController,\n });\n}\n","export function shouldForceSetupServiceRefresh(): boolean {\n return process.env.OPENMELD_SETUP_FORCE_SERVICE_REFRESH === \"1\";\n}\n","import type { OpenMeldToolsUpdateOperation } from \"@openmeld/schemas/types\";\nimport { compareSemver } from \"../config/version-state\";\nimport { inspectDaemonServiceInventory } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport { waitForOpenMeldToolsUpdateCompletion } from \"../local-service/maintenance/openmeld-tools-update-join\";\nimport { OPENMELD_VERSION } from \"../runtime/version\";\n\nexport type SetupServiceUpdateTruth =\n | { status: \"ready\" }\n | {\n message: string;\n status: \"updating\" | \"failed\" | \"verifying\";\n };\n\nexport function resolveSetupServiceUpdateTruth(input: {\n currentCliVersion: string;\n installedServiceVersion: string | null;\n operation: OpenMeldToolsUpdateOperation | null;\n currentServiceVerified?: boolean;\n}): SetupServiceUpdateTruth {\n const operation = input.operation;\n if (!operation) {\n return { status: \"ready\" };\n }\n if (operation.phase === \"restored\" || operation.phase === \"needs_help\") {\n if (\n input.currentServiceVerified &&\n input.installedServiceVersion === input.currentCliVersion &&\n compareSemver(input.currentCliVersion, operation.targetVersion) >= 0\n ) {\n return { status: \"ready\" };\n }\n return {\n message: \"OpenMeld Service update failed. Run `openmeld service update`.\",\n status: \"failed\",\n };\n }\n if (\n operation.phase === \"waiting_for_work\" ||\n operation.phase === \"updating\"\n ) {\n return {\n message:\n \"OpenMeld Service is updating in the background. Setup will continue automatically when it finishes.\",\n status: \"updating\",\n };\n }\n if (\n input.currentServiceVerified &&\n input.installedServiceVersion === input.currentCliVersion &&\n compareSemver(input.currentCliVersion, operation.targetVersion) > 0\n ) {\n return { status: \"ready\" };\n }\n if (\n input.currentServiceVerified &&\n input.currentCliVersion === operation.targetVersion &&\n input.installedServiceVersion === operation.targetVersion\n ) {\n return { status: \"ready\" };\n }\n return {\n message:\n \"OpenMeld Service update could not be verified. Run `openmeld service update`.\",\n status: \"verifying\",\n };\n}\n\nexport async function assertSetupServiceUpdateComplete(\n input: Parameters<typeof waitForOpenMeldToolsUpdateCompletion>[0] = {}\n): Promise<void> {\n const operation = await waitForOpenMeldToolsUpdateCompletion(input);\n if (!operation) {\n return;\n }\n const inventory = await inspectDaemonServiceInventory({\n expectedVersion: OPENMELD_VERSION,\n intent: \"status_cleanup\",\n });\n const truth = resolveSetupServiceUpdateTruth({\n currentCliVersion: OPENMELD_VERSION,\n installedServiceVersion:\n inventory.serviceContract?.daemonVersion ??\n inventory.installStatus.state?.daemonVersion ??\n null,\n operation,\n currentServiceVerified:\n inventory.anomalies.length === 0 &&\n inventory.runtimeStatus.status === \"running\",\n });\n if (truth.status !== \"ready\") {\n throw new Error(truth.message);\n }\n}\n","import {\n PREPARE_SESSION_STREAM_PROTOCOL_VERSION,\n prepareSessionResponseSchema,\n prepareSessionStreamServerFrameSchema,\n} from \"@openmeld/schemas\";\nimport type {\n PrepareLocalAgentCatalog,\n PrepareLocalReadinessSnapshot,\n PrepareSessionSnapshot,\n PrepareSessionStreamServerFrame,\n PrepareStepId,\n} from \"@openmeld/schemas/types\";\nimport {\n getSetupFlowCopy,\n PREPARE_SESSION_RECONNECT_GRACE_MS,\n} from \"@openmeld/start\";\nimport { sleep } from \"@openmeld/utils\";\nimport { reconcileNewRunnableBuiltinAgentsForSetup } from \"../agents/registry\";\nimport {\n type AuthSessionStateResult,\n getAuthSessionState,\n} from \"../config/auth-session\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport {\n appendLocalAgentsGuideUrl,\n buildLocalAgentsGuideUrl,\n buildNoLocalAgentsNoticeLines,\n} from \"../guides/local-agents-guide-url\";\nimport {\n assertSelectedAgentControllerReportSubmissionsAccepted,\n type SelectedAgentControllerReportResult,\n submitSelectedAgentControllerReports,\n} from \"../local-service/reporting/selected-agent-controller-reporting\";\nimport { buildLocalAgentCatalogFromReadiness } from \"../local-service/state/current-device-identity\";\nimport { notifyDaemonRouteCatalogChanged } from \"../local-service/state/route-catalog-sync-notifier\";\nimport { formatOpenMeldCliCommand } from \"../runtime/cli-entry-command\";\nimport { CliOutputHandledError } from \"../runtime/cli-output-handled-error\";\nimport { getCliVersionInfo } from \"../runtime/cli-version\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { computeRetryDelayMs } from \"../runtime/retry-delay\";\nimport type { RuntimeContext } from \"../runtime/types\";\nimport { fetchSpaceRequestWithTimeout } from \"../space/fetch-with-timeout\";\nimport { runStartLocalAgentsEnable } from \"../start-local/agents-local\";\nimport { collectStartLocalReadiness } from \"../start-local/readiness\";\nimport type { StartReadinessSnapshot } from \"../start-local/readiness-types\";\nimport {\n isLocalMachineFailureError,\n LocalMachineFailureError,\n} from \"../system/local-machine-recovery\";\nimport { runDaemonServiceParticipationGate } from \"../system/local-service-participation-gate\";\nimport { connectWebSocket } from \"../transport/ws\";\nimport { resolveControllingTerminalSession } from \"../ui/controlling-terminal\";\nimport {\n buildHumanErrorCopy,\n renderHumanErrorCard,\n} from \"../ui/human-error-card\";\nimport { renderInfoCard } from \"../ui/info-card\";\nimport { promptSearchSelect } from \"../ui/search-select\";\nimport {\n createSetupProgressReporter,\n type SetupProgressStepHandle,\n} from \"../ui/setup-progress\";\nimport { runAgentsRepair } from \"./agents\";\nimport {\n collectPrepareStepDiagnostics,\n type PrepareServiceJobVerdict,\n resolvePrepareServiceJobVerdict,\n} from \"./prepare-step-diagnostics\";\nimport { syncLocalSetupCurrentDeviceTargetFromServiceContract } from \"./setup-current-device\";\nimport { shouldForceSetupServiceRefresh } from \"./setup-force-service-refresh\";\nimport { assertSetupServiceUpdateComplete } from \"./setup-service-update-truth\";\n\nconst PREPARE_TOKEN_HEADER = \"x-openmeld-prepare-token\";\n// computeRetryDelayMs schedule sums to 11750ms across 8 sleeps (attempts 1-8),\n// matching the prior fixed 11 x 1000ms = 11000ms budget before giving up.\nconst REPORT_RUNTIME_CONNECTION_MAX_ATTEMPTS = 9;\nconst WAITING_PROGRESS_DELAY_MS = 500;\n\nconst TERMINAL_PREPARE_STEP_ORDER: readonly PrepareStepId[] = [\n \"refresh_service\",\n \"prepare_selected_agents\",\n \"report_runtime\",\n \"verify_setup\",\n];\n\nclass PrepareSessionBlockedByCoreError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PrepareSessionBlockedByCoreError\";\n }\n}\n\nexport class PrepareSessionCancelledError extends Error {\n constructor() {\n super(\"Setup was cancelled.\");\n this.name = \"PrepareSessionCancelledError\";\n }\n}\n\ntype PrepareSessionExecutorInput = {\n gatewayUrl: string;\n startSession: string;\n initialSnapshot?: PrepareSessionSnapshot;\n connectedStream?: PrepareSessionStream;\n localAgentSelection?: PrepareSessionLocalAgentSelection;\n runtime: RuntimeContext;\n presenter: ReturnType<typeof createPresenter>;\n interactive: boolean;\n view?: string;\n};\n\nexport type PrepareSessionExecutorResult =\n | {\n completionFacts?: PrepareSessionExecutorCompletionFacts;\n snapshot: PrepareSessionSnapshot;\n status: \"completed\";\n }\n | {\n reason: \"terminal_replaced\" | \"user_cancelled\";\n status: \"not_completed\";\n };\n\nexport type PrepareSessionExecutorCompletionFacts = {\n openMeldServiceRuntimeIdentity: {\n deviceId: string;\n runtimeLane: string;\n } | null;\n runtimeReports: readonly SelectedAgentControllerReportResult[];\n selectedLocalAgentIds: readonly string[];\n};\n\nexport type PrepareSessionLocalAgentSelection =\n | {\n mode: \"all\";\n }\n | {\n mode: \"none\";\n }\n | {\n localAgentIds: string[];\n mode: \"specific\";\n };\n\nexport async function runPrepareSessionExecutor(\n input: PrepareSessionExecutorInput\n): Promise<PrepareSessionExecutorResult> {\n let initial =\n input.initialSnapshot ??\n (await resolvePrepareSessionForHandoff({\n gatewayUrl: input.gatewayUrl,\n opaqueToken: input.startSession,\n }));\n const alreadyCompleted = finishIfPrepareSessionAlreadyCompleted({\n input,\n snapshot: initial,\n });\n if (alreadyCompleted) {\n return alreadyCompleted;\n }\n\n let reconnectAttempts = 0;\n let connectedStream = input.connectedStream;\n let reconnectDeadlineMs: number | null = null;\n while (true) {\n try {\n return await runPrepareSessionExecutorOnce({\n input: { ...input, connectedStream },\n initial,\n onTerminalConnected: () => {\n reconnectAttempts = 0;\n reconnectDeadlineMs = null;\n },\n });\n } catch (error) {\n connectedStream = undefined;\n if (error instanceof PrepareSessionCancelledError) {\n return {\n reason: \"user_cancelled\",\n status: \"not_completed\",\n };\n }\n if (error instanceof PrepareSessionTerminalReplacedError) {\n emitHumanStatus(input, \"Terminal replaced\", [\n \"A newer Terminal command is running this setup.\",\n \"You can close this window.\",\n ]);\n return {\n reason: \"terminal_replaced\",\n status: \"not_completed\",\n };\n }\n if (error instanceof PrepareSessionConnectionInterruptedError) {\n const reconnectResult = await reconnectPrepareSession({\n attempts: reconnectAttempts,\n connectionError: error,\n deadlineMs: reconnectDeadlineMs,\n input,\n });\n if (reconnectResult.result) {\n return reconnectResult.result;\n }\n initial = reconnectResult.snapshot;\n reconnectAttempts = reconnectResult.attempts;\n reconnectDeadlineMs = reconnectResult.deadlineMs;\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function reconnectPrepareSession(input: {\n attempts: number;\n connectionError: PrepareSessionConnectionInterruptedError;\n deadlineMs: number | null;\n input: PrepareSessionExecutorInput;\n}): Promise<{\n attempts: number;\n deadlineMs: number;\n result: PrepareSessionExecutorResult | null;\n snapshot: PrepareSessionSnapshot;\n}> {\n const deadlineMs =\n input.deadlineMs ?? Date.now() + PREPARE_SESSION_RECONNECT_GRACE_MS;\n let attempts = input.attempts;\n let reconnectFailure: unknown = input.connectionError;\n emitHumanStatus(input.input, \"Reconnecting\", [\n getSetupFlowCopy(\"setup\").connectTerminalReconnectingSummary,\n ]);\n\n while (Date.now() < deadlineMs) {\n attempts += 1;\n await sleep(\n Math.min(computeRetryDelayMs(attempts), deadlineMs - Date.now())\n );\n if (Date.now() >= deadlineMs) {\n break;\n }\n let snapshot: PrepareSessionSnapshot;\n try {\n snapshot = await resolvePrepareSessionForHandoff({\n gatewayUrl: input.input.gatewayUrl,\n opaqueToken: input.input.startSession,\n });\n } catch (tokenError) {\n if (tokenError instanceof PrepareSessionTokenRejectedError) {\n throw tokenError;\n }\n reconnectFailure = tokenError;\n continue;\n }\n if (Date.now() >= deadlineMs) {\n break;\n }\n return {\n attempts,\n deadlineMs,\n result: finishIfPrepareSessionAlreadyCompleted({\n input: input.input,\n snapshot,\n }),\n snapshot,\n };\n }\n throw reconnectFailure;\n}\n\nfunction finishIfPrepareSessionAlreadyCompleted(input: {\n input: PrepareSessionExecutorInput;\n snapshot: PrepareSessionSnapshot;\n}): PrepareSessionExecutorResult | null {\n if (input.snapshot.lifecycleStatus !== \"completed\") {\n return null;\n }\n if (input.input.localAgentSelection) {\n assertCompletedPrepareSessionMatchesTerminalSelection({\n selection: input.input.localAgentSelection,\n snapshot: input.snapshot,\n });\n }\n emitHumanSection(input.input, \"OpenMeld setup\");\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: \"Setup is already complete. You can return to OpenMeld Web.\",\n });\n return {\n snapshot: input.snapshot,\n status: \"completed\",\n };\n}\n\nasync function runPrepareSessionExecutorOnce(input: {\n initial: PrepareSessionSnapshot;\n input: PrepareSessionExecutorInput;\n onTerminalConnected: () => void;\n}): Promise<PrepareSessionExecutorResult> {\n // OPENMELD_SETUP_TO_WAKE_PATH: HIGHEST_FACT setup-session\n // The local terminal is now attached to the Web-issued setup handoff. Phase 2\n // should route real setup state through this path, not parallel setup flows.\n emitHumanSection(input.input, \"OpenMeld setup\");\n const connectionProgress = startPrepareProgressStep(input.input, {\n code: \"prepare.session.progress.connect_terminal\",\n text: \"Connecting Terminal to OpenMeld Web...\",\n });\n\n let stream: PrepareSessionStream | null = null;\n try {\n stream =\n input.input.connectedStream ??\n (await connectPrepareSessionStream({\n gatewayUrl: input.input.gatewayUrl,\n opaqueToken: input.input.startSession,\n prepareSessionId: input.initial.prepareSessionId,\n }));\n const connected = await waitForSnapshotWithProgress({\n input: input.input,\n stream,\n progress: connectionProgress,\n predicate: (snapshot) =>\n snapshot.terminalConnection.status === \"connected\",\n waitingMessage:\n \"Still connecting. Keep this Terminal open; OpenMeld Web will update automatically\",\n });\n input.onTerminalConnected();\n await enforcePrepareSessionTerminalAuth({\n input: input.input,\n stream,\n snapshot: connected,\n });\n connectionProgress.complete(\"Terminal connected. Keep this window open.\");\n emitHumanSection(input.input, \"Setup progress\");\n const serviceConnected = await connectOpenMeldServiceForPrepare({\n input: input.input,\n snapshot: connected,\n stream,\n });\n const selected = await resolveAgentSelectionAfterServiceConnect({\n input: input.input,\n stream,\n snapshot: serviceConnected,\n });\n const completed = await executeSelectedAgentPreparation({\n input: input.input,\n stream,\n snapshot: selected,\n });\n return {\n ...(completed.completionFacts\n ? { completionFacts: completed.completionFacts }\n : {}),\n snapshot: completed.snapshot,\n status: \"completed\",\n };\n } catch (error) {\n connectionProgress.cancel();\n throw error;\n } finally {\n stream?.close();\n }\n}\n\nasync function connectOpenMeldServiceForPrepare(input: {\n input: PrepareSessionExecutorInput;\n snapshot: PrepareSessionSnapshot;\n stream: PrepareSessionStream;\n}): Promise<PrepareSessionSnapshot> {\n const step = findStep(input.snapshot, \"refresh_service\");\n if (step?.state === \"complete\") {\n return input.snapshot;\n }\n const terminalStep = buildTerminalStep({\n connectedComputerId: input.snapshot.connectedComputerId,\n openMeldServiceRuntimeIdentity:\n resolveRuntimeIdentityFromPrepareSessionSnapshot(input.snapshot),\n humanProfileId: input.snapshot.humanProfileId,\n input: input.input,\n localAgentIds: input.snapshot.selectedLocalAgentIds,\n ownerUserId: input.snapshot.ownerUserId,\n stepId: \"refresh_service\",\n });\n return await runTerminalStep({\n connectionEpoch: requireConnectionEpoch(input.snapshot),\n input: input.input,\n snapshot: input.snapshot,\n stepId: \"refresh_service\",\n stream: input.stream,\n ...terminalStep,\n });\n}\n\nasync function resolveAgentSelectionAfterServiceConnect(input: {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<PrepareSessionSnapshot> {\n if (hasAgentSelectionBeenSaved(input.snapshot)) {\n return input.snapshot;\n }\n if (input.input.localAgentSelection) {\n const withLocalAgents = await reportLocalAgentCatalogForSelection(input);\n return await resolveAgentSelection({\n ...input,\n snapshot: withLocalAgents,\n });\n }\n return await writeTerminalAgentSelection({\n input: input.input,\n localAgentIds: [],\n selectionSource: \"background\",\n snapshot: input.snapshot,\n stream: input.stream,\n });\n}\n\nexport async function resolveAgentSelection(input: {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<PrepareSessionSnapshot> {\n if (input.input.localAgentSelection) {\n const guideUrl = buildLocalAgentsGuideUrl(input.input.gatewayUrl);\n const localAgentIds = resolveTerminalSelectedLocalAgentIds({\n guideUrl,\n selection: input.input.localAgentSelection,\n snapshot: input.snapshot,\n });\n if (\n hasAgentSelectionBeenSaved(input.snapshot) &&\n haveSameLocalAgentIds(input.snapshot.selectedLocalAgentIds, localAgentIds)\n ) {\n return input.snapshot;\n }\n return await writeTerminalAgentSelection({\n ...(localAgentIds.length === 0 &&\n input.input.localAgentSelection.mode !== \"none\"\n ? { emptySelectionGuideUrl: guideUrl }\n : {}),\n input: input.input,\n localAgentIds,\n selectionSource: \"explicit\",\n stream: input.stream,\n snapshot: input.snapshot,\n });\n }\n if (hasAgentSelectionBeenSaved(input.snapshot)) {\n return input.snapshot;\n }\n const localAgentIds = resolveAutomaticLocalAgentSelection(input.snapshot);\n if (localAgentIds.length === 0) {\n emitAutomaticEmptyLocalAgentSelectionNotice({\n input: input.input,\n snapshot: input.snapshot,\n });\n }\n return await writeTerminalAgentSelection({\n input: input.input,\n localAgentIds,\n selectionSource: \"automatic\",\n stream: input.stream,\n snapshot: input.snapshot,\n });\n}\n\nfunction resolveAutomaticLocalAgentSelection(\n snapshot: PrepareSessionSnapshot\n): string[] {\n return (snapshot.localAgentCatalog?.entries ?? [])\n .filter(\n (entry) =>\n entry.enabled && entry.selectable && entry.launchStatus === \"ready\"\n )\n .map((entry) => entry.agentId);\n}\n\nfunction emitAutomaticEmptyLocalAgentSelectionNotice(input: {\n input: PrepareSessionExecutorInput;\n snapshot: PrepareSessionSnapshot;\n}): void {\n const detectedEntries = (\n input.snapshot.localAgentCatalog?.entries ?? []\n ).filter((entry) => entry.detected);\n const enabledDetectedEntries = detectedEntries.filter(\n (entry) => entry.enabled\n );\n if (detectedEntries.length > 0 && enabledDetectedEntries.length === 0) {\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: \"Local agents are off. Setup will continue without them.\",\n });\n emitPrepareProgressDetail(\n input.input,\n \"You can turn local agents on later from this computer's settings.\"\n );\n return;\n }\n if (enabledDetectedEntries.length > 0) {\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: \"OpenMeld found local agents, but cannot start them yet. Setup will continue without them.\",\n });\n emitPrepareProgressDetail(\n input.input,\n \"Review local agents later in this computer's settings.\"\n );\n return;\n }\n\n emitPrepareNoLocalAgentsNotice({\n guideUrl: buildLocalAgentsGuideUrl(input.input.gatewayUrl),\n input: input.input,\n });\n}\n\nfunction emitPrepareNoLocalAgentsNotice(input: {\n guideUrl: string;\n input: PrepareSessionExecutorInput;\n}): void {\n const [summary, ...details] = buildNoLocalAgentsNoticeLines({\n guideUrl: input.guideUrl,\n });\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: summary\n ? `${summary} Setup will continue without local agents.`\n : \"Setup will continue without local agents.\",\n });\n for (const detail of details) {\n emitPrepareProgressDetail(input.input, detail);\n }\n}\n\nexport function resolveTerminalSelectedLocalAgentIds(input: {\n guideUrl?: string;\n selection: PrepareSessionLocalAgentSelection;\n snapshot: PrepareSessionSnapshot;\n}): string[] {\n if (input.selection.mode === \"none\") {\n return [];\n }\n const catalog = input.snapshot.localAgentCatalog;\n if (!catalog) {\n throw new Error(\"OpenMeld could not load the local agent catalog.\");\n }\n\n const selectableById = new Map(\n catalog.entries\n .filter((entry) => entry.selectable)\n .map((entry) => [entry.agentId, entry])\n );\n\n if (input.selection.mode === \"all\") {\n return catalog.entries\n .filter((entry) => entry.selectable)\n .map((entry) => entry.agentId);\n }\n\n const selectedIds = [...new Set(input.selection.localAgentIds)];\n const missingIds = selectedIds.filter(\n (agentId) => !selectableById.has(agentId)\n );\n if (missingIds.length > 0) {\n const selectableIds = [...selectableById.keys()];\n throw new Error(\n [\n `OpenMeld cannot select local agent ${missingIds.join(\", \")} for setup.`,\n selectableIds.length > 0\n ? `Selectable local agents: ${selectableIds.join(\", \")}.`\n : formatNoSelectableLocalAgentsFound(input.guideUrl),\n ].join(\" \")\n );\n }\n return selectedIds;\n}\n\nfunction formatNoSelectableLocalAgentsFound(guideUrl?: string): string {\n const message = \"No selectable local agents were found on this computer.\";\n return guideUrl ? appendLocalAgentsGuideUrl({ guideUrl, message }) : message;\n}\n\nexport function assertCompletedPrepareSessionMatchesTerminalSelection(input: {\n selection: PrepareSessionLocalAgentSelection;\n snapshot: PrepareSessionSnapshot;\n}): void {\n const localAgentIds = resolveTerminalSelectedLocalAgentIds(input);\n if (\n haveSameLocalAgentIds(input.snapshot.selectedLocalAgentIds, localAgentIds)\n ) {\n return;\n }\n throw new Error(\n [\n \"This OpenMeld setup already completed with a different local-agent selection.\",\n \"Generate a fresh OpenMeld Agent Interface prompt, then run the new setup command.\",\n ].join(\" \")\n );\n}\n\nasync function writeTerminalAgentSelection(input: {\n emptySelectionGuideUrl?: string;\n input: PrepareSessionExecutorInput;\n localAgentIds: readonly string[];\n selectionSource: \"automatic\" | \"background\" | \"explicit\";\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<PrepareSessionSnapshot> {\n const beforeWriteSnapshot =\n input.stream.getLatestSnapshot() ?? input.snapshot;\n const beforeWriteRevision = beforeWriteSnapshot.sessionRevision;\n const connectionEpoch = requireConnectionEpoch(beforeWriteSnapshot);\n input.stream.writeTerminalAgentSelection({\n connectionEpoch,\n expectedRevision: beforeWriteRevision,\n localAgentIds: [...input.localAgentIds],\n });\n const selectedSnapshot = await input.stream.waitForSnapshot((snapshot) => {\n return (\n snapshot.sessionRevision > beforeWriteRevision &&\n hasAgentSelectionBeenSaved(snapshot)\n );\n });\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: formatTerminalAgentSelectionResult({\n emptySelectionGuideUrl: input.emptySelectionGuideUrl,\n localAgentIds: input.localAgentIds,\n selectionSource: input.selectionSource,\n snapshot: selectedSnapshot,\n }),\n });\n return selectedSnapshot;\n}\n\nfunction formatTerminalAgentSelectionResult(input: {\n emptySelectionGuideUrl?: string;\n localAgentIds: readonly string[];\n selectionSource: \"automatic\" | \"background\" | \"explicit\";\n snapshot: PrepareSessionSnapshot;\n}): string {\n if (input.localAgentIds.length === 0) {\n if (input.selectionSource === \"background\") {\n return \"Local agents will finish syncing in the background\";\n }\n const message =\n input.selectionSource === \"automatic\"\n ? \"Enabled local agents: none\"\n : \"Selected: no local agents\";\n return input.emptySelectionGuideUrl\n ? appendLocalAgentsGuideUrl({\n guideUrl: input.emptySelectionGuideUrl,\n message,\n })\n : message;\n }\n\n const localAgentNames = formatSelectedLocalAgentNames({\n localAgentIds: input.localAgentIds,\n snapshot: input.snapshot,\n });\n return input.selectionSource === \"automatic\"\n ? `Enabled local agents: ${localAgentNames}`\n : `Selected: ${localAgentNames}`;\n}\n\nexport async function reportLocalAgentCatalogForSelection(input: {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<PrepareSessionSnapshot> {\n const connectionEpoch = requireConnectionEpoch(input.snapshot);\n emitHumanSection(input.input, \"Local agents\");\n const progress = startPrepareProgressStep(input.input, {\n code: \"prepare.session.progress.local_agents\",\n text: \"Checking local agents...\",\n });\n const reconciliation = input.input.localAgentSelection\n ? null\n : await reconcileNewRunnableBuiltinAgentsForSetup();\n const readiness = await collectStartLocalReadinessForSetupCatalog(\n input.input,\n progress\n );\n if (reconciliation) {\n if (reconciliation.registeredAgentIds.length > 0) {\n progress.detail({\n code: \"prepare.session.progress.local_agents.enabled_automatically\",\n text: `Enabled automatically: ${formatReconciledLocalAgentNames({\n agentIds: reconciliation.registeredAgentIds,\n readiness,\n })}.`,\n });\n }\n if (reconciliation.preservedDisabledAgentIds.length > 0) {\n progress.detail({\n code: \"prepare.session.progress.local_agents.preserved_off\",\n text: `Kept off: ${formatReconciledLocalAgentNames({\n agentIds: reconciliation.preservedDisabledAgentIds,\n readiness,\n })}.`,\n });\n }\n }\n const beforeWriteRevision =\n input.stream.getLatestSnapshot()?.sessionRevision ??\n input.snapshot.sessionRevision;\n input.stream.writeTerminalLocalAgentCatalog({\n connectionEpoch,\n localAgentCatalog: buildLocalAgentCatalogFromReadiness(readiness),\n });\n const reportedSnapshot = await input.stream.waitForSnapshot((snapshot) => {\n return (\n snapshot.sessionRevision > beforeWriteRevision &&\n snapshot.localAgentCatalog !== null\n );\n });\n progress.complete(\"Local agents checked.\");\n return reportedSnapshot;\n}\n\nfunction formatReconciledLocalAgentNames(input: {\n agentIds: readonly string[];\n readiness: StartReadinessSnapshot;\n}): string {\n const displayNameByAgentId = new Map(\n input.readiness.agents.candidates.map((candidate) => [\n candidate.agentId,\n candidate.displayName,\n ])\n );\n return input.agentIds\n .map(\n (agentId) =>\n displayNameByAgentId.get(agentId) ??\n formatLocalAgentDisplayName(agentId)\n )\n .join(\", \");\n}\n\nasync function collectStartLocalReadinessForSetupCatalog(\n input: PrepareSessionExecutorInput,\n progress: SetupProgressStepHandle\n): Promise<StartReadinessSnapshot> {\n const initialReadiness = await collectStartLocalReadinessForSetup(input);\n const repairableAgentIds =\n resolveRepairableSetupLocalAgentIds(initialReadiness);\n if (repairableAgentIds.length === 0) {\n return initialReadiness;\n }\n\n progress.detail({\n code: \"prepare.session.progress.local_agents.repair\",\n text:\n repairableAgentIds.length === 1\n ? `Repairing ${formatLocalAgentDisplayName(\n repairableAgentIds.join(\"\")\n )} before setup reports it...`\n : `Repairing ${repairableAgentIds.length} local agents before setup reports them...`,\n });\n for (const agentId of repairableAgentIds) {\n await repairLocalAgentForSetup({ agentId, input, progress });\n }\n\n const repairedReadiness = await collectStartLocalReadinessForSetup(input);\n const remainingRepairableAgentIds =\n resolveRepairableSetupLocalAgentIds(repairedReadiness);\n if (remainingRepairableAgentIds.length > 0) {\n throw new Error(\n formatSetupLocalAgentRepairStillRequired(remainingRepairableAgentIds)\n );\n }\n return repairedReadiness;\n}\n\nasync function collectStartLocalReadinessForSetup(\n input: PrepareSessionExecutorInput\n): Promise<StartReadinessSnapshot> {\n return await collectStartLocalReadiness({\n auth: {\n status: \"valid\",\n email: null,\n authBaseUrl: null,\n gatewayUrl: input.gatewayUrl,\n },\n });\n}\n\nfunction resolveRepairableSetupLocalAgentIds(\n readiness: StartReadinessSnapshot\n): string[] {\n return [\n ...new Set(\n readiness.agents.candidates\n .filter((candidate) => {\n return (\n candidate.detected &&\n candidate.enabled &&\n candidate.launchStatus === \"needs_repair\"\n );\n })\n .map((candidate) => candidate.agentId)\n ),\n ];\n}\n\nfunction formatSetupLocalAgentRepairStillRequired(\n agentIds: readonly string[]\n): string {\n const formattedAgentIds = agentIds.map(formatLocalAgentDisplayName);\n const repairCommand =\n agentIds.length === 1\n ? `openmeld agents repair --agent ${agentIds.join(\"\")}`\n : `openmeld agents repair --agent ${agentIds.join(\" \")}`;\n return [\n agentIds.length === 1\n ? `${formattedAgentIds.join(\"\")} still needs local setup repair.`\n : `${formattedAgentIds.join(\", \")} still need local setup repair.`,\n `Run \\`${formatOpenMeldCliCommand(repairCommand)}\\`, then copy a fresh setup command from OpenMeld Web and run setup again.`,\n ].join(\" \");\n}\n\nfunction hasAgentSelectionBeenSaved(snapshot: PrepareSessionSnapshot): boolean {\n return snapshot.steps.some(\n (step) => step.id === \"choose_local_agents\" && step.state === \"complete\"\n );\n}\n\nfunction haveSameLocalAgentIds(\n left: readonly string[],\n right: readonly string[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n const rightSet = new Set(right);\n return left.every((id) => rightSet.has(id));\n}\n\nasync function executeSelectedAgentPreparation(input: {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<{\n completionFacts?: PrepareSessionExecutorCompletionFacts;\n snapshot: PrepareSessionSnapshot;\n}> {\n let snapshot = input.snapshot;\n let reportRuntimeResult: TerminalStepRunResult | null = null;\n while (snapshot.lifecycleStatus === \"active\") {\n const stepId = resolveNextTerminalPrepareStep(snapshot);\n if (stepId === null) {\n return { snapshot };\n }\n const connectionEpoch = requireConnectionEpoch(snapshot);\n const terminalStep = buildTerminalStep({\n connectedComputerId: snapshot.connectedComputerId,\n openMeldServiceRuntimeIdentity:\n resolveRuntimeIdentityFromPrepareSessionSnapshot(snapshot),\n humanProfileId: snapshot.humanProfileId,\n input: input.input,\n localAgentIds: snapshot.selectedLocalAgentIds,\n ownerUserId: snapshot.ownerUserId,\n stepId,\n });\n snapshot = await runTerminalStep({\n input: input.input,\n stream: input.stream,\n connectionEpoch,\n stepId,\n snapshot,\n ...terminalStep,\n onRunResult: (result) => {\n if (stepId === \"report_runtime\" && result?.runtimeReports) {\n reportRuntimeResult = result;\n }\n },\n });\n }\n return {\n ...(reportRuntimeResult\n ? {\n completionFacts: buildPrepareSessionExecutorCompletionFacts({\n reportRuntimeResult,\n selectedLocalAgentIds: snapshot.selectedLocalAgentIds,\n }),\n }\n : {}),\n snapshot,\n };\n}\n\ntype RunTerminalStepInput = {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n connectionEpoch: number;\n stepId: PrepareStepId;\n snapshot: PrepareSessionSnapshot;\n message: string;\n run: (\n progress: SetupProgressStepHandle\n ) => Promise<TerminalStepRunResult | undefined>;\n onRunResult?: (result: TerminalStepRunResult | undefined) => void;\n collectDiagnostics?: typeof collectPrepareStepDiagnostics;\n resolveServiceJobVerdict?: typeof resolvePrepareServiceJobVerdict;\n};\n\nexport async function runTerminalStep(\n input: RunTerminalStepInput\n): Promise<PrepareSessionSnapshot> {\n const progress = startPrepareProgressStep(input.input, {\n code: `prepare.session.progress.${input.stepId}`,\n text: input.message,\n });\n const stepStartRevision = input.snapshot.sessionRevision;\n input.stream.writeTerminalStep({\n connectionEpoch: input.connectionEpoch,\n expectedRevision: stepStartRevision,\n stepId: input.stepId,\n status: \"started\",\n });\n let startedSnapshot: PrepareSessionSnapshot | null = null;\n try {\n startedSnapshot = await input.stream.waitForSnapshot((snapshot) => {\n const step = findStep(snapshot, input.stepId);\n return (\n snapshot.sessionRevision > stepStartRevision && step?.state === \"active\"\n );\n });\n const openMeldServiceRuntimeIdentity = await input.run(progress);\n input.onRunResult?.(openMeldServiceRuntimeIdentity);\n const stepCompleteRevision = startedSnapshot.sessionRevision;\n input.stream.writeTerminalStep({\n connectionEpoch: input.connectionEpoch,\n expectedRevision: stepCompleteRevision,\n ...(openMeldServiceRuntimeIdentity ?? {}),\n stepId: input.stepId,\n status: \"completed\",\n });\n const resolvedSnapshot = await input.stream.waitForSnapshot((snapshot) => {\n const step = findStep(snapshot, input.stepId);\n return (\n snapshot.sessionRevision > stepCompleteRevision &&\n (step?.state === \"complete\" ||\n step?.state === \"blocked\" ||\n snapshot.phase === \"blocked\" ||\n snapshot.lifecycleStatus !== \"active\")\n );\n });\n assertTerminalStepCompletedOrThrow({\n input: input.input,\n snapshot: resolvedSnapshot,\n stepId: input.stepId,\n });\n progress.complete(formatTerminalStepCompleteMessage(input.stepId));\n return resolvedSnapshot;\n } catch (error) {\n return await handleTerminalStepFailure({\n error,\n input,\n progress,\n startedSnapshot,\n });\n }\n}\n\nfunction requireStartedTerminalStepSnapshot(input: {\n error: unknown;\n executorInput: PrepareSessionExecutorInput;\n progress: SetupProgressStepHandle;\n startedSnapshot: PrepareSessionSnapshot | null;\n}): PrepareSessionSnapshot {\n if (\n input.error instanceof PrepareSessionCancelledError ||\n input.error instanceof PrepareSessionConnectionInterruptedError ||\n input.error instanceof PrepareSessionBlockedByCoreError\n ) {\n input.progress.cancel();\n throw input.error;\n }\n if (input.error instanceof PrepareSessionRevisionConflictError) {\n const message =\n \"This setup changed while Terminal was working. Return to OpenMeld Web to see the current connection state and its valid recovery action.\";\n input.progress.cancel();\n emitHumanStatus(input.executorInput, \"Setup changed\", [message]);\n throw new Error(message);\n }\n if (input.startedSnapshot === null) {\n input.progress.cancel();\n throw input.error;\n }\n return input.startedSnapshot;\n}\n\nasync function handleTerminalStepFailure(input: {\n error: unknown;\n input: RunTerminalStepInput;\n progress: SetupProgressStepHandle;\n startedSnapshot: PrepareSessionSnapshot | null;\n}): Promise<never> {\n const startedSnapshot = requireStartedTerminalStepSnapshot({\n error: input.error,\n executorInput: input.input.input,\n progress: input.progress,\n startedSnapshot: input.startedSnapshot,\n });\n const rawMessage =\n input.error instanceof Error && input.error.message.trim().length > 0\n ? input.error.message.trim()\n : \"Setup could not continue.\";\n const localMachineIssue = isLocalMachineFailureError(input.error)\n ? input.error.issue\n : null;\n const serviceJobVerdict = localMachineIssue\n ? null\n : await resolveRefreshServiceJobVerdict({\n stepId: input.input.stepId,\n resolveServiceJobVerdict: input.input.resolveServiceJobVerdict,\n });\n const message = localMachineIssue\n ? rawMessage\n : formatTerminalStepFailureMessage({\n stepId: input.input.stepId,\n rawMessage,\n serviceJobVerdict,\n });\n const reasonCode =\n localMachineIssue?.code ??\n resolveTerminalStepFailureReasonCode({\n rawMessage,\n stepId: input.input.stepId,\n serviceJobVerdict,\n });\n const diagnostics = await (\n input.input.collectDiagnostics ?? collectPrepareStepDiagnostics\n )({\n stepId: input.input.stepId,\n supportCode: reasonCode,\n error: input.error,\n });\n input.input.stream.writeTerminalStep({\n connectionEpoch: input.input.connectionEpoch,\n expectedRevision: startedSnapshot.sessionRevision,\n stepId: input.input.stepId,\n status: \"failed\",\n reasonCode,\n message,\n ...(diagnostics === null ? {} : { diagnostics }),\n });\n if (diagnostics !== null) {\n // Bounded settle window so the diagnostics-carrying write (or its\n // stripped resend on cores that predate the field) can land before the\n // stream closes with the thrown failure.\n await waitForTerminalStepWriteToSettle({\n revisionFloor: startedSnapshot.sessionRevision,\n stream: input.input.stream,\n });\n }\n input.progress.fail(\"Setup stopped.\");\n if (isLocalMachineFailureError(input.error)) {\n throw input.error;\n }\n if (input.input.input.runtime.resolvedView === \"human\") {\n renderHumanErrorCard({\n codePrefix: \"prepare.session.failed\",\n message,\n presenter: input.input.input.presenter,\n title: \"Setup couldn't finish\",\n });\n throw new CliOutputHandledError(rawMessage);\n }\n const agentError = new Error(rawMessage, { cause: input.error }) as Error & {\n code: string;\n };\n agentError.code = reasonCode;\n throw agentError;\n}\n\nfunction assertTerminalStepCompletedOrThrow(input: {\n input: PrepareSessionExecutorInput;\n snapshot: PrepareSessionSnapshot;\n stepId: PrepareStepId;\n}): void {\n const step = findStep(input.snapshot, input.stepId);\n if (step?.state === \"complete\" && input.snapshot.phase !== \"blocked\") {\n return;\n }\n\n const blocker =\n input.snapshot.blockers.find(\n (candidate) => candidate.stepId === input.stepId\n ) ??\n input.snapshot.blockers[0] ??\n null;\n const message =\n blocker?.message ??\n \"OpenMeld setup is blocked. Return to OpenMeld Web for details.\";\n emitHumanStatus(input.input, \"Setup blocked\", [message]);\n throw new PrepareSessionBlockedByCoreError(message);\n}\n\nexport function resolveNextTerminalPrepareStep(\n snapshot: PrepareSessionSnapshot\n): PrepareStepId | null {\n if (findStep(snapshot, \"refresh_service\")?.state !== \"complete\") {\n return \"refresh_service\";\n }\n if (snapshot.selectedLocalAgentIds.length === 0) {\n return null;\n }\n return (\n TERMINAL_PREPARE_STEP_ORDER.find((stepId) => {\n const step = findStep(snapshot, stepId);\n return step?.state !== \"complete\";\n }) ?? null\n );\n}\n\ntype BuildTerminalStepInput = {\n connectedComputerId?: string | null;\n openMeldServiceRuntimeIdentity?: TerminalRuntimeIdentity | null;\n humanProfileId?: string | null;\n input: PrepareSessionExecutorInput;\n localAgentIds: readonly string[];\n ownerUserId?: string | null;\n stepId: PrepareStepId;\n};\n\nasync function runRefreshServiceTerminalStep(\n input: BuildTerminalStepInput,\n progress?: SetupProgressStepHandle\n): Promise<TerminalStepRunResult> {\n const gate = await runDaemonServiceParticipationGate({\n intent: \"start\",\n presenter: input.input.presenter,\n resolvedView: input.input.runtime.resolvedView,\n allowPrompt: input.input.interactive,\n autoRepair: true,\n gatewayUrl: input.input.gatewayUrl,\n ...(input.humanProfileId\n ? { openMeldProfileId: input.humanProfileId }\n : {}),\n ...(input.ownerUserId ? { expectedOwnerUserId: input.ownerUserId } : {}),\n forcePrompt: true,\n ...(shouldForceSetupServiceRefresh() ? { forceRefresh: true } : {}),\n ...(progress ? { serviceProgress: progress } : {}),\n suppressRefreshHumanResultCard: true,\n suppressStartSpinner: true,\n view: input.input.view,\n });\n if (gate.status === \"cancelled\") {\n throw new PrepareSessionCancelledError();\n }\n if (gate.status !== \"aligned\") {\n if (gate.localMachineIssue) {\n throw new LocalMachineFailureError({\n issue: gate.localMachineIssue,\n });\n }\n throw new Error(\n gate.errorMessage ?? \"OpenMeld Service is not connected yet.\"\n );\n }\n await assertSetupServiceUpdateComplete();\n progress?.detail({\n code: \"prepare.session.progress.refresh_service.identity\",\n text: \"Saving this computer's OpenMeld Service identity...\",\n });\n const openMeldServiceRuntimeIdentity =\n await syncLocalSetupCurrentDeviceTargetFromServiceContract({\n ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n gatewayUrl: input.input.gatewayUrl,\n });\n return openMeldServiceRuntimeIdentity;\n}\n\nexport function buildTerminalStep(input: BuildTerminalStepInput): {\n message: string;\n run: (\n progress?: SetupProgressStepHandle\n ) => Promise<TerminalStepRunResult | undefined>;\n} {\n switch (input.stepId) {\n case \"prepare_selected_agents\":\n return {\n message: \"Connecting selected local agents...\",\n run: async (progress) => {\n const enableResult = await prepareSelectedLocalAgentsForSetup({\n input: input.input,\n localAgentIds: input.localAgentIds,\n progress,\n });\n assertSelectedLocalAgentsEnabledForPrepare(enableResult);\n return undefined;\n },\n };\n case \"refresh_service\":\n return {\n message: getSetupFlowCopy(\"setup\").cliProgressStartingService,\n run: async (progress) =>\n await runRefreshServiceTerminalStep(input, progress),\n };\n case \"report_runtime\":\n return {\n message: \"Reporting selected local agents to OpenMeld...\",\n run: async (progress) => {\n return await connectSelectedLocalAgentsToOpenMeld({\n ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n ...(input.openMeldServiceRuntimeIdentity\n ? {\n openMeldServiceRuntimeIdentity:\n input.openMeldServiceRuntimeIdentity,\n }\n : {}),\n gatewayUrl: input.input.gatewayUrl,\n localAgentIds: input.localAgentIds,\n progress,\n syncRouteCatalog: true,\n });\n },\n };\n case \"verify_setup\":\n return {\n message: getSetupFlowCopy(\"setup\").cliProgressFinishingSetup,\n run: async () => {\n return await finishPrepareSetup();\n },\n };\n default:\n throw new Error(`Terminal cannot run prepare step: ${input.stepId}`);\n }\n}\n\nfunction formatTerminalStepCompleteMessage(stepId: PrepareStepId): string {\n switch (stepId) {\n case \"prepare_selected_agents\":\n return \"Connected selected local agents.\";\n case \"refresh_service\":\n return \"OpenMeld Service is running.\";\n case \"report_runtime\":\n return \"Reported selected local agents to OpenMeld.\";\n case \"verify_setup\":\n return \"Setup ready.\";\n default:\n return \"Step complete.\";\n }\n}\n\nfunction formatRuntimeReportWaitingMessage(\n localAgentIds: readonly string[]\n): string {\n if (localAgentIds.length <= 1) {\n return `Waiting for ${localAgentIds[0] ?? \"the local agent\"} to report its runtime...`;\n }\n const lastAgentId = localAgentIds.at(-1);\n const leadingAgentIds = localAgentIds.slice(0, -1).join(\", \");\n return `Waiting for ${leadingAgentIds} and ${lastAgentId} to report their runtime...`;\n}\n\ntype StartLocalAgentsEnableResult = Awaited<\n ReturnType<typeof runStartLocalAgentsEnable>\n>;\ntype StartLocalAgentsEnableError =\n StartLocalAgentsEnableResult[\"summary\"][\"errors\"][number];\ntype StartLocalAgentsRepairResult = Awaited<ReturnType<typeof runAgentsRepair>>;\ntype StartLocalAgentsRepairError =\n StartLocalAgentsRepairResult[\"summary\"][\"errors\"][number];\ntype SelectedLocalAgentInstallChoice = NonNullable<\n StartLocalAgentsEnableError[\"installChoices\"]\n>[number];\ntype SelectedLocalAgentInstallChoiceError = {\n agentId: string;\n installChoices?: SelectedLocalAgentInstallChoice[];\n nextSteps?: string[];\n reason: string;\n};\n\nasync function prepareSelectedLocalAgentsForSetup(input: {\n input: PrepareSessionExecutorInput;\n localAgentIds: readonly string[];\n progress?: SetupProgressStepHandle;\n}): Promise<StartLocalAgentsEnableResult> {\n const initialResult = await enableSelectedLocalAgentsForSetup(input);\n if (initialResult.status !== \"completed\") {\n return initialResult;\n }\n\n const recoverableErrors = initialResult.summary.errors.filter((error) => {\n return (\n isSelectedLocalAgentNeedsRepairError(error) ||\n error.code === \"controller.launch.choice_required\"\n );\n });\n if (recoverableErrors.length === 0) {\n return initialResult;\n }\n\n for (const error of recoverableErrors) {\n await recoverSelectedLocalAgentForSetup({\n error,\n input: input.input,\n progress: input.progress,\n });\n }\n\n return await enableSelectedLocalAgentsForSetup(input);\n}\n\nasync function enableSelectedLocalAgentsForSetup(input: {\n input: PrepareSessionExecutorInput;\n installId?: string;\n localAgentIds: readonly string[];\n}): Promise<StartLocalAgentsEnableResult> {\n return await runStartLocalAgentsEnable({\n agent: [...input.localAgentIds],\n ...(input.installId ? { install: input.installId } : {}),\n interactive: input.input.interactive,\n presentation: \"handoff\",\n view: input.input.view,\n });\n}\n\nasync function recoverSelectedLocalAgentForSetup(input: {\n error: StartLocalAgentsEnableError;\n input: PrepareSessionExecutorInput;\n progress?: SetupProgressStepHandle;\n}): Promise<void> {\n if (isSelectedLocalAgentNeedsRepairError(input.error)) {\n await repairSelectedLocalAgentForSetup(input);\n return;\n }\n\n if (input.error.code === \"controller.launch.choice_required\") {\n const installId = await resolveSelectedLocalAgentInstallChoice({\n command: \"enable\",\n error: input.error,\n input: input.input,\n progress: input.progress,\n });\n const enableResult = await enableSelectedLocalAgentsForSetup({\n input: input.input,\n installId,\n localAgentIds: [input.error.agentId],\n });\n assertSelectedLocalAgentRecoveryCompleted({\n errorFormatter: formatSelectedLocalAgentEnableFailure,\n result: enableResult,\n });\n }\n}\n\nasync function repairSelectedLocalAgentForSetup(input: {\n error: StartLocalAgentsEnableError;\n input: PrepareSessionExecutorInput;\n progress?: SetupProgressStepHandle;\n}): Promise<void> {\n await repairLocalAgentForSetup({\n agentId: input.error.agentId,\n input: input.input,\n progress: input.progress,\n });\n}\n\nasync function repairLocalAgentForSetup(input: {\n agentId: string;\n input: PrepareSessionExecutorInput;\n progress?: SetupProgressStepHandle;\n}): Promise<void> {\n const repairResult = await runSelectedLocalAgentRepairForSetup({\n agentId: input.agentId,\n input: input.input,\n });\n const blockingError = resolveRepairBlockingError(repairResult);\n if (!blockingError) {\n if (input.progress) {\n input.progress.detail({\n code: \"prepare.session.progress.local_agents.repaired\",\n text: `${formatLocalAgentDisplayName(input.agentId)} local setup repaired; continuing setup...`,\n });\n } else {\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: `${formatLocalAgentDisplayName(input.agentId)} local setup repaired.`,\n });\n }\n return;\n }\n\n if (blockingError.code === \"controller.launch.choice_required\") {\n const installId = await resolveSelectedLocalAgentInstallChoice({\n command: \"repair\",\n error: blockingError,\n input: input.input,\n progress: input.progress,\n });\n const selectedRepairResult = await runSelectedLocalAgentRepairForSetup({\n agentId: input.agentId,\n input: input.input,\n installId,\n });\n const selectedBlockingError =\n resolveRepairBlockingError(selectedRepairResult);\n if (!selectedBlockingError) {\n return;\n }\n throw new Error(\n formatSelectedLocalAgentRepairFailure(selectedBlockingError)\n );\n }\n\n throw new Error(formatSelectedLocalAgentRepairFailure(blockingError));\n}\n\nasync function runSelectedLocalAgentRepairForSetup(input: {\n agentId: string;\n input: PrepareSessionExecutorInput;\n installId?: string;\n}): Promise<StartLocalAgentsRepairResult> {\n return await runAgentsRepair({\n agent: [input.agentId],\n ...(input.installId ? { install: input.installId } : {}),\n interactive: input.input.interactive,\n presentation: \"handoff\",\n view: input.input.view,\n });\n}\n\nfunction resolveRepairBlockingError(\n result: StartLocalAgentsRepairResult\n): StartLocalAgentsRepairError | null {\n if (result.status !== \"completed\") {\n return {\n agentId: \"selected-agent\",\n code: \"controller.launch.needs_repair\",\n reason: \"agent repair did not complete\",\n };\n }\n return result.summary.errors[0] ?? null;\n}\n\nfunction assertSelectedLocalAgentRecoveryCompleted(input: {\n errorFormatter: (error: StartLocalAgentsEnableError) => string;\n result: StartLocalAgentsEnableResult;\n}): void {\n if (input.result.status !== \"completed\") {\n throw new Error(\n \"OpenMeld setup cannot continue until the selected local agent is enabled.\"\n );\n }\n const blockingError = input.result.summary.errors[0] ?? null;\n if (blockingError) {\n throw new Error(input.errorFormatter(blockingError));\n }\n}\n\nasync function resolveSelectedLocalAgentInstallChoice(input: {\n command: \"enable\" | \"repair\";\n error: SelectedLocalAgentInstallChoiceError;\n input: PrepareSessionExecutorInput;\n progress?: SetupProgressStepHandle;\n}): Promise<string> {\n const installChoices = input.error.installChoices ?? [];\n if (installChoices.length === 0) {\n throw new Error(formatSelectedLocalAgentInstallChoiceFailure(input));\n }\n\n if (installChoices.length === 1) {\n const installChoice = installChoices[0];\n if (!installChoice) {\n throw new Error(formatSelectedLocalAgentInstallChoiceFailure(input));\n }\n const message = `Using ${installChoice.label} for ${formatLocalAgentDisplayName(\n input.error.agentId\n )}.`;\n if (input.progress) {\n input.progress.detail({\n code: \"prepare.session.progress.local_agents.install_choice\",\n text: message,\n });\n } else {\n emitPrepareProgressLine(input.input, {\n state: \"success\",\n text: message,\n });\n }\n return installChoice.installId;\n }\n\n const terminal =\n input.input.runtime.resolvedView === \"human\"\n ? resolveControllingTerminalSession()\n : null;\n if (!terminal) {\n throw new Error(formatSelectedLocalAgentInstallChoiceFailure(input));\n }\n\n try {\n const result = await promptSearchSelect(\n {\n message: `Choose the ${formatLocalAgentDisplayName(\n input.error.agentId\n )} install OpenMeld should use`,\n items: installChoices.map((installChoice) => ({\n value: installChoice.installId,\n label: installChoice.label,\n detail: installChoice.detail,\n searchText: [\n installChoice.label,\n installChoice.detail,\n installChoice.commandPath,\n installChoice.installId,\n ].join(\" \"),\n })),\n },\n terminal.streams\n );\n if (result.status === \"submitted\") {\n return result.value;\n }\n throw new Error(\n \"OpenMeld setup was cancelled before choosing a local agent install.\"\n );\n } finally {\n terminal.close();\n }\n}\n\nfunction isSelectedLocalAgentNeedsRepairError(\n error: StartLocalAgentsEnableError\n): boolean {\n return (\n error.code === \"controller.launch.needs_repair\" ||\n (error.code === \"agents.invalid_agent_id\" &&\n normalizeOptionalId(error.reason) === \"needs repair\")\n );\n}\n\nfunction assertSelectedLocalAgentsEnabledForPrepare(\n result: StartLocalAgentsEnableResult\n): void {\n if (result.status !== \"completed\") {\n throw new Error(\n \"OpenMeld setup cannot continue until the selected local agents are enabled. Choose or enable them in Terminal, then run OpenMeld setup again.\"\n );\n }\n\n const blockingError = result.summary.errors[0] ?? null;\n if (blockingError) {\n throw new Error(formatSelectedLocalAgentEnableFailure(blockingError));\n }\n}\n\nfunction formatSelectedLocalAgentEnableFailure(\n error: StartLocalAgentsEnableError\n): string {\n if (error.code === \"controller.launch.choice_required\") {\n const commands = resolveSelectedLocalAgentEnableNextSteps(error);\n const reason =\n normalizeOptionalId(error.reason) ||\n `OpenMeld found more than one ${error.agentId} install on this computer.`;\n if (commands.length > 0) {\n return `${reason} Run one of these commands, then return to OpenMeld Web setup: ${formatCommandChoiceList(commands)}.`;\n }\n return `${reason} Run \\`${formatOpenMeldCliCommand(\n `openmeld agents enable --agent ${error.agentId}`\n )}\\` in an interactive Terminal and choose one install. If this Terminal cannot prompt, run \\`${formatOpenMeldCliCommand(\n `openmeld agents enable --agent ${error.agentId} --install <install-id>`\n )}\\` with one of the install IDs shown by that enable command, then return to OpenMeld Web setup.`;\n }\n\n if (error.code === \"controller.launch.needs_repair\") {\n return `OpenMeld could not connect ${error.agentId} on this computer. Run \\`${formatOpenMeldCliCommand(\n `openmeld agents repair --agent ${error.agentId}`\n )}\\`, then return to OpenMeld Web setup. Detail: ${error.reason}`;\n }\n\n const nextStep = error.nextSteps?.[0] ?? null;\n if (nextStep) {\n return `OpenMeld could not connect ${error.agentId} on this computer. Run \\`${formatOpenMeldCliCommand(\n nextStep\n )}\\`, then return to OpenMeld Web setup. Detail: ${error.reason}`;\n }\n\n return `OpenMeld could not connect ${error.agentId} on this computer. Detail: ${error.reason}`;\n}\n\nfunction formatSelectedLocalAgentRepairFailure(\n error: StartLocalAgentsRepairError\n): string {\n if (error.code === \"controller.launch.choice_required\") {\n return formatSelectedLocalAgentInstallChoiceFailure({\n command: \"repair\",\n error,\n });\n }\n\n return `OpenMeld could not repair ${error.agentId} on this computer. Run \\`${formatOpenMeldCliCommand(\n `openmeld agents repair --agent ${error.agentId}`\n )}\\`, then return to OpenMeld Web setup. Detail: ${error.reason}`;\n}\n\nfunction formatSelectedLocalAgentInstallChoiceFailure(input: {\n command: \"enable\" | \"repair\";\n error: SelectedLocalAgentInstallChoiceError;\n}): string {\n const commands =\n input.error.nextSteps && input.error.nextSteps.length > 0\n ? input.error.nextSteps\n : (input.error.installChoices ?? []).map(\n (installChoice) =>\n `openmeld agents ${input.command} --agent ${input.error.agentId} --install ${installChoice.installId}`\n );\n const reason =\n normalizeOptionalId(input.error.reason) ||\n `OpenMeld found more than one ${input.error.agentId} install on this computer.`;\n if (commands.length > 0) {\n return `${reason} Run one of these commands, then return to OpenMeld Web setup: ${formatCommandChoiceList(commands)}.`;\n }\n return `${reason} Run \\`${formatOpenMeldCliCommand(\n `openmeld agents ${input.command} --agent ${input.error.agentId}`\n )}\\` in an interactive Terminal and choose one install, then return to OpenMeld Web setup.`;\n}\n\nfunction formatLocalAgentDisplayName(agentId: string): string {\n return agentId\n .split(\"-\")\n .filter((part) => part.length > 0)\n .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n\nfunction resolveSelectedLocalAgentEnableNextSteps(\n error: StartLocalAgentsEnableError\n): string[] {\n if (error.nextSteps && error.nextSteps.length > 0) {\n return [...error.nextSteps];\n }\n\n return (error.installChoices ?? []).map(\n (installChoice) =>\n `openmeld agents enable --agent ${error.agentId} --install ${installChoice.installId}`\n );\n}\n\nfunction formatCommandChoiceList(commands: readonly string[]): string {\n return commands\n .map((command) => `\\`${formatOpenMeldCliCommand(command)}\\``)\n .join(\" or \");\n}\n\ntype PrepareSessionTerminalAuthCheck =\n | {\n status: \"ok\";\n }\n | {\n message: string;\n reasonCode: string;\n status: \"blocked\";\n };\n\nexport function resolvePrepareSessionTerminalAuthCheck(input: {\n authState: AuthSessionStateResult;\n snapshot: Pick<PrepareSessionSnapshot, \"ownerUserId\">;\n}): PrepareSessionTerminalAuthCheck {\n if (input.authState.state !== \"valid\" || input.authState.session === null) {\n return {\n status: \"blocked\",\n reasonCode: \"prepare.auth.sign_in_required\",\n message: `This Terminal is not signed in to OpenMeld. Run \\`${formatOpenMeldCliCommand(\n \"openmeld login\"\n )}\\` with the same account shown in OpenMeld Web, then copy a fresh setup command from OpenMeld Web and run setup again.`,\n };\n }\n\n const terminalUserId = normalizeOptionalId(input.authState.session.user?.id);\n if (!terminalUserId) {\n return {\n status: \"blocked\",\n reasonCode: \"prepare.auth.account_unknown\",\n message: `This Terminal sign-in is missing its OpenMeld account ID. Run \\`${formatOpenMeldCliCommand(\n \"openmeld login\"\n )}\\` again with the same account shown in OpenMeld Web, then copy a fresh setup command from OpenMeld Web and run setup again.`,\n };\n }\n\n if (terminalUserId !== input.snapshot.ownerUserId) {\n const terminalAccount = normalizeOptionalId(\n input.authState.session.user?.email\n );\n return {\n status: \"blocked\",\n reasonCode: \"prepare.auth.account_mismatch\",\n message: `This Terminal is signed in${terminalAccount ? ` as ${terminalAccount}` : \"\"}, but OpenMeld Web is using a different account. Run \\`${formatOpenMeldCliCommand(\n \"openmeld login\"\n )}\\` with the account shown in OpenMeld Web, then copy a fresh setup command from OpenMeld Web and run setup again.`,\n };\n }\n\n return { status: \"ok\" };\n}\n\nasync function enforcePrepareSessionTerminalAuth(input: {\n input: PrepareSessionExecutorInput;\n stream: PrepareSessionStream;\n snapshot: PrepareSessionSnapshot;\n}): Promise<void> {\n const result = resolvePrepareSessionTerminalAuthCheck({\n authState: await getAuthSessionState(),\n snapshot: input.snapshot,\n });\n if (result.status === \"ok\") {\n return;\n }\n const connectionEpoch = requireConnectionEpoch(input.snapshot);\n const beforeWriteRevision =\n input.stream.getLatestSnapshot()?.sessionRevision ??\n input.snapshot.sessionRevision;\n input.stream.writeTerminalStep({\n connectionEpoch,\n expectedRevision: input.snapshot.sessionRevision,\n stepId: \"connect_terminal\",\n status: \"failed\",\n reasonCode: result.reasonCode,\n message: result.message,\n });\n await input.stream.waitForSnapshot((snapshot) => {\n const step = findStep(snapshot, \"connect_terminal\");\n return (\n snapshot.sessionRevision > beforeWriteRevision &&\n step?.state === \"blocked\"\n );\n });\n emitHumanStatus(input.input, \"Setup blocked\", [result.message]);\n throw new Error(result.message);\n}\n\nasync function connectSelectedLocalAgentsToOpenMeld(input: {\n connectedComputerId?: string;\n openMeldServiceRuntimeIdentity?: TerminalRuntimeIdentity;\n gatewayUrl: string;\n localAgentIds: readonly string[];\n progress?: SetupProgressStepHandle;\n syncRouteCatalog?: boolean;\n}): Promise<TerminalStepRunResult> {\n let lastTransientError: unknown = null;\n let waitingMessageShown = false;\n for (\n let attempt = 1;\n attempt <= REPORT_RUNTIME_CONNECTION_MAX_ATTEMPTS;\n attempt++\n ) {\n try {\n return await connectSelectedLocalAgentsToOpenMeldOnce(input);\n } catch (error) {\n if (\n !isTransientSelectedAgentConnectionError(error) ||\n attempt >= REPORT_RUNTIME_CONNECTION_MAX_ATTEMPTS\n ) {\n throw error;\n }\n lastTransientError = error;\n if (!waitingMessageShown) {\n waitingMessageShown = true;\n input.progress?.detail({\n code: \"prepare.session.progress.report_runtime.waiting\",\n text: formatRuntimeReportWaitingMessage(input.localAgentIds),\n });\n }\n await sleep(computeRetryDelayMs(attempt));\n }\n }\n\n throw (\n lastTransientError ?? new Error(\"OpenMeld could not connect local agents.\")\n );\n}\n\nasync function connectSelectedLocalAgentsToOpenMeldOnce(input: {\n connectedComputerId?: string;\n openMeldServiceRuntimeIdentity?: TerminalRuntimeIdentity;\n gatewayUrl: string;\n localAgentIds: readonly string[];\n progress?: SetupProgressStepHandle;\n syncRouteCatalog?: boolean;\n}): Promise<TerminalStepRunResult> {\n const openMeldServiceRuntimeIdentity =\n input.openMeldServiceRuntimeIdentity ??\n (await syncLocalSetupCurrentDeviceTargetFromServiceContract({\n ...(input.connectedComputerId\n ? { connectedComputerId: input.connectedComputerId }\n : {}),\n gatewayUrl: input.gatewayUrl,\n }));\n const readiness = await collectStartLocalReadiness({\n auth: {\n status: \"valid\",\n email: null,\n authBaseUrl: null,\n gatewayUrl: input.gatewayUrl,\n },\n });\n const runtimeReports = await submitSelectedAgentControllerReports({\n readiness,\n localAgentIds: input.localAgentIds,\n });\n assertSelectedAgentControllerReportSubmissionsAccepted(runtimeReports);\n emitSelectedLocalAgentAttention(input.progress, runtimeReports);\n if (input.syncRouteCatalog) {\n await notifyRouteCatalogAfterPrepare({\n reason: \"prepare_selected_agents_reported\",\n });\n }\n return {\n ...openMeldServiceRuntimeIdentity,\n localReadinessSnapshot: buildPrepareLocalReadinessSnapshot(readiness),\n runtimeReports,\n };\n}\n\nfunction emitSelectedLocalAgentAttention(\n progress: SetupProgressStepHandle | undefined,\n runtimeReports: readonly SelectedAgentControllerReportResult[]\n): void {\n for (const report of runtimeReports) {\n if (report.localParticipationState === \"ready\") {\n continue;\n }\n const displayName = formatLocalAgentDisplayName(report.agentId);\n const needsSignIn = report.reasonCodes.some(\n (reasonCode) =>\n reasonCode === \"provider_account.access_required\" ||\n reasonCode === \"controller.auth.unauthenticated\"\n );\n progress?.detail({\n code: \"prepare.session.progress.report_runtime.agent_attention\",\n text: needsSignIn\n ? `${displayName} needs sign-in before you can use it. You can do this later.`\n : `${displayName} is enabled, but it is not ready yet. Review it later in this computer's settings.`,\n });\n }\n}\n\nfunction buildPrepareSessionExecutorCompletionFacts(input: {\n reportRuntimeResult: TerminalStepRunResult;\n selectedLocalAgentIds: readonly string[];\n}): PrepareSessionExecutorCompletionFacts {\n return {\n openMeldServiceRuntimeIdentity: {\n deviceId: input.reportRuntimeResult.deviceId,\n runtimeLane: input.reportRuntimeResult.runtimeLane,\n },\n runtimeReports: input.reportRuntimeResult.runtimeReports ?? [],\n selectedLocalAgentIds: [...input.selectedLocalAgentIds],\n };\n}\n\nfunction isTransientSelectedAgentConnectionError(error: unknown): boolean {\n const rawMessage = toErrorMessage(error).toLowerCase();\n return (\n rawMessage.includes(\"service has not finished starting\") ||\n rawMessage.includes(\"openmeld service is not running\") ||\n rawMessage.includes(\"service.not_running\") ||\n rawMessage.includes(\"service_contract_unavailable\") ||\n rawMessage.includes(\"runtime.reporting.write_failed\")\n );\n}\n\nasync function finishPrepareSetup(): Promise<TerminalStepRunResult> {\n return await readTerminalRuntimeIdentityFromServiceContract();\n}\n\nasync function readTerminalRuntimeIdentityFromServiceContract(): Promise<TerminalRuntimeIdentity> {\n // OPENMELD_SETUP_TO_WAKE_PATH: HIGHEST_FACT service-session\n // The service contract provides this computer's account/lane/device identity.\n // Other local setup evidence must not replace this fact.\n const serviceContract = await readDaemonServiceContract();\n const deviceId = serviceContract?.deviceId;\n const runtimeLane = serviceContract?.lane;\n if (!(deviceId && runtimeLane)) {\n throw new Error(\n `OpenMeld could not finish setup because OpenMeld Service did not provide this computer's device identity yet. Keep OpenMeld Service running, then run \\`${formatOpenMeldCliCommand(\n \"openmeld setup --view agent\"\n )}\\` again. You can also run \\`${formatOpenMeldCliCommand(\n \"openmeld service status --view agent\"\n )}\\` to inspect the local service.`\n );\n }\n return {\n deviceId,\n runtimeLane,\n };\n}\n\nasync function notifyRouteCatalogAfterPrepare(input: {\n reason: string;\n}): Promise<void> {\n await notifyDaemonRouteCatalogChanged({\n reason: input.reason,\n });\n}\n\nfunction buildPrepareLocalReadinessSnapshot(\n readiness: StartReadinessSnapshot\n): PrepareLocalReadinessSnapshot {\n return {\n observedAt: new Date().toISOString(),\n service: {\n installStatus: readiness.service.status,\n runtimeStatus: readiness.service.runtime?.status ?? \"unknown\",\n installedVersion: readiness.service.installedVersion,\n expectedVersion: readiness.service.expectedVersion,\n ...(readiness.service.executionCompatibility\n ? { executionCompatibility: readiness.service.executionCompatibility }\n : {}),\n },\n skills: {\n status: readiness.skills.status,\n targetCount: readiness.skills.targetCount,\n summary: { ...readiness.skills.summary },\n },\n };\n}\n\n// Best-effort launchd job-state verdict for a failed refresh_service step so the\n// setup failure surfaced on OpenMeld Web names the root cause (never-spawned / crash\n// loop) instead of the generic copy. Diagnostic evidence only; a null verdict\n// falls back to the generic message.\nasync function resolveRefreshServiceJobVerdict(input: {\n stepId: PrepareStepId;\n resolveServiceJobVerdict?: typeof resolvePrepareServiceJobVerdict;\n}): Promise<PrepareServiceJobVerdict | null> {\n if (input.stepId !== \"refresh_service\") {\n return null;\n }\n const resolve =\n input.resolveServiceJobVerdict ?? resolvePrepareServiceJobVerdict;\n return await resolve().catch(() => null);\n}\n\nexport function formatTerminalStepFailureMessage(input: {\n rawMessage: string;\n stepId: PrepareStepId;\n serviceJobVerdict?: PrepareServiceJobVerdict | null;\n}): string {\n if (input.rawMessage.includes(\"prepare session revision conflict\")) {\n return \"This setup changed while Terminal was working. Return to OpenMeld Web to see the current connection state and its valid recovery action.\";\n }\n if (input.stepId === \"refresh_service\") {\n if (input.serviceJobVerdict === \"never_spawned\") {\n return \"macOS didn't start OpenMeld Service. Open System Settings > General > Login Items & Extensions, turn on the OpenMeld background item, then return to OpenMeld Web and choose Try again.\";\n }\n if (input.serviceJobVerdict === \"crashed\") {\n return `OpenMeld Service keeps stopping after it starts. Run \\`${formatOpenMeldCliCommand(\n \"openmeld service repair\"\n )}\\` once; OpenMeld saved the failure details for support.`;\n }\n const copy = buildHumanErrorCopy(input.rawMessage);\n if (copy.nextStep) {\n return `${copy.summary} ${copy.nextStep}`;\n }\n return `OpenMeld couldn't finish connecting its background service. Run \\`${formatOpenMeldCliCommand(\"openmeld service repair\")}\\`, then get a new setup command from OpenMeld Web.`;\n }\n const copy = buildHumanErrorCopy(input.rawMessage);\n return [\n copy.summary,\n copy.nextStep ??\n \"Return to OpenMeld Web to see the current connection state and recovery action.\",\n ].join(\" \");\n}\n\nfunction resolveTerminalStepFailureReasonCode(input: {\n rawMessage: string;\n stepId: PrepareStepId;\n serviceJobVerdict?: PrepareServiceJobVerdict | null;\n}): string {\n if (input.rawMessage.includes(\"runtime.registration.device_forgotten\")) {\n return \"runtime.registration.device_forgotten\";\n }\n if (input.stepId === \"refresh_service\") {\n if (input.serviceJobVerdict === \"never_spawned\") {\n return \"prepare.refresh_service.service_never_spawned\";\n }\n if (input.serviceJobVerdict === \"crashed\") {\n return \"prepare.refresh_service.service_crash_loop\";\n }\n }\n return `prepare.${input.stepId}.failed`;\n}\n\nfunction findStep(snapshot: PrepareSessionSnapshot, stepId: PrepareStepId) {\n return snapshot.steps.find((step) => step.id === stepId) ?? null;\n}\n\ntype TerminalStepWriteInput = {\n connectionEpoch: number;\n deviceId?: string;\n expectedRevision: number;\n localReadinessSnapshot?: PrepareLocalReadinessSnapshot;\n runtimeLane?: string;\n stepId: PrepareStepId;\n status: \"completed\" | \"failed\" | \"started\";\n reasonCode?: string;\n message?: string;\n diagnostics?: string;\n};\n\ntype TerminalRuntimeIdentity = {\n deviceId: string;\n runtimeLane: string;\n};\n\ntype TerminalStepRunResult = TerminalRuntimeIdentity & {\n localReadinessSnapshot?: PrepareLocalReadinessSnapshot;\n runtimeReports?: readonly SelectedAgentControllerReportResult[];\n};\n\nfunction resolveRuntimeIdentityFromPrepareSessionSnapshot(\n snapshot: PrepareSessionSnapshot\n): TerminalRuntimeIdentity | null {\n if (!(snapshot.deviceId && snapshot.runtimeLane)) {\n return null;\n }\n return {\n deviceId: snapshot.deviceId,\n runtimeLane: snapshot.runtimeLane,\n };\n}\n\ntype TerminalLocalAgentCatalogWriteInput = {\n connectionEpoch: number;\n localAgentCatalog: PrepareLocalAgentCatalog;\n};\n\nexport type PrepareSessionStream = {\n close(): void;\n getLatestSnapshot(): PrepareSessionSnapshot | null;\n waitForSnapshot(\n predicate: (snapshot: PrepareSessionSnapshot) => boolean\n ): Promise<PrepareSessionSnapshot>;\n writeTerminalLocalAgentCatalog(\n input: TerminalLocalAgentCatalogWriteInput\n ): void;\n writeTerminalAgentSelection(input: {\n connectionEpoch: number;\n expectedRevision: number;\n localAgentIds: string[];\n }): void;\n writeTerminalStep(input: TerminalStepWriteInput): void;\n};\n\nexport function buildPrepareSessionClientHelloFrame(input: {\n cliVersion: string;\n}) {\n return {\n type: \"client.hello\" as const,\n payload: {\n cliVersion: input.cliVersion,\n protocolVersion: PREPARE_SESSION_STREAM_PROTOCOL_VERSION,\n },\n };\n}\n\nexport function isLegacyPrepareSessionClientHelloRejection(input: {\n code: string;\n message: string;\n}): boolean {\n return (\n input.code === \"schema.invalid\" &&\n input.message === \"Invalid prepare session frame.\"\n );\n}\n\nexport function isPrepareSessionFrameSchemaRejection(input: {\n code: string;\n}): boolean {\n // Cores that predate a client frame field fail to parse the whole frame:\n // current cores answer prepare.session.protocol_mismatch, the oldest ones\n // schema.invalid. Neither closes the socket, so a stripped resend can land.\n return (\n input.code === \"prepare.session.protocol_mismatch\" ||\n input.code === \"schema.invalid\"\n );\n}\n\nconst TERMINAL_STEP_FAILURE_SETTLE_TIMEOUT_MS = 2000;\n\nasync function waitForTerminalStepWriteToSettle(input: {\n revisionFloor: number;\n stream: PrepareSessionStream;\n}): Promise<void> {\n let timer: NodeJS.Timeout | null = null;\n try {\n await Promise.race([\n input.stream.waitForSnapshot(\n (snapshot) => snapshot.sessionRevision > input.revisionFloor\n ),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, TERMINAL_STEP_FAILURE_SETTLE_TIMEOUT_MS);\n }),\n ]);\n } catch {\n // Best-effort: a broken stream must not mask the original step failure.\n } finally {\n if (timer !== null) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function waitForSnapshotWithProgress(input: {\n input: PrepareSessionExecutorInput;\n predicate: (snapshot: PrepareSessionSnapshot) => boolean;\n progress?: SetupProgressStepHandle;\n stream: PrepareSessionStream;\n waitingMessage: string;\n}): Promise<PrepareSessionSnapshot> {\n let progress: SetupProgressStepHandle | null = input.progress ?? null;\n let progressStartedByWait = false;\n const waitingProgressTimer = setTimeout(() => {\n if (input.progress) {\n input.progress.detail({\n code: \"prepare.session.waiting\",\n text: input.waitingMessage,\n });\n return;\n }\n progress = startPrepareProgressStep(input.input, {\n code: \"prepare.session.waiting\",\n text: input.waitingMessage,\n });\n progressStartedByWait = true;\n }, WAITING_PROGRESS_DELAY_MS);\n try {\n return await input.stream.waitForSnapshot(input.predicate);\n } finally {\n clearTimeout(waitingProgressTimer);\n if (progressStartedByWait) {\n progress?.cancel();\n }\n }\n}\n\nexport async function reportPrepareHandoffStopped(input: {\n stream: PrepareSessionStream;\n reasonCode: string;\n message: string;\n error?: unknown;\n}): Promise<void> {\n const stream = input.stream;\n const timeout = setTimeout(() => stream.close(), 5000);\n try {\n const snapshot = await stream.waitForSnapshot(\n (current) => current.terminalConnection.status === \"connected\"\n );\n const connectionEpoch = snapshot.terminalConnection.connectionEpoch;\n if (connectionEpoch === null) {\n throw new Error(\"Terminal connection was not confirmed.\");\n }\n const diagnostics = await collectPrepareStepDiagnostics({\n stepId: \"connect_terminal\",\n supportCode: input.reasonCode,\n error: input.error,\n });\n stream.writeTerminalStep({\n connectionEpoch,\n expectedRevision: snapshot.sessionRevision,\n stepId: \"connect_terminal\",\n status: \"failed\",\n reasonCode: input.reasonCode,\n message: input.message,\n ...(diagnostics === null ? {} : { diagnostics }),\n });\n await stream.waitForSnapshot((current) =>\n current.blockers.some(\n (blocker) => blocker.reasonCode === input.reasonCode\n )\n );\n } finally {\n clearTimeout(timeout);\n stream.close();\n }\n}\n\nexport async function connectPrepareSessionStream(input: {\n gatewayUrl: string;\n opaqueToken: string;\n prepareSessionId: string;\n}): Promise<PrepareSessionStream> {\n const ws = await connectWebSocket(\n buildPrepareSessionStreamUrl(input.gatewayUrl, input.prepareSessionId),\n {\n headers: {\n [PREPARE_TOKEN_HEADER]: input.opaqueToken,\n },\n }\n );\n let latestSnapshot: PrepareSessionSnapshot | null = null;\n const waiters: Array<{\n reject: (error: Error) => void;\n predicate: (snapshot: PrepareSessionSnapshot) => boolean;\n resolve: (snapshot: PrepareSessionSnapshot) => void;\n }> = [];\n const rejectWaiters = (error: Error) => {\n for (const waiter of waiters.splice(0)) {\n waiter.reject(error);\n }\n };\n let closedError: PrepareSessionConnectionInterruptedError | null = null;\n let stateWriteSent = false;\n // Stripped copy of the last diagnostics-carrying step write. Cores that\n // predate the diagnostics field reject the whole frame, so the base failure\n // report is resent once without it; snapshots clear the pending copy.\n let pendingStepWriteFallbackFrame: unknown = null;\n const assertStreamOpen = (): void => {\n if (closedError) {\n throw closedError;\n }\n };\n const sendFrame = (frame: unknown): void => {\n assertStreamOpen();\n try {\n ws.send(JSON.stringify(frame));\n } catch (error) {\n closedError = new PrepareSessionConnectionInterruptedError(\n null,\n error instanceof Error ? error.message : \"connection failed\"\n );\n throw closedError;\n }\n };\n\n const handleServerErrorFrame = (payload: {\n code: string;\n message: string;\n }): void => {\n if (\n !stateWriteSent &&\n isLegacyPrepareSessionClientHelloRejection(payload)\n ) {\n return;\n }\n if (\n pendingStepWriteFallbackFrame !== null &&\n isPrepareSessionFrameSchemaRejection(payload)\n ) {\n const fallbackFrame = pendingStepWriteFallbackFrame;\n pendingStepWriteFallbackFrame = null;\n try {\n sendFrame(fallbackFrame);\n } catch {\n // Connection lost; the diagnostics attach stays best-effort.\n }\n return;\n }\n rejectWaiters(errorFromPrepareSessionServerError(payload));\n };\n\n ws.onMessage((raw) => {\n const frame = parseServerFrame(raw);\n if (!frame) {\n return;\n }\n if (frame.type === \"terminal.replaced\") {\n rejectWaiters(\n new PrepareSessionTerminalReplacedError(frame.payload.message)\n );\n ws.close(4000, \"terminal_replaced\");\n return;\n }\n if (frame.type === \"server.error\") {\n handleServerErrorFrame(frame.payload);\n return;\n }\n if (frame.type !== \"snapshot\" && frame.type !== \"snapshot_changed\") {\n return;\n }\n\n pendingStepWriteFallbackFrame = null;\n const snapshot: PrepareSessionSnapshot = frame.payload.snapshot;\n latestSnapshot = snapshot;\n for (const waiter of [...waiters]) {\n if (!waiter.predicate(snapshot)) {\n continue;\n }\n waiters.splice(waiters.indexOf(waiter), 1);\n waiter.resolve(snapshot);\n }\n });\n ws.onClose((code, reason) => {\n closedError = new PrepareSessionConnectionInterruptedError(code, reason);\n rejectWaiters(closedError);\n });\n ws.onError((error) => {\n closedError = new PrepareSessionConnectionInterruptedError(\n null,\n error instanceof Error ? error.message : \"connection failed\"\n );\n rejectWaiters(closedError);\n });\n sendFrame(\n buildPrepareSessionClientHelloFrame({\n cliVersion: getCliVersionInfo().version,\n })\n );\n\n return {\n close: () => ws.close(1000, \"prepare_complete\"),\n getLatestSnapshot: () => latestSnapshot,\n waitForSnapshot: async (predicate) => {\n const snapshot = latestSnapshot;\n if (snapshot && predicate(snapshot)) {\n return snapshot;\n }\n assertStreamOpen();\n return await new Promise<PrepareSessionSnapshot>((resolve, reject) => {\n waiters.push({ predicate, reject, resolve });\n });\n },\n writeTerminalStep: (step) => {\n if (!latestSnapshot) {\n throw new Error(\"Setup session snapshot is not available yet.\");\n }\n stateWriteSent = true;\n const basePayload = {\n prepareSessionId: latestSnapshot.prepareSessionId,\n connectionEpoch: step.connectionEpoch,\n expectedRevision: step.expectedRevision,\n ...(step.deviceId === undefined ? {} : { deviceId: step.deviceId }),\n ...(step.runtimeLane === undefined\n ? {}\n : { runtimeLane: step.runtimeLane }),\n stepAttemptId: crypto.randomUUID(),\n stepId: step.stepId,\n status: step.status,\n ...(step.reasonCode === undefined\n ? {}\n : { reasonCode: step.reasonCode }),\n ...(step.localReadinessSnapshot === undefined\n ? {}\n : { localReadinessSnapshot: step.localReadinessSnapshot }),\n ...(step.message === undefined ? {} : { message: step.message }),\n };\n if (step.diagnostics === undefined) {\n pendingStepWriteFallbackFrame = null;\n sendFrame({ type: \"terminal.step.write\", payload: basePayload });\n return;\n }\n pendingStepWriteFallbackFrame = {\n type: \"terminal.step.write\",\n payload: basePayload,\n };\n sendFrame({\n type: \"terminal.step.write\",\n payload: { ...basePayload, diagnostics: step.diagnostics },\n });\n },\n writeTerminalLocalAgentCatalog: (catalog) => {\n if (!latestSnapshot) {\n throw new Error(\"Setup session snapshot is not available yet.\");\n }\n stateWriteSent = true;\n sendFrame({\n type: \"terminal.local_agent_catalog.write\",\n payload: {\n prepareSessionId: latestSnapshot.prepareSessionId,\n connectionEpoch: catalog.connectionEpoch,\n localAgentCatalog: catalog.localAgentCatalog,\n },\n });\n },\n writeTerminalAgentSelection: (selection) => {\n if (!latestSnapshot) {\n throw new Error(\"Setup session snapshot is not available yet.\");\n }\n stateWriteSent = true;\n sendFrame({\n type: \"terminal.agent_selection.write\",\n payload: {\n prepareSessionId: latestSnapshot.prepareSessionId,\n connectionEpoch: selection.connectionEpoch,\n expectedRevision: selection.expectedRevision,\n localAgentIds: selection.localAgentIds,\n },\n });\n },\n };\n}\n\nexport async function resolvePrepareSessionForHandoff(input: {\n gatewayUrl: string;\n opaqueToken: string;\n}): Promise<PrepareSessionSnapshot> {\n const response = await fetchSpaceRequestWithTimeout({\n url: new URL(\n \"/v1/prepare/sessions/resolve-token\",\n input.gatewayUrl\n ).toString(),\n operation: \"prepare.session.resolve_token\",\n init: {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n opaqueToken: input.opaqueToken,\n }),\n },\n });\n if (!response.ok) {\n throw new PrepareSessionTokenRejectedError(await response.text());\n }\n const responsePayload = await response.json().catch(() => {\n throw new PrepareSessionTokenRejectedError(\n \"Invalid prepare session response.\"\n );\n });\n const parsed = prepareSessionResponseSchema.safeParse(responsePayload);\n if (!parsed.success) {\n throw new PrepareSessionTokenRejectedError(\n \"Invalid prepare session response.\"\n );\n }\n return parsed.data.snapshot;\n}\n\nfunction buildPrepareSessionStreamUrl(\n gatewayUrl: string,\n prepareSessionId: string\n): string {\n const url = new URL(\n `/v1/prepare/sessions/${encodeURIComponent(prepareSessionId)}/stream`,\n gatewayUrl\n );\n url.searchParams.set(\"role\", \"terminal\");\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n return url.toString();\n}\n\nfunction parseServerFrame(raw: string): PrepareSessionStreamServerFrame | null {\n let json: unknown;\n try {\n json = JSON.parse(raw) as unknown;\n } catch {\n return null;\n }\n const parsed = prepareSessionStreamServerFrameSchema.safeParse(json);\n return parsed.success ? parsed.data : null;\n}\n\nfunction requireConnectionEpoch(snapshot: PrepareSessionSnapshot): number {\n const epoch = snapshot.terminalConnection.connectionEpoch;\n if (!epoch) {\n throw new Error(\"OpenMeld Web has not connected this Terminal yet.\");\n }\n return epoch;\n}\n\nfunction normalizeOptionalId(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction emitHumanLine(input: PrepareSessionExecutorInput, text: string): void {\n if (input.runtime.resolvedView !== \"human\") {\n return;\n }\n input.presenter.line({\n code: \"prepare.session.status\",\n text,\n });\n}\n\nfunction emitHumanSection(\n input: PrepareSessionExecutorInput,\n title: string\n): void {\n if (input.runtime.resolvedView !== \"human\") {\n return;\n }\n emitHumanLine(input, \"\");\n input.presenter.line({\n code: \"prepare.session.section\",\n text: title,\n });\n}\n\nfunction emitPrepareProgressLine(\n input: PrepareSessionExecutorInput,\n progress: {\n code?: string;\n data?: Record<string, unknown>;\n state: \"pending\" | \"success\";\n text: string;\n }\n): void {\n createPrepareProgressReporter(input).line({\n code: progress.code ?? `prepare.session.progress.${progress.state}`,\n data: progress.data,\n state: progress.state,\n text: progress.text,\n });\n}\n\nfunction emitPrepareProgressDetail(\n input: PrepareSessionExecutorInput,\n text: string,\n code?: string\n): void {\n createPrepareProgressReporter(input).detail({\n code: code ?? \"prepare.session.progress.detail\",\n text,\n });\n}\n\nfunction startPrepareProgressStep(\n input: PrepareSessionExecutorInput,\n progress: {\n code: string;\n data?: Record<string, unknown>;\n text: string;\n }\n): SetupProgressStepHandle {\n return createPrepareProgressReporter(input).startStep({\n code: progress.code,\n data: progress.data,\n text: progress.text,\n });\n}\n\nfunction createPrepareProgressReporter(\n input: PrepareSessionExecutorInput\n): ReturnType<typeof createSetupProgressReporter> {\n return createSetupProgressReporter({\n presenter: input.presenter,\n runtime: input.runtime,\n });\n}\n\nfunction emitHumanStatus(\n input: PrepareSessionExecutorInput,\n title: string,\n lines: readonly string[]\n): void {\n if (input.runtime.resolvedView !== \"human\") {\n return;\n }\n emitHumanLine(input, \"\");\n renderInfoCard({\n presenter: input.presenter,\n title,\n codePrefix: `prepare.session.${toStatusCodeSlug(title)}`,\n rows: lines.map((line) => ({ label: \"\", value: line })),\n sanitize: true,\n minContentWidth: 56,\n });\n}\n\nfunction formatSelectedLocalAgentNames(input: {\n localAgentIds: readonly string[];\n snapshot: PrepareSessionSnapshot;\n}): string {\n const entriesById = new Map(\n (input.snapshot.localAgentCatalog?.entries ?? []).map((entry) => [\n entry.agentId,\n entry,\n ])\n );\n return input.localAgentIds\n .map((agentId) => entriesById.get(agentId)?.displayName ?? agentId)\n .join(\", \");\n}\n\nfunction toStatusCodeSlug(title: string): string {\n const slug = title\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"_\")\n .replaceAll(/^_+|_+$/g, \"\");\n return slug.length > 0 ? slug : \"status\";\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n const message = error.message.trim();\n return message.length > 0 ? message : \"unknown error\";\n }\n const message = String(error ?? \"\").trim();\n return message.length > 0 ? message : \"unknown error\";\n}\n\nclass PrepareSessionTerminalReplacedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PrepareSessionTerminalReplacedError\";\n }\n}\n\nclass PrepareSessionRevisionConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PrepareSessionRevisionConflictError\";\n }\n}\n\nexport class PrepareSessionConnectionInterruptedError extends Error {\n constructor(code: number | null, reason: string) {\n const suffix =\n code === null ? reason : `${code}${reason ? `: ${reason}` : \"\"}`;\n super(`Prepare session connection interrupted (${suffix}).`);\n this.name = \"PrepareSessionConnectionInterruptedError\";\n }\n}\n\nclass PrepareSessionTokenRejectedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PrepareSessionTokenRejectedError\";\n }\n}\n\nfunction errorFromPrepareSessionServerError(input: {\n code: string;\n message: string;\n}): Error {\n if (input.code === \"prepare.session.terminal_stale\") {\n return new PrepareSessionTerminalReplacedError(input.message);\n }\n if (input.code === \"prepare.session.revision_conflict\") {\n return new PrepareSessionRevisionConflictError(input.message);\n }\n return new Error(input.message);\n}\n"],"mappings":"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"}
|