openmeld 0.3.217 → 0.3.219

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/dist/{add-me-membership-C2Ys6Gq2.js → add-me-membership-DUspkb62.js} +2 -2
  3. package/dist/{add-me-membership-C2Ys6Gq2.js.map → add-me-membership-DUspkb62.js.map} +1 -1
  4. package/dist/{agents-ClqMS9aO.js → agents-B0LFMdki.js} +9 -9
  5. package/dist/{agents-ClqMS9aO.js.map → agents-B0LFMdki.js.map} +1 -1
  6. package/dist/{api-client-foundation-CMVD057A.js → api-client-foundation-DJ9KlXwz.js} +1 -1
  7. package/dist/{api-client-foundation-Cib1elkI.js → api-client-foundation-Dmjk9vVk.js} +3 -3
  8. package/dist/{api-client-foundation-Cib1elkI.js.map → api-client-foundation-Dmjk9vVk.js.map} +1 -1
  9. package/dist/{auth-session-DOjVKRI_.js → auth-session-CDhQANWx.js} +22 -6
  10. package/dist/auth-session-CDhQANWx.js.map +1 -0
  11. package/dist/auth-session-DsBkEFct.js +4 -0
  12. package/dist/{channel-BfTy6fDo.js → channel-D5ABuavH.js} +3 -3
  13. package/dist/{channel-BfTy6fDo.js.map → channel-D5ABuavH.js.map} +1 -1
  14. package/dist/{cli-space-api-BT_Pu9Yg.js → cli-space-api-DVfyQOhC.js} +6 -6
  15. package/dist/{cli-space-api-BT_Pu9Yg.js.map → cli-space-api-DVfyQOhC.js.map} +1 -1
  16. package/dist/{command-C1w0UpIu.js → command-CFDUoorG.js} +15 -15
  17. package/dist/{command-C1w0UpIu.js.map → command-CFDUoorG.js.map} +1 -1
  18. package/dist/{computer-connection-DsjsjmPp.js → computer-connection-DYnof5Xw.js} +2 -2
  19. package/dist/{computer-connection-DsjsjmPp.js.map → computer-connection-DYnof5Xw.js.map} +1 -1
  20. package/dist/{computer-connection-review-RXJyryCh.js → computer-connection-review-Brrrl6Hk.js} +5 -5
  21. package/dist/{computer-connection-review-RXJyryCh.js.map → computer-connection-review-Brrrl6Hk.js.map} +1 -1
  22. package/dist/{computer-disconnect-B_LZM2QE.js → computer-disconnect-B0BqUt8x.js} +7 -7
  23. package/dist/{computer-disconnect-B_LZM2QE.js.map → computer-disconnect-B0BqUt8x.js.map} +1 -1
  24. package/dist/{computer-setup-continuation-BVI7SD0M.js → computer-setup-continuation-BWwd7hfl.js} +3 -3
  25. package/dist/{computer-setup-continuation-BVI7SD0M.js.map → computer-setup-continuation-BWwd7hfl.js.map} +1 -1
  26. package/dist/{context-Di5R4iik.js → context-D9Ebb5wl.js} +4 -4
  27. package/dist/{context-Di5R4iik.js.map → context-D9Ebb5wl.js.map} +1 -1
  28. package/dist/{daemon-device-id-bfkbZj9G.js → daemon-device-id-YnLMx1kN.js} +5 -5
  29. package/dist/{daemon-device-id-bfkbZj9G.js.map → daemon-device-id-YnLMx1kN.js.map} +1 -1
  30. package/dist/{daemon-frame-transport-saNQVOyi.js → daemon-frame-transport-BOZpAMMJ.js} +34 -7
  31. package/dist/daemon-frame-transport-BOZpAMMJ.js.map +1 -0
  32. package/dist/{daemon-lifecycle-journal-DP01txRB.js → daemon-lifecycle-journal-Bp0fPeui.js} +7 -8
  33. package/dist/{daemon-lifecycle-journal-DP01txRB.js.map → daemon-lifecycle-journal-Bp0fPeui.js.map} +1 -1
  34. package/dist/{daemon-service-manager-CRHq3YSj.js → daemon-service-manager-ReGjcyjq.js} +1 -1
  35. package/dist/{daemon-service-manager-CXbN836B.js → daemon-service-manager-rNRRVrj1.js} +2 -2
  36. package/dist/{daemon-service-manager-CXbN836B.js.map → daemon-service-manager-rNRRVrj1.js.map} +1 -1
  37. package/dist/{daemon-service-runtime-DpiD8oap.js → daemon-service-runtime-BYWOcDb7.js} +5 -5
  38. package/dist/{daemon-service-runtime-DpiD8oap.js.map → daemon-service-runtime-BYWOcDb7.js.map} +1 -1
  39. package/dist/{daemon-service-update-coordinator-BuCEBJoe.js → daemon-service-update-coordinator-Cf4NtdK7.js} +16 -12
  40. package/dist/daemon-service-update-coordinator-Cf4NtdK7.js.map +1 -0
  41. package/dist/{dist-DkRliHib.js → dist-B6Z-8B4v.js} +44 -4
  42. package/dist/dist-B6Z-8B4v.js.map +1 -0
  43. package/dist/{dist-BdibASYs.js → dist-ChS52b_E.js} +2 -2
  44. package/dist/{dist-BdibASYs.js.map → dist-ChS52b_E.js.map} +1 -1
  45. package/dist/{dist-RR7jryeV.js → dist-uyFidGQU.js} +1 -1
  46. package/dist/{elapsed-time-CR9OIZSD.js → elapsed-time-BP84Tz_l.js} +5 -5
  47. package/dist/{elapsed-time-CR9OIZSD.js.map → elapsed-time-BP84Tz_l.js.map} +1 -1
  48. package/dist/{entry-CSoHtCQ9.js → entry-B4G_hqId.js} +7 -7
  49. package/dist/{entry-CSoHtCQ9.js.map → entry-B4G_hqId.js.map} +1 -1
  50. package/dist/{installation-inventory-CscX0nmD.js → installation-inventory-vyAkTNzT.js} +3 -3
  51. package/dist/{installation-inventory-CscX0nmD.js.map → installation-inventory-vyAkTNzT.js.map} +1 -1
  52. package/dist/{installer-CkF3gSdD.js → installer-Cw05xb5l.js} +2 -2
  53. package/dist/{installer-CkF3gSdD.js.map → installer-Cw05xb5l.js.map} +1 -1
  54. package/dist/native/openmeld-keychain.node +0 -0
  55. package/dist/{open-code-permission-Doem1R2N.js → open-code-permission-DHFJYc_o.js} +5 -1
  56. package/dist/open-code-permission-DHFJYc_o.js.map +1 -0
  57. package/dist/{openmeld-BcyBlby4.js → openmeld-CheYNGUc.js} +238 -43
  58. package/dist/openmeld-CheYNGUc.js.map +1 -0
  59. package/dist/openmeld-dev.js +0 -0
  60. package/dist/{openmeld-maintenance-worker-Brsfy22C.js → openmeld-maintenance-worker-BlGoUmXC.js} +10 -10
  61. package/dist/{openmeld-maintenance-worker-Brsfy22C.js.map → openmeld-maintenance-worker-BlGoUmXC.js.map} +1 -1
  62. package/dist/{openmeld-tools-update-join-CUh0JERe.js → openmeld-tools-update-join-BZp2dx06.js} +4 -4
  63. package/dist/{openmeld-tools-update-join-CUh0JERe.js.map → openmeld-tools-update-join-BZp2dx06.js.map} +1 -1
  64. package/dist/openmeld.js +4 -4
  65. package/dist/{prepare-provider-runtime-DxaGSe3R.js → prepare-provider-runtime-niE5QEAv.js} +100 -74
  66. package/dist/prepare-provider-runtime-niE5QEAv.js.map +1 -0
  67. package/dist/{prepare-session-executor-CyouBl49.js → prepare-session-executor-DhWSYpJX.js} +19 -19
  68. package/dist/{prepare-session-executor-CyouBl49.js.map → prepare-session-executor-DhWSYpJX.js.map} +1 -1
  69. package/dist/{process-channel-Cocpv3Br.js → process-channel-B2BU2X7x.js} +2 -2
  70. package/dist/{process-channel-Cocpv3Br.js.map → process-channel-B2BU2X7x.js.map} +1 -1
  71. package/dist/{runtime-DGT66AR-.js → runtime-COI2XGXX.js} +142 -21
  72. package/dist/runtime-COI2XGXX.js.map +1 -0
  73. package/dist/{runtime-agent-controller-reporting-submission-C1Vc_JWm.js → runtime-agent-controller-reporting-submission-BgkhnPU5.js} +8 -8
  74. package/dist/{runtime-agent-controller-reporting-submission-C1Vc_JWm.js.map → runtime-agent-controller-reporting-submission-BgkhnPU5.js.map} +1 -1
  75. package/dist/{runtime-reporting-health-state-CPWlQ5IX.js → runtime-reporting-health-state-HhsHeySN.js} +9 -36
  76. package/dist/runtime-reporting-health-state-HhsHeySN.js.map +1 -0
  77. package/dist/{runtime-transport-BLtOFrtv.js → runtime-transport-0F5E6So6.js} +73 -2
  78. package/dist/runtime-transport-0F5E6So6.js.map +1 -0
  79. package/dist/{service-ClETdJbz.js → service-CgAFfq0Y.js} +21 -21
  80. package/dist/service-CgAFfq0Y.js.map +1 -0
  81. package/dist/{service-account-authorization-kciEaW5t.js → service-account-authorization-DAPQy2yP.js} +2 -2
  82. package/dist/{service-account-authorization-kciEaW5t.js.map → service-account-authorization-DAPQy2yP.js.map} +1 -1
  83. package/dist/{service-account-control-3n_YwNsF.js → service-account-control-DiLG-w18.js} +10 -10
  84. package/dist/{service-account-control-3n_YwNsF.js.map → service-account-control-DiLG-w18.js.map} +1 -1
  85. package/dist/{service-control-capabilities-DoW5MW7A.js → service-control-capabilities-BP8sLHBA.js} +1 -1
  86. package/dist/{service-control-capabilities-C2tMMuFl.js → service-control-capabilities-DEiDpmzc.js} +4 -4
  87. package/dist/{service-control-capabilities-C2tMMuFl.js.map → service-control-capabilities-DEiDpmzc.js.map} +1 -1
  88. package/dist/{state-CMs4p0wo.js → state-Cwf0cTLu.js} +2 -2
  89. package/dist/{state-CMs4p0wo.js.map → state-Cwf0cTLu.js.map} +1 -1
  90. package/dist/{upgrade-2epQATRq.js → upgrade-CaPzHLuW.js} +14 -7
  91. package/dist/upgrade-CaPzHLuW.js.map +1 -0
  92. package/dist/upgrade-DYxQKdbJ.js +4 -0
  93. package/dist/{windows-user-task-CSJpDs-S.js → windows-user-task-D4uMvea3.js} +84 -3
  94. package/dist/windows-user-task-D4uMvea3.js.map +1 -0
  95. package/dist/{windows-user-task-CWDzkJCq.js → windows-user-task-hNE24Gqr.js} +1 -1
  96. package/package.json +41 -43
  97. package/dist/auth-session-D7oAIuHk.js +0 -4
  98. package/dist/auth-session-DOjVKRI_.js.map +0 -1
  99. package/dist/daemon-frame-transport-saNQVOyi.js.map +0 -1
  100. package/dist/daemon-service-update-coordinator-BuCEBJoe.js.map +0 -1
  101. package/dist/dist-DkRliHib.js.map +0 -1
  102. package/dist/open-code-permission-Doem1R2N.js.map +0 -1
  103. package/dist/openmeld-BcyBlby4.js.map +0 -1
  104. package/dist/prepare-provider-runtime-DxaGSe3R.js.map +0 -1
  105. package/dist/runtime-DGT66AR-.js.map +0 -1
  106. package/dist/runtime-reporting-health-state-CPWlQ5IX.js.map +0 -1
  107. package/dist/runtime-transport-BLtOFrtv.js.map +0 -1
  108. package/dist/service-ClETdJbz.js.map +0 -1
  109. package/dist/upgrade-2epQATRq.js.map +0 -1
  110. package/dist/upgrade-BVIot_cP.js +0 -4
  111. package/dist/windows-user-task-CSJpDs-S.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agents-ClqMS9aO.js","names":["normalizeOptionalText","exhaustiveCheck"],"sources":["../src/system/local-service-participation-gate.ts","../src/space/web-url.ts","../src/runtime/retry-delay.ts","../src/agents/agent-overview.ts","../src/ui/visible-window.ts","../src/ui/search-select.ts","../src/ui/transport-mode-display.ts","../src/commands/agents-text.ts","../src/commands/agents-cards.ts","../src/commands/agents-descriptions.ts","../src/commands/agents-summary-cards.ts","../src/commands/agents.ts"],"sourcesContent":["import type { LocalMachineIssue } from \"@openmeld/schemas\";\nimport {\n type DaemonServiceProgressReporter,\n runDaemonBackgroundStartForDecision,\n runDaemonInstall,\n runDaemonReinstall,\n} from \"../commands/service\";\nimport {\n buildDaemonBackgroundStartFailure,\n buildSystemServiceStartupFailureReportFromVerdict,\n type SystemServiceStartupFailureVerdict,\n} from \"../commands/service-start-failure\";\nimport { normalizeGatewayBaseUrlOrNull } from \"../config/base-url\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { toErrorMessage } from \"../local-service/core/logger\";\nimport { DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES } from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport type { DaemonServiceAnomalyCode } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type { LocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport { waitForOpenMeldToolsUpdateCompletion } from \"../local-service/maintenance/openmeld-tools-update-join\";\nimport type { Presenter } from \"../runtime/presenter/types\";\nimport {\n formatDaemonInstallFailedMessage,\n runDaemonInstallDecisionPrompt,\n} from \"../system/local-service-install-attention\";\nimport {\n buildDaemonStartDeferredCard,\n buildDaemonStartNeedsAttentionCard,\n runDaemonStartDecisionPrompt,\n} from \"../system/local-service-start-decision\";\nimport { renderInfoCard } from \"../ui/info-card\";\n\nexport type DaemonServiceParticipationIntent =\n | \"start\"\n | \"space_join\"\n | \"space_create_join\"\n | \"space_add_members\";\n\nimport {\n type DaemonServiceParticipationStatus,\n resolveDaemonServiceParticipationStatus,\n} from \"../local-service/status/service-participation-status\";\n\nexport type DaemonServiceParticipationGateResult = {\n errorMessage?: string;\n localMachineIssue?: LocalMachineIssue;\n status: \"aligned\" | \"declined\" | \"cancelled\" | \"needs_attention\";\n};\n\ntype DaemonServiceAccountAlignmentIssue = {\n reasonCode: string;\n summary: string;\n};\n\nexport function shouldRequireDaemonServiceParticipation(\n localDemand?: LocalServiceDemand | null\n): boolean {\n return localDemand?.decision === \"keep_running\";\n}\n\nexport async function runDaemonServiceParticipationGate(input: {\n intent: DaemonServiceParticipationIntent;\n presenter: Presenter;\n resolvedView: \"human\" | \"agent\";\n allowPrompt: boolean;\n openMeldProfileId?: string;\n autoRepair?: boolean;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n localDemand?: LocalServiceDemand | null;\n forcePrompt?: boolean;\n forceRefresh?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n}): Promise<DaemonServiceParticipationGateResult> {\n // A newer auth session alone is not a mismatch: re-logging into the same\n // account must not reinstall a healthy service. Account drift is detected\n // by the explicit alignment check below (owner/profile/gateway expectations\n // from the caller), never by comparing timestamps.\n const forceRefresh = input.forceRefresh === true;\n const gateInput = {\n ...input,\n forceRefresh,\n };\n\n if (!shouldRunDaemonServiceParticipationGate(gateInput)) {\n return { status: \"aligned\" };\n }\n\n const initialStatus = await resolveDaemonServiceParticipationStatus();\n if (isReadyAdvisoryServiceDrift(initialStatus)) {\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n scheduleBackgroundUpdate: hasServiceVersionAdvisory(initialStatus),\n });\n }\n }\n if (isRunningAdvisoryOnlyServiceDrift(initialStatus)) {\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(input);\n if (!accountIssue) {\n return { status: \"aligned\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n accountIssue,\n });\n }\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix,\n summary: accountIssue.summary,\n });\n input.presenter.line({\n code: `${codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n if (forceRefresh && initialStatus.kind === \"ready\") {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix: resolveDaemonServiceParticipationCodePrefix(input.intent),\n expectedVersion: initialStatus.expectedVersion,\n });\n }\n if (initialStatus.kind === \"ready\") {\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(input);\n if (!accountIssue) {\n return { status: \"aligned\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n accountIssue,\n });\n }\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix,\n summary: accountIssue.summary,\n });\n input.presenter.line({\n code: `${codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(input.intent);\n const installStageResult = await runDaemonServiceParticipationInstallStage({\n input,\n codePrefix,\n status: initialStatus,\n });\n if (installStageResult.result) {\n return installStageResult.result;\n }\n\n return await runDaemonServiceParticipationActionStage({\n input,\n codePrefix,\n status: installStageResult.status,\n });\n}\n\nfunction isRunningAdvisoryOnlyServiceDrift(\n status: DaemonServiceParticipationStatus\n): status is Extract<\n DaemonServiceParticipationStatus,\n { kind: \"needs_repair\" }\n> {\n return (\n status.kind === \"needs_repair\" &&\n status.runtimeStatus === \"running\" &&\n status.anomalyCodes.length > 0 &&\n status.anomalyCodes.every((code) =>\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(\n code as DaemonServiceAnomalyCode\n )\n )\n );\n}\n\nfunction isReadyAdvisoryServiceDrift(\n status: DaemonServiceParticipationStatus\n): status is Extract<DaemonServiceParticipationStatus, { kind: \"ready\" }> {\n return (\n status.kind === \"ready\" &&\n Array.isArray(status.advisoryAnomalyCodes) &&\n status.advisoryAnomalyCodes.length > 0\n );\n}\n\nfunction hasServiceVersionAdvisory(\n status: Extract<DaemonServiceParticipationStatus, { kind: \"ready\" }>\n): boolean {\n return Boolean(\n status.advisoryAnomalyCodes?.some(\n (code) => code === \"version_outdated\" || code === \"bundle_version_drift\"\n )\n );\n}\n\nfunction shouldRunDaemonServiceParticipationGate(input: {\n resolvedView: \"human\" | \"agent\";\n allowPrompt: boolean;\n autoRepair?: boolean;\n forceRefresh?: boolean;\n localDemand?: LocalServiceDemand | null;\n forcePrompt?: boolean;\n}): boolean {\n const canActWithoutPrompt =\n input.autoRepair === true &&\n (input.resolvedView === \"human\" ||\n (input.resolvedView === \"agent\" &&\n (input.forcePrompt === true || input.forceRefresh === true)));\n const canPrompt =\n input.resolvedView === \"human\" &&\n (input.allowPrompt || input.autoRepair === true);\n return (\n (canPrompt || canActWithoutPrompt) &&\n (input.forcePrompt === true ||\n input.forceRefresh === true ||\n shouldRequireDaemonServiceParticipation(input.localDemand))\n );\n}\n\nasync function runDaemonServiceParticipationInstallStage(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n intent: DaemonServiceParticipationIntent;\n autoRepair?: boolean;\n presenter: Presenter;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<{\n status: DaemonServiceParticipationStatus;\n result?: DaemonServiceParticipationGateResult;\n}> {\n if (input.status.kind !== \"missing\" && input.status.kind !== \"outdated\") {\n return {\n status: input.status,\n };\n }\n const installableStatus = input.status;\n\n if (input.input.autoRepair === true) {\n try {\n await runDaemonServiceParticipationInstallAction({\n input: input.input,\n status: installableStatus,\n });\n } catch {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary: formatDaemonInstallFailedMessage(installableStatus.kind),\n });\n return {\n status: installableStatus,\n result: { status: \"needs_attention\" },\n };\n }\n\n return await resolveDaemonServiceParticipationStatusAfterInstall(input);\n }\n\n const installResult = await runDaemonInstallDecisionPrompt({\n kind: installableStatus.kind,\n ...(installableStatus.kind === \"outdated\"\n ? {\n installedVersion: installableStatus.installedVersion,\n }\n : {}),\n expectedVersion: installableStatus.expectedVersion,\n emitLine: (text) => {\n input.input.presenter.line({\n code: `${input.codePrefix}.install`,\n text,\n });\n },\n installService: async () => {\n await runDaemonServiceParticipationInstallAction({\n input: input.input,\n status: installableStatus,\n });\n },\n });\n\n if (installResult === \"cancelled\") {\n return {\n status: installableStatus,\n result: { status: \"cancelled\" },\n };\n }\n if (installResult === \"failed\") {\n return {\n status: installableStatus,\n result: { status: \"needs_attention\" },\n };\n }\n if (\n installResult === \"not_now\" ||\n !shouldStartAfterDaemonInstall(input.input.intent)\n ) {\n return {\n status: installableStatus,\n result: { status: \"declined\" },\n };\n }\n\n return await resolveDaemonServiceParticipationStatusAfterInstall(input);\n}\n\nasync function runDaemonServiceParticipationInstallAction(input: {\n input: {\n openMeldProfileId?: string;\n gatewayUrl?: string;\n intent: DaemonServiceParticipationIntent;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n view?: string;\n };\n status: Extract<\n DaemonServiceParticipationStatus,\n { kind: \"missing\" | \"outdated\" }\n >;\n}): Promise<void> {\n if (input.status.kind === \"outdated\") {\n input.input.serviceProgress?.detail({\n code: \"daemon.participation.refresh.updating\",\n text: \"Updating OpenMeld Service...\",\n });\n await runDaemonServiceSafeRefresh({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n suppressHumanResultCard: input.input.suppressRefreshHumanResultCard,\n view: input.input.view,\n });\n return;\n }\n\n await runDaemonInstall(\n {\n ...(input.input.gatewayUrl ? { gatewayUrl: input.input.gatewayUrl } : {}),\n ...(input.input.openMeldProfileId\n ? { profile: input.input.openMeldProfileId }\n : {}),\n view: input.input.view,\n },\n {\n suppressHumanOutput: shouldSuppressHumanInstallOutput(input.input.intent),\n ...(input.input.serviceProgress\n ? { serviceProgress: input.input.serviceProgress }\n : {}),\n }\n );\n}\n\nasync function resolveDaemonServiceParticipationStatusAfterInstall(input: {\n input: {\n presenter: Presenter;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<{\n status: DaemonServiceParticipationStatus;\n result?: DaemonServiceParticipationGateResult;\n}> {\n const refreshedStatus = await resolveDaemonServiceParticipationStatus();\n if (refreshedStatus.kind === \"ready\") {\n return {\n status: refreshedStatus,\n result: { status: \"aligned\" },\n };\n }\n if (\n refreshedStatus.kind === \"missing\" ||\n refreshedStatus.kind === \"outdated\"\n ) {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary:\n refreshedStatus.kind === \"missing\"\n ? formatDaemonInstallFailedMessage(\"missing\")\n : formatDaemonInstallFailedMessage(\"outdated\"),\n });\n return {\n status: refreshedStatus,\n result: { status: \"needs_attention\" },\n };\n }\n\n return {\n status: refreshedStatus,\n };\n}\n\nasync function runDaemonServiceSafeRefresh(input: {\n openMeldProfileId?: string;\n gatewayUrl?: string;\n suppressHumanResultCard?: boolean;\n view?: string;\n forceReinstall?: boolean;\n scheduleBackgroundUpdate?: boolean;\n}): Promise<Awaited<ReturnType<typeof runDaemonReinstall>>> {\n return await runDaemonReinstall(\n {\n agentOverviewHandled: true,\n ...(input.scheduleBackgroundUpdate\n ? { displayAction: \"update\" as const }\n : {}),\n ...(input.gatewayUrl ? { gatewayUrl: input.gatewayUrl } : {}),\n ...(input.openMeldProfileId ? { profile: input.openMeldProfileId } : {}),\n view: input.view,\n },\n {\n skipConfirm: true,\n startAfterInstallMode: \"always\",\n suppressAgentOverview: true,\n ...(input.suppressHumanResultCard !== undefined\n ? { suppressHumanResultCard: input.suppressHumanResultCard }\n : {}),\n suppressInstallOutput: true,\n ...(input.forceReinstall === true ? { forceReinstall: true } : {}),\n }\n );\n}\n\nasync function runDaemonBackgroundStartForParticipation(input: {\n openMeldProfileId?: string | undefined;\n gatewayUrl?: string | undefined;\n serviceProgress?: DaemonServiceProgressReporter | undefined;\n suppressStartSpinner?: boolean | undefined;\n view?: string | undefined;\n}): Promise<Awaited<ReturnType<typeof runDaemonBackgroundStartForDecision>>> {\n return await runDaemonBackgroundStartForDecision({\n gatewayUrl: input.gatewayUrl,\n ...(input.openMeldProfileId ? { profile: input.openMeldProfileId } : {}),\n ...(input.serviceProgress\n ? { serviceProgress: input.serviceProgress }\n : {}),\n ...(input.suppressStartSpinner === true\n ? { suppressStartSpinner: true }\n : {}),\n view: input.view,\n });\n}\n\nasync function runDaemonServiceParticipationActionStage(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n autoRepair?: boolean;\n presenter: Presenter;\n gatewayUrl?: string;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n forceRefresh?: boolean;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<DaemonServiceParticipationGateResult> {\n if (input.status.kind === \"needs_repair\") {\n return await runDaemonServiceParticipationRefresh({\n input: input.input,\n codePrefix: input.codePrefix,\n expectedVersion: input.status.expectedVersion,\n });\n }\n if (input.status.kind !== \"not_running\") {\n return { status: \"aligned\" };\n }\n\n if (input.input.autoRepair === true) {\n const startResult = await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n });\n return await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.status.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n }\n\n const startResult = await runDaemonStartDecisionPrompt({\n startService: async () =>\n await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n }),\n });\n\n return await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.status.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n}\n\nasync function runDaemonServiceParticipationRefresh(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n presenter: Presenter;\n forceRefresh?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n };\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n codePrefix: string;\n expectedVersion: string;\n scheduleBackgroundUpdate?: boolean;\n}): Promise<DaemonServiceParticipationGateResult> {\n emitServiceAccountRefreshNotice(input);\n try {\n input.input.serviceProgress?.detail({\n code: \"daemon.participation.refresh.updating\",\n text: \"Updating OpenMeld Service...\",\n });\n const refreshOutcome = await runDaemonServiceSafeRefresh({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n suppressHumanResultCard: input.input.suppressRefreshHumanResultCard,\n view: input.input.view,\n forceReinstall: shouldForceDaemonServiceReinstall({\n accountIssue: input.accountIssue,\n forceRefresh: input.input.forceRefresh,\n }),\n ...(input.scheduleBackgroundUpdate === undefined\n ? {}\n : { scheduleBackgroundUpdate: input.scheduleBackgroundUpdate }),\n });\n if (isCancelledDaemonServiceRefresh(refreshOutcome)) {\n return { status: \"cancelled\" };\n }\n if (isStoppedDaemonServiceRefresh(refreshOutcome)) {\n const startResult = await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n });\n const startMapped = await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n if (startMapped.status !== \"aligned\") {\n return startMapped;\n }\n const accountIssueAfterStart =\n await resolveDaemonServiceAccountAlignmentIssue(input.input);\n if (accountIssueAfterStart) {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary: accountIssueAfterStart.summary,\n });\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_failed`,\n text: accountIssueAfterStart.summary,\n data: { reasonCode: accountIssueAfterStart.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n return startMapped;\n }\n const scheduled = await completeScheduledServiceRefresh({\n outcome: refreshOutcome,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n // The reinstall started the service in silent output mode, so its detailed\n // startup-failure card was discarded. If the failure carried a launchd\n // job-state verdict (never-spawned / crash-loop), surface that detailed card\n // here instead of the generic \"was repaired, but not running yet\" summary.\n // Presentation-only: the verdict never re-enters the alignment decision.\n if (\n !refreshOutcome.ok &&\n (refreshOutcome.result === \"start_failed\" ||\n refreshOutcome.result === \"start_blocked\") &&\n (refreshOutcome.startFailureVerdict?.jobDiagnostics ||\n refreshOutcome.startFailureVerdict?.localMachineIssue)\n ) {\n return renderRefreshStartFailure({\n codePrefix: input.codePrefix,\n presenter: input.input.presenter,\n verdict: refreshOutcome.startFailureVerdict,\n });\n }\n if (\n !(\n scheduled ||\n (refreshOutcome.ok &&\n (refreshOutcome.result === \"already_healthy\" ||\n refreshOutcome.result === \"completed\") &&\n refreshOutcome.serviceState === \"running\")\n )\n ) {\n throw new Error(\n `OpenMeld Service refresh did not complete: ${refreshOutcome.result}`\n );\n }\n } catch (error) {\n const summary =\n \"OpenMeld Service was repaired, but it is not running yet. \" +\n \"Local Wake work will keep waiting until OpenMeld Service starts. \" +\n \"Run `openmeld service start`.\";\n renderRefreshFailureIfVisible({\n codePrefix: input.codePrefix,\n presenter: input.input.presenter,\n summary,\n suppressed: input.input.suppressRefreshHumanResultCard === true,\n });\n return {\n errorMessage: toErrorMessage(error),\n status: \"needs_attention\",\n };\n }\n\n const refreshedStatus = await resolveDaemonServiceParticipationStatus({\n expectedVersion: input.expectedVersion,\n });\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(\n input.input\n );\n if (refreshedStatus.kind === \"ready\" && !accountIssue) {\n return { status: \"aligned\" };\n }\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary:\n accountIssue?.summary ??\n summarizeDaemonServiceParticipationStatus(refreshedStatus),\n });\n if (accountIssue) {\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n }\n return { status: \"needs_attention\" };\n}\n\nfunction emitServiceAccountRefreshNotice(input: {\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n codePrefix: string;\n input: { presenter: Presenter };\n}): void {\n if (!input.accountIssue) {\n return;\n }\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_refresh`,\n text: input.accountIssue.summary,\n data: { reasonCode: input.accountIssue.reasonCode },\n });\n}\n\nasync function completeScheduledServiceRefresh(input: {\n outcome: Awaited<ReturnType<typeof runDaemonReinstall>>;\n presenter: Presenter;\n codePrefix: string;\n}): Promise<boolean> {\n if (!(input.outcome.ok && input.outcome.result === \"scheduled\")) {\n return false;\n }\n await waitForOpenMeldToolsUpdateCompletion({\n operationId: input.outcome.jobId,\n onWaiting: (operation) => {\n input.presenter.line({\n code: `${input.codePrefix}.update.waiting`,\n text: \"OpenMeld is finishing its background update. This command will continue automatically when it finishes.\",\n data: {\n operationId: operation.operationId,\n phase: operation.phase,\n targetVersion: operation.targetVersion,\n },\n });\n },\n });\n return true;\n}\n\nfunction renderRefreshFailureIfVisible(input: {\n codePrefix: string;\n presenter: Presenter;\n summary: string;\n suppressed: boolean;\n}): void {\n if (input.suppressed) {\n return;\n }\n renderDaemonStartNeedsAttention({\n autoRepairAttempted: true,\n codePrefix: input.codePrefix,\n presenter: input.presenter,\n summary: input.summary,\n });\n}\n\nfunction shouldForceDaemonServiceReinstall(input: {\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n forceRefresh?: boolean;\n}): boolean {\n return input.accountIssue !== undefined || input.forceRefresh === true;\n}\n\nfunction renderRefreshStartFailure(input: {\n codePrefix: string;\n presenter: Presenter;\n verdict: SystemServiceStartupFailureVerdict;\n}): DaemonServiceParticipationGateResult {\n const report = buildSystemServiceStartupFailureReportFromVerdict(\n input.verdict,\n { autoRepairAttempted: true }\n );\n renderInfoCard({\n presenter: input.presenter,\n title: report.title,\n codePrefix: `${input.codePrefix}.failed`,\n rows: report.rows,\n });\n const { outcome: _outcome, ...failure } = buildDaemonBackgroundStartFailure(\n input.verdict\n );\n return {\n ...failure,\n status: \"needs_attention\",\n };\n}\n\nasync function resolveDaemonServiceAccountAlignmentIssue(input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n}): Promise<DaemonServiceAccountAlignmentIssue | null> {\n const expectedProfileId = normalizeOptionalText(input.openMeldProfileId);\n const expectedOwnerUserId = normalizeOptionalText(input.expectedOwnerUserId);\n const expectedGatewayUrl = normalizeGatewayBaseUrlOrNull(input.gatewayUrl);\n if (!(expectedProfileId || expectedOwnerUserId || expectedGatewayUrl)) {\n return null;\n }\n\n const contract = await readDaemonServiceContract().catch(() => null);\n if (!contract) {\n return {\n reasonCode: \"service_contract.missing\",\n summary:\n \"OpenMeld Service is running, but this setup could not verify the service account contract for this computer.\",\n };\n }\n\n const contractOwnerUserId = normalizeOptionalText(contract.ownerUserId);\n if (\n expectedOwnerUserId &&\n contractOwnerUserId &&\n contractOwnerUserId !== expectedOwnerUserId\n ) {\n return {\n reasonCode: \"service_contract.owner_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n if (\n expectedProfileId &&\n contract.profileId &&\n contract.profileId !== expectedProfileId\n ) {\n return {\n reasonCode: \"service_contract.profile_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n if (\n expectedOwnerUserId &&\n expectedProfileId &&\n !(contractOwnerUserId || contract.profileId)\n ) {\n return {\n reasonCode: \"service_contract.owner_unverified\",\n summary:\n \"OpenMeld Service is running, but this setup could not verify that OpenMeld Service belongs to the current Web account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n const contractGatewayUrl = normalizeGatewayBaseUrlOrNull(contract.gatewayUrl);\n if (\n expectedGatewayUrl &&\n contractGatewayUrl &&\n contractGatewayUrl !== expectedGatewayUrl\n ) {\n return {\n reasonCode: \"service_contract.gateway_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld gateway. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n return null;\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveDaemonServiceParticipationCodePrefix(\n intent: DaemonServiceParticipationIntent\n): string {\n switch (intent) {\n case \"start\":\n return \"start.service\";\n case \"space_create_join\":\n return \"space.create_join.service\";\n case \"space_join\":\n return \"space.join.service\";\n case \"space_add_members\":\n return \"space.add_members.service\";\n default:\n throw new Error(`Unknown local service participation intent: ${intent}`);\n }\n}\n\nfunction isCancelledDaemonServiceRefresh(\n outcome: Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>\n): boolean {\n return !outcome.ok && outcome.result === \"cancelled\";\n}\n\nfunction isStoppedDaemonServiceRefresh(\n outcome: Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>\n): outcome is Extract<\n Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>,\n { ok: true; serviceState: \"stopped\" }\n> {\n return (\n outcome.ok &&\n (outcome.result === \"already_healthy\" ||\n outcome.result === \"completed\" ||\n outcome.result === \"stopped_safe\") &&\n outcome.serviceState === \"stopped\"\n );\n}\n\nfunction shouldStartAfterDaemonInstall(\n _intent: DaemonServiceParticipationIntent\n): boolean {\n return true;\n}\n\nfunction shouldSuppressHumanInstallOutput(\n intent: DaemonServiceParticipationIntent\n): boolean {\n return intent !== \"start\";\n}\n\nasync function mapDaemonBackgroundStartResult(\n result: Awaited<ReturnType<typeof runDaemonStartDecisionPrompt>>,\n input: {\n expectedVersion: string;\n presenter: Presenter;\n codePrefix: string;\n }\n): Promise<DaemonServiceParticipationGateResult> {\n if (typeof result === \"object\") {\n return {\n status: \"needs_attention\",\n errorMessage: result.errorMessage,\n ...(result.localMachineIssue\n ? { localMachineIssue: result.localMachineIssue }\n : {}),\n };\n }\n if (result === \"started\") {\n const refreshedStatus = await resolveDaemonServiceParticipationStatus({\n expectedVersion: input.expectedVersion,\n });\n if (refreshedStatus.kind === \"ready\") {\n return { status: \"aligned\" };\n }\n\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n summary: summarizeDaemonServiceParticipationStatus(refreshedStatus),\n });\n return { status: \"needs_attention\" };\n }\n if (result === \"deferred_with_card\") {\n return { status: \"declined\" };\n }\n if (result === \"cancelled\") {\n return { status: \"cancelled\" };\n }\n if (result === \"not_now\") {\n renderDaemonStartDeferred({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n });\n return { status: \"declined\" };\n }\n if (result === \"failed\") {\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n summary: \"OpenMeld could not finish starting OpenMeld Service.\",\n });\n return { status: \"needs_attention\" };\n }\n return { status: \"needs_attention\" };\n}\n\nfunction summarizeDaemonServiceParticipationStatus(\n status: DaemonServiceParticipationStatus\n): string {\n switch (status.kind) {\n case \"missing\":\n return formatDaemonInstallFailedMessage(\"missing\");\n case \"outdated\":\n return formatDaemonInstallFailedMessage(\"outdated\");\n case \"needs_repair\":\n return status.detail;\n case \"not_running\":\n return \"OpenMeld could not finish starting OpenMeld Service.\";\n case \"ready\":\n return \"OpenMeld Service is running.\";\n default:\n return \"OpenMeld Service still needs attention on this device.\";\n }\n}\n\nfunction renderDaemonStartDeferred(input: {\n presenter: Presenter;\n codePrefix: string;\n}): void {\n const card = buildDaemonStartDeferredCard();\n renderInfoCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: `${input.codePrefix}.deferred`,\n rows: card.rows,\n });\n}\n\nfunction renderDaemonStartNeedsAttention(input: {\n presenter: Presenter;\n codePrefix: string;\n summary: string;\n nextStep?: string;\n detail?: string;\n autoRepairAttempted?: boolean;\n}): void {\n const card = buildDaemonStartNeedsAttentionCard({\n summary: input.summary,\n ...(input.nextStep ? { nextStep: input.nextStep } : {}),\n ...(input.detail ? { detail: input.detail } : {}),\n ...(input.autoRepairAttempted\n ? { autoRepairAttempted: input.autoRepairAttempted }\n : {}),\n });\n renderInfoCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: `${input.codePrefix}.failed`,\n rows: card.rows,\n });\n}\n","import { isLoopbackHostname } from \"../config/loopback-hostname\";\n\nexport function buildSpaceWebUrl(\n baseUrl: string,\n organizationSlug: string,\n spaceId: string,\n options?: {\n profileId?: string;\n }\n): string {\n const url = new URL(resolveGatewayWebOrigin(baseUrl));\n const orgSlug = requireOrganizationSlug(organizationSlug);\n url.pathname = `/o/${encodeURIComponent(orgSlug)}/spaces/${encodeURIComponent(spaceId)}`;\n url.search = \"\";\n const profileId = normalizeOptionalText(options?.profileId);\n if (profileId) {\n url.searchParams.set(\"profileId\", profileId);\n }\n url.hash = \"\";\n return url.toString();\n}\n\nexport function resolveGatewayWebOrigin(baseUrl: string): string {\n const url = new URL(baseUrl);\n if (isLoopbackHostname(url.hostname) && url.port === LOCAL_GATEWAY_PORT) {\n url.port = LOCAL_WEB_PORT;\n }\n const pair = OPENMELD_ORIGIN_HOST_PAIRS.find(\n ({ gateway }) => gateway === url.hostname\n );\n if (pair) {\n url.hostname = pair.web;\n url.port = \"\";\n url.protocol = \"https:\";\n }\n url.pathname = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.origin;\n}\n\nexport function resolveSpaceWebGatewayOrigin(spaceUrl: URL): string {\n const url = new URL(spaceUrl.toString());\n const pair = OPENMELD_ORIGIN_HOST_PAIRS.find(\n ({ web }) => web === url.hostname\n );\n if (pair) {\n if (url.protocol !== \"https:\" || url.port.length > 0) {\n throw new Error(TRUSTED_SPACE_WEB_ORIGIN_ERROR);\n }\n url.hostname = pair.gateway;\n } else if (\n isLoopbackHostname(url.hostname) &&\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.port === LOCAL_WEB_PORT\n ) {\n url.port = LOCAL_GATEWAY_PORT;\n } else {\n throw new Error(TRUSTED_SPACE_WEB_ORIGIN_ERROR);\n }\n url.pathname = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.origin;\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction requireOrganizationSlug(value: unknown): string {\n const normalized = normalizeOptionalText(value);\n if (!normalized) {\n throw new Error(\n \"Active organization slug is required to build a Space URL.\"\n );\n }\n return normalized;\n}\nconst OPENMELD_ORIGIN_HOST_PAIRS = [\n { gateway: \"gateway.openmeld.ai\", web: \"openmeld.ai\" },\n {\n gateway: \"gateway.staging.openmeld.ai\",\n web: \"staging.openmeld.ai\",\n },\n { gateway: \"gateway.openmeld.invalid\", web: \"openmeld.invalid\" },\n] as const;\n\nconst LOCAL_GATEWAY_PORT = \"8080\";\nconst LOCAL_WEB_PORT = \"3000\";\nconst TRUSTED_SPACE_WEB_ORIGIN_ERROR =\n \"Space URL must use a trusted OpenMeld Web origin. For a custom local environment, pass --gateway-url explicitly.\";\n","// Fast-start schedule for readiness-polling retry loops: 250/500/1000ms, then\n// capped at 2000ms for every attempt beyond it.\nconst RETRY_DELAY_SCHEDULE_MS: readonly number[] = [250, 500, 1000, 2000];\nconst RETRY_DELAY_CAP_MS = 2000;\n\n// `attempt` is the 1-indexed retry number (the delay taken after that attempt fails).\nexport function computeRetryDelayMs(attempt: number): number {\n const index = Math.max(\n 0,\n Math.min(attempt - 1, RETRY_DELAY_SCHEDULE_MS.length - 1)\n );\n return RETRY_DELAY_SCHEDULE_MS[index] ?? RETRY_DELAY_CAP_MS;\n}\n","import { formatAgentOverviewPayload } from \"../runtime/agent-overview-payload\";\nimport type { Presenter } from \"../runtime/presenter\";\nimport {\n type BuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionExamples,\n getBuiltinAgentSelectionOptionalArguments,\n getBuiltinAgentSelectionRequiredArguments,\n} from \"./builtin-selection-contract\";\n\nexport type AgentsAgentOverviewCommand =\n | \"menu\"\n | \"manage\"\n | \"detect\"\n | \"list\"\n | \"show\"\n | \"enable\"\n | \"repair\"\n | \"disable\"\n | \"config\"\n | \"custom_list\"\n | \"custom_add\"\n | \"custom_update\"\n | \"custom_remove\";\n\ntype AgentsAgentOverviewInput = {\n presenter: Presenter;\n command: AgentsAgentOverviewCommand;\n};\n\ntype AgentsAgentOverviewPayload = {\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 emitAgentsAgentOverview(input: AgentsAgentOverviewInput): void {\n input.presenter.data({\n code: `agents.${input.command}.agent_overview`,\n payload: formatAgentOverviewPayload(\n buildAgentsAgentOverviewPayload(input.command)\n ),\n });\n}\n\nfunction buildBuiltinAgentSelectionOverviewPayload(\n command: BuiltinAgentSelectionCommand\n): Pick<\n AgentsAgentOverviewPayload,\n \"commands\" | \"optionalArguments\" | \"requiredArguments\"\n> {\n return {\n commands: buildBuiltinAgentSelectionExamples({\n command,\n includeViewFlag: true,\n }),\n optionalArguments: getBuiltinAgentSelectionOptionalArguments(command),\n requiredArguments: getBuiltinAgentSelectionRequiredArguments(command),\n };\n}\n\nfunction buildAgentsAgentOverviewPayload(\n command: AgentsAgentOverviewCommand\n): AgentsAgentOverviewPayload {\n switch (command) {\n case \"menu\": {\n return {\n summary:\n \"Manage local OpenMeld-connected agents, agent visibility in Space, and custom agent targets.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld agents --view agent\",\n \"openmeld agents detect --view agent\",\n \"openmeld agents list --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"enable\",\n includeViewFlag: true,\n }),\n \"openmeld agents manage --view agent\",\n ],\n stages: [\n \"Inspect available agents and current registrations.\",\n \"Choose an explicit subcommand for detect, list, enable, disable, show, config, or custom targets.\",\n ],\n notes: [\n \"Agent view does not open the human interactive agents menu.\",\n \"Use explicit subcommands to keep automation deterministic.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"manage\": {\n return {\n summary:\n \"Review connected agent IDs and decide whether to inspect, enable, or disable them with explicit commands.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld agents list --view agent\",\n \"openmeld agents show <agent-id> --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"repair\",\n includeViewFlag: true,\n }),\n \"openmeld agents config <agent-id> --enabled true|false --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"disable\",\n includeViewFlag: true,\n }),\n ],\n stages: [\n \"List connected agent IDs.\",\n \"Inspect one agent or change enabled state with explicit subcommands.\",\n ],\n notes: [\"The manage menu is interactive in human view only.\"],\n humanActionRequired: true,\n };\n }\n case \"detect\": {\n return {\n summary:\n \"Detect supported local AI tools on this computer and report which ones are available to OpenMeld now.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents detect --view agent\"],\n stages: [\n \"Scan supported builtin agent targets.\",\n \"Return detected agents and whether each one is immediately selectable.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"list\": {\n return {\n summary:\n \"List currently registered OpenMeld agent IDs that can wake and reply in Space.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents list --view agent\"],\n stages: [\n \"Load agent registrations from your local OpenMeld config.\",\n \"Return registered agents and enabled state.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"repair\": {\n return {\n summary:\n \"Repair one or more builtin local agents so OpenMeld can start them again on this computer.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"repair\"),\n stages: [\n \"Resolve a fresh launch contract for each requested builtin agent.\",\n \"Persist the repaired machine launch contract into OpenMeld runtime state.\",\n ],\n notes: [\n \"Repair does not enable or disable agents. It refreshes how OpenMeld starts them on this computer.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"show\": {\n return {\n summary:\n \"Show one registered agent ID, its current OpenMeld config, and how OpenMeld will wake it.\",\n requiredArguments: [\"<agent-id>\"],\n optionalArguments: [],\n commands: [\"openmeld agents show <agent-id> --view agent\"],\n stages: [\n \"Resolve the requested agent ID.\",\n \"Return the current registration and effective runtime config.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"enable\": {\n return {\n summary:\n \"Enable one or more detected agents so new Space @mentions can wake them.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"enable\"),\n stages: [\n \"Resolve selectable detected agents.\",\n \"Register or re-enable them in your local OpenMeld config.\",\n \"Return per-agent enable summary.\",\n ],\n notes: [\n \"Use `openmeld agents detect --view agent` first if you need to discover selectable ids.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"disable\": {\n return {\n summary:\n \"Disable one or more registered agents so new Space @mentions stop waking them.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"disable\"),\n stages: [\n \"Resolve requested registered agent ids.\",\n \"Update enabled=false in your local OpenMeld config.\",\n \"Return per-agent disable summary.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"config\": {\n return {\n summary:\n \"Update a registered agent's OpenMeld configuration with explicit flags.\",\n requiredArguments: [\"<agent-id>\", \"--enabled true|false\"],\n optionalArguments: [],\n commands: [\n \"openmeld agents config <agent-id> --enabled true --view agent\",\n \"openmeld agents config <agent-id> --enabled false --view agent\",\n ],\n stages: [\n \"Resolve the requested registered agent id.\",\n \"Apply explicit config updates.\",\n \"Return the updated effective config.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_list\": {\n return {\n summary:\n \"List custom agent targets stored in your local OpenMeld config and whether they are currently registered.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents custom list --view agent\"],\n stages: [\n \"Load configured custom targets.\",\n \"Project whether each target is registered and enabled.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_add\": {\n return {\n summary:\n \"Add a custom agent target to your local OpenMeld config with an absolute directory path.\",\n requiredArguments: [\"--name <name>\", \"--dir <absolute-path>\"],\n optionalArguments: [\"--id <id>\"],\n commands: [\n \"openmeld agents custom add --name <name> --dir <absolute-path> --view agent\",\n \"openmeld agents custom add --id <id> --name <name> --dir <absolute-path> --view agent\",\n ],\n stages: [\n \"Validate explicit custom target input.\",\n \"Save the target in your local OpenMeld config.\",\n \"Return the created custom target.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_update\": {\n return {\n summary: \"Update a custom agent target while keeping its ID stable.\",\n requiredArguments: [\n \"--id <id>\",\n \"one update: --name <name> | --dir <absolute-path>\",\n ],\n optionalArguments: [],\n commands: [\n \"openmeld agents custom update --id <id> --name <name> --view agent\",\n \"openmeld agents custom update --id <id> --dir <absolute-path> --view agent\",\n ],\n stages: [\n \"Resolve the custom target id.\",\n \"Apply explicit updates.\",\n \"Return the updated target and changed fields.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_remove\": {\n return {\n summary:\n \"Remove a custom agent target that is not currently registered.\",\n requiredArguments: [\"--id <id>\"],\n optionalArguments: [],\n commands: [\"openmeld agents custom remove --id <id> --view agent\"],\n stages: [\n \"Resolve the custom target id.\",\n \"Verify it is not currently registered.\",\n \"Remove it from your local OpenMeld config and report the result.\",\n ],\n notes: [\n \"Install records are kept after removal; clean them up with OpenMeld skills commands when needed.\",\n ],\n humanActionRequired: false,\n };\n }\n default: {\n return assertNever(command);\n }\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(\n `unsupported agents agent overview command: ${String(value)}`\n );\n}\n","export function clampNumber(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n if (value < min) {\n return min;\n }\n if (value > max) {\n return max;\n }\n return value;\n}\n\nexport function resolveAnchoredVisibleWindow(input: {\n anchorIndex: number | null;\n itemCount: number;\n maxVisible: number;\n}): { end: number; start: number } {\n if (input.itemCount <= input.maxVisible) {\n return {\n start: 0,\n end: input.itemCount,\n };\n }\n\n const anchor =\n input.anchorIndex === null\n ? 0\n : clampNumber(input.anchorIndex, 0, input.itemCount - 1);\n const centeredStart = anchor - Math.floor(input.maxVisible / 2);\n const maxStart = input.itemCount - input.maxVisible;\n const start = clampNumber(centeredStart, 0, maxStart);\n return {\n start,\n end: Math.min(input.itemCount, start + input.maxVisible),\n };\n}\n\nexport function resolveOffsetVisibleWindow(input: {\n itemCount: number;\n maxVisible: number;\n offset: number;\n}): { end: number; start: number } {\n if (input.itemCount <= input.maxVisible) {\n return {\n start: 0,\n end: input.itemCount,\n };\n }\n\n const maxStart = Math.max(0, input.itemCount - input.maxVisible);\n const start = resolveVisibleWindowOffset(input.offset, maxStart);\n return {\n start,\n end: Math.min(input.itemCount, start + input.maxVisible),\n };\n}\n\nfunction resolveVisibleWindowOffset(offset: number, maxStart: number): number {\n if (!Number.isFinite(offset)) {\n return offset > 0 ? maxStart : 0;\n }\n\n return clampNumber(offset, 0, maxStart);\n}\n","import type { Key } from \"node:readline\";\nimport pc from \"picocolors\";\nimport { buildTextInfoCardLines, type InfoCardRow } from \"./info-card\";\nimport {\n type InteractivePromptKeypressResult,\n type InteractivePromptStatus,\n type InteractivePromptStreams,\n isReturnKeypress,\n measureRenderedTerminalLinesHeight,\n runInteractivePrompt,\n} from \"./interactive-prompt\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\nimport { clampNumber, resolveAnchoredVisibleWindow } from \"./visible-window\";\n\nconst PROMPT_SYMBOL_ACTIVE = pc.green(\"◇\");\nconst PROMPT_SYMBOL_CANCELLED = pc.red(\"■\");\nconst CURSOR_SYMBOL = pc.cyan(\"❯\");\nconst BAR_SYMBOL = pc.dim(\"│\");\nconst SINGLE_SELECTED_SYMBOL = pc.green(\"●\");\nconst SINGLE_UNSELECTED_SYMBOL = pc.dim(\"○\");\nconst MULTI_SELECTED_SYMBOL = pc.green(\"■\");\nconst MULTI_UNSELECTED_SYMBOL = pc.dim(\"□\");\nconst EMPTY_MATCH_LABEL = \"No matches found\";\nconst DEFAULT_MAX_VISIBLE = 8;\nconst PRINTABLE_SEARCH_INPUT_REGEX = /^[\\x20-\\x7E]+$/;\n\ntype SearchPromptMode = \"single\" | \"multiple\";\ntype SearchPromptStatus = InteractivePromptStatus;\n\ntype SearchPromptRow =\n | {\n kind: \"item\";\n filteredIndex: number;\n itemIndex: number;\n }\n | {\n kind: \"action\";\n actionIndex: number;\n }\n | {\n kind: \"back\";\n };\n\ntype SearchPromptItemWithSearchKey<T> = SearchSelectItem<T> & {\n readonly searchKey: string;\n};\n\ntype SearchPromptSummaryCard = {\n title: string;\n rows: InfoCardRow[];\n compact?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n};\n\ntype SearchPromptBaseInput<T> = {\n message: string;\n items: SearchSelectItem<T>[];\n noticeLines?: string[];\n maxVisible?: number;\n allowBack?: boolean;\n backLabel?: string;\n emptyLabel?: string;\n readOnly?: boolean;\n summaryCard?: SearchPromptSummaryCard;\n footerActions?: SearchPromptFooterAction[];\n footerActionsResolver?: SearchPromptFooterActionResolver<T>;\n workbench?: boolean;\n};\n\ntype CreateSearchPromptStateInput<T> = SearchPromptBaseInput<T> & {\n mode: SearchPromptMode;\n initialSelectedValues?: T[];\n required?: boolean;\n};\n\nexport type SearchSelectItem<T> = {\n value: T;\n label: string;\n detail?: string;\n hint?: string;\n searchText?: string;\n disabled?: boolean;\n};\n\nexport type SearchPromptFooterAction = {\n value: string;\n label: string;\n icon?: string;\n accent?: boolean;\n hint?: string;\n disabled?: boolean;\n separatorBefore?: boolean;\n};\n\nexport type SearchPromptFooterActionResolver<T> = (input: {\n selectedValues: T[];\n}) => SearchPromptFooterAction[];\n\nexport type SearchSelectResult<T> =\n | { status: \"submitted\"; value: T }\n | { status: \"back\" }\n | { status: \"cancelled\" };\n\nexport type SearchMultiselectResult<T> =\n | { status: \"submitted\"; value: T[] }\n | { status: \"back\" }\n | { status: \"cancelled\" };\n\nexport type SearchMultiselectWorkbenchResult<T> =\n | {\n status: \"action\";\n action: string;\n selectedValues: T[];\n }\n | {\n status: \"back\";\n selectedValues: T[];\n }\n | {\n status: \"cancelled\";\n selectedValues: T[];\n };\n\nexport type SearchPromptState<T> = {\n readonly mode: SearchPromptMode;\n readonly message: string;\n readonly noticeLines: string[];\n readonly items: SearchPromptItemWithSearchKey<T>[];\n readonly footerActions: SearchPromptFooterAction[];\n readonly footerActionsResolver: SearchPromptFooterActionResolver<T> | null;\n readonly workbench: boolean;\n readonly allowBack: boolean;\n readonly backLabel: string;\n readonly emptyLabel: string;\n readonly maxVisible: number;\n readonly required: boolean;\n readonly readOnly: boolean;\n readonly summaryCard: SearchPromptSummaryCard | null;\n readonly selectedValues: T[];\n readonly query: string;\n readonly activeRowIndex: number;\n};\n\nexport type SearchPromptVisibleItem<T> = {\n kind: \"item\";\n filteredIndex: number;\n itemIndex: number;\n item: SearchSelectItem<T>;\n active: boolean;\n selected: boolean;\n};\n\nexport type SearchPromptVisibleRow<T> =\n | SearchPromptVisibleItem<T>\n | {\n kind: \"action\";\n action: SearchPromptFooterAction;\n actionIndex: number;\n active: boolean;\n }\n | { kind: \"back\"; active: boolean; label: string };\n\nexport type SearchPromptViewModel<T> = {\n readonly filteredIndexes: number[];\n readonly rows: SearchPromptRow[];\n readonly activeRow: SearchPromptRow | null;\n readonly activeItemFilteredIndex: number | null;\n readonly visibleRows: SearchPromptVisibleRow<T>[];\n readonly hiddenBefore: number;\n readonly hiddenAfter: number;\n};\n\ntype SearchPromptResolvedResult<T> =\n | SearchSelectResult<T>\n | SearchMultiselectResult<T>\n | SearchMultiselectWorkbenchResult<T>;\n\nexport type SearchPromptKeypressResult<T> = InteractivePromptKeypressResult<\n SearchPromptState<T>,\n SearchPromptResolvedResult<T>\n>;\n\ntype SearchPromptAction<T> =\n | { type: \"move\"; delta: number }\n | { type: \"query-append\"; text: string }\n | { type: \"query-backspace\" }\n | { type: \"query-clear\" }\n | { type: \"toggle-active\" }\n | { type: \"set-query\"; query: string }\n | { type: \"set-selected\"; selectedValues: T[] };\n\nexport function createSearchPromptState<T>(\n input: CreateSearchPromptStateInput<T>\n): SearchPromptState<T> {\n const items = input.items.map(sanitizeSearchPromptItem);\n const baseState: SearchPromptState<T> = {\n mode: input.mode,\n message: sanitizeTerminalDisplayText(input.message, \"single-line\"),\n noticeLines: (input.noticeLines ?? []).map((line) =>\n sanitizeTerminalDisplayText(line, \"single-line\")\n ),\n items,\n footerActions: (input.footerActions ?? []).map(\n sanitizeSearchPromptFooterAction\n ),\n footerActionsResolver: input.footerActionsResolver ?? null,\n workbench: input.workbench === true,\n allowBack: input.allowBack === true,\n backLabel: sanitizeTerminalDisplayText(\n input.backLabel ?? \"Back\",\n \"single-line\"\n ),\n emptyLabel: sanitizeTerminalDisplayText(\n input.emptyLabel ?? EMPTY_MATCH_LABEL,\n \"single-line\"\n ),\n maxVisible: normalizeMaxVisible(input.maxVisible),\n required: input.required === true,\n readOnly: input.readOnly === true,\n summaryCard:\n input.summaryCard === undefined\n ? null\n : sanitizeSearchPromptSummaryCard(input.summaryCard),\n selectedValues: dedupeValues(input.initialSelectedValues ?? []),\n query: \"\",\n activeRowIndex: 0,\n };\n const nextState = {\n ...baseState,\n activeRowIndex: resolveInitialSearchPromptActiveRowIndex(baseState),\n };\n return syncSearchPromptState(nextState);\n}\n\nfunction sanitizeSearchPromptFooterAction(\n action: SearchPromptFooterAction\n): SearchPromptFooterAction {\n return {\n ...action,\n label: sanitizeTerminalDisplayText(action.label, \"single-line\"),\n ...(typeof action.icon === \"string\"\n ? {\n icon: sanitizeTerminalDisplayText(action.icon, \"single-line\"),\n }\n : {}),\n ...(typeof action.hint === \"string\"\n ? {\n hint: sanitizeTerminalDisplayText(action.hint, \"single-line\"),\n }\n : {}),\n };\n}\n\nfunction sanitizeSearchPromptItem<T>(\n item: SearchSelectItem<T>\n): SearchPromptItemWithSearchKey<T> {\n const normalizedItem: SearchSelectItem<T> = {\n ...item,\n label: sanitizeTerminalDisplayText(item.label, \"single-line\"),\n ...(typeof item.detail === \"string\"\n ? {\n detail: sanitizeTerminalDisplayText(item.detail, \"single-line\"),\n }\n : {}),\n ...(typeof item.hint === \"string\"\n ? {\n hint: sanitizeTerminalDisplayText(item.hint, \"single-line\"),\n }\n : {}),\n ...(typeof item.searchText === \"string\"\n ? {\n searchText: sanitizeTerminalDisplayText(\n item.searchText,\n \"multi-line\"\n ),\n }\n : {}),\n };\n\n return {\n ...normalizedItem,\n searchKey: buildSearchKey(normalizedItem),\n };\n}\n\nfunction sanitizeSearchPromptSummaryCard(\n card: SearchPromptSummaryCard\n): SearchPromptSummaryCard {\n return {\n ...card,\n title: sanitizeTerminalDisplayText(card.title, \"single-line\"),\n rows: card.rows.map((row) => ({\n label: sanitizeTerminalDisplayText(row.label, \"single-line\"),\n value: sanitizeTerminalDisplayText(row.value, \"single-line\"),\n })),\n };\n}\n\nexport function getSearchPromptViewModel<T>(\n state: SearchPromptState<T>\n): SearchPromptViewModel<T> {\n const filteredIndexes = getFilteredItemIndexes(state);\n const footerActions = resolveSearchPromptFooterActions(state);\n const rows = buildSearchPromptRows({\n allowBack: state.allowBack,\n filteredIndexes,\n footerActions,\n workbench: state.workbench,\n });\n\n const activeRow = rows[state.activeRowIndex] ?? null;\n const activeItemFilteredIndex = resolveSearchPromptActiveItemFilteredIndex({\n activeRow,\n filteredIndexes,\n workbench: state.workbench,\n });\n const visibleWindow = resolveAnchoredVisibleWindow({\n itemCount: filteredIndexes.length,\n anchorIndex: activeItemFilteredIndex,\n maxVisible: state.maxVisible,\n });\n\n const visibleRows = buildSearchPromptVisibleRows({\n activeRow,\n filteredIndexes,\n footerActions,\n state,\n visibleWindow,\n });\n\n return {\n filteredIndexes,\n rows,\n activeRow,\n activeItemFilteredIndex,\n visibleRows,\n hiddenBefore: visibleWindow.start,\n hiddenAfter: Math.max(0, filteredIndexes.length - visibleWindow.end),\n };\n}\n\nfunction resolveSearchPromptActiveItemFilteredIndex(input: {\n activeRow: SearchPromptRow | null;\n filteredIndexes: number[];\n workbench: boolean;\n}): number | null {\n if (input.activeRow?.kind === \"item\") {\n return input.activeRow.filteredIndex;\n }\n if (input.filteredIndexes.length === 0) {\n return null;\n }\n return input.filteredIndexes.length - 1;\n}\n\nexport function updateSearchPromptState<T>(\n state: SearchPromptState<T>,\n action: SearchPromptAction<T>\n): SearchPromptState<T> {\n switch (action.type) {\n case \"move\":\n return moveSearchPromptCursor(state, action.delta);\n case \"query-append\":\n if (action.text.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: `${state.query}${action.text}`,\n });\n case \"query-backspace\":\n if (state.query.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: state.query.slice(0, -1),\n });\n case \"query-clear\":\n if (state.query.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: \"\",\n });\n case \"set-query\":\n return syncSearchPromptState({\n ...state,\n query: action.query,\n });\n case \"toggle-active\":\n return toggleSearchPromptActiveSelection(state);\n case \"set-selected\":\n return syncSearchPromptState({\n ...state,\n selectedValues: dedupeValues(action.selectedValues),\n });\n default:\n return state;\n }\n}\n\nexport function getSearchPromptSelection<T>(\n state: SearchPromptState<T>\n):\n | SearchSelectResult<T>\n | SearchMultiselectResult<T>\n | SearchMultiselectWorkbenchResult<T>\n | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind === \"back\") {\n return state.workbench\n ? {\n status: \"back\",\n selectedValues: state.selectedValues,\n }\n : { status: \"back\" };\n }\n if (viewModel.activeRow?.kind === \"action\") {\n const action =\n resolveSearchPromptFooterActions(state)[viewModel.activeRow.actionIndex];\n if (!action || action.disabled === true) {\n return null;\n }\n return {\n status: \"action\",\n action: action.value,\n selectedValues: state.selectedValues,\n };\n }\n if (state.readOnly) {\n return null;\n }\n if (state.workbench) {\n return null;\n }\n\n if (state.mode === \"single\") {\n const activeItem = getActiveItem(state);\n if (!activeItem || activeItem.disabled === true) {\n return null;\n }\n return {\n status: \"submitted\",\n value: activeItem.value,\n };\n }\n\n if (state.required && state.selectedValues.length === 0) {\n return null;\n }\n return {\n status: \"submitted\",\n value: state.selectedValues,\n };\n}\n\nexport function renderSearchPromptLines<T>(\n state: SearchPromptState<T>,\n status: SearchPromptStatus = \"active\"\n): string[] {\n const symbol =\n status === \"cancelled\" ? PROMPT_SYMBOL_CANCELLED : PROMPT_SYMBOL_ACTIVE;\n const lines = [`${symbol} ${pc.bold(state.message)}`];\n\n if (status === \"submitted\") {\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(buildSubmittedSearchPromptSummary(state) ?? \"Done\")}`\n );\n return lines;\n }\n\n if (status === \"cancelled\") {\n lines.push(`${BAR_SYMBOL} ${pc.strikethrough(pc.dim(\"Cancelled\"))}`);\n return lines;\n }\n\n lines.push(...renderActiveSearchPromptLines(state));\n lines.push(pc.dim(\"└\"));\n return lines;\n}\n\nexport function measureRenderedSearchPromptHeight(\n lines: string[],\n columns: number | undefined\n): number {\n return measureRenderedTerminalLinesHeight(lines, columns);\n}\n\nfunction renderActiveSearchPromptLines<T>(\n state: SearchPromptState<T>\n): string[] {\n const viewModel = getSearchPromptViewModel(state);\n const lines: string[] = [];\n\n if (state.summaryCard) {\n lines.push(`${BAR_SYMBOL}`);\n lines.push(...renderSearchPromptSummaryCardLines(state.summaryCard));\n lines.push(`${BAR_SYMBOL}`);\n }\n\n if (state.noticeLines.length > 0) {\n lines.push(`${BAR_SYMBOL}`);\n lines.push(...renderSearchPromptNoticeCardLines(state.noticeLines));\n lines.push(`${BAR_SYMBOL}`);\n }\n\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(\"Search:\")} ${state.query}${pc.inverse(\" \")}`,\n renderSearchPromptHintLine({\n mode: state.mode,\n allowBack: state.allowBack,\n readOnly: state.readOnly,\n workbench: state.workbench,\n })\n );\n\n lines.push(`${BAR_SYMBOL}`);\n\n lines.push(...renderSearchPromptBodyLines(state, viewModel));\n lines.push(...renderSearchPromptOverflowLines(viewModel));\n if (state.workbench) {\n lines.push(...renderSearchPromptSelectionSummaryLines(state));\n lines.push(...renderSearchPromptWorkbenchMenuLines(viewModel));\n } else {\n lines.push(...renderSearchPromptActionLines(viewModel));\n lines.push(...renderSearchPromptBackLines(state, viewModel));\n lines.push(...renderSearchPromptSelectionSummaryLines(state));\n }\n return lines;\n}\n\nfunction renderSearchPromptBodyLines<T>(\n state: SearchPromptState<T>,\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const itemRows = viewModel.visibleRows.filter(\n (row): row is SearchPromptVisibleItem<T> => row.kind === \"item\"\n );\n if (itemRows.length === 0) {\n return [`${BAR_SYMBOL} ${pc.dim(state.emptyLabel)}`];\n }\n\n return itemRows.flatMap((row) => {\n const lines = [\n renderSearchPromptItemLine(row, {\n mode: state.mode,\n readOnly: state.readOnly,\n }),\n ];\n if (row.item.detail) {\n lines.push(`${BAR_SYMBOL} ${pc.dim(row.item.detail)}`);\n }\n return lines;\n });\n}\n\nfunction renderSearchPromptOverflowLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n if (viewModel.hiddenBefore === 0 && viewModel.hiddenAfter === 0) {\n return [];\n }\n\n const hiddenLabels: string[] = [];\n if (viewModel.hiddenBefore > 0) {\n hiddenLabels.push(`↑ ${String(viewModel.hiddenBefore)} more`);\n }\n if (viewModel.hiddenAfter > 0) {\n hiddenLabels.push(`↓ ${String(viewModel.hiddenAfter)} more`);\n }\n return [`${BAR_SYMBOL} ${pc.dim(hiddenLabels.join(\" \"))}`];\n}\n\nfunction renderSearchPromptActionLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const actionRows = viewModel.visibleRows.filter(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }> =>\n row.kind === \"action\"\n );\n if (actionRows.length === 0) {\n return [];\n }\n\n return renderSearchPromptActionBlockLines(actionRows);\n}\n\nfunction renderSearchPromptWorkbenchMenuLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const actionRows = viewModel.visibleRows.filter(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }> =>\n row.kind === \"action\"\n );\n const backRow = viewModel.visibleRows.find(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }> =>\n row.kind === \"back\"\n );\n if (actionRows.length === 0 && !backRow) {\n return [];\n }\n\n const lines = renderSearchPromptActionBlockLines(actionRows);\n if (backRow) {\n if (actionRows.length > 0) {\n lines.push(`${BAR_SYMBOL}`);\n }\n lines.push(renderSearchPromptBackLine(backRow, { workbench: true }));\n }\n return lines;\n}\n\nfunction renderSearchPromptBackLines<T>(\n state: SearchPromptState<T>,\n viewModel: SearchPromptViewModel<T>\n): string[] {\n if (!state.allowBack || state.workbench) {\n return [];\n }\n\n const backRow = viewModel.visibleRows.find(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }> =>\n row.kind === \"back\"\n );\n if (!backRow) {\n return [];\n }\n return [`${BAR_SYMBOL}`, renderSearchPromptBackLine(backRow)];\n}\n\nfunction renderSearchPromptSelectionSummaryLines<T>(\n state: SearchPromptState<T>\n): string[] {\n if (state.mode !== \"multiple\" || state.readOnly) {\n return [];\n }\n\n const lines = [\n `${BAR_SYMBOL}`,\n `${BAR_SYMBOL} ${pc.green(\"Selected:\")} ${buildMultiselectSummary(state)}`,\n ];\n if (\n !state.workbench &&\n (!state.required || state.selectedValues.length > 0)\n ) {\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(\"Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n \" to continue.\"\n )}`\n );\n }\n return lines;\n}\n\nexport function handleSearchPromptKeypress<T>(input: {\n state: SearchPromptState<T>;\n str: string | undefined;\n key: Key;\n}): SearchPromptKeypressResult<T> {\n const { state, str, key } = input;\n if (!key) {\n return { type: \"ignore\" };\n }\n\n if (key.ctrl === true && key.name === \"c\") {\n return {\n type: \"result\",\n result: buildSearchPromptDismissResult({\n state,\n status: \"cancelled\",\n }),\n status: \"cancelled\",\n };\n }\n\n if (key.name === \"escape\") {\n return handleSearchPromptEscapeKeypress(state);\n }\n\n if (isReturnKeypress({ key, str })) {\n return handleSearchPromptReturnKeypress(state);\n }\n\n const moveDelta = resolveSearchPromptMoveDelta(key.name);\n if (moveDelta !== null) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"move\",\n delta: moveDelta,\n }),\n };\n }\n\n if (key.name === \"space\" && state.mode === \"multiple\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"toggle-active\",\n }),\n };\n }\n\n if (key.name === \"backspace\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-backspace\",\n }),\n };\n }\n\n if (key.ctrl === true && key.name === \"u\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-clear\",\n }),\n };\n }\n\n const printableInput = normalizePrintableSearchInput(str, state.mode);\n if (printableInput !== null) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-append\",\n text: printableInput,\n }),\n };\n }\n\n return { type: \"ignore\" };\n}\n\nfunction buildSearchPromptDismissResult<T>(input: {\n state: SearchPromptState<T>;\n status: \"back\" | \"cancelled\";\n}): SearchPromptResolvedResult<T> {\n if (input.state.workbench) {\n if (input.status === \"back\") {\n return {\n status: \"back\",\n selectedValues: input.state.selectedValues,\n };\n }\n return {\n status: \"cancelled\",\n selectedValues: input.state.selectedValues,\n };\n }\n if (input.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"cancelled\",\n };\n}\n\nfunction handleSearchPromptEscapeKeypress<T>(\n state: SearchPromptState<T>\n): SearchPromptKeypressResult<T> {\n const dismissalStatus = state.allowBack ? \"back\" : \"cancelled\";\n return {\n type: \"result\",\n result: buildSearchPromptDismissResult({\n state,\n status: dismissalStatus,\n }),\n status: state.allowBack ? \"submitted\" : \"cancelled\",\n state: state.allowBack ? focusSearchPromptBackRow(state) : state,\n };\n}\n\nfunction handleSearchPromptReturnKeypress<T>(\n state: SearchPromptState<T>\n): SearchPromptKeypressResult<T> {\n if (\n state.workbench &&\n getSearchPromptViewModel(state).activeRow?.kind === \"item\"\n ) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"toggle-active\",\n }),\n };\n }\n\n const result = getSearchPromptSelection(state);\n if (!result) {\n return { type: \"ignore\" };\n }\n return {\n type: \"result\",\n result,\n status: \"submitted\",\n };\n}\n\nexport function promptSearchSelect<T>(\n input: SearchPromptBaseInput<T>,\n streams?: InteractivePromptStreams\n): Promise<SearchSelectResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"single\",\n });\n return runInteractiveSearchPrompt(state, streams).then(\n (result) => result as SearchSelectResult<T>\n );\n}\n\nexport function promptSearchMultiselect<T>(\n input: SearchPromptBaseInput<T> & {\n initialSelectedValues?: T[];\n required?: boolean;\n },\n streams?: InteractivePromptStreams\n): Promise<SearchMultiselectResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"multiple\",\n });\n return runInteractiveSearchPrompt(state, streams).then(\n (result) => result as SearchMultiselectResult<T>\n );\n}\n\nexport function promptSearchMultiselectWorkbench<T>(\n input: SearchPromptBaseInput<T> & {\n footerActions: SearchPromptFooterAction[];\n footerActionsResolver?: SearchPromptFooterActionResolver<T>;\n initialSelectedValues?: T[];\n }\n): Promise<SearchMultiselectWorkbenchResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"multiple\",\n workbench: true,\n });\n return runInteractiveSearchPrompt(state).then(\n (result) => result as SearchMultiselectWorkbenchResult<T>\n );\n}\n\nfunction buildSearchKey<T>(item: SearchSelectItem<T>): string {\n const raw = [\n item.searchText,\n item.label,\n item.detail,\n item.hint,\n String(item.value),\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\"\\n\")\n .trim()\n .toLowerCase();\n return raw;\n}\n\nfunction getFilteredItemIndexes<T>(state: SearchPromptState<T>): number[] {\n const query = state.query.trim().toLowerCase();\n if (query.length === 0) {\n return state.items.map((_item, index) => index);\n }\n return state.items.flatMap((item, index) =>\n item.searchKey.includes(query) ? [index] : []\n );\n}\n\nfunction syncSearchPromptState<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n const viewModel = getSearchPromptViewModelInternal(state);\n const activeRowIndex =\n viewModel.rows.length === 0\n ? 0\n : clampNumber(state.activeRowIndex, 0, viewModel.rows.length - 1);\n return {\n ...state,\n activeRowIndex,\n };\n}\n\nfunction getSearchPromptViewModelInternal<T>(state: SearchPromptState<T>) {\n const filteredIndexes = getFilteredItemIndexes(state);\n const footerActions = resolveSearchPromptFooterActions(state);\n const rows = buildSearchPromptRows({\n allowBack: state.allowBack,\n filteredIndexes,\n footerActions,\n workbench: state.workbench,\n });\n return {\n filteredIndexes,\n rows,\n };\n}\n\nfunction buildSearchPromptRows(input: {\n allowBack: boolean;\n filteredIndexes: number[];\n footerActions: SearchPromptFooterAction[];\n workbench: boolean;\n}): SearchPromptRow[] {\n const itemRows = input.filteredIndexes.map<SearchPromptRow>(\n (itemIndex, filteredIndex) => ({\n kind: \"item\",\n filteredIndex,\n itemIndex,\n })\n );\n const actionRows = input.footerActions.map<SearchPromptRow>(\n (_action, actionIndex) => ({\n kind: \"action\",\n actionIndex,\n })\n );\n const rows = input.workbench\n ? [...itemRows, ...actionRows]\n : [...itemRows, ...actionRows];\n if (input.allowBack) {\n rows.push({ kind: \"back\" });\n }\n return rows;\n}\n\nfunction buildSearchPromptVisibleRows<T>(input: {\n activeRow: SearchPromptRow | null;\n filteredIndexes: number[];\n footerActions: SearchPromptFooterAction[];\n state: SearchPromptState<T>;\n visibleWindow: { start: number; end: number };\n}): SearchPromptVisibleRow<T>[] {\n const itemRows: SearchPromptVisibleRow<T>[] = input.filteredIndexes\n .slice(input.visibleWindow.start, input.visibleWindow.end)\n .map((itemIndex, offset) => {\n const filteredIndex = input.visibleWindow.start + offset;\n const item = input.state.items[itemIndex];\n if (!item) {\n throw new Error(\"search prompt item is missing\");\n }\n return {\n kind: \"item\",\n filteredIndex,\n itemIndex,\n item,\n active:\n input.activeRow?.kind === \"item\" &&\n input.activeRow.filteredIndex === filteredIndex,\n selected: isItemSelected(input.state, item.value),\n };\n });\n const actionRows: SearchPromptVisibleRow<T>[] = input.footerActions.map(\n (action, actionIndex) => ({\n kind: \"action\",\n action,\n actionIndex,\n active:\n input.activeRow?.kind === \"action\" &&\n input.activeRow.actionIndex === actionIndex,\n })\n );\n const rows: SearchPromptVisibleRow<T>[] = [...itemRows, ...actionRows];\n if (input.state.allowBack) {\n rows.push({\n kind: \"back\",\n active: input.activeRow?.kind === \"back\",\n label: input.state.backLabel,\n });\n }\n return rows;\n}\n\nfunction resolveInitialSearchPromptActiveRowIndex<T>(\n state: SearchPromptState<T>\n): number {\n if (!state.workbench) {\n return 0;\n }\n\n const filteredIndexes = getFilteredItemIndexes(state);\n if (filteredIndexes.length > 0) {\n return 0;\n }\n return 0;\n}\n\nfunction moveSearchPromptCursor<T>(\n state: SearchPromptState<T>,\n delta: number\n): SearchPromptState<T> {\n const viewModel = getSearchPromptViewModelInternal(state);\n if (viewModel.rows.length === 0 || delta === 0) {\n return state;\n }\n return {\n ...state,\n activeRowIndex: wrapNumber(\n state.activeRowIndex + delta,\n 0,\n viewModel.rows.length - 1\n ),\n };\n}\n\nfunction toggleSearchPromptActiveSelection<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n if (state.mode !== \"multiple\") {\n return state;\n }\n const activeItem = getActiveItem(state);\n if (!activeItem || activeItem.disabled === true) {\n return state;\n }\n\n const selectedValues = new Set(state.selectedValues);\n if (selectedValues.has(activeItem.value)) {\n selectedValues.delete(activeItem.value);\n } else {\n selectedValues.add(activeItem.value);\n }\n\n return {\n ...state,\n selectedValues: Array.from(selectedValues),\n };\n}\n\nfunction getActiveItem<T>(\n state: SearchPromptState<T>\n): SearchSelectItem<T> | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind !== \"item\") {\n return null;\n }\n return state.items[viewModel.activeRow.itemIndex] ?? null;\n}\n\nfunction isItemSelected<T>(state: SearchPromptState<T>, value: T): boolean {\n return state.selectedValues.includes(value);\n}\n\nfunction renderSearchPromptItemLine<T>(\n row: SearchPromptVisibleItem<T>,\n input: {\n mode: SearchPromptMode;\n readOnly: boolean;\n }\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n if (input.readOnly) {\n const hint = row.item.hint ? pc.dim(` (${row.item.hint})`) : \"\";\n return `${BAR_SYMBOL} ${prefix} ${row.item.label}${hint}`;\n }\n const marker = resolveSearchPromptItemMarker({\n mode: input.mode,\n active: row.active,\n selected: row.selected,\n });\n const label = row.item.label;\n const hint = row.item.hint ? pc.dim(` (${row.item.hint})`) : \"\";\n const disabled = row.item.disabled === true;\n const renderedLabel = disabled ? pc.dim(label) : label;\n return `${BAR_SYMBOL} ${prefix} ${marker} ${renderedLabel}${hint}`;\n}\n\nfunction renderSearchPromptActionLine<T>(\n row: Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }>\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n const icon =\n typeof row.action.icon === \"string\" && row.action.icon.length > 0\n ? `${\n row.action.disabled === true || row.action.icon === \"·\"\n ? pc.dim(row.action.icon)\n : pc.cyan(row.action.icon)\n } `\n : \"\";\n let label = pc.bold(row.action.label);\n if (row.action.accent === true) {\n label = pc.green(row.action.label);\n }\n if (row.action.disabled === true) {\n label = pc.dim(row.action.label);\n }\n const hint = row.action.hint ? pc.dim(` (${row.action.hint})`) : \"\";\n return `${BAR_SYMBOL} ${prefix} ${icon}${label}${hint}`;\n}\n\nfunction renderSearchPromptActionBlockLines<T>(\n actionRows: Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }>[]\n): string[] {\n const lines = [`${BAR_SYMBOL}`];\n for (const row of actionRows) {\n if (row.action.separatorBefore === true) {\n lines.push(`${BAR_SYMBOL}`);\n }\n lines.push(renderSearchPromptActionLine(row));\n }\n return lines;\n}\n\nfunction resolveSearchPromptItemMarker(input: {\n mode: SearchPromptMode;\n active: boolean;\n selected: boolean;\n}): string {\n if (input.mode === \"multiple\") {\n return input.selected ? MULTI_SELECTED_SYMBOL : MULTI_UNSELECTED_SYMBOL;\n }\n return input.active ? SINGLE_SELECTED_SYMBOL : SINGLE_UNSELECTED_SYMBOL;\n}\n\nfunction renderSearchPromptBackLine<T>(\n row: Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }>,\n input?: {\n workbench?: boolean;\n }\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n if (input?.workbench === true) {\n return `${BAR_SYMBOL} ${prefix} ${row.label}`;\n }\n return `${BAR_SYMBOL} ${prefix} ${row.label}`;\n}\n\nfunction buildSubmittedSearchPromptSummary<T>(\n state: SearchPromptState<T>\n): string | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind === \"back\") {\n return state.backLabel;\n }\n if (viewModel.activeRow?.kind === \"action\") {\n return (\n resolveSearchPromptFooterActions(state)[viewModel.activeRow.actionIndex]\n ?.label ?? null\n );\n }\n if (state.mode === \"single\") {\n const item = getActiveItem(state);\n return item?.label ?? null;\n }\n return buildMultiselectSummary(state);\n}\n\nfunction buildMultiselectSummary<T>(state: SearchPromptState<T>): string {\n const labels = state.items\n .filter((item) => isItemSelected(state, item.value))\n .map((item) => item.label);\n if (labels.length === 0) {\n return \"(none)\";\n }\n if (labels.length <= 3) {\n return labels.join(\", \");\n }\n return `${labels.slice(0, 3).join(\", \")} +${String(labels.length - 3)} more`;\n}\n\nfunction focusSearchPromptBackRow<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n const backRowIndex = getSearchPromptViewModel(state).rows.findIndex(\n (row) => row.kind === \"back\"\n );\n if (backRowIndex < 0) {\n return state;\n }\n return {\n ...state,\n activeRowIndex: backRowIndex,\n };\n}\n\nfunction resolveSearchPromptMoveDelta(name: string | undefined): number | null {\n if (name === \"up\") {\n return -1;\n }\n if (name === \"down\") {\n return 1;\n }\n return null;\n}\n\nfunction renderSearchPromptHintLine(input: {\n mode: SearchPromptMode;\n allowBack: boolean;\n readOnly: boolean;\n workbench: boolean;\n}): string {\n if (input.readOnly) {\n return `${BAR_SYMBOL} ${pc.dim(\n input.allowBack\n ? \"↑↓ browse, type to filter, Esc back\"\n : \"↑↓ browse, type to filter\"\n )}`;\n }\n if (input.workbench) {\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Space`\")}${pc.dim(\" or \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack\n ? \" to select, choose an action to continue, Esc back\"\n : \" to select, choose an action to continue\"\n )}`;\n }\n if (input.mode === \"multiple\") {\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Space`\")}${pc.dim(\" to select, Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack ? \" to confirm, Esc back\" : \" to confirm\"\n )}`;\n }\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack ? \" to select, Esc back\" : \" to select\"\n )}`;\n}\n\nfunction renderSearchPromptSummaryCardLines(\n card: SearchPromptSummaryCard\n): string[] {\n return buildTextInfoCardLines({\n ...card,\n sanitize: true,\n }).map((line) => `${BAR_SYMBOL} ${line}`);\n}\n\nfunction renderSearchPromptNoticeCardLines(noticeLines: string[]): string[] {\n if (noticeLines.length === 0) {\n return [];\n }\n\n return buildTextInfoCardLines({\n title: pc.yellow(\"⚠️ Notification\"),\n rows: noticeLines.map((line) => ({\n label: \"\",\n value: pc.yellow(`⚠️ ${line}`),\n })),\n compact: true,\n minContentWidth: 48,\n }).map((line) => `${BAR_SYMBOL} ${line}`);\n}\n\nfunction normalizeMaxVisible(value: number | undefined): number {\n const normalized = typeof value === \"number\" ? Math.trunc(value) : Number.NaN;\n return Number.isFinite(normalized) && normalized > 0\n ? normalized\n : DEFAULT_MAX_VISIBLE;\n}\n\nfunction wrapNumber(value: number, min: number, max: number): number {\n if (value < min) {\n return max;\n }\n if (value > max) {\n return min;\n }\n return value;\n}\n\nfunction dedupeValues<T>(values: T[]): T[] {\n return Array.from(new Set(values));\n}\n\nfunction runInteractiveSearchPrompt<T>(\n initialState: SearchPromptState<T>,\n streams?: InteractivePromptStreams\n): Promise<SearchPromptResolvedResult<T>> {\n return runInteractivePrompt(\n {\n initialState,\n fallbackResult: buildSearchPromptFallbackResult(initialState),\n renderLines: (state, status) => renderSearchPromptLines(state, status),\n handleKeypress: ({ state, str, key }) =>\n handleSearchPromptKeypress({\n state,\n str,\n key,\n }),\n },\n streams\n );\n}\n\nfunction buildSearchPromptFallbackResult<T>(\n state: SearchPromptState<T>\n): SearchPromptResolvedResult<T> {\n return buildSearchPromptDismissResult({\n state,\n status: state.allowBack ? \"back\" : \"cancelled\",\n });\n}\n\nfunction resolveSearchPromptFooterActions<T>(\n state: SearchPromptState<T>\n): SearchPromptFooterAction[] {\n if (state.footerActionsResolver === null) {\n return state.footerActions;\n }\n\n return state\n .footerActionsResolver({\n selectedValues: state.selectedValues,\n })\n .map(sanitizeSearchPromptFooterAction);\n}\n\nfunction isPrintableSearchInput(\n value: string | undefined,\n mode: SearchPromptMode\n): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return false;\n }\n if (mode === \"multiple\" && value === \" \") {\n return false;\n }\n return PRINTABLE_SEARCH_INPUT_REGEX.test(value);\n}\n\nfunction normalizePrintableSearchInput(\n value: string | undefined,\n mode: SearchPromptMode\n): string | null {\n return typeof value === \"string\" && isPrintableSearchInput(value, mode)\n ? value\n : null;\n}\n","const DISPLAY_NOT_SET_UP = \"Not set up\";\n\nexport function formatTransportModeDisplay(\n value: string | null | undefined\n): string {\n const normalized = String(value ?? \"\").trim();\n if (!normalized || normalized === \"not configured\") {\n return DISPLAY_NOT_SET_UP;\n }\n if (normalized === \"local-cli\") {\n return \"Local CLI\";\n }\n if (normalized === \"codex-app-server\") {\n return \"Codex App Server\";\n }\n if (normalized === \"acp\") {\n return \"Agent Client Protocol (ACP)\";\n }\n return normalized;\n}\n","import pc from \"picocolors\";\nimport { formatOpenMeldCliTextBlock } from \"../runtime/cli-entry-command\";\n\nexport const formatAgentsCopy = (text: string): string =>\n formatOpenMeldCliTextBlock(text);\n\nexport function formatAgentMention(agentId: string): string {\n return pc.bold(pc.cyan(`@${agentId}`));\n}\n\nexport function formatAgentsToneText(\n tone: \"success\" | \"warning\" | \"info\",\n value: string\n): string {\n if (tone === \"success\") {\n return pc.green(value);\n }\n if (tone === \"warning\") {\n return pc.yellow(value);\n }\n return pc.cyan(value);\n}\n\nexport function formatStatusTextForHuman(value: string): string {\n if (value.length === 0) {\n return value;\n }\n const normalized = value.replaceAll(\"_\", \" \");\n return normalized[0]?.toUpperCase() + normalized.slice(1);\n}\n\nexport function normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n","import pc from \"picocolors\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { type InfoCardRow, renderInfoCard } from \"../ui/info-card\";\nimport { formatAgentMention, formatAgentsToneText } from \"./agents-text\";\n\nconst AGENTS_CARD_MIN_CONTENT_WIDTH = 34;\n\nexport function renderAgentsInfoCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n title: string;\n codePrefix: string;\n rows: InfoCardRow[];\n minContentWidth?: number;\n}): void {\n renderInfoCard({\n presenter: input.presenter,\n title: input.title,\n codePrefix: input.codePrefix,\n rows: input.rows,\n minContentWidth: input.minContentWidth ?? AGENTS_CARD_MIN_CONTENT_WIDTH,\n horizontalPadding: 1,\n compact: true,\n });\n}\n\nexport function formatAgentListItem(input: {\n agentId: string;\n displayName: string;\n detail?: string;\n}): string {\n const parts = [\n formatAgentMention(input.agentId),\n pc.dim(\"·\"),\n input.displayName,\n ];\n if (input.detail) {\n parts.push(pc.dim(input.detail));\n }\n return parts.join(\" \");\n}\n\nexport function buildReadyAgentCardRow(\n agentId: string,\n displayName: string\n): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId,\n displayName,\n }),\n };\n}\n\nexport function buildStatusAgentCardRow(input: {\n agentId: string;\n displayName: string;\n detail: string;\n}): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId: input.agentId,\n displayName: input.displayName,\n detail: input.detail,\n }),\n };\n}\n\nexport function buildTurnedOffAgentCardRow(\n agentId: string,\n displayName: string\n): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId,\n displayName,\n }),\n };\n}\n\nexport function buildReadyCountValue(count: number, noun: string): string {\n return `${formatAgentsToneText(\"success\", pc.bold(String(count)))} ${pc.dim(noun)}`;\n}\n\nexport function buildNotReadyCountValue(count: number, noun: string): string {\n return `${formatAgentsToneText(\"warning\", pc.bold(String(count)))} ${pc.dim(noun)}`;\n}\n","import pc from \"picocolors\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { formatAgentsCopy } from \"./agents-text\";\n\nfunction normalizeDescriptionLines(description: string | string[]): string[] {\n const list = Array.isArray(description) ? description : [description];\n return list.map((line) => line.trim()).filter((line) => line.length > 0);\n}\n\nexport function buildInteractiveMenuMessage(input: {\n title: string;\n description: string | string[];\n}): string {\n return [\n input.title,\n ...normalizeDescriptionLines(input.description).map((line) =>\n pc.dim(formatAgentsCopy(line))\n ),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function emitInteractiveDescription(\n description: string | string[]\n): void {\n const lines = normalizeDescriptionLines(description);\n if (lines.length === 0) {\n return;\n }\n process.stdout.write(\n `${lines.map((line) => pc.dim(formatAgentsCopy(line))).join(\"\\n\")}\\n`\n );\n}\n\nexport function emitHumanSectionDescription(\n presenter: ReturnType<typeof createPresenter>,\n input: {\n codePrefix: string;\n description: string | string[];\n }\n): void {\n if (presenter.view !== \"human\") {\n return;\n }\n const lines = normalizeDescriptionLines(input.description);\n for (const [index, line] of lines.entries()) {\n presenter.line({\n code: `${input.codePrefix}.description.${String(index)}`,\n text: pc.dim(formatAgentsCopy(line)),\n });\n }\n}\n\nexport function emitHumanSectionHeader(\n presenter: ReturnType<typeof createPresenter>,\n input: {\n codePrefix: string;\n title: string;\n }\n): void {\n if (presenter.view !== \"human\") {\n return;\n }\n presenter.line({\n code: `${input.codePrefix}.spacer`,\n text: \"\",\n });\n presenter.line({\n code: `${input.codePrefix}.title`,\n text: input.title,\n });\n}\n","import pc from \"picocolors\";\nimport type { AgentTargetState } from \"../agents/registry\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport type { InfoCardRow } from \"../ui/info-card\";\nimport {\n buildReadyAgentCardRow,\n buildTurnedOffAgentCardRow,\n renderAgentsInfoCard,\n} from \"./agents-cards\";\nimport { emitHumanSectionDescription } from \"./agents-descriptions\";\nimport { formatAgentsToneText, formatStatusTextForHuman } from \"./agents-text\";\n\nexport type EnableSummary = {\n requested: string[];\n registered: string[];\n reenabled: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{\n agentId: string;\n code: string;\n humanActionRequired?: boolean;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n }>;\n allMode: boolean;\n};\n\nexport type RepairSummary = {\n requested: string[];\n repaired: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{\n agentId: string;\n code: string;\n humanActionRequired?: boolean;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n }>;\n allMode: boolean;\n};\n\nexport type DisableSummary = {\n requested: string[];\n disabled: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{ agentId: string; code: string; reason: string }>;\n allMode: boolean;\n};\n\nconst AGENTS_ENABLE_RESULT_DESCRIPTION =\n \"These agents can now reply when someone mentions them in a Space from this computer.\";\nconst AGENTS_DISABLE_RESULT_DESCRIPTION =\n \"These agents will stop replying to new mentions in Spaces.\";\n\nexport function emitEnableSummaryCardsForHuman(input: {\n presenter: ReturnType<typeof createPresenter>;\n summary: EnableSummary;\n targetStateById: Map<string, AgentTargetState>;\n}): void {\n emitHumanSectionDescription(input.presenter, {\n codePrefix: \"agents.enable\",\n description: AGENTS_ENABLE_RESULT_DESCRIPTION,\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: \"agents.enable.summary.card\",\n title: \"Agents Turned On\",\n rows: buildEnableSummaryRows(input.summary),\n minContentWidth: 38,\n });\n\n const detailCards = buildEnableDetailCards(\n input.summary,\n input.targetStateById\n );\n for (const card of detailCards) {\n input.presenter.line({\n code: `agents.enable.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: `agents.enable.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 30,\n });\n }\n}\n\nfunction buildEnableSummaryRows(summary: EnableSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildEnableSummaryStatus(summary),\n },\n ];\n\n if (summary.registered.length > 0) {\n rows.push({\n label: \"On now\",\n value: String(summary.registered.length),\n });\n }\n if (summary.reenabled.length > 0) {\n rows.push({\n label: \"Back on\",\n value: String(summary.reenabled.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already on\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildEnableSummaryStatus(summary: EnableSummary): string {\n const readyCount = summary.registered.length + summary.reenabled.length;\n const reviewCount = summary.skipped.length + summary.errors.length;\n\n if (readyCount > 0 && reviewCount === 0) {\n if (summary.allMode) {\n return readyCount === 1\n ? `1 detected agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `All detected available agents are ${formatAgentsToneText(\"success\", \"on now\")}`;\n }\n return readyCount === 1\n ? `1 selected agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `${readyCount} selected agents are ${formatAgentsToneText(\"success\", \"available now\")}`;\n }\n\n if (readyCount > 0) {\n return readyCount === 1\n ? `1 agent is ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`\n : `${readyCount} agents are ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`;\n }\n\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already on\");\n }\n\n return formatAgentsToneText(\"warning\", \"OpenMeld could not turn these on\");\n}\n\nfunction buildEnableDetailCards(\n summary: EnableSummary,\n targetStateById: Map<string, AgentTargetState>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.registered.length > 0) {\n cards.push({\n codeSuffix: \"enabled_now\",\n title: `Turned On Now (${summary.registered.length})`,\n rows: summary.registered.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.reenabled.length > 0) {\n cards.push({\n codeSuffix: \"reenabled\",\n title: `Turned Back On (${summary.reenabled.length})`,\n rows: summary.reenabled.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_enabled\",\n title: `Already On (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatEnableSkippedReasonForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatEnableErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction resolveEnableResultDisplayName(\n agentId: string,\n targetStateById: Map<string, AgentTargetState>\n): string {\n return targetStateById.get(agentId)?.displayName ?? agentId;\n}\n\nfunction formatEnableSkippedReasonForHuman(reason: string): string {\n if (reason === \"already_enabled\") {\n return \"Already on in OpenMeld\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction formatEnableErrorReasonForHuman(input: {\n code: string;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n}): string {\n if (\n input.code === \"controller.launch.choice_required\" &&\n input.installChoices &&\n input.installChoices.length > 0\n ) {\n const choiceSummary = input.installChoices\n .map(\n (installChoice) =>\n `${installChoice.installId} (${installChoice.label} · ${installChoice.detail})`\n )\n .join(\"; \");\n const nextStepSummary = (input.nextSteps ?? []).join(\" or \");\n return [\n input.summary ??\n \"Needs your choice on this Mac before OpenMeld can continue.\",\n `Choices: ${choiceSummary}`,\n nextStepSummary ? `Next: ${nextStepSummary}` : null,\n ]\n .filter((line) => Boolean(line))\n .join(\" \");\n }\n if (input.reason === \"not found\") {\n return \"Not found on this computer\";\n }\n if (input.reason === \"will be supported soon\") {\n return \"Found on this computer, but OpenMeld support is coming soon\";\n }\n if (input.reason === \"custom target is not runnable yet\") {\n return \"Custom targets cannot be enabled yet\";\n }\n if (input.reason === \"not selectable in current runtime\") {\n return \"Not available in this runtime\";\n }\n if (input.reason === \"unknown built-in target id\") {\n return \"Not in the built-in support list\";\n }\n if (input.reason === \"needs repair\") {\n return \"Needs repair on this computer before OpenMeld can start it\";\n }\n if (input.reason === \"needs your choice\") {\n return \"Needs your choice on this Mac before OpenMeld can use it\";\n }\n if (input.code === \"agents.config_write_failed\") {\n return \"OpenMeld could not save this change\";\n }\n return formatStatusTextForHuman(input.reason);\n}\n\nexport function buildRepairSummaryRows(summary: RepairSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildRepairSummaryStatus(summary),\n },\n ];\n\n if (summary.repaired.length > 0) {\n rows.push({\n label: \"Repaired\",\n value: String(summary.repaired.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already available\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildRepairSummaryStatus(summary: RepairSummary): string {\n if (summary.repaired.length > 0 && summary.errors.length === 0) {\n if (summary.skipped.length === 0) {\n return summary.repaired.length === 1\n ? `1 agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `${String(summary.repaired.length)} agents are ${formatAgentsToneText(\"success\", \"available now\")}`;\n }\n return `${String(summary.repaired.length)} agents are ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`;\n }\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already available\");\n }\n return formatAgentsToneText(\n \"warning\",\n \"OpenMeld could not repair all selected agents\"\n );\n}\n\nexport function buildRepairDetailCards(\n summary: RepairSummary,\n targetStateById: Map<string, AgentTargetState>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.repaired.length > 0) {\n cards.push({\n codeSuffix: \"repaired\",\n title: `Available Now (${summary.repaired.length})`,\n rows: summary.repaired.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_ready\",\n title: `Already Available (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value:\n item.reason === \"already_ready\"\n ? \"Already available on this computer\"\n : formatStatusTextForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatRepairErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction formatRepairErrorReasonForHuman(input: {\n code: string;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n}): string {\n if (input.reason === \"agent is not registered\") {\n return \"This agent is not connected in OpenMeld yet\";\n }\n if (input.reason === \"custom target is not runnable yet\") {\n return \"Custom targets cannot be repaired yet\";\n }\n if (input.reason === \"unknown built-in target id\") {\n return \"Not in the built-in support list\";\n }\n return formatEnableErrorReasonForHuman(input);\n}\n\nexport function emitDisableSummaryCardsForHuman(input: {\n presenter: ReturnType<typeof createPresenter>;\n summary: DisableSummary;\n displayNameById: Map<string, string>;\n}): void {\n emitHumanSectionDescription(input.presenter, {\n codePrefix: \"agents.disable\",\n description: AGENTS_DISABLE_RESULT_DESCRIPTION,\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: \"agents.disable.summary.card\",\n title: \"Agents Turned Off\",\n rows: buildDisableSummaryRows(input.summary),\n minContentWidth: 38,\n });\n\n const detailCards = buildDisableDetailCards(\n input.summary,\n input.displayNameById\n );\n for (const card of detailCards) {\n input.presenter.line({\n code: `agents.disable.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: `agents.disable.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 30,\n });\n }\n}\n\nfunction buildDisableSummaryRows(summary: DisableSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildDisableSummaryStatus(summary),\n },\n ];\n\n if (summary.disabled.length > 0) {\n rows.push({\n label: \"Off now\",\n value: String(summary.disabled.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already off\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildDisableSummaryStatus(summary: DisableSummary): string {\n if (summary.disabled.length > 0 && summary.skipped.length === 0) {\n return summary.disabled.length === 1\n ? `1 agent ${formatAgentsToneText(\"warning\", \"turned off\")}`\n : `${String(summary.disabled.length)} agents ${formatAgentsToneText(\"warning\", \"turned off\")}`;\n }\n\n if (summary.disabled.length > 0) {\n return summary.disabled.length === 1\n ? `1 agent ${formatAgentsToneText(\"warning\", \"turned off\")} ${pc.dim(\"· review the rest below\")}`\n : `${String(summary.disabled.length)} agents ${formatAgentsToneText(\"warning\", \"turned off\")} ${pc.dim(\"· review the rest below\")}`;\n }\n\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already off\");\n }\n\n return formatAgentsToneText(\"warning\", \"OpenMeld could not turn these off\");\n}\n\nfunction buildDisableDetailCards(\n summary: DisableSummary,\n displayNameById: Map<string, string>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.disabled.length > 0) {\n cards.push({\n codeSuffix: \"turned_off\",\n title: `Turned Off (${summary.disabled.length})`,\n rows: summary.disabled.map((agentId) =>\n buildTurnedOffAgentCardRow(\n agentId,\n displayNameById.get(agentId) ?? agentId\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_off\",\n title: `Already Off (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: displayNameById.get(item.agentId) ?? item.agentId,\n value: formatDisableSkippedReasonForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: displayNameById.get(item.agentId) ?? item.agentId,\n value: formatDisableErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction formatDisableSkippedReasonForHuman(reason: string): string {\n if (reason === \"already_disabled\") {\n return \"Already off in OpenMeld\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction formatDisableErrorReasonForHuman(input: {\n code: string;\n reason: string;\n}): string {\n if (input.reason === \"agent is not registered\") {\n return \"Not currently connected to OpenMeld\";\n }\n if (input.code === \"agents.config_write_failed\") {\n return \"OpenMeld could not save this change\";\n }\n return formatStatusTextForHuman(input.reason);\n}\n","import { isAbsolute } from \"node:path\";\nimport { cancel, isCancel, select } from \"@clack/prompts\";\nimport {\n buildAgentControllerRef,\n createAgentControllerInterfaceDisplayRows,\n} from \"@openmeld/agent-runtime\";\nimport { compareAgentControllerRefsForDisplay } from \"@openmeld/schemas\";\nimport type { AgentControllerInterfaceSnapshot } from \"@openmeld/schemas/types\";\nimport pc from \"picocolors\";\nimport { emitAgentsAgentOverview } from \"../agents/agent-overview\";\nimport {\n type BuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionExamples,\n validateBuiltinAgentSelectionInput,\n} from \"../agents/builtin-selection-contract\";\nimport { repairBuiltinControllerInstall } from \"../agents/local-controller-install\";\nimport {\n normalizeAgentId,\n normalizeAgentIds,\n parseAgentEnabledOption,\n sortAgentRegistrations,\n} from \"../agents/model\";\nimport {\n type AgentCustomTarget,\n type AgentTargetDescriptor,\n type AgentTargetState,\n addAgentCustomTarget,\n createRegistrationFromCatalogTarget,\n listAgentCustomTargets,\n listAgentRegistrations,\n listAgentTargetStates,\n readAgentRuntimeConfigHealth,\n removeAgentCustomTarget,\n resolveAgentTargetState,\n updateAgentCustomTarget,\n updateAgentRegistrations,\n} from \"../agents/registry\";\nimport {\n DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,\n type RuntimeAgentControllerState,\n type RuntimeAgentTransportMode,\n} from \"../config/runtime-config\";\nimport { resolveAgentControllerInterfaceSnapshot } from \"../local-service/inventory/agent-controller-interface\";\nimport { collectLocalAgentControllerInventory } from \"../local-service/inventory/agent-controller-inventory\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommands,\n} from \"../runtime/cli-entry-command\";\nimport { emitCliJsonEnvelope } from \"../runtime/cli-json-output\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport { createPresenter } from \"../runtime/presenter/index\";\nimport {\n promptSearchMultiselect,\n promptSearchSelect,\n type SearchSelectItem,\n} from \"../ui/search-select\";\nimport { promptTextEntry } from \"../ui/text-entry\";\nimport { formatTransportModeDisplay } from \"../ui/transport-mode-display\";\nimport {\n buildNotReadyCountValue,\n buildReadyAgentCardRow,\n buildReadyCountValue,\n buildStatusAgentCardRow,\n renderAgentsInfoCard,\n} from \"./agents-cards\";\nimport {\n buildInteractiveMenuMessage,\n emitHumanSectionHeader,\n emitInteractiveDescription,\n} from \"./agents-descriptions\";\nimport {\n buildRepairDetailCards,\n buildRepairSummaryRows,\n type DisableSummary,\n type EnableSummary,\n emitDisableSummaryCardsForHuman,\n emitEnableSummaryCardsForHuman,\n type RepairSummary,\n} from \"./agents-summary-cards\";\nimport {\n formatAgentMention,\n formatAgentsCopy,\n formatAgentsToneText,\n formatStatusTextForHuman,\n normalizeOptionalString,\n} from \"./agents-text\";\n\ntype AgentsBaseInput = {\n interactive?: boolean;\n json?: boolean;\n view?: string;\n profile?: string;\n};\n\ntype AgentsEnableInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n install?: string;\n presentation?: \"handoff\" | \"standalone\";\n};\n\ntype AgentsDisableInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n};\n\ntype AgentsRepairInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n changeInstall?: boolean;\n install?: string;\n presentation?: \"handoff\" | \"standalone\";\n};\n\ntype AgentsUnregisterInput = AgentsBaseInput & {\n agentId?: string;\n};\n\ntype AgentsShowInput = AgentsBaseInput & {\n agentId?: string;\n};\n\ntype AgentsConfigInput = AgentsBaseInput & {\n agentId?: string;\n enabled?: string;\n};\n\ntype AgentsCustomAddInput = AgentsBaseInput & {\n id?: string;\n name?: string;\n dir?: string;\n};\n\ntype AgentsCustomUpdateInput = AgentsBaseInput & {\n id?: string;\n name?: string;\n dir?: string;\n};\n\ntype AgentsCustomRemoveInput = AgentsBaseInput & {\n id?: string;\n};\n\nexport type AgentsEnableSummary = EnableSummary;\n\nexport type AgentsEnableResult = {\n status: \"back\" | \"cancelled\" | \"completed\";\n summary: AgentsEnableSummary;\n};\n\ntype EnableChoiceCandidate = AgentTargetState;\ntype BuiltinEnableChoiceCandidate = EnableChoiceCandidate & {\n targetKind: \"builtin\";\n};\ntype AgentTransportModeSource =\n | \"registration\"\n | \"registry_default\"\n | \"global_default\";\ntype AgentTransportModeStatus = \"missing\" | \"supported\" | \"unsupported\";\ntype RegisteredAgentTargetState = AgentTargetState & {\n registration: RuntimeAgentControllerState;\n};\ntype AgentViewLaunchStatus =\n | \"available\"\n | \"needs_choice\"\n | \"needs_repair\"\n | \"not_available\";\n\nexport type AgentsRepairSummary = RepairSummary;\n\nexport type AgentsRepairResult = {\n status: \"back\" | \"cancelled\" | \"completed\";\n summary: AgentsRepairSummary;\n};\n\nfunction isBuiltinEnableChoiceCandidate(\n value: AgentTargetState | null | undefined\n): value is BuiltinEnableChoiceCandidate {\n return value?.targetKind === \"builtin\";\n}\n\nfunction hasAgentRegistration(\n value: AgentTargetState | null | undefined\n): value is RegisteredAgentTargetState {\n return value?.registration !== null && value?.registration !== undefined;\n}\n\ntype MenuFlowResult = \"completed\" | \"cancelled\";\n\ntype PromptChoiceResult<T> =\n | {\n status: \"selected\";\n value: T;\n }\n | {\n status: \"empty\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"back\";\n };\n\ntype InteractiveCustomAgentsMenuChoice =\n | \"add\"\n | \"edit\"\n | \"remove\"\n | \"list\"\n | \"back\";\ntype AgentsManageAgentActionChoice =\n (typeof AGENTS_MANAGE_AGENT_ACTION_CHOICE)[keyof typeof AGENTS_MANAGE_AGENT_ACTION_CHOICE];\ntype AgentsMenuChoice =\n (typeof AGENTS_MENU_CHOICE)[keyof typeof AGENTS_MENU_CHOICE];\n\nconst AGENTS_MENU_CHOICE = {\n quickEnable: \"quick_enable\",\n manage: \"manage\",\n detect: \"detect\",\n custom: \"custom\",\n exit: \"exit\",\n} as const;\n\nconst AGENTS_MANAGE_AGENT_ACTION_CHOICE = {\n showDetails: \"show_details\",\n chooseInstall: \"choose_install\",\n repair: \"repair\",\n toggleEnabled: \"toggle_enabled\",\n back: \"back\",\n} as const;\n\nconst CUSTOM_AGENTS_COMING_SOON_OPTION_ID = \"__custom_agents_coming_soon__\";\nconst NO_REGISTERED_AGENTS_MANAGE_MESSAGE =\n \"No agents are set up on this computer yet. Run `openmeld agents detect`, then turn on the ones you want OpenMeld to use.\";\nconst NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE =\n \"No more agents are available to enable. Run `openmeld agents detect` to scan this computer again.\";\nconst AGENTS_MENU_DESCRIPTION =\n \"Enable agents on this computer so people in a Space can mention them.\";\nconst AGENTS_ENABLE_DESCRIPTION =\n \"Choose which new agents OpenMeld should turn on for Space from this computer.\";\nconst AGENTS_SELECT_REGISTERED_DESCRIPTION =\n \"Choose an agent on this computer to review or change.\";\n\nconst AGENTS_MENU_COMMANDS = [\n ...buildBuiltinAgentSelectionExamples({ command: \"enable\" }),\n ...buildBuiltinAgentSelectionExamples({ command: \"repair\" }),\n \"openmeld agents detect\",\n \"openmeld agents list\",\n \"openmeld agents manage\",\n ...buildBuiltinAgentSelectionExamples({ command: \"disable\" }),\n \"openmeld agents show <agent-id>\",\n \"openmeld agents config <agent-id> --enabled true|false\",\n \"openmeld agents custom list\",\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n \"openmeld agents custom remove --id <id>\",\n];\n\nconst AGENTS_MANAGE_RESULT_COMMANDS = [\n \"openmeld agents list\",\n \"openmeld agents show <agent-id>\",\n ...buildBuiltinAgentSelectionExamples({ command: \"repair\" }),\n \"openmeld agents config <agent-id> --enabled true|false\",\n ...buildBuiltinAgentSelectionExamples({ command: \"disable\" }),\n];\n\nfunction formatBuiltinAgentSelectionAlternatives(\n command: BuiltinAgentSelectionCommand\n): string {\n return buildBuiltinAgentSelectionExamples({ command })\n .filter((example) => !example.includes(\" --install \"))\n .map((example) => `\\`${example}\\``)\n .join(\" or \");\n}\n\nfunction buildBuiltinAgentMenuActions(\n command: BuiltinAgentSelectionCommand\n): Array<{ command: string; description: string }> {\n switch (command) {\n case \"enable\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Enable every detected agent OpenMeld can use on this computer.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description: \"Enable selected agents so OpenMeld can use them.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id>\"],\n command,\n installId: \"<install-id>\",\n }),\n description:\n \"Enable one agent with the exact local install OpenMeld should use.\",\n },\n ];\n case \"repair\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Repair every connected builtin agent on this computer that needs attention.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description:\n \"Refresh how OpenMeld starts selected agents on this computer.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id>\"],\n command,\n installId: \"<install-id>\",\n }),\n description: \"Repair one agent with the exact local install to use.\",\n },\n ];\n case \"disable\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Disable every enabled agent for new mentions in Spaces.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description:\n \"Disable selected agents so new mentions in Spaces stop waking them.\",\n },\n ];\n default: {\n const exhaustiveCheck: never = command;\n throw new Error(\n `unsupported builtin agent selection command: ${exhaustiveCheck}`\n );\n }\n }\n}\n\nfunction formatAgentViewLaunchStatus(\n status: AgentTargetState[\"launchStatus\"]\n): AgentViewLaunchStatus {\n return status === \"ready\" ? \"available\" : status;\n}\n\nfunction buildQuickEnableOptionHint(actionableBuiltinCount: number): string {\n return actionableBuiltinCount === 1\n ? \"1 new agent can be turned on now\"\n : `${String(actionableBuiltinCount)} new agents can be turned on now`;\n}\n\nfunction buildManageOptionHint(registeredCount: number): string {\n if (registeredCount === 0) {\n return \"No agents are set up on this computer yet\";\n }\n if (registeredCount === 1) {\n return \"Review 1 agent on this computer\";\n }\n return `Review ${String(registeredCount)} agents on this computer`;\n}\n\nfunction buildDetectedAgentsSubtitle(detectedAgentsCount: number): string {\n return detectedAgentsCount === 1\n ? \"1 agent found on this computer\"\n : `${String(detectedAgentsCount)} agents found on this computer`;\n}\n\nfunction buildEnabledAgentsSubtitle(enabledAgentsCount: number): string {\n return enabledAgentsCount === 1\n ? \"1 agent is live for Space\"\n : `${String(enabledAgentsCount)} agents are live for Space`;\n}\n\nexport async function runAgents(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"menu\",\n });\n const payload = await buildAgentsMenuPayload();\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.menu.result\",\n payload,\n });\n return;\n }\n\n if (canUseInteractivePrompts(runtime)) {\n await runInteractiveAgentsMenu({\n profile: input.profile,\n view: runtime.resolvedView,\n });\n return;\n }\n\n presenter.line({\n code: \"agents.menu.header\",\n text: \"OpenMeld agents commands:\",\n });\n for (const command of formatOpenMeldCliCommands(payload.commands)) {\n presenter.line({\n code: \"agents.menu.command\",\n text: `- ${command}`,\n });\n }\n for (const note of payload.notes) {\n presenter.line({\n code: \"agents.menu.note\",\n text: `- ${formatAgentsCopy(note)}`,\n });\n }\n}\n\nexport async function runAgentsManage(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"manage\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.manage.result\",\n payload: {\n interactive: true,\n supportedView: \"human\",\n commands: [...AGENTS_MANAGE_RESULT_COMMANDS],\n },\n });\n return;\n }\n\n if (!canUseInteractivePrompts(runtime)) {\n presenter.line({\n code: \"agents.manage.non_interactive\",\n text: formatInlineOpenMeldCliCommands(\n \"This menu is interactive. In scripts or non-interactive terminals, use `openmeld agents list`, `openmeld agents show <agent-id>`, `openmeld agents config <agent-id> --enabled true|false`, or `openmeld agents disable --agent <id...>`.\"\n ),\n });\n return;\n }\n\n const flow = await runInteractiveAgentsManageMenu({\n view: \"human\",\n profile: input.profile,\n });\n if (flow === \"cancelled\") {\n cancel(\"Cancelled.\");\n }\n}\n\nasync function runInteractiveAgentsMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<void> {\n while (true) {\n const { enableCandidates, registrations } =\n await resolveAgentsChoiceState();\n const actionableBuiltinCount = enableCandidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.registered\n ).length;\n const registeredCount = registrations.length;\n const choice = await select({\n message: buildInteractiveMenuMessage({\n title: \"OpenMeld agents:\",\n description: AGENTS_MENU_DESCRIPTION,\n }),\n options: [\n ...(actionableBuiltinCount > 0\n ? [\n {\n value: AGENTS_MENU_CHOICE.quickEnable,\n label: \"Enable available agents\",\n hint: buildQuickEnableOptionHint(actionableBuiltinCount),\n },\n ]\n : []),\n {\n value: AGENTS_MENU_CHOICE.manage,\n label: \"Review Agents on This Device\",\n hint: buildManageOptionHint(registeredCount),\n },\n {\n value: AGENTS_MENU_CHOICE.detect,\n label: \"Find Agents on This Device\",\n hint: \"Check which supported AI tools OpenMeld can see here\",\n },\n {\n value: AGENTS_MENU_CHOICE.exit,\n label: \"Exit\",\n },\n ],\n });\n\n if (isCancel(choice)) {\n cancel(\"Cancelled.\");\n return;\n }\n if (choice === AGENTS_MENU_CHOICE.exit) {\n return;\n }\n\n const flow = await runInteractiveAgentsMenuChoice({\n input,\n choice: choice as AgentsMenuChoice,\n });\n if (flow === \"cancelled\") {\n cancel(\"Cancelled.\");\n return;\n }\n }\n}\n\nasync function runInteractiveAgentsMenuChoice(input: {\n input: {\n view: \"human\";\n profile?: string;\n };\n choice: AgentsMenuChoice;\n}): Promise<MenuFlowResult | \"continue\"> {\n switch (input.choice) {\n case AGENTS_MENU_CHOICE.detect:\n await runAgentsDetect(input.input);\n return \"continue\";\n case AGENTS_MENU_CHOICE.quickEnable:\n return runInteractiveAgentsEnable(input.input);\n case AGENTS_MENU_CHOICE.manage:\n return runInteractiveAgentsManageMenu(input.input);\n case AGENTS_MENU_CHOICE.custom:\n return runInteractiveCustomAgentsMenu(input.input);\n default:\n return \"continue\";\n }\n}\n\nasync function buildAgentsMenuPayload(): Promise<{\n commands: string[];\n notes: string[];\n actions: Array<{ command: string; description: string }>;\n selection: {\n enableCandidates: Array<{\n agentId: string;\n displayName: string;\n targetKind: AgentTargetDescriptor[\"targetKind\"];\n detected: boolean;\n lifecycleStatus: AgentTargetState[\"lifecycleStatus\"];\n registered: boolean;\n enabled: boolean;\n selectable: boolean;\n selectableReason: string | null;\n defaultTransportMode: string | null;\n transportModes: Array<{\n mode: string;\n label: string;\n description: string;\n }>;\n status:\n | \"detected_supported\"\n | \"detected_needs_choice\"\n | \"detected_needs_repair\"\n | \"detected_not_supported_yet\"\n | \"detected_suspended\"\n | \"not_detected\"\n | \"custom_coming_soon\";\n launchStatus: AgentViewLaunchStatus;\n launchStatusDetail: string | null;\n customDir?: string;\n }>;\n selectableAgentIds: string[];\n registeredAgents: Array<{\n agentId: string;\n displayName: string;\n enabled: boolean;\n }>;\n disableCandidates: Array<{\n agentId: string;\n displayName: string;\n enabled: boolean;\n }>;\n customAgents: {\n supported: boolean;\n message: string;\n commands: string[];\n };\n };\n}> {\n const { enableCandidates, registrations } = await resolveAgentsChoiceState();\n const registeredAgents = registrations.map((registration) => ({\n agentId: registration.agentId,\n displayName: registration.displayName,\n enabled: registration.enabled,\n }));\n return {\n commands: formatOpenMeldCliCommands([...AGENTS_MENU_COMMANDS]),\n notes: [\n \"Agents are AI tools on this computer. When you enable one, people in a Space can mention `@agent-id` to wake it and get a reply.\",\n \"Use `openmeld agents detect` to look for supported AI tools on this computer.\",\n `Use ${formatBuiltinAgentSelectionAlternatives(\"enable\")} to enable the agents that are available.`,\n `If OpenMeld can see an agent but cannot start it here, use ${formatBuiltinAgentSelectionAlternatives(\"repair\")}.`,\n \"Use `openmeld agents manage` to review enabled agents and change them later.\",\n \"Manage custom agents with `openmeld agents custom`.\",\n ].map(formatAgentsCopy),\n actions: [\n ...buildBuiltinAgentMenuActions(\"enable\"),\n ...buildBuiltinAgentMenuActions(\"repair\"),\n {\n command: \"openmeld agents detect\",\n description: \"Look for supported AI tools on this computer.\",\n },\n {\n command: \"openmeld agents list\",\n description: \"List the agents people can mention in a Space.\",\n },\n {\n command: \"openmeld agents manage\",\n description: \"Review enabled agents and change their settings.\",\n },\n ...buildBuiltinAgentMenuActions(\"disable\"),\n {\n command: \"openmeld agents show <agent-id>\",\n description: \"Show one agent's current OpenMeld settings.\",\n },\n {\n command: \"openmeld agents config <agent-id> --enabled true|false\",\n description: \"Enable or disable one agent for Space mentions.\",\n },\n {\n command: \"openmeld agents custom list\",\n description:\n \"List custom agent targets stored in the local OpenMeld config.\",\n },\n {\n command:\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n description: \"Add a custom agent target to the local OpenMeld config.\",\n },\n {\n command:\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n description:\n \"Update a custom agent target while keeping its id stable.\",\n },\n {\n command: \"openmeld agents custom remove --id <id>\",\n description:\n \"Remove a custom agent target that is not currently connected.\",\n },\n ].map((action) => ({\n ...action,\n command: formatOpenMeldCliCommands([action.command])[0] ?? action.command,\n })),\n selection: {\n enableCandidates: enableCandidates.map((candidate) => ({\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: candidate.targetKind,\n detected: candidate.detected,\n lifecycleStatus: candidate.lifecycleStatus,\n registered: candidate.registered,\n enabled: candidate.enabled,\n selectable: candidate.selectable,\n selectableReason: candidate.selectableReason,\n launchStatus: formatAgentViewLaunchStatus(candidate.launchStatus),\n launchStatusDetail: candidate.launchStatusDetail,\n defaultTransportMode: candidate.defaultTransportMode ?? null,\n transportModes: candidate.transportModes,\n status: resolveEnableCandidateStatus(candidate),\n ...(candidate.customDir ? { customDir: candidate.customDir } : {}),\n })),\n selectableAgentIds: enableCandidates\n .filter(canSelectAgentForNewLocalAgentSetup)\n .map((candidate) => candidate.agentId),\n registeredAgents,\n disableCandidates: registeredAgents.map((agent) => ({\n agentId: agent.agentId,\n displayName: agent.displayName,\n enabled: agent.enabled,\n })),\n customAgents: {\n supported: false,\n message: formatAgentsCopy(\n \"Custom agents are not available in this list yet. Use `openmeld agents custom` for now.\"\n ),\n commands: formatOpenMeldCliCommands([\n \"openmeld agents custom list\",\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n \"openmeld agents custom remove --id <id>\",\n ]),\n },\n },\n };\n}\n\nasync function resolveAgentsChoiceState(): Promise<{\n registrations: RuntimeAgentControllerState[];\n enableCandidates: EnableChoiceCandidate[];\n}> {\n const enableCandidates = await listAgentTargetStates();\n const registrations = enableCandidates\n .flatMap((candidate) =>\n candidate.registration ? [candidate.registration] : []\n )\n .sort((left, right) =>\n compareAgentControllerRefsForDisplay(left.agentId, right.agentId)\n );\n return {\n registrations,\n enableCandidates,\n };\n}\n\nfunction resolveEnableCandidateStatus(\n candidate: EnableChoiceCandidate\n):\n | \"detected_supported\"\n | \"detected_needs_choice\"\n | \"detected_needs_repair\"\n | \"detected_not_supported_yet\"\n | \"detected_suspended\"\n | \"not_detected\"\n | \"custom_coming_soon\" {\n if (candidate.targetKind === \"custom\") {\n return \"custom_coming_soon\";\n }\n if (!candidate.detected) {\n return \"not_detected\";\n }\n if (candidate.lifecycleStatus === \"suspended\") {\n return \"detected_suspended\";\n }\n if (candidate.launchStatus === \"needs_choice\") {\n return \"detected_needs_choice\";\n }\n if (candidate.launchStatus === \"needs_repair\") {\n return \"detected_needs_repair\";\n }\n if (!candidate.selectable) {\n return \"detected_not_supported_yet\";\n }\n return \"detected_supported\";\n}\n\nfunction canSelectAgentForNewLocalAgentSetup(\n candidate: EnableChoiceCandidate\n): boolean {\n return (\n candidate.targetKind === \"builtin\" &&\n candidate.lifecycleStatus !== \"suspended\" &&\n candidate.selectable\n );\n}\n\nfunction buildUnifiedEnableTargetHint(\n candidate: EnableChoiceCandidate\n): string {\n if (candidate.enabled) {\n return \"Already turned on in OpenMeld\";\n }\n if (!candidate.detected) {\n return \"Not found on this computer\";\n }\n if (candidate.lifecycleStatus === \"suspended\") {\n return \"Suspended for new OpenMeld profiles\";\n }\n if (candidate.launchStatus === \"needs_choice\") {\n return \"Needs your choice on this Mac before OpenMeld can turn it on\";\n }\n if (\n !candidate.selectable &&\n candidate.selectableReason === \"not_supported_yet\"\n ) {\n return \"Found on this computer, but OpenMeld doesn't support it yet\";\n }\n if (!candidate.selectable && candidate.selectableReason === \"needs_repair\") {\n return \"Needs repair before OpenMeld can start it here\";\n }\n if (!candidate.selectable && candidate.selectableReason) {\n return formatSelectableReasonForHuman(candidate.selectableReason);\n }\n return \"Available to enable now\";\n}\n\nfunction formatSelectableReason(reason: string): string {\n if (reason === \"not_detected\") {\n return \"not found\";\n }\n if (reason === \"not_supported_yet\") {\n return \"will be supported soon\";\n }\n if (reason === \"custom_coming_soon\") {\n return \"coming soon\";\n }\n if (reason === \"needs_choice\") {\n return \"needs your choice\";\n }\n if (reason === \"needs_repair\") {\n return \"needs repair\";\n }\n if (reason === \"suspended\") {\n return \"suspended\";\n }\n return reason;\n}\n\nfunction formatSelectableReasonForHuman(reason: string): string {\n if (reason === \"not_detected\") {\n return \"Not found on this computer\";\n }\n if (reason === \"not_supported_yet\") {\n return \"Found on this computer, but OpenMeld doesn't support it yet\";\n }\n if (reason === \"custom_coming_soon\") {\n return \"Custom agent support is coming soon\";\n }\n if (reason === \"needs_choice\") {\n return \"Needs your choice on this Mac before OpenMeld can use it\";\n }\n if (reason === \"needs_repair\") {\n return \"Needs repair on this computer before OpenMeld can start it\";\n }\n if (reason === \"suspended\") {\n return \"Suspended for new OpenMeld profiles\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction resolveEnableBlockedReason(\n state: {\n targetKind: AgentTargetDescriptor[\"targetKind\"];\n detected: boolean;\n launchStatus?: EnableChoiceCandidate[\"launchStatus\"];\n selectable: boolean;\n selectableReason: string | null;\n lifecycleStatus?: AgentTargetState[\"lifecycleStatus\"];\n } | null\n): string {\n if (!state) {\n return \"unknown built-in target id\";\n }\n if (state.targetKind === \"custom\") {\n return \"custom target is not runnable yet\";\n }\n if (!state.detected) {\n return \"not found\";\n }\n if (state.lifecycleStatus === \"suspended\") {\n return \"suspended for new OpenMeld profiles\";\n }\n if (state.launchStatus === \"needs_choice\") {\n return \"needs your choice\";\n }\n if (!state.selectable && state.selectableReason === \"needs_repair\") {\n return \"needs repair\";\n }\n if (!state.selectable && state.selectableReason) {\n return formatSelectableReason(state.selectableReason);\n }\n return \"not selectable in current runtime\";\n}\n\nfunction buildRegisteredAgentHint(\n state: EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n): string {\n const activationHint = state.registration.enabled\n ? \"Turned on\"\n : \"Turned off for new @mentions\";\n if (state.launchStatus === \"needs_choice\") {\n return buildMetadataDetailLine([\n activationHint,\n \"Needs your choice on this Mac\",\n ]);\n }\n if (state.launchStatus === \"needs_repair\") {\n return buildMetadataDetailLine([\n activationHint,\n \"Needs repair on this computer\",\n ]);\n }\n return buildMetadataDetailLine([\n activationHint,\n state.registration.enabled ? \"Live for Space @mentions\" : null,\n ]);\n}\n\nasync function runInteractiveAgentsEnable(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const { enableCandidates } = await resolveAgentsChoiceState();\n const builtinCandidates = enableCandidates.filter(\n (candidate) => candidate.targetKind === \"builtin\"\n );\n const actionableCandidates = builtinCandidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.registered\n );\n if (actionableCandidates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE)}\\n`\n );\n return \"completed\";\n }\n\n const selectedResult = await promptEnableAgentIdsFromUnifiedBuiltins({\n candidates: actionableCandidates,\n });\n if (selectedResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedResult.status !== \"selected\") {\n return \"completed\";\n }\n await runAgentsEnable({\n agent: selectedResult.value,\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n}\n\nasync function runInteractiveCustomAgentsMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n while (true) {\n const choiceResult = await promptInteractiveCustomAgentsMenuChoice();\n const outcome = await handleInteractiveCustomAgentsMenuChoice({\n input,\n choiceResult,\n });\n if (outcome === \"continue\") {\n continue;\n }\n return outcome;\n }\n}\n\nasync function runInteractiveAgentsManageMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const registeredStates = await listRegisteredAgentStates();\n if (registeredStates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_REGISTERED_AGENTS_MANAGE_MESSAGE)}\\n`\n );\n return \"completed\";\n }\n\n while (true) {\n const selectedAgentResult = await promptSelectRegisteredAgent({\n message: \"Choose an agent\",\n emptyMessage: NO_REGISTERED_AGENTS_MANAGE_MESSAGE,\n });\n if (selectedAgentResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedAgentResult.status !== \"selected\") {\n return \"completed\";\n }\n\n const selectedState = selectedAgentResult.value;\n const actionResult = await promptInteractiveAgentsManageAgentAction({\n agentId: selectedState.agentId,\n displayName: selectedState.displayName,\n enabled: selectedState.enabled,\n launchStatus: selectedState.launchStatus,\n });\n if (actionResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (\n actionResult.status !== \"selected\" ||\n actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.back\n ) {\n continue;\n }\n if (actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.showDetails) {\n await runAgentsShow({\n agentId: selectedState.agentId,\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n if (actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.repair) {\n await runAgentsRepair({\n agent: [selectedState.agentId],\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n if (\n actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall\n ) {\n await runAgentsRepair({\n agent: [selectedState.agentId],\n changeInstall: true,\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n\n await runAgentsConfig({\n agentId: selectedState.agentId,\n enabled: selectedState.enabled ? \"false\" : \"true\",\n profile: input.profile,\n view: input.view,\n });\n }\n}\n\nasync function handleInteractiveCustomAgentsMenuChoice(input: {\n input: {\n view: \"human\";\n profile?: string;\n };\n choiceResult: PromptChoiceResult<InteractiveCustomAgentsMenuChoice>;\n}): Promise<MenuFlowResult | \"continue\"> {\n if (input.choiceResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (input.choiceResult.status !== \"selected\") {\n return \"completed\";\n }\n\n switch (input.choiceResult.value) {\n case \"back\":\n return \"completed\";\n case \"list\":\n await runAgentsCustomList({\n profile: input.input.profile,\n view: input.input.view,\n });\n return \"continue\";\n case \"add\": {\n const flow = await runInteractiveCustomAgentsAddFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n case \"remove\": {\n const flow = await runInteractiveCustomAgentsRemoveFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n case \"edit\": {\n const flow = await runInteractiveCustomAgentsEditFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n default:\n return \"completed\";\n }\n}\n\nasync function promptInteractiveAgentsManageAgentAction(input: {\n agentId: string;\n displayName: string;\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): Promise<PromptChoiceResult<AgentsManageAgentActionChoice>> {\n const action = await select({\n message: buildInteractiveMenuMessage({\n title: `Agent: ${input.agentId}`,\n description: `When on, @${input.agentId} in Space can wake ${input.displayName}.`,\n }),\n options: [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.showDetails,\n label: \"View Setup\",\n },\n ...(input.launchStatus === \"needs_choice\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall,\n label: \"Choose install on This Device\",\n hint: \"Pick which local install OpenMeld should use\",\n },\n ]\n : []),\n ...(input.launchStatus === \"needs_repair\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.repair,\n label: \"Repair on This Device\",\n hint: \"Refresh how OpenMeld starts it locally\",\n },\n ]\n : []),\n ...(input.launchStatus === \"ready\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall,\n label: \"Change install on This Device\",\n hint: \"Pick a different local install for future replies\",\n },\n ]\n : []),\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.toggleEnabled,\n label: input.enabled\n ? \"Turn Off for Space @mentions\"\n : \"Turn On for Space @mentions\",\n hint: input.enabled\n ? \"Stop waking it for new @mentions\"\n : \"Allow @mentions to wake it again\",\n },\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.back,\n label: \"Back to Agents\",\n },\n ],\n });\n if (isCancel(action)) {\n return {\n status: \"cancelled\",\n };\n }\n return {\n status: \"selected\",\n value: action as AgentsManageAgentActionChoice,\n };\n}\n\nasync function promptInteractiveCustomAgentsMenuChoice(): Promise<\n PromptChoiceResult<InteractiveCustomAgentsMenuChoice>\n> {\n const choice = await select({\n message: \"Custom Targets:\",\n options: [\n {\n value: \"add\",\n label: \"Add custom target\",\n hint: \"Create a new custom agent target\",\n },\n {\n value: \"edit\",\n label: \"Edit custom target\",\n hint: \"Update name or dir (id remains stable)\",\n },\n {\n value: \"remove\",\n label: \"Remove custom target\",\n hint: \"Blocked when target is currently registered\",\n },\n {\n value: \"list\",\n label: \"List custom targets\",\n hint: \"Show custom targets and current status\",\n },\n {\n value: \"back\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(choice)) {\n return {\n status: \"cancelled\",\n };\n }\n return {\n status: \"selected\",\n value: choice as InteractiveCustomAgentsMenuChoice,\n };\n}\n\nasync function runInteractiveCustomAgentsAddFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n let namePlaceholder = \"e.g. OpenMeld Agent Executor\";\n let dirPlaceholder = \"/absolute/path/to/skills\";\n let idPlaceholder = \"leave empty to auto-generate from dir\";\n\n while (true) {\n const nameResult = await promptRequiredInteractiveText({\n message: \"Custom target name\",\n placeholder: namePlaceholder,\n requiredMessage: \"Custom target name is required.\",\n });\n if (nameResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (nameResult.status !== \"selected\") {\n return \"completed\";\n }\n namePlaceholder = nameResult.value;\n\n const addDetails = await promptInteractiveCustomAgentAddDetails({\n dirPlaceholder,\n idPlaceholder,\n });\n if (addDetails.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (addDetails.status !== \"submitted\") {\n continue;\n }\n dirPlaceholder = addDetails.value.dir;\n if (addDetails.value.idInput) {\n idPlaceholder = addDetails.value.idInput;\n }\n\n await runAgentsCustomAdd({\n name: nameResult.value,\n dir: addDetails.value.dir,\n ...(addDetails.value.id ? { id: addDetails.value.id } : {}),\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n }\n}\n\nasync function runInteractiveCustomAgentsRemoveFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const selectedTargetResult = await promptSelectCustomTarget({\n message: \"Select custom target to remove\",\n emptyMessage:\n \"No custom targets available. Add a custom target with `openmeld agents custom add --name <name> --dir <dir>`.\",\n });\n if (selectedTargetResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedTargetResult.status !== \"selected\") {\n return \"completed\";\n }\n await runAgentsCustomRemove({\n id: selectedTargetResult.value.id,\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n}\n\nasync function runInteractiveCustomAgentsEditFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n while (true) {\n const selectedTargetResult = await promptSelectCustomTarget({\n message: \"Select custom target to edit\",\n emptyMessage:\n \"No custom targets available. Add a custom target with `openmeld agents custom add --name <name> --dir <dir>`.\",\n });\n if (selectedTargetResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedTargetResult.status !== \"selected\") {\n return \"completed\";\n }\n const updateRequest = await promptInteractiveCustomAgentUpdate(\n selectedTargetResult.value\n );\n if (updateRequest.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (updateRequest.status !== \"submitted\") {\n continue;\n }\n\n await runAgentsCustomUpdate({\n id: updateRequest.value.id,\n ...(\"name\" in updateRequest.value\n ? { name: updateRequest.value.name }\n : { dir: updateRequest.value.dir }),\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n }\n}\n\nasync function promptInteractiveCustomAgentAddDetails(input: {\n dirPlaceholder: string;\n idPlaceholder: string;\n}): Promise<\n | {\n status: \"submitted\";\n value: {\n dir: string;\n id?: string;\n idInput?: string;\n };\n }\n | {\n status: \"back\" | \"cancelled\";\n }\n> {\n while (true) {\n const dirResult = await promptRequiredInteractiveText({\n message: \"Custom target absolute dir\",\n placeholder: input.dirPlaceholder,\n requiredMessage: \"Custom target absolute dir is required.\",\n validate: (value) =>\n isAbsolute(value)\n ? null\n : \"Custom target absolute dir must be an absolute path.\",\n });\n if (dirResult.status === \"cancelled\" || dirResult.status === \"back\") {\n return dirResult;\n }\n if (dirResult.status !== \"selected\") {\n continue;\n }\n\n const idResult = await promptInteractiveText({\n message: \"Custom target id (optional)\",\n placeholder: input.idPlaceholder,\n allowEmpty: true,\n });\n if (idResult.status === \"cancelled\") {\n return idResult;\n }\n if (idResult.status === \"back\") {\n input.dirPlaceholder = dirResult.value;\n continue;\n }\n if (idResult.status !== \"selected\") {\n continue;\n }\n\n return {\n status: \"submitted\",\n value: {\n dir: dirResult.value,\n id: normalizeOptionalString(idResult.value) ?? undefined,\n idInput: normalizeOptionalString(idResult.value) ?? undefined,\n },\n };\n }\n}\n\nasync function promptInteractiveCustomAgentUpdate(\n selectedTarget: AgentCustomTarget\n): Promise<\n | {\n status: \"submitted\";\n value:\n | {\n id: string;\n name: string;\n }\n | {\n id: string;\n dir: string;\n };\n }\n | {\n status: \"back\" | \"cancelled\";\n }\n> {\n while (true) {\n const field = await promptInteractiveCustomAgentEditField();\n if (field.status === \"cancelled\" || field.status === \"back\") {\n return field;\n }\n if (field.status !== \"selected\") {\n continue;\n }\n\n const valueResult = await promptInteractiveCustomAgentEditValue({\n field: field.value,\n selectedTarget,\n });\n if (valueResult.status === \"cancelled\") {\n return valueResult;\n }\n if (valueResult.status === \"back\") {\n continue;\n }\n if (valueResult.status !== \"selected\") {\n continue;\n }\n return {\n status: \"submitted\",\n value:\n field.value === \"name\"\n ? {\n id: selectedTarget.id,\n name: valueResult.value,\n }\n : {\n id: selectedTarget.id,\n dir: valueResult.value,\n },\n };\n }\n}\n\nasync function promptInteractiveCustomAgentEditField(): Promise<\n PromptChoiceResult<\"name\" | \"dir\">\n> {\n const field = await select({\n message: \"Edit field\",\n options: [\n {\n value: \"name\",\n label: \"Name\",\n },\n {\n value: \"dir\",\n label: \"Dir\",\n },\n {\n value: \"back\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(field)) {\n return {\n status: \"cancelled\",\n };\n }\n if (field === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: field,\n };\n}\n\nfunction promptInteractiveCustomAgentEditValue(input: {\n field: \"name\" | \"dir\";\n selectedTarget: AgentCustomTarget;\n}): Promise<PromptChoiceResult<string>> {\n return input.field === \"name\"\n ? promptRequiredInteractiveText({\n message: \"New name\",\n placeholder: input.selectedTarget.name,\n requiredMessage: \"Custom target name is required.\",\n })\n : promptRequiredInteractiveText({\n message: \"New absolute dir\",\n placeholder: input.selectedTarget.dir,\n requiredMessage: \"Custom target absolute dir is required.\",\n validate: (nextDir) =>\n isAbsolute(nextDir)\n ? null\n : \"Custom target absolute dir must be an absolute path.\",\n });\n}\n\nasync function promptInteractiveText(input: {\n message: string;\n placeholder?: string;\n allowEmpty?: boolean;\n}): Promise<PromptChoiceResult<string>> {\n const value = await promptTextEntry({\n message: input.message,\n ...(input.placeholder ? { placeholder: input.placeholder } : {}),\n allowBack: true,\n backLabel: \"Back\",\n allowEmpty: input.allowEmpty === true,\n requiredMessage: \"Value is required.\",\n });\n if (value.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (value.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: value.value,\n };\n}\n\nasync function promptRequiredInteractiveText(input: {\n message: string;\n placeholder?: string;\n requiredMessage: string;\n validate?: (value: string) => string | null;\n}): Promise<PromptChoiceResult<string>> {\n while (true) {\n const valueResult = await promptInteractiveText({\n message: input.message,\n ...(input.placeholder ? { placeholder: input.placeholder } : {}),\n });\n if (valueResult.status === \"cancelled\" || valueResult.status === \"back\") {\n return valueResult;\n }\n if (valueResult.status !== \"selected\") {\n continue;\n }\n\n const normalizedValue = normalizeOptionalString(valueResult.value);\n if (!normalizedValue) {\n process.stderr.write(`${input.requiredMessage}\\n`);\n continue;\n }\n\n const validationMessage = input.validate?.(normalizedValue) ?? null;\n if (validationMessage) {\n process.stderr.write(`${validationMessage}\\n`);\n continue;\n }\n return {\n status: \"selected\",\n value: normalizedValue,\n };\n }\n}\n\nasync function promptSelectCustomTarget(input: {\n message: string;\n emptyMessage: string;\n}): Promise<PromptChoiceResult<AgentCustomTarget>> {\n const customTargets = await listAgentCustomTargets();\n if (customTargets.length === 0) {\n process.stderr.write(`${formatAgentsCopy(input.emptyMessage)}\\n`);\n return {\n status: \"empty\",\n };\n }\n\n const choice = await promptSearchSelect({\n message: input.message,\n items: customTargets.map(buildCustomTargetSearchItem),\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (choice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (choice.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n\n const id = normalizeAgentId(choice.value);\n const selectedTarget = customTargets.find((target) => target.id === id);\n if (!selectedTarget) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: selectedTarget,\n };\n}\n\nasync function promptEnableAgentIdsFromUnifiedBuiltins(input: {\n candidates: EnableChoiceCandidate[];\n}): Promise<PromptChoiceResult<string[]>> {\n const selectableCandidates = input.candidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.enabled\n );\n if (selectableCandidates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE)}\\n`\n );\n return {\n status: \"empty\",\n };\n }\n\n emitInteractiveDescription(AGENTS_ENABLE_DESCRIPTION);\n const selected = await promptSearchMultiselect({\n message: \"Choose agents to enable\",\n items: [\n ...selectableCandidates.map(buildUnifiedEnableSearchItem),\n {\n value: CUSTOM_AGENTS_COMING_SOON_OPTION_ID,\n label: \"Custom agents (coming soon)\",\n detail: formatInlineOpenMeldCliCommands(\n \"Use `openmeld agents custom` commands for custom targets for now.\"\n ),\n searchText:\n \"Custom agents (coming soon) Use openmeld agents custom commands for custom targets for now\",\n disabled: true,\n },\n ],\n required: true,\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (selected.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (selected.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n\n const agentIds = normalizeAgentIds(selected.value.sort()).filter(\n (agentId) => agentId !== CUSTOM_AGENTS_COMING_SOON_OPTION_ID\n );\n if (agentIds.length === 0) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: agentIds,\n };\n}\n\nasync function listRegisteredAgentStates(): Promise<\n Array<\n EnableChoiceCandidate & {\n registration: RuntimeAgentControllerState;\n }\n >\n> {\n return (await listAgentTargetStates()).filter(\n (\n state\n ): state is EnableChoiceCandidate & {\n registration: RuntimeAgentControllerState;\n } => Boolean(state.registration)\n );\n}\n\nasync function promptSelectRegisteredAgent(input: {\n message: string;\n emptyMessage: string;\n}): Promise<\n PromptChoiceResult<\n EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n >\n> {\n const registeredStates = await listRegisteredAgentStates();\n if (registeredStates.length === 0) {\n process.stderr.write(`${formatAgentsCopy(input.emptyMessage)}\\n`);\n return {\n status: \"empty\",\n };\n }\n\n emitInteractiveDescription(AGENTS_SELECT_REGISTERED_DESCRIPTION);\n const choice = await promptSearchSelect({\n message: input.message,\n items: registeredStates.map(buildRegisteredAgentSearchItem),\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (choice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (choice.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n const agentId = normalizeAgentId(choice.value);\n if (!agentId) {\n return {\n status: \"empty\",\n };\n }\n const selectedState = registeredStates.find(\n (state) => state.agentId === agentId\n );\n if (!selectedState) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: selectedState,\n };\n}\n\nfunction buildCustomTargetSearchItem(\n target: AgentCustomTarget\n): SearchSelectItem<string> {\n return {\n value: target.id,\n label: target.name,\n detail: buildMetadataDetailLine([`ID ${target.id}`, target.dir]),\n searchText: [target.name, target.id, target.dir].join(\" \"),\n };\n}\n\nfunction buildUnifiedEnableSearchItem(\n candidate: EnableChoiceCandidate\n): SearchSelectItem<string> {\n const statusHint = buildUnifiedEnableTargetHint(candidate);\n return {\n value: candidate.agentId,\n label: candidate.displayName,\n detail: buildMetadataDetailLine([`ID ${candidate.agentId}`, statusHint]),\n searchText: [\n candidate.displayName,\n candidate.agentId,\n statusHint,\n candidate.selectableReason ?? \"\",\n ].join(\" \"),\n disabled:\n !canSelectAgentForNewLocalAgentSetup(candidate) || candidate.enabled,\n };\n}\n\nfunction buildRegisteredAgentSearchItem(\n state: EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n): SearchSelectItem<string> {\n const enabledHint = buildRegisteredAgentHint(state);\n return {\n value: state.agentId,\n label: state.agentId,\n detail: buildMetadataDetailLine([state.displayName, enabledHint]),\n searchText: [\n state.displayName,\n state.agentId,\n enabledHint,\n \"space wake mention reply\",\n ].join(\" \"),\n };\n}\n\nfunction buildMetadataDetailLine(\n parts: Array<string | null | undefined>\n): string {\n return parts\n .map((part) => String(part ?? \"\").trim())\n .filter((part) => part.length > 0)\n .join(\" · \");\n}\n\nexport async function runAgentsDetect(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const inventory = await collectLocalAgentControllerInventory();\n const detectedAgents = inventory.capabilities\n .filter(\n (capability) =>\n capability.detected &&\n (capability.lifecycleStatus !== \"suspended\" || capability.enabled)\n )\n .map((capability) => ({\n id: capability.agentId,\n blockerReasonCodes: capability.blockerReasonCodes,\n displayName: capability.displayName,\n launchability: capability.launchability,\n launchStatus: formatAgentViewLaunchStatus(capability.launchStatus),\n launchStatusDetail: capability.launchStatusDetail,\n lifecycleStatus: capability.lifecycleStatus,\n selectable: capability.selectable,\n }));\n const payload = {\n detectedAgents,\n count: detectedAgents.length,\n inventorySource: \"local_runtime_inventory\",\n source: \"builtin_detect\",\n };\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.detect\",\n ...payload,\n });\n return;\n }\n\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"detect\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.detect.result\",\n payload,\n });\n return;\n }\n\n const readyAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"launchable\"\n );\n const needsChoiceAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"needs_choice\"\n );\n const needsRepairAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"needs_repair\"\n );\n const comingSoonAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"not_supported\" &&\n !agent.selectable\n );\n const suspendedAgents = detectedAgents.filter(\n (agent) => agent.lifecycleStatus === \"suspended\"\n );\n const notDetectedAgents = inventory.capabilities.filter(\n (capability) => !capability.detected\n );\n if (detectedAgents.length === 0) {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.empty.card\",\n title: \"Agents Found Here\",\n rows: [\n {\n label: \"Found\",\n value: pc.dim(\"No supported AI agents yet\"),\n },\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n \"Open or install the AI tool you want OpenMeld to use, then run `openmeld agents detect` again.\"\n ),\n },\n ],\n minContentWidth: 36,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.summary.card\",\n title: \"Agents Found Here\",\n rows: [\n {\n label: \"Found\",\n value: buildDetectedAgentsSubtitle(detectedAgents.length),\n },\n {\n label: \"Available now\",\n value: buildReadyCountValue(readyAgents.length, \"live for Space\"),\n },\n {\n label: \"Needs choice\",\n value: buildNotReadyCountValue(\n needsChoiceAgents.length,\n \"found, needs your choice\"\n ),\n },\n {\n label: \"Needs repair\",\n value: buildNotReadyCountValue(\n needsRepairAgents.length,\n \"found, needs repair\"\n ),\n },\n {\n label: \"Coming soon\",\n value: buildNotReadyCountValue(\n comingSoonAgents.length,\n \"found, not supported yet\"\n ),\n },\n {\n label: \"Suspended\",\n value: buildNotReadyCountValue(\n suspendedAgents.length,\n \"already configured, not offered for new profiles\"\n ),\n },\n {\n label: \"Not found\",\n value: buildNotReadyCountValue(\n notDetectedAgents.length,\n \"not found on this computer\"\n ),\n },\n ],\n minContentWidth: 42,\n });\n\n if (readyAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.ready.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.ready.card\",\n title: `Available Now (${readyAgents.length})`,\n rows: readyAgents.map((agent) =>\n buildReadyAgentCardRow(agent.id, agent.displayName)\n ),\n minContentWidth: 30,\n });\n }\n\n if (needsRepairAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.needs_repair.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.needs_repair.card\",\n title: `Needs Repair (${needsRepairAgents.length})`,\n rows: needsRepairAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n // Prefer the real per-agent reason (e.g. \"Codex is installed, but\n // OpenMeld can't start it on this device.\") over a generic label so\n // an agent that OpenMeld found but could not launch is never\n // reported the same way as one that was never found at all.\n detail:\n agent.launchStatusDetail ??\n \"Repair on this computer before OpenMeld can start it\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (needsChoiceAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.needs_choice.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.needs_choice.card\",\n title: `Needs Your Choice (${needsChoiceAgents.length})`,\n rows: needsChoiceAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail: \"Choose which install OpenMeld should use on this Mac\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (comingSoonAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.coming_soon.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.coming_soon.card\",\n title: `Coming Soon (${comingSoonAgents.length})`,\n rows: comingSoonAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail:\n \"OpenMeld found it, but builtin runtime support is not available yet\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (suspendedAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.suspended.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.suspended.card\",\n title: `Suspended (${suspendedAgents.length})`,\n rows: suspendedAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail:\n \"Already configured here, but OpenMeld no longer offers it for new profiles\",\n })\n ),\n minContentWidth: 46,\n });\n }\n}\n\nexport async function runAgentsList(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const states = await listAgentTargetStates();\n const registrations = states\n .filter(hasAgentRegistration)\n .map((state) => buildAgentRegistrationAgentView(state))\n .sort((left, right) =>\n compareAgentControllerRefsForDisplay(left.agentId, right.agentId)\n );\n const payload = {\n registrations,\n count: registrations.length,\n };\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.list\",\n ...payload,\n });\n return;\n }\n\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"list\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.list.result\",\n payload,\n });\n return;\n }\n\n const enabledStates = states.filter((state) => state.registration?.enabled);\n const readyEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"ready\"\n );\n const needsChoiceEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"needs_choice\"\n );\n const needsRepairEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"needs_repair\"\n );\n if (\n readyEnabledStates.length === 0 &&\n needsChoiceEnabledStates.length === 0 &&\n needsRepairEnabledStates.length === 0\n ) {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.empty.card\",\n title: \"Agents Available for Space\",\n rows: [\n {\n label: \"Live now\",\n value: pc.dim(\"No agents are live yet\"),\n },\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n \"Run `openmeld agents detect`, then enable the agents you want OpenMeld to use.\"\n ),\n },\n ],\n minContentWidth: 38,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.summary.card\",\n title: \"Agents Available for Space\",\n rows: [\n {\n label: \"Live now\",\n value: buildEnabledAgentsSubtitle(readyEnabledStates.length),\n },\n {\n label: \"Needs choice\",\n value: String(needsChoiceEnabledStates.length),\n },\n {\n label: \"Needs repair\",\n value: String(needsRepairEnabledStates.length),\n },\n {\n label: \"Mention as\",\n value: `${formatAgentMention(\"agent-id\")} ${pc.dim(\"in Space\")}`,\n },\n ],\n minContentWidth: 38,\n });\n presenter.line({\n code: \"agents.list.ready.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.ready.card\",\n title: `Available Agents (${readyEnabledStates.length})`,\n rows: readyEnabledStates.map((state) =>\n buildReadyAgentCardRow(state.agentId, state.displayName)\n ),\n minContentWidth: 30,\n });\n if (needsRepairEnabledStates.length > 0) {\n presenter.line({\n code: \"agents.list.needs_repair.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.needs_repair.card\",\n title: `Needs Repair (${needsRepairEnabledStates.length})`,\n rows: needsRepairEnabledStates.map((state) =>\n buildStatusAgentCardRow({\n agentId: state.agentId,\n displayName: state.displayName,\n detail:\n \"Connected in OpenMeld, but OpenMeld can't start it on this computer yet\",\n })\n ),\n minContentWidth: 36,\n });\n }\n if (needsChoiceEnabledStates.length > 0) {\n presenter.line({\n code: \"agents.list.needs_choice.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.needs_choice.card\",\n title: `Needs Your Choice (${needsChoiceEnabledStates.length})`,\n rows: needsChoiceEnabledStates.map((state) =>\n buildStatusAgentCardRow({\n agentId: state.agentId,\n displayName: state.displayName,\n detail:\n \"Connected in OpenMeld, but OpenMeld still needs one install choice on this Mac\",\n })\n ),\n minContentWidth: 36,\n });\n }\n}\n\nexport async function runAgentsShow(input: AgentsShowInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"show\",\n });\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for show\"\n );\n }\n const state = await resolveAgentTargetState(agentId);\n if (!hasAgentRegistration(state)) {\n throw new Error(\n `agents.not_registered: agent is not registered: ${agentId}`\n );\n }\n const registration = state.registration;\n let agentControllerInterface: AgentControllerInterfaceSnapshot | null = null;\n if (state.targetKind === \"builtin\" && state.enabled) {\n const builtinState = state as RegisteredAgentTargetState & {\n targetKind: \"builtin\";\n };\n agentControllerInterface = await resolveAgentControllerInterfaceSnapshot({\n agentControllerRef: buildAgentControllerRef({\n id: builtinState.agentId,\n kind: \"builtin\",\n }),\n state: builtinState,\n });\n }\n\n const payload = {\n agent: buildAgentRegistrationAgentView(state),\n agentControllerInterface:\n input.json === true || runtime.resolvedView === \"agent\"\n ? projectLegacyAgentControllerInterface(agentControllerInterface)\n : agentControllerInterface,\n installChoices: state.installChoices,\n launchStatus: formatAgentViewLaunchStatus(state.launchStatus),\n launchStatusDetail: state.launchStatusDetail,\n effectiveConfig: buildEffectiveConfig(state),\n };\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.show\",\n ...payload,\n });\n return;\n }\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.show.result\",\n payload,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.show.card\",\n title: \"Agent in OpenMeld\",\n rows: [\n {\n label: \"Agent\",\n value: formatAgentMention(registration.agentId),\n },\n {\n label: \"App\",\n value: registration.displayName,\n },\n {\n label: \"Status\",\n value: buildAgentsShowStatusValue({\n enabled: registration.enabled,\n launchStatus: state.launchStatus,\n }),\n },\n {\n label: \"Wake\",\n value: buildAgentsShowWakeValue({\n agentId: registration.agentId,\n enabled: registration.enabled,\n launchStatus: state.launchStatus,\n }),\n },\n {\n label: \"Connection Type\",\n value: `${resolveTransportModeForDisplay(state)} ${pc.dim(\"on this computer\")}`,\n },\n ...buildAgentControllerInterfaceRows(agentControllerInterface),\n ...(state.launchStatusDetail\n ? [\n {\n label: \"Why\",\n value: state.launchStatusDetail,\n },\n ]\n : []),\n ...(state.launchStatus === \"needs_choice\"\n ? [\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n `Run \\`openmeld agents repair --agent ${registration.agentId}\\` and choose one install`\n ),\n },\n ]\n : []),\n ...(state.launchStatus === \"needs_repair\"\n ? [\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n `Run \\`openmeld agents repair --agent ${registration.agentId}\\``\n ),\n },\n ]\n : []),\n ],\n minContentWidth: 34,\n });\n}\n\nfunction projectLegacyAgentControllerInterface(\n snapshot: AgentControllerInterfaceSnapshot | null\n): AgentControllerInterfaceSnapshot | null {\n if (!snapshot?.usageLimits) {\n return snapshot;\n }\n const { usageLimits: _usageLimits, ...legacySnapshot } = snapshot;\n return legacySnapshot;\n}\n\nfunction createSilentAgentsPresenter(\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>\n): ReturnType<typeof createPresenter> {\n return {\n view: runtime.resolvedView,\n event: () => undefined,\n line: () => undefined,\n data: () => undefined,\n };\n}\n\nexport async function runAgentsEnable(\n input: AgentsEnableInput\n): Promise<AgentsEnableResult> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter =\n input.json === true\n ? createSilentAgentsPresenter(runtime)\n : createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"enable\",\n handled: input.presentation === \"handoff\",\n });\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n const explicitInstallId = normalizeOptionalString(input.install);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"enable\",\n explicitIds,\n explicitInstallId,\n });\n\n const targetStates = await listAgentTargetStates();\n const targetStateById = new Map(\n targetStates.map((state) => [state.agentId, state])\n );\n const selectableBuiltinIds = new Set(\n targetStates\n .filter(canSelectAgentForNewLocalAgentSetup)\n .map((state) => state.agentId)\n );\n const requested = input.all\n ? [...selectableBuiltinIds].sort((left, right) => left.localeCompare(right))\n : explicitIds;\n const summary: EnableSummary = {\n requested,\n registered: [],\n reenabled: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n const launchSelections = await collectEnableLaunchActionSelections({\n explicitInstallId,\n interactiveChoiceAllowed:\n input.json === true\n ? false\n : resolveInteractiveChoiceAllowed({\n all: input.all,\n runtime,\n }),\n requested,\n summary,\n targetStateById,\n });\n if (launchSelections.status === \"cancelled\") {\n cancel(\"Cancelled.\");\n return {\n status: \"cancelled\",\n summary,\n };\n }\n if (launchSelections.status === \"back\") {\n return {\n status: \"back\",\n summary,\n };\n }\n\n await updateAgentRegistrations((current) =>\n applyEnableSelectionUpdates({\n current,\n requested: requested.filter(\n (agentId) => !launchSelections.blockedAgentIds.has(agentId)\n ),\n selectedLaunchContracts: launchSelections.selectedLaunchContracts,\n selectableBuiltinIds,\n summary,\n targetStateById,\n })\n );\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.enable\",\n ...summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.enable.result\",\n payload: summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (input.presentation !== \"handoff\") {\n emitEnableSummaryCardsForHuman({\n presenter,\n summary,\n targetStateById,\n });\n }\n return {\n status: \"completed\",\n summary,\n };\n}\n\nexport async function runAgentsRegister(\n input: AgentsEnableInput\n): Promise<AgentsEnableResult> {\n return await runAgentsEnable(input);\n}\n\nexport async function runAgentsRepair(\n input: AgentsRepairInput\n): Promise<AgentsRepairResult> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"repair\",\n handled: input.presentation === \"handoff\",\n });\n\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n const explicitInstallId = normalizeOptionalString(input.install);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"repair\",\n explicitIds,\n explicitInstallId,\n });\n\n const targetStates = await listAgentTargetStates();\n const targetStateById = new Map(\n targetStates.map((state) => [state.agentId, state])\n );\n const requested = input.all\n ? targetStates\n .filter(\n (state) =>\n state.targetKind === \"builtin\" &&\n state.registered &&\n (state.launchStatus === \"needs_choice\" ||\n state.launchStatus === \"needs_repair\")\n )\n .map((state) => state.agentId)\n : explicitIds;\n const summary: RepairSummary = {\n requested,\n repaired: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n const repairedLaunchContracts = new Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >();\n const repairOutcome = await collectRepairLaunchActions({\n allowReadyForInstallChange:\n input.changeInstall === true || explicitInstallId !== null,\n explicitInstallId,\n interactiveChoiceAllowed: resolveInteractiveChoiceAllowed({\n all: input.all,\n runtime,\n }),\n repairedLaunchContracts,\n requested,\n summary,\n targetStateById,\n });\n if (repairOutcome === \"cancelled\") {\n cancel(\"Cancelled.\");\n return {\n status: \"cancelled\",\n summary,\n };\n }\n if (repairOutcome === \"back\") {\n return {\n status: \"back\",\n summary,\n };\n }\n\n if (repairedLaunchContracts.size > 0) {\n await updateAgentRegistrations((current) => {\n const nowIso = new Date().toISOString();\n return sortAgentRegistrations(\n current.map((registration) => {\n const launchContract = repairedLaunchContracts.get(\n registration.agentId\n );\n if (!launchContract) {\n return registration;\n }\n return {\n ...registration,\n launchContract,\n updatedAt: nowIso,\n };\n })\n );\n });\n }\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.repair.result\",\n payload: summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (input.presentation !== \"handoff\") {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.repair.summary.card\",\n title: \"Agents Repaired\",\n rows: buildRepairSummaryRows(summary),\n minContentWidth: 38,\n });\n for (const card of buildRepairDetailCards(summary, targetStateById)) {\n presenter.line({\n code: `agents.repair.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: `agents.repair.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 32,\n });\n }\n }\n return {\n status: \"completed\",\n summary,\n };\n}\n\nfunction buildAgentsShowStatusValue(input: {\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): string {\n if (input.launchStatus === \"needs_choice\") {\n return formatAgentsToneText(\"warning\", \"Needs your choice on this Mac\");\n }\n if (input.launchStatus === \"needs_repair\") {\n return formatAgentsToneText(\"warning\", \"Needs repair on this computer\");\n }\n if (input.enabled) {\n return formatAgentsToneText(\"success\", \"Available in Space\");\n }\n return formatAgentsToneText(\"warning\", \"Turned off in Space\");\n}\n\nfunction buildAgentsShowWakeValue(input: {\n agentId: string;\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): string {\n const mention = formatAgentMention(input.agentId);\n if (input.launchStatus === \"needs_choice\") {\n return `New ${mention} mentions will not wake it until you choose one install on this Mac`;\n }\n if (input.launchStatus === \"needs_repair\") {\n return `New ${mention} mentions will not wake it until you repair it`;\n }\n if (input.enabled) {\n return `${mention} can wake it`;\n }\n return `New ${mention} mentions stay off`;\n}\n\nfunction buildAgentControllerInterfaceRows(\n snapshot: AgentControllerInterfaceSnapshot | null\n): Array<{ label: string; value: string }> {\n if (!snapshot) {\n return [];\n }\n return createAgentControllerInterfaceDisplayRows(snapshot);\n}\n\nasync function promptBuiltinAgentInstallChoice(input: {\n displayName: string;\n installChoices: AgentTargetState[\"installChoices\"];\n}): Promise<PromptChoiceResult<string>> {\n const choice = await select({\n message: buildInteractiveMenuMessage({\n title: `Choose the ${input.displayName} install OpenMeld should use`,\n description: `We found more than one ${input.displayName} install on this Mac. Pick the one OpenMeld should launch for replies.`,\n }),\n options: [\n ...input.installChoices.map((installChoice) => ({\n value: installChoice.installId,\n label: installChoice.label,\n hint: installChoice.detail,\n })),\n {\n value: \"__back__\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(choice)) {\n return {\n status: \"cancelled\",\n };\n }\n if (choice === \"__back__\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: String(choice),\n };\n}\n\nfunction buildInstallChoiceNextSteps(input: {\n agentId: string;\n command: \"enable\" | \"repair\";\n installChoices: AgentTargetState[\"installChoices\"];\n}): string[] {\n return input.installChoices.map((installChoice) =>\n buildBuiltinAgentSelectionCommand({\n agentIds: [input.agentId],\n command: input.command,\n installId: installChoice.installId,\n })\n );\n}\n\nfunction createInstallChoiceError(input: {\n agentId: string;\n command: \"enable\" | \"repair\";\n installChoices: AgentTargetState[\"installChoices\"];\n reason: string;\n summary?: string;\n}): EnableSummary[\"errors\"][number] {\n return {\n agentId: input.agentId,\n code: \"controller.launch.choice_required\",\n humanActionRequired: true,\n installChoices: input.installChoices,\n nextSteps: buildInstallChoiceNextSteps({\n agentId: input.agentId,\n command: input.command,\n installChoices: input.installChoices,\n }),\n reason: input.reason,\n summary:\n input.summary ??\n \"OpenMeld needs one install choice on this Mac before it can continue.\",\n };\n}\n\ntype BuiltinLaunchActionResolution =\n | {\n launchContract: NonNullable<EnableChoiceCandidate[\"launchContract\"]>;\n status: \"resolved\";\n }\n | {\n error: EnableSummary[\"errors\"][number];\n status: \"blocked\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"not_needed\";\n }\n | {\n status: \"back\";\n };\n\nasync function resolveBuiltinLaunchAction(input: {\n command: \"enable\" | \"repair\";\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n state: EnableChoiceCandidate & { targetKind: \"builtin\" };\n}): Promise<BuiltinLaunchActionResolution> {\n const shouldResolveLaunchContract =\n input.command === \"repair\" ||\n Boolean(input.explicitInstallId) ||\n input.state.launchStatus === \"needs_choice\" ||\n input.state.launchStatus === \"needs_repair\";\n if (!shouldResolveLaunchContract) {\n return {\n status: \"not_needed\",\n };\n }\n\n let repairResult = await repairBuiltinControllerInstall({\n agentId: input.state.agentId,\n detected: input.state.detected,\n displayName: input.state.displayName,\n installId: input.explicitInstallId,\n runtimeSupported: input.state.runtimeSupported,\n });\n if (\n !repairResult.ok &&\n repairResult.errorCode === \"controller.launch.choice_required\" &&\n input.interactiveChoiceAllowed\n ) {\n const installChoice = await promptBuiltinAgentInstallChoice({\n displayName: input.state.displayName,\n installChoices: repairResult.installChoices,\n });\n if (installChoice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (installChoice.status === \"back\" || installChoice.status === \"empty\") {\n return {\n status: \"back\",\n };\n }\n repairResult = await repairBuiltinControllerInstall({\n agentId: input.state.agentId,\n detected: input.state.detected,\n displayName: input.state.displayName,\n installId: installChoice.value,\n runtimeSupported: input.state.runtimeSupported,\n });\n }\n if (!repairResult.ok) {\n return {\n error:\n repairResult.errorCode === \"controller.launch.choice_required\"\n ? createInstallChoiceError({\n agentId: input.state.agentId,\n command: input.command,\n installChoices: repairResult.installChoices,\n reason: repairResult.errorMessage,\n })\n : {\n agentId: input.state.agentId,\n code: repairResult.errorCode,\n reason: repairResult.errorMessage,\n },\n status: \"blocked\",\n };\n }\n return {\n launchContract: repairResult.launchContract,\n status: \"resolved\",\n };\n}\n\nfunction resolveInteractiveChoiceAllowed(input: {\n all?: boolean;\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>;\n}): boolean {\n return (\n input.runtime.resolvedView === \"human\" &&\n canUseInteractivePrompts(input.runtime) &&\n input.all !== true\n );\n}\n\nasync function collectEnableLaunchActionSelections(input: {\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n requested: string[];\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): Promise<\n | {\n blockedAgentIds: Set<string>;\n selectedLaunchContracts: Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >;\n status: \"completed\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"back\";\n }\n> {\n const blockedAgentIds = new Set<string>();\n const selectedLaunchContracts = new Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >();\n\n for (const requestedId of input.requested) {\n const state = input.targetStateById.get(requestedId) ?? null;\n if (!isBuiltinEnableChoiceCandidate(state)) {\n continue;\n }\n const launchAction = await resolveBuiltinLaunchAction({\n command: \"enable\",\n explicitInstallId: input.explicitInstallId,\n interactiveChoiceAllowed: input.interactiveChoiceAllowed,\n state,\n });\n if (launchAction.status === \"not_needed\") {\n continue;\n }\n if (launchAction.status === \"cancelled\" || launchAction.status === \"back\") {\n return {\n status: launchAction.status,\n };\n }\n if (launchAction.status === \"blocked\") {\n blockedAgentIds.add(state.agentId);\n input.summary.errors.push(launchAction.error);\n continue;\n }\n selectedLaunchContracts.set(state.agentId, launchAction.launchContract);\n }\n\n return {\n blockedAgentIds,\n selectedLaunchContracts,\n status: \"completed\",\n };\n}\n\nasync function collectRepairLaunchActions(input: {\n allowReadyForInstallChange: boolean;\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n repairedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n requested: string[];\n summary: RepairSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): Promise<\"back\" | \"cancelled\" | \"completed\"> {\n for (const requestedId of input.requested) {\n const candidate = resolveRepairCandidate({\n allowReadyForInstallChange: input.allowReadyForInstallChange,\n requestedId,\n targetStateById: input.targetStateById,\n });\n if (!candidate.ok) {\n input.summary.errors.push(candidate.error);\n continue;\n }\n if (\n !(input.allowReadyForInstallChange || input.explicitInstallId) &&\n candidate.state.launchStatus === \"ready\" &&\n candidate.state.registration?.launchContract\n ) {\n input.summary.skipped.push({\n agentId: requestedId,\n reason: \"already_ready\",\n });\n continue;\n }\n\n const launchAction = await resolveBuiltinLaunchAction({\n command: \"repair\",\n explicitInstallId: input.explicitInstallId,\n interactiveChoiceAllowed: input.interactiveChoiceAllowed,\n state: candidate.state,\n });\n if (launchAction.status === \"cancelled\" || launchAction.status === \"back\") {\n return launchAction.status;\n }\n if (launchAction.status === \"blocked\") {\n input.summary.errors.push(launchAction.error);\n continue;\n }\n if (launchAction.status === \"not_needed\") {\n continue;\n }\n input.repairedLaunchContracts.set(requestedId, launchAction.launchContract);\n input.summary.repaired.push(requestedId);\n }\n\n return \"completed\";\n}\n\nfunction applyEnableSelectionUpdates(input: {\n current: RuntimeAgentControllerState[];\n requested: string[];\n selectedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n selectableBuiltinIds: Set<string>;\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): RuntimeAgentControllerState[] {\n const next = [...input.current];\n const existingById = new Map(\n next.map((registration, index) => [registration.agentId, index])\n );\n for (const requestedId of input.requested) {\n applySingleEnableSelection({\n existingById,\n next,\n requestedId,\n selectedLaunchContracts: input.selectedLaunchContracts,\n selectableBuiltinIds: input.selectableBuiltinIds,\n summary: input.summary,\n targetStateById: input.targetStateById,\n });\n }\n return sortAgentRegistrations(next);\n}\n\nfunction applySingleEnableSelection(input: {\n existingById: Map<string, number>;\n next: RuntimeAgentControllerState[];\n requestedId: string;\n selectedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n selectableBuiltinIds: Set<string>;\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): void {\n if (!input.selectableBuiltinIds.has(input.requestedId)) {\n const blockedState = input.targetStateById.get(input.requestedId) ?? null;\n input.summary.errors.push({\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: resolveEnableBlockedReason(blockedState),\n });\n return;\n }\n\n const targetState = input.targetStateById.get(input.requestedId);\n if (targetState?.targetKind !== \"builtin\") {\n input.summary.errors.push({\n agentId: input.requestedId,\n code: \"agents.config_write_failed\",\n reason: \"selectable built-in target missing from catalog\",\n });\n return;\n }\n\n const selectedLaunchContract =\n input.selectedLaunchContracts.get(targetState.agentId) ?? null;\n const resolvedLaunchContract =\n selectedLaunchContract ?? targetState.launchContract ?? undefined;\n if (targetState.launchStatus === \"needs_choice\" && !selectedLaunchContract) {\n input.summary.errors.push(\n createInstallChoiceError({\n agentId: targetState.agentId,\n command: \"enable\",\n installChoices: targetState.installChoices,\n reason:\n targetState.launchStatusDetail ??\n \"OpenMeld needs one install choice on this Mac before it can turn this on.\",\n })\n );\n return;\n }\n\n const existingIndex = input.existingById.get(targetState.agentId);\n if (existingIndex === undefined) {\n input.next.push(\n createRegistrationFromCatalogTarget({\n ...targetState,\n ...(resolvedLaunchContract\n ? { launchContract: resolvedLaunchContract }\n : {}),\n })\n );\n input.existingById.set(targetState.agentId, input.next.length - 1);\n input.summary.registered.push(targetState.agentId);\n return;\n }\n\n const existing = input.next[existingIndex];\n if (!existing) {\n input.summary.errors.push({\n agentId: targetState.agentId,\n code: \"agents.config_write_failed\",\n reason: \"registration index missing\",\n });\n return;\n }\n\n if (existing.enabled && selectedLaunchContract) {\n input.next[existingIndex] = applyTargetRuntimeDefaults({\n registration: {\n ...existing,\n launchContract: selectedLaunchContract,\n updatedAt: new Date().toISOString(),\n },\n targetState,\n });\n input.summary.reenabled.push(targetState.agentId);\n return;\n }\n\n if (existing.enabled) {\n input.summary.skipped.push({\n agentId: targetState.agentId,\n reason: \"already_enabled\",\n });\n return;\n }\n\n input.next[existingIndex] = applyTargetRuntimeDefaults({\n registration: {\n ...existing,\n enabled: true,\n ...(resolvedLaunchContract\n ? { launchContract: resolvedLaunchContract }\n : {}),\n updatedAt: new Date().toISOString(),\n },\n targetState,\n });\n input.summary.reenabled.push(targetState.agentId);\n}\n\nfunction applyTargetRuntimeDefaults(input: {\n registration: RuntimeAgentControllerState;\n targetState: EnableChoiceCandidate;\n}): RuntimeAgentControllerState {\n return {\n ...input.registration,\n ...(input.targetState.defaultStreamingMode\n ? { streamingMode: input.targetState.defaultStreamingMode }\n : {}),\n ...(input.targetState.defaultTransportMode\n ? { transportMode: input.targetState.defaultTransportMode }\n : {}),\n };\n}\n\nfunction resolveRepairCandidate(input: {\n allowReadyForInstallChange?: boolean;\n requestedId: string;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}):\n | {\n ok: true;\n state: BuiltinEnableChoiceCandidate;\n }\n | {\n error: RepairSummary[\"errors\"][number];\n ok: false;\n } {\n const state = input.targetStateById.get(input.requestedId) ?? null;\n if (!isBuiltinEnableChoiceCandidate(state)) {\n if (!state) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: \"unknown built-in target id\",\n },\n ok: false,\n };\n }\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: \"custom target is not runnable yet\",\n },\n ok: false,\n };\n }\n if (!state.registered) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.not_registered\",\n reason: \"agent is not registered\",\n },\n ok: false,\n };\n }\n if (\n input.allowReadyForInstallChange !== true &&\n !(\n state.launchStatus === \"needs_choice\" ||\n state.launchStatus === \"needs_repair\"\n )\n ) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"controller.launch.needs_repair\",\n reason: \"already available\",\n },\n ok: false,\n };\n }\n return {\n ok: true,\n state,\n };\n}\n\nexport async function runAgentsDisable(\n input: AgentsDisableInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter =\n input.json === true\n ? createSilentAgentsPresenter(runtime)\n : createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"disable\",\n });\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"disable\",\n explicitIds,\n explicitInstallId: null,\n });\n\n const registrations = await listAgentRegistrations();\n const displayNameById = new Map(\n registrations.map((registration) => [\n registration.agentId,\n registration.displayName,\n ])\n );\n const requested = input.all\n ? registrations.map((registration) => registration.agentId)\n : explicitIds;\n const summary: DisableSummary = {\n requested,\n disabled: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n await updateAgentRegistrations((current) => {\n const next = [...current];\n const byId = new Map(\n next.map((registration, index) => [registration.agentId, index])\n );\n for (const agentId of requested) {\n const index = byId.get(agentId);\n if (index === undefined) {\n summary.errors.push({\n agentId,\n code: \"agents.not_registered\",\n reason: \"agent is not registered\",\n });\n continue;\n }\n const registration = next[index];\n if (!registration) {\n summary.errors.push({\n agentId,\n code: \"agents.config_write_failed\",\n reason: \"registration index missing\",\n });\n continue;\n }\n if (!registration.enabled) {\n summary.skipped.push({\n agentId,\n reason: \"already_disabled\",\n });\n continue;\n }\n next[index] = {\n ...registration,\n enabled: false,\n updatedAt: new Date().toISOString(),\n };\n summary.disabled.push(agentId);\n }\n return sortAgentRegistrations(next);\n });\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.disable\",\n ...summary,\n });\n return;\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.disable.result\",\n payload: summary,\n });\n return;\n }\n\n emitDisableSummaryCardsForHuman({\n presenter,\n summary,\n displayNameById,\n });\n}\n\nexport async function runAgentsUnregister(\n input: AgentsUnregisterInput\n): Promise<void> {\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for unregister\"\n );\n }\n await runAgentsDisable({\n agent: [agentId],\n profile: input.profile,\n view: input.view,\n });\n}\n\nexport async function runAgentsConfig(input: AgentsConfigInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"config\",\n });\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for config\"\n );\n }\n\n const enabled = parseAgentEnabledOption(input.enabled);\n if (enabled === undefined) {\n throw new Error(\n \"agents.config_invalid: provide at least one option (--enabled)\"\n );\n }\n\n const updatedFields: string[] = [];\n const nextRegistrations = await updateAgentRegistrations((current) => {\n const index = current.findIndex((item) => item.agentId === agentId);\n if (index < 0) {\n throw new Error(\n `agents.not_registered: agent is not registered: ${agentId}`\n );\n }\n const next = [...current];\n const selected = next[index];\n if (!selected) {\n throw new Error(\"agents.config_write_failed: registration index missing\");\n }\n const existing = { ...selected };\n if (enabled !== undefined) {\n existing.enabled = enabled;\n updatedFields.push(\"enabled\");\n }\n existing.updatedAt = new Date().toISOString();\n next[index] = existing;\n return sortAgentRegistrations(next);\n });\n const effectiveConfig =\n nextRegistrations.find((item) => item.agentId === agentId) ?? null;\n\n if (!effectiveConfig) {\n throw new Error(\"agents.config_write_failed: config update returned empty\");\n }\n const payload = {\n agentId,\n updatedFields,\n effectiveConfig,\n };\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.config.result\",\n payload,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.config.result.card\",\n title: \"Agent Updated\",\n rows: [\n {\n label: \"Agent\",\n value: formatAgentMention(effectiveConfig.agentId),\n },\n {\n label: \"App\",\n value: effectiveConfig.displayName,\n },\n {\n label: \"Status\",\n value: enabled\n ? formatAgentsToneText(\"success\", \"Available for new @mentions\")\n : formatAgentsToneText(\"warning\", \"Turned off for new @mentions\"),\n },\n {\n label: \"Wake\",\n value: enabled\n ? `New ${formatAgentMention(effectiveConfig.agentId)} mentions can wake it`\n : `New ${formatAgentMention(effectiveConfig.agentId)} mentions stay off`,\n },\n ],\n minContentWidth: 34,\n });\n}\n\nexport async function runAgentsCustomList(\n input: AgentsBaseInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_list\",\n });\n const [targets, states] = await Promise.all([\n listAgentCustomTargets(),\n listAgentTargetStates(),\n ]);\n const customStateById = new Map(\n states\n .filter((state) => state.targetKind === \"custom\")\n .map((state) => [state.agentId, state])\n );\n const payloadTargets = targets.map((target) => {\n const state = customStateById.get(target.id);\n return {\n id: target.id,\n name: target.name,\n dir: target.dir,\n registered: state?.registered ?? false,\n enabled: state?.enabled ?? false,\n };\n });\n const payload = {\n targets: payloadTargets,\n count: payloadTargets.length,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.list.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.list\",\n title: \"Custom agents\",\n });\n if (payloadTargets.length === 0) {\n presenter.line({\n code: \"agents.custom.list.empty\",\n text: \"No custom agents configured.\",\n });\n presenter.line({\n code: \"agents.custom.list.hint\",\n text: formatInlineOpenMeldCliCommands(\n \"Tip: run `openmeld agents custom add --name <name> --dir <dir>`.\"\n ),\n });\n return;\n }\n presenter.line({\n code: \"agents.custom.list.subtitle\",\n text: `Configured custom agents: ${payloadTargets.length}`,\n });\n for (const target of payloadTargets) {\n presenter.line({\n code: \"agents.custom.list.item\",\n text: `- ${target.name} (${target.id}) • dir=${target.dir} • registered=${target.registered ? \"true\" : \"false\"} • enabled=${target.enabled ? \"true\" : \"false\"}`,\n });\n }\n}\n\nexport async function runAgentsCustomAdd(\n input: AgentsCustomAddInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_add\",\n });\n const name = normalizeOptionalString(input.name);\n const dir = normalizeOptionalString(input.dir);\n if (!(name && dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: provide --name <name> and --dir <dir>\"\n );\n }\n if (!isAbsolute(dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: --dir must be an absolute path\"\n );\n }\n const id = normalizeOptionalString(input.id) ?? undefined;\n const target = await addAgentCustomTarget({\n name,\n dir,\n ...(id ? { id } : {}),\n });\n const payload = {\n target,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.add.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.add\",\n title: \"Custom Agent Added\",\n });\n presenter.line({\n code: \"agents.custom.add.result\",\n text: `${target.name} (${target.id}) -> ${target.dir}`,\n });\n}\n\nexport async function runAgentsCustomUpdate(\n input: AgentsCustomUpdateInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_update\",\n });\n const id = normalizeAgentId(input.id ?? \"\");\n if (!id) {\n throw new Error(\"agents.custom.invalid_argument: provide --id <id>\");\n }\n\n const name = normalizeOptionalString(input.name) ?? undefined;\n const dir = normalizeOptionalString(input.dir) ?? undefined;\n if (name === undefined && dir === undefined) {\n throw new Error(\n \"agents.custom.invalid_argument: provide at least one option (--name/--dir)\"\n );\n }\n if (dir && !isAbsolute(dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: --dir must be an absolute path\"\n );\n }\n const updated = await updateAgentCustomTarget({\n id,\n ...(name ? { name } : {}),\n ...(dir ? { dir } : {}),\n });\n const payload = {\n target: updated.target,\n updatedFields: updated.updatedFields,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.update.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.update\",\n title: \"Custom Agent Updated\",\n });\n const fields =\n updated.updatedFields.length > 0\n ? updated.updatedFields.join(\", \")\n : \"no field changed\";\n presenter.line({\n code: \"agents.custom.update.result\",\n text: `${updated.target.id}: ${fields}`,\n });\n}\n\nexport async function runAgentsCustomRemove(\n input: AgentsCustomRemoveInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_remove\",\n });\n const id = normalizeAgentId(input.id ?? \"\");\n if (!id) {\n throw new Error(\"agents.custom.invalid_argument: provide --id <id>\");\n }\n\n const registrations = await listAgentRegistrations();\n const inUse = registrations.some(\n (registration) => registration.agentId === id\n );\n if (inUse) {\n throw new Error(\n `agents.custom.in_use: target is currently registered: ${id}`\n );\n }\n\n const removed = await removeAgentCustomTarget({\n id,\n });\n const payload = {\n targetId: id,\n removed,\n installsPolicy: \"kept\",\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.remove.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.remove\",\n title: \"Custom Agent Removed\",\n });\n presenter.line({\n code: \"agents.custom.remove.result\",\n text: `${removed.name} (${removed.id}) removed`,\n });\n presenter.line({\n code: \"agents.custom.remove.note\",\n text: formatInlineOpenMeldCliCommands(\n \"Installs records are kept; cleanup via `openmeld skills uninstall`.\"\n ),\n });\n}\n\nfunction buildAgentRegistrationAgentView(\n state: RegisteredAgentTargetState\n): RuntimeAgentControllerState & {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n effectiveConfig: ReturnType<typeof buildEffectiveConfig>;\n effectiveTransportMode: RuntimeAgentTransportMode;\n lifecycleStatus: AgentTargetState[\"lifecycleStatus\"];\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportModeSource: AgentTransportModeSource;\n} {\n const transportProjection = resolveTransportModeProjection(state);\n return {\n ...state.registration,\n lifecycleStatus: state.lifecycleStatus,\n configuredTransportMode: transportProjection.configuredTransportMode,\n configuredTransportModeStatus:\n transportProjection.configuredTransportModeStatus,\n defaultTransportMode: transportProjection.defaultTransportMode,\n effectiveConfig: buildEffectiveConfig(state),\n effectiveTransportMode: transportProjection.effectiveTransportMode,\n supportedTransportModes: transportProjection.supportedTransportModes,\n transportModeSource: transportProjection.transportModeSource,\n };\n}\n\nfunction buildEffectiveConfig(state: RegisteredAgentTargetState): {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n enabled: boolean;\n effectiveTransportMode: RuntimeAgentTransportMode;\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportMode: RuntimeAgentTransportMode;\n transportModeSource: AgentTransportModeSource;\n} {\n const transportProjection = resolveTransportModeProjection(state);\n return {\n configuredTransportMode: transportProjection.configuredTransportMode,\n configuredTransportModeStatus:\n transportProjection.configuredTransportModeStatus,\n defaultTransportMode: transportProjection.defaultTransportMode,\n enabled: state.registration.enabled,\n effectiveTransportMode: transportProjection.effectiveTransportMode,\n supportedTransportModes: transportProjection.supportedTransportModes,\n transportMode: transportProjection.effectiveTransportMode,\n transportModeSource: transportProjection.transportModeSource,\n };\n}\n\nfunction emitAgentsOverviewIfAgent(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: \"human\" | \"agent\";\n command:\n | \"menu\"\n | \"manage\"\n | \"detect\"\n | \"list\"\n | \"show\"\n | \"enable\"\n | \"repair\"\n | \"disable\"\n | \"config\"\n | \"custom_list\"\n | \"custom_add\"\n | \"custom_update\"\n | \"custom_remove\";\n handled?: boolean;\n}): void {\n if (input.resolvedView !== \"agent\" || input.handled) {\n return;\n }\n emitAgentsAgentOverview({\n presenter: input.presenter,\n command: input.command,\n });\n}\n\nfunction resolveTransportModeForDisplay(\n state: RegisteredAgentTargetState\n): string {\n return formatTransportModeDisplay(\n resolveTransportModeProjection(state).effectiveTransportMode\n );\n}\n\nfunction resolveTransportModeProjection(state: RegisteredAgentTargetState): {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n effectiveTransportMode: RuntimeAgentTransportMode;\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportModeSource: AgentTransportModeSource;\n} {\n const supportedTransportModes = state.transportModes.map(\n (transportMode) => transportMode.mode\n );\n const configuredTransportMode = state.registration.transportMode ?? null;\n let configuredTransportModeStatus: AgentTransportModeStatus;\n if (configuredTransportMode === null) {\n configuredTransportModeStatus = \"missing\";\n } else if (\n supportedTransportModes.length === 0 ||\n supportedTransportModes.includes(configuredTransportMode)\n ) {\n configuredTransportModeStatus = \"supported\";\n } else {\n configuredTransportModeStatus = \"unsupported\";\n }\n if (\n configuredTransportModeStatus === \"supported\" &&\n configuredTransportMode\n ) {\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: state.defaultTransportMode ?? null,\n effectiveTransportMode: configuredTransportMode,\n supportedTransportModes,\n transportModeSource: \"registration\",\n };\n }\n const registryTransportMode =\n state.defaultTransportMode ?? supportedTransportModes[0] ?? null;\n if (registryTransportMode) {\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: state.defaultTransportMode ?? null,\n effectiveTransportMode: registryTransportMode,\n supportedTransportModes,\n transportModeSource: \"registry_default\",\n };\n }\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: null,\n effectiveTransportMode: DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,\n supportedTransportModes,\n transportModeSource: \"global_default\",\n };\n}\n\nasync function emitAgentsConfigParseFallbackSignal(input: {\n presenter: ReturnType<typeof createPresenter>;\n view: \"human\" | \"agent\";\n}): Promise<void> {\n const health = await readAgentRuntimeConfigHealth();\n if (!health.parseFallback) {\n return;\n }\n const reason = health.reason ?? \"unknown\";\n const data = {\n reason,\n strategy: \"fallback_to_empty_config\",\n };\n if (input.view === \"agent\") {\n input.presenter.line({\n code: \"agents.config_parse_fallback\",\n text: `runtime config parse fallback applied (${reason})`,\n data,\n });\n return;\n }\n input.presenter.line({\n code: \"agents.config_parse_fallback\",\n text: `warning: runtime config parse fallback applied (${reason})`,\n data,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agents-B0LFMdki.js","names":["normalizeOptionalText","exhaustiveCheck"],"sources":["../src/system/local-service-participation-gate.ts","../src/space/web-url.ts","../src/runtime/retry-delay.ts","../src/agents/agent-overview.ts","../src/ui/visible-window.ts","../src/ui/search-select.ts","../src/ui/transport-mode-display.ts","../src/commands/agents-text.ts","../src/commands/agents-cards.ts","../src/commands/agents-descriptions.ts","../src/commands/agents-summary-cards.ts","../src/commands/agents.ts"],"sourcesContent":["import type { LocalMachineIssue } from \"@openmeld/schemas\";\nimport {\n type DaemonServiceProgressReporter,\n runDaemonBackgroundStartForDecision,\n runDaemonInstall,\n runDaemonReinstall,\n} from \"../commands/service\";\nimport {\n buildDaemonBackgroundStartFailure,\n buildSystemServiceStartupFailureReportFromVerdict,\n type SystemServiceStartupFailureVerdict,\n} from \"../commands/service-start-failure\";\nimport { normalizeGatewayBaseUrlOrNull } from \"../config/base-url\";\nimport { readDaemonServiceContract } from \"../config/daemon-service-contract\";\nimport { toErrorMessage } from \"../local-service/core/logger\";\nimport { DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES } from \"../local-service/lifecycle/daemon-service-anomaly-groups\";\nimport type { DaemonServiceAnomalyCode } from \"../local-service/lifecycle/daemon-service-inventory\";\nimport type { LocalServiceDemand } from \"../local-service/lifecycle/local-service-demand\";\nimport { waitForOpenMeldToolsUpdateCompletion } from \"../local-service/maintenance/openmeld-tools-update-join\";\nimport type { Presenter } from \"../runtime/presenter/types\";\nimport {\n formatDaemonInstallFailedMessage,\n runDaemonInstallDecisionPrompt,\n} from \"../system/local-service-install-attention\";\nimport {\n buildDaemonStartDeferredCard,\n buildDaemonStartNeedsAttentionCard,\n runDaemonStartDecisionPrompt,\n} from \"../system/local-service-start-decision\";\nimport { renderInfoCard } from \"../ui/info-card\";\n\nexport type DaemonServiceParticipationIntent =\n | \"start\"\n | \"space_join\"\n | \"space_create_join\"\n | \"space_add_members\";\n\nimport {\n type DaemonServiceParticipationStatus,\n resolveDaemonServiceParticipationStatus,\n} from \"../local-service/status/service-participation-status\";\n\nexport type DaemonServiceParticipationGateResult = {\n errorMessage?: string;\n localMachineIssue?: LocalMachineIssue;\n status: \"aligned\" | \"declined\" | \"cancelled\" | \"needs_attention\";\n};\n\ntype DaemonServiceAccountAlignmentIssue = {\n reasonCode: string;\n summary: string;\n};\n\nexport function shouldRequireDaemonServiceParticipation(\n localDemand?: LocalServiceDemand | null\n): boolean {\n return localDemand?.decision === \"keep_running\";\n}\n\nexport async function runDaemonServiceParticipationGate(input: {\n intent: DaemonServiceParticipationIntent;\n presenter: Presenter;\n resolvedView: \"human\" | \"agent\";\n allowPrompt: boolean;\n openMeldProfileId?: string;\n autoRepair?: boolean;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n localDemand?: LocalServiceDemand | null;\n forcePrompt?: boolean;\n forceRefresh?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n}): Promise<DaemonServiceParticipationGateResult> {\n // A newer auth session alone is not a mismatch: re-logging into the same\n // account must not reinstall a healthy service. Account drift is detected\n // by the explicit alignment check below (owner/profile/gateway expectations\n // from the caller), never by comparing timestamps.\n const forceRefresh = input.forceRefresh === true;\n const gateInput = {\n ...input,\n forceRefresh,\n };\n\n if (!shouldRunDaemonServiceParticipationGate(gateInput)) {\n return { status: \"aligned\" };\n }\n\n const initialStatus = await resolveDaemonServiceParticipationStatus();\n if (isReadyAdvisoryServiceDrift(initialStatus)) {\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n scheduleBackgroundUpdate: hasServiceVersionAdvisory(initialStatus),\n });\n }\n }\n if (isRunningAdvisoryOnlyServiceDrift(initialStatus)) {\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(input);\n if (!accountIssue) {\n return { status: \"aligned\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n accountIssue,\n });\n }\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix,\n summary: accountIssue.summary,\n });\n input.presenter.line({\n code: `${codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n if (forceRefresh && initialStatus.kind === \"ready\") {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix: resolveDaemonServiceParticipationCodePrefix(input.intent),\n expectedVersion: initialStatus.expectedVersion,\n });\n }\n if (initialStatus.kind === \"ready\") {\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(input);\n if (!accountIssue) {\n return { status: \"aligned\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(\n input.intent\n );\n if (input.autoRepair === true) {\n return await runDaemonServiceParticipationRefresh({\n input,\n codePrefix,\n expectedVersion: initialStatus.expectedVersion,\n accountIssue,\n });\n }\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix,\n summary: accountIssue.summary,\n });\n input.presenter.line({\n code: `${codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n const codePrefix = resolveDaemonServiceParticipationCodePrefix(input.intent);\n const installStageResult = await runDaemonServiceParticipationInstallStage({\n input,\n codePrefix,\n status: initialStatus,\n });\n if (installStageResult.result) {\n return installStageResult.result;\n }\n\n return await runDaemonServiceParticipationActionStage({\n input,\n codePrefix,\n status: installStageResult.status,\n });\n}\n\nfunction isRunningAdvisoryOnlyServiceDrift(\n status: DaemonServiceParticipationStatus\n): status is Extract<\n DaemonServiceParticipationStatus,\n { kind: \"needs_repair\" }\n> {\n return (\n status.kind === \"needs_repair\" &&\n status.runtimeStatus === \"running\" &&\n status.anomalyCodes.length > 0 &&\n status.anomalyCodes.every((code) =>\n DAEMON_SERVICE_WAKEABILITY_ADVISORY_ANOMALIES.has(\n code as DaemonServiceAnomalyCode\n )\n )\n );\n}\n\nfunction isReadyAdvisoryServiceDrift(\n status: DaemonServiceParticipationStatus\n): status is Extract<DaemonServiceParticipationStatus, { kind: \"ready\" }> {\n return (\n status.kind === \"ready\" &&\n Array.isArray(status.advisoryAnomalyCodes) &&\n status.advisoryAnomalyCodes.length > 0\n );\n}\n\nfunction hasServiceVersionAdvisory(\n status: Extract<DaemonServiceParticipationStatus, { kind: \"ready\" }>\n): boolean {\n return Boolean(\n status.advisoryAnomalyCodes?.some(\n (code) => code === \"version_outdated\" || code === \"bundle_version_drift\"\n )\n );\n}\n\nfunction shouldRunDaemonServiceParticipationGate(input: {\n resolvedView: \"human\" | \"agent\";\n allowPrompt: boolean;\n autoRepair?: boolean;\n forceRefresh?: boolean;\n localDemand?: LocalServiceDemand | null;\n forcePrompt?: boolean;\n}): boolean {\n const canActWithoutPrompt =\n input.autoRepair === true &&\n (input.resolvedView === \"human\" ||\n (input.resolvedView === \"agent\" &&\n (input.forcePrompt === true || input.forceRefresh === true)));\n const canPrompt =\n input.resolvedView === \"human\" &&\n (input.allowPrompt || input.autoRepair === true);\n return (\n (canPrompt || canActWithoutPrompt) &&\n (input.forcePrompt === true ||\n input.forceRefresh === true ||\n shouldRequireDaemonServiceParticipation(input.localDemand))\n );\n}\n\nasync function runDaemonServiceParticipationInstallStage(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n intent: DaemonServiceParticipationIntent;\n autoRepair?: boolean;\n presenter: Presenter;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<{\n status: DaemonServiceParticipationStatus;\n result?: DaemonServiceParticipationGateResult;\n}> {\n if (input.status.kind !== \"missing\" && input.status.kind !== \"outdated\") {\n return {\n status: input.status,\n };\n }\n const installableStatus = input.status;\n\n if (input.input.autoRepair === true) {\n try {\n await runDaemonServiceParticipationInstallAction({\n input: input.input,\n status: installableStatus,\n });\n } catch {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary: formatDaemonInstallFailedMessage(installableStatus.kind),\n });\n return {\n status: installableStatus,\n result: { status: \"needs_attention\" },\n };\n }\n\n return await resolveDaemonServiceParticipationStatusAfterInstall(input);\n }\n\n const installResult = await runDaemonInstallDecisionPrompt({\n kind: installableStatus.kind,\n ...(installableStatus.kind === \"outdated\"\n ? {\n installedVersion: installableStatus.installedVersion,\n }\n : {}),\n expectedVersion: installableStatus.expectedVersion,\n emitLine: (text) => {\n input.input.presenter.line({\n code: `${input.codePrefix}.install`,\n text,\n });\n },\n installService: async () => {\n await runDaemonServiceParticipationInstallAction({\n input: input.input,\n status: installableStatus,\n });\n },\n });\n\n if (installResult === \"cancelled\") {\n return {\n status: installableStatus,\n result: { status: \"cancelled\" },\n };\n }\n if (installResult === \"failed\") {\n return {\n status: installableStatus,\n result: { status: \"needs_attention\" },\n };\n }\n if (\n installResult === \"not_now\" ||\n !shouldStartAfterDaemonInstall(input.input.intent)\n ) {\n return {\n status: installableStatus,\n result: { status: \"declined\" },\n };\n }\n\n return await resolveDaemonServiceParticipationStatusAfterInstall(input);\n}\n\nasync function runDaemonServiceParticipationInstallAction(input: {\n input: {\n openMeldProfileId?: string;\n gatewayUrl?: string;\n intent: DaemonServiceParticipationIntent;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n view?: string;\n };\n status: Extract<\n DaemonServiceParticipationStatus,\n { kind: \"missing\" | \"outdated\" }\n >;\n}): Promise<void> {\n if (input.status.kind === \"outdated\") {\n input.input.serviceProgress?.detail({\n code: \"daemon.participation.refresh.updating\",\n text: \"Updating OpenMeld Service...\",\n });\n await runDaemonServiceSafeRefresh({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n suppressHumanResultCard: input.input.suppressRefreshHumanResultCard,\n view: input.input.view,\n });\n return;\n }\n\n await runDaemonInstall(\n {\n ...(input.input.gatewayUrl ? { gatewayUrl: input.input.gatewayUrl } : {}),\n ...(input.input.openMeldProfileId\n ? { profile: input.input.openMeldProfileId }\n : {}),\n view: input.input.view,\n },\n {\n suppressHumanOutput: shouldSuppressHumanInstallOutput(input.input.intent),\n ...(input.input.serviceProgress\n ? { serviceProgress: input.input.serviceProgress }\n : {}),\n }\n );\n}\n\nasync function resolveDaemonServiceParticipationStatusAfterInstall(input: {\n input: {\n presenter: Presenter;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<{\n status: DaemonServiceParticipationStatus;\n result?: DaemonServiceParticipationGateResult;\n}> {\n const refreshedStatus = await resolveDaemonServiceParticipationStatus();\n if (refreshedStatus.kind === \"ready\") {\n return {\n status: refreshedStatus,\n result: { status: \"aligned\" },\n };\n }\n if (\n refreshedStatus.kind === \"missing\" ||\n refreshedStatus.kind === \"outdated\"\n ) {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary:\n refreshedStatus.kind === \"missing\"\n ? formatDaemonInstallFailedMessage(\"missing\")\n : formatDaemonInstallFailedMessage(\"outdated\"),\n });\n return {\n status: refreshedStatus,\n result: { status: \"needs_attention\" },\n };\n }\n\n return {\n status: refreshedStatus,\n };\n}\n\nasync function runDaemonServiceSafeRefresh(input: {\n openMeldProfileId?: string;\n gatewayUrl?: string;\n suppressHumanResultCard?: boolean;\n view?: string;\n forceReinstall?: boolean;\n scheduleBackgroundUpdate?: boolean;\n}): Promise<Awaited<ReturnType<typeof runDaemonReinstall>>> {\n return await runDaemonReinstall(\n {\n agentOverviewHandled: true,\n ...(input.scheduleBackgroundUpdate\n ? { displayAction: \"update\" as const }\n : {}),\n ...(input.gatewayUrl ? { gatewayUrl: input.gatewayUrl } : {}),\n ...(input.openMeldProfileId ? { profile: input.openMeldProfileId } : {}),\n view: input.view,\n },\n {\n skipConfirm: true,\n startAfterInstallMode: \"always\",\n suppressAgentOverview: true,\n ...(input.suppressHumanResultCard !== undefined\n ? { suppressHumanResultCard: input.suppressHumanResultCard }\n : {}),\n suppressInstallOutput: true,\n ...(input.forceReinstall === true ? { forceReinstall: true } : {}),\n }\n );\n}\n\nasync function runDaemonBackgroundStartForParticipation(input: {\n openMeldProfileId?: string | undefined;\n gatewayUrl?: string | undefined;\n serviceProgress?: DaemonServiceProgressReporter | undefined;\n suppressStartSpinner?: boolean | undefined;\n view?: string | undefined;\n}): Promise<Awaited<ReturnType<typeof runDaemonBackgroundStartForDecision>>> {\n return await runDaemonBackgroundStartForDecision({\n gatewayUrl: input.gatewayUrl,\n ...(input.openMeldProfileId ? { profile: input.openMeldProfileId } : {}),\n ...(input.serviceProgress\n ? { serviceProgress: input.serviceProgress }\n : {}),\n ...(input.suppressStartSpinner === true\n ? { suppressStartSpinner: true }\n : {}),\n view: input.view,\n });\n}\n\nasync function runDaemonServiceParticipationActionStage(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n autoRepair?: boolean;\n presenter: Presenter;\n gatewayUrl?: string;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n forceRefresh?: boolean;\n };\n codePrefix: string;\n status: DaemonServiceParticipationStatus;\n}): Promise<DaemonServiceParticipationGateResult> {\n if (input.status.kind === \"needs_repair\") {\n return await runDaemonServiceParticipationRefresh({\n input: input.input,\n codePrefix: input.codePrefix,\n expectedVersion: input.status.expectedVersion,\n });\n }\n if (input.status.kind !== \"not_running\") {\n return { status: \"aligned\" };\n }\n\n if (input.input.autoRepair === true) {\n const startResult = await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n });\n return await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.status.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n }\n\n const startResult = await runDaemonStartDecisionPrompt({\n startService: async () =>\n await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n }),\n });\n\n return await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.status.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n}\n\nasync function runDaemonServiceParticipationRefresh(input: {\n input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n presenter: Presenter;\n forceRefresh?: boolean;\n serviceProgress?: DaemonServiceProgressReporter;\n suppressRefreshHumanResultCard?: boolean;\n suppressStartSpinner?: boolean;\n view?: string;\n };\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n codePrefix: string;\n expectedVersion: string;\n scheduleBackgroundUpdate?: boolean;\n}): Promise<DaemonServiceParticipationGateResult> {\n emitServiceAccountRefreshNotice(input);\n try {\n input.input.serviceProgress?.detail({\n code: \"daemon.participation.refresh.updating\",\n text: \"Updating OpenMeld Service...\",\n });\n const refreshOutcome = await runDaemonServiceSafeRefresh({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n suppressHumanResultCard: input.input.suppressRefreshHumanResultCard,\n view: input.input.view,\n forceReinstall: shouldForceDaemonServiceReinstall({\n accountIssue: input.accountIssue,\n forceRefresh: input.input.forceRefresh,\n }),\n ...(input.scheduleBackgroundUpdate === undefined\n ? {}\n : { scheduleBackgroundUpdate: input.scheduleBackgroundUpdate }),\n });\n if (isCancelledDaemonServiceRefresh(refreshOutcome)) {\n return { status: \"cancelled\" };\n }\n if (isStoppedDaemonServiceRefresh(refreshOutcome)) {\n const startResult = await runDaemonBackgroundStartForParticipation({\n openMeldProfileId: input.input.openMeldProfileId,\n gatewayUrl: input.input.gatewayUrl,\n serviceProgress: input.input.serviceProgress,\n suppressStartSpinner: input.input.suppressStartSpinner,\n view: input.input.view,\n });\n const startMapped = await mapDaemonBackgroundStartResult(startResult, {\n expectedVersion: input.expectedVersion,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n if (startMapped.status !== \"aligned\") {\n return startMapped;\n }\n const accountIssueAfterStart =\n await resolveDaemonServiceAccountAlignmentIssue(input.input);\n if (accountIssueAfterStart) {\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary: accountIssueAfterStart.summary,\n });\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_failed`,\n text: accountIssueAfterStart.summary,\n data: { reasonCode: accountIssueAfterStart.reasonCode },\n });\n return { status: \"needs_attention\" };\n }\n return startMapped;\n }\n const scheduled = await completeScheduledServiceRefresh({\n outcome: refreshOutcome,\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n });\n // The reinstall started the service in silent output mode, so its detailed\n // startup-failure card was discarded. If the failure carried a launchd\n // job-state verdict (never-spawned / crash-loop), surface that detailed card\n // here instead of the generic \"was repaired, but not running yet\" summary.\n // Presentation-only: the verdict never re-enters the alignment decision.\n if (\n !refreshOutcome.ok &&\n (refreshOutcome.result === \"start_failed\" ||\n refreshOutcome.result === \"start_blocked\") &&\n (refreshOutcome.startFailureVerdict?.jobDiagnostics ||\n refreshOutcome.startFailureVerdict?.localMachineIssue)\n ) {\n return renderRefreshStartFailure({\n codePrefix: input.codePrefix,\n presenter: input.input.presenter,\n verdict: refreshOutcome.startFailureVerdict,\n });\n }\n if (\n !(\n scheduled ||\n (refreshOutcome.ok &&\n (refreshOutcome.result === \"already_healthy\" ||\n refreshOutcome.result === \"completed\") &&\n refreshOutcome.serviceState === \"running\")\n )\n ) {\n throw new Error(\n `OpenMeld Service refresh did not complete: ${refreshOutcome.result}`\n );\n }\n } catch (error) {\n const summary =\n \"OpenMeld Service was repaired, but it is not running yet. \" +\n \"Local Wake work will keep waiting until OpenMeld Service starts. \" +\n \"Run `openmeld service start`.\";\n renderRefreshFailureIfVisible({\n codePrefix: input.codePrefix,\n presenter: input.input.presenter,\n summary,\n suppressed: input.input.suppressRefreshHumanResultCard === true,\n });\n return {\n errorMessage: toErrorMessage(error),\n status: \"needs_attention\",\n };\n }\n\n const refreshedStatus = await resolveDaemonServiceParticipationStatus({\n expectedVersion: input.expectedVersion,\n });\n const accountIssue = await resolveDaemonServiceAccountAlignmentIssue(\n input.input\n );\n if (refreshedStatus.kind === \"ready\" && !accountIssue) {\n return { status: \"aligned\" };\n }\n renderDaemonStartNeedsAttention({\n presenter: input.input.presenter,\n codePrefix: input.codePrefix,\n summary:\n accountIssue?.summary ??\n summarizeDaemonServiceParticipationStatus(refreshedStatus),\n });\n if (accountIssue) {\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_failed`,\n text: accountIssue.summary,\n data: { reasonCode: accountIssue.reasonCode },\n });\n }\n return { status: \"needs_attention\" };\n}\n\nfunction emitServiceAccountRefreshNotice(input: {\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n codePrefix: string;\n input: { presenter: Presenter };\n}): void {\n if (!input.accountIssue) {\n return;\n }\n input.input.presenter.line({\n code: `${input.codePrefix}.account_alignment_refresh`,\n text: input.accountIssue.summary,\n data: { reasonCode: input.accountIssue.reasonCode },\n });\n}\n\nasync function completeScheduledServiceRefresh(input: {\n outcome: Awaited<ReturnType<typeof runDaemonReinstall>>;\n presenter: Presenter;\n codePrefix: string;\n}): Promise<boolean> {\n if (!(input.outcome.ok && input.outcome.result === \"scheduled\")) {\n return false;\n }\n await waitForOpenMeldToolsUpdateCompletion({\n operationId: input.outcome.jobId,\n onWaiting: (operation) => {\n input.presenter.line({\n code: `${input.codePrefix}.update.waiting`,\n text: \"OpenMeld is finishing its background update. This command will continue automatically when it finishes.\",\n data: {\n operationId: operation.operationId,\n phase: operation.phase,\n targetVersion: operation.targetVersion,\n },\n });\n },\n });\n return true;\n}\n\nfunction renderRefreshFailureIfVisible(input: {\n codePrefix: string;\n presenter: Presenter;\n summary: string;\n suppressed: boolean;\n}): void {\n if (input.suppressed) {\n return;\n }\n renderDaemonStartNeedsAttention({\n autoRepairAttempted: true,\n codePrefix: input.codePrefix,\n presenter: input.presenter,\n summary: input.summary,\n });\n}\n\nfunction shouldForceDaemonServiceReinstall(input: {\n accountIssue?: DaemonServiceAccountAlignmentIssue;\n forceRefresh?: boolean;\n}): boolean {\n return input.accountIssue !== undefined || input.forceRefresh === true;\n}\n\nfunction renderRefreshStartFailure(input: {\n codePrefix: string;\n presenter: Presenter;\n verdict: SystemServiceStartupFailureVerdict;\n}): DaemonServiceParticipationGateResult {\n const report = buildSystemServiceStartupFailureReportFromVerdict(\n input.verdict,\n { autoRepairAttempted: true }\n );\n renderInfoCard({\n presenter: input.presenter,\n title: report.title,\n codePrefix: `${input.codePrefix}.failed`,\n rows: report.rows,\n });\n const { outcome: _outcome, ...failure } = buildDaemonBackgroundStartFailure(\n input.verdict\n );\n return {\n ...failure,\n status: \"needs_attention\",\n };\n}\n\nasync function resolveDaemonServiceAccountAlignmentIssue(input: {\n openMeldProfileId?: string;\n expectedOwnerUserId?: string;\n gatewayUrl?: string;\n}): Promise<DaemonServiceAccountAlignmentIssue | null> {\n const expectedProfileId = normalizeOptionalText(input.openMeldProfileId);\n const expectedOwnerUserId = normalizeOptionalText(input.expectedOwnerUserId);\n const expectedGatewayUrl = normalizeGatewayBaseUrlOrNull(input.gatewayUrl);\n if (!(expectedProfileId || expectedOwnerUserId || expectedGatewayUrl)) {\n return null;\n }\n\n const contract = await readDaemonServiceContract().catch(() => null);\n if (!contract) {\n return {\n reasonCode: \"service_contract.missing\",\n summary:\n \"OpenMeld Service is running, but this setup could not verify the service account contract for this computer.\",\n };\n }\n\n const contractOwnerUserId = normalizeOptionalText(contract.ownerUserId);\n if (\n expectedOwnerUserId &&\n contractOwnerUserId &&\n contractOwnerUserId !== expectedOwnerUserId\n ) {\n return {\n reasonCode: \"service_contract.owner_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n if (\n expectedProfileId &&\n contract.profileId &&\n contract.profileId !== expectedProfileId\n ) {\n return {\n reasonCode: \"service_contract.profile_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n if (\n expectedOwnerUserId &&\n expectedProfileId &&\n !(contractOwnerUserId || contract.profileId)\n ) {\n return {\n reasonCode: \"service_contract.owner_unverified\",\n summary:\n \"OpenMeld Service is running, but this setup could not verify that OpenMeld Service belongs to the current Web account. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n const contractGatewayUrl = normalizeGatewayBaseUrlOrNull(contract.gatewayUrl);\n if (\n expectedGatewayUrl &&\n contractGatewayUrl &&\n contractGatewayUrl !== expectedGatewayUrl\n ) {\n return {\n reasonCode: \"service_contract.gateway_mismatch\",\n summary:\n \"OpenMeld Service is running for a different OpenMeld gateway. This setup will reconnect OpenMeld Service to the current Web account.\",\n };\n }\n\n return null;\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction resolveDaemonServiceParticipationCodePrefix(\n intent: DaemonServiceParticipationIntent\n): string {\n switch (intent) {\n case \"start\":\n return \"start.service\";\n case \"space_create_join\":\n return \"space.create_join.service\";\n case \"space_join\":\n return \"space.join.service\";\n case \"space_add_members\":\n return \"space.add_members.service\";\n default:\n throw new Error(`Unknown local service participation intent: ${intent}`);\n }\n}\n\nfunction isCancelledDaemonServiceRefresh(\n outcome: Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>\n): boolean {\n return !outcome.ok && outcome.result === \"cancelled\";\n}\n\nfunction isStoppedDaemonServiceRefresh(\n outcome: Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>\n): outcome is Extract<\n Awaited<ReturnType<typeof runDaemonServiceSafeRefresh>>,\n { ok: true; serviceState: \"stopped\" }\n> {\n return (\n outcome.ok &&\n (outcome.result === \"already_healthy\" ||\n outcome.result === \"completed\" ||\n outcome.result === \"stopped_safe\") &&\n outcome.serviceState === \"stopped\"\n );\n}\n\nfunction shouldStartAfterDaemonInstall(\n _intent: DaemonServiceParticipationIntent\n): boolean {\n return true;\n}\n\nfunction shouldSuppressHumanInstallOutput(\n intent: DaemonServiceParticipationIntent\n): boolean {\n return intent !== \"start\";\n}\n\nasync function mapDaemonBackgroundStartResult(\n result: Awaited<ReturnType<typeof runDaemonStartDecisionPrompt>>,\n input: {\n expectedVersion: string;\n presenter: Presenter;\n codePrefix: string;\n }\n): Promise<DaemonServiceParticipationGateResult> {\n if (typeof result === \"object\") {\n return {\n status: \"needs_attention\",\n errorMessage: result.errorMessage,\n ...(result.localMachineIssue\n ? { localMachineIssue: result.localMachineIssue }\n : {}),\n };\n }\n if (result === \"started\") {\n const refreshedStatus = await resolveDaemonServiceParticipationStatus({\n expectedVersion: input.expectedVersion,\n });\n if (refreshedStatus.kind === \"ready\") {\n return { status: \"aligned\" };\n }\n\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n summary: summarizeDaemonServiceParticipationStatus(refreshedStatus),\n });\n return { status: \"needs_attention\" };\n }\n if (result === \"deferred_with_card\") {\n return { status: \"declined\" };\n }\n if (result === \"cancelled\") {\n return { status: \"cancelled\" };\n }\n if (result === \"not_now\") {\n renderDaemonStartDeferred({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n });\n return { status: \"declined\" };\n }\n if (result === \"failed\") {\n renderDaemonStartNeedsAttention({\n presenter: input.presenter,\n codePrefix: input.codePrefix,\n summary: \"OpenMeld could not finish starting OpenMeld Service.\",\n });\n return { status: \"needs_attention\" };\n }\n return { status: \"needs_attention\" };\n}\n\nfunction summarizeDaemonServiceParticipationStatus(\n status: DaemonServiceParticipationStatus\n): string {\n switch (status.kind) {\n case \"missing\":\n return formatDaemonInstallFailedMessage(\"missing\");\n case \"outdated\":\n return formatDaemonInstallFailedMessage(\"outdated\");\n case \"needs_repair\":\n return status.detail;\n case \"not_running\":\n return \"OpenMeld could not finish starting OpenMeld Service.\";\n case \"ready\":\n return \"OpenMeld Service is running.\";\n default:\n return \"OpenMeld Service still needs attention on this device.\";\n }\n}\n\nfunction renderDaemonStartDeferred(input: {\n presenter: Presenter;\n codePrefix: string;\n}): void {\n const card = buildDaemonStartDeferredCard();\n renderInfoCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: `${input.codePrefix}.deferred`,\n rows: card.rows,\n });\n}\n\nfunction renderDaemonStartNeedsAttention(input: {\n presenter: Presenter;\n codePrefix: string;\n summary: string;\n nextStep?: string;\n detail?: string;\n autoRepairAttempted?: boolean;\n}): void {\n const card = buildDaemonStartNeedsAttentionCard({\n summary: input.summary,\n ...(input.nextStep ? { nextStep: input.nextStep } : {}),\n ...(input.detail ? { detail: input.detail } : {}),\n ...(input.autoRepairAttempted\n ? { autoRepairAttempted: input.autoRepairAttempted }\n : {}),\n });\n renderInfoCard({\n presenter: input.presenter,\n title: card.title,\n codePrefix: `${input.codePrefix}.failed`,\n rows: card.rows,\n });\n}\n","import { isLoopbackHostname } from \"../config/loopback-hostname\";\n\nexport function buildSpaceWebUrl(\n baseUrl: string,\n organizationSlug: string,\n spaceId: string,\n options?: {\n profileId?: string;\n }\n): string {\n const url = new URL(resolveGatewayWebOrigin(baseUrl));\n const orgSlug = requireOrganizationSlug(organizationSlug);\n url.pathname = `/o/${encodeURIComponent(orgSlug)}/spaces/${encodeURIComponent(spaceId)}`;\n url.search = \"\";\n const profileId = normalizeOptionalText(options?.profileId);\n if (profileId) {\n url.searchParams.set(\"profileId\", profileId);\n }\n url.hash = \"\";\n return url.toString();\n}\n\nexport function resolveGatewayWebOrigin(baseUrl: string): string {\n const url = new URL(baseUrl);\n if (isLoopbackHostname(url.hostname) && url.port === LOCAL_GATEWAY_PORT) {\n url.port = LOCAL_WEB_PORT;\n }\n const pair = OPENMELD_ORIGIN_HOST_PAIRS.find(\n ({ gateway }) => gateway === url.hostname\n );\n if (pair) {\n url.hostname = pair.web;\n url.port = \"\";\n url.protocol = \"https:\";\n }\n url.pathname = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.origin;\n}\n\nexport function resolveSpaceWebGatewayOrigin(spaceUrl: URL): string {\n const url = new URL(spaceUrl.toString());\n const pair = OPENMELD_ORIGIN_HOST_PAIRS.find(\n ({ web }) => web === url.hostname\n );\n if (pair) {\n if (url.protocol !== \"https:\" || url.port.length > 0) {\n throw new Error(TRUSTED_SPACE_WEB_ORIGIN_ERROR);\n }\n url.hostname = pair.gateway;\n } else if (\n isLoopbackHostname(url.hostname) &&\n (url.protocol === \"http:\" || url.protocol === \"https:\") &&\n url.port === LOCAL_WEB_PORT\n ) {\n url.port = LOCAL_GATEWAY_PORT;\n } else {\n throw new Error(TRUSTED_SPACE_WEB_ORIGIN_ERROR);\n }\n url.pathname = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.origin;\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction requireOrganizationSlug(value: unknown): string {\n const normalized = normalizeOptionalText(value);\n if (!normalized) {\n throw new Error(\n \"Active organization slug is required to build a Space URL.\"\n );\n }\n return normalized;\n}\nconst OPENMELD_ORIGIN_HOST_PAIRS = [\n { gateway: \"gateway.openmeld.ai\", web: \"openmeld.ai\" },\n {\n gateway: \"gateway.staging.openmeld.ai\",\n web: \"staging.openmeld.ai\",\n },\n { gateway: \"gateway.openmeld.invalid\", web: \"openmeld.invalid\" },\n] as const;\n\nconst LOCAL_GATEWAY_PORT = \"8080\";\nconst LOCAL_WEB_PORT = \"3000\";\nconst TRUSTED_SPACE_WEB_ORIGIN_ERROR =\n \"Space URL must use a trusted OpenMeld Web origin. For a custom local environment, pass --gateway-url explicitly.\";\n","// Fast-start schedule for readiness-polling retry loops: 250/500/1000ms, then\n// capped at 2000ms for every attempt beyond it.\nconst RETRY_DELAY_SCHEDULE_MS: readonly number[] = [250, 500, 1000, 2000];\nconst RETRY_DELAY_CAP_MS = 2000;\n\n// `attempt` is the 1-indexed retry number (the delay taken after that attempt fails).\nexport function computeRetryDelayMs(attempt: number): number {\n const index = Math.max(\n 0,\n Math.min(attempt - 1, RETRY_DELAY_SCHEDULE_MS.length - 1)\n );\n return RETRY_DELAY_SCHEDULE_MS[index] ?? RETRY_DELAY_CAP_MS;\n}\n","import { formatAgentOverviewPayload } from \"../runtime/agent-overview-payload\";\nimport type { Presenter } from \"../runtime/presenter\";\nimport {\n type BuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionExamples,\n getBuiltinAgentSelectionOptionalArguments,\n getBuiltinAgentSelectionRequiredArguments,\n} from \"./builtin-selection-contract\";\n\nexport type AgentsAgentOverviewCommand =\n | \"menu\"\n | \"manage\"\n | \"detect\"\n | \"list\"\n | \"show\"\n | \"enable\"\n | \"repair\"\n | \"disable\"\n | \"config\"\n | \"custom_list\"\n | \"custom_add\"\n | \"custom_update\"\n | \"custom_remove\";\n\ntype AgentsAgentOverviewInput = {\n presenter: Presenter;\n command: AgentsAgentOverviewCommand;\n};\n\ntype AgentsAgentOverviewPayload = {\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 emitAgentsAgentOverview(input: AgentsAgentOverviewInput): void {\n input.presenter.data({\n code: `agents.${input.command}.agent_overview`,\n payload: formatAgentOverviewPayload(\n buildAgentsAgentOverviewPayload(input.command)\n ),\n });\n}\n\nfunction buildBuiltinAgentSelectionOverviewPayload(\n command: BuiltinAgentSelectionCommand\n): Pick<\n AgentsAgentOverviewPayload,\n \"commands\" | \"optionalArguments\" | \"requiredArguments\"\n> {\n return {\n commands: buildBuiltinAgentSelectionExamples({\n command,\n includeViewFlag: true,\n }),\n optionalArguments: getBuiltinAgentSelectionOptionalArguments(command),\n requiredArguments: getBuiltinAgentSelectionRequiredArguments(command),\n };\n}\n\nfunction buildAgentsAgentOverviewPayload(\n command: AgentsAgentOverviewCommand\n): AgentsAgentOverviewPayload {\n switch (command) {\n case \"menu\": {\n return {\n summary:\n \"Manage local OpenMeld-connected agents, agent visibility in Space, and custom agent targets.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld agents --view agent\",\n \"openmeld agents detect --view agent\",\n \"openmeld agents list --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"enable\",\n includeViewFlag: true,\n }),\n \"openmeld agents manage --view agent\",\n ],\n stages: [\n \"Inspect available agents and current registrations.\",\n \"Choose an explicit subcommand for detect, list, enable, disable, show, config, or custom targets.\",\n ],\n notes: [\n \"Agent view does not open the human interactive agents menu.\",\n \"Use explicit subcommands to keep automation deterministic.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"manage\": {\n return {\n summary:\n \"Review connected agent IDs and decide whether to inspect, enable, or disable them with explicit commands.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\n \"openmeld agents list --view agent\",\n \"openmeld agents show <agent-id> --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"repair\",\n includeViewFlag: true,\n }),\n \"openmeld agents config <agent-id> --enabled true|false --view agent\",\n ...buildBuiltinAgentSelectionExamples({\n command: \"disable\",\n includeViewFlag: true,\n }),\n ],\n stages: [\n \"List connected agent IDs.\",\n \"Inspect one agent or change enabled state with explicit subcommands.\",\n ],\n notes: [\"The manage menu is interactive in human view only.\"],\n humanActionRequired: true,\n };\n }\n case \"detect\": {\n return {\n summary:\n \"Detect supported local AI tools on this computer and report which ones are available to OpenMeld now.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents detect --view agent\"],\n stages: [\n \"Scan supported builtin agent targets.\",\n \"Return detected agents and whether each one is immediately selectable.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"list\": {\n return {\n summary:\n \"List currently registered OpenMeld agent IDs that can wake and reply in Space.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents list --view agent\"],\n stages: [\n \"Load agent registrations from your local OpenMeld config.\",\n \"Return registered agents and enabled state.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"repair\": {\n return {\n summary:\n \"Repair one or more builtin local agents so OpenMeld can start them again on this computer.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"repair\"),\n stages: [\n \"Resolve a fresh launch contract for each requested builtin agent.\",\n \"Persist the repaired machine launch contract into OpenMeld runtime state.\",\n ],\n notes: [\n \"Repair does not enable or disable agents. It refreshes how OpenMeld starts them on this computer.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"show\": {\n return {\n summary:\n \"Show one registered agent ID, its current OpenMeld config, and how OpenMeld will wake it.\",\n requiredArguments: [\"<agent-id>\"],\n optionalArguments: [],\n commands: [\"openmeld agents show <agent-id> --view agent\"],\n stages: [\n \"Resolve the requested agent ID.\",\n \"Return the current registration and effective runtime config.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"enable\": {\n return {\n summary:\n \"Enable one or more detected agents so new Space @mentions can wake them.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"enable\"),\n stages: [\n \"Resolve selectable detected agents.\",\n \"Register or re-enable them in your local OpenMeld config.\",\n \"Return per-agent enable summary.\",\n ],\n notes: [\n \"Use `openmeld agents detect --view agent` first if you need to discover selectable ids.\",\n ],\n humanActionRequired: false,\n };\n }\n case \"disable\": {\n return {\n summary:\n \"Disable one or more registered agents so new Space @mentions stop waking them.\",\n ...buildBuiltinAgentSelectionOverviewPayload(\"disable\"),\n stages: [\n \"Resolve requested registered agent ids.\",\n \"Update enabled=false in your local OpenMeld config.\",\n \"Return per-agent disable summary.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"config\": {\n return {\n summary:\n \"Update a registered agent's OpenMeld configuration with explicit flags.\",\n requiredArguments: [\"<agent-id>\", \"--enabled true|false\"],\n optionalArguments: [],\n commands: [\n \"openmeld agents config <agent-id> --enabled true --view agent\",\n \"openmeld agents config <agent-id> --enabled false --view agent\",\n ],\n stages: [\n \"Resolve the requested registered agent id.\",\n \"Apply explicit config updates.\",\n \"Return the updated effective config.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_list\": {\n return {\n summary:\n \"List custom agent targets stored in your local OpenMeld config and whether they are currently registered.\",\n requiredArguments: [],\n optionalArguments: [],\n commands: [\"openmeld agents custom list --view agent\"],\n stages: [\n \"Load configured custom targets.\",\n \"Project whether each target is registered and enabled.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_add\": {\n return {\n summary:\n \"Add a custom agent target to your local OpenMeld config with an absolute directory path.\",\n requiredArguments: [\"--name <name>\", \"--dir <absolute-path>\"],\n optionalArguments: [\"--id <id>\"],\n commands: [\n \"openmeld agents custom add --name <name> --dir <absolute-path> --view agent\",\n \"openmeld agents custom add --id <id> --name <name> --dir <absolute-path> --view agent\",\n ],\n stages: [\n \"Validate explicit custom target input.\",\n \"Save the target in your local OpenMeld config.\",\n \"Return the created custom target.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_update\": {\n return {\n summary: \"Update a custom agent target while keeping its ID stable.\",\n requiredArguments: [\n \"--id <id>\",\n \"one update: --name <name> | --dir <absolute-path>\",\n ],\n optionalArguments: [],\n commands: [\n \"openmeld agents custom update --id <id> --name <name> --view agent\",\n \"openmeld agents custom update --id <id> --dir <absolute-path> --view agent\",\n ],\n stages: [\n \"Resolve the custom target id.\",\n \"Apply explicit updates.\",\n \"Return the updated target and changed fields.\",\n ],\n notes: [],\n humanActionRequired: false,\n };\n }\n case \"custom_remove\": {\n return {\n summary:\n \"Remove a custom agent target that is not currently registered.\",\n requiredArguments: [\"--id <id>\"],\n optionalArguments: [],\n commands: [\"openmeld agents custom remove --id <id> --view agent\"],\n stages: [\n \"Resolve the custom target id.\",\n \"Verify it is not currently registered.\",\n \"Remove it from your local OpenMeld config and report the result.\",\n ],\n notes: [\n \"Install records are kept after removal; clean them up with OpenMeld skills commands when needed.\",\n ],\n humanActionRequired: false,\n };\n }\n default: {\n return assertNever(command);\n }\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(\n `unsupported agents agent overview command: ${String(value)}`\n );\n}\n","export function clampNumber(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n if (value < min) {\n return min;\n }\n if (value > max) {\n return max;\n }\n return value;\n}\n\nexport function resolveAnchoredVisibleWindow(input: {\n anchorIndex: number | null;\n itemCount: number;\n maxVisible: number;\n}): { end: number; start: number } {\n if (input.itemCount <= input.maxVisible) {\n return {\n start: 0,\n end: input.itemCount,\n };\n }\n\n const anchor =\n input.anchorIndex === null\n ? 0\n : clampNumber(input.anchorIndex, 0, input.itemCount - 1);\n const centeredStart = anchor - Math.floor(input.maxVisible / 2);\n const maxStart = input.itemCount - input.maxVisible;\n const start = clampNumber(centeredStart, 0, maxStart);\n return {\n start,\n end: Math.min(input.itemCount, start + input.maxVisible),\n };\n}\n\nexport function resolveOffsetVisibleWindow(input: {\n itemCount: number;\n maxVisible: number;\n offset: number;\n}): { end: number; start: number } {\n if (input.itemCount <= input.maxVisible) {\n return {\n start: 0,\n end: input.itemCount,\n };\n }\n\n const maxStart = Math.max(0, input.itemCount - input.maxVisible);\n const start = resolveVisibleWindowOffset(input.offset, maxStart);\n return {\n start,\n end: Math.min(input.itemCount, start + input.maxVisible),\n };\n}\n\nfunction resolveVisibleWindowOffset(offset: number, maxStart: number): number {\n if (!Number.isFinite(offset)) {\n return offset > 0 ? maxStart : 0;\n }\n\n return clampNumber(offset, 0, maxStart);\n}\n","import type { Key } from \"node:readline\";\nimport pc from \"picocolors\";\nimport { buildTextInfoCardLines, type InfoCardRow } from \"./info-card\";\nimport {\n type InteractivePromptKeypressResult,\n type InteractivePromptStatus,\n type InteractivePromptStreams,\n isReturnKeypress,\n measureRenderedTerminalLinesHeight,\n runInteractivePrompt,\n} from \"./interactive-prompt\";\nimport { sanitizeTerminalDisplayText } from \"./terminal-safe-text\";\nimport { clampNumber, resolveAnchoredVisibleWindow } from \"./visible-window\";\n\nconst PROMPT_SYMBOL_ACTIVE = pc.green(\"◇\");\nconst PROMPT_SYMBOL_CANCELLED = pc.red(\"■\");\nconst CURSOR_SYMBOL = pc.cyan(\"❯\");\nconst BAR_SYMBOL = pc.dim(\"│\");\nconst SINGLE_SELECTED_SYMBOL = pc.green(\"●\");\nconst SINGLE_UNSELECTED_SYMBOL = pc.dim(\"○\");\nconst MULTI_SELECTED_SYMBOL = pc.green(\"■\");\nconst MULTI_UNSELECTED_SYMBOL = pc.dim(\"□\");\nconst EMPTY_MATCH_LABEL = \"No matches found\";\nconst DEFAULT_MAX_VISIBLE = 8;\nconst PRINTABLE_SEARCH_INPUT_REGEX = /^[\\x20-\\x7E]+$/;\n\ntype SearchPromptMode = \"single\" | \"multiple\";\ntype SearchPromptStatus = InteractivePromptStatus;\n\ntype SearchPromptRow =\n | {\n kind: \"item\";\n filteredIndex: number;\n itemIndex: number;\n }\n | {\n kind: \"action\";\n actionIndex: number;\n }\n | {\n kind: \"back\";\n };\n\ntype SearchPromptItemWithSearchKey<T> = SearchSelectItem<T> & {\n readonly searchKey: string;\n};\n\ntype SearchPromptSummaryCard = {\n title: string;\n rows: InfoCardRow[];\n compact?: boolean;\n minContentWidth?: number;\n horizontalPadding?: number;\n};\n\ntype SearchPromptBaseInput<T> = {\n message: string;\n items: SearchSelectItem<T>[];\n noticeLines?: string[];\n maxVisible?: number;\n allowBack?: boolean;\n backLabel?: string;\n emptyLabel?: string;\n readOnly?: boolean;\n summaryCard?: SearchPromptSummaryCard;\n footerActions?: SearchPromptFooterAction[];\n footerActionsResolver?: SearchPromptFooterActionResolver<T>;\n workbench?: boolean;\n};\n\ntype CreateSearchPromptStateInput<T> = SearchPromptBaseInput<T> & {\n mode: SearchPromptMode;\n initialSelectedValues?: T[];\n required?: boolean;\n};\n\nexport type SearchSelectItem<T> = {\n value: T;\n label: string;\n detail?: string;\n hint?: string;\n searchText?: string;\n disabled?: boolean;\n};\n\nexport type SearchPromptFooterAction = {\n value: string;\n label: string;\n icon?: string;\n accent?: boolean;\n hint?: string;\n disabled?: boolean;\n separatorBefore?: boolean;\n};\n\nexport type SearchPromptFooterActionResolver<T> = (input: {\n selectedValues: T[];\n}) => SearchPromptFooterAction[];\n\nexport type SearchSelectResult<T> =\n | { status: \"submitted\"; value: T }\n | { status: \"back\" }\n | { status: \"cancelled\" };\n\nexport type SearchMultiselectResult<T> =\n | { status: \"submitted\"; value: T[] }\n | { status: \"back\" }\n | { status: \"cancelled\" };\n\nexport type SearchMultiselectWorkbenchResult<T> =\n | {\n status: \"action\";\n action: string;\n selectedValues: T[];\n }\n | {\n status: \"back\";\n selectedValues: T[];\n }\n | {\n status: \"cancelled\";\n selectedValues: T[];\n };\n\nexport type SearchPromptState<T> = {\n readonly mode: SearchPromptMode;\n readonly message: string;\n readonly noticeLines: string[];\n readonly items: SearchPromptItemWithSearchKey<T>[];\n readonly footerActions: SearchPromptFooterAction[];\n readonly footerActionsResolver: SearchPromptFooterActionResolver<T> | null;\n readonly workbench: boolean;\n readonly allowBack: boolean;\n readonly backLabel: string;\n readonly emptyLabel: string;\n readonly maxVisible: number;\n readonly required: boolean;\n readonly readOnly: boolean;\n readonly summaryCard: SearchPromptSummaryCard | null;\n readonly selectedValues: T[];\n readonly query: string;\n readonly activeRowIndex: number;\n};\n\nexport type SearchPromptVisibleItem<T> = {\n kind: \"item\";\n filteredIndex: number;\n itemIndex: number;\n item: SearchSelectItem<T>;\n active: boolean;\n selected: boolean;\n};\n\nexport type SearchPromptVisibleRow<T> =\n | SearchPromptVisibleItem<T>\n | {\n kind: \"action\";\n action: SearchPromptFooterAction;\n actionIndex: number;\n active: boolean;\n }\n | { kind: \"back\"; active: boolean; label: string };\n\nexport type SearchPromptViewModel<T> = {\n readonly filteredIndexes: number[];\n readonly rows: SearchPromptRow[];\n readonly activeRow: SearchPromptRow | null;\n readonly activeItemFilteredIndex: number | null;\n readonly visibleRows: SearchPromptVisibleRow<T>[];\n readonly hiddenBefore: number;\n readonly hiddenAfter: number;\n};\n\ntype SearchPromptResolvedResult<T> =\n | SearchSelectResult<T>\n | SearchMultiselectResult<T>\n | SearchMultiselectWorkbenchResult<T>;\n\nexport type SearchPromptKeypressResult<T> = InteractivePromptKeypressResult<\n SearchPromptState<T>,\n SearchPromptResolvedResult<T>\n>;\n\ntype SearchPromptAction<T> =\n | { type: \"move\"; delta: number }\n | { type: \"query-append\"; text: string }\n | { type: \"query-backspace\" }\n | { type: \"query-clear\" }\n | { type: \"toggle-active\" }\n | { type: \"set-query\"; query: string }\n | { type: \"set-selected\"; selectedValues: T[] };\n\nexport function createSearchPromptState<T>(\n input: CreateSearchPromptStateInput<T>\n): SearchPromptState<T> {\n const items = input.items.map(sanitizeSearchPromptItem);\n const baseState: SearchPromptState<T> = {\n mode: input.mode,\n message: sanitizeTerminalDisplayText(input.message, \"single-line\"),\n noticeLines: (input.noticeLines ?? []).map((line) =>\n sanitizeTerminalDisplayText(line, \"single-line\")\n ),\n items,\n footerActions: (input.footerActions ?? []).map(\n sanitizeSearchPromptFooterAction\n ),\n footerActionsResolver: input.footerActionsResolver ?? null,\n workbench: input.workbench === true,\n allowBack: input.allowBack === true,\n backLabel: sanitizeTerminalDisplayText(\n input.backLabel ?? \"Back\",\n \"single-line\"\n ),\n emptyLabel: sanitizeTerminalDisplayText(\n input.emptyLabel ?? EMPTY_MATCH_LABEL,\n \"single-line\"\n ),\n maxVisible: normalizeMaxVisible(input.maxVisible),\n required: input.required === true,\n readOnly: input.readOnly === true,\n summaryCard:\n input.summaryCard === undefined\n ? null\n : sanitizeSearchPromptSummaryCard(input.summaryCard),\n selectedValues: dedupeValues(input.initialSelectedValues ?? []),\n query: \"\",\n activeRowIndex: 0,\n };\n const nextState = {\n ...baseState,\n activeRowIndex: resolveInitialSearchPromptActiveRowIndex(baseState),\n };\n return syncSearchPromptState(nextState);\n}\n\nfunction sanitizeSearchPromptFooterAction(\n action: SearchPromptFooterAction\n): SearchPromptFooterAction {\n return {\n ...action,\n label: sanitizeTerminalDisplayText(action.label, \"single-line\"),\n ...(typeof action.icon === \"string\"\n ? {\n icon: sanitizeTerminalDisplayText(action.icon, \"single-line\"),\n }\n : {}),\n ...(typeof action.hint === \"string\"\n ? {\n hint: sanitizeTerminalDisplayText(action.hint, \"single-line\"),\n }\n : {}),\n };\n}\n\nfunction sanitizeSearchPromptItem<T>(\n item: SearchSelectItem<T>\n): SearchPromptItemWithSearchKey<T> {\n const normalizedItem: SearchSelectItem<T> = {\n ...item,\n label: sanitizeTerminalDisplayText(item.label, \"single-line\"),\n ...(typeof item.detail === \"string\"\n ? {\n detail: sanitizeTerminalDisplayText(item.detail, \"single-line\"),\n }\n : {}),\n ...(typeof item.hint === \"string\"\n ? {\n hint: sanitizeTerminalDisplayText(item.hint, \"single-line\"),\n }\n : {}),\n ...(typeof item.searchText === \"string\"\n ? {\n searchText: sanitizeTerminalDisplayText(\n item.searchText,\n \"multi-line\"\n ),\n }\n : {}),\n };\n\n return {\n ...normalizedItem,\n searchKey: buildSearchKey(normalizedItem),\n };\n}\n\nfunction sanitizeSearchPromptSummaryCard(\n card: SearchPromptSummaryCard\n): SearchPromptSummaryCard {\n return {\n ...card,\n title: sanitizeTerminalDisplayText(card.title, \"single-line\"),\n rows: card.rows.map((row) => ({\n label: sanitizeTerminalDisplayText(row.label, \"single-line\"),\n value: sanitizeTerminalDisplayText(row.value, \"single-line\"),\n })),\n };\n}\n\nexport function getSearchPromptViewModel<T>(\n state: SearchPromptState<T>\n): SearchPromptViewModel<T> {\n const filteredIndexes = getFilteredItemIndexes(state);\n const footerActions = resolveSearchPromptFooterActions(state);\n const rows = buildSearchPromptRows({\n allowBack: state.allowBack,\n filteredIndexes,\n footerActions,\n workbench: state.workbench,\n });\n\n const activeRow = rows[state.activeRowIndex] ?? null;\n const activeItemFilteredIndex = resolveSearchPromptActiveItemFilteredIndex({\n activeRow,\n filteredIndexes,\n workbench: state.workbench,\n });\n const visibleWindow = resolveAnchoredVisibleWindow({\n itemCount: filteredIndexes.length,\n anchorIndex: activeItemFilteredIndex,\n maxVisible: state.maxVisible,\n });\n\n const visibleRows = buildSearchPromptVisibleRows({\n activeRow,\n filteredIndexes,\n footerActions,\n state,\n visibleWindow,\n });\n\n return {\n filteredIndexes,\n rows,\n activeRow,\n activeItemFilteredIndex,\n visibleRows,\n hiddenBefore: visibleWindow.start,\n hiddenAfter: Math.max(0, filteredIndexes.length - visibleWindow.end),\n };\n}\n\nfunction resolveSearchPromptActiveItemFilteredIndex(input: {\n activeRow: SearchPromptRow | null;\n filteredIndexes: number[];\n workbench: boolean;\n}): number | null {\n if (input.activeRow?.kind === \"item\") {\n return input.activeRow.filteredIndex;\n }\n if (input.filteredIndexes.length === 0) {\n return null;\n }\n return input.filteredIndexes.length - 1;\n}\n\nexport function updateSearchPromptState<T>(\n state: SearchPromptState<T>,\n action: SearchPromptAction<T>\n): SearchPromptState<T> {\n switch (action.type) {\n case \"move\":\n return moveSearchPromptCursor(state, action.delta);\n case \"query-append\":\n if (action.text.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: `${state.query}${action.text}`,\n });\n case \"query-backspace\":\n if (state.query.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: state.query.slice(0, -1),\n });\n case \"query-clear\":\n if (state.query.length === 0) {\n return state;\n }\n return syncSearchPromptState({\n ...state,\n query: \"\",\n });\n case \"set-query\":\n return syncSearchPromptState({\n ...state,\n query: action.query,\n });\n case \"toggle-active\":\n return toggleSearchPromptActiveSelection(state);\n case \"set-selected\":\n return syncSearchPromptState({\n ...state,\n selectedValues: dedupeValues(action.selectedValues),\n });\n default:\n return state;\n }\n}\n\nexport function getSearchPromptSelection<T>(\n state: SearchPromptState<T>\n):\n | SearchSelectResult<T>\n | SearchMultiselectResult<T>\n | SearchMultiselectWorkbenchResult<T>\n | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind === \"back\") {\n return state.workbench\n ? {\n status: \"back\",\n selectedValues: state.selectedValues,\n }\n : { status: \"back\" };\n }\n if (viewModel.activeRow?.kind === \"action\") {\n const action =\n resolveSearchPromptFooterActions(state)[viewModel.activeRow.actionIndex];\n if (!action || action.disabled === true) {\n return null;\n }\n return {\n status: \"action\",\n action: action.value,\n selectedValues: state.selectedValues,\n };\n }\n if (state.readOnly) {\n return null;\n }\n if (state.workbench) {\n return null;\n }\n\n if (state.mode === \"single\") {\n const activeItem = getActiveItem(state);\n if (!activeItem || activeItem.disabled === true) {\n return null;\n }\n return {\n status: \"submitted\",\n value: activeItem.value,\n };\n }\n\n if (state.required && state.selectedValues.length === 0) {\n return null;\n }\n return {\n status: \"submitted\",\n value: state.selectedValues,\n };\n}\n\nexport function renderSearchPromptLines<T>(\n state: SearchPromptState<T>,\n status: SearchPromptStatus = \"active\"\n): string[] {\n const symbol =\n status === \"cancelled\" ? PROMPT_SYMBOL_CANCELLED : PROMPT_SYMBOL_ACTIVE;\n const lines = [`${symbol} ${pc.bold(state.message)}`];\n\n if (status === \"submitted\") {\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(buildSubmittedSearchPromptSummary(state) ?? \"Done\")}`\n );\n return lines;\n }\n\n if (status === \"cancelled\") {\n lines.push(`${BAR_SYMBOL} ${pc.strikethrough(pc.dim(\"Cancelled\"))}`);\n return lines;\n }\n\n lines.push(...renderActiveSearchPromptLines(state));\n lines.push(pc.dim(\"└\"));\n return lines;\n}\n\nexport function measureRenderedSearchPromptHeight(\n lines: string[],\n columns: number | undefined\n): number {\n return measureRenderedTerminalLinesHeight(lines, columns);\n}\n\nfunction renderActiveSearchPromptLines<T>(\n state: SearchPromptState<T>\n): string[] {\n const viewModel = getSearchPromptViewModel(state);\n const lines: string[] = [];\n\n if (state.summaryCard) {\n lines.push(`${BAR_SYMBOL}`);\n lines.push(...renderSearchPromptSummaryCardLines(state.summaryCard));\n lines.push(`${BAR_SYMBOL}`);\n }\n\n if (state.noticeLines.length > 0) {\n lines.push(`${BAR_SYMBOL}`);\n lines.push(...renderSearchPromptNoticeCardLines(state.noticeLines));\n lines.push(`${BAR_SYMBOL}`);\n }\n\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(\"Search:\")} ${state.query}${pc.inverse(\" \")}`,\n renderSearchPromptHintLine({\n mode: state.mode,\n allowBack: state.allowBack,\n readOnly: state.readOnly,\n workbench: state.workbench,\n })\n );\n\n lines.push(`${BAR_SYMBOL}`);\n\n lines.push(...renderSearchPromptBodyLines(state, viewModel));\n lines.push(...renderSearchPromptOverflowLines(viewModel));\n if (state.workbench) {\n lines.push(...renderSearchPromptSelectionSummaryLines(state));\n lines.push(...renderSearchPromptWorkbenchMenuLines(viewModel));\n } else {\n lines.push(...renderSearchPromptActionLines(viewModel));\n lines.push(...renderSearchPromptBackLines(state, viewModel));\n lines.push(...renderSearchPromptSelectionSummaryLines(state));\n }\n return lines;\n}\n\nfunction renderSearchPromptBodyLines<T>(\n state: SearchPromptState<T>,\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const itemRows = viewModel.visibleRows.filter(\n (row): row is SearchPromptVisibleItem<T> => row.kind === \"item\"\n );\n if (itemRows.length === 0) {\n return [`${BAR_SYMBOL} ${pc.dim(state.emptyLabel)}`];\n }\n\n return itemRows.flatMap((row) => {\n const lines = [\n renderSearchPromptItemLine(row, {\n mode: state.mode,\n readOnly: state.readOnly,\n }),\n ];\n if (row.item.detail) {\n lines.push(`${BAR_SYMBOL} ${pc.dim(row.item.detail)}`);\n }\n return lines;\n });\n}\n\nfunction renderSearchPromptOverflowLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n if (viewModel.hiddenBefore === 0 && viewModel.hiddenAfter === 0) {\n return [];\n }\n\n const hiddenLabels: string[] = [];\n if (viewModel.hiddenBefore > 0) {\n hiddenLabels.push(`↑ ${String(viewModel.hiddenBefore)} more`);\n }\n if (viewModel.hiddenAfter > 0) {\n hiddenLabels.push(`↓ ${String(viewModel.hiddenAfter)} more`);\n }\n return [`${BAR_SYMBOL} ${pc.dim(hiddenLabels.join(\" \"))}`];\n}\n\nfunction renderSearchPromptActionLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const actionRows = viewModel.visibleRows.filter(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }> =>\n row.kind === \"action\"\n );\n if (actionRows.length === 0) {\n return [];\n }\n\n return renderSearchPromptActionBlockLines(actionRows);\n}\n\nfunction renderSearchPromptWorkbenchMenuLines<T>(\n viewModel: SearchPromptViewModel<T>\n): string[] {\n const actionRows = viewModel.visibleRows.filter(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }> =>\n row.kind === \"action\"\n );\n const backRow = viewModel.visibleRows.find(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }> =>\n row.kind === \"back\"\n );\n if (actionRows.length === 0 && !backRow) {\n return [];\n }\n\n const lines = renderSearchPromptActionBlockLines(actionRows);\n if (backRow) {\n if (actionRows.length > 0) {\n lines.push(`${BAR_SYMBOL}`);\n }\n lines.push(renderSearchPromptBackLine(backRow, { workbench: true }));\n }\n return lines;\n}\n\nfunction renderSearchPromptBackLines<T>(\n state: SearchPromptState<T>,\n viewModel: SearchPromptViewModel<T>\n): string[] {\n if (!state.allowBack || state.workbench) {\n return [];\n }\n\n const backRow = viewModel.visibleRows.find(\n (row): row is Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }> =>\n row.kind === \"back\"\n );\n if (!backRow) {\n return [];\n }\n return [`${BAR_SYMBOL}`, renderSearchPromptBackLine(backRow)];\n}\n\nfunction renderSearchPromptSelectionSummaryLines<T>(\n state: SearchPromptState<T>\n): string[] {\n if (state.mode !== \"multiple\" || state.readOnly) {\n return [];\n }\n\n const lines = [\n `${BAR_SYMBOL}`,\n `${BAR_SYMBOL} ${pc.green(\"Selected:\")} ${buildMultiselectSummary(state)}`,\n ];\n if (\n !state.workbench &&\n (!state.required || state.selectedValues.length > 0)\n ) {\n lines.push(\n `${BAR_SYMBOL} ${pc.dim(\"Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n \" to continue.\"\n )}`\n );\n }\n return lines;\n}\n\nexport function handleSearchPromptKeypress<T>(input: {\n state: SearchPromptState<T>;\n str: string | undefined;\n key: Key;\n}): SearchPromptKeypressResult<T> {\n const { state, str, key } = input;\n if (!key) {\n return { type: \"ignore\" };\n }\n\n if (key.ctrl === true && key.name === \"c\") {\n return {\n type: \"result\",\n result: buildSearchPromptDismissResult({\n state,\n status: \"cancelled\",\n }),\n status: \"cancelled\",\n };\n }\n\n if (key.name === \"escape\") {\n return handleSearchPromptEscapeKeypress(state);\n }\n\n if (isReturnKeypress({ key, str })) {\n return handleSearchPromptReturnKeypress(state);\n }\n\n const moveDelta = resolveSearchPromptMoveDelta(key.name);\n if (moveDelta !== null) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"move\",\n delta: moveDelta,\n }),\n };\n }\n\n if (key.name === \"space\" && state.mode === \"multiple\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"toggle-active\",\n }),\n };\n }\n\n if (key.name === \"backspace\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-backspace\",\n }),\n };\n }\n\n if (key.ctrl === true && key.name === \"u\") {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-clear\",\n }),\n };\n }\n\n const printableInput = normalizePrintableSearchInput(str, state.mode);\n if (printableInput !== null) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"query-append\",\n text: printableInput,\n }),\n };\n }\n\n return { type: \"ignore\" };\n}\n\nfunction buildSearchPromptDismissResult<T>(input: {\n state: SearchPromptState<T>;\n status: \"back\" | \"cancelled\";\n}): SearchPromptResolvedResult<T> {\n if (input.state.workbench) {\n if (input.status === \"back\") {\n return {\n status: \"back\",\n selectedValues: input.state.selectedValues,\n };\n }\n return {\n status: \"cancelled\",\n selectedValues: input.state.selectedValues,\n };\n }\n if (input.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"cancelled\",\n };\n}\n\nfunction handleSearchPromptEscapeKeypress<T>(\n state: SearchPromptState<T>\n): SearchPromptKeypressResult<T> {\n const dismissalStatus = state.allowBack ? \"back\" : \"cancelled\";\n return {\n type: \"result\",\n result: buildSearchPromptDismissResult({\n state,\n status: dismissalStatus,\n }),\n status: state.allowBack ? \"submitted\" : \"cancelled\",\n state: state.allowBack ? focusSearchPromptBackRow(state) : state,\n };\n}\n\nfunction handleSearchPromptReturnKeypress<T>(\n state: SearchPromptState<T>\n): SearchPromptKeypressResult<T> {\n if (\n state.workbench &&\n getSearchPromptViewModel(state).activeRow?.kind === \"item\"\n ) {\n return {\n type: \"state\",\n state: updateSearchPromptState(state, {\n type: \"toggle-active\",\n }),\n };\n }\n\n const result = getSearchPromptSelection(state);\n if (!result) {\n return { type: \"ignore\" };\n }\n return {\n type: \"result\",\n result,\n status: \"submitted\",\n };\n}\n\nexport function promptSearchSelect<T>(\n input: SearchPromptBaseInput<T>,\n streams?: InteractivePromptStreams\n): Promise<SearchSelectResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"single\",\n });\n return runInteractiveSearchPrompt(state, streams).then(\n (result) => result as SearchSelectResult<T>\n );\n}\n\nexport function promptSearchMultiselect<T>(\n input: SearchPromptBaseInput<T> & {\n initialSelectedValues?: T[];\n required?: boolean;\n },\n streams?: InteractivePromptStreams\n): Promise<SearchMultiselectResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"multiple\",\n });\n return runInteractiveSearchPrompt(state, streams).then(\n (result) => result as SearchMultiselectResult<T>\n );\n}\n\nexport function promptSearchMultiselectWorkbench<T>(\n input: SearchPromptBaseInput<T> & {\n footerActions: SearchPromptFooterAction[];\n footerActionsResolver?: SearchPromptFooterActionResolver<T>;\n initialSelectedValues?: T[];\n }\n): Promise<SearchMultiselectWorkbenchResult<T>> {\n const state = createSearchPromptState({\n ...input,\n mode: \"multiple\",\n workbench: true,\n });\n return runInteractiveSearchPrompt(state).then(\n (result) => result as SearchMultiselectWorkbenchResult<T>\n );\n}\n\nfunction buildSearchKey<T>(item: SearchSelectItem<T>): string {\n const raw = [\n item.searchText,\n item.label,\n item.detail,\n item.hint,\n String(item.value),\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\"\\n\")\n .trim()\n .toLowerCase();\n return raw;\n}\n\nfunction getFilteredItemIndexes<T>(state: SearchPromptState<T>): number[] {\n const query = state.query.trim().toLowerCase();\n if (query.length === 0) {\n return state.items.map((_item, index) => index);\n }\n return state.items.flatMap((item, index) =>\n item.searchKey.includes(query) ? [index] : []\n );\n}\n\nfunction syncSearchPromptState<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n const viewModel = getSearchPromptViewModelInternal(state);\n const activeRowIndex =\n viewModel.rows.length === 0\n ? 0\n : clampNumber(state.activeRowIndex, 0, viewModel.rows.length - 1);\n return {\n ...state,\n activeRowIndex,\n };\n}\n\nfunction getSearchPromptViewModelInternal<T>(state: SearchPromptState<T>) {\n const filteredIndexes = getFilteredItemIndexes(state);\n const footerActions = resolveSearchPromptFooterActions(state);\n const rows = buildSearchPromptRows({\n allowBack: state.allowBack,\n filteredIndexes,\n footerActions,\n workbench: state.workbench,\n });\n return {\n filteredIndexes,\n rows,\n };\n}\n\nfunction buildSearchPromptRows(input: {\n allowBack: boolean;\n filteredIndexes: number[];\n footerActions: SearchPromptFooterAction[];\n workbench: boolean;\n}): SearchPromptRow[] {\n const itemRows = input.filteredIndexes.map<SearchPromptRow>(\n (itemIndex, filteredIndex) => ({\n kind: \"item\",\n filteredIndex,\n itemIndex,\n })\n );\n const actionRows = input.footerActions.map<SearchPromptRow>(\n (_action, actionIndex) => ({\n kind: \"action\",\n actionIndex,\n })\n );\n const rows = input.workbench\n ? [...itemRows, ...actionRows]\n : [...itemRows, ...actionRows];\n if (input.allowBack) {\n rows.push({ kind: \"back\" });\n }\n return rows;\n}\n\nfunction buildSearchPromptVisibleRows<T>(input: {\n activeRow: SearchPromptRow | null;\n filteredIndexes: number[];\n footerActions: SearchPromptFooterAction[];\n state: SearchPromptState<T>;\n visibleWindow: { start: number; end: number };\n}): SearchPromptVisibleRow<T>[] {\n const itemRows: SearchPromptVisibleRow<T>[] = input.filteredIndexes\n .slice(input.visibleWindow.start, input.visibleWindow.end)\n .map((itemIndex, offset) => {\n const filteredIndex = input.visibleWindow.start + offset;\n const item = input.state.items[itemIndex];\n if (!item) {\n throw new Error(\"search prompt item is missing\");\n }\n return {\n kind: \"item\",\n filteredIndex,\n itemIndex,\n item,\n active:\n input.activeRow?.kind === \"item\" &&\n input.activeRow.filteredIndex === filteredIndex,\n selected: isItemSelected(input.state, item.value),\n };\n });\n const actionRows: SearchPromptVisibleRow<T>[] = input.footerActions.map(\n (action, actionIndex) => ({\n kind: \"action\",\n action,\n actionIndex,\n active:\n input.activeRow?.kind === \"action\" &&\n input.activeRow.actionIndex === actionIndex,\n })\n );\n const rows: SearchPromptVisibleRow<T>[] = [...itemRows, ...actionRows];\n if (input.state.allowBack) {\n rows.push({\n kind: \"back\",\n active: input.activeRow?.kind === \"back\",\n label: input.state.backLabel,\n });\n }\n return rows;\n}\n\nfunction resolveInitialSearchPromptActiveRowIndex<T>(\n state: SearchPromptState<T>\n): number {\n if (!state.workbench) {\n return 0;\n }\n\n const filteredIndexes = getFilteredItemIndexes(state);\n if (filteredIndexes.length > 0) {\n return 0;\n }\n return 0;\n}\n\nfunction moveSearchPromptCursor<T>(\n state: SearchPromptState<T>,\n delta: number\n): SearchPromptState<T> {\n const viewModel = getSearchPromptViewModelInternal(state);\n if (viewModel.rows.length === 0 || delta === 0) {\n return state;\n }\n return {\n ...state,\n activeRowIndex: wrapNumber(\n state.activeRowIndex + delta,\n 0,\n viewModel.rows.length - 1\n ),\n };\n}\n\nfunction toggleSearchPromptActiveSelection<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n if (state.mode !== \"multiple\") {\n return state;\n }\n const activeItem = getActiveItem(state);\n if (!activeItem || activeItem.disabled === true) {\n return state;\n }\n\n const selectedValues = new Set(state.selectedValues);\n if (selectedValues.has(activeItem.value)) {\n selectedValues.delete(activeItem.value);\n } else {\n selectedValues.add(activeItem.value);\n }\n\n return {\n ...state,\n selectedValues: Array.from(selectedValues),\n };\n}\n\nfunction getActiveItem<T>(\n state: SearchPromptState<T>\n): SearchSelectItem<T> | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind !== \"item\") {\n return null;\n }\n return state.items[viewModel.activeRow.itemIndex] ?? null;\n}\n\nfunction isItemSelected<T>(state: SearchPromptState<T>, value: T): boolean {\n return state.selectedValues.includes(value);\n}\n\nfunction renderSearchPromptItemLine<T>(\n row: SearchPromptVisibleItem<T>,\n input: {\n mode: SearchPromptMode;\n readOnly: boolean;\n }\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n if (input.readOnly) {\n const hint = row.item.hint ? pc.dim(` (${row.item.hint})`) : \"\";\n return `${BAR_SYMBOL} ${prefix} ${row.item.label}${hint}`;\n }\n const marker = resolveSearchPromptItemMarker({\n mode: input.mode,\n active: row.active,\n selected: row.selected,\n });\n const label = row.item.label;\n const hint = row.item.hint ? pc.dim(` (${row.item.hint})`) : \"\";\n const disabled = row.item.disabled === true;\n const renderedLabel = disabled ? pc.dim(label) : label;\n return `${BAR_SYMBOL} ${prefix} ${marker} ${renderedLabel}${hint}`;\n}\n\nfunction renderSearchPromptActionLine<T>(\n row: Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }>\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n const icon =\n typeof row.action.icon === \"string\" && row.action.icon.length > 0\n ? `${\n row.action.disabled === true || row.action.icon === \"·\"\n ? pc.dim(row.action.icon)\n : pc.cyan(row.action.icon)\n } `\n : \"\";\n let label = pc.bold(row.action.label);\n if (row.action.accent === true) {\n label = pc.green(row.action.label);\n }\n if (row.action.disabled === true) {\n label = pc.dim(row.action.label);\n }\n const hint = row.action.hint ? pc.dim(` (${row.action.hint})`) : \"\";\n return `${BAR_SYMBOL} ${prefix} ${icon}${label}${hint}`;\n}\n\nfunction renderSearchPromptActionBlockLines<T>(\n actionRows: Extract<SearchPromptVisibleRow<T>, { kind: \"action\" }>[]\n): string[] {\n const lines = [`${BAR_SYMBOL}`];\n for (const row of actionRows) {\n if (row.action.separatorBefore === true) {\n lines.push(`${BAR_SYMBOL}`);\n }\n lines.push(renderSearchPromptActionLine(row));\n }\n return lines;\n}\n\nfunction resolveSearchPromptItemMarker(input: {\n mode: SearchPromptMode;\n active: boolean;\n selected: boolean;\n}): string {\n if (input.mode === \"multiple\") {\n return input.selected ? MULTI_SELECTED_SYMBOL : MULTI_UNSELECTED_SYMBOL;\n }\n return input.active ? SINGLE_SELECTED_SYMBOL : SINGLE_UNSELECTED_SYMBOL;\n}\n\nfunction renderSearchPromptBackLine<T>(\n row: Extract<SearchPromptVisibleRow<T>, { kind: \"back\" }>,\n input?: {\n workbench?: boolean;\n }\n): string {\n const prefix = row.active ? CURSOR_SYMBOL : \" \";\n if (input?.workbench === true) {\n return `${BAR_SYMBOL} ${prefix} ${row.label}`;\n }\n return `${BAR_SYMBOL} ${prefix} ${row.label}`;\n}\n\nfunction buildSubmittedSearchPromptSummary<T>(\n state: SearchPromptState<T>\n): string | null {\n const viewModel = getSearchPromptViewModel(state);\n if (viewModel.activeRow?.kind === \"back\") {\n return state.backLabel;\n }\n if (viewModel.activeRow?.kind === \"action\") {\n return (\n resolveSearchPromptFooterActions(state)[viewModel.activeRow.actionIndex]\n ?.label ?? null\n );\n }\n if (state.mode === \"single\") {\n const item = getActiveItem(state);\n return item?.label ?? null;\n }\n return buildMultiselectSummary(state);\n}\n\nfunction buildMultiselectSummary<T>(state: SearchPromptState<T>): string {\n const labels = state.items\n .filter((item) => isItemSelected(state, item.value))\n .map((item) => item.label);\n if (labels.length === 0) {\n return \"(none)\";\n }\n if (labels.length <= 3) {\n return labels.join(\", \");\n }\n return `${labels.slice(0, 3).join(\", \")} +${String(labels.length - 3)} more`;\n}\n\nfunction focusSearchPromptBackRow<T>(\n state: SearchPromptState<T>\n): SearchPromptState<T> {\n const backRowIndex = getSearchPromptViewModel(state).rows.findIndex(\n (row) => row.kind === \"back\"\n );\n if (backRowIndex < 0) {\n return state;\n }\n return {\n ...state,\n activeRowIndex: backRowIndex,\n };\n}\n\nfunction resolveSearchPromptMoveDelta(name: string | undefined): number | null {\n if (name === \"up\") {\n return -1;\n }\n if (name === \"down\") {\n return 1;\n }\n return null;\n}\n\nfunction renderSearchPromptHintLine(input: {\n mode: SearchPromptMode;\n allowBack: boolean;\n readOnly: boolean;\n workbench: boolean;\n}): string {\n if (input.readOnly) {\n return `${BAR_SYMBOL} ${pc.dim(\n input.allowBack\n ? \"↑↓ browse, type to filter, Esc back\"\n : \"↑↓ browse, type to filter\"\n )}`;\n }\n if (input.workbench) {\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Space`\")}${pc.dim(\" or \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack\n ? \" to select, choose an action to continue, Esc back\"\n : \" to select, choose an action to continue\"\n )}`;\n }\n if (input.mode === \"multiple\") {\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Space`\")}${pc.dim(\" to select, Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack ? \" to confirm, Esc back\" : \" to confirm\"\n )}`;\n }\n return `${BAR_SYMBOL} ${pc.dim(\"↑↓ move, Press \")}${pc.green(\"`Enter`\")}${pc.dim(\n input.allowBack ? \" to select, Esc back\" : \" to select\"\n )}`;\n}\n\nfunction renderSearchPromptSummaryCardLines(\n card: SearchPromptSummaryCard\n): string[] {\n return buildTextInfoCardLines({\n ...card,\n sanitize: true,\n }).map((line) => `${BAR_SYMBOL} ${line}`);\n}\n\nfunction renderSearchPromptNoticeCardLines(noticeLines: string[]): string[] {\n if (noticeLines.length === 0) {\n return [];\n }\n\n return buildTextInfoCardLines({\n title: pc.yellow(\"⚠️ Notification\"),\n rows: noticeLines.map((line) => ({\n label: \"\",\n value: pc.yellow(`⚠️ ${line}`),\n })),\n compact: true,\n minContentWidth: 48,\n }).map((line) => `${BAR_SYMBOL} ${line}`);\n}\n\nfunction normalizeMaxVisible(value: number | undefined): number {\n const normalized = typeof value === \"number\" ? Math.trunc(value) : Number.NaN;\n return Number.isFinite(normalized) && normalized > 0\n ? normalized\n : DEFAULT_MAX_VISIBLE;\n}\n\nfunction wrapNumber(value: number, min: number, max: number): number {\n if (value < min) {\n return max;\n }\n if (value > max) {\n return min;\n }\n return value;\n}\n\nfunction dedupeValues<T>(values: T[]): T[] {\n return Array.from(new Set(values));\n}\n\nfunction runInteractiveSearchPrompt<T>(\n initialState: SearchPromptState<T>,\n streams?: InteractivePromptStreams\n): Promise<SearchPromptResolvedResult<T>> {\n return runInteractivePrompt(\n {\n initialState,\n fallbackResult: buildSearchPromptFallbackResult(initialState),\n renderLines: (state, status) => renderSearchPromptLines(state, status),\n handleKeypress: ({ state, str, key }) =>\n handleSearchPromptKeypress({\n state,\n str,\n key,\n }),\n },\n streams\n );\n}\n\nfunction buildSearchPromptFallbackResult<T>(\n state: SearchPromptState<T>\n): SearchPromptResolvedResult<T> {\n return buildSearchPromptDismissResult({\n state,\n status: state.allowBack ? \"back\" : \"cancelled\",\n });\n}\n\nfunction resolveSearchPromptFooterActions<T>(\n state: SearchPromptState<T>\n): SearchPromptFooterAction[] {\n if (state.footerActionsResolver === null) {\n return state.footerActions;\n }\n\n return state\n .footerActionsResolver({\n selectedValues: state.selectedValues,\n })\n .map(sanitizeSearchPromptFooterAction);\n}\n\nfunction isPrintableSearchInput(\n value: string | undefined,\n mode: SearchPromptMode\n): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return false;\n }\n if (mode === \"multiple\" && value === \" \") {\n return false;\n }\n return PRINTABLE_SEARCH_INPUT_REGEX.test(value);\n}\n\nfunction normalizePrintableSearchInput(\n value: string | undefined,\n mode: SearchPromptMode\n): string | null {\n return typeof value === \"string\" && isPrintableSearchInput(value, mode)\n ? value\n : null;\n}\n","const DISPLAY_NOT_SET_UP = \"Not set up\";\n\nexport function formatTransportModeDisplay(\n value: string | null | undefined\n): string {\n const normalized = String(value ?? \"\").trim();\n if (!normalized || normalized === \"not configured\") {\n return DISPLAY_NOT_SET_UP;\n }\n if (normalized === \"local-cli\") {\n return \"Local CLI\";\n }\n if (normalized === \"codex-app-server\") {\n return \"Codex App Server\";\n }\n if (normalized === \"acp\") {\n return \"Agent Client Protocol (ACP)\";\n }\n return normalized;\n}\n","import pc from \"picocolors\";\nimport { formatOpenMeldCliTextBlock } from \"../runtime/cli-entry-command\";\n\nexport const formatAgentsCopy = (text: string): string =>\n formatOpenMeldCliTextBlock(text);\n\nexport function formatAgentMention(agentId: string): string {\n return pc.bold(pc.cyan(`@${agentId}`));\n}\n\nexport function formatAgentsToneText(\n tone: \"success\" | \"warning\" | \"info\",\n value: string\n): string {\n if (tone === \"success\") {\n return pc.green(value);\n }\n if (tone === \"warning\") {\n return pc.yellow(value);\n }\n return pc.cyan(value);\n}\n\nexport function formatStatusTextForHuman(value: string): string {\n if (value.length === 0) {\n return value;\n }\n const normalized = value.replaceAll(\"_\", \" \");\n return normalized[0]?.toUpperCase() + normalized.slice(1);\n}\n\nexport function normalizeOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n","import pc from \"picocolors\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { type InfoCardRow, renderInfoCard } from \"../ui/info-card\";\nimport { formatAgentMention, formatAgentsToneText } from \"./agents-text\";\n\nconst AGENTS_CARD_MIN_CONTENT_WIDTH = 34;\n\nexport function renderAgentsInfoCard(input: {\n presenter: ReturnType<typeof createPresenter>;\n title: string;\n codePrefix: string;\n rows: InfoCardRow[];\n minContentWidth?: number;\n}): void {\n renderInfoCard({\n presenter: input.presenter,\n title: input.title,\n codePrefix: input.codePrefix,\n rows: input.rows,\n minContentWidth: input.minContentWidth ?? AGENTS_CARD_MIN_CONTENT_WIDTH,\n horizontalPadding: 1,\n compact: true,\n });\n}\n\nexport function formatAgentListItem(input: {\n agentId: string;\n displayName: string;\n detail?: string;\n}): string {\n const parts = [\n formatAgentMention(input.agentId),\n pc.dim(\"·\"),\n input.displayName,\n ];\n if (input.detail) {\n parts.push(pc.dim(input.detail));\n }\n return parts.join(\" \");\n}\n\nexport function buildReadyAgentCardRow(\n agentId: string,\n displayName: string\n): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId,\n displayName,\n }),\n };\n}\n\nexport function buildStatusAgentCardRow(input: {\n agentId: string;\n displayName: string;\n detail: string;\n}): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId: input.agentId,\n displayName: input.displayName,\n detail: input.detail,\n }),\n };\n}\n\nexport function buildTurnedOffAgentCardRow(\n agentId: string,\n displayName: string\n): InfoCardRow {\n return {\n label: \"\",\n value: formatAgentListItem({\n agentId,\n displayName,\n }),\n };\n}\n\nexport function buildReadyCountValue(count: number, noun: string): string {\n return `${formatAgentsToneText(\"success\", pc.bold(String(count)))} ${pc.dim(noun)}`;\n}\n\nexport function buildNotReadyCountValue(count: number, noun: string): string {\n return `${formatAgentsToneText(\"warning\", pc.bold(String(count)))} ${pc.dim(noun)}`;\n}\n","import pc from \"picocolors\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport { formatAgentsCopy } from \"./agents-text\";\n\nfunction normalizeDescriptionLines(description: string | string[]): string[] {\n const list = Array.isArray(description) ? description : [description];\n return list.map((line) => line.trim()).filter((line) => line.length > 0);\n}\n\nexport function buildInteractiveMenuMessage(input: {\n title: string;\n description: string | string[];\n}): string {\n return [\n input.title,\n ...normalizeDescriptionLines(input.description).map((line) =>\n pc.dim(formatAgentsCopy(line))\n ),\n \"\",\n ].join(\"\\n\");\n}\n\nexport function emitInteractiveDescription(\n description: string | string[]\n): void {\n const lines = normalizeDescriptionLines(description);\n if (lines.length === 0) {\n return;\n }\n process.stdout.write(\n `${lines.map((line) => pc.dim(formatAgentsCopy(line))).join(\"\\n\")}\\n`\n );\n}\n\nexport function emitHumanSectionDescription(\n presenter: ReturnType<typeof createPresenter>,\n input: {\n codePrefix: string;\n description: string | string[];\n }\n): void {\n if (presenter.view !== \"human\") {\n return;\n }\n const lines = normalizeDescriptionLines(input.description);\n for (const [index, line] of lines.entries()) {\n presenter.line({\n code: `${input.codePrefix}.description.${String(index)}`,\n text: pc.dim(formatAgentsCopy(line)),\n });\n }\n}\n\nexport function emitHumanSectionHeader(\n presenter: ReturnType<typeof createPresenter>,\n input: {\n codePrefix: string;\n title: string;\n }\n): void {\n if (presenter.view !== \"human\") {\n return;\n }\n presenter.line({\n code: `${input.codePrefix}.spacer`,\n text: \"\",\n });\n presenter.line({\n code: `${input.codePrefix}.title`,\n text: input.title,\n });\n}\n","import pc from \"picocolors\";\nimport type { AgentTargetState } from \"../agents/registry\";\nimport type { createPresenter } from \"../runtime/presenter/index\";\nimport type { InfoCardRow } from \"../ui/info-card\";\nimport {\n buildReadyAgentCardRow,\n buildTurnedOffAgentCardRow,\n renderAgentsInfoCard,\n} from \"./agents-cards\";\nimport { emitHumanSectionDescription } from \"./agents-descriptions\";\nimport { formatAgentsToneText, formatStatusTextForHuman } from \"./agents-text\";\n\nexport type EnableSummary = {\n requested: string[];\n registered: string[];\n reenabled: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{\n agentId: string;\n code: string;\n humanActionRequired?: boolean;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n }>;\n allMode: boolean;\n};\n\nexport type RepairSummary = {\n requested: string[];\n repaired: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{\n agentId: string;\n code: string;\n humanActionRequired?: boolean;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n }>;\n allMode: boolean;\n};\n\nexport type DisableSummary = {\n requested: string[];\n disabled: string[];\n skipped: Array<{ agentId: string; reason: string }>;\n errors: Array<{ agentId: string; code: string; reason: string }>;\n allMode: boolean;\n};\n\nconst AGENTS_ENABLE_RESULT_DESCRIPTION =\n \"These agents can now reply when someone mentions them in a Space from this computer.\";\nconst AGENTS_DISABLE_RESULT_DESCRIPTION =\n \"These agents will stop replying to new mentions in Spaces.\";\n\nexport function emitEnableSummaryCardsForHuman(input: {\n presenter: ReturnType<typeof createPresenter>;\n summary: EnableSummary;\n targetStateById: Map<string, AgentTargetState>;\n}): void {\n emitHumanSectionDescription(input.presenter, {\n codePrefix: \"agents.enable\",\n description: AGENTS_ENABLE_RESULT_DESCRIPTION,\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: \"agents.enable.summary.card\",\n title: \"Agents Turned On\",\n rows: buildEnableSummaryRows(input.summary),\n minContentWidth: 38,\n });\n\n const detailCards = buildEnableDetailCards(\n input.summary,\n input.targetStateById\n );\n for (const card of detailCards) {\n input.presenter.line({\n code: `agents.enable.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: `agents.enable.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 30,\n });\n }\n}\n\nfunction buildEnableSummaryRows(summary: EnableSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildEnableSummaryStatus(summary),\n },\n ];\n\n if (summary.registered.length > 0) {\n rows.push({\n label: \"On now\",\n value: String(summary.registered.length),\n });\n }\n if (summary.reenabled.length > 0) {\n rows.push({\n label: \"Back on\",\n value: String(summary.reenabled.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already on\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildEnableSummaryStatus(summary: EnableSummary): string {\n const readyCount = summary.registered.length + summary.reenabled.length;\n const reviewCount = summary.skipped.length + summary.errors.length;\n\n if (readyCount > 0 && reviewCount === 0) {\n if (summary.allMode) {\n return readyCount === 1\n ? `1 detected agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `All detected available agents are ${formatAgentsToneText(\"success\", \"on now\")}`;\n }\n return readyCount === 1\n ? `1 selected agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `${readyCount} selected agents are ${formatAgentsToneText(\"success\", \"available now\")}`;\n }\n\n if (readyCount > 0) {\n return readyCount === 1\n ? `1 agent is ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`\n : `${readyCount} agents are ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`;\n }\n\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already on\");\n }\n\n return formatAgentsToneText(\"warning\", \"OpenMeld could not turn these on\");\n}\n\nfunction buildEnableDetailCards(\n summary: EnableSummary,\n targetStateById: Map<string, AgentTargetState>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.registered.length > 0) {\n cards.push({\n codeSuffix: \"enabled_now\",\n title: `Turned On Now (${summary.registered.length})`,\n rows: summary.registered.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.reenabled.length > 0) {\n cards.push({\n codeSuffix: \"reenabled\",\n title: `Turned Back On (${summary.reenabled.length})`,\n rows: summary.reenabled.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_enabled\",\n title: `Already On (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatEnableSkippedReasonForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatEnableErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction resolveEnableResultDisplayName(\n agentId: string,\n targetStateById: Map<string, AgentTargetState>\n): string {\n return targetStateById.get(agentId)?.displayName ?? agentId;\n}\n\nfunction formatEnableSkippedReasonForHuman(reason: string): string {\n if (reason === \"already_enabled\") {\n return \"Already on in OpenMeld\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction formatEnableErrorReasonForHuman(input: {\n code: string;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n}): string {\n if (\n input.code === \"controller.launch.choice_required\" &&\n input.installChoices &&\n input.installChoices.length > 0\n ) {\n const choiceSummary = input.installChoices\n .map(\n (installChoice) =>\n `${installChoice.installId} (${installChoice.label} · ${installChoice.detail})`\n )\n .join(\"; \");\n const nextStepSummary = (input.nextSteps ?? []).join(\" or \");\n return [\n input.summary ??\n \"Needs your choice on this Mac before OpenMeld can continue.\",\n `Choices: ${choiceSummary}`,\n nextStepSummary ? `Next: ${nextStepSummary}` : null,\n ]\n .filter((line) => Boolean(line))\n .join(\" \");\n }\n if (input.reason === \"not found\") {\n return \"Not found on this computer\";\n }\n if (input.reason === \"will be supported soon\") {\n return \"Found on this computer, but OpenMeld support is coming soon\";\n }\n if (input.reason === \"custom target is not runnable yet\") {\n return \"Custom targets cannot be enabled yet\";\n }\n if (input.reason === \"not selectable in current runtime\") {\n return \"Not available in this runtime\";\n }\n if (input.reason === \"unknown built-in target id\") {\n return \"Not in the built-in support list\";\n }\n if (input.reason === \"needs repair\") {\n return \"Needs repair on this computer before OpenMeld can start it\";\n }\n if (input.reason === \"needs your choice\") {\n return \"Needs your choice on this Mac before OpenMeld can use it\";\n }\n if (input.code === \"agents.config_write_failed\") {\n return \"OpenMeld could not save this change\";\n }\n return formatStatusTextForHuman(input.reason);\n}\n\nexport function buildRepairSummaryRows(summary: RepairSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildRepairSummaryStatus(summary),\n },\n ];\n\n if (summary.repaired.length > 0) {\n rows.push({\n label: \"Repaired\",\n value: String(summary.repaired.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already available\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildRepairSummaryStatus(summary: RepairSummary): string {\n if (summary.repaired.length > 0 && summary.errors.length === 0) {\n if (summary.skipped.length === 0) {\n return summary.repaired.length === 1\n ? `1 agent is ${formatAgentsToneText(\"success\", \"available now\")}`\n : `${String(summary.repaired.length)} agents are ${formatAgentsToneText(\"success\", \"available now\")}`;\n }\n return `${String(summary.repaired.length)} agents are ${formatAgentsToneText(\"success\", \"available now\")} ${pc.dim(\"· review the rest below\")}`;\n }\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already available\");\n }\n return formatAgentsToneText(\n \"warning\",\n \"OpenMeld could not repair all selected agents\"\n );\n}\n\nexport function buildRepairDetailCards(\n summary: RepairSummary,\n targetStateById: Map<string, AgentTargetState>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.repaired.length > 0) {\n cards.push({\n codeSuffix: \"repaired\",\n title: `Available Now (${summary.repaired.length})`,\n rows: summary.repaired.map((agentId) =>\n buildReadyAgentCardRow(\n agentId,\n resolveEnableResultDisplayName(agentId, targetStateById)\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_ready\",\n title: `Already Available (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value:\n item.reason === \"already_ready\"\n ? \"Already available on this computer\"\n : formatStatusTextForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: resolveEnableResultDisplayName(item.agentId, targetStateById),\n value: formatRepairErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction formatRepairErrorReasonForHuman(input: {\n code: string;\n installChoices?: AgentTargetState[\"installChoices\"];\n nextSteps?: string[];\n reason: string;\n summary?: string;\n}): string {\n if (input.reason === \"agent is not registered\") {\n return \"This agent is not connected in OpenMeld yet\";\n }\n if (input.reason === \"custom target is not runnable yet\") {\n return \"Custom targets cannot be repaired yet\";\n }\n if (input.reason === \"unknown built-in target id\") {\n return \"Not in the built-in support list\";\n }\n return formatEnableErrorReasonForHuman(input);\n}\n\nexport function emitDisableSummaryCardsForHuman(input: {\n presenter: ReturnType<typeof createPresenter>;\n summary: DisableSummary;\n displayNameById: Map<string, string>;\n}): void {\n emitHumanSectionDescription(input.presenter, {\n codePrefix: \"agents.disable\",\n description: AGENTS_DISABLE_RESULT_DESCRIPTION,\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: \"agents.disable.summary.card\",\n title: \"Agents Turned Off\",\n rows: buildDisableSummaryRows(input.summary),\n minContentWidth: 38,\n });\n\n const detailCards = buildDisableDetailCards(\n input.summary,\n input.displayNameById\n );\n for (const card of detailCards) {\n input.presenter.line({\n code: `agents.disable.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter: input.presenter,\n codePrefix: `agents.disable.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 30,\n });\n }\n}\n\nfunction buildDisableSummaryRows(summary: DisableSummary): InfoCardRow[] {\n const rows: InfoCardRow[] = [\n {\n label: \"Status\",\n value: buildDisableSummaryStatus(summary),\n },\n ];\n\n if (summary.disabled.length > 0) {\n rows.push({\n label: \"Off now\",\n value: String(summary.disabled.length),\n });\n }\n if (summary.skipped.length > 0) {\n rows.push({\n label: \"Already off\",\n value: String(summary.skipped.length),\n });\n }\n if (summary.errors.length > 0) {\n rows.push({\n label: \"Needs attention\",\n value: String(summary.errors.length),\n });\n }\n\n return rows;\n}\n\nfunction buildDisableSummaryStatus(summary: DisableSummary): string {\n if (summary.disabled.length > 0 && summary.skipped.length === 0) {\n return summary.disabled.length === 1\n ? `1 agent ${formatAgentsToneText(\"warning\", \"turned off\")}`\n : `${String(summary.disabled.length)} agents ${formatAgentsToneText(\"warning\", \"turned off\")}`;\n }\n\n if (summary.disabled.length > 0) {\n return summary.disabled.length === 1\n ? `1 agent ${formatAgentsToneText(\"warning\", \"turned off\")} ${pc.dim(\"· review the rest below\")}`\n : `${String(summary.disabled.length)} agents ${formatAgentsToneText(\"warning\", \"turned off\")} ${pc.dim(\"· review the rest below\")}`;\n }\n\n if (summary.skipped.length > 0 && summary.errors.length === 0) {\n return formatAgentsToneText(\"info\", \"Already off\");\n }\n\n return formatAgentsToneText(\"warning\", \"OpenMeld could not turn these off\");\n}\n\nfunction buildDisableDetailCards(\n summary: DisableSummary,\n displayNameById: Map<string, string>\n): Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n}> {\n const cards: Array<{\n codeSuffix: string;\n title: string;\n rows: InfoCardRow[];\n }> = [];\n\n if (summary.disabled.length > 0) {\n cards.push({\n codeSuffix: \"turned_off\",\n title: `Turned Off (${summary.disabled.length})`,\n rows: summary.disabled.map((agentId) =>\n buildTurnedOffAgentCardRow(\n agentId,\n displayNameById.get(agentId) ?? agentId\n )\n ),\n });\n }\n\n if (summary.skipped.length > 0) {\n cards.push({\n codeSuffix: \"already_off\",\n title: `Already Off (${summary.skipped.length})`,\n rows: summary.skipped.map((item) => ({\n label: displayNameById.get(item.agentId) ?? item.agentId,\n value: formatDisableSkippedReasonForHuman(item.reason),\n })),\n });\n }\n\n if (summary.errors.length > 0) {\n cards.push({\n codeSuffix: \"needs_attention\",\n title: `Needs Attention (${summary.errors.length})`,\n rows: summary.errors.map((item) => ({\n label: displayNameById.get(item.agentId) ?? item.agentId,\n value: formatDisableErrorReasonForHuman(item),\n })),\n });\n }\n\n return cards;\n}\n\nfunction formatDisableSkippedReasonForHuman(reason: string): string {\n if (reason === \"already_disabled\") {\n return \"Already off in OpenMeld\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction formatDisableErrorReasonForHuman(input: {\n code: string;\n reason: string;\n}): string {\n if (input.reason === \"agent is not registered\") {\n return \"Not currently connected to OpenMeld\";\n }\n if (input.code === \"agents.config_write_failed\") {\n return \"OpenMeld could not save this change\";\n }\n return formatStatusTextForHuman(input.reason);\n}\n","import { isAbsolute } from \"node:path\";\nimport { cancel, isCancel, select } from \"@clack/prompts\";\nimport {\n buildAgentControllerRef,\n createAgentControllerInterfaceDisplayRows,\n} from \"@openmeld/agent-runtime\";\nimport { compareAgentControllerRefsForDisplay } from \"@openmeld/schemas\";\nimport type { AgentControllerInterfaceSnapshot } from \"@openmeld/schemas/types\";\nimport pc from \"picocolors\";\nimport { emitAgentsAgentOverview } from \"../agents/agent-overview\";\nimport {\n type BuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionCommand,\n buildBuiltinAgentSelectionExamples,\n validateBuiltinAgentSelectionInput,\n} from \"../agents/builtin-selection-contract\";\nimport { repairBuiltinControllerInstall } from \"../agents/local-controller-install\";\nimport {\n normalizeAgentId,\n normalizeAgentIds,\n parseAgentEnabledOption,\n sortAgentRegistrations,\n} from \"../agents/model\";\nimport {\n type AgentCustomTarget,\n type AgentTargetDescriptor,\n type AgentTargetState,\n addAgentCustomTarget,\n createRegistrationFromCatalogTarget,\n listAgentCustomTargets,\n listAgentRegistrations,\n listAgentTargetStates,\n readAgentRuntimeConfigHealth,\n removeAgentCustomTarget,\n resolveAgentTargetState,\n updateAgentCustomTarget,\n updateAgentRegistrations,\n} from \"../agents/registry\";\nimport {\n DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,\n type RuntimeAgentControllerState,\n type RuntimeAgentTransportMode,\n} from \"../config/runtime-config\";\nimport { resolveAgentControllerInterfaceSnapshot } from \"../local-service/inventory/agent-controller-interface\";\nimport { collectLocalAgentControllerInventory } from \"../local-service/inventory/agent-controller-inventory\";\nimport {\n formatInlineOpenMeldCliCommands,\n formatOpenMeldCliCommands,\n} from \"../runtime/cli-entry-command\";\nimport { emitCliJsonEnvelope } from \"../runtime/cli-json-output\";\nimport { resolveRuntimeContext } from \"../runtime/context\";\nimport { canUseInteractivePrompts } from \"../runtime/interaction\";\nimport { createPresenter } from \"../runtime/presenter/index\";\nimport {\n promptSearchMultiselect,\n promptSearchSelect,\n type SearchSelectItem,\n} from \"../ui/search-select\";\nimport { promptTextEntry } from \"../ui/text-entry\";\nimport { formatTransportModeDisplay } from \"../ui/transport-mode-display\";\nimport {\n buildNotReadyCountValue,\n buildReadyAgentCardRow,\n buildReadyCountValue,\n buildStatusAgentCardRow,\n renderAgentsInfoCard,\n} from \"./agents-cards\";\nimport {\n buildInteractiveMenuMessage,\n emitHumanSectionHeader,\n emitInteractiveDescription,\n} from \"./agents-descriptions\";\nimport {\n buildRepairDetailCards,\n buildRepairSummaryRows,\n type DisableSummary,\n type EnableSummary,\n emitDisableSummaryCardsForHuman,\n emitEnableSummaryCardsForHuman,\n type RepairSummary,\n} from \"./agents-summary-cards\";\nimport {\n formatAgentMention,\n formatAgentsCopy,\n formatAgentsToneText,\n formatStatusTextForHuman,\n normalizeOptionalString,\n} from \"./agents-text\";\n\ntype AgentsBaseInput = {\n interactive?: boolean;\n json?: boolean;\n view?: string;\n profile?: string;\n};\n\ntype AgentsEnableInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n install?: string;\n presentation?: \"handoff\" | \"standalone\";\n};\n\ntype AgentsDisableInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n};\n\ntype AgentsRepairInput = AgentsBaseInput & {\n all?: boolean;\n agent?: string[];\n changeInstall?: boolean;\n install?: string;\n presentation?: \"handoff\" | \"standalone\";\n};\n\ntype AgentsUnregisterInput = AgentsBaseInput & {\n agentId?: string;\n};\n\ntype AgentsShowInput = AgentsBaseInput & {\n agentId?: string;\n};\n\ntype AgentsConfigInput = AgentsBaseInput & {\n agentId?: string;\n enabled?: string;\n};\n\ntype AgentsCustomAddInput = AgentsBaseInput & {\n id?: string;\n name?: string;\n dir?: string;\n};\n\ntype AgentsCustomUpdateInput = AgentsBaseInput & {\n id?: string;\n name?: string;\n dir?: string;\n};\n\ntype AgentsCustomRemoveInput = AgentsBaseInput & {\n id?: string;\n};\n\nexport type AgentsEnableSummary = EnableSummary;\n\nexport type AgentsEnableResult = {\n status: \"back\" | \"cancelled\" | \"completed\";\n summary: AgentsEnableSummary;\n};\n\ntype EnableChoiceCandidate = AgentTargetState;\ntype BuiltinEnableChoiceCandidate = EnableChoiceCandidate & {\n targetKind: \"builtin\";\n};\ntype AgentTransportModeSource =\n | \"registration\"\n | \"registry_default\"\n | \"global_default\";\ntype AgentTransportModeStatus = \"missing\" | \"supported\" | \"unsupported\";\ntype RegisteredAgentTargetState = AgentTargetState & {\n registration: RuntimeAgentControllerState;\n};\ntype AgentViewLaunchStatus =\n | \"available\"\n | \"needs_choice\"\n | \"needs_repair\"\n | \"not_available\";\n\nexport type AgentsRepairSummary = RepairSummary;\n\nexport type AgentsRepairResult = {\n status: \"back\" | \"cancelled\" | \"completed\";\n summary: AgentsRepairSummary;\n};\n\nfunction isBuiltinEnableChoiceCandidate(\n value: AgentTargetState | null | undefined\n): value is BuiltinEnableChoiceCandidate {\n return value?.targetKind === \"builtin\";\n}\n\nfunction hasAgentRegistration(\n value: AgentTargetState | null | undefined\n): value is RegisteredAgentTargetState {\n return value?.registration !== null && value?.registration !== undefined;\n}\n\ntype MenuFlowResult = \"completed\" | \"cancelled\";\n\ntype PromptChoiceResult<T> =\n | {\n status: \"selected\";\n value: T;\n }\n | {\n status: \"empty\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"back\";\n };\n\ntype InteractiveCustomAgentsMenuChoice =\n | \"add\"\n | \"edit\"\n | \"remove\"\n | \"list\"\n | \"back\";\ntype AgentsManageAgentActionChoice =\n (typeof AGENTS_MANAGE_AGENT_ACTION_CHOICE)[keyof typeof AGENTS_MANAGE_AGENT_ACTION_CHOICE];\ntype AgentsMenuChoice =\n (typeof AGENTS_MENU_CHOICE)[keyof typeof AGENTS_MENU_CHOICE];\n\nconst AGENTS_MENU_CHOICE = {\n quickEnable: \"quick_enable\",\n manage: \"manage\",\n detect: \"detect\",\n custom: \"custom\",\n exit: \"exit\",\n} as const;\n\nconst AGENTS_MANAGE_AGENT_ACTION_CHOICE = {\n showDetails: \"show_details\",\n chooseInstall: \"choose_install\",\n repair: \"repair\",\n toggleEnabled: \"toggle_enabled\",\n back: \"back\",\n} as const;\n\nconst CUSTOM_AGENTS_COMING_SOON_OPTION_ID = \"__custom_agents_coming_soon__\";\nconst NO_REGISTERED_AGENTS_MANAGE_MESSAGE =\n \"No agents are set up on this computer yet. Run `openmeld agents detect`, then turn on the ones you want OpenMeld to use.\";\nconst NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE =\n \"No more agents are available to enable. Run `openmeld agents detect` to scan this computer again.\";\nconst AGENTS_MENU_DESCRIPTION =\n \"Enable agents on this computer so people in a Space can mention them.\";\nconst AGENTS_ENABLE_DESCRIPTION =\n \"Choose which new agents OpenMeld should turn on for Space from this computer.\";\nconst AGENTS_SELECT_REGISTERED_DESCRIPTION =\n \"Choose an agent on this computer to review or change.\";\n\nconst AGENTS_MENU_COMMANDS = [\n ...buildBuiltinAgentSelectionExamples({ command: \"enable\" }),\n ...buildBuiltinAgentSelectionExamples({ command: \"repair\" }),\n \"openmeld agents detect\",\n \"openmeld agents list\",\n \"openmeld agents manage\",\n ...buildBuiltinAgentSelectionExamples({ command: \"disable\" }),\n \"openmeld agents show <agent-id>\",\n \"openmeld agents config <agent-id> --enabled true|false\",\n \"openmeld agents custom list\",\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n \"openmeld agents custom remove --id <id>\",\n];\n\nconst AGENTS_MANAGE_RESULT_COMMANDS = [\n \"openmeld agents list\",\n \"openmeld agents show <agent-id>\",\n ...buildBuiltinAgentSelectionExamples({ command: \"repair\" }),\n \"openmeld agents config <agent-id> --enabled true|false\",\n ...buildBuiltinAgentSelectionExamples({ command: \"disable\" }),\n];\n\nfunction formatBuiltinAgentSelectionAlternatives(\n command: BuiltinAgentSelectionCommand\n): string {\n return buildBuiltinAgentSelectionExamples({ command })\n .filter((example) => !example.includes(\" --install \"))\n .map((example) => `\\`${example}\\``)\n .join(\" or \");\n}\n\nfunction buildBuiltinAgentMenuActions(\n command: BuiltinAgentSelectionCommand\n): Array<{ command: string; description: string }> {\n switch (command) {\n case \"enable\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Enable every detected agent OpenMeld can use on this computer.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description: \"Enable selected agents so OpenMeld can use them.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id>\"],\n command,\n installId: \"<install-id>\",\n }),\n description:\n \"Enable one agent with the exact local install OpenMeld should use.\",\n },\n ];\n case \"repair\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Repair every connected builtin agent on this computer that needs attention.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description:\n \"Refresh how OpenMeld starts selected agents on this computer.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id>\"],\n command,\n installId: \"<install-id>\",\n }),\n description: \"Repair one agent with the exact local install to use.\",\n },\n ];\n case \"disable\":\n return [\n {\n command: buildBuiltinAgentSelectionCommand({\n all: true,\n command,\n }),\n description:\n \"Disable every enabled agent for new mentions in Spaces.\",\n },\n {\n command: buildBuiltinAgentSelectionCommand({\n agentIds: [\"<id...>\"],\n command,\n }),\n description:\n \"Disable selected agents so new mentions in Spaces stop waking them.\",\n },\n ];\n default: {\n const exhaustiveCheck: never = command;\n throw new Error(\n `unsupported builtin agent selection command: ${exhaustiveCheck}`\n );\n }\n }\n}\n\nfunction formatAgentViewLaunchStatus(\n status: AgentTargetState[\"launchStatus\"]\n): AgentViewLaunchStatus {\n return status === \"ready\" ? \"available\" : status;\n}\n\nfunction buildQuickEnableOptionHint(actionableBuiltinCount: number): string {\n return actionableBuiltinCount === 1\n ? \"1 new agent can be turned on now\"\n : `${String(actionableBuiltinCount)} new agents can be turned on now`;\n}\n\nfunction buildManageOptionHint(registeredCount: number): string {\n if (registeredCount === 0) {\n return \"No agents are set up on this computer yet\";\n }\n if (registeredCount === 1) {\n return \"Review 1 agent on this computer\";\n }\n return `Review ${String(registeredCount)} agents on this computer`;\n}\n\nfunction buildDetectedAgentsSubtitle(detectedAgentsCount: number): string {\n return detectedAgentsCount === 1\n ? \"1 agent found on this computer\"\n : `${String(detectedAgentsCount)} agents found on this computer`;\n}\n\nfunction buildEnabledAgentsSubtitle(enabledAgentsCount: number): string {\n return enabledAgentsCount === 1\n ? \"1 agent is live for Space\"\n : `${String(enabledAgentsCount)} agents are live for Space`;\n}\n\nexport async function runAgents(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"menu\",\n });\n const payload = await buildAgentsMenuPayload();\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.menu.result\",\n payload,\n });\n return;\n }\n\n if (canUseInteractivePrompts(runtime)) {\n await runInteractiveAgentsMenu({\n profile: input.profile,\n view: runtime.resolvedView,\n });\n return;\n }\n\n presenter.line({\n code: \"agents.menu.header\",\n text: \"OpenMeld agents commands:\",\n });\n for (const command of formatOpenMeldCliCommands(payload.commands)) {\n presenter.line({\n code: \"agents.menu.command\",\n text: `- ${command}`,\n });\n }\n for (const note of payload.notes) {\n presenter.line({\n code: \"agents.menu.note\",\n text: `- ${formatAgentsCopy(note)}`,\n });\n }\n}\n\nexport async function runAgentsManage(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"manage\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.manage.result\",\n payload: {\n interactive: true,\n supportedView: \"human\",\n commands: [...AGENTS_MANAGE_RESULT_COMMANDS],\n },\n });\n return;\n }\n\n if (!canUseInteractivePrompts(runtime)) {\n presenter.line({\n code: \"agents.manage.non_interactive\",\n text: formatInlineOpenMeldCliCommands(\n \"This menu is interactive. In scripts or non-interactive terminals, use `openmeld agents list`, `openmeld agents show <agent-id>`, `openmeld agents config <agent-id> --enabled true|false`, or `openmeld agents disable --agent <id...>`.\"\n ),\n });\n return;\n }\n\n const flow = await runInteractiveAgentsManageMenu({\n view: \"human\",\n profile: input.profile,\n });\n if (flow === \"cancelled\") {\n cancel(\"Cancelled.\");\n }\n}\n\nasync function runInteractiveAgentsMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<void> {\n while (true) {\n const { enableCandidates, registrations } =\n await resolveAgentsChoiceState();\n const actionableBuiltinCount = enableCandidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.registered\n ).length;\n const registeredCount = registrations.length;\n const choice = await select({\n message: buildInteractiveMenuMessage({\n title: \"OpenMeld agents:\",\n description: AGENTS_MENU_DESCRIPTION,\n }),\n options: [\n ...(actionableBuiltinCount > 0\n ? [\n {\n value: AGENTS_MENU_CHOICE.quickEnable,\n label: \"Enable available agents\",\n hint: buildQuickEnableOptionHint(actionableBuiltinCount),\n },\n ]\n : []),\n {\n value: AGENTS_MENU_CHOICE.manage,\n label: \"Review Agents on This Device\",\n hint: buildManageOptionHint(registeredCount),\n },\n {\n value: AGENTS_MENU_CHOICE.detect,\n label: \"Find Agents on This Device\",\n hint: \"Check which supported AI tools OpenMeld can see here\",\n },\n {\n value: AGENTS_MENU_CHOICE.exit,\n label: \"Exit\",\n },\n ],\n });\n\n if (isCancel(choice)) {\n cancel(\"Cancelled.\");\n return;\n }\n if (choice === AGENTS_MENU_CHOICE.exit) {\n return;\n }\n\n const flow = await runInteractiveAgentsMenuChoice({\n input,\n choice: choice as AgentsMenuChoice,\n });\n if (flow === \"cancelled\") {\n cancel(\"Cancelled.\");\n return;\n }\n }\n}\n\nasync function runInteractiveAgentsMenuChoice(input: {\n input: {\n view: \"human\";\n profile?: string;\n };\n choice: AgentsMenuChoice;\n}): Promise<MenuFlowResult | \"continue\"> {\n switch (input.choice) {\n case AGENTS_MENU_CHOICE.detect:\n await runAgentsDetect(input.input);\n return \"continue\";\n case AGENTS_MENU_CHOICE.quickEnable:\n return runInteractiveAgentsEnable(input.input);\n case AGENTS_MENU_CHOICE.manage:\n return runInteractiveAgentsManageMenu(input.input);\n case AGENTS_MENU_CHOICE.custom:\n return runInteractiveCustomAgentsMenu(input.input);\n default:\n return \"continue\";\n }\n}\n\nasync function buildAgentsMenuPayload(): Promise<{\n commands: string[];\n notes: string[];\n actions: Array<{ command: string; description: string }>;\n selection: {\n enableCandidates: Array<{\n agentId: string;\n displayName: string;\n targetKind: AgentTargetDescriptor[\"targetKind\"];\n detected: boolean;\n lifecycleStatus: AgentTargetState[\"lifecycleStatus\"];\n registered: boolean;\n enabled: boolean;\n selectable: boolean;\n selectableReason: string | null;\n defaultTransportMode: string | null;\n transportModes: Array<{\n mode: string;\n label: string;\n description: string;\n }>;\n status:\n | \"detected_supported\"\n | \"detected_needs_choice\"\n | \"detected_needs_repair\"\n | \"detected_not_supported_yet\"\n | \"detected_suspended\"\n | \"not_detected\"\n | \"custom_coming_soon\";\n launchStatus: AgentViewLaunchStatus;\n launchStatusDetail: string | null;\n customDir?: string;\n }>;\n selectableAgentIds: string[];\n registeredAgents: Array<{\n agentId: string;\n displayName: string;\n enabled: boolean;\n }>;\n disableCandidates: Array<{\n agentId: string;\n displayName: string;\n enabled: boolean;\n }>;\n customAgents: {\n supported: boolean;\n message: string;\n commands: string[];\n };\n };\n}> {\n const { enableCandidates, registrations } = await resolveAgentsChoiceState();\n const registeredAgents = registrations.map((registration) => ({\n agentId: registration.agentId,\n displayName: registration.displayName,\n enabled: registration.enabled,\n }));\n return {\n commands: formatOpenMeldCliCommands([...AGENTS_MENU_COMMANDS]),\n notes: [\n \"Agents are AI tools on this computer. When you enable one, people in a Space can mention `@agent-id` to wake it and get a reply.\",\n \"Use `openmeld agents detect` to look for supported AI tools on this computer.\",\n `Use ${formatBuiltinAgentSelectionAlternatives(\"enable\")} to enable the agents that are available.`,\n `If OpenMeld can see an agent but cannot start it here, use ${formatBuiltinAgentSelectionAlternatives(\"repair\")}.`,\n \"Use `openmeld agents manage` to review enabled agents and change them later.\",\n \"Manage custom agents with `openmeld agents custom`.\",\n ].map(formatAgentsCopy),\n actions: [\n ...buildBuiltinAgentMenuActions(\"enable\"),\n ...buildBuiltinAgentMenuActions(\"repair\"),\n {\n command: \"openmeld agents detect\",\n description: \"Look for supported AI tools on this computer.\",\n },\n {\n command: \"openmeld agents list\",\n description: \"List the agents people can mention in a Space.\",\n },\n {\n command: \"openmeld agents manage\",\n description: \"Review enabled agents and change their settings.\",\n },\n ...buildBuiltinAgentMenuActions(\"disable\"),\n {\n command: \"openmeld agents show <agent-id>\",\n description: \"Show one agent's current OpenMeld settings.\",\n },\n {\n command: \"openmeld agents config <agent-id> --enabled true|false\",\n description: \"Enable or disable one agent for Space mentions.\",\n },\n {\n command: \"openmeld agents custom list\",\n description:\n \"List custom agent targets stored in the local OpenMeld config.\",\n },\n {\n command:\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n description: \"Add a custom agent target to the local OpenMeld config.\",\n },\n {\n command:\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n description:\n \"Update a custom agent target while keeping its id stable.\",\n },\n {\n command: \"openmeld agents custom remove --id <id>\",\n description:\n \"Remove a custom agent target that is not currently connected.\",\n },\n ].map((action) => ({\n ...action,\n command: formatOpenMeldCliCommands([action.command])[0] ?? action.command,\n })),\n selection: {\n enableCandidates: enableCandidates.map((candidate) => ({\n agentId: candidate.agentId,\n displayName: candidate.displayName,\n targetKind: candidate.targetKind,\n detected: candidate.detected,\n lifecycleStatus: candidate.lifecycleStatus,\n registered: candidate.registered,\n enabled: candidate.enabled,\n selectable: candidate.selectable,\n selectableReason: candidate.selectableReason,\n launchStatus: formatAgentViewLaunchStatus(candidate.launchStatus),\n launchStatusDetail: candidate.launchStatusDetail,\n defaultTransportMode: candidate.defaultTransportMode ?? null,\n transportModes: candidate.transportModes,\n status: resolveEnableCandidateStatus(candidate),\n ...(candidate.customDir ? { customDir: candidate.customDir } : {}),\n })),\n selectableAgentIds: enableCandidates\n .filter(canSelectAgentForNewLocalAgentSetup)\n .map((candidate) => candidate.agentId),\n registeredAgents,\n disableCandidates: registeredAgents.map((agent) => ({\n agentId: agent.agentId,\n displayName: agent.displayName,\n enabled: agent.enabled,\n })),\n customAgents: {\n supported: false,\n message: formatAgentsCopy(\n \"Custom agents are not available in this list yet. Use `openmeld agents custom` for now.\"\n ),\n commands: formatOpenMeldCliCommands([\n \"openmeld agents custom list\",\n \"openmeld agents custom add --name <name> --dir <dir> [--id <id>]\",\n \"openmeld agents custom update --id <id> [--name <name>] [--dir <dir>]\",\n \"openmeld agents custom remove --id <id>\",\n ]),\n },\n },\n };\n}\n\nasync function resolveAgentsChoiceState(): Promise<{\n registrations: RuntimeAgentControllerState[];\n enableCandidates: EnableChoiceCandidate[];\n}> {\n const enableCandidates = await listAgentTargetStates();\n const registrations = enableCandidates\n .flatMap((candidate) =>\n candidate.registration ? [candidate.registration] : []\n )\n .sort((left, right) =>\n compareAgentControllerRefsForDisplay(left.agentId, right.agentId)\n );\n return {\n registrations,\n enableCandidates,\n };\n}\n\nfunction resolveEnableCandidateStatus(\n candidate: EnableChoiceCandidate\n):\n | \"detected_supported\"\n | \"detected_needs_choice\"\n | \"detected_needs_repair\"\n | \"detected_not_supported_yet\"\n | \"detected_suspended\"\n | \"not_detected\"\n | \"custom_coming_soon\" {\n if (candidate.targetKind === \"custom\") {\n return \"custom_coming_soon\";\n }\n if (!candidate.detected) {\n return \"not_detected\";\n }\n if (candidate.lifecycleStatus === \"suspended\") {\n return \"detected_suspended\";\n }\n if (candidate.launchStatus === \"needs_choice\") {\n return \"detected_needs_choice\";\n }\n if (candidate.launchStatus === \"needs_repair\") {\n return \"detected_needs_repair\";\n }\n if (!candidate.selectable) {\n return \"detected_not_supported_yet\";\n }\n return \"detected_supported\";\n}\n\nfunction canSelectAgentForNewLocalAgentSetup(\n candidate: EnableChoiceCandidate\n): boolean {\n return (\n candidate.targetKind === \"builtin\" &&\n candidate.lifecycleStatus !== \"suspended\" &&\n candidate.selectable\n );\n}\n\nfunction buildUnifiedEnableTargetHint(\n candidate: EnableChoiceCandidate\n): string {\n if (candidate.enabled) {\n return \"Already turned on in OpenMeld\";\n }\n if (!candidate.detected) {\n return \"Not found on this computer\";\n }\n if (candidate.lifecycleStatus === \"suspended\") {\n return \"Suspended for new OpenMeld profiles\";\n }\n if (candidate.launchStatus === \"needs_choice\") {\n return \"Needs your choice on this Mac before OpenMeld can turn it on\";\n }\n if (\n !candidate.selectable &&\n candidate.selectableReason === \"not_supported_yet\"\n ) {\n return \"Found on this computer, but OpenMeld doesn't support it yet\";\n }\n if (!candidate.selectable && candidate.selectableReason === \"needs_repair\") {\n return \"Needs repair before OpenMeld can start it here\";\n }\n if (!candidate.selectable && candidate.selectableReason) {\n return formatSelectableReasonForHuman(candidate.selectableReason);\n }\n return \"Available to enable now\";\n}\n\nfunction formatSelectableReason(reason: string): string {\n if (reason === \"not_detected\") {\n return \"not found\";\n }\n if (reason === \"not_supported_yet\") {\n return \"will be supported soon\";\n }\n if (reason === \"custom_coming_soon\") {\n return \"coming soon\";\n }\n if (reason === \"needs_choice\") {\n return \"needs your choice\";\n }\n if (reason === \"needs_repair\") {\n return \"needs repair\";\n }\n if (reason === \"suspended\") {\n return \"suspended\";\n }\n return reason;\n}\n\nfunction formatSelectableReasonForHuman(reason: string): string {\n if (reason === \"not_detected\") {\n return \"Not found on this computer\";\n }\n if (reason === \"not_supported_yet\") {\n return \"Found on this computer, but OpenMeld doesn't support it yet\";\n }\n if (reason === \"custom_coming_soon\") {\n return \"Custom agent support is coming soon\";\n }\n if (reason === \"needs_choice\") {\n return \"Needs your choice on this Mac before OpenMeld can use it\";\n }\n if (reason === \"needs_repair\") {\n return \"Needs repair on this computer before OpenMeld can start it\";\n }\n if (reason === \"suspended\") {\n return \"Suspended for new OpenMeld profiles\";\n }\n return formatStatusTextForHuman(reason);\n}\n\nfunction resolveEnableBlockedReason(\n state: {\n targetKind: AgentTargetDescriptor[\"targetKind\"];\n detected: boolean;\n launchStatus?: EnableChoiceCandidate[\"launchStatus\"];\n selectable: boolean;\n selectableReason: string | null;\n lifecycleStatus?: AgentTargetState[\"lifecycleStatus\"];\n } | null\n): string {\n if (!state) {\n return \"unknown built-in target id\";\n }\n if (state.targetKind === \"custom\") {\n return \"custom target is not runnable yet\";\n }\n if (!state.detected) {\n return \"not found\";\n }\n if (state.lifecycleStatus === \"suspended\") {\n return \"suspended for new OpenMeld profiles\";\n }\n if (state.launchStatus === \"needs_choice\") {\n return \"needs your choice\";\n }\n if (!state.selectable && state.selectableReason === \"needs_repair\") {\n return \"needs repair\";\n }\n if (!state.selectable && state.selectableReason) {\n return formatSelectableReason(state.selectableReason);\n }\n return \"not selectable in current runtime\";\n}\n\nfunction buildRegisteredAgentHint(\n state: EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n): string {\n const activationHint = state.registration.enabled\n ? \"Turned on\"\n : \"Turned off for new @mentions\";\n if (state.launchStatus === \"needs_choice\") {\n return buildMetadataDetailLine([\n activationHint,\n \"Needs your choice on this Mac\",\n ]);\n }\n if (state.launchStatus === \"needs_repair\") {\n return buildMetadataDetailLine([\n activationHint,\n \"Needs repair on this computer\",\n ]);\n }\n return buildMetadataDetailLine([\n activationHint,\n state.registration.enabled ? \"Live for Space @mentions\" : null,\n ]);\n}\n\nasync function runInteractiveAgentsEnable(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const { enableCandidates } = await resolveAgentsChoiceState();\n const builtinCandidates = enableCandidates.filter(\n (candidate) => candidate.targetKind === \"builtin\"\n );\n const actionableCandidates = builtinCandidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.registered\n );\n if (actionableCandidates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE)}\\n`\n );\n return \"completed\";\n }\n\n const selectedResult = await promptEnableAgentIdsFromUnifiedBuiltins({\n candidates: actionableCandidates,\n });\n if (selectedResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedResult.status !== \"selected\") {\n return \"completed\";\n }\n await runAgentsEnable({\n agent: selectedResult.value,\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n}\n\nasync function runInteractiveCustomAgentsMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n while (true) {\n const choiceResult = await promptInteractiveCustomAgentsMenuChoice();\n const outcome = await handleInteractiveCustomAgentsMenuChoice({\n input,\n choiceResult,\n });\n if (outcome === \"continue\") {\n continue;\n }\n return outcome;\n }\n}\n\nasync function runInteractiveAgentsManageMenu(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const registeredStates = await listRegisteredAgentStates();\n if (registeredStates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_REGISTERED_AGENTS_MANAGE_MESSAGE)}\\n`\n );\n return \"completed\";\n }\n\n while (true) {\n const selectedAgentResult = await promptSelectRegisteredAgent({\n message: \"Choose an agent\",\n emptyMessage: NO_REGISTERED_AGENTS_MANAGE_MESSAGE,\n });\n if (selectedAgentResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedAgentResult.status !== \"selected\") {\n return \"completed\";\n }\n\n const selectedState = selectedAgentResult.value;\n const actionResult = await promptInteractiveAgentsManageAgentAction({\n agentId: selectedState.agentId,\n displayName: selectedState.displayName,\n enabled: selectedState.enabled,\n launchStatus: selectedState.launchStatus,\n });\n if (actionResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (\n actionResult.status !== \"selected\" ||\n actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.back\n ) {\n continue;\n }\n if (actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.showDetails) {\n await runAgentsShow({\n agentId: selectedState.agentId,\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n if (actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.repair) {\n await runAgentsRepair({\n agent: [selectedState.agentId],\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n if (\n actionResult.value === AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall\n ) {\n await runAgentsRepair({\n agent: [selectedState.agentId],\n changeInstall: true,\n profile: input.profile,\n view: input.view,\n });\n continue;\n }\n\n await runAgentsConfig({\n agentId: selectedState.agentId,\n enabled: selectedState.enabled ? \"false\" : \"true\",\n profile: input.profile,\n view: input.view,\n });\n }\n}\n\nasync function handleInteractiveCustomAgentsMenuChoice(input: {\n input: {\n view: \"human\";\n profile?: string;\n };\n choiceResult: PromptChoiceResult<InteractiveCustomAgentsMenuChoice>;\n}): Promise<MenuFlowResult | \"continue\"> {\n if (input.choiceResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (input.choiceResult.status !== \"selected\") {\n return \"completed\";\n }\n\n switch (input.choiceResult.value) {\n case \"back\":\n return \"completed\";\n case \"list\":\n await runAgentsCustomList({\n profile: input.input.profile,\n view: input.input.view,\n });\n return \"continue\";\n case \"add\": {\n const flow = await runInteractiveCustomAgentsAddFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n case \"remove\": {\n const flow = await runInteractiveCustomAgentsRemoveFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n case \"edit\": {\n const flow = await runInteractiveCustomAgentsEditFlow(input.input);\n return flow === \"cancelled\" ? \"cancelled\" : \"continue\";\n }\n default:\n return \"completed\";\n }\n}\n\nasync function promptInteractiveAgentsManageAgentAction(input: {\n agentId: string;\n displayName: string;\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): Promise<PromptChoiceResult<AgentsManageAgentActionChoice>> {\n const action = await select({\n message: buildInteractiveMenuMessage({\n title: `Agent: ${input.agentId}`,\n description: `When on, @${input.agentId} in Space can wake ${input.displayName}.`,\n }),\n options: [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.showDetails,\n label: \"View Setup\",\n },\n ...(input.launchStatus === \"needs_choice\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall,\n label: \"Choose install on This Device\",\n hint: \"Pick which local install OpenMeld should use\",\n },\n ]\n : []),\n ...(input.launchStatus === \"needs_repair\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.repair,\n label: \"Repair on This Device\",\n hint: \"Refresh how OpenMeld starts it locally\",\n },\n ]\n : []),\n ...(input.launchStatus === \"ready\"\n ? [\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.chooseInstall,\n label: \"Change install on This Device\",\n hint: \"Pick a different local install for future replies\",\n },\n ]\n : []),\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.toggleEnabled,\n label: input.enabled\n ? \"Turn Off for Space @mentions\"\n : \"Turn On for Space @mentions\",\n hint: input.enabled\n ? \"Stop waking it for new @mentions\"\n : \"Allow @mentions to wake it again\",\n },\n {\n value: AGENTS_MANAGE_AGENT_ACTION_CHOICE.back,\n label: \"Back to Agents\",\n },\n ],\n });\n if (isCancel(action)) {\n return {\n status: \"cancelled\",\n };\n }\n return {\n status: \"selected\",\n value: action as AgentsManageAgentActionChoice,\n };\n}\n\nasync function promptInteractiveCustomAgentsMenuChoice(): Promise<\n PromptChoiceResult<InteractiveCustomAgentsMenuChoice>\n> {\n const choice = await select({\n message: \"Custom Targets:\",\n options: [\n {\n value: \"add\",\n label: \"Add custom target\",\n hint: \"Create a new custom agent target\",\n },\n {\n value: \"edit\",\n label: \"Edit custom target\",\n hint: \"Update name or dir (id remains stable)\",\n },\n {\n value: \"remove\",\n label: \"Remove custom target\",\n hint: \"Blocked when target is currently registered\",\n },\n {\n value: \"list\",\n label: \"List custom targets\",\n hint: \"Show custom targets and current status\",\n },\n {\n value: \"back\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(choice)) {\n return {\n status: \"cancelled\",\n };\n }\n return {\n status: \"selected\",\n value: choice as InteractiveCustomAgentsMenuChoice,\n };\n}\n\nasync function runInteractiveCustomAgentsAddFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n let namePlaceholder = \"e.g. OpenMeld Agent Executor\";\n let dirPlaceholder = \"/absolute/path/to/skills\";\n let idPlaceholder = \"leave empty to auto-generate from dir\";\n\n while (true) {\n const nameResult = await promptRequiredInteractiveText({\n message: \"Custom target name\",\n placeholder: namePlaceholder,\n requiredMessage: \"Custom target name is required.\",\n });\n if (nameResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (nameResult.status !== \"selected\") {\n return \"completed\";\n }\n namePlaceholder = nameResult.value;\n\n const addDetails = await promptInteractiveCustomAgentAddDetails({\n dirPlaceholder,\n idPlaceholder,\n });\n if (addDetails.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (addDetails.status !== \"submitted\") {\n continue;\n }\n dirPlaceholder = addDetails.value.dir;\n if (addDetails.value.idInput) {\n idPlaceholder = addDetails.value.idInput;\n }\n\n await runAgentsCustomAdd({\n name: nameResult.value,\n dir: addDetails.value.dir,\n ...(addDetails.value.id ? { id: addDetails.value.id } : {}),\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n }\n}\n\nasync function runInteractiveCustomAgentsRemoveFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n const selectedTargetResult = await promptSelectCustomTarget({\n message: \"Select custom target to remove\",\n emptyMessage:\n \"No custom targets available. Add a custom target with `openmeld agents custom add --name <name> --dir <dir>`.\",\n });\n if (selectedTargetResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedTargetResult.status !== \"selected\") {\n return \"completed\";\n }\n await runAgentsCustomRemove({\n id: selectedTargetResult.value.id,\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n}\n\nasync function runInteractiveCustomAgentsEditFlow(input: {\n view: \"human\";\n profile?: string;\n}): Promise<MenuFlowResult> {\n while (true) {\n const selectedTargetResult = await promptSelectCustomTarget({\n message: \"Select custom target to edit\",\n emptyMessage:\n \"No custom targets available. Add a custom target with `openmeld agents custom add --name <name> --dir <dir>`.\",\n });\n if (selectedTargetResult.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (selectedTargetResult.status !== \"selected\") {\n return \"completed\";\n }\n const updateRequest = await promptInteractiveCustomAgentUpdate(\n selectedTargetResult.value\n );\n if (updateRequest.status === \"cancelled\") {\n return \"cancelled\";\n }\n if (updateRequest.status !== \"submitted\") {\n continue;\n }\n\n await runAgentsCustomUpdate({\n id: updateRequest.value.id,\n ...(\"name\" in updateRequest.value\n ? { name: updateRequest.value.name }\n : { dir: updateRequest.value.dir }),\n profile: input.profile,\n view: input.view,\n });\n return \"completed\";\n }\n}\n\nasync function promptInteractiveCustomAgentAddDetails(input: {\n dirPlaceholder: string;\n idPlaceholder: string;\n}): Promise<\n | {\n status: \"submitted\";\n value: {\n dir: string;\n id?: string;\n idInput?: string;\n };\n }\n | {\n status: \"back\" | \"cancelled\";\n }\n> {\n while (true) {\n const dirResult = await promptRequiredInteractiveText({\n message: \"Custom target absolute dir\",\n placeholder: input.dirPlaceholder,\n requiredMessage: \"Custom target absolute dir is required.\",\n validate: (value) =>\n isAbsolute(value)\n ? null\n : \"Custom target absolute dir must be an absolute path.\",\n });\n if (dirResult.status === \"cancelled\" || dirResult.status === \"back\") {\n return dirResult;\n }\n if (dirResult.status !== \"selected\") {\n continue;\n }\n\n const idResult = await promptInteractiveText({\n message: \"Custom target id (optional)\",\n placeholder: input.idPlaceholder,\n allowEmpty: true,\n });\n if (idResult.status === \"cancelled\") {\n return idResult;\n }\n if (idResult.status === \"back\") {\n input.dirPlaceholder = dirResult.value;\n continue;\n }\n if (idResult.status !== \"selected\") {\n continue;\n }\n\n return {\n status: \"submitted\",\n value: {\n dir: dirResult.value,\n id: normalizeOptionalString(idResult.value) ?? undefined,\n idInput: normalizeOptionalString(idResult.value) ?? undefined,\n },\n };\n }\n}\n\nasync function promptInteractiveCustomAgentUpdate(\n selectedTarget: AgentCustomTarget\n): Promise<\n | {\n status: \"submitted\";\n value:\n | {\n id: string;\n name: string;\n }\n | {\n id: string;\n dir: string;\n };\n }\n | {\n status: \"back\" | \"cancelled\";\n }\n> {\n while (true) {\n const field = await promptInteractiveCustomAgentEditField();\n if (field.status === \"cancelled\" || field.status === \"back\") {\n return field;\n }\n if (field.status !== \"selected\") {\n continue;\n }\n\n const valueResult = await promptInteractiveCustomAgentEditValue({\n field: field.value,\n selectedTarget,\n });\n if (valueResult.status === \"cancelled\") {\n return valueResult;\n }\n if (valueResult.status === \"back\") {\n continue;\n }\n if (valueResult.status !== \"selected\") {\n continue;\n }\n return {\n status: \"submitted\",\n value:\n field.value === \"name\"\n ? {\n id: selectedTarget.id,\n name: valueResult.value,\n }\n : {\n id: selectedTarget.id,\n dir: valueResult.value,\n },\n };\n }\n}\n\nasync function promptInteractiveCustomAgentEditField(): Promise<\n PromptChoiceResult<\"name\" | \"dir\">\n> {\n const field = await select({\n message: \"Edit field\",\n options: [\n {\n value: \"name\",\n label: \"Name\",\n },\n {\n value: \"dir\",\n label: \"Dir\",\n },\n {\n value: \"back\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(field)) {\n return {\n status: \"cancelled\",\n };\n }\n if (field === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: field,\n };\n}\n\nfunction promptInteractiveCustomAgentEditValue(input: {\n field: \"name\" | \"dir\";\n selectedTarget: AgentCustomTarget;\n}): Promise<PromptChoiceResult<string>> {\n return input.field === \"name\"\n ? promptRequiredInteractiveText({\n message: \"New name\",\n placeholder: input.selectedTarget.name,\n requiredMessage: \"Custom target name is required.\",\n })\n : promptRequiredInteractiveText({\n message: \"New absolute dir\",\n placeholder: input.selectedTarget.dir,\n requiredMessage: \"Custom target absolute dir is required.\",\n validate: (nextDir) =>\n isAbsolute(nextDir)\n ? null\n : \"Custom target absolute dir must be an absolute path.\",\n });\n}\n\nasync function promptInteractiveText(input: {\n message: string;\n placeholder?: string;\n allowEmpty?: boolean;\n}): Promise<PromptChoiceResult<string>> {\n const value = await promptTextEntry({\n message: input.message,\n ...(input.placeholder ? { placeholder: input.placeholder } : {}),\n allowBack: true,\n backLabel: \"Back\",\n allowEmpty: input.allowEmpty === true,\n requiredMessage: \"Value is required.\",\n });\n if (value.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (value.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: value.value,\n };\n}\n\nasync function promptRequiredInteractiveText(input: {\n message: string;\n placeholder?: string;\n requiredMessage: string;\n validate?: (value: string) => string | null;\n}): Promise<PromptChoiceResult<string>> {\n while (true) {\n const valueResult = await promptInteractiveText({\n message: input.message,\n ...(input.placeholder ? { placeholder: input.placeholder } : {}),\n });\n if (valueResult.status === \"cancelled\" || valueResult.status === \"back\") {\n return valueResult;\n }\n if (valueResult.status !== \"selected\") {\n continue;\n }\n\n const normalizedValue = normalizeOptionalString(valueResult.value);\n if (!normalizedValue) {\n process.stderr.write(`${input.requiredMessage}\\n`);\n continue;\n }\n\n const validationMessage = input.validate?.(normalizedValue) ?? null;\n if (validationMessage) {\n process.stderr.write(`${validationMessage}\\n`);\n continue;\n }\n return {\n status: \"selected\",\n value: normalizedValue,\n };\n }\n}\n\nasync function promptSelectCustomTarget(input: {\n message: string;\n emptyMessage: string;\n}): Promise<PromptChoiceResult<AgentCustomTarget>> {\n const customTargets = await listAgentCustomTargets();\n if (customTargets.length === 0) {\n process.stderr.write(`${formatAgentsCopy(input.emptyMessage)}\\n`);\n return {\n status: \"empty\",\n };\n }\n\n const choice = await promptSearchSelect({\n message: input.message,\n items: customTargets.map(buildCustomTargetSearchItem),\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (choice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (choice.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n\n const id = normalizeAgentId(choice.value);\n const selectedTarget = customTargets.find((target) => target.id === id);\n if (!selectedTarget) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: selectedTarget,\n };\n}\n\nasync function promptEnableAgentIdsFromUnifiedBuiltins(input: {\n candidates: EnableChoiceCandidate[];\n}): Promise<PromptChoiceResult<string[]>> {\n const selectableCandidates = input.candidates.filter(\n (candidate) =>\n canSelectAgentForNewLocalAgentSetup(candidate) && !candidate.enabled\n );\n if (selectableCandidates.length === 0) {\n process.stderr.write(\n `${formatAgentsCopy(NO_ACTIONABLE_AGENTS_ENABLE_MESSAGE)}\\n`\n );\n return {\n status: \"empty\",\n };\n }\n\n emitInteractiveDescription(AGENTS_ENABLE_DESCRIPTION);\n const selected = await promptSearchMultiselect({\n message: \"Choose agents to enable\",\n items: [\n ...selectableCandidates.map(buildUnifiedEnableSearchItem),\n {\n value: CUSTOM_AGENTS_COMING_SOON_OPTION_ID,\n label: \"Custom agents (coming soon)\",\n detail: formatInlineOpenMeldCliCommands(\n \"Use `openmeld agents custom` commands for custom targets for now.\"\n ),\n searchText:\n \"Custom agents (coming soon) Use openmeld agents custom commands for custom targets for now\",\n disabled: true,\n },\n ],\n required: true,\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (selected.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (selected.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n\n const agentIds = normalizeAgentIds(selected.value.sort()).filter(\n (agentId) => agentId !== CUSTOM_AGENTS_COMING_SOON_OPTION_ID\n );\n if (agentIds.length === 0) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: agentIds,\n };\n}\n\nasync function listRegisteredAgentStates(): Promise<\n Array<\n EnableChoiceCandidate & {\n registration: RuntimeAgentControllerState;\n }\n >\n> {\n return (await listAgentTargetStates()).filter(\n (\n state\n ): state is EnableChoiceCandidate & {\n registration: RuntimeAgentControllerState;\n } => Boolean(state.registration)\n );\n}\n\nasync function promptSelectRegisteredAgent(input: {\n message: string;\n emptyMessage: string;\n}): Promise<\n PromptChoiceResult<\n EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n >\n> {\n const registeredStates = await listRegisteredAgentStates();\n if (registeredStates.length === 0) {\n process.stderr.write(`${formatAgentsCopy(input.emptyMessage)}\\n`);\n return {\n status: \"empty\",\n };\n }\n\n emitInteractiveDescription(AGENTS_SELECT_REGISTERED_DESCRIPTION);\n const choice = await promptSearchSelect({\n message: input.message,\n items: registeredStates.map(buildRegisteredAgentSearchItem),\n maxVisible: 8,\n allowBack: true,\n backLabel: \"Back\",\n });\n if (choice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (choice.status === \"back\") {\n return {\n status: \"back\",\n };\n }\n const agentId = normalizeAgentId(choice.value);\n if (!agentId) {\n return {\n status: \"empty\",\n };\n }\n const selectedState = registeredStates.find(\n (state) => state.agentId === agentId\n );\n if (!selectedState) {\n return {\n status: \"empty\",\n };\n }\n return {\n status: \"selected\",\n value: selectedState,\n };\n}\n\nfunction buildCustomTargetSearchItem(\n target: AgentCustomTarget\n): SearchSelectItem<string> {\n return {\n value: target.id,\n label: target.name,\n detail: buildMetadataDetailLine([`ID ${target.id}`, target.dir]),\n searchText: [target.name, target.id, target.dir].join(\" \"),\n };\n}\n\nfunction buildUnifiedEnableSearchItem(\n candidate: EnableChoiceCandidate\n): SearchSelectItem<string> {\n const statusHint = buildUnifiedEnableTargetHint(candidate);\n return {\n value: candidate.agentId,\n label: candidate.displayName,\n detail: buildMetadataDetailLine([`ID ${candidate.agentId}`, statusHint]),\n searchText: [\n candidate.displayName,\n candidate.agentId,\n statusHint,\n candidate.selectableReason ?? \"\",\n ].join(\" \"),\n disabled:\n !canSelectAgentForNewLocalAgentSetup(candidate) || candidate.enabled,\n };\n}\n\nfunction buildRegisteredAgentSearchItem(\n state: EnableChoiceCandidate & { registration: RuntimeAgentControllerState }\n): SearchSelectItem<string> {\n const enabledHint = buildRegisteredAgentHint(state);\n return {\n value: state.agentId,\n label: state.agentId,\n detail: buildMetadataDetailLine([state.displayName, enabledHint]),\n searchText: [\n state.displayName,\n state.agentId,\n enabledHint,\n \"space wake mention reply\",\n ].join(\" \"),\n };\n}\n\nfunction buildMetadataDetailLine(\n parts: Array<string | null | undefined>\n): string {\n return parts\n .map((part) => String(part ?? \"\").trim())\n .filter((part) => part.length > 0)\n .join(\" · \");\n}\n\nexport async function runAgentsDetect(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const inventory = await collectLocalAgentControllerInventory();\n const detectedAgents = inventory.capabilities\n .filter(\n (capability) =>\n capability.detected &&\n (capability.lifecycleStatus !== \"suspended\" || capability.enabled)\n )\n .map((capability) => ({\n id: capability.agentId,\n blockerReasonCodes: capability.blockerReasonCodes,\n displayName: capability.displayName,\n launchability: capability.launchability,\n launchStatus: formatAgentViewLaunchStatus(capability.launchStatus),\n launchStatusDetail: capability.launchStatusDetail,\n lifecycleStatus: capability.lifecycleStatus,\n selectable: capability.selectable,\n }));\n const payload = {\n detectedAgents,\n count: detectedAgents.length,\n inventorySource: \"local_runtime_inventory\",\n source: \"builtin_detect\",\n };\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.detect\",\n ...payload,\n });\n return;\n }\n\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"detect\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.detect.result\",\n payload,\n });\n return;\n }\n\n const readyAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"launchable\"\n );\n const needsChoiceAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"needs_choice\"\n );\n const needsRepairAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"needs_repair\"\n );\n const comingSoonAgents = detectedAgents.filter(\n (agent) =>\n agent.lifecycleStatus !== \"suspended\" &&\n agent.launchability === \"not_supported\" &&\n !agent.selectable\n );\n const suspendedAgents = detectedAgents.filter(\n (agent) => agent.lifecycleStatus === \"suspended\"\n );\n const notDetectedAgents = inventory.capabilities.filter(\n (capability) => !capability.detected\n );\n if (detectedAgents.length === 0) {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.empty.card\",\n title: \"Agents Found Here\",\n rows: [\n {\n label: \"Found\",\n value: pc.dim(\"No supported AI agents yet\"),\n },\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n \"Open or install the AI tool you want OpenMeld to use, then run `openmeld agents detect` again.\"\n ),\n },\n ],\n minContentWidth: 36,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.summary.card\",\n title: \"Agents Found Here\",\n rows: [\n {\n label: \"Found\",\n value: buildDetectedAgentsSubtitle(detectedAgents.length),\n },\n {\n label: \"Available now\",\n value: buildReadyCountValue(readyAgents.length, \"live for Space\"),\n },\n {\n label: \"Needs choice\",\n value: buildNotReadyCountValue(\n needsChoiceAgents.length,\n \"found, needs your choice\"\n ),\n },\n {\n label: \"Needs repair\",\n value: buildNotReadyCountValue(\n needsRepairAgents.length,\n \"found, needs repair\"\n ),\n },\n {\n label: \"Coming soon\",\n value: buildNotReadyCountValue(\n comingSoonAgents.length,\n \"found, not supported yet\"\n ),\n },\n {\n label: \"Suspended\",\n value: buildNotReadyCountValue(\n suspendedAgents.length,\n \"already configured, not offered for new profiles\"\n ),\n },\n {\n label: \"Not found\",\n value: buildNotReadyCountValue(\n notDetectedAgents.length,\n \"not found on this computer\"\n ),\n },\n ],\n minContentWidth: 42,\n });\n\n if (readyAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.ready.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.ready.card\",\n title: `Available Now (${readyAgents.length})`,\n rows: readyAgents.map((agent) =>\n buildReadyAgentCardRow(agent.id, agent.displayName)\n ),\n minContentWidth: 30,\n });\n }\n\n if (needsRepairAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.needs_repair.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.needs_repair.card\",\n title: `Needs Repair (${needsRepairAgents.length})`,\n rows: needsRepairAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n // Prefer the real per-agent reason (e.g. \"Codex is installed, but\n // OpenMeld can't start it on this device.\") over a generic label so\n // an agent that OpenMeld found but could not launch is never\n // reported the same way as one that was never found at all.\n detail:\n agent.launchStatusDetail ??\n \"Repair on this computer before OpenMeld can start it\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (needsChoiceAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.needs_choice.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.needs_choice.card\",\n title: `Needs Your Choice (${needsChoiceAgents.length})`,\n rows: needsChoiceAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail: \"Choose which install OpenMeld should use on this Mac\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (comingSoonAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.coming_soon.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.coming_soon.card\",\n title: `Coming Soon (${comingSoonAgents.length})`,\n rows: comingSoonAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail:\n \"OpenMeld found it, but builtin runtime support is not available yet\",\n })\n ),\n minContentWidth: 36,\n });\n }\n\n if (suspendedAgents.length > 0) {\n presenter.line({\n code: \"agents.detect.suspended.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.detect.suspended.card\",\n title: `Suspended (${suspendedAgents.length})`,\n rows: suspendedAgents.map((agent) =>\n buildStatusAgentCardRow({\n agentId: agent.id,\n displayName: agent.displayName,\n detail:\n \"Already configured here, but OpenMeld no longer offers it for new profiles\",\n })\n ),\n minContentWidth: 46,\n });\n }\n}\n\nexport async function runAgentsList(input: AgentsBaseInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const states = await listAgentTargetStates();\n const registrations = states\n .filter(hasAgentRegistration)\n .map((state) => buildAgentRegistrationAgentView(state))\n .sort((left, right) =>\n compareAgentControllerRefsForDisplay(left.agentId, right.agentId)\n );\n const payload = {\n registrations,\n count: registrations.length,\n };\n\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.list\",\n ...payload,\n });\n return;\n }\n\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"list\",\n });\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.list.result\",\n payload,\n });\n return;\n }\n\n const enabledStates = states.filter((state) => state.registration?.enabled);\n const readyEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"ready\"\n );\n const needsChoiceEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"needs_choice\"\n );\n const needsRepairEnabledStates = enabledStates.filter(\n (state) => state.launchStatus === \"needs_repair\"\n );\n if (\n readyEnabledStates.length === 0 &&\n needsChoiceEnabledStates.length === 0 &&\n needsRepairEnabledStates.length === 0\n ) {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.empty.card\",\n title: \"Agents Available for Space\",\n rows: [\n {\n label: \"Live now\",\n value: pc.dim(\"No agents are live yet\"),\n },\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n \"Run `openmeld agents detect`, then enable the agents you want OpenMeld to use.\"\n ),\n },\n ],\n minContentWidth: 38,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.summary.card\",\n title: \"Agents Available for Space\",\n rows: [\n {\n label: \"Live now\",\n value: buildEnabledAgentsSubtitle(readyEnabledStates.length),\n },\n {\n label: \"Needs choice\",\n value: String(needsChoiceEnabledStates.length),\n },\n {\n label: \"Needs repair\",\n value: String(needsRepairEnabledStates.length),\n },\n {\n label: \"Mention as\",\n value: `${formatAgentMention(\"agent-id\")} ${pc.dim(\"in Space\")}`,\n },\n ],\n minContentWidth: 38,\n });\n presenter.line({\n code: \"agents.list.ready.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.ready.card\",\n title: `Available Agents (${readyEnabledStates.length})`,\n rows: readyEnabledStates.map((state) =>\n buildReadyAgentCardRow(state.agentId, state.displayName)\n ),\n minContentWidth: 30,\n });\n if (needsRepairEnabledStates.length > 0) {\n presenter.line({\n code: \"agents.list.needs_repair.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.needs_repair.card\",\n title: `Needs Repair (${needsRepairEnabledStates.length})`,\n rows: needsRepairEnabledStates.map((state) =>\n buildStatusAgentCardRow({\n agentId: state.agentId,\n displayName: state.displayName,\n detail:\n \"Connected in OpenMeld, but OpenMeld can't start it on this computer yet\",\n })\n ),\n minContentWidth: 36,\n });\n }\n if (needsChoiceEnabledStates.length > 0) {\n presenter.line({\n code: \"agents.list.needs_choice.spacer\",\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.list.needs_choice.card\",\n title: `Needs Your Choice (${needsChoiceEnabledStates.length})`,\n rows: needsChoiceEnabledStates.map((state) =>\n buildStatusAgentCardRow({\n agentId: state.agentId,\n displayName: state.displayName,\n detail:\n \"Connected in OpenMeld, but OpenMeld still needs one install choice on this Mac\",\n })\n ),\n minContentWidth: 36,\n });\n }\n}\n\nexport async function runAgentsShow(input: AgentsShowInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"show\",\n });\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for show\"\n );\n }\n const state = await resolveAgentTargetState(agentId);\n if (!hasAgentRegistration(state)) {\n throw new Error(\n `agents.not_registered: agent is not registered: ${agentId}`\n );\n }\n const registration = state.registration;\n let agentControllerInterface: AgentControllerInterfaceSnapshot | null = null;\n if (state.targetKind === \"builtin\" && state.enabled) {\n const builtinState = state as RegisteredAgentTargetState & {\n targetKind: \"builtin\";\n };\n agentControllerInterface = await resolveAgentControllerInterfaceSnapshot({\n agentControllerRef: buildAgentControllerRef({\n id: builtinState.agentId,\n kind: \"builtin\",\n }),\n state: builtinState,\n });\n }\n\n const payload = {\n agent: buildAgentRegistrationAgentView(state),\n agentControllerInterface:\n input.json === true || runtime.resolvedView === \"agent\"\n ? projectLegacyAgentControllerInterface(agentControllerInterface)\n : agentControllerInterface,\n installChoices: state.installChoices,\n launchStatus: formatAgentViewLaunchStatus(state.launchStatus),\n launchStatusDetail: state.launchStatusDetail,\n effectiveConfig: buildEffectiveConfig(state),\n };\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.show\",\n ...payload,\n });\n return;\n }\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.show.result\",\n payload,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.show.card\",\n title: \"Agent in OpenMeld\",\n rows: [\n {\n label: \"Agent\",\n value: formatAgentMention(registration.agentId),\n },\n {\n label: \"App\",\n value: registration.displayName,\n },\n {\n label: \"Status\",\n value: buildAgentsShowStatusValue({\n enabled: registration.enabled,\n launchStatus: state.launchStatus,\n }),\n },\n {\n label: \"Wake\",\n value: buildAgentsShowWakeValue({\n agentId: registration.agentId,\n enabled: registration.enabled,\n launchStatus: state.launchStatus,\n }),\n },\n {\n label: \"Connection Type\",\n value: `${resolveTransportModeForDisplay(state)} ${pc.dim(\"on this computer\")}`,\n },\n ...buildAgentControllerInterfaceRows(agentControllerInterface),\n ...(state.launchStatusDetail\n ? [\n {\n label: \"Why\",\n value: state.launchStatusDetail,\n },\n ]\n : []),\n ...(state.launchStatus === \"needs_choice\"\n ? [\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n `Run \\`openmeld agents repair --agent ${registration.agentId}\\` and choose one install`\n ),\n },\n ]\n : []),\n ...(state.launchStatus === \"needs_repair\"\n ? [\n {\n label: \"Next\",\n value: formatInlineOpenMeldCliCommands(\n `Run \\`openmeld agents repair --agent ${registration.agentId}\\``\n ),\n },\n ]\n : []),\n ],\n minContentWidth: 34,\n });\n}\n\nfunction projectLegacyAgentControllerInterface(\n snapshot: AgentControllerInterfaceSnapshot | null\n): AgentControllerInterfaceSnapshot | null {\n if (!snapshot?.usageLimits) {\n return snapshot;\n }\n const { usageLimits: _usageLimits, ...legacySnapshot } = snapshot;\n return legacySnapshot;\n}\n\nfunction createSilentAgentsPresenter(\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>\n): ReturnType<typeof createPresenter> {\n return {\n view: runtime.resolvedView,\n event: () => undefined,\n line: () => undefined,\n data: () => undefined,\n };\n}\n\nexport async function runAgentsEnable(\n input: AgentsEnableInput\n): Promise<AgentsEnableResult> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter =\n input.json === true\n ? createSilentAgentsPresenter(runtime)\n : createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"enable\",\n handled: input.presentation === \"handoff\",\n });\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n const explicitInstallId = normalizeOptionalString(input.install);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"enable\",\n explicitIds,\n explicitInstallId,\n });\n\n const targetStates = await listAgentTargetStates();\n const targetStateById = new Map(\n targetStates.map((state) => [state.agentId, state])\n );\n const selectableBuiltinIds = new Set(\n targetStates\n .filter(canSelectAgentForNewLocalAgentSetup)\n .map((state) => state.agentId)\n );\n const requested = input.all\n ? [...selectableBuiltinIds].sort((left, right) => left.localeCompare(right))\n : explicitIds;\n const summary: EnableSummary = {\n requested,\n registered: [],\n reenabled: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n const launchSelections = await collectEnableLaunchActionSelections({\n explicitInstallId,\n interactiveChoiceAllowed:\n input.json === true\n ? false\n : resolveInteractiveChoiceAllowed({\n all: input.all,\n runtime,\n }),\n requested,\n summary,\n targetStateById,\n });\n if (launchSelections.status === \"cancelled\") {\n cancel(\"Cancelled.\");\n return {\n status: \"cancelled\",\n summary,\n };\n }\n if (launchSelections.status === \"back\") {\n return {\n status: \"back\",\n summary,\n };\n }\n\n await updateAgentRegistrations((current) =>\n applyEnableSelectionUpdates({\n current,\n requested: requested.filter(\n (agentId) => !launchSelections.blockedAgentIds.has(agentId)\n ),\n selectedLaunchContracts: launchSelections.selectedLaunchContracts,\n selectableBuiltinIds,\n summary,\n targetStateById,\n })\n );\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.enable\",\n ...summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.enable.result\",\n payload: summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (input.presentation !== \"handoff\") {\n emitEnableSummaryCardsForHuman({\n presenter,\n summary,\n targetStateById,\n });\n }\n return {\n status: \"completed\",\n summary,\n };\n}\n\nexport async function runAgentsRegister(\n input: AgentsEnableInput\n): Promise<AgentsEnableResult> {\n return await runAgentsEnable(input);\n}\n\nexport async function runAgentsRepair(\n input: AgentsRepairInput\n): Promise<AgentsRepairResult> {\n const runtime = await resolveRuntimeContext({\n interactive: input.interactive,\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"repair\",\n handled: input.presentation === \"handoff\",\n });\n\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n const explicitInstallId = normalizeOptionalString(input.install);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"repair\",\n explicitIds,\n explicitInstallId,\n });\n\n const targetStates = await listAgentTargetStates();\n const targetStateById = new Map(\n targetStates.map((state) => [state.agentId, state])\n );\n const requested = input.all\n ? targetStates\n .filter(\n (state) =>\n state.targetKind === \"builtin\" &&\n state.registered &&\n (state.launchStatus === \"needs_choice\" ||\n state.launchStatus === \"needs_repair\")\n )\n .map((state) => state.agentId)\n : explicitIds;\n const summary: RepairSummary = {\n requested,\n repaired: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n const repairedLaunchContracts = new Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >();\n const repairOutcome = await collectRepairLaunchActions({\n allowReadyForInstallChange:\n input.changeInstall === true || explicitInstallId !== null,\n explicitInstallId,\n interactiveChoiceAllowed: resolveInteractiveChoiceAllowed({\n all: input.all,\n runtime,\n }),\n repairedLaunchContracts,\n requested,\n summary,\n targetStateById,\n });\n if (repairOutcome === \"cancelled\") {\n cancel(\"Cancelled.\");\n return {\n status: \"cancelled\",\n summary,\n };\n }\n if (repairOutcome === \"back\") {\n return {\n status: \"back\",\n summary,\n };\n }\n\n if (repairedLaunchContracts.size > 0) {\n await updateAgentRegistrations((current) => {\n const nowIso = new Date().toISOString();\n return sortAgentRegistrations(\n current.map((registration) => {\n const launchContract = repairedLaunchContracts.get(\n registration.agentId\n );\n if (!launchContract) {\n return registration;\n }\n return {\n ...registration,\n launchContract,\n updatedAt: nowIso,\n };\n })\n );\n });\n }\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.repair.result\",\n payload: summary,\n });\n return {\n status: \"completed\",\n summary,\n };\n }\n\n if (input.presentation !== \"handoff\") {\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.repair.summary.card\",\n title: \"Agents Repaired\",\n rows: buildRepairSummaryRows(summary),\n minContentWidth: 38,\n });\n for (const card of buildRepairDetailCards(summary, targetStateById)) {\n presenter.line({\n code: `agents.repair.${card.codeSuffix}.spacer`,\n text: \"\",\n });\n renderAgentsInfoCard({\n presenter,\n codePrefix: `agents.repair.${card.codeSuffix}.card`,\n title: card.title,\n rows: card.rows,\n minContentWidth: 32,\n });\n }\n }\n return {\n status: \"completed\",\n summary,\n };\n}\n\nfunction buildAgentsShowStatusValue(input: {\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): string {\n if (input.launchStatus === \"needs_choice\") {\n return formatAgentsToneText(\"warning\", \"Needs your choice on this Mac\");\n }\n if (input.launchStatus === \"needs_repair\") {\n return formatAgentsToneText(\"warning\", \"Needs repair on this computer\");\n }\n if (input.enabled) {\n return formatAgentsToneText(\"success\", \"Available in Space\");\n }\n return formatAgentsToneText(\"warning\", \"Turned off in Space\");\n}\n\nfunction buildAgentsShowWakeValue(input: {\n agentId: string;\n enabled: boolean;\n launchStatus: EnableChoiceCandidate[\"launchStatus\"];\n}): string {\n const mention = formatAgentMention(input.agentId);\n if (input.launchStatus === \"needs_choice\") {\n return `New ${mention} mentions will not wake it until you choose one install on this Mac`;\n }\n if (input.launchStatus === \"needs_repair\") {\n return `New ${mention} mentions will not wake it until you repair it`;\n }\n if (input.enabled) {\n return `${mention} can wake it`;\n }\n return `New ${mention} mentions stay off`;\n}\n\nfunction buildAgentControllerInterfaceRows(\n snapshot: AgentControllerInterfaceSnapshot | null\n): Array<{ label: string; value: string }> {\n if (!snapshot) {\n return [];\n }\n return createAgentControllerInterfaceDisplayRows(snapshot);\n}\n\nasync function promptBuiltinAgentInstallChoice(input: {\n displayName: string;\n installChoices: AgentTargetState[\"installChoices\"];\n}): Promise<PromptChoiceResult<string>> {\n const choice = await select({\n message: buildInteractiveMenuMessage({\n title: `Choose the ${input.displayName} install OpenMeld should use`,\n description: `We found more than one ${input.displayName} install on this Mac. Pick the one OpenMeld should launch for replies.`,\n }),\n options: [\n ...input.installChoices.map((installChoice) => ({\n value: installChoice.installId,\n label: installChoice.label,\n hint: installChoice.detail,\n })),\n {\n value: \"__back__\",\n label: \"Back\",\n },\n ],\n });\n if (isCancel(choice)) {\n return {\n status: \"cancelled\",\n };\n }\n if (choice === \"__back__\") {\n return {\n status: \"back\",\n };\n }\n return {\n status: \"selected\",\n value: String(choice),\n };\n}\n\nfunction buildInstallChoiceNextSteps(input: {\n agentId: string;\n command: \"enable\" | \"repair\";\n installChoices: AgentTargetState[\"installChoices\"];\n}): string[] {\n return input.installChoices.map((installChoice) =>\n buildBuiltinAgentSelectionCommand({\n agentIds: [input.agentId],\n command: input.command,\n installId: installChoice.installId,\n })\n );\n}\n\nfunction createInstallChoiceError(input: {\n agentId: string;\n command: \"enable\" | \"repair\";\n installChoices: AgentTargetState[\"installChoices\"];\n reason: string;\n summary?: string;\n}): EnableSummary[\"errors\"][number] {\n return {\n agentId: input.agentId,\n code: \"controller.launch.choice_required\",\n humanActionRequired: true,\n installChoices: input.installChoices,\n nextSteps: buildInstallChoiceNextSteps({\n agentId: input.agentId,\n command: input.command,\n installChoices: input.installChoices,\n }),\n reason: input.reason,\n summary:\n input.summary ??\n \"OpenMeld needs one install choice on this Mac before it can continue.\",\n };\n}\n\ntype BuiltinLaunchActionResolution =\n | {\n launchContract: NonNullable<EnableChoiceCandidate[\"launchContract\"]>;\n status: \"resolved\";\n }\n | {\n error: EnableSummary[\"errors\"][number];\n status: \"blocked\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"not_needed\";\n }\n | {\n status: \"back\";\n };\n\nasync function resolveBuiltinLaunchAction(input: {\n command: \"enable\" | \"repair\";\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n state: EnableChoiceCandidate & { targetKind: \"builtin\" };\n}): Promise<BuiltinLaunchActionResolution> {\n const shouldResolveLaunchContract =\n input.command === \"repair\" ||\n Boolean(input.explicitInstallId) ||\n input.state.launchStatus === \"needs_choice\" ||\n input.state.launchStatus === \"needs_repair\";\n if (!shouldResolveLaunchContract) {\n return {\n status: \"not_needed\",\n };\n }\n\n let repairResult = await repairBuiltinControllerInstall({\n agentId: input.state.agentId,\n detected: input.state.detected,\n displayName: input.state.displayName,\n installId: input.explicitInstallId,\n runtimeSupported: input.state.runtimeSupported,\n });\n if (\n !repairResult.ok &&\n repairResult.errorCode === \"controller.launch.choice_required\" &&\n input.interactiveChoiceAllowed\n ) {\n const installChoice = await promptBuiltinAgentInstallChoice({\n displayName: input.state.displayName,\n installChoices: repairResult.installChoices,\n });\n if (installChoice.status === \"cancelled\") {\n return {\n status: \"cancelled\",\n };\n }\n if (installChoice.status === \"back\" || installChoice.status === \"empty\") {\n return {\n status: \"back\",\n };\n }\n repairResult = await repairBuiltinControllerInstall({\n agentId: input.state.agentId,\n detected: input.state.detected,\n displayName: input.state.displayName,\n installId: installChoice.value,\n runtimeSupported: input.state.runtimeSupported,\n });\n }\n if (!repairResult.ok) {\n return {\n error:\n repairResult.errorCode === \"controller.launch.choice_required\"\n ? createInstallChoiceError({\n agentId: input.state.agentId,\n command: input.command,\n installChoices: repairResult.installChoices,\n reason: repairResult.errorMessage,\n })\n : {\n agentId: input.state.agentId,\n code: repairResult.errorCode,\n reason: repairResult.errorMessage,\n },\n status: \"blocked\",\n };\n }\n return {\n launchContract: repairResult.launchContract,\n status: \"resolved\",\n };\n}\n\nfunction resolveInteractiveChoiceAllowed(input: {\n all?: boolean;\n runtime: Awaited<ReturnType<typeof resolveRuntimeContext>>;\n}): boolean {\n return (\n input.runtime.resolvedView === \"human\" &&\n canUseInteractivePrompts(input.runtime) &&\n input.all !== true\n );\n}\n\nasync function collectEnableLaunchActionSelections(input: {\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n requested: string[];\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): Promise<\n | {\n blockedAgentIds: Set<string>;\n selectedLaunchContracts: Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >;\n status: \"completed\";\n }\n | {\n status: \"cancelled\";\n }\n | {\n status: \"back\";\n }\n> {\n const blockedAgentIds = new Set<string>();\n const selectedLaunchContracts = new Map<\n string,\n EnableChoiceCandidate[\"launchContract\"]\n >();\n\n for (const requestedId of input.requested) {\n const state = input.targetStateById.get(requestedId) ?? null;\n if (!isBuiltinEnableChoiceCandidate(state)) {\n continue;\n }\n const launchAction = await resolveBuiltinLaunchAction({\n command: \"enable\",\n explicitInstallId: input.explicitInstallId,\n interactiveChoiceAllowed: input.interactiveChoiceAllowed,\n state,\n });\n if (launchAction.status === \"not_needed\") {\n continue;\n }\n if (launchAction.status === \"cancelled\" || launchAction.status === \"back\") {\n return {\n status: launchAction.status,\n };\n }\n if (launchAction.status === \"blocked\") {\n blockedAgentIds.add(state.agentId);\n input.summary.errors.push(launchAction.error);\n continue;\n }\n selectedLaunchContracts.set(state.agentId, launchAction.launchContract);\n }\n\n return {\n blockedAgentIds,\n selectedLaunchContracts,\n status: \"completed\",\n };\n}\n\nasync function collectRepairLaunchActions(input: {\n allowReadyForInstallChange: boolean;\n explicitInstallId: string | null;\n interactiveChoiceAllowed: boolean;\n repairedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n requested: string[];\n summary: RepairSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): Promise<\"back\" | \"cancelled\" | \"completed\"> {\n for (const requestedId of input.requested) {\n const candidate = resolveRepairCandidate({\n allowReadyForInstallChange: input.allowReadyForInstallChange,\n requestedId,\n targetStateById: input.targetStateById,\n });\n if (!candidate.ok) {\n input.summary.errors.push(candidate.error);\n continue;\n }\n if (\n !(input.allowReadyForInstallChange || input.explicitInstallId) &&\n candidate.state.launchStatus === \"ready\" &&\n candidate.state.registration?.launchContract\n ) {\n input.summary.skipped.push({\n agentId: requestedId,\n reason: \"already_ready\",\n });\n continue;\n }\n\n const launchAction = await resolveBuiltinLaunchAction({\n command: \"repair\",\n explicitInstallId: input.explicitInstallId,\n interactiveChoiceAllowed: input.interactiveChoiceAllowed,\n state: candidate.state,\n });\n if (launchAction.status === \"cancelled\" || launchAction.status === \"back\") {\n return launchAction.status;\n }\n if (launchAction.status === \"blocked\") {\n input.summary.errors.push(launchAction.error);\n continue;\n }\n if (launchAction.status === \"not_needed\") {\n continue;\n }\n input.repairedLaunchContracts.set(requestedId, launchAction.launchContract);\n input.summary.repaired.push(requestedId);\n }\n\n return \"completed\";\n}\n\nfunction applyEnableSelectionUpdates(input: {\n current: RuntimeAgentControllerState[];\n requested: string[];\n selectedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n selectableBuiltinIds: Set<string>;\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): RuntimeAgentControllerState[] {\n const next = [...input.current];\n const existingById = new Map(\n next.map((registration, index) => [registration.agentId, index])\n );\n for (const requestedId of input.requested) {\n applySingleEnableSelection({\n existingById,\n next,\n requestedId,\n selectedLaunchContracts: input.selectedLaunchContracts,\n selectableBuiltinIds: input.selectableBuiltinIds,\n summary: input.summary,\n targetStateById: input.targetStateById,\n });\n }\n return sortAgentRegistrations(next);\n}\n\nfunction applySingleEnableSelection(input: {\n existingById: Map<string, number>;\n next: RuntimeAgentControllerState[];\n requestedId: string;\n selectedLaunchContracts: Map<string, EnableChoiceCandidate[\"launchContract\"]>;\n selectableBuiltinIds: Set<string>;\n summary: EnableSummary;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}): void {\n if (!input.selectableBuiltinIds.has(input.requestedId)) {\n const blockedState = input.targetStateById.get(input.requestedId) ?? null;\n input.summary.errors.push({\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: resolveEnableBlockedReason(blockedState),\n });\n return;\n }\n\n const targetState = input.targetStateById.get(input.requestedId);\n if (targetState?.targetKind !== \"builtin\") {\n input.summary.errors.push({\n agentId: input.requestedId,\n code: \"agents.config_write_failed\",\n reason: \"selectable built-in target missing from catalog\",\n });\n return;\n }\n\n const selectedLaunchContract =\n input.selectedLaunchContracts.get(targetState.agentId) ?? null;\n const resolvedLaunchContract =\n selectedLaunchContract ?? targetState.launchContract ?? undefined;\n if (targetState.launchStatus === \"needs_choice\" && !selectedLaunchContract) {\n input.summary.errors.push(\n createInstallChoiceError({\n agentId: targetState.agentId,\n command: \"enable\",\n installChoices: targetState.installChoices,\n reason:\n targetState.launchStatusDetail ??\n \"OpenMeld needs one install choice on this Mac before it can turn this on.\",\n })\n );\n return;\n }\n\n const existingIndex = input.existingById.get(targetState.agentId);\n if (existingIndex === undefined) {\n input.next.push(\n createRegistrationFromCatalogTarget({\n ...targetState,\n ...(resolvedLaunchContract\n ? { launchContract: resolvedLaunchContract }\n : {}),\n })\n );\n input.existingById.set(targetState.agentId, input.next.length - 1);\n input.summary.registered.push(targetState.agentId);\n return;\n }\n\n const existing = input.next[existingIndex];\n if (!existing) {\n input.summary.errors.push({\n agentId: targetState.agentId,\n code: \"agents.config_write_failed\",\n reason: \"registration index missing\",\n });\n return;\n }\n\n if (existing.enabled && selectedLaunchContract) {\n input.next[existingIndex] = applyTargetRuntimeDefaults({\n registration: {\n ...existing,\n launchContract: selectedLaunchContract,\n updatedAt: new Date().toISOString(),\n },\n targetState,\n });\n input.summary.reenabled.push(targetState.agentId);\n return;\n }\n\n if (existing.enabled) {\n input.summary.skipped.push({\n agentId: targetState.agentId,\n reason: \"already_enabled\",\n });\n return;\n }\n\n input.next[existingIndex] = applyTargetRuntimeDefaults({\n registration: {\n ...existing,\n enabled: true,\n ...(resolvedLaunchContract\n ? { launchContract: resolvedLaunchContract }\n : {}),\n updatedAt: new Date().toISOString(),\n },\n targetState,\n });\n input.summary.reenabled.push(targetState.agentId);\n}\n\nfunction applyTargetRuntimeDefaults(input: {\n registration: RuntimeAgentControllerState;\n targetState: EnableChoiceCandidate;\n}): RuntimeAgentControllerState {\n return {\n ...input.registration,\n ...(input.targetState.defaultStreamingMode\n ? { streamingMode: input.targetState.defaultStreamingMode }\n : {}),\n ...(input.targetState.defaultTransportMode\n ? { transportMode: input.targetState.defaultTransportMode }\n : {}),\n };\n}\n\nfunction resolveRepairCandidate(input: {\n allowReadyForInstallChange?: boolean;\n requestedId: string;\n targetStateById: Map<string, EnableChoiceCandidate>;\n}):\n | {\n ok: true;\n state: BuiltinEnableChoiceCandidate;\n }\n | {\n error: RepairSummary[\"errors\"][number];\n ok: false;\n } {\n const state = input.targetStateById.get(input.requestedId) ?? null;\n if (!isBuiltinEnableChoiceCandidate(state)) {\n if (!state) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: \"unknown built-in target id\",\n },\n ok: false,\n };\n }\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.invalid_agent_id\",\n reason: \"custom target is not runnable yet\",\n },\n ok: false,\n };\n }\n if (!state.registered) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"agents.not_registered\",\n reason: \"agent is not registered\",\n },\n ok: false,\n };\n }\n if (\n input.allowReadyForInstallChange !== true &&\n !(\n state.launchStatus === \"needs_choice\" ||\n state.launchStatus === \"needs_repair\"\n )\n ) {\n return {\n error: {\n agentId: input.requestedId,\n code: \"controller.launch.needs_repair\",\n reason: \"already available\",\n },\n ok: false,\n };\n }\n return {\n ok: true,\n state,\n };\n}\n\nexport async function runAgentsDisable(\n input: AgentsDisableInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter =\n input.json === true\n ? createSilentAgentsPresenter(runtime)\n : createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"disable\",\n });\n const explicitIds = normalizeAgentIds(input.agent ?? []);\n validateBuiltinAgentSelectionInput({\n all: input.all,\n command: \"disable\",\n explicitIds,\n explicitInstallId: null,\n });\n\n const registrations = await listAgentRegistrations();\n const displayNameById = new Map(\n registrations.map((registration) => [\n registration.agentId,\n registration.displayName,\n ])\n );\n const requested = input.all\n ? registrations.map((registration) => registration.agentId)\n : explicitIds;\n const summary: DisableSummary = {\n requested,\n disabled: [],\n skipped: [],\n errors: [],\n allMode: Boolean(input.all),\n };\n\n await updateAgentRegistrations((current) => {\n const next = [...current];\n const byId = new Map(\n next.map((registration, index) => [registration.agentId, index])\n );\n for (const agentId of requested) {\n const index = byId.get(agentId);\n if (index === undefined) {\n summary.errors.push({\n agentId,\n code: \"agents.not_registered\",\n reason: \"agent is not registered\",\n });\n continue;\n }\n const registration = next[index];\n if (!registration) {\n summary.errors.push({\n agentId,\n code: \"agents.config_write_failed\",\n reason: \"registration index missing\",\n });\n continue;\n }\n if (!registration.enabled) {\n summary.skipped.push({\n agentId,\n reason: \"already_disabled\",\n });\n continue;\n }\n next[index] = {\n ...registration,\n enabled: false,\n updatedAt: new Date().toISOString(),\n };\n summary.disabled.push(agentId);\n }\n return sortAgentRegistrations(next);\n });\n if (input.json === true) {\n emitCliJsonEnvelope({\n schemaVersion: 1,\n type: \"agents.disable\",\n ...summary,\n });\n return;\n }\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.disable.result\",\n payload: summary,\n });\n return;\n }\n\n emitDisableSummaryCardsForHuman({\n presenter,\n summary,\n displayNameById,\n });\n}\n\nexport async function runAgentsUnregister(\n input: AgentsUnregisterInput\n): Promise<void> {\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for unregister\"\n );\n }\n await runAgentsDisable({\n agent: [agentId],\n profile: input.profile,\n view: input.view,\n });\n}\n\nexport async function runAgentsConfig(input: AgentsConfigInput): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"config\",\n });\n const agentId = normalizeAgentId(input.agentId ?? \"\");\n if (!agentId) {\n throw new Error(\n \"agents.invalid_agent_id: provide a non-empty <agent-id> for config\"\n );\n }\n\n const enabled = parseAgentEnabledOption(input.enabled);\n if (enabled === undefined) {\n throw new Error(\n \"agents.config_invalid: provide at least one option (--enabled)\"\n );\n }\n\n const updatedFields: string[] = [];\n const nextRegistrations = await updateAgentRegistrations((current) => {\n const index = current.findIndex((item) => item.agentId === agentId);\n if (index < 0) {\n throw new Error(\n `agents.not_registered: agent is not registered: ${agentId}`\n );\n }\n const next = [...current];\n const selected = next[index];\n if (!selected) {\n throw new Error(\"agents.config_write_failed: registration index missing\");\n }\n const existing = { ...selected };\n if (enabled !== undefined) {\n existing.enabled = enabled;\n updatedFields.push(\"enabled\");\n }\n existing.updatedAt = new Date().toISOString();\n next[index] = existing;\n return sortAgentRegistrations(next);\n });\n const effectiveConfig =\n nextRegistrations.find((item) => item.agentId === agentId) ?? null;\n\n if (!effectiveConfig) {\n throw new Error(\"agents.config_write_failed: config update returned empty\");\n }\n const payload = {\n agentId,\n updatedFields,\n effectiveConfig,\n };\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.config.result\",\n payload,\n });\n return;\n }\n\n renderAgentsInfoCard({\n presenter,\n codePrefix: \"agents.config.result.card\",\n title: \"Agent Updated\",\n rows: [\n {\n label: \"Agent\",\n value: formatAgentMention(effectiveConfig.agentId),\n },\n {\n label: \"App\",\n value: effectiveConfig.displayName,\n },\n {\n label: \"Status\",\n value: enabled\n ? formatAgentsToneText(\"success\", \"Available for new @mentions\")\n : formatAgentsToneText(\"warning\", \"Turned off for new @mentions\"),\n },\n {\n label: \"Wake\",\n value: enabled\n ? `New ${formatAgentMention(effectiveConfig.agentId)} mentions can wake it`\n : `New ${formatAgentMention(effectiveConfig.agentId)} mentions stay off`,\n },\n ],\n minContentWidth: 34,\n });\n}\n\nexport async function runAgentsCustomList(\n input: AgentsBaseInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_list\",\n });\n const [targets, states] = await Promise.all([\n listAgentCustomTargets(),\n listAgentTargetStates(),\n ]);\n const customStateById = new Map(\n states\n .filter((state) => state.targetKind === \"custom\")\n .map((state) => [state.agentId, state])\n );\n const payloadTargets = targets.map((target) => {\n const state = customStateById.get(target.id);\n return {\n id: target.id,\n name: target.name,\n dir: target.dir,\n registered: state?.registered ?? false,\n enabled: state?.enabled ?? false,\n };\n });\n const payload = {\n targets: payloadTargets,\n count: payloadTargets.length,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.list.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.list\",\n title: \"Custom agents\",\n });\n if (payloadTargets.length === 0) {\n presenter.line({\n code: \"agents.custom.list.empty\",\n text: \"No custom agents configured.\",\n });\n presenter.line({\n code: \"agents.custom.list.hint\",\n text: formatInlineOpenMeldCliCommands(\n \"Tip: run `openmeld agents custom add --name <name> --dir <dir>`.\"\n ),\n });\n return;\n }\n presenter.line({\n code: \"agents.custom.list.subtitle\",\n text: `Configured custom agents: ${payloadTargets.length}`,\n });\n for (const target of payloadTargets) {\n presenter.line({\n code: \"agents.custom.list.item\",\n text: `- ${target.name} (${target.id}) • dir=${target.dir} • registered=${target.registered ? \"true\" : \"false\"} • enabled=${target.enabled ? \"true\" : \"false\"}`,\n });\n }\n}\n\nexport async function runAgentsCustomAdd(\n input: AgentsCustomAddInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_add\",\n });\n const name = normalizeOptionalString(input.name);\n const dir = normalizeOptionalString(input.dir);\n if (!(name && dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: provide --name <name> and --dir <dir>\"\n );\n }\n if (!isAbsolute(dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: --dir must be an absolute path\"\n );\n }\n const id = normalizeOptionalString(input.id) ?? undefined;\n const target = await addAgentCustomTarget({\n name,\n dir,\n ...(id ? { id } : {}),\n });\n const payload = {\n target,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.add.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.add\",\n title: \"Custom Agent Added\",\n });\n presenter.line({\n code: \"agents.custom.add.result\",\n text: `${target.name} (${target.id}) -> ${target.dir}`,\n });\n}\n\nexport async function runAgentsCustomUpdate(\n input: AgentsCustomUpdateInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_update\",\n });\n const id = normalizeAgentId(input.id ?? \"\");\n if (!id) {\n throw new Error(\"agents.custom.invalid_argument: provide --id <id>\");\n }\n\n const name = normalizeOptionalString(input.name) ?? undefined;\n const dir = normalizeOptionalString(input.dir) ?? undefined;\n if (name === undefined && dir === undefined) {\n throw new Error(\n \"agents.custom.invalid_argument: provide at least one option (--name/--dir)\"\n );\n }\n if (dir && !isAbsolute(dir)) {\n throw new Error(\n \"agents.custom.invalid_argument: --dir must be an absolute path\"\n );\n }\n const updated = await updateAgentCustomTarget({\n id,\n ...(name ? { name } : {}),\n ...(dir ? { dir } : {}),\n });\n const payload = {\n target: updated.target,\n updatedFields: updated.updatedFields,\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.update.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.update\",\n title: \"Custom Agent Updated\",\n });\n const fields =\n updated.updatedFields.length > 0\n ? updated.updatedFields.join(\", \")\n : \"no field changed\";\n presenter.line({\n code: \"agents.custom.update.result\",\n text: `${updated.target.id}: ${fields}`,\n });\n}\n\nexport async function runAgentsCustomRemove(\n input: AgentsCustomRemoveInput\n): Promise<void> {\n const runtime = await resolveRuntimeContext({\n view: input.view,\n profile: input.profile,\n });\n const presenter = createPresenter(runtime);\n await emitAgentsConfigParseFallbackSignal({\n presenter,\n view: runtime.resolvedView,\n });\n emitAgentsOverviewIfAgent({\n presenter,\n resolvedView: runtime.resolvedView,\n command: \"custom_remove\",\n });\n const id = normalizeAgentId(input.id ?? \"\");\n if (!id) {\n throw new Error(\"agents.custom.invalid_argument: provide --id <id>\");\n }\n\n const registrations = await listAgentRegistrations();\n const inUse = registrations.some(\n (registration) => registration.agentId === id\n );\n if (inUse) {\n throw new Error(\n `agents.custom.in_use: target is currently registered: ${id}`\n );\n }\n\n const removed = await removeAgentCustomTarget({\n id,\n });\n const payload = {\n targetId: id,\n removed,\n installsPolicy: \"kept\",\n };\n\n if (runtime.resolvedView === \"agent\") {\n presenter.data({\n code: \"agents.custom.remove.result\",\n payload,\n });\n return;\n }\n\n emitHumanSectionHeader(presenter, {\n codePrefix: \"agents.custom.remove\",\n title: \"Custom Agent Removed\",\n });\n presenter.line({\n code: \"agents.custom.remove.result\",\n text: `${removed.name} (${removed.id}) removed`,\n });\n presenter.line({\n code: \"agents.custom.remove.note\",\n text: formatInlineOpenMeldCliCommands(\n \"Installs records are kept; cleanup via `openmeld skills uninstall`.\"\n ),\n });\n}\n\nfunction buildAgentRegistrationAgentView(\n state: RegisteredAgentTargetState\n): RuntimeAgentControllerState & {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n effectiveConfig: ReturnType<typeof buildEffectiveConfig>;\n effectiveTransportMode: RuntimeAgentTransportMode;\n lifecycleStatus: AgentTargetState[\"lifecycleStatus\"];\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportModeSource: AgentTransportModeSource;\n} {\n const transportProjection = resolveTransportModeProjection(state);\n return {\n ...state.registration,\n lifecycleStatus: state.lifecycleStatus,\n configuredTransportMode: transportProjection.configuredTransportMode,\n configuredTransportModeStatus:\n transportProjection.configuredTransportModeStatus,\n defaultTransportMode: transportProjection.defaultTransportMode,\n effectiveConfig: buildEffectiveConfig(state),\n effectiveTransportMode: transportProjection.effectiveTransportMode,\n supportedTransportModes: transportProjection.supportedTransportModes,\n transportModeSource: transportProjection.transportModeSource,\n };\n}\n\nfunction buildEffectiveConfig(state: RegisteredAgentTargetState): {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n enabled: boolean;\n effectiveTransportMode: RuntimeAgentTransportMode;\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportMode: RuntimeAgentTransportMode;\n transportModeSource: AgentTransportModeSource;\n} {\n const transportProjection = resolveTransportModeProjection(state);\n return {\n configuredTransportMode: transportProjection.configuredTransportMode,\n configuredTransportModeStatus:\n transportProjection.configuredTransportModeStatus,\n defaultTransportMode: transportProjection.defaultTransportMode,\n enabled: state.registration.enabled,\n effectiveTransportMode: transportProjection.effectiveTransportMode,\n supportedTransportModes: transportProjection.supportedTransportModes,\n transportMode: transportProjection.effectiveTransportMode,\n transportModeSource: transportProjection.transportModeSource,\n };\n}\n\nfunction emitAgentsOverviewIfAgent(input: {\n presenter: ReturnType<typeof createPresenter>;\n resolvedView: \"human\" | \"agent\";\n command:\n | \"menu\"\n | \"manage\"\n | \"detect\"\n | \"list\"\n | \"show\"\n | \"enable\"\n | \"repair\"\n | \"disable\"\n | \"config\"\n | \"custom_list\"\n | \"custom_add\"\n | \"custom_update\"\n | \"custom_remove\";\n handled?: boolean;\n}): void {\n if (input.resolvedView !== \"agent\" || input.handled) {\n return;\n }\n emitAgentsAgentOverview({\n presenter: input.presenter,\n command: input.command,\n });\n}\n\nfunction resolveTransportModeForDisplay(\n state: RegisteredAgentTargetState\n): string {\n return formatTransportModeDisplay(\n resolveTransportModeProjection(state).effectiveTransportMode\n );\n}\n\nfunction resolveTransportModeProjection(state: RegisteredAgentTargetState): {\n configuredTransportMode: RuntimeAgentTransportMode | null;\n configuredTransportModeStatus: AgentTransportModeStatus;\n defaultTransportMode: RuntimeAgentTransportMode | null;\n effectiveTransportMode: RuntimeAgentTransportMode;\n supportedTransportModes: RuntimeAgentTransportMode[];\n transportModeSource: AgentTransportModeSource;\n} {\n const supportedTransportModes = state.transportModes.map(\n (transportMode) => transportMode.mode\n );\n const configuredTransportMode = state.registration.transportMode ?? null;\n let configuredTransportModeStatus: AgentTransportModeStatus;\n if (configuredTransportMode === null) {\n configuredTransportModeStatus = \"missing\";\n } else if (\n supportedTransportModes.length === 0 ||\n supportedTransportModes.includes(configuredTransportMode)\n ) {\n configuredTransportModeStatus = \"supported\";\n } else {\n configuredTransportModeStatus = \"unsupported\";\n }\n if (\n configuredTransportModeStatus === \"supported\" &&\n configuredTransportMode\n ) {\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: state.defaultTransportMode ?? null,\n effectiveTransportMode: configuredTransportMode,\n supportedTransportModes,\n transportModeSource: \"registration\",\n };\n }\n const registryTransportMode =\n state.defaultTransportMode ?? supportedTransportModes[0] ?? null;\n if (registryTransportMode) {\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: state.defaultTransportMode ?? null,\n effectiveTransportMode: registryTransportMode,\n supportedTransportModes,\n transportModeSource: \"registry_default\",\n };\n }\n return {\n configuredTransportMode,\n configuredTransportModeStatus,\n defaultTransportMode: null,\n effectiveTransportMode: DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,\n supportedTransportModes,\n transportModeSource: \"global_default\",\n };\n}\n\nasync function emitAgentsConfigParseFallbackSignal(input: {\n presenter: ReturnType<typeof createPresenter>;\n view: \"human\" | \"agent\";\n}): Promise<void> {\n const health = await readAgentRuntimeConfigHealth();\n if (!health.parseFallback) {\n return;\n }\n const reason = health.reason ?? \"unknown\";\n const data = {\n reason,\n strategy: \"fallback_to_empty_config\",\n };\n if (input.view === \"agent\") {\n input.presenter.line({\n code: \"agents.config_parse_fallback\",\n text: `runtime config parse fallback applied (${reason})`,\n data,\n });\n return;\n }\n input.presenter.line({\n code: \"agents.config_parse_fallback\",\n text: `warning: runtime config parse fallback applied (${reason})`,\n data,\n });\n}\n"],"mappings":"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"}