loomrail 0.1.3 → 0.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DbAOELar.js","names":[],"sources":["../../../../packages/ui/src/styles.css","../../../../packages/contracts/dist/shared.js","../../../../packages/contracts/dist/orchestration.js","../../../../packages/contracts/dist/mcp.js","../../../../packages/contracts/dist/workspace-tool.js","../../../../packages/contracts/dist/workspace-strategy.js","../../../../packages/contracts/dist/workspace.js","../../../../packages/contracts/dist/review.js","../../../../packages/contracts/dist/verification.js","../../../../packages/contracts/dist/qa.js","../../../../packages/contracts/dist/workflow.js","../../../../packages/contracts/dist/provider-selection.js","../../../../packages/contracts/dist/activity.js","../../../../packages/contracts/dist/agents.js","../../../../packages/contracts/dist/launch-measurement.js","../../../../packages/contracts/dist/launch-release.js","../../../../packages/contracts/dist/guided-deployment.js","../../../../packages/contracts/dist/dependency.js","../../../../packages/contracts/dist/constitution.js","../../../../packages/contracts/dist/readiness.js","../../../../packages/contracts/dist/provider-allowance.js","../../../../packages/contracts/dist/scaffolding.js","../../../../packages/contracts/dist/work-management.js","../../../../packages/contracts/dist/attention.js","../../../../packages/contracts/dist/guided-activation.v1.json","../../../../packages/contracts/dist/activation.js","../../../../packages/contracts/dist/reporting.js","../../../../packages/contracts/dist/event-stream.js","../../../../packages/contracts/dist/session.js","../../src/boardView.ts","../../../../packages/ui/dist/icons.js","../../../../packages/ui/dist/foundation.js","../../../../packages/ui/dist/forms.js","../../../../packages/ui/dist/filter-search.js","../../../../packages/ui/dist/overlays.js","../../../../packages/ui/dist/filters.js","../../../../packages/ui/dist/patterns.js","../../src/components/BrandMark.tsx","../../src/i18n.tsx","../../src/layout.ts","../../src/components/PanelResizer.tsx","../../src/api.ts","../../src/components/LocalConnectionRecovery.tsx","../../src/session.ts","../../src/changesView.ts","../../src/eventStream.ts","../../src/useEventStream.ts","../../src/workspace.tsx","../../src/components/LaunchMeasurementPanel.tsx","../../src/components/LaunchReleasePanel.tsx","../../src/components/McpSettingsPanel.tsx","../../src/components/ProjectScaffoldPanel.tsx","../../src/components/ProjectWorkspaceStrategyPanel.tsx","../../src/components/VerificationPlanSettingsPanel.tsx","../../src/shell/appSettings.ts","../../src/density.ts","../../src/theme.ts","../../src/shell/AppFrame.tsx","../../src/views/ChangesSection.tsx","../../src/views/workItemTimeline.ts","../../src/components/ProviderAllowanceStrip.tsx","../../src/components/ProjectVerificationPanel.tsx","../../src/components/runActivityPaging.ts","../../src/components/RunActivitySection.tsx","../../src/components/HumanRequestAnswerForm.tsx","../../src/taskMoves.ts","../../src/workflowPolicy.ts","../../src/workItemDependencies.ts","../../src/views/WorkbenchPage.tsx","../../src/attentionView.ts","../../src/views/AttentionPage.tsx","../../src/views/AgentFleetPage.tsx","../../src/reportDownload.ts","../../src/views/InsightsPage.tsx","../../src/activationView.ts","../../src/views/ActivationPage.tsx","../../src/router.tsx","../../src/App.tsx","../../src/main.tsx"],"sourcesContent":["@import \"./tokens.css\";\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n* {\n scrollbar-color: var(--lr-scrollbar-thumb) var(--lr-scrollbar-track);\n scrollbar-width: thin;\n}\n\n*::-webkit-scrollbar {\n height: 6px;\n width: 6px;\n}\n\n*::-webkit-scrollbar-track {\n background: var(--lr-scrollbar-track);\n}\n\n*::-webkit-scrollbar-thumb {\n background: var(--lr-scrollbar-thumb);\n border: 1px solid transparent;\n border-radius: var(--lr-radius-full);\n background-clip: padding-box;\n}\n\n*::-webkit-scrollbar-thumb:hover {\n background: var(--lr-scrollbar-thumb-hover);\n background-clip: padding-box;\n}\n\n.lr-icon {\n display: block;\n flex: 0 0 auto;\n pointer-events: none;\n}\n\n.lr-icon--spinner {\n animation: lr-spin 700ms linear infinite;\n}\n\n.lr-control--sm {\n height: var(--lr-size-control-sm);\n}\n\n.lr-control--md {\n height: var(--lr-size-control);\n}\n\n.lr-control--lg {\n height: var(--lr-size-control-lg);\n}\n\n.lr-button,\n.lr-icon-button {\n align-items: center;\n border: 1px solid transparent;\n color: var(--lr-control-text);\n cursor: pointer;\n display: inline-flex;\n font: inherit;\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n justify-content: center;\n line-height: 1;\n outline: none;\n position: relative;\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n user-select: none;\n white-space: nowrap;\n}\n\n.lr-button {\n gap: var(--lr-space-1-5);\n padding: 0 var(--lr-space-2-5);\n}\n\n.lr-button__content {\n align-items: center;\n display: inline-flex;\n gap: var(--lr-space-1-5);\n justify-content: center;\n line-height: 1;\n min-width: 0;\n}\n\n.lr-button--rounded {\n border-radius: var(--lr-button-radius);\n}\n\n.lr-button--pill {\n border-radius: var(--lr-button-pill-radius);\n}\n\n.lr-button--ghost {\n background: transparent;\n}\n\n.lr-button--ghost:hover:not(:disabled),\n.lr-button--ghost[data-state=\"open\"] {\n background: var(--lr-surface-hover);\n color: var(--lr-text);\n}\n\n.lr-button--ghost:active:not(:disabled) {\n background: var(--lr-surface-active);\n}\n\n.lr-button--secondary {\n background: var(--lr-button-secondary-bg);\n border-color: var(--lr-button-secondary-border);\n box-shadow: var(--lr-button-overlay-shadow);\n}\n\n.lr-button--secondary:hover:not(:disabled) {\n background: var(--lr-button-secondary-bg-hover);\n border-color: transparent;\n box-shadow: var(--lr-button-overlay-shadow-hover);\n color: var(--lr-text);\n}\n\n.lr-button--secondary:active:not(:disabled),\n.lr-button--secondary[data-state=\"open\"]:not(:disabled) {\n background: var(--lr-surface-active);\n border-color: transparent;\n box-shadow: var(--lr-button-overlay-shadow-active);\n color: var(--lr-text);\n}\n\n.lr-button--surface {\n background: var(--lr-button-surface-bg);\n border-color: var(--lr-button-surface-border);\n border-width: 0.5px;\n box-shadow: var(--lr-button-overlay-shadow);\n}\n\n.lr-button--surface:hover:not(:disabled) {\n background: var(--lr-button-surface-bg-hover);\n box-shadow: var(--lr-button-overlay-shadow-hover);\n color: var(--lr-text);\n}\n\n.lr-button--surface:active:not(:disabled),\n.lr-button--surface[data-state=\"open\"]:not(:disabled) {\n background: var(--lr-button-surface-bg-active);\n box-shadow: var(--lr-button-overlay-shadow-active);\n color: var(--lr-text);\n}\n\n.lr-button--primary {\n background: var(--lr-button-primary-bg);\n border-color: color-mix(in srgb, var(--lr-button-primary-bg) 88%, black);\n box-shadow:\n inset 0 1px rgb(255 255 255 / 15%),\n 0 1px 2px rgb(0 0 0 / 8%);\n color: var(--lr-button-primary-text);\n}\n\n.lr-button--primary:hover:not(:disabled) {\n background: var(--lr-button-primary-bg-hover);\n}\n\n.lr-button--destructive {\n background: transparent;\n color: var(--lr-danger);\n}\n\n.lr-button--destructive:hover:not(:disabled) {\n background: var(--lr-danger-soft);\n}\n\n.lr-button:focus-visible,\n.lr-icon-button:focus-visible {\n box-shadow:\n 0 0 0 2px var(--lr-canvas),\n 0 0 0 4px var(--lr-focus);\n}\n\n.lr-button:disabled,\n.lr-icon-button:disabled {\n cursor: not-allowed;\n opacity: 0.48;\n}\n\n.lr-button.is-loading > .lr-icon:last-child {\n left: 50%;\n position: absolute;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n\n.lr-button .is-visually-loading {\n visibility: hidden;\n}\n\n.lr-icon-button {\n aspect-ratio: 1;\n border-radius: var(--lr-radius-full);\n padding: 0;\n}\n\n.lr-icon-button > .lr-icon {\n height: 14px;\n width: 14px;\n}\n\n.lr-icon-button.lr-control--lg > .lr-icon {\n height: 16px;\n width: 16px;\n}\n\n.lr-badge,\n.lr-status {\n align-items: center;\n border-radius: var(--lr-radius-full);\n display: inline-flex;\n line-height: 1;\n white-space: nowrap;\n}\n\n.lr-badge {\n background: var(--lr-surface-inset);\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-medium);\n min-height: 20px;\n padding: 0 var(--lr-space-2);\n}\n\n.lr-badge--accent {\n background: var(--lr-accent-soft);\n color: var(--lr-accent);\n}\n\n.lr-badge--success {\n background: var(--lr-success-soft);\n color: var(--lr-success);\n}\n\n.lr-badge--warning {\n background: var(--lr-warning-soft);\n color: var(--lr-warning);\n}\n\n.lr-badge--danger {\n background: var(--lr-danger-soft);\n color: var(--lr-danger);\n}\n\n.lr-badge--info {\n background: var(--lr-info-soft);\n color: var(--lr-info);\n}\n\n.lr-status {\n color: var(--lr-text-secondary);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-semibold);\n gap: var(--lr-space-2);\n}\n\n.lr-status__icon {\n border: 1.5px solid currentColor;\n border-radius: var(--lr-radius-full);\n height: 9px;\n width: 9px;\n}\n\n.lr-status--ready {\n color: var(--lr-ready);\n}\n\n.lr-status--running {\n color: var(--lr-running);\n}\n\n.lr-status--running .lr-status__icon,\n.lr-status--complete .lr-status__icon {\n background: currentColor;\n box-shadow: inset 0 0 0 2px var(--lr-surface);\n}\n\n.lr-status--review {\n color: var(--lr-review);\n}\n\n.lr-status--waiting {\n color: var(--lr-waiting);\n}\n\n.lr-status--paused {\n color: var(--lr-paused);\n}\n\n.lr-status--complete {\n color: var(--lr-complete);\n}\n\n.lr-status--queued {\n color: var(--lr-queued);\n}\n\n.lr-avatar {\n align-items: center;\n background: var(--lr-surface-active);\n border-radius: var(--lr-radius-xs);\n color: var(--lr-text-muted);\n display: inline-flex;\n font-size: 9px;\n font-weight: var(--lr-weight-semibold);\n height: 20px;\n justify-content: center;\n line-height: 1;\n width: 20px;\n}\n\n.lr-avatar--accent {\n background: var(--lr-accent-soft);\n color: var(--lr-accent);\n}\n\n.lr-avatar--success {\n background: var(--lr-success-soft);\n color: var(--lr-success);\n}\n\n.lr-avatar--warning {\n background: var(--lr-warning-soft);\n color: var(--lr-warning);\n}\n\n.lr-skeleton {\n animation: lr-pulse 1.5s ease-in-out infinite;\n background: var(--lr-surface-active);\n border-radius: var(--lr-radius-xs);\n display: inline-block;\n height: 12px;\n max-width: 100%;\n}\n\n.lr-feedback {\n align-items: flex-start;\n color: var(--lr-text-secondary);\n display: flex;\n gap: var(--lr-space-3);\n padding: var(--lr-space-4);\n}\n\n.lr-feedback__icon {\n align-items: center;\n background: var(--lr-surface-inset);\n border-radius: var(--lr-radius-control);\n color: var(--lr-text-muted);\n display: inline-flex;\n height: 32px;\n justify-content: center;\n width: 32px;\n}\n\n.lr-feedback strong {\n color: var(--lr-text);\n display: block;\n font-size: var(--lr-font-base);\n}\n\n.lr-feedback p {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-sm);\n line-height: 1.45;\n margin: var(--lr-space-1) 0 0;\n}\n\n.lr-feedback__action {\n margin-left: auto;\n}\n\n.lr-feedback--error .lr-feedback__icon {\n background: var(--lr-danger-soft);\n color: var(--lr-danger);\n}\n\n.lr-feedback--offline .lr-feedback__icon {\n background: var(--lr-warning-soft);\n color: var(--lr-warning);\n}\n\n.lr-feedback--success .lr-feedback__icon {\n background: var(--lr-success-soft);\n color: var(--lr-success);\n}\n\n.lr-kbd {\n align-items: center;\n background: color-mix(in srgb, var(--lr-surface-inset) 70%, transparent);\n border: 1px solid var(--lr-border-subtle);\n border-radius: 4px;\n color: var(--lr-text-faint);\n display: inline-flex;\n font-family: var(--lr-font-sans);\n font-size: 10px;\n font-weight: var(--lr-weight-normal);\n height: 18px;\n justify-content: center;\n line-height: 1;\n min-width: 18px;\n padding: 0 4px;\n}\n\n/* Forms */\n\n.lr-field {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.lr-field__label {\n color: var(--lr-text-secondary);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n line-height: 16px;\n margin-bottom: var(--lr-space-1-5);\n}\n\n.lr-field__description,\n.lr-field__error {\n align-items: center;\n align-self: flex-start;\n color: var(--lr-text-muted);\n display: flex;\n font-size: var(--lr-font-xs);\n gap: var(--lr-space-1);\n line-height: 14px;\n margin-top: 3px;\n min-height: 14px;\n}\n\n.lr-field__error {\n color: var(--lr-danger);\n}\n\n.lr-field__error .lr-icon {\n flex: 0 0 auto;\n}\n\n.lr-text-field {\n align-items: center;\n background: var(--lr-input-bg);\n border: 1px solid var(--lr-input-border);\n border-radius: var(--lr-control-radius);\n color: var(--lr-text-muted);\n display: flex;\n gap: var(--lr-space-2);\n padding: 0 var(--lr-space-2-5);\n transition:\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-text-field:hover:not(:focus-within) {\n border-color: var(--lr-border-strong);\n}\n\n.lr-text-field:focus-within,\n.lr-textarea:focus-visible {\n border-color: var(--lr-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--lr-focus) 18%, transparent);\n outline: none;\n}\n\n.lr-text-field.has-error,\n.lr-textarea.has-error {\n border-color: var(--lr-danger);\n}\n\n.lr-text-field input {\n background: transparent;\n border: 0;\n color: var(--lr-text);\n font: inherit;\n font-size: var(--lr-font-base);\n height: 100%;\n min-width: 0;\n outline: 0;\n padding: 0;\n width: 100%;\n}\n\n.lr-text-field input::placeholder,\n.lr-textarea::placeholder {\n color: var(--lr-input-placeholder);\n}\n\n.lr-textarea {\n background: var(--lr-input-bg);\n border: 1px solid var(--lr-input-border);\n border-radius: var(--lr-control-radius);\n color: var(--lr-text);\n font: inherit;\n font-size: var(--lr-font-base);\n line-height: 1.5;\n min-height: 88px;\n padding: var(--lr-space-2-5) var(--lr-space-3);\n resize: vertical;\n transition:\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n width: 100%;\n}\n\n.lr-check-row,\n.lr-radio-row,\n.lr-switch-row {\n color: var(--lr-text-secondary);\n cursor: pointer;\n display: flex;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-2);\n}\n\n.lr-check-row,\n.lr-radio-row {\n align-items: flex-start;\n}\n\n.lr-switch-row {\n align-items: center;\n justify-content: space-between;\n}\n\n.lr-check-row strong,\n.lr-radio-row strong,\n.lr-switch-row strong {\n display: block;\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n line-height: 18px;\n}\n\n.lr-check-row small,\n.lr-radio-row small,\n.lr-switch-row small {\n color: var(--lr-text-muted);\n display: block;\n font-size: var(--lr-font-xs);\n line-height: 1.4;\n margin-top: 1px;\n}\n\n.lr-checkbox,\n.lr-radio {\n align-items: center;\n background: var(--lr-control-bg);\n border: 1px solid var(--lr-control-border);\n color: var(--lr-text-inverse);\n display: inline-flex;\n flex: 0 0 auto;\n height: 16px;\n justify-content: center;\n margin-top: 1px;\n outline: 0;\n padding: 0;\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n transform var(--lr-duration-fast) var(--lr-ease-standard);\n width: 16px;\n}\n\n.lr-checkbox {\n border-radius: 5px;\n}\n\n.lr-radio {\n border-radius: var(--lr-radius-full);\n}\n\n.lr-checkbox[data-state=\"checked\"] {\n background: var(--lr-accent);\n border-color: var(--lr-accent);\n}\n\n.lr-checkbox[data-state=\"checked\"] > span {\n animation: lr-check-in var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-radio__indicator {\n background: var(--lr-accent);\n border-radius: var(--lr-radius-full);\n display: block;\n height: 8px;\n transform: scale(0);\n transition: transform var(--lr-duration-fast) var(--lr-ease-standard);\n width: 8px;\n}\n\n.lr-radio[data-state=\"checked\"] {\n border-color: var(--lr-accent);\n}\n\n.lr-radio[data-state=\"checked\"] .lr-radio__indicator {\n transform: scale(1);\n}\n\n.lr-checkbox:focus-visible,\n.lr-radio:focus-visible,\n.lr-switch:focus-visible {\n box-shadow:\n 0 0 0 2px var(--lr-canvas),\n 0 0 0 4px var(--lr-focus);\n}\n\n.lr-radio-group {\n display: grid;\n gap: var(--lr-space-2-5);\n}\n\n.lr-switch {\n background: var(--lr-surface-active);\n border: 0;\n border-radius: var(--lr-radius-full);\n cursor: pointer;\n height: 18px;\n outline: 0;\n padding: 2px;\n transition: background-color var(--lr-duration-fast) var(--lr-ease-standard);\n width: 30px;\n}\n\n.lr-switch[data-state=\"checked\"] {\n background: var(--lr-accent);\n}\n\n.lr-switch__thumb {\n background: #fff;\n border-radius: var(--lr-radius-full);\n box-shadow: 0 1px 2px rgb(0 0 0 / 18%);\n display: block;\n height: 14px;\n transform: translateX(0);\n transition: transform 160ms var(--lr-ease-standard);\n width: 14px;\n}\n\n.lr-switch[data-state=\"checked\"] .lr-switch__thumb {\n transform: translateX(12px);\n}\n\n.lr-select-trigger {\n align-items: center;\n background: var(--lr-control-bg);\n border: 1px solid var(--lr-control-border);\n border-radius: var(--lr-control-radius);\n color: var(--lr-text-secondary);\n display: inline-flex;\n font: inherit;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-2);\n justify-content: space-between;\n min-width: 124px;\n outline: 0;\n padding: 0 var(--lr-space-2-5);\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-select-trigger:hover {\n background: var(--lr-control-bg-hover);\n border-color: var(--lr-border-strong);\n}\n\n.lr-select-trigger:focus-visible {\n border-color: var(--lr-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--lr-focus) 18%, transparent);\n}\n\n.lr-select-trigger > span:last-child {\n align-items: center;\n display: inline-flex;\n justify-content: center;\n}\n\n.lr-select-trigger--compact {\n border: 0.5px solid transparent;\n box-shadow: var(--lr-compact-control-shadow);\n font-size: var(--lr-font-sm);\n justify-content: flex-start;\n min-width: 100px;\n padding: 1px 18px 1px 8px;\n position: relative;\n width: 100px;\n}\n\n.lr-select-trigger--compact > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.lr-select-trigger--compact > span:last-child {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.lr-select-trigger--compact[data-state=\"open\"] {\n background: var(--lr-control-bg-hover);\n border-color: transparent;\n}\n\n.lr-select-trigger--compact:focus-visible {\n border-color: transparent;\n box-shadow:\n 0 0 0 2px var(--lr-popover-bg),\n 0 0 0 4px var(--lr-focus);\n}\n\n.lr-select-content {\n animation: lr-popover-in var(--lr-duration-fast) var(--lr-ease-standard);\n background: var(--lr-popover-bg);\n border: 0.5px solid var(--lr-popover-border);\n border-radius: var(--lr-popover-radius);\n box-shadow: var(--lr-shadow-popover);\n overflow: hidden;\n padding: var(--lr-space-1);\n z-index: 110;\n}\n\n.lr-select-content {\n max-height: var(--radix-select-content-available-height);\n max-width: calc(100vw - var(--lr-space-6));\n min-width: var(--radix-select-trigger-width);\n width: var(--radix-select-trigger-width);\n}\n\n.lr-select-content--compact {\n min-width: 136px;\n padding: var(--lr-space-1) 0;\n width: 136px;\n}\n\n.lr-select-content--compact .lr-select-item {\n border-radius: 0;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-2);\n min-height: var(--lr-size-control-sm);\n padding: 0 8px 0 12px;\n}\n\n.lr-select-viewport {\n width: 100%;\n}\n\n.lr-select-content[data-state=\"closed\"] {\n animation: lr-popover-out var(--lr-duration-instant) var(--lr-ease-standard);\n}\n\n.lr-select-item {\n align-items: center;\n background: transparent;\n border: 0;\n border-radius: 7px;\n color: var(--lr-text-secondary);\n cursor: default;\n display: grid;\n font: inherit;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-2);\n grid-template-columns: minmax(0, 1fr) 16px;\n min-height: var(--lr-size-row);\n outline: 0;\n padding: 0 var(--lr-space-2);\n position: relative;\n text-align: left;\n user-select: none;\n width: 100%;\n}\n\n.lr-select-item[data-highlighted] {\n background: var(--lr-popover-item-hover);\n color: var(--lr-text);\n}\n\n.lr-select-item[data-disabled] {\n opacity: 0.45;\n}\n\n.lr-select-item__copy {\n display: grid;\n min-width: 0;\n}\n\n.lr-select-item__copy > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.lr-select-item:has(.lr-select-item__copy small) {\n min-height: 44px;\n padding-bottom: var(--lr-space-1-5);\n padding-top: var(--lr-space-1-5);\n}\n\n.lr-select-item__copy > span {\n color: var(--lr-text);\n font-weight: var(--lr-weight-normal);\n line-height: 1.35;\n}\n\n.lr-select-item[data-state=\"checked\"] .lr-select-item__copy > span {\n font-weight: var(--lr-weight-medium);\n}\n\n.lr-select-item__indicator {\n align-items: center;\n display: inline-flex;\n justify-content: center;\n justify-self: end;\n}\n\n.lr-select-item small {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-normal);\n line-height: 1.35;\n margin-top: 1px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Menus, popovers, dialogs and navigation controls */\n\n.lr-tooltip {\n animation: lr-tooltip-in var(--lr-duration-fast) var(--lr-ease-standard);\n background: var(--lr-text);\n border-radius: 6px;\n color: var(--lr-canvas);\n font-size: var(--lr-font-xs);\n line-height: 1;\n padding: 6px 8px;\n /* A tooltip is a label, never a target: it must not swallow clicks on the control beneath it. */\n pointer-events: none;\n z-index: 120;\n}\n\n/* The positioning wrapper is generated by the overlay primitive and is opaque to pointer events by\n default, so it has to be neutralised alongside the tooltip it carries. */\n[data-radix-popper-content-wrapper]:has(> .lr-tooltip) {\n pointer-events: none;\n}\n\n.lr-tooltip__arrow {\n fill: var(--lr-text);\n}\n\n.lr-menu,\n.lr-popover {\n animation: lr-popover-in var(--lr-duration-fast) var(--lr-ease-standard);\n background: var(--lr-popover-bg);\n border: 0.5px solid var(--lr-popover-border);\n border-radius: var(--lr-popover-radius);\n box-shadow: var(--lr-shadow-popover);\n color: var(--lr-text-secondary);\n outline: 0;\n padding: var(--lr-space-1);\n z-index: 90;\n}\n\n.lr-menu[data-state=\"closed\"],\n.lr-popover[data-state=\"closed\"] {\n animation: lr-popover-out var(--lr-duration-instant) var(--lr-ease-standard);\n}\n\n.lr-menu {\n min-width: 216px;\n}\n\n.lr-menu__group {\n display: grid;\n}\n\n.lr-menu__item {\n align-items: center;\n border-radius: 7px;\n cursor: default;\n display: grid;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-2);\n grid-template-columns: minmax(0, 1fr) auto;\n min-height: var(--lr-size-row);\n outline: none;\n padding: 0 var(--lr-space-2);\n user-select: none;\n}\n\n.lr-menu__item.has-icon {\n grid-template-columns: 16px minmax(0, 1fr) auto;\n}\n\n.lr-menu__item[data-highlighted] {\n background: var(--lr-popover-item-hover);\n color: var(--lr-text);\n}\n\n.lr-menu__item.is-danger {\n color: var(--lr-danger);\n}\n\n.lr-menu__item.is-danger[data-highlighted] {\n background: var(--lr-danger-soft);\n color: var(--lr-danger);\n}\n\n.lr-menu__item[data-disabled] {\n opacity: 0.42;\n}\n\n.lr-menu__item-icon {\n align-items: center;\n display: inline-flex;\n height: 16px;\n justify-content: center;\n width: 16px;\n}\n\n.lr-menu__separator {\n background: var(--lr-border-subtle);\n height: 1px;\n margin: var(--lr-space-1) calc(var(--lr-space-1) * -1);\n}\n\n.lr-popover {\n min-width: 280px;\n}\n\n.lr-dialog-overlay {\n animation: lr-overlay-in 160ms var(--lr-ease-standard);\n background: var(--lr-overlay-bg);\n inset: 0;\n position: fixed;\n z-index: 100;\n}\n\n.lr-dialog-overlay[data-state=\"closed\"] {\n animation: lr-overlay-out 110ms var(--lr-ease-standard);\n}\n\n.lr-dialog {\n animation: lr-dialog-in 180ms var(--lr-ease-standard);\n background: var(--lr-surface-raised);\n border: 1px solid var(--lr-border);\n border-radius: var(--lr-dialog-radius);\n box-shadow: var(--lr-shadow-dialog);\n color: var(--lr-text);\n display: flex;\n flex-direction: column;\n left: 50%;\n max-height: min(760px, calc(100vh - 48px));\n max-width: calc(100vw - 32px);\n outline: none;\n overflow: hidden;\n position: fixed;\n top: 50%;\n transform: translate(-50%, -50%);\n width: min(100%, 620px);\n z-index: 101;\n}\n\n.lr-dialog[data-state=\"closed\"] {\n animation: lr-dialog-out 110ms var(--lr-ease-standard);\n}\n\n.lr-dialog--sm {\n width: min(100%, 440px);\n}\n\n.lr-dialog--lg {\n width: min(100%, 920px);\n}\n\n.lr-dialog__header {\n align-items: flex-start;\n border-bottom: 1px solid var(--lr-border-subtle);\n display: flex;\n gap: var(--lr-space-4);\n justify-content: space-between;\n min-height: 62px;\n padding: var(--lr-space-4) var(--lr-space-5);\n}\n\n.lr-dialog__header h2 {\n font-size: var(--lr-font-md);\n font-weight: var(--lr-weight-semibold);\n line-height: 1.35;\n margin: 0;\n}\n\n.lr-dialog__header p {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-sm);\n line-height: 1.45;\n margin: var(--lr-space-1) 0 0;\n}\n\n.lr-dialog__body {\n flex: 1;\n overflow: auto;\n padding: var(--lr-space-5);\n}\n\n.lr-dialog__footer {\n align-items: center;\n border-top: 1px solid var(--lr-border-subtle);\n display: flex;\n gap: var(--lr-space-2);\n justify-content: flex-end;\n min-height: 58px;\n padding: var(--lr-space-3) var(--lr-space-5);\n}\n\n/* Cascading task filters */\n\n.lr-visually-hidden {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.lr-filter-popover {\n animation: lr-popover-in var(--lr-duration-fast) var(--lr-ease-standard);\n background: var(--lr-popover-bg);\n border: 0.5px solid var(--lr-popover-border);\n border-radius: var(--lr-popover-radius);\n box-shadow: var(--lr-shadow-popover);\n color: var(--lr-text-secondary);\n max-width: calc(100vw - 16px);\n outline: 0;\n overflow: visible;\n position: relative;\n transform-origin: var(--radix-popover-content-transform-origin);\n width: 191px;\n z-index: 95;\n}\n\n.lr-filter-popover[data-state=\"closed\"] {\n animation: lr-popover-out var(--lr-duration-instant) var(--lr-ease-standard);\n}\n\n.lr-filter-main-panel {\n border-radius: inherit;\n overflow: hidden;\n}\n\n.lr-filter-main-panel .lr-filter-level {\n width: 190px;\n}\n\n.lr-filter-submenus {\n inset: 0;\n pointer-events: none;\n position: absolute;\n z-index: 0;\n}\n\n.lr-filter-level {\n display: flex;\n flex-direction: column;\n max-height: min(707px, calc(100vh - 112px));\n min-height: 0;\n min-width: 0;\n width: 200px;\n}\n\n.lr-filter-submenus .lr-filter-level {\n animation: lr-filter-panel-in var(--lr-duration-fast) var(--lr-ease-standard);\n background: var(--lr-popover-bg);\n border: 0.5px solid var(--lr-popover-border);\n border-radius: var(--lr-popover-radius);\n box-shadow:\n 0 9px 48px rgb(0 0 0 / 8%),\n 0 6px 24px rgb(0 0 0 / 10%),\n 0 1px 1px rgb(0 0 0 / 4%);\n overflow: hidden;\n pointer-events: auto;\n position: absolute;\n transition:\n height var(--lr-duration-fast) var(--lr-ease-standard),\n top var(--lr-duration-fast) var(--lr-ease-standard);\n width: 200px;\n}\n\n.lr-filter-search {\n border-bottom: 0.5px solid var(--lr-popover-border);\n color: var(--lr-text-faint);\n display: block;\n flex: 0 0 auto;\n min-height: 37px;\n padding: 0 12px 0 14px;\n}\n\n.lr-filter-search:focus-within {\n color: var(--lr-text-muted);\n}\n\n.lr-filter-search input {\n appearance: none;\n background: transparent;\n border: 0;\n color: var(--lr-text);\n font: inherit;\n font-size: var(--lr-font-base);\n height: 36px;\n line-height: 18px;\n min-width: 0;\n outline: 0;\n padding: 10px 0 9px;\n width: 100%;\n}\n\n.lr-filter-search input::placeholder {\n color: var(--lr-text-faint);\n}\n\n.lr-filter-search input::-webkit-search-cancel-button {\n appearance: none;\n}\n\n.lr-filter-list {\n display: grid;\n flex: 0 1 auto;\n grid-auto-rows: max-content;\n max-height: 668px;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 6px 0;\n}\n\n.lr-filter-separator {\n height: 12px;\n position: relative;\n}\n\n.lr-filter-separator::after {\n background: var(--lr-popover-border);\n content: \"\";\n height: 0.5px;\n inset: 5.75px 0 auto;\n position: absolute;\n}\n\n.lr-filter-item {\n align-items: center;\n background: transparent;\n border: 0;\n border-radius: 0;\n color: var(--lr-text-secondary);\n display: grid;\n font: inherit;\n font-size: var(--lr-font-base);\n gap: var(--lr-space-2);\n grid-template-columns: 17px minmax(0, 1fr) auto;\n line-height: 19.5px;\n min-height: 32px;\n outline: 0;\n padding: 0 18px 0 14px;\n text-align: left;\n transition:\n background-color var(--lr-duration-instant) var(--lr-ease-standard),\n color var(--lr-duration-instant) var(--lr-ease-standard);\n width: 100%;\n}\n\n.lr-filter-choice {\n border-radius: 0;\n display: grid;\n grid-template-columns: 22px minmax(0, 1fr);\n min-height: 32px;\n padding: 0 18px 0 14px;\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n color var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-filter-choice:hover,\n.lr-filter-choice:has(.lr-filter-choice__checkbox:focus-visible) {\n background: var(--lr-popover-item-hover);\n color: var(--lr-text);\n}\n\n.lr-filter-choice:has(.lr-filter-choice__checkbox[aria-pressed=\"true\"]):hover,\n.lr-filter-choice:has(.lr-filter-choice__checkbox[aria-pressed=\"true\"]):has(\n .lr-filter-choice__checkbox:focus-visible\n ) {\n background: transparent;\n}\n\n.lr-filter-choice__checkbox {\n align-items: center;\n align-self: center;\n background: transparent;\n border: 1px solid var(--lr-border);\n border-radius: 3px;\n color: var(--lr-text-inverse);\n display: inline-flex;\n height: 12px;\n justify-content: center;\n justify-self: start;\n margin-left: 2px;\n outline: 0;\n padding: 0;\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n width: 12px;\n}\n\n.lr-filter-choice__checkbox:hover {\n border-color: var(--lr-text-faint);\n}\n\n.lr-filter-choice__checkbox[aria-pressed=\"true\"] {\n background: var(--lr-accent);\n border-color: var(--lr-accent);\n color: var(--lr-text-inverse);\n}\n\n.lr-filter-choice__checkbox[aria-pressed=\"true\"] svg {\n color: var(--lr-text-inverse);\n stroke: currentColor;\n}\n\n.lr-filter-choice__checkbox:focus-visible {\n box-shadow:\n 0 0 0 2px var(--lr-popover-bg),\n 0 0 0 4px var(--lr-focus);\n}\n\n.lr-filter-item--choice {\n background: transparent !important;\n grid-template-columns: minmax(0, 1fr) auto;\n padding: 0;\n}\n\n.lr-filter-item:has(.lr-filter-item__copy small),\n.lr-filter-choice:has(.lr-filter-item__copy small) {\n min-height: 46px;\n}\n\n.lr-filter-item:hover,\n.lr-filter-item[data-active=\"true\"],\n.lr-filter-item:focus-visible {\n background: var(--lr-popover-item-hover);\n color: var(--lr-text);\n}\n\n.lr-filter-item:focus-visible {\n box-shadow: inset 0 0 0 2px var(--lr-focus);\n}\n\n.lr-filter-item__icon,\n.lr-filter-item__meta {\n align-items: center;\n color: var(--lr-text-faint);\n display: inline-flex;\n justify-content: center;\n}\n\n.lr-filter-item__copy {\n display: grid;\n gap: 1px;\n min-width: 0;\n}\n\n.lr-filter-item__copy > span,\n.lr-filter-item__copy small {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.lr-filter-item__context {\n color: var(--lr-text-faint);\n}\n\n.lr-filter-item__context::after {\n content: \"\\2009\\203A\\2009\";\n}\n\n.lr-filter-item__copy small,\n.lr-filter-item__meta small {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-regular);\n}\n\n.lr-filter-item__meta {\n gap: var(--lr-space-1-5);\n min-width: 16px;\n}\n\n.lr-filter-empty {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-sm);\n line-height: 1.45;\n margin: 0;\n padding: var(--lr-space-4) var(--lr-space-3);\n text-align: center;\n}\n\n.lr-filter-dialog {\n animation: lr-filter-fade-in 100ms ease-out;\n background: var(--lr-canvas);\n color: var(--lr-text);\n display: flex;\n flex-direction: column;\n height: 100dvh;\n inset: 0;\n outline: 0;\n position: fixed;\n width: 100vw;\n z-index: 101;\n}\n\n.lr-filter-dialog[data-state=\"closed\"] {\n animation: lr-filter-fade-out 70ms ease-in;\n}\n\n.lr-filter-dialog__header {\n align-items: center;\n background: var(--lr-surface);\n border-bottom: 1px solid var(--lr-border-subtle);\n display: flex;\n flex: 0 0 auto;\n justify-content: space-between;\n min-height: calc(52px + env(safe-area-inset-top));\n padding: env(safe-area-inset-top) var(--lr-space-3) 0;\n}\n\n.lr-filter-dialog__heading {\n align-items: center;\n display: flex;\n gap: var(--lr-space-2);\n min-width: 0;\n}\n\n.lr-filter-dialog__heading h2 {\n font-size: 16px;\n font-weight: var(--lr-weight-semibold);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.lr-filter-dialog__body {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.lr-filter-level--mobile {\n flex: 1;\n max-height: none;\n min-height: 0;\n width: 100%;\n}\n\n.lr-filter-level--mobile .lr-filter-search {\n background: var(--lr-surface-inset);\n border: 1px solid var(--lr-border);\n border-radius: var(--lr-radius-control);\n margin: var(--lr-space-3);\n min-height: 42px;\n padding: 0 var(--lr-space-3);\n}\n\n.lr-filter-level--mobile .lr-filter-search input {\n height: 40px;\n font-size: 16px;\n padding: 0;\n}\n\n.lr-filter-level--mobile .lr-filter-list {\n flex: 1;\n max-height: none;\n padding: 0 var(--lr-space-2) var(--lr-space-4);\n}\n\n.lr-filter-level--mobile .lr-filter-item {\n border-radius: var(--lr-radius-control);\n font-size: 15px;\n min-height: 46px;\n padding: var(--lr-space-2) var(--lr-space-3);\n}\n\n.lr-filter-level--mobile .lr-filter-choice {\n border-radius: var(--lr-radius-control);\n grid-template-columns: 42px minmax(0, 1fr);\n min-height: 46px;\n padding: 0 var(--lr-space-3);\n}\n\n.lr-filter-level--mobile .lr-filter-choice__checkbox {\n height: 18px;\n justify-self: center;\n margin-left: 0;\n width: 18px;\n}\n\n.lr-filter-level--mobile .lr-filter-choice .lr-filter-item,\n.lr-filter-level--mobile .lr-filter-item--choice {\n padding: 0;\n}\n\n.lr-filter-level--mobile .lr-filter-item__copy small,\n.lr-filter-level--mobile .lr-filter-item__meta small {\n font-size: 12px;\n}\n\n/* Applied filter conditions */\n\n.lr-applied-filter-bar {\n align-items: center;\n display: flex;\n gap: 10px;\n justify-content: space-between;\n min-width: 0;\n}\n\n.lr-applied-filter-bar__conditions {\n align-items: center;\n display: flex;\n flex: 1;\n gap: var(--lr-space-1);\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n.lr-applied-filter-bar__conditions::-webkit-scrollbar {\n display: none;\n}\n\n.lr-applied-filter {\n align-items: stretch;\n background: var(--lr-surface);\n border: 0.5px solid var(--lr-border);\n border-radius: 8px;\n display: inline-flex;\n flex: 0 0 auto;\n height: 24px;\n min-height: 24px;\n overflow: hidden;\n}\n\n.lr-applied-filter__editor,\n.lr-applied-filter__remove {\n background: transparent;\n border: 0;\n color: var(--lr-text-secondary);\n font: inherit;\n outline: 0;\n}\n\n.lr-applied-filter__editor {\n align-items: stretch;\n display: inline-flex;\n padding: 0;\n}\n\n.lr-applied-filter__editor:hover,\n.lr-applied-filter__editor:focus-visible,\n.lr-applied-filter__remove:hover,\n.lr-applied-filter__remove:focus-visible {\n background: var(--lr-surface-hover);\n color: var(--lr-text);\n}\n\n.lr-applied-filter__editor:focus-visible,\n.lr-applied-filter__remove:focus-visible {\n box-shadow: inset 0 0 0 2px var(--lr-focus);\n}\n\n.lr-applied-filter__property,\n.lr-applied-filter__operator,\n.lr-applied-filter__value {\n align-items: center;\n border-right: 0.5px solid var(--lr-border);\n display: inline-flex;\n font-size: var(--lr-font-sm);\n gap: var(--lr-space-1);\n padding: 0 6px;\n white-space: nowrap;\n}\n\n.lr-applied-filter__property {\n color: var(--lr-text-secondary);\n font-weight: var(--lr-weight-normal);\n}\n\n.lr-applied-filter__operator {\n color: var(--lr-text-muted);\n}\n\n.lr-applied-filter__value {\n color: var(--lr-text-secondary);\n}\n\n.lr-applied-filter__remove {\n align-items: center;\n display: inline-flex;\n justify-content: center;\n padding: 0;\n width: 24px;\n}\n\n.lr-applied-filter-bar__add {\n align-items: center;\n display: inline-flex;\n flex: 0 0 auto;\n}\n\n.lr-applied-filter-bar__clear {\n flex: 0 0 auto;\n}\n\n.lr-applied-filter-popover {\n animation: lr-filter-fade-in 90ms ease-out;\n background: var(--lr-popover-bg);\n border: 0.5px solid var(--lr-popover-border);\n border-radius: var(--lr-popover-radius);\n box-shadow: var(--lr-shadow-popover);\n color: var(--lr-text-secondary);\n max-height: min(360px, calc(100vh - 24px));\n outline: 0;\n overflow: hidden;\n transform-origin: var(--radix-popover-content-transform-origin);\n width: 200px;\n z-index: 96;\n}\n\n.lr-applied-filter-popover[data-state=\"closed\"] {\n animation: lr-filter-fade-out 60ms ease-in;\n}\n\n.lr-applied-filter-popover__search {\n border-bottom-color: var(--lr-border-subtle);\n}\n\n@media (max-width: 760px) {\n .lr-applied-filter-popover {\n max-width: calc(100vw - 24px);\n width: 300px;\n }\n}\n\n/* Workflow patterns */\n\n.lr-task-card {\n background: var(--lr-card-bg);\n border: 1px solid var(--lr-card-border);\n border-radius: var(--lr-card-radius);\n color: var(--lr-text-secondary);\n cursor: default;\n display: grid;\n gap: var(--lr-density-card-gap);\n padding: var(--lr-density-card-padding);\n transition:\n background-color var(--lr-duration-fast) var(--lr-ease-standard),\n border-color var(--lr-duration-fast) var(--lr-ease-standard),\n box-shadow var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-task-card:hover {\n border-color: var(--lr-border);\n box-shadow: 0 2px 8px rgb(0 0 0 / 5%);\n}\n\n.lr-task-card.is-selected {\n border-color: color-mix(in srgb, var(--lr-accent) 65%, var(--lr-border));\n box-shadow: 0 0 0 1px color-mix(in srgb, var(--lr-accent) 22%, transparent);\n}\n\n.lr-task-card.is-selected {\n background: color-mix(in srgb, var(--lr-accent-soft) 36%, var(--lr-surface));\n}\n\n.lr-task-card__header,\n.lr-task-card footer {\n align-items: center;\n display: flex;\n justify-content: space-between;\n}\n\n.lr-task-card__header > span:first-child {\n color: var(--lr-text-faint);\n font-family: var(--lr-font-mono);\n font-size: var(--lr-font-xs);\n}\n\n.lr-task-card__title {\n color: var(--lr-text);\n font-size: var(--lr-font-base);\n font-weight: var(--lr-weight-semibold);\n line-height: 1.35;\n}\n\n.lr-task-card p {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-sm);\n line-height: 1.4;\n margin: -2px 0 0;\n}\n\n.lr-task-card footer {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n min-height: 20px;\n}\n\n.lr-task-card__agent {\n align-items: center;\n display: inline-flex;\n gap: var(--lr-space-2);\n}\n\n.lr-task-card__live {\n color: var(--lr-accent);\n}\n\n.lr-kanban-column {\n min-width: 0;\n}\n\n.lr-kanban-column > header {\n align-items: center;\n display: grid;\n gap: var(--lr-space-2);\n grid-template-columns: auto auto 1fr;\n min-height: 34px;\n padding: 0 var(--lr-space-1);\n}\n\n.lr-kanban-column__count {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n}\n\n.lr-kanban-column__add {\n justify-self: end;\n min-width: var(--lr-size-control-sm);\n padding: 0;\n}\n\n.lr-kanban-column__stack {\n display: grid;\n gap: var(--lr-density-stack-gap);\n}\n\n.lr-timeline-event {\n align-items: center;\n display: grid;\n gap: var(--lr-space-2);\n grid-template-columns: auto minmax(0, 1fr) auto;\n min-height: 30px;\n}\n\n.lr-timeline-event__icon {\n align-items: center;\n background: var(--lr-surface-inset);\n border-radius: var(--lr-radius-full);\n color: var(--lr-text-muted);\n display: inline-flex;\n height: 20px;\n justify-content: center;\n width: 20px;\n}\n\n.lr-timeline-event--accent .lr-timeline-event__icon {\n background: var(--lr-accent-soft);\n color: var(--lr-accent);\n}\n\n.lr-timeline-event--success .lr-timeline-event__icon {\n background: var(--lr-success-soft);\n color: var(--lr-success);\n}\n\n.lr-timeline-event--warning .lr-timeline-event__icon {\n background: var(--lr-warning-soft);\n color: var(--lr-warning);\n}\n\n.lr-timeline-event > div {\n display: grid;\n gap: 2px;\n min-width: 0;\n}\n\n.lr-timeline-event strong {\n color: var(--lr-text-secondary);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n}\n\n.lr-timeline-event > div span,\n.lr-timeline-event time {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n}\n\n.lr-timeline-event time {\n align-self: center;\n}\n\n.lr-inspector-section {\n padding: var(--lr-space-4);\n position: relative;\n}\n\n/* The rule is drawn inset so that it lines up with the content rather than running past it, and the\n last section drops it because there is nothing below to separate from. */\n.lr-inspector-section::after {\n background: var(--lr-border-subtle);\n bottom: 0;\n content: \"\";\n height: 1px;\n left: var(--lr-space-4);\n position: absolute;\n right: var(--lr-space-4);\n}\n\n.lr-inspector-section:last-of-type::after {\n content: none;\n}\n\n.lr-inspector-section > header {\n align-items: center;\n display: flex;\n justify-content: space-between;\n margin-bottom: var(--lr-space-3);\n}\n\n.lr-inspector-section > header > strong {\n color: var(--lr-text);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-semibold);\n}\n\n.lr-inspector-section__body {\n display: grid;\n gap: var(--lr-space-3);\n}\n\n.lr-run-summary {\n display: grid;\n /* Rows sit closer than columns so each label reads as attached to its own value. */\n gap: var(--lr-space-2-5) var(--lr-space-3);\n grid-template-columns: repeat(2, minmax(0, 1fr));\n margin: 0;\n}\n\n.lr-run-summary div {\n display: grid;\n gap: 4px;\n}\n\n.lr-run-summary dt {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n}\n\n.lr-run-summary dd {\n color: var(--lr-text-secondary);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n margin: 0;\n}\n\n.lr-session-timeline-panel {\n display: grid;\n gap: var(--lr-space-2-5);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.lr-session-timeline-panel__title {\n color: var(--lr-text);\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-semibold);\n}\n\n.lr-session-timeline-panel__subtitle {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-medium);\n}\n\n.lr-session-timeline-panel__note {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n margin: 0;\n}\n\n.lr-session-timeline {\n display: grid;\n gap: var(--lr-space-3);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.lr-session-timeline__item {\n display: grid;\n gap: var(--lr-space-2);\n min-width: 0;\n}\n\n.lr-session-timeline__ordinal {\n align-items: center;\n background: var(--lr-surface-inset);\n border-radius: var(--lr-radius-full);\n color: var(--lr-text-muted);\n display: inline-flex;\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-medium);\n height: 20px;\n justify-content: center;\n width: 20px;\n}\n\n.lr-session-timeline__body {\n display: grid;\n gap: var(--lr-space-2);\n min-width: 0;\n}\n\n.lr-session-timeline__row {\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: var(--lr-space-2);\n}\n\n.lr-session-timeline__occupancy {\n align-items: center;\n display: grid;\n gap: var(--lr-space-1);\n grid-template-columns: minmax(80px, 160px) auto;\n}\n\n.lr-session-timeline__occupancy progress {\n appearance: none;\n block-size: 5px;\n border: none;\n border-radius: var(--lr-radius-full);\n inline-size: 100%;\n}\n\n.lr-session-timeline__occupancy progress::-webkit-progress-bar {\n background: var(--lr-surface-inset);\n border-radius: var(--lr-radius-full);\n}\n\n.lr-session-timeline__occupancy progress::-webkit-progress-value,\n.lr-session-timeline__occupancy progress::-moz-progress-bar {\n background: var(--lr-warning);\n border-radius: var(--lr-radius-full);\n}\n\n.lr-session-timeline__occupancy span {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n}\n\n.lr-session-timeline__occupancy-text {\n display: flex;\n flex-wrap: wrap;\n gap: var(--lr-space-1);\n margin: 0;\n}\n\n/* Spec §4.3/§5.2: the occupancy figure means different things measured and estimated, so the\n qualifier travels with the number rather than being dropped. Not colour-coded -- it is a\n provenance note, not a status. */\n.lr-session-timeline__occupancy .lr-session-timeline__occupancy-quality {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n}\n\n.lr-session-timeline__usage {\n color: var(--lr-text-faint);\n display: flex;\n flex-wrap: wrap;\n font-size: var(--lr-font-xs);\n gap: var(--lr-space-1);\n margin: 0;\n}\n\n.lr-session-timeline__usage .lr-session-timeline__usage-quality {\n color: var(--lr-text-muted);\n}\n\n.lr-session-timeline__checkpoints {\n display: grid;\n gap: var(--lr-space-2);\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.lr-session-timeline__empty {\n color: var(--lr-text-faint);\n font-size: var(--lr-font-xs);\n margin: 0;\n}\n\n.lr-checkpoint-card {\n background: var(--lr-surface-inset);\n border-radius: var(--lr-radius-control);\n padding: var(--lr-space-2) var(--lr-space-2-5);\n}\n\n.lr-checkpoint-card > summary {\n align-items: center;\n cursor: pointer;\n display: flex;\n gap: var(--lr-space-2);\n list-style: none;\n}\n\n.lr-checkpoint-card > summary::-webkit-details-marker {\n display: none;\n}\n\n/* The only persistent (non-hover) sign a collapsed checkpoint is openable: without it a closed\n card reads as a plain line of grey text. Rotates via the native [open] attribute -- no JS. */\n.lr-checkpoint-card__chevron {\n color: var(--lr-text-faint);\n flex-shrink: 0;\n transform: rotate(0deg);\n transition: transform var(--lr-duration-fast) var(--lr-ease-standard);\n}\n\n.lr-checkpoint-card[open] > summary > .lr-checkpoint-card__chevron {\n transform: rotate(90deg);\n}\n\n.lr-checkpoint-card > summary > span {\n color: var(--lr-text-secondary);\n flex: 1;\n font-size: var(--lr-font-sm);\n font-weight: var(--lr-weight-medium);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.lr-checkpoint-card > summary > time {\n color: var(--lr-text-faint);\n flex-shrink: 0;\n font-size: var(--lr-font-xs);\n}\n\n/* The card's only focusable descendant is its <summary>, which already draws a ring. `:focus-within`\n put a second one around the whole card, and fired on a mouse click as well -- unlike every\n comparable rule in this file, which uses `:focus-visible`. One ring, on the focused element, for\n keyboard focus. */\n.lr-checkpoint-card > summary:focus-visible {\n outline: 2px solid var(--lr-focus);\n outline-offset: 2px;\n}\n\n.lr-checkpoint-card__body {\n display: grid;\n gap: var(--lr-space-2);\n margin-top: var(--lr-space-2);\n}\n\n.lr-checkpoint-card__body strong {\n color: var(--lr-text-muted);\n font-size: var(--lr-font-xs);\n font-weight: var(--lr-weight-medium);\n}\n\n.lr-checkpoint-card__body ul {\n color: var(--lr-text-secondary);\n display: grid;\n font-size: var(--lr-font-xs);\n gap: 2px;\n margin: 2px 0 0;\n padding-left: var(--lr-space-4);\n}\n\n.lr-checkpoint-card__body li {\n overflow-wrap: anywhere;\n}\n\n@keyframes lr-spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes lr-pulse {\n 50% {\n opacity: 0.55;\n }\n}\n\n@keyframes lr-check-in {\n from {\n opacity: 0;\n transform: scale(0.7);\n }\n}\n\n@keyframes lr-tooltip-in {\n from {\n opacity: 0;\n transform: translateY(2px) scale(0.98);\n }\n}\n\n@keyframes lr-popover-in {\n from {\n opacity: 0;\n transform: translateY(-3px) scale(0.985);\n }\n}\n\n@keyframes lr-popover-out {\n to {\n opacity: 0;\n transform: translateY(-2px) scale(0.99);\n }\n}\n\n@keyframes lr-filter-fade-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes lr-filter-fade-out {\n to {\n opacity: 0;\n }\n}\n\n@keyframes lr-filter-panel-in {\n from {\n opacity: 0.72;\n transform: translateX(4px) scale(0.99);\n }\n}\n\n@keyframes lr-overlay-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes lr-overlay-out {\n to {\n opacity: 0;\n }\n}\n\n@keyframes lr-dialog-in {\n from {\n opacity: 0;\n transform: translate(-50%, calc(-50% + 8px)) scale(0.985);\n }\n}\n\n@keyframes lr-dialog-out {\n to {\n opacity: 0;\n transform: translate(-50%, calc(-50% + 4px)) scale(0.99);\n }\n}\n\n@keyframes lr-filter-dialog-in {\n from {\n opacity: 0;\n transform: translateX(12px);\n }\n}\n\n@keyframes lr-filter-dialog-out {\n to {\n opacity: 0;\n transform: translateX(8px);\n }\n}\n\n@media (max-width: 680px) {\n .lr-dialog {\n border-radius: var(--lr-radius-shell) var(--lr-radius-shell) 0 0;\n bottom: 0;\n left: 0;\n max-height: calc(100vh - 20px);\n max-width: none;\n top: auto;\n transform: none;\n width: 100%;\n }\n\n .lr-filter-dialog {\n border-radius: 0;\n }\n\n .lr-dialog__header,\n .lr-dialog__body,\n .lr-dialog__footer {\n padding-left: var(--lr-space-4);\n padding-right: var(--lr-space-4);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lr-icon--spinner,\n .lr-skeleton,\n .lr-select-content,\n .lr-tooltip,\n .lr-menu,\n .lr-popover,\n .lr-filter-popover,\n .lr-filter-submenus .lr-filter-level,\n .lr-filter-dialog,\n .lr-applied-filter-popover,\n .lr-dialog-overlay,\n .lr-dialog {\n animation-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n }\n\n .lr-button,\n .lr-icon-button,\n .lr-select-trigger,\n .lr-checkbox,\n .lr-radio__indicator,\n .lr-switch,\n .lr-switch__thumb,\n .lr-task-card,\n .lr-filter-item,\n .lr-filter-choice,\n .lr-filter-submenus .lr-filter-level {\n transition-duration: 1ms !important;\n }\n}\n","import { z } from \"zod\";\nexport const schemaVersionSchema = z.literal(1);\nexport const apiVersionSchema = z.literal(\"v1\");\nexport const opaqueIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .regex(/^[a-zA-Z0-9][a-zA-Z0-9._:-]*$/);\nexport const correlationIdSchema = opaqueIdSchema;\nexport const utcTimestampSchema = z.iso.datetime({ offset: true });\n// Provider identity is shared by workflow, review, scheduling and settings contracts. It lives in\n// this dependency-free module so those contracts do not form runtime import cycles around it.\nexport const providerIdSchema = z.enum([\"MOCK\", \"CODEX\", \"CLAUDE_CODE\"]);\n// Logical model policy is shared by workflow cost controls and immutable AgentRun snapshots. Keep\n// it dependency-free here so workflow.ts and agents.ts do not form a runtime schema cycle.\nexport const modelTierSchema = z.enum([\"FAST\", \"STANDARD\", \"DEEP\"]);\nexport const actorSchema = z\n .object({\n type: z.enum([\"HUMAN\", \"SYSTEM\"]),\n id: opaqueIdSchema,\n})\n .strict();\n//# sourceMappingURL=shared.js.map","import { z } from \"zod\";\nexport const coordinatorProfileId = \"builtin.code-blind-coordinator\";\nexport const coordinatorModelId = \"gpt-6-astra\";\nexport const economyModelIds = { CODEX: \"gpt-5.6-luna\", CLAUDE_CODE: \"claude-sonnet-5\" };\n// Separate owner-authored input, never copied from repository or provider-authored artifacts.\nexport const codeBlindOrchestrationSchema = z\n .object({\n mode: z.literal(\"CODE_BLIND\"),\n ownerOutcome: z.string().trim().min(10).max(2_000),\n})\n .strict();\nexport const stageExecutionPolicySchema = z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"CODE_BLIND_MANAGER\"),\n ownerOutcome: codeBlindOrchestrationSchema.shape.ownerOutcome,\n })\n .strict(),\n z.object({ kind: z.literal(\"ECONOMY_WORKER\") }).strict(),\n]);\nexport const coordinatorPacketSchema = z\n .object({\n version: z.literal(1),\n ownerOutcome: codeBlindOrchestrationSchema.shape.ownerOutcome,\n discovery: z.enum([\"COMPLETED\", \"UNKNOWN\"]),\n unresolvedQuestions: z.number().int().min(0).max(20),\n attempt: z.number().int().positive(),\n sessionOrdinal: z.number().int().positive(),\n})\n .strict();\nexport const coordinatorPlanSchema = z\n .object({\n type: z.literal(\"PLAN\"),\n orders: z\n .array(z\n .object({\n outcome: z.string().trim().min(10).max(400),\n verification: z.string().trim().min(10).max(400),\n // Earlier ordinals only: the ordered list cannot form a cycle or invent a reference.\n dependsOn: z.array(z.number().int().min(0).max(5)).max(5),\n stopCondition: z.enum([\n \"SCOPE_CHANGE\",\n \"MISSING_INFORMATION\",\n \"PERMISSION_REQUIRED\",\n \"VERIFICATION_FAILED\",\n ]),\n })\n .strict())\n .min(1)\n .max(6),\n})\n .strict()\n .superRefine((plan, context) => {\n plan.orders.forEach((order, index) => {\n if (new Set(order.dependsOn).size !== order.dependsOn.length ||\n order.dependsOn.some((ref) => ref >= index)) {\n context.addIssue({\n code: \"custom\",\n path: [\"orders\", index, \"dependsOn\"],\n message: \"Dependencies must uniquely reference earlier work orders\",\n });\n }\n });\n});\n/** Canonical wire text; schema parsing drops no unknown fields and fixes key order. */\nexport const serializeCoordinatorPacket = (input) => JSON.stringify(coordinatorPacketSchema.parse(input));\n//# sourceMappingURL=orchestration.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nconst absolutePathPattern = /^(?:[/\\\\]|[A-Za-z]:[/\\\\])/;\nconst canonicalDigestSchema = z.string().regex(/^[0-9a-f]{64}$/);\nexport const mcpProfileNameSchema = z.string().trim().min(1).max(80);\nexport const mcpToolNameSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:/-]*$/);\nexport const mcpExecutablePathSchema = z\n .string()\n .min(1)\n .max(4_096)\n .regex(absolutePathPattern, \"An MCP executable path must be absolute\");\nexport const mcpArgumentSchema = z.string().min(1).max(2_048);\n/**\n * The exact launch recipe an owner is being asked to consent to.\n *\n * It is an argv vector, never a shell string. The structural schema deliberately does not decide\n * whether an executable is safe for C1: a syntactically valid `/bin/sh` must reach the policy\n * layer so the UI can answer \"shell launchers are forbidden\", rather than collapsing that fact\n * into a generic invalid-request response.\n */\nexport const mcpProfileCandidateSchema = z\n .object({\n profileId: opaqueIdSchema.nullable(),\n name: mcpProfileNameSchema,\n executable: mcpExecutablePathSchema,\n args: z.array(mcpArgumentSchema).max(32),\n declaredTools: z.array(mcpToolNameSchema).min(1).max(64),\n})\n .strict()\n .superRefine((candidate, context) => {\n const renderedLength = candidate.executable.length + candidate.args.reduce((total, argument) => total + argument.length, 0);\n if (renderedLength > 16_384) {\n context.addIssue({ code: \"custom\", message: \"The MCP launch recipe exceeds 16 KiB\" });\n }\n if (new Set(candidate.declaredTools).size !== candidate.declaredTools.length) {\n context.addIssue({ code: \"custom\", message: \"Declared MCP tool names must be unique\" });\n }\n});\nexport const mcpProfileProposalSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n challengeId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n candidate: mcpProfileCandidateSchema,\n canonicalDigest: canonicalDigestSchema,\n createdAt: utcTimestampSchema,\n expiresAt: utcTimestampSchema,\n})\n .strict();\nexport const mcpProfileRevisionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n profileId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n revision: z.number().int().positive(),\n name: mcpProfileNameSchema,\n executable: mcpExecutablePathSchema,\n args: z.array(mcpArgumentSchema).max(32),\n declaredTools: z.array(mcpToolNameSchema).min(1).max(64),\n canonicalDigest: canonicalDigestSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const mcpConsentSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n canonicalDigest: canonicalDigestSchema,\n ownerId: opaqueIdSchema,\n consentedAt: utcTimestampSchema,\n})\n .strict();\nexport const mcpCapabilityProbeStateSchema = z.enum([\n \"READY\",\n \"SPAWN_FAILED\",\n \"TIMED_OUT\",\n \"INVALID_RESPONSE\",\n \"OUTPUT_LIMIT_REACHED\",\n \"UNSUPPORTED_PROTOCOL\",\n \"PROCESS_EXITED\",\n]);\nexport const mcpCapabilitySnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n state: mcpCapabilityProbeStateSchema,\n protocolVersion: z.string().min(1).max(80).nullable(),\n tools: z.array(mcpToolNameSchema).max(64),\n resources: z.array(z.string().min(1).max(256)).max(64),\n prompts: z.array(z.string().min(1).max(256)).max(64),\n observedAt: utcTimestampSchema,\n})\n .strict();\nexport const mcpGrantSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n tools: z.array(mcpToolNameSchema).min(1).max(64),\n enabled: z.boolean(),\n version: z.number().int().positive(),\n grantedBy: opaqueIdSchema,\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n revokedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const mcpSessionSnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n profileDigest: canonicalDigestSchema,\n grantId: opaqueIdSchema,\n grantVersion: z.number().int().positive(),\n tools: z.array(mcpToolNameSchema).min(1).max(64),\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const mcpToolCallStatusSchema = z.enum([\"STARTED\", \"SUCCEEDED\", \"FAILED\", \"UNKNOWN_OUTCOME\"]);\nexport const mcpToolCallFailureCodeSchema = z.enum([\n \"TOOL_NOT_GRANTED\",\n \"GRANT_REVOKED\",\n \"ARGUMENTS_INVALID\",\n \"SERVER_UNAVAILABLE\",\n \"SERVER_ERROR\",\n \"PROTOCOL_ERROR\",\n \"DEADLINE_EXCEEDED\",\n \"OUTPUT_LIMIT_REACHED\",\n \"CONNECTION_LOST\",\n]);\nexport const mcpToolCallRecordSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n sessionSnapshotId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n toolName: mcpToolNameSchema,\n inputDigest: canonicalDigestSchema,\n status: mcpToolCallStatusSchema,\n failureCode: mcpToolCallFailureCodeSchema.nullable(),\n startedAt: utcTimestampSchema,\n finishedAt: utcTimestampSchema.nullable(),\n})\n .strict()\n .superRefine((call, context) => {\n const started = call.status === \"STARTED\";\n if (started !== (call.finishedAt === null)) {\n context.addIssue({ code: \"custom\", message: \"Only a started MCP call has no finish time\" });\n }\n const failed = call.status === \"FAILED\" || call.status === \"UNKNOWN_OUTCOME\";\n if (failed !== (call.failureCode !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Only failed or uncertain MCP calls carry a failure code\",\n });\n }\n});\nconst projectEventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const mcpProfileConsentedEventSchema = projectEventBaseSchema.extend({\n type: z.literal(\"MCP_PROFILE_CONSENTED\"),\n data: z.object({ revision: mcpProfileRevisionSchema, consent: mcpConsentSchema }).strict(),\n});\nexport const mcpGrantChangedEventSchema = projectEventBaseSchema.extend({\n type: z.literal(\"MCP_GRANT_CHANGED\"),\n data: z.object({ grant: mcpGrantSchema }).strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\n/** Internal durable command produced only after the daemon has consumed a proposal challenge. */\nexport const confirmMcpProfileCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CONFIRM_MCP_PROFILE\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n candidate: mcpProfileCandidateSchema,\n canonicalDigest: canonicalDigestSchema,\n })\n .strict(),\n});\nexport const setMcpProfileGrantCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"SET_MCP_PROFILE_GRANT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n profileRevisionId: opaqueIdSchema,\n expectedGrantVersion: z.number().int().positive().nullable(),\n tools: z.array(mcpToolNameSchema).min(1).max(64),\n ownerAttestsReadOnly: z.literal(true),\n })\n .strict()\n .superRefine((payload, context) => {\n if (new Set(payload.tools).size !== payload.tools.length) {\n context.addIssue({ code: \"custom\", message: \"Granted MCP tool names must be unique\" });\n }\n }),\n});\nexport const revokeMcpProfileGrantCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REVOKE_MCP_PROFILE_GRANT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n profileRevisionId: opaqueIdSchema,\n expectedGrantVersion: z.number().int().positive(),\n })\n .strict(),\n});\n/** Internal observation command emitted after the bounded gateway probe has closed its process. */\nexport const recordMcpCapabilitySnapshotCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_MCP_CAPABILITY_SNAPSHOT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n profileRevisionId: opaqueIdSchema,\n state: mcpCapabilityProbeStateSchema,\n protocolVersion: z.string().min(1).max(80).nullable(),\n tools: z.array(mcpToolNameSchema).max(64),\n resources: z.array(z.string().min(1).max(256)).max(64),\n prompts: z.array(z.string().min(1).max(256)).max(64),\n })\n .strict(),\n});\nexport const startMcpToolCallCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_MCP_TOOL_CALL\"),\n payload: z\n .object({\n sessionSnapshotId: opaqueIdSchema,\n toolName: mcpToolNameSchema,\n inputDigest: canonicalDigestSchema,\n })\n .strict(),\n});\nconst mcpToolCallTerminalOutcomeSchema = z.discriminatedUnion(\"status\", [\n z.object({ status: z.literal(\"SUCCEEDED\") }).strict(),\n z.object({ status: z.literal(\"FAILED\"), failureCode: mcpToolCallFailureCodeSchema }).strict(),\n z.object({ status: z.literal(\"UNKNOWN_OUTCOME\"), failureCode: z.literal(\"CONNECTION_LOST\") }).strict(),\n]);\nexport const finishMcpToolCallCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FINISH_MCP_TOOL_CALL\"),\n payload: z.object({ callId: opaqueIdSchema, outcome: mcpToolCallTerminalOutcomeSchema }).strict(),\n});\nconst commandResultBaseSchema = z\n .object({ schemaVersion: schemaVersionSchema, replayed: z.boolean() })\n .strict();\nexport const mcpProfileConsentedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"MCP_PROFILE_CONSENTED\"),\n revision: mcpProfileRevisionSchema,\n consent: mcpConsentSchema,\n projectVersion: z.number().int().positive(),\n event: mcpProfileConsentedEventSchema,\n});\nexport const mcpGrantChangedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"MCP_GRANT_CHANGED\"),\n grant: mcpGrantSchema,\n projectVersion: z.number().int().positive(),\n event: mcpGrantChangedEventSchema,\n});\nexport const mcpCapabilityRecordedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"MCP_CAPABILITY_RECORDED\"),\n snapshot: mcpCapabilitySnapshotSchema,\n});\nexport const mcpToolCallChangedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"MCP_TOOL_CALL_CHANGED\"),\n call: mcpToolCallRecordSchema,\n});\nexport const proposeMcpProfileRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n expectedProjectVersion: z.number().int().positive(),\n candidate: mcpProfileCandidateSchema,\n})\n .strict();\nexport const proposeContext7PresetRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n expectedProjectVersion: z.number().int().positive(),\n})\n .strict();\nexport const confirmMcpProfileRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n challengeId: opaqueIdSchema,\n canonicalDigest: canonicalDigestSchema,\n})\n .strict();\nexport const probeMcpProfileRequestSchema = z\n .object({ schemaVersion: schemaVersionSchema, commandId: opaqueIdSchema })\n .strict();\nexport const setMcpProfileGrantRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedGrantVersion: z.number().int().positive().nullable(),\n tools: z.array(mcpToolNameSchema).min(1).max(64),\n ownerAttestsReadOnly: z.literal(true),\n})\n .strict()\n .superRefine((request, context) => {\n if (new Set(request.tools).size !== request.tools.length) {\n context.addIssue({ code: \"custom\", message: \"Granted MCP tool names must be unique\" });\n }\n});\nexport const revokeMcpProfileGrantRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedGrantVersion: z.number().int().positive(),\n})\n .strict();\nexport const mcpProfileViewSchema = z\n .object({\n revision: mcpProfileRevisionSchema,\n consent: mcpConsentSchema,\n capability: mcpCapabilitySnapshotSchema.nullable(),\n grant: mcpGrantSchema.nullable(),\n})\n .strict();\nexport const mcpProfilesResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n profiles: z.array(mcpProfileViewSchema),\n})\n .strict();\n//# sourceMappingURL=mcp.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nconst hasControlCharacters = (value) => {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= 0x1f || codeUnit === 0x7f)\n return true;\n }\n return false;\n};\nexport const workspaceToolDigestSchema = z.string().regex(/^[0-9a-f]{64}$/);\nexport const workspaceToolOperationSchema = z.enum([\n \"LIST_DIRECTORY\",\n \"READ_FILE\",\n \"WRITE_FILE\",\n \"EDIT_FILE\",\n \"DELETE_FILE\",\n \"RUN_RECIPE\",\n]);\nexport const workspaceToolTargetSchema = z\n .string()\n .min(1)\n .max(240)\n .refine((value) => !hasControlCharacters(value), \"Tool target cannot contain controls\");\nexport const workspaceToolCallStatusSchema = z.enum([\n \"STARTED\",\n \"SUCCEEDED\",\n \"DENIED\",\n \"FAILED\",\n \"UNKNOWN_OUTCOME\",\n]);\nexport const workspaceToolFailureCodeSchema = z.enum([\n \"WORKSPACE_ACCESS_DENIED\",\n \"PATH_INVALID\",\n \"PATH_FORBIDDEN\",\n \"PATH_OUTSIDE_WORKSPACE\",\n \"SYMLINK_FORBIDDEN\",\n \"TARGET_NOT_FOUND\",\n \"TARGET_TYPE_FORBIDDEN\",\n \"CONTENT_CONFLICT\",\n \"CONTENT_INVALID\",\n \"SIZE_LIMIT_REACHED\",\n \"RECIPE_NOT_APPROVED\",\n \"RECIPE_AUTHORITY_CHANGED\",\n \"NETWORK_POLICY_UNAVAILABLE\",\n \"RECIPE_EXITED_NONZERO\",\n \"DEADLINE_EXCEEDED\",\n \"OUTPUT_LIMIT_REACHED\",\n \"CANCELLED\",\n \"PROCESS_TERMINATION_FAILED\",\n \"PROCESS_FAILED\",\n \"REPLAYED_WITHOUT_OUTPUT\",\n \"DAEMON_RESTART\",\n \"INTERNAL_ERROR\",\n]);\nexport const workspaceToolCallRecordSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n agentRunId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n providerCallKey: workspaceToolDigestSchema,\n operation: workspaceToolOperationSchema,\n target: workspaceToolTargetSchema,\n policyDigest: workspaceToolDigestSchema,\n inputDigest: workspaceToolDigestSchema,\n status: workspaceToolCallStatusSchema,\n failureCode: workspaceToolFailureCodeSchema.nullable(),\n outputDigest: workspaceToolDigestSchema.nullable(),\n outputBytes: z.number().int().nonnegative().max(262_144).nullable(),\n exitCode: z.number().int().min(-2_147_483_648).max(2_147_483_647).nullable(),\n startedAt: utcTimestampSchema,\n finishedAt: utcTimestampSchema.nullable(),\n})\n .strict()\n .superRefine((call, context) => {\n if ((call.status === \"STARTED\") !== (call.finishedAt === null)) {\n context.addIssue({ code: \"custom\", message: \"Only a started workspace tool call is unfinished\" });\n }\n if ((call.status === \"SUCCEEDED\") !== (call.failureCode === null)) {\n if (call.status !== \"STARTED\") {\n context.addIssue({\n code: \"custom\",\n message: \"A successful workspace tool call has no failure code and every terminal failure has one\",\n });\n }\n }\n if (call.status === \"STARTED\" && call.failureCode !== null) {\n context.addIssue({ code: \"custom\", message: \"A started workspace tool call has no failure code\" });\n }\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"WORK_ITEM\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const workspaceToolCallChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORKSPACE_TOOL_CALL_CHANGED\"),\n data: z.object({ call: workspaceToolCallRecordSchema }).strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const startWorkspaceToolCallCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_WORKSPACE_TOOL_CALL\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n providerCallKey: workspaceToolDigestSchema,\n operation: workspaceToolOperationSchema,\n target: workspaceToolTargetSchema,\n policyDigest: workspaceToolDigestSchema,\n inputDigest: workspaceToolDigestSchema,\n })\n .strict(),\n});\nexport const workspaceToolTerminalOutcomeSchema = z.discriminatedUnion(\"status\", [\n z\n .object({\n status: z.literal(\"SUCCEEDED\"),\n outputDigest: workspaceToolDigestSchema.nullable(),\n outputBytes: z.number().int().nonnegative().max(262_144).nullable(),\n exitCode: z.number().int().min(-2_147_483_648).max(2_147_483_647).nullable(),\n })\n .strict(),\n z\n .object({\n status: z.enum([\"DENIED\", \"FAILED\", \"UNKNOWN_OUTCOME\"]),\n failureCode: workspaceToolFailureCodeSchema,\n outputDigest: workspaceToolDigestSchema.nullable(),\n outputBytes: z.number().int().nonnegative().max(262_144).nullable(),\n exitCode: z.number().int().min(-2_147_483_648).max(2_147_483_647).nullable(),\n })\n .strict(),\n]);\nexport const finishWorkspaceToolCallCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FINISH_WORKSPACE_TOOL_CALL\"),\n payload: z.object({ callId: opaqueIdSchema, outcome: workspaceToolTerminalOutcomeSchema }).strict(),\n});\nexport const workspaceToolCallChangedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORKSPACE_TOOL_CALL_CHANGED\"),\n replayed: z.boolean(),\n call: workspaceToolCallRecordSchema,\n events: z.array(workspaceToolCallChangedEventSchema).max(1),\n})\n .strict();\n//# sourceMappingURL=workspace-tool.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const workspaceStrategySchema = z.enum([\"ISOLATED_WORKTREE\", \"SHARED_CURRENT_DIRECTORY\"]);\nexport const projectWorkspaceStrategySelectionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n strategy: workspaceStrategySchema,\n projectVersion: z.number().int().positive(),\n updatedAt: utcTimestampSchema,\n})\n .strict();\nexport const projectWorkspaceStrategyResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n selection: projectWorkspaceStrategySelectionSchema,\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const projectWorkspaceStrategyChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_WORKSPACE_STRATEGY_CHANGED\"),\n data: z\n .object({\n selection: projectWorkspaceStrategySelectionSchema,\n previousStrategy: workspaceStrategySchema,\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const setProjectWorkspaceStrategyCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"SET_PROJECT_WORKSPACE_STRATEGY\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n strategy: workspaceStrategySchema,\n })\n .strict(),\n});\nexport const projectWorkspaceStrategyChangedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"PROJECT_WORKSPACE_STRATEGY_CHANGED\"),\n selection: projectWorkspaceStrategySelectionSchema,\n event: projectWorkspaceStrategyChangedEventSchema,\n})\n .strict();\nexport const setProjectWorkspaceStrategyRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n strategy: workspaceStrategySchema,\n})\n .strict();\n//# sourceMappingURL=workspace-strategy.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { workspaceStrategySchema } from \"./workspace-strategy.js\";\n// A Git object id (spec §2.9). Not a general opaqueIdSchema: an object id has a shape of its own,\n// unrelated to Loomrail's id shape, and validating it here catches a caller that passes a truncated\n// or garbled sha before it is ever handed to `git`.\n//\n// Lowercase 40 hex is SHA-1, and that is a statement about THIS codebase rather than about git: git\n// also supports SHA-256 repositories, whose object ids are 64 hex characters, and a schema claiming\n// git's format is fixed would simply be wrong. Every sha reaching this contract comes from\n// `@loomrail/workspace` running plumbing against a repository Loomrail itself cut a worktree from,\n// and nothing in this project creates or accepts a SHA-256 repository. Widening this regex is\n// therefore part of adding that support, not a bug fix -- and until then the narrow bound is what\n// catches a caller passing something that is not an object id at all.\nconst commitShaSchema = z.string().regex(/^[0-9a-f]{40}$/);\nconst branchSchema = z.string().trim().min(1).max(255);\nconst worktreePathSchema = z.string().trim().min(1).max(4_000);\n// The cap on how many paths one WORK_ITEM_WORKSPACE_CREATED event may list. Exported alongside the\n// schema that uses it (like maxContextPackRecipeSources in workflow.ts) so a caller building the\n// carry-in list can check it against the same bound the schema will enforce, rather than\n// discovering the limit only when `.parse` rejects it.\nexport const maxCarriedPaths = 500;\n// Relative repository paths, one per file the carry-in snapshot (packages/workspace's\n// createCarryInSnapshot) actually moved -- see docs/plans/14-e1-workspace-execution-implementation-\n// plan.ru.md Задача 4. Not opaqueIdSchema: these are filesystem paths, not Loomrail ids, and can\n// contain characters (slashes, dots) opaqueIdSchema's pattern forbids.\nconst carriedPathsSchema = z.array(z.string().trim().min(1).max(4_096)).max(maxCarriedPaths);\nexport const workItemWorkspaceStatusSchema = z.enum([\"READY\", \"ORPHANED\", \"REMOVED\"]);\nexport const workItemWorkspaceSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n // The durable fact used for this workspace. Project settings can change later without\n // reinterpreting an already-running WorkItem.\n strategy: workspaceStrategySchema.default(\"ISOLATED_WORKTREE\"),\n branch: branchSchema,\n worktreePath: worktreePathSchema,\n // Nullable, not optional: an empty repository genuinely has no HEAD (spec §2.12). Absent would\n // read as \"not recorded\"; null records the fact that there was nothing to record.\n baseCommit: commitShaSchema.nullable(),\n // Nullable, not optional: a workspace cut from a clean working copy genuinely carried nothing\n // forward, so there is no snapshot commit to name (spec §2.9's \"переносить нечего\" path).\n snapshotCommit: commitShaSchema.nullable(),\n status: workItemWorkspaceStatusSchema,\n // Nullable: names the StageAttempt currently allowed to write, or no one (spec D6). The\n // workspace belongs to the WorkItem and outlives any single attempt, so this is a lease held\n // for the attempt's duration, not an owner.\n leaseHolder: opaqueIdSchema.nullable(),\n createdAt: utcTimestampSchema,\n version: z.number().int().positive(),\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\n// Carries the workspace plus the files the carry-in snapshot moved into it (spec §4): the\n// workspace's own worktreePath/branch/baseCommit/snapshotCommit tell a reader *that* something was\n// carried in, but not *what* -- and that is exactly what an owner reviewing the work item's history\n// needs to see without re-deriving a `git diff` against a commit that may since have moved on.\nexport const workItemWorkspaceCreatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_WORKSPACE_CREATED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n workspace: workItemWorkspaceSchema,\n carriedPaths: carriedPathsSchema,\n })\n .strict(),\n});\n// Recorded when a workspace is found orphaned -- its worktree directory prunable, or gone outside\n// Loomrail's control -- at daemon startup (spec §6, \"Восстановление\"). previousStatus is carried\n// because the only status this transition is ever taken from is READY, and recording that fact\n// (rather than assuming it) keeps the audit trail honest if that ever stops being true.\nexport const workItemWorkspaceOrphanedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_WORKSPACE_ORPHANED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n workspace: workItemWorkspaceSchema,\n previousStatus: workItemWorkspaceStatusSchema,\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\n// The workspace's own `id` is not part of the payload -- it is assigned by the persistence layer\n// that writes it, the same way CREATE_WORK_ITEM never takes the WorkItem's own id (work-\n// management.ts). `workItemId` is enough to identify which entity this workspace belongs to, and\n// the 0011 migration's UNIQUE constraint on work_item_id (spec Задача 7) makes a second one for the\n// same WorkItem a storage-level refusal, not something this contract has to guard against.\nexport const createWorkItemWorkspaceCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CREATE_WORK_ITEM_WORKSPACE\"),\n payload: z\n .object({\n workItemId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n // Optional only for command receipts produced before strategy existed. The persisted\n // workspace always records the resolved value.\n strategy: workspaceStrategySchema.optional(),\n branch: branchSchema,\n worktreePath: worktreePathSchema,\n baseCommit: commitShaSchema.nullable(),\n snapshotCommit: commitShaSchema.nullable(),\n carriedPaths: carriedPathsSchema,\n // A3 provisioning: optional for append-only command compatibility. When present,\n // persistence verifies an active AgentRun owns this StageAttempt and records the first\n // workspace already leased in the same transaction.\n initialLeaseHolder: opaqueIdSchema.optional(),\n })\n .strict(),\n});\n// expectedVersion follows the same optimistic-concurrency convention as every other mutation of an\n// existing entity in this package (UPDATE_WORK_ITEM, PAUSE_PIPELINE, RESOLVE_ACCEPTANCE, …): the\n// caller names the version it read, so a lease raced against a concurrent writer is rejected rather\n// than silently overwritten.\nexport const acquireWorkspaceLeaseCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ACQUIRE_WORKSPACE_LEASE\"),\n payload: z\n .object({\n workspaceId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\n// Names the releasing StageAttempt, not just the workspace: a release is only ever valid from the\n// attempt that currently holds the lease (spec D6), and carrying that id lets the handler refuse a\n// release from anyone else instead of trusting the caller's say-so.\nexport const releaseWorkspaceLeaseCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RELEASE_WORKSPACE_LEASE\"),\n payload: z\n .object({\n workspaceId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\n// System-driven, not a StageAttempt action: this is the reconciliation path (spec §6,\n// \"Восстановление\") that notices a worktree directory is gone or prunable and records the fact.\n// Nothing is resurrected (AD-008) -- this command only ever moves a workspace toward ORPHANED.\nexport const markWorkspaceOrphanedCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"MARK_WORKSPACE_ORPHANED\"),\n payload: z\n .object({\n workspaceId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\n// Command results, in the shape stateCommandResultSchema (work-management.ts) expects of every\n// member: schemaVersion/type/replayed plus whatever the caller needs back. `workItemId` is carried\n// even though every payload already lets a caller re-derive it, the same convenience\n// providerSessionStartedResultSchema (workflow.ts) offers -- a caller acting on the result should\n// not have to also hold the command payload just to route the outcome to the right WorkItem.\nexport const workItemWorkspaceCreatedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORK_ITEM_WORKSPACE_CREATED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n workspace: workItemWorkspaceSchema,\n event: workItemWorkspaceCreatedEventSchema,\n})\n .strict();\n// No event: a lease is current state for a StageAttempt to act on, not something the audit log or\n// the owner needs to see -- the same reasoning providerSessionProcessRecordedResultSchema\n// (workflow.ts) gives for a pid. `events` stays in the shape for uniformity across every command\n// result, typed so only `[]` can satisfy it.\nexport const workspaceLeaseAcquiredResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORKSPACE_LEASE_ACQUIRED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n workspace: workItemWorkspaceSchema,\n events: z.array(z.never()),\n})\n .strict();\nexport const workspaceLeaseReleasedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORKSPACE_LEASE_RELEASED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n workspace: workItemWorkspaceSchema,\n events: z.array(z.never()),\n})\n .strict();\nexport const workItemWorkspaceOrphanedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORK_ITEM_WORKSPACE_ORPHANED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n workspace: workItemWorkspaceSchema,\n event: workItemWorkspaceOrphanedEventSchema,\n})\n .strict();\n// What `GET /api/v1/work-items/:workItemId/workspace` answers: the workspace a WorkItem has, or the\n// recorded fact that it has none.\n//\n// `null` rather than a 404, because \"this WorkItem has no workspace\" is the ordinary state of every\n// prose-only stage and of every work item before its first code stage -- not a missing resource. A\n// 404 would make the caller distinguish \"no workspace\" from \"no such WorkItem\" by inspecting an\n// error code, and the cockpit asks this question for whichever item the owner selected, most of\n// which have never cut one.\n//\n// A response object rather than the bare workspace for the same reason every other listing here\n// wraps its payload (projectsResponseSchema, workItemsResponseSchema): a top-level `null` body\n// carries no schemaVersion, so a later field could not be added without breaking every reader.\n//\n// A field on a response nobody reads is a declaration without a consumer, so this projects the\n// stored workspace rather than forwarding it whole -- and the rule is applied to every field it\n// leaves off, not to `leaseHolder` alone:\n//\n// - `leaseHolder`. The lease is how the daemon keeps two StageAttempts from writing the same\n// worktree at once (spec D6); no caller of this route reads it, and none is planned to -- the\n// cockpit shows where the agent writes, not which attempt currently holds the pen.\n// - `id`, `projectId`, `workItemId`. Identity the caller already holds: this route is reached at\n// `/work-items/:workItemId/workspace`, so the id in the URL the caller just used is the same\n// `workItemId` this field would repeat, `projectId` is already on the WorkItem the cockpit holds\n// (WorkbenchPage.tsx's WorkspacePanel reads `item.projectId`, never the workspace's own copy), and\n// nothing reads the workspace's own `id` -- the lease commands that take a `workspaceId` are\n// system-driven (session-loop.ts), never issued from the web client this route serves.\n// - `createdAt`, `version`. Neither is rendered, and `version` exists for the optimistic-concurrency\n// commands (ACQUIRE_WORKSPACE_LEASE, RELEASE_WORKSPACE_LEASE, MARK_WORKSPACE_ORPHANED) that only\n// the session loop issues -- the same system-only path as `id` above.\n//\n// `snapshotCommit` stays, and that is also a decision rather than an oversight: it is unread today,\n// but docs/plans/15-e1-5-change-visibility-spec.ru.md §D1 already names it half of the diff base\n// (`snapshotCommit ?? baseCommit`) that milestone reads back through this same response. A field\n// with a cited future consumer is not the defect this rule is about.\nexport const publishedWorkItemWorkspaceSchema = workItemWorkspaceSchema.omit({\n leaseHolder: true,\n id: true,\n projectId: true,\n workItemId: true,\n createdAt: true,\n version: true,\n});\nexport const workItemWorkspaceResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n workspace: publishedWorkItemWorkspaceSchema.nullable(),\n})\n .strict();\n// E1.5 (docs/plans/15-e1-5-change-visibility-spec.ru.md §4, §5): what a work item has changed in\n// its worktree, given a boundary form so the daemon can answer GET\n// /api/v1/work-items/:workItemId/changes and .../changes/diff with it.\n//\n// The shape of a change summary is declared once, in @loomrail/workspace's\n// packages/workspace/src/changes.ts (Tasks 1-2 of this milestone) -- ChangeStatus, ChangedFile,\n// ChangeSummary, FileDiff. `changedFileSchema` below and the shared fields of `fileDiffSchema` are\n// that declaration's boundary FORM, not a second declaration of it: their shape is copied by hand\n// here (Zod cannot be derived from a plain TypeScript type), but\n// packages/contracts/test/workspace.unit.test.ts imports ChangedFile and FileDiff straight from\n// packages/workspace/src/changes.ts and asserts, at the type level, that\n// `z.infer<typeof changedFileSchema>` equals `ChangedFile` and that fileDiffSchema's non-boundary\n// fields equal `FileDiff`, in both directions. If a field is ever added, renamed, widened, or\n// narrowed on one side and not the other, `pnpm typecheck` fails before either side ships --\n// which is the point: a runtime test only catches the fixtures it was given, and this shape has\n// already drifted silently once in this milestone (session.unit.test.ts's incomplete-fixture bug,\n// named in the Task 3 brief). The import is type-only (`import type`, erased by\n// `verbatimModuleSyntax`) and reaches across a relative path rather than \"@loomrail/workspace\" the\n// package, so it costs neither package a new dependency edge: @loomrail/contracts stays the\n// zero-dependency package every other workspace package (including @loomrail/workspace's own\n// consumer, @loomrail/persistence-sqlite) builds on, and no dist output of either package embeds\n// the other.\n//\n// `ChangeSummary.tree` is deliberately NOT part of this response and so is not part of the\n// equality check either. It is not the stage-end resultTree label the daemon writes onto\n// StageAttempt -- that label is read through `treeOfWorktree`, a separate, baseline-independent\n// function, not through this summary -- but the two would be shown together if either were shown at\n// all, and D3 says in so many words that the label \"не показывается в этой вехе\" (is not shown\n// this milestone).\n//\n// `baseline` is on both schemas and lands differently on each, because spec §4 puts it differently\n// on each. `FileDiff` there is a plain reading with no work item in it, so @loomrail/workspace's\n// `FileDiff` carries the baseline it was read against and this schema's field is shared, checked\n// like the rest; `WorkItemChangeSummary` there is the boundary shape -- it carries `workItemId`,\n// which no reading knows -- so its `baseline` is attached by the daemon when it builds the\n// response, the same way it attaches `workItemId` via the URL rather than the payload (see\n// `publishedWorkItemWorkspaceSchema` above, which drops that same field for that same reason).\nconst changeStatusSchema = z.enum([\"ADDED\", \"MODIFIED\", \"DELETED\", \"RENAMED\"]);\n// Shared by `changedFileSchema.path`/`previousPath` and `fileDiffSchema.path`: a path this contract\n// shows the owner, bounded the same way `carriedPathsSchema` above bounds one -- 4096 characters,\n// spec §5 -- because every path here is a string the daemon read from git output and will store,\n// log, or interpolate into a request, not a value this contract can otherwise trust to be short.\n//\n// Bounded but NOT trimmed, unlike `carriedPathsSchema`, and the difference is what the two strings\n// are for. A carried path is an input list this contract narrows on the way in; a changed path is\n// an identifier the contract publishes and then has to accept back on the file-diff handle. A\n// leading or trailing space is a legal filename character, and `.trim()` -- inherited from that\n// other schema -- silently renamed such a file: the summary listed `\"trail \"` while the contract\n// published `\"trail\"`, and asking for that published name back earned a PathNotAFileError for a\n// file that is really there. A contract that renames what it reports cannot be round-tripped.\nconst changedPathSchema = z.string().min(1).max(4_096);\n// One authority for the intrinsic REVIEW bounds used by Git capture, context assembly and daemon\n// orchestration. The public shape stays numeric so focused tests can exercise tighter boundaries.\nexport const reviewDiffLimits = Object.freeze({\n maxFiles: 50,\n maxContentFiles: 16,\n maxPatchBytesPerFile: 4_096,\n maxPatchBytesTotal: 32_768,\n maxRenderedPathBytes: 512,\n});\n// A line count from a work item's change summary. Nullable, never defaulted to zero: a binary\n// file's `insertions`/`deletions` are null because there is no line count to report, and reporting\n// zero would read as \"nothing changed in it\" -- spec §4, D8, and the Task 3 brief's own worked\n// example (a binary file whose counts stay null through this schema).\nconst changeLineCountSchema = z.number().int().nonnegative().nullable();\nexport const changedFileSchema = z\n .object({\n path: changedPathSchema,\n previousPath: changedPathSchema.nullable(),\n status: changeStatusSchema,\n insertions: changeLineCountSchema,\n deletions: changeLineCountSchema,\n binary: z.boolean(),\n})\n .strict();\nexport const workItemChangeSummarySchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n // Non-nullable, unlike WorkItemWorkspace.baseCommit above: a summary computed with no base to\n // compare against is not a degraded summary, it is not a summary (spec §5).\n baseline: commitShaSchema,\n files: z.array(changedFileSchema),\n truncated: z.boolean(),\n})\n .strict();\nexport const fileDiffSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n path: changedPathSchema,\n baseline: commitShaSchema,\n binary: z.boolean(),\n // Null for a binary file, never \"\": an empty string would read as an empty, but real, diff\n // (spec D8).\n patch: z.string().nullable(),\n truncated: z.boolean(),\n omittedBytes: z.number().int().nonnegative(),\n})\n .strict();\n// The `changes` handle's response, and NOT `workItemChangeSummarySchema` on its own.\n//\n// A WorkItem with no workspace has nothing to summarise, and that is the ordinary state of every\n// prose-only stage rather than a failure (spec §7's first row). It cannot be expressed as a\n// degraded summary, because `baseline` above is deliberately non-nullable: a summary with no base\n// to compare against is not a summary. So the fact travels the way E1's\n// GET /api/v1/work-items/:workItemId/workspace already carries the very same fact --\n// `null` with 200, with 404 left to mean the one thing it should mean, that the WorkItem itself\n// does not exist. One convention for one condition, rather than a second one invented here.\nexport const workItemChangesResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n changes: workItemChangeSummarySchema.nullable(),\n})\n .strict();\n// The body handle's response, enveloped for the same reason and answering the same `null` for the\n// same condition (spec D5 keeps the two handles apart; it does not make them answer \"no workspace\"\n// two different ways).\nexport const workItemFileDiffResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n diff: fileDiffSchema.nullable(),\n})\n .strict();\n//# sourceMappingURL=workspace.js.map","import { z } from \"zod\";\nimport { actorSchema, opaqueIdSchema, providerIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { MAX_TOTAL_CORRECTION_RUNS } from \"./correction.js\";\nexport const MAX_REVIEW_FINDINGS_PER_REPORT = 20;\nexport const MAX_OPEN_REVIEW_FINDINGS = 200;\nexport const MAX_AUTOMATIC_REVIEW_ROUNDS = 2;\nexport const MAX_OWNER_AUTHORIZED_REVIEW_ROUNDS = 1;\nexport const MAX_TOTAL_REVIEW_ROUNDS = MAX_AUTOMATIC_REVIEW_ROUNDS + MAX_OWNER_AUTHORIZED_REVIEW_ROUNDS;\nexport const MAX_REVIEW_REPORT_HISTORY = MAX_TOTAL_REVIEW_ROUNDS * (1 + MAX_TOTAL_CORRECTION_RUNS);\nexport const reviewVerdictSchema = z.enum([\"PASSED\", \"CHANGES_REQUESTED\"]);\nexport const reviewFindingSeveritySchema = z.enum([\"LOW\", \"MEDIUM\", \"HIGH\", \"CRITICAL\"]);\nexport const reviewFindingStatusSchema = z.enum([\"OPEN\", \"RESOLVED\", \"WAIVED\", \"FALSE_POSITIVE\"]);\nexport const reviewFindingOwnerDispositionSchema = z.enum([\"WAIVED\", \"FALSE_POSITIVE\"]);\nexport const reviewProviderRelationSchema = z.enum([\"CROSS_PROVIDER\", \"SAME_PROVIDER\"]);\nconst titleSchema = z.string().trim().min(1).max(200);\nconst descriptionSchema = z.string().trim().min(1).max(4_000);\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/);\nexport const reviewFindingPathSchema = z\n .string()\n .trim()\n .min(1)\n .max(1_024)\n .refine((value) => !value.startsWith(\"/\") && !value.startsWith(\"\\\\\"), \"Path must be relative\")\n .refine((value) => !value.includes(\"\\\\\"), \"Path must use portable forward slashes\")\n .refine((value) => value.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\"), \"Path must not contain empty, current-directory, or parent-directory segments\");\nconst reviewFindingDraftFields = {\n severity: reviewFindingSeveritySchema,\n title: titleSchema,\n description: descriptionSchema,\n path: reviewFindingPathSchema.nullable(),\n startLine: z.number().int().positive().nullable(),\n endLine: z.number().int().positive().nullable(),\n reproduction: descriptionSchema,\n criterion: z.string().trim().min(1).max(500).nullable(),\n suggestedFix: descriptionSchema.nullable(),\n};\nconst refineFindingLocation = (finding, context) => {\n const hasLocation = finding.path !== null;\n const hasStart = finding.startLine !== null;\n const hasEnd = finding.endLine !== null;\n if (!hasLocation && (hasStart || hasEnd)) {\n context.addIssue({ code: \"custom\", message: \"A line range requires a file path\" });\n }\n if (hasStart !== hasEnd) {\n context.addIssue({ code: \"custom\", message: \"A line range requires both start and end\" });\n }\n if (finding.startLine !== null && finding.endLine !== null && finding.endLine < finding.startLine) {\n context.addIssue({ code: \"custom\", message: \"The finding line range is reversed\" });\n }\n};\nexport const reviewFindingDraftSchema = z\n .object(reviewFindingDraftFields)\n .strict()\n .superRefine(refineFindingLocation);\nconst reviewReportDraftFields = {\n kind: z.literal(\"REVIEW_REPORT\"),\n title: titleSchema,\n summary: descriptionSchema,\n checks: z.array(z.string().trim().min(1).max(500)).min(1).max(20),\n};\n// Keep the verdict invariant structural rather than hiding it in `superRefine`. Both live\n// providers receive the JSON Schema generated from this contract before they answer; a refinement\n// is enforced only after the response returns and therefore lets a CLI accept a contradictory\n// `PASSED` report with findings (or an empty `CHANGES_REQUESTED` report) that Loomrail must then\n// discard. A plain union emits JSON Schema `anyOf`, supported by both provider adapters, while\n// preserving the same inferred discriminated data shape for domain consumers.\nexport const reviewReportDraftSchema = z.union([\n z\n .object({\n ...reviewReportDraftFields,\n verdict: z.literal(\"PASSED\"),\n findings: z.array(reviewFindingDraftSchema).max(0),\n })\n .strict(),\n z\n .object({\n ...reviewReportDraftFields,\n verdict: z.literal(\"CHANGES_REQUESTED\"),\n findings: z.array(reviewFindingDraftSchema).min(1).max(MAX_REVIEW_FINDINGS_PER_REPORT),\n })\n .strict(),\n]);\nexport const reviewFindingSchema = z\n .object({\n ...reviewFindingDraftFields,\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n correctionRunId: opaqueIdSchema.nullable(),\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n reviewArtifactId: opaqueIdSchema,\n reviewedTree: treeShaSchema,\n ordinal: z.number().int().positive().max(MAX_REVIEW_FINDINGS_PER_REPORT),\n status: reviewFindingStatusSchema,\n resolutionReason: descriptionSchema.nullable(),\n resolvedBy: actorSchema.nullable(),\n createdAt: utcTimestampSchema,\n resolvedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine(refineFindingLocation)\n .superRefine((finding, context) => {\n const resolved = finding.status !== \"OPEN\";\n if (resolved !==\n (finding.resolutionReason !== null && finding.resolvedBy !== null && finding.resolvedAt !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"A terminal finding requires complete resolution attribution and an open one requires none\",\n });\n }\n});\nexport const reviewReportSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n correctionRunId: opaqueIdSchema.nullable(),\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n authorAgentRunId: opaqueIdSchema,\n reviewerAgentRunId: opaqueIdSchema,\n providerRelation: reviewProviderRelationSchema,\n reviewedTree: treeShaSchema,\n round: z.number().int().positive().max(MAX_TOTAL_REVIEW_ROUNDS),\n title: titleSchema,\n summary: descriptionSchema,\n checks: z.array(z.string().trim().min(1).max(500)).min(1).max(20),\n verdict: reviewVerdictSchema,\n findingIds: z.array(opaqueIdSchema).max(MAX_REVIEW_FINDINGS_PER_REPORT),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((report, context) => {\n if (report.authorAgentRunId === report.reviewerAgentRunId) {\n context.addIssue({ code: \"custom\", message: \"A reviewer AgentRun cannot be the author AgentRun\" });\n }\n if (report.verdict === \"PASSED\" && report.findingIds.length !== 0) {\n context.addIssue({ code: \"custom\", message: \"A passed review cannot reference findings\" });\n }\n if (report.verdict === \"CHANGES_REQUESTED\" && report.findingIds.length === 0) {\n context.addIssue({ code: \"custom\", message: \"A changes-requested review requires finding IDs\" });\n }\n if (new Set(report.findingIds).size !== report.findingIds.length) {\n context.addIssue({ code: \"custom\", message: \"A review report cannot repeat a finding ID\" });\n }\n});\nexport const reviewLoopActionSchema = z.enum([\"ADVANCE_TO_QA\", \"QUEUE_FIX\", \"WAIT_FOR_OWNER\"]);\nexport const reviewStateResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n reports: z\n .array(reviewReportSchema.extend({\n authorProvider: providerIdSchema,\n reviewerProvider: providerIdSchema,\n }))\n .max(MAX_REVIEW_REPORT_HISTORY),\n findings: z.array(reviewFindingSchema).max(MAX_OPEN_REVIEW_FINDINGS),\n})\n .strict();\nexport const disposeReviewFindingRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n disposition: reviewFindingOwnerDispositionSchema,\n reason: descriptionSchema,\n})\n .strict();\n//# sourceMappingURL=review.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const MAX_VERIFICATION_RECIPE_TIMEOUT_SECONDS = 900;\nexport const MAX_VERIFICATION_RECIPES = 12;\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/);\nconst utf8ByteLength = (value) => {\n let bytes = 0;\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= 0x7f) {\n bytes += 1;\n }\n else if (codeUnit <= 0x7ff) {\n bytes += 2;\n }\n else if (codeUnit >= 0xd800 &&\n codeUnit <= 0xdbff &&\n index + 1 < value.length &&\n value.charCodeAt(index + 1) >= 0xdc00 &&\n value.charCodeAt(index + 1) <= 0xdfff) {\n bytes += 4;\n index += 1;\n }\n else {\n bytes += 3;\n }\n }\n return bytes;\n};\nconst invalidPortableDirectoryCharacterPattern = /[<>:\"\\\\|?*]|\\p{Cc}/u;\nexport const verificationRecipeCwdSchema = z\n .string()\n .min(1)\n .max(240)\n .refine((value) => {\n if (value === \".\") {\n return true;\n }\n if (value.startsWith(\"/\") || value.startsWith(\"\\\\\") || /^[A-Za-z]:[/\\\\]/u.test(value)) {\n return false;\n }\n const parts = value.split(\"/\");\n return (value === value.normalize(\"NFC\") &&\n utf8ByteLength(value) <= 240 &&\n parts.every((part) => part.length > 0 &&\n part !== \".\" &&\n part !== \"..\" &&\n !invalidPortableDirectoryCharacterPattern.test(part) &&\n !/[ .]$/u.test(part)));\n}, \"Verification cwd must be a portable directory below the Project root\");\nconst boundedArgSchema = z\n .string()\n .min(1)\n .refine((value) => !value.includes(\"\\u0000\"), \"Verification argv cannot contain NUL\")\n .refine((value) => utf8ByteLength(value) <= 256, \"Verification argv items cannot exceed 256 UTF-8 bytes\");\nexport const verificationRecipeKindSchema = z.enum([\n \"LINT\",\n \"BUILD\",\n \"UNIT\",\n \"INTEGRATION\",\n \"E2E\",\n \"AUDIT\",\n \"SERVE\",\n \"CUSTOM\",\n]);\nexport const verificationExecutableSchema = z.enum([\"pnpm\", \"npm\", \"yarn\", \"bun\", \"node\"]);\nexport const verificationEnvironmentProfileSchema = z.literal(\"VERIFICATION_BASELINE\");\nexport const verificationNetworkPolicySchema = z.enum([\"INHERIT_HOST\", \"DENIED_UNAVAILABLE\"]);\nexport const verificationScriptNameSchema = z.enum([\n \"lint\",\n \"build\",\n \"test\",\n \"test:unit\",\n \"test:integration\",\n \"test:e2e\",\n \"audit\",\n \"start\",\n \"dev\",\n \"preview\",\n]);\nexport const verificationRecipeProvenanceSchema = z\n .object({\n source: z.literal(\"PACKAGE_JSON_SCRIPT\"),\n manifestPath: z.literal(\"package.json\"),\n manifestContentHash: sha256Schema,\n scriptName: verificationScriptNameSchema,\n scriptBodyPreview: z\n .string()\n .min(1)\n .max(1_024)\n .refine((value) => !value.includes(\"\\u0000\")),\n})\n .strict();\nexport const verificationRecipeSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n kind: verificationRecipeKindSchema,\n label: z.string().trim().min(1).max(120),\n required: z.boolean(),\n executable: verificationExecutableSchema,\n argv: z.array(boundedArgSchema).min(1).max(16),\n cwd: verificationRecipeCwdSchema,\n timeoutSeconds: z.number().int().min(1).max(MAX_VERIFICATION_RECIPE_TIMEOUT_SECONDS),\n outputLimitBytes: z.number().int().min(1_024).max(262_144),\n environmentProfile: verificationEnvironmentProfileSchema,\n networkPolicy: verificationNetworkPolicySchema,\n provenance: verificationRecipeProvenanceSchema,\n})\n .strict()\n .superRefine((recipe, context) => {\n if (recipe.kind === \"SERVE\" && recipe.required) {\n context.addIssue({\n code: \"custom\",\n path: [\"required\"],\n message: \"A long-running service recipe cannot be part of a finite required verification run\",\n });\n }\n const serviceScripts = [\"start\", \"dev\", \"preview\"];\n if (recipe.kind === \"SERVE\" && !serviceScripts.includes(recipe.provenance.scriptName)) {\n context.addIssue({\n code: \"custom\",\n path: [\"provenance\", \"scriptName\"],\n message: \"A SERVE recipe must name an approved service package script\",\n });\n }\n if (recipe.kind !== \"SERVE\" && serviceScripts.includes(recipe.provenance.scriptName)) {\n context.addIssue({\n code: \"custom\",\n path: [\"kind\"],\n message: \"Service package scripts are reserved for SERVE recipes\",\n });\n }\n if ((recipe.kind === \"AUDIT\") !== (recipe.provenance.scriptName === \"audit\")) {\n context.addIssue({\n code: \"custom\",\n path: [\"kind\"],\n message: \"The audit package script is reserved for an AUDIT recipe\",\n });\n }\n});\nexport const verificationProposalWarningCodeSchema = z.enum([\n \"MANIFEST_ABSENT\",\n \"MANIFEST_INVALID\",\n \"MANIFEST_TOO_LARGE\",\n \"MANIFEST_SYMLINK\",\n \"SCRIPT_LIMIT_REACHED\",\n \"SCRIPT_UNSAFE\",\n \"NO_SUPPORTED_SCRIPTS\",\n \"PLAN_TARGET_BLOCKED\",\n]);\nexport const verificationProposalWarningSchema = z\n .object({\n code: verificationProposalWarningCodeSchema,\n path: z.enum([\"package.json\", \".loomrail/verification-plan.json\"]).nullable(),\n message: z.string().trim().min(1).max(500),\n})\n .strict();\nexport const verificationPlanTargetSchema = z.discriminatedUnion(\"state\", [\n z.object({ state: z.literal(\"ABSENT\"), digest: z.null() }).strict(),\n z.object({ state: z.literal(\"PRESENT\"), digest: sha256Schema }).strict(),\n z.object({ state: z.literal(\"BLOCKED\"), digest: z.null() }).strict(),\n]);\nexport const verificationPlanProposalSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n target: verificationPlanTargetSchema,\n recipes: z.array(verificationRecipeSchema).max(MAX_VERIFICATION_RECIPES),\n warnings: z.array(verificationProposalWarningSchema).max(32),\n proposalHash: sha256Schema,\n})\n .strict()\n .superRefine((proposal, context) => {\n if (proposal.recipes.length > 0 && !proposal.recipes.some((recipe) => recipe.required)) {\n context.addIssue({\n code: \"custom\",\n path: [\"recipes\"],\n message: \"A verification proposal must contain at least one required recipe\",\n });\n }\n if (new Set(proposal.recipes.map((recipe) => recipe.id)).size !== proposal.recipes.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"recipes\"],\n message: \"Verification recipe ids must be unique\",\n });\n }\n});\nexport const verificationPlanStatusSchema = z.enum([\"ACTIVE\", \"DISABLED\"]);\nexport const verificationPlanSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n revision: z.number().int().positive(),\n status: verificationPlanStatusSchema,\n recipes: z.array(verificationRecipeSchema).min(1).max(MAX_VERIFICATION_RECIPES),\n sourceProposalHash: sha256Schema,\n contentHash: sha256Schema,\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((plan, context) => {\n if (!plan.recipes.some((recipe) => recipe.required)) {\n context.addIssue({\n code: \"custom\",\n path: [\"recipes\"],\n message: \"A verification plan must contain at least one required recipe\",\n });\n }\n if (new Set(plan.recipes.map((recipe) => recipe.id)).size !== plan.recipes.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"recipes\"],\n message: \"Verification recipe ids must be unique\",\n });\n }\n});\nexport const verificationPlanPublicationStatusSchema = z.enum([\"PENDING\", \"APPLIED\", \"FAILED\"]);\nexport const verificationPlanPublicationErrorCodeSchema = z.enum([\n \"REPOSITORY_UNAVAILABLE\",\n \"TARGET_OUTSIDE_REPOSITORY\",\n \"TARGET_UNREADABLE\",\n \"TARGET_UNRECOGNIZED\",\n \"TARGET_CHANGED\",\n \"PROPOSAL_CHANGED\",\n \"CONTENT_HASH_MISMATCH\",\n \"WRITE_FAILED\",\n]);\nexport const verificationPlanPublicationSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n planId: opaqueIdSchema,\n targetPath: z.literal(\".loomrail/verification-plan.json\"),\n expectedTargetDigest: sha256Schema.nullable(),\n contentHash: sha256Schema,\n status: verificationPlanPublicationStatusSchema,\n attempts: z.number().int().nonnegative(),\n lastErrorCode: verificationPlanPublicationErrorCodeSchema.nullable(),\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n appliedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const verificationCorrectionGateActionSchema = z.enum([\"AUTHORIZE_FINAL\", \"CANCEL\"]);\nexport const adoptVerificationPlanCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ADOPT_VERIFICATION_PLAN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n proposal: verificationPlanProposalSchema,\n })\n .strict(),\n});\nexport const disableVerificationPlanCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"DISABLE_VERIFICATION_PLAN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n expectedTargetDigest: sha256Schema.nullable(),\n })\n .strict(),\n});\nexport const completeVerificationPlanPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"COMPLETE_VERIFICATION_PLAN_PUBLICATION\"),\n payload: z\n .object({\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const failVerificationPlanPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FAIL_VERIFICATION_PLAN_PUBLICATION\"),\n payload: z\n .object({\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n errorCode: verificationPlanPublicationErrorCodeSchema,\n })\n .strict(),\n});\nexport const retryVerificationPlanPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RETRY_VERIFICATION_PLAN_PUBLICATION\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const verificationPlanAdoptedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_ADOPTED\"),\n data: z\n .object({\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n previousPlanRevision: z.number().int().positive().nullable(),\n })\n .strict(),\n});\nexport const verificationPlanDisabledEventSchema = eventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_DISABLED\"),\n data: z\n .object({\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n previousPlanRevision: z.number().int().positive(),\n })\n .strict(),\n});\nconst verificationPlanPublicationEventDataSchema = z\n .object({\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n})\n .strict();\nexport const verificationPlanPublicationAppliedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_APPLIED\"),\n data: verificationPlanPublicationEventDataSchema,\n});\nexport const verificationPlanPublicationFailedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_FAILED\"),\n data: verificationPlanPublicationEventDataSchema,\n});\nexport const verificationPlanPublicationRetriedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_RETRIED\"),\n data: verificationPlanPublicationEventDataSchema,\n});\nexport const verificationPlanAdoptedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_PLAN_ADOPTED\"),\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n event: verificationPlanAdoptedEventSchema,\n})\n .strict();\nexport const verificationPlanDisabledResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_PLAN_DISABLED\"),\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n event: verificationPlanDisabledEventSchema,\n})\n .strict();\nconst verificationPlanPublicationResultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n plan: verificationPlanSchema,\n publication: verificationPlanPublicationSchema,\n})\n .strict();\nexport const verificationPlanPublicationAppliedResultSchema = verificationPlanPublicationResultBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_APPLIED\"),\n event: verificationPlanPublicationAppliedEventSchema,\n});\nexport const verificationPlanPublicationFailedResultSchema = verificationPlanPublicationResultBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_FAILED\"),\n event: verificationPlanPublicationFailedEventSchema,\n});\nexport const verificationPlanPublicationRetriedResultSchema = verificationPlanPublicationResultBaseSchema.extend({\n type: z.literal(\"VERIFICATION_PLAN_PUBLICATION_RETRIED\"),\n event: verificationPlanPublicationRetriedEventSchema,\n});\nexport const adoptVerificationPlanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n proposalHash: sha256Schema,\n})\n .strict();\nexport const disableVerificationPlanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n})\n .strict();\nexport const retryVerificationPlanPublicationRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const startVerificationRunRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedWorkItemVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n})\n .strict();\nexport const retryVerificationRunRequestSchema = startVerificationRunRequestSchema.extend({\n retryOfRunId: opaqueIdSchema,\n expectedRetryOfRunVersion: z.number().int().positive(),\n});\nexport const cancelVerificationRunRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const resolveVerificationCorrectionGateRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedRequestVersion: z.number().int().positive(),\n correctionRunId: opaqueIdSchema.nullable(),\n expectedCorrectionVersion: z.number().int().positive().nullable(),\n qaCorrectionRunId: opaqueIdSchema.nullable().optional(),\n expectedQACorrectionVersion: z.number().int().positive().nullable().optional(),\n expectedPipelineRunVersion: z.number().int().positive(),\n action: verificationCorrectionGateActionSchema,\n})\n .strict()\n .superRefine((value, context) => {\n const verificationPairMatches = (value.correctionRunId === null) === (value.expectedCorrectionVersion === null);\n const qaCorrectionRunId = value.qaCorrectionRunId ?? null;\n const expectedQACorrectionVersion = value.expectedQACorrectionVersion ?? null;\n const qaPairMatches = (qaCorrectionRunId === null) === (expectedQACorrectionVersion === null);\n if (!verificationPairMatches) {\n context.addIssue({\n code: \"custom\",\n message: \"A verification correction ID and expected version must be supplied together\",\n });\n }\n if (!qaPairMatches) {\n context.addIssue({\n code: \"custom\",\n message: \"A QA correction ID and expected version must be supplied together\",\n });\n }\n if (value.correctionRunId === null && qaCorrectionRunId === null) {\n context.addIssue({\n code: \"custom\",\n message: \"A verification gate must identify a current evaluator correction\",\n });\n }\n});\nexport const verificationPlanSettingsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n proposal: verificationPlanProposalSchema,\n plan: verificationPlanSchema.nullable(),\n publication: verificationPlanPublicationSchema.nullable(),\n})\n .strict()\n .superRefine((response, context) => {\n if (response.proposal.projectId !== response.projectId ||\n (response.plan !== null && response.plan.projectId !== response.projectId)) {\n context.addIssue({\n code: \"custom\",\n path: [\"projectId\"],\n message: \"Verification settings cannot cross Project identities\",\n });\n }\n if (response.publication !== null &&\n (response.plan === null ||\n response.publication.projectId !== response.projectId ||\n response.publication.planId !== response.plan.id)) {\n context.addIssue({\n code: \"custom\",\n path: [\"publication\"],\n message: \"Verification publication must belong to the returned Plan\",\n });\n }\n});\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/);\nexport const verificationPlatformSchema = z.enum([\"darwin\", \"linux\", \"win32\"]);\nexport const verificationRunStatusSchema = z.enum([\n \"QUEUED\",\n \"RUNNING\",\n \"CANCELLING\",\n \"PASSED\",\n \"FAILED\",\n \"ERROR\",\n \"INTERRUPTED\",\n]);\nexport const verificationCheckStatusSchema = z.enum([\n \"QUEUED\",\n \"RUNNING\",\n \"PASSED\",\n \"FAILED\",\n \"ERROR\",\n \"INTERRUPTED\",\n]);\nexport const verificationCheckErrorCodeSchema = z.enum([\n \"RECIPE_NOT_APPROVED\",\n \"POLICY_UNAVAILABLE\",\n \"CWD_INVALID\",\n \"EXECUTABLE_NOT_FOUND\",\n \"SPAWN_FAILED\",\n \"OUTPUT_LIMIT_REACHED\",\n \"TIMED_OUT\",\n \"TREE_MUTATED\",\n \"TREE_UNAVAILABLE\",\n \"OUTPUT_WRITE_FAILED\",\n \"PROCESS_TERMINATION_FAILED\",\n \"EXIT_UNOBSERVED\",\n \"RUNNER_INTERNAL_ERROR\",\n]);\nexport const verificationRunTerminalReasonSchema = z.enum([\n \"ALL_REQUIRED_PASSED\",\n \"REQUIRED_CHECK_FAILED\",\n \"REQUIRED_CHECK_ERROR\",\n \"OWNER_CANCELLED\",\n \"DAEMON_RESTART\",\n]);\nexport const verificationRunFreshnessSchema = z.enum([\"CURRENT\", \"STALE\"]);\nexport const verificationRunStaleReasonSchema = z.enum([\n \"PLAN_UNAVAILABLE\",\n \"PLAN_REPLACED\",\n \"PLAN_UNPUBLISHED\",\n \"TREE_CHANGED\",\n]);\nexport const verificationEvidenceSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n verificationRunId: opaqueIdSchema,\n planId: opaqueIdSchema,\n planRevision: z.number().int().positive(),\n planContentHash: sha256Schema,\n implementationTree: treeShaSchema,\n platform: verificationPlatformSchema,\n requiredCheckIds: z.array(opaqueIdSchema).min(1).max(12),\n optionalFailedCheckIds: z.array(opaqueIdSchema).max(12),\n completedAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((evidence, context) => {\n const allCheckIds = [...evidence.requiredCheckIds, ...evidence.optionalFailedCheckIds];\n if (new Set(allCheckIds).size !== allCheckIds.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"requiredCheckIds\"],\n message: \"Verification evidence Check identities must be unique\",\n });\n }\n});\nexport const verificationOutputSummarySchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n artifactId: opaqueIdSchema,\n sha256: sha256Schema,\n capturedBytes: z.number().int().nonnegative().max(262_144),\n stdoutBytes: z.number().int().nonnegative(),\n stderrBytes: z.number().int().nonnegative(),\n truncated: z.boolean(),\n available: z.boolean(),\n})\n .strict()\n .superRefine((output, context) => {\n const observedBytes = output.stdoutBytes + output.stderrBytes;\n if (output.capturedBytes > observedBytes) {\n context.addIssue({\n code: \"custom\",\n path: [\"capturedBytes\"],\n message: \"Captured verification output cannot exceed observed output\",\n });\n }\n if (!output.truncated && output.capturedBytes < observedBytes) {\n context.addIssue({\n code: \"custom\",\n path: [\"truncated\"],\n message: \"Verification output must report truncation when raw bytes were dropped; bounded channel metadata may also require truncation\",\n });\n }\n});\nexport const verificationOutputRetentionOutcomeSchema = z.enum([\"DELETED\", \"ALREADY_ABSENT\"]);\nexport const verificationCheckSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n runId: opaqueIdSchema,\n recipeId: opaqueIdSchema,\n ordinal: z.number().int().min(1).max(12),\n required: z.boolean(),\n status: verificationCheckStatusSchema,\n startedAt: utcTimestampSchema.nullable(),\n completedAt: utcTimestampSchema.nullable(),\n // A live observation is capped below, but a restart interruption records elapsed wall time.\n // The daemon may have been offline for longer than the recipe timeout, so durable historical\n // evidence must accept the complete safe-integer interval instead of blocking recovery.\n durationMs: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),\n exitCode: z.number().int().min(-2_147_483_648).max(2_147_483_647).nullable(),\n signal: z\n .string()\n .regex(/^SIG[A-Z0-9]+$/)\n .max(32)\n .nullable(),\n errorCode: verificationCheckErrorCodeSchema.nullable(),\n output: verificationOutputSummarySchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((check, context) => {\n const issue = (path, message) => {\n context.addIssue({ code: \"custom\", path: [path], message });\n };\n if (check.status === \"QUEUED\") {\n if (check.startedAt !== null ||\n check.completedAt !== null ||\n check.durationMs !== null ||\n check.exitCode !== null ||\n check.signal !== null ||\n check.errorCode !== null ||\n check.output !== null) {\n issue(\"status\", \"A queued verification Check cannot carry measured evidence\");\n }\n return;\n }\n if (check.status === \"RUNNING\") {\n if (check.startedAt === null ||\n check.completedAt !== null ||\n check.durationMs !== null ||\n check.exitCode !== null ||\n check.signal !== null ||\n check.errorCode !== null ||\n check.output !== null) {\n issue(\"status\", \"A running verification Check can only carry its start time\");\n }\n return;\n }\n if (check.completedAt === null)\n issue(\"completedAt\", \"A terminal verification Check must complete\");\n if (check.startedAt === null)\n issue(\"startedAt\", \"A terminal verification Check must have started\");\n if (check.durationMs === null)\n issue(\"durationMs\", \"A terminal verification Check needs duration\");\n if (check.status === \"PASSED\") {\n if (check.exitCode !== 0 ||\n check.signal !== null ||\n check.errorCode !== null ||\n check.output === null) {\n issue(\"status\", \"A passing verification Check requires observed exit code zero and output evidence\");\n }\n }\n else if (check.status === \"FAILED\") {\n if (check.exitCode === null ||\n check.exitCode === 0 ||\n check.signal !== null ||\n check.errorCode !== null ||\n check.output === null) {\n issue(\"status\", \"A failed verification Check requires an observed non-zero exit and output evidence\");\n }\n }\n else if (check.status === \"ERROR\") {\n if (check.errorCode === null)\n issue(\"errorCode\", \"An errored verification Check needs a typed error\");\n }\n else if (check.errorCode !== null) {\n issue(\"errorCode\", \"An interrupted verification Check cannot claim an infrastructure error\");\n }\n});\nexport const verificationRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n workspaceId: opaqueIdSchema,\n planId: opaqueIdSchema,\n planRevision: z.number().int().positive(),\n planContentHash: sha256Schema,\n implementationTree: treeShaSchema,\n ordinal: z.number().int().positive(),\n retryOfRunId: opaqueIdSchema.nullable(),\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n platform: verificationPlatformSchema,\n status: verificationRunStatusSchema,\n currentCheckId: opaqueIdSchema.nullable(),\n terminalReason: verificationRunTerminalReasonSchema.nullable(),\n startedAt: utcTimestampSchema.nullable(),\n completedAt: utcTimestampSchema.nullable(),\n createdAt: utcTimestampSchema,\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n const issue = (message) => {\n context.addIssue({ code: \"custom\", path: [\"status\"], message });\n };\n if (run.status === \"QUEUED\") {\n if (run.currentCheckId !== null ||\n run.terminalReason !== null ||\n run.startedAt !== null ||\n run.completedAt !== null) {\n issue(\"A queued verification Run cannot carry execution state\");\n }\n return;\n }\n if (run.status === \"RUNNING\") {\n if (run.startedAt === null || run.completedAt !== null || run.terminalReason !== null) {\n issue(\"A running verification Run requires a start and no terminal state\");\n }\n return;\n }\n if (run.status === \"CANCELLING\") {\n if (run.completedAt !== null || run.terminalReason !== null) {\n issue(\"A cancelling verification Run keeps its execution state until process stop is confirmed\");\n }\n return;\n }\n if ((run.status !== \"INTERRUPTED\" && run.startedAt === null) ||\n run.completedAt === null ||\n run.currentCheckId !== null) {\n issue(\"A terminal verification Run requires valid timestamps and no current Check\");\n }\n const validReason = (run.status === \"PASSED\" && run.terminalReason === \"ALL_REQUIRED_PASSED\") ||\n (run.status === \"FAILED\" && run.terminalReason === \"REQUIRED_CHECK_FAILED\") ||\n (run.status === \"ERROR\" && run.terminalReason === \"REQUIRED_CHECK_ERROR\") ||\n (run.status === \"INTERRUPTED\" &&\n (run.terminalReason === \"OWNER_CANCELLED\" || run.terminalReason === \"DAEMON_RESTART\"));\n if (!validReason)\n issue(\"A terminal verification Run has a contradictory reason\");\n});\nexport const verificationFailureReasonSchema = z.enum([\n \"REQUIRED_CHECK_FAILED\",\n \"REQUIRED_CHECK_ERROR\",\n \"RUN_INTERRUPTED\",\n \"STALE\",\n]);\nexport const verificationCorrectionRunStatusSchema = z.enum([\n \"ACTIVE\",\n \"PASSED\",\n \"SUPERSEDED\",\n \"EXHAUSTED\",\n \"CANCELLED\",\n]);\n/** Immutable evaluator identity; correction and resolution history reference it instead of mutating it. */\nexport const verificationFailureSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n verificationRunId: opaqueIdSchema,\n verificationCheckId: opaqueIdSchema.nullable(),\n planId: opaqueIdSchema,\n planRevision: z.number().int().positive(),\n planContentHash: sha256Schema,\n implementationTree: treeShaSchema,\n reason: verificationFailureReasonSchema,\n staleReasons: z.array(verificationRunStaleReasonSchema).max(4),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((failure, context) => {\n const stale = failure.reason === \"STALE\";\n if (stale !== failure.staleReasons.length > 0) {\n context.addIssue({\n code: \"custom\",\n path: [\"staleReasons\"],\n message: \"Only a stale verification failure carries stale reasons\",\n });\n }\n if ((failure.reason === \"REQUIRED_CHECK_FAILED\" || failure.reason === \"REQUIRED_CHECK_ERROR\") &&\n failure.verificationCheckId === null) {\n context.addIssue({\n code: \"custom\",\n path: [\"verificationCheckId\"],\n message: \"A failed verification Check must identify its measured source\",\n });\n }\n if (stale && failure.verificationCheckId !== null) {\n context.addIssue({\n code: \"custom\",\n path: [\"verificationCheckId\"],\n message: \"A stale Run failure is not attributed to one Check\",\n });\n }\n});\nexport const verificationCorrectionRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n budgetPosition: z.number().int().min(1).max(3),\n automatic: z.boolean(),\n sourceFailureId: opaqueIdSchema,\n sourceVerificationRunId: opaqueIdSchema,\n sourceImplementationTree: treeShaSchema,\n // Added after the initial Q17 contract. Missing remains accepted for replay of old receipts;\n // newly persisted rows always materialize an explicit null or exact suspended QA authority.\n resumesQACorrectionRunId: opaqueIdSchema.nullable().optional(),\n status: verificationCorrectionRunStatusSchema,\n createdAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n if (run.automatic !== run.budgetPosition <= 2) {\n context.addIssue({\n code: \"custom\",\n path: [\"automatic\"],\n message: \"Only the first two correction positions are automatic\",\n });\n }\n const terminal = run.status === \"PASSED\" || run.status === \"SUPERSEDED\" || run.status === \"CANCELLED\";\n if (terminal !== (run.completedAt !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"completedAt\"],\n message: \"Only a terminal verification correction carries completion time\",\n });\n }\n});\nexport const verificationCheckObservationSchema = z.discriminatedUnion(\"status\", [\n z\n .object({\n status: z.literal(\"PASSED\"),\n completedAt: utcTimestampSchema,\n durationMs: z.number().int().nonnegative().max(1_000_000),\n exitCode: z.literal(0),\n signal: z.null(),\n output: verificationOutputSummarySchema,\n })\n .strict(),\n z\n .object({\n status: z.literal(\"FAILED\"),\n completedAt: utcTimestampSchema,\n durationMs: z.number().int().nonnegative().max(1_000_000),\n exitCode: z\n .number()\n .int()\n .refine((value) => value !== 0),\n signal: z.null(),\n output: verificationOutputSummarySchema,\n })\n .strict(),\n z\n .object({\n status: z.literal(\"ERROR\"),\n completedAt: utcTimestampSchema,\n durationMs: z.number().int().nonnegative().max(1_000_000),\n exitCode: z.number().int().nullable(),\n signal: z\n .string()\n .regex(/^SIG[A-Z0-9]+$/)\n .max(32)\n .nullable(),\n errorCode: verificationCheckErrorCodeSchema,\n output: verificationOutputSummarySchema.nullable(),\n })\n .strict(),\n z\n .object({\n status: z.literal(\"INTERRUPTED\"),\n completedAt: utcTimestampSchema,\n durationMs: z.number().int().nonnegative().max(1_000_000),\n exitCode: z.number().int().nullable(),\n signal: z\n .string()\n .regex(/^SIG[A-Z0-9]+$/)\n .max(32)\n .nullable(),\n reason: z.literal(\"OWNER_CANCELLED\"),\n output: verificationOutputSummarySchema.nullable(),\n })\n .strict(),\n]);\nconst verificationRunReservationPayloadSchema = z\n .object({\n workItemId: opaqueIdSchema,\n expectedWorkItemVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n implementationTree: treeShaSchema,\n platform: verificationPlatformSchema,\n})\n .strict();\nexport const startVerificationRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_VERIFICATION_RUN\"),\n payload: verificationRunReservationPayloadSchema,\n});\nexport const retryVerificationRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RETRY_VERIFICATION_RUN\"),\n payload: verificationRunReservationPayloadSchema.extend({\n retryOfRunId: opaqueIdSchema,\n expectedRetryOfRunVersion: z.number().int().positive(),\n }),\n});\nexport const materializeStaleVerificationFailureCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"MATERIALIZE_STALE_VERIFICATION_FAILURE\"),\n payload: z\n .object({\n workItemId: opaqueIdSchema,\n verificationRunId: opaqueIdSchema,\n expectedWorkItemVersion: z.number().int().positive(),\n expectedPipelineRunVersion: z.number().int().positive(),\n expectedStageAttemptVersion: z.number().int().positive(),\n expectedVerificationRunVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n currentTree: treeShaSchema,\n })\n .strict(),\n});\nexport const startVerificationCheckCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_VERIFICATION_CHECK\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n expectedCheckVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const completeVerificationCheckCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"COMPLETE_VERIFICATION_CHECK\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n expectedCheckVersion: z.number().int().positive(),\n observation: verificationCheckObservationSchema,\n outputStorageKey: z\n .string()\n .regex(/^[a-zA-Z0-9][a-zA-Z0-9._:-]*\\.txt$/)\n .max(255)\n .nullable(),\n })\n .strict()\n .superRefine((payload, context) => {\n if ((payload.observation.output === null) !== (payload.outputStorageKey === null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"outputStorageKey\"],\n message: \"Output evidence and its storage key must be recorded together\",\n });\n }\n }),\n});\nexport const cancelVerificationRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CANCEL_VERIFICATION_RUN\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const finalizeVerificationRunCancellationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FINALIZE_VERIFICATION_RUN_CANCELLATION\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const interruptVerificationRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"INTERRUPT_VERIFICATION_RUN\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n reason: z.literal(\"DAEMON_RESTART\"),\n })\n .strict(),\n});\nexport const recordVerificationOutputRetentionCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_VERIFICATION_OUTPUT_RETENTION\"),\n payload: z\n .object({\n artifactId: opaqueIdSchema,\n outcome: verificationOutputRetentionOutcomeSchema,\n })\n .strict(),\n});\nexport const resolveVerificationCorrectionGateCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RESOLVE_VERIFICATION_CORRECTION_GATE\"),\n payload: z\n .object({\n humanRequestId: opaqueIdSchema,\n expectedRequestVersion: z.number().int().positive(),\n correctionRunId: opaqueIdSchema.nullable(),\n expectedCorrectionVersion: z.number().int().positive().nullable(),\n qaCorrectionRunId: opaqueIdSchema.nullable().optional(),\n expectedQACorrectionVersion: z.number().int().positive().nullable().optional(),\n expectedPipelineRunVersion: z.number().int().positive(),\n action: verificationCorrectionGateActionSchema,\n })\n .strict()\n .superRefine((value, context) => {\n const verificationPairMatches = (value.correctionRunId === null) === (value.expectedCorrectionVersion === null);\n const qaCorrectionRunId = value.qaCorrectionRunId ?? null;\n const expectedQACorrectionVersion = value.expectedQACorrectionVersion ?? null;\n const qaPairMatches = (qaCorrectionRunId === null) === (expectedQACorrectionVersion === null);\n if (!verificationPairMatches) {\n context.addIssue({\n code: \"custom\",\n message: \"A verification correction ID and expected version must be supplied together\",\n });\n }\n if (!qaPairMatches) {\n context.addIssue({\n code: \"custom\",\n message: \"A QA correction ID and expected version must be supplied together\",\n });\n }\n if (value.correctionRunId === null && qaCorrectionRunId === null) {\n context.addIssue({\n code: \"custom\",\n message: \"A verification gate must identify a current evaluator correction\",\n });\n }\n }),\n});\nconst verificationRunEventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"WORK_ITEM\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const verificationRunReservedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_RUN_RESERVED\"),\n data: z\n .object({ run: verificationRunSchema, checks: z.array(verificationCheckSchema).min(1).max(12) })\n .strict(),\n});\nexport const verificationCheckStartedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CHECK_STARTED\"),\n data: z.object({ run: verificationRunSchema, check: verificationCheckSchema }).strict(),\n});\nexport const verificationCheckCompletedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CHECK_COMPLETED\"),\n data: z.object({ run: verificationRunSchema, check: verificationCheckSchema }).strict(),\n});\nexport const verificationRunInterruptedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_RUN_INTERRUPTED\"),\n data: z\n .object({ run: verificationRunSchema, interruptedCheck: verificationCheckSchema.nullable() })\n .strict(),\n});\nexport const verificationRunCancellationRequestedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_RUN_CANCELLATION_REQUESTED\"),\n data: z.object({ run: verificationRunSchema }).strict(),\n});\nexport const verificationFailureRecordedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_FAILURE_RECORDED\"),\n data: z.object({ failure: verificationFailureSchema }).strict(),\n});\nexport const verificationCorrectionStartedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CORRECTION_STARTED\"),\n data: z.object({ correctionRun: verificationCorrectionRunSchema }).strict(),\n});\nexport const verificationCorrectionPassedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CORRECTION_PASSED\"),\n data: z.object({ correctionRun: verificationCorrectionRunSchema }).strict(),\n});\nexport const verificationCorrectionSupersededEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CORRECTION_SUPERSEDED\"),\n data: z.object({ correctionRun: verificationCorrectionRunSchema }).strict(),\n});\nexport const verificationCorrectionExhaustedEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CORRECTION_EXHAUSTED\"),\n data: z.object({ correctionRun: verificationCorrectionRunSchema, canAuthorizeFinal: z.boolean() }).strict(),\n});\nexport const verificationCorrectionCancelledEventSchema = verificationRunEventBaseSchema.extend({\n type: z.literal(\"VERIFICATION_CORRECTION_CANCELLED\"),\n data: z.object({ correctionRun: verificationCorrectionRunSchema }).strict(),\n});\nexport const verificationRunReservedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_RUN_RESERVED\"),\n run: verificationRunSchema,\n checks: z.array(verificationCheckSchema).min(1).max(12),\n event: verificationRunReservedEventSchema,\n})\n .strict();\nexport const verificationCheckStartedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_CHECK_STARTED\"),\n run: verificationRunSchema,\n check: verificationCheckSchema,\n event: verificationCheckStartedEventSchema,\n})\n .strict();\nexport const verificationCheckCompletedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_CHECK_COMPLETED\"),\n run: verificationRunSchema,\n check: verificationCheckSchema,\n next: z.enum([\"START_NEXT_CHECK\", \"TERMINAL\"]),\n event: verificationCheckCompletedEventSchema,\n})\n .strict();\nexport const verificationRunInterruptedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_RUN_INTERRUPTED\"),\n run: verificationRunSchema,\n interruptedCheck: verificationCheckSchema.nullable(),\n event: verificationRunInterruptedEventSchema,\n})\n .strict();\nexport const verificationRunCancellationRequestedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_RUN_CANCELLATION_REQUESTED\"),\n run: verificationRunSchema,\n event: verificationRunCancellationRequestedEventSchema,\n})\n .strict();\nexport const verificationOutputRetentionRecordedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"VERIFICATION_OUTPUT_RETENTION_RECORDED\"),\n artifactId: opaqueIdSchema,\n outcome: verificationOutputRetentionOutcomeSchema,\n recordedAt: utcTimestampSchema,\n})\n .strict();\nexport const verificationRunSnapshotResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n run: verificationRunSchema,\n plan: verificationPlanSchema,\n checks: z.array(verificationCheckSchema).min(1).max(12),\n freshness: verificationRunFreshnessSchema,\n staleReasons: z.array(verificationRunStaleReasonSchema).max(4),\n})\n .strict()\n .superRefine((snapshot, context) => {\n if (snapshot.plan.id !== snapshot.run.planId ||\n snapshot.plan.projectId !== snapshot.run.projectId ||\n snapshot.plan.revision !== snapshot.run.planRevision ||\n snapshot.plan.contentHash !== snapshot.run.planContentHash) {\n context.addIssue({\n code: \"custom\",\n path: [\"plan\"],\n message: \"A verification snapshot must carry the exact Plan reserved by its Run\",\n });\n }\n if (snapshot.checks.some((check) => check.runId !== snapshot.run.id ||\n check.projectId !== snapshot.run.projectId ||\n check.workItemId !== snapshot.run.workItemId)) {\n context.addIssue({\n code: \"custom\",\n path: [\"checks\"],\n message: \"Verification Checks cannot cross Run identities\",\n });\n }\n const ordinals = snapshot.checks.map((check) => check.ordinal);\n if (new Set(ordinals).size !== ordinals.length) {\n context.addIssue({ code: \"custom\", path: [\"checks\"], message: \"Check ordinals must be unique\" });\n }\n if ((snapshot.freshness === \"CURRENT\" && snapshot.staleReasons.length !== 0) ||\n (snapshot.freshness === \"STALE\" && snapshot.staleReasons.length === 0)) {\n context.addIssue({\n code: \"custom\",\n path: [\"freshness\"],\n message: \"Verification freshness must match its reasons\",\n });\n }\n});\nexport const verificationRunsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n runs: z.array(verificationRunSnapshotResponseSchema).max(100),\n failures: z.array(verificationFailureSchema).max(100),\n correctionRuns: z.array(verificationCorrectionRunSchema).max(100),\n})\n .strict();\n//# sourceMappingURL=verification.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { MAX_AUTOMATIC_CORRECTION_RUNS, MAX_TOTAL_CORRECTION_RUNS } from \"./correction.js\";\nexport const MAX_QA_TARGETS = 24;\nexport const MAX_QA_SCENARIOS = 20;\nexport const MAX_QA_STEPS_PER_SCENARIO = 50;\nexport const MAX_QA_ASSERTIONS_PER_SCENARIO = 50;\nexport const MAX_QA_EXECUTIONS = MAX_QA_TARGETS * MAX_QA_SCENARIOS;\nexport const MAX_QA_OBSERVATIONS = 100;\nexport const MAX_QA_ATTACHMENTS = 50;\nexport const MAX_QA_DEFECTS = 50;\nexport const MAX_QA_RUN_HISTORY = 20;\n/** Compatibility aliases; Q17 shares the same delivery-wide budget with Project verification. */\nexport const MAX_AUTOMATIC_QA_CORRECTION_RUNS = MAX_AUTOMATIC_CORRECTION_RUNS;\nexport const MAX_TOTAL_QA_CORRECTION_RUNS = MAX_TOTAL_CORRECTION_RUNS;\nexport const MAX_QA_CORRECTION_DEFECTS = MAX_TOTAL_QA_CORRECTION_RUNS * MAX_QA_DEFECTS;\nexport const MAX_QA_ATTACHMENT_BYTES = 32 * 1_024 * 1_024;\nexport const MAX_QA_STORED_ATTACHMENT_BYTES = 1_024 * 1_024 * 1_024;\nexport const MAX_QA_TOTAL_ATTACHMENT_BYTES = 256 * 1_024 * 1_024;\nexport const MAX_QA_RESPONSE_BYTES = 8 * 1_024 * 1_024;\nexport const MAX_QA_TOTAL_RESPONSE_BYTES = 64 * 1_024 * 1_024;\nexport const MAX_QA_REQUESTS = 250;\nconst titleSchema = z.string().trim().min(1).max(200);\nconst descriptionSchema = z.string().trim().min(1).max(4_000);\nconst shortDescriptionSchema = z.string().trim().min(1).max(1_000);\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/);\nconst contentHashSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/);\nconst portableStorageSegmentSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/, \"Storage key segment is not portable\")\n .refine((value) => !/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i.test(value), \"Storage key segment is reserved on Windows\");\nconst isLoopbackHostname = (hostname) => {\n if (hostname === \"localhost\" || hostname === \"[::1]\")\n return true;\n const octets = hostname.split(\".\");\n if (octets.length !== 4 || octets[0] !== \"127\")\n return false;\n return octets.every((octet) => /^\\d{1,3}$/.test(octet) && Number(octet) <= 255);\n};\nconst hasControlCharacter = (value) => {\n for (let index = 0; index < value.length; index += 1) {\n if (value.charCodeAt(index) <= 31)\n return true;\n }\n return false;\n};\nexport const qaTargetOriginSchema = z\n .url()\n .max(2_048)\n .superRefine((value, context) => {\n const match = /^(?:https?):\\/\\/(localhost|127(?:\\.\\d{1,3}){3}|\\[::1\\])(?::([1-9]\\d{0,4}))?$/.exec(value);\n if (!match || !isLoopbackHostname(match[1] ?? \"\")) {\n context.addIssue({ code: \"custom\", message: \"QA target must be a bare origin without credentials\" });\n return;\n }\n const port = match[2];\n if (port !== undefined && Number(port) > 65_535) {\n context.addIssue({ code: \"custom\", message: \"QA target origin port is outside the valid range\" });\n }\n});\nexport const browserDriverIdSchema = z.literal(\"PLAYWRIGHT\");\nexport const qaRunStatusSchema = z.enum([\"RUNNING\", \"PASSED\", \"FAILED\", \"ERROR\"]);\nexport const qaCheckStatusSchema = z.enum([\"PASSED\", \"FAILED\"]);\nexport const qaThemeSchema = z.enum([\"LIGHT\", \"DARK\"]);\nexport const qaObservationKindSchema = z.enum([\"CONSOLE\", \"NETWORK\"]);\nexport const qaObservationSeveritySchema = z.enum([\"INFO\", \"WARNING\", \"ERROR\"]);\nexport const qaAttachmentKindSchema = z.enum([\"SCREENSHOT\", \"TRACE\"]);\nexport const qaRetentionClassSchema = z.literal(\"STANDARD_30_DAYS\");\nexport const qaAttachmentRetentionOutcomeSchema = z.enum([\"DELETED\", \"ALREADY_ABSENT\"]);\nexport const qaDefectSeveritySchema = z.enum([\"LOW\", \"MEDIUM\", \"HIGH\", \"CRITICAL\"]);\nexport const qaDefectStatusSchema = z.enum([\"OPEN\", \"RESOLVED\", \"WAIVED\"]);\nexport const qaCorrectionRunStatusSchema = z.enum([\n \"ACTIVE\",\n \"PASSED\",\n \"SUPERSEDED\",\n \"EXHAUSTED\",\n \"CANCELLED\",\n]);\nexport const qaRetestCellReasons = [\n \"FAILED_CHECK\",\n \"BLOCKING_OBSERVATION\",\n \"OPEN_DEFECT\",\n \"REGRESSION\",\n];\nexport const qaRetestCellReasonSchema = z.enum(qaRetestCellReasons);\nexport const qaDriverErrorCodeSchema = z.enum([\n \"TARGET_UNHEALTHY\",\n \"DRIVER_CRASHED\",\n \"ORIGIN_FORBIDDEN\",\n \"TIMEOUT\",\n \"EVIDENCE_INVALID\",\n]);\nexport const qaRunScopeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"FULL\") }).strict(),\n z\n .object({\n type: z.literal(\"RETEST\"),\n correctionRunId: opaqueIdSchema,\n retestPlanId: opaqueIdSchema,\n })\n .strict(),\n]);\nexport const qaViewportSchema = z\n .object({\n width: z.number().int().min(240).max(7_680),\n height: z.number().int().min(240).max(4_320),\n})\n .strict();\nexport const qaTargetSchema = z\n .object({\n id: opaqueIdSchema,\n viewport: qaViewportSchema,\n locale: z\n .string()\n .trim()\n .min(2)\n .max(35)\n .regex(/^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$/),\n theme: qaThemeSchema,\n})\n .strict();\nexport const qaLocatorSchema = z.discriminatedUnion(\"by\", [\n z\n .object({\n by: z.literal(\"ROLE\"),\n role: z.enum([\n \"button\",\n \"checkbox\",\n \"dialog\",\n \"heading\",\n \"link\",\n \"listitem\",\n \"menuitem\",\n \"radio\",\n \"region\",\n \"tab\",\n \"textbox\",\n ]),\n name: titleSchema,\n })\n .strict(),\n z.object({ by: z.literal(\"TEST_ID\"), value: z.string().trim().min(1).max(200) }).strict(),\n z.object({ by: z.literal(\"TEXT\"), value: titleSchema }).strict(),\n]);\nconst qaRelativeUrlPathSchema = z\n .string()\n .trim()\n .min(1)\n .max(2_048)\n .regex(/^\\/(?!\\/)[^\\\\]*$/, \"Navigation target must be a same-origin absolute path\")\n .refine((value) => !hasControlCharacter(value), \"Navigation target cannot contain control characters\");\nexport const qaStepActionSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"NAVIGATE\"), path: qaRelativeUrlPathSchema }).strict(),\n z.object({ type: z.literal(\"CLICK\"), locator: qaLocatorSchema }).strict(),\n z\n .object({\n type: z.literal(\"PRESS\"),\n locator: qaLocatorSchema,\n key: z.enum([\n \"Tab\",\n \"Shift+Tab\",\n \"Enter\",\n \"Space\",\n \"Escape\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ]),\n })\n .strict(),\n z.object({ type: z.literal(\"WAIT_FOR_IDLE\") }).strict(),\n]);\nexport const qaAssertionRuleSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"VISIBLE\"), locator: qaLocatorSchema }).strict(),\n z\n .object({ type: z.literal(\"TEXT_CONTAINS\"), locator: qaLocatorSchema, expected: shortDescriptionSchema })\n .strict(),\n z.object({ type: z.literal(\"URL_PATH\"), path: qaRelativeUrlPathSchema }).strict(),\n z.object({ type: z.literal(\"NO_HORIZONTAL_OVERFLOW\") }).strict(),\n z.object({ type: z.literal(\"FOCUSED\"), locator: qaLocatorSchema }).strict(),\n]);\nconst qaPlannedStepSchema = z\n .object({ id: opaqueIdSchema, title: titleSchema, action: qaStepActionSchema })\n .strict();\nconst qaPlannedAssertionSchema = z\n .object({ id: opaqueIdSchema, title: titleSchema, rule: qaAssertionRuleSchema })\n .strict();\nexport const qaScenarioPlanSchema = z\n .object({\n id: opaqueIdSchema,\n title: titleSchema,\n steps: z.array(qaPlannedStepSchema).min(1).max(MAX_QA_STEPS_PER_SCENARIO),\n assertions: z.array(qaPlannedAssertionSchema).min(1).max(MAX_QA_ASSERTIONS_PER_SCENARIO),\n})\n .strict()\n .superRefine((scenario, context) => {\n if (new Set(scenario.steps.map(({ id }) => id)).size !== scenario.steps.length) {\n context.addIssue({ code: \"custom\", message: \"QA scenario step IDs must be unique\" });\n }\n if (new Set(scenario.assertions.map(({ id }) => id)).size !== scenario.assertions.length) {\n context.addIssue({ code: \"custom\", message: \"QA scenario assertion IDs must be unique\" });\n }\n});\nexport const qaPlanSnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n revision: z.number().int().positive(),\n contentHash: contentHashSchema,\n targets: z.array(qaTargetSchema).min(1).max(MAX_QA_TARGETS),\n scenarios: z.array(qaScenarioPlanSchema).min(1).max(MAX_QA_SCENARIOS),\n})\n .strict()\n .superRefine((plan, context) => {\n if (new Set(plan.targets.map(({ id }) => id)).size !== plan.targets.length) {\n context.addIssue({ code: \"custom\", message: \"QA target IDs must be unique\" });\n }\n if (new Set(plan.scenarios.map(({ id }) => id)).size !== plan.scenarios.length) {\n context.addIssue({ code: \"custom\", message: \"QA scenario IDs must be unique\" });\n }\n const executions = plan.targets.length * plan.scenarios.length;\n if (executions + plan.targets.length > MAX_QA_ATTACHMENTS) {\n context.addIssue({\n code: \"custom\",\n message: \"QA matrix is too large for one screenshot per execution and one trace per target\",\n });\n }\n});\nexport const qaEnvironmentSchema = z\n .object({\n osFamily: z.enum([\"MACOS\", \"WINDOWS\", \"LINUX\"]),\n runtimeName: z.literal(\"NODE\"),\n runtimeVersion: z.string().trim().min(1).max(100),\n browserName: z.enum([\"CHROMIUM\", \"FIREFOX\", \"WEBKIT\"]),\n browserVersion: z.string().trim().min(1).max(100),\n})\n .strict();\nexport const qaRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n agentRunId: opaqueIdSchema,\n driverId: browserDriverIdSchema,\n testedTree: treeShaSchema,\n targetOrigin: qaTargetOriginSchema,\n plan: qaPlanSnapshotSchema,\n scope: qaRunScopeSchema,\n status: qaRunStatusSchema,\n error: z.object({ code: qaDriverErrorCodeSchema, summary: shortDescriptionSchema }).strict().nullable(),\n startedAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n const running = run.status === \"RUNNING\";\n if (running !== (run.completedAt === null)) {\n context.addIssue({ code: \"custom\", message: \"Only a running QA run can omit completion time\" });\n }\n if ((run.status === \"ERROR\") !== (run.error !== null)) {\n context.addIssue({ code: \"custom\", message: \"Only an errored QA run can carry a driver error\" });\n }\n});\nexport const qaStepResultSchema = z\n .object({\n id: opaqueIdSchema,\n status: qaCheckStatusSchema,\n durationMs: z.number().int().nonnegative().max(3_600_000),\n})\n .strict();\nexport const qaAssertionResultSchema = z\n .object({\n id: opaqueIdSchema,\n status: qaCheckStatusSchema,\n details: shortDescriptionSchema.nullable(),\n})\n .strict();\nexport const qaScenarioExecutionSchema = z\n .object({\n targetId: opaqueIdSchema,\n scenarioId: opaqueIdSchema,\n durationMs: z.number().int().nonnegative().max(3_600_000),\n steps: z.array(qaStepResultSchema).min(1).max(MAX_QA_STEPS_PER_SCENARIO),\n assertions: z.array(qaAssertionResultSchema).min(1).max(MAX_QA_ASSERTIONS_PER_SCENARIO),\n})\n .strict();\nexport const qaObservationSchema = z\n .object({\n kind: qaObservationKindSchema,\n severity: qaObservationSeveritySchema,\n blocking: z.boolean(),\n targetId: opaqueIdSchema,\n scenarioId: opaqueIdSchema,\n summary: shortDescriptionSchema,\n})\n .strict();\nexport const qaAttachmentDraftSchema = z\n .object({\n handle: opaqueIdSchema,\n kind: qaAttachmentKindSchema,\n contentHash: contentHashSchema,\n byteSize: z.number().int().positive().max(MAX_QA_ATTACHMENT_BYTES),\n targetId: opaqueIdSchema,\n scenarioId: opaqueIdSchema,\n capturedAt: utcTimestampSchema,\n})\n .strict();\nexport const qaAttachmentRefSchema = qaAttachmentDraftSchema\n .omit({ handle: true })\n .extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n qaRunId: opaqueIdSchema,\n // Existing databases created by migration 0022 allowed refs up to 1 GiB. New driver drafts are\n // capped at MAX_QA_ATTACHMENT_BYTES; the wider read bound preserves those append-only rows.\n byteSize: z.number().int().positive().max(MAX_QA_STORED_ATTACHMENT_BYTES),\n retentionClass: qaRetentionClassSchema,\n storageKey: z\n .string()\n .trim()\n .min(1)\n .max(1_024)\n .refine((value) => !value.startsWith(\"/\") && !value.includes(\"\\\\\"), \"Storage key must be relative\")\n .refine((value) => value.split(\"/\").every((segment) => portableStorageSegmentSchema.safeParse(segment).success), \"Storage key must contain only portable segments\"),\n})\n .strict();\nexport const qaAttachmentSummarySchema = qaAttachmentRefSchema.omit({ storageKey: true }).strict();\nexport const qaFinalizedAttachmentSchema = z\n .object({\n handle: opaqueIdSchema,\n ref: qaAttachmentRefSchema,\n})\n .strict();\nexport const qaDefectDraftSchema = z\n .object({\n severity: qaDefectSeveritySchema,\n title: titleSchema,\n description: descriptionSchema,\n reproduction: z.array(shortDescriptionSchema).min(1).max(20),\n targetId: opaqueIdSchema,\n scenarioId: opaqueIdSchema,\n})\n .strict();\nexport const qaDefectSchema = qaDefectDraftSchema\n .extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n qaRunId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n testedTree: treeShaSchema,\n ordinal: z.number().int().positive().max(MAX_QA_DEFECTS),\n status: qaDefectStatusSchema,\n resolutionReason: descriptionSchema.nullable(),\n resolvedByQARunId: opaqueIdSchema.nullable(),\n createdAt: utcTimestampSchema,\n resolvedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((defect, context) => {\n const open = defect.status === \"OPEN\";\n const hasAnyResolution = defect.resolutionReason !== null || defect.resolvedAt !== null;\n const hasCompleteResolution = defect.resolutionReason !== null && defect.resolvedAt !== null;\n if ((open && hasAnyResolution) || (!open && !hasCompleteResolution)) {\n context.addIssue({ code: \"custom\", message: \"A terminal QA defect requires complete resolution data\" });\n }\n if ((defect.status === \"RESOLVED\" && defect.resolvedByQARunId === null) ||\n (defect.status !== \"RESOLVED\" && defect.resolvedByQARunId !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Only an evidence-resolved QA defect carries its passing QA run identity\",\n });\n }\n});\nexport const qaRetestCellSchema = z\n .object({\n targetId: opaqueIdSchema,\n scenarioId: opaqueIdSchema,\n reasons: z.array(qaRetestCellReasonSchema).min(1).max(qaRetestCellReasons.length),\n})\n .strict()\n .superRefine((cell, context) => {\n if (new Set(cell.reasons).size !== cell.reasons.length) {\n context.addIssue({ code: \"custom\", message: \"A QA retest cell cannot repeat a scope reason\" });\n }\n const ordered = [...cell.reasons].sort((left, right) => qaRetestCellReasons.indexOf(left) - qaRetestCellReasons.indexOf(right));\n if (ordered.some((reason, index) => reason !== cell.reasons[index])) {\n context.addIssue({ code: \"custom\", message: \"QA retest cell reasons must use canonical order\" });\n }\n});\nexport const qaRetestPlanSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n correctionRunId: opaqueIdSchema,\n baselineQARunId: opaqueIdSchema,\n sourceQARunId: opaqueIdSchema,\n sourceEvidenceBundleId: opaqueIdSchema,\n baselinePlanRevision: z.number().int().positive(),\n baselinePlanContentHash: contentHashSchema,\n cells: z.array(qaRetestCellSchema).min(1).max(MAX_QA_EXECUTIONS),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((plan, context) => {\n const keys = plan.cells.map(({ targetId, scenarioId }) => `${targetId}\\u0000${scenarioId}`);\n if (new Set(keys).size !== keys.length) {\n context.addIssue({ code: \"custom\", message: \"A QA retest plan cannot repeat a target/scenario cell\" });\n }\n});\nexport const qaCorrectionRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n ordinal: z.number().int().positive().max(MAX_TOTAL_QA_CORRECTION_RUNS),\n sourceQARunId: opaqueIdSchema,\n baselineQARunId: opaqueIdSchema,\n sourceEvidenceBundleId: opaqueIdSchema,\n sourceTestedTree: treeShaSchema,\n defectIds: z.array(opaqueIdSchema).min(1).max(MAX_QA_CORRECTION_DEFECTS),\n status: qaCorrectionRunStatusSchema,\n createdAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n if (new Set(run.defectIds).size !== run.defectIds.length) {\n context.addIssue({ code: \"custom\", message: \"A QA correction run cannot repeat a defect ID\" });\n }\n const terminal = run.status === \"PASSED\" || run.status === \"SUPERSEDED\" || run.status === \"CANCELLED\";\n if (terminal !== (run.completedAt !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Only a terminal QA correction run can carry a completion time\",\n });\n }\n});\nconst qaMeasuredDriverResultSchema = z\n .object({\n outcome: z.literal(\"MEASURED\"),\n environment: qaEnvironmentSchema,\n executions: z.array(qaScenarioExecutionSchema).min(1).max(MAX_QA_EXECUTIONS),\n observations: z.array(qaObservationSchema).max(MAX_QA_OBSERVATIONS),\n attachments: z.array(qaAttachmentDraftSchema).max(MAX_QA_ATTACHMENTS),\n defects: z.array(qaDefectDraftSchema).max(MAX_QA_DEFECTS),\n})\n .strict();\nconst qaErroredDriverResultSchema = z\n .object({\n outcome: z.literal(\"ERROR\"),\n code: qaDriverErrorCodeSchema,\n summary: shortDescriptionSchema,\n})\n .strict();\nexport const qaDriverResultSchema = z.discriminatedUnion(\"outcome\", [\n qaMeasuredDriverResultSchema,\n qaErroredDriverResultSchema,\n]);\nexport const qaEvidenceBundleSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n qaRunId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n testedTree: treeShaSchema,\n verdict: z.enum([\"PASSED\", \"FAILED\"]),\n environment: qaEnvironmentSchema,\n executions: z.array(qaScenarioExecutionSchema).min(1).max(MAX_QA_EXECUTIONS),\n observations: z.array(qaObservationSchema).max(MAX_QA_OBSERVATIONS),\n attachmentIds: z.array(opaqueIdSchema).max(MAX_QA_ATTACHMENTS),\n defectIds: z.array(opaqueIdSchema).max(MAX_QA_DEFECTS),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((bundle, context) => {\n if (new Set(bundle.attachmentIds).size !== bundle.attachmentIds.length) {\n context.addIssue({ code: \"custom\", message: \"QA evidence cannot repeat an attachment ID\" });\n }\n if (new Set(bundle.defectIds).size !== bundle.defectIds.length) {\n context.addIssue({ code: \"custom\", message: \"QA evidence cannot repeat a defect ID\" });\n }\n if (bundle.verdict === \"PASSED\" && bundle.defectIds.length !== 0) {\n context.addIssue({ code: \"custom\", message: \"Passed QA evidence cannot reference defects\" });\n }\n if (bundle.verdict === \"FAILED\" && bundle.defectIds.length === 0) {\n context.addIssue({ code: \"custom\", message: \"Failed QA evidence requires a defect\" });\n }\n});\nconst qaEventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"WORK_ITEM\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const qaRunReservedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_RUN_RESERVED\"),\n data: z.object({ qaRun: qaRunSchema }).strict(),\n});\nexport const qaRunCompletedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_RUN_COMPLETED\"),\n data: z\n .object({\n qaRun: qaRunSchema,\n evidenceBundleId: opaqueIdSchema.nullable(),\n defectIds: z.array(opaqueIdSchema).max(MAX_QA_DEFECTS),\n })\n .strict(),\n});\nexport const qaDefectWaivedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_DEFECT_WAIVED\"),\n data: z.object({ defect: qaDefectSchema }).strict(),\n});\nexport const qaCorrectionStartedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_CORRECTION_STARTED\"),\n data: z.object({ correctionRun: qaCorrectionRunSchema, retestPlan: qaRetestPlanSchema }).strict(),\n});\nexport const qaCorrectionExhaustedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_CORRECTION_EXHAUSTED\"),\n data: z.object({ correctionRun: qaCorrectionRunSchema, canAuthorizeFinal: z.boolean() }).strict(),\n});\nexport const qaCorrectionPassedEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_CORRECTION_PASSED\"),\n data: z\n .object({\n correctionRun: qaCorrectionRunSchema,\n resolvedDefects: z.array(qaDefectSchema).max(MAX_QA_CORRECTION_DEFECTS),\n })\n .strict(),\n});\nexport const qaCorrectionCancelledEventSchema = qaEventBaseSchema.extend({\n type: z.literal(\"QA_CORRECTION_CANCELLED\"),\n data: z.object({ correctionRun: qaCorrectionRunSchema }).strict(),\n});\nconst qaCommandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const reserveQARunCommandSchema = qaCommandBaseSchema.extend({\n type: z.literal(\"RESERVE_QA_RUN\"),\n payload: z\n .object({\n stageAttemptId: opaqueIdSchema,\n agentRunId: opaqueIdSchema,\n testedTree: treeShaSchema,\n targetOrigin: qaTargetOriginSchema,\n plan: qaPlanSnapshotSchema,\n scope: qaRunScopeSchema,\n })\n .strict(),\n});\nexport const completeQARunCommandSchema = qaCommandBaseSchema.extend({\n type: z.literal(\"COMPLETE_QA_RUN\"),\n payload: z\n .object({\n qaRunId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n currentTree: treeShaSchema,\n result: qaDriverResultSchema,\n finalizedAttachments: z.array(qaFinalizedAttachmentSchema).max(MAX_QA_ATTACHMENTS),\n completionMode: z.enum([\"FINALIZE_WORKFLOW\", \"RECORD_MEASUREMENT\"]).optional(),\n })\n .strict(),\n});\nexport const recordQAAttachmentRetentionCommandSchema = qaCommandBaseSchema.extend({\n type: z.literal(\"RECORD_QA_ATTACHMENT_RETENTION\"),\n payload: z\n .object({\n attachmentId: opaqueIdSchema,\n outcome: qaAttachmentRetentionOutcomeSchema,\n })\n .strict(),\n});\nexport const waiveQADefectCommandSchema = qaCommandBaseSchema.extend({\n type: z.literal(\"WAIVE_QA_DEFECT\"),\n payload: z\n .object({\n defectId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n reason: descriptionSchema,\n })\n .strict(),\n});\nexport const waiveQADefectRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n reason: descriptionSchema,\n})\n .strict();\nconst qaCommandResultBaseSchema = z\n .object({ schemaVersion: schemaVersionSchema, replayed: z.boolean() })\n .strict();\nexport const qaRunReservedResultSchema = qaCommandResultBaseSchema.extend({\n type: z.literal(\"QA_RUN_RESERVED\"),\n workItemId: opaqueIdSchema,\n qaRun: qaRunSchema,\n event: qaRunReservedEventSchema,\n});\nexport const qaRunCompletedResultSchema = qaCommandResultBaseSchema.extend({\n type: z.literal(\"QA_RUN_COMPLETED\"),\n workItemId: opaqueIdSchema,\n qaRun: qaRunSchema,\n evidence: qaEvidenceBundleSchema.nullable(),\n attachments: z.array(qaAttachmentRefSchema).max(MAX_QA_ATTACHMENTS),\n defects: z.array(qaDefectSchema).max(MAX_QA_DEFECTS),\n event: qaRunCompletedEventSchema,\n});\nexport const qaAttachmentRetentionRecordedResultSchema = qaCommandResultBaseSchema.extend({\n type: z.literal(\"QA_ATTACHMENT_RETENTION_RECORDED\"),\n attachmentId: opaqueIdSchema,\n outcome: qaAttachmentRetentionOutcomeSchema,\n recordedAt: utcTimestampSchema,\n});\nexport const qaDefectWaivedResultSchema = qaCommandResultBaseSchema.extend({\n type: z.literal(\"QA_DEFECT_WAIVED\"),\n workItemId: opaqueIdSchema,\n defect: qaDefectSchema,\n event: qaDefectWaivedEventSchema,\n});\nexport const qaStateResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n runs: z.array(qaRunSchema).max(MAX_QA_RUN_HISTORY),\n evidence: z.array(qaEvidenceBundleSchema).max(MAX_QA_RUN_HISTORY),\n attachments: z.array(qaAttachmentSummarySchema).max(MAX_QA_RUN_HISTORY * MAX_QA_ATTACHMENTS),\n defects: z.array(qaDefectSchema).max(MAX_QA_RUN_HISTORY * MAX_QA_DEFECTS),\n correctionRuns: z.array(qaCorrectionRunSchema).max(MAX_TOTAL_QA_CORRECTION_RUNS),\n retestPlans: z.array(qaRetestPlanSchema).max(MAX_TOTAL_QA_CORRECTION_RUNS),\n})\n .strict();\n//# sourceMappingURL=qa.js.map","import { z } from \"zod\";\nimport { codeBlindOrchestrationSchema } from \"./orchestration.js\";\nimport { actorSchema, correlationIdSchema, modelTierSchema, opaqueIdSchema, providerIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { mcpSessionSnapshotSchema } from \"./mcp.js\";\nimport { workspaceToolCallChangedEventSchema, workspaceToolCallRecordSchema } from \"./workspace-tool.js\";\nimport { workItemWorkspaceOrphanedEventSchema, workItemWorkspaceSchema } from \"./workspace.js\";\nimport { reviewFindingSchema, reviewReportDraftSchema, reviewReportSchema } from \"./review.js\";\nimport { verificationCorrectionCancelledEventSchema, verificationCorrectionGateActionSchema, verificationCorrectionRunSchema, verificationCorrectionStartedEventSchema, verificationCorrectionSupersededEventSchema, verificationEvidenceSchema, verificationFailureSchema, verificationFailureRecordedEventSchema, verificationRunInterruptedEventSchema, verificationRunSchema, } from \"./verification.js\";\nimport { qaCorrectionCancelledEventSchema, qaCorrectionRunSchema, qaCorrectionStartedEventSchema, qaRetestPlanSchema, } from \"./qa.js\";\n// A Git TREE object id, not a commit one. Same forty lowercase hex characters as\n// `commitShaSchema` in workspace.ts and deliberately a separate declaration: what this names is the\n// content of a directory, and a schema that called it a commit would invite a reader to pass it to\n// `git log` or `git show <sha>^` and get nothing. The SHA-1 bound is the same statement about this\n// codebase that workspace.ts spells out -- no SHA-256 repository is created or accepted anywhere in\n// Loomrail, so widening the regex is part of adding that support rather than a bug fix.\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/);\nexport const workflowStageSchema = z.enum([\"DISCOVERY\", \"PLAN\", \"IMPLEMENT\", \"REVIEW\", \"QA\", \"ACCEPTANCE\"]);\n// Provider identity belongs to the durable contract, not to an adapter implementation: commands,\n// EvidenceArtifacts and provider capabilities must all use the same closed vocabulary without\n// making @loomrail/contracts depend back on @loomrail/provider-core.\nexport { providerIdSchema } from \"./shared.js\";\nexport const pipelineRunStatusSchema = z.enum([\n \"RUNNING\",\n \"WAITING_HUMAN\",\n \"SOFT_PAUSED\",\n \"HARD_PAUSED\",\n \"INTERRUPTED\",\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n]);\nexport const stageAttemptStatusSchema = z.enum([\n \"PENDING\",\n \"QUEUED\",\n \"RUNNING\",\n \"WAITING_HUMAN\",\n \"SOFT_PAUSED\",\n \"HARD_PAUSED\",\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"INTERRUPTED\",\n \"RECOVERING\",\n \"STALE\",\n]);\nexport const humanRequestKindSchema = z.enum([\n \"SINGLE_CHOICE\",\n \"MULTIPLE_CHOICE\",\n \"CONFIRMATION\",\n \"FREE_TEXT\",\n]);\nexport const humanRequestStatusSchema = z.enum([\n \"OPEN\",\n \"CLAIMED\",\n \"SNOOZED\",\n \"RESOLVED\",\n \"EXPIRED\",\n \"CANCELLED\",\n]);\nexport const workflowDispatchModeSchema = z.enum([\"START\", \"RESUME\"]);\nexport const workflowDispatchStatusSchema = z.enum([\"PENDING\", \"COMPLETED\", \"FAILED\"]);\nexport const usageQualitySchema = z.enum([\"ACTUAL\", \"PROVIDER_ESTIMATE\", \"LOOMRAIL_ESTIMATE\"]);\nexport const usageKindSchema = z.literal(\"ESTIMATED_TOKENS\");\nexport const budgetPauseKindSchema = z.enum([\"SOFT\", \"HARD\"]);\nexport const recoveryReasonSchema = z.literal(\"DAEMON_RESTART\");\nexport const evidenceArtifactKindSchema = z.enum([\"REVIEW_REPORT\", \"QA_REPORT\"]);\nexport const evidenceArtifactStatusSchema = z.literal(\"PASSED\");\nexport const acceptanceStatusSchema = z.enum([\"PENDING\", \"ACCEPTED\", \"RETURNED\", \"REJECTED\"]);\nexport const acceptanceActionSchema = z.enum([\"ACCEPT\", \"RETURN_TO_WORK\", \"REJECT\"]);\nexport const providerSessionStatusSchema = z.enum([\"RUNNING\", \"ENDED\"]);\nexport const providerSessionEndReasonSchema = z.enum([\n \"COMPLETED\",\n \"HANDOFF\",\n \"CONTEXT_EXHAUSTED\",\n \"INTERRUPTED\",\n \"CANCELLED\",\n]);\n// The kinds a context-pack section's provenance can point at (packages/context-assembly's\n// render.ts is the only producer today). WORKFLOW_POSITION carries no source: templateId and\n// templateVersion are recorded at the recipe's top level instead (spec §4.2).\nexport const contextSourceKindSchema = z.enum([\n \"WORK_ITEM\",\n \"DECISION\",\n \"CHECKPOINT\",\n \"EVIDENCE\",\n \"ACTIVITY\",\n \"STAGE_ATTEMPT\",\n \"AGENT_RUN\",\n \"REVIEW_FINDING\",\n \"QA_CORRECTION_RUN\",\n \"QA_RUN\",\n \"QA_EVIDENCE_BUNDLE\",\n \"QA_RETEST_PLAN\",\n \"QA_DEFECT\",\n \"VERIFICATION_RUN\",\n \"VERIFICATION_CHECK\",\n \"PROJECT_VERIFICATION_PLAN\",\n \"PROJECT_CONSTITUTION_VERSION\",\n]);\nexport const contextPackSpecSourceSchema = z.enum([\"WORKFLOW_TEMPLATE\", \"ROLE_PLAYBOOK\"]);\nexport const contextPackOmittedReasonSchema = z.enum([\"CONTEXT_BUDGET\", \"STAGE_PROJECTION\"]);\nconst titleSchema = z.string().trim().min(1).max(200);\nconst descriptionSchema = z.string().trim().min(1).max(4_000);\nconst budgetThresholdSchema = z.number().positive().max(1);\nexport const contextSectionIdSchema = z.enum([\n \"WORK_ITEM_BRIEF\",\n \"WORKFLOW_POSITION\",\n \"DECISIONS\",\n \"LATEST_CHECKPOINT\",\n \"REVIEW_INPUT\",\n \"EVIDENCE\",\n \"ACTIVITY\",\n]);\nexport const contextPackSectionSchema = z\n .object({\n id: contextSectionIdSchema,\n ordinal: z.number().int().nonnegative(),\n required: z.boolean(),\n})\n .strict();\nexport const contextPackSpecSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sections: z.array(contextPackSectionSchema).min(1).max(20),\n})\n .strict();\n// The assembled pack that crosses the provider-adapter boundary (A2). Declared here rather than\n// in @loomrail/context-assembly so that provider-core can depend on the type without depending on\n// an assembly implementation package for it.\nexport const contextPackSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n text: z.string(),\n contentHash: z.string().regex(/^sha256:[0-9a-f]{64}$/),\n})\n .strict();\n// Per-section provenance is a list, not a single { kind, id, version } pair: cardinality carries\n// meaning (0 = a genuinely derived section, 1 = one durable entity, N = a collection), and\n// DECISIONS/EVIDENCE/ACTIVITY are collections of records, each with its own id and version. A\n// single pair cannot express N of them. This mirrors ContextPackRecipeDraft in\n// packages/context-assembly/src/assemble.ts, which is the only producer of this shape today.\nexport const contextPackRecipeSourceSchema = z\n .object({\n kind: contextSourceKindSchema,\n id: opaqueIdSchema,\n version: z.number().int().positive(),\n})\n .strict();\n// The cap on how many source records one section of a recipe may cite. Exported rather than\n// inlined because the persistence layer's collection reads (READ_CONTEXT_SOURCES) have to be\n// bounded by the *same* number: a work item with more decisions than this used to produce a recipe\n// that `contextPackRecipeInputSchema.parse` rejected, which threw out of the session loop -- and out\n// of daemon startup, if the attempt was picked up by the boot drain. A narrower pack is a degraded\n// session; an unparseable recipe is no session at all.\nexport const maxContextPackRecipeSources = 200;\nexport const contextPackRecipeSectionSchema = z\n .object({\n id: contextSectionIdSchema,\n sources: z.array(contextPackRecipeSourceSchema).max(maxContextPackRecipeSources),\n bytes: z.number().int().nonnegative(),\n})\n .strict();\nexport const contextPackRecipeOmittedSectionSchema = z\n .object({\n id: contextSectionIdSchema,\n reason: contextPackOmittedReasonSchema,\n})\n .strict();\n// Persisted alongside the assembled pack (spec §4.2). `sections`/`omitted`/`estimatedTokens`/\n// `budgetTokens` are exactly what the assembler's ContextPackRecipeDraft emits; the remaining\n// fields (id, providerSessionId, templateId, templateVersion, specSource, contentHash,\n// estimateQuality, createdAt) are added by the persistence layer that writes the recipe alongside\n// the session and the PROVIDER_SESSION_STARTED event.\nconst contextPackRecipeObjectSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n templateId: opaqueIdSchema,\n templateVersion: z.number().int().positive(),\n specSource: contextPackSpecSourceSchema,\n roleProfile: z\n .object({ id: opaqueIdSchema, revision: z.number().int().positive() })\n .strict()\n .nullable()\n .default(null),\n sections: z.array(contextPackRecipeSectionSchema).min(1).max(20),\n omitted: z.array(contextPackRecipeOmittedSectionSchema).max(20),\n contentHash: z.string().regex(/^sha256:[0-9a-f]{64}$/),\n estimatedTokens: z.number().int().nonnegative(),\n budgetTokens: z.number().int().positive(),\n estimateQuality: usageQualitySchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nconst recipeProfileMatchesSource = (recipe) => (recipe.specSource === \"ROLE_PLAYBOOK\") === (recipe.roleProfile !== null);\nconst roleProfileMessage = \"A role-playbook recipe must name the exact profile revision and no other recipe may\";\nexport const contextPackRecipeSchema = contextPackRecipeObjectSchema.refine(recipeProfileMatchesSource, {\n message: roleProfileMessage,\n});\n// The OS pid of the child process a live session actually spawned. Shared between\n// `providerSessionSchema` (what a session carries once one is known) and\n// `recordProviderSessionProcessCommandSchema` (how one gets there) so the daemon's own validation\n// of what `ProviderSessionListener.onProcessStarted` reports (@loomrail/provider-core) can never\n// disagree with what the persisted column will accept.\nexport const providerSessionProcessPidSchema = z.number().int().positive();\nexport const providerSessionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n // Nullable for sessions recorded before migration 0020. New A3 sessions infer this from the\n // active StageAttempt claim in persistence; callers never choose the relationship themselves.\n agentRunId: opaqueIdSchema.nullable().default(null),\n stageAttemptId: opaqueIdSchema,\n ordinal: z.number().int().positive(),\n status: providerSessionStatusSchema,\n endReason: providerSessionEndReasonSchema.nullable(),\n handoffRequestedAt: utcTimestampSchema.nullable(),\n startedAt: utcTimestampSchema,\n endedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n // Spec §8: the OS pid of the child process this RUNNING session is driving, so a daemon that\n // dies without killing it can still find and kill that process on the next start. Nullable, not\n // defaulted to 0 -- \"no process was ever started\" and \"a process whose pid is 0\" are different\n // facts, and a defaulted column could not tell them apart. Starts null and is filled in later,\n // if at all, by RECORD_PROVIDER_SESSION_PROCESS (an adapter that spawns nothing never\n // sends one, and the session simply stays null -- see `ProviderSessionListener.onProcessStarted`).\n pid: providerSessionProcessPidSchema.nullable(),\n})\n .strict()\n .refine((session) => (session.status === \"ENDED\") === (session.endReason !== null), \"An ended session must carry an end reason and a running one must not\")\n .refine((session) => (session.status === \"ENDED\") === (session.endedAt !== null), \"An ended session must carry an end timestamp and a running one must not\");\n// What the agent publishes mid-session (spec §5.1's onCheckpoint). Empty completed/remaining/\n// deadEnds/openQuestions lists are legitimate -- a session may genuinely have hit no dead ends --\n// but a checkpoint with no summary carries nothing forward to the next session's context pack.\nexport const checkpointDraftSchema = z\n .object({\n summary: descriptionSchema,\n completed: z.array(z.string().trim().min(1).max(500)).max(50),\n remaining: z.array(z.string().trim().min(1).max(500)).max(50),\n deadEnds: z.array(z.string().trim().min(1).max(500)).max(50),\n openQuestions: z.array(z.string().trim().min(1).max(500)).max(50),\n})\n .strict();\n// Checkpoint is append-only and never edited (D7): unlike the other entities in this file it\n// carries no optimistic-concurrency `version` field, matching evidenceArtifactSchema's pattern.\nexport const checkpointSchema = checkpointDraftSchema\n .extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n ordinal: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const contextWindowUsageSchema = z\n .object({\n usedTokens: z.number().int().nonnegative(),\n windowTokens: z.number().int().positive(),\n quality: usageQualitySchema,\n})\n .strict()\n .refine((usage) => usage.usedTokens <= usage.windowTokens, \"Usage cannot exceed the window\");\n// A separate channel from ContextWindowUsage on purpose (spec BD-001). Window occupancy drives\n// session handoff; spend drives budget thresholds and the HARD pause. They are different\n// quantities with different consumers, and folding one into the other would oblige the consumer\n// of one to parse the other. `costUsd` is optional because not every provider prices its own\n// usage; the token fields are the figures every provider can report. `inputTokens` is normalized by\n// each adapter to include every provider input class; `cachedInputTokens` is a subdivision retained\n// for attribution and must not be added to it again. `.strict()` matters here more\n// than on most schemas: this is the one channel a provider could otherwise use to smuggle\n// arbitrary content (e.g. a `transcript` field) past the contract as though it were spend.\nexport const providerUsageSchema = z\n .object({\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n cachedInputTokens: z.number().int().nonnegative().optional(),\n reasoningOutputTokens: z.number().int().nonnegative().optional(),\n costUsd: z.number().nonnegative().optional(),\n quality: usageQualitySchema,\n})\n .strict();\n// Whether an adapter can stop provider work before the immutable estimated-token allowance is\n// exceeded. POST_SESSION records actual usage only after the work has already happened.\nexport const providerTokenBudgetEnforcementSchema = z.enum([\"HARD\", \"POST_SESSION\"]);\n// One immutable, final spend report for one ProviderSession. Adapters report cumulative usage at\n// their terminal provider event, never deltas: making that cardinality explicit lets persistence\n// enforce UNIQUE(provider_session_id) and prevents a retrying callback from charging the budget\n// twice. `totalTokens` is the billable budget quantity Loomrail owns. Cached input and reasoning\n// output are retained as provider detail but are already included in input/output by the supported\n// adapters, so they are never added to the total again.\nexport const providerUsageReportSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n agentRunId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n usageRecordId: opaqueIdSchema.nullable(),\n inputTokens: z.number().int().nonnegative(),\n outputTokens: z.number().int().nonnegative(),\n cachedInputTokens: z.number().int().nonnegative().nullable(),\n reasoningOutputTokens: z.number().int().nonnegative().nullable(),\n totalTokens: z.number().int().nonnegative(),\n costUsd: z.number().nonnegative().nullable(),\n quality: usageQualitySchema,\n usageDigest: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n recordedAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((report, context) => {\n if (report.totalTokens !== report.inputTokens + report.outputTokens) {\n context.addIssue({\n code: \"custom\",\n path: [\"totalTokens\"],\n message: \"Total tokens must equal input plus output tokens\",\n });\n }\n if ((report.totalTokens === 0) !== (report.usageRecordId === null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"usageRecordId\"],\n message: \"A positive token total requires exactly one UsageRecord\",\n });\n }\n});\nexport const workflowTemplateStageSchema = z\n .object({\n stage: workflowStageSchema,\n ordinal: z.number().int().nonnegative(),\n contextPack: contextPackSpecSchema,\n})\n .strict();\nexport const workflowTemplateSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n version: z.number().int().positive(),\n name: titleSchema,\n stages: z.array(workflowTemplateStageSchema).min(1).max(20),\n})\n .strict();\nexport const pipelineRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n workflowTemplateId: opaqueIdSchema,\n workflowVersion: z.number().int().positive(),\n status: pipelineRunStatusSchema,\n currentStageAttemptId: opaqueIdSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n finishedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const stageAttemptSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n correctionRunId: opaqueIdSchema.nullable(),\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n stage: workflowStageSchema,\n attempt: z.number().int().positive(),\n status: stageAttemptStatusSchema,\n version: z.number().int().positive(),\n startedAt: utcTimestampSchema.nullable(),\n finishedAt: utcTimestampSchema.nullable(),\n failureCode: z.string().trim().min(1).max(100).nullable(),\n // §6.5: a session that publishes no checkpoint is unproductive; two in a row trigger a\n // HARD-pause. Lives on the StageAttempt (not in daemon memory) so a daemon restart -- itself\n // a normal end of a session -- cannot reset the very guard meant to catch that scenario.\n unproductiveSessions: z.number().int().nonnegative(),\n // §7: how many times the pack share has been stepped down after a provider rejected a pack\n // Loomrail judged as fitting. Durable for exactly the reason `unproductiveSessions` is: §6.4\n // makes a daemon restart an ordinary end of a session, so a counter held in daemon memory\n // would be cleared by the very event the \"one automatic retry, then ask\" rule must survive.\n packShareBackoffs: z.number().int().nonnegative(),\n /**\n * The Git tree the work item's worktree held when this stage succeeded (spec D3, §4).\n *\n * NOTHING IN E1.5 READS THIS, and that is deliberate rather than unfinished: spec §11 lists the\n * per-stage breakdown among the milestone's non-goals, so this field is written by the session\n * loop and displayed nowhere. A field with no reader is normally a declaration wearing the\n * shape of a contract, so here is the reader it is precomputed for, named:\n *\n * WHICH MILESTONE: the one that closes the second half of GD-002 -- checkpoint commits,\n * squash, and the Conventional Commit message the owner sees before acceptance -- which\n * requires GD-001, the agent's right to write Git history. Named in\n * docs/plans/06-post-phase-0-decomposition.ru.md §2 and in the E1.5 spec §1, both of which say\n * only that it \"goes separately\". It carries no ID in the approved order in that document's\n * §7 and is not scheduled; that is a gap in the roadmap, stated here rather than papered over.\n *\n * WHAT WILL READ IT: that milestone's per-stage breakdown, which needs one point of reference\n * per stage to say what each stage contributed, and its squash step, which builds checkpoint\n * commits from those same points. Neither can reconstruct them afterwards -- once the worktree\n * moves on, the tree a stage ended on is not recoverable from anything Loomrail keeps -- which\n * is the whole reason for spending forty bytes now.\n *\n * What survives to that milestone is narrower than \"a point to diff from\", and the difference is\n * measured rather than assumed. `git write-tree` writes the tree into the repository's object\n * database UNREACHABLE from any ref, along with the blobs `add -A` wrote for it; `git prune`\n * (and `git gc --auto`, which ordinary git commands trigger) removes unreachable objects older\n * than `gc.pruneExpire`, two weeks by default. Probed on a throwaway repository: after\n * `git prune --expire=now` the recorded tree answers `could not get object info`. So a reader\n * arriving weeks later can always compare two of these for EQUALITY -- \"this stage changed\n * nothing\", \"these two stages ended on the same tree\" -- and can only diff from one while the\n * owner's repository still holds the objects.\n *\n * Nullable, not optional, and the two states are genuinely different facts. `null` is \"no tree\n * was measured for this stage\": it never ran in a worktree (every prose stage), it has not\n * finished, or the worktree was gone when the label was taken. A stage that ran and changed\n * NOTHING is not null -- it records the tree it started on, which is a real sha -- so \"changed\n * nothing\" can never be mistaken for \"never measured\". Every StageAttempt recorded before\n * migration 0013 is null forever, which is the same fact and needs no special reading.\n */\n resultTree: treeShaSchema.nullable(),\n})\n .strict();\n// The `StageAttempt.failureCode` values that mark a HARD pause as raised by the session loop\n// (spec §6.5, §D8, §7) rather than by the token budget. Lives here, not in @loomrail/domain,\n// because it has two consumers on either side of the apps/web boundary: `decideAnswerHumanRequest`\n// and `decideApproveBudgetOverride` (packages/domain) decide behaviour from it, and the Task\n// Cockpit (apps/web) decides display from it -- apps/web depends on @loomrail/contracts and\n// @loomrail/ui only, never on @loomrail/domain. Should the two readings of \"is this a session\n// pause\" drift apart, the cockpit reads every HARD_PAUSED attempt as a budget pause and offers an\n// \"approve budget override\" action that decideApproveBudgetOverride throws on for these codes.\nexport const sessionPauseFailureCodes = [\n \"NO_PROGRESS\",\n \"CONTEXT_FLOOR_EXCEEDED\",\n \"PROVIDER_REJECTED_PACK\",\n \"PROVIDER_START_FAILED\",\n \"PROVIDER_OUTCOME_REJECTED\",\n \"SESSION_LIMIT_REACHED\",\n];\nexport const isSessionPauseFailureCode = (code) => code !== null && sessionPauseFailureCodes.includes(code);\nexport const budgetPolicySchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n revision: z.number().int().positive(),\n maxEstimatedTokens: z.number().int().positive(),\n // Optional preserves append-only events and receipts written before run-level model policy.\n // Null means \"use the immutable AgentProfile default\"; new owner-selected policies persist a tier.\n modelTierOverride: modelTierSchema.nullable().optional(),\n // Same compatibility rule as modelTierOverride. Null keeps the exact role envelope; a value is\n // an owner-authored ceiling for each future AgentRun under this policy revision.\n agentRunMaxEstimatedTokensOverride: z.number().int().positive().nullable().optional(),\n warningThresholds: z.array(budgetThresholdSchema).min(1).max(10),\n createdBy: actorSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const usageRecordSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n budgetPolicyId: opaqueIdSchema,\n kind: usageKindSchema,\n amount: z.number().int().positive(),\n quality: usageQualitySchema,\n recordedAt: utcTimestampSchema,\n})\n .strict();\nexport const recoveryReportSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n previousStatus: z.literal(\"RUNNING\"),\n recoveredStatus: z.literal(\"INTERRUPTED\"),\n reason: recoveryReasonSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const providerArtifactDraftSchema = z\n .object({\n kind: evidenceArtifactKindSchema,\n title: titleSchema,\n summary: descriptionSchema,\n checks: z.array(z.string().trim().min(1).max(500)).min(1).max(20),\n})\n .strict();\nexport const evidenceArtifactSchema = providerArtifactDraftSchema\n .extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n correctionRunId: opaqueIdSchema.nullable(),\n verificationCorrectionRunId: opaqueIdSchema.nullable().optional(),\n stage: z.enum([\"REVIEW\", \"QA\"]),\n status: evidenceArtifactStatusSchema,\n provider: providerIdSchema,\n reviewReportId: opaqueIdSchema.optional(),\n qaRunId: opaqueIdSchema.optional(),\n qaEvidenceBundleId: opaqueIdSchema.optional(),\n testedTree: treeShaSchema.optional(),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((artifact, context) => {\n const qaProvenance = [artifact.qaRunId, artifact.qaEvidenceBundleId, artifact.testedTree];\n const present = qaProvenance.filter((value) => value !== undefined).length;\n const reviewProvenance = [artifact.reviewReportId, artifact.testedTree];\n const reviewPresent = reviewProvenance.filter((value) => value !== undefined).length;\n if (artifact.kind === \"QA_REPORT\" && present !== 0 && present !== qaProvenance.length) {\n context.addIssue({ code: \"custom\", message: \"Measured QA provenance must be complete\" });\n }\n if (artifact.kind === \"REVIEW_REPORT\" &&\n reviewPresent !== 0 &&\n reviewPresent !== reviewProvenance.length) {\n context.addIssue({ code: \"custom\", message: \"Measured review provenance must be complete\" });\n }\n const hasQAIdentity = artifact.qaRunId !== undefined || artifact.qaEvidenceBundleId !== undefined;\n if (hasQAIdentity && (artifact.kind !== \"QA_REPORT\" || artifact.stage !== \"QA\")) {\n context.addIssue({ code: \"custom\", message: \"Only QA evidence can reference a measured browser run\" });\n }\n if (artifact.reviewReportId !== undefined &&\n (artifact.kind !== \"REVIEW_REPORT\" || artifact.stage !== \"REVIEW\")) {\n context.addIssue({ code: \"custom\", message: \"Only review evidence can reference a review report\" });\n }\n if (artifact.correctionRunId !== null) {\n const hasCorrectionAuthority = (artifact.kind === \"REVIEW_REPORT\" && reviewPresent === reviewProvenance.length) ||\n (artifact.kind === \"QA_REPORT\" && present === qaProvenance.length);\n if (!hasCorrectionAuthority) {\n context.addIssue({\n code: \"custom\",\n message: \"Correction evidence requires complete authority provenance\",\n });\n }\n }\n});\nexport const acceptanceCriterionClaimSchema = z\n .object({\n criterion: z.string().trim().min(1).max(500),\n implementation: descriptionSchema,\n reviewCheck: z.string().trim().min(1).max(500),\n qaCheck: z.string().trim().min(1).max(500),\n ownerVerification: descriptionSchema,\n knownRisk: descriptionSchema.nullable(),\n})\n .strict();\nexport const acceptanceCriterionEvidenceSchema = z\n .object({\n criterion: z.string().trim().min(1).max(500),\n implementation: descriptionSchema,\n reviewArtifactId: opaqueIdSchema,\n qaArtifactId: opaqueIdSchema,\n // Added after the first M6 packages had already been persisted. Both are absent only on those\n // legacy rows; every new package is required to bind them by the domain decision.\n reviewCheck: z.string().trim().min(1).max(500).optional(),\n qaCheck: z.string().trim().min(1).max(500).optional(),\n verificationCheckIds: z.array(opaqueIdSchema).min(1).max(12).optional(),\n verification: descriptionSchema,\n knownRisk: descriptionSchema.nullable(),\n})\n .strict()\n .superRefine((criterion, context) => {\n if ((criterion.reviewCheck === undefined) !== (criterion.qaCheck === undefined)) {\n context.addIssue({\n code: \"custom\",\n message: \"Criterion evidence must bind both Review and QA checks or be a legacy unbound row\",\n });\n }\n});\nexport const acceptancePackageSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n humanRequestId: opaqueIdSchema,\n status: acceptanceStatusSchema,\n criteria: z.array(acceptanceCriterionEvidenceSchema).max(50),\n // Optional keeps packages persisted before Q17 readable. Every new package for a Project with\n // an active VerificationPlan is required to carry this daemon-derived value by the domain.\n verificationEvidence: verificationEvidenceSchema.nullable().optional(),\n artifactIds: z.array(opaqueIdSchema).min(2).max(20),\n releaseNote: descriptionSchema,\n verifyInstructions: z.array(descriptionSchema).min(1).max(20),\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n resolvedAt: utcTimestampSchema.nullable(),\n resolvedBy: actorSchema.nullable(),\n resolutionReason: descriptionSchema.nullable(),\n})\n .strict()\n .superRefine((acceptancePackage, context) => {\n const evidence = acceptancePackage.verificationEvidence;\n const criterionBindings = acceptancePackage.criteria.map(({ verificationCheckIds }) => verificationCheckIds);\n if (evidence === undefined || evidence === null) {\n if (criterionBindings.some((binding) => binding !== undefined)) {\n context.addIssue({\n code: \"custom\",\n path: [\"criteria\"],\n message: \"Criterion Project checks require package Verification evidence\",\n });\n }\n return;\n }\n if (evidence.projectId !== acceptancePackage.projectId ||\n evidence.workItemId !== acceptancePackage.workItemId ||\n evidence.pipelineRunId !== acceptancePackage.pipelineRunId) {\n context.addIssue({\n code: \"custom\",\n path: [\"verificationEvidence\"],\n message: \"Verification evidence cannot cross an AcceptancePackage boundary\",\n });\n }\n const required = new Set(evidence.requiredCheckIds);\n if (criterionBindings.some((binding) => binding?.length !== required.size || binding.some((checkId) => !required.has(checkId)))) {\n context.addIssue({\n code: \"custom\",\n path: [\"criteria\"],\n message: \"Every criterion must bind the complete required Project verification set\",\n });\n }\n});\nexport const humanRequestOptionSchema = z\n .object({\n id: opaqueIdSchema,\n label: titleSchema,\n consequence: descriptionSchema,\n recommended: z.boolean(),\n})\n .strict();\nexport const humanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n kind: humanRequestKindSchema,\n blocking: z.boolean(),\n title: titleSchema,\n context: descriptionSchema,\n recommendation: descriptionSchema.nullable(),\n options: z.array(humanRequestOptionSchema).max(20),\n allowOther: z.boolean(),\n status: humanRequestStatusSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n resolvedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const humanRequestAnswerSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"OPTION\"),\n optionIds: z.array(opaqueIdSchema).min(1).max(20),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OTHER\"),\n text: z.string().trim().min(1).max(2_000),\n })\n .strict(),\n]);\nexport const decisionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n humanRequestId: opaqueIdSchema,\n answer: humanRequestAnswerSchema,\n actor: actorSchema,\n reason: z.string().trim().min(1).max(2_000).nullable(),\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const workflowDispatchSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n mode: workflowDispatchModeSchema,\n status: workflowDispatchStatusSchema,\n createdAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nconst humanRequestDraftBaseSchema = humanRequestSchema\n .pick({\n blocking: true,\n recommendation: true,\n})\n // Durable historical requests retain the original non-empty bounds above. New provider output\n // has a stricter quality floor so an exhausted or hostile model cannot turn `x` into an owner\n // interruption that looks valid in the cockpit. This is structural, not semantic validation:\n // the domain still cannot infer whether a well-formed question is genuinely necessary.\n .extend({\n title: z.string().trim().min(3).max(200),\n context: z.string().trim().min(10).max(4_000),\n})\n .strict();\nconst enumeratedHumanRequestDraftSchema = (kind) => humanRequestDraftBaseSchema\n .extend({\n kind: z.literal(kind),\n options: z.array(humanRequestOptionSchema).min(1).max(20),\n allowOther: z.boolean(),\n})\n .strict();\n// A provider-originated request must always expose at least one answer path. Enumerated requests\n// therefore carry an option, while FREE_TEXT explicitly accepts the OTHER answer shape. Keeping\n// these as a plain union emits nested `anyOf` for Structured Outputs; a discriminated union would\n// emit `oneOf`, which the Codex CLI schema subset does not accept.\nexport const humanRequestDraftSchema = z.union([\n enumeratedHumanRequestDraftSchema(\"SINGLE_CHOICE\"),\n enumeratedHumanRequestDraftSchema(\"MULTIPLE_CHOICE\"),\n enumeratedHumanRequestDraftSchema(\"CONFIRMATION\"),\n humanRequestDraftBaseSchema\n .extend({\n kind: z.literal(\"FREE_TEXT\"),\n options: z.array(humanRequestOptionSchema).max(0),\n allowOther: z.literal(true),\n })\n .strict(),\n]);\nexport const providerOutcomeSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"NEEDS_HUMAN\"),\n request: humanRequestDraftSchema,\n // Set only by the trusted provider adapter after it observes a structured terminal\n // failure. The stage-result schemas exposed to models deliberately omit this field and are\n // strict, so provider prose cannot manufacture a system attention reason.\n reason: z.literal(\"PROVIDER_RATE_LIMITED\").optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"COMPLETED\"),\n summary: z.string().trim().min(1).max(4_000),\n artifacts: z.array(providerArtifactDraftSchema).max(5).optional(),\n // R1 keeps the richer reviewer result beside the legacy acceptance-evidence summary while\n // the durable review tables own IDs, attribution and lifecycle. Other stages must not set it;\n // that stage check belongs to the deterministic workflow decision.\n reviewReport: reviewReportDraftSchema.optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"READY_FOR_ACCEPTANCE\"),\n releaseNote: descriptionSchema,\n verifyInstructions: z.array(descriptionSchema).min(1).max(20),\n // Optional only so commands persisted before Q3 remain readable. Provider adapters require\n // this field, and the domain rejects every new READY_FOR_ACCEPTANCE command that omits it.\n criteria: z.array(acceptanceCriterionClaimSchema).min(1).max(50).optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"BUDGET_LIMIT_REACHED\"),\n usageIncrements: z.array(z.number().int().positive()).min(1).max(100),\n quality: usageQualitySchema,\n })\n .strict(),\n // Session-level results (spec §5.2, §6.3): the session wound down before the stage finished.\n // HANDED_OFF always carries the checkpoint it wound down with; CONTEXT_EXHAUSTED may not --\n // the adapter hit the wall before it could publish one, which is exactly the unproductive-\n // session case spec §6.5 guards against. Both are handled by the session loop, not by\n // decideApplyProviderOutcome (see the guard there).\n z\n .object({\n type: z.literal(\"HANDED_OFF\"),\n checkpoint: checkpointDraftSchema,\n })\n .strict(),\n z\n .object({\n type: z.literal(\"CONTEXT_EXHAUSTED\"),\n checkpoint: checkpointDraftSchema.optional(),\n })\n .strict(),\n]);\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const pipelineStartedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PIPELINE_STARTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({ run: pipelineRunSchema, stageAttempt: stageAttemptSchema, budgetPolicy: budgetPolicySchema })\n .strict(),\n});\nexport const stageAttemptChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"STAGE_ATTEMPT_CHANGED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n previousStatus: stageAttemptStatusSchema,\n })\n .strict(),\n});\nexport const humanRequestOpenedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"HUMAN_REQUEST_OPENED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ request: humanRequestSchema }).strict(),\n});\nexport const humanRequestResolvedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"HUMAN_REQUEST_RESOLVED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ request: humanRequestSchema, decision: decisionSchema }).strict(),\n});\nexport const usageRecordedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"USAGE_RECORDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ usageRecord: usageRecordSchema, cumulativeAmount: z.number().int().positive() }).strict(),\n});\nexport const budgetThresholdReachedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"BUDGET_THRESHOLD_REACHED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n budgetPolicy: budgetPolicySchema,\n threshold: budgetThresholdSchema,\n cumulativeAmount: z.number().int().nonnegative(),\n })\n .strict(),\n});\nexport const pipelinePausedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PIPELINE_PAUSED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n kind: budgetPauseKindSchema,\n reason: descriptionSchema,\n })\n .strict(),\n});\nexport const pipelineResumedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PIPELINE_RESUMED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ run: pipelineRunSchema, stageAttempt: stageAttemptSchema }).strict(),\n});\nexport const pipelineCancelledEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PIPELINE_CANCELLED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ run: pipelineRunSchema, stageAttempt: stageAttemptSchema }).strict(),\n});\nexport const budgetOverrideApprovedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"BUDGET_OVERRIDE_APPROVED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n run: pipelineRunSchema,\n previousStageAttempt: stageAttemptSchema,\n stageAttempt: stageAttemptSchema,\n budgetPolicy: budgetPolicySchema,\n })\n .strict(),\n});\nexport const recoveryReportCreatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"RECOVERY_REPORT_CREATED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({ report: recoveryReportSchema, run: pipelineRunSchema, stageAttempt: stageAttemptSchema })\n .strict(),\n});\nexport const evidenceArtifactRecordedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"EVIDENCE_ARTIFACT_RECORDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ artifact: evidenceArtifactSchema }).strict(),\n});\nexport const reviewReportRecordedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"REVIEW_REPORT_RECORDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ report: reviewReportSchema }).strict(),\n});\nexport const reviewFindingRecordedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"REVIEW_FINDING_RECORDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ finding: reviewFindingSchema }).strict(),\n});\nexport const reviewFindingResolvedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"REVIEW_FINDING_RESOLVED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ finding: reviewFindingSchema }).strict(),\n});\nexport const reviewLoopExhaustedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"REVIEW_LOOP_EXHAUSTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n report: reviewReportSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n request: humanRequestSchema,\n })\n .strict(),\n});\nexport const acceptanceRequestedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"ACCEPTANCE_REQUESTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n acceptancePackage: acceptancePackageSchema,\n request: humanRequestSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n })\n .strict(),\n});\nexport const acceptanceResolvedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"ACCEPTANCE_RESOLVED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n action: acceptanceActionSchema,\n acceptancePackage: acceptancePackageSchema,\n request: humanRequestSchema,\n decision: decisionSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n })\n .strict(),\n});\nexport const pipelineCompletedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PIPELINE_COMPLETED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ run: pipelineRunSchema, stageAttempt: stageAttemptSchema }).strict(),\n});\n// Spec §4.4: PROVIDER_SESSION_STARTED must carry the recipe's contentHash and the list of omitted\n// section ids, so a reader of the audit log can see what the agent was and was not given without\n// loading the recipe row. Embedding the full recipe -- which contentHash and omitted are already\n// fields of -- satisfies that without inventing a second, narrower shape to keep in sync with it.\nexport const providerSessionStartedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROVIDER_SESSION_STARTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n session: providerSessionSchema,\n recipe: contextPackRecipeSchema,\n mcpSnapshots: z.array(mcpSessionSnapshotSchema).max(64).default([]),\n })\n .strict(),\n});\nexport const checkpointPublishedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"CHECKPOINT_PUBLISHED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ checkpoint: checkpointSchema }).strict(),\n});\n// Emitted once per ProviderSession, on the first occupancy report that crosses\n// handoffThreshold (spec §6.2). Carries the usage that triggered it so the audit trail shows why\n// the session started winding down, not just that it did.\nexport const contextHandoffRequestedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"CONTEXT_HANDOFF_REQUESTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ session: providerSessionSchema, usage: contextWindowUsageSchema }).strict(),\n});\nexport const providerSessionEndedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROVIDER_SESSION_ENDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ session: providerSessionSchema }).strict(),\n});\n// Spec §D8 and §6.1 step 3: the required sections did not fit the pack budget, so no session was\n// started at all. The byte figures are on the event rather than only in a log line because \"the\n// required core does not fit\" is only actionable to an owner who can see by how much -- and because\n// no ContextPackRecipe exists to carry them: the assembly stopped before producing one.\nexport const contextFloorExceededEventSchema = eventBaseSchema.extend({\n type: z.literal(\"CONTEXT_FLOOR_EXCEEDED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n sessionOrdinal: z.number().int().positive(),\n requiredBytes: z.number().int().nonnegative(),\n budgetBytes: z.number().int().nonnegative(),\n budgetTokens: z.number().int().positive(),\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nconst startPipelinePayloadSchema = z\n .object({\n orchestration: codeBlindOrchestrationSchema.optional(),\n workItemId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n template: workflowTemplateSchema,\n budget: z\n .object({\n maxEstimatedTokens: z.number().int().positive(),\n warningThresholds: z.array(budgetThresholdSchema).min(1).max(10),\n modelTierOverride: modelTierSchema.nullable().optional(),\n agentRunMaxEstimatedTokensOverride: z.number().int().positive().nullable().optional(),\n })\n .strict(),\n})\n .strict();\nexport const startPipelineCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_PIPELINE\"),\n payload: startPipelinePayloadSchema,\n});\n/** Historical command schema retained only so append-only audit rows remain readable. */\nexport const legacyStartPipelineCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_MOCK_PIPELINE\"),\n payload: startPipelinePayloadSchema,\n});\nexport const markWorkflowDispatchStartedCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"MARK_WORKFLOW_DISPATCH_STARTED\"),\n payload: z.object({ dispatchId: opaqueIdSchema }).strict(),\n});\nconst applyProviderOutcomePayloadSchema = z\n .object({\n dispatchId: opaqueIdSchema,\n /**\n * The adapter identity measured by the daemon, not a claim inside untrusted provider output.\n *\n * Optional only for append-only command-receipt compatibility: commands recorded before D2\n * have no such member and must keep the exact parsed shape their input hash was computed from.\n * Every new production caller supplies it; the domain reads an absent historical value as\n * MOCK, which was the only EvidenceArtifact provider the old schema could persist.\n */\n provider: providerIdSchema.optional(),\n outcome: providerOutcomeSchema,\n template: workflowTemplateSchema,\n /**\n * The stage-end tree label (see `stageAttemptSchema.resultTree`), measured by the daemon just\n * before it applies the outcome.\n *\n * Beside `outcome` rather than inside it, because it is not the provider's claim: `outcome` is\n * untrusted output from an agent, while this is Loomrail's own reading of the worktree through\n * `treeOfWorktree` (`@loomrail/workspace`) -- a baseline-independent reading, not the\n * `summariseChanges` machinery the owner-facing change summary uses, because no summary is\n * produced here for a tree to be paired with. Folding it into the COMPLETED outcome would let a\n * provider name the tree its own work is recorded against.\n *\n * Required and nullable rather than optional: every caller states what it measured, `null`\n * included, so a caller that simply forgot is caught by the schema instead of being recorded as\n * \"no tree was there\". Only the COMPLETED branch stores it -- the others end a session or park\n * the stage on a question, neither of which is a stage ending.\n */\n resultTree: treeShaSchema.nullable(),\n /**\n * The live ProviderSession terminal boundary owned by this outcome.\n *\n * Optional only for append-only compatibility with historical commands. New daemon callers\n * supply it so ending the session, recording its final cumulative usage and applying the\n * stage outcome are one state transaction. A null usage means the adapter honestly reported\n * no usage; it is different from omitting the whole boundary on an old command.\n */\n sessionCompletion: z\n .object({\n providerSessionId: opaqueIdSchema,\n usage: providerUsageSchema.nullable(),\n })\n .strict()\n .optional(),\n})\n .strict();\nexport const applyProviderOutcomeCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"APPLY_PROVIDER_OUTCOME\"),\n payload: applyProviderOutcomePayloadSchema,\n});\n// \"APPLY_MOCK_PROVIDER_OUTCOME\" is the historical discriminant: commands already recorded under\n// that name (the commands table is append-only audit history and is not rewritten) must still\n// parse when the same commandId is resubmitted, so the receipt cache can return the cached\n// result. Kept as a distinct single-literal schema (rather than folded into\n// applyProviderOutcomeCommandSchema's type as a two-value literal) so every member of\n// stateCommandSchema keeps a single-literal discriminant and TypeScript can still narrow it away\n// completely once handled. Nothing constructs a fresh command with this type going forward.\nexport const legacyApplyProviderOutcomeCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"APPLY_MOCK_PROVIDER_OUTCOME\"),\n payload: applyProviderOutcomePayloadSchema,\n});\nexport const answerHumanRequestCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ANSWER_HUMAN_REQUEST\"),\n payload: z\n .object({\n humanRequestId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n answer: humanRequestAnswerSchema,\n })\n .strict(),\n});\nexport const qaCorrectionGateActionSchema = z.enum([\"AUTHORIZE_FINAL\", \"CANCEL\"]);\nexport const resolveQACorrectionGateCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RESOLVE_QA_CORRECTION_GATE\"),\n payload: z\n .object({\n humanRequestId: opaqueIdSchema,\n expectedRequestVersion: z.number().int().positive(),\n correctionRunId: opaqueIdSchema.nullable(),\n expectedCorrectionVersion: z.number().int().positive().nullable(),\n expectedPipelineRunVersion: z.number().int().positive(),\n action: qaCorrectionGateActionSchema,\n })\n .strict()\n .refine(({ correctionRunId, expectedCorrectionVersion }) => (correctionRunId === null) === (expectedCorrectionVersion === null), \"A QA correction ID and expected version must be supplied together\"),\n});\nconst pipelineControlPayloadSchema = z\n .object({\n pipelineRunId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const pausePipelineCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"PAUSE_PIPELINE\"),\n payload: pipelineControlPayloadSchema,\n});\nexport const resumePipelineCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RESUME_PIPELINE\"),\n payload: pipelineControlPayloadSchema,\n});\nexport const cancelPipelineCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CANCEL_PIPELINE\"),\n payload: pipelineControlPayloadSchema,\n});\nexport const approveBudgetOverrideCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"APPROVE_BUDGET_OVERRIDE\"),\n payload: pipelineControlPayloadSchema.extend({\n maxEstimatedTokens: z.number().int().positive(),\n // Optional for historical command receipts. Omitted means preserve the current policy value.\n modelTierOverride: modelTierSchema.nullable().optional(),\n agentRunMaxEstimatedTokensOverride: z.number().int().positive().nullable().optional(),\n }),\n});\nexport const reconcileWorkflowsCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECONCILE_WORKFLOWS\"),\n payload: z\n .object({\n verificationProcessAuthorityReleasedRunIds: z.array(opaqueIdSchema).max(1_000).optional(),\n workspaceToolProcessAuthorityReleasedCallIds: z.array(opaqueIdSchema).max(1_000).optional(),\n })\n .strict(),\n});\nexport const resolveAcceptanceCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RESOLVE_ACCEPTANCE\"),\n payload: z\n .object({\n acceptancePackageId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n expectedRunVersion: z.number().int().positive(),\n action: acceptanceActionSchema,\n reason: descriptionSchema.nullable(),\n })\n .strict(),\n});\n// What START_PROVIDER_SESSION's caller submits for the recipe: context-assembly's\n// ContextPackRecipeDraft (sections/omitted/estimatedTokens/budgetTokens, the assembler's own\n// output) plus the fields the assembler cannot know -- templateId/templateVersion/specSource come\n// from the stage's ContextPackSpec, contentHash from the assembled ContextPack, estimateQuality\n// from the caller's window-size source. Everything else (id, providerSessionId, createdAt) is\n// assigned by the persistence layer that writes this alongside the ProviderSession (spec §6.1 step\n// 4). Named distinctly from context-assembly's ContextPackRecipeDraft -- the two are different\n// shapes sharing a concept (10 fields here vs. 4 there), and collapsing the names would send a\n// reader through StartProviderSessionCommand[\"payload\"][\"recipe\"] to find this instead of\n// importing it directly.\nexport const contextPackRecipeInputSchema = contextPackRecipeObjectSchema\n .omit({\n id: true,\n providerSessionId: true,\n createdAt: true,\n})\n .refine(recipeProfileMatchesSource, { message: roleProfileMessage });\nexport const startProviderSessionCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_PROVIDER_SESSION\"),\n payload: z\n .object({\n stageAttemptId: opaqueIdSchema,\n recipe: contextPackRecipeInputSchema,\n // Optional, not required: a pid is never known at START time -- `ProviderAdapter.start()`\n // has not even been called yet here, and it is `start()` that spawns the process (see\n // `ProviderSessionListener.onProcessStarted` in @loomrail/provider-core). Every real caller\n // omits it and the session is recorded with no known process until (and unless)\n // `RECORD_PROVIDER_SESSION_PROCESS` reports one later. A caller that does know a pid up\n // front -- a test -- can still record it here. Omitted and `null` are treated identically by\n // the command handler; the ProviderSession itself always carries `pid` as `null`, not absent.\n pid: providerSessionProcessPidSchema.nullable().optional(),\n })\n .strict(),\n});\n// The one durable write `ProviderSessionListener.onProcessStarted` produces (see\n// @loomrail/provider-core): a live adapter spawns its child deep inside `start()`, after\n// START_PROVIDER_SESSION has already run and the session already exists, so there is no way to\n// carry a pid on that command -- it has to arrive as a follow-up write to the session it belongs\n// to. Kept as its own command rather than folded into another one: unlike checkpoints or usage\n// reports, a pid is reported at most once per session and has no natural host command to ride\n// along with.\nexport const recordProviderSessionProcessCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_PROVIDER_SESSION_PROCESS\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n pid: providerSessionProcessPidSchema,\n })\n .strict(),\n});\nexport const recordProviderUsageCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_PROVIDER_USAGE\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n usage: providerUsageSchema,\n })\n .strict(),\n});\nexport const publishCheckpointCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"PUBLISH_CHECKPOINT\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n checkpoint: checkpointDraftSchema,\n })\n .strict(),\n});\nexport const endProviderSessionCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"END_PROVIDER_SESSION\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n endReason: providerSessionEndReasonSchema,\n // Whether the provider actually began running this session. Spec §6.5's unproductive-session\n // guard is about an agent that ran and published nothing; a session the adapter refused to\n // start never had the chance, and §7's pack-size branch owns that case instead. Recording the\n // fact rather than the rule keeps `endReason` truthful in the audit log: the session really\n // was interrupted, it just was not the agent's silence that interrupted it.\n providerStarted: z.boolean(),\n })\n .strict()\n .refine((payload) => payload.providerStarted || payload.endReason === \"INTERRUPTED\", \"A session the provider never started can only have ended as INTERRUPTED\"),\n});\n// Spec §6.2. The caller supplies the occupancy report and the threshold it is judged against;\n// whether this is the first crossing (and therefore whether a handoff is requested at all) is\n// decided from the stored session, not from the caller, so a repeated report is a safe no-op.\nexport const requestContextHandoffCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REQUEST_CONTEXT_HANDOFF\"),\n payload: z\n .object({\n providerSessionId: opaqueIdSchema,\n usage: contextWindowUsageSchema,\n handoffThreshold: budgetThresholdSchema,\n })\n .strict(),\n});\n// The two ways a session fails to happen at all, both of which spec §D8/§7 resolve the same way:\n// a HARD pause plus a question to the owner. Kept as one command with a discriminated reason\n// rather than two near-identical commands, because everything except the wording of the question\n// and one event is shared.\nexport const stageAttemptHardPauseReasonSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"CONTEXT_FLOOR_EXCEEDED\"),\n sessionOrdinal: z.number().int().positive(),\n requiredBytes: z.number().int().nonnegative(),\n budgetBytes: z.number().int().nonnegative(),\n budgetTokens: z.number().int().positive(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"PROVIDER_REJECTED_PACK\"),\n sessionOrdinal: z.number().int().positive(),\n })\n .strict(),\n // A provider failure that is not a size rejection. Kept apart from PROVIDER_REJECTED_PACK so a\n // transient error is never answered by shrinking the pack, and so the owner is not asked about\n // a context size that had nothing to do with it (spec §6.3 routes failures to existing handling).\n z\n .object({\n type: z.literal(\"PROVIDER_START_FAILED\"),\n sessionOrdinal: z.number().int().positive(),\n })\n .strict(),\n // The provider returned a contract-valid terminal object which the deterministic workflow\n // rejected (for example, Acceptance evidence did not bind to the recorded Review/QA checks).\n // Keep only the stable domain code: provider prose can contain repository text or secrets and\n // must not cross into owner-facing durable state through an error message.\n z\n .object({\n type: z.literal(\"PROVIDER_OUTCOME_REJECTED\"),\n sessionOrdinal: z.number().int().positive(),\n errorCode: z.string().trim().min(1).max(100),\n })\n .strict(),\n // The session loop's own backstop (spec §6.5). Not a way a session fails to happen, but the one\n // way the attempt stops without any session having failed: the provider kept handing off\n // productively and the attempt never finished. It resolves the same way as the others -- pause,\n // withdraw the dispatch, ask the owner -- because the alternative is a loop that logs and leaves\n // its dispatch PENDING for the drain to pick up again.\n z\n .object({\n type: z.literal(\"SESSION_LIMIT_REACHED\"),\n sessionOrdinal: z.number().int().positive(),\n maxSessions: z.number().int().positive(),\n })\n .strict(),\n]);\n// Spec §7's one automatic retry after a rejected pack. A command of its own rather than a flag on\n// END_PROVIDER_SESSION: the reduction is a durable state change on the StageAttempt with its own\n// audit event, and folding it into the session's end would hide it inside a command about\n// something else.\nexport const reduceContextPackShareCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REDUCE_CONTEXT_PACK_SHARE\"),\n payload: z.object({ stageAttemptId: opaqueIdSchema }).strict(),\n});\nexport const hardPauseStageAttemptCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"HARD_PAUSE_STAGE_ATTEMPT\"),\n payload: z\n .object({\n stageAttemptId: opaqueIdSchema,\n reason: stageAttemptHardPauseReasonSchema,\n })\n .strict(),\n});\nexport const pipelineStartedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PIPELINE_STARTED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n budgetPolicy: budgetPolicySchema,\n dispatch: workflowDispatchSchema,\n events: z.array(pipelineStartedEventSchema),\n})\n .strict();\nexport const workflowDispatchStartedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORKFLOW_DISPATCH_STARTED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema,\n events: z.array(stageAttemptChangedEventSchema),\n})\n .strict();\nconst providerOutcomeEventSchema = z.discriminatedUnion(\"type\", [\n providerSessionEndedEventSchema,\n stageAttemptChangedEventSchema,\n humanRequestOpenedEventSchema,\n usageRecordedEventSchema,\n budgetThresholdReachedEventSchema,\n pipelinePausedEventSchema,\n evidenceArtifactRecordedEventSchema,\n reviewReportRecordedEventSchema,\n reviewFindingRecordedEventSchema,\n reviewFindingResolvedEventSchema,\n reviewLoopExhaustedEventSchema,\n acceptanceRequestedEventSchema,\n pipelineCompletedEventSchema,\n]);\nexport const providerOutcomeAppliedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PROVIDER_OUTCOME_APPLIED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n usageRecords: z.array(usageRecordSchema),\n artifacts: z.array(evidenceArtifactSchema),\n acceptancePackage: acceptancePackageSchema.nullable(),\n // Present for a live terminal result that passed the adapter contract but was rejected by the\n // deterministic workflow. Optional keeps command receipts written before this field readable.\n outcomeRejectionCode: z.string().trim().min(1).max(100).nullable().optional(),\n events: z.array(providerOutcomeEventSchema),\n})\n .strict();\n/** Historical receipt shape retained only so append-only command records remain readable. */\nexport const legacyProviderOutcomeAppliedResultSchema = providerOutcomeAppliedResultSchema.extend({\n type: z.literal(\"MOCK_PROVIDER_OUTCOME_APPLIED\"),\n});\nexport const humanRequestAnsweredResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"HUMAN_REQUEST_ANSWERED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n request: humanRequestSchema,\n decision: decisionSchema,\n dispatch: workflowDispatchSchema.nullable(),\n events: z.array(z.discriminatedUnion(\"type\", [\n humanRequestResolvedEventSchema,\n stageAttemptChangedEventSchema,\n pipelineCancelledEventSchema,\n ])),\n})\n .strict();\nexport const qaCorrectionGateResolvedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"QA_CORRECTION_GATE_RESOLVED\"),\n replayed: z.boolean(),\n action: qaCorrectionGateActionSchema,\n workItemId: opaqueIdSchema,\n request: humanRequestSchema,\n decision: decisionSchema,\n previousCorrection: qaCorrectionRunSchema.nullable(),\n correctionRun: qaCorrectionRunSchema.nullable(),\n retestPlan: qaRetestPlanSchema.nullable(),\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema.nullable(),\n events: z.array(z.discriminatedUnion(\"type\", [\n humanRequestResolvedEventSchema,\n stageAttemptChangedEventSchema,\n qaCorrectionStartedEventSchema,\n qaCorrectionCancelledEventSchema,\n pipelineCancelledEventSchema,\n ])),\n})\n .strict();\nexport const verificationCorrectionGateResolvedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"VERIFICATION_CORRECTION_GATE_RESOLVED\"),\n replayed: z.boolean(),\n action: verificationCorrectionGateActionSchema,\n workItemId: opaqueIdSchema,\n request: humanRequestSchema,\n decision: decisionSchema,\n previousCorrection: verificationCorrectionRunSchema.nullable(),\n qaCorrection: qaCorrectionRunSchema.nullable().optional(),\n correctionRun: verificationCorrectionRunSchema.nullable(),\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema.nullable(),\n events: z.array(z.discriminatedUnion(\"type\", [\n humanRequestResolvedEventSchema,\n stageAttemptChangedEventSchema,\n verificationCorrectionSupersededEventSchema,\n verificationCorrectionStartedEventSchema,\n verificationCorrectionCancelledEventSchema,\n qaCorrectionCancelledEventSchema,\n pipelineCancelledEventSchema,\n ])),\n})\n .strict();\nexport const verificationStaleFailureMaterializedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"VERIFICATION_STALE_FAILURE_MATERIALIZED\"),\n replayed: z.boolean(),\n action: z.enum([\"START_CORRECTION\", \"WAIT_FOR_OWNER\"]),\n workItemId: opaqueIdSchema,\n failure: verificationFailureSchema,\n correctionRun: verificationCorrectionRunSchema.nullable(),\n request: humanRequestSchema.nullable(),\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema.nullable(),\n events: z.array(z.discriminatedUnion(\"type\", [\n verificationFailureRecordedEventSchema,\n stageAttemptChangedEventSchema,\n verificationCorrectionStartedEventSchema,\n humanRequestOpenedEventSchema,\n ])),\n})\n .strict()\n .superRefine((result, context) => {\n const starts = result.action === \"START_CORRECTION\";\n if (starts !== (result.correctionRun !== null) ||\n starts !== (result.dispatch !== null) ||\n starts === (result.request !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"A stale verification result must expose exactly one correction or owner-gate continuation\",\n });\n }\n});\nconst pipelineControlEventSchema = z.discriminatedUnion(\"type\", [\n pipelinePausedEventSchema,\n pipelineResumedEventSchema,\n pipelineCancelledEventSchema,\n qaCorrectionCancelledEventSchema,\n verificationCorrectionCancelledEventSchema,\n]);\nexport const pipelineControlAppliedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PIPELINE_CONTROL_APPLIED\"),\n replayed: z.boolean(),\n action: z.enum([\"PAUSE\", \"RESUME\", \"CANCEL\"]),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema.nullable(),\n events: z.array(pipelineControlEventSchema),\n})\n .strict();\nexport const budgetOverrideApprovedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"BUDGET_OVERRIDE_APPROVED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n previousStageAttempt: stageAttemptSchema,\n stageAttempt: stageAttemptSchema,\n budgetPolicy: budgetPolicySchema,\n dispatch: workflowDispatchSchema,\n events: z.array(budgetOverrideApprovedEventSchema),\n})\n .strict();\nexport const workflowsReconciledResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"WORKFLOWS_RECONCILED\"),\n replayed: z.boolean(),\n recoveryReports: z.array(recoveryReportSchema),\n // Spec §6.4 makes a daemon restart the ordinary end of a ProviderSession, so reconciliation\n // now closes orphaned sessions as well as orphaned dispatches and reports both kinds of event.\n interruptedSessions: z.array(providerSessionSchema),\n interruptedVerificationRuns: z.array(verificationRunSchema).default([]),\n interruptedWorkspaceToolCalls: z.array(workspaceToolCallRecordSchema).default([]),\n // Task 10 (spec §6, \"Восстановление\"): every READY workspace whose worktree directory was\n // found gone or prunable at this startup, now moved to ORPHANED. Never a resurrection (AD-008)\n // -- nothing here recreates a workspace or touches the branch it leaves behind (D12).\n orphanedWorkspaces: z.array(workItemWorkspaceSchema),\n events: z.array(z.discriminatedUnion(\"type\", [\n recoveryReportCreatedEventSchema,\n providerSessionEndedEventSchema,\n verificationRunInterruptedEventSchema,\n verificationFailureRecordedEventSchema,\n stageAttemptChangedEventSchema,\n verificationCorrectionStartedEventSchema,\n verificationCorrectionSupersededEventSchema,\n humanRequestOpenedEventSchema,\n workItemWorkspaceOrphanedEventSchema,\n workspaceToolCallChangedEventSchema,\n ])),\n})\n .strict();\nconst acceptanceResolutionEventSchema = z.discriminatedUnion(\"type\", [\n humanRequestResolvedEventSchema,\n acceptanceResolvedEventSchema,\n pipelineCompletedEventSchema,\n]);\nexport const acceptanceResolvedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"ACCEPTANCE_RESOLVED\"),\n replayed: z.boolean(),\n action: acceptanceActionSchema,\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n acceptancePackage: acceptancePackageSchema,\n request: humanRequestSchema,\n decision: decisionSchema,\n events: z.array(acceptanceResolutionEventSchema),\n})\n .strict();\nexport const providerSessionStartedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PROVIDER_SESSION_STARTED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n session: providerSessionSchema,\n recipe: contextPackRecipeSchema,\n mcpSnapshots: z.array(mcpSessionSnapshotSchema).max(64).default([]),\n events: z.array(providerSessionStartedEventSchema),\n})\n .strict();\n// A pid is current state, not a business event -- nothing an owner reads through the audit log\n// needs to know which OS process a session used, only that reconciliation can find it. Every other\n// command result in this union carries `events`; this one keeps the field for shape uniformity but\n// types it `z.array(z.never())`, which only the empty array can ever satisfy, so the schema itself\n// states that this command never produces one rather than leaving `[]` looking like an omission.\nexport const providerSessionProcessRecordedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PROVIDER_SESSION_PROCESS_RECORDED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n session: providerSessionSchema,\n events: z.array(z.never()),\n})\n .strict();\nexport const providerUsageRecordedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PROVIDER_USAGE_RECORDED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n report: providerUsageReportSchema,\n usageRecord: usageRecordSchema.nullable(),\n cumulativeAmount: z.number().int().nonnegative(),\n hardPaused: z.boolean(),\n stageAttempt: stageAttemptSchema,\n events: z.array(z.discriminatedUnion(\"type\", [\n usageRecordedEventSchema,\n budgetThresholdReachedEventSchema,\n stageAttemptChangedEventSchema,\n pipelinePausedEventSchema,\n ])),\n})\n .strict();\nexport const checkpointPublishedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"CHECKPOINT_PUBLISHED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n checkpoint: checkpointSchema,\n events: z.array(checkpointPublishedEventSchema),\n})\n .strict();\n// Ending a session is never only a session-level write: spec §6.5 makes the unproductive-session\n// counter part of the same transaction, and the second unproductive session in a row also pauses\n// the run and opens a question to the owner. `nextSessionOrdinal` is the caller-facing answer to\n// \"does another session follow?\" -- null covers both \"the stage finished\" and \"the attempt was\n// hard-paused\", which the caller distinguishes by `stageAttempt.status`.\nexport const providerSessionEndedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"PROVIDER_SESSION_ENDED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n session: providerSessionSchema,\n stageAttempt: stageAttemptSchema,\n request: humanRequestSchema.nullable(),\n nextSessionOrdinal: z.number().int().positive().nullable(),\n events: z.array(z.discriminatedUnion(\"type\", [\n providerSessionEndedEventSchema,\n stageAttemptChangedEventSchema,\n pipelinePausedEventSchema,\n humanRequestOpenedEventSchema,\n ])),\n})\n .strict();\nexport const contextHandoffRequestedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"CONTEXT_HANDOFF_REQUESTED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n session: providerSessionSchema,\n // False when the threshold had already been crossed, or the session had already ended: the\n // caller uses it to decide whether to actually ask the adapter to wind down and to arm the\n // deadline, so a repeated occupancy report does neither twice.\n requested: z.boolean(),\n events: z.array(contextHandoffRequestedEventSchema),\n})\n .strict();\nexport const contextPackShareReducedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"CONTEXT_PACK_SHARE_REDUCED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n stageAttempt: stageAttemptSchema,\n events: z.array(stageAttemptChangedEventSchema),\n})\n .strict();\nexport const stageAttemptHardPausedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n type: z.literal(\"STAGE_ATTEMPT_HARD_PAUSED\"),\n replayed: z.boolean(),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n request: humanRequestSchema,\n events: z.array(z.discriminatedUnion(\"type\", [\n contextFloorExceededEventSchema,\n stageAttemptChangedEventSchema,\n pipelinePausedEventSchema,\n humanRequestOpenedEventSchema,\n ])),\n})\n .strict();\nexport const startPipelineRequestSchema = z\n .object({\n orchestration: codeBlindOrchestrationSchema.optional(),\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n // Optional only for API compatibility with the Phase 0 client. The current Task Cockpit always\n // sends both values so the owner sees the cost policy before launch.\n maxEstimatedTokens: z.number().int().positive().optional(),\n modelTierOverride: modelTierSchema.nullable().optional(),\n agentRunMaxEstimatedTokensOverride: z.number().int().positive().nullable().optional(),\n})\n .strict();\nexport const answerHumanRequestRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n answer: humanRequestAnswerSchema,\n})\n .strict();\nexport const resolveQACorrectionGateRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedRequestVersion: z.number().int().positive(),\n correctionRunId: opaqueIdSchema.nullable(),\n expectedCorrectionVersion: z.number().int().positive().nullable(),\n expectedPipelineRunVersion: z.number().int().positive(),\n action: qaCorrectionGateActionSchema,\n})\n .strict()\n .refine(({ correctionRunId, expectedCorrectionVersion }) => (correctionRunId === null) === (expectedCorrectionVersion === null), \"A QA correction ID and expected version must be supplied together\");\nexport const pipelineControlRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const budgetOverrideRequestSchema = pipelineControlRequestSchema.extend({\n maxEstimatedTokens: z.number().int().positive(),\n modelTierOverride: modelTierSchema.nullable().optional(),\n agentRunMaxEstimatedTokensOverride: z.number().int().positive().nullable().optional(),\n});\nexport const resolveAcceptanceRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n expectedRunVersion: z.number().int().positive(),\n action: acceptanceActionSchema,\n reason: descriptionSchema.nullable().default(null),\n})\n .strict();\nexport const workflowSnapshotSchema = z\n .object({\n orchestration: codeBlindOrchestrationSchema.optional(),\n schemaVersion: schemaVersionSchema,\n run: pipelineRunSchema.nullable(),\n stageAttempts: z.array(stageAttemptSchema),\n humanRequests: z.array(humanRequestSchema),\n decisions: z.array(decisionSchema),\n budgetPolicies: z.array(budgetPolicySchema),\n usageRecords: z.array(usageRecordSchema),\n recoveryReports: z.array(recoveryReportSchema),\n artifacts: z.array(evidenceArtifactSchema),\n acceptancePackage: acceptancePackageSchema.nullable(),\n})\n .strict();\nexport const humanRequestsResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, humanRequests: z.array(humanRequestSchema) })\n .strict();\n// Spec §D5's nesting, read back for the Task Cockpit (Task 12). Kept out of workflowSnapshotSchema\n// deliberately, matching persistence-sqlite's LIST_PROVIDER_SESSIONS: the snapshot is fetched on\n// every board render, and an attempt's session history grows without bound.\n// `peakContextWindowUsage` is keyed by ProviderSession id and carries the highest occupancy each\n// session has been observed at (spec §6.2 -- occupancy is saved on every report, not only the one\n// that crosses the handoff threshold, and the highest of them is what is kept). Deliberately the\n// peak and not the current reading: it answers \"how full did this session get\", which is what\n// explains a cut, and it does not move under a provider that compacts its own window. A session\n// with no entry has never had its window measured, which is not the same as one measured at zero.\n// For a session that asked to wind down the figure is the reading at handoff rather than the true\n// peak, because reporting stops there -- see the note in packages/persistence-sqlite/src/types.ts.\n// The cockpit labels that case \"at handoff\" and never as a peak, so the wording stays honest.\nexport const providerSessionsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sessions: z.array(providerSessionSchema),\n checkpoints: z.array(checkpointSchema),\n usageReports: z.array(providerUsageReportSchema),\n peakContextWindowUsage: z.record(opaqueIdSchema, contextWindowUsageSchema),\n})\n .strict();\n// The daemon runs a single provider adapter for its whole lifetime, so this describes \"the provider\n// a session would run on right now\" rather than a per-session fact. Still a trimmed projection of\n// the full ProviderCapabilities shape provider-core owns -- apps/web has no reason to depend on\n// that package -- but it now carries the three fields milestone A2 added and never propagated:\n// without them the owner cannot see which stages the selected adapter serves, or that its CLI is\n// missing from this machine, until a dispatch is refused.\nexport const providerCapabilitiesResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n provider: z.string().trim().min(1).max(50),\n // `capabilities().start`: whether the adapter's CLI was found on this machine at all. A\n // separate claim from `stages` -- an adapter declares what it would serve if it could run, and\n // this says whether it currently can.\n start: z.boolean(),\n stages: z.array(workflowStageSchema).min(1).max(20),\n checkpointOnRequest: z.boolean(),\n contextWindowReporting: z.boolean(),\n costReporting: z.boolean(),\n tokenBudgetEnforcement: providerTokenBudgetEnforcementSchema,\n canReportRateLimits: z.boolean().default(false),\n})\n .strict();\n//# sourceMappingURL=workflow.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { providerTokenBudgetEnforcementSchema, workflowStageSchema } from \"./workflow.js\";\n// MOCK remains a readable historical ProviderId in append-only audit records, but it is no longer\n// an active Project preference. New selection can target only the two official local CLI adapters.\nexport const liveProviderIdSchema = z.enum([\"CODEX\", \"CLAUDE_CODE\"]);\nexport const providerPreferenceSchema = z.enum([\"AUTO\", ...liveProviderIdSchema.options]);\nexport const projectProviderSelectionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n preference: providerPreferenceSchema,\n projectVersion: z.number().int().positive(),\n updatedAt: utcTimestampSchema,\n})\n .strict();\nexport const providerAuthenticationSchema = z.enum([\"AUTHENTICATED\", \"REQUIRED\", \"UNKNOWN\"]);\nexport const providerCompatibilitySchema = z.enum([\n \"BUILT_IN\",\n \"MISSING\",\n \"UNLAUNCHABLE\",\n \"VERSION_UNREADABLE\",\n \"TOO_OLD\",\n \"VERIFIED\",\n \"UNVERIFIED\",\n]);\nexport const providerSelectionSourceSchema = z.enum([\"AUTO\", \"PROJECT_PREFERENCE\", \"ENVIRONMENT_OVERRIDE\"]);\nexport const providerFallbackReasonSchema = z\n .enum([\"NO_READY_LIVE_PROVIDER\", \"LIVE_PROVIDER_UNAVAILABLE\"])\n .nullable();\nexport const providerModelIdSchema = z\n .string()\n .min(1)\n .max(200)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/);\nexport const providerModelMappingSchema = z\n .object({\n FAST: providerModelIdSchema,\n STANDARD: providerModelIdSchema,\n DEEP: providerModelIdSchema,\n})\n .strict();\nexport const providerAvailabilitySchema = z\n .object({\n provider: liveProviderIdSchema,\n installed: z.boolean(),\n authentication: providerAuthenticationSchema,\n version: z.string().min(1).max(48).nullable(),\n compatibility: providerCompatibilitySchema,\n ready: z.boolean(),\n stages: z.array(workflowStageSchema).min(1).max(20),\n checkpointOnRequest: z.boolean(),\n contextWindowReporting: z.boolean(),\n costReporting: z.boolean(),\n tokenBudgetEnforcement: providerTokenBudgetEnforcementSchema,\n canReportRateLimits: z.boolean().default(false),\n models: providerModelMappingSchema.nullable(),\n})\n .strict()\n .superRefine((availability, context) => {\n if (availability.models === null) {\n context.addIssue({ code: \"custom\", message: \"A real provider must expose its model mapping\" });\n }\n if (availability.compatibility === \"BUILT_IN\") {\n if (!availability.installed ||\n availability.version !== null ||\n availability.ready !== (availability.authentication === \"AUTHENTICATED\")) {\n context.addIssue({\n code: \"custom\",\n message: \"A built-in adapter is ready exactly when its credential is configured\",\n });\n }\n return;\n }\n if (!availability.installed && availability.compatibility !== \"MISSING\") {\n context.addIssue({ code: \"custom\", message: \"A missing live provider must report MISSING\" });\n }\n const reportsVersion = [\"TOO_OLD\", \"VERIFIED\", \"UNVERIFIED\"].includes(availability.compatibility);\n if (reportsVersion !== (availability.version !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Live provider version presence must match its compatibility state\",\n });\n }\n if (availability.authentication !== \"UNKNOWN\" &&\n (!availability.installed || availability.version === null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Authentication is observed only for an installed, versioned live provider target\",\n });\n }\n if (availability.ready !==\n (availability.installed &&\n availability.compatibility === \"VERIFIED\" &&\n availability.authentication === \"AUTHENTICATED\")) {\n context.addIssue({\n code: \"custom\",\n message: \"Live provider readiness must match install, compatibility and auth state\",\n });\n }\n});\nexport const projectProviderSelectionResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n selection: projectProviderSelectionSchema,\n effectiveProvider: liveProviderIdSchema,\n source: providerSelectionSourceSchema,\n fallbackReason: providerFallbackReasonSchema,\n environmentOverride: liveProviderIdSchema.nullable(),\n environmentOverrideLocked: z.boolean(),\n environmentOverrideInvalid: z.boolean(),\n providers: z.array(providerAvailabilitySchema).length(2),\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const projectProviderPreferenceChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_PROVIDER_PREFERENCE_CHANGED\"),\n data: z\n .object({\n selection: projectProviderSelectionSchema,\n previousPreference: providerPreferenceSchema,\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const setProjectProviderPreferenceCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"SET_PROJECT_PROVIDER_PREFERENCE\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n preference: providerPreferenceSchema,\n })\n .strict(),\n});\nexport const projectProviderPreferenceChangedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"PROJECT_PROVIDER_PREFERENCE_CHANGED\"),\n selection: projectProviderSelectionSchema,\n event: projectProviderPreferenceChangedEventSchema,\n})\n .strict();\nexport const setProjectProviderPreferenceRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n preference: providerPreferenceSchema,\n})\n .strict();\nexport const refreshProviderAvailabilityRequestSchema = z\n .object({ schemaVersion: schemaVersionSchema })\n .strict();\n//# sourceMappingURL=provider-selection.js.map","import { z } from \"zod\";\nimport { liveProviderIdSchema } from \"./provider-selection.js\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { workflowStageSchema } from \"./workflow.js\";\nimport { workspaceToolFailureCodeSchema } from \"./workspace-tool.js\";\n/**\n * What a provider adapter reports about one action it took.\n *\n * Bounded and `.strict()` on purpose: this crosses the boundary from untrusted process output into\n * Loomrail, so a field added later fails to parse rather than riding along. It carries no\n * authority -- `git diff` and measured verification remain the source of truth about what changed.\n */\nexport const providerActivityKindSchema = z.enum([\n \"TOOL_CALL\",\n \"AGENT_TEXT\",\n \"FILE_CHANGE\",\n \"PROVIDER_ERROR\",\n]);\n// Exported so a parser building an actionKey from provider-controlled input (e.g. a Claude Code\n// text block keyed off the line's own uuid/message.id) can check its own bound before handing the\n// entry to this schema, instead of duplicating the literal and risking the two drifting apart.\nexport const MAX_ACTION_KEY_LENGTH = 200;\nexport const providerActivityEntrySchema = z\n .object({\n // The provider's own identifier for the action, so a terminal report updates the record the\n // starting one created instead of appending a second row for the same action.\n actionKey: z.string().trim().min(1).max(MAX_ACTION_KEY_LENGTH),\n kind: providerActivityKindSchema,\n label: z.string().trim().min(1).max(500).nullable(),\n detail: z.string().trim().min(1).max(2_000).nullable(),\n status: z.string().trim().min(1).max(120).nullable(),\n terminal: z.boolean(),\n // True when any text on this entry was cut to fit its bound. Silent truncation would let a\n // reader mistake a fragment for the whole thing.\n truncated: z.boolean(),\n})\n .strict();\n/**\n * Where an entry came from, and therefore how much it is worth.\n *\n * `DAEMON_AUDITED` passed through the daemon-owned gateway and is recorded in append-only\n * `workspace_tool_calls`. `PROVIDER_REPORTED` is the provider's account of itself: unverified,\n * prunable, and never evidence. Computed by the reader from the source table, never accepted from\n * a provider.\n */\nexport const activityOriginSchema = z.enum([\"DAEMON_AUDITED\", \"PROVIDER_REPORTED\"]);\nexport const agentRunActivityEntrySchema = z\n .object({\n // The only identity that holds across the merged feed. `seq` below does not: it is monotonic\n // per *origin* within one *run*, not across the page, so two entries from different sources --\n // or from two different runs of the same source -- legitimately share a `seq` value. The cursor\n // is `(at, origin, id)` for the same reason -- never `seq` alone.\n id: z.string().min(1),\n // Monotonic within a run's own source but NOT dense: eviction leaves gaps on the reported side,\n // and a reader that treats a missing number as a defect would report every long run as broken.\n // Not unique across a merged page -- an audited entry and a reported entry can both be `seq: 1`,\n // one counting its own source's rows, the other counting the other source's. Use `id` for\n // identity and `(at, origin, id)` for ordering; never key UI rows on `seq` alone.\n seq: z.number().int().positive(),\n at: z.iso.datetime(),\n origin: activityOriginSchema,\n provider: z.enum([\"CODEX\", \"CLAUDE_CODE\"]),\n kind: providerActivityKindSchema,\n label: z.string().max(500).nullable(),\n detail: z.string().max(2_000).nullable(),\n status: z.string().max(120).nullable(),\n // Bare, matching `status` and `label` above -- both already read as opaque i18n lookup keys\n // (`workspaceTool.status.*`), never parsed for embedded structure. `null` for a\n // PROVIDER_REPORTED entry (the table this reads from has no such column) and for a\n // DAEMON_AUDITED entry that did not fail.\n failureCode: workspaceToolFailureCodeSchema.nullable(),\n truncated: z.boolean(),\n // Which run produced this entry. The feed spans a WorkItem's runs, so the reader groups by\n // this and names the group with `stage`; without it a reader cannot tell one run's actions\n // from the next run's, and the two can be minutes apart or days.\n agentRunId: z.string().min(1),\n stage: workflowStageSchema,\n // No run NUMBER travels with the entry, deliberately. An earlier cut carried\n // `agent_runs.ordinal` so a reader could head each group \"Run N\", on the premise that the\n // number distinguishes two adjacent groups of the same stage. It does not: `agent_runs.ordinal`\n // is `UNIQUE (stage_attempt_id, ordinal)`, so a stage RETRY opens a new StageAttempt whose first\n // AgentRun is ordinal 1 again -- two adjacent groups for two attempts of the same stage would\n // both read \"Run 1\", which is the very indistinguishability the number was added to prevent. A\n // number that repeats across different runs is worse than none, and the groups are already\n // ordered by their entries' own timestamps, so the heading carries `stage` alone.\n})\n .strict();\nexport const agentRunActivityPageSchema = z\n .object({\n entries: z.array(agentRunActivityEntrySchema).max(200),\n // Opaque: the client hands it back and never parses it. The merged feed has two sources, so a\n // single table's row number cannot address a position in it.\n nextCursor: z.string().min(1).nullable(),\n omittedCount: z.number().int().nonnegative(),\n degraded: z.boolean(),\n // \"This page may be incomplete\", from either of two causes the client cannot tell apart and\n // does not need to: the cursor named a position no longer held, so the page restarted from the\n // oldest entry still there; or a source returned its entire read-ahead and the page still ended\n // with no `nextCursor`, where \"nothing more\" is a claim the read cannot support. Either way the\n // client says the list may be incomplete instead of showing a silent hole. Never set on a first\n // page: with no cursor the page starts at index 0, so a source big enough to trip the second\n // cause always leaves more rows than fit and `nextCursor` is non-null.\n gap: z.boolean(),\n})\n .strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nconst commandResultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n})\n .strict();\n/**\n * Records one action a provider reported taking against a running AgentRun.\n *\n * `projectId`/`workItemId` are deliberately absent from the payload: `agent_runs` already holds\n * both and is the single source, so the persistence layer derives them from `agentRunId` inside the\n * write transaction rather than trusting a second, potentially divergent copy carried here.\n */\nexport const recordAgentRunActivityCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_AGENT_RUN_ACTIVITY\"),\n payload: z\n .object({\n agentRunId: opaqueIdSchema,\n providerSessionId: opaqueIdSchema,\n provider: liveProviderIdSchema,\n entry: providerActivityEntrySchema,\n })\n .strict(),\n});\n// No `event` field: the activity feed is not domain history, so recording an entry never appends\n// to the append-only Event vocabulary. `entryId`/`seq` identify the row this write touched --\n// either a freshly created one or the one its matching start already created -- and\n// `omittedCount`/`degraded` echo the run's current buffer counters so a caller never has to issue a\n// second read just to see them.\nexport const agentRunActivityRecordedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_ACTIVITY_RECORDED\"),\n entryId: opaqueIdSchema,\n seq: z.number().int().positive(),\n omittedCount: z.number().int().nonnegative(),\n degraded: z.boolean(),\n});\n/**\n * Marks an AgentRun's activity feed degraded, as its own short command rather than a side effect of\n * RECORD_AGENT_RUN_ACTIVITY: when the recorder fails to write an entry, that write's transaction has\n * already rolled back, so it cannot also record its own failure. A separate command with its own\n * transaction is what lets the degradation survive that rollback -- issued the moment the failure\n * first happens, and again at session end as a backstop.\n *\n * Idempotent by design: marking an already-degraded run again must succeed and change nothing, since\n * the backstop call is the ordinary path, not an error.\n */\nexport const markAgentRunActivityDegradedCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"MARK_AGENT_RUN_ACTIVITY_DEGRADED\"),\n payload: z\n .object({\n agentRunId: opaqueIdSchema,\n })\n .strict(),\n});\n// No `event`, same reasoning as AGENT_RUN_ACTIVITY_RECORDED above: the activity feed carries no\n// authority, so marking it degraded does not enter the append-only Event vocabulary either.\nexport const agentRunActivityDegradedMarkedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_ACTIVITY_DEGRADED_MARKED\"),\n agentRunId: opaqueIdSchema,\n});\n/**\n * SD-004's 30-day sweep for `agent_run_activity`: bounded per call by `limit`, and per call means\n * per orchestrator batch, not per row, so this deletes a whole page of expired entries (and any\n * `agent_run_activity_state` counters row a page just emptied) in one short transaction rather than\n * apps/daemon issuing one command per row the way RECORD_QA_ATTACHMENT_RETENTION does for files.\n *\n * That precedent needs a per-row command because deleting a file is neither idempotent nor visible\n * from the database, so it records an outcome per attachment to avoid re-attempting or re-counting\n * one on a retry. A row delete carries neither problem: the row's own absence on a later sweep IS\n * the record, so this command needs no retention log and no per-row identity in its payload --\n * `closedBefore`/`limit` describe the same bounded page apps/daemon just read with\n * LIST_EXPIRED_AGENT_RUN_ACTIVITY_ENTRIES, not a list of ids to thread through a hand-built SQL\n * `IN (?, ?, ...)` -- the pattern `selectLatestAgentRunActivity`'s own doc comment in\n * packages/persistence-sqlite calls out as worth avoiding.\n */\nexport const deleteExpiredAgentRunActivityCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"DELETE_EXPIRED_AGENT_RUN_ACTIVITY\"),\n payload: z\n .object({\n closedBefore: utcTimestampSchema,\n limit: z.number().int().min(1).max(1_000),\n })\n .strict(),\n});\n// No `event`: same reasoning as AGENT_RUN_ACTIVITY_RECORDED -- this table carries no authority, so\n// pruning it does not enter the append-only Event vocabulary either.\nexport const agentRunActivityRetentionAppliedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_ACTIVITY_RETENTION_APPLIED\"),\n entriesDeleted: z.number().int().nonnegative(),\n stateRowsDeleted: z.number().int().nonnegative(),\n});\n//# sourceMappingURL=activity.js.map","import { z } from \"zod\";\nimport { coordinatorModelId, coordinatorProfileId, economyModelIds, stageExecutionPolicySchema, } from \"./orchestration.js\";\nimport { activityOriginSchema } from \"./activity.js\";\nimport { providerModelIdSchema, providerPreferenceSchema } from \"./provider-selection.js\";\nimport { modelTierSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema } from \"./shared.js\";\nimport { contextSectionIdSchema, providerIdSchema, workflowStageSchema } from \"./workflow.js\";\nexport const agentRoleSchema = z.enum([\n \"LEAD_PM\",\n \"PRODUCT_ANALYST\",\n \"SOFTWARE_ARCHITECT\",\n \"DEVELOPER\",\n \"CODE_REVIEWER\",\n \"BROWSER_QA\",\n \"ACCEPTANCE_MANAGER\",\n]);\nexport { modelTierSchema } from \"./shared.js\";\nexport const agentProfileProvenanceSchema = z.enum([\"BUILTIN\", \"PROJECT\"]);\nexport const agentCapabilitySchema = z.enum([\n \"ARTIFACT_WRITE\",\n \"REPOSITORY_READ\",\n \"REPOSITORY_WRITE\",\n \"NETWORK\",\n \"MCP_READ\",\n \"BROWSER_READ\",\n]);\nexport const agentArtifactKindSchema = z.enum([\n \"DISCOVERY_BRIEF\",\n \"OPEN_QUESTION_SET\",\n \"ARCHITECTURE_PROPOSAL\",\n \"TASK_GRAPH\",\n \"CHANGE_SET\",\n \"TEST_REPORT\",\n \"FINDING_SET\",\n \"QA_EVIDENCE_BUNDLE\",\n \"ACCEPTANCE_PACKAGE\",\n]);\nconst boundedTextSchema = z.string().trim().min(1).max(2_000);\nconst shortTextSchema = z.string().trim().min(1).max(200);\nexport const rolePlaybookSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n preferredContextSections: z.array(contextSectionIdSchema).max(20),\n})\n .strict();\nexport const agentProfileSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n revision: z.number().int().positive(),\n name: shortTextSchema,\n role: agentRoleSchema,\n identity: boundedTextSchema,\n mission: boundedTextSchema,\n nonGoals: z.array(boundedTextSchema).max(20),\n stages: z.array(workflowStageSchema).min(1).max(6),\n expectedInputs: z.array(shortTextSchema).max(20),\n expectedOutputs: z.array(agentArtifactKindSchema).min(1).max(20),\n allowedCapabilities: z.array(agentCapabilitySchema).max(20),\n successRubric: z.array(boundedTextSchema).min(1).max(20),\n escalationConditions: z.array(boundedTextSchema).min(1).max(20),\n handoffContract: boundedTextSchema,\n defaultProvider: providerPreferenceSchema,\n defaultModelTier: modelTierSchema,\n budgetEnvelope: z\n .object({\n maxEstimatedTokens: z.number().int().positive(),\n maxProviderSessions: z.number().int().positive().max(50),\n })\n .strict(),\n playbook: rolePlaybookSchema,\n provenance: agentProfileProvenanceSchema,\n})\n .strict();\nexport const agentProfileRefSchema = agentProfileSchema\n .pick({ id: true, revision: true, role: true })\n .strict();\nexport const squadStageAssignmentSchema = z\n .object({\n stage: workflowStageSchema,\n profile: agentProfileRefSchema,\n execution: stageExecutionPolicySchema.optional(),\n})\n .strict()\n .superRefine((assignment, context) => {\n if ((assignment.profile.id === coordinatorProfileId) !==\n (assignment.execution?.kind === \"CODE_BLIND_MANAGER\") ||\n (assignment.execution?.kind === \"CODE_BLIND_MANAGER\" && assignment.stage !== \"PLAN\")) {\n context.addIssue({ code: \"custom\", message: \"Coordinator profile and PLAN execution must match\" });\n }\n});\nexport const squadAssignmentSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n revision: z.number().int().positive(),\n stages: z.array(squadStageAssignmentSchema).min(1).max(6),\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((assignment, context) => {\n if (!assignment.stages.some(({ execution }) => execution !== undefined))\n return;\n if (assignment.stages.length !== 6 ||\n new Set(assignment.stages.map(({ stage }) => stage)).size !== 6 ||\n assignment.stages.some(({ stage, execution }) => execution?.kind !== (stage === \"PLAN\" ? \"CODE_BLIND_MANAGER\" : \"ECONOMY_WORKER\"))) {\n context.addIssue({\n code: \"custom\",\n message: \"Code-blind squads require exactly one manager and all five economy worker stages\",\n });\n }\n});\nexport const agentRunStatusSchema = z.enum([\n \"RUNNING\",\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"INTERRUPTED\",\n \"WAITING_HUMAN\",\n \"SOFT_PAUSED\",\n \"HARD_PAUSED\",\n]);\nexport const agentRunClaimLimitsSchema = z\n .object({\n global: z.number().int().min(0).max(32),\n project: z.number().int().min(0).max(32),\n provider: z.number().int().min(0).max(32),\n})\n .strict();\nexport const agentRunWorkspacePolicySchema = z\n .object({\n access: z.enum([\"NONE\", \"READ_ONLY\", \"READ_WRITE\"]),\n networkAccess: z.boolean(),\n})\n .strict();\nexport const agentRunPolicySnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n execution: stageExecutionPolicySchema.optional(),\n assignment: z.object({ id: opaqueIdSchema, revision: z.number().int().positive() }).strict(),\n profile: agentProfileRefSchema,\n provider: providerIdSchema,\n effectiveCapabilities: z.array(agentCapabilitySchema).max(6),\n modelTier: modelTierSchema,\n // Optional only for snapshots written before exact provider-model binding. New live AgentRuns\n // persist the validated adapter model ID; historical pre-API records persist explicit null.\n modelId: providerModelIdSchema.nullable().optional(),\n // Optional only for policy snapshots written before the Constitution binding existed. New\n // AgentRuns always write either the exact immutable content reference or explicit null.\n projectConstitution: z\n .object({\n id: opaqueIdSchema,\n version: z.number().int().positive(),\n contentDigest: z.string().regex(/^[0-9a-f]{64}$/),\n })\n .strict()\n .nullable()\n .optional(),\n claimLimits: agentRunClaimLimitsSchema,\n budget: z\n .object({\n pipelinePolicyId: opaqueIdSchema,\n pipelinePolicyRevision: z.number().int().positive(),\n maxEstimatedTokens: z.number().int().positive(),\n maxProviderSessions: z.number().int().positive().max(50),\n })\n .strict(),\n workspace: agentRunWorkspacePolicySchema,\n mcpProfileRevisionIds: z.array(opaqueIdSchema).max(64),\n})\n .strict()\n .superRefine((snapshot, context) => {\n const manager = snapshot.execution?.kind === \"CODE_BLIND_MANAGER\";\n if (manager !== (snapshot.profile.id === coordinatorProfileId)) {\n context.addIssue({ code: \"custom\", message: \"Coordinator execution must match the immutable profile\" });\n }\n if (manager &&\n (snapshot.provider !== \"CODEX\" ||\n snapshot.modelId !== coordinatorModelId ||\n snapshot.modelTier !== \"DEEP\" ||\n snapshot.projectConstitution !== null ||\n snapshot.effectiveCapabilities.length !== 1 ||\n snapshot.effectiveCapabilities[0] !== \"ARTIFACT_WRITE\" ||\n snapshot.workspace.access !== \"NONE\" ||\n snapshot.workspace.networkAccess ||\n snapshot.mcpProfileRevisionIds.length !== 0)) {\n context.addIssue({ code: \"custom\", message: \"Code-blind manager authority or model mismatch\" });\n }\n if (manager && (snapshot.budget.maxEstimatedTokens > 12_000 || snapshot.budget.maxProviderSessions > 2)) {\n context.addIssue({ code: \"custom\", message: \"Coordinator budget cannot exceed its bounded profile\" });\n }\n if (snapshot.execution?.kind === \"ECONOMY_WORKER\" &&\n (snapshot.provider === \"MOCK\" ||\n snapshot.modelId !== economyModelIds[snapshot.provider] ||\n snapshot.modelTier !== (snapshot.provider === \"CODEX\" ? \"FAST\" : \"STANDARD\"))) {\n context.addIssue({ code: \"custom\", message: \"Economy worker must use its exact provider model\" });\n }\n const capabilities = new Set(snapshot.effectiveCapabilities);\n if (capabilities.size !== snapshot.effectiveCapabilities.length) {\n context.addIssue({ code: \"custom\", message: \"Effective capabilities must be unique\" });\n }\n if (capabilities.has(\"REPOSITORY_WRITE\") && !capabilities.has(\"REPOSITORY_READ\")) {\n context.addIssue({ code: \"custom\", message: \"Repository write requires repository read\" });\n }\n const expectedAccess = capabilities.has(\"REPOSITORY_WRITE\")\n ? \"READ_WRITE\"\n : capabilities.has(\"REPOSITORY_READ\")\n ? \"READ_ONLY\"\n : \"NONE\";\n if (snapshot.workspace.access !== expectedAccess) {\n context.addIssue({ code: \"custom\", message: \"Workspace access must match effective capabilities\" });\n }\n if (snapshot.workspace.networkAccess !== capabilities.has(\"NETWORK\")) {\n context.addIssue({ code: \"custom\", message: \"Network access must match effective capabilities\" });\n }\n if (new Set(snapshot.mcpProfileRevisionIds).size !== snapshot.mcpProfileRevisionIds.length) {\n context.addIssue({ code: \"custom\", message: \"MCP profile revisions must be unique\" });\n }\n if (capabilities.has(\"MCP_READ\") !== snapshot.mcpProfileRevisionIds.length > 0) {\n context.addIssue({ code: \"custom\", message: \"MCP read requires an exact non-empty revision set\" });\n }\n});\nexport const agentRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n ordinal: z.number().int().positive(),\n squadAssignmentId: opaqueIdSchema,\n profile: agentProfileRefSchema,\n provider: providerIdSchema,\n status: agentRunStatusSchema,\n policySnapshot: agentRunPolicySnapshotSchema.nullable().default(null),\n policySnapshotHash: z.string().regex(/^sha256:[0-9a-f]{64}$/),\n startedAt: utcTimestampSchema,\n finishedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n if ((run.status === \"RUNNING\") !== (run.finishedAt === null)) {\n context.addIssue({\n code: \"custom\",\n message: \"A running AgentRun must not be finished and every non-running AgentRun must be finished\",\n });\n }\n if (run.policySnapshot !== null &&\n (run.policySnapshot.assignment.id !== run.squadAssignmentId ||\n run.policySnapshot.profile.id !== run.profile.id ||\n run.policySnapshot.profile.revision !== run.profile.revision ||\n run.policySnapshot.profile.role !== run.profile.role ||\n run.policySnapshot.provider !== run.provider)) {\n context.addIssue({ code: \"custom\", message: \"The policy snapshot must describe this AgentRun\" });\n }\n});\nexport const agentFleetWaitReasonSchema = z.enum([\n \"NOT_READY\",\n \"BUDGET_BLOCKED\",\n \"CHECKPOINT_NOT_STABLE\",\n \"ATTEMPT_ACTIVE\",\n \"GLOBAL_LIMIT\",\n \"PROJECT_LIMIT\",\n \"PROVIDER_LIMIT\",\n \"WORKSPACE_CONFLICT\",\n]);\nexport const agentFleetEntryStatusSchema = z.enum([\"READY\", \"WAITING\", \"RUNNING\"]);\nexport const maxAgentFleetEntries = 200;\n// Task 10: the newest thing a running agent has done, across both Run Activity sources (daemon\n// -audited and provider-reported). `label` is bare text -- for a DAEMON_AUDITED entry it is a\n// `WorkspaceToolOperation` code meant for the `workspaceTool.operation.*` i18n lookup the Run\n// Activity feed already uses; for a PROVIDER_REPORTED entry it is the provider's own free text,\n// untrusted and rendered as-is. Which reading applies is exactly what `origin` tells the caller, so\n// this carries no separate \"is this translatable\" flag of its own.\nexport const agentFleetLatestActionSchema = z\n .object({\n // Bounded at 500, matching `agentRunActivityEntrySchema.label`'s own max (not this file's\n // `shortTextSchema`, whose 200-char cap is a UI convention for names and titles, not for a\n // provider's free-text description of what it just did) -- the source of this text, never a\n // UI concern of the Fleet's own.\n label: z.string().trim().min(1).max(500),\n origin: activityOriginSchema,\n})\n .strict();\nexport const agentFleetEntrySchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n project: z.object({ id: opaqueIdSchema, name: shortTextSchema }).strict(),\n workItem: z.object({ id: opaqueIdSchema, title: shortTextSchema }).strict(),\n pipelineRunId: opaqueIdSchema,\n stageAttemptId: opaqueIdSchema,\n dispatchId: opaqueIdSchema.nullable(),\n agentRunId: opaqueIdSchema.nullable(),\n profile: agentProfileRefSchema,\n stage: workflowStageSchema,\n provider: providerIdSchema,\n status: agentFleetEntryStatusSchema,\n waitReason: agentFleetWaitReasonSchema.nullable(),\n startedAt: utcTimestampSchema.nullable(),\n // Nullable rather than omitted: a running entry legitimately has no activity yet (its first\n // provider report has not landed), and that is a different fact from \"this entry cannot have\n // one\" (every queued entry below).\n latestAction: agentFleetLatestActionSchema.nullable(),\n})\n .strict()\n .superRefine((entry, context) => {\n if (entry.status === \"RUNNING\") {\n if (entry.agentRunId === null || entry.startedAt === null || entry.waitReason !== null) {\n context.addIssue({ code: \"custom\", message: \"A running Fleet entry must name its AgentRun\" });\n }\n return;\n }\n if (entry.agentRunId !== null || entry.startedAt !== null) {\n context.addIssue({ code: \"custom\", message: \"A queued Fleet entry cannot name an AgentRun\" });\n }\n if ((entry.status === \"WAITING\") !== (entry.waitReason !== null)) {\n context.addIssue({ code: \"custom\", message: \"Only a waiting Fleet entry has a wait reason\" });\n }\n if (entry.latestAction !== null) {\n context.addIssue({\n code: \"custom\",\n message: \"Only a running Fleet entry -- the one with an AgentRun -- can report a latest action\",\n });\n }\n});\nexport const agentFleetResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n entries: z.array(agentFleetEntrySchema).max(maxAgentFleetEntries),\n capacity: z\n .object({\n active: z.number().int().nonnegative().max(maxAgentFleetEntries),\n globalLimit: z.number().int().min(0).max(32),\n })\n .strict(),\n})\n .strict();\n//# sourceMappingURL=agents.js.map","import { z } from \"zod\";\nimport { qaTargetOriginSchema } from \"./qa.js\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const MAX_LAUNCH_MEASUREMENT_PRIVATE_ROUTES = 20;\nexport const MAX_LAUNCH_MEASUREMENT_SAMPLES = 5;\nexport const MIN_LAUNCH_MEASUREMENT_SAMPLES = 3;\nexport const MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES = 32 * 1_024 * 1_024;\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/u);\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/u);\nconst hasControlCharacter = (value) => {\n for (let index = 0; index < value.length; index += 1) {\n if (value.charCodeAt(index) <= 31 || value.charCodeAt(index) === 127)\n return true;\n }\n return false;\n};\nexport const launchMeasurementRelativePathSchema = z\n .string()\n .trim()\n .min(1)\n .max(2_048)\n .regex(/^\\/(?!\\/)[^\\\\]*$/u, \"Launch measurement paths must be same-origin absolute paths\")\n .refine((value) => !hasControlCharacter(value), \"Launch measurement paths cannot contain control characters\");\nexport const launchMeasurementGateKeySchema = z.enum([\n \"PERF_WEB_VITALS\",\n \"PERF_BUNDLE_BUDGET\",\n \"SEC_RESPONSE_HEADERS\",\n \"SEC_UNAUTHENTICATED_ROUTES\",\n \"SEC_CLIENT_BUNDLE_SECRETS\",\n \"DEPS_AUDIT\",\n]);\nexport const launchMeasurementGateStatusSchema = z.enum([\"PASSED\", \"FAILED\", \"ACTION_REQUIRED\", \"ERROR\"]);\nexport const launchMeasurementHeaderSchema = z.enum([\n \"content-security-policy\",\n \"x-content-type-options\",\n \"referrer-policy\",\n \"permissions-policy\",\n]);\nexport const launchMeasurementSecretCategorySchema = z.enum([\n \"API_KEY\",\n \"AUTH_TOKEN\",\n \"PRIVATE_KEY\",\n \"PASSWORD_ASSIGNMENT\",\n]);\nexport const launchMeasurementThresholdsSchema = z\n .object({\n lcpMs: z.number().int().min(100).max(60_000),\n inpMs: z.number().int().min(10).max(10_000),\n cls: z.number().min(0).max(10),\n scriptBytes: z.number().int().min(1_024).max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n})\n .strict();\nexport const launchMeasurementPlanConfigurationSchema = z\n .object({\n verificationPlanId: opaqueIdSchema,\n verificationPlanRevision: z.number().int().positive(),\n verificationPlanContentHash: sha256Schema,\n startupRecipeId: opaqueIdSchema,\n dependencyAuditRecipeId: opaqueIdSchema.nullable(),\n targetOrigin: qaTargetOriginSchema,\n healthPath: launchMeasurementRelativePathSchema,\n probePath: launchMeasurementRelativePathSchema,\n privateRoutes: z.array(launchMeasurementRelativePathSchema).max(MAX_LAUNCH_MEASUREMENT_PRIVATE_ROUTES),\n samples: z.number().int().min(MIN_LAUNCH_MEASUREMENT_SAMPLES).max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n thresholds: launchMeasurementThresholdsSchema,\n requiredHeaders: z.array(launchMeasurementHeaderSchema).min(1).max(4),\n})\n .strict()\n .superRefine((configuration, context) => {\n if (new Set(configuration.privateRoutes).size !== configuration.privateRoutes.length) {\n context.addIssue({ code: \"custom\", path: [\"privateRoutes\"], message: \"Private routes must be unique\" });\n }\n if (new Set(configuration.requiredHeaders).size !== configuration.requiredHeaders.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"requiredHeaders\"],\n message: \"Required response headers must be unique\",\n });\n }\n if (configuration.dependencyAuditRecipeId === configuration.startupRecipeId) {\n context.addIssue({\n code: \"custom\",\n path: [\"dependencyAuditRecipeId\"],\n message: \"The service and dependency audit must use different recipes\",\n });\n }\n});\nexport const launchMeasurementPlanStatusSchema = z.enum([\"ACTIVE\", \"DISABLED\"]);\nexport const launchMeasurementPlanSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n revision: z.number().int().positive(),\n status: launchMeasurementPlanStatusSchema,\n configuration: launchMeasurementPlanConfigurationSchema,\n contentHash: sha256Schema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const launchBrowserVitalsSampleSchema = z\n .object({\n lcpMs: z.number().nonnegative().max(60_000).nullable(),\n inpMs: z.number().nonnegative().max(10_000).nullable(),\n cls: z.number().nonnegative().max(10).nullable(),\n scriptBytes: z.number().int().nonnegative().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n})\n .strict();\nexport const launchBrowserHeaderObservationSchema = z\n .object({\n name: launchMeasurementHeaderSchema,\n present: z.boolean(),\n})\n .strict();\nexport const launchBrowserPrivateRouteObservationSchema = z\n .object({\n path: launchMeasurementRelativePathSchema,\n statusCode: z.number().int().min(100).max(599),\n})\n .strict();\nexport const launchBrowserSecretObservationSchema = z\n .object({\n category: launchMeasurementSecretCategorySchema,\n count: z.number().int().nonnegative().max(10_000),\n})\n .strict();\nexport const launchBrowserMeasurementSchema = z\n .object({\n samples: z\n .array(launchBrowserVitalsSampleSchema)\n .min(MIN_LAUNCH_MEASUREMENT_SAMPLES)\n .max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n headers: z.array(launchBrowserHeaderObservationSchema).min(1).max(4),\n privateRoutes: z\n .array(launchBrowserPrivateRouteObservationSchema)\n .max(MAX_LAUNCH_MEASUREMENT_PRIVATE_ROUTES),\n secrets: z.array(launchBrowserSecretObservationSchema).max(4),\n scannedScriptBytes: z.number().int().nonnegative().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n browserName: z.literal(\"CHROMIUM\"),\n browserVersion: z.string().trim().min(1).max(100),\n})\n .strict()\n .superRefine((measurement, context) => {\n if (new Set(measurement.headers.map(({ name }) => name)).size !== measurement.headers.length) {\n context.addIssue({ code: \"custom\", path: [\"headers\"], message: \"Header observations must be unique\" });\n }\n if (new Set(measurement.privateRoutes.map(({ path }) => path)).size !== measurement.privateRoutes.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"privateRoutes\"],\n message: \"Private route observations must be unique\",\n });\n }\n if (new Set(measurement.secrets.map(({ category }) => category)).size !== measurement.secrets.length) {\n context.addIssue({ code: \"custom\", path: [\"secrets\"], message: \"Secret observations must be unique\" });\n }\n});\nexport const launchDependencyAuditEvidenceSchema = z\n .object({\n verificationRunId: opaqueIdSchema,\n verificationCheckId: opaqueIdSchema,\n recipeId: opaqueIdSchema,\n testedTree: treeShaSchema,\n status: z.enum([\"PASSED\", \"FAILED\", \"ERROR\", \"INTERRUPTED\"]),\n})\n .strict();\nconst gateBase = {\n status: launchMeasurementGateStatusSchema,\n summary: z.string().trim().min(1).max(1_000),\n};\nexport const launchMeasurementGateResultSchema = z.discriminatedUnion(\"key\", [\n z\n .object({\n key: z.literal(\"PERF_WEB_VITALS\"),\n ...gateBase,\n evidence: z\n .object({\n lcpSamplesMs: z.array(z.number().nonnegative().max(60_000)).max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n inpSamplesMs: z.array(z.number().nonnegative().max(10_000)).max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n clsSamples: z.array(z.number().nonnegative().max(10)).max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n medianLcpMs: z.number().nonnegative().max(60_000).nullable(),\n medianInpMs: z.number().nonnegative().max(10_000).nullable(),\n medianCls: z.number().nonnegative().max(10).nullable(),\n thresholds: launchMeasurementThresholdsSchema.pick({ lcpMs: true, inpMs: true, cls: true }),\n })\n .strict(),\n })\n .strict(),\n z\n .object({\n key: z.literal(\"PERF_BUNDLE_BUDGET\"),\n ...gateBase,\n evidence: z\n .object({\n scriptByteSamples: z\n .array(z.number().int().nonnegative().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES))\n .min(MIN_LAUNCH_MEASUREMENT_SAMPLES)\n .max(MAX_LAUNCH_MEASUREMENT_SAMPLES),\n medianScriptBytes: z.number().int().nonnegative().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n budgetBytes: z.number().int().positive().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n })\n .strict(),\n })\n .strict(),\n z\n .object({\n key: z.literal(\"SEC_RESPONSE_HEADERS\"),\n ...gateBase,\n evidence: z.array(launchBrowserHeaderObservationSchema).min(1).max(4),\n })\n .strict(),\n z\n .object({\n key: z.literal(\"SEC_UNAUTHENTICATED_ROUTES\"),\n ...gateBase,\n evidence: z\n .array(launchBrowserPrivateRouteObservationSchema)\n .max(MAX_LAUNCH_MEASUREMENT_PRIVATE_ROUTES),\n })\n .strict(),\n z\n .object({\n key: z.literal(\"SEC_CLIENT_BUNDLE_SECRETS\"),\n ...gateBase,\n evidence: z\n .object({\n scannedScriptBytes: z.number().int().nonnegative().max(MAX_LAUNCH_MEASUREMENT_SCRIPT_BYTES),\n findings: z.array(launchBrowserSecretObservationSchema).max(4),\n })\n .strict(),\n })\n .strict(),\n z\n .object({\n key: z.literal(\"DEPS_AUDIT\"),\n ...gateBase,\n evidence: launchDependencyAuditEvidenceSchema.nullable(),\n })\n .strict(),\n]);\nexport const launchMeasurementRunErrorCodeSchema = z.enum([\n \"PLAN_NOT_ACTIVE\",\n \"VERIFICATION_PLAN_STALE\",\n \"RECIPE_NOT_APPROVED\",\n \"TREE_UNAVAILABLE\",\n \"TREE_MUTATED\",\n \"SERVICE_SPAWN_FAILED\",\n \"SERVICE_EXITED\",\n \"SERVICE_TIMEOUT\",\n \"SERVICE_OUTPUT_LIMIT\",\n \"SERVICE_TERMINATION_FAILED\",\n \"TARGET_UNHEALTHY\",\n \"ORIGIN_FORBIDDEN\",\n \"MEASUREMENT_TIMEOUT\",\n \"EVIDENCE_INVALID\",\n \"OWNER_CANCELLED\",\n \"DAEMON_RESTART\",\n]);\nexport const launchMeasurementRunStatusSchema = z.enum([\n \"RUNNING\",\n \"CANCELLING\",\n \"BLOCKED\",\n \"PASSED\",\n \"FAILED\",\n \"ERROR\",\n \"INTERRUPTED\",\n]);\nexport const launchMeasurementRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n planId: opaqueIdSchema,\n planRevision: z.number().int().positive(),\n planContentHash: sha256Schema,\n verificationPlanId: opaqueIdSchema,\n verificationPlanRevision: z.number().int().positive(),\n verificationPlanContentHash: sha256Schema,\n testedTree: treeShaSchema,\n status: launchMeasurementRunStatusSchema,\n results: z.array(launchMeasurementGateResultSchema).max(6),\n errorCode: launchMeasurementRunErrorCodeSchema.nullable(),\n startedAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n})\n .strict()\n .superRefine((run, context) => {\n const active = run.status === \"RUNNING\" || run.status === \"CANCELLING\" || run.status === \"BLOCKED\";\n if (active !== (run.completedAt === null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Only an active launch measurement can omit completion time\",\n });\n }\n const carriesError = run.status === \"ERROR\" || run.status === \"INTERRUPTED\" || run.status === \"BLOCKED\";\n if (carriesError !== (run.errorCode !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Only blocked or terminal error runs carry an error code\",\n });\n }\n if (run.status === \"BLOCKED\" && run.errorCode !== \"SERVICE_TERMINATION_FAILED\") {\n context.addIssue({\n code: \"custom\",\n message: \"A blocked launch measurement must identify an unproved service stop\",\n });\n }\n if ((run.status === \"PASSED\" || run.status === \"FAILED\") !== (run.results.length === 6)) {\n context.addIssue({\n code: \"custom\",\n message: \"A measured terminal run must carry all six gate results\",\n });\n }\n if (new Set(run.results.map(({ key }) => key)).size !== run.results.length) {\n context.addIssue({ code: \"custom\", message: \"A launch measurement run cannot repeat a gate result\" });\n }\n});\nexport const launchMeasurementFreshnessSchema = z\n .object({\n status: z.enum([\"CURRENT\", \"STALE\"]),\n reasons: z.array(z.enum([\"TREE_CHANGED\", \"PLAN_CHANGED\", \"VERIFICATION_PLAN_CHANGED\"])).max(3),\n})\n .strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const adoptLaunchMeasurementPlanCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ADOPT_LAUNCH_MEASUREMENT_PLAN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n configuration: launchMeasurementPlanConfigurationSchema,\n })\n .strict(),\n});\nexport const disableLaunchMeasurementPlanCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"DISABLE_LAUNCH_MEASUREMENT_PLAN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n })\n .strict(),\n});\nexport const startLaunchMeasurementRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_LAUNCH_MEASUREMENT_RUN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n testedTree: treeShaSchema,\n })\n .strict(),\n});\nexport const cancelLaunchMeasurementRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CANCEL_LAUNCH_MEASUREMENT_RUN\"),\n payload: z.object({ runId: opaqueIdSchema, expectedVersion: z.number().int().positive() }).strict(),\n});\nexport const completeLaunchMeasurementRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"COMPLETE_LAUNCH_MEASUREMENT_RUN\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n currentTree: treeShaSchema,\n browserMeasurement: launchBrowserMeasurementSchema,\n dependencyAudit: launchDependencyAuditEvidenceSchema.nullable(),\n processStopped: z.literal(true),\n })\n .strict(),\n});\nexport const interruptLaunchMeasurementRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"INTERRUPT_LAUNCH_MEASUREMENT_RUN\"),\n payload: z\n .object({\n runId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n errorCode: launchMeasurementRunErrorCodeSchema,\n processStopped: z.boolean(),\n })\n .strict(),\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const launchMeasurementPlanChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"LAUNCH_MEASUREMENT_PLAN_CHANGED\"),\n data: z.object({ plan: launchMeasurementPlanSchema }).strict(),\n});\nexport const launchMeasurementRunChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"LAUNCH_MEASUREMENT_RUN_CHANGED\"),\n data: z.object({ run: launchMeasurementRunSchema }).strict(),\n});\nconst resultBaseSchema = z.object({ schemaVersion: schemaVersionSchema, replayed: z.boolean() }).strict();\nexport const launchMeasurementPlanChangedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"LAUNCH_MEASUREMENT_PLAN_CHANGED\"),\n plan: launchMeasurementPlanSchema,\n projectVersion: z.number().int().positive(),\n event: launchMeasurementPlanChangedEventSchema,\n});\nexport const launchMeasurementRunChangedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"LAUNCH_MEASUREMENT_RUN_CHANGED\"),\n run: launchMeasurementRunSchema,\n event: launchMeasurementRunChangedEventSchema,\n});\nexport const adoptLaunchMeasurementPlanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n configuration: launchMeasurementPlanConfigurationSchema,\n})\n .strict();\nexport const disableLaunchMeasurementPlanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n})\n .strict();\nexport const startLaunchMeasurementRunRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedPlanRevision: z.number().int().positive(),\n expectedPlanContentHash: sha256Schema,\n})\n .strict();\nexport const cancelLaunchMeasurementRunRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const launchMeasurementProjectResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n plan: launchMeasurementPlanSchema.nullable(),\n latestRun: launchMeasurementRunSchema.nullable(),\n freshness: launchMeasurementFreshnessSchema.nullable(),\n})\n .strict();\n//# sourceMappingURL=launch-measurement.js.map","import { z } from \"zod\";\nimport { launchMeasurementRelativePathSchema } from \"./launch-measurement.js\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const MAX_LAUNCH_ENVIRONMENTS = 8;\nexport const MAX_LAUNCH_ENVIRONMENT_VARIABLES = 32;\nexport const MAX_LAUNCH_RELEASE_WORK_ITEMS = 50;\nexport const MAX_LAUNCH_RELEASE_GATES = 24;\nexport const MAX_LAUNCH_EVIDENCE_PACKAGE_BYTES = 512 * 1_024;\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/u);\nconst treeShaSchema = z.string().regex(/^[0-9a-f]{40}$/u);\nconst hasControlCharacter = (value) => {\n for (let index = 0; index < value.length; index += 1) {\n const code = value.charCodeAt(index);\n if (code <= 31 || code === 127)\n return true;\n }\n return false;\n};\nconst unique = (values) => new Set(values).size === values.length;\nexport const launchEnvironmentKindSchema = z.enum([\"PREVIEW\", \"PRODUCTION\"]);\nexport const launchPresetIdSchema = z.literal(\"WEB_APP_V1\");\nexport const launchEnvironmentVariableNameSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Z_][A-Z0-9_]*$/u, \"Environment variable names must be portable uppercase names\");\nexport const launchEnvironmentPublicBaseUrlSchema = z\n .url()\n .max(2_048)\n .superRefine((value, context) => {\n const match = /^https:\\/\\/(?:\\[[0-9A-Fa-f:]+\\]|[A-Za-z0-9.-]+)(?::([1-9]\\d{0,4}))?$/u.exec(value);\n if (match === null || (match[1] !== undefined && Number(match[1]) > 65_535)) {\n context.addIssue({\n code: \"custom\",\n message: \"The public base URL must be an exact credential-free HTTPS origin\",\n });\n }\n});\nexport const launchEnvironmentConfigurationSchema = z\n .object({\n kind: launchEnvironmentKindSchema,\n name: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .refine((value) => value === value.normalize(\"NFC\") && !hasControlCharacter(value)),\n presetId: launchPresetIdSchema,\n presetRevision: z.literal(1),\n publicBaseUrl: launchEnvironmentPublicBaseUrlSchema,\n healthPath: launchMeasurementRelativePathSchema,\n requiredEnvironmentVariables: z\n .array(launchEnvironmentVariableNameSchema)\n .max(MAX_LAUNCH_ENVIRONMENT_VARIABLES),\n})\n .strict()\n .refine(({ requiredEnvironmentVariables }) => unique(requiredEnvironmentVariables), {\n path: [\"requiredEnvironmentVariables\"],\n message: \"Environment variable names must be unique\",\n});\nexport const launchEnvironmentSchema = launchEnvironmentConfigurationSchema\n .extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n contentHash: sha256Schema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n})\n .strict();\nexport const launchReleaseGateKeySchema = z.enum([\n \"READINESS/SECURITY_ACTIVE_CONSTITUTION\",\n \"READINESS/SECURITY_SECRET_PATHS\",\n \"READINESS/SECURITY_ENV_IGNORED\",\n \"READINESS/SECURITY_CI_HARDENING\",\n \"READINESS/LEGAL_LICENSE\",\n \"READINESS/LEGAL_OWNER_REVIEW\",\n \"READINESS/PAYMENTS_OWNER_REVIEW\",\n \"READINESS/ANALYTICS_OWNER_REVIEW\",\n \"READINESS/DEPS_LOCKFILE_PRESENT\",\n \"READINESS/ENV_PROD_SEPARATION\",\n \"READINESS/SECURITY_HEADERS_OWNER_REVIEW\",\n \"READINESS/OPS_HEALTH_ENDPOINT_DECLARED\",\n \"READINESS/OPS_ROLLBACK_PLAN\",\n \"READINESS/OPS_BACKUP\",\n \"VERIFICATION/REQUIRED_RECIPES\",\n \"MEASURED/PERF_WEB_VITALS\",\n \"MEASURED/PERF_BUNDLE_BUDGET\",\n \"MEASURED/SEC_RESPONSE_HEADERS\",\n \"MEASURED/SEC_UNAUTHENTICATED_ROUTES\",\n \"MEASURED/SEC_CLIENT_BUNDLE_SECRETS\",\n \"MEASURED/DEPS_AUDIT\",\n \"REVIEW/SELECTED_WORK_ITEMS\",\n \"QA/SELECTED_WORK_ITEMS\",\n \"ACCEPTANCE/SELECTED_WORK_ITEMS\",\n]);\nexport const launchReleaseGateStatusSchema = z.enum([\"PASSED\", \"ACTION_REQUIRED\", \"FAILED\", \"STALE\"]);\nexport const launchReleaseEvidenceKindSchema = z.enum([\n \"PROJECT_READINESS_RUN\",\n \"READINESS_CHECK\",\n \"VERIFICATION_PLAN\",\n \"VERIFICATION_RUN\",\n \"LAUNCH_MEASUREMENT_PLAN\",\n \"LAUNCH_MEASUREMENT_RUN\",\n \"ACCEPTANCE_PACKAGE\",\n \"EVIDENCE_ARTIFACT\",\n]);\nexport const launchReleaseEvidenceRefSchema = z\n .object({\n kind: launchReleaseEvidenceKindSchema,\n id: opaqueIdSchema,\n version: z.number().int().positive().nullable(),\n testedTree: treeShaSchema.nullable(),\n})\n .strict();\nexport const launchReleaseGateSchema = z\n .object({\n key: launchReleaseGateKeySchema,\n status: launchReleaseGateStatusSchema,\n required: z.boolean(),\n waivable: z.boolean(),\n summary: z.string().trim().min(1).max(1_000),\n evidenceRefs: z.array(launchReleaseEvidenceRefSchema).max(MAX_LAUNCH_RELEASE_WORK_ITEMS),\n})\n .strict();\nexport const launchReleaseSourceSchema = z\n .object({\n readinessRunId: opaqueIdSchema.nullable(),\n readinessSourceDigest: sha256Schema.nullable(),\n workingTreeDirty: z.boolean().nullable(),\n verificationPlanId: opaqueIdSchema.nullable(),\n verificationPlanRevision: z.number().int().positive().nullable(),\n verificationPlanContentHash: sha256Schema.nullable(),\n launchMeasurementPlanId: opaqueIdSchema.nullable(),\n launchMeasurementPlanRevision: z.number().int().positive().nullable(),\n launchMeasurementPlanContentHash: sha256Schema.nullable(),\n launchMeasurementRunId: opaqueIdSchema.nullable(),\n launchMeasurementRunVersion: z.number().int().positive().nullable(),\n})\n .strict()\n .superRefine((source, context) => {\n const tuples = [\n [source.readinessRunId, source.readinessSourceDigest, source.workingTreeDirty],\n [source.verificationPlanId, source.verificationPlanRevision, source.verificationPlanContentHash],\n [\n source.launchMeasurementPlanId,\n source.launchMeasurementPlanRevision,\n source.launchMeasurementPlanContentHash,\n ],\n [source.launchMeasurementRunId, source.launchMeasurementRunVersion],\n ];\n if (tuples.some((tuple) => tuple.some((value) => value === null) && tuple.some((value) => value !== null))) {\n context.addIssue({ code: \"custom\", message: \"Release source identities must be complete tuples\" });\n }\n});\nexport const launchReleaseWorkItemEvidenceSchema = z\n .object({\n workItemId: opaqueIdSchema,\n pipelineRunId: opaqueIdSchema.nullable(),\n acceptancePackageId: opaqueIdSchema.nullable(),\n acceptancePackageVersion: z.number().int().positive().nullable(),\n acceptanceStatus: z.enum([\"PENDING\", \"ACCEPTED\", \"RETURNED\", \"REJECTED\"]).nullable(),\n reviewArtifactId: opaqueIdSchema.nullable(),\n qaArtifactId: opaqueIdSchema.nullable(),\n verificationRunId: opaqueIdSchema.nullable(),\n verificationPlanId: opaqueIdSchema.nullable(),\n verificationPlanRevision: z.number().int().positive().nullable(),\n verificationPlanContentHash: sha256Schema.nullable(),\n testedTree: treeShaSchema.nullable(),\n})\n .strict()\n .superRefine((evidence, context) => {\n const acceptanceTuple = [\n evidence.acceptancePackageId,\n evidence.acceptancePackageVersion,\n evidence.acceptanceStatus,\n ];\n if (acceptanceTuple.some((value) => value === null) && acceptanceTuple.some((value) => value !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"AcceptancePackage id, version and status must be supplied together\",\n });\n }\n const verificationTuple = [\n evidence.verificationRunId,\n evidence.verificationPlanId,\n evidence.verificationPlanRevision,\n evidence.verificationPlanContentHash,\n ];\n if (verificationTuple.some((value) => value === null) &&\n verificationTuple.some((value) => value !== null)) {\n context.addIssue({\n code: \"custom\",\n message: \"Verification Run and Plan identity must be supplied together\",\n });\n }\n if ((evidence.verificationRunId !== null ||\n evidence.reviewArtifactId !== null ||\n evidence.qaArtifactId !== null) &&\n evidence.testedTree === null) {\n context.addIssue({ code: \"custom\", message: \"Authority-bound workflow evidence requires its tree\" });\n }\n if (evidence.pipelineRunId === null &&\n [\n evidence.acceptancePackageId,\n evidence.acceptanceStatus,\n evidence.reviewArtifactId,\n evidence.qaArtifactId,\n evidence.verificationRunId,\n evidence.verificationPlanId,\n evidence.verificationPlanRevision,\n evidence.verificationPlanContentHash,\n evidence.testedTree,\n ].some((value) => value !== null)) {\n context.addIssue({ code: \"custom\", message: \"Workflow evidence requires its PipelineRun\" });\n }\n});\nconst unwaivableGateKeys = new Set([\n \"READINESS/SECURITY_SECRET_PATHS\",\n \"READINESS/ENV_PROD_SEPARATION\",\n \"MEASURED/SEC_CLIENT_BUNDLE_SECRETS\",\n]);\nexport const launchReleaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n sourceTree: treeShaSchema,\n source: launchReleaseSourceSchema,\n environment: launchEnvironmentSchema,\n selectedWorkItems: z.array(launchReleaseWorkItemEvidenceSchema).max(MAX_LAUNCH_RELEASE_WORK_ITEMS),\n gates: z.array(launchReleaseGateSchema).length(MAX_LAUNCH_RELEASE_GATES),\n requiredGateCount: z.number().int().min(1).max(MAX_LAUNCH_RELEASE_GATES),\n passedRequiredGateCount: z.number().int().nonnegative().max(MAX_LAUNCH_RELEASE_GATES),\n contentHash: sha256Schema,\n createdAt: utcTimestampSchema,\n})\n .strict()\n .superRefine((release, context) => {\n const gateKeys = release.gates.map(({ key }) => key);\n const allGateKeys = launchReleaseGateKeySchema.options;\n if (!unique(gateKeys) || allGateKeys.some((key) => !gateKeys.includes(key))) {\n context.addIssue({\n code: \"custom\",\n path: [\"gates\"],\n message: \"A Release must contain every gate once\",\n });\n }\n if (!unique(release.selectedWorkItems.map(({ workItemId }) => workItemId))) {\n context.addIssue({ code: \"custom\", path: [\"selectedWorkItems\"], message: \"WorkItems must be unique\" });\n }\n if (release.environment.projectId !== release.projectId) {\n context.addIssue({\n code: \"custom\",\n path: [\"environment\"],\n message: \"Environment crosses Project boundary\",\n });\n }\n const required = release.gates.filter(({ required }) => required);\n if (release.requiredGateCount !== required.length ||\n release.passedRequiredGateCount !== required.filter(({ status }) => status === \"PASSED\").length) {\n context.addIssue({ code: \"custom\", message: \"Release gate counts must match gate snapshots\" });\n }\n for (const gate of release.gates) {\n if (unwaivableGateKeys.has(gate.key) && gate.waivable) {\n context.addIssue({\n code: \"custom\",\n path: [\"gates\"],\n message: \"A non-waivable gate cannot be waived\",\n });\n }\n }\n});\nexport const launchReleaseFreshnessSchema = z\n .object({\n status: z.enum([\"CURRENT\", \"STALE\"]),\n reasons: z\n .array(z.enum([\n \"TREE_CHANGED\",\n \"ENVIRONMENT_CHANGED\",\n \"READINESS_CHANGED\",\n \"VERIFICATION_PLAN_CHANGED\",\n \"MEASUREMENT_CHANGED\",\n \"ACCEPTANCE_CHANGED\",\n ]))\n .max(6),\n})\n .strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const saveLaunchEnvironmentCommandSchema = commandBaseSchema\n .extend({\n type: z.literal(\"SAVE_LAUNCH_ENVIRONMENT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n environmentId: opaqueIdSchema.nullable(),\n expectedEnvironmentVersion: z.number().int().positive().nullable(),\n configuration: launchEnvironmentConfigurationSchema,\n })\n .strict(),\n})\n .superRefine((command, context) => {\n if ((command.payload.environmentId === null) !== (command.payload.expectedEnvironmentVersion === null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"payload\"],\n message: \"Environment id and version must be supplied together\",\n });\n }\n});\nexport const createLaunchReleaseCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CREATE_LAUNCH_RELEASE\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n environmentId: opaqueIdSchema,\n expectedEnvironmentVersion: z.number().int().positive(),\n expectedEnvironmentContentHash: sha256Schema,\n sourceTree: treeShaSchema,\n sourceHead: treeShaSchema.nullable(),\n sourceHeadTree: treeShaSchema.nullable(),\n workItemIds: z.array(opaqueIdSchema).max(MAX_LAUNCH_RELEASE_WORK_ITEMS),\n })\n .strict()\n .refine(({ sourceHead, sourceHeadTree }) => (sourceHead === null) === (sourceHeadTree === null), {\n message: \"Source HEAD and its tree must be supplied together\",\n })\n .refine(({ workItemIds }) => unique(workItemIds), {\n path: [\"workItemIds\"],\n message: \"Release WorkItems must be unique\",\n }),\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const launchEnvironmentChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"LAUNCH_ENVIRONMENT_CHANGED\"),\n data: z.object({ environment: launchEnvironmentSchema }).strict(),\n});\nexport const launchReleaseCreatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"LAUNCH_RELEASE_CREATED\"),\n data: z.object({ release: launchReleaseSchema }).strict(),\n});\nconst resultBaseSchema = z.object({ schemaVersion: schemaVersionSchema, replayed: z.boolean() }).strict();\nexport const launchEnvironmentChangedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"LAUNCH_ENVIRONMENT_CHANGED\"),\n environment: launchEnvironmentSchema,\n projectVersion: z.number().int().positive(),\n event: launchEnvironmentChangedEventSchema,\n});\nexport const launchReleaseCreatedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"LAUNCH_RELEASE_CREATED\"),\n release: launchReleaseSchema,\n projectVersion: z.number().int().positive(),\n event: launchReleaseCreatedEventSchema,\n});\nexport const saveLaunchEnvironmentRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n environmentId: opaqueIdSchema.nullable(),\n expectedEnvironmentVersion: z.number().int().positive().nullable(),\n configuration: launchEnvironmentConfigurationSchema,\n})\n .strict()\n .refine(({ environmentId, expectedEnvironmentVersion }) => (environmentId === null) === (expectedEnvironmentVersion === null), { message: \"Environment id and version must be supplied together\" });\nexport const createLaunchReleaseRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n environmentId: opaqueIdSchema,\n expectedEnvironmentVersion: z.number().int().positive(),\n expectedEnvironmentContentHash: sha256Schema,\n workItemIds: z.array(opaqueIdSchema).max(MAX_LAUNCH_RELEASE_WORK_ITEMS),\n})\n .strict()\n .refine(({ workItemIds }) => unique(workItemIds), {\n path: [\"workItemIds\"],\n message: \"Release WorkItems must be unique\",\n});\nexport const launchReleaseProjectResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n environments: z.array(launchEnvironmentSchema).max(MAX_LAUNCH_ENVIRONMENTS),\n latestRelease: launchReleaseSchema.nullable(),\n freshness: launchReleaseFreshnessSchema.nullable(),\n})\n .strict();\nexport const launchEvidencePackageResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n releaseId: opaqueIdSchema,\n contentType: z.literal(\"text/markdown; charset=utf-8\"),\n byteSize: z.number().int().nonnegative().max(MAX_LAUNCH_EVIDENCE_PACKAGE_BYTES),\n markdown: z.string().max(MAX_LAUNCH_EVIDENCE_PACKAGE_BYTES),\n})\n .strict();\n//# sourceMappingURL=launch-release.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { launchEnvironmentKindSchema, launchReleaseFreshnessSchema } from \"./launch-release.js\";\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/u);\nconst commitShaSchema = z.string().regex(/^[0-9a-f]{40}$/u);\nconst containsForbiddenRefControl = (value) => {\n for (const character of value) {\n const code = character.charCodeAt(0);\n if (code <= 32 || code === 127)\n return true;\n }\n return false;\n};\nexport const githubRepositorySlugSchema = z\n .string()\n .min(3)\n .max(201)\n .regex(/^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}\\/[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/u);\nexport const deploymentBranchSchema = z\n .string()\n .min(1)\n .max(255)\n .refine((value) => value === value.normalize(\"NFC\") &&\n !value.startsWith(\"-\") &&\n !value.startsWith(\"/\") &&\n !value.endsWith(\"/\") &&\n !value.endsWith(\".\") &&\n !value.endsWith(\".lock\") &&\n !value.includes(\"..\") &&\n !value.includes(\"@{\") &&\n !containsForbiddenRefControl(value) &&\n !/[~^:?*[\\\\]/u.test(value), \"The deployment branch must be one portable Git ref name\");\nconst githubActionsDeploymentTargetBaseShape = {\n repositorySlug: githubRepositorySlugSchema,\n branch: deploymentBranchSchema,\n commitSha: commitShaSchema,\n workflowContentHash: sha256Schema,\n argvDigest: sha256Schema,\n dispatchTimeoutSeconds: z.literal(30),\n observeTimeoutSeconds: z.literal(15),\n outputLimitBytes: z.literal(32_768),\n observeOutputLimitBytes: z.literal(65_536),\n};\nexport const githubActionsDeploymentTargetV1Schema = z\n .object({\n presetId: z.literal(\"GITHUB_ACTIONS_WORKFLOW_V1\"),\n presetRevision: z.literal(1),\n workflowPath: z.literal(\".github/workflows/deploy-production.yml\"),\n ...githubActionsDeploymentTargetBaseShape,\n})\n .strict();\nexport const githubActionsDeploymentTargetV2Schema = z\n .object({\n presetId: z.literal(\"GITHUB_ACTIONS_ENVIRONMENT_WORKFLOW_V2\"),\n presetRevision: z.literal(2),\n environmentKind: launchEnvironmentKindSchema,\n workflowPath: z.enum([\".github/workflows/deploy-preview.yml\", \".github/workflows/deploy-production.yml\"]),\n ...githubActionsDeploymentTargetBaseShape,\n})\n .strict()\n .superRefine((target, context) => {\n const expected = target.environmentKind === \"PREVIEW\"\n ? \".github/workflows/deploy-preview.yml\"\n : \".github/workflows/deploy-production.yml\";\n if (target.workflowPath !== expected) {\n context.addIssue({\n code: \"custom\",\n path: [\"workflowPath\"],\n message: \"The workflow path must match the deployment Environment kind\",\n });\n }\n});\nexport const githubActionsDeploymentTargetSchema = z.union([\n githubActionsDeploymentTargetV1Schema,\n githubActionsDeploymentTargetV2Schema,\n]);\nexport const deploymentIntentSchema = z.literal(\"STANDARD\");\nexport const deploymentStatusSchema = z.enum([\n \"PENDING_APPROVAL\",\n \"APPROVED\",\n \"RUNNING\",\n \"SUCCEEDED\",\n \"FAILED\",\n \"UNKNOWN\",\n]);\nexport const deploymentFailureCodeSchema = z.enum([\n \"DISPATCH_OUTCOME_UNKNOWN\",\n \"DAEMON_RESTARTED\",\n \"REMOTE_FAILURE\",\n \"REMOTE_CANCELLED\",\n \"REMOTE_TIMED_OUT\",\n \"REMOTE_ACTION_REQUIRED\",\n \"OBSERVATION_INVALID\",\n \"PRECONDITION_CHANGED\",\n]);\nexport const deploymentPreflightFailureCodeSchema = z.enum([\n \"RELEASE_STALE\",\n \"RELEASE_GATES_BLOCKED\",\n \"ENVIRONMENT_UNSUPPORTED\",\n \"REPOSITORY_UNAVAILABLE\",\n \"REPOSITORY_PATH_NOT_CANONICAL\",\n \"REPOSITORY_OPERATION_IN_PROGRESS\",\n \"SOURCE_DIRTY\",\n \"DETACHED_HEAD\",\n \"REMOTE_INVALID\",\n \"WORKFLOW_MISSING\",\n \"WORKFLOW_NOT_REGULAR\",\n \"WORKFLOW_TRIGGER_MISSING\",\n \"WORKFLOW_TOO_LARGE\",\n \"CLI_UNAVAILABLE\",\n \"AUTH_REQUIRED\",\n \"REMOTE_BRANCH_UNAVAILABLE\",\n \"REMOTE_COMMIT_MISMATCH\",\n \"PREVIEW_PROMOTION_REQUIRED\",\n]);\nconst deploymentPlanBaseShape = {\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n releaseId: opaqueIdSchema,\n releaseContentHash: sha256Schema,\n environmentId: opaqueIdSchema,\n environmentContentHash: sha256Schema,\n contentHash: sha256Schema,\n createdAt: utcTimestampSchema,\n};\nconst deploymentPlanV1Schema = z\n .object({\n ...deploymentPlanBaseShape,\n revision: z.literal(1),\n target: githubActionsDeploymentTargetV1Schema,\n})\n .strict();\nconst deploymentPlanV2Schema = z\n .object({\n ...deploymentPlanBaseShape,\n revision: z.literal(2),\n releaseEvidenceDigest: sha256Schema,\n environmentKind: launchEnvironmentKindSchema,\n target: githubActionsDeploymentTargetV2Schema,\n})\n .strict()\n .superRefine((plan, context) => {\n if (plan.environmentKind !== plan.target.environmentKind) {\n context.addIssue({\n code: \"custom\",\n path: [\"target\", \"environmentKind\"],\n message: \"The Plan and target Environment kinds must match\",\n });\n }\n});\nexport const deploymentPlanSchema = z.union([deploymentPlanV1Schema, deploymentPlanV2Schema]);\nconst remoteRunIdentityShape = {\n remoteRunId: z.number().int().positive(),\n remoteRunUrl: z\n .url()\n .max(2_048)\n .regex(/^https:\\/\\/github\\.com\\/[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+\\/actions\\/runs\\/[1-9]\\d*$/u),\n};\nconst deploymentBaseShape = {\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n planId: opaqueIdSchema,\n planContentHash: sha256Schema,\n releaseId: opaqueIdSchema,\n releaseContentHash: sha256Schema,\n environmentId: opaqueIdSchema,\n environmentContentHash: sha256Schema,\n intent: deploymentIntentSchema,\n approvalDigest: sha256Schema,\n status: deploymentStatusSchema,\n approvalId: opaqueIdSchema.nullable(),\n remoteRunId: remoteRunIdentityShape.remoteRunId.nullable(),\n remoteRunUrl: remoteRunIdentityShape.remoteRunUrl.nullable(),\n failureCode: deploymentFailureCodeSchema.nullable(),\n createdAt: utcTimestampSchema,\n approvedAt: utcTimestampSchema.nullable(),\n startedAt: utcTimestampSchema.nullable(),\n completedAt: utcTimestampSchema.nullable(),\n observedAt: utcTimestampSchema.nullable(),\n version: z.number().int().positive(),\n};\nexport const deploymentSchema = z\n .union([\n z\n .object({\n ...deploymentBaseShape,\n planRevision: z.literal(1),\n })\n .strict(),\n z\n .object({\n ...deploymentBaseShape,\n planRevision: z.literal(2),\n releaseEvidenceDigest: sha256Schema,\n environmentKind: launchEnvironmentKindSchema,\n })\n .strict(),\n])\n .superRefine((deployment, context) => {\n if ((deployment.remoteRunId === null) !== (deployment.remoteRunUrl === null)) {\n context.addIssue({ code: \"custom\", message: \"Remote run id and URL must be supplied together\" });\n }\n if ((deployment.approvalId === null) !== (deployment.approvedAt === null)) {\n context.addIssue({ code: \"custom\", message: \"Approval id and timestamp must be supplied together\" });\n }\n if (deployment.status === \"PENDING_APPROVAL\" && deployment.approvalId !== null) {\n context.addIssue({ code: \"custom\", message: \"A pending Deployment cannot carry an Approval\" });\n }\n if (deployment.status === \"PENDING_APPROVAL\" &&\n [\n deployment.startedAt,\n deployment.completedAt,\n deployment.observedAt,\n deployment.failureCode,\n deployment.remoteRunId,\n ].some((value) => value !== null)) {\n context.addIssue({ code: \"custom\", message: \"A pending Deployment cannot carry execution state\" });\n }\n if ([\"APPROVED\", \"RUNNING\", \"SUCCEEDED\", \"FAILED\", \"UNKNOWN\"].includes(deployment.status)) {\n if (deployment.approvalId === null) {\n context.addIssue({ code: \"custom\", message: \"An approved Deployment must carry its Approval\" });\n }\n }\n if ([\"RUNNING\", \"SUCCEEDED\", \"FAILED\", \"UNKNOWN\"].includes(deployment.status)) {\n if (deployment.startedAt === null) {\n context.addIssue({ code: \"custom\", message: \"A started Deployment must carry startedAt\" });\n }\n }\n if (deployment.status === \"APPROVED\" &&\n [\n deployment.startedAt,\n deployment.completedAt,\n deployment.observedAt,\n deployment.failureCode,\n deployment.remoteRunId,\n ].some((value) => value !== null)) {\n context.addIssue({ code: \"custom\", message: \"An approved Deployment cannot carry execution state\" });\n }\n if (deployment.status === \"RUNNING\" &&\n (deployment.completedAt !== null || deployment.failureCode !== null)) {\n context.addIssue({ code: \"custom\", message: \"A running Deployment cannot carry a terminal outcome\" });\n }\n if ([\"SUCCEEDED\", \"FAILED\"].includes(deployment.status) && deployment.completedAt === null) {\n context.addIssue({ code: \"custom\", message: \"A terminal Deployment must carry completedAt\" });\n }\n if ([\"SUCCEEDED\", \"FAILED\", \"UNKNOWN\"].includes(deployment.status) && deployment.observedAt === null) {\n context.addIssue({ code: \"custom\", message: \"A settled Deployment must carry observedAt\" });\n }\n if (deployment.status === \"UNKNOWN\" && deployment.completedAt !== null) {\n context.addIssue({ code: \"custom\", message: \"An unknown Deployment cannot claim completion\" });\n }\n if (deployment.status === \"SUCCEEDED\" && deployment.remoteRunId === null) {\n context.addIssue({ code: \"custom\", message: \"A successful Deployment requires an exact remote run\" });\n }\n if (deployment.status === \"SUCCEEDED\" && deployment.failureCode !== null) {\n context.addIssue({ code: \"custom\", message: \"A successful Deployment cannot carry failureCode\" });\n }\n if ([\"FAILED\", \"UNKNOWN\"].includes(deployment.status) && deployment.failureCode === null) {\n context.addIssue({ code: \"custom\", message: \"Failed or unknown Deployment requires failureCode\" });\n }\n});\nexport const deploymentApprovalSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n deploymentId: opaqueIdSchema,\n approvalDigest: sha256Schema,\n actorId: opaqueIdSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const adoptDeploymentPlanCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ADOPT_DEPLOYMENT_PLAN\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n releaseId: opaqueIdSchema,\n expectedReleaseContentHash: sha256Schema,\n releaseFreshness: launchReleaseFreshnessSchema,\n releaseEvidenceDigest: sha256Schema,\n target: githubActionsDeploymentTargetV2Schema,\n })\n .strict(),\n});\nexport const approveDeploymentCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"APPROVE_DEPLOYMENT\"),\n payload: z\n .object({\n deploymentId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n approvalDigest: sha256Schema,\n })\n .strict(),\n});\nexport const startDeploymentCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_DEPLOYMENT\"),\n payload: z.object({ deploymentId: opaqueIdSchema, expectedVersion: z.number().int().positive() }).strict(),\n});\nexport const deploymentDispatchOutcomeSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"DISPATCHED\"),\n runId: remoteRunIdentityShape.remoteRunId,\n runUrl: remoteRunIdentityShape.remoteRunUrl,\n })\n .strict(),\n z.object({ type: z.literal(\"UNKNOWN\") }).strict(),\n z.object({ type: z.literal(\"REFUSED\") }).strict(),\n]);\nexport const recordDeploymentDispatchCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_DEPLOYMENT_DISPATCH\"),\n payload: z\n .object({\n deploymentId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n outcome: deploymentDispatchOutcomeSchema,\n })\n .strict(),\n});\nexport const deploymentObservationOutcomeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"RUNNING\") }).strict(),\n z.object({ type: z.literal(\"SUCCEEDED\") }).strict(),\n z\n .object({\n type: z.literal(\"FAILED\"),\n failureCode: z.enum([\n \"REMOTE_FAILURE\",\n \"REMOTE_CANCELLED\",\n \"REMOTE_TIMED_OUT\",\n \"REMOTE_ACTION_REQUIRED\",\n ]),\n })\n .strict(),\n z.object({ type: z.literal(\"UNKNOWN\") }).strict(),\n]);\nexport const recordDeploymentObservationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_DEPLOYMENT_OBSERVATION\"),\n payload: z\n .object({\n deploymentId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n observedRunId: remoteRunIdentityShape.remoteRunId,\n outcome: deploymentObservationOutcomeSchema,\n })\n .strict(),\n});\nexport const reconcileDeploymentCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECONCILE_DEPLOYMENT\"),\n payload: z.object({ deploymentId: opaqueIdSchema, expectedVersion: z.number().int().positive() }).strict(),\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const deploymentPlanAdoptedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"DEPLOYMENT_PLAN_ADOPTED\"),\n data: z.object({ plan: deploymentPlanSchema, deployment: deploymentSchema }).strict(),\n});\nexport const deploymentChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"DEPLOYMENT_CHANGED\"),\n data: z.object({ deployment: deploymentSchema }).strict(),\n});\nconst resultBaseSchema = z.object({ schemaVersion: schemaVersionSchema, replayed: z.boolean() }).strict();\nexport const deploymentPlanAdoptedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"DEPLOYMENT_PLAN_ADOPTED\"),\n plan: deploymentPlanSchema,\n deployment: deploymentSchema,\n projectVersion: z.number().int().positive(),\n event: deploymentPlanAdoptedEventSchema,\n});\nexport const deploymentChangedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"DEPLOYMENT_CHANGED\"),\n deployment: deploymentSchema,\n approval: deploymentApprovalSchema.nullable(),\n event: deploymentChangedEventSchema,\n});\nexport const adoptDeploymentPlanRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n releaseId: opaqueIdSchema,\n expectedReleaseContentHash: sha256Schema,\n})\n .strict();\nexport const approveDeploymentRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n approvalDigest: sha256Schema,\n})\n .strict();\nexport const observeDeploymentRequestSchema = z\n .object({ schemaVersion: schemaVersionSchema, commandId: opaqueIdSchema })\n .strict();\nexport const startDeploymentRequestSchema = z.object({ schemaVersion: schemaVersionSchema }).strict();\nexport const cancelDeploymentRequestSchema = z.object({ schemaVersion: schemaVersionSchema }).strict();\nconst deploymentPreviewBaseSchema = z.object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n releaseId: opaqueIdSchema,\n releaseContentHash: sha256Schema,\n releaseEvidenceDigest: sha256Schema,\n});\nexport const deploymentPreviewResponseSchema = z.discriminatedUnion(\"status\", [\n deploymentPreviewBaseSchema\n .extend({ status: z.literal(\"READY\"), target: githubActionsDeploymentTargetV2Schema })\n .strict(),\n deploymentPreviewBaseSchema\n .extend({ status: z.literal(\"BLOCKED\"), code: deploymentPreflightFailureCodeSchema })\n .strict(),\n]);\nexport const guidedDeploymentProjectResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n latestPlan: deploymentPlanSchema.nullable(),\n latestDeployment: deploymentSchema.nullable(),\n rollbackAvailability: z.literal(\"UNAVAILABLE\"),\n})\n .strict();\n//# sourceMappingURL=guided-deployment.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const MAX_WORK_ITEM_BLOCKERS = 50;\nexport const MAX_DEPENDENCY_GRAPH_WORK_ITEMS = 10_000;\nexport const MAX_DEPENDENCY_GRAPH_EDGES = 50_000;\nexport const workItemDependencyKindSchema = z.literal(\"BLOCKS\");\nexport const workItemDependencySchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n kind: workItemDependencyKindSchema,\n blockerWorkItemId: opaqueIdSchema,\n blockedWorkItemId: opaqueIdSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const setWorkItemDependenciesCommandSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n type: z.literal(\"SET_WORK_ITEM_DEPENDENCIES\"),\n payload: z\n .object({\n workItemId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n // One over the domain limit reaches the decision as a typed refusal; larger bodies are\n // rejected at the HTTP contract before they can become a graph-validation allocation.\n blockerWorkItemIds: z.array(opaqueIdSchema).max(MAX_WORK_ITEM_BLOCKERS + 1),\n })\n .strict(),\n})\n .strict();\nconst dependencyEventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const workItemDependenciesSetEventSchema = dependencyEventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_DEPENDENCIES_SET\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n blockedWorkItemId: opaqueIdSchema,\n previousBlockerWorkItemIds: z.array(opaqueIdSchema).max(MAX_WORK_ITEM_BLOCKERS),\n blockerWorkItemIds: z.array(opaqueIdSchema).max(MAX_WORK_ITEM_BLOCKERS),\n workItemVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const workItemDependenciesSetResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"WORK_ITEM_DEPENDENCIES_SET\"),\n blockedWorkItemId: opaqueIdSchema,\n workItemVersion: z.number().int().positive(),\n dependencies: z.array(workItemDependencySchema).max(MAX_WORK_ITEM_BLOCKERS),\n event: workItemDependenciesSetEventSchema,\n})\n .strict();\nexport const setWorkItemDependenciesRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n blockerWorkItemIds: z.array(opaqueIdSchema).max(MAX_WORK_ITEM_BLOCKERS + 1),\n})\n .strict();\nexport const workItemDependenciesResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: opaqueIdSchema,\n dependencies: z.array(workItemDependencySchema).max(MAX_DEPENDENCY_GRAPH_EDGES),\n})\n .strict();\n//# sourceMappingURL=dependency.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const constitutionPresetIdSchema = z.enum([\n \"repository-baseline\",\n \"typescript-node\",\n \"typescript-pnpm-workspace\",\n]);\nexport const constitutionPresetSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: constitutionPresetIdSchema,\n version: z.literal(1),\n name: z.string().min(1).max(120),\n description: z.string().min(1).max(500),\n})\n .strict();\nexport const constitutionPresetsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n presets: z.array(constitutionPresetSchema).length(3),\n})\n .strict();\nexport const repositoryScanFileKindSchema = z.enum([\n \"AGENT_INSTRUCTIONS\",\n \"README\",\n \"CONSTITUTION\",\n \"PACKAGE_MANIFEST\",\n \"WORKSPACE_MANIFEST\",\n \"PACKAGE_MANAGER_MARKER\",\n \"TOOL_CONFIG\",\n \"CI_WORKFLOW\",\n \"ARCHITECTURE_DOCUMENT\",\n]);\nexport const repositoryScanFileSchema = z\n .object({\n path: z.string().min(1).max(500),\n kind: repositoryScanFileKindSchema,\n bytes: z.number().int().nonnegative().max(1_000_000_000),\n // Presence-only markers such as lockfiles are not read, so there is deliberately no digest.\n digest: z\n .string()\n .regex(/^[0-9a-f]{64}$/)\n .nullable(),\n})\n .strict();\nexport const repositoryScanWarningCodeSchema = z.enum([\n \"CANDIDATE_LIMIT_REACHED\",\n \"TOTAL_BYTES_LIMIT_REACHED\",\n \"FILE_TOO_LARGE\",\n \"SYMLINK_SKIPPED\",\n \"FILE_UNREADABLE\",\n \"MANIFEST_INVALID\",\n \"SCRIPT_NAME_UNSAFE\",\n]);\nexport const repositoryScanWarningSchema = z\n .object({\n code: repositoryScanWarningCodeSchema,\n path: z.string().min(1).max(500).nullable(),\n message: z.string().min(1).max(500),\n})\n .strict();\nexport const packageManagerSchema = z.enum([\"PNPM\", \"NPM\", \"YARN\", \"BUN\", \"UNKNOWN\"]);\nexport const repositoryLanguageSchema = z.enum([\"TYPESCRIPT\", \"JAVASCRIPT\"]);\nexport const discoveredVerificationCommandSchema = z\n .object({\n name: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,99}$/),\n argv: z.array(z.string().min(1).max(120)).min(2).max(4),\n sourcePath: z.literal(\"package.json\"),\n})\n .strict();\nexport const scannedConstitutionTargetSchema = z.discriminatedUnion(\"state\", [\n z.object({ state: z.literal(\"ABSENT\"), digest: z.null() }).strict(),\n z\n .object({\n state: z.literal(\"PRESENT\"),\n digest: z.string().regex(/^[0-9a-f]{64}$/),\n })\n .strict(),\n z.object({ state: z.literal(\"BLOCKED\"), digest: z.null() }).strict(),\n]);\nexport const repositoryScanSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sourceDigest: z.string().regex(/^[0-9a-f]{64}$/),\n targetConstitution: scannedConstitutionTargetSchema,\n files: z.array(repositoryScanFileSchema).max(128),\n warnings: z.array(repositoryScanWarningSchema).max(128),\n packageManager: packageManagerSchema,\n languages: z.array(repositoryLanguageSchema).max(2),\n workspace: z.boolean(),\n verificationCommands: z.array(discoveredVerificationCommandSchema).max(64),\n instructionPaths: z.array(z.string().min(1).max(500)).max(16),\n architecturePaths: z.array(z.string().min(1).max(500)).max(64),\n ciPaths: z.array(z.string().min(1).max(500)).max(32),\n configPaths: z.array(z.string().min(1).max(500)).max(64),\n})\n .strict();\nexport const constitutionSectionKeySchema = z.enum([\n \"PRODUCT_CONTEXT\",\n \"ARCHITECTURE\",\n \"CODE_STANDARDS\",\n \"AGENT_POLICIES\",\n \"DEFINITION_OF_DONE\",\n \"ROLE_PLAYBOOKS\",\n \"LEARNED_CONVENTIONS\",\n]);\nexport const constitutionSourceKindSchema = z.enum([\"PRESET\", \"REPOSITORY\", \"SCANNER\"]);\nexport const constitutionSourceSchema = z\n .object({\n kind: constitutionSourceKindSchema,\n reference: z.string().min(1).max(500),\n label: z.string().min(1).max(500),\n})\n .strict();\nexport const constitutionSectionSchema = z\n .object({\n key: constitutionSectionKeySchema,\n title: z.string().min(1).max(120),\n body: z.string().min(1).max(20_000),\n sources: z.array(constitutionSourceSchema).min(1).max(128),\n})\n .strict();\nexport const constitutionProposalStatusSchema = z.enum([\"PROPOSED\", \"ADOPTION_REQUESTED\", \"ADOPTED\"]);\nexport const constitutionProposalSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n projectVersion: z.number().int().positive(),\n status: constitutionProposalStatusSchema,\n presetId: constitutionPresetIdSchema,\n presetVersion: z.literal(1),\n recommendedPresetId: constitutionPresetIdSchema,\n scan: repositoryScanSchema,\n sections: z.array(constitutionSectionSchema).length(7),\n renderedMarkdown: z.string().min(1).max(100_000),\n contentDigest: z.string().regex(/^[0-9a-f]{64}$/),\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n adoptedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const projectConstitutionStatusSchema = z.enum([\"PUBLISHING\", \"ACTIVE\", \"SUPERSEDED\", \"FAILED\"]);\nexport const projectConstitutionVersionSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n proposalId: opaqueIdSchema,\n ordinal: z.number().int().positive(),\n presetId: constitutionPresetIdSchema,\n presetVersion: z.literal(1),\n sourceDigest: z.string().regex(/^[0-9a-f]{64}$/),\n contentDigest: z.string().regex(/^[0-9a-f]{64}$/),\n renderedMarkdown: z.string().min(1).max(100_000),\n status: projectConstitutionStatusSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n activatedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const constitutionPublicationStatusSchema = z.enum([\"PENDING\", \"APPLIED\", \"FAILED\"]);\nexport const constitutionPublicationErrorCodeSchema = z.enum([\n \"CONSTITUTION_TARGET_CHANGED\",\n \"CONSTITUTION_TARGET_OUTSIDE_REPOSITORY\",\n \"CONSTITUTION_TARGET_UNREADABLE\",\n \"CONSTITUTION_WRITE_FAILED\",\n \"REPOSITORY_UNAVAILABLE\",\n]);\nexport const constitutionPublicationSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n constitutionVersionId: opaqueIdSchema,\n targetPath: z.literal(\".loomrail/constitution.md\"),\n expectedTargetDigest: z\n .string()\n .regex(/^[0-9a-f]{64}$/)\n .nullable(),\n contentDigest: z.string().regex(/^[0-9a-f]{64}$/),\n status: constitutionPublicationStatusSchema,\n attempts: z.number().int().nonnegative(),\n lastErrorCode: constitutionPublicationErrorCodeSchema.nullable(),\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n appliedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const projectConstitutionProposedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PROPOSED\"),\n data: z.object({ proposal: constitutionProposalSchema }).strict(),\n});\nexport const projectConstitutionPublicationRequestedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PUBLICATION_REQUESTED\"),\n data: z\n .object({\n proposal: constitutionProposalSchema,\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n })\n .strict(),\n});\nexport const projectConstitutionActivatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_ACTIVATED\"),\n data: z\n .object({\n proposal: constitutionProposalSchema,\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n })\n .strict(),\n});\nexport const projectConstitutionPublicationFailedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PUBLICATION_FAILED\"),\n data: z\n .object({\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const proposeProjectConstitutionCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"PROPOSE_PROJECT_CONSTITUTION\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n presetId: constitutionPresetIdSchema,\n recommendedPresetId: constitutionPresetIdSchema,\n scan: repositoryScanSchema,\n sections: z.array(constitutionSectionSchema).length(7),\n renderedMarkdown: z.string().min(1).max(100_000),\n contentDigest: z.string().regex(/^[0-9a-f]{64}$/),\n })\n .strict(),\n});\nexport const requestProjectConstitutionAdoptionCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REQUEST_PROJECT_CONSTITUTION_ADOPTION\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n proposalId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedProposalVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const completeProjectConstitutionPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"COMPLETE_PROJECT_CONSTITUTION_PUBLICATION\"),\n payload: z\n .object({\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const failProjectConstitutionPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FAIL_PROJECT_CONSTITUTION_PUBLICATION\"),\n payload: z\n .object({\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n errorCode: constitutionPublicationErrorCodeSchema,\n })\n .strict(),\n});\nexport const retryProjectConstitutionPublicationCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RETRY_PROJECT_CONSTITUTION_PUBLICATION\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nconst resultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n})\n .strict();\nexport const projectConstitutionProposedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PROPOSED\"),\n proposal: constitutionProposalSchema,\n event: projectConstitutionProposedEventSchema,\n});\nexport const projectConstitutionPublicationRequestedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PUBLICATION_REQUESTED\"),\n proposal: constitutionProposalSchema,\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n event: projectConstitutionPublicationRequestedEventSchema,\n});\nexport const projectConstitutionActivatedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_ACTIVATED\"),\n proposal: constitutionProposalSchema,\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n event: projectConstitutionActivatedEventSchema,\n});\nexport const projectConstitutionPublicationFailedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PUBLICATION_FAILED\"),\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n event: projectConstitutionPublicationFailedEventSchema,\n});\nexport const projectConstitutionPublicationRetriedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_CONSTITUTION_PUBLICATION_RETRIED\"),\n constitution: projectConstitutionVersionSchema,\n publication: constitutionPublicationSchema,\n event: projectConstitutionPublicationRequestedEventSchema,\n});\nexport const scanProjectConstitutionRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n presetId: constitutionPresetIdSchema.optional(),\n})\n .strict();\nexport const adoptProjectConstitutionRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n proposalId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n expectedProposalVersion: z.number().int().positive(),\n})\n .strict();\nexport const retryProjectConstitutionPublicationRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n publicationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const projectConstitutionSnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n latestProposal: constitutionProposalSchema.nullable(),\n activeConstitution: projectConstitutionVersionSchema.nullable(),\n pendingConstitution: projectConstitutionVersionSchema.nullable(),\n publication: constitutionPublicationSchema.nullable(),\n})\n .strict();\n//# sourceMappingURL=constitution.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nexport const readinessCategorySchema = z.enum([\n \"SECURITY\",\n \"LEGAL\",\n \"PAYMENTS\",\n \"ANALYTICS\",\n \"DEPENDENCIES\",\n \"ENVIRONMENT\",\n \"OPERATIONS\",\n]);\nexport const readinessCheckModeSchema = z.enum([\"AUTOMATED\", \"OWNER\"]);\nexport const readinessCheckStatusSchema = z.enum([\n \"PASSED\",\n \"ACTION_REQUIRED\",\n \"CONFIRMED\",\n \"NOT_APPLICABLE\",\n]);\nexport const projectReadinessStatusSchema = z.enum([\"ACTION_REQUIRED\", \"READY\"]);\nexport const readinessAttestationOutcomeSchema = z.enum([\"CONFIRMED\", \"NOT_APPLICABLE\"]);\nexport const readinessCheckKeySchema = z.enum([\n \"SECURITY_ACTIVE_CONSTITUTION\",\n \"SECURITY_SECRET_PATHS\",\n \"SECURITY_ENV_IGNORED\",\n \"SECURITY_CI_HARDENING\",\n \"LEGAL_LICENSE\",\n \"LEGAL_OWNER_REVIEW\",\n \"PAYMENTS_OWNER_REVIEW\",\n \"ANALYTICS_OWNER_REVIEW\",\n \"DEPS_LOCKFILE_PRESENT\",\n \"ENV_PROD_SEPARATION\",\n \"SECURITY_HEADERS_OWNER_REVIEW\",\n \"OPS_HEALTH_ENDPOINT_DECLARED\",\n \"OPS_ROLLBACK_PLAN\",\n \"OPS_BACKUP\",\n]);\nexport const securityFindingSeveritySchema = z.enum([\"CRITICAL\", \"HIGH\", \"MEDIUM\", \"LOW\"]);\nexport const securityFindingCodeSchema = z.enum([\n \"ACTIVE_CONSTITUTION_MISSING\",\n \"TRACKED_SECRET_PATH\",\n \"ENV_NOT_IGNORED\",\n \"CI_PULL_REQUEST_TARGET\",\n \"CI_WRITE_ALL_PERMISSIONS\",\n \"CI_ACTION_NOT_PINNED\",\n \"CI_INPUT_UNVERIFIABLE\",\n \"LICENSE_MISSING\",\n \"LOCKFILE_MISSING\",\n \"LOCKFILE_AMBIGUOUS\",\n \"DEPENDENCY_INPUT_UNVERIFIABLE\",\n \"PROD_ENV_NOT_IGNORED\",\n \"INLINE_SECRET_IN_CI\",\n]);\nconst digestSchema = z.string().regex(/^[0-9a-f]{64}$/);\nconst gitHeadSchema = z\n .string()\n .regex(/^[0-9a-f]{40,64}$/)\n .nullable();\nexport const securityFindingDraftSchema = z\n .object({\n code: securityFindingCodeSchema,\n severity: securityFindingSeveritySchema,\n path: z.string().min(1).max(500).nullable(),\n message: z.string().min(1).max(500),\n})\n .strict();\nexport const readinessCheckDraftSchema = z\n .object({\n key: readinessCheckKeySchema,\n category: readinessCategorySchema,\n mode: readinessCheckModeSchema,\n status: z.enum([\"PASSED\", \"ACTION_REQUIRED\"]),\n summary: z.string().min(1).max(500),\n findings: z.array(securityFindingDraftSchema).max(128),\n})\n .strict();\nexport const projectReadinessRunSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n repositoryHead: gitHeadSchema,\n sourceDigest: digestSchema,\n workingTreeDirty: z.boolean(),\n status: projectReadinessStatusSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n})\n .strict();\nexport const readinessCheckSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n runId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n key: readinessCheckKeySchema,\n category: readinessCategorySchema,\n mode: readinessCheckModeSchema,\n status: readinessCheckStatusSchema,\n summary: z.string().min(1).max(500),\n version: z.number().int().positive(),\n})\n .strict();\nexport const securityFindingSchema = securityFindingDraftSchema.extend({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n});\nexport const readinessAttestationSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n outcome: readinessAttestationOutcomeSchema,\n rationale: z.string().trim().min(1).max(2_000),\n actor: actorSchema,\n createdAt: utcTimestampSchema,\n})\n .strict();\nexport const projectReadinessSnapshotSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n run: projectReadinessRunSchema.nullable(),\n checks: z.array(readinessCheckSchema).max(14),\n findings: z.array(securityFindingSchema).max(1_024),\n attestations: z.array(readinessAttestationSchema).max(1_024),\n})\n .strict()\n .superRefine((snapshot, context) => {\n if (snapshot.run === null &&\n (snapshot.checks.length > 0 || snapshot.findings.length > 0 || snapshot.attestations.length > 0)) {\n context.addIssue({\n code: \"custom\",\n message: \"An empty readiness snapshot cannot contain child records\",\n });\n }\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\n// Stored events are immutable, so this schema reads back every catalog size the product has ever\n// written -- eight before catalog v2, fourteen now. An exact length here would orphan the history\n// the shipped release already appended and stop the daemon from resolving its newest event at all.\n// Completeness of a *new* assessment is enforced on the write side, by the domain's catalog check.\nexport const projectReadinessAssessedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_READINESS_ASSESSED\"),\n data: z\n .object({\n run: projectReadinessRunSchema,\n checks: z.array(readinessCheckSchema).max(14),\n findings: z.array(securityFindingSchema).max(1_024),\n })\n .strict(),\n});\nexport const projectReadinessAttestedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_READINESS_ATTESTED\"),\n data: z\n .object({\n run: projectReadinessRunSchema,\n check: readinessCheckSchema,\n attestation: readinessAttestationSchema,\n })\n .strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const recordProjectReadinessAssessmentCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_PROJECT_READINESS_ASSESSMENT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n repositoryHead: gitHeadSchema,\n sourceDigest: digestSchema,\n workingTreeDirty: z.boolean(),\n checks: z.array(readinessCheckDraftSchema).length(14),\n })\n .strict(),\n});\nexport const attestProjectReadinessCheckCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"ATTEST_PROJECT_READINESS_CHECK\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n outcome: readinessAttestationOutcomeSchema,\n rationale: z.string().trim().min(1).max(2_000),\n })\n .strict(),\n});\nconst commandResultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n})\n .strict();\n// Replayed from a stored command receipt, so it carries the same historical catalog sizes as the\n// event above.\nexport const projectReadinessAssessedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"PROJECT_READINESS_ASSESSED\"),\n run: projectReadinessRunSchema,\n checks: z.array(readinessCheckSchema).max(14),\n findings: z.array(securityFindingSchema).max(1_024),\n});\nexport const projectReadinessAttestedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"PROJECT_READINESS_ATTESTED\"),\n run: projectReadinessRunSchema,\n check: readinessCheckSchema,\n attestation: readinessAttestationSchema,\n});\nexport const runProjectReadinessRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedProjectVersion: z.number().int().positive(),\n})\n .strict();\nexport const attestProjectReadinessRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n runId: opaqueIdSchema,\n checkId: opaqueIdSchema,\n expectedRunVersion: z.number().int().positive(),\n outcome: readinessAttestationOutcomeSchema,\n rationale: z.string().trim().min(1).max(2_000),\n})\n .strict();\n//# sourceMappingURL=readiness.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { liveProviderIdSchema } from \"./provider-selection.js\";\nexport const providerAllowanceFreshnessSchema = z.enum([\"LIVE\", \"STALE\", \"UNAVAILABLE\"]);\nexport const providerAllowanceBucketKindSchema = z.enum([\n \"PRIMARY\",\n \"SECONDARY\",\n \"FIVE_HOUR\",\n \"SEVEN_DAY\",\n \"SPEND_LIMIT\",\n]);\nexport const providerAllowanceUnavailableReasonSchema = z.enum([\n \"PROVIDER_UNSUPPORTED\",\n \"TARGET_UNVERIFIED\",\n \"NOT_AUTHENTICATED\",\n \"DATA_NOT_PRESENT\",\n \"PROVIDER_SCHEMA_DRIFT\",\n \"PROVIDER_TIMEOUT\",\n \"PROVIDER_UNAVAILABLE\",\n]);\nconst allowancePercentSchema = z.number().min(0).max(1_000);\nexport const providerAllowanceBucketSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .max(96)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/),\n name: z.string().trim().min(1).max(96).nullable(),\n kind: providerAllowanceBucketKindSchema,\n usedPercent: allowancePercentSchema,\n remainingPercent: z.number().min(0).max(100),\n windowDurationMins: z.number().int().positive().max(527_040),\n resetsAt: utcTimestampSchema,\n limitReached: z.boolean(),\n})\n .strict()\n .superRefine((bucket, context) => {\n if (bucket.kind !== \"SPEND_LIMIT\" && bucket.usedPercent > 100) {\n context.addIssue({\n code: \"custom\",\n path: [\"usedPercent\"],\n message: \"A provider consumption window cannot exceed 100 percent\",\n });\n }\n const expectedRemaining = Math.max(0, 100 - bucket.usedPercent);\n if (Math.abs(bucket.remainingPercent - expectedRemaining) > 0.000_001) {\n context.addIssue({\n code: \"custom\",\n path: [\"remainingPercent\"],\n message: \"Remaining provider allowance must be derived from used percent\",\n });\n }\n if (bucket.usedPercent >= 100 && !bucket.limitReached) {\n context.addIssue({\n code: \"custom\",\n path: [\"limitReached\"],\n message: \"An exhausted provider allowance must be marked as reached\",\n });\n }\n});\nconst snapshotBaseSchema = z.object({\n schemaVersion: schemaVersionSchema,\n provider: liveProviderIdSchema,\n observedAt: utcTimestampSchema,\n});\nconst presentProviderAllowanceSnapshotSchema = snapshotBaseSchema\n .extend({\n freshness: z.enum([\"LIVE\", \"STALE\"]),\n buckets: z.array(providerAllowanceBucketSchema).min(1).max(16),\n unavailableReason: z.null(),\n})\n .strict()\n .superRefine((snapshot, context) => {\n if (new Set(snapshot.buckets.map((bucket) => bucket.id)).size !== snapshot.buckets.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"buckets\"],\n message: \"Provider allowance bucket ids must be unique\",\n });\n }\n});\nconst unavailableProviderAllowanceSnapshotSchema = snapshotBaseSchema\n .extend({\n freshness: z.literal(\"UNAVAILABLE\"),\n buckets: z.array(z.never()).length(0),\n unavailableReason: providerAllowanceUnavailableReasonSchema,\n})\n .strict();\nexport const providerAllowanceSnapshotSchema = z.discriminatedUnion(\"freshness\", [\n presentProviderAllowanceSnapshotSchema,\n unavailableProviderAllowanceSnapshotSchema,\n]);\nexport const providerAllowanceAdvisorySchema = z\n .object({\n status: z.enum([\"CAPACITY_AVAILABLE\", \"LOW_CAPACITY\", \"LIMIT_REACHED\", \"UNKNOWN\"]),\n deferUntil: utcTimestampSchema.nullable(),\n})\n .strict();\nexport const projectProviderAllowanceResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n projectId: z.string().min(1).max(128),\n effectiveProvider: liveProviderIdSchema,\n current: providerAllowanceSnapshotSchema,\n advisory: providerAllowanceAdvisorySchema,\n providers: z.array(providerAllowanceSnapshotSchema).length(2),\n})\n .strict()\n .superRefine((response, context) => {\n const expectedProviders = [\"CODEX\", \"CLAUDE_CODE\"];\n if (response.providers.some((snapshot, index) => snapshot.provider !== expectedProviders[index])) {\n context.addIssue({\n code: \"custom\",\n path: [\"providers\"],\n message: \"Provider allowance snapshots must use canonical provider order\",\n });\n }\n if (response.current.provider !== response.effectiveProvider) {\n context.addIssue({\n code: \"custom\",\n path: [\"current\"],\n message: \"Current provider allowance must match the effective provider\",\n });\n }\n});\nexport const refreshProviderAllowanceRequestSchema = z\n .object({ schemaVersion: schemaVersionSchema })\n .strict();\nexport const providerAllowanceQuerySchema = z.object({ projectId: opaqueIdSchema }).strict();\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const recordProviderAllowanceCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RECORD_PROVIDER_ALLOWANCE\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n snapshot: providerAllowanceSnapshotSchema,\n })\n .strict(),\n});\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const providerAllowanceRecordedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROVIDER_ALLOWANCE_RECORDED\"),\n data: z.object({ snapshot: providerAllowanceSnapshotSchema }).strict(),\n});\nexport const providerAllowanceRecordedResultSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n type: z.literal(\"PROVIDER_ALLOWANCE_RECORDED\"),\n snapshot: providerAllowanceSnapshotSchema,\n event: providerAllowanceRecordedEventSchema,\n})\n .strict();\n//# sourceMappingURL=provider-allowance.js.map","import { z } from \"zod\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nconst absolutePathPattern = /^(?:[/\\\\]|[A-Za-z]:[/\\\\])/;\nconst sha256Schema = z.string().regex(/^[0-9a-f]{64}$/);\nconst scaffoldRelativePathSchema = z\n .string()\n .min(1)\n .max(240)\n .regex(/^(?:[A-Za-z0-9._-]+\\/)*[A-Za-z0-9._-]+$/)\n .refine((path) => path !== \".loomrail/scaffold.json\" && path.split(\"/\").every((part) => part !== \".\" && part !== \"..\"), \"A scaffold file path must be portable and cannot replace the system marker\");\nexport const scaffoldRecipeIdSchema = z.literal(\"typescript-node\");\nexport const scaffoldFileManifestSchema = z\n .object({\n path: scaffoldRelativePathSchema,\n bytes: z.number().int().positive().max(65_536),\n contentDigest: sha256Schema,\n})\n .strict();\nexport const scaffoldProposalSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n recipeId: scaffoldRecipeIdSchema,\n recipeVersion: z.literal(1),\n targetPath: z.string().min(1).max(4_096).regex(absolutePathPattern),\n projectName: z.string().min(1).max(80),\n packageName: z.string().min(1).max(80),\n files: z.array(scaffoldFileManifestSchema).min(1).max(32),\n systemFiles: z.tuple([z.literal(\".loomrail/scaffold.json\")]),\n proposalDigest: sha256Schema,\n})\n .strict();\nexport const scaffoldOperationStatusSchema = z.enum([\"PENDING\", \"COMPLETED\", \"FAILED\"]);\nexport const scaffoldOperationErrorCodeSchema = z.enum([\n \"TARGET_CONFLICT\",\n \"TARGET_PARENT_UNAVAILABLE\",\n \"RECIPE_CHANGED\",\n \"SCAFFOLD_FILE_CONFLICT\",\n \"GIT_UNAVAILABLE\",\n \"GIT_INIT_FAILED\",\n \"REPOSITORY_INVALID\",\n \"SCAFFOLD_WRITE_FAILED\",\n]);\nexport const scaffoldOperationSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n proposal: scaffoldProposalSchema,\n status: scaffoldOperationStatusSchema,\n attempts: z.number().int().nonnegative(),\n lastErrorCode: scaffoldOperationErrorCodeSchema.nullable(),\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n completedAt: utcTimestampSchema.nullable(),\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateType: z.literal(\"PROJECT\"),\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\nexport const projectScaffoldRequestedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_REQUESTED\"),\n data: z.object({ operation: scaffoldOperationSchema }).strict(),\n});\nexport const projectScaffoldCompletedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_COMPLETED\"),\n data: z.object({ operation: scaffoldOperationSchema }).strict(),\n});\nexport const projectScaffoldFailedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_FAILED\"),\n data: z.object({ operation: scaffoldOperationSchema }).strict(),\n});\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\nexport const requestProjectScaffoldCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REQUEST_PROJECT_SCAFFOLD\"),\n payload: z.object({ proposal: scaffoldProposalSchema }).strict(),\n});\nexport const completeProjectScaffoldCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"COMPLETE_PROJECT_SCAFFOLD\"),\n payload: z\n .object({\n operationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nexport const failProjectScaffoldCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"FAIL_PROJECT_SCAFFOLD\"),\n payload: z\n .object({\n operationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n errorCode: scaffoldOperationErrorCodeSchema,\n })\n .strict(),\n});\nexport const retryProjectScaffoldCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"RETRY_PROJECT_SCAFFOLD\"),\n payload: z\n .object({\n operationId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n })\n .strict(),\n});\nconst resultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n})\n .strict();\nexport const projectScaffoldRequestedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_REQUESTED\"),\n operation: scaffoldOperationSchema,\n event: projectScaffoldRequestedEventSchema,\n});\nexport const projectScaffoldCompletedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_COMPLETED\"),\n operation: scaffoldOperationSchema,\n event: projectScaffoldCompletedEventSchema,\n});\nexport const projectScaffoldFailedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_FAILED\"),\n operation: scaffoldOperationSchema,\n event: projectScaffoldFailedEventSchema,\n});\nexport const projectScaffoldRetriedResultSchema = resultBaseSchema.extend({\n type: z.literal(\"PROJECT_SCAFFOLD_RETRIED\"),\n operation: scaffoldOperationSchema,\n event: projectScaffoldRequestedEventSchema,\n});\nexport const proposeProjectScaffoldRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n recipeId: scaffoldRecipeIdSchema,\n targetPath: z.string().min(1).max(4_096),\n})\n .strict();\nexport const proposeProjectScaffoldResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, proposal: scaffoldProposalSchema })\n .strict();\nexport const publishProjectScaffoldRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n proposal: scaffoldProposalSchema,\n})\n .strict();\nexport const retryProjectScaffoldRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n})\n .strict();\nexport const scaffoldOperationResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, operation: scaffoldOperationSchema.nullable() })\n .strict();\nexport const scaffoldOperationsResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, operations: z.array(scaffoldOperationSchema) })\n .strict();\n//# sourceMappingURL=scaffolding.js.map","import { z } from \"zod\";\nimport { agentRunClaimLimitsSchema, agentRunSchema, squadAssignmentSchema } from \"./agents.js\";\nimport { agentRunActivityDegradedMarkedResultSchema, agentRunActivityRecordedResultSchema, agentRunActivityRetentionAppliedResultSchema, deleteExpiredAgentRunActivityCommandSchema, markAgentRunActivityDegradedCommandSchema, recordAgentRunActivityCommandSchema, } from \"./activity.js\";\nimport { adoptDeploymentPlanCommandSchema, approveDeploymentCommandSchema, deploymentChangedEventSchema, deploymentChangedResultSchema, deploymentPlanAdoptedEventSchema, deploymentPlanAdoptedResultSchema, reconcileDeploymentCommandSchema, recordDeploymentDispatchCommandSchema, recordDeploymentObservationCommandSchema, startDeploymentCommandSchema, } from \"./guided-deployment.js\";\nimport { adoptLaunchMeasurementPlanCommandSchema, cancelLaunchMeasurementRunCommandSchema, completeLaunchMeasurementRunCommandSchema, disableLaunchMeasurementPlanCommandSchema, interruptLaunchMeasurementRunCommandSchema, launchMeasurementPlanChangedEventSchema, launchMeasurementPlanChangedResultSchema, launchMeasurementRunChangedEventSchema, launchMeasurementRunChangedResultSchema, startLaunchMeasurementRunCommandSchema, } from \"./launch-measurement.js\";\nimport { createLaunchReleaseCommandSchema, launchEnvironmentChangedEventSchema, launchEnvironmentChangedResultSchema, launchReleaseCreatedEventSchema, launchReleaseCreatedResultSchema, saveLaunchEnvironmentCommandSchema, } from \"./launch-release.js\";\nimport { providerModelMappingSchema } from \"./provider-selection.js\";\nimport { setWorkItemDependenciesCommandSchema, workItemDependenciesSetEventSchema, workItemDependenciesSetResultSchema, } from \"./dependency.js\";\nimport { actorSchema, correlationIdSchema, opaqueIdSchema, schemaVersionSchema, utcTimestampSchema, } from \"./shared.js\";\nimport { reviewFindingOwnerDispositionSchema, reviewFindingSchema } from \"./review.js\";\nimport { completeQARunCommandSchema, qaAttachmentRetentionRecordedResultSchema, qaCorrectionExhaustedEventSchema, qaCorrectionCancelledEventSchema, qaCorrectionPassedEventSchema, qaCorrectionStartedEventSchema, qaDefectWaivedEventSchema, qaDefectWaivedResultSchema, qaRunCompletedEventSchema, qaRunCompletedResultSchema, qaRunReservedEventSchema, qaRunReservedResultSchema, recordQAAttachmentRetentionCommandSchema, reserveQARunCommandSchema, waiveQADefectCommandSchema, } from \"./qa.js\";\nimport { acceptanceRequestedEventSchema, acceptanceResolvedEventSchema, acceptanceResolvedResultSchema, approveBudgetOverrideCommandSchema, answerHumanRequestCommandSchema, applyProviderOutcomeCommandSchema, legacyApplyProviderOutcomeCommandSchema, budgetOverrideApprovedEventSchema, budgetOverrideApprovedResultSchema, budgetThresholdReachedEventSchema, cancelPipelineCommandSchema, checkpointPublishedEventSchema, checkpointPublishedResultSchema, contextFloorExceededEventSchema, contextHandoffRequestedEventSchema, contextHandoffRequestedResultSchema, contextPackShareReducedResultSchema, endProviderSessionCommandSchema, hardPauseStageAttemptCommandSchema, humanRequestAnsweredResultSchema, humanRequestOpenedEventSchema, humanRequestResolvedEventSchema, evidenceArtifactRecordedEventSchema, markWorkflowDispatchStartedCommandSchema, legacyProviderOutcomeAppliedResultSchema, pausePipelineCommandSchema, pipelineCancelledEventSchema, pipelineCompletedEventSchema, pipelineControlAppliedResultSchema, pipelinePausedEventSchema, pipelineResumedEventSchema, pipelineRunSchema, pipelineStartedEventSchema, pipelineStartedResultSchema, providerSessionEndedEventSchema, providerSessionEndedResultSchema, providerSessionProcessRecordedResultSchema, providerOutcomeAppliedResultSchema, providerUsageRecordedResultSchema, providerSessionStartedEventSchema, providerSessionStartedResultSchema, providerIdSchema, publishCheckpointCommandSchema, reconcileWorkflowsCommandSchema, resolveQACorrectionGateCommandSchema, qaCorrectionGateResolvedResultSchema, verificationCorrectionGateResolvedResultSchema, verificationStaleFailureMaterializedResultSchema, recordProviderSessionProcessCommandSchema, recordProviderUsageCommandSchema, reduceContextPackShareCommandSchema, recoveryReportCreatedEventSchema, reviewFindingRecordedEventSchema, reviewFindingResolvedEventSchema, reviewLoopExhaustedEventSchema, reviewReportRecordedEventSchema, resolveAcceptanceCommandSchema, resumePipelineCommandSchema, requestContextHandoffCommandSchema, stageAttemptChangedEventSchema, stageAttemptHardPausedResultSchema, stageAttemptSchema, startPipelineCommandSchema, legacyStartPipelineCommandSchema, startProviderSessionCommandSchema, usageRecordedEventSchema, workflowDispatchSchema, workflowDispatchStartedResultSchema, workflowStageSchema, workflowsReconciledResultSchema, } from \"./workflow.js\";\nimport { acquireWorkspaceLeaseCommandSchema, createWorkItemWorkspaceCommandSchema, markWorkspaceOrphanedCommandSchema, releaseWorkspaceLeaseCommandSchema, workItemWorkspaceCreatedEventSchema, workItemWorkspaceCreatedResultSchema, workItemWorkspaceOrphanedEventSchema, workItemWorkspaceOrphanedResultSchema, workspaceLeaseAcquiredResultSchema, workspaceLeaseReleasedResultSchema, } from \"./workspace.js\";\nimport { finishWorkspaceToolCallCommandSchema, startWorkspaceToolCallCommandSchema, workspaceToolCallChangedEventSchema, workspaceToolCallChangedResultSchema, } from \"./workspace-tool.js\";\nimport { completeProjectConstitutionPublicationCommandSchema, failProjectConstitutionPublicationCommandSchema, projectConstitutionActivatedEventSchema, projectConstitutionActivatedResultSchema, projectConstitutionProposedEventSchema, projectConstitutionProposedResultSchema, projectConstitutionPublicationFailedEventSchema, projectConstitutionPublicationFailedResultSchema, projectConstitutionPublicationRequestedEventSchema, projectConstitutionPublicationRequestedResultSchema, projectConstitutionPublicationRetriedResultSchema, proposeProjectConstitutionCommandSchema, requestProjectConstitutionAdoptionCommandSchema, retryProjectConstitutionPublicationCommandSchema, } from \"./constitution.js\";\nimport { attestProjectReadinessCheckCommandSchema, projectReadinessAssessedEventSchema, projectReadinessAssessedResultSchema, projectReadinessAttestedEventSchema, projectReadinessAttestedResultSchema, recordProjectReadinessAssessmentCommandSchema, } from \"./readiness.js\";\nimport { confirmMcpProfileCommandSchema, mcpGrantChangedEventSchema, mcpGrantChangedResultSchema, mcpCapabilityRecordedResultSchema, finishMcpToolCallCommandSchema, mcpToolCallChangedResultSchema, mcpProfileConsentedEventSchema, mcpProfileConsentedResultSchema, revokeMcpProfileGrantCommandSchema, recordMcpCapabilitySnapshotCommandSchema, startMcpToolCallCommandSchema, setMcpProfileGrantCommandSchema, } from \"./mcp.js\";\nimport { projectProviderPreferenceChangedEventSchema, projectProviderPreferenceChangedResultSchema, providerPreferenceSchema, setProjectProviderPreferenceCommandSchema, } from \"./provider-selection.js\";\nimport { projectWorkspaceStrategyChangedEventSchema, projectWorkspaceStrategyChangedResultSchema, setProjectWorkspaceStrategyCommandSchema, } from \"./workspace-strategy.js\";\nimport { providerAllowanceRecordedEventSchema, providerAllowanceRecordedResultSchema, recordProviderAllowanceCommandSchema, } from \"./provider-allowance.js\";\nimport { completeProjectScaffoldCommandSchema, failProjectScaffoldCommandSchema, projectScaffoldCompletedEventSchema, projectScaffoldCompletedResultSchema, projectScaffoldFailedEventSchema, projectScaffoldFailedResultSchema, projectScaffoldRequestedEventSchema, projectScaffoldRequestedResultSchema, projectScaffoldRetriedResultSchema, requestProjectScaffoldCommandSchema, retryProjectScaffoldCommandSchema, } from \"./scaffolding.js\";\nimport { adoptVerificationPlanCommandSchema, disableVerificationPlanCommandSchema, cancelVerificationRunCommandSchema, completeVerificationCheckCommandSchema, completeVerificationPlanPublicationCommandSchema, failVerificationPlanPublicationCommandSchema, finalizeVerificationRunCancellationCommandSchema, interruptVerificationRunCommandSchema, materializeStaleVerificationFailureCommandSchema, recordVerificationOutputRetentionCommandSchema, resolveVerificationCorrectionGateCommandSchema, retryVerificationRunCommandSchema, retryVerificationPlanPublicationCommandSchema, startVerificationCheckCommandSchema, startVerificationRunCommandSchema, verificationCheckCompletedEventSchema, verificationCheckCompletedResultSchema, verificationCheckStartedEventSchema, verificationCheckStartedResultSchema, verificationCorrectionCancelledEventSchema, verificationCorrectionExhaustedEventSchema, verificationCorrectionPassedEventSchema, verificationCorrectionStartedEventSchema, verificationCorrectionSupersededEventSchema, verificationFailureRecordedEventSchema, verificationOutputRetentionRecordedResultSchema, verificationPlanAdoptedEventSchema, verificationPlanAdoptedResultSchema, verificationPlanDisabledEventSchema, verificationPlanDisabledResultSchema, verificationPlanPublicationAppliedEventSchema, verificationPlanPublicationAppliedResultSchema, verificationPlanPublicationFailedEventSchema, verificationPlanPublicationFailedResultSchema, verificationPlanPublicationRetriedEventSchema, verificationPlanPublicationRetriedResultSchema, verificationRunInterruptedEventSchema, verificationRunInterruptedResultSchema, verificationRunCancellationRequestedEventSchema, verificationRunCancellationRequestedResultSchema, verificationRunReservedEventSchema, verificationRunReservedResultSchema, } from \"./verification.js\";\nexport const fixtureProjectIdSchema = z.enum([\"web-app-a\", \"api-service-b\"]);\nexport const projectStatusSchema = z.enum([\"PROVISIONING\", \"ACTIVE\", \"ARCHIVED\"]);\nexport const workItemTypeSchema = z.enum([\"EPIC\", \"FEATURE\", \"TASK\", \"BUG\", \"SPIKE\", \"SUBTASK\"]);\nexport const workItemStateSchema = z.enum([\n \"BACKLOG\",\n \"READY\",\n \"IN_PROGRESS\",\n \"BLOCKED\",\n \"DONE\",\n \"CANCELLED\",\n]);\nexport const prioritySchema = z.enum([\"LOW\", \"MEDIUM\", \"HIGH\", \"URGENT\"]);\nexport const riskSchema = z.enum([\"LOW\", \"MEDIUM\", \"HIGH\", \"CRITICAL\"]);\nconst titleSchema = z.string().trim().min(1).max(200);\nconst descriptionSchema = z.string().trim().max(20_000);\n/**\n * A repository path exactly as an owner typed it, before anything has judged it.\n *\n * Bounded only in length, because this is the *request* side: a path that is relative, or points at\n * something that is not a repository, has to reach the daemon so the owner can be told which of\n * those it was. Rejecting it here would collapse both into one \"the request payload is invalid\".\n */\nconst repositoryPathTextSchema = z.string().min(1).max(4_096);\n// Absolute, tested here rather than with `node:path`'s `isAbsolute`, because this package is parsed\n// in the browser as well as in the daemon and must not import a Node builtin -- and because\n// `isAbsolute` answers for the platform it is running on, while a contract has to mean the same\n// thing wherever it is read. Both platform spellings are accepted: a rooted POSIX path, a\n// drive-letter path, and a UNC share, since macOS and Windows are both blocking platforms.\nconst absolutePathPattern = /^(?:[/\\\\]|[A-Za-z]:[/\\\\])/;\n/**\n * A repository path a Project may actually *record*.\n *\n * Absolute, without exception. A relative path has no meaning outside the process that resolved it:\n * typing `.` into the Settings field used to register whatever directory the daemon happened to be\n * launched from, silently and with a 200, while every field description promised an absolute path.\n * A Project's path is read back by a daemon started from somewhere else entirely -- a launcher, a\n * login item, a different shell -- so a stored relative path names a different repository on the\n * next start than it did on this one.\n *\n * Enforced on the command and on the Project itself rather than only at the HTTP edge, so no route,\n * fixture or test can put a relative path into the database by a path that skips the edge check.\n */\nconst repositoryPathSchema = repositoryPathTextSchema.regex(absolutePathPattern, \"A repository path must be absolute\");\nconst acceptanceCriteriaSchema = z.array(z.string().trim().min(1).max(500)).max(50);\nexport const projectSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n workspaceId: opaqueIdSchema,\n // Nullable, not optional: a Project registered by path is a local Git repository the owner\n // named, and it genuinely has no bundled fixture behind it (spec\n // docs/plans/13-e1-workspace-execution-spec.ru.md §4). Absent would read as \"not recorded\";\n // null records the fact that there is nothing to record -- the same discipline\n // workItemWorkspaceSchema's baseCommit and snapshotCommit follow in workspace.ts.\n fixtureId: fixtureProjectIdSchema.nullable(),\n name: titleSchema,\n repositoryPath: repositoryPathSchema,\n providerPreference: providerPreferenceSchema.default(\"AUTO\"),\n status: projectStatusSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n})\n .strict();\nexport const workItemSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n projectId: opaqueIdSchema,\n parentId: opaqueIdSchema.nullable(),\n type: workItemTypeSchema,\n title: titleSchema,\n description: descriptionSchema,\n state: workItemStateSchema,\n currentStage: workflowStageSchema.nullable(),\n priority: prioritySchema,\n risk: riskSchema,\n acceptanceCriteria: acceptanceCriteriaSchema,\n version: z.number().int().positive(),\n createdAt: utcTimestampSchema,\n updatedAt: utcTimestampSchema,\n})\n .strict();\nconst eventBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n sequence: z.number().int().positive(),\n id: opaqueIdSchema,\n aggregateId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n actor: actorSchema,\n occurredAt: utcTimestampSchema,\n correlationId: correlationIdSchema,\n})\n .strict();\n/**\n * Records that, at this moment, this Project is registered at this repository path.\n *\n * REPOINT_FIXTURE_PROJECT emits this too, and deliberately not an event type of its own. What the\n * repoint changes is exactly what this event already carries -- the Project, path included -- and\n * the path it moved *off* is not lost by reusing the type: it is the `repositoryPath` on this same\n * Project's earlier PROJECT_REGISTERED event, which the append-only log still holds. A second event\n * type would have bought a field the log already answers, at the price of rebuilding the `events`\n * CHECK constraint (migration 0011's shape) on the owner's real database.\n */\nexport const projectRegisteredEventSchema = eventBaseSchema.extend({\n type: z.literal(\"PROJECT_REGISTERED\"),\n aggregateType: z.literal(\"PROJECT\"),\n data: z.object({ project: projectSchema }).strict(),\n});\nexport const workItemCreatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_CREATED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ workItem: workItemSchema }).strict(),\n});\nexport const workItemChangedFieldSchema = z.enum([\n \"title\",\n \"description\",\n \"priority\",\n \"risk\",\n \"acceptanceCriteria\",\n]);\nexport const workItemUpdatedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_UPDATED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n workItem: workItemSchema,\n changedFields: z.array(workItemChangedFieldSchema).min(1),\n })\n .strict(),\n});\nexport const workItemStateChangedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_STATE_CHANGED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z\n .object({\n workItem: workItemSchema,\n previousState: workItemStateSchema,\n })\n .strict(),\n});\nexport const squadAssignedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"SQUAD_ASSIGNED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ assignment: squadAssignmentSchema }).strict(),\n});\nexport const agentRunStartedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_STARTED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ run: agentRunSchema }).strict(),\n});\nexport const agentRunFinishedEventSchema = eventBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_FINISHED\"),\n aggregateType: z.literal(\"WORK_ITEM\"),\n data: z.object({ run: agentRunSchema }).strict(),\n});\nexport const domainEventSchema = z.discriminatedUnion(\"type\", [\n projectRegisteredEventSchema,\n projectScaffoldRequestedEventSchema,\n projectScaffoldCompletedEventSchema,\n projectScaffoldFailedEventSchema,\n projectConstitutionProposedEventSchema,\n projectConstitutionPublicationRequestedEventSchema,\n projectConstitutionActivatedEventSchema,\n projectConstitutionPublicationFailedEventSchema,\n projectReadinessAssessedEventSchema,\n projectReadinessAttestedEventSchema,\n projectProviderPreferenceChangedEventSchema,\n projectWorkspaceStrategyChangedEventSchema,\n launchMeasurementPlanChangedEventSchema,\n launchMeasurementRunChangedEventSchema,\n launchEnvironmentChangedEventSchema,\n launchReleaseCreatedEventSchema,\n deploymentPlanAdoptedEventSchema,\n deploymentChangedEventSchema,\n verificationPlanAdoptedEventSchema,\n verificationPlanDisabledEventSchema,\n verificationPlanPublicationAppliedEventSchema,\n verificationPlanPublicationFailedEventSchema,\n verificationPlanPublicationRetriedEventSchema,\n verificationRunReservedEventSchema,\n verificationCheckStartedEventSchema,\n verificationCheckCompletedEventSchema,\n verificationRunCancellationRequestedEventSchema,\n verificationRunInterruptedEventSchema,\n verificationFailureRecordedEventSchema,\n verificationCorrectionCancelledEventSchema,\n verificationCorrectionExhaustedEventSchema,\n verificationCorrectionPassedEventSchema,\n verificationCorrectionStartedEventSchema,\n verificationCorrectionSupersededEventSchema,\n providerAllowanceRecordedEventSchema,\n mcpProfileConsentedEventSchema,\n mcpGrantChangedEventSchema,\n workItemCreatedEventSchema,\n workItemUpdatedEventSchema,\n workItemStateChangedEventSchema,\n workItemDependenciesSetEventSchema,\n squadAssignedEventSchema,\n agentRunStartedEventSchema,\n agentRunFinishedEventSchema,\n qaRunReservedEventSchema,\n qaRunCompletedEventSchema,\n qaDefectWaivedEventSchema,\n qaCorrectionStartedEventSchema,\n qaCorrectionExhaustedEventSchema,\n qaCorrectionCancelledEventSchema,\n qaCorrectionPassedEventSchema,\n pipelineStartedEventSchema,\n stageAttemptChangedEventSchema,\n humanRequestOpenedEventSchema,\n humanRequestResolvedEventSchema,\n usageRecordedEventSchema,\n budgetThresholdReachedEventSchema,\n pipelinePausedEventSchema,\n pipelineResumedEventSchema,\n pipelineCancelledEventSchema,\n budgetOverrideApprovedEventSchema,\n recoveryReportCreatedEventSchema,\n evidenceArtifactRecordedEventSchema,\n reviewReportRecordedEventSchema,\n reviewFindingRecordedEventSchema,\n reviewFindingResolvedEventSchema,\n reviewLoopExhaustedEventSchema,\n acceptanceRequestedEventSchema,\n acceptanceResolvedEventSchema,\n pipelineCompletedEventSchema,\n providerSessionStartedEventSchema,\n checkpointPublishedEventSchema,\n contextHandoffRequestedEventSchema,\n providerSessionEndedEventSchema,\n contextFloorExceededEventSchema,\n workItemWorkspaceCreatedEventSchema,\n workItemWorkspaceOrphanedEventSchema,\n workspaceToolCallChangedEventSchema,\n]);\nconst commandBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n correlationId: correlationIdSchema,\n actor: actorSchema,\n})\n .strict();\n/**\n * Registers a Project at a local Git repository.\n *\n * One command for both ways in, because there is only one thing being recorded: a repository\n * Loomrail may branch. Where the repository came from is data, not a second operation -- a bundled\n * fixture names itself in `fixtureId`, a repository the owner registered by path leaves it null,\n * and everything downstream (the dedupe on id/fixture/path, the PROJECT_REGISTERED event, the row)\n * is identical either way. It was called REGISTER_FIXTURE_PROJECT while a fixture was the only way\n * in; keeping that name over a null `fixtureId` would be a command lying about what it registers.\n */\nexport const registerProjectCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REGISTER_PROJECT\"),\n payload: z\n .object({\n id: opaqueIdSchema,\n fixtureId: fixtureProjectIdSchema.nullable(),\n name: titleSchema,\n repositoryPath: repositoryPathSchema,\n })\n .strict(),\n});\n/**\n * Moves a fixture-backed Project off the bundled template it still records, onto the repository\n * that template has just been materialised into.\n *\n * Why this exists at all: the two demo Projects were registered before a bundled fixture became a\n * real repository, so their `repository_path` names a directory *inside Loomrail's own checkout*.\n * Migration 0012 carried those paths across verbatim -- correctly, because a migration cannot know\n * the data directory, which is runtime configuration -- and pressing \"Initialize demo workspace\"\n * afterwards materialised the repository and then answered PROJECT_ALREADY_REGISTERED, leaving the\n * fresh repository orphaned on disk and the Project pointing at the template forever. Every stage\n * that needs a workspace is refused at such a path, and no route repaired it.\n *\n * A command of its own rather than a widening of REGISTER_PROJECT, because it is a different claim:\n * that one asserts nothing is registered here yet, this one asserts something is and names both the\n * path it must currently record and the path it should record instead.\n *\n * `expectedRepositoryPath` is the guard, not a convenience. The persistence layer applies this only\n * when the row still carries exactly that path, so a Project the owner registered by path can never\n * be moved by it, and a concurrent registration that already fixed the row is refused rather than\n * silently re-applied.\n */\nexport const repointFixtureProjectCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"REPOINT_FIXTURE_PROJECT\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n // Non-nullable, unlike REGISTER_PROJECT's: only a fixture-backed Project can be re-pointed,\n // and requiring the fixture here is half of what keeps a path-registered one out of reach.\n fixtureId: fixtureProjectIdSchema,\n expectedRepositoryPath: repositoryPathSchema,\n repositoryPath: repositoryPathSchema,\n })\n .strict(),\n});\nexport const createWorkItemCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"CREATE_WORK_ITEM\"),\n payload: z\n .object({\n projectId: opaqueIdSchema,\n parentId: opaqueIdSchema.nullable().default(null),\n type: workItemTypeSchema,\n title: titleSchema,\n description: descriptionSchema.default(\"\"),\n priority: prioritySchema.default(\"MEDIUM\"),\n risk: riskSchema.default(\"MEDIUM\"),\n acceptanceCriteria: acceptanceCriteriaSchema.default([]),\n })\n .strict(),\n});\nexport const workItemPatchSchema = z\n .object({\n title: titleSchema.optional(),\n description: descriptionSchema.optional(),\n priority: prioritySchema.optional(),\n risk: riskSchema.optional(),\n acceptanceCriteria: acceptanceCriteriaSchema.optional(),\n})\n .strict()\n .refine((patch) => Object.keys(patch).length > 0, { message: \"At least one field must be updated\" });\nexport const updateWorkItemCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"UPDATE_WORK_ITEM\"),\n payload: z\n .object({\n workItemId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n patch: workItemPatchSchema,\n })\n .strict(),\n});\nexport const moveWorkItemCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"MOVE_WORK_ITEM\"),\n payload: z\n .object({\n workItemId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n targetState: workItemStateSchema,\n })\n .strict(),\n});\nexport const startAgentRunCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"START_AGENT_RUN\"),\n payload: z\n .object({\n dispatchId: opaqueIdSchema,\n provider: providerIdSchema,\n // Optional only for replaying command receipts created before exact model snapshots. The\n // daemon now supplies the mapping from the selected adapter, never from HTTP or provider text.\n modelMapping: providerModelMappingSchema.nullable().optional(),\n limits: agentRunClaimLimitsSchema,\n })\n .strict(),\n});\nexport const disposeReviewFindingCommandSchema = commandBaseSchema.extend({\n type: z.literal(\"DISPOSE_REVIEW_FINDING\"),\n payload: z\n .object({\n findingId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n disposition: reviewFindingOwnerDispositionSchema,\n reason: z.string().trim().min(1).max(4_000),\n })\n .strict(),\n});\nexport const stateCommandSchema = z.discriminatedUnion(\"type\", [\n registerProjectCommandSchema,\n repointFixtureProjectCommandSchema,\n requestProjectScaffoldCommandSchema,\n completeProjectScaffoldCommandSchema,\n failProjectScaffoldCommandSchema,\n retryProjectScaffoldCommandSchema,\n proposeProjectConstitutionCommandSchema,\n requestProjectConstitutionAdoptionCommandSchema,\n completeProjectConstitutionPublicationCommandSchema,\n failProjectConstitutionPublicationCommandSchema,\n retryProjectConstitutionPublicationCommandSchema,\n recordProjectReadinessAssessmentCommandSchema,\n attestProjectReadinessCheckCommandSchema,\n setProjectProviderPreferenceCommandSchema,\n setProjectWorkspaceStrategyCommandSchema,\n adoptLaunchMeasurementPlanCommandSchema,\n disableLaunchMeasurementPlanCommandSchema,\n startLaunchMeasurementRunCommandSchema,\n cancelLaunchMeasurementRunCommandSchema,\n completeLaunchMeasurementRunCommandSchema,\n interruptLaunchMeasurementRunCommandSchema,\n saveLaunchEnvironmentCommandSchema,\n createLaunchReleaseCommandSchema,\n adoptDeploymentPlanCommandSchema,\n approveDeploymentCommandSchema,\n startDeploymentCommandSchema,\n recordDeploymentDispatchCommandSchema,\n recordDeploymentObservationCommandSchema,\n reconcileDeploymentCommandSchema,\n adoptVerificationPlanCommandSchema,\n disableVerificationPlanCommandSchema,\n completeVerificationPlanPublicationCommandSchema,\n failVerificationPlanPublicationCommandSchema,\n retryVerificationPlanPublicationCommandSchema,\n startVerificationRunCommandSchema,\n retryVerificationRunCommandSchema,\n materializeStaleVerificationFailureCommandSchema,\n startVerificationCheckCommandSchema,\n completeVerificationCheckCommandSchema,\n cancelVerificationRunCommandSchema,\n finalizeVerificationRunCancellationCommandSchema,\n interruptVerificationRunCommandSchema,\n recordVerificationOutputRetentionCommandSchema,\n recordProviderAllowanceCommandSchema,\n confirmMcpProfileCommandSchema,\n setMcpProfileGrantCommandSchema,\n revokeMcpProfileGrantCommandSchema,\n recordMcpCapabilitySnapshotCommandSchema,\n startMcpToolCallCommandSchema,\n finishMcpToolCallCommandSchema,\n createWorkItemCommandSchema,\n updateWorkItemCommandSchema,\n moveWorkItemCommandSchema,\n setWorkItemDependenciesCommandSchema,\n startAgentRunCommandSchema,\n reserveQARunCommandSchema,\n completeQARunCommandSchema,\n recordQAAttachmentRetentionCommandSchema,\n waiveQADefectCommandSchema,\n disposeReviewFindingCommandSchema,\n startPipelineCommandSchema,\n legacyStartPipelineCommandSchema,\n markWorkflowDispatchStartedCommandSchema,\n applyProviderOutcomeCommandSchema,\n legacyApplyProviderOutcomeCommandSchema,\n answerHumanRequestCommandSchema,\n resolveQACorrectionGateCommandSchema,\n resolveVerificationCorrectionGateCommandSchema,\n pausePipelineCommandSchema,\n resumePipelineCommandSchema,\n cancelPipelineCommandSchema,\n approveBudgetOverrideCommandSchema,\n reconcileWorkflowsCommandSchema,\n resolveAcceptanceCommandSchema,\n startProviderSessionCommandSchema,\n recordProviderSessionProcessCommandSchema,\n recordProviderUsageCommandSchema,\n publishCheckpointCommandSchema,\n endProviderSessionCommandSchema,\n requestContextHandoffCommandSchema,\n hardPauseStageAttemptCommandSchema,\n reduceContextPackShareCommandSchema,\n createWorkItemWorkspaceCommandSchema,\n acquireWorkspaceLeaseCommandSchema,\n releaseWorkspaceLeaseCommandSchema,\n markWorkspaceOrphanedCommandSchema,\n startWorkspaceToolCallCommandSchema,\n finishWorkspaceToolCallCommandSchema,\n recordAgentRunActivityCommandSchema,\n markAgentRunActivityDegradedCommandSchema,\n deleteExpiredAgentRunActivityCommandSchema,\n]);\nconst commandResultBaseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n replayed: z.boolean(),\n})\n .strict();\nexport const projectRegisteredResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"PROJECT_REGISTERED\"),\n project: projectSchema,\n event: projectRegisteredEventSchema,\n});\nexport const workItemCreatedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_CREATED\"),\n workItem: workItemSchema,\n event: workItemCreatedEventSchema,\n});\nexport const workItemUpdatedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_UPDATED\"),\n workItem: workItemSchema,\n event: workItemUpdatedEventSchema,\n});\nexport const workItemMovedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"WORK_ITEM_MOVED\"),\n workItem: workItemSchema,\n event: workItemStateChangedEventSchema,\n});\nexport const agentRunStartedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_STARTED\"),\n workItemId: opaqueIdSchema,\n assignment: squadAssignmentSchema,\n run: agentRunSchema,\n events: z.array(z.discriminatedUnion(\"type\", [\n squadAssignedEventSchema,\n stageAttemptChangedEventSchema,\n agentRunStartedEventSchema,\n ])),\n});\n// START_AGENT_RUN found the active budget already exhausted. No run is reserved: the queued\n// StageAttempt is parked HARD_PAUSED before it starts, exactly as a cap crossed by the previous\n// stage's terminal usage parks the next one, so the owner sees the pause and can raise the cost\n// policy. Without this the daemon retried the reservation every pass with nothing to show for it.\nexport const agentRunBudgetParkedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"AGENT_RUN_BUDGET_PARKED\"),\n workItemId: opaqueIdSchema,\n run: pipelineRunSchema,\n stageAttempt: stageAttemptSchema,\n dispatch: workflowDispatchSchema,\n events: z.array(z.discriminatedUnion(\"type\", [stageAttemptChangedEventSchema, pipelinePausedEventSchema])),\n});\nexport const reviewFindingDisposedResultSchema = commandResultBaseSchema.extend({\n type: z.literal(\"REVIEW_FINDING_DISPOSED\"),\n workItemId: opaqueIdSchema,\n finding: reviewFindingSchema,\n events: z.array(reviewFindingResolvedEventSchema).length(1),\n});\nexport const stateCommandResultSchema = z.discriminatedUnion(\"type\", [\n projectRegisteredResultSchema,\n projectScaffoldRequestedResultSchema,\n projectScaffoldCompletedResultSchema,\n projectScaffoldFailedResultSchema,\n projectScaffoldRetriedResultSchema,\n projectConstitutionProposedResultSchema,\n projectConstitutionPublicationRequestedResultSchema,\n projectConstitutionActivatedResultSchema,\n projectConstitutionPublicationFailedResultSchema,\n projectConstitutionPublicationRetriedResultSchema,\n projectReadinessAssessedResultSchema,\n projectReadinessAttestedResultSchema,\n projectProviderPreferenceChangedResultSchema,\n projectWorkspaceStrategyChangedResultSchema,\n launchMeasurementPlanChangedResultSchema,\n launchMeasurementRunChangedResultSchema,\n launchEnvironmentChangedResultSchema,\n launchReleaseCreatedResultSchema,\n deploymentPlanAdoptedResultSchema,\n deploymentChangedResultSchema,\n verificationPlanAdoptedResultSchema,\n verificationPlanDisabledResultSchema,\n verificationPlanPublicationAppliedResultSchema,\n verificationPlanPublicationFailedResultSchema,\n verificationPlanPublicationRetriedResultSchema,\n verificationRunReservedResultSchema,\n verificationCheckStartedResultSchema,\n verificationCheckCompletedResultSchema,\n verificationRunCancellationRequestedResultSchema,\n verificationRunInterruptedResultSchema,\n verificationOutputRetentionRecordedResultSchema,\n providerAllowanceRecordedResultSchema,\n mcpProfileConsentedResultSchema,\n mcpGrantChangedResultSchema,\n mcpCapabilityRecordedResultSchema,\n mcpToolCallChangedResultSchema,\n workItemCreatedResultSchema,\n workItemUpdatedResultSchema,\n workItemMovedResultSchema,\n workItemDependenciesSetResultSchema,\n agentRunStartedResultSchema,\n agentRunBudgetParkedResultSchema,\n qaRunReservedResultSchema,\n qaRunCompletedResultSchema,\n qaAttachmentRetentionRecordedResultSchema,\n qaDefectWaivedResultSchema,\n reviewFindingDisposedResultSchema,\n pipelineStartedResultSchema,\n workflowDispatchStartedResultSchema,\n providerOutcomeAppliedResultSchema,\n legacyProviderOutcomeAppliedResultSchema,\n humanRequestAnsweredResultSchema,\n qaCorrectionGateResolvedResultSchema,\n verificationCorrectionGateResolvedResultSchema,\n verificationStaleFailureMaterializedResultSchema,\n pipelineControlAppliedResultSchema,\n budgetOverrideApprovedResultSchema,\n workflowsReconciledResultSchema,\n acceptanceResolvedResultSchema,\n providerSessionStartedResultSchema,\n providerSessionProcessRecordedResultSchema,\n providerUsageRecordedResultSchema,\n checkpointPublishedResultSchema,\n providerSessionEndedResultSchema,\n contextHandoffRequestedResultSchema,\n stageAttemptHardPausedResultSchema,\n contextPackShareReducedResultSchema,\n workItemWorkspaceCreatedResultSchema,\n workspaceLeaseAcquiredResultSchema,\n workspaceLeaseReleasedResultSchema,\n workItemWorkspaceOrphanedResultSchema,\n workspaceToolCallChangedResultSchema,\n agentRunActivityRecordedResultSchema,\n agentRunActivityDegradedMarkedResultSchema,\n agentRunActivityRetentionAppliedResultSchema,\n]);\nexport const registerFixtureProjectRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n fixtureId: fixtureProjectIdSchema,\n})\n .strict();\n/**\n * Registering the owner's own repository by path.\n *\n * A separate request from the fixture one rather than a widening of it, because the two share no\n * input: a fixture registration names one of two catalog entries and Loomrail derives the path, the\n * id and the name from the bundled manifest; this one names a path on the owner's disk and derives\n * everything from that. Folding them together would mean a schema with two optional fields and a\n * refinement saying exactly one must be present -- a union at the boundary, standing in for two\n * endpoints, so that the handler could immediately branch back apart.\n *\n * The path is the only field. There is deliberately no `name`: see the daemon's\n * `registerRepositoryProject`, which takes the repository directory's own name.\n *\n * `repositoryPathTextSchema`, not `repositoryPathSchema`: the request accepts what the owner typed\n * so that the daemon can answer *why* it is not usable -- \"this path is not absolute\", \"this is not\n * a repository\", \"this is a directory inside the repository at X\" are three different fixes, and a\n * schema refusal at the edge would give all three the same \"the request payload is invalid\".\n * `repositoryPathSchema` still guards what is ultimately recorded, on the command below.\n */\nexport const registerRepositoryProjectRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n repositoryPath: repositoryPathTextSchema,\n})\n .strict();\nexport const createWorkItemRequestSchema = createWorkItemCommandSchema.shape.payload\n .omit({ projectId: true })\n .extend({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n projectId: opaqueIdSchema,\n})\n .strict();\nexport const updateWorkItemRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n patch: workItemPatchSchema,\n})\n .strict();\nexport const moveWorkItemRequestSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n commandId: opaqueIdSchema,\n expectedVersion: z.number().int().positive(),\n targetState: workItemStateSchema,\n})\n .strict();\n/**\n * Whether a Project's recorded `repositoryPath` is, right now, the top level of a Git repository.\n *\n * A Project is a durable record and this is a fact about the filesystem this minute, so it is not a\n * field of `projectSchema`: it is never stored, never carried on an event, and it can be true one\n * start and false the next without the Project having changed at all. It rides on the list response\n * because the list is the one place the owner sees their Projects, and a Project whose repository\n * has gone is otherwise indistinguishable from a healthy one -- the two demo Projects on a database\n * that predates E1 record a path inside Loomrail's own checkout, every IMPLEMENT and QA on them is\n * refused there, and nothing in the UI said so.\n */\nexport const projectRepositoryStatusSchema = z.enum([\"READY\", \"UNUSABLE\"]);\nexport const listedProjectSchema = projectSchema\n .extend({ repositoryStatus: projectRepositoryStatusSchema })\n .strict();\nexport const projectsResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, projects: z.array(listedProjectSchema) })\n .strict();\nexport const workItemResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, workItem: workItemSchema })\n .strict();\nexport const workItemsResponseSchema = z\n .object({ schemaVersion: schemaVersionSchema, workItems: z.array(workItemSchema) })\n .strict();\nexport const eventPageDirectionSchema = z.enum([\"ASC\", \"DESC\"]);\nexport const eventsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n events: z.array(domainEventSchema),\n nextSequence: z.number().int().nonnegative(),\n hasMore: z.boolean(),\n})\n .strict();\n//# sourceMappingURL=work-management.js.map","import { z } from \"zod\";\nimport { opaqueIdSchema, schemaVersionSchema } from \"./shared.js\";\nimport { prioritySchema, workItemStateSchema } from \"./work-management.js\";\nimport { humanRequestSchema, stageAttemptStatusSchema, workflowStageSchema } from \"./workflow.js\";\nexport const maxAttentionItems = 200;\nexport const maxAttentionProjectionSources = maxAttentionItems + 1;\nexport const attentionSectionSchema = z.enum([\n \"BLOCKING_NOW\",\n \"APPROVALS\",\n \"QUESTIONS\",\n \"MANUAL_ACTIONS\",\n \"SOON\",\n]);\nexport const attentionCategorySchema = z.enum([\"APPROVAL\", \"QUESTION\", \"MANUAL_ACTION\"]);\nexport const attentionActionSchema = z.enum([\"ANSWER_REQUEST\", \"OPEN_TASK_CONTEXT\", \"REVIEW_ACCEPTANCE\"]);\nexport const attentionReasonSchema = z.enum([\"PROVIDER_RATE_LIMITED\"]);\nexport const attentionItemSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: opaqueIdSchema,\n request: humanRequestSchema,\n project: z\n .object({\n id: opaqueIdSchema,\n name: z.string().trim().min(1).max(200),\n })\n .strict(),\n workItem: z\n .object({\n id: opaqueIdSchema,\n title: z.string().trim().min(1).max(200),\n priority: prioritySchema,\n state: workItemStateSchema,\n })\n .strict(),\n stage: z\n .object({\n id: opaqueIdSchema,\n name: workflowStageSchema,\n status: stageAttemptStatusSchema,\n })\n .strict(),\n section: attentionSectionSchema,\n category: attentionCategorySchema,\n reason: attentionReasonSchema.nullable(),\n action: attentionActionSchema,\n acceptancePackageId: opaqueIdSchema.nullable(),\n affectedStages: z.array(workflowStageSchema).min(1).max(20),\n})\n .strict();\nexport const attentionInboxResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n items: z.array(attentionItemSchema).max(maxAttentionItems),\n hasMore: z.boolean(),\n})\n .strict();\n//# sourceMappingURL=attention.js.map","{\n \"schemaVersion\": 1,\n \"id\": \"guided-real-v1\",\n \"fixtureId\": \"web-app-a\",\n \"createCommandId\": \"guided-activation-v1-create-task\",\n \"task\": {\n \"title\": \"Render an accessible empty task state\",\n \"description\": \"When the task list is empty, render a concise status message instead of an empty list. Keep non-empty markup and HTML escaping unchanged. Use semantic server-rendered HTML, add focused tests, and do not add dependencies or client-side JavaScript.\",\n \"priority\": \"MEDIUM\",\n \"risk\": \"LOW\",\n \"type\": \"TASK\",\n \"acceptanceCriteria\": [\n \"An empty input renders exactly one visible status message and no empty ul element.\",\n \"A non-empty input preserves the current list markup and escaped titles.\",\n \"All tests pass with node --test and no install or network step.\"\n ]\n },\n \"policy\": {\n \"maxEstimatedTokens\": 64000,\n \"agentRunMaxEstimatedTokensOverride\": 8000,\n \"modelTierOverride\": \"FAST\"\n },\n \"install\": {\n \"commands\": [\n \"mkdir loomrail-evaluation\",\n \"cd loomrail-evaluation\",\n \"npm install --ignore-scripts loomrail@latest\",\n \"npx playwright install chromium\",\n \"npx loomrail try\"\n ]\n }\n}\n","import { z } from \"zod\";\nimport source from \"./guided-activation.v1.json\" with { type: \"json\" };\nimport { modelTierSchema, opaqueIdSchema, schemaVersionSchema } from \"./shared.js\";\nimport { fixtureProjectIdSchema, prioritySchema, riskSchema, workItemTypeSchema } from \"./work-management.js\";\nexport const guidedActivationInstallCommands = [\n \"mkdir loomrail-evaluation\",\n \"cd loomrail-evaluation\",\n \"npm install --ignore-scripts loomrail@latest\",\n \"npx playwright install chromium\",\n \"npx loomrail try\",\n];\nexport const guidedActivationContractSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n id: z.literal(\"guided-real-v1\"),\n fixtureId: fixtureProjectIdSchema,\n createCommandId: opaqueIdSchema,\n task: z\n .object({\n title: z.string().trim().min(1).max(200),\n description: z.string().trim().min(1).max(20_000),\n priority: prioritySchema,\n risk: riskSchema,\n type: workItemTypeSchema,\n acceptanceCriteria: z.array(z.string().trim().min(1).max(500)).min(1).max(50),\n })\n .strict(),\n policy: z\n .object({\n maxEstimatedTokens: z.number().int().min(100).max(10_000_000),\n agentRunMaxEstimatedTokensOverride: z.number().int().min(100).max(1_000_000),\n modelTierOverride: modelTierSchema,\n })\n .strict()\n .refine((policy) => policy.agentRunMaxEstimatedTokensOverride <= policy.maxEstimatedTokens, \"The per-agent ceiling cannot exceed the whole guided run budget\"),\n install: z\n .object({\n commands: z\n .array(z.enum(guidedActivationInstallCommands))\n .length(guidedActivationInstallCommands.length),\n })\n .strict(),\n})\n .strict()\n .superRefine((contract, context) => {\n if (new Set(contract.install.commands).size !== contract.install.commands.length) {\n context.addIssue({ code: \"custom\", message: \"Activation install commands must be unique\" });\n }\n if (new Set(contract.task.acceptanceCriteria).size !== contract.task.acceptanceCriteria.length) {\n context.addIssue({ code: \"custom\", message: \"Activation acceptance criteria must be unique\" });\n }\n if (contract.install.commands.some((command, index) => command !== guidedActivationInstallCommands[index])) {\n context.addIssue({\n code: \"custom\",\n message: \"Activation install commands must keep the reviewed order\",\n });\n }\n});\nexport const guidedActivationContract = guidedActivationContractSchema.parse(source);\n//# sourceMappingURL=activation.js.map","import { z } from \"zod\";\nimport { schemaVersionSchema } from \"./shared.js\";\nconst countSchema = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);\nconst percentageSchema = z.number().int().min(0).max(100).nullable();\nexport const reportingRuntimeSchema = z\n .object({\n productVersion: z\n .string()\n .min(1)\n .max(64)\n .regex(/^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/),\n operatingSystem: z.enum([\"MACOS\", \"WINDOWS\", \"LINUX\", \"OTHER\"]),\n architecture: z.enum([\"X64\", \"ARM64\", \"OTHER\"]),\n nodeMajor: z.number().int().positive().max(999),\n})\n .strict();\nexport const reportingFactsSchema = z\n .object({\n workItems: z\n .object({ total: countSchema, accepted: countSchema, cancelled: countSchema, active: countSchema })\n .strict(),\n pipelineRuns: z\n .object({\n total: countSchema,\n succeeded: countSchema,\n failed: countSchema,\n interrupted: countSchema,\n cancelled: countSchema,\n })\n .strict(),\n agentRuns: z\n .object({ total: countSchema, succeeded: countSchema, failed: countSchema, interrupted: countSchema })\n .strict(),\n reviews: z\n .object({ total: countSchema, firstRound: countSchema, firstRoundPassed: countSchema })\n .strict(),\n qa: z\n .object({\n total: countSchema,\n passed: countSchema,\n failed: countSchema,\n errored: countSchema,\n defectsOpen: countSchema,\n defectsResolved: countSchema,\n defectsWaived: countSchema,\n })\n .strict(),\n humanRequests: z.object({ total: countSchema, resolved: countSchema }).strict(),\n usage: z.object({ estimatedTokens: countSchema }).strict(),\n reliability: z.object({ daemonRestartRecoveries: countSchema }).strict(),\n})\n .strict()\n .superRefine((facts, context) => {\n const subset = (value, total, path) => {\n if (value > total)\n context.addIssue({ code: \"custom\", message: \"Count exceeds its total\", path });\n };\n for (const key of [\"accepted\", \"cancelled\", \"active\"]) {\n subset(facts.workItems[key], facts.workItems.total, [\"workItems\", key]);\n }\n for (const key of [\"succeeded\", \"failed\", \"interrupted\", \"cancelled\"]) {\n subset(facts.pipelineRuns[key], facts.pipelineRuns.total, [\"pipelineRuns\", key]);\n }\n for (const key of [\"succeeded\", \"failed\", \"interrupted\"]) {\n subset(facts.agentRuns[key], facts.agentRuns.total, [\"agentRuns\", key]);\n }\n subset(facts.reviews.firstRound, facts.reviews.total, [\"reviews\", \"firstRound\"]);\n subset(facts.reviews.firstRoundPassed, facts.reviews.firstRound, [\"reviews\", \"firstRoundPassed\"]);\n for (const key of [\"passed\", \"failed\", \"errored\"]) {\n subset(facts.qa[key], facts.qa.total, [\"qa\", key]);\n }\n subset(facts.humanRequests.resolved, facts.humanRequests.total, [\"humanRequests\", \"resolved\"]);\n});\nexport const localProductMetricsSchema = reportingFactsSchema.extend({\n rates: z\n .object({\n acceptedCompletionPercent: percentageSchema,\n firstPassReviewPercent: percentageSchema,\n terminalQaPassPercent: percentageSchema,\n })\n .strict(),\n});\nexport const anonymousAggregateReportSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n kind: z.literal(\"AGGREGATE\"),\n runtime: reportingRuntimeSchema,\n metrics: localProductMetricsSchema,\n})\n .strict();\nexport const anonymousCrashReportSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n kind: z.literal(\"CRASH\"),\n runtime: reportingRuntimeSchema,\n incident: z\n .object({\n reason: z.literal(\"DAEMON_RESTART\"),\n recoveredStatus: z.literal(\"INTERRUPTED\"),\n affectedWorkflowCount: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),\n })\n .strict(),\n})\n .strict();\nexport const anonymousReportSchema = z.discriminatedUnion(\"kind\", [\n anonymousAggregateReportSchema,\n anonymousCrashReportSchema,\n]);\nexport const insightsResponseSchema = z\n .object({\n schemaVersion: schemaVersionSchema,\n localMetrics: localProductMetricsSchema,\n aggregateReport: anonymousAggregateReportSchema,\n crashReport: anonymousCrashReportSchema.nullable(),\n})\n .strict();\n//# sourceMappingURL=reporting.js.map","import { z } from \"zod\";\nimport { opaqueIdSchema } from \"./shared.js\";\n/**\n * One frame of the event channel.\n *\n * Spec §5.2: three opaque identifiers, nothing else. The client learns *that* something changed at\n * a scope, never *what* changed -- so the channel carries no WorkItem text and no provider output,\n * and therefore cannot widen the untrusted-checkpoint threat A1 §8 records. `.strict()` is what\n * keeps that true over time: a field added later fails to parse instead of riding along.\n */\nexport const eventSignalSchema = z\n .object({\n projectId: opaqueIdSchema,\n aggregateType: z.enum([\"PROJECT\", \"WORK_ITEM\"]),\n aggregateId: opaqueIdSchema,\n})\n .strict();\n//# sourceMappingURL=event-stream.js.map","import { z } from \"zod\";\nimport { apiVersionSchema, correlationIdSchema, utcTimestampSchema } from \"./shared.js\";\nexport const healthResponseSchema = z\n .object({\n status: z.enum([\"live\", \"ready\"]),\n apiVersion: apiVersionSchema,\n timestamp: utcTimestampSchema,\n})\n .strict();\nexport const sessionExchangeRequestSchema = z\n .object({\n bootstrapToken: z.string().min(43).max(128),\n})\n .strict();\nexport const sessionExchangeResponseSchema = z\n .object({\n authenticated: z.literal(true),\n csrfToken: z.string().min(43).max(128),\n expiresAt: utcTimestampSchema,\n})\n .strict();\nexport const daemonStatusResponseSchema = z\n .object({\n apiVersion: apiVersionSchema,\n authenticated: z.literal(true),\n daemon: z\n .object({\n status: z.literal(\"online\"),\n version: z.string(),\n mode: z.literal(\"local\"),\n startedAt: utcTimestampSchema,\n platform: z.enum([\"darwin\", \"win32\", \"linux\", \"other\"]),\n })\n .strict(),\n foundation: z\n .object({\n phase: z.literal(\"phase-0\"),\n milestone: z.enum([\"M1\", \"M2\", \"M3\", \"M4\", \"M5\", \"M6\"]),\n providers: z.literal(\"real-api-only\"),\n persistence: z.enum([\"not-enabled\", \"sqlite\"]),\n })\n .strict(),\n})\n .strict();\nexport const apiErrorResponseSchema = z\n .object({\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n correlationId: correlationIdSchema,\n details: z.record(z.string(), z.unknown()).optional(),\n })\n .strict(),\n})\n .strict();\n//# sourceMappingURL=session.js.map","import type { WorkItem, WorkItemState } from \"@loomrail/contracts\";\n\n/**\n * How cards are ordered inside a delivery column.\n *\n * The board itself is always grouped by delivery state: the columns are the accountable route a\n * WorkItem travels, not an arbitrary axis. Only the order within a column is a view preference.\n */\nexport type BoardOrdering = \"priority\" | \"created\" | \"updated\" | \"title\";\nexport type BoardDirection = \"asc\" | \"desc\";\n\nexport type BoardView = {\n direction: BoardDirection;\n ordering: BoardOrdering;\n /** When false, columns with no matching card are hidden instead of shown empty. */\n showEmptyColumns: boolean;\n};\n\nexport const defaultBoardView: BoardView = {\n direction: \"desc\",\n ordering: \"priority\",\n showEmptyColumns: true,\n};\n\nexport const boardOrderings: readonly BoardOrdering[] = [\"priority\", \"created\", \"updated\", \"title\"];\n\nexport const isBoardOrdering = (value: unknown): value is BoardOrdering =>\n typeof value === \"string\" && boardOrderings.some((ordering) => ordering === value);\n\nexport const isBoardDirection = (value: unknown): value is BoardDirection =>\n value === \"asc\" || value === \"desc\";\n\nconst priorityRank: Record<WorkItem[\"priority\"], number> = {\n LOW: 0,\n MEDIUM: 1,\n HIGH: 2,\n URGENT: 3,\n};\n\nconst compareBy = (ordering: BoardOrdering, left: WorkItem, right: WorkItem): number => {\n if (ordering === \"priority\") return priorityRank[left.priority] - priorityRank[right.priority];\n if (ordering === \"created\") return left.createdAt.localeCompare(right.createdAt);\n if (ordering === \"updated\") return left.updatedAt.localeCompare(right.updatedAt);\n return left.title.localeCompare(right.title);\n};\n\n/**\n * Orders cards for display. The comparison is total — ties fall back to creation time and then to\n * the opaque ID — so the same data always renders in the same order.\n */\nexport const orderWorkItems = (\n items: readonly WorkItem[],\n { direction, ordering }: Pick<BoardView, \"direction\" | \"ordering\">,\n): readonly WorkItem[] => {\n const sign = direction === \"asc\" ? 1 : -1;\n return [...items].sort((left, right) => {\n const primary = compareBy(ordering, left, right);\n if (primary !== 0) return primary * sign;\n const created = left.createdAt.localeCompare(right.createdAt);\n if (created !== 0) return created * sign;\n return left.id.localeCompare(right.id);\n });\n};\n\n/**\n * Which slice of a project's delivery the board shows. `active` hides finished work, `backlog`\n * narrows to unstarted work, and `all` is the only place a DONE or CANCELLED task stays visible.\n */\nexport type BoardScope = \"active\" | \"backlog\" | \"all\";\n\nexport const scopeStates: Record<BoardScope, readonly WorkItemState[]> = {\n active: [\"BACKLOG\", \"READY\", \"IN_PROGRESS\", \"BLOCKED\"],\n backlog: [\"BACKLOG\"],\n all: [\"BACKLOG\", \"READY\", \"IN_PROGRESS\", \"BLOCKED\", \"DONE\", \"CANCELLED\"],\n};\n\nexport const isBoardScope = (value: unknown): value is BoardScope =>\n value === \"active\" || value === \"backlog\" || value === \"all\";\n\nexport const scopeShows = (scope: BoardScope, state: WorkItemState): boolean =>\n scopeStates[scope].includes(state);\n","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nconst paths = {\n add: [\"M12 5v14\", \"M5 12h14\"],\n agents: [\n \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\",\n \"M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8\",\n \"M22 21v-2a4 4 0 0 0-3-3.87\",\n \"M16 3.13a4 4 0 0 1 0 7.75\",\n ],\n board: [\n \"M1 2.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C1.76 1 2.04 1 2.6 1h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C7 1.76 7 2.04 7 2.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C6.24 5 5.96 5 5.4 5H2.6c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C1 4.24 1 3.96 1 3.4v-.8ZM9 2.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C9.76 1 10.04 1 10.6 1h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C15 1.76 15 2.04 15 2.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C14.24 5 13.96 5 13.4 5h-2.8c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C9 4.24 9 3.96 9 3.4v-.8ZM1 7.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C1.76 6 2.04 6 2.6 6h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C7 6.76 7 7.04 7 7.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C6.24 10 5.96 10 5.4 10H2.6c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C1 9.24 1 8.96 1 8.4v-.8ZM9 7.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C9.76 6 10.04 6 10.6 6h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C15 6.76 15 7.04 15 7.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C14.24 10 13.96 10 13.4 10h-2.8c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C9 9.24 9 8.96 9 8.4v-.8ZM1 12.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C1.76 11 2.04 11 2.6 11h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C7 11.76 7 12.04 7 12.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C6.24 15 5.96 15 5.4 15H2.6c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C1 14.24 1 13.96 1 13.4v-.8ZM9 12.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C9.76 11 10.04 11 10.6 11h2.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C15 11.76 15 12.04 15 12.6v.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C14.24 15 13.96 15 13.4 15h-2.8c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C9 14.24 9 13.96 9 13.4v-.8Z\",\n ],\n branch: [\n \"M6 3v12\",\n \"M18 9a6 6 0 0 1-6 6H6\",\n \"M6 3a2 2 0 1 0 0 4 2 2 0 0 0 0-4\",\n \"M18 5a2 2 0 1 0 0 4 2 2 0 0 0 0-4\",\n \"M18 17a2 2 0 1 0 0 4 2 2 0 0 0 0-4\",\n ],\n budget: [\"M12 2v20\", \"M17 5H9.5a3.5 3.5 0 0 0 0 7H14a3.5 3.5 0 0 1 0 7H6\"],\n check: [\"m5 12 4 4L19 6\"],\n chevronDown: [\"m6 9 6 6 6-6\"],\n chevronLeft: [\"m15 18-6-6 6-6\"],\n chevronRight: [\"m9 18 6-6-6-6\"],\n clock: [\"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20\", \"M12 6v6l4 2\"],\n close: [\"M6 6l12 12\", \"M18 6 6 18\"],\n code: [\"m8 9-4 3 4 3\", \"m16 9 4 3-4 3\", \"m14 5-4 14\"],\n command: [\"M18 9h-9a3 3 0 1 1 3-3v12a3 3 0 1 1-3-3h9a3 3 0 1 1-3 3V6a3 3 0 1 1 3 3Z\"],\n error: [\"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20\", \"m15 9-6 6\", \"m9 9 6 6\"],\n edit: [\"M12 20h9\", \"M16.5 3.5a2.12 2.12 0 0 1 3 3L8 18l-4 1 1-4Z\"],\n external: [\"M14 3h7v7\", \"m10 14 11-11\", \"M21 14v5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5\"],\n filter: [\"M4 6h16\", \"M7 12h10\", \"M10 18h4\"],\n inbox: [\"M4 4h16v16H4z\", \"M4 14h4l2 3h4l2-3h4\"],\n info: [\"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20\", \"M12 11v6\", \"M12 7h.01\"],\n insights: [\"M4 19V10\", \"M10 19V5\", \"M16 19v-7\", \"M22 19V2\"],\n layers: [\"m12 2 9 5-9 5-9-5 9-5Z\", \"m3 12 9 5 9-5\", \"m3 17 9 5 9-5\"],\n link: [\n \"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\",\n \"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\",\n ],\n list: [\n \"M1 1.8c0-.28 0-.42.054-.527a.5.5 0 0 1 .219-.218C1.38 1 1.52 1 1.8 1h12.4c.28 0 .42 0 .527.054a.5.5 0 0 1 .218.219C15 1.38 15 1.52 15 1.8v.4c0 .28 0 .42-.055.527a.5.5 0 0 1-.218.219C14.62 3 14.48 3 14.2 3H1.8c-.28 0-.42 0-.527-.054a.5.5 0 0 1-.218-.219C1 2.62 1 2.48 1 2.2v-.4ZM1 13.8c0-.28 0-.42.054-.527a.5.5 0 0 1 .219-.218C1.38 13 1.52 13 1.8 13h12.4c.28 0 .42 0 .527.055a.5.5 0 0 1 .218.218c.055.107.055.247.055.527v.4c0 .28 0 .42-.055.527a.5.5 0 0 1-.218.218C14.62 15 14.48 15 14.2 15H1.8c-.28 0-.42 0-.527-.055a.5.5 0 0 1-.218-.218C1 14.62 1 14.48 1 14.2v-.4ZM1 9.8c0-.28 0-.42.054-.527a.5.5 0 0 1 .219-.218C1.38 9 1.52 9 1.8 9h12.4c.28 0 .42 0 .527.055a.5.5 0 0 1 .218.218C15 9.38 15 9.52 15 9.8v.4c0 .28 0 .42-.055.527a.5.5 0 0 1-.218.218C14.62 11 14.48 11 14.2 11H1.8c-.28 0-.42 0-.527-.055a.5.5 0 0 1-.218-.218C1 10.62 1 10.48 1 10.2v-.4ZM1 5.8c0-.28 0-.42.054-.527a.5.5 0 0 1 .219-.218C1.38 5 1.52 5 1.8 5h12.4c.28 0 .42 0 .527.054a.5.5 0 0 1 .218.219C15 5.38 15 5.52 15 5.8v.4c0 .28 0 .42-.055.527a.5.5 0 0 1-.218.218C14.62 7 14.48 7 14.2 7H1.8c-.28 0-.42 0-.527-.054a.5.5 0 0 1-.218-.219C1 6.62 1 6.48 1 6.2v-.4Z\",\n ],\n menu: [\"M4 7h16\", \"M4 12h16\", \"M4 17h16\"],\n minus: [\"M5 12h14\"],\n monitor: [\"M3 4h18v12H3z\", \"M8 20h8\", \"M12 16v4\"],\n moon: [\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z\"],\n more: [\"M5 12h.01\", \"M12 12h.01\", \"M19 12h.01\"],\n pause: [\"M8 5v14\", \"M16 5v14\"],\n person: [\"M20 21a8 8 0 0 0-16 0\", \"M12 13a5 5 0 1 0 0-10 5 5 0 0 0 0 10\"],\n play: [\"m7 4 13 8-13 8V4Z\"],\n projects: [\"M4 4h6l2 3h8v13H4z\"],\n question: [\"M9.1 9a3 3 0 1 1 5.83 1c0 2-3 2-3 4\", \"M12 18h.01\", \"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20\"],\n search: [\"M11 19a8 8 0 1 1 0-16 8 8 0 0 1 0 16\", \"m21 21-4.35-4.35\"],\n sessions: [\"M4 4h16v16H4z\", \"M8 8h8\", \"M8 12h5\", \"M8 16h3\"],\n settings: [\"M4 7h10\", \"M18 7h2\", \"M4 17h2\", \"M10 17h10\", \"M14 4v6\", \"M7 14v6\"],\n sortAscending: [\n \"M8.23 3.674a.75.75 0 0 1-.961 1.152l-1.77-1.475V14.25a.75.75 0 0 1-1.5 0V3.351L2.23 4.826a.75.75 0 1 1-.96-1.152l3-2.5a.75.75 0 0 1 .96 0z\",\n \"M6.999 7.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75M6.999 10.25a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75M6.999 13.25a.75.75 0 0 1 .75-.75h1.5a.75.75 0 0 1 0 1.5h-1.5a.75.75 0 0 1-.75-.75\",\n ],\n star: [\"m12 2 3.1 6.3 6.9 1-5 4.9 1.2 6.8-6.2-3.2L5.8 21 7 14.2 2 9.3l6.9-1L12 2Z\"],\n success: [\"M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20\", \"m8 12 3 3 5-6\"],\n sun: [\n \"M12 4V2\",\n \"M12 22v-2\",\n \"m4.93 4.93-1.42-1.42\",\n \"m20.49 20.49-1.42-1.42\",\n \"M4 12H2\",\n \"M22 12h-2\",\n \"m6.34 17.66-1.41 1.41\",\n \"m19.07 4.93-1.41 1.41\",\n \"M12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10\",\n ],\n terminal: [\"m4 6 4 4-4 4\", \"M10 16h6\", \"M3 3h18v18H3z\"],\n test: [\"M9 2v6l-5 9a3 3 0 0 0 2.6 4.5h10.8A3 3 0 0 0 20 17l-5-9V2\", \"M7 14h10\", \"M8 2h8\"],\n views: [\"m12 3 9 5-9 5-9-5 9-5Z\", \"m3 13 9 5 9-5\"],\n viewAdd: [\n \"M6.97358 1.34476C7.57022.885624 8.41055.885024 9.00788 1.3433L14.5499 5.59521C15.15 6.05565 15.15 6.94435 14.5499 7.40478L9.00788 11.6567C8.41055 12.115 7.57022 12.1144 6.97358 11.6552L1.44875 7.40374C.850417 6.94331.850415 6.05669 1.44875 5.59625L6.97358 1.34476ZM8 3.25c.41421 0 .75.33579.75.75v1.75h1.75a.75.75 0 0 1 0 1.5H8.75V9a.75.75 0 0 1-1.5 0V7.25H5.5a.75.75 0 0 1 0-1.5h1.75V4c0-.41421.33579-.75.75-.75Z\",\n \"M1.15024 9.79849c.24384-.33474.69848-.39736 1.01548-.13987l4.34409 3.33628c.78087.6343 1.8682.6343 2.64907 0l4.67552-3.33628c.3169-.25749.7716-.19487 1.0154.13987.2439.33471.1846.81481-.1324 1.07231l-4.6755 3.3363c-1.30145 1.0572-3.11366 1.0572-4.41512 0l-4.34409-3.3363c-.316992-.2575-.376293-.7376-.13245-1.07231Z\",\n ],\n warning: [\"m12 3 10 18H2L12 3Z\", \"M12 9v4\", \"M12 17h.01\"],\n};\nexport const Icon = ({ name, size = 16, ...props }) => {\n if (name === \"spinner\") {\n return (_jsxs(\"svg\", { \"aria-hidden\": \"true\", className: \"lr-icon lr-icon--spinner\", fill: \"none\", height: size, viewBox: \"0 0 24 24\", width: size, ...props, children: [_jsx(\"circle\", { cx: \"12\", cy: \"12\", opacity: \"0.25\", r: \"9\", stroke: \"currentColor\", strokeWidth: \"2\" }), _jsx(\"path\", { d: \"M21 12a9 9 0 0 0-9-9\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeWidth: \"2\" })] }));\n }\n if (name === \"more\") {\n return (_jsxs(\"svg\", { \"aria-hidden\": \"true\", className: \"lr-icon\", fill: \"currentColor\", height: size, viewBox: \"0 0 24 24\", width: size, ...props, children: [_jsx(\"circle\", { cx: \"5\", cy: \"12\", r: \"1.5\" }), _jsx(\"circle\", { cx: \"12\", cy: \"12\", r: \"1.5\" }), _jsx(\"circle\", { cx: \"19\", cy: \"12\", r: \"1.5\" })] }));\n }\n if (name === \"board\" || name === \"list\" || name === \"sortAscending\" || name === \"viewAdd\") {\n return (_jsx(\"svg\", { \"aria-hidden\": \"true\", className: \"lr-icon\", fill: \"currentColor\", height: size, viewBox: \"0 0 16 16\", width: size, ...props, children: paths[name].map((path) => (_jsx(\"path\", { d: path }, path))) }));\n }\n const strokeWidth = name === \"add\" || name === \"filter\" || name === \"settings\" ? 2.1 : 1.7;\n return (_jsx(\"svg\", { \"aria-hidden\": \"true\", className: \"lr-icon\", fill: \"none\", height: size, viewBox: \"0 0 24 24\", width: size, ...props, children: paths[name].map((path) => (_jsx(\"path\", { d: path, stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: strokeWidth }, path))) }));\n};\n//# sourceMappingURL=icons.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { forwardRef } from \"react\";\nimport { Icon } from \"./icons.js\";\nexport const cn = (...values) => values.filter(Boolean).join(\" \");\nexport const Button = forwardRef(({ children, className, disabled, icon, loading = false, shape = \"rounded\", size = \"md\", trailingIcon, variant = \"ghost\", ...props }, ref) => (_jsxs(\"button\", { \"aria-busy\": loading, className: cn(\"lr-button\", `lr-button--${variant}`, `lr-button--${shape}`, `lr-control--${size}`, loading && \"is-loading\", className), disabled: loading || disabled === true, ref: ref, ...props, children: [icon ? _jsx(Icon, { name: loading ? \"spinner\" : icon }) : null, _jsx(\"span\", { className: cn(\"lr-button__content\", !icon && loading && \"is-visually-loading\"), children: children }), trailingIcon ? _jsx(Icon, { name: trailingIcon }) : null, !icon && loading ? _jsx(Icon, { name: \"spinner\" }) : null] })));\nButton.displayName = \"Button\";\nexport const IconButton = forwardRef(({ className, disabled, label, loading = false, name, size = \"md\", variant = \"ghost\", ...props }, ref) => (_jsx(\"button\", { \"aria-busy\": loading, \"aria-label\": label, className: cn(\"lr-icon-button\", `lr-button--${variant}`, `lr-control--${size}`, className), disabled: loading || disabled === true, ref: ref, ...props, children: _jsx(Icon, { name: loading ? \"spinner\" : name }) })));\nIconButton.displayName = \"IconButton\";\nexport const Badge = ({ className, tone = \"neutral\", ...props }) => (_jsx(\"span\", { className: cn(\"lr-badge\", `lr-badge--${tone}`, className), ...props }));\nexport const Status = ({ className, label, tone, ...props }) => (_jsxs(\"span\", { className: cn(\"lr-status\", `lr-status--${tone}`, className), ...props, children: [_jsx(\"span\", { \"aria-hidden\": \"true\", className: \"lr-status__icon\" }), _jsx(\"span\", { children: label })] }));\nexport const Avatar = ({ className, label, tone = \"neutral\", ...props }) => (_jsx(\"span\", { \"aria-label\": label, className: cn(\"lr-avatar\", `lr-avatar--${tone}`, className), role: \"img\", ...props, children: label\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => part[0])\n .join(\"\")\n .toUpperCase() }));\nexport const Skeleton = ({ className, width, ...props }) => (_jsx(\"span\", { className: cn(\"lr-skeleton\", className), style: width ? { width } : undefined, ...props }));\nconst feedbackIcons = {\n empty: \"inbox\",\n error: \"error\",\n offline: \"monitor\",\n success: \"success\",\n};\nexport const FeedbackState = ({ action, className, description, title, tone = \"empty\", ...props }) => (_jsxs(\"div\", { className: cn(\"lr-feedback\", `lr-feedback--${tone}`, className), ...props, children: [_jsx(\"span\", { \"aria-hidden\": \"true\", className: \"lr-feedback__icon\", children: _jsx(Icon, { name: feedbackIcons[tone], size: 18 }) }), _jsxs(\"div\", { children: [_jsx(\"strong\", { children: title }), _jsx(\"p\", { children: description })] }), action ? _jsx(\"div\", { className: \"lr-feedback__action\", children: action }) : null] }));\nexport const Kbd = ({ className, ...props }) => (_jsx(\"kbd\", { className: cn(\"lr-kbd\", className), ...props }));\n//# sourceMappingURL=foundation.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { forwardRef, useId } from \"react\";\nimport { Checkbox as CheckboxPrimitive, RadioGroup as RadioPrimitive, Select as SelectPrimitive, Switch as SwitchPrimitive, } from \"radix-ui\";\nimport { cn } from \"./foundation.js\";\nimport { Icon } from \"./icons.js\";\nexport const Field = ({ children, description, error, htmlFor, label, required = false, }) => (_jsxs(\"div\", { className: cn(\"lr-field\", error && \"has-error\"), children: [_jsxs(\"label\", { className: \"lr-field__label\", htmlFor: htmlFor, children: [label, required ? _jsx(\"span\", { \"aria-hidden\": \"true\", children: \" *\" }) : null] }), children, error ? (_jsxs(\"span\", { className: \"lr-field__error\", id: `${htmlFor}-error`, role: \"alert\", children: [_jsx(Icon, { name: \"error\", size: 13 }), error] })) : description ? (_jsx(\"span\", { className: \"lr-field__description\", id: `${htmlFor}-description`, children: description })) : null] }));\nexport const TextField = forwardRef(({ className, icon, invalid = false, size = \"lg\", ...props }, ref) => (_jsxs(\"span\", { className: cn(\"lr-text-field\", `lr-control--${size}`, invalid && \"has-error\", className), children: [icon ? _jsx(Icon, { name: icon }) : null, _jsx(\"input\", { \"aria-invalid\": invalid, ref: ref, ...props })] })));\nTextField.displayName = \"TextField\";\nexport const Textarea = forwardRef(({ className, invalid = false, ...props }, ref) => (_jsx(\"textarea\", { \"aria-invalid\": invalid, className: cn(\"lr-textarea\", invalid && \"has-error\", className), ref: ref, ...props })));\nTextarea.displayName = \"Textarea\";\nexport const Checkbox = ({ className, description, id, label, ...props }) => {\n const generatedId = useId();\n const controlId = id ?? generatedId;\n return (_jsxs(\"label\", { className: \"lr-check-row\", htmlFor: controlId, children: [_jsx(CheckboxPrimitive.Root, { className: cn(\"lr-checkbox\", className), id: controlId, ...props, children: _jsx(CheckboxPrimitive.Indicator, { children: _jsx(Icon, { name: \"check\", size: 12 }) }) }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: label }), description ? _jsx(\"small\", { children: description }) : null] })] }));\n};\nexport const Switch = ({ className, description, id, label, ...props }) => {\n const generatedId = useId();\n const controlId = id ?? generatedId;\n return (_jsxs(\"label\", { className: \"lr-switch-row\", htmlFor: controlId, children: [_jsxs(\"span\", { children: [_jsx(\"strong\", { children: label }), description ? _jsx(\"small\", { children: description }) : null] }), _jsx(SwitchPrimitive.Root, { className: cn(\"lr-switch\", className), id: controlId, ...props, children: _jsx(SwitchPrimitive.Thumb, { className: \"lr-switch__thumb\" }) })] }));\n};\nexport const RadioGroup = ({ className, options, ...props }) => (_jsx(RadioPrimitive.Root, { className: cn(\"lr-radio-group\", className), ...props, children: options.map((option) => (_jsxs(\"label\", { className: \"lr-radio-row\", children: [_jsx(RadioPrimitive.Item, { className: \"lr-radio\", value: option.value, children: _jsx(RadioPrimitive.Indicator, { className: \"lr-radio__indicator\" }) }), _jsxs(\"span\", { children: [_jsx(\"strong\", { children: option.label }), option.description ? _jsx(\"small\", { children: option.description }) : null] })] }, option.value))) }));\nexport const SelectControl = ({ ariaLabel, contentClassName, defaultValue, disabled = false, id, onValueChange, options, placeholder = \"Select…\", size = \"lg\", value, variant = \"default\", }) => {\n const rootProps = {\n ...(defaultValue === undefined ? {} : { defaultValue }),\n ...(onValueChange === undefined ? {} : { onValueChange }),\n ...(value === undefined ? {} : { value }),\n };\n return (_jsxs(SelectPrimitive.Root, { disabled: disabled, ...rootProps, children: [_jsxs(SelectPrimitive.Trigger, { \"aria-label\": ariaLabel, className: cn(\"lr-select-trigger\", `lr-control--${size}`, variant === \"compact\" && \"lr-select-trigger--compact\"), id: id, children: [_jsx(SelectPrimitive.Value, { placeholder: placeholder }), _jsx(SelectPrimitive.Icon, { children: _jsx(Icon, { name: \"chevronDown\", size: 13 }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Content, { className: cn(\"lr-select-content\", variant === \"compact\" && \"lr-select-content--compact\", contentClassName), position: \"popper\", sideOffset: 4, children: _jsx(SelectPrimitive.Viewport, { className: \"lr-select-viewport\", children: options.map((option) => (_jsxs(SelectPrimitive.Item, { className: \"lr-select-item\", value: option.value, ...(option.disabled === undefined ? {} : { disabled: option.disabled }), children: [_jsxs(\"span\", { className: \"lr-select-item__copy\", children: [_jsx(SelectPrimitive.ItemText, { children: option.label }), option.description ? _jsx(\"small\", { children: option.description }) : null] }), _jsx(SelectPrimitive.ItemIndicator, { className: \"lr-select-item__indicator\", children: _jsx(Icon, { name: \"check\", size: 13 }) })] }, option.value))) }) }) })] }));\n};\n//# sourceMappingURL=forms.js.map","export const filterColumnKey = (path) => path.length === 0 ? \"root\" : path.join(\"/\");\nexport const normalizeFilterQuery = (query) => query.trim().toLocaleLowerCase();\nconst hasChildren = (node) => (node.children?.length ?? 0) > 0;\nconst matchesQuery = (node, normalizedQuery) => `${node.label} ${node.description ?? \"\"}`.toLocaleLowerCase().includes(normalizedQuery);\n/**\n * Rows to show for one filter level. A deep level also searches the values nested under each\n * property, so the root search behaves like a single search across every filter. A property that\n * matches by itself stays a single row: its values remain reachable by opening it.\n */\nexport const searchFilterNodes = (nodes, query, deep = false) => {\n const normalizedQuery = normalizeFilterQuery(query);\n if (normalizedQuery === \"\") {\n return nodes.map((node) => ({ node }));\n }\n const collect = (candidates, parent) => candidates.flatMap((node) => {\n if (matchesQuery(node, normalizedQuery)) {\n return parent ? [{ node, parent }] : [{ node }];\n }\n if (!deep || !hasChildren(node)) {\n return [];\n }\n return collect(node.children ?? [], node);\n });\n return collect(nodes, undefined);\n};\n/**\n * The part of an open branch path that is still reachable under the current searches. Typing in a\n * level hides properties, and a submenu whose property is no longer listed has nothing to hang on.\n */\nexport const pruneFilterPath = (options, path, queries) => {\n const reachable = [];\n let nodes = options;\n for (const nodeId of path) {\n const columnPath = [...reachable];\n const results = searchFilterNodes(nodes, queries[filterColumnKey(columnPath)] ?? \"\", columnPath.length === 0);\n const branch = results.find((result) => result.node.id === nodeId && !result.parent)?.node;\n if (!branch || !hasChildren(branch)) {\n break;\n }\n reachable.push(nodeId);\n nodes = branch.children ?? [];\n }\n return reachable;\n};\n//# sourceMappingURL=filter-search.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { useRef, useState } from \"react\";\nimport { Dialog as DialogPrimitive, DropdownMenu as DropdownMenuPrimitive, Popover as PopoverPrimitive, Tooltip as TooltipPrimitive, } from \"radix-ui\";\nimport { cn, IconButton, Kbd } from \"./foundation.js\";\nimport { Icon } from \"./icons.js\";\nexport const Tooltip = ({ children, label, side = \"bottom\" }) => (_jsx(TooltipPrimitive.Provider, { delayDuration: 350, skipDelayDuration: 150, children: _jsxs(TooltipPrimitive.Root, { children: [_jsx(TooltipPrimitive.Trigger, { asChild: true, \n // Radix opens a tooltip on any focus at all. A popover or dialog hands focus to its first\n // control the moment it opens, so a tooltip on that control would announce itself to an\n // owner who only clicked the overlay open. Focus the browser calls keyboard focus still\n // earns the tooltip; a click that merely lands focus here does not.\n onFocus: (event) => {\n if (!event.currentTarget.matches(\":focus-visible\"))\n event.preventDefault();\n }, children: children }), _jsx(TooltipPrimitive.Portal, { children: _jsxs(TooltipPrimitive.Content, { className: \"lr-tooltip\", side: side, sideOffset: 6, children: [label, _jsx(TooltipPrimitive.Arrow, { className: \"lr-tooltip__arrow\" })] }) })] }) }));\nexport const ActionMenu = ({ align = \"start\", contentClassName, groups, side = \"bottom\", trigger, triggerTooltip, }) => {\n const visibleGroups = groups.filter((group) => group.length > 0);\n // An empty menu has no interaction to expose. Returning the caller-owned trigger unchanged also\n // keeps a disabled control from acquiring Radix's menu semantics and an empty portal surface.\n if (visibleGroups.length === 0)\n return trigger;\n return (_jsxs(DropdownMenuPrimitive.Root, { children: [triggerTooltip ? (_jsx(Tooltip, { label: triggerTooltip, children: _jsx(DropdownMenuPrimitive.Trigger, { asChild: true, children: trigger }) })) : (_jsx(DropdownMenuPrimitive.Trigger, { asChild: true, children: trigger })), _jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, { align: align, className: cn(\"lr-menu\", contentClassName), collisionPadding: 8, side: side, sideOffset: 5, children: visibleGroups.map((group, groupIndex) => (_jsxs(\"div\", { className: \"lr-menu__group\", children: [group.map((item) => (_jsxs(DropdownMenuPrimitive.Item, { className: cn(\"lr-menu__item\", item.icon && \"has-icon\", item.danger && \"is-danger\"), disabled: item.disabled === true || item.onSelect === undefined, ...(item.onSelect === undefined ? {} : { onSelect: item.onSelect }), children: [item.icon ? (_jsx(\"span\", { className: \"lr-menu__item-icon\", children: _jsx(Icon, { name: item.icon, size: 14 }) })) : null, _jsx(\"span\", { children: item.label }), item.shortcut ? _jsx(Kbd, { children: item.shortcut }) : null] }, item.label))), groupIndex < visibleGroups.length - 1 ? (_jsx(DropdownMenuPrimitive.Separator, { className: \"lr-menu__separator\" })) : null] }, group.map((item) => item.label).join(\"-\")))) }) })] }));\n};\nexport const PopoverSurface = ({ align = \"end\", children, className, label, side = \"bottom\", trigger, triggerTooltip, }) => {\n const contentRef = useRef(null);\n const [open, setOpen] = useState(false);\n return (_jsxs(PopoverPrimitive.Root, { onOpenChange: setOpen, open: open, children: [triggerTooltip ? (_jsx(Tooltip, { label: triggerTooltip, children: _jsx(PopoverPrimitive.Trigger, { asChild: true, children: trigger }) })) : (_jsx(PopoverPrimitive.Trigger, { asChild: true, children: trigger })), _jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { align: align, \"aria-label\": label, className: cn(\"lr-popover\", className), collisionPadding: 8, \n // Radix hands Escape to the topmost dismissable layer alone, and a tooltip standing over\n // this surface is that layer -- which would leave the surface sitting through the press\n // meant to close it. It answers for its own Escape instead, and only for one pressed on\n // the surface itself: a portalled menu or select still answers for the presses it owns.\n onKeyDown: (event) => {\n if (event.key !== \"Escape\")\n return;\n if (!(event.target instanceof Node))\n return;\n if (!event.currentTarget.contains(event.target))\n return;\n setOpen(false);\n }, \n // Radix would arm whichever control sits first inside, ringing it and offering it to the\n // next keypress -- a choice the owner never made by opening the surface. The surface\n // itself takes the focus instead: it still announces its label and Tab still walks in.\n onOpenAutoFocus: (event) => {\n event.preventDefault();\n contentRef.current?.focus();\n }, ref: contentRef, side: side, sideOffset: 6, children: children }) })] }));\n};\nexport const DialogSurface = ({ children, className, closeLabel = \"Close dialog\", description, footer, onOpenChange, open, size = \"md\", title, trigger, triggerTooltip, }) => {\n const contentRef = useRef(null);\n const rootProps = {\n ...(onOpenChange === undefined ? {} : { onOpenChange }),\n ...(open === undefined ? {} : { open }),\n };\n return (_jsxs(DialogPrimitive.Root, { ...rootProps, children: [trigger ? (triggerTooltip ? (_jsx(Tooltip, { label: triggerTooltip, children: _jsx(DialogPrimitive.Trigger, { asChild: true, children: trigger }) })) : (_jsx(DialogPrimitive.Trigger, { asChild: true, children: trigger }))) : null, _jsxs(DialogPrimitive.Portal, { children: [_jsx(DialogPrimitive.Overlay, { className: \"lr-dialog-overlay\" }), _jsxs(DialogPrimitive.Content, { className: cn(\"lr-dialog\", `lr-dialog--${size}`, className), onOpenAutoFocus: (event) => {\n event.preventDefault();\n contentRef.current?.focus();\n }, ref: contentRef, tabIndex: -1, children: [_jsxs(\"header\", { className: \"lr-dialog__header\", children: [_jsxs(\"div\", { children: [_jsx(DialogPrimitive.Title, { children: title }), description ? _jsx(DialogPrimitive.Description, { children: description }) : null] }), _jsx(Tooltip, { label: closeLabel, children: _jsx(DialogPrimitive.Close, { asChild: true, children: _jsx(IconButton, { label: closeLabel, name: \"close\", size: \"lg\" }) }) })] }), _jsx(\"div\", { className: \"lr-dialog__body\", children: children }), footer ? _jsx(\"footer\", { className: \"lr-dialog__footer\", children: footer }) : null] })] })] }));\n};\n//# sourceMappingURL=overlays.js.map","import { jsxs as _jsxs, jsx as _jsx } from \"react/jsx-runtime\";\nimport { cloneElement, Fragment, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { Dialog as DialogPrimitive, Popover as PopoverPrimitive } from \"radix-ui\";\nimport { filterColumnKey, normalizeFilterQuery, pruneFilterPath, searchFilterNodes, } from \"./filter-search.js\";\nimport { Button, cn, IconButton } from \"./foundation.js\";\nimport { Icon } from \"./icons.js\";\nimport { Tooltip } from \"./overlays.js\";\nconst defaultFilterMessages = {\n add: \"Add\",\n addFilterPlaceholder: \"Add Filter…\",\n backTo: \"Back to\",\n clear: \"Clear\",\n close: \"Close filters\",\n description: \"Choose one or more task properties. Each selection is applied immediately.\",\n edit: \"Edit\",\n filterPlaceholder: \"Filter…\",\n is: \"is\",\n isAnyOf: \"is any of\",\n noMatchingProperties: \"No matching properties\",\n noMatchingValues: \"No matching values\",\n oneValue: \"1 value\",\n options: \"options\",\n remove: \"Remove\",\n rootTitle: \"Filters\",\n search: \"Search\",\n selectedValues: \"selected values\",\n};\nconst mobileFilterQuery = \"(max-width: 760px)\";\nconst filterHoverIntentDelay = 80;\nconst rootFilterPanelOffset = 187;\nconst nestedFilterPanelStride = 197;\nconst subscribeToMobileFilter = (onStoreChange) => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return () => undefined;\n }\n const mediaQuery = window.matchMedia(mobileFilterQuery);\n mediaQuery.addEventListener(\"change\", onStoreChange);\n return () => {\n mediaQuery.removeEventListener(\"change\", onStoreChange);\n };\n};\nconst getMobileFilterSnapshot = () => typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(mobileFilterQuery).matches;\nconst getMobileFilterServerSnapshot = () => false;\nconst getColumns = (options, path, rootTitle) => {\n const columns = [{ key: \"root\", nodes: options, path: [], title: rootTitle }];\n let currentNodes = options;\n for (const [index, nodeId] of path.entries()) {\n const node = currentNodes.find((candidate) => candidate.id === nodeId);\n if (!node?.children || node.children.length === 0) {\n break;\n }\n const nextPath = path.slice(0, index + 1);\n columns.push({\n key: filterColumnKey(nextPath),\n nodes: node.children,\n path: nextPath,\n title: node.label,\n });\n currentNodes = node.children;\n }\n return columns;\n};\nconst estimateFilterPanelHeight = (nodes) => Math.min(707, 50 +\n nodes.reduce((height, node) => height + (node.dividerBefore ? 12 : 0) + (node.description ? 46 : 32), 0));\nconst getOrderedLeafIds = (nodes) => nodes.flatMap((node) => node.children && node.children.length > 0 ? getOrderedLeafIds(node.children) : [node.id]);\nconst orderSelectedLeafIds = (options, selected) => getOrderedLeafIds(options).filter((nodeId) => selected.includes(nodeId));\nconst getAppliedFilterGroups = (options, selected) => {\n const groups = new Map();\n const visit = (nodes, parent) => {\n nodes.forEach((node) => {\n if (node.children && node.children.length > 0) {\n visit(node.children, node);\n return;\n }\n if (!selected.includes(node.id)) {\n return;\n }\n const owner = parent ?? node;\n const current = groups.get(owner.id);\n groups.set(owner.id, {\n icon: owner.icon,\n id: owner.id,\n label: owner.label,\n options: owner.children ?? [node],\n selected: current ? [...current.selected, node] : [node],\n });\n });\n };\n visit(options, undefined);\n return [...groups.values()];\n};\nconst focusRelativeItem = (event, direction) => {\n const list = event.currentTarget.closest(\".lr-filter-list\");\n if (!list) {\n return;\n }\n const items = Array.from(list.querySelectorAll(\"[data-filter-item]\"));\n const currentIndex = items.indexOf(event.currentTarget);\n const nextIndex = (currentIndex + direction + items.length) % items.length;\n items[nextIndex]?.focus();\n};\nconst focusBoundaryItem = (event, position) => {\n const list = event.currentTarget.closest(\".lr-filter-list\");\n if (!list) {\n return;\n }\n const items = Array.from(list.querySelectorAll(\"[data-filter-item]\"));\n const item = position === \"first\" ? items[0] : items.at(-1);\n item?.focus();\n};\nconst FilterLevel = ({ activeChildId, column, floatingPosition, mobile = false, messages, onBack, onOpenBranch, onQueryChange, onToggle, query, searchRef, selected, }) => {\n const isRoot = column.path.length === 0;\n const searching = normalizeFilterQuery(query) !== \"\";\n const results = searchFilterNodes(column.nodes, query, isRoot);\n return (_jsxs(\"section\", { \"aria-label\": column.title, className: cn(\"lr-filter-level\", mobile && \"lr-filter-level--mobile\"), \"data-filter-column\": column.key, \"data-filter-depth\": column.path.length, style: floatingPosition, children: [_jsxs(\"label\", { className: \"lr-filter-search\", children: [_jsxs(\"span\", { className: \"lr-visually-hidden\", children: [messages.search, \" \", column.title] }), _jsx(\"input\", { \"aria-label\": `${messages.search} ${column.title}`, onChange: (event) => {\n onQueryChange(column.key, event.currentTarget.value);\n }, onKeyDown: (event) => {\n if (event.key !== \"ArrowDown\") {\n return;\n }\n event.preventDefault();\n event.currentTarget\n .closest(\".lr-filter-level\")\n ?.querySelector(\"[data-filter-item]\")\n ?.focus();\n }, placeholder: column.path.length === 0 ? messages.addFilterPlaceholder : messages.filterPlaceholder, ref: searchRef, spellCheck: false, type: \"search\", value: query })] }), _jsxs(\"div\", { \"aria-label\": `${column.title} ${messages.options}`, className: \"lr-filter-list\", role: \"menu\", children: [results.map(({ node, parent }) => {\n const branch = Boolean(node.children && node.children.length > 0);\n const isActive = branch && activeChildId === node.id;\n const isSelected = !branch && selected.includes(node.id);\n const key = parent ? `${parent.id}/${node.id}` : node.id;\n const fullLabel = parent ? `${parent.label}: ${node.label}` : node.label;\n const divider = node.dividerBefore && !searching ? (_jsx(\"div\", { className: \"lr-filter-separator\", role: \"separator\" })) : null;\n if (!branch) {\n return (_jsxs(Fragment, { children: [divider, _jsxs(\"div\", { className: \"lr-filter-choice\", role: \"none\", children: [_jsx(\"button\", { \"aria-label\": `${isSelected ? messages.remove : messages.add} ${fullLabel}`, \"aria-pressed\": isSelected, className: \"lr-filter-choice__checkbox\", onClick: () => {\n onToggle(node.id, false);\n }, type: \"button\", children: isSelected ? _jsx(Icon, { name: \"check\", size: 10 }) : null }), _jsxs(\"button\", { \"aria-checked\": isSelected, \"aria-label\": parent ? fullLabel : undefined, className: \"lr-filter-item lr-filter-item--choice\", \"data-filter-item\": true, \"data-filter-node\": node.id, onClick: () => {\n onToggle(node.id, true);\n }, onKeyDown: (event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusRelativeItem(event, 1);\n }\n else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusRelativeItem(event, -1);\n }\n else if (event.key === \"Home\") {\n event.preventDefault();\n focusBoundaryItem(event, \"first\");\n }\n else if (event.key === \"End\") {\n event.preventDefault();\n focusBoundaryItem(event, \"last\");\n }\n else if (event.key === \"ArrowLeft\" && column.path.length > 0) {\n event.preventDefault();\n onBack();\n }\n }, role: \"menuitemcheckbox\", type: \"button\", children: [_jsxs(\"span\", { className: \"lr-filter-item__copy\", children: [_jsxs(\"span\", { children: [parent ? (_jsx(\"span\", { \"aria-hidden\": \"true\", className: \"lr-filter-item__context\", children: parent.label })) : null, node.label] }), node.description ? _jsx(\"small\", { children: node.description }) : null] }), node.count !== undefined && !parent ? (_jsx(\"span\", { className: \"lr-filter-item__meta\", children: _jsx(\"small\", { children: node.count }) })) : null] })] })] }, key));\n }\n return (_jsxs(Fragment, { children: [divider, _jsxs(\"button\", { \"aria-expanded\": isActive, \"aria-haspopup\": \"menu\", className: \"lr-filter-item\", \"data-active\": isActive, \"data-filter-item\": true, \"data-filter-node\": node.id, onClick: (event) => {\n onOpenBranch(node, column, true, event.currentTarget);\n }, onPointerEnter: (event) => {\n if (!mobile) {\n onOpenBranch(node, column, false, event.currentTarget);\n }\n }, onKeyDown: (event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusRelativeItem(event, 1);\n }\n else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusRelativeItem(event, -1);\n }\n else if (event.key === \"Home\") {\n event.preventDefault();\n focusBoundaryItem(event, \"first\");\n }\n else if (event.key === \"End\") {\n event.preventDefault();\n focusBoundaryItem(event, \"last\");\n }\n else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n onOpenBranch(node, column, true, event.currentTarget);\n }\n else if (event.key === \"ArrowLeft\" && column.path.length > 0) {\n event.preventDefault();\n onBack();\n }\n }, role: \"menuitem\", type: \"button\", children: [_jsx(\"span\", { className: \"lr-filter-item__icon\", children: node.icon ? _jsx(Icon, { name: node.icon, size: 14 }) : null }), _jsxs(\"span\", { className: \"lr-filter-item__copy\", children: [_jsx(\"span\", { children: node.label }), node.description ? _jsx(\"small\", { children: node.description }) : null] }), _jsx(\"span\", { className: \"lr-filter-item__meta\", children: _jsx(Icon, { name: \"chevronRight\", size: 12 }) })] })] }, key));\n }), results.length === 0 ? (_jsx(\"p\", { className: \"lr-filter-empty\", children: isRoot ? messages.noMatchingProperties : messages.noMatchingValues })) : null] })] }));\n};\nexport const CascadingFilter = ({ ariaLabel, defaultValue = [], messages, onValueChange, options, trigger, triggerTooltip, value, }) => {\n const copy = { ...defaultFilterMessages, ...messages };\n const isMobile = useSyncExternalStore(subscribeToMobileFilter, getMobileFilterSnapshot, getMobileFilterServerSnapshot);\n const [open, setOpen] = useState(false);\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const committedValue = value ?? uncontrolledValue;\n const [path, setPath] = useState([]);\n const [panelTops, setPanelTops] = useState({});\n const [queries, setQueries] = useState({});\n const desktopSearchRef = useRef(null);\n const desktopPointerDismissRef = useRef(false);\n const hoverIntentTimeoutRef = useRef(undefined);\n const mobileSearchRef = useRef(null);\n const triggerRef = useRef(null);\n const triggerWithRef = cloneElement(trigger, {\n ref: triggerRef,\n });\n const columns = getColumns(options, path, copy.rootTitle);\n const currentColumn = columns.at(-1) ?? {\n key: \"root\",\n nodes: options,\n path: [],\n title: copy.rootTitle,\n };\n const clearScheduledBranch = () => {\n if (hoverIntentTimeoutRef.current === undefined) {\n return;\n }\n window.clearTimeout(hoverIntentTimeoutRef.current);\n hoverIntentTimeoutRef.current = undefined;\n };\n useEffect(() => () => {\n if (hoverIntentTimeoutRef.current !== undefined) {\n window.clearTimeout(hoverIntentTimeoutRef.current);\n }\n }, []);\n const handleOpenChange = (nextOpen) => {\n clearScheduledBranch();\n if (nextOpen) {\n desktopPointerDismissRef.current = false;\n setPath([]);\n setPanelTops({});\n setQueries({});\n }\n setOpen(nextOpen);\n };\n const handleToggle = (nodeId, closeAfter) => {\n clearScheduledBranch();\n const nextValue = committedValue.includes(nodeId)\n ? committedValue.filter((selectedId) => selectedId !== nodeId)\n : [...committedValue, nodeId];\n const orderedIds = orderSelectedLeafIds(options, nextValue);\n if (value === undefined) {\n setUncontrolledValue(orderedIds);\n }\n onValueChange?.(orderedIds);\n if (closeAfter) {\n setOpen(false);\n }\n };\n const handleOpenBranch = (node, column, moveFocus = true, anchor) => {\n clearScheduledBranch();\n const openBranch = () => {\n hoverIntentTimeoutRef.current = undefined;\n const nextPath = [...column.path, node.id];\n const nextColumnKey = filterColumnKey(nextPath);\n if (!isMobile && anchor) {\n const popover = anchor.closest(\".lr-filter-popover\");\n if (popover) {\n const popoverRect = popover.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n const panelHeight = estimateFilterPanelHeight(node.children ?? []);\n const availableBottom = window.innerHeight - popoverRect.top - 8;\n const maximumTop = Math.max(0, availableBottom - panelHeight);\n const nextTop = Math.min(Math.max(0, anchorRect.top - popoverRect.top - 1), maximumTop);\n setPanelTops((current) => ({ ...current, [nextColumnKey]: nextTop }));\n }\n }\n setPath(nextPath);\n if (!moveFocus) {\n return;\n }\n window.requestAnimationFrame(() => {\n const target = isMobile\n ? mobileSearchRef.current\n : document.querySelector(`.lr-filter-level[data-filter-depth=\"${nextPath.length.toString()}\"] input`);\n target?.focus();\n });\n };\n if (!moveFocus && !isMobile) {\n hoverIntentTimeoutRef.current = window.setTimeout(openBranch, filterHoverIntentDelay);\n return;\n }\n openBranch();\n };\n const handleBack = () => {\n const departingNodeId = path.at(-1);\n const nextPath = path.slice(0, -1);\n setPath(nextPath);\n window.requestAnimationFrame(() => {\n if (isMobile) {\n mobileSearchRef.current?.focus();\n return;\n }\n if (departingNodeId) {\n document.querySelector(`[data-filter-node=\"${departingNodeId}\"]`)?.focus();\n }\n });\n };\n const handleQueryChange = (key, nextQuery) => {\n clearScheduledBranch();\n const nextQueries = { ...queries, [key]: nextQuery };\n setQueries(nextQueries);\n setPath((current) => pruneFilterPath(options, current, nextQueries));\n };\n if (isMobile) {\n const parentTitle = columns.at(-2)?.title ?? ariaLabel;\n return (_jsxs(DialogPrimitive.Root, { onOpenChange: handleOpenChange, open: open, children: [triggerTooltip ? (_jsx(Tooltip, { label: triggerTooltip, children: _jsx(DialogPrimitive.Trigger, { asChild: true, children: triggerWithRef }) })) : (_jsx(DialogPrimitive.Trigger, { asChild: true, children: triggerWithRef })), _jsxs(DialogPrimitive.Portal, { children: [_jsx(DialogPrimitive.Overlay, { className: \"lr-dialog-overlay\" }), _jsxs(DialogPrimitive.Content, { className: \"lr-filter-dialog\", onOpenAutoFocus: (event) => {\n event.preventDefault();\n mobileSearchRef.current?.focus();\n }, onCloseAutoFocus: (event) => {\n event.preventDefault();\n triggerRef.current?.focus();\n }, children: [_jsxs(\"header\", { className: \"lr-filter-dialog__header\", children: [_jsxs(\"div\", { className: \"lr-filter-dialog__heading\", children: [path.length > 0 ? (_jsx(Tooltip, { label: `${copy.backTo} ${parentTitle}`, children: _jsx(IconButton, { label: `${copy.backTo} ${parentTitle}`, name: \"chevronLeft\", onClick: handleBack, size: \"lg\" }) })) : null, _jsx(DialogPrimitive.Title, { children: path.length === 0 ? ariaLabel : currentColumn.title })] }), _jsx(Tooltip, { label: copy.close, children: _jsx(DialogPrimitive.Close, { asChild: true, children: _jsx(IconButton, { label: copy.close, name: \"close\", size: \"lg\" }) }) })] }), _jsx(DialogPrimitive.Description, { className: \"lr-visually-hidden\", children: copy.description }), _jsx(\"div\", { className: \"lr-filter-dialog__body\", children: _jsx(FilterLevel, { activeChildId: undefined, column: currentColumn, mobile: true, messages: copy, onBack: handleBack, onOpenBranch: handleOpenBranch, onQueryChange: handleQueryChange, onToggle: handleToggle, query: queries[currentColumn.key] ?? \"\", searchRef: mobileSearchRef, selected: committedValue }, currentColumn.key) })] })] })] }));\n }\n return (_jsxs(PopoverPrimitive.Root, { onOpenChange: handleOpenChange, open: open, children: [triggerTooltip ? (_jsx(Tooltip, { label: triggerTooltip, children: _jsx(PopoverPrimitive.Trigger, { asChild: true, children: triggerWithRef }) })) : (_jsx(PopoverPrimitive.Trigger, { asChild: true, children: triggerWithRef })), _jsx(PopoverPrimitive.Portal, { children: _jsxs(PopoverPrimitive.Content, { align: \"start\", \"aria-label\": ariaLabel, className: \"lr-filter-popover\", collisionPadding: 8, onOpenAutoFocus: (event) => {\n event.preventDefault();\n desktopSearchRef.current?.focus();\n }, onCloseAutoFocus: (event) => {\n event.preventDefault();\n if (!desktopPointerDismissRef.current) {\n triggerRef.current?.focus();\n }\n desktopPointerDismissRef.current = false;\n }, onEscapeKeyDown: () => {\n desktopPointerDismissRef.current = false;\n }, onPointerDownOutside: () => {\n desktopPointerDismissRef.current = true;\n }, sideOffset: 6, children: [_jsx(\"div\", { className: \"lr-filter-main-panel\", children: _jsx(FilterLevel, { activeChildId: path[0], column: columns[0] ?? { key: \"root\", nodes: options, path: [], title: copy.rootTitle }, messages: copy, onBack: handleBack, onOpenBranch: handleOpenBranch, onQueryChange: handleQueryChange, onToggle: handleToggle, query: queries[\"root\"] ?? \"\", searchRef: desktopSearchRef, selected: committedValue }) }), _jsx(\"div\", { className: \"lr-filter-submenus\", children: columns.slice(1).map((column) => (_jsx(FilterLevel, { activeChildId: path[column.path.length], column: column, floatingPosition: {\n height: estimateFilterPanelHeight(column.nodes),\n right: rootFilterPanelOffset + (column.path.length - 1) * nestedFilterPanelStride,\n top: panelTops[column.key] ?? 0,\n }, messages: copy, onBack: handleBack, onOpenBranch: handleOpenBranch, onQueryChange: handleQueryChange, onToggle: handleToggle, query: queries[column.key] ?? \"\", searchRef: undefined, selected: committedValue }, column.path.length))) })] }) })] }));\n};\nconst AppliedFilterEditor = ({ group, messages, onValueChange, options, value, }) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const searchRef = useRef(null);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleOptions = group.options.filter((option) => `${option.label} ${option.description ?? \"\"}`.toLocaleLowerCase().includes(normalizedQuery));\n const selectedIds = group.selected.map((option) => option.id);\n const valueLabel = group.selected.length === 1\n ? (group.selected[0]?.label ?? messages.oneValue)\n : `${group.selected[0]?.label ?? group.selected.length.toString()} +${(group.selected.length - 1).toString()}`;\n const handleToggle = (nodeId, closeAfter) => {\n const nextValue = value.includes(nodeId)\n ? value.filter((selectedId) => selectedId !== nodeId)\n : [...value, nodeId];\n onValueChange(orderSelectedLeafIds(options, nextValue));\n if (closeAfter) {\n setOpen(false);\n }\n };\n return (_jsxs(PopoverPrimitive.Root, { onOpenChange: (nextOpen) => {\n if (nextOpen) {\n setQuery(\"\");\n }\n setOpen(nextOpen);\n }, open: open, children: [_jsxs(\"div\", { className: \"lr-applied-filter\", children: [_jsx(PopoverPrimitive.Trigger, { asChild: true, children: _jsxs(\"button\", { \"aria-label\": `${messages.edit} ${group.label}`, className: \"lr-applied-filter__editor\", type: \"button\", children: [_jsxs(\"span\", { className: \"lr-applied-filter__property\", children: [_jsx(Icon, { name: group.icon ?? \"filter\", size: 12 }), group.label] }), _jsx(\"span\", { className: \"lr-applied-filter__operator\", children: group.selected.length === 1 ? messages.is : messages.isAnyOf }), _jsx(\"span\", { className: \"lr-applied-filter__value\", children: valueLabel })] }) }), _jsx(\"button\", { \"aria-label\": `${messages.remove} ${group.label}`, className: \"lr-applied-filter__remove\", onClick: () => {\n onValueChange(value.filter((nodeId) => !selectedIds.includes(nodeId)));\n }, type: \"button\", children: _jsx(Icon, { name: \"close\", size: 12 }) })] }), _jsx(PopoverPrimitive.Portal, { children: _jsxs(PopoverPrimitive.Content, { align: \"start\", \"aria-label\": `${messages.edit} ${group.label}`, className: \"lr-applied-filter-popover\", collisionPadding: 8, onOpenAutoFocus: (event) => {\n event.preventDefault();\n searchRef.current?.focus();\n }, sideOffset: 6, children: [_jsxs(\"label\", { className: \"lr-filter-search lr-applied-filter-popover__search\", children: [_jsxs(\"span\", { className: \"lr-visually-hidden\", children: [messages.search, \" \", group.label] }), _jsx(\"input\", { \"aria-label\": `${messages.search} ${group.label}`, onChange: (event) => {\n setQuery(event.currentTarget.value);\n }, placeholder: messages.filterPlaceholder, ref: searchRef, spellCheck: false, type: \"search\", value: query })] }), _jsxs(\"div\", { \"aria-label\": `${group.label} ${messages.selectedValues}`, className: \"lr-filter-list\", role: \"menu\", children: [visibleOptions.map((option) => {\n const selected = value.includes(option.id);\n return (_jsxs(\"div\", { className: \"lr-filter-choice\", role: \"none\", children: [_jsx(\"button\", { \"aria-label\": `${selected ? messages.remove : messages.add} ${option.label}`, \"aria-pressed\": selected, className: \"lr-filter-choice__checkbox\", onClick: () => {\n handleToggle(option.id, false);\n }, type: \"button\", children: selected ? _jsx(Icon, { name: \"check\", size: 12 }) : null }), _jsxs(\"button\", { \"aria-checked\": selected, className: \"lr-filter-item lr-filter-item--choice\", \"data-filter-item\": true, onClick: () => {\n handleToggle(option.id, true);\n }, onKeyDown: (event) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusRelativeItem(event, 1);\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusRelativeItem(event, -1);\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n focusBoundaryItem(event, \"first\");\n }\n if (event.key === \"End\") {\n event.preventDefault();\n focusBoundaryItem(event, \"last\");\n }\n }, role: \"menuitemcheckbox\", type: \"button\", children: [_jsxs(\"span\", { className: \"lr-filter-item__copy\", children: [_jsx(\"span\", { children: option.label }), option.description ? _jsx(\"small\", { children: option.description }) : null] }), _jsx(\"span\", { className: \"lr-filter-item__meta\", children: option.count !== undefined ? _jsx(\"small\", { children: option.count }) : null })] })] }, option.id));\n }), visibleOptions.length === 0 ? (_jsx(\"p\", { className: \"lr-filter-empty\", children: messages.noMatchingValues })) : null] })] }) })] }));\n};\nexport const AppliedFilterBar = ({ addFilter, ariaLabel, className, messages, onClear, onValueChange, options, supplementalConditions, value, }) => {\n const copy = { ...defaultFilterMessages, ...messages };\n const groups = getAppliedFilterGroups(options, value);\n return (_jsxs(\"div\", { \"aria-label\": ariaLabel, className: cn(\"lr-applied-filter-bar\", className), role: \"region\", children: [_jsxs(\"div\", { className: \"lr-applied-filter-bar__conditions\", children: [supplementalConditions, groups.map((group) => (_jsx(AppliedFilterEditor, { group: group, messages: copy, onValueChange: onValueChange, options: options, value: value }, group.id))), _jsx(\"div\", { className: \"lr-applied-filter-bar__add\", children: addFilter })] }), value.length > 0 || supplementalConditions ? (_jsx(Button, { className: \"lr-applied-filter-bar__clear\", onClick: () => {\n if (onClear) {\n onClear();\n return;\n }\n onValueChange([]);\n }, shape: \"pill\", children: copy.clear })) : null] }));\n};\n//# sourceMappingURL=filters.js.map","import { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nimport { Avatar, Badge, Button, cn, Status } from \"./foundation.js\";\nimport { Icon } from \"./icons.js\";\nexport const TaskCard = ({ agent, badge, className, description, id, meta, selected = false, title, ...props }) => (_jsxs(\"article\", { className: cn(\"lr-task-card\", selected && \"is-selected\", className), ...props, children: [_jsxs(\"div\", { className: \"lr-task-card__header\", children: [_jsx(\"span\", { children: id }), badge ? _jsx(Badge, { tone: badge.tone ?? \"neutral\", children: badge.label }) : null] }), _jsx(\"strong\", { className: \"lr-task-card__title\", children: title }), description ? _jsx(\"p\", { children: description }) : null, _jsx(\"footer\", { children: _jsxs(\"span\", { className: \"lr-task-card__agent\", children: [agent ? _jsx(Avatar, { label: agent }) : null, meta] }) })] }));\nexport const KanbanColumn = ({ addLabel, children, count, label, onAdd, tone, }) => (_jsxs(\"section\", { className: \"lr-kanban-column\", children: [_jsxs(\"header\", { children: [_jsx(Status, { label: label, tone: tone }), _jsx(\"span\", { className: \"lr-kanban-column__count\", children: count }), onAdd ? (_jsx(Button, { \"aria-label\": addLabel ?? `Add task to ${label}`, className: \"lr-kanban-column__add\", onClick: onAdd, size: \"sm\", children: _jsx(Icon, { name: \"add\", size: 13 }) })) : null] }), _jsx(\"div\", { className: \"lr-kanban-column__stack\", children: children })] }));\nexport const TimelineEvent = ({ detail, icon = \"check\", label, time, tone = \"neutral\", }) => (_jsxs(\"div\", { className: cn(\"lr-timeline-event\", `lr-timeline-event--${tone}`), children: [_jsx(\"span\", { \"aria-hidden\": \"true\", className: \"lr-timeline-event__icon\", children: _jsx(Icon, { name: icon, size: 12 }) }), _jsxs(\"div\", { children: [_jsx(\"strong\", { children: label }), detail ? _jsx(\"span\", { children: detail }) : null] }), _jsx(\"time\", { children: time })] }));\nexport const InspectorSection = ({ action, children, title }) => (_jsxs(\"section\", { className: \"lr-inspector-section\", children: [_jsxs(\"header\", { children: [_jsx(\"strong\", { children: title }), action] }), _jsx(\"div\", { className: \"lr-inspector-section__body\", children: children })] }));\nexport const RunSummary = ({ properties }) => (_jsx(\"dl\", { className: \"lr-run-summary\", children: properties.map((property) => (_jsxs(\"div\", { children: [_jsx(\"dt\", { children: property.label }), _jsx(\"dd\", { children: property.value })] }, property.label))) }));\nexport const ProviderSessionTimeline = ({ attempt, note, sessions, title, }) => (_jsxs(\"div\", { className: \"lr-session-timeline-panel\", children: [attempt ? (_jsxs(\"div\", { className: \"lr-session-timeline__row\", children: [_jsx(\"strong\", { className: \"lr-session-timeline-panel__title\", children: attempt.heading }), _jsx(Status, { label: attempt.statusLabel, tone: attempt.tone })] })) : null, _jsx(\"strong\", { className: attempt ? \"lr-session-timeline-panel__subtitle\" : \"lr-session-timeline-panel__title\", children: title }), note ? _jsx(\"p\", { className: \"lr-session-timeline-panel__note\", children: note }) : null, _jsx(\"ol\", { className: \"lr-session-timeline\", children: sessions.map((session) => (_jsx(\"li\", { \"aria-label\": session.ariaLabel, className: \"lr-session-timeline__item\", children: _jsxs(\"div\", { className: \"lr-session-timeline__body\", children: [_jsxs(\"div\", { className: \"lr-session-timeline__row\", children: [_jsx(\"span\", { \"aria-hidden\": \"true\", className: \"lr-session-timeline__ordinal\", children: session.ordinal }), _jsx(Status, { label: session.statusLabel, tone: session.tone }), session.handoffRequestedLabel ? (_jsx(Badge, { tone: \"warning\", children: session.handoffRequestedLabel })) : null] }), session.occupancyPercent !== undefined && session.occupancyLabel !== undefined ? (_jsxs(\"div\", { className: \"lr-session-timeline__occupancy\", children: [_jsx(\"progress\", { \"aria-hidden\": \"true\", max: 100, value: session.occupancyPercent }), _jsxs(\"p\", { className: \"lr-session-timeline__occupancy-text\", children: [_jsx(\"span\", { children: session.occupancyLabel }), session.occupancyQualityLabel === undefined ? null : (_jsx(\"span\", { className: \"lr-session-timeline__occupancy-quality\", children: session.occupancyQualityLabel }))] })] })) : null, session.usageLabel === undefined ? null : (_jsxs(\"p\", { className: \"lr-session-timeline__usage\", children: [_jsx(\"span\", { children: session.usageLabel }), session.usageCostLabel === undefined ? null : _jsx(\"span\", { children: session.usageCostLabel }), session.usageQualityLabel === undefined ? null : (_jsx(\"span\", { className: \"lr-session-timeline__usage-quality\", children: session.usageQualityLabel }))] })), session.checkpoints.length > 0 ? (_jsx(\"ul\", { className: \"lr-session-timeline__checkpoints\", children: session.checkpoints.map((checkpoint) => (_jsx(\"li\", { children: _jsxs(\"details\", { className: \"lr-checkpoint-card\", open: checkpoint.defaultOpen, children: [_jsxs(\"summary\", { children: [_jsx(Icon, { \"aria-hidden\": \"true\", className: \"lr-checkpoint-card__chevron\", name: \"chevronRight\", size: 12 }), _jsx(\"span\", { children: checkpoint.summary }), _jsx(\"time\", { children: checkpoint.timeLabel })] }), _jsx(\"div\", { className: \"lr-checkpoint-card__body\", children: checkpoint.groups.map((group) => group.items.length > 0 ? (_jsxs(\"div\", { children: [_jsx(\"strong\", { children: group.label }), _jsx(\"ul\", { children: group.items.map((item, index) => (_jsx(\"li\", { children: item }, `${index.toString()}-${item}`))) })] }, group.label)) : null) })] }) }, checkpoint.id))) })) : session.emptyCheckpointsLabel ? (_jsx(\"p\", { className: \"lr-session-timeline__empty\", children: session.emptyCheckpointsLabel })) : null] }) }, session.id))) })] }));\n//# sourceMappingURL=patterns.js.map","type BrandMarkProps = {\n className?: string;\n size?: number;\n};\n\nexport const BrandMark = ({ className, size = 24 }: BrandMarkProps): React.JSX.Element => (\n <svg\n aria-hidden=\"true\"\n className={className}\n focusable=\"false\"\n height={size}\n viewBox=\"0 0 96 96\"\n width={size}\n >\n <rect fill=\"#5e6ad2\" height=\"96\" rx=\"24\" width=\"96\" />\n <path\n d=\"M27 23v46h46\"\n fill=\"none\"\n stroke=\"#fff\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"10\"\n />\n <path\n d=\"M48 23v25h25\"\n fill=\"none\"\n stroke=\"#fff\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"10\"\n />\n </svg>\n);\n","/* eslint-disable react-refresh/only-export-components -- the provider and its typed locale helpers are one module */\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\n\nconst LOCALE_STORAGE_KEY = \"loomrail.locale\";\n\nconst en = {\n \"workflow.coordinator.enable\": \"Code-blind coordinator (experimental)\",\n \"workflow.coordinator.description\":\n \"Astra plans without code or tools; Luna / Sonnet do all repository work. Independent Review, QA and your acceptance remain required. Requires a compatible signed-in Codex CLI; no fallback. Fable is not yet qualified. Savings are not yet measured.\",\n \"workflow.coordinator.outcome\": \"Product outcome for the coordinator\",\n \"workflow.coordinator.outcomeDescription\":\n \"Write a short product goal without code, paths or secrets. Only this text and closed progress facts reach Astra. The original task and detailed worker reports stay with the workers. Astra has a 12,000-token planning ceiling (post-session accounting).\",\n \"workflow.coordinator.invalid\": \"Use 10–2,000 characters for the separate product outcome.\",\n \"settings.open\": \"Open settings\",\n \"settings.title\": \"Settings\",\n \"settings.description\":\n \"Appearance stays in this browser. Project execution settings are saved locally by Loomrail.\",\n \"settings.appearance\": \"Appearance\",\n \"settings.density\": \"Board density\",\n \"settings.density.description\": \"Compact tightens the spacing inside and between cards.\",\n \"settings.density.comfortable\": \"Comfortable\",\n \"settings.density.compact\": \"Compact\",\n \"layout.resize.sidebar\": \"Resize the sidebar\",\n \"layout.resize.inspector\": \"Resize the task inspector\",\n \"settings.layout\": \"Layout\",\n \"settings.layout.description\": \"Drag a panel edge to resize it, or nudge it with the arrow keys.\",\n \"settings.layout.reset\": \"Reset panel widths\",\n \"settings.projects\": \"Projects\",\n \"settings.projects.register.label\": \"Register a local repository\",\n \"settings.projects.register.description\":\n \"The absolute path to a Git repository on this machine. Its directory name becomes the project name.\",\n \"settings.projects.register.placeholder\": \"/absolute/path/to/your-repository\",\n \"settings.projects.register.action\": \"Register repository\",\n \"settings.projects.create.title\": \"Create a new project\",\n \"settings.projects.create.description\":\n \"Start a new local Git repository from Loomrail's reviewed TypeScript baseline.\",\n \"settings.projects.create.recipe\": \"TypeScript + Node · built in\",\n \"settings.projects.create.path\": \"New project path\",\n \"settings.projects.create.pathDescription\":\n \"Use an absolute path whose parent exists. The final directory must not exist yet and its name uses lowercase letters, digits, dots, hyphens or underscores.\",\n \"settings.projects.create.placeholder\": \"/absolute/path/to/new-project\",\n \"settings.projects.create.boundary\":\n \"Preview only: no directory is created, no template is downloaded and no command is run.\",\n \"settings.projects.create.review\": \"Review exact files\",\n \"settings.projects.create.target\": \"Target\",\n \"settings.projects.create.version\": \"Recipe\",\n \"settings.projects.create.files\": \"Files to create\",\n \"settings.projects.create.bytes\": \"{count} B\",\n \"settings.projects.create.marker\": \"recovery marker\",\n \"settings.projects.create.digest\": \"Proposal digest\",\n \"settings.projects.create.confirmation\":\n \"This creates exactly the files above and initializes Git. It does not install dependencies, run project code, commit, add a remote or push.\",\n \"settings.projects.create.confirm\": \"Create this project\",\n \"settings.projects.create.completed\": \"Project created\",\n \"settings.projects.create.next\": \"Run these commands yourself when you are ready:\",\n \"settings.projects.create.openTerminal\": \"Open a terminal in\",\n \"settings.projects.create.failed\": \"Creation stopped safely\",\n \"settings.projects.create.failedDescription\":\n \"{code}. Loomrail did not overwrite or delete an existing file. Resolve the local conflict, then retry the same operation.\",\n \"settings.projects.create.pending\": \"Creation will resume safely\",\n \"settings.projects.create.pendingDescription\":\n \"Loomrail recorded this operation before touching the filesystem. Restart the app to reconcile it, or wait for the current attempt to finish.\",\n \"settings.projects.create.retry\": \"Retry safely\",\n \"settings.projects.create.another\": \"Create another project\",\n \"settings.projects.repositoryLabel\": \"Repository\",\n \"settings.projects.unusable\":\n \"This path is not a Git repository right now, so any stage that changes files is refused here.\",\n \"settings.projects.repair\": \"Repair demo repository\",\n \"settings.provider.title\": \"AI provider\",\n \"settings.provider.description\":\n \"Choose which signed-in local agent runs new sessions. Loomrail uses the CLI's existing subscription login and does not need an API key.\",\n \"settings.provider.label\": \"Provider for new sessions\",\n \"settings.provider.option.auto\": \"Auto\",\n \"settings.provider.option.auto.description\": \"Use a compatible, signed-in local CLI\",\n \"settings.provider.loading\": \"Checking local agent CLIs…\",\n \"settings.provider.effective\": \"New sessions use {provider}.\",\n \"settings.provider.fallback\":\n \"No compatible signed-in local agent is ready. Install or update Codex CLI or Claude Code CLI, then sign in through that CLI.\",\n \"settings.provider.compatibility\": \"Local agent readiness\",\n \"settings.provider.status.ready\": \"Ready\",\n \"settings.provider.status.notInstalled\": \"Not installed\",\n \"settings.provider.status.tooOld\": \"Too old for managed runs\",\n \"settings.provider.status.unverified\": \"Version not verified\",\n \"settings.provider.status.versionUnreadable\": \"Version could not be verified\",\n \"settings.provider.status.authRequired\": \"Sign in through this CLI\",\n \"settings.provider.status.noHardTokenBudget\": \"Usage reconciled after the session\",\n \"settings.provider.status.unknown\": \"Could not verify\",\n \"settings.provider.selectedUnavailable\":\n \"This provider is not ready for the requested stage. No session will start.\",\n \"settings.provider.refresh\": \"Check again\",\n \"settings.provider.override\":\n \"LOOMRAIL_PROVIDER currently forces {provider}. Restart without the override to change this here.\",\n \"settings.provider.overrideInvalid\":\n \"LOOMRAIL_PROVIDER contains an unknown value. Provider dispatch stays blocked until it is fixed and restarted.\",\n \"settings.workspaceStrategy.title\": \"Working directory\",\n \"settings.workspaceStrategy.description\": \"Choose where agents read and change files for this project.\",\n \"settings.workspaceStrategy.label\": \"Agent workspace\",\n \"settings.workspaceStrategy.isolated\": \"Separate worktree — recommended\",\n \"settings.workspaceStrategy.isolatedDescription\":\n \"Each task gets its own checkout. Your current project folder stays untouched.\",\n \"settings.workspaceStrategy.shared\": \"This project folder\",\n \"settings.workspaceStrategy.sharedDescription\": \"Agents work directly in {path}.\",\n \"settings.workspaceStrategy.scope\":\n \"Existing task workspaces do not move. This choice applies when Loomrail creates the next workspace.\",\n \"settings.workspaceStrategy.loading\": \"Loading working directory settings…\",\n \"settings.workspaceStrategy.confirmTitle\": \"Before Loomrail uses this folder\",\n \"settings.workspaceStrategy.confirmDescription\":\n \"New agent work will happen directly in {path}, alongside your own changes.\",\n \"settings.workspaceStrategy.confirmFiles\":\n \"Agents can read tracked and untracked files in this repository, including local-only files.\",\n \"settings.workspaceStrategy.confirmExternalTools\":\n \"Loomrail cannot lock your editor, terminal, or other tools that may change the same folder.\",\n \"settings.workspaceStrategy.confirmSerial\":\n \"Loomrail allows only one of its own writers or verification runs in this project at a time.\",\n \"settings.workspaceStrategy.acknowledge\": \"I understand the shared-folder risk\",\n \"settings.workspaceStrategy.confirm\": \"Use this project folder\",\n \"providerAllowance.provider\": \"Provider\",\n \"providerAllowance.title\": \"{provider} · Provider allowance\",\n \"providerAllowance.surface.command-center\": \"{provider} provider allowance in Command Center\",\n \"providerAllowance.surface.task-cockpit\": \"{provider} provider allowance in Task Cockpit\",\n \"providerAllowance.freshness.live\": \"Live\",\n \"providerAllowance.freshness.stale\": \"Stale\",\n \"providerAllowance.freshness.unavailable\": \"Unavailable\",\n \"providerAllowance.refresh\": \"Check again\",\n \"providerAllowance.loading\": \"Loading provider allowance\",\n \"providerAllowance.remaining\": \"{percent}% remaining\",\n \"providerAllowance.window.minutes\": \"{count} min window\",\n \"providerAllowance.window.hours\": \"{count} h window\",\n \"providerAllowance.window.days\": \"{count} day window\",\n \"providerAllowance.window.weeks\": \"{count} week window\",\n \"providerAllowance.resets\": \"Resets {time}\",\n \"providerAllowance.details\": \"Usage details\",\n \"providerAllowance.used\": \"{percent}% used\",\n \"providerAllowance.observed\": \"Observed {time}\",\n \"providerAllowance.bucket.PRIMARY\": \"Primary window\",\n \"providerAllowance.bucket.SECONDARY\": \"Secondary window\",\n \"providerAllowance.bucket.FIVE_HOUR\": \"Five-hour window\",\n \"providerAllowance.bucket.SEVEN_DAY\": \"Seven-day window\",\n \"providerAllowance.bucket.SPEND_LIMIT\": \"Spend limit\",\n \"providerAllowance.unavailable.unsupported\": \"This provider does not expose an allowance signal.\",\n \"providerAllowance.unavailable.unverified\":\n \"Allowance is hidden until this exact provider target is verified.\",\n \"providerAllowance.unavailable.notAuthenticated\":\n \"Sign in through the provider's local CLI before checking allowance.\",\n \"providerAllowance.unavailable.noData\": \"No allowance reading has been received yet.\",\n \"providerAllowance.unavailable.schemaDrift\": \"The provider response changed and was rejected safely.\",\n \"providerAllowance.unavailable.timeout\": \"The provider did not answer within the bounded check.\",\n \"providerAllowance.unavailable.provider\": \"The provider is not available on this machine.\",\n \"providerAllowance.unavailable.read\": \"Provider allowance could not be read.\",\n \"providerAllowance.advisory.available\": \"Capacity is available for new work. Running work is unaffected.\",\n \"providerAllowance.advisory.low\":\n \"Capacity is low. Consider starting new work after {time}; running work is not stopped.\",\n \"providerAllowance.advisory.lowWithoutReset\":\n \"Capacity is low. Check again before starting new work; running work is not stopped.\",\n \"providerAllowance.advisory.reached\":\n \"The provider limit is reached. Consider resuming after {time}; Loomrail will not resume automatically.\",\n \"providerAllowance.advisory.reachedWithoutReset\":\n \"The provider limit is reached. Check again before resuming; Loomrail will not resume automatically.\",\n \"providerAllowance.advisory.unknown\":\n \"No scheduling suggestion is available. Loomrail's hard budget is unchanged.\",\n \"providerAllowance.error\": \"The allowance check failed. Try again.\",\n \"providerAllowance.errorWithSnapshot\": \"The new check failed. The last reading is still shown.\",\n \"settings.mcp.title\": \"MCP connections\",\n \"settings.mcp.description\":\n \"Connect a local stdio server to new agent sessions through Loomrail's closed tool allowlist.\",\n \"settings.mcp.loading\": \"Loading MCP connections…\",\n \"settings.mcp.empty\": \"No MCP connection has been approved for this project.\",\n \"settings.mcp.context7.title\": \"Context7 documentation\",\n \"settings.mcp.context7.description\":\n \"Bundled with Loomrail. No terminal command, global install or npx download is required.\",\n \"settings.mcp.context7.privacy\":\n \"Documentation queries leave this machine for Context7. Never include secrets, personal data or proprietary code.\",\n \"settings.mcp.context7.review\": \"Review bundled Context7\",\n \"settings.mcp.context7.update\": \"Check bundled Context7 for changes\",\n \"settings.mcp.context7.configured\": \"Configured below\",\n \"settings.mcp.context7.current\": \"The approved revision already matches the bundled server.\",\n \"settings.mcp.add\": \"Add local connection\",\n \"settings.mcp.newRevision\": \"Review a new connection revision\",\n \"settings.mcp.cancelRevision\": \"Add another connection\",\n \"settings.mcp.name\": \"Connection name\",\n \"settings.mcp.executable\": \"Executable\",\n \"settings.mcp.executableDescription\":\n \"An absolute path to an existing local executable. Package launchers and shell commands are refused.\",\n \"settings.mcp.args\": \"Arguments\",\n \"settings.mcp.argsDescription\": \"One exact argv element per line. No shell parsing or environment values.\",\n \"settings.mcp.declaredTools\": \"Declared read-only tools\",\n \"settings.mcp.toolsDescription\": \"One exact MCP tool name per line. Discovery cannot add access by itself.\",\n \"settings.mcp.review\": \"Review exact command\",\n \"settings.mcp.consent.title\": \"This starts a local process with your account permissions\",\n \"settings.mcp.consent.description\":\n \"Check every path and argument. Approval allows a bounded capability probe; tools remain blocked until you grant them separately.\",\n \"settings.mcp.consent.expires\": \"This one-time confirmation expires at {time}.\",\n \"settings.mcp.consent.checkbox\": \"I checked this exact executable and every argument\",\n \"settings.mcp.consent.checkboxDescription\":\n \"I understand the process itself may read or change anything my local account can access.\",\n \"settings.mcp.consent.confirm\": \"Approve exact command\",\n \"settings.mcp.revision\": \"Revision {revision}\",\n \"settings.mcp.capability\": \"Last capability probe\",\n \"settings.mcp.probe.notRun\": \"Not run\",\n \"settings.mcp.probe.run\": \"Probe capabilities\",\n \"settings.mcp.probe.again\": \"Probe again\",\n \"settings.mcp.probe.ready\": \"Ready\",\n \"settings.mcp.probe.spawnFailed\": \"Process could not start\",\n \"settings.mcp.probe.timedOut\": \"Timed out\",\n \"settings.mcp.probe.invalid\": \"Invalid MCP response\",\n \"settings.mcp.probe.outputLimit\": \"Output limit reached\",\n \"settings.mcp.probe.unsupported\": \"Unsupported protocol\",\n \"settings.mcp.probe.exited\": \"Process exited early\",\n \"settings.mcp.discoveredTools\": \"Discovered tools\",\n \"settings.mcp.tools.none\": \"None\",\n \"settings.mcp.revise\": \"Change command\",\n \"settings.mcp.grant.none\": \"No tool access\",\n \"settings.mcp.grant.enabled\": \"Enabled for new sessions\",\n \"settings.mcp.grant.revoked\": \"Access revoked\",\n \"settings.mcp.grant.choose\": \"Tools available to new sessions\",\n \"settings.mcp.grant.attestation\": \"These selected tools are read-only\",\n \"settings.mcp.grant.attestationDescription\":\n \"Loomrail cannot prove a server's semantics. Only grant tools you have independently verified.\",\n \"settings.mcp.grant.enable\": \"Grant selected tools\",\n \"settings.mcp.grant.update\": \"Update tool access\",\n \"settings.mcp.grant.revoke\": \"Revoke access\",\n \"settings.mcp.grant.revokedDescription\":\n \"This revision stays revoked for audit history. Review a new revision to use the connection again.\",\n \"settings.mcp.limit\":\n \"Local stdio only. Context7 is an exact-pinned Loomrail preset; arbitrary package downloads, URLs, OAuth, secrets and environment fields remain unavailable.\",\n \"settings.constitution.title\": \"Project Constitution\",\n \"settings.constitution.description\":\n \"Scan only allowlisted repository metadata, review the seven proposed sections, then publish with explicit approval.\",\n \"settings.constitution.preset\": \"Constitution preset\",\n \"settings.constitution.presetAuto\": \"Auto — recommended from repository signals\",\n \"settings.constitution.scan\": \"Scan and propose\",\n \"settings.constitution.rescan\": \"Scan again\",\n \"settings.constitution.empty\":\n \"No proposal yet. Scanning reads bounded configuration and documentation; it does not execute repository commands or write files.\",\n \"settings.constitution.proposal\": \"Review proposal\",\n \"settings.constitution.sourceSummary\": \"{files} allowlisted files · {preset}@1\",\n \"settings.constitution.reviewHint\":\n \"Repository text is evidence, not authority. Expand every section before approving the file.\",\n \"settings.constitution.warnings\": \"Scan notes\",\n \"settings.constitution.sources\": \"Sources\",\n \"settings.constitution.targetBlocked\":\n \"The existing .loomrail target could not be inspected safely. Resolve the path before adoption.\",\n \"settings.constitution.adopt\": \"Approve and create Constitution\",\n \"settings.constitution.replace\": \"Approve replacement\",\n \"settings.constitution.activeVersion\": \"Active v{ordinal}\",\n \"settings.constitution.failed\": \"Publication did not complete\",\n \"settings.constitution.retry\": \"Retry publication\",\n \"settings.verification.title\": \"Project checks\",\n \"settings.verification.description\":\n \"Review the exact repository commands Loomrail may run as measured checks. Nothing runs until the Plan is approved and a run is started.\",\n \"settings.verification.loading\": \"Scanning the bounded package.json preview…\",\n \"settings.verification.list\": \"Proposed project checks\",\n \"settings.verification.required\": \"Required\",\n \"settings.verification.optional\": \"Optional\",\n \"settings.verification.exactCommand\": \"Exact process launch\",\n \"settings.verification.executable\": \"Executable\",\n \"settings.verification.argument\": \"Argument {index}\",\n \"settings.verification.cwd\": \"Working directory\",\n \"settings.verification.projectRoot\": \"Project root\",\n \"settings.verification.timeout\": \"Timeout\",\n \"settings.verification.minutes\": \"{count} min\",\n \"settings.verification.seconds\": \"{count} sec\",\n \"settings.verification.output\": \"Output limit\",\n \"settings.verification.kib\": \"{count} KiB\",\n \"settings.verification.network\": \"Network\",\n \"settings.verification.networkHost\": \"Host network available\",\n \"settings.verification.networkUnavailable\": \"Cannot run: isolation unavailable\",\n \"settings.verification.environment\": \"Environment\",\n \"settings.verification.environmentBaseline\": \"Minimal runtime path · isolated home and cache\",\n \"settings.verification.localExecutionTitle\": \"Runs as your local user\",\n \"settings.verification.localExecutionNotice\":\n \"The worktree is not a security sandbox. Review every command and its network access before approval; owner and provider secrets are not inherited.\",\n \"settings.verification.source\": \"package.json script “{script}”\",\n \"settings.verification.sourceNotice\": \"Shown as untrusted source text. The scan did not execute it.\",\n \"settings.verification.empty\":\n \"No supported root scripts were found. Loomrail has not created a Plan and cannot run a project check.\",\n \"settings.verification.warnings\": \"Scan notes\",\n \"settings.verification.targetBlocked\": \"Resolve the existing .loomrail target before approval.\",\n \"settings.verification.adoptionNotice\":\n \"Approval records this complete command set as a new immutable revision and publishes only its Loomrail marker file.\",\n \"settings.verification.enableNotice\": \"Review the current scan before enabling Project checks again.\",\n \"settings.verification.adopt\": \"Approve Plan · required checks: {count}\",\n \"settings.verification.enable\": \"Enable Plan · required checks: {count}\",\n \"settings.verification.replace\": \"Approve replacement · required checks: {count}\",\n \"settings.verification.active\": \"Active revision {revision}\",\n \"settings.verification.disabled\": \"Disabled revision {revision}\",\n \"settings.verification.publishing\": \"Publishing revision {revision}\",\n \"settings.verification.unpublished\": \"Revision {revision} needs attention\",\n \"settings.verification.published\": \"Published to .loomrail/verification-plan.json\",\n \"settings.verification.publicationFailed\": \"Plan file was not published\",\n \"settings.verification.retry\": \"Retry publication\",\n \"settings.verification.disable\": \"Disable Plan\",\n \"settings.launch.title\": \"Local launch gates\",\n \"settings.launch.description\":\n \"Measure performance and security against one owner-approved local service recipe.\",\n \"settings.launch.loading\": \"Loading local launch measurement…\",\n \"settings.launch.verificationRequired\":\n \"Approve a Project checks Plan with an optional start, dev or preview recipe first.\",\n \"settings.launch.planActive\": \"Active revision {revision}\",\n \"settings.launch.planDisabled\": \"Disabled revision {revision}\",\n \"settings.launch.localTitle\": \"Local measurement only\",\n \"settings.launch.localNotice\":\n \"This starts the exact reviewed command as your local user. It does not deploy, contact an external site or promise production safety.\",\n \"settings.launch.noService\": \"The active Project checks Plan has no optional local service recipe.\",\n \"settings.launch.serviceRecipe\": \"Local service command\",\n \"settings.launch.auditRecipe\": \"Dependency audit evidence\",\n \"settings.launch.auditNone\": \"No audit recipe — owner action required\",\n \"settings.launch.origin\": \"Loopback origin\",\n \"settings.launch.healthPath\": \"Health path\",\n \"settings.launch.probePath\": \"Measured page\",\n \"settings.launch.privateRoutes\": \"Private paths, one per line\",\n \"settings.launch.samples\": \"Fresh browser samples (3–5)\",\n \"settings.launch.lcp\": \"LCP limit, ms\",\n \"settings.launch.inp\": \"INP limit, ms\",\n \"settings.launch.cls\": \"CLS limit\",\n \"settings.launch.bundle\": \"JavaScript limit, bytes\",\n \"settings.launch.headers\": \"Required response headers\",\n \"settings.launch.yes\": \"present\",\n \"settings.launch.no\": \"missing\",\n \"settings.launch.verificationIdentity\": \"Project checks Plan {id} · revision {revision}\",\n \"settings.launch.invalid\": \"Check the origin, paths, limits and required headers before approval.\",\n \"settings.launch.adopt\": \"Approve launch gates\",\n \"settings.launch.replace\": \"Approve replacement\",\n \"settings.launch.run\": \"Run local measurement\",\n \"settings.launch.disable\": \"Disable launch gates\",\n \"settings.launch.cancel\": \"Cancel measurement\",\n \"settings.launch.cancelling\": \"Cancelling…\",\n \"settings.launch.stopBlocked\": \"Retry safe stop\",\n \"settings.launch.noRun\": \"No local launch measurement has been run yet.\",\n \"settings.launch.results\": \"Local launch gate results\",\n \"settings.launch.tree\": \"Tree {tree}\",\n \"settings.launch.errorCode\": \"Measurement state: {code}\",\n \"settings.launch.status.RUNNING\": \"Measurement running\",\n \"settings.launch.status.CANCELLING\": \"Measurement cancelling\",\n \"settings.launch.status.BLOCKED\": \"Service stop unproved — action required\",\n \"settings.launch.status.PASSED\": \"All launch gates passed\",\n \"settings.launch.status.FAILED\": \"Launch action required\",\n \"settings.launch.status.ERROR\": \"Measurement failed safely\",\n \"settings.launch.status.INTERRUPTED\": \"Measurement interrupted\",\n \"settings.launch.freshness.CURRENT\": \"Current evidence\",\n \"settings.launch.freshness.STALE\": \"Stale evidence\",\n \"settings.launch.gateStatus.PASSED\": \"Passed\",\n \"settings.launch.gateStatus.FAILED\": \"Failed\",\n \"settings.launch.gateStatus.ACTION_REQUIRED\": \"Action required\",\n \"settings.launch.gateStatus.ERROR\": \"Error\",\n \"settings.launch.gate.PERF_WEB_VITALS\": \"Web Vitals\",\n \"settings.launch.gate.PERF_BUNDLE_BUDGET\": \"JavaScript budget\",\n \"settings.launch.gate.SEC_RESPONSE_HEADERS\": \"Response headers\",\n \"settings.launch.gate.SEC_UNAUTHENTICATED_ROUTES\": \"Private routes without credentials\",\n \"settings.launch.gate.SEC_CLIENT_BUNDLE_SECRETS\": \"Client bundle secret scan\",\n \"settings.launch.gate.DEPS_AUDIT\": \"Dependency audit\",\n \"settings.launch.evidence.vitals\": \"Median LCP {lcp} ms · INP {inp} ms · CLS {cls}\",\n \"settings.launch.evidence.bundle\": \"Median {measured} B · budget {budget} B\",\n \"settings.launch.evidence.secrets\": \"Scanned {bytes} B · findings {count}\",\n \"settings.launch.evidence.auditMissing\": \"No current-tree audit evidence\",\n \"settings.launch.evidence.audit\": \"Current-tree audit: {status}\",\n \"settings.release.title\": \"Release evidence\",\n \"settings.release.description\":\n \"Freeze the exact launch evidence for one declared public environment and selected tasks.\",\n \"settings.release.loading\": \"Loading release evidence…\",\n \"settings.release.boundaryTitle\": \"Evidence, not deployment\",\n \"settings.release.boundaryNotice\":\n \"Loomrail records an immutable snapshot. It does not contact this origin, use hosting credentials, approve a release or deploy it.\",\n \"settings.release.kind\": \"Environment\",\n \"settings.release.kind.PREVIEW\": \"Preview\",\n \"settings.release.kind.PRODUCTION\": \"Production\",\n \"settings.release.name\": \"Environment name\",\n \"settings.release.publicOrigin\": \"Public HTTPS origin\",\n \"settings.release.healthPath\": \"Public health path\",\n \"settings.release.variables\": \"Required variable names, one per line — never values\",\n \"settings.release.invalid\": \"Enter a name, an exact HTTPS origin, a safe path and portable variable names.\",\n \"settings.release.save\": \"Save environment\",\n \"settings.release.update\": \"Update environment\",\n \"settings.release.scope\": \"Included tasks\",\n \"settings.release.scopeNotice\":\n \"Select only tasks whose Review, QA, Project checks and Acceptance evidence should be frozen into this release.\",\n \"settings.release.noWorkItems\": \"This project has no selectable tasks.\",\n \"settings.release.create\": \"Create immutable snapshot\",\n \"settings.release.export\": \"Download evidence package\",\n \"settings.release.none\": \"No Release snapshot has been created yet.\",\n \"settings.release.results\": \"Release gate snapshot\",\n \"settings.release.current\": \"Current snapshot\",\n \"settings.release.stale\": \"Snapshot is stale\",\n \"settings.release.passed\": \"Required gates passed: {passed} of {required}\",\n \"settings.release.tree\": \"Tree {tree}\",\n \"settings.release.gateStatus.PASSED\": \"Passed\",\n \"settings.release.gateStatus.FAILED\": \"Failed\",\n \"settings.release.gateStatus.ACTION_REQUIRED\": \"Action required\",\n \"settings.release.gateStatus.STALE\": \"Stale\",\n \"settings.deploy.title\": \"Guided deploy\",\n \"settings.deploy.description\":\n \"Run the repository-owned GitHub Actions workflow for an eligible Preview or promoted Production release after two explicit confirmations.\",\n \"settings.deploy.loading\": \"Checking the exact deployment target…\",\n \"settings.deploy.boundaryTitle\": \"Existing workflow only\",\n \"settings.deploy.boundaryNotice\":\n \"Loomrail can start only the fixed workflow already stored in this repository. It receives no hosting or SSH credentials and never retries or rolls back automatically.\",\n \"settings.deploy.noRelease\":\n \"Create a current Preview or Production Release snapshot before preparing a deploy.\",\n \"settings.deploy.environment\": \"Environment\",\n \"settings.deploy.environment.PREVIEW\": \"Preview\",\n \"settings.deploy.environment.PRODUCTION\": \"Production\",\n \"settings.deploy.environment.LEGACY\": \"Legacy target\",\n \"settings.deploy.repository\": \"GitHub repository\",\n \"settings.deploy.branch\": \"Published branch\",\n \"settings.deploy.commit\": \"Exact commit\",\n \"settings.deploy.workflow\": \"Workflow\",\n \"settings.deploy.planNotice\":\n \"First confirmation: save this exact {environment} repository, branch, commit and workflow as an immutable deployment plan.\",\n \"settings.deploy.adopt\": \"Confirm exact plan\",\n \"settings.deploy.adoptAgain\": \"Prepare another exact attempt\",\n \"settings.deploy.approvalNotice\":\n \"Second confirmation: this starts one external {environment} GitHub Actions run. Review the target above before continuing.\",\n \"settings.deploy.approve\": \"Approve and deploy once\",\n \"settings.deploy.approvedNotice\":\n \"The exact {environment} attempt is approved but has not started. Start it once; Loomrail will not create a replacement automatically.\",\n \"settings.deploy.startApproved\": \"Start approved attempt\",\n \"settings.deploy.observe\": \"Check exact run\",\n \"settings.deploy.openRun\": \"Open this run on GitHub\",\n \"settings.deploy.unknownNotice\":\n \"The outcome is unknown and the workflow may already have started. Do not deploy again. If an exact GitHub run is linked, check that run instead.\",\n \"settings.deploy.failedNotice\":\n \"This attempt did not complete successfully ({code}). Review the exact run or prepare a new plan only after the cause is understood.\",\n \"settings.deploy.rollbackUnavailable\":\n \"Rollback is unavailable: this repository workflow does not expose a verified rollback action.\",\n \"settings.deploy.status.PENDING_APPROVAL\": \"Waiting for final approval\",\n \"settings.deploy.status.APPROVED\": \"Approved, not started\",\n \"settings.deploy.status.RUNNING\": \"GitHub run started\",\n \"settings.deploy.status.SUCCEEDED\": \"Deploy succeeded\",\n \"settings.deploy.status.FAILED\": \"Deploy failed\",\n \"settings.deploy.status.UNKNOWN\": \"Outcome unknown\",\n \"settings.deploy.block.RELEASE_STALE\":\n \"The Release evidence is stale. Refresh the affected checks and create a new Release snapshot.\",\n \"settings.deploy.block.RELEASE_GATES_BLOCKED\":\n \"Required release checks are not all passing. Resolve them before preparing a deployment plan.\",\n \"settings.deploy.block.ENVIRONMENT_UNSUPPORTED\":\n \"This Environment is not supported by the fixed guided-deploy contract.\",\n \"settings.deploy.block.REPOSITORY_UNAVAILABLE\":\n \"The repository cannot be read. Restore access to the registered project folder and check again.\",\n \"settings.deploy.block.REPOSITORY_PATH_NOT_CANONICAL\":\n \"The registered folder is a symlink or subfolder. Register the exact physical repository root.\",\n \"settings.deploy.block.REPOSITORY_OPERATION_IN_PROGRESS\":\n \"A merge, rebase or other Git operation is still in progress. Finish it before checking again.\",\n \"settings.deploy.block.SOURCE_DIRTY\":\n \"The current folder does not exactly match this Release. Commit the intended changes and create a new Release snapshot.\",\n \"settings.deploy.block.DETACHED_HEAD\":\n \"The repository is not on a named branch. Check out the branch that should be deployed.\",\n \"settings.deploy.block.REMOTE_INVALID\":\n \"The origin is not a credential-free GitHub remote. Fix the repository origin before continuing.\",\n \"settings.deploy.block.WORKFLOW_MISSING\":\n \"The fixed workflow for this Environment is missing from the commit. Add and review it before continuing.\",\n \"settings.deploy.block.WORKFLOW_NOT_REGULAR\":\n \"The deploy workflow is not a regular committed file. Replace the symlink or special entry with a reviewed file.\",\n \"settings.deploy.block.WORKFLOW_TRIGGER_MISSING\":\n \"The fixed workflow has no explicit workflow_dispatch trigger. Add and review that trigger before continuing.\",\n \"settings.deploy.block.WORKFLOW_TOO_LARGE\":\n \"The deploy workflow cannot be read within the safety limit. Reduce or repair the committed workflow.\",\n \"settings.deploy.block.CLI_UNAVAILABLE\":\n \"GitHub CLI is unavailable on this machine. Install it, then check the target again.\",\n \"settings.deploy.block.AUTH_REQUIRED\":\n \"GitHub CLI is not signed in. Sign in locally with gh; Loomrail will not store the token.\",\n \"settings.deploy.block.REMOTE_BRANCH_UNAVAILABLE\":\n \"The current branch is not readable on GitHub. Publish the named branch to origin first.\",\n \"settings.deploy.block.REMOTE_COMMIT_MISMATCH\":\n \"The GitHub branch does not point to this exact local commit. Publish the commit, then create current Release evidence.\",\n \"settings.deploy.block.PREVIEW_PROMOTION_REQUIRED\":\n \"Production is blocked until this exact Release evidence has a successful Preview deployment. Deploy and verify Preview first, then create the Production Release snapshot again.\",\n \"event.launchEnvironmentChanged\": \"Launch environment saved\",\n \"event.launchEnvironmentChangedDetail\": \"{kind} declaration · version {version}\",\n \"event.launchReleaseCreated\": \"Release evidence frozen\",\n \"event.launchReleaseCreatedDetail\": \"Tree {tree} · required gates {passed} of {required}\",\n \"event.deploymentPlanAdopted\": \"Deployment plan confirmed\",\n \"event.deploymentPlanAdoptedDetail\": \"{repository} · {branch} · commit {commit}\",\n \"event.deploymentChanged\": \"Deployment state changed\",\n \"event.deploymentChangedDetail\": \"{status}\",\n \"verification.title\": \"Project verification\",\n \"verification.loading\": \"Loading project verification\",\n \"verification.intro\":\n \"Run the owner-approved commands against the current worktree. Loomrail records duration, exit status and bounded output for each check.\",\n \"verification.required\": \"Required\",\n \"verification.optional\": \"Optional\",\n \"verification.status.NOT_RUN\": \"Not run\",\n \"verification.status.QUEUED\": \"Queued\",\n \"verification.status.RUNNING\": \"Running\",\n \"verification.status.CANCELLING\": \"Cancelling\",\n \"verification.status.PASSED\": \"Passed\",\n \"verification.status.FAILED\": \"Failed\",\n \"verification.status.ERROR\": \"Error\",\n \"verification.status.INTERRUPTED\": \"Interrupted\",\n \"verification.status.STALE\": \"Stale\",\n \"verification.runMeta\": \"Run {ordinal} · Plan r{revision} · {platform}\",\n \"verification.evidenceMeta\": \"Checks {passed}/{total} passed · tree {tree}\",\n \"verification.evidenceCounts\":\n \"Passed {passed} · failed {failed} · errors {errors} · interrupted {interrupted} · remaining {remaining} · tree {tree}\",\n \"verification.currentPlan\": \"Current active Plan · revision {revision}\",\n \"verification.group\": \"{kind} checks\",\n \"verification.acceptanceBlocker\":\n \"Acceptance is blocked unless every required check passes for the current code and Plan.\",\n \"verification.platform.darwin\": \"macOS\",\n \"verification.platform.linux\": \"Linux\",\n \"verification.platform.win32\": \"Windows\",\n \"verification.duration.ms\": \"{count} ms\",\n \"verification.duration.seconds\": \"{count} s\",\n \"verification.measurement\": \"{duration} · exit {exit}\",\n \"verification.outcome.active\":\n \"Checks run in order. The worktree remains reserved until this run finishes or you cancel it.\",\n \"verification.outcome.passed\": \"All required checks passed for the current code and Plan.\",\n \"verification.outcome.failed\":\n \"This run is not passing evidence. Inspect the failed check, fix the code, then run again.\",\n \"verification.outcome.interrupted\": \"This run stopped before it produced complete evidence. Run it again.\",\n \"verification.outcome.stale\": \"This result is no longer current: {reasons}. Run the checks again.\",\n \"verification.stale.PLAN_UNAVAILABLE\": \"the active Plan is unavailable\",\n \"verification.stale.PLAN_REPLACED\": \"the approved Plan changed\",\n \"verification.stale.PLAN_UNPUBLISHED\": \"the current Plan is not published\",\n \"verification.stale.TREE_CHANGED\": \"the worktree changed\",\n \"verification.unavailable.plan\": \"Approve and publish Project checks in Settings before running them.\",\n \"verification.unavailable.pipeline\": \"Start the task workflow before running Project verification.\",\n \"verification.unavailable.workspace\":\n \"Project verification becomes available after implementation prepares a worktree.\",\n \"verification.run\": \"Run checks\",\n \"verification.runAgain\": \"Run again\",\n \"verification.cancel\": \"Cancel run\",\n \"verification.output.view\": \"View output\",\n \"verification.output.hide\": \"Hide output\",\n \"verification.output.loading\": \"Loading bounded output…\",\n \"verification.history\": \"Earlier runs ({count})\",\n \"verification.correction.timeline\": \"Correction history\",\n \"verification.correction.position\": \"Correction {position}\",\n \"verification.correction.automatic\": \"Automatic\",\n \"verification.correction.ownerAuthorized\": \"Owner-authorized final attempt\",\n \"verification.correction.status.ACTIVE\": \"Active\",\n \"verification.correction.status.PASSED\": \"Passed\",\n \"verification.correction.status.SUPERSEDED\": \"Superseded\",\n \"verification.correction.status.EXHAUSTED\": \"Needs your decision\",\n \"verification.correction.status.CANCELLED\": \"Cancelled\",\n \"verification.correctionGate.title\": \"Project verification needs your decision\",\n \"verification.correctionGate.description\":\n \"Correction {position} still ended in a measured failure. Inspect the exact check output before choosing what happens next.\",\n \"verification.correctionGate.authorizeFinal\": \"Authorize one final correction\",\n \"verification.correctionGate.cancel\": \"Cancel delivery\",\n \"settings.readiness.title\": \"Launch readiness\",\n \"settings.readiness.description\":\n \"A bounded local preflight for repository security plus explicit legal, payments, and analytics decisions.\",\n \"settings.readiness.run\": \"Run readiness check\",\n \"settings.readiness.rerun\": \"Run again\",\n \"settings.readiness.empty\":\n \"No check yet. Loomrail reads only bounded repository facts and never runs project scripts.\",\n \"settings.readiness.ready\": \"Ready\",\n \"settings.readiness.actionRequired\": \"Action required\",\n \"settings.readiness.checkedAt\": \"Checked {date}\",\n \"settings.readiness.head\": \"HEAD {head}\",\n \"settings.readiness.noHead\": \"No commit\",\n \"settings.readiness.dirty\": \"Working tree changed\",\n \"settings.readiness.clean\": \"Working tree clean\",\n \"settings.readiness.limit\":\n \"This is a local preflight, not a complete security audit or legal advice. Re-run after repository changes.\",\n \"settings.readiness.category.security\": \"Security\",\n \"settings.readiness.category.legal\": \"Legal\",\n \"settings.readiness.category.payments\": \"Payments\",\n \"settings.readiness.category.analytics\": \"Analytics\",\n \"settings.readiness.category.dependencies\": \"Dependencies\",\n \"settings.readiness.category.environment\": \"Environment\",\n \"settings.readiness.category.operations\": \"Operations\",\n \"settings.readiness.check.activeConstitution\": \"Owner-approved Constitution\",\n \"settings.readiness.check.secretPaths\": \"Tracked secret-like paths\",\n \"settings.readiness.check.envIgnored\": \"Local secret files ignored\",\n \"settings.readiness.check.ciHardening\": \"CI trust and action pinning\",\n \"settings.readiness.check.license\": \"Repository license\",\n \"settings.readiness.check.legalOwner\": \"Legal and privacy review\",\n \"settings.readiness.check.paymentsOwner\": \"Payments, tax, and refunds\",\n \"settings.readiness.check.analyticsOwner\": \"Analytics consent and retention\",\n \"settings.readiness.check.lockfile\": \"Reproducible dependency lockfile\",\n \"settings.readiness.check.envProdSeparation\": \"Production env files and CI literals\",\n \"settings.readiness.check.securityHeadersOwner\": \"Security headers decision\",\n \"settings.readiness.check.healthEndpoint\": \"Health endpoint\",\n \"settings.readiness.check.rollbackPlan\": \"Rollback plan\",\n \"settings.readiness.check.backup\": \"Data backup\",\n \"settings.readiness.status.passed\": \"Passed automatically\",\n \"settings.readiness.status.action\": \"Needs action\",\n \"settings.readiness.status.confirmed\": \"Confirmed by owner\",\n \"settings.readiness.status.na\": \"Not applicable\",\n \"settings.readiness.evidence\": \"Evidence\",\n \"settings.readiness.rationale\": \"Decision note\",\n \"settings.readiness.rationalePlaceholder\": \"What was reviewed, or why this does not apply…\",\n \"settings.readiness.confirm\": \"Confirm\",\n \"settings.readiness.notApplicable\": \"Not applicable\",\n \"settings.readiness.finding.activeConstitution\": \"No active owner-approved Constitution.\",\n \"settings.readiness.finding.secretPath\": \"Git tracks a filename commonly used for secrets.\",\n \"settings.readiness.finding.envIgnored\": \"Git ignore coverage is missing or could not be verified.\",\n \"settings.readiness.finding.pullRequestTarget\": \"CI uses pull_request_target; review the trust boundary.\",\n \"settings.readiness.finding.writeAll\": \"CI grants write-all permissions.\",\n \"settings.readiness.finding.actionPinned\": \"A GitHub Action is not pinned to a full commit SHA.\",\n \"settings.readiness.finding.ciUnverifiable\": \"A CI input could not be inspected within safe bounds.\",\n \"settings.readiness.finding.license\": \"No regular root LICENSE or COPYING file was found.\",\n \"settings.readiness.finding.lockfileMissing\":\n \"A tracked manifest has no lockfile, so installs are not reproducible.\",\n \"settings.readiness.finding.lockfileAmbiguous\": \"More than one package manager lockfile is tracked.\",\n \"settings.readiness.finding.dependencyUnverifiable\":\n \"Dependency inputs could not be inspected within safe bounds.\",\n \"settings.readiness.finding.prodEnvNotIgnored\":\n \"A production environment file exists and is not covered by ignore rules.\",\n \"settings.readiness.finding.inlineSecretInCi\":\n \"CI assigns a secret-named variable a literal value instead of a managed reference.\",\n \"language.change\": \"Change language\",\n \"language.english\": \"English\",\n \"language.russian\": \"Русский\",\n \"nav.humanRequests\": \"Human requests\",\n \"nav.attention\": \"Attention\",\n \"nav.fleet\": \"Agent Fleet\",\n \"nav.workspace\": \"Workspace\",\n \"nav.open\": \"Open navigation\",\n \"nav.yourProjects\": \"Your projects\",\n \"nav.currentWork\": \"Current work\",\n \"nav.insights\": \"Insights\",\n \"nav.guidedDemo\": \"Guided demo\",\n \"activation.loading\": \"Loading the guided demo\",\n \"activation.eyebrow\": \"First local result\",\n \"activation.title\": \"Guided demo\",\n \"activation.description\":\n \"Create one real local task and run it through the signed-in Codex or Claude Code CLI with explicit execution limits.\",\n \"activation.zeroQuota\":\n \"Local agent only — no API key or separate API billing. Subscription usage is reported after each CLI session.\",\n \"activation.progress\": \"Guided demo progress\",\n \"activation.step\": \"Step {current} of {total}\",\n \"activation.status.complete\": \"Complete\",\n \"activation.status.current\": \"Current\",\n \"activation.status.upcoming\": \"Upcoming\",\n \"activation.phase.workspace\": \"Prepare the demo workspace\",\n \"activation.phase.provider\": \"Choose the safe provider\",\n \"activation.phase.task\": \"Create the guided task\",\n \"activation.phase.ready\": \"Approve it for work\",\n \"activation.phase.run\": \"Start the workflow\",\n \"activation.phase.request\": \"Human Request and provider result\",\n \"activation.phase.review\": \"Independent review after execution\",\n \"activation.phase.qa\": \"Measured Browser QA after execution\",\n \"activation.phase.acceptance\": \"Review the result\",\n \"activation.phase.complete\": \"Owner decision recorded\",\n \"activation.copy.workspace\":\n \"Materialize Loomrail's bundled web-app repository in local application storage.\",\n \"activation.copy.provider\":\n \"Return this project to Auto so Loomrail can use a compatible, signed-in Codex or Claude Code CLI. No session starts until a local CLI is ready.\",\n \"activation.copy.task\":\n \"Create the exact reviewed sample task. Retrying this action cannot create a duplicate.\",\n \"activation.copy.ready\": \"Move the task from the backlog to Ready with a recorded state transition.\",\n \"activation.copy.run\":\n \"Start the durable workflow with visible time, turn, tool and output limits. The local CLI uses its existing subscription session.\",\n \"activation.copy.request\":\n \"Answer provider questions in Attention. Repository reads, edits and approved commands go only through audited Loomrail workspace tools.\",\n \"activation.copy.review\":\n \"An independent reviewer checks the implementation before Browser QA. Its findings remain attached to this task.\",\n \"activation.copy.qa\":\n \"Browser QA measures the approved scenarios and records its screenshots and trace before acceptance can open.\",\n \"activation.copy.acceptance\":\n \"Review the measured Review and Browser QA evidence in the Task Cockpit, then choose Accept, Return, or Reject.\",\n \"activation.copy.complete\":\n \"Your final decision is durable. The walkthrough is complete; Loomrail did not decide on its own result.\",\n \"activation.action.workspace\": \"Prepare demo workspace\",\n \"activation.action.provider\": \"Use available local CLI\",\n \"activation.action.task\": \"Create guided task\",\n \"activation.action.ready\": \"Move task to Ready\",\n \"activation.action.run\": \"Start guided workflow\",\n \"activation.action.attention\": \"Answer in Attention\",\n \"activation.action.cockpit\": \"Open Task Cockpit\",\n \"activation.action.acceptance\": \"Review and decide\",\n \"activation.providerLocked\":\n \"A LOOMRAIL_PROVIDER override is active. Restart without it, then run loomrail try again.\",\n \"activation.recipe.title\": \"What this run will do\",\n \"activation.recipe.provider\": \"Provider\",\n \"activation.provider.real\": \"Codex CLI or Claude Code CLI\",\n \"activation.recipe.model\": \"Model tier\",\n \"activation.recipe.budget\": \"Loomrail task budget\",\n \"activation.next.title\": \"Where to go next\",\n \"activation.next.local\": \"Continue in Task Cockpit\",\n \"activation.next.repository\": \"Connect repository or provider\",\n \"activation.next.guidedAction\": \"Read about Guided Launch\",\n \"activation.next.guided\":\n \"Guided Launch support is a planned paid option, not an active purchase flow in this build.\",\n \"insights.loading\": \"Loading local Insights…\",\n \"insights.title\": \"Insights\",\n \"insights.description\": \"Delivery, quality and reliability signals derived from local Loomrail state.\",\n \"insights.localOnly\": \"Local only\",\n \"insights.outcomes.title\": \"Outcomes\",\n \"insights.outcomes.description\":\n \"Percentages use only completed evidence. No evidence is different from a measured zero.\",\n \"insights.rate.acceptance\": \"Accepted completion\",\n \"insights.rate.firstReview\": \"First-pass review\",\n \"insights.rate.qa\": \"Terminal QA pass\",\n \"insights.noEvidence\": \"No evidence\",\n \"insights.count.workItems\": \"Accepted / all work items\",\n \"insights.count.activeWork\": \"Active work items\",\n \"insights.count.cancelledWork\": \"Cancelled work items\",\n \"insights.count.pipelines\": \"Succeeded / all pipelines\",\n \"insights.count.pipelineFailures\": \"Failed, interrupted or cancelled pipelines\",\n \"insights.count.agentRuns\": \"Succeeded / all agent runs\",\n \"insights.count.agentFailures\": \"Failed or interrupted agent runs\",\n \"insights.count.reviews\": \"Review reports\",\n \"insights.count.qaRuns\": \"Browser QA runs\",\n \"insights.count.qaDefects\": \"Open / all QA defects\",\n \"insights.count.humanRequests\": \"Resolved / all human requests\",\n \"insights.count.tokens\": \"Estimated tokens recorded\",\n \"insights.count.recoveries\": \"Daemon-restart recoveries\",\n \"insights.report.title\": \"Anonymous reports\",\n \"insights.report.description\":\n \"Loomrail never sends these automatically. Read the complete JSON first; Download is the one-time opt-in action.\",\n \"insights.report.exclusions\":\n \"Excluded by schema: code, prompts, provider responses, logs, names, paths, IDs, timestamps, artifacts and stack traces.\",\n \"insights.report.aggregate\": \"Aggregate report\",\n \"insights.report.aggregateDescription\":\n \"Product and runtime categories plus the local aggregate metrics above.\",\n \"insights.report.crash\": \"Crash recovery report\",\n \"insights.report.crashDescription\":\n \"Available because durable state proves that a running workflow was interrupted by a daemon restart.\",\n \"insights.report.noCrash\": \"No crash report is available: no daemon-restart recovery was recorded.\",\n \"insights.report.download\": \"Download this JSON\",\n \"insights.report.previewLabel\": \"Exact report payload\",\n \"connection.connecting\": \"Connecting…\",\n \"connection.local\": \"Local daemon\",\n \"connection.offline\": \"Offline\",\n \"connection.recovery.retryTitle\": \"Loomrail is temporarily unreachable\",\n \"connection.recovery.retryDescription\":\n \"Check that the local process is still running. You can retry without losing saved work.\",\n \"connection.recovery.reopenTitle\": \"This local session has ended\",\n \"connection.recovery.reopenDescription\":\n \"Stop the old process if needed, then start Loomrail again. A fresh authenticated tab will open automatically.\",\n \"connection.recovery.command\": \"Run in a terminal\",\n \"connection.recovery.retryAction\": \"Try again\",\n \"theme.change\": \"Change color theme\",\n \"theme.light\": \"Light\",\n \"theme.dark\": \"Dark\",\n \"theme.system\": \"System\",\n \"project.switch\": \"Switch project\",\n \"project.loading\": \"Loading…\",\n \"project.none\": \"No projects\",\n \"project.noneSingle\": \"No project\",\n search: \"Search\",\n \"task.new\": \"New task\",\n \"task.create.description\":\n \"Create the work item first. Loomrail will propose the delivery pipeline after the brief is clear.\",\n \"task.create.title\": \"Title\",\n \"task.create.titlePlaceholder\": \"What should the team deliver?\",\n \"task.create.brief\": \"Brief\",\n \"task.create.briefDescription\": \"Enough context for the planning agents to ask useful questions.\",\n \"task.create.briefPlaceholder\": \"Outcome, constraints, relevant files…\",\n \"task.create.criteria\": \"Acceptance criteria\",\n \"task.create.criteriaDescription\": \"Write one verifiable outcome per line. At least one is required.\",\n \"task.create.criteriaError\": \"Use 1–50 unique lines and no more than 500 characters per criterion.\",\n \"task.create.criteriaPlaceholder\": \"The owner can verify the delivered outcome…\",\n \"task.create.project\": \"Project\",\n \"task.create.priority\": \"Priority\",\n \"task.create.type\": \"Type\",\n \"task.create.parent\": \"Parent work item\",\n \"task.create.parentDescription\": \"Optional grouping under an Epic or another work item.\",\n \"task.create.noParent\": \"No parent\",\n \"task.create.submit\": \"Create task\",\n \"task.edit\": \"Edit task\",\n \"task.edit.description\": \"Update the persisted brief and planning properties for this WorkItem.\",\n \"task.edit.criteriaDescription\": \"Write one acceptance criterion per line, up to 50.\",\n \"task.edit.criteriaError\": \"Use no more than 50 lines and 500 characters per criterion.\",\n \"task.edit.submit\": \"Save changes\",\n \"action.cancel\": \"Cancel\",\n \"action.back\": \"Back\",\n \"action.closeDialog\": \"Close dialog\",\n \"view.active\": \"Active\",\n \"view.backlog\": \"Backlog\",\n \"view.allIssues\": \"All issues\",\n \"view.filter\": \"Filter tasks\",\n \"view.display\": \"Display settings\",\n \"view.ordering\": \"Ordering\",\n \"view.orderBy\": \"Order tasks by\",\n \"view.boardOptions\": \"Board options\",\n \"view.showEmptyColumns\": \"Show empty columns\",\n \"view.direction.asc\": \"Sort ascending\",\n \"view.direction.desc\": \"Sort descending\",\n \"view.title\": \"Title\",\n \"view.updated\": \"Updated\",\n \"view.created\": \"Created\",\n \"property.priority\": \"Priority\",\n \"work.current\": \"Current work\",\n \"work.boardLabel\": \"Current work board\",\n \"work.summary.needsYou\": \"Needs you\",\n \"work.summary.filter\": \"Quick filter\",\n \"work.summary.clear\": \"Clear quick filter\",\n \"view.actions\": \"Open view actions\",\n \"view.copyLink\": \"Copy view link\",\n \"filter.status\": \"Status\",\n \"filter.priority\": \"Priority\",\n \"filter.risk\": \"Risk\",\n \"filter.rootTitle\": \"Filters\",\n \"filter.search\": \"Search\",\n \"filter.addPlaceholder\": \"Add Filter…\",\n \"filter.placeholder\": \"Filter…\",\n \"filter.noProperties\": \"No matching properties\",\n \"filter.noValues\": \"No matching values\",\n \"filter.add\": \"Add\",\n \"filter.remove\": \"Remove\",\n \"filter.options\": \"options\",\n \"filter.backTo\": \"Back to\",\n \"filter.close\": \"Close filters\",\n \"filter.description\": \"Choose one or more task properties. Each selection is applied immediately.\",\n \"filter.edit\": \"Edit\",\n \"filter.is\": \"is\",\n \"filter.isAnyOf\": \"is any of\",\n \"filter.oneValue\": \"1 value\",\n \"filter.selectedValues\": \"selected values\",\n \"filter.clear\": \"Clear\",\n \"state.BACKLOG\": \"Backlog\",\n \"state.READY\": \"Ready\",\n \"state.IN_PROGRESS\": \"Running\",\n \"state.BLOCKED\": \"Blocked\",\n \"state.DONE\": \"Done\",\n \"state.CANCELLED\": \"Cancelled\",\n \"priority.LOW\": \"Low\",\n \"priority.MEDIUM\": \"Medium\",\n \"priority.HIGH\": \"High\",\n \"priority.URGENT\": \"Urgent\",\n \"risk.LOW\": \"Low\",\n \"risk.MEDIUM\": \"Medium\",\n \"risk.HIGH\": \"High\",\n \"risk.CRITICAL\": \"Critical\",\n \"type.EPIC\": \"Epic\",\n \"type.FEATURE\": \"Feature\",\n \"type.TASK\": \"Task\",\n \"type.BUG\": \"Bug\",\n \"type.SPIKE\": \"Spike\",\n \"type.SUBTASK\": \"Subtask\",\n \"stage.DISCOVERY\": \"Discovery\",\n \"stage.PLAN\": \"Plan\",\n \"stage.IMPLEMENT\": \"Implementation\",\n \"stage.REVIEW\": \"Review\",\n \"stage.QA\": \"QA\",\n \"stage.ACCEPTANCE\": \"Acceptance\",\n \"empty.noProjects.title\": \"No local projects yet\",\n \"empty.noProjects.description\":\n \"Register the two bundled, non-executable fixture projects to start a persisted board.\",\n \"empty.noProjects.action\": \"Initialize demo workspace\",\n \"loading.board.title\": \"Loading board…\",\n \"loading.inspector.title\": \"Loading task details…\",\n \"error.board.title\": \"The local board could not be loaded\",\n \"error.unknown\": \"Unknown error\",\n \"empty.active.title\": \"No active tasks\",\n \"empty.active.description\": \"Create a task, or switch to All issues to see finished work.\",\n \"empty.backlog.title\": \"The backlog is empty\",\n \"empty.backlog.description\": \"New tasks wait here until someone moves them to Ready.\",\n \"empty.all.title\": \"No tasks yet\",\n \"empty.all.description\": \"Create a task to start tracking delivery in this project.\",\n \"empty.filters.title\": \"No tasks match these filters\",\n \"empty.filters.description\": \"Edit a condition above or clear the filter bar.\",\n \"empty.noSelection.title\": \"No task selected\",\n \"empty.noSelection.description\": \"Choose a card on the board to inspect its persisted state and activity.\",\n \"task.move\": \"Move\",\n \"task.moveTo\": \"Move to {state}\",\n \"task.moveToShort\": \"To {state}\",\n \"task.overview\": \"Overview\",\n \"task.state\": \"State\",\n \"task.stage\": \"Stage\",\n \"task.type\": \"Type\",\n \"task.priority\": \"Priority\",\n \"task.risk\": \"Risk\",\n \"task.noBrief\": \"No brief has been added yet.\",\n \"task.acceptanceCriteria\": \"Acceptance criteria\",\n \"task.noAcceptanceCriteria\": \"No acceptance criteria have been recorded.\",\n \"dependency.title\": \"Structure and dependencies\",\n \"dependency.edit\": \"Edit blockers\",\n \"dependency.editDescription\":\n \"Choose the work items that must be Done before this workflow can start. Hierarchy is shown separately.\",\n \"dependency.save\": \"Save blockers\",\n \"dependency.loading\": \"Loading structure and dependencies…\",\n \"dependency.parent\": \"Parent\",\n \"dependency.children\": \"Children\",\n \"dependency.blockedBy\": \"Blocked by\",\n \"dependency.blocks\": \"Blocks\",\n \"dependency.none\": \"None\",\n \"dependency.noChildren\": \"No children\",\n \"dependency.noBlockers\": \"No blockers\",\n \"dependency.blocksNone\": \"No downstream work\",\n \"dependency.noCandidates\": \"There are no other work items in this project.\",\n \"dependency.editUnavailable\":\n \"Blockers can be changed only before a workflow starts and before this work item is closed.\",\n \"task.activity\": \"Activity\",\n \"task.loadingActivity\": \"Loading activity…\",\n \"task.noActivity\": \"No activity recorded.\",\n \"task.activityCountMore\": \"{count}+\",\n \"task.loadMoreActivity\": \"Show more\",\n \"workflow.title\": \"Workflow\",\n \"workflow.name\": \"Delivery workflow\",\n \"workflow.start\": \"Start workflow\",\n \"workflow.startDescription\":\n \"Run the bounded Discovery → Acceptance workflow. It may stop for a durable question or owner decision before continuing.\",\n \"workflow.readyRequired\": \"Move this task to Ready before starting its workflow.\",\n \"workflow.dependencyBlocked\": \"Finish every blocking work item before starting this workflow.\",\n \"workflow.dependencyLoadFailed\":\n \"Loomrail could not verify the dependency graph, so start remains disabled.\",\n \"workflow.containerNotExecutable\":\n \"This is a container with child work items. Start the leaf work items instead.\",\n \"workflow.loading\": \"Loading workflow…\",\n \"workflow.status.RUNNING\": \"Running\",\n \"workflow.status.WAITING_HUMAN\": \"Waiting for you\",\n \"workflow.status.SOFT_PAUSED\": \"Paused\",\n \"workflow.status.HARD_PAUSED\": \"Budget paused\",\n \"workflow.status.INTERRUPTED\": \"Interrupted\",\n \"workflow.status.SUCCEEDED\": \"Completed\",\n \"workflow.status.FAILED\": \"Failed\",\n \"workflow.status.CANCELLED\": \"Cancelled\",\n \"workflow.completed\": \"The bounded delivery workflow completed from its recorded decisions.\",\n \"workflow.stage.QUEUED\": \"Queued\",\n \"workflow.stage.RUNNING\": \"Running\",\n \"workflow.stage.WAITING_HUMAN\": \"Waiting\",\n \"workflow.stage.SOFT_PAUSED\": \"Paused\",\n \"workflow.stage.HARD_PAUSED\": \"Budget paused\",\n \"workflow.stage.INTERRUPTED\": \"Interrupted\",\n \"workflow.stage.CANCELLED\": \"Cancelled\",\n \"workflow.stage.SUCCEEDED\": \"Completed\",\n \"workflow.stage.other\": \"In progress\",\n \"workflow.action.pause\": \"Pause\",\n \"workflow.action.resume\": \"Resume\",\n \"workflow.action.cancel\": \"Cancel run\",\n \"workflow.action.override\": \"Approve cost policy\",\n \"workflow.budget.title\": \"Estimated token budget\",\n \"workflow.budget.kind\": \"Hard budget\",\n \"workflow.budget.input\": \"Hard token budget\",\n \"workflow.budget.description\":\n \"All six stages run, including independent Review, Project verification, Browser QA and owner Acceptance. Tool turns and retries can make even a small task expensive. This is a ceiling, not a forecast: input, output and cache hits are unknown before execution. Local CLI usage is reported after a session; that session can exceed the ceiling, which blocks subsequent work.\",\n \"workflow.budget.invalid\": \"Enter a positive whole number.\",\n \"workflow.budget.overrideDescription\":\n \"Keep at least the current {current}; the limit must stay above recorded usage {used}.\",\n \"workflow.budget.overrideInvalid\": \"Keep the current limit and stay above recorded usage.\",\n \"workflow.budget.usage\": \"{used} of {limit}\",\n \"workflow.budget.revision\": \"Policy revision {revision}\",\n \"workflow.agentRunBudget.input\": \"Per-agent run ceiling\",\n \"workflow.agentRunBudget.description\":\n \"Maximum estimated tokens for each future agent run. It cannot exceed the whole-run limit.\",\n \"workflow.agentRunBudget.invalid\": \"Enter a positive whole number no higher than the whole-run limit.\",\n \"workflow.agentRunBudget.overrideDescription\":\n \"Raise this ceiling to unblock an exhausted agent run, or raise the whole-run limit.\",\n \"workflow.agentRunBudget.overrideInvalid\": \"Raise this ceiling when the whole-run limit is unchanged.\",\n \"workflow.agentRunBudget.current\": \"Per agent: {limit}\",\n \"workflow.agentRunBudget.roleDefault\": \"Role envelope\",\n \"workflow.modelTier.input\": \"Model tier\",\n \"workflow.modelTier.description\":\n \"Applies to future agent runs and is recorded in each immutable policy snapshot.\",\n \"workflow.model.input\": \"Model\",\n \"workflow.model.autoOption\": \"{tier} · Auto\",\n \"workflow.model.autoDescription\": \"Codex CLI: {codex} · Claude Code: {claude}\",\n \"workflow.model.providerDescription\": \"{provider} · {tier} cost policy\",\n \"workflow.model.loading\": \"Loading the provider model catalog…\",\n \"workflow.modelTier.current\": \"Tier: {tier}\",\n \"workflow.modelTier.roleDefault\": \"Role default\",\n \"workflow.modelTier.FAST\": \"Fast\",\n \"workflow.modelTier.STANDARD\": \"Standard\",\n \"workflow.modelTier.DEEP\": \"Deep\",\n \"workflow.recovery.title\": \"Recovery report\",\n \"workflow.recovery.description\":\n \"A running attempt was interrupted safely after the local daemon restarted.\",\n \"workflow.hardPause.noProgress\": \"Paused: no progress\",\n \"workflow.hardPause.contextFloor\": \"Paused: context too large\",\n \"workflow.hardPause.providerRejected\": \"Paused: provider rejected input\",\n \"workflow.hardPause.providerStartFailed\": \"Paused: provider unavailable\",\n \"workflow.hardPause.providerOutcomeRejected\": \"Paused: invalid provider result\",\n \"workflow.hardPause.sessionLimit\": \"Paused: session limit reached\",\n \"workflow.sessions.title\": \"Sessions\",\n \"workflow.sessions.attemptHeading\": \"Attempt {attempt}\",\n \"workflow.sessions.ordinal\": \"Session {ordinal}\",\n \"workflow.sessions.status.RUNNING\": \"Running\",\n \"workflow.sessions.status.COMPLETED\": \"Completed\",\n \"workflow.sessions.status.HANDOFF\": \"Handed off\",\n \"workflow.sessions.status.CONTEXT_EXHAUSTED\": \"Context exhausted\",\n \"workflow.sessions.status.INTERRUPTED\": \"Interrupted\",\n \"workflow.sessions.status.CANCELLED\": \"Cancelled\",\n \"workflow.sessions.handoffRequested\": \"Handoff requested\",\n \"workflow.sessions.occupancyPeak\": \"Peaked at {percent}% of the window\",\n \"workflow.sessions.occupancyAtHandoff\": \"{percent}% of the window at handoff\",\n \"workflow.sessions.usageQuality.ACTUAL\": \"(measured)\",\n \"workflow.sessions.usageQuality.PROVIDER_ESTIMATE\": \"(provider estimate)\",\n \"workflow.sessions.usageQuality.LOOMRAIL_ESTIMATE\": \"(Loomrail estimate)\",\n \"workflow.sessions.cacheUnknown\": \"Unknown\",\n \"workflow.sessions.tokenUsage\":\n \"{total} tokens used ({input} in · {output} out · {cached} cached in · {uncached} uncached in + out)\",\n \"workflow.sessions.tokenCost\": \"· {cost}\",\n \"workflow.sessions.noCheckpointOnRequest\":\n \"This provider cannot wind down on request — losing recent work when a session is cut is expected for it.\",\n \"workflow.checkpoints.empty\": \"No checkpoint was published in this session.\",\n \"workflow.checkpoints.completed\": \"Completed\",\n \"workflow.checkpoints.remaining\": \"Remaining\",\n \"workflow.checkpoints.deadEnds\": \"Dead ends\",\n \"workflow.checkpoints.openQuestions\": \"Open questions\",\n \"workspace.title\": \"Workspace\",\n \"workspace.state\": \"State\",\n \"workspace.status.READY\": \"Ready\",\n \"workspace.status.ORPHANED\": \"Worktree gone\",\n \"workspace.status.REMOVED\": \"Removed\",\n \"workspace.repository\": \"Repository\",\n \"workspace.mode\": \"Mode\",\n \"workspace.mode.ISOLATED_WORKTREE\": \"Separate worktree\",\n \"workspace.mode.SHARED_CURRENT_DIRECTORY\": \"Project folder\",\n \"workspace.branch\": \"Branch\",\n \"workspace.worktree\": \"Worktree\",\n \"workspace.workingDirectory\": \"Working directory\",\n \"workspace.baseCommit\": \"Base commit\",\n \"workspace.baseCommit.none\": \"No commit yet\",\n \"workspace.notReady\":\n \"The worktree for this task is no longer on disk. Loomrail does not cut a second one, and nothing returns this workspace to service — the branch still holds whatever was committed to it.\",\n \"workspace.sharedNotReady\":\n \"The Project's recorded working directory is no longer available. Loomrail will not choose another directory or branch on its own.\",\n \"workspace.uncommitted\":\n \"Loomrail has committed nothing. The work sits in this worktree, on this branch, until you keep it or discard it.\",\n \"workspace.sharedUncommitted\":\n \"Loomrail has committed nothing. Agent changes are in your project folder alongside any work that was already there.\",\n \"changes.title\": \"Changes\",\n \"changes.empty\": \"This task has changed nothing in its worktree yet.\",\n \"changes.truncated\":\n \"Only the first {count} changed files are listed. This worktree holds more than Loomrail prints here.\",\n \"changes.binary\": \"Binary\",\n \"changes.binaryNoPatch\": \"This is a binary file, so there is no text diff to show for it.\",\n \"changes.renamedFrom\": \"Renamed from {path}\",\n \"changes.lineCounts\": \"Lines added: {insertions}; removed: {deletions}\",\n \"changes.diffPending\": \"Reading this file’s diff…\",\n \"changes.diffUnavailable\": \"This diff cannot be read: the task no longer has a workspace.\",\n \"changes.patchTruncated\":\n \"Loomrail prints only the first part of this diff — {bytes} more bytes are not shown here.\",\n \"changes.status.ADDED\": \"Added\",\n \"changes.status.MODIFIED\": \"Modified\",\n \"changes.status.DELETED\": \"Deleted\",\n \"changes.status.RENAMED\": \"Renamed\",\n \"changes.error.WORKSPACE_WORKTREE_MISSING\":\n \"The worktree for this task is no longer on disk, so there is nothing left to read its changes from.\",\n \"changes.error.WORKSPACE_WORKTREE_UNREADABLE\":\n \"Loomrail cannot enter this task’s worktree, so it cannot say what changed. It may still hold the agent’s work, but Loomrail cannot verify that from here.\",\n \"changes.error.WORKSPACE_HAS_NO_BASELINE\":\n \"This workspace records no commit to compare against, so there is nothing to measure its changes from.\",\n \"changes.error.CHANGES_UNREADABLE\":\n \"Loomrail could not read this worktree against the commit it was cut from, so it is not showing a file list it cannot stand behind.\",\n \"changes.error.GIT_UNAVAILABLE\":\n \"Loomrail could not start git on this machine, so it cannot read what this task changed.\",\n \"changes.error.PATH_OUTSIDE_WORKSPACE\":\n \"That path lies outside this task’s worktree, so Loomrail did not read it.\",\n \"changes.error.PATH_NOT_A_FILE\": \"That path does not name a changed file in this worktree.\",\n \"changes.error.PATH_UNRESOLVABLE\": \"Loomrail could not resolve that path inside this worktree.\",\n \"changes.error.other\": \"Loomrail could not read what this task changed.\",\n \"review.title\": \"Independent review\",\n \"review.round\": \"Review round {round}\",\n \"review.verdict.PASSED\": \"Passed\",\n \"review.verdict.CHANGES_REQUESTED\": \"Changes requested\",\n \"review.reviewer\": \"Reviewer\",\n \"review.relation\": \"Independence\",\n \"review.relation.CROSS_PROVIDER\": \"Cross-provider\",\n \"review.relation.SAME_PROVIDER\": \"Separate run, same provider\",\n \"review.tree\": \"Reviewed tree\",\n \"review.findings\": \"Review findings\",\n \"review.noFindings\": \"No open findings remain.\",\n \"review.severity.LOW\": \"Low\",\n \"review.severity.MEDIUM\": \"Medium\",\n \"review.severity.HIGH\": \"High\",\n \"review.severity.CRITICAL\": \"Critical\",\n \"review.findingStatus.OPEN\": \"Open\",\n \"review.findingStatus.RESOLVED\": \"Resolved\",\n \"review.findingStatus.WAIVED\": \"Waived\",\n \"review.findingStatus.FALSE_POSITIVE\": \"False positive\",\n \"review.reproduction\": \"Reproduction\",\n \"review.waive\": \"Waive\",\n \"review.falsePositive\": \"False positive\",\n \"review.reason\": \"Owner reason\",\n \"review.reasonPlaceholder\": \"Explain why this finding should not block the delivery…\",\n \"review.confirmWaive\": \"Record waiver\",\n \"review.confirmFalsePositive\": \"Mark false positive\",\n \"qa.title\": \"Browser QA\",\n \"qa.status.RUNNING\": \"Running\",\n \"qa.status.PASSED\": \"Passed\",\n \"qa.status.FAILED\": \"Failed\",\n \"qa.status.ERROR\": \"Could not verify\",\n \"qa.tree\": \"Tested tree\",\n \"qa.target\": \"Target\",\n \"qa.environment\": \"Environment\",\n \"qa.planRevision\": \"Plan revision {revision}\",\n \"qa.matrix\": \"Scenario matrix\",\n \"qa.scenarioProgress\": \"{steps} steps · {assertions} assertions\",\n \"qa.assertionFailed\": \"Failed: {title}\",\n \"qa.notRun\": \"Not measured\",\n \"qa.observations\": \"Console and network\",\n \"qa.observation.CONSOLE\": \"Console\",\n \"qa.observation.NETWORK\": \"Network\",\n \"qa.blocking\": \"Blocking\",\n \"qa.defects\": \"QA defects\",\n \"qa.defectStatus.OPEN\": \"Open\",\n \"qa.defectStatus.RESOLVED\": \"Resolved by retest\",\n \"qa.defectStatus.WAIVED\": \"Risk accepted\",\n \"qa.reproduction\": \"Reproduce\",\n \"qa.waive\": \"Accept risk\",\n \"qa.waiverReason\": \"Owner reason\",\n \"qa.waiverReasonPlaceholder\": \"Explain why this defect should not enter the next fix set…\",\n \"qa.confirmWaive\": \"Record waiver\",\n \"qa.correctionTimeline\": \"Correction timeline\",\n \"qa.correction\": \"Correction {ordinal}\",\n \"qa.correctionStatus.ACTIVE\": \"Active\",\n \"qa.correctionStatus.PASSED\": \"Passed\",\n \"qa.correctionStatus.SUPERSEDED\": \"Superseded\",\n \"qa.correctionStatus.EXHAUSTED\": \"Limit reached\",\n \"qa.correctionStatus.CANCELLED\": \"Cancelled\",\n \"qa.correctionSource\": \"Source failure\",\n \"qa.correctionEvidence\": \"Source evidence\",\n \"qa.correctionBaseline\": \"Full baseline\",\n \"qa.correctionTree\": \"tree {tree}\",\n \"qa.retestScope\": \"Locked retest scope · {count} cells\",\n \"qa.retestReason.FAILED_CHECK\": \"failed check\",\n \"qa.retestReason.BLOCKING_OBSERVATION\": \"blocking observation\",\n \"qa.retestReason.OPEN_DEFECT\": \"open defect\",\n \"qa.retestReason.REGRESSION\": \"regression\",\n \"qa.resolvedBy\": \"Passing retest\",\n \"qa.correctionGate.title\": \"QA correction decision\",\n \"qa.correctionGate.description\":\n \"Correction {ordinal} exhausted its bounded retest. Choose the next audited workflow transition.\",\n \"qa.correctionGate.authorizeFinal\": \"Authorize final correction\",\n \"qa.correctionGate.cancel\": \"Cancel delivery\",\n \"qa.attachments\": \"Evidence files\",\n \"qa.attachment.SCREENSHOT\": \"Screenshot\",\n \"qa.attachment.TRACE\": \"Playwright trace\",\n \"qa.openAttachment\": \"Open evidence\",\n \"acceptance.eyebrow\": \"Owner gate\",\n \"acceptance.title\": \"Acceptance package\",\n \"acceptance.evidence\": \"Recorded evidence\",\n \"acceptance.reviewEvidence\": \"Review report\",\n \"acceptance.qaEvidence\": \"QA report\",\n \"acceptance.checks\": \"{count} verified checks\",\n \"acceptance.evidenceCount\": \"{count} evidence records\",\n \"acceptance.matrix\": \"Criterion matrix\",\n \"acceptance.noCriteria\": \"No explicit criteria were recorded; review the evidence and release note.\",\n \"acceptance.implementation\": \"Implementation\",\n \"acceptance.reviewCheck\": \"Selected review check\",\n \"acceptance.qaCheck\": \"Selected QA check\",\n \"acceptance.ownerVerification\": \"Owner verification\",\n \"acceptance.knownRisk\": \"Known risk\",\n \"acceptance.noKnownRisk\": \"None recorded\",\n \"acceptance.legacyEvidence\": \"Legacy package — checks are not bound per criterion\",\n \"acceptance.export\": \"Download release summary\",\n \"acceptance.accept\": \"Accept delivery\",\n \"acceptance.return\": \"Return to work\",\n \"acceptance.reject\": \"Reject\",\n \"acceptance.status.PENDING\": \"Needs decision\",\n \"acceptance.status.ACCEPTED\": \"Accepted\",\n \"acceptance.status.RETURNED\": \"Returned\",\n \"acceptance.status.REJECTED\": \"Rejected\",\n \"humanRequest.blocking\": \"Blocking request\",\n \"humanRequest.request\": \"Request\",\n \"humanRequest.recommendation\": \"Recommendation\",\n \"humanRequest.recommended\": \"Recommended\",\n \"humanRequest.other\": \"Other\",\n \"humanRequest.otherPlaceholder\": \"Describe the direction to use…\",\n \"humanRequest.answerResume\": \"Answer & resume\",\n \"humanRequest.chooseAnswer\": \"Choose an answer before resuming.\",\n \"humanRequest.authorityNotice\":\n \"Your answer records information and resumes work. It does not grant new file, command, network, budget, or acceptance permissions.\",\n \"attention.title\": \"Needs your decision\",\n \"attention.count\": \"{count} blocking request\",\n \"attention.countMany\": \"{count} blocking requests\",\n \"attention.inboxTitle\": \"Attention\",\n \"attention.inboxDescription\": \"Decisions and approvals waiting across every project.\",\n \"attention.listLabel\": \"Requests that need your attention\",\n \"attention.loading\": \"Loading Attention Inbox\",\n \"attention.refreshing\": \"Updating…\",\n \"attention.emptyTitle\": \"Nothing needs you right now\",\n \"attention.emptyDescription\":\n \"New questions and approvals will appear here without losing their task context.\",\n \"attention.limitReached\": \"Showing the first 200 requests. Resolve an item to reveal the rest.\",\n \"attention.section.BLOCKING_NOW\": \"Blocking now\",\n \"attention.section.APPROVALS\": \"Approvals\",\n \"attention.section.QUESTIONS\": \"Questions\",\n \"attention.section.MANUAL_ACTIONS\": \"Manual actions\",\n \"attention.section.SOON\": \"Soon\",\n \"attention.category.APPROVAL\": \"Approval\",\n \"attention.category.QUESTION\": \"Question\",\n \"attention.category.MANUAL_ACTION\": \"Manual action\",\n \"attention.fact.category\": \"Type\",\n \"attention.fact.priority\": \"Priority\",\n \"attention.fact.stage\": \"Affected stage\",\n \"attention.fact.created\": \"Waiting since\",\n \"attention.acceptanceTitle\": \"Review the delivery evidence\",\n \"attention.acceptanceDescription\":\n \"Acceptance remains in the Task Cockpit, where the evidence, verification instructions and exact consequence are visible together.\",\n \"attention.reviewAcceptance\": \"Review acceptance\",\n \"attention.openTask\": \"Open task context\",\n \"fleet.title\": \"Agent Fleet\",\n \"fleet.description\": \"Active roles and scheduler waits across every local project.\",\n \"fleet.capacity\": \"{active} / {limit} active\",\n \"fleet.loading\": \"Loading Agent Fleet\",\n \"fleet.refreshing\": \"Updating…\",\n \"fleet.emptyTitle\": \"No agent work is queued\",\n \"fleet.emptyDescription\": \"Start an approved task to see its assigned role and scheduling state here.\",\n \"fleet.column.task\": \"Task\",\n \"fleet.column.role\": \"Role\",\n \"fleet.column.stage\": \"Stage\",\n \"fleet.column.provider\": \"Provider\",\n \"fleet.column.status\": \"Status\",\n \"fleet.column.since\": \"Since\",\n \"fleet.column.latestAction\": \"Latest action\",\n \"fleet.notStarted\": \"Not started\",\n \"fleet.noActivity\": \"No activity yet\",\n \"fleet.latestAction.origin.DAEMON_AUDITED\": \"Verified\",\n \"fleet.latestAction.origin.PROVIDER_REPORTED\": \"Provider-reported\",\n \"fleet.status.READY\": \"Ready\",\n \"fleet.status.WAITING\": \"Waiting\",\n \"fleet.status.RUNNING\": \"Running\",\n \"fleet.role.LEAD_PM\": \"Lead PM\",\n \"fleet.role.PRODUCT_ANALYST\": \"Product Analyst\",\n \"fleet.role.SOFTWARE_ARCHITECT\": \"Software Architect\",\n \"fleet.role.DEVELOPER\": \"Developer\",\n \"fleet.role.CODE_REVIEWER\": \"Code Reviewer\",\n \"fleet.role.BROWSER_QA\": \"Browser QA\",\n \"fleet.role.ACCEPTANCE_MANAGER\": \"Acceptance Manager\",\n \"fleet.wait.NOT_READY\": \"The stage is not ready\",\n \"fleet.wait.BUDGET_BLOCKED\": \"Budget approval is required\",\n \"fleet.wait.CHECKPOINT_NOT_STABLE\": \"Waiting for a stable checkpoint\",\n \"fleet.wait.ATTEMPT_ACTIVE\": \"This attempt is already active\",\n \"fleet.wait.GLOBAL_LIMIT\": \"All global slots are occupied\",\n \"fleet.wait.PROJECT_LIMIT\": \"This project's slots are occupied\",\n \"fleet.wait.PROVIDER_LIMIT\": \"This provider's slots are occupied\",\n \"fleet.wait.WORKSPACE_CONFLICT\": \"The workspace is in use\",\n \"event.created\": \"Task created\",\n \"event.createdDetail\": \"Added to the project backlog.\",\n \"event.updated\": \"Task updated\",\n \"event.updatedDetail\": \"Changed {fields}.\",\n \"event.dependenciesSet\": \"Dependencies changed\",\n \"event.dependenciesSetDetail\": \"Incoming blockers: {count}\",\n \"event.stateChanged\": \"State changed\",\n \"event.stateChangedDetail\": \"{from} → {to}\",\n \"event.projectRegistered\": \"Project registered\",\n \"event.projectScaffoldRequested\": \"Project creation requested\",\n \"event.projectScaffoldCompleted\": \"Project created\",\n \"event.projectScaffoldFailed\": \"Project creation stopped\",\n \"event.providerPreferenceChanged\": \"AI provider changed\",\n \"event.providerPreferenceChangedDetail\": \"{from} → {to}\",\n \"event.providerAllowanceRecorded\": \"Provider allowance updated\",\n \"event.providerAllowanceRecordedDetail\": \"{provider} · {freshness}\",\n \"event.mcpProfileConsented\": \"MCP command approved\",\n \"event.mcpProfileConsentedDetail\": \"{name}, revision {revision}\",\n \"event.mcpGrantChanged\": \"MCP tool access changed\",\n \"event.mcpGrantChangedDetail\": \"{count} tool(s) · {state}\",\n \"event.mcpGrant.enabled\": \"enabled\",\n \"event.mcpGrant.revoked\": \"revoked\",\n \"event.constitutionProposed\": \"Constitution proposed\",\n \"event.constitutionProposedDetail\": \"Preset {preset}@1\",\n \"event.constitutionPublicationRequested\": \"Constitution publication requested\",\n \"event.constitutionPublicationRequestedDetail\": \"Version {ordinal} is being published\",\n \"event.constitutionActivated\": \"Constitution activated\",\n \"event.constitutionActivatedDetail\": \"Version {ordinal} is now authoritative\",\n \"event.constitutionPublicationFailed\": \"Constitution publication failed\",\n \"event.verificationPlanAdopted\": \"Project checks approved\",\n \"event.verificationPlanAdoptedDetail\": \"Revision {revision} · {count} exact command(s)\",\n \"event.verificationPlanDisabled\": \"Project checks disabled\",\n \"event.verificationPlanDisabledDetail\": \"Revision {revision} records the disabled state\",\n \"event.verificationPlanPublicationApplied\": \"Project checks published\",\n \"event.verificationPlanPublicationAppliedDetail\": \"Revision {revision} is available for measured runs\",\n \"event.verificationPlanPublicationFailed\": \"Project checks publication failed\",\n \"event.verificationPlanPublicationRetried\": \"Project checks publication retried\",\n \"event.verificationPlanPublicationRetriedDetail\": \"Revision {revision} is being reconciled\",\n \"event.launchPlanChanged\": \"Local launch gates changed\",\n \"event.launchPlanChangedDetail\": \"Revision {revision} · {status}\",\n \"event.launchRunChanged\": \"Local launch measurement changed\",\n \"event.launchRunChangedDetail\": \"{status} · tree {tree}\",\n \"event.verificationRunReserved\": \"Project verification queued\",\n \"event.verificationRunReservedDetail\": \"Run {ordinal} · {count} check(s)\",\n \"event.verificationCheckStarted\": \"Project check started\",\n \"event.verificationCheckStartedDetail\": \"Check {ordinal}\",\n \"event.verificationCheckCompleted\": \"Project check finished\",\n \"event.verificationCheckCompletedDetail\": \"Check {ordinal} · {status}\",\n \"event.verificationRunInterrupted\": \"Project verification interrupted\",\n \"event.verificationRunInterruptedDetail\": \"Run {ordinal}\",\n \"event.verificationRunCancellationRequested\": \"Project verification cancellation requested\",\n \"event.verificationRunCancellationRequestedDetail\": \"Run {ordinal} is stopping safely\",\n \"event.verificationFailureRecorded\": \"Project verification blocked delivery\",\n \"event.verificationFailureRecordedDetail\": \"Measured reason: {reason}\",\n \"event.verificationCorrectionStarted\": \"Project check correction started\",\n \"event.verificationCorrectionStartedDetail\": \"Correction {ordinal} returned to implementation\",\n \"event.verificationCorrectionPassed\": \"Project check correction passed\",\n \"event.verificationCorrectionPassedDetail\": \"Correction {ordinal} passed its fresh rerun\",\n \"event.verificationCorrectionSuperseded\": \"Project check correction superseded\",\n \"event.verificationCorrectionSupersededDetail\": \"Correction {ordinal} still failed measured checks\",\n \"event.verificationCorrectionExhausted\": \"Project check correction needs a decision\",\n \"event.verificationCorrectionExhaustedDetail\": \"Correction {ordinal} reached the automatic limit\",\n \"event.verificationCorrectionCancelled\": \"Project check correction cancelled\",\n \"event.verificationCorrectionCancelledDetail\": \"Correction {ordinal} stopped without acceptance\",\n \"verification.failure.REQUIRED_CHECK_FAILED\": \"required check failed\",\n \"verification.failure.REQUIRED_CHECK_ERROR\": \"required check error\",\n \"verification.failure.RUN_INTERRUPTED\": \"run interrupted\",\n \"verification.failure.STALE\": \"evidence became stale\",\n \"event.readinessAssessed\": \"Project readiness checked\",\n \"event.readinessAssessedDetail\": \"{count} item(s) need action\",\n \"event.readinessAttested\": \"Readiness decision recorded\",\n \"event.readinessAttestedDetail\": \"{check}: {outcome}\",\n \"event.pipelineStarted\": \"Workflow started\",\n \"event.pipelineStartedDetail\": \"Delivery workflow entered {stage}.\",\n \"event.stageChanged\": \"Stage updated\",\n \"event.stageChangedDetail\": \"{stage}: {status}\",\n \"event.humanRequestOpened\": \"Decision requested\",\n \"event.humanRequestOpenedDetail\": \"{title}\",\n \"event.humanRequestResolved\": \"Decision recorded\",\n \"event.humanRequestResolvedDetail\": \"The owner's answer was recorded durably.\",\n \"event.usageRecorded\": \"Usage recorded\",\n \"event.usageRecordedDetail\": \"+{amount} estimated tokens · {total} total\",\n \"event.budgetThreshold\": \"Budget threshold reached\",\n \"event.budgetThresholdDetail\": \"{threshold}% · {total} estimated tokens\",\n \"event.pipelinePaused\": \"Workflow paused\",\n \"event.pipelinePausedDetail\": \"{kind} pause at {stage}\",\n \"event.pipelineResumed\": \"Workflow resumed\",\n \"event.pipelineResumedDetail\": \"Resumed {stage}\",\n \"event.pipelineCancelled\": \"Workflow cancelled\",\n \"event.pipelineCancelledDetail\": \"Execution stopped at {stage}\",\n \"event.budgetOverride\": \"Budget override approved\",\n \"event.budgetOverrideDetail\": \"Revision {revision} · {limit} estimated tokens\",\n \"event.recoveryCreated\": \"Workflow recovered\",\n \"event.recoveryCreatedDetail\": \"The orphaned {stage} attempt was marked interrupted.\",\n \"event.evidenceRecorded\": \"Evidence recorded\",\n \"event.evidenceRecordedDetail\": \"{title}\",\n \"event.reviewReportRecorded\": \"Independent review recorded\",\n \"event.reviewReportRecordedDetail\": \"Round {round} · {verdict}\",\n \"event.reviewFindingRecorded\": \"Review finding opened\",\n \"event.reviewFindingResolved\": \"Review finding resolved\",\n \"event.reviewLoopExhausted\": \"Review loop needs a decision\",\n \"event.reviewLoopExhaustedDetail\": \"Round {round} reached the automatic limit\",\n \"event.acceptanceRequested\": \"Owner acceptance requested\",\n \"event.acceptanceRequestedDetail\": \"Review and QA evidence are ready for a final decision.\",\n \"event.acceptanceResolved\": \"Acceptance resolved\",\n \"event.acceptanceResolvedDetail\": \"Owner action: {action}\",\n \"event.pipelineCompleted\": \"Workflow completed\",\n \"event.pipelineCompletedDetail\": \"The bounded delivery workflow finished.\",\n \"event.squadAssigned\": \"Agent squad assigned\",\n \"event.squadAssignedDetail\": \"{count} workflow roles pinned to exact profiles\",\n \"event.agentRunStarted\": \"Agent run started\",\n \"event.agentRunStartedDetail\": \"{role} · {provider}\",\n \"event.agentRunFinished\": \"Agent run finished\",\n \"event.agentRunFinishedDetail\": \"{role} · {status}\",\n \"event.qaRunReserved\": \"Browser QA reserved\",\n \"event.qaRunReservedDetail\": \"Playwright · {targets} targets · {scenarios} scenarios\",\n \"event.qaRunCompleted\": \"Browser QA completed\",\n \"event.qaRunCompletedDetail\": \"{status} · {defects} defects\",\n \"event.qaDefectWaived\": \"QA defect risk accepted\",\n \"event.qaCorrectionStarted\": \"QA correction started\",\n \"event.qaCorrectionStartedDetail\": \"Correction {ordinal} · {cells} retest cells\",\n \"event.qaCorrectionExhausted\": \"QA correction limit reached\",\n \"event.qaCorrectionExhaustedDetail\": \"Correction {ordinal} needs an owner decision\",\n \"event.qaCorrectionPassed\": \"QA correction passed\",\n \"event.qaCorrectionPassedDetail\": \"Correction {ordinal} resolved {defects} defects\",\n \"event.qaCorrectionCancelled\": \"QA correction cancelled\",\n \"event.qaCorrectionCancelledDetail\": \"Correction {ordinal} stopped without acceptance\",\n \"agentRun.status.RUNNING\": \"Running\",\n \"agentRun.status.SUCCEEDED\": \"Succeeded\",\n \"agentRun.status.FAILED\": \"Failed\",\n \"agentRun.status.CANCELLED\": \"Cancelled\",\n \"agentRun.status.INTERRUPTED\": \"Interrupted\",\n \"agentRun.status.WAITING_HUMAN\": \"Waiting for owner\",\n \"agentRun.status.SOFT_PAUSED\": \"Soft paused\",\n \"agentRun.status.HARD_PAUSED\": \"Hard paused\",\n \"event.providerSessionStarted\": \"Agent session started\",\n \"event.providerSessionStartedDetail\": \"Session {ordinal}\",\n \"event.checkpointPublished\": \"Checkpoint published\",\n \"event.checkpointPublishedDetail\": \"{summary}\",\n \"event.contextHandoffRequested\": \"Handoff requested\",\n \"event.contextHandoffRequestedDetail\": \"Session {ordinal} is wrapping up\",\n \"event.providerSessionEnded\": \"Agent session ended\",\n \"event.providerSessionEndedDetail\": \"{reason}\",\n \"event.contextFloorExceeded\": \"Required context did not fit\",\n \"event.contextFloorExceededDetail\": \"Session {ordinal} needed {requiredBytes} bytes of {budgetBytes}\",\n \"event.workspaceCreated\": \"Workspace created\",\n \"event.workspaceCreatedDetail\": \"{mode} · branch {branch} · carried files: {count}\",\n \"event.workspaceStrategyChanged\": \"Working directory mode changed\",\n \"event.workspaceStrategyChangedDetail\": \"New workspaces use {mode}\",\n \"event.workspaceOrphaned\": \"Workspace orphaned\",\n \"event.workspaceOrphanedDetail\": \"The worktree is gone or prunable\",\n \"workspaceTool.operation.LIST_DIRECTORY\": \"List directory\",\n \"workspaceTool.operation.READ_FILE\": \"Read file\",\n \"workspaceTool.operation.WRITE_FILE\": \"Write file\",\n \"workspaceTool.operation.EDIT_FILE\": \"Edit file\",\n \"workspaceTool.operation.DELETE_FILE\": \"Delete file\",\n \"workspaceTool.operation.RUN_RECIPE\": \"Run approved check\",\n \"workspaceTool.status.STARTED\": \"In progress\",\n \"workspaceTool.status.SUCCEEDED\": \"Succeeded\",\n \"workspaceTool.status.DENIED\": \"Blocked by safety policy\",\n \"workspaceTool.status.APPROVAL_REQUIRED\": \"Approval or permission required\",\n \"workspaceTool.status.FAILED\": \"Failed\",\n \"workspaceTool.status.UNKNOWN_OUTCOME\": \"Outcome unknown after restart\",\n \"runActivity.title\": \"Run Activity\",\n \"runActivity.explainer\":\n \"Verified by Loomrail actions passed through the daemon's own gateway and are recorded permanently. Provider-reported actions are the provider's own account of itself: unverified, and kept only for a while.\",\n \"runActivity.origin.DAEMON_AUDITED\": \"Verified by Loomrail\",\n \"runActivity.origin.PROVIDER_REPORTED\": \"As reported by the provider\",\n \"runActivity.kind.TOOL_CALL\": \"Tool call\",\n \"runActivity.kind.AGENT_TEXT\": \"Agent note\",\n \"runActivity.kind.FILE_CHANGE\": \"File change\",\n \"runActivity.kind.PROVIDER_ERROR\": \"Provider error\",\n \"runActivity.count\": \"{count}\",\n \"runActivity.countMore\": \"{count}+\",\n \"runActivity.loading\": \"Loading run activity…\",\n \"runActivity.noActivity\": \"No run activity recorded yet.\",\n \"runActivity.latestApproximate\": \"more recent activity may exist\",\n \"runActivity.untitled\": \"Action\",\n \"runActivity.truncated\": \"Truncated\",\n \"runActivity.degradedBadge\": \"Incomplete\",\n // Names the consequence only, never a mechanism or a run -- the same correction Ruling S13 made\n // to `runActivity.gap`, applied to its twin. `degraded` ORs three unrelated facts: the stored\n // recorder flag, aggregated across EVERY run of this task; a run whose stage would not resolve;\n // and audited rows for a run with no live provider. Only the first is a recorder write failure,\n // none of them is scoped to one run, and the feed itself is the task's, not a run's -- so \"a\n // recorder could not write during this run\" was false on two counts at once.\n \"runActivity.degraded\": \"This feed is incomplete: some of what happened on this task did not reach it.\",\n \"runActivity.gap\":\n \"This list may be incomplete: Loomrail cannot confirm that every recorded entry for this task is shown here.\",\n \"runActivity.omitted\": \"{count} earlier entries were dropped because storage is limited.\",\n \"runActivity.loadMore\": \"Show more\",\n \"field.title\": \"title\",\n \"field.description\": \"description\",\n \"field.priority\": \"priority\",\n \"field.risk\": \"risk\",\n \"field.acceptanceCriteria\": \"acceptance criteria\",\n} as const;\n\nconst ru = {\n \"workflow.coordinator.enable\": \"Координатор без доступа к коду (экспериментальный)\",\n \"workflow.coordinator.description\":\n \"Astra планирует без кода и инструментов; Luna / Sonnet работают с репозиторием. Независимые Review, QA и ваше принятие обязательны. Нужен совместимый Codex CLI с входом; подмены модели нет. Fable пока не проверен. Экономия ещё не измерена.\",\n \"workflow.coordinator.outcome\": \"Продуктовая цель для координатора\",\n \"workflow.coordinator.outcomeDescription\":\n \"Кратко опишите результат без кода, путей и секретов. Astra получает только этот текст и ограниченные сведения о ходе работы. Исходная задача и подробные отчёты остаются у исполнителей. Лимит планирования Astra — 12 000 токенов с учётом после сессии.\",\n \"workflow.coordinator.invalid\": \"Отдельная продуктовая цель должна содержать от 10 до 2000 символов.\",\n \"settings.open\": \"Открыть настройки\",\n \"settings.title\": \"Настройки\",\n \"settings.description\":\n \"Оформление хранится в браузере. Настройки выполнения проекта Loomrail сохраняет локально.\",\n \"settings.appearance\": \"Внешний вид\",\n \"settings.density\": \"Плотность доски\",\n \"settings.density.description\": \"Компактный режим уменьшает отступы внутри карточек и между ними.\",\n \"settings.density.comfortable\": \"Обычная\",\n \"settings.density.compact\": \"Компактная\",\n \"layout.resize.sidebar\": \"Изменить ширину сайдбара\",\n \"layout.resize.inspector\": \"Изменить ширину инспектора\",\n \"settings.layout\": \"Расположение\",\n \"settings.layout.description\": \"Потяните край панели или подвиньте его стрелками на клавиатуре.\",\n \"settings.layout.reset\": \"Сбросить ширину панелей\",\n \"settings.projects\": \"Проекты\",\n \"settings.projects.register.label\": \"Подключить локальный репозиторий\",\n \"settings.projects.register.description\":\n \"Абсолютный путь к Git-репозиторию на этой машине. Имя каталога станет именем проекта.\",\n \"settings.projects.register.placeholder\": \"/absolute/path/to/your-repository\",\n \"settings.projects.register.action\": \"Подключить репозиторий\",\n \"settings.projects.create.title\": \"Создать новый проект\",\n \"settings.projects.create.description\":\n \"Создайте новый локальный Git-репозиторий из проверенного TypeScript baseline Loomrail.\",\n \"settings.projects.create.recipe\": \"TypeScript + Node · встроен\",\n \"settings.projects.create.path\": \"Путь нового проекта\",\n \"settings.projects.create.pathDescription\":\n \"Укажите абсолютный путь с существующим родительским каталогом. Финальный каталог ещё не должен существовать; в имени допустимы строчные латинские буквы, цифры, точки, дефисы и подчёркивания.\",\n \"settings.projects.create.placeholder\": \"/absolute/path/to/new-project\",\n \"settings.projects.create.boundary\":\n \"Это только предпросмотр: каталог не создаётся, шаблон не скачивается, команды не запускаются.\",\n \"settings.projects.create.review\": \"Проверить точные файлы\",\n \"settings.projects.create.target\": \"Каталог\",\n \"settings.projects.create.version\": \"Recipe\",\n \"settings.projects.create.files\": \"Будут созданы\",\n \"settings.projects.create.bytes\": \"{count} Б\",\n \"settings.projects.create.marker\": \"marker восстановления\",\n \"settings.projects.create.digest\": \"Digest предложения\",\n \"settings.projects.create.confirmation\":\n \"Loomrail создаст только перечисленные файлы и инициализирует Git. Dependencies не устанавливаются, код проекта не запускается, commit, remote и push не создаются.\",\n \"settings.projects.create.confirm\": \"Создать этот проект\",\n \"settings.projects.create.completed\": \"Проект создан\",\n \"settings.projects.create.next\": \"Когда будете готовы, выполните сами:\",\n \"settings.projects.create.openTerminal\": \"Откройте терминал в каталоге\",\n \"settings.projects.create.failed\": \"Создание безопасно остановлено\",\n \"settings.projects.create.failedDescription\":\n \"{code}. Loomrail не перезаписал и не удалил существующие файлы. Устраните локальный конфликт и повторите ту же операцию.\",\n \"settings.projects.create.pending\": \"Создание будет безопасно продолжено\",\n \"settings.projects.create.pendingDescription\":\n \"Loomrail записал операцию до изменения файловой системы. Перезапустите приложение для сверки или дождитесь завершения текущей попытки.\",\n \"settings.projects.create.retry\": \"Повторить безопасно\",\n \"settings.projects.create.another\": \"Создать ещё проект\",\n \"settings.projects.repositoryLabel\": \"Репозиторий\",\n \"settings.projects.unusable\":\n \"Сейчас по этому пути нет Git-репозитория, поэтому любая стадия, изменяющая файлы, здесь отклоняется.\",\n \"settings.projects.repair\": \"Починить demo-репозиторий\",\n \"settings.provider.title\": \"ИИ-провайдер\",\n \"settings.provider.description\":\n \"Выберите локальный агент для новых сессий. Loomrail использует существующий вход CLI по подписке и не требует API-ключ.\",\n \"settings.provider.label\": \"Провайдер новых сессий\",\n \"settings.provider.option.auto\": \"Авто\",\n \"settings.provider.option.auto.description\": \"Использовать совместимый авторизованный локальный CLI\",\n \"settings.provider.loading\": \"Проверяем локальные CLI агентов…\",\n \"settings.provider.effective\": \"Новые сессии запускает {provider}.\",\n \"settings.provider.fallback\":\n \"Нет готового совместимого локального агента. Установите или обновите Codex CLI либо Claude Code CLI и войдите через этот CLI.\",\n \"settings.provider.compatibility\": \"Готовность локальных агентов\",\n \"settings.provider.status.ready\": \"Готов\",\n \"settings.provider.status.notInstalled\": \"Не установлен\",\n \"settings.provider.status.tooOld\": \"Слишком старая версия для managed runs\",\n \"settings.provider.status.unverified\": \"Версия не проверена\",\n \"settings.provider.status.versionUnreadable\": \"Версию не удалось проверить\",\n \"settings.provider.status.authRequired\": \"Войдите через этот CLI\",\n \"settings.provider.status.noHardTokenBudget\": \"Расход сверяется после сессии\",\n \"settings.provider.status.unknown\": \"Не удалось проверить\",\n \"settings.provider.selectedUnavailable\":\n \"Этот провайдер не готов к запрошенной стадии. Сессия не запустится.\",\n \"settings.provider.refresh\": \"Проверить снова\",\n \"settings.provider.override\":\n \"Сейчас LOOMRAIL_PROVIDER принудительно выбирает {provider}. Перезапустите без override, чтобы менять выбор здесь.\",\n \"settings.provider.overrideInvalid\":\n \"В LOOMRAIL_PROVIDER указано неизвестное значение. До исправления и перезапуска dispatch провайдера заблокирован.\",\n \"settings.workspaceStrategy.title\": \"Рабочая папка\",\n \"settings.workspaceStrategy.description\": \"Выберите, где агенты читают и изменяют файлы этого проекта.\",\n \"settings.workspaceStrategy.label\": \"Рабочая область агентов\",\n \"settings.workspaceStrategy.isolated\": \"Отдельный worktree — рекомендуется\",\n \"settings.workspaceStrategy.isolatedDescription\":\n \"Каждая задача получает отдельный checkout. Текущая папка проекта остаётся нетронутой.\",\n \"settings.workspaceStrategy.shared\": \"Эта папка проекта\",\n \"settings.workspaceStrategy.sharedDescription\": \"Агенты работают прямо в {path}.\",\n \"settings.workspaceStrategy.scope\":\n \"Существующие рабочие области задач не перемещаются. Выбор применяется, когда Loomrail создаст следующую рабочую область.\",\n \"settings.workspaceStrategy.loading\": \"Загружаем настройку рабочей папки…\",\n \"settings.workspaceStrategy.confirmTitle\": \"Перед работой Loomrail в этой папке\",\n \"settings.workspaceStrategy.confirmDescription\":\n \"Новая работа агентов будет идти прямо в {path}, рядом с вашими изменениями.\",\n \"settings.workspaceStrategy.confirmFiles\":\n \"Агенты смогут читать отслеживаемые и неотслеживаемые файлы репозитория, включая локальные файлы.\",\n \"settings.workspaceStrategy.confirmExternalTools\":\n \"Loomrail не может заблокировать ваш редактор, терминал или другие инструменты, которые меняют ту же папку.\",\n \"settings.workspaceStrategy.confirmSerial\":\n \"Loomrail допускает в этом проекте только одного своего автора или один verification run одновременно.\",\n \"settings.workspaceStrategy.acknowledge\": \"Я понимаю риск общей папки\",\n \"settings.workspaceStrategy.confirm\": \"Работать в папке проекта\",\n \"providerAllowance.provider\": \"Провайдер\",\n \"providerAllowance.title\": \"{provider} · Лимит провайдера\",\n \"providerAllowance.surface.command-center\": \"Лимит провайдера {provider} в Command Center\",\n \"providerAllowance.surface.task-cockpit\": \"Лимит провайдера {provider} в Task Cockpit\",\n \"providerAllowance.freshness.live\": \"Актуально\",\n \"providerAllowance.freshness.stale\": \"Устарело\",\n \"providerAllowance.freshness.unavailable\": \"Недоступно\",\n \"providerAllowance.refresh\": \"Проверить снова\",\n \"providerAllowance.loading\": \"Загружаем лимит провайдера\",\n \"providerAllowance.remaining\": \"{percent}% осталось\",\n \"providerAllowance.window.minutes\": \"окно {count} мин\",\n \"providerAllowance.window.hours\": \"окно {count} ч\",\n \"providerAllowance.window.days\": \"окно {count} дн.\",\n \"providerAllowance.window.weeks\": \"окно {count} нед.\",\n \"providerAllowance.resets\": \"Сброс {time}\",\n \"providerAllowance.details\": \"Детали использования\",\n \"providerAllowance.used\": \"{percent}% использовано\",\n \"providerAllowance.observed\": \"Получено {time}\",\n \"providerAllowance.bucket.PRIMARY\": \"Основное окно\",\n \"providerAllowance.bucket.SECONDARY\": \"Дополнительное окно\",\n \"providerAllowance.bucket.FIVE_HOUR\": \"Пятичасовое окно\",\n \"providerAllowance.bucket.SEVEN_DAY\": \"Семидневное окно\",\n \"providerAllowance.bucket.SPEND_LIMIT\": \"Лимит расходов\",\n \"providerAllowance.unavailable.unsupported\": \"Этот провайдер не передаёт данные о лимите.\",\n \"providerAllowance.unavailable.unverified\": \"Лимит скрыт, пока эта точная версия провайдера не проверена.\",\n \"providerAllowance.unavailable.notAuthenticated\":\n \"Войдите через локальный CLI провайдера до проверки лимита.\",\n \"providerAllowance.unavailable.noData\": \"Данные о лимите ещё не получены.\",\n \"providerAllowance.unavailable.schemaDrift\": \"Ответ провайдера изменился и был безопасно отклонён.\",\n \"providerAllowance.unavailable.timeout\": \"Провайдер не ответил за отведённое время.\",\n \"providerAllowance.unavailable.provider\": \"Провайдер недоступен на этом компьютере.\",\n \"providerAllowance.unavailable.read\": \"Не удалось прочитать лимит провайдера.\",\n \"providerAllowance.advisory.available\":\n \"Для новой работы есть ёмкость. Уже запущенная работа не затрагивается.\",\n \"providerAllowance.advisory.low\":\n \"Осталось мало. Новую работу лучше начать после {time}; текущая работа не останавливается.\",\n \"providerAllowance.advisory.lowWithoutReset\":\n \"Осталось мало. Проверьте снова перед запуском новой работы; текущая работа не останавливается.\",\n \"providerAllowance.advisory.reached\":\n \"Лимит провайдера исчерпан. Продолжить лучше после {time}; Loomrail не возобновит работу автоматически.\",\n \"providerAllowance.advisory.reachedWithoutReset\":\n \"Лимит провайдера исчерпан. Проверьте снова перед продолжением; Loomrail не возобновит работу автоматически.\",\n \"providerAllowance.advisory.unknown\": \"Рекомендации по запуску нет. Жёсткий бюджет Loomrail не изменён.\",\n \"providerAllowance.error\": \"Проверка лимита не удалась. Попробуйте снова.\",\n \"providerAllowance.errorWithSnapshot\": \"Новая проверка не удалась. Последние данные сохранены на экране.\",\n \"settings.mcp.title\": \"MCP-подключения\",\n \"settings.mcp.description\":\n \"Подключайте локальный stdio server к новым агентским сессиям через закрытый allowlist Loomrail.\",\n \"settings.mcp.loading\": \"Загружаем MCP-подключения…\",\n \"settings.mcp.empty\": \"Для этого проекта ещё нет подтверждённых MCP-подключений.\",\n \"settings.mcp.context7.title\": \"Документация Context7\",\n \"settings.mcp.context7.description\":\n \"Поставляется вместе с Loomrail. Не нужны команды в терминале, глобальная установка или загрузка через npx.\",\n \"settings.mcp.context7.privacy\":\n \"Запросы документации уходят с этого компьютера в Context7. Не включайте secrets, персональные данные или закрытый код.\",\n \"settings.mcp.context7.review\": \"Проверить встроенный Context7\",\n \"settings.mcp.context7.update\": \"Сверить встроенный Context7 с подтверждённым\",\n \"settings.mcp.context7.configured\": \"Настроен ниже\",\n \"settings.mcp.context7.current\": \"Подтверждённая ревизия уже совпадает со встроенным сервером.\",\n \"settings.mcp.add\": \"Добавить локальное подключение\",\n \"settings.mcp.newRevision\": \"Проверить новую ревизию подключения\",\n \"settings.mcp.cancelRevision\": \"Добавить другое подключение\",\n \"settings.mcp.name\": \"Название подключения\",\n \"settings.mcp.executable\": \"Исполняемый файл\",\n \"settings.mcp.executableDescription\":\n \"Абсолютный путь к существующему локальному executable. Package launchers и shell-команды запрещены.\",\n \"settings.mcp.args\": \"Аргументы\",\n \"settings.mcp.argsDescription\":\n \"По одному точному элементу argv на строку. Без shell parsing и env-переменных.\",\n \"settings.mcp.declaredTools\": \"Заявленные read-only tools\",\n \"settings.mcp.toolsDescription\":\n \"По одному точному имени MCP tool на строку. Обнаружение не выдаёт доступ автоматически.\",\n \"settings.mcp.review\": \"Проверить точную команду\",\n \"settings.mcp.consent.title\": \"Будет запущен локальный процесс с правами вашей учётной записи\",\n \"settings.mcp.consent.description\":\n \"Проверьте каждый путь и аргумент. Подтверждение разрешает ограниченный capability probe; tools останутся заблокированы до отдельного разрешения.\",\n \"settings.mcp.consent.expires\": \"Одноразовое подтверждение истекает в {time}.\",\n \"settings.mcp.consent.checkbox\": \"Я проверил этот executable и каждый аргумент\",\n \"settings.mcp.consent.checkboxDescription\":\n \"Я понимаю, что сам процесс может читать и менять всё, к чему есть доступ у моей локальной учётной записи.\",\n \"settings.mcp.consent.confirm\": \"Подтвердить точную команду\",\n \"settings.mcp.revision\": \"Ревизия {revision}\",\n \"settings.mcp.capability\": \"Последний capability probe\",\n \"settings.mcp.probe.notRun\": \"Не запускался\",\n \"settings.mcp.probe.run\": \"Проверить capabilities\",\n \"settings.mcp.probe.again\": \"Повторить MCP probe\",\n \"settings.mcp.probe.ready\": \"Готов\",\n \"settings.mcp.probe.spawnFailed\": \"Процесс не запустился\",\n \"settings.mcp.probe.timedOut\": \"Истекло время ожидания\",\n \"settings.mcp.probe.invalid\": \"Некорректный MCP-ответ\",\n \"settings.mcp.probe.outputLimit\": \"Превышен лимит вывода\",\n \"settings.mcp.probe.unsupported\": \"Протокол не поддерживается\",\n \"settings.mcp.probe.exited\": \"Процесс завершился раньше времени\",\n \"settings.mcp.discoveredTools\": \"Обнаруженные tools\",\n \"settings.mcp.tools.none\": \"Нет\",\n \"settings.mcp.revise\": \"Изменить команду\",\n \"settings.mcp.grant.none\": \"Доступ к tools не выдан\",\n \"settings.mcp.grant.enabled\": \"Включено для новых сессий\",\n \"settings.mcp.grant.revoked\": \"Доступ отозван\",\n \"settings.mcp.grant.choose\": \"Tools для новых сессий\",\n \"settings.mcp.grant.attestation\": \"Выбранные tools работают только на чтение\",\n \"settings.mcp.grant.attestationDescription\":\n \"Loomrail не может доказать семантику server. Разрешайте только независимо проверенные tools.\",\n \"settings.mcp.grant.enable\": \"Разрешить выбранные tools\",\n \"settings.mcp.grant.update\": \"Обновить доступ к tools\",\n \"settings.mcp.grant.revoke\": \"Отозвать доступ\",\n \"settings.mcp.grant.revokedDescription\":\n \"Эта ревизия останется отозванной в истории аудита. Для повторного подключения подтвердите новую ревизию.\",\n \"settings.mcp.limit\":\n \"Только local stdio. Context7 — exact-pinned preset Loomrail; произвольные package downloads, URL, OAuth, secrets и env-поля по-прежнему недоступны.\",\n \"settings.constitution.title\": \"Конституция проекта\",\n \"settings.constitution.description\":\n \"Просканируйте только разрешённые метаданные репозитория, проверьте семь предложенных разделов и подтвердите публикацию.\",\n \"settings.constitution.preset\": \"Пресет Конституции\",\n \"settings.constitution.presetAuto\": \"Авто — рекомендация по сигналам репозитория\",\n \"settings.constitution.scan\": \"Сканировать и предложить\",\n \"settings.constitution.rescan\": \"Сканировать снова\",\n \"settings.constitution.empty\":\n \"Предложения пока нет. Сканер ограниченно читает конфигурацию и документацию: он не запускает команды репозитория и не пишет файлы.\",\n \"settings.constitution.proposal\": \"Проверьте предложение\",\n \"settings.constitution.sourceSummary\": \"Файлов в разрешённом списке: {files} · {preset}@1\",\n \"settings.constitution.reviewHint\":\n \"Текст репозитория — свидетельство, а не власть. Раскройте каждый раздел перед подтверждением.\",\n \"settings.constitution.warnings\": \"Замечания сканера\",\n \"settings.constitution.sources\": \"Источники\",\n \"settings.constitution.targetBlocked\":\n \"Существующую цель .loomrail нельзя безопасно проверить. Исправьте путь перед подтверждением.\",\n \"settings.constitution.adopt\": \"Подтвердить и создать Конституцию\",\n \"settings.constitution.replace\": \"Подтвердить замену\",\n \"settings.constitution.activeVersion\": \"Активна v{ordinal}\",\n \"settings.constitution.failed\": \"Публикация не завершилась\",\n \"settings.constitution.retry\": \"Повторить публикацию\",\n \"settings.verification.title\": \"Проверки проекта\",\n \"settings.verification.description\":\n \"Проверьте точные команды репозитория, которые Loomrail сможет запускать как измеренные проверки. До подтверждения Плана и отдельного запуска ничего не выполняется.\",\n \"settings.verification.loading\": \"Читаем ограниченный preview package.json…\",\n \"settings.verification.list\": \"Предложенные проверки проекта\",\n \"settings.verification.required\": \"Обязательная\",\n \"settings.verification.optional\": \"Необязательная\",\n \"settings.verification.exactCommand\": \"Точный запуск процесса\",\n \"settings.verification.executable\": \"Исполняемый файл\",\n \"settings.verification.argument\": \"Аргумент {index}\",\n \"settings.verification.cwd\": \"Рабочая папка\",\n \"settings.verification.projectRoot\": \"Корень проекта\",\n \"settings.verification.timeout\": \"Тайм-аут\",\n \"settings.verification.minutes\": \"{count} мин\",\n \"settings.verification.seconds\": \"{count} сек\",\n \"settings.verification.output\": \"Лимит вывода\",\n \"settings.verification.kib\": \"{count} КиБ\",\n \"settings.verification.network\": \"Сеть\",\n \"settings.verification.networkHost\": \"Доступна сеть компьютера\",\n \"settings.verification.networkUnavailable\": \"Запуск невозможен: изоляция недоступна\",\n \"settings.verification.environment\": \"Окружение\",\n \"settings.verification.environmentBaseline\": \"Минимальный runtime PATH · отдельные home и cache\",\n \"settings.verification.localExecutionTitle\": \"Запускается от имени вашего локального пользователя\",\n \"settings.verification.localExecutionNotice\":\n \"Worktree не является защитной песочницей. Перед подтверждением проверьте каждую команду и её доступ к сети; секреты владельца и провайдера не наследуются.\",\n \"settings.verification.source\": \"Скрипт package.json «{script}»\",\n \"settings.verification.sourceNotice\": \"Показан как недоверенный исходный текст. Сканер его не выполнял.\",\n \"settings.verification.empty\":\n \"Поддерживаемых root-скриптов не найдено. Loomrail не создал План и не может запустить проверку проекта.\",\n \"settings.verification.warnings\": \"Замечания сканера\",\n \"settings.verification.targetBlocked\":\n \"Разрешите конфликт существующей цели .loomrail перед подтверждением.\",\n \"settings.verification.adoptionNotice\":\n \"Подтверждение запишет весь этот набор команд новой неизменяемой ревизией и опубликует только marker-файл Loomrail.\",\n \"settings.verification.enableNotice\":\n \"Проверьте актуальный скан перед повторным включением проверок проекта.\",\n \"settings.verification.adopt\": \"Подтвердить обязательных проверок: {count}\",\n \"settings.verification.enable\": \"Включить План · обязательных проверок: {count}\",\n \"settings.verification.replace\": \"Подтвердить замену · обязательных проверок: {count}\",\n \"settings.verification.active\": \"Активна ревизия {revision}\",\n \"settings.verification.disabled\": \"Отключена ревизия {revision}\",\n \"settings.verification.publishing\": \"Публикуется ревизия {revision}\",\n \"settings.verification.unpublished\": \"Ревизия {revision} требует внимания\",\n \"settings.verification.published\": \"Опубликовано в .loomrail/verification-plan.json\",\n \"settings.verification.publicationFailed\": \"Файл Плана не опубликован\",\n \"settings.verification.retry\": \"Повторить публикацию\",\n \"settings.verification.disable\": \"Отключить План\",\n \"settings.launch.title\": \"Локальные launch-gates\",\n \"settings.launch.description\":\n \"Измерьте производительность и безопасность на одной подтверждённой владельцем локальной команде сервиса.\",\n \"settings.launch.loading\": \"Загружаем локальные измерения…\",\n \"settings.launch.verificationRequired\":\n \"Сначала подтвердите План проверок проекта с необязательной командой start, dev или preview.\",\n \"settings.launch.planActive\": \"Активна ревизия {revision}\",\n \"settings.launch.planDisabled\": \"Отключена ревизия {revision}\",\n \"settings.launch.localTitle\": \"Только локальное измерение\",\n \"settings.launch.localNotice\":\n \"Loomrail запускает точную проверенную команду от имени локального пользователя. Он не выполняет deploy, не обращается к внешнему сайту и не обещает безопасность production.\",\n \"settings.launch.noService\": \"В активном Плане проверок нет необязательной локальной команды сервиса.\",\n \"settings.launch.serviceRecipe\": \"Команда локального сервиса\",\n \"settings.launch.auditRecipe\": \"Свидетельство аудита зависимостей\",\n \"settings.launch.auditNone\": \"Без аудита — требуется действие владельца\",\n \"settings.launch.origin\": \"Loopback-origin\",\n \"settings.launch.healthPath\": \"Путь health-check\",\n \"settings.launch.probePath\": \"Измеряемая страница\",\n \"settings.launch.privateRoutes\": \"Закрытые пути, по одному в строке\",\n \"settings.launch.samples\": \"Свежих browser samples (3–5)\",\n \"settings.launch.lcp\": \"Лимит LCP, мс\",\n \"settings.launch.inp\": \"Лимит INP, мс\",\n \"settings.launch.cls\": \"Лимит CLS\",\n \"settings.launch.bundle\": \"Лимит JavaScript, байт\",\n \"settings.launch.headers\": \"Обязательные response headers\",\n \"settings.launch.yes\": \"есть\",\n \"settings.launch.no\": \"нет\",\n \"settings.launch.verificationIdentity\": \"План проверок {id} · ревизия {revision}\",\n \"settings.launch.invalid\": \"Проверьте origin, пути, лимиты и обязательные headers перед подтверждением.\",\n \"settings.launch.adopt\": \"Подтвердить launch-gates\",\n \"settings.launch.replace\": \"Подтвердить замену\",\n \"settings.launch.run\": \"Запустить локальное измерение\",\n \"settings.launch.disable\": \"Отключить launch-gates\",\n \"settings.launch.cancel\": \"Отменить измерение\",\n \"settings.launch.cancelling\": \"Отменяется…\",\n \"settings.launch.stopBlocked\": \"Повторить безопасную остановку\",\n \"settings.launch.noRun\": \"Локальные launch-gates ещё не измерялись.\",\n \"settings.launch.results\": \"Результаты локальных launch-gates\",\n \"settings.launch.tree\": \"Tree {tree}\",\n \"settings.launch.errorCode\": \"Состояние измерения: {code}\",\n \"settings.launch.status.RUNNING\": \"Измерение выполняется\",\n \"settings.launch.status.CANCELLING\": \"Измерение отменяется\",\n \"settings.launch.status.BLOCKED\": \"Остановка сервиса не подтверждена — требуется действие\",\n \"settings.launch.status.PASSED\": \"Все launch-gates пройдены\",\n \"settings.launch.status.FAILED\": \"Требуется действие перед запуском\",\n \"settings.launch.status.ERROR\": \"Измерение безопасно остановлено\",\n \"settings.launch.status.INTERRUPTED\": \"Измерение прервано\",\n \"settings.launch.freshness.CURRENT\": \"Актуальное свидетельство\",\n \"settings.launch.freshness.STALE\": \"Устаревшее свидетельство\",\n \"settings.launch.gateStatus.PASSED\": \"Пройдено\",\n \"settings.launch.gateStatus.FAILED\": \"Не пройдено\",\n \"settings.launch.gateStatus.ACTION_REQUIRED\": \"Требуется действие\",\n \"settings.launch.gateStatus.ERROR\": \"Ошибка\",\n \"settings.launch.gate.PERF_WEB_VITALS\": \"Web Vitals\",\n \"settings.launch.gate.PERF_BUNDLE_BUDGET\": \"Бюджет JavaScript\",\n \"settings.launch.gate.SEC_RESPONSE_HEADERS\": \"Response headers\",\n \"settings.launch.gate.SEC_UNAUTHENTICATED_ROUTES\": \"Закрытые маршруты без учётных данных\",\n \"settings.launch.gate.SEC_CLIENT_BUNDLE_SECRETS\": \"Поиск секретов в client bundle\",\n \"settings.launch.gate.DEPS_AUDIT\": \"Аудит зависимостей\",\n \"settings.launch.evidence.vitals\": \"Медиана LCP {lcp} мс · INP {inp} мс · CLS {cls}\",\n \"settings.launch.evidence.bundle\": \"Медиана {measured} Б · бюджет {budget} Б\",\n \"settings.launch.evidence.secrets\": \"Проверено {bytes} Б · находок {count}\",\n \"settings.launch.evidence.auditMissing\": \"Нет актуального аудита для текущего tree\",\n \"settings.launch.evidence.audit\": \"Аудит текущего tree: {status}\",\n \"settings.release.title\": \"Свидетельства релиза\",\n \"settings.release.description\":\n \"Зафиксируйте точные launch-свидетельства для одной публичной среды и выбранных задач.\",\n \"settings.release.loading\": \"Загружаем свидетельства релиза…\",\n \"settings.release.boundaryTitle\": \"Свидетельство, а не deploy\",\n \"settings.release.boundaryNotice\":\n \"Loomrail создаёт неизменяемый снимок. Он не обращается к этому origin, не использует hosting credentials, не подтверждает релиз и не выполняет deploy.\",\n \"settings.release.kind\": \"Среда\",\n \"settings.release.kind.PREVIEW\": \"Preview\",\n \"settings.release.kind.PRODUCTION\": \"Production\",\n \"settings.release.name\": \"Название среды\",\n \"settings.release.publicOrigin\": \"Публичный HTTPS-origin\",\n \"settings.release.healthPath\": \"Публичный health-path\",\n \"settings.release.variables\": \"Имена обязательных переменных, по одному в строке — без значений\",\n \"settings.release.invalid\":\n \"Укажите название, точный HTTPS-origin, безопасный путь и переносимые имена переменных.\",\n \"settings.release.save\": \"Сохранить среду\",\n \"settings.release.update\": \"Обновить среду\",\n \"settings.release.scope\": \"Включённые задачи\",\n \"settings.release.scopeNotice\":\n \"Выберите только задачи, чьи Review, QA, проверки проекта и Acceptance должны попасть в этот релиз.\",\n \"settings.release.noWorkItems\": \"В проекте нет доступных задач.\",\n \"settings.release.create\": \"Создать неизменяемый снимок\",\n \"settings.release.export\": \"Скачать пакет свидетельств\",\n \"settings.release.none\": \"Снимок Release ещё не создан.\",\n \"settings.release.results\": \"Снимок release-gates\",\n \"settings.release.current\": \"Актуальный снимок\",\n \"settings.release.stale\": \"Снимок устарел\",\n \"settings.release.passed\": \"Обязательных gates пройдено: {passed} из {required}\",\n \"settings.release.tree\": \"Tree {tree}\",\n \"settings.release.gateStatus.PASSED\": \"Пройдено\",\n \"settings.release.gateStatus.FAILED\": \"Не пройдено\",\n \"settings.release.gateStatus.ACTION_REQUIRED\": \"Требуется действие\",\n \"settings.release.gateStatus.STALE\": \"Устарело\",\n \"settings.deploy.title\": \"Управляемый deploy\",\n \"settings.deploy.description\":\n \"Запустите workflow GitHub Actions из репозитория для подходящего Preview-релиза или повышенного Production-релиза после двух явных подтверждений.\",\n \"settings.deploy.loading\": \"Проверяем точную цель deploy…\",\n \"settings.deploy.boundaryTitle\": \"Только существующий workflow\",\n \"settings.deploy.boundaryNotice\":\n \"Loomrail может запустить только фиксированный workflow, уже сохранённый в репозитории. Он не получает hosting- или SSH-секреты и не делает автоматический retry или rollback.\",\n \"settings.deploy.noRelease\": \"Сначала создайте актуальный снимок Preview или Production Release.\",\n \"settings.deploy.environment\": \"Среда\",\n \"settings.deploy.environment.PREVIEW\": \"Preview\",\n \"settings.deploy.environment.PRODUCTION\": \"Production\",\n \"settings.deploy.environment.LEGACY\": \"Устаревшая цель\",\n \"settings.deploy.repository\": \"Репозиторий GitHub\",\n \"settings.deploy.branch\": \"Опубликованная ветка\",\n \"settings.deploy.commit\": \"Точный commit\",\n \"settings.deploy.workflow\": \"Workflow\",\n \"settings.deploy.planNotice\":\n \"Первое подтверждение: сохраните этот точный репозиторий, ветку, commit и workflow для {environment} как неизменяемый план deploy.\",\n \"settings.deploy.adopt\": \"Подтвердить точный план\",\n \"settings.deploy.adoptAgain\": \"Подготовить ещё одну точную попытку\",\n \"settings.deploy.approvalNotice\":\n \"Второе подтверждение запустит один внешний GitHub Actions run для {environment}. Перед продолжением ещё раз проверьте цель выше.\",\n \"settings.deploy.approve\": \"Подтвердить и запустить один раз\",\n \"settings.deploy.approvedNotice\":\n \"Точная попытка для {environment} подтверждена, но ещё не запущена. Запустите её один раз; Loomrail не создаст замену автоматически.\",\n \"settings.deploy.startApproved\": \"Запустить подтверждённую попытку\",\n \"settings.deploy.observe\": \"Проверить точный run\",\n \"settings.deploy.openRun\": \"Открыть этот run на GitHub\",\n \"settings.deploy.unknownNotice\":\n \"Результат неизвестен, и workflow уже мог запуститься. Не запускайте deploy повторно. Если указан точный GitHub run, проверьте именно его.\",\n \"settings.deploy.failedNotice\":\n \"Попытка не завершилась успешно ({code}). Проверьте точный run и готовьте новый план только после выяснения причины.\",\n \"settings.deploy.rollbackUnavailable\":\n \"Rollback недоступен: workflow этого репозитория не предоставляет проверенное действие отката.\",\n \"settings.deploy.status.PENDING_APPROVAL\": \"Ожидает финального подтверждения\",\n \"settings.deploy.status.APPROVED\": \"Подтверждено, не запущено\",\n \"settings.deploy.status.RUNNING\": \"GitHub run запущен\",\n \"settings.deploy.status.SUCCEEDED\": \"Deploy завершён успешно\",\n \"settings.deploy.status.FAILED\": \"Deploy завершился ошибкой\",\n \"settings.deploy.status.UNKNOWN\": \"Результат неизвестен\",\n \"settings.deploy.block.RELEASE_STALE\":\n \"Свидетельства Release устарели. Повторите затронутые проверки и создайте новый снимок Release.\",\n \"settings.deploy.block.RELEASE_GATES_BLOCKED\":\n \"Не все обязательные проверки релиза пройдены. Устраните причины до подготовки плана deploy.\",\n \"settings.deploy.block.ENVIRONMENT_UNSUPPORTED\":\n \"Эта среда не поддерживается фиксированным контрактом управляемого deploy.\",\n \"settings.deploy.block.REPOSITORY_UNAVAILABLE\":\n \"Репозиторий не читается. Восстановите доступ к папке проекта и повторите проверку.\",\n \"settings.deploy.block.REPOSITORY_PATH_NOT_CANONICAL\":\n \"Зарегистрирована ссылка или подпапка. Укажите точный физический корень репозитория.\",\n \"settings.deploy.block.REPOSITORY_OPERATION_IN_PROGRESS\":\n \"Merge, rebase или другая Git-операция ещё не завершена. Сначала завершите её.\",\n \"settings.deploy.block.SOURCE_DIRTY\":\n \"Текущая папка не совпадает с этим Release. Зафиксируйте нужные изменения и создайте новый снимок Release.\",\n \"settings.deploy.block.DETACHED_HEAD\":\n \"Репозиторий не находится на именованной ветке. Переключитесь на ветку для deploy.\",\n \"settings.deploy.block.REMOTE_INVALID\":\n \"Origin не является GitHub-адресом без credentials. Исправьте origin репозитория.\",\n \"settings.deploy.block.WORKFLOW_MISSING\":\n \"В commit нет фиксированного workflow для этой среды. Добавьте и проверьте его перед продолжением.\",\n \"settings.deploy.block.WORKFLOW_NOT_REGULAR\":\n \"Deploy workflow не является обычным зафиксированным файлом. Замените ссылку или специальную запись проверенным файлом.\",\n \"settings.deploy.block.WORKFLOW_TRIGGER_MISSING\":\n \"В фиксированном workflow нет явного workflow_dispatch trigger. Добавьте и проверьте его перед продолжением.\",\n \"settings.deploy.block.WORKFLOW_TOO_LARGE\":\n \"Deploy workflow нельзя прочитать в пределах безопасного лимита. Уменьшите или исправьте файл.\",\n \"settings.deploy.block.CLI_UNAVAILABLE\":\n \"GitHub CLI недоступен на этом компьютере. Установите его и повторите проверку.\",\n \"settings.deploy.block.AUTH_REQUIRED\":\n \"GitHub CLI не авторизован. Войдите локально через gh; Loomrail не сохранит токен.\",\n \"settings.deploy.block.REMOTE_BRANCH_UNAVAILABLE\":\n \"Текущая ветка недоступна на GitHub. Сначала опубликуйте именованную ветку в origin.\",\n \"settings.deploy.block.REMOTE_COMMIT_MISMATCH\":\n \"Ветка GitHub не указывает на этот точный локальный commit. Опубликуйте commit и заново создайте актуальный Release.\",\n \"settings.deploy.block.PREVIEW_PROMOTION_REQUIRED\":\n \"Production заблокирован, пока эти точные Release-свидетельства не были успешно развёрнуты в Preview. Сначала разверните и проверьте Preview, затем заново создайте снимок Production Release.\",\n \"event.launchEnvironmentChanged\": \"Launch-среда сохранена\",\n \"event.launchEnvironmentChangedDetail\": \"Декларация {kind} · версия {version}\",\n \"event.launchReleaseCreated\": \"Свидетельства релиза зафиксированы\",\n \"event.launchReleaseCreatedDetail\": \"Tree {tree} · обязательных gates {passed} из {required}\",\n \"event.deploymentPlanAdopted\": \"План deploy подтверждён\",\n \"event.deploymentPlanAdoptedDetail\": \"{repository} · {branch} · commit {commit}\",\n \"event.deploymentChanged\": \"Состояние deploy изменилось\",\n \"event.deploymentChangedDetail\": \"{status}\",\n \"verification.title\": \"Проверка проекта\",\n \"verification.loading\": \"Загружаем проверки проекта\",\n \"verification.intro\":\n \"Запустите подтверждённые владельцем команды на текущем worktree. Loomrail запишет длительность, код выхода и ограниченный вывод каждой проверки.\",\n \"verification.required\": \"Обязательная\",\n \"verification.optional\": \"Необязательная\",\n \"verification.status.NOT_RUN\": \"Не запускалась\",\n \"verification.status.QUEUED\": \"В очереди\",\n \"verification.status.RUNNING\": \"Выполняется\",\n \"verification.status.CANCELLING\": \"Отменяется\",\n \"verification.status.PASSED\": \"Пройдена\",\n \"verification.status.FAILED\": \"Не пройдена\",\n \"verification.status.ERROR\": \"Ошибка\",\n \"verification.status.INTERRUPTED\": \"Прервана\",\n \"verification.status.STALE\": \"Устарела\",\n \"verification.runMeta\": \"Запуск {ordinal} · План r{revision} · {platform}\",\n \"verification.evidenceMeta\": \"Пройдено {passed}/{total} · tree {tree}\",\n \"verification.evidenceCounts\":\n \"Пройдено {passed} · не пройдено {failed} · ошибок {errors} · прервано {interrupted} · осталось {remaining} · tree {tree}\",\n \"verification.currentPlan\": \"Текущий активный План · ревизия {revision}\",\n \"verification.group\": \"Проверки {kind}\",\n \"verification.acceptanceBlocker\":\n \"Acceptance заблокирован, пока все обязательные проверки не пройдут для текущего кода и Плана.\",\n \"verification.platform.darwin\": \"macOS\",\n \"verification.platform.linux\": \"Linux\",\n \"verification.platform.win32\": \"Windows\",\n \"verification.duration.ms\": \"{count} мс\",\n \"verification.duration.seconds\": \"{count} с\",\n \"verification.measurement\": \"{duration} · код выхода {exit}\",\n \"verification.outcome.active\":\n \"Проверки выполняются по порядку. Worktree зарезервирован до завершения или отмены запуска.\",\n \"verification.outcome.passed\": \"Все обязательные проверки пройдены для текущего кода и Плана.\",\n \"verification.outcome.failed\":\n \"Этот запуск не является проходящим свидетельством. Откройте вывод, исправьте код и запустите снова.\",\n \"verification.outcome.interrupted\":\n \"Запуск остановился до получения полного свидетельства. Запустите его снова.\",\n \"verification.outcome.stale\": \"Результат больше не актуален: {reasons}. Запустите проверки снова.\",\n \"verification.stale.PLAN_UNAVAILABLE\": \"активный План недоступен\",\n \"verification.stale.PLAN_REPLACED\": \"подтверждённый План изменился\",\n \"verification.stale.PLAN_UNPUBLISHED\": \"текущий План не опубликован\",\n \"verification.stale.TREE_CHANGED\": \"worktree изменился\",\n \"verification.unavailable.plan\": \"Сначала подтвердите и опубликуйте «Проверки проекта» в Настройках.\",\n \"verification.unavailable.pipeline\": \"Сначала запустите workflow задачи.\",\n \"verification.unavailable.workspace\":\n \"Проверки станут доступны после того, как реализация подготовит worktree.\",\n \"verification.run\": \"Запустить проверки\",\n \"verification.runAgain\": \"Запустить снова\",\n \"verification.cancel\": \"Отменить запуск\",\n \"verification.output.view\": \"Показать вывод\",\n \"verification.output.hide\": \"Скрыть вывод\",\n \"verification.output.loading\": \"Загружаем ограниченный вывод…\",\n \"verification.history\": \"Предыдущие запуски ({count})\",\n \"verification.correction.timeline\": \"История коррекций\",\n \"verification.correction.position\": \"Коррекция {position}\",\n \"verification.correction.automatic\": \"Автоматическая\",\n \"verification.correction.ownerAuthorized\": \"Финальная попытка по решению владельца\",\n \"verification.correction.status.ACTIVE\": \"В работе\",\n \"verification.correction.status.PASSED\": \"Пройдена\",\n \"verification.correction.status.SUPERSEDED\": \"Заменена следующей\",\n \"verification.correction.status.EXHAUSTED\": \"Нужно ваше решение\",\n \"verification.correction.status.CANCELLED\": \"Отменена\",\n \"verification.correctionGate.title\": \"Нужно решение по проверке проекта\",\n \"verification.correctionGate.description\":\n \"Коррекция {position} снова завершилась измеренным сбоем. Перед выбором проверьте точный вывод команды.\",\n \"verification.correctionGate.authorizeFinal\": \"Разрешить одну финальную коррекцию\",\n \"verification.correctionGate.cancel\": \"Отменить поставку\",\n \"settings.readiness.title\": \"Готовность к запуску\",\n \"settings.readiness.description\":\n \"Ограниченная локальная проверка безопасности репозитория и явных решений по legal, платежам и аналитике.\",\n \"settings.readiness.run\": \"Проверить готовность\",\n \"settings.readiness.rerun\": \"Проверить снова\",\n \"settings.readiness.empty\":\n \"Проверок пока нет. Loomrail читает только ограниченный набор фактов и не запускает скрипты проекта.\",\n \"settings.readiness.ready\": \"Готов\",\n \"settings.readiness.actionRequired\": \"Нужны действия\",\n \"settings.readiness.checkedAt\": \"Проверено {date}\",\n \"settings.readiness.head\": \"HEAD {head}\",\n \"settings.readiness.noHead\": \"Нет коммита\",\n \"settings.readiness.dirty\": \"Рабочее дерево изменено\",\n \"settings.readiness.clean\": \"Рабочее дерево чистое\",\n \"settings.readiness.limit\":\n \"Это локальный preflight, а не полный аудит безопасности или юридическая консультация. После изменений запустите проверку снова.\",\n \"settings.readiness.category.security\": \"Безопасность\",\n \"settings.readiness.category.legal\": \"Legal\",\n \"settings.readiness.category.payments\": \"Платежи\",\n \"settings.readiness.category.analytics\": \"Аналитика\",\n \"settings.readiness.category.dependencies\": \"Зависимости\",\n \"settings.readiness.category.environment\": \"Окружение\",\n \"settings.readiness.category.operations\": \"Эксплуатация\",\n \"settings.readiness.check.activeConstitution\": \"Конституция подтверждена владельцем\",\n \"settings.readiness.check.secretPaths\": \"Отслеживаемые файлы с секретами\",\n \"settings.readiness.check.envIgnored\": \"Локальные секретные файлы игнорируются\",\n \"settings.readiness.check.ciHardening\": \"Доверие CI и фиксация actions\",\n \"settings.readiness.check.license\": \"Лицензия репозитория\",\n \"settings.readiness.check.legalOwner\": \"Legal и privacy review\",\n \"settings.readiness.check.paymentsOwner\": \"Платежи, налоги и возвраты\",\n \"settings.readiness.check.analyticsOwner\": \"Согласие и хранение данных аналитики\",\n \"settings.readiness.check.lockfile\": \"Воспроизводимый lockfile зависимостей\",\n \"settings.readiness.check.envProdSeparation\": \"env-файлы продакшена и литералы в CI\",\n \"settings.readiness.check.securityHeadersOwner\": \"Решение по security headers\",\n \"settings.readiness.check.healthEndpoint\": \"Health-эндпоинт\",\n \"settings.readiness.check.rollbackPlan\": \"План отката\",\n \"settings.readiness.check.backup\": \"Резервное копирование данных\",\n \"settings.readiness.status.passed\": \"Проверено автоматически\",\n \"settings.readiness.status.action\": \"Требует действия\",\n \"settings.readiness.status.confirmed\": \"Подтверждено владельцем\",\n \"settings.readiness.status.na\": \"Не применимо\",\n \"settings.readiness.evidence\": \"Свидетельства\",\n \"settings.readiness.rationale\": \"Комментарий к решению\",\n \"settings.readiness.rationalePlaceholder\": \"Что проверено или почему это не применимо…\",\n \"settings.readiness.confirm\": \"Подтвердить\",\n \"settings.readiness.notApplicable\": \"Не применимо\",\n \"settings.readiness.finding.activeConstitution\": \"Нет активной Конституции, подтверждённой владельцем.\",\n \"settings.readiness.finding.secretPath\": \"Git отслеживает имя файла, обычно используемое для секретов.\",\n \"settings.readiness.finding.envIgnored\": \"Правило Git ignore отсутствует или его нельзя подтвердить.\",\n \"settings.readiness.finding.pullRequestTarget\":\n \"CI использует pull_request_target; проверьте границу доверия.\",\n \"settings.readiness.finding.writeAll\": \"CI получил права write-all.\",\n \"settings.readiness.finding.actionPinned\": \"GitHub Action не закреплён полным commit SHA.\",\n \"settings.readiness.finding.ciUnverifiable\": \"CI-файл нельзя проверить в безопасных пределах.\",\n \"settings.readiness.finding.license\": \"В корне не найден обычный LICENSE или COPYING.\",\n \"settings.readiness.finding.lockfileMissing\":\n \"У отслеживаемого manifest нет lockfile, установка не воспроизводится.\",\n \"settings.readiness.finding.lockfileAmbiguous\":\n \"Отслеживается больше одного lockfile разных пакетных менеджеров.\",\n \"settings.readiness.finding.dependencyUnverifiable\":\n \"Данные о зависимостях не удалось проверить в безопасных пределах.\",\n \"settings.readiness.finding.prodEnvNotIgnored\":\n \"Файл продакшн-окружения существует и не покрыт правилами ignore.\",\n \"settings.readiness.finding.inlineSecretInCi\":\n \"CI присваивает переменной с секретным именем литеральное значение вместо ссылки на управляемый секрет.\",\n \"language.change\": \"Сменить язык\",\n \"language.english\": \"English\",\n \"language.russian\": \"Русский\",\n \"nav.humanRequests\": \"Запросы человеку\",\n \"nav.attention\": \"Внимание\",\n \"nav.fleet\": \"Агенты\",\n \"nav.workspace\": \"Пространство\",\n \"nav.open\": \"Открыть навигацию\",\n \"nav.yourProjects\": \"Ваши проекты\",\n \"nav.currentWork\": \"Текущая работа\",\n \"nav.insights\": \"Метрики\",\n \"nav.guidedDemo\": \"Пошаговое демо\",\n \"activation.loading\": \"Загружаем пошаговое демо\",\n \"activation.eyebrow\": \"Первый локальный результат\",\n \"activation.title\": \"Пошаговое демо\",\n \"activation.description\":\n \"Создайте настоящую локальную задачу и запустите её через авторизованный Codex или Claude Code CLI с явными execution limits.\",\n \"activation.zeroQuota\":\n \"Только локальный агент — без API-ключа и отдельного API-биллинга. Расход подписки сообщается после CLI-сессии.\",\n \"activation.progress\": \"Прогресс пошагового демо\",\n \"activation.step\": \"Шаг {current} из {total}\",\n \"activation.status.complete\": \"Готово\",\n \"activation.status.current\": \"Сейчас\",\n \"activation.status.upcoming\": \"Впереди\",\n \"activation.phase.workspace\": \"Подготовить демо-проект\",\n \"activation.phase.provider\": \"Выбрать безопасного провайдера\",\n \"activation.phase.task\": \"Создать демо-задачу\",\n \"activation.phase.ready\": \"Разрешить работу\",\n \"activation.phase.run\": \"Запустить процесс\",\n \"activation.phase.request\": \"Human Request и результат провайдера\",\n \"activation.phase.review\": \"Независимое ревью после execution\",\n \"activation.phase.qa\": \"Измеренный Browser QA после execution\",\n \"activation.phase.acceptance\": \"Проверить результат\",\n \"activation.phase.complete\": \"Решение владельца записано\",\n \"activation.copy.workspace\": \"Развернём встроенный репозиторий web-app в локальном хранилище Loomrail.\",\n \"activation.copy.provider\":\n \"Верните проект в режим «Авто», чтобы Loomrail мог использовать совместимый авторизованный Codex или Claude Code CLI. Пока локальный CLI не готов, сессия не запустится.\",\n \"activation.copy.task\":\n \"Создайте точную проверенную тестовую задачу. Повтор этого действия не создаст дубль.\",\n \"activation.copy.ready\": \"Переведите задачу из бэклога в Ready отдельным записанным переходом.\",\n \"activation.copy.run\":\n \"Запустите durable workflow с видимыми лимитами времени, ходов, tools и вывода. Локальный CLI использует существующую подписочную сессию.\",\n \"activation.copy.request\":\n \"Отвечайте на вопросы провайдера во «Внимании». Чтение, правки и разрешённые команды проходят только через audited workspace tools Loomrail.\",\n \"activation.copy.review\":\n \"Независимый ревьюер проверяет реализацию до Browser QA. Его findings остаются привязаны к этой задаче.\",\n \"activation.copy.qa\":\n \"Browser QA измеряет утверждённые сценарии и записывает screenshots и trace до открытия приёмки.\",\n \"activation.copy.acceptance\":\n \"Проверьте измеренные Review- и Browser QA-свидетельства в Task Cockpit, затем выберите Accept, Return или Reject.\",\n \"activation.copy.complete\":\n \"Ваше итоговое решение сохранено. Маршрут завершён; Loomrail не решал судьбу собственного результата.\",\n \"activation.action.workspace\": \"Подготовить демо-проект\",\n \"activation.action.provider\": \"Использовать доступный локальный CLI\",\n \"activation.action.task\": \"Создать демо-задачу\",\n \"activation.action.ready\": \"Перевести задачу в Ready\",\n \"activation.action.run\": \"Запустить демо-процесс\",\n \"activation.action.attention\": \"Ответить во «Внимании»\",\n \"activation.action.cockpit\": \"Открыть Task Cockpit\",\n \"activation.action.acceptance\": \"Проверить и решить\",\n \"activation.providerLocked\":\n \"Активен override LOOMRAIL_PROVIDER. Перезапустите Loomrail без него и снова выполните loomrail try.\",\n \"activation.recipe.title\": \"Что сделает этот запуск\",\n \"activation.recipe.provider\": \"Провайдер\",\n \"activation.provider.real\": \"Codex CLI или Claude Code CLI\",\n \"activation.recipe.model\": \"Уровень модели\",\n \"activation.recipe.budget\": \"Бюджет задачи Loomrail\",\n \"activation.next.title\": \"Что дальше\",\n \"activation.next.local\": \"Продолжить в Task Cockpit\",\n \"activation.next.repository\": \"Подключить репозиторий или провайдера\",\n \"activation.next.guidedAction\": \"Прочитать про Guided Launch\",\n \"activation.next.guided\":\n \"Guided Launch задуман как платная помощь, но в этой сборке ещё нет формы покупки.\",\n \"insights.loading\": \"Загружаем локальные метрики…\",\n \"insights.title\": \"Метрики\",\n \"insights.description\":\n \"Сигналы доставки, качества и надёжности, рассчитанные из локального состояния Loomrail.\",\n \"insights.localOnly\": \"Только локально\",\n \"insights.outcomes.title\": \"Результаты\",\n \"insights.outcomes.description\":\n \"Проценты учитывают только завершённые свидетельства. Отсутствие данных не равно измеренному нулю.\",\n \"insights.rate.acceptance\": \"Принятые завершения\",\n \"insights.rate.firstReview\": \"Review с первого раза\",\n \"insights.rate.qa\": \"Успешная финальная QA\",\n \"insights.noEvidence\": \"Нет данных\",\n \"insights.count.workItems\": \"Принято / всего задач\",\n \"insights.count.activeWork\": \"Активные задачи\",\n \"insights.count.cancelledWork\": \"Отменённые задачи\",\n \"insights.count.pipelines\": \"Успешно / всего конвейеров\",\n \"insights.count.pipelineFailures\": \"Failed, interrupted или cancelled конвейеры\",\n \"insights.count.agentRuns\": \"Успешно / всего запусков агентов\",\n \"insights.count.agentFailures\": \"Failed или interrupted запуски агентов\",\n \"insights.count.reviews\": \"Review reports\",\n \"insights.count.qaRuns\": \"Запуски Browser QA\",\n \"insights.count.qaDefects\": \"Открыто / всего QA-дефектов\",\n \"insights.count.humanRequests\": \"Решено / всего запросов человеку\",\n \"insights.count.tokens\": \"Записано оценочных токенов\",\n \"insights.count.recoveries\": \"Восстановления после restart daemon\",\n \"insights.report.title\": \"Анонимные отчёты\",\n \"insights.report.description\":\n \"Loomrail никогда не отправляет их автоматически. Сначала прочитайте весь JSON; скачивание — одноразовое opt-in действие.\",\n \"insights.report.exclusions\":\n \"Схема исключает код, prompts, ответы провайдеров, logs, имена, пути, IDs, timestamps, artifacts и stack traces.\",\n \"insights.report.aggregate\": \"Агрегированный отчёт\",\n \"insights.report.aggregateDescription\":\n \"Категории продукта и runtime вместе с показанными выше локальными aggregate metrics.\",\n \"insights.report.crash\": \"Отчёт о восстановлении после сбоя\",\n \"insights.report.crashDescription\":\n \"Доступен, потому что durable state доказывает прерывание выполнявшегося workflow при restart daemon.\",\n \"insights.report.noCrash\": \"Crash report недоступен: восстановления после restart daemon не записаны.\",\n \"insights.report.download\": \"Скачать этот JSON\",\n \"insights.report.previewLabel\": \"Точный payload отчёта\",\n \"connection.connecting\": \"Подключение…\",\n \"connection.local\": \"Local daemon\",\n \"connection.offline\": \"Нет подключения\",\n \"connection.recovery.retryTitle\": \"Loomrail временно недоступен\",\n \"connection.recovery.retryDescription\":\n \"Проверьте, что локальный процесс ещё работает. Повторная попытка не затронет сохранённые данные.\",\n \"connection.recovery.reopenTitle\": \"Эта локальная сессия завершилась\",\n \"connection.recovery.reopenDescription\":\n \"При необходимости остановите старый процесс, затем запустите Loomrail заново. Новая авторизованная вкладка откроется автоматически.\",\n \"connection.recovery.command\": \"Выполните в терминале\",\n \"connection.recovery.retryAction\": \"Повторить\",\n \"theme.change\": \"Сменить тему\",\n \"theme.light\": \"Светлая\",\n \"theme.dark\": \"Тёмная\",\n \"theme.system\": \"Системная\",\n \"project.switch\": \"Сменить проект\",\n \"project.loading\": \"Загрузка…\",\n \"project.none\": \"Проектов нет\",\n \"project.noneSingle\": \"Нет проекта\",\n search: \"Поиск\",\n \"task.new\": \"Новая задача\",\n \"task.create.description\":\n \"Сначала создайте задачу. Loomrail предложит конвейер доставки, когда описание станет достаточно ясным.\",\n \"task.create.title\": \"Название\",\n \"task.create.titlePlaceholder\": \"Какой результат должна получить команда?\",\n \"task.create.brief\": \"Описание\",\n \"task.create.briefDescription\":\n \"Добавьте контекст, чтобы планирующие агенты могли задать полезные вопросы.\",\n \"task.create.briefPlaceholder\": \"Результат, ограничения, важные файлы…\",\n \"task.create.criteria\": \"Критерии приёмки\",\n \"task.create.criteriaDescription\": \"По одному проверяемому результату в строке. Нужен хотя бы один.\",\n \"task.create.criteriaError\": \"Укажите 1–50 уникальных строк, не более 500 символов в каждом критерии.\",\n \"task.create.criteriaPlaceholder\": \"Владелец может проверить полученный результат…\",\n \"task.create.project\": \"Проект\",\n \"task.create.priority\": \"Приоритет\",\n \"task.create.type\": \"Тип\",\n \"task.create.parent\": \"Родительская работа\",\n \"task.create.parentDescription\": \"Необязательная группировка внутри Epic или другой работы.\",\n \"task.create.noParent\": \"Без родителя\",\n \"task.create.submit\": \"Создать задачу\",\n \"task.edit\": \"Редактировать задачу\",\n \"task.edit.description\": \"Обновите сохранённое описание и параметры планирования WorkItem.\",\n \"task.edit.criteriaDescription\": \"Один критерий приёмки на строку, не более 50.\",\n \"task.edit.criteriaError\": \"Не более 50 строк и 500 символов в каждом критерии.\",\n \"task.edit.submit\": \"Сохранить изменения\",\n \"action.cancel\": \"Отмена\",\n \"action.back\": \"Назад\",\n \"action.closeDialog\": \"Закрыть окно\",\n \"view.active\": \"Активные\",\n \"view.backlog\": \"Бэклог\",\n \"view.allIssues\": \"Все задачи\",\n \"view.filter\": \"Фильтровать задачи\",\n \"view.display\": \"Настройки отображения\",\n \"view.ordering\": \"Сортировка\",\n \"view.orderBy\": \"Сортировать задачи по\",\n \"view.boardOptions\": \"Настройки доски\",\n \"view.showEmptyColumns\": \"Показывать пустые колонки\",\n \"view.direction.asc\": \"Сортировать по возрастанию\",\n \"view.direction.desc\": \"Сортировать по убыванию\",\n \"view.title\": \"Название\",\n \"view.updated\": \"Обновлено\",\n \"view.created\": \"Создано\",\n \"property.priority\": \"Приоритет\",\n \"work.current\": \"Текущая работа\",\n \"work.boardLabel\": \"Доска текущей работы\",\n \"work.summary.needsYou\": \"Ждут вас\",\n \"work.summary.filter\": \"Быстрый фильтр\",\n \"work.summary.clear\": \"Убрать быстрый фильтр\",\n \"view.actions\": \"Действия представления\",\n \"view.copyLink\": \"Копировать ссылку\",\n \"filter.status\": \"Статус\",\n \"filter.priority\": \"Приоритет\",\n \"filter.risk\": \"Риск\",\n \"filter.rootTitle\": \"Фильтры\",\n \"filter.search\": \"Поиск\",\n \"filter.addPlaceholder\": \"Добавить фильтр…\",\n \"filter.placeholder\": \"Фильтр…\",\n \"filter.noProperties\": \"Подходящих свойств нет\",\n \"filter.noValues\": \"Подходящих значений нет\",\n \"filter.add\": \"Добавить\",\n \"filter.remove\": \"Убрать\",\n \"filter.options\": \"варианты\",\n \"filter.backTo\": \"Назад к\",\n \"filter.close\": \"Закрыть фильтры\",\n \"filter.description\": \"Выберите одно или несколько свойств задачи. Изменения применяются сразу.\",\n \"filter.edit\": \"Изменить\",\n \"filter.is\": \"равно\",\n \"filter.isAnyOf\": \"одно из\",\n \"filter.oneValue\": \"1 значение\",\n \"filter.selectedValues\": \"выбранные значения\",\n \"filter.clear\": \"Очистить\",\n \"state.BACKLOG\": \"Бэклог\",\n \"state.READY\": \"Готово к работе\",\n \"state.IN_PROGRESS\": \"В работе\",\n \"state.BLOCKED\": \"Заблокировано\",\n \"state.DONE\": \"Завершено\",\n \"state.CANCELLED\": \"Отменено\",\n \"priority.LOW\": \"Низкий\",\n \"priority.MEDIUM\": \"Средний\",\n \"priority.HIGH\": \"Высокий\",\n \"priority.URGENT\": \"Срочный\",\n \"risk.LOW\": \"Низкий\",\n \"risk.MEDIUM\": \"Средний\",\n \"risk.HIGH\": \"Высокий\",\n \"risk.CRITICAL\": \"Критический\",\n \"type.EPIC\": \"Эпик\",\n \"type.FEATURE\": \"Функция\",\n \"type.TASK\": \"Задача\",\n \"type.BUG\": \"Ошибка\",\n \"type.SPIKE\": \"Исследование\",\n \"type.SUBTASK\": \"Подзадача\",\n \"stage.DISCOVERY\": \"Исследование\",\n \"stage.PLAN\": \"План\",\n \"stage.IMPLEMENT\": \"Реализация\",\n \"stage.REVIEW\": \"Проверка\",\n \"stage.QA\": \"QA\",\n \"stage.ACCEPTANCE\": \"Приёмка\",\n \"empty.noProjects.title\": \"Локальных проектов пока нет\",\n \"empty.noProjects.description\":\n \"Зарегистрируйте два встроенных безопасных demo-проекта, чтобы получить сохраняемую доску.\",\n \"empty.noProjects.action\": \"Инициализировать demo-пространство\",\n \"loading.board.title\": \"Загружаем доску…\",\n \"loading.inspector.title\": \"Загружаем детали задачи…\",\n \"error.board.title\": \"Не удалось загрузить локальную доску\",\n \"error.unknown\": \"Неизвестная ошибка\",\n \"empty.active.title\": \"Активных задач нет\",\n \"empty.active.description\": \"Создайте задачу или откройте «Все задачи», чтобы увидеть завершённые.\",\n \"empty.backlog.title\": \"Бэклог пуст\",\n \"empty.backlog.description\": \"Новые задачи ждут здесь, пока их не переведут в «Готово к работе».\",\n \"empty.all.title\": \"Задач пока нет\",\n \"empty.all.description\": \"Создайте задачу, чтобы начать вести доставку в этом проекте.\",\n \"empty.filters.title\": \"Нет задач с такими фильтрами\",\n \"empty.filters.description\": \"Измените условие выше или очистите строку фильтров.\",\n \"empty.noSelection.title\": \"Задача не выбрана\",\n \"empty.noSelection.description\": \"Выберите карточку на доске, чтобы посмотреть её состояние и историю.\",\n \"task.move\": \"Переместить\",\n \"task.moveTo\": \"Переместить в «{state}»\",\n \"task.moveToShort\": \"В «{state}»\",\n \"task.overview\": \"Обзор\",\n \"task.state\": \"Состояние\",\n \"task.stage\": \"Этап\",\n \"task.type\": \"Тип\",\n \"task.priority\": \"Приоритет\",\n \"task.risk\": \"Риск\",\n \"task.noBrief\": \"Описание ещё не добавлено.\",\n \"task.acceptanceCriteria\": \"Критерии приёмки\",\n \"task.noAcceptanceCriteria\": \"Критерии приёмки ещё не записаны.\",\n \"dependency.title\": \"Структура и зависимости\",\n \"dependency.edit\": \"Изменить блокеры\",\n \"dependency.editDescription\":\n \"Выберите работы, которые должны перейти в Done до запуска этого процесса. Иерархия показана отдельно.\",\n \"dependency.save\": \"Сохранить блокеры\",\n \"dependency.loading\": \"Загружаем структуру и зависимости…\",\n \"dependency.parent\": \"Родитель\",\n \"dependency.children\": \"Дочерние работы\",\n \"dependency.blockedBy\": \"Заблокировано работами\",\n \"dependency.blocks\": \"Блокирует\",\n \"dependency.none\": \"Нет\",\n \"dependency.noChildren\": \"Нет дочерних работ\",\n \"dependency.noBlockers\": \"Нет блокеров\",\n \"dependency.blocksNone\": \"Нет зависимых работ\",\n \"dependency.noCandidates\": \"В этом проекте нет других работ.\",\n \"dependency.editUnavailable\": \"Блокеры можно менять только до запуска процесса и до закрытия этой работы.\",\n \"task.activity\": \"История\",\n \"task.loadingActivity\": \"Загружаем историю…\",\n \"task.noActivity\": \"История пока пуста.\",\n \"task.activityCountMore\": \"{count}+\",\n \"task.loadMoreActivity\": \"Показать ещё\",\n \"workflow.title\": \"Процесс\",\n \"workflow.name\": \"Процесс поставки\",\n \"workflow.start\": \"Запустить процесс\",\n \"workflow.startDescription\":\n \"Запустить ограниченный процесс «Исследование → Приёмка». Перед продолжением он может остановиться на сохранённом вопросе или решении владельца.\",\n \"workflow.readyRequired\": \"Перед запуском переведите задачу в состояние «Готово к работе».\",\n \"workflow.dependencyBlocked\": \"Завершите все блокирующие работы перед запуском этого процесса.\",\n \"workflow.dependencyLoadFailed\":\n \"Loomrail не смог проверить граф зависимостей, поэтому запуск остаётся недоступен.\",\n \"workflow.containerNotExecutable\":\n \"Это контейнер с дочерними работами. Запускайте процесс у конечных работ.\",\n \"workflow.loading\": \"Загружаем процесс…\",\n \"workflow.status.RUNNING\": \"Выполняется\",\n \"workflow.status.WAITING_HUMAN\": \"Ждёт вас\",\n \"workflow.status.SOFT_PAUSED\": \"Приостановлен\",\n \"workflow.status.HARD_PAUSED\": \"Остановлен лимитом\",\n \"workflow.status.INTERRUPTED\": \"Прерван\",\n \"workflow.status.SUCCEEDED\": \"Завершён\",\n \"workflow.status.FAILED\": \"Ошибка\",\n \"workflow.status.CANCELLED\": \"Отменён\",\n \"workflow.completed\": \"Ограниченный процесс поставки завершён на основе сохранённых решений.\",\n \"workflow.stage.QUEUED\": \"В очереди\",\n \"workflow.stage.RUNNING\": \"Выполняется\",\n \"workflow.stage.WAITING_HUMAN\": \"Ожидает\",\n \"workflow.stage.SOFT_PAUSED\": \"Приостановлен\",\n \"workflow.stage.HARD_PAUSED\": \"Остановлен лимитом\",\n \"workflow.stage.INTERRUPTED\": \"Прерван\",\n \"workflow.stage.CANCELLED\": \"Отменён\",\n \"workflow.stage.SUCCEEDED\": \"Завершено\",\n \"workflow.stage.other\": \"Выполняется\",\n \"workflow.action.pause\": \"Приостановить\",\n \"workflow.action.resume\": \"Продолжить\",\n \"workflow.action.cancel\": \"Отменить запуск\",\n \"workflow.action.override\": \"Одобрить политику расходов\",\n \"workflow.budget.title\": \"Лимит оценочных токенов\",\n \"workflow.budget.kind\": \"Жёсткий бюджет\",\n \"workflow.budget.input\": \"Жёсткий лимит токенов\",\n \"workflow.budget.description\":\n \"Запускаются все шесть стадий, включая независимый Review, Project verification, Browser QA и Acceptance владельца. Чтения файлов и повторные попытки могут сделать даже небольшую задачу дорогой. Лимит — не прогноз: input, output и cache hits заранее неизвестны. Локальный CLI сообщает расход после сессии; она может превысить лимит, который остановит следующую работу.\",\n \"workflow.budget.invalid\": \"Введите положительное целое число.\",\n \"workflow.budget.overrideDescription\":\n \"Оставьте не меньше текущего {current}; лимит должен быть выше записанного расхода {used}.\",\n \"workflow.budget.overrideInvalid\": \"Сохраните текущий лимит и значение выше записанного расхода.\",\n \"workflow.budget.usage\": \"{used} из {limit}\",\n \"workflow.budget.revision\": \"Ревизия политики {revision}\",\n \"workflow.agentRunBudget.input\": \"Лимит одного запуска агента\",\n \"workflow.agentRunBudget.description\":\n \"Максимум оценочных токенов на каждый будущий запуск агента. Не может превышать общий лимит.\",\n \"workflow.agentRunBudget.invalid\": \"Введите положительное целое число не выше общего лимита.\",\n \"workflow.agentRunBudget.overrideDescription\":\n \"Повысьте этот лимит для исчерпавшего бюджет агента или повысьте общий лимит.\",\n \"workflow.agentRunBudget.overrideInvalid\": \"Повысьте этот лимит, если общий лимит не меняется.\",\n \"workflow.agentRunBudget.current\": \"На агента: {limit}\",\n \"workflow.agentRunBudget.roleDefault\": \"Лимит роли\",\n \"workflow.modelTier.input\": \"Уровень модели\",\n \"workflow.modelTier.description\":\n \"Применяется к будущим запускам агентов и сохраняется в каждом неизменяемом снимке политики.\",\n \"workflow.model.input\": \"Модель\",\n \"workflow.model.autoOption\": \"{tier} · Авто\",\n \"workflow.model.autoDescription\": \"Codex CLI: {codex} · Claude Code: {claude}\",\n \"workflow.model.providerDescription\": \"{provider} · политика стоимости «{tier}»\",\n \"workflow.model.loading\": \"Загружаем каталог моделей провайдера…\",\n \"workflow.modelTier.current\": \"Уровень: {tier}\",\n \"workflow.modelTier.roleDefault\": \"По умолчанию роли\",\n \"workflow.modelTier.FAST\": \"Быстрый\",\n \"workflow.modelTier.STANDARD\": \"Стандартный\",\n \"workflow.modelTier.DEEP\": \"Глубокий\",\n \"workflow.recovery.title\": \"Отчёт о восстановлении\",\n \"workflow.recovery.description\":\n \"Выполнявшаяся попытка безопасно прервана после перезапуска локального демона.\",\n \"workflow.hardPause.noProgress\": \"Остановлен: нет прогресса\",\n \"workflow.hardPause.contextFloor\": \"Остановлен: контекст не помещается\",\n \"workflow.hardPause.providerRejected\": \"Остановлен: провайдер отклонил вход\",\n \"workflow.hardPause.providerStartFailed\": \"Остановлен: провайдер недоступен\",\n \"workflow.hardPause.providerOutcomeRejected\": \"Остановлен: некорректный результат провайдера\",\n \"workflow.hardPause.sessionLimit\": \"Остановлен: достигнут предел сессий\",\n \"workflow.sessions.title\": \"Сессии\",\n \"workflow.sessions.attemptHeading\": \"Попытка {attempt}\",\n \"workflow.sessions.ordinal\": \"Сессия {ordinal}\",\n \"workflow.sessions.status.RUNNING\": \"Выполняется\",\n \"workflow.sessions.status.COMPLETED\": \"Завершена\",\n \"workflow.sessions.status.HANDOFF\": \"Передана дальше\",\n \"workflow.sessions.status.CONTEXT_EXHAUSTED\": \"Контекст исчерпан\",\n \"workflow.sessions.status.INTERRUPTED\": \"Прервана\",\n \"workflow.sessions.status.CANCELLED\": \"Отменена\",\n \"workflow.sessions.handoffRequested\": \"Запрошена передача\",\n \"workflow.sessions.occupancyPeak\": \"Пик — {percent}% окна\",\n \"workflow.sessions.occupancyAtHandoff\": \"{percent}% окна на момент передачи\",\n \"workflow.sessions.usageQuality.ACTUAL\": \"(измерено)\",\n \"workflow.sessions.usageQuality.PROVIDER_ESTIMATE\": \"(оценка провайдера)\",\n \"workflow.sessions.usageQuality.LOOMRAIL_ESTIMATE\": \"(оценка Loomrail)\",\n \"workflow.sessions.cacheUnknown\": \"Неизвестно\",\n \"workflow.sessions.tokenUsage\":\n \"Использовано токенов: {total} (вход: {input} · выход: {output} · cached input: {cached} · uncached input + output: {uncached})\",\n \"workflow.sessions.tokenCost\": \"· {cost}\",\n \"workflow.sessions.noCheckpointOnRequest\":\n \"Этот провайдер не умеет сворачиваться по запросу — для него штатно терять недавнюю работу при обрыве сессии.\",\n \"workflow.checkpoints.empty\": \"В этой сессии checkpoint не публиковался.\",\n \"workflow.checkpoints.completed\": \"Сделано\",\n \"workflow.checkpoints.remaining\": \"Осталось\",\n \"workflow.checkpoints.deadEnds\": \"Тупики\",\n \"workflow.checkpoints.openQuestions\": \"Открытые вопросы\",\n \"workspace.title\": \"Рабочая область\",\n \"workspace.state\": \"Состояние\",\n \"workspace.status.READY\": \"Готова\",\n \"workspace.status.ORPHANED\": \"Worktree исчез\",\n \"workspace.status.REMOVED\": \"Удалена\",\n \"workspace.repository\": \"Репозиторий\",\n \"workspace.mode\": \"Режим\",\n \"workspace.mode.ISOLATED_WORKTREE\": \"Отдельный worktree\",\n \"workspace.mode.SHARED_CURRENT_DIRECTORY\": \"Папка проекта\",\n \"workspace.branch\": \"Ветка\",\n \"workspace.worktree\": \"Worktree\",\n \"workspace.workingDirectory\": \"Рабочая папка\",\n \"workspace.baseCommit\": \"Базовый коммит\",\n \"workspace.baseCommit.none\": \"Коммитов ещё не было\",\n \"workspace.notReady\":\n \"Каталога worktree этой задачи больше нет на диске. Loomrail не создаёт второй, и вернуть эту рабочую область в строй нечем — ветка по-прежнему хранит всё, что в неё закоммичено.\",\n \"workspace.sharedNotReady\":\n \"Записанная рабочая папка проекта больше недоступна. Loomrail не будет сам выбирать другую папку или ветку.\",\n \"workspace.uncommitted\":\n \"Loomrail ничего не коммитил. Работа лежит в этом worktree, на этой ветке, пока вы её не сохраните или не удалите.\",\n \"workspace.sharedUncommitted\":\n \"Loomrail ничего не коммитил. Изменения агента лежат в папке проекта рядом с работой, которая уже была там.\",\n \"changes.title\": \"Изменения\",\n \"changes.empty\": \"Задача пока ничего не изменила в своей рабочей области.\",\n \"changes.truncated\":\n \"Показаны только первые {count} изменённых файлов. В этом worktree их больше, чем Loomrail выводит здесь.\",\n \"changes.binary\": \"Бинарный\",\n \"changes.binaryNoPatch\": \"Это бинарный файл — текстового диффа для него нет.\",\n \"changes.renamedFrom\": \"Переименован из {path}\",\n \"changes.lineCounts\": \"Добавлено строк: {insertions}, удалено: {deletions}\",\n \"changes.diffPending\": \"Читаем дифф этого файла…\",\n \"changes.diffUnavailable\": \"Этот дифф прочитать нечем: у задачи больше нет рабочей области.\",\n \"changes.patchTruncated\":\n \"Loomrail выводит только начало этого диффа — ещё {bytes} байт здесь не показано.\",\n \"changes.status.ADDED\": \"Добавлен\",\n \"changes.status.MODIFIED\": \"Изменён\",\n \"changes.status.DELETED\": \"Удалён\",\n \"changes.status.RENAMED\": \"Переименован\",\n \"changes.error.WORKSPACE_WORKTREE_MISSING\":\n \"Каталога worktree этой задачи больше нет на диске — читать изменения больше не из чего.\",\n \"changes.error.WORKSPACE_WORKTREE_UNREADABLE\":\n \"Loomrail не может войти в worktree этой задачи и поэтому не может сказать, что изменилось. Возможно, работа агента всё ещё там, но Loomrail не может проверить это отсюда.\",\n \"changes.error.WORKSPACE_HAS_NO_BASELINE\":\n \"У этой рабочей области не записан коммит для сравнения, поэтому измерять изменения не от чего.\",\n \"changes.error.CHANGES_UNREADABLE\":\n \"Loomrail не смог прочитать этот worktree относительно коммита, от которого он отрезан, и не показывает список, за который не может отвечать.\",\n \"changes.error.GIT_UNAVAILABLE\":\n \"Loomrail не смог запустить git на этой машине и поэтому не может прочитать, что изменила задача.\",\n \"changes.error.PATH_OUTSIDE_WORKSPACE\":\n \"Этот путь лежит за пределами рабочей области задачи, и Loomrail его не читал.\",\n \"changes.error.PATH_NOT_A_FILE\": \"Этот путь не именует изменённый файл в этом worktree.\",\n \"changes.error.PATH_UNRESOLVABLE\": \"Loomrail не смог разрешить этот путь внутри этого worktree.\",\n \"changes.error.other\": \"Loomrail не смог прочитать, что изменила эта задача.\",\n \"review.title\": \"Независимое ревью\",\n \"review.round\": \"Раунд ревью {round}\",\n \"review.verdict.PASSED\": \"Пройдено\",\n \"review.verdict.CHANGES_REQUESTED\": \"Нужны исправления\",\n \"review.reviewer\": \"Ревьюер\",\n \"review.relation\": \"Независимость\",\n \"review.relation.CROSS_PROVIDER\": \"Другой провайдер\",\n \"review.relation.SAME_PROVIDER\": \"Отдельный запуск, тот же провайдер\",\n \"review.tree\": \"Проверенный tree\",\n \"review.findings\": \"Замечания ревью\",\n \"review.noFindings\": \"Открытых замечаний не осталось.\",\n \"review.severity.LOW\": \"Низкая\",\n \"review.severity.MEDIUM\": \"Средняя\",\n \"review.severity.HIGH\": \"Высокая\",\n \"review.severity.CRITICAL\": \"Критическая\",\n \"review.findingStatus.OPEN\": \"Открыто\",\n \"review.findingStatus.RESOLVED\": \"Исправлено\",\n \"review.findingStatus.WAIVED\": \"Риск принят\",\n \"review.findingStatus.FALSE_POSITIVE\": \"Ложное срабатывание\",\n \"review.reproduction\": \"Как воспроизвести\",\n \"review.waive\": \"Принять риск\",\n \"review.falsePositive\": \"Ложное срабатывание\",\n \"review.reason\": \"Причина решения владельца\",\n \"review.reasonPlaceholder\": \"Объясните, почему замечание не должно блокировать поставку…\",\n \"review.confirmWaive\": \"Зафиксировать риск\",\n \"review.confirmFalsePositive\": \"Отметить как ложное\",\n \"qa.title\": \"QA в браузере\",\n \"qa.status.RUNNING\": \"Выполняется\",\n \"qa.status.PASSED\": \"Пройдено\",\n \"qa.status.FAILED\": \"Есть ошибки\",\n \"qa.status.ERROR\": \"Не удалось проверить\",\n \"qa.tree\": \"Проверенное дерево\",\n \"qa.target\": \"Адрес приложения\",\n \"qa.environment\": \"Среда\",\n \"qa.planRevision\": \"Ревизия плана {revision}\",\n \"qa.matrix\": \"Матрица сценариев\",\n \"qa.scenarioProgress\": \"Шагов: {steps} · проверок: {assertions}\",\n \"qa.assertionFailed\": \"Не пройдено: {title}\",\n \"qa.notRun\": \"Не измерено\",\n \"qa.observations\": \"Консоль и сеть\",\n \"qa.observation.CONSOLE\": \"Консоль\",\n \"qa.observation.NETWORK\": \"Сеть\",\n \"qa.blocking\": \"Блокирует\",\n \"qa.defects\": \"Дефекты QA\",\n \"qa.defectStatus.OPEN\": \"Открыт\",\n \"qa.defectStatus.RESOLVED\": \"Исправлен по retest\",\n \"qa.defectStatus.WAIVED\": \"Риск принят\",\n \"qa.reproduction\": \"Как воспроизвести\",\n \"qa.waive\": \"Принять риск\",\n \"qa.waiverReason\": \"Причина решения владельца\",\n \"qa.waiverReasonPlaceholder\": \"Объясните, почему дефект не должен войти в следующий fix set…\",\n \"qa.confirmWaive\": \"Зафиксировать риск\",\n \"qa.correctionTimeline\": \"История коррекций\",\n \"qa.correction\": \"Коррекция {ordinal}\",\n \"qa.correctionStatus.ACTIVE\": \"Активна\",\n \"qa.correctionStatus.PASSED\": \"Пройдена\",\n \"qa.correctionStatus.SUPERSEDED\": \"Заменена следующей\",\n \"qa.correctionStatus.EXHAUSTED\": \"Лимит исчерпан\",\n \"qa.correctionStatus.CANCELLED\": \"Отменена\",\n \"qa.correctionSource\": \"Исходная ошибка\",\n \"qa.correctionEvidence\": \"Исходное доказательство\",\n \"qa.correctionBaseline\": \"Полный baseline\",\n \"qa.correctionTree\": \"tree {tree}\",\n \"qa.retestScope\": \"Зафиксированный retest · ячеек: {count}\",\n \"qa.retestReason.FAILED_CHECK\": \"ошибка проверки\",\n \"qa.retestReason.BLOCKING_OBSERVATION\": \"блокирующее наблюдение\",\n \"qa.retestReason.OPEN_DEFECT\": \"открытый дефект\",\n \"qa.retestReason.REGRESSION\": \"регрессия\",\n \"qa.resolvedBy\": \"Подтверждено retest\",\n \"qa.correctionGate.title\": \"Решение по коррекции QA\",\n \"qa.correctionGate.description\":\n \"Коррекция {ordinal} исчерпала ограниченный retest. Выберите следующий аудируемый переход workflow.\",\n \"qa.correctionGate.authorizeFinal\": \"Разрешить финальную коррекцию\",\n \"qa.correctionGate.cancel\": \"Отменить поставку\",\n \"qa.attachments\": \"Файлы проверки\",\n \"qa.attachment.SCREENSHOT\": \"Снимок экрана\",\n \"qa.attachment.TRACE\": \"Трассировка Playwright\",\n \"qa.openAttachment\": \"Открыть файл\",\n \"acceptance.eyebrow\": \"Решение владельца\",\n \"acceptance.title\": \"Пакет приёмки\",\n \"acceptance.evidence\": \"Сохранённые доказательства\",\n \"acceptance.reviewEvidence\": \"Отчёт ревью\",\n \"acceptance.qaEvidence\": \"Отчёт QA\",\n \"acceptance.checks\": \"Проверок: {count}\",\n \"acceptance.evidenceCount\": \"Отчётов: {count}\",\n \"acceptance.matrix\": \"Матрица критериев\",\n \"acceptance.noCriteria\": \"Явные критерии не заданы — проверьте отчёты и описание релиза.\",\n \"acceptance.implementation\": \"Реализация\",\n \"acceptance.reviewCheck\": \"Выбранная проверка ревью\",\n \"acceptance.qaCheck\": \"Выбранная проверка QA\",\n \"acceptance.ownerVerification\": \"Проверка владельцем\",\n \"acceptance.knownRisk\": \"Известный риск\",\n \"acceptance.noKnownRisk\": \"Не зафиксирован\",\n \"acceptance.legacyEvidence\": \"Legacy-пакет — проверки не привязаны к каждому критерию\",\n \"acceptance.export\": \"Скачать итоговый отчёт\",\n \"acceptance.accept\": \"Принять результат\",\n \"acceptance.return\": \"Вернуть в работу\",\n \"acceptance.reject\": \"Отклонить\",\n \"acceptance.status.PENDING\": \"Нужно решение\",\n \"acceptance.status.ACCEPTED\": \"Принято\",\n \"acceptance.status.RETURNED\": \"Возвращено\",\n \"acceptance.status.REJECTED\": \"Отклонено\",\n \"humanRequest.blocking\": \"Блокирующий запрос\",\n \"humanRequest.request\": \"Запрос\",\n \"humanRequest.recommendation\": \"Рекомендация\",\n \"humanRequest.recommended\": \"Рекомендуется\",\n \"humanRequest.other\": \"Другое\",\n \"humanRequest.otherPlaceholder\": \"Опишите, какое направление использовать…\",\n \"humanRequest.answerResume\": \"Ответить и продолжить\",\n \"humanRequest.chooseAnswer\": \"Выберите ответ, чтобы продолжить.\",\n \"humanRequest.authorityNotice\":\n \"Ответ сохраняет информацию и продолжает работу. Он не выдаёт новых разрешений на файлы, команды, сеть, бюджет или приёмку.\",\n \"attention.title\": \"Нужно ваше решение\",\n \"attention.count\": \"{count} блокирующий запрос\",\n \"attention.countMany\": \"{count} блокирующих запросов\",\n \"attention.inboxTitle\": \"Требует внимания\",\n \"attention.inboxDescription\": \"Решения и приёмки из всех проектов в одном месте.\",\n \"attention.listLabel\": \"Запросы, которые требуют вашего внимания\",\n \"attention.loading\": \"Загрузка входящих запросов\",\n \"attention.refreshing\": \"Обновляем…\",\n \"attention.emptyTitle\": \"Сейчас от вас ничего не требуется\",\n \"attention.emptyDescription\": \"Новые вопросы и приёмки появятся здесь вместе с контекстом задачи.\",\n \"attention.limitReached\": \"Показаны первые 200 запросов. Решите один, чтобы увидеть следующие.\",\n \"attention.section.BLOCKING_NOW\": \"Блокирует работу\",\n \"attention.section.APPROVALS\": \"На подтверждение\",\n \"attention.section.QUESTIONS\": \"Вопросы\",\n \"attention.section.MANUAL_ACTIONS\": \"Ручные действия\",\n \"attention.section.SOON\": \"Скоро\",\n \"attention.category.APPROVAL\": \"Подтверждение\",\n \"attention.category.QUESTION\": \"Вопрос\",\n \"attention.category.MANUAL_ACTION\": \"Ручное действие\",\n \"attention.fact.category\": \"Тип\",\n \"attention.fact.priority\": \"Приоритет\",\n \"attention.fact.stage\": \"Затронутый этап\",\n \"attention.fact.created\": \"Ожидает с\",\n \"attention.acceptanceTitle\": \"Проверьте свидетельства результата\",\n \"attention.acceptanceDescription\":\n \"Приёмка остаётся в Task Cockpit: там вместе видны свидетельства, инструкция проверки и точное последствие решения.\",\n \"attention.reviewAcceptance\": \"Перейти к приёмке\",\n \"attention.openTask\": \"Открыть контекст задачи\",\n \"fleet.title\": \"Команда агентов\",\n \"fleet.description\": \"Активные роли и ожидания планировщика во всех локальных проектах.\",\n \"fleet.capacity\": \"Активно: {active} из {limit}\",\n \"fleet.loading\": \"Загрузка команды агентов\",\n \"fleet.refreshing\": \"Обновляем…\",\n \"fleet.emptyTitle\": \"Нет задач для агентов\",\n \"fleet.emptyDescription\": \"Запустите подтверждённую задачу — здесь появятся её роль и состояние.\",\n \"fleet.column.task\": \"Задача\",\n \"fleet.column.role\": \"Роль\",\n \"fleet.column.stage\": \"Этап\",\n \"fleet.column.provider\": \"Провайдер\",\n \"fleet.column.status\": \"Состояние\",\n \"fleet.column.since\": \"С какого времени\",\n \"fleet.column.latestAction\": \"Последнее действие\",\n \"fleet.notStarted\": \"Ещё не запущено\",\n \"fleet.noActivity\": \"Пока нет действий\",\n \"fleet.latestAction.origin.DAEMON_AUDITED\": \"Проверено\",\n \"fleet.latestAction.origin.PROVIDER_REPORTED\": \"Со слов провайдера\",\n \"fleet.status.READY\": \"Готов\",\n \"fleet.status.WAITING\": \"Ожидает\",\n \"fleet.status.RUNNING\": \"В работе\",\n \"fleet.role.LEAD_PM\": \"Ведущий PM\",\n \"fleet.role.PRODUCT_ANALYST\": \"Продуктовый аналитик\",\n \"fleet.role.SOFTWARE_ARCHITECT\": \"Архитектор\",\n \"fleet.role.DEVELOPER\": \"Разработчик\",\n \"fleet.role.CODE_REVIEWER\": \"Ревьюер\",\n \"fleet.role.BROWSER_QA\": \"Браузерный QA\",\n \"fleet.role.ACCEPTANCE_MANAGER\": \"Координатор приёмки\",\n \"fleet.wait.NOT_READY\": \"Этап ещё не готов\",\n \"fleet.wait.BUDGET_BLOCKED\": \"Нужно подтвердить бюджет\",\n \"fleet.wait.CHECKPOINT_NOT_STABLE\": \"Нет стабильного checkpoint\",\n \"fleet.wait.ATTEMPT_ACTIVE\": \"Эта попытка уже выполняется\",\n \"fleet.wait.GLOBAL_LIMIT\": \"Все общие слоты заняты\",\n \"fleet.wait.PROJECT_LIMIT\": \"Слоты этого проекта заняты\",\n \"fleet.wait.PROVIDER_LIMIT\": \"Слоты этого провайдера заняты\",\n \"fleet.wait.WORKSPACE_CONFLICT\": \"Рабочая область занята\",\n \"event.created\": \"Задача создана\",\n \"event.createdDetail\": \"Добавлена в бэклог проекта.\",\n \"event.updated\": \"Задача обновлена\",\n \"event.updatedDetail\": \"Изменено: {fields}.\",\n \"event.dependenciesSet\": \"Зависимости изменены\",\n \"event.dependenciesSetDetail\": \"Входящих блокеров: {count}\",\n \"event.stateChanged\": \"Состояние изменено\",\n \"event.stateChangedDetail\": \"{from} → {to}\",\n \"event.projectRegistered\": \"Проект зарегистрирован\",\n \"event.projectScaffoldRequested\": \"Запрошено создание проекта\",\n \"event.projectScaffoldCompleted\": \"Проект создан\",\n \"event.projectScaffoldFailed\": \"Создание проекта остановлено\",\n \"event.providerPreferenceChanged\": \"ИИ-провайдер изменён\",\n \"event.providerPreferenceChangedDetail\": \"{from} → {to}\",\n \"event.providerAllowanceRecorded\": \"Лимит провайдера обновлён\",\n \"event.providerAllowanceRecordedDetail\": \"{provider} · {freshness}\",\n \"event.mcpProfileConsented\": \"MCP-команда подтверждена\",\n \"event.mcpProfileConsentedDetail\": \"{name}, ревизия {revision}\",\n \"event.mcpGrantChanged\": \"Доступ к MCP tools изменён\",\n \"event.mcpGrantChangedDetail\": \"Tools: {count} · {state}\",\n \"event.mcpGrant.enabled\": \"разрешён\",\n \"event.mcpGrant.revoked\": \"отозван\",\n \"event.constitutionProposed\": \"Предложена Конституция\",\n \"event.constitutionProposedDetail\": \"Пресет {preset}@1\",\n \"event.constitutionPublicationRequested\": \"Запрошена публикация Конституции\",\n \"event.constitutionPublicationRequestedDetail\": \"Публикуется версия {ordinal}\",\n \"event.constitutionActivated\": \"Конституция активирована\",\n \"event.constitutionActivatedDetail\": \"Версия {ordinal} теперь является основной\",\n \"event.constitutionPublicationFailed\": \"Публикация Конституции не удалась\",\n \"event.verificationPlanAdopted\": \"Проверки проекта подтверждены\",\n \"event.verificationPlanAdoptedDetail\": \"Ревизия {revision} · точных команд: {count}\",\n \"event.verificationPlanDisabled\": \"Проверки проекта отключены\",\n \"event.verificationPlanDisabledDetail\": \"Ревизия {revision} фиксирует отключённое состояние\",\n \"event.verificationPlanPublicationApplied\": \"Проверки проекта опубликованы\",\n \"event.verificationPlanPublicationAppliedDetail\": \"Ревизия {revision} доступна для измеренных запусков\",\n \"event.verificationPlanPublicationFailed\": \"Публикация проверок проекта не удалась\",\n \"event.verificationPlanPublicationRetried\": \"Публикация проверок проекта запущена повторно\",\n \"event.verificationPlanPublicationRetriedDetail\": \"Ревизия {revision} сверяется повторно\",\n \"event.launchPlanChanged\": \"Локальные launch-gates изменены\",\n \"event.launchPlanChangedDetail\": \"Ревизия {revision} · {status}\",\n \"event.launchRunChanged\": \"Локальное launch-измерение изменено\",\n \"event.launchRunChangedDetail\": \"{status} · tree {tree}\",\n \"event.verificationRunReserved\": \"Проверка проекта поставлена в очередь\",\n \"event.verificationRunReservedDetail\": \"Запуск {ordinal} · проверок: {count}\",\n \"event.verificationCheckStarted\": \"Проверка проекта запущена\",\n \"event.verificationCheckStartedDetail\": \"Проверка {ordinal}\",\n \"event.verificationCheckCompleted\": \"Проверка проекта завершена\",\n \"event.verificationCheckCompletedDetail\": \"Проверка {ordinal} · {status}\",\n \"event.verificationRunInterrupted\": \"Проверка проекта прервана\",\n \"event.verificationRunInterruptedDetail\": \"Запуск {ordinal}\",\n \"event.verificationRunCancellationRequested\": \"Запрошена отмена проверки проекта\",\n \"event.verificationRunCancellationRequestedDetail\": \"Запуск {ordinal} безопасно останавливается\",\n \"event.verificationFailureRecorded\": \"Проверка проекта заблокировала поставку\",\n \"event.verificationFailureRecordedDetail\": \"Измеренная причина: {reason}\",\n \"event.verificationCorrectionStarted\": \"Запущено исправление проверки проекта\",\n \"event.verificationCorrectionStartedDetail\": \"Исправление {ordinal} возвращено в реализацию\",\n \"event.verificationCorrectionPassed\": \"Исправление проверки проекта подтверждено\",\n \"event.verificationCorrectionPassedDetail\": \"Исправление {ordinal} прошло свежий повторный прогон\",\n \"event.verificationCorrectionSuperseded\": \"Исправление проверки проекта заменено следующим\",\n \"event.verificationCorrectionSupersededDetail\": \"Исправление {ordinal} не прошло измеряемые проверки\",\n \"event.verificationCorrectionExhausted\": \"По исправлению проверки нужно решение\",\n \"event.verificationCorrectionExhaustedDetail\": \"Исправление {ordinal} исчерпало автоматический лимит\",\n \"event.verificationCorrectionCancelled\": \"Исправление проверки проекта отменено\",\n \"event.verificationCorrectionCancelledDetail\": \"Исправление {ordinal} остановлено без приёмки\",\n \"verification.failure.REQUIRED_CHECK_FAILED\": \"обязательная проверка не прошла\",\n \"verification.failure.REQUIRED_CHECK_ERROR\": \"ошибка обязательной проверки\",\n \"verification.failure.RUN_INTERRUPTED\": \"запуск прерван\",\n \"verification.failure.STALE\": \"доказательство устарело\",\n \"event.readinessAssessed\": \"Готовность проекта проверена\",\n \"event.readinessAssessedDetail\": \"Пунктов требуют действий: {count}\",\n \"event.readinessAttested\": \"Решение по готовности сохранено\",\n \"event.readinessAttestedDetail\": \"{check}: {outcome}\",\n \"event.pipelineStarted\": \"Процесс запущен\",\n \"event.pipelineStartedDetail\": \"Процесс поставки перешёл к этапу «{stage}».\",\n \"event.stageChanged\": \"Этап обновлён\",\n \"event.stageChangedDetail\": \"{stage}: {status}\",\n \"event.humanRequestOpened\": \"Требуется решение\",\n \"event.humanRequestOpenedDetail\": \"{title}\",\n \"event.humanRequestResolved\": \"Решение сохранено\",\n \"event.humanRequestResolvedDetail\": \"Ответ владельца сохранён в журнале.\",\n \"event.usageRecorded\": \"Расход записан\",\n \"event.usageRecordedDetail\": \"+{amount} оценочных токенов · всего {total}\",\n \"event.budgetThreshold\": \"Достигнут порог бюджета\",\n \"event.budgetThresholdDetail\": \"{threshold}% · {total} оценочных токенов\",\n \"event.pipelinePaused\": \"Процесс приостановлен\",\n \"event.pipelinePausedDetail\": \"Пауза {kind} на этапе «{stage}»\",\n \"event.pipelineResumed\": \"Процесс продолжен\",\n \"event.pipelineResumedDetail\": \"Продолжен этап «{stage}»\",\n \"event.pipelineCancelled\": \"Процесс отменён\",\n \"event.pipelineCancelledDetail\": \"Выполнение остановлено на этапе «{stage}»\",\n \"event.budgetOverride\": \"Новый бюджет одобрен\",\n \"event.budgetOverrideDetail\": \"Ревизия {revision} · {limit} оценочных токенов\",\n \"event.recoveryCreated\": \"Процесс восстановлен\",\n \"event.recoveryCreatedDetail\": \"Незавершённая попытка этапа «{stage}» помечена прерванной.\",\n \"event.evidenceRecorded\": \"Доказательство сохранено\",\n \"event.evidenceRecordedDetail\": \"{title}\",\n \"event.reviewReportRecorded\": \"Независимое ревью сохранено\",\n \"event.reviewReportRecordedDetail\": \"Раунд {round} · {verdict}\",\n \"event.reviewFindingRecorded\": \"Замечание ревью открыто\",\n \"event.reviewFindingResolved\": \"Замечание ревью закрыто\",\n \"event.reviewLoopExhausted\": \"Review-loop ждёт решения\",\n \"event.reviewLoopExhaustedDetail\": \"Раунд {round} исчерпал автоматический лимит\",\n \"event.acceptanceRequested\": \"Требуется приёмка владельца\",\n \"event.acceptanceRequestedDetail\": \"Отчёты ревью и QA готовы для финального решения.\",\n \"event.acceptanceResolved\": \"Приёмка завершена\",\n \"event.acceptanceResolvedDetail\": \"Решение владельца: {action}\",\n \"event.pipelineCompleted\": \"Процесс завершён\",\n \"event.pipelineCompletedDetail\": \"Ограниченный процесс поставки завершён.\",\n \"event.squadAssigned\": \"Команда агентов назначена\",\n \"event.squadAssignedDetail\": \"Ролей с точной версией профиля: {count}\",\n \"event.agentRunStarted\": \"Запуск агента начат\",\n \"event.agentRunStartedDetail\": \"{role} · {provider}\",\n \"event.agentRunFinished\": \"Запуск агента завершён\",\n \"event.agentRunFinishedDetail\": \"{role} · {status}\",\n \"event.qaRunReserved\": \"Browser QA зарезервирован\",\n \"event.qaRunReservedDetail\": \"Playwright · целей: {targets} · сценариев: {scenarios}\",\n \"event.qaRunCompleted\": \"Browser QA завершён\",\n \"event.qaRunCompletedDetail\": \"{status} · дефектов: {defects}\",\n \"event.qaDefectWaived\": \"Риск QA-дефекта принят\",\n \"event.qaCorrectionStarted\": \"Запущено исправление QA\",\n \"event.qaCorrectionStartedDetail\": \"Исправление {ordinal} · retest-ячеек: {cells}\",\n \"event.qaCorrectionExhausted\": \"Лимит исправлений QA исчерпан\",\n \"event.qaCorrectionExhaustedDetail\": \"Исправлению {ordinal} нужно решение владельца\",\n \"event.qaCorrectionPassed\": \"Исправление QA прошло проверку\",\n \"event.qaCorrectionPassedDetail\": \"Исправление {ordinal} закрыло дефектов: {defects}\",\n \"event.qaCorrectionCancelled\": \"Исправление QA отменено\",\n \"event.qaCorrectionCancelledDetail\": \"Исправление {ordinal} остановлено без приёмки\",\n \"agentRun.status.RUNNING\": \"В работе\",\n \"agentRun.status.SUCCEEDED\": \"Успешно\",\n \"agentRun.status.FAILED\": \"Ошибка\",\n \"agentRun.status.CANCELLED\": \"Отменён\",\n \"agentRun.status.INTERRUPTED\": \"Прерван\",\n \"agentRun.status.WAITING_HUMAN\": \"Ожидает владельца\",\n \"agentRun.status.SOFT_PAUSED\": \"Мягкая пауза\",\n \"agentRun.status.HARD_PAUSED\": \"Жёсткая пауза\",\n \"event.providerSessionStarted\": \"Сессия агента начата\",\n \"event.providerSessionStartedDetail\": \"Сессия {ordinal}\",\n \"event.checkpointPublished\": \"Checkpoint опубликован\",\n \"event.checkpointPublishedDetail\": \"{summary}\",\n \"event.contextHandoffRequested\": \"Запрошена передача\",\n \"event.contextHandoffRequestedDetail\": \"Сессия {ordinal} сворачивается\",\n \"event.providerSessionEnded\": \"Сессия агента завершена\",\n \"event.providerSessionEndedDetail\": \"{reason}\",\n \"event.contextFloorExceeded\": \"Обязательный контекст не поместился\",\n \"event.contextFloorExceededDetail\": \"Сессии {ordinal} нужно {requiredBytes} байт из {budgetBytes}\",\n \"event.workspaceCreated\": \"Рабочая область создана\",\n \"event.workspaceCreatedDetail\": \"{mode} · ветка {branch} · перенесено файлов: {count}\",\n \"event.workspaceStrategyChanged\": \"Режим рабочей папки изменён\",\n \"event.workspaceStrategyChangedDetail\": \"Новые рабочие области используют: {mode}\",\n \"event.workspaceOrphaned\": \"Рабочая область осиротела\",\n \"event.workspaceOrphanedDetail\": \"Worktree отсутствует или может быть удалён\",\n \"workspaceTool.operation.LIST_DIRECTORY\": \"Просмотр папки\",\n \"workspaceTool.operation.READ_FILE\": \"Чтение файла\",\n \"workspaceTool.operation.WRITE_FILE\": \"Изменение файла\",\n \"workspaceTool.operation.EDIT_FILE\": \"Точное редактирование файла\",\n \"workspaceTool.operation.DELETE_FILE\": \"Удаление файла\",\n \"workspaceTool.operation.RUN_RECIPE\": \"Запуск утверждённой проверки\",\n \"workspaceTool.status.STARTED\": \"Выполняется\",\n \"workspaceTool.status.SUCCEEDED\": \"Успешно\",\n \"workspaceTool.status.DENIED\": \"Заблокировано политикой безопасности\",\n \"workspaceTool.status.APPROVAL_REQUIRED\": \"Нужно разрешение или подтверждение\",\n \"workspaceTool.status.FAILED\": \"Ошибка\",\n \"workspaceTool.status.UNKNOWN_OUTCOME\": \"Результат неизвестен после перезапуска\",\n \"runActivity.title\": \"Run Activity\",\n \"runActivity.explainer\":\n \"Действия, проверенные Loomrail, прошли через собственный шлюз демона и хранятся постоянно. Действия со слов провайдера — его собственный отчёт о себе: ничем не проверен и хранится ограниченное время.\",\n \"runActivity.origin.DAEMON_AUDITED\": \"Проверено Loomrail\",\n \"runActivity.origin.PROVIDER_REPORTED\": \"Со слов провайдера\",\n \"runActivity.kind.TOOL_CALL\": \"Вызов инструмента\",\n \"runActivity.kind.AGENT_TEXT\": \"Заметка агента\",\n \"runActivity.kind.FILE_CHANGE\": \"Изменение файла\",\n \"runActivity.kind.PROVIDER_ERROR\": \"Ошибка провайдера\",\n \"runActivity.count\": \"{count}\",\n \"runActivity.countMore\": \"{count}+\",\n \"runActivity.loading\": \"Загружаем действия агента…\",\n \"runActivity.noActivity\": \"Действий агента пока не записано.\",\n \"runActivity.latestApproximate\": \"возможна более новая активность\",\n \"runActivity.untitled\": \"Действие\",\n \"runActivity.truncated\": \"Обрезано\",\n \"runActivity.degradedBadge\": \"Неполно\",\n \"runActivity.degraded\": \"Эта лента неполна: часть происходившего по этой задаче в неё не попала.\",\n \"runActivity.gap\":\n \"Список может быть неполным: Loomrail не может подтвердить, что здесь показаны все записанные действия этой задачи.\",\n \"runActivity.omitted\": \"{count} более ранних записей были отброшены из-за ограниченного хранения.\",\n \"runActivity.loadMore\": \"Показать ещё\",\n \"field.title\": \"название\",\n \"field.description\": \"описание\",\n \"field.priority\": \"приоритет\",\n \"field.risk\": \"риск\",\n \"field.acceptanceCriteria\": \"критерии приёмки\",\n} satisfies Record<keyof typeof en, string>;\n\nexport type Locale = \"en\" | \"ru\";\nexport type TranslationKey = keyof typeof en;\nexport type Translator = (\n key: TranslationKey,\n parameters?: Readonly<Record<string, string | number>>,\n) => string;\n\nconst messages: Record<Locale, Record<TranslationKey, string>> = { en, ru };\n\nexport const isLocale = (value: unknown): value is Locale => value === \"en\" || value === \"ru\";\n\nexport const readLocale = (): Locale => {\n const stored = window.localStorage.getItem(LOCALE_STORAGE_KEY);\n if (isLocale(stored)) return stored;\n return window.navigator.language.toLowerCase().startsWith(\"ru\") ? \"ru\" : \"en\";\n};\n\nexport const applyLocale = (locale: Locale): void => {\n window.localStorage.setItem(LOCALE_STORAGE_KEY, locale);\n document.documentElement.lang = locale;\n};\n\nexport const translate = (\n locale: Locale,\n key: TranslationKey,\n parameters: Readonly<Record<string, string | number>> = {},\n): string =>\n Object.entries(parameters).reduce(\n (message, [name, value]) => message.replaceAll(`{${name}}`, String(value)),\n messages[locale][key],\n );\n\ntype I18nContextValue = {\n locale: Locale;\n setLocale: (locale: Locale) => void;\n t: Translator;\n};\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\nexport const I18nProvider = ({ children }: { children: ReactNode }): React.JSX.Element => {\n const [locale, setLocaleState] = useState<Locale>(() => {\n const initialLocale = readLocale();\n applyLocale(initialLocale);\n return initialLocale;\n });\n const value = useMemo<I18nContextValue>(\n () => ({\n locale,\n setLocale: (nextLocale) => {\n applyLocale(nextLocale);\n setLocaleState(nextLocale);\n },\n t: (key, parameters) => translate(locale, key, parameters),\n }),\n [locale],\n );\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n};\n\nexport const useI18n = (): I18nContextValue => {\n const value = useContext(I18nContext);\n if (!value) throw new Error(\"useI18n must be rendered inside I18nProvider\");\n return value;\n};\n","export const panels = [\"sidebar\", \"inspector\"] as const;\nexport type PanelName = (typeof panels)[number];\n\ntype PanelBounds = { defaultWidth: number; max: number; min: number; property: string };\n\n/**\n * Width limits for the resizable panels.\n *\n * `defaultWidth` mirrors the design token of the same name; a unit test reads `tokens.css` and\n * fails if the two ever disagree, so the stylesheet stays the single source for the default.\n */\nexport const panelBounds: Record<PanelName, PanelBounds> = {\n sidebar: { defaultWidth: 240, max: 360, min: 200, property: \"--lr-size-sidebar\" },\n inspector: { defaultWidth: 344, max: 520, min: 280, property: \"--lr-size-inspector\" },\n};\n\nconst storageKey = (panel: PanelName): string => `loomrail-panel-${panel}`;\n\nexport const clampPanelWidth = (panel: PanelName, width: number): number => {\n const { max, min } = panelBounds[panel];\n if (!Number.isFinite(width)) return panelBounds[panel].defaultWidth;\n return Math.min(max, Math.max(min, Math.round(width)));\n};\n\nexport const readPanelWidth = (panel: PanelName): number => {\n const stored = window.localStorage.getItem(storageKey(panel));\n if (stored === null) return panelBounds[panel].defaultWidth;\n return clampPanelWidth(panel, Number(stored));\n};\n\n/**\n * Applies a panel width as a CSS custom property.\n *\n * The default clears the property and the stored value, so the stylesheet keeps ownership of the\n * default — including the narrower one it uses on smaller desktops.\n */\nexport const applyPanelWidth = (panel: PanelName, width: number): void => {\n const { defaultWidth, property } = panelBounds[panel];\n const clamped = clampPanelWidth(panel, width);\n if (clamped === defaultWidth) {\n document.documentElement.style.removeProperty(property);\n window.localStorage.removeItem(storageKey(panel));\n return;\n }\n\n document.documentElement.style.setProperty(property, `${clamped.toString()}px`);\n window.localStorage.setItem(storageKey(panel), clamped.toString());\n};\n\nexport const resetPanelWidths = (): void => {\n for (const panel of panels) applyPanelWidth(panel, panelBounds[panel].defaultWidth);\n};\n\nexport const hasCustomPanelWidths = (): boolean =>\n panels.some((panel) => window.localStorage.getItem(storageKey(panel)) !== null);\n","import { useEffect, useState } from \"react\";\n\nimport { useI18n } from \"../i18n\";\nimport { applyPanelWidth, clampPanelWidth, panelBounds, readPanelWidth, type PanelName } from \"../layout\";\n\nconst KEYBOARD_STEP = 16;\n\nexport type PanelResizerProps = {\n /** Which edge the handle sits on, which decides how pointer movement maps to width. */\n edge: \"start\" | \"end\";\n panel: PanelName;\n};\n\n/**\n * A draggable divider for a resizable panel.\n *\n * Implemented as a real `separator` with a value, so the panel can be resized from the keyboard as\n * well as by pointer. Width is written straight to the CSS custom property while dragging, which\n * keeps the panel following the pointer without re-rendering the board on every frame.\n */\nexport const PanelResizer = ({ edge, panel }: PanelResizerProps): React.JSX.Element => {\n const { t } = useI18n();\n const [width, setWidth] = useState(() => readPanelWidth(panel));\n const [dragging, setDragging] = useState(false);\n const { max, min } = panelBounds[panel];\n\n useEffect(() => {\n if (!dragging) return undefined;\n\n const move = (event: PointerEvent): void => {\n const next = edge === \"start\" ? event.clientX : window.innerWidth - event.clientX;\n const clamped = clampPanelWidth(panel, next);\n setWidth(clamped);\n applyPanelWidth(panel, clamped);\n };\n const stop = (): void => {\n setDragging(false);\n };\n\n document.body.classList.add(\"is-resizing\");\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", stop);\n // A cancelled pointer (touch scroll takeover, pen lift, window blur) never fires `pointerup`;\n // without this the body keeps `is-resizing` and the panel keeps following the next pointer.\n window.addEventListener(\"pointercancel\", stop);\n window.addEventListener(\"blur\", stop);\n return () => {\n document.body.classList.remove(\"is-resizing\");\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", stop);\n window.removeEventListener(\"pointercancel\", stop);\n window.removeEventListener(\"blur\", stop);\n };\n }, [dragging, edge, panel]);\n\n const nudge = (delta: number): void => {\n const clamped = clampPanelWidth(panel, width + delta);\n setWidth(clamped);\n applyPanelWidth(panel, clamped);\n };\n\n return (\n <div\n aria-label={t(`layout.resize.${panel}`)}\n aria-orientation=\"vertical\"\n aria-valuemax={max}\n aria-valuemin={min}\n aria-valuenow={width}\n className=\"panel-resizer\"\n onDoubleClick={() => {\n const { defaultWidth } = panelBounds[panel];\n setWidth(defaultWidth);\n applyPanelWidth(panel, defaultWidth);\n }}\n onKeyDown={(event) => {\n const towardsWider = edge === \"start\" ? \"ArrowRight\" : \"ArrowLeft\";\n const towardsNarrower = edge === \"start\" ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key !== towardsWider && event.key !== towardsNarrower) return;\n event.preventDefault();\n nudge(event.key === towardsWider ? KEYBOARD_STEP : -KEYBOARD_STEP);\n }}\n onPointerDown={(event) => {\n event.preventDefault();\n setWidth(readPanelWidth(panel));\n setDragging(true);\n }}\n role=\"separator\"\n tabIndex={0}\n />\n );\n};\n","import {\n attentionInboxResponseSchema,\n agentFleetResponseSchema,\n agentRunActivityPageSchema,\n apiErrorResponseSchema,\n constitutionPresetsResponseSchema,\n eventsResponseSchema,\n humanRequestsResponseSchema,\n insightsResponseSchema,\n launchMeasurementProjectResponseSchema,\n launchEvidencePackageResponseSchema,\n launchReleaseProjectResponseSchema,\n deploymentPreviewResponseSchema,\n guidedDeploymentProjectResponseSchema,\n mcpProfileProposalSchema,\n mcpProfilesResponseSchema,\n projectsResponseSchema,\n projectProviderAllowanceResponseSchema,\n projectProviderSelectionResponseSchema,\n projectWorkspaceStrategyResponseSchema,\n providerCapabilitiesResponseSchema,\n providerSessionsResponseSchema,\n qaDefectWaivedResultSchema,\n qaCorrectionGateResolvedResultSchema,\n verificationCorrectionGateResolvedResultSchema,\n qaStateResponseSchema,\n projectConstitutionSnapshotSchema,\n projectReadinessSnapshotSchema,\n reviewFindingDisposedResultSchema,\n reviewStateResponseSchema,\n proposeProjectScaffoldResponseSchema,\n scaffoldOperationResponseSchema,\n scaffoldOperationsResponseSchema,\n stateCommandResultSchema,\n workItemChangesResponseSchema,\n workItemDependenciesResponseSchema,\n workItemFileDiffResponseSchema,\n workItemsResponseSchema,\n workItemWorkspaceResponseSchema,\n workflowSnapshotSchema,\n verificationPlanSettingsResponseSchema,\n verificationRunSnapshotResponseSchema,\n verificationRunsResponseSchema,\n guidedActivationContract,\n type FixtureProjectId,\n type AcceptanceAction,\n type AcceptancePackage,\n type HumanRequest,\n type HumanRequestAnswer,\n type McpProfileCandidate,\n type McpProfileProposal,\n type McpProfileRevision,\n type ModelTier,\n type ConstitutionPresetId,\n type ConstitutionProposal,\n type ConstitutionPublication,\n type ListedProject,\n type LaunchMeasurementPlanConfiguration,\n type LaunchMeasurementProjectResponse,\n type LaunchMeasurementRun,\n type LaunchEnvironment,\n type LaunchEnvironmentConfiguration,\n type LaunchEvidencePackageResponse,\n type LaunchReleaseProjectResponse,\n type Deployment,\n type DeploymentPreviewResponse,\n type GuidedDeploymentProjectResponse,\n type ProjectReadinessRun,\n type ProjectWorkspaceStrategySelection,\n type QADefect,\n type QACorrectionGateAction,\n type QACorrectionRun,\n type VerificationCorrectionGateAction,\n type VerificationCorrectionRun,\n type ScaffoldOperation,\n type ScaffoldProposal,\n type ProviderPreference,\n type ReadinessAttestationOutcome,\n type ReadinessCheck,\n type ReviewFinding,\n type ReviewFindingOwnerDisposition,\n type PipelineRun,\n type WorkItem,\n type WorkItemDependency,\n type WorkItemState,\n type VerificationPlanPublication,\n type VerificationPlanSettingsResponse,\n type VerificationPlan,\n type VerificationRun,\n type VerificationRunSnapshotResponse,\n type WorkspaceStrategy,\n} from \"@loomrail/contracts\";\n\ntype RuntimeSchema<T> = {\n parse: (value: unknown) => T;\n};\n\nconst CSRF_STORAGE_KEY = \"loomrail.csrf-token\";\n\nexport type LocalApiRecovery = \"none\" | \"reopen\" | \"retry\";\n\ntype LocalApiErrorOptions = {\n code: string;\n correlationId?: string;\n message: string;\n recovery: LocalApiRecovery;\n status: number;\n};\n\nexport class LocalApiError extends Error {\n readonly code: string;\n readonly correlationId: string | undefined;\n readonly recovery: LocalApiRecovery;\n readonly status: number;\n\n constructor({ code, correlationId, message, recovery, status }: LocalApiErrorOptions) {\n super(message);\n this.name = \"LocalApiError\";\n this.code = code;\n this.correlationId = correlationId;\n this.recovery = recovery;\n this.status = status;\n }\n}\n\nconst recoveryFor = (code: string, status: number): LocalApiRecovery => {\n if ([\"BOOTSTRAP_REJECTED\", \"CSRF_REJECTED\", \"SESSION_REQUIRED\"].includes(code)) return \"reopen\";\n return status === 0 || status >= 500 ? \"retry\" : \"none\";\n};\n\nexport const readLocalApiError = async (response: Response): Promise<LocalApiError> => {\n const body: unknown = await response.json().catch(() => undefined);\n const parsed = apiErrorResponseSchema.safeParse(body);\n if (parsed.success) {\n return new LocalApiError({\n code: parsed.data.error.code,\n correlationId: parsed.data.error.correlationId,\n message: parsed.data.error.message,\n recovery: recoveryFor(parsed.data.error.code, response.status),\n status: response.status,\n });\n }\n return new LocalApiError({\n code: \"LOCAL_API_ERROR\",\n message: `Local daemon returned HTTP ${response.status.toString()}`,\n recovery: recoveryFor(\"LOCAL_API_ERROR\", response.status),\n status: response.status,\n });\n};\n\nexport const isLocalApiError = (error: unknown): error is LocalApiError => error instanceof LocalApiError;\n\nexport const createDaemonUnavailableError = (): LocalApiError =>\n new LocalApiError({\n code: \"LOCAL_DAEMON_UNAVAILABLE\",\n message: \"The local Loomrail daemon could not be reached\",\n recovery: \"retry\",\n status: 0,\n });\n\nconst readCsrfToken = (): string | undefined => window.sessionStorage.getItem(CSRF_STORAGE_KEY) ?? undefined;\n\nexport const storeCsrfToken = (csrfToken: string): void => {\n window.sessionStorage.setItem(CSRF_STORAGE_KEY, csrfToken);\n};\n\nconst fetchLocalApi = async (\n path: string,\n init: RequestInit = {},\n accept = \"application/json\",\n): Promise<Response> => {\n const method = (init.method ?? \"GET\").toUpperCase();\n const headers = new Headers(init.headers);\n headers.set(\"accept\", accept);\n\n if (init.body !== undefined) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n if (![\"GET\", \"HEAD\", \"OPTIONS\"].includes(method)) {\n const csrfToken = readCsrfToken();\n if (!csrfToken) {\n throw new LocalApiError({\n code: \"LOCAL_SESSION_REQUIRED\",\n message: \"The local session must be reopened before changing data\",\n recovery: \"reopen\",\n status: 0,\n });\n }\n headers.set(\"x-loomrail-csrf\", csrfToken);\n }\n\n let response: Response;\n try {\n response = await fetch(path, {\n ...init,\n credentials: \"same-origin\",\n headers,\n });\n } catch {\n throw createDaemonUnavailableError();\n }\n\n if (!response.ok) {\n throw await readLocalApiError(response);\n }\n\n return response;\n};\n\nexport const requestLocalApi = async <T>(\n path: string,\n schema: RuntimeSchema<T>,\n init: RequestInit = {},\n): Promise<T> => {\n const response = await fetchLocalApi(path, init);\n\n return schema.parse(await response.json());\n};\n\nexport const listProjects = async () => requestLocalApi(\"/api/v1/projects\", projectsResponseSchema);\n\nexport const getInsights = async () => requestLocalApi(\"/api/v1/insights\", insightsResponseSchema);\n\nexport const listConstitutionPresets = async () =>\n requestLocalApi(\"/api/v1/constitution-presets\", constitutionPresetsResponseSchema);\n\nexport const getProjectConstitution = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/constitution`,\n projectConstitutionSnapshotSchema,\n );\n\nexport const scanProjectConstitution = async (\n project: ListedProject,\n presetId?: ConstitutionPresetId,\n): Promise<ConstitutionProposal> => {\n const result = await requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(project.id)}/constitution/scan`,\n stateCommandResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: project.version,\n ...(presetId === undefined ? {} : { presetId }),\n }),\n },\n );\n if (result.type !== \"PROJECT_CONSTITUTION_PROPOSED\") {\n throw new Error(\"The local daemon returned an unexpected Constitution Proposal result\");\n }\n return result.proposal;\n};\n\nexport const adoptProjectConstitution = async (project: ListedProject, proposal: ConstitutionProposal) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(project.id)}/constitution/adopt`,\n projectConstitutionSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n proposalId: proposal.id,\n expectedProjectVersion: project.version,\n expectedProposalVersion: proposal.version,\n }),\n },\n );\n\nexport const retryProjectConstitutionPublication = async (\n projectId: string,\n publication: ConstitutionPublication,\n) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/constitution/publication/retry`,\n projectConstitutionSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n publicationId: publication.id,\n expectedVersion: publication.version,\n }),\n },\n );\n\nexport const getVerificationPlanSettings = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/verification-plan`,\n verificationPlanSettingsResponseSchema,\n );\n\nexport const adoptVerificationPlan = async (settings: VerificationPlanSettingsResponse) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(settings.projectId)}/verification-plan/adopt`,\n verificationPlanSettingsResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: settings.projectVersion,\n proposalHash: settings.proposal.proposalHash,\n }),\n },\n );\n\nexport const disableVerificationPlan = async (settings: VerificationPlanSettingsResponse) => {\n if (settings.plan === null) {\n throw new Error(\"A current verification Plan is required before it can be disabled\");\n }\n return requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(settings.projectId)}/verification-plan/disable`,\n verificationPlanSettingsResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: settings.projectVersion,\n expectedPlanRevision: settings.plan.revision,\n expectedPlanContentHash: settings.plan.contentHash,\n }),\n },\n );\n};\n\nexport const getLaunchMeasurement = async (projectId: string): Promise<LaunchMeasurementProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/launch-measurement`,\n launchMeasurementProjectResponseSchema,\n );\n\nexport const adoptLaunchMeasurementPlan = async (input: {\n configuration: LaunchMeasurementPlanConfiguration;\n snapshot: LaunchMeasurementProjectResponse;\n}): Promise<LaunchMeasurementProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.snapshot.projectId)}/launch-measurement/plan`,\n launchMeasurementProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.snapshot.projectVersion,\n configuration: input.configuration,\n }),\n },\n );\n\nexport const disableLaunchMeasurementPlan = async (input: {\n snapshot: LaunchMeasurementProjectResponse;\n}): Promise<LaunchMeasurementProjectResponse> => {\n if (input.snapshot.plan === null) throw new Error(\"An active launch measurement Plan is required\");\n return requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.snapshot.projectId)}/launch-measurement/plan/disable`,\n launchMeasurementProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.snapshot.projectVersion,\n expectedPlanRevision: input.snapshot.plan.revision,\n expectedPlanContentHash: input.snapshot.plan.contentHash,\n }),\n },\n );\n};\n\nexport const startLaunchMeasurement = async (input: {\n projectId: string;\n snapshot: LaunchMeasurementProjectResponse;\n}): Promise<LaunchMeasurementProjectResponse> => {\n if (input.snapshot.plan === null) throw new Error(\"An active launch measurement Plan is required\");\n return requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.projectId)}/launch-measurement/runs`,\n launchMeasurementProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedPlanRevision: input.snapshot.plan.revision,\n expectedPlanContentHash: input.snapshot.plan.contentHash,\n }),\n },\n );\n};\n\nexport const cancelLaunchMeasurement = async (input: {\n projectId: string;\n run: LaunchMeasurementRun;\n}): Promise<LaunchMeasurementProjectResponse> =>\n requestLocalApi(\n `/api/v1/launch-measurement-runs/${encodeURIComponent(input.run.id)}/cancel`,\n launchMeasurementProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: input.run.version,\n }),\n },\n );\n\nexport const getLaunchRelease = async (projectId: string): Promise<LaunchReleaseProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/launch-release`,\n launchReleaseProjectResponseSchema,\n );\n\nexport const saveLaunchEnvironment = async (input: {\n configuration: LaunchEnvironmentConfiguration;\n environment: LaunchEnvironment | null;\n snapshot: LaunchReleaseProjectResponse;\n}): Promise<LaunchReleaseProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.snapshot.projectId)}/launch-release/environments`,\n launchReleaseProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.snapshot.projectVersion,\n environmentId: input.environment?.id ?? null,\n expectedEnvironmentVersion: input.environment?.version ?? null,\n configuration: input.configuration,\n }),\n },\n );\n\nexport const createLaunchRelease = async (input: {\n environment: LaunchEnvironment;\n snapshot: LaunchReleaseProjectResponse;\n workItemIds: readonly string[];\n}): Promise<LaunchReleaseProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.snapshot.projectId)}/launch-release/releases`,\n launchReleaseProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.snapshot.projectVersion,\n environmentId: input.environment.id,\n expectedEnvironmentVersion: input.environment.version,\n expectedEnvironmentContentHash: input.environment.contentHash,\n workItemIds: input.workItemIds,\n }),\n },\n );\n\nexport const exportLaunchEvidencePackage = async (\n releaseId: string,\n): Promise<LaunchEvidencePackageResponse> =>\n requestLocalApi(\n `/api/v1/launch-releases/${encodeURIComponent(releaseId)}/evidence-package`,\n launchEvidencePackageResponseSchema,\n );\n\nexport const getGuidedDeployment = async (projectId: string): Promise<GuidedDeploymentProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/guided-deployment`,\n guidedDeploymentProjectResponseSchema,\n );\n\nexport const previewGuidedDeployment = async (\n projectId: string,\n releaseId: string,\n): Promise<DeploymentPreviewResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/guided-deployment/preview?releaseId=${encodeURIComponent(releaseId)}`,\n deploymentPreviewResponseSchema,\n );\n\nexport const adoptGuidedDeploymentPlan = async (input: {\n preview: DeploymentPreviewResponse;\n}): Promise<GuidedDeploymentProjectResponse> =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.preview.projectId)}/guided-deployment/plans`,\n guidedDeploymentProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.preview.projectVersion,\n releaseId: input.preview.releaseId,\n expectedReleaseContentHash: input.preview.releaseContentHash,\n }),\n },\n );\n\nexport const approveGuidedDeployment = async (input: {\n deployment: Deployment;\n}): Promise<GuidedDeploymentProjectResponse> =>\n requestLocalApi(\n `/api/v1/deployments/${encodeURIComponent(input.deployment.id)}/approve`,\n guidedDeploymentProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: input.deployment.version,\n approvalDigest: input.deployment.approvalDigest,\n }),\n },\n );\n\nexport const startGuidedDeployment = async (\n deployment: Deployment,\n): Promise<GuidedDeploymentProjectResponse> =>\n requestLocalApi(\n `/api/v1/deployments/${encodeURIComponent(deployment.id)}/start`,\n guidedDeploymentProjectResponseSchema,\n { method: \"POST\", body: JSON.stringify({ schemaVersion: 1 }) },\n );\n\nexport const observeGuidedDeployment = async (\n deployment: Deployment,\n): Promise<GuidedDeploymentProjectResponse> =>\n requestLocalApi(\n `/api/v1/deployments/${encodeURIComponent(deployment.id)}/observe`,\n guidedDeploymentProjectResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, commandId: crypto.randomUUID() }),\n },\n );\n\nexport const retryVerificationPlanPublication = async (\n projectId: string,\n publication: VerificationPlanPublication,\n) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/verification-plan/publication/retry`,\n verificationPlanSettingsResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n publicationId: publication.id,\n expectedVersion: publication.version,\n }),\n },\n );\n\nexport const getProjectReadiness = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/readiness`,\n projectReadinessSnapshotSchema,\n );\n\nexport const runProjectReadiness = async (project: ListedProject) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(project.id)}/readiness/run`,\n projectReadinessSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: project.version,\n }),\n },\n );\n\nexport const attestProjectReadiness = async (\n projectId: string,\n run: ProjectReadinessRun,\n check: ReadinessCheck,\n outcome: ReadinessAttestationOutcome,\n rationale: string,\n) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/readiness/attest`,\n projectReadinessSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n runId: run.id,\n checkId: check.id,\n expectedRunVersion: run.version,\n outcome,\n rationale,\n }),\n },\n );\n\nexport const listProjectWorkItems = async (projectId: string) =>\n requestLocalApi(`/api/v1/projects/${encodeURIComponent(projectId)}/work-items`, workItemsResponseSchema);\n\nexport const listProjectWorkItemDependencies = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/work-item-dependencies`,\n workItemDependenciesResponseSchema,\n );\n\nexport const activityPageSize = 30;\n\n/** Reads one page of an item's activity newest first; `before` continues from a page's `nextSequence`. */\nexport const listWorkItemEvents = async (projectId: string, workItemId: string, before?: number) => {\n const query = new URLSearchParams({\n aggregateId: workItemId,\n limit: activityPageSize.toString(),\n order: \"DESC\",\n projectId,\n ...(before === undefined ? {} : { before: before.toString() }),\n });\n return requestLocalApi(`/api/v1/events?${query.toString()}`, eventsResponseSchema);\n};\n\nexport const getWorkItemWorkflow = async (workItemId: string) =>\n requestLocalApi(`/api/v1/work-items/${encodeURIComponent(workItemId)}/workflow`, workflowSnapshotSchema);\n\nexport const listWorkItemVerificationRuns = async (workItemId: string) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/verification-runs`,\n verificationRunsResponseSchema,\n );\n\nexport const startWorkItemVerificationRun = async (input: {\n workItem: WorkItem;\n plan: VerificationPlan;\n retryOf?: VerificationRun;\n}): Promise<VerificationRunSnapshotResponse> =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(input.workItem.id)}/verification-runs`,\n verificationRunSnapshotResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedWorkItemVersion: input.workItem.version,\n expectedPlanRevision: input.plan.revision,\n expectedPlanContentHash: input.plan.contentHash,\n ...(input.retryOf === undefined\n ? {}\n : {\n retryOfRunId: input.retryOf.id,\n expectedRetryOfRunVersion: input.retryOf.version,\n }),\n }),\n },\n );\n\nexport const cancelVerificationRun = async (run: VerificationRun): Promise<VerificationRunSnapshotResponse> =>\n requestLocalApi(\n `/api/v1/verification-runs/${encodeURIComponent(run.id)}/cancel`,\n verificationRunSnapshotResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: run.version,\n }),\n },\n );\n\nexport const getVerificationCheckOutput = async (checkId: string): Promise<string> =>\n (\n await fetchLocalApi(`/api/v1/verification-checks/${encodeURIComponent(checkId)}/output`, {}, \"text/plain\")\n ).text();\n\n/** Where this work item's agent writes (spec §4): repository branch, base commit and worktree path. */\nexport const getWorkItemWorkspace = async (workItemId: string) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/workspace`,\n workItemWorkspaceResponseSchema,\n );\n\n/**\n * What this work item's agent changed in its worktree (spec E1.5 §5): one record per file, with\n * status and line counts, and the flag saying whether the list itself was cut.\n *\n * Answers `changes: null` -- with 200 -- for a work item that has no workspace, which is the\n * ordinary state of every prose-only stage rather than a failure, exactly as `getWorkItemWorkspace`\n * above answers `workspace: null` for the same condition.\n */\nexport const getWorkItemChanges = async (workItemId: string) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/changes`,\n workItemChangesResponseSchema,\n );\n\n/**\n * The unified diff of ONE file in that worktree.\n *\n * A second call rather than a field on the summary above, because spec D5 makes them two handles on\n * purpose: the summary is cheap and reread while a stage runs, a body is expensive and wanted only\n * for the file the owner expanded. A client that fetched every body to render a list would undo\n * that split at the one layer it is visible from.\n *\n * The path is a value read out of the summary and sent back, so it is encoded rather than\n * interpolated: a changed path may legally contain `&`, `#`, `+` or a space, and any of those\n * unencoded would arrive at the daemon as a different path -- or as a second query parameter.\n */\nexport const getWorkItemFileDiff = async (workItemId: string, path: string) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/changes/diff?path=${encodeURIComponent(path)}`,\n workItemFileDiffResponseSchema,\n );\n\nexport const listProviderSessions = async (stageAttemptId: string) =>\n requestLocalApi(\n `/api/v1/stage-attempts/${encodeURIComponent(stageAttemptId)}/sessions`,\n providerSessionsResponseSchema,\n );\n\nexport const getProviderCapabilities = async () =>\n requestLocalApi(\"/api/v1/provider/capabilities\", providerCapabilitiesResponseSchema);\n\nexport const getProjectProviderSelection = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/provider-selection`,\n projectProviderSelectionResponseSchema,\n );\n\nexport const getProjectWorkspaceStrategy = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/workspace-strategy`,\n projectWorkspaceStrategyResponseSchema,\n );\n\nexport const setProjectWorkspaceStrategy = async (\n selection: ProjectWorkspaceStrategySelection,\n strategy: WorkspaceStrategy,\n) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(selection.projectId)}/workspace-strategy`,\n projectWorkspaceStrategyResponseSchema,\n {\n method: \"PUT\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: selection.projectVersion,\n strategy,\n }),\n },\n );\n\nexport const setProjectProviderPreference = async (project: ListedProject, preference: ProviderPreference) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(project.id)}/provider-selection`,\n projectProviderSelectionResponseSchema,\n {\n method: \"PUT\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: project.version,\n preference,\n }),\n },\n );\n\nexport const refreshProjectProviderAvailability = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/provider-selection/refresh`,\n projectProviderSelectionResponseSchema,\n { method: \"POST\", body: JSON.stringify({ schemaVersion: 1 }) },\n );\n\nexport const getProjectProviderAllowance = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/provider/allowance?projectId=${encodeURIComponent(projectId)}`,\n projectProviderAllowanceResponseSchema,\n );\n\nexport const refreshProjectProviderAllowance = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/provider-allowance/refresh`,\n projectProviderAllowanceResponseSchema,\n { method: \"POST\", body: JSON.stringify({ schemaVersion: 1 }) },\n );\n\nexport const getProjectMcpProfiles = async (projectId: string) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/mcp-profiles`,\n mcpProfilesResponseSchema,\n );\n\nexport const proposeMcpProfile = async (\n projectId: string,\n expectedProjectVersion: number,\n candidate: McpProfileCandidate,\n) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/mcp-profile-proposals`,\n mcpProfileProposalSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n expectedProjectVersion,\n candidate,\n }),\n },\n );\n\nexport const proposeContext7Preset = async (projectId: string, expectedProjectVersion: number) =>\n requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/mcp-presets/context7/proposal`,\n mcpProfileProposalSchema,\n {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, expectedProjectVersion }),\n },\n );\n\nexport const confirmMcpProfile = async (proposal: McpProfileProposal) => {\n const result = await requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(proposal.projectId)}/mcp-profile-proposals/${encodeURIComponent(proposal.challengeId)}/confirm`,\n stateCommandResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: proposal.expectedProjectVersion,\n challengeId: proposal.challengeId,\n canonicalDigest: proposal.canonicalDigest,\n }),\n },\n );\n if (result.type !== \"MCP_PROFILE_CONSENTED\") {\n throw new Error(\"The local daemon returned an unexpected MCP consent result\");\n }\n return result;\n};\n\nexport const probeMcpProfile = async (projectId: string, revision: McpProfileRevision) => {\n const result = await requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(projectId)}/mcp-profiles/${encodeURIComponent(revision.id)}/probe`,\n stateCommandResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, commandId: crypto.randomUUID() }),\n },\n );\n if (result.type !== \"MCP_CAPABILITY_RECORDED\") {\n throw new Error(\"The local daemon returned an unexpected MCP probe result\");\n }\n return result.snapshot;\n};\n\nexport const grantMcpProfile = async (input: {\n projectId: string;\n expectedProjectVersion: number;\n revision: McpProfileRevision;\n expectedGrantVersion: number | null;\n tools: string[];\n}) => {\n const result = await requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.projectId)}/mcp-profiles/${encodeURIComponent(input.revision.id)}/grant`,\n stateCommandResultSchema,\n {\n method: \"PUT\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.expectedProjectVersion,\n expectedGrantVersion: input.expectedGrantVersion,\n tools: input.tools,\n ownerAttestsReadOnly: true,\n }),\n },\n );\n if (result.type !== \"MCP_GRANT_CHANGED\") {\n throw new Error(\"The local daemon returned an unexpected MCP grant result\");\n }\n return result;\n};\n\nexport const revokeMcpProfile = async (input: {\n projectId: string;\n expectedProjectVersion: number;\n revision: McpProfileRevision;\n expectedGrantVersion: number;\n}) => {\n const result = await requestLocalApi(\n `/api/v1/projects/${encodeURIComponent(input.projectId)}/mcp-profiles/${encodeURIComponent(input.revision.id)}/grant`,\n stateCommandResultSchema,\n {\n method: \"DELETE\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedProjectVersion: input.expectedProjectVersion,\n expectedGrantVersion: input.expectedGrantVersion,\n }),\n },\n );\n if (result.type !== \"MCP_GRANT_CHANGED\") {\n throw new Error(\"The local daemon returned an unexpected MCP revoke result\");\n }\n return result;\n};\n\nexport const listOpenHumanRequests = async (projectId: string) => {\n const query = new URLSearchParams({ projectId, status: \"OPEN\" });\n return requestLocalApi(`/api/v1/human-requests?${query.toString()}`, humanRequestsResponseSchema);\n};\n\nexport const getAttentionInbox = async () =>\n requestLocalApi(\"/api/v1/attention\", attentionInboxResponseSchema);\n\nexport const getAgentFleet = async () => requestLocalApi(\"/api/v1/agent-fleet\", agentFleetResponseSchema);\n\n/**\n * One page of a WorkItem's merged Run Activity feed (spec 128 / ADR-0034: `DAEMON_AUDITED`\n * workspace tool calls merged with each run's own `PROVIDER_REPORTED` account), served oldest\n * first and spanning every AgentRun the task has produced, not one run's own attempt.\n *\n * `after` is the opaque cursor the daemon handed back as `nextCursor` on a previous page -- never\n * constructed by this client. Omitting it reads from the start of the task's story, matching\n * `listWorkItemEvents`'s own `before`-less first page above.\n *\n * Replaces the deleted `GET /api/v1/agent-runs/:runId/activity` (Task 1/2): that route is gone\n * from the daemon entirely, so this is the only way this client reads Run Activity now.\n */\nexport const getWorkItemActivity = async (workItemId: string, after?: string) => {\n const query = after === undefined ? \"\" : `?after=${encodeURIComponent(after)}`;\n return requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/activity${query}`,\n agentRunActivityPageSchema,\n );\n};\n\nexport const getWorkItemReviews = async (workItemId: string) =>\n requestLocalApi(`/api/v1/work-items/${encodeURIComponent(workItemId)}/reviews`, reviewStateResponseSchema);\n\nexport const getWorkItemQA = async (workItemId: string) =>\n requestLocalApi(`/api/v1/work-items/${encodeURIComponent(workItemId)}/qa`, qaStateResponseSchema);\n\nexport const workItemQAAttachmentUrl = (workItemId: string, attachmentId: string): string =>\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/qa/attachments/${encodeURIComponent(attachmentId)}`;\n\nexport const workItemAcceptanceExportUrl = (workItemId: string, acceptancePackageId: string): string =>\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/acceptance/${encodeURIComponent(acceptancePackageId)}/export`;\n\nexport const registerFixtureProject = async (fixtureId: FixtureProjectId): Promise<void> => {\n await requestLocalApi(\"/api/v1/projects/fixtures/register\", stateCommandResultSchema, {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, commandId: crypto.randomUUID(), fixtureId }),\n });\n};\n\n/**\n * Registers a local Git repository the owner named as a Project (spec §4).\n *\n * Answers nothing on success for the same reason `registerFixtureProject` does not: the caller\n * refetches the Project list, which is where the new Project has to appear anyway. A refusal --\n * the path is not a repository, or it is a directory inside one -- arrives as an Error carrying the\n * daemon's own wording, which names the path and says what to do about it, and the caller shows\n * that rather than a sentence of its own.\n */\nexport const registerRepositoryProject = async (repositoryPath: string): Promise<void> => {\n await requestLocalApi(\"/api/v1/projects/register\", stateCommandResultSchema, {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, commandId: crypto.randomUUID(), repositoryPath }),\n });\n};\n\nexport const proposeNewProjectScaffold = async (targetPath: string): Promise<ScaffoldProposal> => {\n const result = await requestLocalApi(\"/api/v1/scaffolds/propose\", proposeProjectScaffoldResponseSchema, {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, recipeId: \"typescript-node\", targetPath }),\n });\n return result.proposal;\n};\n\nexport const listOpenProjectScaffolds = async (): Promise<ScaffoldOperation[]> => {\n const result = await requestLocalApi(\"/api/v1/scaffolds\", scaffoldOperationsResponseSchema);\n return result.operations;\n};\n\nexport const publishNewProjectScaffold = async (proposal: ScaffoldProposal): Promise<ScaffoldOperation> => {\n const result = await requestLocalApi(\"/api/v1/scaffolds/publish\", scaffoldOperationResponseSchema, {\n method: \"POST\",\n body: JSON.stringify({ schemaVersion: 1, commandId: crypto.randomUUID(), proposal }),\n });\n if (result.operation === null) throw new Error(\"The local daemon did not return the scaffold operation\");\n return result.operation;\n};\n\nexport const retryNewProjectScaffold = async (operation: ScaffoldOperation): Promise<ScaffoldOperation> => {\n const result = await requestLocalApi(\n `/api/v1/scaffolds/${encodeURIComponent(operation.id)}/retry`,\n scaffoldOperationResponseSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: operation.version,\n }),\n },\n );\n if (result.operation === null) throw new Error(\"The local daemon did not return the scaffold operation\");\n return result.operation;\n};\n\nexport type CreateWorkItemInput = {\n acceptanceCriteria: readonly string[];\n description: string;\n parentId?: string | null;\n priority: WorkItem[\"priority\"];\n projectId: string;\n risk: WorkItem[\"risk\"];\n title: string;\n type: WorkItem[\"type\"];\n};\n\nexport const createWorkItem = async (\n input: CreateWorkItemInput,\n commandId: string = crypto.randomUUID(),\n): Promise<WorkItem> => {\n const result = await requestLocalApi(\"/api/v1/work-items\", stateCommandResultSchema, {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId,\n projectId: input.projectId,\n parentId: input.parentId ?? null,\n type: input.type,\n title: input.title,\n description: input.description,\n priority: input.priority,\n risk: input.risk,\n acceptanceCriteria: input.acceptanceCriteria,\n }),\n });\n\n if (result.type !== \"WORK_ITEM_CREATED\") {\n throw new Error(\"The local daemon returned an unexpected create result\");\n }\n return result.workItem;\n};\n\nexport const setWorkItemDependencies = async (\n workItem: WorkItem,\n blockerWorkItemIds: readonly string[],\n): Promise<readonly WorkItemDependency[]> => {\n const result = await requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItem.id)}/dependencies`,\n stateCommandResultSchema,\n {\n method: \"PUT\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: workItem.version,\n blockerWorkItemIds,\n }),\n },\n );\n if (result.type !== \"WORK_ITEM_DEPENDENCIES_SET\") {\n throw new Error(\"The local daemon returned an unexpected dependency result\");\n }\n return result.dependencies;\n};\n\nexport const guidedActivationCreateCommandId = async (projectId: string): Promise<string> => {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(`${guidedActivationContract.createCommandId}:${projectId}`),\n );\n const projectDigest = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n return `${guidedActivationContract.createCommandId}:${projectDigest}`;\n};\n\nexport const createGuidedActivationWorkItem = async (projectId: string): Promise<WorkItem> =>\n createWorkItem(\n {\n ...guidedActivationContract.task,\n projectId,\n },\n await guidedActivationCreateCommandId(projectId),\n );\n\nexport const moveWorkItem = async (workItem: WorkItem, targetState: WorkItemState): Promise<WorkItem> => {\n const result = await requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItem.id)}/move`,\n stateCommandResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: workItem.version,\n targetState,\n }),\n },\n );\n\n if (result.type !== \"WORK_ITEM_MOVED\") {\n throw new Error(\"The local daemon returned an unexpected move result\");\n }\n return result.workItem;\n};\n\nexport type UpdateWorkItemPatch = Partial<\n Pick<WorkItem, \"acceptanceCriteria\" | \"description\" | \"priority\" | \"risk\" | \"title\">\n>;\n\nexport const updateWorkItem = async (workItem: WorkItem, patch: UpdateWorkItemPatch): Promise<WorkItem> => {\n const result = await requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItem.id)}`,\n stateCommandResultSchema,\n {\n method: \"PATCH\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: workItem.version,\n patch,\n }),\n },\n );\n\n if (result.type !== \"WORK_ITEM_UPDATED\") {\n throw new Error(\"The local daemon returned an unexpected update result\");\n }\n return result.workItem;\n};\n\nexport type PipelineStartPolicy = {\n orchestration?: import(\"@loomrail/contracts\").CodeBlindOrchestration;\n maxEstimatedTokens: number;\n modelTierOverride: ModelTier | null;\n agentRunMaxEstimatedTokensOverride: number | null;\n};\n\nexport const startPipeline = async (workItem: WorkItem, policy: PipelineStartPolicy) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItem.id)}/pipeline/start`,\n workflowSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: workItem.version,\n maxEstimatedTokens: policy.maxEstimatedTokens,\n modelTierOverride: policy.modelTierOverride,\n agentRunMaxEstimatedTokensOverride: policy.agentRunMaxEstimatedTokensOverride,\n ...(policy.orchestration === undefined ? {} : { orchestration: policy.orchestration }),\n }),\n },\n );\n\nexport const answerHumanRequest = async (request: HumanRequest, answer: HumanRequestAnswer) =>\n requestLocalApi(`/api/v1/human-requests/${encodeURIComponent(request.id)}/answer`, workflowSnapshotSchema, {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: request.version,\n answer,\n }),\n });\n\nexport const disposeReviewFinding = async (\n finding: ReviewFinding,\n disposition: ReviewFindingOwnerDisposition,\n reason: string,\n): Promise<ReviewFinding> => {\n const result = await requestLocalApi(\n `/api/v1/review-findings/${encodeURIComponent(finding.id)}/disposition`,\n reviewFindingDisposedResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: finding.version,\n disposition,\n reason,\n }),\n },\n );\n return result.finding;\n};\n\nexport const waiveQADefect = async (defect: QADefect, reason: string): Promise<QADefect> => {\n const result = await requestLocalApi(\n `/api/v1/qa-defects/${encodeURIComponent(defect.id)}/waive`,\n qaDefectWaivedResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: defect.version,\n reason,\n }),\n },\n );\n return result.defect;\n};\n\nexport const resolveQACorrectionGate = async (\n request: HumanRequest,\n correctionRun: QACorrectionRun | null,\n run: PipelineRun,\n action: QACorrectionGateAction,\n) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(request.workItemId)}/qa/correction-gate/${encodeURIComponent(request.id)}`,\n qaCorrectionGateResolvedResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedRequestVersion: request.version,\n correctionRunId: correctionRun?.id ?? null,\n expectedCorrectionVersion: correctionRun?.version ?? null,\n expectedPipelineRunVersion: run.version,\n action,\n }),\n },\n );\n\nexport const resolveVerificationCorrectionGate = async (\n request: HumanRequest,\n correctionRun: VerificationCorrectionRun | null,\n qaCorrectionRun: QACorrectionRun | null,\n run: PipelineRun,\n action: VerificationCorrectionGateAction,\n) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(request.workItemId)}/verification/correction-gate/${encodeURIComponent(request.id)}`,\n verificationCorrectionGateResolvedResultSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedRequestVersion: request.version,\n correctionRunId: correctionRun?.id ?? null,\n expectedCorrectionVersion: correctionRun?.version ?? null,\n qaCorrectionRunId: qaCorrectionRun?.id ?? null,\n expectedQACorrectionVersion: qaCorrectionRun?.version ?? null,\n expectedPipelineRunVersion: run.version,\n action,\n }),\n },\n );\n\nexport type PipelineControlAction = \"pause\" | \"resume\" | \"cancel\";\n\nexport const controlPipeline = async (workItemId: string, run: PipelineRun, action: PipelineControlAction) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/pipeline/${action}`,\n workflowSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: run.version,\n }),\n },\n );\n\nexport const approveBudgetOverride = async (\n workItemId: string,\n run: PipelineRun,\n maxEstimatedTokens: number,\n modelTierOverride: ModelTier | null,\n agentRunMaxEstimatedTokensOverride: number | null,\n) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/pipeline/budget-override`,\n workflowSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: run.version,\n maxEstimatedTokens,\n modelTierOverride,\n agentRunMaxEstimatedTokensOverride,\n }),\n },\n );\n\nexport const resolveAcceptance = async (\n workItemId: string,\n run: PipelineRun,\n acceptancePackage: AcceptancePackage,\n action: AcceptanceAction,\n reason: string | null = null,\n) =>\n requestLocalApi(\n `/api/v1/work-items/${encodeURIComponent(workItemId)}/acceptance/${encodeURIComponent(acceptancePackage.id)}/resolve`,\n workflowSnapshotSchema,\n {\n method: \"POST\",\n body: JSON.stringify({\n schemaVersion: 1,\n commandId: crypto.randomUUID(),\n expectedVersion: acceptancePackage.version,\n expectedRunVersion: run.version,\n action,\n reason,\n }),\n },\n );\n","import { Button, Icon } from \"@loomrail/ui\";\n\nimport { isLocalApiError } from \"../api\";\nimport { useI18n } from \"../i18n\";\n\ntype LocalConnectionRecoveryProps = {\n error: unknown;\n onRetry?: () => void;\n retrying?: boolean;\n};\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : \"The local operation could not be completed\";\n\nexport const LocalConnectionRecovery = ({\n error,\n onRetry,\n retrying = false,\n}: LocalConnectionRecoveryProps): React.JSX.Element => {\n const { t } = useI18n();\n const recovery = isLocalApiError(error) ? error.recovery : \"none\";\n\n if (recovery === \"none\") {\n return (\n <p className=\"local-operation-error\" role=\"alert\">\n {errorMessage(error)}\n </p>\n );\n }\n\n const reopen = recovery === \"reopen\";\n return (\n <section className=\"local-connection-recovery\" role=\"alert\">\n <span aria-hidden=\"true\" className=\"local-connection-recovery__icon\">\n <Icon name={reopen ? \"terminal\" : \"warning\"} size={16} />\n </span>\n <div>\n <strong>{t(reopen ? \"connection.recovery.reopenTitle\" : \"connection.recovery.retryTitle\")}</strong>\n <p>{t(reopen ? \"connection.recovery.reopenDescription\" : \"connection.recovery.retryDescription\")}</p>\n {reopen ? (\n <div className=\"local-connection-recovery__command\">\n <span>{t(\"connection.recovery.command\")}</span>\n <code>npx loomrail</code>\n </div>\n ) : null}\n </div>\n {!reopen && onRetry ? (\n <Button loading={retrying} onClick={onRetry} size=\"sm\" variant=\"secondary\">\n {t(\"connection.recovery.retryAction\")}\n </Button>\n ) : null}\n </section>\n );\n};\n","import {\n daemonStatusResponseSchema,\n sessionExchangeResponseSchema,\n type DaemonStatusResponse,\n} from \"@loomrail/contracts\";\nimport { queryOptions } from \"@tanstack/react-query\";\n\nimport {\n createDaemonUnavailableError,\n isLocalApiError,\n readLocalApiError,\n requestLocalApi,\n storeCsrfToken,\n} from \"./api\";\n\nexport type ConnectionResult =\n { status: \"connected\"; daemon: DaemonStatusResponse } | { status: \"error\"; error: Error; message: string };\n\nlet pendingBootstrapToken: string | null = null;\n\nconst exchangeBootstrapToken = async (bootstrapToken: string): Promise<void> => {\n let response: Response;\n try {\n response = await fetch(\"/api/session/exchange\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ bootstrapToken }),\n });\n } catch {\n throw createDaemonUnavailableError();\n }\n\n if (!response.ok) {\n throw await readLocalApiError(response);\n }\n\n const session = sessionExchangeResponseSchema.parse(await response.json());\n storeCsrfToken(session.csrfToken);\n};\n\nconst fetchDaemonStatus = async (): Promise<DaemonStatusResponse> => {\n return requestLocalApi(\"/api/v1/status\", daemonStatusResponseSchema);\n};\n\nexport const connectToLocalDaemon = async (): Promise<ConnectionResult> => {\n try {\n const fragment = new URLSearchParams(window.location.hash.slice(1));\n const bootstrapToken = fragment.get(\"bootstrap\");\n if (bootstrapToken) {\n pendingBootstrapToken = bootstrapToken;\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\n }\n if (pendingBootstrapToken) {\n await exchangeBootstrapToken(pendingBootstrapToken);\n pendingBootstrapToken = null;\n }\n\n return { status: \"connected\", daemon: await fetchDaemonStatus() };\n } catch (error: unknown) {\n // Keep the token only for a transient failure (daemon unreachable, 5xx); any definitive answer\n // -- rejected, or a 4xx the daemon will give again -- means re-posting it on every retry would\n // just repeat the same refusal in front of the status check that explains the real state.\n if (isLocalApiError(error) && error.recovery !== \"retry\") pendingBootstrapToken = null;\n const connectionError = error instanceof Error ? error : new Error(\"Could not connect to Loomrail\");\n return {\n status: \"error\",\n error: connectionError,\n message: connectionError.message,\n };\n }\n};\n\nexport const localConnectionQuery = queryOptions({\n queryKey: [\"local-daemon\", \"connection\"],\n queryFn: connectToLocalDaemon,\n staleTime: Number.POSITIVE_INFINITY,\n});\n","import type { ChangeStatus } from \"@loomrail/contracts\";\nimport type { BadgeTone } from \"@loomrail/ui\";\n\nimport { isLocalApiError } from \"./api\";\nimport type { TranslationKey } from \"./i18n\";\n\n/**\n * The largest measured median of one summary read in Task 7, rounded to a stable millisecond\n * boundary: 1,594 ms over a real 20,000-file repository. The original 750 ms in the plan was an\n * unmeasured working value; keeping it would schedule work faster than that repository can finish\n * it. This window applies only to change reads -- the rest of the event-driven workbench keeps the\n * channel's 50 ms coalescing window.\n */\nexport const SUMMARY_REFRESH_DEBOUNCE_MS = 1_600;\n\nexport type SummaryRefresher = (() => void) & { dispose: () => void };\n\n/**\n * Schedules one read at the end of a fixed window that starts with the first event in a burst.\n *\n * Later events do not move the deadline: a stage that publishes continuously must still refresh\n * while it is running. `dispose` makes closing the card cancel a read nobody can see.\n */\nexport const makeSummaryRefresher = (\n read: () => void | Promise<void>,\n windowMs: number = SUMMARY_REFRESH_DEBOUNCE_MS,\n): SummaryRefresher => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const refresh = (() => {\n timer ??= setTimeout(() => {\n timer = undefined;\n // A query client records its own read failure. Catch the returned promise here so a failed\n // background refresh does not also become an unhandled rejection in the browser.\n void Promise.resolve()\n .then(read)\n .catch(() => undefined);\n }, windowMs);\n }) as SummaryRefresher;\n refresh.dispose = () => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n };\n return refresh;\n};\n\n/**\n * How a changed file's status is named and toned.\n *\n * A `Record<ChangeStatus, …>` rather than a switch with a default, so adding a fifth status to the\n * contract fails `pnpm typecheck` here instead of silently rendering as whatever the default was.\n * The tone never carries the meaning on its own -- every row prints the label beside the colour\n * (AGENTS.md, \"Status/priority/severity must not rely on color alone\").\n */\nexport const changeStatusLabelKeys: Record<ChangeStatus, TranslationKey> = {\n ADDED: \"changes.status.ADDED\",\n MODIFIED: \"changes.status.MODIFIED\",\n DELETED: \"changes.status.DELETED\",\n RENAMED: \"changes.status.RENAMED\",\n};\n\nexport const changeStatusTones: Record<ChangeStatus, BadgeTone> = {\n ADDED: \"success\",\n MODIFIED: \"info\",\n DELETED: \"danger\",\n RENAMED: \"accent\",\n};\n\n/**\n * The sentence the card shows instead of a file list, for each refusal the two change handles can\n * answer with.\n *\n * Every code here is raised by `apps/daemon/src/server.ts` and nowhere else: the three a client's\n * own path can earn (400), the two a workspace can earn plus a baseline that is not recorded (409),\n * and the two this machine has to answer for (500). They are mapped to localized sentences rather\n * than shown as the daemon's own message, because that message is English prose built for a log and\n * this text is read by an owner who may have the cockpit in Russian.\n *\n * Each sentence says what happened and stops there. None of them offers an action, because Loomrail\n * has none to offer for any of these: nothing returns a deleted worktree, re-cuts a workspace, or\n * repairs a git installation from inside the cockpit, and a control that could only ever fail is\n * worse than the plain fact.\n */\nconst changesRefusalKeys: Readonly<Record<string, TranslationKey>> = {\n WORKSPACE_WORKTREE_MISSING: \"changes.error.WORKSPACE_WORKTREE_MISSING\",\n WORKSPACE_WORKTREE_UNREADABLE: \"changes.error.WORKSPACE_WORKTREE_UNREADABLE\",\n WORKSPACE_HAS_NO_BASELINE: \"changes.error.WORKSPACE_HAS_NO_BASELINE\",\n CHANGES_UNREADABLE: \"changes.error.CHANGES_UNREADABLE\",\n GIT_UNAVAILABLE: \"changes.error.GIT_UNAVAILABLE\",\n PATH_OUTSIDE_WORKSPACE: \"changes.error.PATH_OUTSIDE_WORKSPACE\",\n PATH_NOT_A_FILE: \"changes.error.PATH_NOT_A_FILE\",\n PATH_UNRESOLVABLE: \"changes.error.PATH_UNRESOLVABLE\",\n};\n\n/**\n * Which of those sentences a failed change read earns.\n *\n * Anything that is not a named refusal -- a daemon that stopped answering, a body that did not\n * parse, a code this build has never heard of -- falls back to one that claims nothing about the\n * cause. It must never fall back to silence or to an empty file list: an empty list is a claim that\n * the worktree is unchanged, and a read that did not happen is not entitled to make it (spec D7).\n */\nexport const changesRefusalKey = (error: unknown): TranslationKey =>\n (isLocalApiError(error) ? changesRefusalKeys[error.code] : undefined) ?? \"changes.error.other\";\n","import { eventSignalSchema, type EventSignal } from \"@loomrail/contracts\";\n\nexport const COALESCE_WINDOW_MS = 50;\n\ntype QueryScope = readonly string[];\n\n/**\n * Which cached scopes a signal makes stale.\n *\n * Query keys are prefix-shaped (workspace.tsx:39-48), so one entry per scope covers everything\n * nested under it. The stage-attempt scope is invalidated whole because events carry no attempt\n * id -- the client holds one or two attempts, so the cost is one refetch.\n *\n * A switch with a `never` check rather than a ternary on `=== \"WORK_ITEM\"`, because a third\n * `aggregateType` would otherwise degrade in silence: `eventSignalSchema` would accept the frame,\n * and everything that is not WORK_ITEM would quietly take the PROJECT branch and invalidate the\n * wrong keys. The daemon side of the same widening is caught by the compiler already -- publishing\n * a `DomainEvent`'s `aggregateType` (broadcasting-state.ts) is an assignment to `EventSignal`, so\n * an event type the frame schema does not list fails to compile there. This closes the other door:\n * widen the schema to match and this function stops compiling until its mapping is decided.\n */\nexport const scopesForSignal = (signal: EventSignal): readonly QueryScope[] => {\n switch (signal.aggregateType) {\n case \"WORK_ITEM\":\n // The two project-level subtrees a work-item event can change, named explicitly rather than\n // the whole `[\"projects\", id]` prefix: that prefix also holds the constitution, readiness,\n // MCP-profile and provider-selection queries, which are daemon-side git/filesystem scans and\n // change on none of these events -- with Settings open they were refetched on every burst.\n return [\n [\"attention\"],\n [\"agent-fleet\"],\n [\"projects\", signal.projectId, \"work-items\"],\n [\"projects\", signal.projectId, \"human-requests\"],\n [\"work-items\", signal.aggregateId],\n [\"stage-attempts\"],\n ];\n case \"PROJECT\":\n return [[\"attention\"], [\"agent-fleet\"], [\"projects\", signal.projectId], [\"projects\"]];\n default: {\n const unhandled: never = signal.aggregateType;\n throw new Error(`Unhandled event signal aggregate type: ${String(unhandled)}`);\n }\n }\n};\n\n/**\n * Collects signals arriving inside one window and flushes their union once.\n *\n * A running stage publishes in bursts -- session started, checkpoint, wind-down asked, session\n * ended -- and invalidating per signal would mean a refetch storm and a jumpy board. The deadline\n * is set by the first signal of a burst and never postponed by later ones, so a steadily\n * publishing stage still refreshes on schedule instead of starving.\n */\nexport const createSignalCoalescer = (\n flush: (scopes: readonly QueryScope[]) => void,\n windowMs: number = COALESCE_WINDOW_MS,\n): { push: (signal: EventSignal) => void; dispose: () => void } => {\n const pending = new Map<string, QueryScope>();\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const run = (): void => {\n timer = undefined;\n const scopes = [...pending.values()];\n pending.clear();\n if (scopes.length > 0) flush(scopes);\n };\n\n return {\n push: (signal) => {\n for (const scope of scopesForSignal(signal)) pending.set(scope.join(\"/\"), scope);\n timer ??= setTimeout(run, windowMs);\n },\n dispose: () => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n pending.clear();\n },\n };\n};\n\nexport type EventChannelStatus = \"connecting\" | \"live\" | \"closed\";\n\nconst EVENT_SOURCE_CLOSED = 2;\n\n// The connection query's key, named here rather than imported from session.ts so this module stays\n// free of app wiring. That duplication is only safe because eventStream.test.ts asserts this\n// mapping against `localConnectionQuery.queryKey` itself -- the test file is free to import\n// session.ts, so the drift this literal would otherwise invite is caught there.\nconst LOCAL_CONNECTION_SCOPE: QueryScope = [\"local-daemon\", \"connection\"];\n\n/**\n * Which cached scopes a change in channel status makes stale.\n *\n * A permanently closed channel means a non-200 response, which on this route means the session is\n * gone -- the condition the connection query already detects and the recovery panel already\n * explains. A reconnecting channel means nothing yet: the browser is retrying on its own and the\n * board's data is still good.\n */\nexport const scopesForChannelStatus = (status: EventChannelStatus): readonly QueryScope[] =>\n status === \"closed\" ? [LOCAL_CONNECTION_SCOPE] : [];\n\n/**\n * The subset of `EventSource` this module relies on.\n *\n * `EventSource` has no jsdom implementation, so tests drive this shape with a plain object double\n * instead of a real browser API -- keeping the milestone's no-new-dependencies rule intact.\n */\nexport type EventSourceLike = {\n readyState: number;\n onopen: ((event: unknown) => void) | null;\n onmessage: ((event: { data: string }) => void) | null;\n onerror: ((event: unknown) => void) | null;\n close: () => void;\n};\n\n/**\n * Wires an `EventSourceLike` to the coalescer, and turns a change of connection status into the\n * invalidation it implies.\n *\n * Three things here are load bearing (spec D3/D4). `invalidateAll()` on every `open` -- including\n * every reconnect, not only the first -- is what makes a dropped signal harmless: the channel\n * carries no sequence number and never replays, so catching up after any gap is done entirely by\n * refetching. Parsing each frame inside a `try` means a malformed or non-signal frame is dropped\n * rather than thrown, which would otherwise leave the channel silently mute after one bad frame.\n * And `announce` below is the entire mechanism by which a permanently closed channel becomes\n * visible to the app: the status is consumed here, by `scopesForChannelStatus`, and is not reported\n * outward. It used to be handed to the caller as well, threaded through the workspace context and\n * rendered by nothing -- a wire with nothing on the far end, which no test could tell from a broken\n * one. Anything that wants to *show* channel status should start from this function, not from a\n * status value some caller is already receiving.\n */\nexport const connectEventStream = (options: {\n source: EventSourceLike;\n invalidateAll: () => void;\n invalidateScopes: (scopes: readonly (readonly string[])[]) => void;\n /**\n * Called once the browser has given up on this source (`readyState` CLOSED). `EventSource`\n * retries transient drops on its own but never a non-200 response -- the daemon's stream cap\n * (`STREAM_LIMIT_REACHED`) or a passing 5xx -- and without a new source the tab would silently\n * stop receiving live updates for the rest of its life. The owner of the source decides when to\n * build the next one; this only reports that the current one is dead.\n */\n onClosed?: () => void;\n windowMs?: number;\n}): (() => void) => {\n const coalescer = createSignalCoalescer(options.invalidateScopes, options.windowMs);\n\n const announce = (status: EventChannelStatus): void => {\n const scopes = scopesForChannelStatus(status);\n if (scopes.length > 0) options.invalidateScopes(scopes);\n if (status === \"closed\") options.onClosed?.();\n };\n\n options.source.onopen = () => {\n announce(\"live\");\n options.invalidateAll();\n };\n\n options.source.onmessage = (message) => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(message.data);\n } catch {\n return;\n }\n const signal = eventSignalSchema.safeParse(parsed);\n if (!signal.success) return;\n coalescer.push(signal.data);\n };\n\n options.source.onerror = () => {\n // Routed through the same invalidateScopes callback the coalescer uses, rather than a branch in\n // the hook: this makes the closed -> \"session is gone\" decision reachable through the\n // injected-double tests in this file, not only by hand-tracing a useEffect.\n announce(options.source.readyState === EVENT_SOURCE_CLOSED ? \"closed\" : \"connecting\");\n };\n\n return () => {\n coalescer.dispose();\n options.source.close();\n };\n};\n","import { useQueryClient, type QueryClient } from \"@tanstack/react-query\";\nimport { useEffect, useState } from \"react\";\n\nimport { makeSummaryRefresher, SUMMARY_REFRESH_DEBOUNCE_MS, type SummaryRefresher } from \"./changesView\";\nimport { connectEventStream, type EventSourceLike } from \"./eventStream\";\n\ntype QueryScope = readonly string[];\n\n// How long a tab waits before building a new EventSource after the browser gave up on the old one.\nexport const STREAM_RECONNECT_DELAY_MS = 5_000;\n\nconst queryStartsWith = (queryKey: readonly unknown[], scope: QueryScope): boolean =>\n scope.every((part, index) => queryKey[index] === part);\n\nconst isChangesQuery = (queryKey: readonly unknown[], workItemId: string): boolean =>\n queryKey[0] === \"work-items\" && queryKey[1] === workItemId && queryKey[2] === \"changes\";\n\n/** The predicate used for the immediate half of a WORK_ITEM invalidation, exported for mutation tests. */\nexport const shouldInvalidateImmediately = (queryKey: readonly unknown[], scope: QueryScope): boolean => {\n if (!queryStartsWith(queryKey, scope)) return false;\n const workItemId = scope.length === 2 && scope[0] === \"work-items\" ? scope[1] : undefined;\n return workItemId === undefined || !isChangesQuery(queryKey, workItemId);\n};\n\n/**\n * Turns channel scopes into query invalidations while giving expensive change reads their own\n * measured cadence.\n *\n * A WORK_ITEM signal still invalidates workflow, workspace and every other card query immediately.\n * Summary and file-diff queries are excluded from that pass and invalidated together after the\n * measured window. React Query refetches active queries only: the summary is active while its card\n * is open, and a body is active only for the one expanded file. A closed card therefore performs no\n * read at all.\n */\nexport const createEventQueryInvalidator = (\n queryClient: QueryClient,\n summaryWindowMs: number = SUMMARY_REFRESH_DEBOUNCE_MS,\n): {\n invalidateAll: () => void;\n invalidateScopes: (scopes: readonly QueryScope[]) => void;\n dispose: () => void;\n} => {\n const summaryRefreshers = new Map<string, SummaryRefresher>();\n\n const dispose = (): void => {\n for (const refresher of summaryRefreshers.values()) refresher.dispose();\n summaryRefreshers.clear();\n };\n\n const scheduleChanges = (workItemId: string): void => {\n let refresher = summaryRefreshers.get(workItemId);\n if (!refresher) {\n refresher = makeSummaryRefresher(async () => {\n summaryRefreshers.delete(workItemId);\n await queryClient.invalidateQueries({\n queryKey: [\"work-items\", workItemId, \"changes\"],\n refetchType: \"active\",\n });\n }, summaryWindowMs);\n summaryRefreshers.set(workItemId, refresher);\n }\n refresher();\n };\n\n return {\n invalidateAll: () => {\n // Reconnect is a full catch-up read (ADR-0002), so an older delayed change read would only\n // duplicate it. Cancel the delayed work before invalidating the complete cache.\n dispose();\n void queryClient.invalidateQueries();\n },\n invalidateScopes: (scopes) => {\n for (const scope of scopes) {\n const workItemId = scope.length === 2 && scope[0] === \"work-items\" ? scope[1] : undefined;\n if (workItemId !== undefined) {\n void queryClient.invalidateQueries({\n predicate: (query) => shouldInvalidateImmediately(query.queryKey, scope),\n });\n scheduleChanges(workItemId);\n continue;\n }\n void queryClient.invalidateQueries({ queryKey: scope });\n }\n },\n dispose,\n };\n};\n\n/**\n * Follows the daemon's SSE channel while `enabled`.\n *\n * All decision logic lives in `connectEventStream` and `scopesForChannelStatus`, both tested\n * against an injected source double -- see eventStream.test.ts. This hook is deliberately thin: it\n * owns only the real `EventSource`. In particular, what a closed channel means (the session is gone;\n * invalidate the same connection query the app already uses to detect and explain an unreachable\n * daemon) is decided by `scopesForChannelStatus` and reaches the query client through the\n * `invalidateScopes` callback below -- not through a branch here, so that decision stays covered by\n * connectEventStream's tests instead of living only in an untestable effect.\n *\n * Returns nothing on purpose. It used to return a status that the workspace context carried and no\n * component ever read; a value with no reader cannot be told from a broken one by any test, so it\n * is gone rather than left as a wire waiting for an end. Reinstating it is a change to make\n * alongside the component that renders it.\n */\nexport const useEventStream = (enabled: boolean): void => {\n const queryClient = useQueryClient();\n // Bumped when the browser gives up on the current source, so the effect below builds a fresh\n // one. `EventSource` never retries a non-200 response by itself (the daemon's stream cap, a\n // passing 5xx), and a tab whose source died that way used to stay silent until a reload.\n const [generation, setGeneration] = useState(0);\n\n useEffect(() => {\n if (!enabled) return;\n // `EventSource`'s handler properties are typed against the DOM `Event`, narrower than the\n // `unknown` `connectEventStream` accepts so it can be driven by a plain-object double in\n // tests (EventSource has no jsdom implementation). The real browser type is a structural\n // superset of EventSourceLike, so this bridges an interop mismatch, not an unsafe widening.\n const source = new EventSource(\"/api/v1/stream\") as unknown as EventSourceLike;\n const invalidator = createEventQueryInvalidator(queryClient);\n let reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n const disconnect = connectEventStream({\n source,\n invalidateAll: invalidator.invalidateAll,\n invalidateScopes: invalidator.invalidateScopes,\n onClosed: () => {\n // A fixed delay rather than an immediate retry: the usual cause is a stream slot that\n // another tab still holds, and the reconnect is one GET the daemon answers instantly. The\n // connection query is invalidated separately, so a session that is really gone still\n // shows its recovery panel while this waits.\n reconnectTimer ??= setTimeout(() => {\n setGeneration((current) => current + 1);\n }, STREAM_RECONNECT_DELAY_MS);\n },\n });\n return () => {\n if (reconnectTimer !== undefined) clearTimeout(reconnectTimer);\n disconnect();\n invalidator.dispose();\n };\n }, [enabled, queryClient, generation]);\n};\n","/* eslint-disable react-refresh/only-export-components -- workspace hooks intentionally share their provider module */\nimport { createContext, useContext, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useInfiniteQuery, useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n AcceptanceAction,\n AcceptancePackage,\n HumanRequest,\n ConstitutionPresetId,\n ConstitutionProposal,\n ConstitutionPublication,\n FixtureProjectId,\n HumanRequestAnswer,\n LaunchMeasurementPlanConfiguration,\n LaunchMeasurementProjectResponse,\n LaunchMeasurementRun,\n LaunchEnvironment,\n LaunchEnvironmentConfiguration,\n LaunchEvidencePackageResponse,\n LaunchReleaseProjectResponse,\n Deployment,\n DeploymentPreviewResponse,\n ListedProject,\n McpProfileCandidate,\n McpProfileProposal,\n McpProfileRevision,\n ModelTier,\n ProjectWorkspaceStrategySelection,\n ProjectReadinessRun,\n ProviderPreference,\n QACorrectionGateAction,\n QACorrectionRun,\n VerificationCorrectionGateAction,\n VerificationCorrectionRun,\n QADefect,\n ReadinessAttestationOutcome,\n ReadinessCheck,\n ReviewFinding,\n ReviewFindingOwnerDisposition,\n ScaffoldOperation,\n ScaffoldProposal,\n PipelineRun,\n WorkItem,\n WorkItemDependency,\n WorkItemState,\n VerificationPlanPublication,\n VerificationPlanSettingsResponse,\n VerificationRun,\n WorkspaceStrategy,\n} from \"@loomrail/contracts\";\n\nimport {\n approveBudgetOverride,\n adoptLaunchMeasurementPlan,\n adoptProjectConstitution,\n attestProjectReadiness,\n answerHumanRequest,\n controlPipeline,\n createWorkItem,\n createGuidedActivationWorkItem,\n disposeReviewFinding,\n disableLaunchMeasurementPlan,\n disableVerificationPlan,\n getLaunchMeasurement,\n getProviderCapabilities,\n getProjectProviderAllowance,\n getProjectProviderSelection,\n getProjectWorkspaceStrategy,\n getProjectMcpProfiles,\n getProjectConstitution,\n getProjectReadiness,\n getVerificationPlanSettings,\n getAttentionInbox,\n getAgentFleet,\n getInsights,\n getWorkItemActivity,\n getWorkItemChanges,\n getWorkItemFileDiff,\n getWorkItemQA,\n getWorkItemReviews,\n getWorkItemWorkflow,\n getWorkItemWorkspace,\n getVerificationCheckOutput,\n listOpenHumanRequests,\n listOpenProjectScaffolds,\n listConstitutionPresets,\n listProjects,\n listProjectWorkItems,\n listProjectWorkItemDependencies,\n listProviderSessions,\n listWorkItemEvents,\n listWorkItemVerificationRuns,\n confirmMcpProfile,\n grantMcpProfile,\n moveWorkItem,\n publishNewProjectScaffold,\n registerFixtureProject,\n registerRepositoryProject,\n refreshProjectProviderAvailability,\n refreshProjectProviderAllowance,\n probeMcpProfile,\n proposeContext7Preset,\n proposeMcpProfile,\n proposeNewProjectScaffold,\n retryNewProjectScaffold,\n retryProjectConstitutionPublication,\n retryVerificationPlanPublication,\n startLaunchMeasurement,\n startWorkItemVerificationRun,\n cancelLaunchMeasurement,\n cancelVerificationRun,\n createLaunchRelease,\n exportLaunchEvidencePackage,\n getLaunchRelease,\n runProjectReadiness,\n saveLaunchEnvironment,\n resolveAcceptance,\n resolveQACorrectionGate,\n resolveVerificationCorrectionGate,\n startPipeline,\n scanProjectConstitution,\n setProjectProviderPreference,\n setProjectWorkspaceStrategy,\n setWorkItemDependencies,\n adoptVerificationPlan,\n adoptGuidedDeploymentPlan,\n approveGuidedDeployment,\n getGuidedDeployment,\n observeGuidedDeployment,\n previewGuidedDeployment,\n startGuidedDeployment,\n revokeMcpProfile,\n updateWorkItem,\n waiveQADefect,\n type CreateWorkItemInput,\n type PipelineControlAction,\n type PipelineStartPolicy,\n type UpdateWorkItemPatch,\n} from \"./api\";\nimport { localConnectionQuery, type ConnectionResult } from \"./session\";\nimport { useEventStream } from \"./useEventStream\";\n\nconst projectsKey = [\"projects\"] as const;\nconst attentionKey = [\"attention\"] as const;\nconst agentFleetKey = [\"agent-fleet\"] as const;\nconst insightsKey = [\"insights\"] as const;\nconst constitutionPresetsKey = [\"constitution-presets\"] as const;\nconst projectConstitutionKey = (projectId: string) => [\"projects\", projectId, \"constitution\"] as const;\nconst projectReadinessKey = (projectId: string) => [\"projects\", projectId, \"readiness\"] as const;\nconst projectVerificationPlanKey = (projectId: string) =>\n [\"projects\", projectId, \"verification-plan\"] as const;\nconst projectLaunchMeasurementKey = (projectId: string) =>\n [\"projects\", projectId, \"launch-measurement\"] as const;\nconst projectLaunchReleaseKey = (projectId: string) => [\"projects\", projectId, \"launch-release\"] as const;\nconst projectGuidedDeploymentKey = (projectId: string) =>\n [\"projects\", projectId, \"guided-deployment\"] as const;\nconst projectGuidedDeploymentPreviewKey = (projectId: string, releaseId: string) =>\n [\"projects\", projectId, \"guided-deployment\", \"preview\", releaseId] as const;\nconst projectWorkItemsKey = (projectId: string) => [\"projects\", projectId, \"work-items\"] as const;\nconst projectWorkItemDependenciesKey = (projectId: string) =>\n [\"projects\", projectId, \"work-items\", \"dependencies\"] as const;\nconst workItemEventsKey = (projectId: string, workItemId: string) =>\n [\"projects\", projectId, \"work-items\", workItemId, \"events\"] as const;\n// Nested under the same `[\"work-items\", <id>]` prefix a WORK_ITEM channel signal invalidates\n// whole (eventStream.ts, scopesForSignal), which is what makes BOTH sources of this feed live\n// without any change to eventStream.ts. The DAEMON_AUDITED side gets there via the ordinary\n// Event log: every `WORKSPACE_TOOL_CALL_CHANGED` Event carries this work item as its aggregate,\n// and broadcastingState publishes a WORK_ITEM signal for every committed Event. The\n// PROVIDER_REPORTED side records no Event (activity.ts) but is not silent either: the session loop\n// publishes its own debounced WORK_ITEM signal straight to the channel after each drain\n// (session-loop.ts, publishActivitySignal, called from the same place that marks a feed\n// `degraded`) -- a second, direct publish path into the same channel, not routed through the Event\n// log at all. Both land on the same scope this key sits under, so one query key covers both.\n//\n// Spec 128 rescoped the feed itself from one AgentRun to the whole WorkItem, and this key follows:\n// no `agentRunId` segment, since one query now covers the task's entire run history. That is also\n// what keeps `useWorkItemActivity` (below) usable across a stage transition without a query-key\n// change of its own -- the previous per-run key meant a fresh AgentRun forced a fresh query\n// (loading state, no data yet) even though the owner was still looking at the same task.\nconst workItemActivityKey = (workItemId: string) => [\"work-items\", workItemId, \"activity\"] as const;\nconst workItemWorkflowKey = (workItemId: string) => [\"work-items\", workItemId, \"workflow\"] as const;\nconst workItemVerificationRunsKey = (workItemId: string) =>\n [\"work-items\", workItemId, \"verification-runs\"] as const;\nconst workItemReviewsKey = (workItemId: string) => [\"work-items\", workItemId, \"reviews\"] as const;\nconst workItemQAKey = (workItemId: string) => [\"work-items\", workItemId, \"qa\"] as const;\n// Nested under the same `[\"work-items\", <id>]` prefix the event channel invalidates for a WORK_ITEM\n// signal (eventStream.ts, scopesForSignal), so a stage that cuts a workspace refreshes the card\n// without a reload and without a second entry in that mapping.\nconst workItemWorkspaceKey = (workItemId: string) => [\"work-items\", workItemId, \"workspace\"] as const;\n// Both change keys sit under that same `[\"work-items\", <id>]` prefix. The event bridge deliberately\n// excludes this subtree from its immediate 50 ms invalidation and refreshes it on the separately\n// measured SUMMARY_REFRESH_DEBOUNCE_MS cadence (useEventStream.ts): an open card rereads the\n// summary, and only the one body query mounted for an expanded file. An inactive query is marked\n// stale but not fetched, so a closed card does no work.\nconst workItemChangesKey = (workItemId: string) => [\"work-items\", workItemId, \"changes\"] as const;\nconst workItemFileDiffKey = (workItemId: string, path: string) =>\n [\"work-items\", workItemId, \"changes\", \"diff\", path] as const;\nconst projectHumanRequestsKey = (projectId: string) =>\n [\"projects\", projectId, \"human-requests\", \"OPEN\"] as const;\nconst stageAttemptSessionsKey = (stageAttemptId: string) =>\n [\"stage-attempts\", stageAttemptId, \"sessions\"] as const;\nconst providerCapabilitiesKey = [\"provider\", \"capabilities\"] as const;\nconst projectProviderSelectionKey = (projectId: string) =>\n [\"projects\", projectId, \"provider-selection\"] as const;\nconst projectWorkspaceStrategyKey = (projectId: string) =>\n [\"projects\", projectId, \"workspace-strategy\"] as const;\nconst projectProviderAllowanceKey = (projectId: string) =>\n [\"projects\", projectId, \"provider-allowance\"] as const;\nconst projectMcpProfilesKey = (projectId: string) => [\"projects\", projectId, \"mcp-profiles\"] as const;\nconst openProjectScaffoldsKey = [\"project-scaffolds\", \"open\"] as const;\n\ntype WorkspaceContextValue = {\n connection: ConnectionResult | undefined;\n connectionPending: boolean;\n error: Error | null;\n projects: readonly ListedProject[];\n projectsPending: boolean;\n selectedProject: ListedProject | null;\n retryConnection: () => void;\n selectProject: (projectId: string) => void;\n};\n\nconst WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\nexport const WorkspaceProvider = ({ children }: { children: ReactNode }): React.JSX.Element => {\n const connectionQuery = useQuery(localConnectionQuery);\n const connected = connectionQuery.data?.status === \"connected\";\n const projectsQuery = useQuery({\n queryKey: projectsKey,\n queryFn: listProjects,\n enabled: connected,\n });\n const [requestedProjectId, setRequestedProjectId] = useState<string | null>(null);\n const projects = projectsQuery.data?.projects ?? [];\n const selectedProject =\n projects.find((project) => project.id === requestedProjectId) ?? projects.at(0) ?? null;\n // Nothing is returned: the channel's only effect on this component tree is the invalidation it\n // performs through the query client (see useEventStream), not a status anything renders.\n useEventStream(connected);\n\n const value = useMemo<WorkspaceContextValue>(\n () => ({\n connection: connectionQuery.data,\n connectionPending: connectionQuery.isPending,\n error:\n connectionQuery.data?.status === \"error\"\n ? connectionQuery.data.error\n : connectionQuery.error instanceof Error\n ? connectionQuery.error\n : projectsQuery.error instanceof Error\n ? projectsQuery.error\n : null,\n projects,\n projectsPending: connected && projectsQuery.isPending,\n retryConnection: () => {\n void connectionQuery.refetch().then((result) => {\n if (result.data?.status === \"connected\") void projectsQuery.refetch();\n });\n },\n selectedProject,\n selectProject: setRequestedProjectId,\n }),\n [\n connected,\n connectionQuery.data,\n connectionQuery.error,\n connectionQuery.isPending,\n connectionQuery.refetch,\n projects,\n projectsQuery.error,\n projectsQuery.isPending,\n projectsQuery.refetch,\n selectedProject,\n ],\n );\n\n return <WorkspaceContext.Provider value={value}>{children}</WorkspaceContext.Provider>;\n};\n\nexport const useWorkspace = (): WorkspaceContextValue => {\n const value = useContext(WorkspaceContext);\n if (!value) throw new Error(\"useWorkspace must be rendered inside WorkspaceProvider\");\n return value;\n};\n\nexport const useProjectWorkItems = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectWorkItemsKey(projectId) : [\"projects\", \"none\", \"work-items\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to list work items\");\n return listProjectWorkItems(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useProjectWorkItemDependencies = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId\n ? projectWorkItemDependenciesKey(projectId)\n : [\"projects\", \"none\", \"work-items\", \"dependencies\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to list WorkItem dependencies\");\n return listProjectWorkItemDependencies(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useAttentionInbox = () =>\n useQuery({\n queryKey: attentionKey,\n queryFn: getAttentionInbox,\n });\n\nexport const useAgentFleet = () =>\n useQuery({\n queryKey: agentFleetKey,\n queryFn: getAgentFleet,\n });\n\n/**\n * A WorkItem's merged Run Activity feed (spec 128 / ADR-0034), read oldest first and paged forward\n * with `nextCursor` -- \"the task's story\", not a newest-first ticker. Spans every AgentRun the task\n * has produced, not only the current stage attempt's: an action audited on an earlier stage stays\n * visible here after the pipeline advances past it. The first page is fetched eagerly (one bounded\n * round trip, nowhere near \"paging the whole feed\") so `degraded`/`omittedCount` are known as soon\n * as the WorkItem is; RunActivitySection.tsx gates only the *rendering* of the full list behind the\n * owner's own expand (spec: \"не становится основным содержимым Cockpit\"), and fetches further\n * pages only on an explicit \"Show more\", never walked automatically to find a tail. That is also\n * why the collapsed summary prefers Agent Fleet's own newest-first `latestAction` (`useAgentFleet`)\n * over this oldest-first page's own last row.\n */\nexport const useWorkItemActivity = (workItemId: string | undefined) =>\n useInfiniteQuery({\n queryKey: workItemId ? workItemActivityKey(workItemId) : [\"work-items\", \"none\", \"activity\"],\n queryFn: ({ pageParam }: { pageParam: string | undefined }) => {\n if (!workItemId) throw new Error(\"A WorkItem is required to load its Run Activity\");\n return getWorkItemActivity(workItemId, pageParam);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,\n enabled: workItemId !== undefined,\n });\n\nexport const useInsights = () =>\n useQuery({\n queryKey: insightsKey,\n queryFn: getInsights,\n });\n\n/**\n * Activity is append-only and read newest first, so pages are cursors into the past. Refetching\n * re-derives every cursor from the page before it, which keeps Events that arrive while older\n * pages are open from falling into the gap between two page boundaries.\n */\nexport const useWorkItemEvents = (projectId: string | undefined, workItemId: string | undefined) =>\n useInfiniteQuery({\n queryKey:\n projectId && workItemId\n ? workItemEventsKey(projectId, workItemId)\n : [\"projects\", \"none\", \"work-items\", \"none\", \"events\"],\n queryFn: ({ pageParam }) => {\n if (!projectId || !workItemId) throw new Error(\"A project and work item are required to list activity\");\n return listWorkItemEvents(projectId, workItemId, pageParam);\n },\n initialPageParam: undefined as number | undefined,\n getNextPageParam: (lastPage) => (lastPage.hasMore ? lastPage.nextSequence : undefined),\n enabled: projectId !== undefined && workItemId !== undefined,\n });\n\nexport const useWorkItemWorkflow = (workItemId: string | undefined) =>\n useQuery({\n queryKey: workItemId ? workItemWorkflowKey(workItemId) : [\"work-items\", \"none\", \"workflow\"],\n queryFn: () => {\n if (!workItemId) throw new Error(\"A work item is required to load its workflow\");\n return getWorkItemWorkflow(workItemId);\n },\n enabled: workItemId !== undefined,\n });\n\nexport const useWorkItemVerificationRuns = (workItemId: string | undefined) =>\n useQuery({\n queryKey: workItemId\n ? workItemVerificationRunsKey(workItemId)\n : [\"work-items\", \"none\", \"verification-runs\"],\n queryFn: () => {\n if (!workItemId) throw new Error(\"A work item is required to list verification Runs\");\n return listWorkItemVerificationRuns(workItemId);\n },\n enabled: workItemId !== undefined,\n });\n\nexport const useStartVerificationRun = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: startWorkItemVerificationRun,\n onSuccess: async (snapshot) => {\n await queryClient.invalidateQueries({\n queryKey: workItemVerificationRunsKey(snapshot.run.workItemId),\n });\n },\n });\n};\n\nexport const useCancelVerificationRun = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (run: VerificationRun) => cancelVerificationRun(run),\n onSuccess: async (snapshot) => {\n await queryClient.invalidateQueries({\n queryKey: workItemVerificationRunsKey(snapshot.run.workItemId),\n });\n },\n });\n};\n\nexport const useVerificationCheckOutput = () =>\n useMutation<string, Error, string>({ mutationFn: getVerificationCheckOutput });\n\nexport const useWorkItemReviews = (workItemId: string | undefined) =>\n useQuery({\n queryKey: workItemId ? workItemReviewsKey(workItemId) : [\"work-items\", \"none\", \"reviews\"],\n queryFn: () => {\n if (!workItemId) throw new Error(\"A work item is required to load review state\");\n return getWorkItemReviews(workItemId);\n },\n enabled: workItemId !== undefined,\n });\n\nexport const useWorkItemQA = (workItemId: string | undefined) =>\n useQuery({\n queryKey: workItemId ? workItemQAKey(workItemId) : [\"work-items\", \"none\", \"qa\"],\n queryFn: () => {\n if (!workItemId) throw new Error(\"A work item is required to load Browser QA state\");\n return getWorkItemQA(workItemId);\n },\n enabled: workItemId !== undefined,\n });\n\n/**\n * Where this work item's agent writes, or `null` when it has never needed a repository.\n *\n * Separate from `useWorkItemWorkflow` because a workspace outlives the run that cut it: the\n * workflow snapshot is empty once no PipelineRun is current, and folding the workspace into it\n * would make the worktree path disappear from the card exactly when the owner goes looking for it.\n */\nexport const useWorkItemWorkspace = (workItemId: string | undefined) =>\n useQuery({\n queryKey: workItemId ? workItemWorkspaceKey(workItemId) : [\"work-items\", \"none\", \"workspace\"],\n queryFn: () => {\n if (!workItemId) throw new Error(\"A work item is required to load its workspace\");\n return getWorkItemWorkspace(workItemId);\n },\n enabled: workItemId !== undefined,\n });\n\n/**\n * What this work item changed in its worktree, or `null` when it has no workspace to change.\n *\n * Separate from `useWorkItemWorkspace` even though both answer for the same worktree: the workspace\n * row is state the daemon already holds, while this is a reading it performs on demand -- four git\n * processes over a temporary index -- and folding the expensive one into the cheap one would make\n * every card that only wants a worktree path pay for a diff.\n */\nexport const useWorkItemChanges = (workItemId: string) =>\n useQuery({\n queryKey: workItemChangesKey(workItemId),\n queryFn: () => getWorkItemChanges(workItemId),\n });\n\n/**\n * One file's unified diff, kept a query of its own so it is fetched only while that file is\n * expanded (spec D5).\n *\n * Both arguments are required rather than optional-with-`enabled`, unlike the hooks above: the only\n * caller mounts this at all when the owner has expanded a specific file, so there is no \"no file\n * chosen yet\" state for it to represent -- and an `enabled: false` variant would be a way to fetch\n * bodies for files nobody asked for.\n */\nexport const useWorkItemFileDiff = (workItemId: string, path: string) =>\n useQuery({\n queryKey: workItemFileDiffKey(workItemId, path),\n queryFn: () => getWorkItemFileDiff(workItemId, path),\n });\n\n/**\n * Spec §D5's nesting, read back for the Task Cockpit: the sessions inside a stage attempt, the\n * checkpoints published under it, and the highest window occupancy each session was measured at.\n */\nexport const useStageAttemptSessions = (stageAttemptId: string | undefined) =>\n useQuery({\n queryKey: stageAttemptId\n ? stageAttemptSessionsKey(stageAttemptId)\n : [\"stage-attempts\", \"none\", \"sessions\"],\n queryFn: () => {\n if (!stageAttemptId) throw new Error(\"A stage attempt is required to list its sessions\");\n return listProviderSessions(stageAttemptId);\n },\n enabled: stageAttemptId !== undefined,\n });\n\n/** The provider a session would run on right now (spec §7): whether it can wind down on request. */\nexport const useProviderCapabilities = () =>\n useQuery({ queryKey: providerCapabilitiesKey, queryFn: getProviderCapabilities });\n\nexport const useProjectProviderSelection = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectProviderSelectionKey(projectId) : [\"projects\", \"none\", \"provider-selection\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A Project is required to load provider settings\");\n return getProjectProviderSelection(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useProjectWorkspaceStrategy = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectWorkspaceStrategyKey(projectId) : [\"projects\", \"none\", \"workspace-strategy\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A Project is required to load its workspace strategy\");\n return getProjectWorkspaceStrategy(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useProjectProviderAllowance = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectProviderAllowanceKey(projectId) : [\"projects\", \"none\", \"provider-allowance\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A Project is required to load provider allowance\");\n return getProjectProviderAllowance(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useRefreshProjectProviderAllowance = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (projectId: string) => refreshProjectProviderAllowance(projectId),\n onSuccess: (allowance) => {\n queryClient.setQueryData(projectProviderAllowanceKey(allowance.projectId), allowance);\n },\n });\n};\n\nexport const useSetProjectProviderPreference = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ project, preference }: { project: ListedProject; preference: ProviderPreference }) =>\n setProjectProviderPreference(project, preference),\n onSuccess: async (selection) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n queryClient.setQueryData(projectProviderSelectionKey(selection.selection.projectId), selection),\n queryClient.invalidateQueries({ queryKey: providerCapabilitiesKey }),\n ]);\n },\n });\n};\n\nexport const useSetProjectWorkspaceStrategy = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n selection,\n strategy,\n }: {\n selection: ProjectWorkspaceStrategySelection;\n strategy: WorkspaceStrategy;\n }) => setProjectWorkspaceStrategy(selection, strategy),\n onSuccess: async (response) => {\n queryClient.setQueryData(projectWorkspaceStrategyKey(response.selection.projectId), response);\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n};\n\nexport const useRefreshProjectProviderAvailability = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (projectId: string) => refreshProjectProviderAvailability(projectId),\n onSuccess: (selection) => {\n queryClient.setQueryData(projectProviderSelectionKey(selection.selection.projectId), selection);\n },\n });\n};\n\nexport const useProjectMcpProfiles = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectMcpProfilesKey(projectId) : [\"projects\", \"none\", \"mcp-profiles\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A Project is required to load MCP profiles\");\n return getProjectMcpProfiles(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useProposeMcpProfile = () =>\n useMutation({\n mutationFn: (input: {\n projectId: string;\n expectedProjectVersion: number;\n candidate: McpProfileCandidate;\n }) => proposeMcpProfile(input.projectId, input.expectedProjectVersion, input.candidate),\n });\n\nexport const useProposeContext7Preset = () =>\n useMutation({\n mutationFn: (input: { projectId: string; expectedProjectVersion: number }) =>\n proposeContext7Preset(input.projectId, input.expectedProjectVersion),\n });\n\nconst useMcpMutationInvalidation = () => {\n const queryClient = useQueryClient();\n return async (projectId: string): Promise<void> => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n queryClient.invalidateQueries({ queryKey: projectMcpProfilesKey(projectId) }),\n ]);\n };\n};\n\nexport const useConfirmMcpProfile = () => {\n const invalidate = useMcpMutationInvalidation();\n return useMutation({\n mutationFn: (proposal: McpProfileProposal) => confirmMcpProfile(proposal),\n onSuccess: async (_, proposal) => invalidate(proposal.projectId),\n });\n};\n\nexport const useProbeMcpProfile = () => {\n const invalidate = useMcpMutationInvalidation();\n return useMutation({\n mutationFn: (input: { projectId: string; revision: McpProfileRevision }) =>\n probeMcpProfile(input.projectId, input.revision),\n onSuccess: async (_, input) => invalidate(input.projectId),\n });\n};\n\nexport const useGrantMcpProfile = () => {\n const invalidate = useMcpMutationInvalidation();\n return useMutation({\n mutationFn: grantMcpProfile,\n onSuccess: async (_, input) => invalidate(input.projectId),\n });\n};\n\nexport const useRevokeMcpProfile = () => {\n const invalidate = useMcpMutationInvalidation();\n return useMutation({\n mutationFn: revokeMcpProfile,\n onSuccess: async (_, input) => invalidate(input.projectId),\n });\n};\n\nexport const useProjectHumanRequests = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectHumanRequestsKey(projectId) : [\"projects\", \"none\", \"human-requests\", \"OPEN\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to list HumanRequests\");\n return listOpenHumanRequests(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useInitializeFixtureWorkspace = () => {\n const queryClient = useQueryClient();\n const { projects } = useWorkspace();\n return useMutation({\n mutationFn: async () => {\n // A demo fixture is registered when it is absent, and again when the Project that records it\n // no longer points at a repository. The second half is the one that was missing: this used to\n // skip any `fixtureId` already present, so on a database that predates E1 -- where both demo\n // Projects record a directory inside Loomrail's own checkout, carried across verbatim by\n // migration 0012 -- pressing this did nothing at all, and the repair route it is the only\n // caller of was unreachable from the product.\n const usable = new Set(\n projects\n .filter(({ repositoryStatus }) => repositoryStatus === \"READY\")\n .map(({ fixtureId }) => fixtureId),\n );\n if (!usable.has(\"web-app-a\")) await registerFixtureProject(\"web-app-a\");\n if (!usable.has(\"api-service-b\")) await registerFixtureProject(\"api-service-b\");\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n};\n\n/**\n * Repairs one demo Project whose recorded path is no longer a repository (spec §4).\n *\n * The same route `useInitializeFixtureWorkspace` calls, aimed at a single fixture rather than at\n * both -- because this is reached from the Projects list, where the owner is looking at one\n * Project and its path. `POST /api/v1/projects/fixtures/register` materialises the fixture under\n * the daemon's data directory and moves the Project onto it (REPOINT_FIXTURE_PROJECT), so the\n * button does exactly what \"initialize the demo workspace\" does, for the Project the owner picked.\n *\n * There is deliberately no equivalent for a Project the owner registered by path: Loomrail does not\n * know where they moved their repository to, and inventing a path for them is not a repair. That\n * one is fixed by registering the new path, which the field below already does.\n */\nexport const useRepairFixtureProject = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (fixtureId: FixtureProjectId) => registerFixtureProject(fixtureId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n};\n\n/** Spec §4: the owner registers a local Git repository by path, alongside the bundled demo. */\nexport const useRegisterRepositoryProject = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (repositoryPath: string) => registerRepositoryProject(repositoryPath),\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n};\n\nexport const useProposeProjectScaffold = () =>\n useMutation({ mutationFn: (targetPath: string) => proposeNewProjectScaffold(targetPath) });\n\nexport const useOpenProjectScaffolds = () =>\n useQuery({ queryKey: openProjectScaffoldsKey, queryFn: listOpenProjectScaffolds });\n\nexport const usePublishProjectScaffold = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (proposal: ScaffoldProposal) => publishNewProjectScaffold(proposal),\n onSuccess: async (operation) => {\n await queryClient.invalidateQueries({ queryKey: openProjectScaffoldsKey });\n if (operation.status === \"COMPLETED\") {\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n }\n },\n });\n};\n\nexport const useRetryProjectScaffold = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (operation: ScaffoldOperation) => retryNewProjectScaffold(operation),\n onSuccess: async (operation) => {\n await queryClient.invalidateQueries({ queryKey: openProjectScaffoldsKey });\n if (operation.status === \"COMPLETED\") {\n await queryClient.invalidateQueries({ queryKey: projectsKey });\n }\n },\n });\n};\n\nexport const useConstitutionPresets = () =>\n useQuery({ queryKey: constitutionPresetsKey, queryFn: listConstitutionPresets });\n\nexport const useProjectConstitution = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectConstitutionKey(projectId) : [\"projects\", \"none\", \"constitution\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load its Constitution\");\n return getProjectConstitution(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useScanProjectConstitution = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ presetId, project }: { presetId?: ConstitutionPresetId; project: ListedProject }) =>\n scanProjectConstitution(project, presetId),\n onSuccess: async (proposal) => {\n await queryClient.invalidateQueries({ queryKey: projectConstitutionKey(proposal.projectId) });\n },\n });\n};\n\nexport const useAdoptProjectConstitution = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ project, proposal }: { project: ListedProject; proposal: ConstitutionProposal }) =>\n adoptProjectConstitution(project, proposal),\n onSuccess: async (_, { project }) => {\n await queryClient.invalidateQueries({ queryKey: projectConstitutionKey(project.id) });\n },\n });\n};\n\nexport const useRetryProjectConstitutionPublication = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ projectId, publication }: { projectId: string; publication: ConstitutionPublication }) =>\n retryProjectConstitutionPublication(projectId, publication),\n onSuccess: async (_, { projectId }) => {\n await queryClient.invalidateQueries({ queryKey: projectConstitutionKey(projectId) });\n },\n });\n};\n\nexport const useVerificationPlanSettings = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectVerificationPlanKey(projectId) : [\"projects\", \"none\", \"verification-plan\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load its verification Plan\");\n return getVerificationPlanSettings(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useAdoptVerificationPlan = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (settings: VerificationPlanSettingsResponse) => adoptVerificationPlan(settings),\n onSuccess: async (settings) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectVerificationPlanKey(settings.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useDisableVerificationPlan = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (settings: VerificationPlanSettingsResponse) => disableVerificationPlan(settings),\n onSuccess: async (settings) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectVerificationPlanKey(settings.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useRetryVerificationPlanPublication = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n projectId,\n publication,\n }: {\n projectId: string;\n publication: VerificationPlanPublication;\n }) => retryVerificationPlanPublication(projectId, publication),\n onSuccess: async (settings) => {\n await queryClient.invalidateQueries({ queryKey: projectVerificationPlanKey(settings.projectId) });\n },\n });\n};\n\nexport const useLaunchMeasurement = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectLaunchMeasurementKey(projectId) : [\"projects\", \"none\", \"launch-measurement\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load launch measurement\");\n return getLaunchMeasurement(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useAdoptLaunchMeasurementPlan = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n configuration: LaunchMeasurementPlanConfiguration;\n snapshot: LaunchMeasurementProjectResponse;\n }) => adoptLaunchMeasurementPlan(input),\n onSuccess: async (_, input) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectLaunchMeasurementKey(input.snapshot.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useDisableLaunchMeasurementPlan = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: { snapshot: LaunchMeasurementProjectResponse }) =>\n disableLaunchMeasurementPlan(input),\n onSuccess: async (_, input) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectLaunchMeasurementKey(input.snapshot.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useStartLaunchMeasurement = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: { projectId: string; snapshot: LaunchMeasurementProjectResponse }) =>\n startLaunchMeasurement(input),\n onSuccess: async (_, input) => {\n await queryClient.invalidateQueries({ queryKey: projectLaunchMeasurementKey(input.projectId) });\n },\n });\n};\n\nexport const useCancelLaunchMeasurement = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: { projectId: string; run: LaunchMeasurementRun }) => cancelLaunchMeasurement(input),\n onSuccess: async (_, input) => {\n await queryClient.invalidateQueries({ queryKey: projectLaunchMeasurementKey(input.projectId) });\n },\n });\n};\n\nexport const useLaunchRelease = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectLaunchReleaseKey(projectId) : [\"projects\", \"none\", \"launch-release\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load its Launch Release\");\n return getLaunchRelease(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useSaveLaunchEnvironment = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n configuration: LaunchEnvironmentConfiguration;\n environment: LaunchEnvironment | null;\n snapshot: LaunchReleaseProjectResponse;\n }) => saveLaunchEnvironment(input),\n onSuccess: async (snapshot) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectLaunchReleaseKey(snapshot.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useCreateLaunchRelease = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: {\n environment: LaunchEnvironment;\n snapshot: LaunchReleaseProjectResponse;\n workItemIds: readonly string[];\n }) => createLaunchRelease(input),\n onSuccess: async (snapshot) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectLaunchReleaseKey(snapshot.projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n },\n });\n};\n\nexport const useExportLaunchEvidencePackage = () =>\n useMutation<LaunchEvidencePackageResponse, Error, string>({\n mutationFn: (releaseId) => exportLaunchEvidencePackage(releaseId),\n });\n\nexport const useGuidedDeployment = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectGuidedDeploymentKey(projectId) : [\"projects\", \"none\", \"guided-deployment\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load Guided Deployment\");\n return getGuidedDeployment(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useGuidedDeploymentPreview = (projectId: string | undefined, releaseId: string | undefined) =>\n useQuery({\n queryKey:\n projectId && releaseId\n ? projectGuidedDeploymentPreviewKey(projectId, releaseId)\n : [\"projects\", \"none\", \"guided-deployment\", \"preview\"],\n queryFn: () => {\n if (!projectId || !releaseId) throw new Error(\"A current Release is required for deployment preview\");\n return previewGuidedDeployment(projectId, releaseId);\n },\n enabled: projectId !== undefined && releaseId !== undefined,\n });\n\nconst invalidateGuidedDeployment = async (\n queryClient: ReturnType<typeof useQueryClient>,\n projectId: string,\n): Promise<void> => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectGuidedDeploymentKey(projectId) }),\n queryClient.invalidateQueries({ queryKey: projectLaunchReleaseKey(projectId) }),\n queryClient.invalidateQueries({ queryKey: projectsKey }),\n ]);\n};\n\nexport const useAdoptGuidedDeploymentPlan = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (preview: DeploymentPreviewResponse) => adoptGuidedDeploymentPlan({ preview }),\n onSuccess: async (snapshot) => {\n await invalidateGuidedDeployment(queryClient, snapshot.projectId);\n },\n });\n};\n\nexport const useApproveGuidedDeployment = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (deployment: Deployment) => approveGuidedDeployment({ deployment }),\n onSuccess: async (snapshot) => {\n await invalidateGuidedDeployment(queryClient, snapshot.projectId);\n },\n });\n};\n\nexport const useStartGuidedDeployment = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (deployment: Deployment) => startGuidedDeployment(deployment),\n onSuccess: async (snapshot) => {\n await invalidateGuidedDeployment(queryClient, snapshot.projectId);\n },\n });\n};\n\nexport const useObserveGuidedDeployment = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (deployment: Deployment) => observeGuidedDeployment(deployment),\n onSuccess: async (snapshot) => {\n await invalidateGuidedDeployment(queryClient, snapshot.projectId);\n },\n });\n};\n\nexport const useProjectReadiness = (projectId: string | undefined) =>\n useQuery({\n queryKey: projectId ? projectReadinessKey(projectId) : [\"projects\", \"none\", \"readiness\"],\n queryFn: () => {\n if (!projectId) throw new Error(\"A project is required to load readiness\");\n return getProjectReadiness(projectId);\n },\n enabled: projectId !== undefined,\n });\n\nexport const useRunProjectReadiness = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (project: ListedProject) => runProjectReadiness(project),\n onSuccess: async (_, project) => {\n await queryClient.invalidateQueries({ queryKey: projectReadinessKey(project.id) });\n },\n });\n};\n\nexport const useAttestProjectReadiness = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n check,\n outcome,\n projectId,\n rationale,\n run,\n }: {\n check: ReadinessCheck;\n outcome: ReadinessAttestationOutcome;\n projectId: string;\n rationale: string;\n run: ProjectReadinessRun;\n }) => attestProjectReadiness(projectId, run, check, outcome, rationale),\n onSuccess: async (_, { projectId }) => {\n await queryClient.invalidateQueries({ queryKey: projectReadinessKey(projectId) });\n },\n });\n};\n\nexport const useCreateWorkItem = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: CreateWorkItemInput) => createWorkItem(input),\n onSuccess: async (workItem) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useCreateGuidedActivationWorkItem = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (projectId: string) => createGuidedActivationWorkItem(projectId),\n onSuccess: async (workItem) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useSetWorkItemDependencies = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n blockerWorkItemIds,\n workItem,\n }: {\n blockerWorkItemIds: readonly string[];\n workItem: WorkItem;\n }) => setWorkItemDependencies(workItem, blockerWorkItemIds),\n onSuccess: async (dependencies, { workItem }) => {\n const key = projectWorkItemDependenciesKey(workItem.projectId);\n queryClient.setQueryData(key, {\n schemaVersion: 1,\n projectId: workItem.projectId,\n dependencies: [\n ...(\n queryClient.getQueryData<{ dependencies: readonly WorkItemDependency[] }>(key)?.dependencies ?? []\n ).filter(({ blockedWorkItemId }) => blockedWorkItemId !== workItem.id),\n ...dependencies,\n ],\n });\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n ]);\n },\n });\n};\n\nexport const useMoveWorkItem = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ targetState, workItem }: { targetState: WorkItemState; workItem: WorkItem }) =>\n moveWorkItem(workItem, targetState),\n onSuccess: async (workItem) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useUpdateWorkItem = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ patch, workItem }: { patch: UpdateWorkItemPatch; workItem: WorkItem }) =>\n updateWorkItem(workItem, patch),\n onSuccess: async (workItem) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useStartPipeline = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ policy, workItem }: { policy: PipelineStartPolicy; workItem: WorkItem }) =>\n startPipeline(workItem, policy),\n onSuccess: async (_, { workItem }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemQAKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useAnswerHumanRequest = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ answer, request }: { answer: HumanRequestAnswer; request: HumanRequest }) =>\n answerHumanRequest(request, answer),\n onSuccess: async (_, { request }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(request.workItemId) }),\n queryClient.invalidateQueries({\n queryKey: workItemEventsKey(request.projectId, request.workItemId),\n }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: stageAttemptSessionsKey(request.stageAttemptId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useDisposeReviewFinding = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n disposition,\n finding,\n reason,\n }: {\n disposition: ReviewFindingOwnerDisposition;\n finding: ReviewFinding;\n reason: string;\n }) => disposeReviewFinding(finding, disposition, reason),\n onSuccess: async (finding) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: workItemReviewsKey(finding.workItemId) }),\n queryClient.invalidateQueries({\n queryKey: workItemEventsKey(finding.projectId, finding.workItemId),\n }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useWaiveQADefect = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ defect, reason }: { defect: QADefect; reason: string }) => waiveQADefect(defect, reason),\n onSuccess: async (defect) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: workItemQAKey(defect.workItemId) }),\n queryClient.invalidateQueries({\n queryKey: workItemEventsKey(defect.projectId, defect.workItemId),\n }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useResolveQACorrectionGate = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n action,\n correctionRun,\n request,\n run,\n }: {\n action: QACorrectionGateAction;\n correctionRun: QACorrectionRun | null;\n request: HumanRequest;\n run: PipelineRun;\n }) => resolveQACorrectionGate(request, correctionRun, run, action),\n onSuccess: async (_, { request }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(request.workItemId) }),\n queryClient.invalidateQueries({ queryKey: workItemQAKey(request.workItemId) }),\n queryClient.invalidateQueries({\n queryKey: workItemEventsKey(request.projectId, request.workItemId),\n }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: stageAttemptSessionsKey(request.stageAttemptId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useResolveVerificationCorrectionGate = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n action,\n correctionRun,\n qaCorrectionRun,\n request,\n run,\n }: {\n action: VerificationCorrectionGateAction;\n correctionRun: VerificationCorrectionRun | null;\n qaCorrectionRun: QACorrectionRun | null;\n request: HumanRequest;\n run: PipelineRun;\n }) => resolveVerificationCorrectionGate(request, correctionRun, qaCorrectionRun, run, action),\n onSuccess: async (_, { request }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(request.workItemId) }),\n queryClient.invalidateQueries({ queryKey: workItemVerificationRunsKey(request.workItemId) }),\n queryClient.invalidateQueries({\n queryKey: workItemEventsKey(request.projectId, request.workItemId),\n }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(request.projectId) }),\n queryClient.invalidateQueries({ queryKey: stageAttemptSessionsKey(request.stageAttemptId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const usePipelineControl = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n action,\n run,\n workItem,\n }: {\n action: PipelineControlAction;\n run: PipelineRun;\n workItem: WorkItem;\n }) => controlPipeline(workItem.id, run, action),\n onSuccess: async (_, { run, workItem }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemQAKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: stageAttemptSessionsKey(run.currentStageAttemptId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useApproveBudgetOverride = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n maxEstimatedTokens,\n modelTierOverride,\n agentRunMaxEstimatedTokensOverride,\n run,\n workItem,\n }: {\n maxEstimatedTokens: number;\n modelTierOverride: ModelTier | null;\n agentRunMaxEstimatedTokensOverride: number | null;\n run: PipelineRun;\n workItem: WorkItem;\n }) =>\n approveBudgetOverride(\n workItem.id,\n run,\n maxEstimatedTokens,\n modelTierOverride,\n agentRunMaxEstimatedTokensOverride,\n ),\n onSuccess: async (_, { run, workItem }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: stageAttemptSessionsKey(run.currentStageAttemptId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n\nexport const useResolveAcceptance = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n acceptancePackage,\n action,\n run,\n workItem,\n }: {\n acceptancePackage: AcceptancePackage;\n action: AcceptanceAction;\n run: PipelineRun;\n workItem: WorkItem;\n }) => resolveAcceptance(workItem.id, run, acceptancePackage, action),\n onSuccess: async (_, { workItem }) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: projectWorkItemsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: workItemWorkflowKey(workItem.id) }),\n queryClient.invalidateQueries({ queryKey: workItemEventsKey(workItem.projectId, workItem.id) }),\n queryClient.invalidateQueries({ queryKey: projectHumanRequestsKey(workItem.projectId) }),\n queryClient.invalidateQueries({ queryKey: attentionKey }),\n ]);\n },\n });\n};\n","import { useState } from \"react\";\nimport {\n launchMeasurementPlanConfigurationSchema,\n type LaunchMeasurementGateResult,\n type LaunchMeasurementHeader,\n type LaunchMeasurementPlanConfiguration,\n type LaunchMeasurementProjectResponse,\n type ListedProject,\n type VerificationPlan,\n} from \"@loomrail/contracts\";\nimport { Button, Icon, cn } from \"@loomrail/ui\";\n\nimport { useI18n, type Translator } from \"../i18n\";\nimport {\n useAdoptLaunchMeasurementPlan,\n useCancelLaunchMeasurement,\n useDisableLaunchMeasurementPlan,\n useLaunchMeasurement,\n useStartLaunchMeasurement,\n useVerificationPlanSettings,\n} from \"../workspace\";\n\nconst selectableHeaders: readonly LaunchMeasurementHeader[] = [\n \"content-security-policy\",\n \"x-content-type-options\",\n \"referrer-policy\",\n \"permissions-policy\",\n];\n\ntype LaunchMeasurementForm = {\n startupRecipeId: string;\n dependencyAuditRecipeId: string;\n targetOrigin: string;\n healthPath: string;\n probePath: string;\n privateRoutes: string;\n samples: string;\n lcpMs: string;\n inpMs: string;\n cls: string;\n scriptBytes: string;\n requiredHeaders: readonly LaunchMeasurementHeader[];\n};\n\nconst formFor = (\n verificationPlan: VerificationPlan,\n snapshot: LaunchMeasurementProjectResponse,\n): LaunchMeasurementForm => {\n const saved = snapshot.plan?.configuration;\n return {\n startupRecipeId:\n saved?.startupRecipeId ??\n verificationPlan.recipes.find(({ kind, required }) => kind === \"SERVE\" && !required)?.id ??\n \"\",\n dependencyAuditRecipeId:\n saved?.dependencyAuditRecipeId ??\n verificationPlan.recipes.find(({ kind }) => kind === \"AUDIT\")?.id ??\n \"\",\n targetOrigin: saved?.targetOrigin ?? \"http://127.0.0.1:3000\",\n healthPath: saved?.healthPath ?? \"/health/ready\",\n probePath: saved?.probePath ?? \"/\",\n privateRoutes: saved?.privateRoutes.join(\"\\n\") ?? \"\",\n samples: (saved?.samples ?? 3).toString(),\n lcpMs: (saved?.thresholds.lcpMs ?? 2_500).toString(),\n inpMs: (saved?.thresholds.inpMs ?? 200).toString(),\n cls: (saved?.thresholds.cls ?? 0.1).toString(),\n scriptBytes: (saved?.thresholds.scriptBytes ?? 512_000).toString(),\n requiredHeaders: saved?.requiredHeaders ?? selectableHeaders,\n };\n};\n\nconst configurationFor = (\n form: LaunchMeasurementForm,\n verificationPlan: VerificationPlan,\n): LaunchMeasurementPlanConfiguration | null => {\n const parsed = launchMeasurementPlanConfigurationSchema.safeParse({\n verificationPlanId: verificationPlan.id,\n verificationPlanRevision: verificationPlan.revision,\n verificationPlanContentHash: verificationPlan.contentHash,\n startupRecipeId: form.startupRecipeId,\n dependencyAuditRecipeId: form.dependencyAuditRecipeId || null,\n targetOrigin: form.targetOrigin.trim(),\n healthPath: form.healthPath.trim(),\n probePath: form.probePath.trim(),\n privateRoutes: form.privateRoutes\n .split(\"\\n\")\n .map((path) => path.trim())\n .filter(Boolean),\n samples: Number(form.samples),\n thresholds: {\n lcpMs: Number(form.lcpMs),\n inpMs: Number(form.inpMs),\n cls: Number(form.cls),\n scriptBytes: Number(form.scriptBytes),\n },\n requiredHeaders: form.requiredHeaders,\n });\n return parsed.success ? parsed.data : null;\n};\n\nconst gateEvidence = (gate: LaunchMeasurementGateResult, t: Translator): string => {\n switch (gate.key) {\n case \"PERF_WEB_VITALS\":\n return t(\"settings.launch.evidence.vitals\", {\n lcp: gate.evidence.medianLcpMs ?? \"—\",\n inp: gate.evidence.medianInpMs ?? \"—\",\n cls: gate.evidence.medianCls ?? \"—\",\n });\n case \"PERF_BUNDLE_BUDGET\":\n return t(\"settings.launch.evidence.bundle\", {\n measured: gate.evidence.medianScriptBytes,\n budget: gate.evidence.budgetBytes,\n });\n case \"SEC_RESPONSE_HEADERS\":\n return gate.evidence\n .map(({ name, present }) => `${name}: ${t(present ? \"settings.launch.yes\" : \"settings.launch.no\")}`)\n .join(\" · \");\n case \"SEC_UNAUTHENTICATED_ROUTES\":\n return gate.evidence.map(({ path, statusCode }) => `${path}: ${statusCode.toString()}`).join(\" · \");\n case \"SEC_CLIENT_BUNDLE_SECRETS\":\n return t(\"settings.launch.evidence.secrets\", {\n bytes: gate.evidence.scannedScriptBytes,\n count: gate.evidence.findings.reduce((total, finding) => total + finding.count, 0),\n });\n case \"DEPS_AUDIT\":\n return gate.evidence === null\n ? t(\"settings.launch.evidence.auditMissing\")\n : t(\"settings.launch.evidence.audit\", { status: gate.evidence.status });\n }\n};\n\nexport type LaunchMeasurementViewProps = {\n adopting: boolean;\n cancelling: boolean;\n disabling: boolean;\n onAdopt: (configuration: LaunchMeasurementPlanConfiguration) => void;\n onCancel: () => void;\n onDisable: () => void;\n onRun: () => void;\n running: boolean;\n snapshot: LaunchMeasurementProjectResponse;\n verificationPlan: VerificationPlan;\n};\n\nexport const LaunchMeasurementView = ({\n adopting,\n cancelling,\n disabling,\n onAdopt,\n onCancel,\n onDisable,\n onRun,\n running,\n snapshot,\n verificationPlan,\n}: LaunchMeasurementViewProps): React.JSX.Element => {\n const { t } = useI18n();\n const [form, setForm] = useState(() => formFor(verificationPlan, snapshot));\n const configuration = configurationFor(form, verificationPlan);\n const serviceRecipes = verificationPlan.recipes.filter(\n ({ kind, required }) => kind === \"SERVE\" && !required,\n );\n const auditRecipes = verificationPlan.recipes.filter(({ kind }) => kind === \"AUDIT\");\n const activeRun =\n snapshot.latestRun?.status === \"RUNNING\" ||\n snapshot.latestRun?.status === \"CANCELLING\" ||\n snapshot.latestRun?.status === \"BLOCKED\"\n ? snapshot.latestRun\n : null;\n const planIsCurrent =\n snapshot.plan?.status === \"ACTIVE\" &&\n configuration !== null &&\n JSON.stringify(snapshot.plan.configuration) === JSON.stringify(configuration);\n const update = <K extends keyof LaunchMeasurementForm>(key: K, value: LaunchMeasurementForm[K]): void => {\n setForm((current) => ({ ...current, [key]: value }));\n };\n\n return (\n <div className=\"launch-settings\">\n <div className=\"launch-settings__heading\">\n <div>\n <h4>{t(\"settings.launch.title\")}</h4>\n <p>{t(\"settings.launch.description\")}</p>\n </div>\n {snapshot.plan === null ? null : (\n <span className={cn(\"launch-settings__state\", snapshot.plan.status === \"ACTIVE\" && \"is-ready\")}>\n <Icon name={snapshot.plan.status === \"ACTIVE\" ? \"check\" : \"warning\"} size={13} />\n {t(\n snapshot.plan.status === \"ACTIVE\"\n ? \"settings.launch.planActive\"\n : \"settings.launch.planDisabled\",\n { revision: snapshot.plan.revision },\n )}\n </span>\n )}\n </div>\n\n <div className=\"launch-settings__notice\" role=\"note\">\n <strong>{t(\"settings.launch.localTitle\")}</strong>\n <p>{t(\"settings.launch.localNotice\")}</p>\n </div>\n\n {serviceRecipes.length === 0 ? (\n <p className=\"launch-settings__error\" role=\"alert\">\n {t(\"settings.launch.noService\")}\n </p>\n ) : (\n <div className=\"launch-settings__form\">\n <label>\n <span>{t(\"settings.launch.serviceRecipe\")}</span>\n <select\n onChange={(event) => {\n update(\"startupRecipeId\", event.target.value);\n }}\n value={form.startupRecipeId}\n >\n {serviceRecipes.map((recipe) => (\n <option key={recipe.id} value={recipe.id}>\n {recipe.label}: {[recipe.executable, ...recipe.argv].join(\" \")}\n </option>\n ))}\n </select>\n </label>\n <label>\n <span>{t(\"settings.launch.auditRecipe\")}</span>\n <select\n onChange={(event) => {\n update(\"dependencyAuditRecipeId\", event.target.value);\n }}\n value={form.dependencyAuditRecipeId}\n >\n <option value=\"\">{t(\"settings.launch.auditNone\")}</option>\n {auditRecipes.map((recipe) => (\n <option key={recipe.id} value={recipe.id}>\n {recipe.label}: {[recipe.executable, ...recipe.argv].join(\" \")}\n </option>\n ))}\n </select>\n </label>\n {(\n [\n [\"targetOrigin\", \"settings.launch.origin\"],\n [\"healthPath\", \"settings.launch.healthPath\"],\n [\"probePath\", \"settings.launch.probePath\"],\n ] as const\n ).map(([key, label]) => (\n <label key={key}>\n <span>{t(label)}</span>\n <input\n onChange={(event) => {\n update(key, event.target.value);\n }}\n type=\"text\"\n value={form[key]}\n />\n </label>\n ))}\n <label className=\"launch-settings__wide\">\n <span>{t(\"settings.launch.privateRoutes\")}</span>\n <textarea\n onChange={(event) => {\n update(\"privateRoutes\", event.target.value);\n }}\n rows={2}\n value={form.privateRoutes}\n />\n </label>\n {(\n [\n [\"samples\", \"settings.launch.samples\", \"1\"],\n [\"lcpMs\", \"settings.launch.lcp\", \"100\"],\n [\"inpMs\", \"settings.launch.inp\", \"10\"],\n [\"cls\", \"settings.launch.cls\", \"0.01\"],\n [\"scriptBytes\", \"settings.launch.bundle\", \"1024\"],\n ] as const\n ).map(([key, label, step]) => (\n <label key={key}>\n <span>{t(label)}</span>\n <input\n min=\"0\"\n onChange={(event) => {\n update(key, event.target.value);\n }}\n step={step}\n type=\"number\"\n value={form[key]}\n />\n </label>\n ))}\n <fieldset className=\"launch-settings__wide\">\n <legend>{t(\"settings.launch.headers\")}</legend>\n {selectableHeaders.map((header) => (\n <label key={header}>\n <input\n checked={form.requiredHeaders.includes(header)}\n onChange={(event) => {\n update(\n \"requiredHeaders\",\n event.target.checked\n ? [...form.requiredHeaders, header]\n : form.requiredHeaders.filter((value) => value !== header),\n );\n }}\n type=\"checkbox\"\n />\n <span>{header}</span>\n </label>\n ))}\n </fieldset>\n </div>\n )}\n\n <p className=\"launch-settings__identity\">\n {t(\"settings.launch.verificationIdentity\", {\n id: verificationPlan.id,\n revision: verificationPlan.revision,\n })}\n </p>\n {configuration === null && serviceRecipes.length > 0 ? (\n <p className=\"launch-settings__error\" role=\"alert\">\n {t(\"settings.launch.invalid\")}\n </p>\n ) : null}\n <div className=\"launch-settings__actions\">\n <Button\n disabled={configuration === null || planIsCurrent || activeRun !== null}\n loading={adopting}\n onClick={() => {\n if (configuration !== null) onAdopt(configuration);\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {snapshot.plan === null ? t(\"settings.launch.adopt\") : t(\"settings.launch.replace\")}\n </Button>\n {snapshot.plan?.status === \"ACTIVE\" ? (\n <>\n <Button disabled={activeRun !== null} loading={running} onClick={onRun} type=\"button\">\n {t(\"settings.launch.run\")}\n </Button>\n <Button disabled={activeRun !== null} loading={disabling} onClick={onDisable} type=\"button\">\n {t(\"settings.launch.disable\")}\n </Button>\n </>\n ) : null}\n {activeRun === null ? null : (\n <Button loading={cancelling} onClick={onCancel} type=\"button\">\n {t(\n activeRun.status === \"CANCELLING\"\n ? \"settings.launch.cancelling\"\n : activeRun.status === \"BLOCKED\"\n ? \"settings.launch.stopBlocked\"\n : \"settings.launch.cancel\",\n )}\n </Button>\n )}\n </div>\n\n {snapshot.latestRun === null ? (\n <p className=\"settings__note\">{t(\"settings.launch.noRun\")}</p>\n ) : (\n <section className=\"launch-run\" aria-label={t(\"settings.launch.results\")}>\n <div className=\"launch-run__heading\">\n <strong>{t(`settings.launch.status.${snapshot.latestRun.status}`)}</strong>\n <span>{t(\"settings.launch.tree\", { tree: snapshot.latestRun.testedTree.slice(0, 8) })}</span>\n {snapshot.freshness === null ? null : (\n <span>{t(`settings.launch.freshness.${snapshot.freshness.status}`)}</span>\n )}\n </div>\n {snapshot.latestRun.errorCode === null ? null : (\n <p className=\"launch-settings__error\" role=\"alert\">\n {t(\"settings.launch.errorCode\", { code: snapshot.latestRun.errorCode })}\n </p>\n )}\n {snapshot.latestRun.results.length === 0 ? null : (\n <ul className=\"launch-gates\">\n {snapshot.latestRun.results.map((gate) => (\n <li key={gate.key}>\n <span className={cn(\"launch-gates__status\", `is-${gate.status.toLowerCase()}`)}>\n <Icon name={gate.status === \"PASSED\" ? \"check\" : \"warning\"} size={14} />\n {t(`settings.launch.gateStatus.${gate.status}`)}\n </span>\n <div>\n <strong>{t(`settings.launch.gate.${gate.key}`)}</strong>\n <p>{gate.summary}</p>\n <small>{gateEvidence(gate, t)}</small>\n </div>\n </li>\n ))}\n </ul>\n )}\n </section>\n )}\n </div>\n );\n};\n\nexport const LaunchMeasurementPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const verificationQuery = useVerificationPlanSettings(project.id);\n const snapshotQuery = useLaunchMeasurement(project.id);\n const adopt = useAdoptLaunchMeasurementPlan();\n const disable = useDisableLaunchMeasurementPlan();\n const run = useStartLaunchMeasurement();\n const cancel = useCancelLaunchMeasurement();\n const verificationPlan = verificationQuery.data?.plan;\n const snapshot = snapshotQuery.data;\n const error =\n adopt.error instanceof Error\n ? adopt.error\n : disable.error instanceof Error\n ? disable.error\n : run.error instanceof Error\n ? run.error\n : cancel.error instanceof Error\n ? cancel.error\n : snapshotQuery.error instanceof Error\n ? snapshotQuery.error\n : verificationQuery.error instanceof Error\n ? verificationQuery.error\n : null;\n\n if (verificationPlan?.status !== \"ACTIVE\" || snapshot === undefined) {\n return (\n <div className=\"launch-settings\">\n <div className=\"launch-settings__heading\">\n <div>\n <h4>{t(\"settings.launch.title\")}</h4>\n <p>{t(\"settings.launch.description\")}</p>\n </div>\n </div>\n <p className={error === null ? \"settings__note\" : \"launch-settings__error\"}>\n {error?.message ??\n (verificationQuery.isPending || snapshotQuery.isPending\n ? t(\"settings.launch.loading\")\n : t(\"settings.launch.verificationRequired\"))}\n </p>\n </div>\n );\n }\n\n return (\n <>\n <LaunchMeasurementView\n adopting={adopt.isPending}\n cancelling={cancel.isPending}\n disabling={disable.isPending}\n key={`${verificationPlan.id}:${snapshot.plan?.id ?? \"new\"}`}\n onAdopt={(configuration) => {\n adopt.mutate({ configuration, snapshot });\n }}\n onCancel={() => {\n if (snapshot.latestRun !== null) cancel.mutate({ projectId: project.id, run: snapshot.latestRun });\n }}\n onDisable={() => {\n disable.mutate({ snapshot });\n }}\n onRun={() => {\n run.mutate({ projectId: project.id, snapshot });\n }}\n running={run.isPending}\n snapshot={snapshot}\n verificationPlan={verificationPlan}\n />\n {error === null ? null : (\n <p className=\"launch-settings__error\" role=\"alert\">\n {error.message}\n </p>\n )}\n </>\n );\n};\n","import { useState } from \"react\";\nimport {\n launchEnvironmentConfigurationSchema,\n type LaunchEnvironment,\n type LaunchEnvironmentConfiguration,\n type LaunchEnvironmentKind,\n type LaunchReleaseGateStatus,\n type LaunchReleaseProjectResponse,\n type Deployment,\n type DeploymentPreflightFailureCode,\n type DeploymentPreviewResponse,\n type GuidedDeploymentProjectResponse,\n type GithubActionsDeploymentTarget,\n type ListedProject,\n type WorkItem,\n} from \"@loomrail/contracts\";\nimport { Button, Icon, cn } from \"@loomrail/ui\";\n\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport {\n useCreateLaunchRelease,\n useAdoptGuidedDeploymentPlan,\n useApproveGuidedDeployment,\n useExportLaunchEvidencePackage,\n useGuidedDeployment,\n useGuidedDeploymentPreview,\n useLaunchRelease,\n useObserveGuidedDeployment,\n useProjectWorkItems,\n useSaveLaunchEnvironment,\n useStartGuidedDeployment,\n} from \"../workspace\";\n\ntype EnvironmentForm = {\n healthPath: string;\n kind: LaunchEnvironmentKind;\n name: string;\n publicBaseUrl: string;\n requiredEnvironmentVariables: string;\n};\n\nconst formFor = (snapshot: LaunchReleaseProjectResponse, kind: LaunchEnvironmentKind): EnvironmentForm => {\n const environment = snapshot.environments.find((candidate) => candidate.kind === kind);\n return {\n kind,\n name: environment?.name ?? \"\",\n publicBaseUrl: environment?.publicBaseUrl ?? \"\",\n healthPath: environment?.healthPath ?? \"/health/ready\",\n requiredEnvironmentVariables: environment?.requiredEnvironmentVariables.join(\"\\n\") ?? \"\",\n };\n};\n\nconst configurationFor = (form: EnvironmentForm): LaunchEnvironmentConfiguration | null => {\n const parsed = launchEnvironmentConfigurationSchema.safeParse({\n kind: form.kind,\n name: form.name.trim(),\n presetId: \"WEB_APP_V1\",\n presetRevision: 1,\n publicBaseUrl: form.publicBaseUrl.trim(),\n healthPath: form.healthPath.trim(),\n requiredEnvironmentVariables: form.requiredEnvironmentVariables\n .split(\"\\n\")\n .map((name) => name.trim())\n .filter(Boolean),\n });\n return parsed.success ? parsed.data : null;\n};\n\nconst gateStatusKey = (status: LaunchReleaseGateStatus): TranslationKey => {\n switch (status) {\n case \"PASSED\":\n return \"settings.release.gateStatus.PASSED\";\n case \"FAILED\":\n return \"settings.release.gateStatus.FAILED\";\n case \"ACTION_REQUIRED\":\n return \"settings.release.gateStatus.ACTION_REQUIRED\";\n case \"STALE\":\n return \"settings.release.gateStatus.STALE\";\n }\n};\n\nconst humanizeGate = (key: string): string => {\n const name = key.split(\"/\").at(-1) ?? key;\n const words = name.toLowerCase().replaceAll(\"_\", \" \");\n return `${words.slice(0, 1).toUpperCase()}${words.slice(1)}`;\n};\n\nexport type LaunchReleaseViewProps = {\n creating: boolean;\n exporting: boolean;\n onCreate: (environment: LaunchEnvironment, workItemIds: readonly string[]) => void;\n onExport: (releaseId: string) => void;\n onSave: (configuration: LaunchEnvironmentConfiguration, environment: LaunchEnvironment | null) => void;\n saving: boolean;\n snapshot: LaunchReleaseProjectResponse;\n workItems: readonly WorkItem[];\n};\n\nexport const LaunchReleaseView = ({\n creating,\n exporting,\n onCreate,\n onExport,\n onSave,\n saving,\n snapshot,\n workItems,\n}: LaunchReleaseViewProps): React.JSX.Element => {\n const { t } = useI18n();\n const initialKind = snapshot.environments[0]?.kind ?? \"PREVIEW\";\n const [form, setForm] = useState(() => formFor(snapshot, initialKind));\n const [selectedWorkItemIds, setSelectedWorkItemIds] = useState<readonly string[]>(\n () => snapshot.latestRelease?.selectedWorkItems.map(({ workItemId }) => workItemId) ?? [],\n );\n const configuration = configurationFor(form);\n const environment = snapshot.environments.find(({ kind }) => kind === form.kind) ?? null;\n const configurationIsCurrent =\n configuration !== null &&\n environment !== null &&\n JSON.stringify(configuration) ===\n JSON.stringify({\n kind: environment.kind,\n name: environment.name,\n presetId: environment.presetId,\n presetRevision: environment.presetRevision,\n publicBaseUrl: environment.publicBaseUrl,\n healthPath: environment.healthPath,\n requiredEnvironmentVariables: environment.requiredEnvironmentVariables,\n });\n const update = <K extends keyof EnvironmentForm>(key: K, value: EnvironmentForm[K]): void => {\n setForm((current) => ({ ...current, [key]: value }));\n };\n\n return (\n <div className=\"launch-settings release-settings\">\n <div className=\"launch-settings__heading\">\n <div>\n <h4>{t(\"settings.release.title\")}</h4>\n <p>{t(\"settings.release.description\")}</p>\n </div>\n {snapshot.latestRelease === null ? null : (\n <span\n className={cn(\"launch-settings__state\", snapshot.freshness?.status === \"CURRENT\" && \"is-ready\")}\n >\n <Icon name={snapshot.freshness?.status === \"CURRENT\" ? \"check\" : \"warning\"} size={13} />\n {t(\n snapshot.freshness?.status === \"CURRENT\"\n ? \"settings.release.current\"\n : \"settings.release.stale\",\n )}\n </span>\n )}\n </div>\n\n <div className=\"launch-settings__notice\" role=\"note\">\n <strong>{t(\"settings.release.boundaryTitle\")}</strong>\n <p>{t(\"settings.release.boundaryNotice\")}</p>\n </div>\n\n <div className=\"launch-settings__form\">\n <label>\n <span>{t(\"settings.release.kind\")}</span>\n <select\n onChange={(event) => {\n const kind = event.target.value as LaunchEnvironmentKind;\n setForm(formFor(snapshot, kind));\n }}\n value={form.kind}\n >\n <option value=\"PREVIEW\">{t(\"settings.release.kind.PREVIEW\")}</option>\n <option value=\"PRODUCTION\">{t(\"settings.release.kind.PRODUCTION\")}</option>\n </select>\n </label>\n <label>\n <span>{t(\"settings.release.name\")}</span>\n <input\n onChange={(event) => {\n update(\"name\", event.target.value);\n }}\n type=\"text\"\n value={form.name}\n />\n </label>\n <label>\n <span>{t(\"settings.release.publicOrigin\")}</span>\n <input\n onChange={(event) => {\n update(\"publicBaseUrl\", event.target.value);\n }}\n placeholder=\"https://preview.example.com\"\n type=\"text\"\n value={form.publicBaseUrl}\n />\n </label>\n <label>\n <span>{t(\"settings.release.healthPath\")}</span>\n <input\n onChange={(event) => {\n update(\"healthPath\", event.target.value);\n }}\n type=\"text\"\n value={form.healthPath}\n />\n </label>\n <label className=\"launch-settings__wide\">\n <span>{t(\"settings.release.variables\")}</span>\n <textarea\n onChange={(event) => {\n update(\"requiredEnvironmentVariables\", event.target.value);\n }}\n rows={2}\n value={form.requiredEnvironmentVariables}\n />\n </label>\n </div>\n {configuration === null ? (\n <p className=\"launch-settings__error\" role=\"alert\">\n {t(\"settings.release.invalid\")}\n </p>\n ) : null}\n <div className=\"launch-settings__actions\">\n <Button\n disabled={configuration === null || configurationIsCurrent || creating}\n loading={saving}\n onClick={() => {\n if (configuration !== null) onSave(configuration, environment);\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {environment === null ? t(\"settings.release.save\") : t(\"settings.release.update\")}\n </Button>\n </div>\n\n <fieldset className=\"release-scope\">\n <legend>{t(\"settings.release.scope\")}</legend>\n <p>{t(\"settings.release.scopeNotice\")}</p>\n {workItems.length === 0 ? (\n <p className=\"settings__note\">{t(\"settings.release.noWorkItems\")}</p>\n ) : (\n workItems.map((workItem) => (\n <label key={workItem.id}>\n <input\n checked={selectedWorkItemIds.includes(workItem.id)}\n onChange={(event) => {\n setSelectedWorkItemIds((current) =>\n event.target.checked\n ? [...current, workItem.id]\n : current.filter((id) => id !== workItem.id),\n );\n }}\n type=\"checkbox\"\n />\n <span>{workItem.title}</span>\n <small>{workItem.state}</small>\n </label>\n ))\n )}\n </fieldset>\n <div className=\"launch-settings__actions\">\n <Button\n disabled={environment === null || saving}\n loading={creating}\n onClick={() => {\n if (environment !== null) onCreate(environment, selectedWorkItemIds);\n }}\n type=\"button\"\n >\n {t(\"settings.release.create\")}\n </Button>\n {snapshot.latestRelease === null ? null : (\n <Button\n loading={exporting}\n onClick={() => {\n if (snapshot.latestRelease !== null) onExport(snapshot.latestRelease.id);\n }}\n type=\"button\"\n >\n {t(\"settings.release.export\")}\n </Button>\n )}\n </div>\n\n {snapshot.latestRelease === null ? (\n <p className=\"settings__note\">{t(\"settings.release.none\")}</p>\n ) : (\n <section className=\"launch-run\" aria-label={t(\"settings.release.results\")}>\n <div className=\"launch-run__heading\">\n <strong>\n {t(\"settings.release.passed\", {\n passed: snapshot.latestRelease.passedRequiredGateCount,\n required: snapshot.latestRelease.requiredGateCount,\n })}\n </strong>\n <span>{t(\"settings.release.tree\", { tree: snapshot.latestRelease.sourceTree.slice(0, 8) })}</span>\n </div>\n <ul className=\"launch-gates\">\n {snapshot.latestRelease.gates.map((gate) => (\n <li key={gate.key}>\n <span className={cn(\"launch-gates__status\", `is-${gate.status.toLowerCase()}`)}>\n <Icon name={gate.status === \"PASSED\" ? \"check\" : \"warning\"} size={14} />\n {t(gateStatusKey(gate.status))}\n </span>\n <div>\n <strong>{humanizeGate(gate.key)}</strong>\n <p>{gate.summary}</p>\n </div>\n </li>\n ))}\n </ul>\n </section>\n )}\n </div>\n );\n};\n\nconst deploymentBlockKey = (code: DeploymentPreflightFailureCode): TranslationKey => {\n switch (code) {\n case \"RELEASE_STALE\":\n return \"settings.deploy.block.RELEASE_STALE\";\n case \"RELEASE_GATES_BLOCKED\":\n return \"settings.deploy.block.RELEASE_GATES_BLOCKED\";\n case \"ENVIRONMENT_UNSUPPORTED\":\n return \"settings.deploy.block.ENVIRONMENT_UNSUPPORTED\";\n case \"REPOSITORY_UNAVAILABLE\":\n return \"settings.deploy.block.REPOSITORY_UNAVAILABLE\";\n case \"REPOSITORY_PATH_NOT_CANONICAL\":\n return \"settings.deploy.block.REPOSITORY_PATH_NOT_CANONICAL\";\n case \"REPOSITORY_OPERATION_IN_PROGRESS\":\n return \"settings.deploy.block.REPOSITORY_OPERATION_IN_PROGRESS\";\n case \"SOURCE_DIRTY\":\n return \"settings.deploy.block.SOURCE_DIRTY\";\n case \"DETACHED_HEAD\":\n return \"settings.deploy.block.DETACHED_HEAD\";\n case \"REMOTE_INVALID\":\n return \"settings.deploy.block.REMOTE_INVALID\";\n case \"WORKFLOW_MISSING\":\n return \"settings.deploy.block.WORKFLOW_MISSING\";\n case \"WORKFLOW_NOT_REGULAR\":\n return \"settings.deploy.block.WORKFLOW_NOT_REGULAR\";\n case \"WORKFLOW_TRIGGER_MISSING\":\n return \"settings.deploy.block.WORKFLOW_TRIGGER_MISSING\";\n case \"WORKFLOW_TOO_LARGE\":\n return \"settings.deploy.block.WORKFLOW_TOO_LARGE\";\n case \"CLI_UNAVAILABLE\":\n return \"settings.deploy.block.CLI_UNAVAILABLE\";\n case \"AUTH_REQUIRED\":\n return \"settings.deploy.block.AUTH_REQUIRED\";\n case \"REMOTE_BRANCH_UNAVAILABLE\":\n return \"settings.deploy.block.REMOTE_BRANCH_UNAVAILABLE\";\n case \"REMOTE_COMMIT_MISMATCH\":\n return \"settings.deploy.block.REMOTE_COMMIT_MISMATCH\";\n case \"PREVIEW_PROMOTION_REQUIRED\":\n return \"settings.deploy.block.PREVIEW_PROMOTION_REQUIRED\";\n }\n};\n\nconst DeploymentTarget = ({ target }: { target: GithubActionsDeploymentTarget }): React.JSX.Element => {\n const { t } = useI18n();\n return (\n <dl className=\"deployment-target\">\n <div>\n <dt>{t(\"settings.deploy.environment\")}</dt>\n <dd>\n {target.presetId === \"GITHUB_ACTIONS_ENVIRONMENT_WORKFLOW_V2\"\n ? t(`settings.deploy.environment.${target.environmentKind}`)\n : t(\"settings.deploy.environment.LEGACY\")}\n </dd>\n </div>\n <div>\n <dt>{t(\"settings.deploy.repository\")}</dt>\n <dd>{target.repositorySlug}</dd>\n </div>\n <div>\n <dt>{t(\"settings.deploy.branch\")}</dt>\n <dd>{target.branch}</dd>\n </div>\n <div>\n <dt>{t(\"settings.deploy.commit\")}</dt>\n <dd>{target.commitSha.slice(0, 12)}</dd>\n </div>\n <div>\n <dt>{t(\"settings.deploy.workflow\")}</dt>\n <dd>{target.workflowPath}</dd>\n </div>\n </dl>\n );\n};\n\nexport type GuidedDeploymentViewProps = {\n adopting: boolean;\n approving: boolean;\n observing: boolean;\n onAdopt: (preview: DeploymentPreviewResponse) => void;\n onApprove: (deployment: Deployment) => void;\n onObserve: (deployment: Deployment) => void;\n onStart: (deployment: Deployment) => void;\n preview: DeploymentPreviewResponse | null;\n previewLoading: boolean;\n releaseId: string | null;\n snapshot: GuidedDeploymentProjectResponse;\n starting: boolean;\n};\n\nexport const GuidedDeploymentView = ({\n adopting,\n approving,\n observing,\n onAdopt,\n onApprove,\n onObserve,\n onStart,\n preview,\n previewLoading,\n releaseId,\n snapshot,\n starting,\n}: GuidedDeploymentViewProps): React.JSX.Element => {\n const { t } = useI18n();\n const deployment = snapshot.latestDeployment?.releaseId === releaseId ? snapshot.latestDeployment : null;\n const plan = deployment?.planId === snapshot.latestPlan?.id ? snapshot.latestPlan : null;\n const target = plan?.target ?? (preview?.status === \"READY\" ? preview.target : null);\n const environmentKind =\n plan?.revision === 2\n ? plan.environmentKind\n : preview?.status === \"READY\"\n ? preview.target.environmentKind\n : null;\n const canAdopt =\n preview?.status === \"READY\" &&\n (deployment === null || deployment.status === \"FAILED\") &&\n deployment?.failureCode !== \"DISPATCH_OUTCOME_UNKNOWN\";\n\n return (\n <section className=\"launch-settings deployment-settings\" aria-label={t(\"settings.deploy.title\")}>\n <div className=\"launch-settings__heading\">\n <div>\n <h4>{t(\"settings.deploy.title\")}</h4>\n <p>{t(\"settings.deploy.description\")}</p>\n </div>\n {deployment === null ? null : (\n <span className={cn(\"launch-settings__state\", deployment.status === \"SUCCEEDED\" && \"is-ready\")}>\n <Icon name={deployment.status === \"SUCCEEDED\" ? \"check\" : \"warning\"} size={13} />\n {t(`settings.deploy.status.${deployment.status}`)}\n </span>\n )}\n </div>\n\n <div className=\"launch-settings__notice\" role=\"note\">\n <strong>{t(\"settings.deploy.boundaryTitle\")}</strong>\n <p>{t(\"settings.deploy.boundaryNotice\")}</p>\n </div>\n\n {releaseId === null ? (\n <p className=\"settings__note\">{t(\"settings.deploy.noRelease\")}</p>\n ) : previewLoading ? (\n <p className=\"settings__note\">{t(\"settings.deploy.loading\")}</p>\n ) : preview?.status === \"BLOCKED\" ? (\n <div className=\"deployment-message\" role=\"status\">\n <Icon name=\"warning\" size={16} />\n <p>{t(deploymentBlockKey(preview.code))}</p>\n </div>\n ) : null}\n\n {target === null ? null : <DeploymentTarget target={target} />}\n\n {deployment?.status === \"PENDING_APPROVAL\" ? (\n <div className=\"deployment-confirmation\">\n <p>\n {t(\"settings.deploy.approvalNotice\", {\n environment: t(`settings.deploy.environment.${environmentKind ?? \"LEGACY\"}`),\n })}\n </p>\n <Button\n loading={approving}\n onClick={() => {\n onApprove(deployment);\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(\"settings.deploy.approve\")}\n </Button>\n </div>\n ) : null}\n\n {deployment?.status === \"APPROVED\" ? (\n <div className=\"deployment-confirmation\">\n <p>\n {t(\"settings.deploy.approvedNotice\", {\n environment: t(`settings.deploy.environment.${environmentKind ?? \"LEGACY\"}`),\n })}\n </p>\n <Button\n loading={starting}\n onClick={() => {\n onStart(deployment);\n }}\n type=\"button\"\n >\n {t(\"settings.deploy.startApproved\")}\n </Button>\n </div>\n ) : null}\n\n {deployment?.status === \"UNKNOWN\" ? (\n <div className=\"deployment-message is-critical\" role=\"alert\">\n <Icon name=\"warning\" size={16} />\n <p>{t(\"settings.deploy.unknownNotice\")}</p>\n </div>\n ) : null}\n\n {deployment?.status === \"FAILED\" ? (\n <div className=\"deployment-message\" role=\"status\">\n <Icon name=\"warning\" size={16} />\n <p>{t(\"settings.deploy.failedNotice\", { code: deployment.failureCode ?? \"UNKNOWN\" })}</p>\n </div>\n ) : null}\n\n {deployment?.remoteRunUrl === null || deployment === null ? null : (\n <p className=\"deployment-run-link\">\n <a href={deployment.remoteRunUrl} rel=\"noreferrer\" target=\"_blank\">\n {t(\"settings.deploy.openRun\")}\n </a>\n </p>\n )}\n\n {deployment !== null &&\n [\"RUNNING\", \"UNKNOWN\"].includes(deployment.status) &&\n deployment.remoteRunId !== null ? (\n <div className=\"launch-settings__actions\">\n <Button\n loading={observing}\n onClick={() => {\n onObserve(deployment);\n }}\n type=\"button\"\n >\n {t(\"settings.deploy.observe\")}\n </Button>\n </div>\n ) : null}\n\n {canAdopt ? (\n <div className=\"deployment-confirmation\">\n <p>\n {t(\"settings.deploy.planNotice\", {\n environment: t(`settings.deploy.environment.${environmentKind ?? \"LEGACY\"}`),\n })}\n </p>\n <Button\n loading={adopting}\n onClick={() => {\n onAdopt(preview);\n }}\n type=\"button\"\n >\n {deployment === null ? t(\"settings.deploy.adopt\") : t(\"settings.deploy.adoptAgain\")}\n </Button>\n </div>\n ) : null}\n\n <p className=\"settings__note\">{t(\"settings.deploy.rollbackUnavailable\")}</p>\n </section>\n );\n};\n\nconst GuidedDeploymentPanel = ({\n projectId,\n releaseId,\n}: {\n projectId: string;\n releaseId: string | null;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const snapshotQuery = useGuidedDeployment(projectId);\n const previewQuery = useGuidedDeploymentPreview(projectId, releaseId ?? undefined);\n const adopt = useAdoptGuidedDeploymentPlan();\n const approve = useApproveGuidedDeployment();\n const start = useStartGuidedDeployment();\n const observe = useObserveGuidedDeployment();\n const snapshot = snapshotQuery.data;\n const error =\n adopt.error instanceof Error\n ? adopt.error\n : approve.error instanceof Error\n ? approve.error\n : start.error instanceof Error\n ? start.error\n : observe.error instanceof Error\n ? observe.error\n : snapshotQuery.error instanceof Error\n ? snapshotQuery.error\n : previewQuery.error instanceof Error\n ? previewQuery.error\n : null;\n\n if (snapshot === undefined) {\n return (\n <section className=\"launch-settings deployment-settings\">\n <h4>{t(\"settings.deploy.title\")}</h4>\n <p className={error === null ? \"settings__note\" : \"launch-settings__error\"}>\n {error?.message ?? t(\"settings.deploy.loading\")}\n </p>\n </section>\n );\n }\n\n return (\n <>\n <GuidedDeploymentView\n adopting={adopt.isPending}\n approving={approve.isPending}\n observing={observe.isPending}\n onAdopt={(preview) => {\n adopt.mutate(preview);\n }}\n onApprove={(deployment) => {\n approve.mutate(deployment);\n }}\n onObserve={(deployment) => {\n observe.mutate(deployment);\n }}\n onStart={(deployment) => {\n start.mutate(deployment);\n }}\n preview={previewQuery.data ?? null}\n previewLoading={releaseId !== null && previewQuery.isPending}\n releaseId={releaseId}\n snapshot={snapshot}\n starting={start.isPending}\n />\n {error === null ? null : (\n <p className=\"launch-settings__error\" role=\"alert\">\n {error.message}\n </p>\n )}\n </>\n );\n};\n\nconst downloadEvidence = (releaseId: string, markdown: string): void => {\n const url = URL.createObjectURL(new Blob([markdown], { type: \"text/markdown;charset=utf-8\" }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `loomrail-release-${releaseId}.md`;\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(url);\n};\n\nexport const LaunchReleasePanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const snapshotQuery = useLaunchRelease(project.id);\n const workItemsQuery = useProjectWorkItems(project.id);\n const save = useSaveLaunchEnvironment();\n const create = useCreateLaunchRelease();\n const exportEvidence = useExportLaunchEvidencePackage();\n const snapshot = snapshotQuery.data;\n const error =\n save.error instanceof Error\n ? save.error\n : create.error instanceof Error\n ? create.error\n : exportEvidence.error instanceof Error\n ? exportEvidence.error\n : snapshotQuery.error instanceof Error\n ? snapshotQuery.error\n : workItemsQuery.error instanceof Error\n ? workItemsQuery.error\n : null;\n\n if (snapshot === undefined || workItemsQuery.data === undefined) {\n return (\n <div className=\"launch-settings release-settings\">\n <h4>{t(\"settings.release.title\")}</h4>\n <p className={error === null ? \"settings__note\" : \"launch-settings__error\"}>\n {error?.message ?? t(\"settings.release.loading\")}\n </p>\n </div>\n );\n }\n\n return (\n <>\n <LaunchReleaseView\n creating={create.isPending}\n exporting={exportEvidence.isPending}\n key={`${snapshot.environments.map(({ id, version }) => `${id}:${version.toString()}`).join(\",\")}:${snapshot.latestRelease?.id ?? \"none\"}`}\n onCreate={(environment, workItemIds) => {\n create.mutate({ environment, snapshot, workItemIds });\n }}\n onExport={(releaseId) => {\n exportEvidence.mutate(releaseId, {\n onSuccess: (evidence) => {\n downloadEvidence(evidence.releaseId, evidence.markdown);\n },\n });\n }}\n onSave={(configuration, environment) => {\n save.mutate({ configuration, environment, snapshot });\n }}\n saving={save.isPending}\n snapshot={snapshot}\n workItems={workItemsQuery.data.workItems.filter(({ state }) => state !== \"CANCELLED\")}\n />\n <GuidedDeploymentPanel projectId={project.id} releaseId={snapshot.latestRelease?.id ?? null} />\n {error === null ? null : (\n <p className=\"launch-settings__error\" role=\"alert\">\n {error.message}\n </p>\n )}\n </>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport type {\n ListedProject,\n McpCapabilityProbeState,\n McpProfileCandidate,\n McpProfileProposal,\n McpProfileView,\n} from \"@loomrail/contracts\";\nimport { Button, Checkbox, Field, Icon, Textarea, TextField } from \"@loomrail/ui\";\n\nimport { LocalApiError } from \"../api\";\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport {\n useConfirmMcpProfile,\n useGrantMcpProfile,\n useProbeMcpProfile,\n useProjectMcpProfiles,\n useProposeContext7Preset,\n useProposeMcpProfile,\n useRevokeMcpProfile,\n} from \"../workspace\";\n\ntype McpDraft = {\n profileId: string | null;\n name: string;\n executable: string;\n args: string;\n declaredTools: string;\n};\n\nconst emptyDraft: McpDraft = {\n profileId: null,\n name: \"\",\n executable: \"\",\n args: \"\",\n declaredTools: \"\",\n};\n\nconst lines = (value: string): string[] =>\n value\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\");\n\nconst candidateFromDraft = (draft: McpDraft): McpProfileCandidate => ({\n profileId: draft.profileId,\n name: draft.name.trim(),\n executable: draft.executable.trim(),\n args: lines(draft.args),\n declaredTools: lines(draft.declaredTools),\n});\n\nconst probeStateKeys: Record<McpCapabilityProbeState, TranslationKey> = {\n READY: \"settings.mcp.probe.ready\",\n SPAWN_FAILED: \"settings.mcp.probe.spawnFailed\",\n TIMED_OUT: \"settings.mcp.probe.timedOut\",\n INVALID_RESPONSE: \"settings.mcp.probe.invalid\",\n OUTPUT_LIMIT_REACHED: \"settings.mcp.probe.outputLimit\",\n UNSUPPORTED_PROTOCOL: \"settings.mcp.probe.unsupported\",\n PROCESS_EXITED: \"settings.mcp.probe.exited\",\n};\n\nconst ExactCommand = ({ candidate }: { candidate: McpProfileCandidate }): React.JSX.Element => (\n <ol className=\"mcp-command\" aria-label=\"argv\">\n {[candidate.executable, ...candidate.args].map((argument, index) => (\n <li key={`${index.toString()}-${argument}`}>\n <span>{index === 0 ? \"executable\" : `argv[${index.toString()}]`}</span>\n <code>{argument}</code>\n </li>\n ))}\n </ol>\n);\n\nconst McpConsentPreview = ({\n proposal,\n onCancel,\n onConfirmed,\n}: {\n proposal: McpProfileProposal;\n onCancel: () => void;\n onConfirmed: () => void;\n}): React.JSX.Element => {\n const { locale, t } = useI18n();\n const confirm = useConfirmMcpProfile();\n const [accepted, setAccepted] = useState(false);\n\n return (\n <div className=\"mcp-consent\">\n <div className=\"mcp-consent__heading\">\n <Icon name=\"warning\" size={16} />\n <div>\n <strong>{t(\"settings.mcp.consent.title\")}</strong>\n <p>{t(\"settings.mcp.consent.description\")}</p>\n </div>\n </div>\n <ExactCommand candidate={proposal.candidate} />\n <p className=\"mcp-consent__expiry\">\n {t(\"settings.mcp.consent.expires\", {\n time: new Intl.DateTimeFormat(locale, { timeStyle: \"short\" }).format(new Date(proposal.expiresAt)),\n })}\n </p>\n <Checkbox\n checked={accepted}\n description={t(\"settings.mcp.consent.checkboxDescription\")}\n label={t(\"settings.mcp.consent.checkbox\")}\n onCheckedChange={(checked) => {\n setAccepted(checked === true);\n }}\n />\n <div className=\"mcp-actions\">\n <Button\n disabled={!accepted}\n loading={confirm.isPending}\n onClick={() => {\n confirm.mutate(proposal, { onSuccess: onConfirmed });\n }}\n variant=\"primary\"\n >\n {t(\"settings.mcp.consent.confirm\")}\n </Button>\n <Button disabled={confirm.isPending} onClick={onCancel}>\n {t(\"action.cancel\")}\n </Button>\n </div>\n {confirm.error instanceof Error ? (\n <p className=\"mcp-settings__error\" role=\"alert\">\n {confirm.error.message}\n </p>\n ) : null}\n </div>\n );\n};\n\nconst McpProfile = ({\n onRevise,\n profile,\n projectId,\n projectVersion,\n}: {\n onRevise: (profile: McpProfileView) => void;\n profile: McpProfileView;\n projectId: string;\n projectVersion: number;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const probe = useProbeMcpProfile();\n const grant = useGrantMcpProfile();\n const revoke = useRevokeMcpProfile();\n const [selectedTools, setSelectedTools] = useState<string[]>(profile.grant?.tools ?? []);\n const [attested, setAttested] = useState(false);\n const capability = profile.capability;\n const availableTools = useMemo(() => {\n if (capability?.state !== \"READY\") return [];\n const discovered = new Set(capability.tools);\n return profile.revision.declaredTools.filter((tool) => discovered.has(tool));\n }, [capability, profile.revision.declaredTools]);\n const operationError =\n probe.error instanceof Error\n ? probe.error\n : grant.error instanceof Error\n ? grant.error\n : revoke.error instanceof Error\n ? revoke.error\n : null;\n\n useEffect(() => {\n setSelectedTools(profile.grant?.tools ?? []);\n setAttested(false);\n }, [profile.grant]);\n\n return (\n <article className=\"mcp-profile\">\n <div className=\"mcp-profile__heading\">\n <div>\n <strong>{profile.revision.name}</strong>\n <span>{t(\"settings.mcp.revision\", { revision: profile.revision.revision })}</span>\n </div>\n <span>\n {profile.grant?.enabled === true\n ? t(\"settings.mcp.grant.enabled\")\n : profile.grant === null\n ? t(\"settings.mcp.grant.none\")\n : t(\"settings.mcp.grant.revoked\")}\n </span>\n </div>\n <ExactCommand candidate={{ ...profile.revision, profileId: profile.revision.profileId }} />\n <div className=\"mcp-profile__capability\">\n <strong>{t(\"settings.mcp.capability\")}</strong>\n <span>\n {capability === null ? t(\"settings.mcp.probe.notRun\") : t(probeStateKeys[capability.state])}\n </span>\n </div>\n {capability?.state === \"READY\" ? (\n <div className=\"mcp-tools\">\n <div>\n <strong>{t(\"settings.mcp.declaredTools\")}</strong>\n <span>{profile.revision.declaredTools.join(\", \")}</span>\n </div>\n <div>\n <strong>{t(\"settings.mcp.discoveredTools\")}</strong>\n <span>{capability.tools.join(\", \") || t(\"settings.mcp.tools.none\")}</span>\n </div>\n </div>\n ) : null}\n <div className=\"mcp-actions\">\n <Button\n loading={probe.isPending}\n onClick={() => {\n probe.mutate({ projectId, revision: profile.revision });\n }}\n size=\"sm\"\n >\n {capability === null ? t(\"settings.mcp.probe.run\") : t(\"settings.mcp.probe.again\")}\n </Button>\n <Button\n onClick={() => {\n onRevise(profile);\n }}\n size=\"sm\"\n >\n {t(\"settings.mcp.revise\")}\n </Button>\n </div>\n\n {capability?.state === \"READY\" && profile.grant?.enabled !== false ? (\n <div className=\"mcp-grant\">\n <strong>{t(\"settings.mcp.grant.choose\")}</strong>\n {availableTools.map((tool) => (\n <Checkbox\n checked={selectedTools.includes(tool)}\n key={tool}\n label={tool}\n onCheckedChange={(checked) => {\n setSelectedTools((current) =>\n checked === true\n ? [...new Set([...current, tool])].sort()\n : current.filter((candidate) => candidate !== tool),\n );\n }}\n />\n ))}\n <Checkbox\n checked={attested}\n description={t(\"settings.mcp.grant.attestationDescription\")}\n label={t(\"settings.mcp.grant.attestation\")}\n onCheckedChange={(checked) => {\n setAttested(checked === true);\n }}\n />\n <div className=\"mcp-actions\">\n <Button\n disabled={!attested || selectedTools.length === 0}\n loading={grant.isPending}\n onClick={() => {\n grant.mutate({\n projectId,\n expectedProjectVersion: projectVersion,\n revision: profile.revision,\n expectedGrantVersion: profile.grant?.version ?? null,\n tools: selectedTools,\n });\n }}\n size=\"sm\"\n variant=\"primary\"\n >\n {profile.grant === null ? t(\"settings.mcp.grant.enable\") : t(\"settings.mcp.grant.update\")}\n </Button>\n {profile.grant?.enabled === true ? (\n <Button\n loading={revoke.isPending}\n onClick={() => {\n revoke.mutate({\n projectId,\n expectedProjectVersion: projectVersion,\n revision: profile.revision,\n expectedGrantVersion: profile.grant?.version ?? 0,\n });\n }}\n size=\"sm\"\n >\n {t(\"settings.mcp.grant.revoke\")}\n </Button>\n ) : null}\n </div>\n </div>\n ) : profile.grant?.enabled === false ? (\n <p className=\"settings__note\">{t(\"settings.mcp.grant.revokedDescription\")}</p>\n ) : null}\n {operationError === null ? null : (\n <p className=\"mcp-settings__error\" role=\"alert\">\n {operationError.message}\n </p>\n )}\n </article>\n );\n};\n\nexport const McpSettingsPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const profilesQuery = useProjectMcpProfiles(project.id);\n const propose = useProposeMcpProfile();\n const proposeContext7 = useProposeContext7Preset();\n const [draft, setDraft] = useState<McpDraft>(emptyDraft);\n const [proposal, setProposal] = useState<McpProfileProposal | null>(null);\n const profiles = profilesQuery.data?.profiles ?? [];\n const projectVersion = profilesQuery.data?.projectVersion ?? project.version;\n const context7Configured = profiles.some(({ revision }) => revision.name === \"Context7\");\n // The daemon's \"the bundled recipe is already the approved one\" answer. It is the successful end\n // of pressing the button, not a failure, so it is reported separately from the error slot below.\n const context7Unchanged =\n proposeContext7.error instanceof LocalApiError && proposeContext7.error.code === \"PROFILE_UNCHANGED\";\n const candidate = candidateFromDraft(draft);\n const canPropose =\n candidate.name !== \"\" &&\n candidate.executable !== \"\" &&\n candidate.declaredTools.length > 0 &&\n !propose.isPending;\n\n useEffect(() => {\n setDraft(emptyDraft);\n setProposal(null);\n }, [project.id]);\n\n const setField = <Key extends keyof McpDraft>(key: Key, value: McpDraft[Key]): void => {\n setDraft((current) => ({ ...current, [key]: value }));\n setProposal(null);\n };\n\n return (\n <div className=\"mcp-settings\">\n <div className=\"mcp-settings__heading\">\n <div>\n <h4>{t(\"settings.mcp.title\")}</h4>\n <p>{t(\"settings.mcp.description\")}</p>\n </div>\n </div>\n\n <div className=\"mcp-preset\">\n <div>\n <strong>{t(\"settings.mcp.context7.title\")}</strong>\n <p>{t(\"settings.mcp.context7.description\")}</p>\n <p>{t(\"settings.mcp.context7.privacy\")}</p>\n {context7Configured ? <p>{t(\"settings.mcp.context7.configured\")}</p> : null}\n </div>\n {/*\n The button stays after the preset is configured. A Loomrail update can move the bundled\n Context7 entrypoint, and the daemon route already answers that case -- it proposes a new\n revision of the same profile, and refuses with PROFILE_UNCHANGED only when the digest is\n identical. Hiding the control was the one thing that made that revision unreachable, so an\n owner stayed on an old approved recipe with nothing to press. PROFILE_UNCHANGED is shown as\n the ordinary \"nothing to do\" answer rather than as an error.\n */}\n <Button\n loading={proposeContext7.isPending}\n onClick={() => {\n proposeContext7.mutate(\n { projectId: project.id, expectedProjectVersion: projectVersion },\n { onSuccess: setProposal },\n );\n }}\n size=\"sm\"\n >\n {context7Configured ? t(\"settings.mcp.context7.update\") : t(\"settings.mcp.context7.review\")}\n </Button>\n </div>\n {context7Unchanged ? <p className=\"settings__note\">{t(\"settings.mcp.context7.current\")}</p> : null}\n\n {profilesQuery.isPending ? (\n <p className=\"settings__note\">{t(\"settings.mcp.loading\")}</p>\n ) : profiles.length === 0 ? (\n <p className=\"settings__note\">{t(\"settings.mcp.empty\")}</p>\n ) : (\n <div className=\"mcp-profiles\">\n {profiles.map((profile) => (\n <McpProfile\n key={profile.revision.id}\n onRevise={(selected) => {\n setDraft({\n profileId: selected.revision.profileId,\n name: selected.revision.name,\n executable: selected.revision.executable,\n args: selected.revision.args.join(\"\\n\"),\n declaredTools: selected.revision.declaredTools.join(\"\\n\"),\n });\n setProposal(null);\n }}\n profile={profile}\n projectId={project.id}\n projectVersion={projectVersion}\n />\n ))}\n </div>\n )}\n\n <form\n className=\"mcp-form\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!canPropose) return;\n propose.mutate(\n { projectId: project.id, expectedProjectVersion: projectVersion, candidate },\n { onSuccess: setProposal },\n );\n }}\n >\n <div className=\"mcp-form__heading\">\n <strong>{draft.profileId === null ? t(\"settings.mcp.add\") : t(\"settings.mcp.newRevision\")}</strong>\n {draft.profileId === null ? null : (\n <Button\n onClick={() => {\n setDraft(emptyDraft);\n setProposal(null);\n }}\n size=\"sm\"\n type=\"button\"\n >\n {t(\"settings.mcp.cancelRevision\")}\n </Button>\n )}\n </div>\n <Field htmlFor=\"mcp-profile-name\" label={t(\"settings.mcp.name\")}>\n <TextField\n id=\"mcp-profile-name\"\n onChange={(event) => {\n setField(\"name\", event.target.value);\n }}\n value={draft.name}\n />\n </Field>\n <Field\n description={t(\"settings.mcp.executableDescription\")}\n htmlFor=\"mcp-profile-executable\"\n label={t(\"settings.mcp.executable\")}\n >\n <TextField\n autoComplete=\"off\"\n id=\"mcp-profile-executable\"\n onChange={(event) => {\n setField(\"executable\", event.target.value);\n }}\n placeholder=\"/absolute/path/to/mcp-server\"\n spellCheck={false}\n value={draft.executable}\n />\n </Field>\n <Field\n description={t(\"settings.mcp.argsDescription\")}\n htmlFor=\"mcp-profile-args\"\n label={t(\"settings.mcp.args\")}\n >\n <Textarea\n id=\"mcp-profile-args\"\n onChange={(event) => {\n setField(\"args\", event.target.value);\n }}\n rows={3}\n spellCheck={false}\n value={draft.args}\n />\n </Field>\n <Field\n description={t(\"settings.mcp.toolsDescription\")}\n htmlFor=\"mcp-profile-tools\"\n label={t(\"settings.mcp.declaredTools\")}\n required\n >\n <Textarea\n id=\"mcp-profile-tools\"\n onChange={(event) => {\n setField(\"declaredTools\", event.target.value);\n }}\n rows={3}\n spellCheck={false}\n value={draft.declaredTools}\n />\n </Field>\n <Button disabled={!canPropose} loading={propose.isPending} type=\"submit\">\n {t(\"settings.mcp.review\")}\n </Button>\n </form>\n\n {proposal === null ? null : (\n <McpConsentPreview\n onCancel={() => {\n setProposal(null);\n }}\n onConfirmed={() => {\n setProposal(null);\n setDraft(emptyDraft);\n }}\n proposal={proposal}\n />\n )}\n {propose.error instanceof Error ? (\n <p className=\"mcp-settings__error\" role=\"alert\">\n {propose.error.message}\n </p>\n ) : proposeContext7.error instanceof Error && !context7Unchanged ? (\n <p className=\"mcp-settings__error\" role=\"alert\">\n {proposeContext7.error.message}\n </p>\n ) : profilesQuery.error instanceof Error ? (\n <p className=\"mcp-settings__error\" role=\"alert\">\n {profilesQuery.error.message}\n </p>\n ) : null}\n <p className=\"mcp-settings__limit\">\n <Icon name=\"info\" size={14} />\n <span>{t(\"settings.mcp.limit\")}</span>\n </p>\n </div>\n );\n};\n","import { useEffect, useId, useState } from \"react\";\n\nimport type { ScaffoldOperation, ScaffoldProposal } from \"@loomrail/contracts\";\nimport { Button, Field, Icon, TextField } from \"@loomrail/ui\";\n\nimport { useI18n } from \"../i18n\";\nimport {\n useProposeProjectScaffold,\n useOpenProjectScaffolds,\n usePublishProjectScaffold,\n useRetryProjectScaffold,\n useWorkspace,\n} from \"../workspace\";\n\nexport const ProjectScaffoldPanel = (): React.JSX.Element => {\n const { t } = useI18n();\n const { selectProject } = useWorkspace();\n const inputId = useId();\n const headingId = useId();\n const [targetPath, setTargetPath] = useState(\"\");\n const [proposal, setProposal] = useState<ScaffoldProposal | null>(null);\n const [operation, setOperation] = useState<ScaffoldOperation | null>(null);\n const proposeMutation = useProposeProjectScaffold();\n const openOperationsQuery = useOpenProjectScaffolds();\n const publishMutation = usePublishProjectScaffold();\n const retryMutation = useRetryProjectScaffold();\n const recoveredOperation = openOperationsQuery.data?.at(0) ?? null;\n const trimmed = targetPath.trim();\n const error =\n proposeMutation.error instanceof Error\n ? proposeMutation.error.message\n : publishMutation.error instanceof Error\n ? publishMutation.error.message\n : retryMutation.error instanceof Error\n ? retryMutation.error.message\n : null;\n\n const selectCompletedProject = (completed: ScaffoldOperation): void => {\n setOperation(completed);\n if (completed.status === \"COMPLETED\") selectProject(completed.projectId);\n };\n\n useEffect(() => {\n if (proposal !== null || operation !== null || recoveredOperation === null) return;\n setTargetPath(recoveredOperation.proposal.targetPath);\n setProposal(recoveredOperation.proposal);\n setOperation(recoveredOperation);\n }, [operation, proposal, recoveredOperation]);\n\n return (\n <section aria-labelledby={headingId} className=\"project-scaffold\">\n <div className=\"project-scaffold__heading\">\n <div>\n <h4 id={headingId}>{t(\"settings.projects.create.title\")}</h4>\n <p>{t(\"settings.projects.create.description\")}</p>\n </div>\n <span>{t(\"settings.projects.create.recipe\")}</span>\n </div>\n\n {proposal === null ? (\n <form\n className=\"project-scaffold__form\"\n onSubmit={(event) => {\n event.preventDefault();\n if (trimmed === \"\") return;\n proposeMutation.mutate(trimmed, {\n onSuccess: (nextProposal) => {\n setProposal(nextProposal);\n setOperation(null);\n },\n });\n }}\n >\n <Field\n description={t(\"settings.projects.create.pathDescription\")}\n htmlFor={inputId}\n label={t(\"settings.projects.create.path\")}\n {...(error === null ? {} : { error })}\n >\n <TextField\n autoComplete=\"off\"\n id={inputId}\n invalid={error !== null}\n onChange={(event) => {\n setTargetPath(event.target.value);\n proposeMutation.reset();\n }}\n placeholder={t(\"settings.projects.create.placeholder\")}\n size=\"md\"\n spellCheck={false}\n value={targetPath}\n />\n </Field>\n <p className=\"project-scaffold__boundary\" role=\"note\">\n {t(\"settings.projects.create.boundary\")}\n </p>\n <Button disabled={trimmed === \"\"} loading={proposeMutation.isPending} type=\"submit\">\n {t(\"settings.projects.create.review\")}\n </Button>\n </form>\n ) : (\n <div className=\"project-scaffold__review\">\n <dl>\n <div>\n <dt>{t(\"settings.projects.create.target\")}</dt>\n <dd title={proposal.targetPath}>{proposal.targetPath}</dd>\n </div>\n <div>\n <dt>{t(\"settings.projects.create.version\")}</dt>\n <dd>\n {proposal.recipeId}@{proposal.recipeVersion}\n </dd>\n </div>\n </dl>\n\n <div className=\"project-scaffold__files\">\n <strong>{t(\"settings.projects.create.files\")}</strong>\n <ul>\n {proposal.files.map((file) => (\n <li key={file.path}>\n <code>{file.path}</code>\n <span>{t(\"settings.projects.create.bytes\", { count: file.bytes })}</span>\n </li>\n ))}\n <li>\n <code>{proposal.systemFiles[0]}</code>\n <span>{t(\"settings.projects.create.marker\")}</span>\n </li>\n </ul>\n </div>\n\n <p className=\"project-scaffold__digest\">\n <span>{t(\"settings.projects.create.digest\")}</span>\n <code>{proposal.proposalDigest}</code>\n </p>\n <p className=\"project-scaffold__boundary\" role=\"note\">\n {t(\"settings.projects.create.confirmation\")}\n </p>\n\n {operation?.status === \"COMPLETED\" ? (\n <div aria-live=\"polite\" className=\"project-scaffold__result is-complete\" role=\"status\">\n <Icon name=\"check\" size={16} />\n <div>\n <strong>{t(\"settings.projects.create.completed\")}</strong>\n <p>{t(\"settings.projects.create.next\")}</p>\n <ol>\n <li>\n {t(\"settings.projects.create.openTerminal\")} <code>{proposal.targetPath}</code>\n </li>\n <li>\n <code>pnpm install</code>\n </li>\n <li>\n <code>pnpm test</code>\n </li>\n </ol>\n </div>\n </div>\n ) : operation?.status === \"FAILED\" ? (\n <div aria-live=\"polite\" className=\"project-scaffold__result is-failed\" role=\"alert\">\n <Icon name=\"warning\" size={16} />\n <div>\n <strong>{t(\"settings.projects.create.failed\")}</strong>\n <p>\n {t(\"settings.projects.create.failedDescription\", {\n code: operation.lastErrorCode ?? \"SCAFFOLD_WRITE_FAILED\",\n })}\n </p>\n </div>\n </div>\n ) : operation?.status === \"PENDING\" ? (\n <div aria-live=\"polite\" className=\"project-scaffold__result\" role=\"status\">\n <div>\n <strong>{t(\"settings.projects.create.pending\")}</strong>\n <p>{t(\"settings.projects.create.pendingDescription\")}</p>\n </div>\n </div>\n ) : null}\n\n {error === null ? null : (\n <p className=\"project-scaffold__error\" role=\"alert\">\n {error}\n </p>\n )}\n\n <div className=\"project-scaffold__actions\">\n {operation === null ? (\n <>\n <Button\n disabled={publishMutation.isPending}\n onClick={() => {\n setProposal(null);\n publishMutation.reset();\n }}\n type=\"button\"\n variant=\"secondary\"\n >\n {t(\"action.back\")}\n </Button>\n <Button\n loading={publishMutation.isPending}\n onClick={() => {\n publishMutation.mutate(proposal, { onSuccess: selectCompletedProject });\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(\"settings.projects.create.confirm\")}\n </Button>\n </>\n ) : operation.status === \"FAILED\" ? (\n <Button\n loading={retryMutation.isPending}\n onClick={() => {\n retryMutation.mutate(operation, { onSuccess: selectCompletedProject });\n }}\n type=\"button\"\n >\n {t(\"settings.projects.create.retry\")}\n </Button>\n ) : (\n <Button\n onClick={() => {\n setProposal(null);\n setOperation(null);\n setTargetPath(\"\");\n }}\n type=\"button\"\n variant=\"secondary\"\n >\n {t(\"settings.projects.create.another\")}\n </Button>\n )}\n </div>\n </div>\n )}\n </section>\n );\n};\n","/* Hallmark · component: Project workspace strategy · genre: modern-minimal · theme: Loomrail\n * states: default · hover · focus · active · disabled · loading · error · success\n * contrast: inherited from @loomrail/ui semantic tokens\n * pre-emit critique: P5 H4 E4 S5 R5 V5\n */\nimport { useState } from \"react\";\nimport type { ListedProject, ProjectWorkspaceStrategySelection } from \"@loomrail/contracts\";\nimport { Button, Checkbox } from \"@loomrail/ui\";\n\nimport { useI18n } from \"../i18n\";\nimport { useProjectWorkspaceStrategy, useSetProjectWorkspaceStrategy } from \"../workspace\";\n\ntype ProjectWorkspaceStrategyViewProps = {\n acceptedRisk: boolean;\n confirmingShared: boolean;\n error: string | null;\n onAcceptedRiskChange: (accepted: boolean) => void;\n onCancelShared: () => void;\n onConfirmShared: () => void;\n onRequestShared: () => void;\n onSelectIsolated: () => void;\n repositoryPath: string;\n saving: boolean;\n selection: ProjectWorkspaceStrategySelection;\n};\n\nexport const ProjectWorkspaceStrategyView = ({\n acceptedRisk,\n confirmingShared,\n error,\n onAcceptedRiskChange,\n onCancelShared,\n onConfirmShared,\n onRequestShared,\n onSelectIsolated,\n repositoryPath,\n saving,\n selection,\n}: ProjectWorkspaceStrategyViewProps): React.JSX.Element => {\n const { t } = useI18n();\n\n return (\n <div className=\"workspace-strategy-settings\">\n <div className=\"workspace-strategy-settings__heading\">\n <h4>{t(\"settings.workspaceStrategy.title\")}</h4>\n <p>{t(\"settings.workspaceStrategy.description\")}</p>\n </div>\n\n <fieldset className=\"workspace-strategy-settings__choices\">\n <legend>{t(\"settings.workspaceStrategy.label\")}</legend>\n <label>\n <input\n checked={selection.strategy === \"ISOLATED_WORKTREE\"}\n disabled={saving}\n name=\"project-workspace-strategy\"\n onChange={onSelectIsolated}\n type=\"radio\"\n value=\"ISOLATED_WORKTREE\"\n />\n <span>\n <strong>{t(\"settings.workspaceStrategy.isolated\")}</strong>\n <small>{t(\"settings.workspaceStrategy.isolatedDescription\")}</small>\n </span>\n </label>\n <label>\n <input\n checked={selection.strategy === \"SHARED_CURRENT_DIRECTORY\"}\n disabled={saving}\n name=\"project-workspace-strategy\"\n onChange={onRequestShared}\n type=\"radio\"\n value=\"SHARED_CURRENT_DIRECTORY\"\n />\n <span>\n <strong>{t(\"settings.workspaceStrategy.shared\")}</strong>\n <small>{t(\"settings.workspaceStrategy.sharedDescription\", { path: repositoryPath })}</small>\n </span>\n </label>\n </fieldset>\n\n <p className=\"workspace-strategy-settings__scope\" role=\"note\">\n {t(\"settings.workspaceStrategy.scope\")}\n </p>\n\n {confirmingShared ? (\n <div className=\"workspace-strategy-settings__confirmation\" role=\"note\">\n <strong>{t(\"settings.workspaceStrategy.confirmTitle\")}</strong>\n <p>{t(\"settings.workspaceStrategy.confirmDescription\", { path: repositoryPath })}</p>\n <ul>\n <li>{t(\"settings.workspaceStrategy.confirmFiles\")}</li>\n <li>{t(\"settings.workspaceStrategy.confirmExternalTools\")}</li>\n <li>{t(\"settings.workspaceStrategy.confirmSerial\")}</li>\n </ul>\n <Checkbox\n checked={acceptedRisk}\n label={t(\"settings.workspaceStrategy.acknowledge\")}\n onCheckedChange={(checked) => {\n onAcceptedRiskChange(checked === true);\n }}\n />\n <div className=\"workspace-strategy-settings__actions\">\n <Button disabled={!acceptedRisk} loading={saving} onClick={onConfirmShared} variant=\"primary\">\n {t(\"settings.workspaceStrategy.confirm\")}\n </Button>\n <Button disabled={saving} onClick={onCancelShared}>\n {t(\"action.cancel\")}\n </Button>\n </div>\n </div>\n ) : null}\n\n {error === null ? null : (\n <p className=\"workspace-strategy-settings__error\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n};\n\nexport const ProjectWorkspaceStrategyPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const strategyQuery = useProjectWorkspaceStrategy(project.id);\n const setStrategy = useSetProjectWorkspaceStrategy();\n const [confirmingShared, setConfirmingShared] = useState(false);\n const [acceptedRisk, setAcceptedRisk] = useState(false);\n const selection = strategyQuery.data?.selection;\n\n const operationError =\n setStrategy.error instanceof Error\n ? setStrategy.error.message\n : strategyQuery.error instanceof Error\n ? strategyQuery.error.message\n : null;\n\n if (selection === undefined) {\n return (\n <div className=\"workspace-strategy-settings\">\n <div className=\"workspace-strategy-settings__heading\">\n <h4>{t(\"settings.workspaceStrategy.title\")}</h4>\n <p>{t(\"settings.workspaceStrategy.description\")}</p>\n </div>\n <p className=\"settings__note\">{operationError ?? t(\"settings.workspaceStrategy.loading\")}</p>\n </div>\n );\n }\n\n return (\n <ProjectWorkspaceStrategyView\n acceptedRisk={acceptedRisk}\n confirmingShared={confirmingShared}\n error={operationError}\n onAcceptedRiskChange={setAcceptedRisk}\n onCancelShared={() => {\n setConfirmingShared(false);\n setAcceptedRisk(false);\n }}\n onConfirmShared={() => {\n if (!acceptedRisk) return;\n setStrategy.mutate(\n { selection, strategy: \"SHARED_CURRENT_DIRECTORY\" },\n {\n onSuccess: () => {\n setConfirmingShared(false);\n setAcceptedRisk(false);\n },\n },\n );\n }}\n onRequestShared={() => {\n if (selection.strategy === \"SHARED_CURRENT_DIRECTORY\") return;\n setStrategy.reset();\n setAcceptedRisk(false);\n setConfirmingShared(true);\n }}\n onSelectIsolated={() => {\n setConfirmingShared(false);\n setAcceptedRisk(false);\n if (selection.strategy === \"ISOLATED_WORKTREE\") return;\n setStrategy.reset();\n setStrategy.mutate({ selection, strategy: \"ISOLATED_WORKTREE\" });\n }}\n repositoryPath={project.repositoryPath}\n saving={setStrategy.isPending}\n selection={selection}\n />\n );\n};\n","import type {\n ListedProject,\n VerificationPlanSettingsResponse,\n VerificationRecipe,\n} from \"@loomrail/contracts\";\nimport { Button, Icon, cn } from \"@loomrail/ui\";\n\nimport { useI18n } from \"../i18n\";\nimport {\n useAdoptVerificationPlan,\n useDisableVerificationPlan,\n useRetryVerificationPlanPublication,\n useVerificationPlanSettings,\n} from \"../workspace\";\n\ntype VerificationPlanSettingsViewProps = {\n adopting: boolean;\n disabling: boolean;\n onAdopt: () => void;\n onDisable: () => void;\n onRetry: () => void;\n retrying: boolean;\n settings: VerificationPlanSettingsResponse;\n};\n\nconst formatTimeout = (seconds: number): { count: number; unit: \"minutes\" | \"seconds\" } =>\n seconds % 60 === 0 ? { count: seconds / 60, unit: \"minutes\" } : { count: seconds, unit: \"seconds\" };\n\nconst RecipePolicy = ({ recipe }: { recipe: VerificationRecipe }): React.JSX.Element => {\n const { t } = useI18n();\n const timeout = formatTimeout(recipe.timeoutSeconds);\n\n return (\n <dl className=\"verification-recipe__policy\">\n <div>\n <dt>{t(\"settings.verification.cwd\")}</dt>\n <dd>{recipe.cwd === \".\" ? t(\"settings.verification.projectRoot\") : recipe.cwd}</dd>\n </div>\n <div>\n <dt>{t(\"settings.verification.timeout\")}</dt>\n <dd>\n {t(timeout.unit === \"minutes\" ? \"settings.verification.minutes\" : \"settings.verification.seconds\", {\n count: timeout.count,\n })}\n </dd>\n </div>\n <div>\n <dt>{t(\"settings.verification.output\")}</dt>\n <dd>{t(\"settings.verification.kib\", { count: recipe.outputLimitBytes / 1_024 })}</dd>\n </div>\n <div>\n <dt>{t(\"settings.verification.network\")}</dt>\n <dd>\n {t(\n recipe.networkPolicy === \"INHERIT_HOST\"\n ? \"settings.verification.networkHost\"\n : \"settings.verification.networkUnavailable\",\n )}\n </dd>\n </div>\n <div>\n <dt>{t(\"settings.verification.environment\")}</dt>\n <dd>{t(\"settings.verification.environmentBaseline\")}</dd>\n </div>\n </dl>\n );\n};\n\nconst RecipePreview = ({ recipe }: { recipe: VerificationRecipe }): React.JSX.Element => {\n const { t } = useI18n();\n const exactCommand = [recipe.executable, ...recipe.argv].join(\" \");\n\n return (\n <article className=\"verification-recipe\">\n <div className=\"verification-recipe__heading\">\n <div>\n <strong>{recipe.label}</strong>\n <span>\n {t(recipe.required ? \"settings.verification.required\" : \"settings.verification.optional\")}\n </span>\n </div>\n <span>{recipe.kind}</span>\n </div>\n <div className=\"verification-recipe__command\">\n <span>{t(\"settings.verification.exactCommand\")}</span>\n <ol aria-label={exactCommand}>\n <li>\n <small>{t(\"settings.verification.executable\")}</small>\n <code>{recipe.executable}</code>\n </li>\n {recipe.argv.map((argument, index) => (\n <li key={`${index.toString()}-${argument}`}>\n <small>{t(\"settings.verification.argument\", { index: index + 1 })}</small>\n <code>{argument}</code>\n </li>\n ))}\n </ol>\n </div>\n <RecipePolicy recipe={recipe} />\n <details className=\"verification-recipe__source\">\n <summary>{t(\"settings.verification.source\", { script: recipe.provenance.scriptName })}</summary>\n <code>{recipe.provenance.scriptBodyPreview}</code>\n <p>{t(\"settings.verification.sourceNotice\")}</p>\n </details>\n </article>\n );\n};\n\nexport const VerificationPlanSettingsView = ({\n adopting,\n disabling,\n onAdopt,\n onDisable,\n onRetry,\n retrying,\n settings,\n}: VerificationPlanSettingsViewProps): React.JSX.Element => {\n const { t } = useI18n();\n const { plan, proposal, publication } = settings;\n const requiredCount = proposal.recipes.filter((recipe) => recipe.required).length;\n // Publication changes the target from ABSENT to PRESENT, which deliberately changes the scan\n // hash even when the command set did not. Recipe equality is the owner-visible \"same Plan\"\n // signal; target integrity remains a separate blocking state below.\n const proposalIsCurrent =\n plan?.status === \"ACTIVE\" && JSON.stringify(plan.recipes) === JSON.stringify(proposal.recipes);\n const targetBlocked = proposal.target.state === \"BLOCKED\";\n const cannotAdopt = targetBlocked || proposal.recipes.length === 0 || requiredCount === 0;\n const showAdopt = !proposalIsCurrent;\n const publicationApplied = publication?.status === \"APPLIED\";\n const publicationFailed = publication?.status === \"FAILED\";\n const publicationPending = publication?.status === \"PENDING\";\n\n return (\n <div className=\"verification-settings\">\n <div className=\"verification-settings__heading\">\n <div>\n <h4>{t(\"settings.verification.title\")}</h4>\n <p>{t(\"settings.verification.description\")}</p>\n </div>\n {plan === null ? null : (\n <span\n className={cn(\n \"verification-settings__state\",\n publicationApplied && plan.status === \"ACTIVE\" && \"is-ready\",\n )}\n >\n <Icon name={publicationApplied && plan.status === \"ACTIVE\" ? \"check\" : \"warning\"} size={13} />\n {publicationApplied && plan.status === \"DISABLED\"\n ? t(\"settings.verification.disabled\", { revision: plan.revision })\n : publicationApplied\n ? t(\"settings.verification.active\", { revision: plan.revision })\n : publicationPending\n ? t(\"settings.verification.publishing\", { revision: plan.revision })\n : t(\"settings.verification.unpublished\", { revision: plan.revision })}\n </span>\n )}\n </div>\n\n <div className=\"verification-settings__local-warning\" role=\"note\">\n <strong>{t(\"settings.verification.localExecutionTitle\")}</strong>\n <p>{t(\"settings.verification.localExecutionNotice\")}</p>\n </div>\n\n {proposal.recipes.length === 0 ? (\n <p className=\"settings__note\">{t(\"settings.verification.empty\")}</p>\n ) : (\n <div className=\"verification-recipes\" aria-label={t(\"settings.verification.list\")}>\n {proposal.recipes.map((recipe) => (\n <RecipePreview key={recipe.id} recipe={recipe} />\n ))}\n </div>\n )}\n\n {proposal.warnings.length === 0 ? null : (\n <div className=\"verification-settings__warnings\" role=\"note\">\n <strong>{t(\"settings.verification.warnings\")}</strong>\n <ul>\n {proposal.warnings.map((warning, index) => (\n <li key={`${warning.code}-${index.toString()}`}>{warning.message}</li>\n ))}\n </ul>\n </div>\n )}\n\n {targetBlocked ? (\n <p className=\"verification-settings__error\" role=\"alert\">\n {t(\"settings.verification.targetBlocked\")}\n </p>\n ) : null}\n\n {showAdopt ? (\n <div className=\"verification-settings__adoption\">\n <p>\n {t(\n plan?.status === \"DISABLED\"\n ? \"settings.verification.enableNotice\"\n : \"settings.verification.adoptionNotice\",\n )}\n </p>\n <Button disabled={cannotAdopt} loading={adopting} onClick={onAdopt} type=\"button\" variant=\"primary\">\n {plan === null\n ? t(\"settings.verification.adopt\", { count: requiredCount })\n : plan.status === \"DISABLED\"\n ? t(\"settings.verification.enable\", { count: requiredCount })\n : t(\"settings.verification.replace\", { count: requiredCount })}\n </Button>\n </div>\n ) : publicationApplied ? (\n <div className=\"verification-settings__adoption\">\n <p className=\"verification-settings__published\">\n <Icon name=\"check\" size={14} />\n <span>{t(\"settings.verification.published\")}</span>\n </p>\n </div>\n ) : null}\n\n {plan?.status === \"ACTIVE\" ? (\n <div className=\"verification-settings__actions\">\n <Button loading={disabling} onClick={onDisable} type=\"button\">\n {t(\"settings.verification.disable\")}\n </Button>\n </div>\n ) : null}\n\n {publicationFailed ? (\n <div className=\"verification-settings__failure\" role=\"alert\">\n <div>\n <strong>{t(\"settings.verification.publicationFailed\")}</strong>\n <span>{publication.lastErrorCode ?? t(\"error.unknown\")}</span>\n </div>\n <Button loading={retrying} onClick={onRetry} type=\"button\">\n {t(\"settings.verification.retry\")}\n </Button>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport const VerificationPlanSettingsPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const settingsQuery = useVerificationPlanSettings(project.id);\n const adopt = useAdoptVerificationPlan();\n const disable = useDisableVerificationPlan();\n const retry = useRetryVerificationPlanPublication();\n const settings = settingsQuery.data;\n const operationError =\n adopt.error instanceof Error\n ? adopt.error\n : disable.error instanceof Error\n ? disable.error\n : retry.error instanceof Error\n ? retry.error\n : settingsQuery.error instanceof Error\n ? settingsQuery.error\n : null;\n\n if (settings === undefined) {\n return (\n <div className=\"verification-settings\">\n <div className=\"verification-settings__heading\">\n <div>\n <h4>{t(\"settings.verification.title\")}</h4>\n <p>{t(\"settings.verification.description\")}</p>\n </div>\n </div>\n <p className=\"settings__note\">\n {operationError === null ? t(\"settings.verification.loading\") : operationError.message}\n </p>\n </div>\n );\n }\n\n return (\n <>\n <VerificationPlanSettingsView\n adopting={adopt.isPending}\n disabling={disable.isPending}\n onAdopt={() => {\n adopt.mutate(settings);\n }}\n onDisable={() => {\n disable.mutate(settings);\n }}\n onRetry={() => {\n if (settings.publication !== null) {\n retry.mutate({ projectId: project.id, publication: settings.publication });\n }\n }}\n retrying={retry.isPending}\n settings={settings}\n />\n {operationError === null ? null : (\n <p className=\"verification-settings__error\" role=\"alert\">\n {operationError.message}\n </p>\n )}\n </>\n );\n};\n","import { createContext, useContext } from \"react\";\n\nexport const OpenAppSettingsContext = createContext<(() => void) | null>(null);\n\nexport const useOpenAppSettings = (): (() => void) => {\n const openSettings = useContext(OpenAppSettingsContext);\n if (openSettings === null) throw new Error(\"useOpenAppSettings must be used inside AppFrame\");\n return openSettings;\n};\n","export const densityPreferences = [\"comfortable\", \"compact\"] as const;\nexport type DensityPreference = (typeof densityPreferences)[number];\n\nconst DENSITY_STORAGE_KEY = \"loomrail-density\";\n\nexport const isDensityPreference = (value: string | null): value is DensityPreference =>\n value !== null && densityPreferences.some((density) => density === value);\n\nexport const readDensityPreference = (): DensityPreference => {\n const stored = window.localStorage.getItem(DENSITY_STORAGE_KEY);\n return isDensityPreference(stored) ? stored : \"comfortable\";\n};\n\n/**\n * Applies the row density to the document.\n *\n * Comfortable is the default, so it clears the attribute rather than writing one: the stylesheet\n * carries the comfortable sizes as its base and only overrides them under `data-density=\"compact\"`.\n */\nexport const applyDensityPreference = (preference: DensityPreference): void => {\n if (preference === \"comfortable\") {\n document.documentElement.removeAttribute(\"data-density\");\n window.localStorage.removeItem(DENSITY_STORAGE_KEY);\n return;\n }\n\n document.documentElement.dataset[\"density\"] = preference;\n window.localStorage.setItem(DENSITY_STORAGE_KEY, preference);\n};\n","export const themePreferences = [\"light\", \"dark\", \"system\"] as const;\nexport type ThemePreference = (typeof themePreferences)[number];\n\nconst THEME_STORAGE_KEY = \"loomrail-theme\";\n\nexport const isThemePreference = (value: string | null): value is ThemePreference =>\n value !== null && themePreferences.some((theme) => theme === value);\n\nexport const readThemePreference = (): ThemePreference => {\n const stored = window.localStorage.getItem(THEME_STORAGE_KEY);\n return isThemePreference(stored) ? stored : \"system\";\n};\n\nexport const applyThemePreference = (preference: ThemePreference): void => {\n if (preference === \"system\") {\n document.documentElement.removeAttribute(\"data-theme\");\n window.localStorage.removeItem(THEME_STORAGE_KEY);\n return;\n }\n\n document.documentElement.dataset[\"theme\"] = preference;\n window.localStorage.setItem(THEME_STORAGE_KEY, preference);\n};\n","import { Link, Outlet, useLocation } from \"@tanstack/react-router\";\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { SyntheticEvent } from \"react\";\nimport {\n constitutionPresetIdSchema,\n prioritySchema,\n providerPreferenceSchema,\n workItemTypeSchema,\n type ConstitutionPresetId,\n type ListedProject,\n type ProviderAvailability,\n type ReadinessCheck,\n type SecurityFinding,\n type ProviderId,\n type WorkItem,\n} from \"@loomrail/contracts\";\nimport {\n ActionMenu,\n Button,\n cn,\n DialogSurface,\n Field,\n Icon,\n IconButton,\n SelectControl,\n Textarea,\n TextField,\n Tooltip,\n type IconName,\n} from \"@loomrail/ui\";\n\nimport { BrandMark } from \"../components/BrandMark\";\nimport { PanelResizer } from \"../components/PanelResizer\";\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { LaunchMeasurementPanel } from \"../components/LaunchMeasurementPanel\";\nimport { LaunchReleasePanel } from \"../components/LaunchReleasePanel\";\nimport { McpSettingsPanel } from \"../components/McpSettingsPanel\";\nimport { ProjectScaffoldPanel } from \"../components/ProjectScaffoldPanel\";\nimport { ProjectWorkspaceStrategyPanel } from \"../components/ProjectWorkspaceStrategyPanel\";\nimport { VerificationPlanSettingsPanel } from \"../components/VerificationPlanSettingsPanel\";\nimport { OpenAppSettingsContext } from \"./appSettings\";\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport { hasCustomPanelWidths, resetPanelWidths } from \"../layout\";\nimport { applyDensityPreference, readDensityPreference, type DensityPreference } from \"../density\";\nimport { applyThemePreference, readThemePreference, type ThemePreference } from \"../theme\";\nimport {\n useCreateWorkItem,\n useAdoptProjectConstitution,\n useAttestProjectReadiness,\n useConstitutionPresets,\n useProjectConstitution,\n useProjectReadiness,\n useProjectProviderSelection,\n useProjectWorkItems,\n useAttentionInbox,\n useAgentFleet,\n useRegisterRepositoryProject,\n useRepairFixtureProject,\n useRetryProjectConstitutionPublication,\n useRunProjectReadiness,\n useRefreshProjectProviderAvailability,\n useScanProjectConstitution,\n useSetProjectProviderPreference,\n useWorkspace,\n} from \"../workspace\";\n\nconst NewTaskDialog = (): React.JSX.Element => {\n const { t } = useI18n();\n const [open, setOpen] = useState(false);\n const formRef = useRef<HTMLFormElement>(null);\n const { projects, selectedProject } = useWorkspace();\n const createMutation = useCreateWorkItem();\n const [requestedProjectId, setRequestedProjectId] = useState<string | null>(null);\n const [priority, setPriority] = useState<WorkItem[\"priority\"]>(\"MEDIUM\");\n const [type, setType] = useState<WorkItem[\"type\"]>(\"TASK\");\n const [parentId, setParentId] = useState<string | null>(null);\n const [title, setTitle] = useState(\"\");\n const [criteriaText, setCriteriaText] = useState(\"\");\n const acceptanceCriteria = criteriaText\n .split(\"\\n\")\n .map((criterion) => criterion.trim())\n .filter(Boolean);\n const criteriaValid =\n acceptanceCriteria.length > 0 &&\n acceptanceCriteria.length <= 50 &&\n new Set(acceptanceCriteria).size === acceptanceCriteria.length &&\n acceptanceCriteria.every((criterion) => criterion.length <= 500);\n const projectId =\n projects.find((project) => project.id === requestedProjectId)?.id ?? selectedProject?.id ?? \"\";\n const projectWorkItemsQuery = useProjectWorkItems(projectId || undefined);\n const parentOptions = (projectWorkItemsQuery.data?.workItems ?? []).filter(\n ({ state }) => state !== \"DONE\" && state !== \"CANCELLED\",\n );\n useEffect(() => {\n setParentId(null);\n }, [projectId]);\n\n const submit = (event: SyntheticEvent<HTMLFormElement, SubmitEvent>): void => {\n event.preventDefault();\n const formElement = event.currentTarget;\n const form = new FormData(formElement);\n const titleValue = form.get(\"title\");\n const descriptionValue = form.get(\"description\");\n const title = typeof titleValue === \"string\" ? titleValue.trim() : \"\";\n const description = typeof descriptionValue === \"string\" ? descriptionValue.trim() : \"\";\n if (!title || !projectId || !criteriaValid) return;\n\n createMutation.mutate(\n {\n acceptanceCriteria,\n description,\n priority,\n projectId,\n parentId,\n risk: \"MEDIUM\",\n title,\n type,\n },\n {\n onSuccess: () => {\n formElement.reset();\n setCriteriaText(\"\");\n setTitle(\"\");\n setParentId(null);\n setType(\"TASK\");\n setOpen(false);\n },\n },\n );\n };\n\n return (\n <DialogSurface\n closeLabel={t(\"action.closeDialog\")}\n description={t(\"task.create.description\")}\n footer={\n <>\n <Button\n disabled={createMutation.isPending}\n onClick={() => {\n setOpen(false);\n }}\n >\n {t(\"action.cancel\")}\n </Button>\n <Button\n disabled={!title.trim() || !projectId || !criteriaValid}\n loading={createMutation.isPending}\n onClick={() => {\n formRef.current?.requestSubmit();\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(\"task.create.submit\")}\n </Button>\n </>\n }\n onOpenChange={(next) => {\n // Closing without submitting drops the draft and, above all, the previous attempt's error:\n // without this a failed create came back as a stale alert the next time the dialog opened.\n if (!next) {\n setTitle(\"\");\n setCriteriaText(\"\");\n setParentId(null);\n setType(\"TASK\");\n createMutation.reset();\n }\n setOpen(next);\n }}\n open={open}\n title={t(\"task.new\")}\n trigger={\n <Button disabled={!selectedProject} icon=\"add\" variant=\"primary\">\n {t(\"task.new\")}\n </Button>\n }\n >\n <form className=\"new-task-form\" id=\"new-task-form\" onSubmit={submit} ref={formRef}>\n {createMutation.error ? (\n <LocalConnectionRecovery\n error={createMutation.error}\n onRetry={() => {\n formRef.current?.requestSubmit();\n }}\n retrying={createMutation.isPending}\n />\n ) : null}\n <Field htmlFor=\"new-task-title\" label={t(\"task.create.title\")} required>\n <TextField\n autoFocus\n id=\"new-task-title\"\n name=\"title\"\n onChange={(event) => {\n setTitle(event.currentTarget.value);\n }}\n placeholder={t(\"task.create.titlePlaceholder\")}\n required\n value={title}\n />\n </Field>\n <Field\n description={t(\"task.create.briefDescription\")}\n htmlFor=\"new-task-brief\"\n label={t(\"task.create.brief\")}\n >\n <Textarea\n aria-describedby=\"new-task-brief-description\"\n id=\"new-task-brief\"\n name=\"description\"\n placeholder={t(\"task.create.briefPlaceholder\")}\n rows={5}\n />\n </Field>\n <Field\n description={t(\"task.create.criteriaDescription\")}\n {...(criteriaText.trim() && !criteriaValid ? { error: t(\"task.create.criteriaError\") } : {})}\n htmlFor=\"new-task-criteria\"\n label={t(\"task.create.criteria\")}\n required\n >\n <Textarea\n id=\"new-task-criteria\"\n name=\"acceptanceCriteria\"\n onChange={(event) => {\n setCriteriaText(event.currentTarget.value);\n }}\n placeholder={t(\"task.create.criteriaPlaceholder\")}\n required\n rows={3}\n value={criteriaText}\n />\n </Field>\n <div className=\"new-task-form__row\">\n <Field htmlFor=\"new-task-project\" label={t(\"task.create.project\")}>\n <SelectControl\n ariaLabel={t(\"task.create.project\")}\n id=\"new-task-project\"\n onValueChange={setRequestedProjectId}\n options={projects.map((project) => ({ label: project.name, value: project.id }))}\n value={projectId}\n />\n </Field>\n <Field htmlFor=\"new-task-priority\" label={t(\"task.create.priority\")}>\n <SelectControl\n ariaLabel={t(\"task.create.priority\")}\n id=\"new-task-priority\"\n onValueChange={(value) => {\n setPriority(prioritySchema.parse(value));\n }}\n options={[\n { label: t(\"priority.LOW\"), value: \"LOW\" },\n { label: t(\"priority.MEDIUM\"), value: \"MEDIUM\" },\n { label: t(\"priority.HIGH\"), value: \"HIGH\" },\n { label: t(\"priority.URGENT\"), value: \"URGENT\" },\n ]}\n value={priority}\n />\n </Field>\n </div>\n <div className=\"new-task-form__row\">\n <Field htmlFor=\"new-task-type\" label={t(\"task.create.type\")}>\n <SelectControl\n ariaLabel={t(\"task.create.type\")}\n id=\"new-task-type\"\n onValueChange={(value) => {\n setType(workItemTypeSchema.parse(value));\n }}\n options={([\"EPIC\", \"FEATURE\", \"TASK\", \"BUG\", \"SPIKE\", \"SUBTASK\"] as const).map(\n (workItemType) => ({ label: t(`type.${workItemType}`), value: workItemType }),\n )}\n value={type}\n />\n </Field>\n <Field\n description={t(\"task.create.parentDescription\")}\n htmlFor=\"new-task-parent\"\n label={t(\"task.create.parent\")}\n >\n <SelectControl\n ariaLabel={t(\"task.create.parent\")}\n disabled={projectWorkItemsQuery.isPending || parentOptions.length === 0}\n id=\"new-task-parent\"\n onValueChange={(value) => {\n setParentId(value === \"none\" ? null : value);\n }}\n options={[\n { label: t(\"task.create.noParent\"), value: \"none\" },\n ...parentOptions.map((candidate) => ({ label: candidate.title, value: candidate.id })),\n ]}\n value={parentId ?? \"none\"}\n />\n </Field>\n </div>\n </form>\n </DialogSurface>\n );\n};\n\ntype SettingsDialogProps = {\n onOpenChange: (open: boolean) => void;\n open: boolean;\n};\n\ntype SettingChoiceOption<TValue extends string> = {\n icon?: IconName;\n label: string;\n value: TValue;\n};\n\n/**\n * A small set of mutually exclusive options shown as pressable tiles.\n *\n * Preferred over a dropdown here because every choice fits on screen: the reader compares them at a\n * glance and commits in one click, instead of opening a list to see two or three items.\n */\nconst SettingChoice = <TValue extends string>({\n description,\n label,\n onChange,\n options,\n value,\n}: {\n description?: string;\n label: string;\n onChange: (value: TValue) => void;\n options: readonly SettingChoiceOption<TValue>[];\n value: TValue;\n}): React.JSX.Element => {\n // A generated id, because a translated label can contain spaces and would not be a valid IDREF.\n const labelId = useId();\n return (\n <div className=\"setting\">\n <span className=\"setting__label\" id={labelId}>\n {label}\n </span>\n <div aria-labelledby={labelId} className=\"setting__choices\" role=\"group\">\n {options.map((option) => (\n <button\n aria-pressed={value === option.value}\n key={option.value}\n onClick={() => {\n onChange(option.value);\n }}\n type=\"button\"\n >\n {option.icon ? <Icon name={option.icon} size={15} /> : null}\n <span>{option.label}</span>\n </button>\n ))}\n </div>\n {description ? <small className=\"setting__hint\">{description}</small> : null}\n </div>\n );\n};\n\n/**\n * What an owner does about a Project whose recorded path is no longer a repository.\n *\n * Only shown for a Project that has one, and only where the owner is already looking at the path\n * that is wrong. A demo Project gets a button, because Loomrail knows exactly where its repository\n * belongs and can put it there (`useRepairFixtureProject`). A Project the owner registered by path\n * gets the explanation and no button: nothing here knows where they moved their repository to, and\n * offering to \"repair\" it would either do nothing or do the wrong thing -- they register the new\n * path in the field below.\n *\n * This is the reachability half of the repair. `REPOINT_FIXTURE_PROJECT` and its route existed and\n * were tested through HTTP, but the only thing in the product that called the route was \"Initialize\n * demo workspace\", which renders only when there is no selected project at all -- so an owner with\n * two stale demo Projects, which is the shape of the one database that matters, could not reach it\n * by any sequence of clicks.\n */\nconst RepairFixtureProject = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const repairMutation = useRepairFixtureProject();\n const fixtureId = project.fixtureId;\n const error = repairMutation.error instanceof Error ? repairMutation.error.message : null;\n\n return (\n <div className=\"settings__project-repair\">\n <p className=\"settings__note\" role=\"note\">\n {t(\"settings.projects.unusable\")}\n </p>\n {fixtureId === null ? null : (\n <Button\n loading={repairMutation.isPending}\n onClick={() => {\n repairMutation.mutate(fixtureId);\n }}\n >\n {t(\"settings.projects.repair\")}\n </Button>\n )}\n {error === null ? null : (\n <p className=\"settings__project-error\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n};\n\n/**\n * Where the owner registers a local Git repository of their own as a Project (spec §4).\n *\n * It sits beside the project list rather than in the empty state, because the empty state is gone\n * the moment the demo is initialised, and registering your own repository is exactly the thing you\n * do *after* looking at the demo. The one field is the path: the daemon takes the repository\n * directory's own name, so there is nothing else to ask for.\n *\n * The refusal shown under the field is the daemon's, word for word. It names the path and, when the\n * path is a directory inside another repository, says which repository that is -- a message the\n * domain already writes, and one this form would only make vaguer by paraphrasing.\n */\nconst RegisterRepositoryField = (): React.JSX.Element => {\n const { t } = useI18n();\n const inputId = useId();\n const [path, setPath] = useState(\"\");\n const registerMutation = useRegisterRepositoryProject();\n const error = registerMutation.error instanceof Error ? registerMutation.error.message : null;\n const trimmed = path.trim();\n\n return (\n <form\n className=\"settings__register\"\n onSubmit={(event) => {\n event.preventDefault();\n if (trimmed === \"\") return;\n registerMutation.mutate(trimmed, {\n onSuccess: () => {\n setPath(\"\");\n },\n });\n }}\n >\n <Field\n description={t(\"settings.projects.register.description\")}\n htmlFor={inputId}\n label={t(\"settings.projects.register.label\")}\n {...(error === null ? {} : { error })}\n >\n <TextField\n autoComplete=\"off\"\n id={inputId}\n invalid={error !== null}\n onChange={(event) => {\n setPath(event.target.value);\n }}\n placeholder={t(\"settings.projects.register.placeholder\")}\n size=\"md\"\n spellCheck={false}\n value={path}\n />\n </Field>\n <Button disabled={trimmed === \"\"} loading={registerMutation.isPending} type=\"submit\">\n {t(\"settings.projects.register.action\")}\n </Button>\n </form>\n );\n};\n\nconst providerNames: Record<ProviderId, string> = {\n MOCK: \"Historical test provider\",\n CODEX: \"Codex CLI\",\n CLAUDE_CODE: \"Claude Code CLI\",\n};\n\nconst providerStatusKey = (provider: ProviderAvailability | undefined): TranslationKey => {\n if (provider?.installed === false || provider?.compatibility === \"MISSING\") {\n return \"settings.provider.status.notInstalled\";\n }\n if (provider?.compatibility === \"TOO_OLD\") return \"settings.provider.status.tooOld\";\n if (provider?.compatibility === \"UNVERIFIED\") return \"settings.provider.status.unverified\";\n if (provider?.compatibility === \"UNLAUNCHABLE\" || provider?.compatibility === \"VERSION_UNREADABLE\") {\n return \"settings.provider.status.versionUnreadable\";\n }\n if (provider?.authentication === \"REQUIRED\") return \"settings.provider.status.authRequired\";\n if (provider?.ready === true) return \"settings.provider.status.ready\";\n if (provider?.tokenBudgetEnforcement === \"POST_SESSION\") {\n return \"settings.provider.status.noHardTokenBudget\";\n }\n return \"settings.provider.status.unknown\";\n};\n\nconst ProjectProviderPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const selectionQuery = useProjectProviderSelection(project.id);\n const setPreference = useSetProjectProviderPreference();\n const refreshAvailability = useRefreshProjectProviderAvailability();\n const selection = selectionQuery.data;\n const effective = selection?.providers.find(({ provider }) => provider === selection.effectiveProvider);\n const operationError =\n setPreference.error instanceof Error\n ? setPreference.error\n : refreshAvailability.error instanceof Error\n ? refreshAvailability.error\n : selectionQuery.error instanceof Error\n ? selectionQuery.error\n : null;\n const statusKey = providerStatusKey(effective);\n\n return (\n <div className=\"provider-settings\">\n <div className=\"provider-settings__heading\">\n <div>\n <h4>{t(\"settings.provider.title\")}</h4>\n <p>{t(\"settings.provider.description\")}</p>\n </div>\n {selection === undefined ? null : (\n <span className={effective?.ready === true ? \"is-ready\" : \"is-attention\"}>{t(statusKey)}</span>\n )}\n </div>\n\n <Field htmlFor=\"project-provider-preference\" label={t(\"settings.provider.label\")}>\n <SelectControl\n ariaLabel={t(\"settings.provider.label\")}\n disabled={selection === undefined || selection.environmentOverrideLocked || setPreference.isPending}\n id=\"project-provider-preference\"\n onValueChange={(value) => {\n setPreference.mutate({ project, preference: providerPreferenceSchema.parse(value) });\n }}\n options={[\n {\n label: t(\"settings.provider.option.auto\"),\n description: t(\"settings.provider.option.auto.description\"),\n value: \"AUTO\",\n },\n { label: \"Codex CLI\", value: \"CODEX\" },\n { label: \"Claude Code CLI\", value: \"CLAUDE_CODE\" },\n ]}\n value={selection?.selection.preference ?? project.providerPreference}\n />\n </Field>\n\n {selection === undefined ? (\n <p className=\"settings__note\">{t(\"settings.provider.loading\")}</p>\n ) : (\n <div className=\"provider-settings__summary\">\n <p>\n {t(\"settings.provider.effective\", {\n provider: providerNames[selection.effectiveProvider],\n })}\n </p>\n {selection.fallbackReason === \"NO_READY_LIVE_PROVIDER\" ? (\n <p>{t(\"settings.provider.fallback\")}</p>\n ) : null}\n {selection.fallbackReason === \"LIVE_PROVIDER_UNAVAILABLE\" ? (\n <p role=\"alert\">{t(\"settings.provider.selectedUnavailable\")}</p>\n ) : null}\n {selection.environmentOverrideLocked ? (\n <p role=\"note\">\n {selection.environmentOverrideInvalid\n ? t(\"settings.provider.overrideInvalid\")\n : t(\"settings.provider.override\", {\n provider: providerNames[selection.environmentOverride ?? \"CODEX\"],\n })}\n </p>\n ) : null}\n <ul aria-label={t(\"settings.provider.compatibility\")} className=\"provider-settings__compatibility\">\n {selection.providers.map((provider) => (\n <li key={provider.provider}>\n <span>{providerNames[provider.provider]}</span>\n <span>\n {provider.version === null ? \"\" : `v${provider.version} · `}\n {t(providerStatusKey(provider))}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <Button\n loading={refreshAvailability.isPending}\n onClick={() => {\n refreshAvailability.mutate(project.id);\n }}\n size=\"sm\"\n >\n {t(\"settings.provider.refresh\")}\n </Button>\n {operationError === null ? null : (\n <p className=\"provider-settings__error\" role=\"alert\">\n {operationError.message}\n </p>\n )}\n </div>\n );\n};\n\ntype PresetSelection = \"AUTO\" | ConstitutionPresetId;\n\nconst ProjectConstitutionPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { t } = useI18n();\n const presetQuery = useConstitutionPresets();\n const snapshotQuery = useProjectConstitution(project.id);\n const scanMutation = useScanProjectConstitution();\n const adoptMutation = useAdoptProjectConstitution();\n const retryMutation = useRetryProjectConstitutionPublication();\n const [preset, setPreset] = useState<PresetSelection>(\"AUTO\");\n const snapshot = snapshotQuery.data;\n const proposal = snapshot?.latestProposal ?? null;\n const publication = snapshot?.publication ?? null;\n const active = snapshot?.activeConstitution ?? null;\n const blocked = proposal?.scan.targetConstitution.state === \"BLOCKED\";\n const operationError =\n scanMutation.error instanceof Error\n ? scanMutation.error\n : adoptMutation.error instanceof Error\n ? adoptMutation.error\n : retryMutation.error instanceof Error\n ? retryMutation.error\n : snapshotQuery.error instanceof Error\n ? snapshotQuery.error\n : null;\n\n return (\n <div className=\"constitution-settings\">\n <div className=\"constitution-settings__heading\">\n <div>\n <h4>{t(\"settings.constitution.title\")}</h4>\n <p>{t(\"settings.constitution.description\")}</p>\n </div>\n {active === null ? null : (\n <span className=\"constitution-settings__state\">\n <Icon name=\"check\" size={13} />\n {t(\"settings.constitution.activeVersion\", { ordinal: active.ordinal })}\n </span>\n )}\n </div>\n\n <div className=\"constitution-settings__scan\">\n <Field htmlFor=\"constitution-preset\" label={t(\"settings.constitution.preset\")}>\n <SelectControl\n ariaLabel={t(\"settings.constitution.preset\")}\n disabled={presetQuery.isPending || project.repositoryStatus !== \"READY\"}\n id=\"constitution-preset\"\n onValueChange={(value) => {\n setPreset(value === \"AUTO\" ? \"AUTO\" : constitutionPresetIdSchema.parse(value));\n }}\n options={[\n { label: t(\"settings.constitution.presetAuto\"), value: \"AUTO\" },\n ...(presetQuery.data?.presets.map((candidate) => ({\n description: candidate.description,\n label: candidate.name,\n value: candidate.id,\n })) ?? []),\n ]}\n value={preset}\n />\n </Field>\n <Button\n disabled={project.repositoryStatus !== \"READY\"}\n loading={scanMutation.isPending}\n onClick={() => {\n scanMutation.mutate({\n project,\n ...(preset === \"AUTO\" ? {} : { presetId: preset }),\n });\n }}\n >\n {proposal === null ? t(\"settings.constitution.scan\") : t(\"settings.constitution.rescan\")}\n </Button>\n </div>\n\n {proposal === null ? (\n <p className=\"settings__note\">{t(\"settings.constitution.empty\")}</p>\n ) : (\n <div className=\"constitution-proposal\">\n <div className=\"constitution-proposal__summary\">\n <strong>{t(\"settings.constitution.proposal\")}</strong>\n <span>\n {t(\"settings.constitution.sourceSummary\", {\n files: proposal.scan.files.length,\n preset: proposal.presetId,\n })}\n </span>\n </div>\n <p className=\"settings__note\">{t(\"settings.constitution.reviewHint\")}</p>\n {proposal.scan.warnings.length === 0 ? null : (\n <div className=\"constitution-proposal__warnings\" role=\"note\">\n <strong>{t(\"settings.constitution.warnings\")}</strong>\n <ul>\n {proposal.scan.warnings.map((warning, index) => (\n <li key={`${warning.code}-${index.toString()}`}>{warning.message}</li>\n ))}\n </ul>\n </div>\n )}\n <div className=\"constitution-proposal__sections\">\n {proposal.sections.map((section) => (\n <details key={section.key}>\n <summary>{section.title}</summary>\n <pre>{section.body}</pre>\n <small>\n {t(\"settings.constitution.sources\")}:{\" \"}\n {section.sources.map((source) => source.reference).join(\", \")}\n </small>\n </details>\n ))}\n </div>\n {blocked ? (\n <p className=\"constitution-settings__error\" role=\"alert\">\n {t(\"settings.constitution.targetBlocked\")}\n </p>\n ) : null}\n {proposal.status === \"PROPOSED\" ? (\n <Button\n disabled={blocked}\n loading={adoptMutation.isPending}\n onClick={() => {\n adoptMutation.mutate({ project, proposal });\n }}\n variant=\"primary\"\n >\n {active === null ? t(\"settings.constitution.adopt\") : t(\"settings.constitution.replace\")}\n </Button>\n ) : null}\n </div>\n )}\n\n {publication?.status === \"FAILED\" ? (\n <div className=\"constitution-settings__failure\" role=\"alert\">\n <div>\n <strong>{t(\"settings.constitution.failed\")}</strong>\n <span>{publication.lastErrorCode ?? t(\"error.unknown\")}</span>\n </div>\n <Button\n loading={retryMutation.isPending}\n onClick={() => {\n retryMutation.mutate({ projectId: project.id, publication });\n }}\n >\n {t(\"settings.constitution.retry\")}\n </Button>\n </div>\n ) : null}\n {operationError === null ? null : (\n <p className=\"constitution-settings__error\" role=\"alert\">\n {operationError.message}\n </p>\n )}\n </div>\n );\n};\n\nconst readinessCategoryKeys = {\n SECURITY: \"settings.readiness.category.security\",\n LEGAL: \"settings.readiness.category.legal\",\n PAYMENTS: \"settings.readiness.category.payments\",\n ANALYTICS: \"settings.readiness.category.analytics\",\n DEPENDENCIES: \"settings.readiness.category.dependencies\",\n ENVIRONMENT: \"settings.readiness.category.environment\",\n OPERATIONS: \"settings.readiness.category.operations\",\n} as const satisfies Record<ReadinessCheck[\"category\"], TranslationKey>;\n\n// Derived from the label map rather than written out again: that map `satisfies` the full category\n// record, so a category added to the catalog is a compile error there and cannot go missing from\n// the render -- where the empty-section guard would otherwise drop it without a trace.\nconst readinessCategoryOrder = Object.keys(readinessCategoryKeys) as readonly ReadinessCheck[\"category\"][];\n\nconst readinessCheckKeys = {\n SECURITY_ACTIVE_CONSTITUTION: \"settings.readiness.check.activeConstitution\",\n SECURITY_SECRET_PATHS: \"settings.readiness.check.secretPaths\",\n SECURITY_ENV_IGNORED: \"settings.readiness.check.envIgnored\",\n SECURITY_CI_HARDENING: \"settings.readiness.check.ciHardening\",\n LEGAL_LICENSE: \"settings.readiness.check.license\",\n LEGAL_OWNER_REVIEW: \"settings.readiness.check.legalOwner\",\n PAYMENTS_OWNER_REVIEW: \"settings.readiness.check.paymentsOwner\",\n ANALYTICS_OWNER_REVIEW: \"settings.readiness.check.analyticsOwner\",\n DEPS_LOCKFILE_PRESENT: \"settings.readiness.check.lockfile\",\n ENV_PROD_SEPARATION: \"settings.readiness.check.envProdSeparation\",\n SECURITY_HEADERS_OWNER_REVIEW: \"settings.readiness.check.securityHeadersOwner\",\n OPS_HEALTH_ENDPOINT_DECLARED: \"settings.readiness.check.healthEndpoint\",\n OPS_ROLLBACK_PLAN: \"settings.readiness.check.rollbackPlan\",\n OPS_BACKUP: \"settings.readiness.check.backup\",\n} as const satisfies Record<ReadinessCheck[\"key\"], TranslationKey>;\n\nconst readinessStatusKeys = {\n PASSED: \"settings.readiness.status.passed\",\n ACTION_REQUIRED: \"settings.readiness.status.action\",\n CONFIRMED: \"settings.readiness.status.confirmed\",\n NOT_APPLICABLE: \"settings.readiness.status.na\",\n} as const satisfies Record<ReadinessCheck[\"status\"], TranslationKey>;\n\nconst readinessFindingKeys = {\n ACTIVE_CONSTITUTION_MISSING: \"settings.readiness.finding.activeConstitution\",\n TRACKED_SECRET_PATH: \"settings.readiness.finding.secretPath\",\n ENV_NOT_IGNORED: \"settings.readiness.finding.envIgnored\",\n CI_PULL_REQUEST_TARGET: \"settings.readiness.finding.pullRequestTarget\",\n CI_WRITE_ALL_PERMISSIONS: \"settings.readiness.finding.writeAll\",\n CI_ACTION_NOT_PINNED: \"settings.readiness.finding.actionPinned\",\n CI_INPUT_UNVERIFIABLE: \"settings.readiness.finding.ciUnverifiable\",\n LICENSE_MISSING: \"settings.readiness.finding.license\",\n LOCKFILE_MISSING: \"settings.readiness.finding.lockfileMissing\",\n LOCKFILE_AMBIGUOUS: \"settings.readiness.finding.lockfileAmbiguous\",\n DEPENDENCY_INPUT_UNVERIFIABLE: \"settings.readiness.finding.dependencyUnverifiable\",\n PROD_ENV_NOT_IGNORED: \"settings.readiness.finding.prodEnvNotIgnored\",\n INLINE_SECRET_IN_CI: \"settings.readiness.finding.inlineSecretInCi\",\n} as const satisfies Record<SecurityFinding[\"code\"], TranslationKey>;\n\nconst ProjectReadinessPanel = ({ project }: { project: ListedProject }): React.JSX.Element => {\n const { locale, t } = useI18n();\n const snapshotQuery = useProjectReadiness(project.id);\n const runMutation = useRunProjectReadiness();\n const attestMutation = useAttestProjectReadiness();\n const [rationales, setRationales] = useState<Readonly<Record<string, string>>>({});\n const snapshot = snapshotQuery.data;\n const run = snapshot?.run ?? null;\n const operationError =\n runMutation.error instanceof Error\n ? runMutation.error\n : attestMutation.error instanceof Error\n ? attestMutation.error\n : snapshotQuery.error instanceof Error\n ? snapshotQuery.error\n : null;\n\n return (\n <div className=\"readiness-settings\">\n <div className=\"readiness-settings__heading\">\n <div>\n <h4>{t(\"settings.readiness.title\")}</h4>\n <p>{t(\"settings.readiness.description\")}</p>\n </div>\n {run === null ? null : (\n <span className={cn(\"readiness-settings__state\", run.status === \"READY\" && \"is-ready\")}>\n <Icon name={run.status === \"READY\" ? \"check\" : \"warning\"} size={13} />\n {t(run.status === \"READY\" ? \"settings.readiness.ready\" : \"settings.readiness.actionRequired\")}\n </span>\n )}\n </div>\n\n <div className=\"readiness-settings__run\">\n <Button\n disabled={project.repositoryStatus !== \"READY\"}\n loading={runMutation.isPending}\n onClick={() => {\n runMutation.mutate(project);\n }}\n variant=\"primary\"\n >\n {run === null ? t(\"settings.readiness.run\") : t(\"settings.readiness.rerun\")}\n </Button>\n {run === null ? null : (\n <div className=\"readiness-settings__meta\">\n <span>\n {t(\"settings.readiness.checkedAt\", {\n date: new Intl.DateTimeFormat(locale, { dateStyle: \"medium\", timeStyle: \"short\" }).format(\n new Date(run.createdAt),\n ),\n })}\n </span>\n <span>\n {run.repositoryHead === null\n ? t(\"settings.readiness.noHead\")\n : t(\"settings.readiness.head\", { head: run.repositoryHead.slice(0, 8) })}\n </span>\n <span>{t(run.workingTreeDirty ? \"settings.readiness.dirty\" : \"settings.readiness.clean\")}</span>\n </div>\n )}\n </div>\n\n {run === null || snapshot === undefined ? (\n <p className=\"settings__note\">{t(\"settings.readiness.empty\")}</p>\n ) : (\n <div className=\"readiness-checklist\">\n {readinessCategoryOrder.map((category) => {\n const categoryChecks = snapshot.checks.filter((check) => check.category === category);\n if (categoryChecks.length === 0) {\n return null;\n }\n return (\n <section className=\"readiness-group\" key={category}>\n <h5>{t(readinessCategoryKeys[category])}</h5>\n <div className=\"readiness-group__checks\">\n {categoryChecks.map((check) => {\n const findings = snapshot.findings.filter((finding) => finding.checkId === check.id);\n const rationale = rationales[check.id] ?? \"\";\n const latestAttestation = snapshot.attestations\n .filter((attestation) => attestation.checkId === check.id)\n .at(-1);\n return (\n <article className=\"readiness-check\" key={check.id}>\n <div\n className={cn(\n \"readiness-check__summary\",\n check.status !== \"ACTION_REQUIRED\" && \"is-passed\",\n )}\n >\n <Icon name={check.status === \"ACTION_REQUIRED\" ? \"warning\" : \"check\"} size={15} />\n <div>\n <strong>{t(readinessCheckKeys[check.key])}</strong>\n <span>{t(readinessStatusKeys[check.status])}</span>\n </div>\n </div>\n {findings.length === 0 ? null : (\n <details className=\"readiness-check__evidence\">\n <summary>\n {t(\"settings.readiness.evidence\")} · {findings.length.toString()}\n </summary>\n <ul>\n {findings.map((finding) => (\n <li key={finding.id}>\n <span>{t(readinessFindingKeys[finding.code])}</span>\n {finding.path === null ? null : <code>{finding.path}</code>}\n </li>\n ))}\n </ul>\n </details>\n )}\n {check.mode === \"OWNER\" && check.status === \"ACTION_REQUIRED\" ? (\n <div className=\"readiness-check__attest\">\n <Field\n htmlFor={`readiness-rationale-${check.id}`}\n label={t(\"settings.readiness.rationale\")}\n >\n <Textarea\n id={`readiness-rationale-${check.id}`}\n onChange={(event) => {\n setRationales((current) => ({\n ...current,\n [check.id]: event.target.value,\n }));\n }}\n placeholder={t(\"settings.readiness.rationalePlaceholder\")}\n rows={2}\n value={rationale}\n />\n </Field>\n <div className=\"readiness-check__actions\">\n <Button\n disabled={rationale.trim() === \"\" || attestMutation.isPending}\n onClick={() => {\n attestMutation.mutate({\n check,\n outcome: \"CONFIRMED\",\n projectId: project.id,\n rationale: rationale.trim(),\n run,\n });\n }}\n size=\"sm\"\n >\n {t(\"settings.readiness.confirm\")}\n </Button>\n <Button\n disabled={rationale.trim() === \"\" || attestMutation.isPending}\n onClick={() => {\n attestMutation.mutate({\n check,\n outcome: \"NOT_APPLICABLE\",\n projectId: project.id,\n rationale: rationale.trim(),\n run,\n });\n }}\n size=\"sm\"\n >\n {t(\"settings.readiness.notApplicable\")}\n </Button>\n </div>\n </div>\n ) : latestAttestation === undefined ? null : (\n <p className=\"readiness-check__rationale\">{latestAttestation.rationale}</p>\n )}\n </article>\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n )}\n\n <p className=\"readiness-settings__limit\">\n <Icon name=\"info\" size={14} />\n <span>{t(\"settings.readiness.limit\")}</span>\n </p>\n {operationError === null ? null : (\n <p className=\"readiness-settings__error\" role=\"alert\">\n {operationError.message}\n </p>\n )}\n </div>\n );\n};\n\n/**\n * Gathers the preferences that belong to this browser.\n *\n * Theme, language and density are stored locally and affect nothing the daemon owns, which is why\n * they live together here. Registering a repository is the one thing in this dialog that is not a\n * local preference: it is a command against domain state, and it lives here because this is where\n * the project list already is -- not because it belongs with the toggles above it.\n */\nconst SettingsDialog = ({ onOpenChange, open }: SettingsDialogProps): React.JSX.Element => {\n const { locale, setLocale, t } = useI18n();\n const { projects, selectedProject, selectProject } = useWorkspace();\n const [theme, setTheme] = useState<ThemePreference>(readThemePreference);\n const [density, setDensity] = useState<DensityPreference>(readDensityPreference);\n const [customWidths, setCustomWidths] = useState(hasCustomPanelWidths);\n\n useEffect(() => {\n if (open) setCustomWidths(hasCustomPanelWidths());\n }, [open]);\n\n return (\n <DialogSurface\n closeLabel={t(\"action.closeDialog\")}\n description={t(\"settings.description\")}\n onOpenChange={onOpenChange}\n open={open}\n title={t(\"settings.title\")}\n >\n <div className=\"settings\">\n <section className=\"settings__section\">\n <h3>{t(\"settings.appearance\")}</h3>\n <SettingChoice\n label={t(\"theme.change\")}\n onChange={(value) => {\n setTheme(value);\n applyThemePreference(value);\n }}\n options={[\n { icon: \"monitor\", label: t(\"theme.system\"), value: \"system\" },\n { icon: \"sun\", label: t(\"theme.light\"), value: \"light\" },\n { icon: \"moon\", label: t(\"theme.dark\"), value: \"dark\" },\n ]}\n value={theme}\n />\n <SettingChoice\n description={t(\"settings.density.description\")}\n label={t(\"settings.density\")}\n onChange={(value) => {\n setDensity(value);\n applyDensityPreference(value);\n }}\n options={[\n { icon: \"list\", label: t(\"settings.density.comfortable\"), value: \"comfortable\" },\n { icon: \"layers\", label: t(\"settings.density.compact\"), value: \"compact\" },\n ]}\n value={density}\n />\n <SettingChoice\n label={t(\"language.change\")}\n onChange={setLocale}\n options={[\n { label: t(\"language.english\"), value: \"en\" },\n { label: t(\"language.russian\"), value: \"ru\" },\n ]}\n value={locale}\n />\n </section>\n\n <section className=\"settings__section\">\n <h3>{t(\"settings.layout\")}</h3>\n <p className=\"settings__note\">{t(\"settings.layout.description\")}</p>\n <Button\n disabled={!customWidths}\n onClick={() => {\n resetPanelWidths();\n setCustomWidths(false);\n }}\n >\n {t(\"settings.layout.reset\")}\n </Button>\n </section>\n\n <section className=\"settings__section\">\n <h3>{t(\"settings.projects\")}</h3>\n {projects.length > 0 ? (\n <ul className=\"settings__projects\">\n {projects.map((project) => (\n <li key={project.id}>\n <button\n aria-pressed={project.id === selectedProject?.id}\n onClick={() => {\n selectProject(project.id);\n }}\n type=\"button\"\n >\n <span>{project.name.slice(0, 1).toUpperCase()}</span>\n <span className=\"settings__project-copy\">\n <strong>{project.name}</strong>\n {/* The path, not only the name. A Project whose repository has moved or was\n never one is otherwise indistinguishable here from a healthy one -- which\n is how two demo Projects stuck at a directory inside Loomrail's own\n checkout stayed invisible while every IMPLEMENT on them was refused. */}\n <small className=\"settings__project-path\" title={project.repositoryPath}>\n {t(\"settings.projects.repositoryLabel\")}: {project.repositoryPath}\n </small>\n </span>\n {project.id === selectedProject?.id ? <Icon name=\"check\" size={14} /> : null}\n </button>\n {project.repositoryStatus === \"UNUSABLE\" ? (\n <RepairFixtureProject project={project} />\n ) : null}\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"settings__note\">{t(\"project.none\")}</p>\n )}\n <ProjectScaffoldPanel />\n <RegisterRepositoryField />\n {selectedProject === null ? null : (\n <ProjectWorkspaceStrategyPanel key={selectedProject.id} project={selectedProject} />\n )}\n {selectedProject === null ? null : <ProjectProviderPanel project={selectedProject} />}\n {selectedProject === null ? null : <McpSettingsPanel project={selectedProject} />}\n {selectedProject === null ? null : <ProjectConstitutionPanel project={selectedProject} />}\n {selectedProject === null ? null : <VerificationPlanSettingsPanel project={selectedProject} />}\n {selectedProject === null ? null : <LaunchMeasurementPanel project={selectedProject} />}\n {selectedProject === null ? null : <LaunchReleasePanel project={selectedProject} />}\n {selectedProject === null ? null : <ProjectReadinessPanel project={selectedProject} />}\n </section>\n </div>\n </DialogSurface>\n );\n};\n\nconst SidebarLink = ({\n active,\n count,\n countOverflow = false,\n icon,\n label,\n to,\n}: {\n active: boolean;\n count?: number;\n countOverflow?: boolean;\n icon: IconName;\n label: string;\n to: \"/\" | \"/attention\" | \"/fleet\" | \"/insights\" | \"/try\";\n}): React.JSX.Element => {\n const content = (\n <>\n <Icon name={icon} size={15} />\n <span>{label}</span>\n {count !== undefined && count > 0 ? (\n <em className=\"app-nav-link__count\">{countOverflow ? `${count.toString()}+` : count}</em>\n ) : null}\n </>\n );\n const className = cn(\"app-nav-link\", active && \"is-active\");\n if (to === \"/\") {\n return (\n <Link className={className} search={{}} to=\"/\">\n {content}\n </Link>\n );\n }\n if (to === \"/attention\") {\n return (\n <Link className={className} to=\"/attention\">\n {content}\n </Link>\n );\n }\n if (to === \"/fleet\") {\n return (\n <Link className={className} to=\"/fleet\">\n {content}\n </Link>\n );\n }\n if (to === \"/try\") {\n return (\n <Link className={className} search={{}} to=\"/try\">\n {content}\n </Link>\n );\n }\n return (\n <Link className={className} to=\"/insights\">\n {content}\n </Link>\n );\n};\n\n/**\n * Reports whether a single-line label is clipped by the width it was given.\n *\n * The sidebar is resizable and collapses to an icon rail, so the project name only earns a tooltip\n * once it stops fitting; a label the rail hides entirely counts as clipped as well.\n */\nconst useClippedLabel = (label: string): { clipped: boolean; ref: (node: HTMLElement | null) => void } => {\n const [node, setNode] = useState<HTMLElement | null>(null);\n const [clipped, setClipped] = useState(false);\n\n useEffect(() => {\n if (node === null) return undefined;\n\n const measure = (): void => {\n setClipped(node.scrollWidth > node.clientWidth || node.clientWidth === 0);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => {\n observer.disconnect();\n };\n }, [label, node]);\n\n return { clipped, ref: setNode };\n};\n\nconst WorkspaceNavigation = ({\n onNavigate,\n onOpenSettings,\n}: {\n onNavigate?: () => void;\n onOpenSettings: () => void;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const { connection, projects, selectedProject, selectProject } = useWorkspace();\n const attentionQuery = useAttentionInbox();\n const fleetQuery = useAgentFleet();\n const pathname = useLocation({ select: (location) => location.pathname });\n const connected = connection?.status === \"connected\";\n const projectInitial = selectedProject?.name.slice(0, 1).toUpperCase() ?? \"–\";\n const projectName = selectedProject?.name ?? \"\";\n const { clipped: projectNameClipped, ref: projectNameRef } = useClippedLabel(projectName);\n const attentionCount = attentionQuery.data?.items.length ?? 0;\n const onAttention = pathname === \"/attention\";\n const onFleet = pathname === \"/fleet\";\n const onInsights = pathname === \"/insights\";\n const onActivation = pathname === \"/try\";\n\n return (\n <>\n <div className=\"app-sidebar__workspace\">\n <BrandMark className=\"app-brand-mark\" size={22} />\n <strong>Loomrail</strong>\n </div>\n\n <div className=\"app-nav-group\">\n <span>{t(\"nav.yourProjects\")}</span>\n {projects.length > 0 ? (\n <ActionMenu\n groups={[\n projects.map((project) => ({\n label: project.name,\n onSelect: () => {\n selectProject(project.id);\n onNavigate?.();\n },\n shortcut: project.id === selectedProject?.id ? \"✓\" : \"\",\n })),\n ]}\n trigger={\n <button aria-label={t(\"project.switch\")} className=\"app-project-label\" type=\"button\">\n <span>{projectInitial}</span>\n <strong ref={projectNameRef}>{projectName}</strong>\n <Icon name=\"chevronDown\" size={12} />\n </button>\n }\n {...(projectNameClipped ? { triggerTooltip: projectName } : {})}\n />\n ) : (\n <div className=\"app-project-label is-empty\">\n <span>–</span>\n <strong>{t(\"project.none\")}</strong>\n </div>\n )}\n <nav aria-label={t(\"nav.workspace\")} className=\"app-nav app-nav--nested\" onClick={onNavigate}>\n <SidebarLink active={pathname === \"/\"} icon=\"board\" label={t(\"nav.currentWork\")} to=\"/\" />\n <SidebarLink active={onActivation} icon=\"play\" label={t(\"nav.guidedDemo\")} to=\"/try\" />\n <SidebarLink\n active={onFleet}\n icon=\"agents\"\n label={t(\"nav.fleet\")}\n to=\"/fleet\"\n {...(fleetQuery.data === undefined ? {} : { count: fleetQuery.data.capacity.active })}\n />\n <SidebarLink\n active={onAttention}\n count={attentionCount}\n countOverflow={attentionQuery.data?.hasMore ?? false}\n icon=\"question\"\n label={t(\"nav.attention\")}\n to=\"/attention\"\n />\n <SidebarLink active={onInsights} icon=\"insights\" label={t(\"nav.insights\")} to=\"/insights\" />\n </nav>\n </div>\n\n <div className=\"app-sidebar__footer\">\n <span className={connected ? \"app-connection is-online\" : \"app-connection is-offline\"}>\n <span aria-hidden=\"true\" />\n {connected ? t(\"connection.local\") : t(\"connection.offline\")}\n </span>\n <Tooltip label={t(\"settings.open\")}>\n <IconButton\n label={t(\"settings.open\")}\n name=\"settings\"\n onClick={() => {\n onOpenSettings();\n }}\n />\n </Tooltip>\n </div>\n </>\n );\n};\n\nexport const AppFrame = (): React.JSX.Element => {\n const { t } = useI18n();\n const { connectionPending, projectsPending, selectedProject } = useWorkspace();\n const pathname = useLocation({ select: (location) => location.pathname });\n const [navigationOpen, setNavigationOpen] = useState(false);\n const [settingsOpen, setSettingsOpen] = useState(false);\n const openAppSettings = useCallback(() => {\n setSettingsOpen(true);\n }, []);\n const projectInitial = selectedProject?.name.slice(0, 1).toUpperCase() ?? \"–\";\n\n if (connectionPending || projectsPending) {\n return (\n <div aria-busy=\"true\" className=\"app-shell app-shell--loading\">\n <aside aria-hidden=\"true\" className=\"app-sidebar app-sidebar--loading\" />\n <section className=\"app-surface app-surface--loading\">\n <span aria-label={t(\"connection.connecting\")} className=\"app-loading-mark\" role=\"status\">\n <BrandMark className=\"app-brand-mark\" size={40} />\n </span>\n </section>\n </div>\n );\n }\n\n return (\n <div className=\"app-shell\">\n <aside className=\"app-sidebar\">\n <WorkspaceNavigation onOpenSettings={openAppSettings} />\n <PanelResizer edge=\"start\" panel=\"sidebar\" />\n </aside>\n\n <section className=\"app-surface\">\n <header className=\"app-topbar\">\n <div className=\"app-breadcrumbs\">\n <DialogSurface\n className=\"app-navigation-drawer\"\n closeLabel={t(\"action.closeDialog\")}\n onOpenChange={setNavigationOpen}\n open={navigationOpen}\n title={t(\"nav.workspace\")}\n trigger={\n <IconButton className=\"app-navigation-trigger\" label={t(\"nav.open\")} name=\"menu\" size=\"sm\" />\n }\n >\n <WorkspaceNavigation\n onNavigate={() => {\n setNavigationOpen(false);\n }}\n onOpenSettings={() => {\n setNavigationOpen(false);\n setSettingsOpen(true);\n }}\n />\n </DialogSurface>\n <span className=\"app-project-icon\">{projectInitial}</span>\n <span className=\"app-breadcrumbs__project\">\n {selectedProject?.name ?? t(\"project.noneSingle\")}\n </span>\n <Icon name=\"chevronRight\" size={12} />\n <strong>\n {t(\n pathname === \"/attention\"\n ? \"attention.inboxTitle\"\n : pathname === \"/fleet\"\n ? \"fleet.title\"\n : pathname === \"/insights\"\n ? \"insights.title\"\n : pathname === \"/try\"\n ? \"activation.title\"\n : \"work.current\",\n )}\n </strong>\n </div>\n <div className=\"app-topbar__actions\">{pathname === \"/try\" ? null : <NewTaskDialog />}</div>\n </header>\n <main className=\"app-content\" id=\"main-content\">\n <OpenAppSettingsContext.Provider value={openAppSettings}>\n <Outlet />\n </OpenAppSettingsContext.Provider>\n </main>\n </section>\n\n <SettingsDialog onOpenChange={setSettingsOpen} open={settingsOpen} />\n </div>\n );\n};\n","import { useState } from \"react\";\nimport type { ChangedFile } from \"@loomrail/contracts\";\nimport { Badge, Icon, InspectorSection } from \"@loomrail/ui\";\n\nimport { changeStatusLabelKeys, changeStatusTones, changesRefusalKey } from \"../changesView\";\nimport { useI18n } from \"../i18n\";\nimport type { Translator } from \"../i18n\";\nimport { useWorkItemChanges, useWorkItemFileDiff } from \"../workspace\";\n\n/**\n * What the row says about one file, shared by the two shapes a row can take.\n *\n * A binary file's row is a plain `<div>` and a text file's row is a `<button>` that expands it, and\n * the only difference between them is that -- so the contents are written once here rather than\n * twice, where the two could drift into naming the same file differently.\n */\nconst ChangedFileRow = ({ file, t }: { file: ChangedFile; t: Translator }): React.JSX.Element => (\n <span className=\"changes-row\">\n <span className=\"changes-row__head\">\n <Badge tone={changeStatusTones[file.status]}>{t(changeStatusLabelKeys[file.status])}</Badge>\n <code className=\"changes-row__path\">{file.path}</code>\n </span>\n <span className=\"changes-row__meta\">\n {/* Spec §10.4: a rename is one file that moved, not a deletion plus an addition, and the row\n is only telling the truth about it if the name it moved from is on screen too. */}\n {file.previousPath === null ? null : (\n <span className=\"changes-row__previous\">{t(\"changes.renamedFrom\", { path: file.previousPath })}</span>\n )}\n {/* Named binary rather than shown as an empty diff (spec D8), and shown INSTEAD of line\n counts rather than beside them: git reports no line counts for a binary file, its\n `insertions`/`deletions` are null, and printing `+0 −0` would read as \"nothing changed in\n it\". The counts below are rendered only when both are really there, for that same reason\n -- there is no zero to fall back on. */}\n {file.binary ? <Badge tone=\"neutral\">{t(\"changes.binary\")}</Badge> : null}\n {file.insertions === null || file.deletions === null ? null : (\n <span\n aria-label={t(\"changes.lineCounts\", {\n insertions: file.insertions,\n deletions: file.deletions,\n })}\n className=\"changes-row__counts\"\n >\n <span className=\"changes-row__insertions\">+{file.insertions}</span>\n <span className=\"changes-row__deletions\">&minus;{file.deletions}</span>\n </span>\n )}\n </span>\n </span>\n);\n\n/**\n * The body of the one file the owner expanded.\n *\n * A component of its own so that the query lives and dies with the disclosure: a body is fetched\n * when this mounts and never before, which is what keeps the file list free of the cost of the\n * patches it lists (spec D5). It is also what makes the measured, debounced reread after a stage\n * event cost one body rather than all of them -- only the mounted query is active when the event\n * bridge invalidates the changes subtree (spec D6).\n *\n * The patch is printed as preformatted text and nothing else. Colouring each line would mean one\n * element per line, and this diff is capped at 512 KiB rather than at a number of lines -- a\n * generated file at that cap is tens of thousands of elements for an effect the leading `+` and `-`\n * of a unified diff already carry. Side-by-side and syntax highlighting are named non-goals of this\n * milestone (spec §11).\n */\nconst ExpandedFileDiff = ({ path, workItemId }: { path: string; workItemId: string }): React.JSX.Element => {\n const { locale, t } = useI18n();\n const diffQuery = useWorkItemFileDiff(workItemId, path);\n\n if (diffQuery.error) {\n return (\n <p className=\"changes-diff__note\" role=\"status\">\n {t(changesRefusalKey(diffQuery.error))}\n </p>\n );\n }\n\n if (diffQuery.isPending) {\n return (\n <p className=\"changes-diff__note\" role=\"status\">\n {t(\"changes.diffPending\")}\n </p>\n );\n }\n\n const diff = diffQuery.data.diff;\n if (diff === null) {\n // The handle answers `null` for a work item with no workspace, and the list this row belongs to\n // could only have been drawn from a workspace that existed a moment ago -- so reaching here\n // means it stopped existing between the two reads. Saying so beats a spinner that never ends.\n return (\n <p className=\"changes-diff__note\" role=\"status\">\n {t(\"changes.diffUnavailable\")}\n </p>\n );\n }\n\n // `patch === null` and `binary` are the same fact from the two sides of the contract, and either\n // one is enough: there is no text to print, and printing \"\" would read as a real but empty diff.\n if (diff.binary || diff.patch === null) {\n return <p className=\"changes-diff__note\">{t(\"changes.binaryNoPatch\")}</p>;\n }\n\n return (\n <div className=\"changes-diff\">\n <pre className=\"changes-diff__patch\">\n <code>{diff.patch}</code>\n </pre>\n {/* Spec D8: a body that was cut says so where the owner is reading it. Silent truncation\n turns \"there are another two hundred lines\" into \"that is all of it\". */}\n {diff.truncated ? (\n <p className=\"changes-diff__note\">\n {t(\"changes.patchTruncated\", { bytes: diff.omittedBytes.toLocaleString(locale) })}\n </p>\n ) : null}\n </div>\n );\n};\n\n/**\n * The files this work item's agent changed, and the diff inside the one the owner expanded\n * (spec §9).\n *\n * Renders nothing at all -- no heading, no shell -- for a work item with no workspace, which is\n * every prose-only stage and every item before its first code stage. That is the same decision\n * `WorkspacePanel` makes next to it and for the same reason: a heading standing over a blank reads\n * as a panel that failed to load rather than as an absence.\n *\n * A refusal, on the other hand, is shown. \"Loomrail could not read this\" and \"there is nothing to\n * read\" are different pieces of news, and collapsing the first into the second would make an\n * unreadable worktree look like an idle one (spec D7).\n *\n * The section is keyed by work item at the call site, so `expandedPath` cannot survive a switch to\n * a different task and reopen a same-named file the owner never asked about.\n */\nexport const ChangesSection = ({ workItemId }: { workItemId: string }): React.JSX.Element | null => {\n const { t } = useI18n();\n const [expandedPath, setExpandedPath] = useState<string | null>(null);\n const changesQuery = useWorkItemChanges(workItemId);\n\n if (changesQuery.error) {\n return (\n <InspectorSection title={t(\"changes.title\")}>\n <p className=\"changes__refusal\" role=\"status\">\n {t(changesRefusalKey(changesQuery.error))}\n </p>\n </InspectorSection>\n );\n }\n\n // Pending and \"no workspace\" both render nothing, deliberately: while the read is in flight there\n // is no honest answer to show, and an empty section that later fills in would move everything\n // below it on the page.\n const summary = changesQuery.data?.changes ?? null;\n if (summary === null) return null;\n\n return (\n <InspectorSection title={t(\"changes.title\")}>\n {summary.files.length === 0 ? (\n // An empty list is a statement about the world -- the worktree is unchanged -- and never\n // the residue of a read that failed, because that arrives as the refusal above (spec D7).\n <p className=\"inspector-copy\">{t(\"changes.empty\")}</p>\n ) : (\n <div className=\"changes\">\n {/* Spec D8 again, for the list rather than a body: the owner is looking at the first N of\n more, and has to be told before they conclude the rest was never changed. */}\n {summary.truncated ? (\n <p className=\"changes__note\">{t(\"changes.truncated\", { count: summary.files.length })}</p>\n ) : null}\n <ul className=\"changes-list\">\n {summary.files.map((file) => {\n const expanded = expandedPath === file.path;\n return (\n <li className=\"changes-list__item\" key={file.path}>\n {file.binary ? (\n // No control at all, rather than one that opens onto \"there is no diff\": the\n // row already says the file is binary, and a disclosure that can only ever\n // disclose that sentence is a button that does nothing.\n <div className=\"changes-list__row\">\n <ChangedFileRow file={file} t={t} />\n </div>\n ) : (\n <button\n aria-expanded={expanded}\n className=\"changes-list__row changes-list__toggle\"\n onClick={() => {\n setExpandedPath(expanded ? null : file.path);\n }}\n type=\"button\"\n >\n {/* Decorative: `aria-expanded` above already tells assistive tech the state,\n and the row's own text is its accessible name. This is the only sign a\n sighted reader has that the row opens at all. */}\n <Icon\n aria-hidden=\"true\"\n className=\"changes-list__chevron\"\n name={expanded ? \"chevronDown\" : \"chevronRight\"}\n size={12}\n />\n <ChangedFileRow file={file} t={t} />\n </button>\n )}\n {expanded ? <ExpandedFileDiff path={file.path} workItemId={workItemId} /> : null}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </InspectorSection>\n );\n};\n","import type { DomainEvent } from \"@loomrail/contracts\";\n\n// WORKSPACE_TOOL_CALL_CHANGED now renders exclusively in Run Activity\n// (components/RunActivitySection.tsx), not in the WorkItem-lifecycle Activity timeline\n// (WorkbenchPage.tsx's TaskActivitySection): the same audited action shown in both places, in two\n// different vocabularies, would leave the owner unable to tell it is one action.\n//\n// A plain function value, not a component -- kept out of WorkbenchPage.tsx itself (a component\n// file react-refresh expects to export only components) so it can be unit tested on its own\n// without pulling in that very large module's render tree.\nexport type WorkItemTimelineEvent = Exclude<DomainEvent, { type: \"WORKSPACE_TOOL_CALL_CHANGED\" }>;\n\nexport const isWorkItemTimelineEvent = (event: DomainEvent): event is WorkItemTimelineEvent =>\n event.type !== \"WORKSPACE_TOOL_CALL_CHANGED\";\n\n/**\n * Whether `TaskActivitySection` should keep paging the raw (unfiltered) Events feed forward on its\n * own, before showing anything, rather than let the owner see an empty list.\n *\n * The events feed is read newest-first, 30 raw rows per page, and one workspace tool call appends\n * TWO WORKSPACE_TOOL_CALL_CHANGED events (start, finish) -- both now excluded by\n * `isWorkItemTimelineEvent`. During and right after a busy run the newest 30 raw events for an item\n * can legitimately be *entirely* tool calls, which would otherwise leave the filtered page empty\n * while real lifecycle history still exists one page back: \"No activity yet\" rendered beside the\n * section's own \"Show more\" button.\n *\n * `hasLoadedFirstPage` gates this on purpose: before the first page has even arrived,\n * `lifecycleEventsLoaded === 0` is simply \"nothing has loaded yet\", not \"the loaded page was all\n * tool calls\" -- conflating the two would auto-page before the ordinary first render had a chance\n * to. This always terminates once it does start: WORK_ITEM_CREATED is every WorkItem's first Event\n * and is never filtered out, so the walk back through history cannot run past it.\n */\nexport const shouldKeepPagingForLifecycleEvent = (input: {\n hasLoadedFirstPage: boolean;\n lifecycleEventsLoaded: number;\n hasNextPage: boolean;\n}): boolean => input.hasLoadedFirstPage && input.lifecycleEventsLoaded === 0 && input.hasNextPage;\n","/* Hallmark · component: provider allowance strip · genre: modern-minimal · theme: existing Loomrail\n * states: default · hover · focus · active · disabled · loading · error · success\n * contrast: uses existing semantic status and focus tokens\n */\nimport type {\n ProjectProviderAllowanceResponse,\n ProviderAllowanceAdvisory,\n ProviderAllowanceBucket,\n ProviderAllowanceFreshness,\n ProviderAllowanceSnapshot,\n ProviderAllowanceUnavailableReason,\n ProviderId,\n} from \"@loomrail/contracts\";\nimport { Button, Icon, Skeleton, type IconName } from \"@loomrail/ui\";\n\nimport { useI18n, type Locale, type TranslationKey, type Translator } from \"../i18n\";\nimport { useProjectProviderAllowance, useRefreshProjectProviderAllowance } from \"../workspace\";\n\ntype AllowanceSurface = \"command-center\" | \"task-cockpit\";\n\ntype ProviderAllowanceStripProps = {\n error: Error | null;\n loading: boolean;\n onRefresh: () => void;\n refreshing: boolean;\n response: ProjectProviderAllowanceResponse | undefined;\n surface: AllowanceSurface;\n};\n\nconst providerLabels: Record<ProviderId, string> = {\n CODEX: \"Codex CLI\",\n CLAUDE_CODE: \"Claude Code CLI\",\n MOCK: \"Historical provider\",\n};\n\nconst freshnessIcons: Record<ProviderAllowanceFreshness, IconName> = {\n LIVE: \"success\",\n STALE: \"clock\",\n UNAVAILABLE: \"warning\",\n};\n\nconst freshnessLabelKeys: Record<ProviderAllowanceFreshness, TranslationKey> = {\n LIVE: \"providerAllowance.freshness.live\",\n STALE: \"providerAllowance.freshness.stale\",\n UNAVAILABLE: \"providerAllowance.freshness.unavailable\",\n};\n\nconst unavailableLabelKeys: Record<ProviderAllowanceUnavailableReason, TranslationKey> = {\n PROVIDER_UNSUPPORTED: \"providerAllowance.unavailable.unsupported\",\n TARGET_UNVERIFIED: \"providerAllowance.unavailable.unverified\",\n NOT_AUTHENTICATED: \"providerAllowance.unavailable.notAuthenticated\",\n DATA_NOT_PRESENT: \"providerAllowance.unavailable.noData\",\n PROVIDER_SCHEMA_DRIFT: \"providerAllowance.unavailable.schemaDrift\",\n PROVIDER_TIMEOUT: \"providerAllowance.unavailable.timeout\",\n PROVIDER_UNAVAILABLE: \"providerAllowance.unavailable.provider\",\n};\n\nconst advisoryLabelKeys: Record<ProviderAllowanceAdvisory[\"status\"], TranslationKey> = {\n CAPACITY_AVAILABLE: \"providerAllowance.advisory.available\",\n LOW_CAPACITY: \"providerAllowance.advisory.low\",\n LIMIT_REACHED: \"providerAllowance.advisory.reached\",\n UNKNOWN: \"providerAllowance.advisory.unknown\",\n};\n\nconst formatAllowanceWindow = (minutes: number, t: Translator): string => {\n if (minutes % (7 * 24 * 60) === 0) {\n return t(\"providerAllowance.window.weeks\", { count: minutes / (7 * 24 * 60) });\n }\n if (minutes % (24 * 60) === 0) {\n return t(\"providerAllowance.window.days\", { count: minutes / (24 * 60) });\n }\n if (minutes % 60 === 0) {\n return t(\"providerAllowance.window.hours\", { count: minutes / 60 });\n }\n return t(\"providerAllowance.window.minutes\", { count: minutes });\n};\n\nconst formatPercent = (value: number, locale: Locale): string =>\n new Intl.NumberFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n maximumFractionDigits: 1,\n }).format(value);\n\nconst formatTime = (value: string, locale: Locale): string =>\n new Intl.DateTimeFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n month: \"short\",\n }).format(new Date(value));\n\nconst BucketRow = ({\n bucket,\n observedAt,\n}: {\n bucket: ProviderAllowanceBucket;\n observedAt: string;\n}): React.JSX.Element => {\n const { locale, t } = useI18n();\n const name = bucket.name ?? t(`providerAllowance.bucket.${bucket.kind}`);\n\n return (\n <li className=\"provider-allowance__bucket\">\n <span className=\"provider-allowance__bucket-name\">{name}</span>\n <strong>\n {t(\"providerAllowance.remaining\", {\n percent: formatPercent(bucket.remainingPercent, locale),\n })}\n </strong>\n <span>{formatAllowanceWindow(bucket.windowDurationMins, t)}</span>\n <span>{t(\"providerAllowance.resets\", { time: formatTime(bucket.resetsAt, locale) })}</span>\n <details>\n <summary>{t(\"providerAllowance.details\")}</summary>\n <span>\n {t(\"providerAllowance.used\", { percent: formatPercent(bucket.usedPercent, locale) })} ·{\" \"}\n {t(\"providerAllowance.observed\", { time: formatTime(observedAt, locale) })}\n </span>\n </details>\n </li>\n );\n};\n\nconst Advisory = ({ advisory }: { advisory: ProviderAllowanceAdvisory }): React.JSX.Element => {\n const { locale, t } = useI18n();\n const parameters =\n advisory.deferUntil === null ? undefined : { time: formatTime(advisory.deferUntil, locale) };\n const labelKey =\n advisory.deferUntil === null && advisory.status === \"LOW_CAPACITY\"\n ? \"providerAllowance.advisory.lowWithoutReset\"\n : advisory.deferUntil === null && advisory.status === \"LIMIT_REACHED\"\n ? \"providerAllowance.advisory.reachedWithoutReset\"\n : advisoryLabelKeys[advisory.status];\n return (\n <p className=\"provider-allowance__advisory\">\n <Icon name=\"info\" size={13} />\n <span>{t(labelKey, parameters)}</span>\n </p>\n );\n};\n\nconst AllowanceBody = ({ snapshot }: { snapshot: ProviderAllowanceSnapshot }): React.JSX.Element => {\n const { t } = useI18n();\n if (snapshot.freshness === \"UNAVAILABLE\") {\n return (\n <p className=\"provider-allowance__unavailable\">{t(unavailableLabelKeys[snapshot.unavailableReason])}</p>\n );\n }\n return (\n <ul className=\"provider-allowance__buckets\">\n {snapshot.buckets.map((bucket) => (\n <BucketRow bucket={bucket} key={bucket.id} observedAt={snapshot.observedAt} />\n ))}\n </ul>\n );\n};\n\nexport const ProviderAllowanceStrip = ({\n error,\n loading,\n onRefresh,\n refreshing,\n response,\n surface,\n}: ProviderAllowanceStripProps): React.JSX.Element => {\n const { t } = useI18n();\n const snapshot = response?.current;\n const provider =\n snapshot === undefined ? t(\"providerAllowance.provider\") : providerLabels[snapshot.provider];\n const freshness = snapshot?.freshness ?? \"UNAVAILABLE\";\n const awaitingFirstRead = loading && response === undefined;\n\n return (\n <section\n aria-label={t(`providerAllowance.surface.${surface}`, { provider })}\n aria-live=\"polite\"\n className={`provider-allowance provider-allowance--${surface} ${awaitingFirstRead ? \"is-loading\" : `is-${freshness.toLowerCase()}`}`}\n >\n <header className=\"provider-allowance__header\">\n <strong>{t(\"providerAllowance.title\", { provider })}</strong>\n <span className=\"provider-allowance__freshness\">\n <Icon name={awaitingFirstRead ? \"spinner\" : freshnessIcons[freshness]} size={13} />\n {awaitingFirstRead ? t(\"providerAllowance.loading\") : t(freshnessLabelKeys[freshness])}\n </span>\n <Button\n disabled={loading || refreshing}\n loading={refreshing}\n onClick={onRefresh}\n size=\"sm\"\n type=\"button\"\n >\n {t(\"providerAllowance.refresh\")}\n </Button>\n </header>\n {awaitingFirstRead ? (\n <div\n aria-label={t(\"providerAllowance.loading\")}\n className=\"provider-allowance__loading\"\n role=\"status\"\n >\n <Skeleton width=\"96px\" />\n <Skeleton width=\"152px\" />\n </div>\n ) : response === undefined || snapshot === undefined ? (\n <p className=\"provider-allowance__unavailable\">{t(\"providerAllowance.unavailable.read\")}</p>\n ) : (\n <>\n <AllowanceBody snapshot={snapshot} />\n <Advisory advisory={response.advisory} />\n </>\n )}\n {error !== null ? (\n <p className=\"provider-allowance__error\" role=\"alert\">\n {response === undefined ? t(\"providerAllowance.error\") : t(\"providerAllowance.errorWithSnapshot\")}\n </p>\n ) : null}\n </section>\n );\n};\n\nexport const ProjectProviderAllowanceStrip = ({\n projectId,\n surface,\n}: {\n projectId: string;\n surface: AllowanceSurface;\n}): React.JSX.Element => {\n const allowanceQuery = useProjectProviderAllowance(projectId);\n const refreshMutation = useRefreshProjectProviderAllowance();\n return (\n <ProviderAllowanceStrip\n error={refreshMutation.error ?? allowanceQuery.error}\n loading={allowanceQuery.isPending}\n onRefresh={() => {\n refreshMutation.reset();\n refreshMutation.mutate(projectId);\n }}\n refreshing={refreshMutation.isPending}\n response={allowanceQuery.data}\n surface={surface}\n />\n );\n};\n","import { useState } from \"react\";\nimport type {\n HumanRequest,\n PipelineRun,\n QACorrectionRun,\n VerificationCheck,\n VerificationCorrectionGateAction,\n VerificationCorrectionRun,\n VerificationPlan,\n VerificationRecipe,\n VerificationRun,\n VerificationRunSnapshotResponse,\n WorkItem,\n} from \"@loomrail/contracts\";\nimport { Button, InspectorSection, Skeleton, Status, type StatusTone } from \"@loomrail/ui\";\n\nimport { LocalConnectionRecovery } from \"./LocalConnectionRecovery\";\nimport { useI18n, type TranslationKey, type Translator } from \"../i18n\";\nimport {\n useCancelVerificationRun,\n useStartVerificationRun,\n useResolveVerificationCorrectionGate,\n useVerificationCheckOutput,\n useVerificationPlanSettings,\n useWorkItemVerificationRuns,\n useWorkItemWorkflow,\n useWorkItemWorkspace,\n useWorkItemQA,\n} from \"../workspace\";\n\nconst activeRunStatuses = new Set<VerificationRun[\"status\"]>([\"QUEUED\", \"RUNNING\", \"CANCELLING\"]);\nconst terminalPipelineStatuses = new Set([\"SUCCEEDED\", \"FAILED\", \"CANCELLED\"]);\n\nconst correctionStatusTones: Record<VerificationCorrectionRun[\"status\"], StatusTone> = {\n ACTIVE: \"running\",\n PASSED: \"complete\",\n SUPERSEDED: \"queued\",\n EXHAUSTED: \"paused\",\n CANCELLED: \"paused\",\n};\n\ntype VerificationCorrectionGate = {\n correctionRun: VerificationCorrectionRun | null;\n qaCorrectionRun: QACorrectionRun | null;\n request: HumanRequest;\n run: PipelineRun;\n};\n\nconst runStatusKeys: Record<VerificationRun[\"status\"], TranslationKey> = {\n QUEUED: \"verification.status.QUEUED\",\n RUNNING: \"verification.status.RUNNING\",\n CANCELLING: \"verification.status.CANCELLING\",\n PASSED: \"verification.status.PASSED\",\n FAILED: \"verification.status.FAILED\",\n ERROR: \"verification.status.ERROR\",\n INTERRUPTED: \"verification.status.INTERRUPTED\",\n};\n\nconst runStatusTones: Record<VerificationRun[\"status\"], StatusTone> = {\n QUEUED: \"queued\",\n RUNNING: \"running\",\n CANCELLING: \"running\",\n PASSED: \"complete\",\n FAILED: \"paused\",\n ERROR: \"paused\",\n INTERRUPTED: \"paused\",\n};\n\nconst staleReasonKeys: Record<VerificationRunSnapshotResponse[\"staleReasons\"][number], TranslationKey> = {\n PLAN_UNAVAILABLE: \"verification.stale.PLAN_UNAVAILABLE\",\n PLAN_REPLACED: \"verification.stale.PLAN_REPLACED\",\n PLAN_UNPUBLISHED: \"verification.stale.PLAN_UNPUBLISHED\",\n TREE_CHANGED: \"verification.stale.TREE_CHANGED\",\n};\n\nconst formatDuration = (milliseconds: number | null, t: Translator): string => {\n if (milliseconds === null) return \"—\";\n if (milliseconds < 1_000) return t(\"verification.duration.ms\", { count: milliseconds });\n return t(\"verification.duration.seconds\", { count: (milliseconds / 1_000).toFixed(1) });\n};\n\nconst ExactCommand = ({ recipe }: { recipe: VerificationRecipe }): React.JSX.Element => (\n <span aria-label={[recipe.executable, ...recipe.argv].join(\" \")} className=\"verification-command\">\n <code>{recipe.executable}</code>\n {recipe.argv.map((argument, index) => (\n <code key={`${index.toString()}-${argument}`}>{argument}</code>\n ))}\n </span>\n);\n\ntype OutputState = {\n checkId: string | null;\n error: Error | null;\n pending: boolean;\n text: string | undefined;\n};\n\nconst CheckRow = ({\n check,\n onToggleOutput,\n output,\n recipe,\n}: {\n check: VerificationCheck | undefined;\n onToggleOutput: (checkId: string) => void;\n output: OutputState;\n recipe: VerificationRecipe;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const outputOpen = output.checkId === check?.id;\n\n return (\n <li className=\"verification-check\">\n <div className=\"verification-check__main\">\n <div>\n <strong>{recipe.label}</strong>\n <span>\n {t(recipe.required ? \"verification.required\" : \"verification.optional\")} · {recipe.kind}\n </span>\n </div>\n {check === undefined ? (\n <Status label={t(\"verification.status.NOT_RUN\")} tone=\"queued\" />\n ) : (\n <Status label={t(runStatusKeys[check.status])} tone={runStatusTones[check.status]} />\n )}\n </div>\n <ExactCommand recipe={recipe} />\n {check === undefined || (check.durationMs === null && check.exitCode === null) ? null : (\n <span className=\"verification-check__measurement\">\n {t(\"verification.measurement\", {\n duration: formatDuration(check.durationMs, t),\n exit: check.exitCode ?? \"—\",\n })}\n </span>\n )}\n {check?.output?.available ? (\n <div className=\"verification-output\">\n <Button\n aria-expanded={outputOpen}\n onClick={() => {\n onToggleOutput(check.id);\n }}\n size=\"sm\"\n type=\"button\"\n >\n {t(outputOpen ? \"verification.output.hide\" : \"verification.output.view\")}\n </Button>\n {outputOpen ? (\n output.pending ? (\n <p aria-live=\"polite\">{t(\"verification.output.loading\")}</p>\n ) : output.error ? (\n <p className=\"verification-output__error\" role=\"alert\">\n {output.error.message}\n </p>\n ) : (\n <pre tabIndex={0}>{output.text ?? \"\"}</pre>\n )\n ) : null}\n </div>\n ) : null}\n </li>\n );\n};\n\nconst verificationKindOrder: readonly VerificationRecipe[\"kind\"][] = [\n \"UNIT\",\n \"INTEGRATION\",\n \"E2E\",\n \"BUILD\",\n \"LINT\",\n \"AUDIT\",\n \"CUSTOM\",\n];\n\nconst GroupedChecks = ({\n checks,\n onToggleOutput,\n output,\n recipes,\n}: {\n checks: ReadonlyMap<string, VerificationCheck>;\n onToggleOutput: (checkId: string) => void;\n output: OutputState;\n recipes: readonly VerificationRecipe[];\n}): React.JSX.Element => {\n const { t } = useI18n();\n\n return (\n <>\n {verificationKindOrder.map((kind) => {\n const groupedRecipes = recipes.filter((recipe) => recipe.kind === kind);\n if (groupedRecipes.length === 0) return null;\n return (\n <section className=\"verification-check-group\" key={kind}>\n <h4>{t(\"verification.group\", { kind })}</h4>\n <ol className=\"verification-checks\">\n {groupedRecipes.map((recipe) => (\n <CheckRow\n check={checks.get(recipe.id)}\n key={recipe.id}\n onToggleOutput={onToggleOutput}\n output={output}\n recipe={recipe}\n />\n ))}\n </ol>\n </section>\n );\n })}\n </>\n );\n};\n\nconst outcomeMessage = (snapshot: VerificationRunSnapshotResponse, t: Translator): string => {\n if (snapshot.freshness === \"STALE\") {\n return t(\"verification.outcome.stale\", {\n reasons: snapshot.staleReasons.map((reason) => t(staleReasonKeys[reason])).join(\", \"),\n });\n }\n switch (snapshot.run.status) {\n case \"QUEUED\":\n case \"RUNNING\":\n case \"CANCELLING\":\n return t(\"verification.outcome.active\");\n case \"PASSED\":\n return t(\"verification.outcome.passed\");\n case \"FAILED\":\n case \"ERROR\":\n return t(\"verification.outcome.failed\");\n case \"INTERRUPTED\":\n return t(\"verification.outcome.interrupted\");\n default: {\n const unhandled: never = snapshot.run.status;\n throw new Error(`Unhandled verification status: ${String(unhandled)}`);\n }\n }\n};\n\nconst RunEvidence = ({\n onToggleOutput,\n output,\n snapshot,\n}: {\n onToggleOutput: (checkId: string) => void;\n output: OutputState;\n snapshot: VerificationRunSnapshotResponse;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const checks = new Map(snapshot.checks.map((check) => [check.recipeId, check]));\n const stale = snapshot.freshness === \"STALE\";\n const passedChecks = snapshot.checks.filter((check) => check.status === \"PASSED\").length;\n const failedChecks = snapshot.checks.filter((check) => check.status === \"FAILED\").length;\n const errorChecks = snapshot.checks.filter((check) => check.status === \"ERROR\").length;\n const interruptedChecks = snapshot.checks.filter((check) => check.status === \"INTERRUPTED\").length;\n const remainingChecks = snapshot.checks.filter(\n (check) => check.status === \"QUEUED\" || check.status === \"RUNNING\",\n ).length;\n\n return (\n <div className=\"verification-run\">\n <div className=\"verification-run__summary\">\n <Status\n label={t(stale ? \"verification.status.STALE\" : runStatusKeys[snapshot.run.status])}\n tone={stale ? \"paused\" : runStatusTones[snapshot.run.status]}\n />\n <span>\n {t(\"verification.runMeta\", {\n ordinal: snapshot.run.ordinal,\n platform: t(`verification.platform.${snapshot.run.platform}`),\n revision: snapshot.run.planRevision,\n })}\n </span>\n </div>\n <p className=\"verification-run__evidence\">\n {t(\"verification.evidenceCounts\", {\n errors: errorChecks,\n failed: failedChecks,\n interrupted: interruptedChecks,\n passed: passedChecks,\n remaining: remainingChecks,\n tree: snapshot.run.implementationTree.slice(0, 12),\n })}\n </p>\n <p className=\"verification-run__outcome\" role=\"status\">\n {outcomeMessage(snapshot, t)}\n </p>\n <GroupedChecks\n checks={checks}\n onToggleOutput={onToggleOutput}\n output={output}\n recipes={snapshot.plan.recipes}\n />\n </div>\n );\n};\n\ntype RunAvailability = \"READY\" | \"PLAN_REQUIRED\" | \"PIPELINE_REQUIRED\" | \"WORKSPACE_REQUIRED\";\n\nexport const ProjectVerificationView = ({\n actionPending,\n availability,\n correctionGate,\n correctionPendingAction,\n correctionRuns,\n currentPlan,\n loadError,\n loading,\n onCancel,\n onRetryLoad,\n onResolveCorrection,\n onRun,\n onToggleOutput,\n operationError,\n output,\n runs,\n}: {\n actionPending: boolean;\n availability: RunAvailability;\n correctionGate: VerificationCorrectionGate | null;\n correctionPendingAction: VerificationCorrectionGateAction | null;\n correctionRuns: readonly VerificationCorrectionRun[];\n currentPlan: VerificationPlan | null;\n loadError: Error | null;\n loading: boolean;\n onCancel: (run: VerificationRun) => void;\n onRetryLoad: () => void;\n onResolveCorrection: (action: VerificationCorrectionGateAction) => void;\n onRun: (retryOf?: VerificationRun) => void;\n onToggleOutput: (checkId: string) => void;\n operationError: Error | null;\n output: OutputState;\n runs: readonly VerificationRunSnapshotResponse[];\n}): React.JSX.Element => {\n const { t } = useI18n();\n const latest = runs[0];\n const active = latest !== undefined && activeRunStatuses.has(latest.run.status) ? latest : null;\n const cancellable = active !== null && (active.run.status === \"QUEUED\" || active.run.status === \"RUNNING\");\n const availabilityMessage: Record<Exclude<RunAvailability, \"READY\">, TranslationKey> = {\n PLAN_REQUIRED: \"verification.unavailable.plan\",\n PIPELINE_REQUIRED: \"verification.unavailable.pipeline\",\n WORKSPACE_REQUIRED: \"verification.unavailable.workspace\",\n };\n\n return (\n <InspectorSection title={t(\"verification.title\")}>\n <div className=\"project-verification\">\n {loading ? (\n <div aria-label={t(\"verification.loading\")} className=\"verification-loading\">\n <Skeleton width=\"42%\" />\n <Skeleton width=\"86%\" />\n <Skeleton width=\"68%\" />\n </div>\n ) : loadError ? (\n <LocalConnectionRecovery error={loadError} onRetry={onRetryLoad} retrying={false} />\n ) : (\n <>\n {currentPlan ? (\n <div className=\"verification-current-plan\" role=\"note\">\n <strong>{t(\"verification.currentPlan\", { revision: currentPlan.revision })}</strong>\n <p className=\"verification-acceptance-blocker\">{t(\"verification.acceptanceBlocker\")}</p>\n </div>\n ) : null}\n {latest ? (\n <RunEvidence onToggleOutput={onToggleOutput} output={output} snapshot={latest} />\n ) : currentPlan ? (\n <div className=\"verification-run\">\n <p className=\"verification-run__outcome\">{t(\"verification.intro\")}</p>\n <GroupedChecks\n checks={new Map()}\n onToggleOutput={onToggleOutput}\n output={output}\n recipes={currentPlan.recipes}\n />\n </div>\n ) : null}\n\n {runs.length > 1 ? (\n <details className=\"verification-history\">\n <summary>{t(\"verification.history\", { count: runs.length - 1 })}</summary>\n <div>\n {runs.slice(1).map((snapshot) => (\n <RunEvidence\n key={snapshot.run.id}\n onToggleOutput={onToggleOutput}\n output={output}\n snapshot={snapshot}\n />\n ))}\n </div>\n </details>\n ) : null}\n\n {correctionRuns.length > 0 ? (\n <div className=\"verification-corrections\">\n <strong>{t(\"verification.correction.timeline\")}</strong>\n <ol>\n {correctionRuns.map((correction) => (\n <li key={correction.id}>\n <div>\n <strong>\n {t(\"verification.correction.position\", { position: correction.budgetPosition })}\n </strong>\n <span>\n {t(\n correction.automatic\n ? \"verification.correction.automatic\"\n : \"verification.correction.ownerAuthorized\",\n )}\n </span>\n </div>\n <Status\n label={t(`verification.correction.status.${correction.status}`)}\n tone={correctionStatusTones[correction.status]}\n />\n </li>\n ))}\n </ol>\n </div>\n ) : null}\n\n {correctionGate ? (\n <div className=\"human-request-card verification-correction-gate\">\n <h3>{t(\"verification.correctionGate.title\")}</h3>\n <p>\n {correctionGate.correctionRun === null\n ? correctionGate.request.context\n : t(\"verification.correctionGate.description\", {\n position: correctionGate.correctionRun.budgetPosition,\n })}\n </p>\n {correctionGate.request.recommendation ? (\n <div className=\"human-request-card__recommendation\">\n <strong>{t(\"humanRequest.recommendation\")}</strong>\n <span>{correctionGate.request.recommendation}</span>\n </div>\n ) : null}\n <div className=\"verification-actions\">\n {correctionGate.request.options.length === 2 ? (\n <Button\n disabled={correctionPendingAction !== null}\n loading={correctionPendingAction === \"AUTHORIZE_FINAL\"}\n onClick={() => {\n onResolveCorrection(\"AUTHORIZE_FINAL\");\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(\"verification.correctionGate.authorizeFinal\")}\n </Button>\n ) : null}\n <Button\n disabled={correctionPendingAction !== null}\n loading={correctionPendingAction === \"CANCEL\"}\n onClick={() => {\n onResolveCorrection(\"CANCEL\");\n }}\n type=\"button\"\n variant=\"destructive\"\n >\n {t(\"verification.correctionGate.cancel\")}\n </Button>\n </div>\n </div>\n ) : null}\n\n {availability === \"READY\" || active !== null ? null : (\n <p className=\"verification-unavailable\">{t(availabilityMessage[availability])}</p>\n )}\n\n {operationError ? (\n <p className=\"verification-operation-error\" role=\"alert\">\n {operationError.message}\n </p>\n ) : null}\n\n <div className=\"verification-actions\">\n {correctionGate ? null : cancellable ? (\n <Button\n loading={actionPending}\n onClick={() => {\n onCancel(active.run);\n }}\n type=\"button\"\n variant=\"destructive\"\n >\n {t(\"verification.cancel\")}\n </Button>\n ) : availability === \"READY\" && currentPlan ? (\n <Button\n loading={actionPending}\n onClick={() => {\n onRun(latest?.run);\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(latest ? \"verification.runAgain\" : \"verification.run\")}\n </Button>\n ) : null}\n </div>\n </>\n )}\n </div>\n </InspectorSection>\n );\n};\n\nexport const ProjectVerificationPanel = ({ item }: { item: WorkItem }): React.JSX.Element => {\n const runsQuery = useWorkItemVerificationRuns(item.id);\n const planQuery = useVerificationPlanSettings(item.projectId);\n const workflowQuery = useWorkItemWorkflow(item.id);\n const workspaceQuery = useWorkItemWorkspace(item.id);\n const qaQuery = useWorkItemQA(item.id);\n const start = useStartVerificationRun();\n const cancel = useCancelVerificationRun();\n const resolveCorrection = useResolveVerificationCorrectionGate();\n const outputMutation = useVerificationCheckOutput();\n const [outputCheckId, setOutputCheckId] = useState<string | null>(null);\n const plan = planQuery.data?.plan ?? null;\n const publication = planQuery.data?.publication ?? null;\n const planReady =\n plan?.status === \"ACTIVE\" &&\n publication?.status === \"APPLIED\" &&\n publication.planId === plan.id &&\n publication.contentHash === plan.contentHash;\n const pipelineStatus = workflowQuery.data?.run?.status;\n const pipelineReady = pipelineStatus !== undefined && !terminalPipelineStatuses.has(pipelineStatus);\n const workspaceReady = workspaceQuery.data?.workspace?.status === \"READY\";\n const currentRun = workflowQuery.data?.run ?? null;\n const currentAttempt =\n currentRun === null\n ? null\n : (workflowQuery.data?.stageAttempts.find(({ id }) => id === currentRun.currentStageAttemptId) ?? null);\n const hasCorrectionGate =\n currentAttempt?.stage === \"QA\" &&\n currentAttempt.status === \"WAITING_HUMAN\" &&\n currentAttempt.failureCode === \"VERIFICATION_CORRECTION_EXHAUSTED\";\n const gateCorrection =\n hasCorrectionGate && (currentAttempt.verificationCorrectionRunId ?? null) !== null\n ? (runsQuery.data?.correctionRuns.find(\n ({ id, status }) =>\n id === currentAttempt.verificationCorrectionRunId &&\n (status === \"EXHAUSTED\" || status === \"PASSED\"),\n ) ?? null)\n : null;\n const suspendedQACorrection =\n hasCorrectionGate && currentAttempt.correctionRunId !== null\n ? (qaQuery.data?.correctionRuns.find(\n ({ id, status }) => id === currentAttempt.correctionRunId && status === \"ACTIVE\",\n ) ?? null)\n : null;\n const correctionRequest = !hasCorrectionGate\n ? null\n : (workflowQuery.data?.humanRequests.find(\n ({ stageAttemptId, status }) => stageAttemptId === currentAttempt.id && status === \"OPEN\",\n ) ?? null);\n const correctionGate =\n currentRun !== null &&\n correctionRequest !== null &&\n ((gateCorrection !== null &&\n (gateCorrection.resumesQACorrectionRunId ?? null) === (suspendedQACorrection?.id ?? null)) ||\n (gateCorrection === null && suspendedQACorrection !== null))\n ? {\n correctionRun: gateCorrection,\n qaCorrectionRun: suspendedQACorrection,\n request: correctionRequest,\n run: currentRun,\n }\n : null;\n const availability: RunAvailability = !planReady\n ? \"PLAN_REQUIRED\"\n : !pipelineReady\n ? \"PIPELINE_REQUIRED\"\n : !workspaceReady\n ? \"WORKSPACE_REQUIRED\"\n : \"READY\";\n const loadError = [\n runsQuery.error,\n planQuery.error,\n workflowQuery.error,\n workspaceQuery.error,\n qaQuery.error,\n ].find((error): error is Error => error instanceof Error);\n const operationError = [start.error, cancel.error, resolveCorrection.error].find(\n (error): error is Error => error instanceof Error,\n );\n\n return (\n <ProjectVerificationView\n actionPending={start.isPending || cancel.isPending}\n availability={availability}\n correctionGate={correctionGate}\n correctionPendingAction={resolveCorrection.isPending ? resolveCorrection.variables.action : null}\n correctionRuns={runsQuery.data?.correctionRuns ?? []}\n currentPlan={plan?.status === \"ACTIVE\" ? plan : null}\n loadError={loadError ?? null}\n loading={\n runsQuery.isPending ||\n planQuery.isPending ||\n workflowQuery.isPending ||\n workspaceQuery.isPending ||\n qaQuery.isPending\n }\n onCancel={(run) => {\n cancel.mutate(run);\n }}\n onRetryLoad={() => {\n void Promise.all([\n runsQuery.refetch(),\n planQuery.refetch(),\n workflowQuery.refetch(),\n workspaceQuery.refetch(),\n qaQuery.refetch(),\n ]);\n }}\n onResolveCorrection={(action) => {\n if (correctionGate === null) return;\n resolveCorrection.mutate({ ...correctionGate, action });\n }}\n onRun={(retryOf) => {\n if (!planReady) return;\n start.mutate({ workItem: item, plan, ...(retryOf === undefined ? {} : { retryOf }) });\n }}\n onToggleOutput={(checkId) => {\n if (outputCheckId === checkId) {\n setOutputCheckId(null);\n outputMutation.reset();\n return;\n }\n setOutputCheckId(checkId);\n outputMutation.mutate(checkId);\n }}\n operationError={operationError ?? null}\n output={{\n checkId: outputCheckId,\n error: outputMutation.error instanceof Error ? outputMutation.error : null,\n pending: outputMutation.isPending,\n text: outputMutation.data,\n }}\n runs={runsQuery.data?.runs ?? []}\n />\n );\n};\n","import type { AgentRunActivityPage, WorkItem, WorkflowSnapshot } from \"@loomrail/contracts\";\n\n// Plain function values, not components -- kept out of RunActivitySection.tsx itself (a component\n// file react-refresh expects to export only components), the same reason isWorkItemTimelineEvent\n// lives in its own module rather than WorkbenchPage.tsx.\n//\n// `omittedCount` is a task-level count: it comes from one aggregate over every one of the WorkItem's\n// runs' counters rows, unaffected by which page was asked for, so the freshest page's value is the\n// current one and RunActivitySection reads it off the last loaded page.\n//\n// `gap` and `degraded` are warnings, and the rule for a warning is different: it must not un-announce\n// itself, so both are read across every page loaded so far.\n//\n// `gap` is purely per-page, and since fix round 2 on Task 2 it has two triggers -- the page's cursor\n// named a position no longer held, or a source came back at its read-ahead cap and the page still\n// ended with no next cursor. Neither can fire on a first page.\n//\n// `degraded` is mostly a task-level fact (the same aggregate, and nothing ever clears the stored\n// flag), but the route ORs two per-PAGE facts into it as well: a run whose stage would not resolve,\n// and audited rows for a run with no live provider. Both need a data shape production cannot produce\n// going forward -- a foreign-key orphan, or a MOCK run that somehow owns audited calls -- which is\n// why this was read off the last page alone until fix round 1 on Task 5. Rare is not impossible, and\n// reading only the last loaded page let a warning raised on page two disappear when page three came\n// back clean: the same silent hole `anyPageHasGap` already existed to prevent for its sibling flag,\n// left standing in the sibling itself.\nexport const anyPageHasGap = (pages: readonly AgentRunActivityPage[]): boolean =>\n pages.some((page) => page.gap);\n\nexport const anyPageIsDegraded = (pages: readonly AgentRunActivityPage[]): boolean =>\n pages.some((page) => page.degraded);\n\n// Fix round 1 on Task 3 (review round 1 on the predecessor branch made this the accepted shape\n// first): a WorkItem that has never started its workflow carries no diagnostic value in an empty\n// Run Activity card, so the section renders nothing at all for it -- the same call\n// `AttemptSessionsPanel` in WorkbenchPage.tsx makes for its own \"no sessions yet\" case\n// (`if (sessions.length === 0) return null;`).\n//\n// TWO signals, because `currentStage` alone is not the one this gate needs. It is set the moment\n// START_WORKFLOW runs and survives every later stage transition and a budget pause -- which is why\n// it replaced the AgentRun-resolution chain that flickered while a task was merely paused. But it\n// is NOT \"never cleared again\", as an earlier comment here claimed: three owner-facing CANCEL\n// decisions put it back to `null` on a task that provably has history --\n// `packages/domain/src/qa-correction.ts` (decideQACorrectionGate's CANCEL),\n// `packages/domain/src/verification-correction.ts` (both correction gates' CANCEL). All three fire\n// late in a pipeline, so on `currentStage` alone the whole account of what the agents did vanished\n// the moment the owner cancelled -- the same narrative disappearance spec 128 exists to close,\n// reintroduced on a different axis.\n//\n// `state === \"CANCELLED\"` is not a usable stand-in either: `decideMove`\n// (packages/domain/src/index.ts) allows BACKLOG -> CANCELLED directly, so a task cancelled before it\n// ever ran reaches CANCELLED with no history at all.\n//\n// The second signal is therefore the workflow snapshot's own `run`. A `pipeline_runs` row exists for\n// a WorkItem if and only if START_WORKFLOW has run for it at least once (`decideStartPipeline`\n// creates it; nothing in packages/persistence-sqlite ever deletes from `pipeline_runs`), and\n// `readWorkflowSnapshot` returns `run: null` precisely when the WorkItem has none. It is the direct\n// answer to \"did this task ever run\", where `currentStage` only ever answered \"is it somewhere in a\n// pipeline right now\". `currentStage` stays first because it needs no query at all and settles the\n// overwhelmingly common cases; `snapshot === undefined` (still loading) is treated as \"not yet\n// known\", so the section appears once the answer arrives rather than flashing an empty card at a\n// task that never ran.\nexport const hasStartedWorkflow = (\n item: Pick<WorkItem, \"currentStage\">,\n workflow: Pick<WorkflowSnapshot, \"run\"> | undefined,\n): boolean => item.currentStage !== null || (workflow !== undefined && workflow.run !== null);\n","import { useState } from \"react\";\nimport type {\n ActivityOrigin,\n AgentFleetLatestAction,\n AgentRunActivityEntry,\n WorkItem,\n WorkspaceToolCallStatus,\n WorkspaceToolFailureCode,\n WorkspaceToolOperation,\n} from \"@loomrail/contracts\";\nimport { Badge, Button, Icon, InspectorSection, Skeleton } from \"@loomrail/ui\";\n\nimport { LocalConnectionRecovery } from \"./LocalConnectionRecovery\";\nimport { anyPageHasGap, anyPageIsDegraded, hasStartedWorkflow } from \"./runActivityPaging\";\nimport { useI18n, type Locale, type TranslationKey, type Translator } from \"../i18n\";\nimport { useAgentFleet, useWorkItemActivity, useWorkItemWorkflow } from \"../workspace\";\n\n// `workspace_tool_calls.operation` is a closed, NOT NULL SQL enum (migration 0055): a\n// DAEMON_AUDITED entry's `label` is always one of these six codes. Checked at runtime, per this\n// task's own rule against casts, rather than assumed from `origin` alone -- mirrors\n// AgentFleetPage.tsx's own guard for the exact same fact.\nconst WORKSPACE_TOOL_OPERATIONS: readonly WorkspaceToolOperation[] = [\n \"LIST_DIRECTORY\",\n \"READ_FILE\",\n \"WRITE_FILE\",\n \"EDIT_FILE\",\n \"DELETE_FILE\",\n \"RUN_RECIPE\",\n];\nconst isWorkspaceToolOperation = (value: string): value is WorkspaceToolOperation =>\n (WORKSPACE_TOOL_OPERATIONS as readonly string[]).includes(value);\n\nconst WORKSPACE_TOOL_STATUSES: readonly WorkspaceToolCallStatus[] = [\n \"STARTED\",\n \"SUCCEEDED\",\n \"DENIED\",\n \"FAILED\",\n \"UNKNOWN_OUTCOME\",\n];\nconst isWorkspaceToolStatus = (value: string): value is WorkspaceToolCallStatus =>\n (WORKSPACE_TOOL_STATUSES as readonly string[]).includes(value);\n\n// The same \"this denial actually means approval is needed\" fold the old Activity timeline applied\n// to WORKSPACE_TOOL_CALL_CHANGED (WorkbenchPage.tsx, before this task removed that branch).\n// Preserved here because it is the same underlying `workspace_tool_calls` row, just read through\n// the merged feed instead of the domain Event -- losing the distinction would be a regression, not\n// a simplification.\nconst APPROVAL_REQUIRED_FAILURE_CODES = new Set<WorkspaceToolFailureCode>([\n \"WORKSPACE_ACCESS_DENIED\",\n \"RECIPE_NOT_APPROVED\",\n \"RECIPE_AUTHORITY_CHANGED\",\n \"NETWORK_POLICY_UNAVAILABLE\",\n]);\n\nconst originKey = (origin: ActivityOrigin): TranslationKey => `runActivity.origin.${origin}`;\nconst kindKey = (kind: AgentRunActivityEntry[\"kind\"]): TranslationKey => `runActivity.kind.${kind}`;\nconst operationKey = (operation: WorkspaceToolOperation): TranslationKey =>\n `workspaceTool.operation.${operation}`;\n// Same lookup AgentFleetPage.tsx and AttentionPage.tsx already use for a WorkflowStage -- one\n// shared `stage.*` vocabulary, not a Run-Activity-specific copy of the six stage names.\nconst stageKey = (stage: AgentRunActivityEntry[\"stage\"]): TranslationKey => `stage.${stage}`;\n\n// A DAEMON_AUDITED label/status is a closed code meant for the shared `workspaceTool.*` lookup Run\n// Activity reuses (from the old Activity timeline, and from Agent Fleet's latest-action column). A\n// PROVIDER_REPORTED label/status/detail is the provider's own free text: untrusted, rendered as\n// plain text and never looked up -- React's own text-node escaping is the entire defense here,\n// nothing interprets it as HTML, Markdown, or a link.\nconst entryLabel = (entry: AgentRunActivityEntry, t: Translator): string => {\n if (entry.label === null) return \"\";\n if (entry.origin === \"DAEMON_AUDITED\" && isWorkspaceToolOperation(entry.label)) {\n return t(operationKey(entry.label));\n }\n return entry.label;\n};\n\nconst entryStatus = (entry: AgentRunActivityEntry, t: Translator): string | null => {\n if (entry.status === null) return null;\n if (entry.origin !== \"DAEMON_AUDITED\") return entry.status;\n const needsApproval =\n entry.status === \"DENIED\" &&\n entry.failureCode !== null &&\n APPROVAL_REQUIRED_FAILURE_CODES.has(entry.failureCode);\n if (needsApproval) return t(\"workspaceTool.status.APPROVAL_REQUIRED\");\n return isWorkspaceToolStatus(entry.status) ? t(`workspaceTool.status.${entry.status}`) : entry.status;\n};\n\n// A provider entry's `label` is frequently null (an AGENT_TEXT block carries its text in `detail`,\n// not `label` -- see the spec's capture table). Falling back to `detail`, then `status`, mirrors\n// `describeLatestAction` in apps/daemon/src/agent-fleet.ts exactly, so the heading shown here and\n// the one Agent Fleet shows for the same row never disagree about which field won.\nconst entryHeading = (\n entry: AgentRunActivityEntry,\n t: Translator,\n): { detail: string | null; heading: string } => {\n const label = entryLabel(entry, t);\n if (label !== \"\") return { detail: entry.detail, heading: label };\n if (entry.detail !== null) return { detail: null, heading: entry.detail };\n const status = entryStatus(entry, t);\n if (status !== null) return { detail: null, heading: status };\n return { detail: null, heading: t(\"runActivity.untitled\") };\n};\n\nconst collapsedActionLabel = (action: AgentFleetLatestAction, t: Translator): string =>\n action.origin === \"DAEMON_AUDITED\" && isWorkspaceToolOperation(action.label)\n ? t(operationKey(action.label))\n : action.label;\n\nconst entryTime = (at: string, locale: Locale): string =>\n new Intl.DateTimeFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(at));\n\nconst RunActivityEntryRow = ({\n entry,\n locale,\n t,\n}: {\n entry: AgentRunActivityEntry;\n locale: Locale;\n t: Translator;\n}): React.JSX.Element => {\n const { detail, heading } = entryHeading(entry, t);\n const status = entryStatus(entry, t);\n\n return (\n <li className=\"run-activity__entry\">\n <time className=\"run-activity__entry-time\" dateTime={entry.at}>\n {entryTime(entry.at, locale)}\n </time>\n <div className=\"run-activity__entry-body\">\n <div className=\"run-activity__entry-heading\">\n <strong>{heading}</strong>\n {/* Always-visible text, not colour alone (spec: \"происхождение записи различимо без\n цвета\") -- a DAEMON_AUDITED row and a PROVIDER_REPORTED row must read as different\n things even in greyscale. */}\n <span className=\"run-activity__entry-origin\" data-origin={entry.origin}>\n {t(originKey(entry.origin))}\n </span>\n </div>\n {detail === null ? null : <p className=\"run-activity__entry-detail\">{detail}</p>}\n <div className=\"run-activity__entry-meta\">\n <span className=\"run-activity__entry-kind\">{t(kindKey(entry.kind))}</span>\n {status === null ? null : <span className=\"run-activity__entry-status\">{status}</span>}\n {entry.truncated ? (\n <span className=\"run-activity__entry-truncated\">{t(\"runActivity.truncated\")}</span>\n ) : null}\n </div>\n </div>\n </li>\n );\n};\n\ntype RunActivityGroup = {\n readonly agentRunId: string;\n readonly stage: AgentRunActivityEntry[\"stage\"];\n readonly entries: readonly AgentRunActivityEntry[];\n};\n\n// A group under construction: `entries` is mutable here so the loop below can extend the currently\n// open group in place, unlike the public `RunActivityGroup.entries` this widens into on return.\ntype OpenRunActivityGroup = Omit<RunActivityGroup, \"entries\"> & { entries: AgentRunActivityEntry[] };\n\n/**\n * Consecutive entries sharing an `agentRunId` form one group (spec 128: \"соседние записи с одним\n * agentRunId образуют группу\"), headed by that run's stage. Deliberately NOT a `groupBy(agentRunId)`\n * -- the merged feed is chronological across the WorkItem's whole run history, so two runs' entries\n * are never expected to interleave in practice, but if they somehow did, folding every entry that\n * shares a run id back into one group (wherever it appears in the list) would misrepresent the\n * feed's own order. Walking the list once and starting a new group only when the run id actually\n * changes is what \"consecutive\" means here.\n *\n * The heading carries the stage and nothing else. Two earlier cuts numbered the group -- first from\n * a client-side count, then from the run's own `agent_runs.ordinal` -- on the premise that a number\n * is what tells two adjacent groups of the same stage apart. It is not: that column is\n * `UNIQUE (stage_attempt_id, ordinal)`, so a stage RETRY opens a new StageAttempt whose first\n * AgentRun is ordinal 1 again, and the two adjacent groups for two attempts of the same stage would\n * both read \"Run 1\". A number that repeats across different runs is worse than no number, and the\n * groups are already ordered by their entries' timestamps, so it is gone from the contract too\n * (packages/contracts/src/activity.ts).\n */\nconst groupEntriesByRun = (entries: readonly AgentRunActivityEntry[]): readonly RunActivityGroup[] => {\n const groups: OpenRunActivityGroup[] = [];\n for (const entry of entries) {\n const openGroup = groups.at(-1);\n if (openGroup?.agentRunId === entry.agentRunId) {\n openGroup.entries.push(entry);\n continue;\n }\n groups.push({ agentRunId: entry.agentRunId, stage: entry.stage, entries: [entry] });\n }\n return groups;\n};\n\nconst RunActivityGroupSection = ({\n group,\n locale,\n t,\n}: {\n group: RunActivityGroup;\n locale: Locale;\n t: Translator;\n}): React.JSX.Element => (\n <li className=\"run-activity__group\">\n {/* Not a <summary>/<button>: the spec keeps keyboard focus and the visible focus ring on the\n section's single top-level <summary> only -- a per-group heading must never become a second\n tab stop. */}\n <div className=\"run-activity__group-heading\">\n <span className=\"run-activity__group-stage\">{t(stageKey(group.stage))}</span>\n </div>\n <ol className=\"run-activity__group-entries\">\n {group.entries.map((entry) => (\n <RunActivityEntryRow entry={entry} key={entry.id} locale={locale} t={t} />\n ))}\n </ol>\n </li>\n);\n\nconst RunActivitySkeleton = (): React.JSX.Element => (\n <div aria-hidden=\"true\" className=\"run-activity__skeleton\">\n <Skeleton width=\"62%\" />\n <Skeleton width=\"84%\" />\n <Skeleton width=\"48%\" />\n </div>\n);\n\nexport type RunActivityViewProps = {\n // The newest-first hint reused from Agent Fleet's own read (Task 10's\n // LIST_LATEST_AGENT_RUN_ACTIVITY, via useAgentFleet), preferred over the merged feed's own last\n // loaded row for the collapsed summary -- see the precedence note beside `summary` below.\n // `null` once this WORK ITEM has no live Fleet entry (typically because its pipeline finished or\n // was cancelled); the Fleet lookup is keyed by `workItem.id`, not by a resolved AgentRun, so this\n // turning null is a fact about the task, not about one of its runs. The merged feed's own last\n // loaded entry takes over at that point.\n collapsedAction: AgentFleetLatestAction | null;\n degraded: boolean;\n /** Oldest-first, whatever has been loaded from `/work-items/:workItemId/activity` so far. */\n entries: readonly AgentRunActivityEntry[];\n error: Error | null;\n expanded: boolean;\n gap: boolean;\n hasMore: boolean;\n loading: boolean;\n /** A \"Show more\" fetch is in flight -- distinct from `loading`, which is only the first page. */\n loadingMore: boolean;\n omittedCount: number;\n onLoadMore: () => void;\n onRetry: () => void;\n onToggle: () => void;\n};\n\nexport const RunActivityView = ({\n collapsedAction,\n degraded,\n entries,\n error,\n expanded,\n gap,\n hasMore,\n loading,\n loadingMore,\n omittedCount,\n onLoadMore,\n onRetry,\n onToggle,\n}: RunActivityViewProps): React.JSX.Element => {\n const { locale, t } = useI18n();\n const latestEntry = entries.at(-1);\n // `collapsedAction` wins whenever it is available: it is Task 10's own newest-first read, while\n // `latestEntry` is only the tail of an oldest-first page -- correct as \"the latest of what has\n // loaded\", but not provably \"the latest, full stop\" for a task with more history than one page.\n // Only once this WorkItem has left the Fleet (collapsedAction turns null -- typically because its\n // pipeline finished) does the merged feed's own last loaded entry take over.\n //\n // When it does, and more of the feed exists beyond the loaded pages (`hasMore`), that entry is\n // NOT provably the latest action either -- it is only the newest thing loaded so far, oldest-\n // first, from a task with no live Fleet entry to check against. `approximate` says so instead of\n // presenting a possibly-stale row as a confident \"this is what happened last\".\n const summary =\n collapsedAction !== null\n ? {\n approximate: false,\n label: collapsedActionLabel(collapsedAction, t),\n origin: collapsedAction.origin,\n }\n : latestEntry !== undefined\n ? { approximate: hasMore, label: entryHeading(latestEntry, t).heading, origin: latestEntry.origin }\n : null;\n const count = entries.length;\n const groups = groupEntriesByRun(entries);\n\n return (\n <InspectorSection title={t(\"runActivity.title\")}>\n <details\n className=\"run-activity\"\n onToggle={() => {\n onToggle();\n }}\n open={expanded}\n >\n <summary>\n <Icon aria-hidden=\"true\" className=\"run-activity__chevron\" name=\"chevronRight\" size={12} />\n {summary === null ? (\n <span className=\"run-activity__latest run-activity__latest--empty\">\n {t(loading ? \"runActivity.loading\" : \"runActivity.noActivity\")}\n </span>\n ) : (\n <>\n <span className=\"run-activity__latest\">{summary.label}</span>\n {summary.approximate ? (\n <span className=\"run-activity__latest-note\">{t(\"runActivity.latestApproximate\")}</span>\n ) : null}\n <span className=\"run-activity__entry-origin\" data-origin={summary.origin}>\n {t(originKey(summary.origin))}\n </span>\n </>\n )}\n {count > 0 ? (\n <span className=\"run-activity__count\">\n {t(hasMore ? \"runActivity.countMore\" : \"runActivity.count\", { count })}\n </span>\n ) : null}\n {degraded ? <Badge tone=\"warning\">{t(\"runActivity.degradedBadge\")}</Badge> : null}\n </summary>\n {/* Not just CSS-hidden by the closed <details> -- entirely absent from the tree while\n collapsed. That is what keeps a big run's history from ever costing a render (or a\n fetch beyond the first cheap page) before the owner actually asks to see it, matching\n the spec's \"не становится основным содержимым Cockpit\". */}\n {expanded ? (\n <div className=\"run-activity__body\">\n <p className=\"run-activity__explainer\">{t(\"runActivity.explainer\")}</p>\n {degraded ? (\n <p className=\"run-activity__notice\" role=\"status\">\n {t(\"runActivity.degraded\")}\n </p>\n ) : null}\n {gap ? (\n <p className=\"run-activity__notice\" role=\"status\">\n {t(\"runActivity.gap\")}\n </p>\n ) : null}\n {omittedCount > 0 ? (\n <p className=\"run-activity__notice\" role=\"status\">\n {t(\"runActivity.omitted\", { count: omittedCount })}\n </p>\n ) : null}\n {/* A failed \"Show more\" must not blank a list the owner is already reading -- the\n recovery affordance renders alongside whatever loaded, never instead of it. Only\n an initial-load failure (no entries to keep) hides the empty-state copy in favour\n of the recovery panel. */}\n {entries.length > 0 ? (\n <ol className=\"run-activity__entries\">\n {groups.map((group) => (\n // Each group's own first entry `id` is unique across the whole merged feed (the\n // one identity the contract promises -- `seq` is not, and `agentRunId` alone would\n // collide when the same run's entries split into two non-consecutive groups).\n <RunActivityGroupSection\n group={group}\n key={group.entries[0]?.id ?? group.agentRunId}\n locale={locale}\n t={t}\n />\n ))}\n </ol>\n ) : loading ? (\n <RunActivitySkeleton />\n ) : error ? null : (\n <p className=\"inspector-copy\">{t(\"runActivity.noActivity\")}</p>\n )}\n {error ? <LocalConnectionRecovery error={error} onRetry={onRetry} retrying={loading} /> : null}\n {hasMore ? (\n <Button\n className=\"run-activity__more\"\n disabled={loadingMore}\n loading={loadingMore}\n onClick={onLoadMore}\n size=\"sm\"\n >\n {t(\"runActivity.loadMore\")}\n </Button>\n ) : null}\n </div>\n ) : null}\n </details>\n </InspectorSection>\n );\n};\n\n/**\n * Run Activity (spec docs/plans/128-work-item-activity-spec.ru.md): what agents actually did while\n * working this WorkItem, merged from the daemon-audited workspace tool gateway and each run's own\n * unverified account of itself. Complements Activity, which stays the work item's lifecycle\n * history -- WORKSPACE_TOOL_CALL_CHANGED no longer renders there (see WorkbenchPage.tsx).\n *\n * Bound to the WorkItem itself, not to a resolved \"current\" AgentRun -- spec 128's whole point, and\n * the gap ADR-0034 left open: an audited action made on an earlier stage attempt used to become\n * invisible the moment the pipeline moved past it, because the section's query was keyed to that\n * one attempt's own AgentRun. Fetching by `item.id` also fixes the side effect that scoping had: the\n * old lookup chased `run.currentStageAttemptId` through its sessions to find an `agentRunId` to key\n * on, and during the window between one attempt ending and the next one's first ProviderSession\n * existing, that chain resolved to nothing -- this component returned null, unmounted, and lost the\n * owner's `expanded` state. A query keyed on the WorkItem never goes through that window.\n *\n * The collapsed Agent Fleet hint is looked up the same direct way: by `workItem.id`\n * (`agentFleetEntrySchema.workItem`), not through an AgentRun id resolved from stage-attempt\n * sessions -- a Fleet entry already names its own WorkItem, so no resolution step is needed here\n * either.\n *\n * Renders nothing -- not even the section header -- for a WorkItem that has never started its\n * workflow (`hasStartedWorkflow`, runActivityPaging.ts): an accepted fix from review round 1 on the\n * predecessor branch, so a task still sitting in TODO/READY does not carry an empty Run Activity\n * card. Fix round 1 on Task 3 restores this after an earlier cut of this component removed it\n * entirely -- that removal was itself chasing a real bug (a heuristic keyed on \"does a live Fleet\n * entry or any loaded activity exist\" hid the section for a task merely paused between attempts,\n * caught live by e2e/run-activity.spec.ts), but the restored gate read `item.currentStage` alone,\n * on a premise that turned out to be false: three CANCEL decisions in packages/domain set\n * `currentStage` back to `null` late in a pipeline, which hid this whole section for every\n * cancelled task. The gate now also consults the workflow snapshot's own `run` -- see\n * `hasStartedWorkflow` for why that is the honest \"did this task ever run\" signal. The snapshot is\n * the same `useWorkItemWorkflow(item.id)` the surrounding Task Cockpit already subscribes to\n * (WorkbenchPage.tsx), so this costs one cache read, not one request.\n */\nexport const RunActivitySection = ({ item }: { item: WorkItem }): React.JSX.Element | null => {\n const [expanded, setExpanded] = useState(false);\n const fleetQuery = useAgentFleet();\n const workflowQuery = useWorkItemWorkflow(item.id);\n const fleetEntry = fleetQuery.data?.entries.find((entry) => entry.workItem.id === item.id) ?? null;\n const activityQuery = useWorkItemActivity(item.id);\n const entries = activityQuery.data?.pages.flatMap((page) => page.entries) ?? [];\n const lastPage = activityQuery.data?.pages.at(-1);\n const pages = activityQuery.data?.pages ?? [];\n const gap = anyPageHasGap(pages);\n // Across every loaded page, not just the last one -- `degraded` is a warning and carries one\n // per-page component, so the last page alone could un-announce it (runActivityPaging.ts).\n const degraded = anyPageIsDegraded(pages);\n\n if (!hasStartedWorkflow(item, workflowQuery.data)) return null;\n\n return (\n <RunActivityView\n collapsedAction={fleetEntry === null ? null : fleetEntry.latestAction}\n degraded={degraded}\n entries={entries}\n error={activityQuery.error instanceof Error ? activityQuery.error : null}\n expanded={expanded}\n gap={gap}\n hasMore={activityQuery.hasNextPage}\n loading={activityQuery.isPending}\n loadingMore={activityQuery.isFetchingNextPage}\n omittedCount={lastPage?.omittedCount ?? 0}\n onLoadMore={() => {\n void activityQuery.fetchNextPage();\n }}\n onRetry={() => {\n void activityQuery.refetch();\n }}\n onToggle={() => {\n setExpanded((current) => !current);\n }}\n />\n );\n};\n","import { useState } from \"react\";\n\nimport type { HumanRequest } from \"@loomrail/contracts\";\nimport { Button, Icon, RadioGroup, TextField } from \"@loomrail/ui\";\n\nimport { useI18n } from \"../i18n\";\nimport { useAnswerHumanRequest } from \"../workspace\";\nimport { LocalConnectionRecovery } from \"./LocalConnectionRecovery\";\n\nexport const HumanRequestAnswerForm = ({\n onAnswered,\n request,\n showTitle = true,\n}: {\n onAnswered?: () => void;\n request: HumanRequest;\n showTitle?: boolean;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const answerMutation = useAnswerHumanRequest();\n const [selection, setSelection] = useState(\"\");\n const [otherText, setOtherText] = useState(\"\");\n const otherSelected = selection === \"__other__\";\n const canSubmit = otherSelected ? otherText.trim().length > 0 : selection.length > 0;\n\n const submit = (): void => {\n if (!canSubmit) return;\n answerMutation.mutate(\n {\n request,\n answer: otherSelected\n ? { type: \"OTHER\", text: otherText.trim() }\n : { type: \"OPTION\", optionIds: [selection] },\n },\n {\n onSuccess: () => {\n setSelection(\"\");\n setOtherText(\"\");\n onAnswered?.();\n },\n },\n );\n };\n\n return (\n <div className=\"human-request-card\">\n <div className=\"human-request-card__eyebrow\">\n <Icon name=\"question\" size={13} />\n <span>{t(request.blocking ? \"humanRequest.blocking\" : \"humanRequest.request\")}</span>\n </div>\n {showTitle ? <h3>{request.title}</h3> : null}\n <p>{request.context}</p>\n {request.recommendation ? (\n <div className=\"human-request-card__recommendation\">\n <strong>{t(\"humanRequest.recommendation\")}</strong>\n <span>{request.recommendation}</span>\n </div>\n ) : null}\n <p className=\"human-request-card__authority-note\">{t(\"humanRequest.authorityNotice\")}</p>\n <RadioGroup\n aria-label={request.title}\n onValueChange={setSelection}\n options={[\n ...request.options.map((option) => ({\n value: option.id,\n label: option.recommended ? `${option.label} · ${t(\"humanRequest.recommended\")}` : option.label,\n description: option.consequence,\n })),\n ...(request.allowOther ? [{ value: \"__other__\", label: t(\"humanRequest.other\") }] : []),\n ]}\n value={selection}\n />\n {otherSelected ? (\n <TextField\n aria-label={t(\"humanRequest.other\")}\n autoFocus\n maxLength={2_000}\n onChange={(event) => {\n setOtherText(event.currentTarget.value);\n }}\n placeholder={t(\"humanRequest.otherPlaceholder\")}\n value={otherText}\n />\n ) : null}\n {!canSubmit && selection ? (\n <span className=\"human-request-card__hint\">{t(\"humanRequest.chooseAnswer\")}</span>\n ) : null}\n {answerMutation.error ? (\n <LocalConnectionRecovery\n error={answerMutation.error}\n onRetry={submit}\n retrying={answerMutation.isPending}\n />\n ) : null}\n <Button disabled={!canSubmit} loading={answerMutation.isPending} onClick={submit} variant=\"primary\">\n {t(\"humanRequest.answerResume\")}\n </Button>\n </div>\n );\n};\n","import type { WorkItemState } from \"@loomrail/contracts\";\n\n/** Manual state changes an owner may apply to a WorkItem that no workflow run currently owns. */\nexport const transitionTargets: Record<WorkItemState, readonly WorkItemState[]> = {\n BACKLOG: [\"READY\", \"CANCELLED\"],\n READY: [\"BACKLOG\", \"IN_PROGRESS\", \"BLOCKED\", \"CANCELLED\"],\n IN_PROGRESS: [\"READY\", \"BLOCKED\", \"CANCELLED\"],\n BLOCKED: [\"READY\", \"IN_PROGRESS\", \"CANCELLED\"],\n DONE: [],\n CANCELLED: [],\n};\n\nexport type MoveShortcuts = {\n /** The move that carries delivery forward, emphasised in the inspector footer. */\n primary: WorkItemState | null;\n /** The most useful remaining move, offered without emphasis. */\n secondary: WorkItemState | null;\n};\n\n/**\n * Footer shortcuts are chosen by meaning, not by the order of `transitionTargets`.\n *\n * `IN_PROGRESS` has no forward shortcut on purpose: `DONE` is reachable only through recorded owner\n * acceptance, so promoting a sideways or backward move would misrepresent it. `CANCELLED` is never a\n * shortcut — it stays behind the explicit Move menu, which always offers the full transition set.\n */\nconst moveShortcuts: Record<WorkItemState, MoveShortcuts> = {\n BACKLOG: { primary: \"READY\", secondary: null },\n READY: { primary: \"IN_PROGRESS\", secondary: \"BACKLOG\" },\n IN_PROGRESS: { primary: null, secondary: \"BLOCKED\" },\n BLOCKED: { primary: \"IN_PROGRESS\", secondary: \"READY\" },\n DONE: { primary: null, secondary: null },\n CANCELLED: { primary: null, secondary: null },\n};\n\nconst allowed = (state: WorkItemState, target: WorkItemState | null): WorkItemState | null =>\n target !== null && transitionTargets[state].includes(target) ? target : null;\n\n/**\n * Resolves the inspector footer shortcuts for a WorkItem. While a workflow run owns the item the\n * owner acts through workflow controls, so no manual shortcut is offered.\n */\nexport const moveShortcutsFor = (state: WorkItemState, workflowActive: boolean): MoveShortcuts => {\n if (workflowActive) return { primary: null, secondary: null };\n const { primary, secondary } = moveShortcuts[state];\n return { primary: allowed(state, primary), secondary: allowed(state, secondary) };\n};\n","import type { BudgetPolicy, ModelTier } from \"@loomrail/contracts\";\n\nexport const suggestedPipelineBudget = 1_000_000;\nexport const suggestedAgentRunBudget = 175_000;\n\nexport type WorkflowPolicyFormValues = {\n budgetLimitInput: string;\n agentRunLimitInput: string;\n modelTierOverride: ModelTier;\n};\n\n/** Keeps a paused run's editable cost policy anchored to its latest durable revision. */\nexport const workflowPolicyFormValues = (policy: BudgetPolicy): WorkflowPolicyFormValues => ({\n budgetLimitInput: String(policy.maxEstimatedTokens),\n agentRunLimitInput: String(policy.agentRunMaxEstimatedTokensOverride ?? suggestedAgentRunBudget),\n modelTierOverride: policy.modelTierOverride ?? \"FAST\",\n});\n","import type { WorkItem, WorkItemDependency } from \"@loomrail/contracts\";\n\nexport type WorkItemDependencyView = {\n parent: WorkItem | null;\n children: readonly WorkItem[];\n blockers: readonly WorkItem[];\n blockedWorkItems: readonly WorkItem[];\n unsatisfiedBlockers: readonly WorkItem[];\n};\n\nconst compareByCreatedAtAndId = (left: WorkItem, right: WorkItem): number => {\n if (left.createdAt !== right.createdAt) return left.createdAt < right.createdAt ? -1 : 1;\n return left.id < right.id ? -1 : left.id > right.id ? 1 : 0;\n};\n\nexport const deriveWorkItemDependencyView = (\n workItem: WorkItem,\n projectWorkItems: readonly WorkItem[],\n dependencies: readonly WorkItemDependency[],\n): WorkItemDependencyView => {\n const byId = new Map(projectWorkItems.map((candidate) => [candidate.id, candidate]));\n const blockers = dependencies\n .filter(({ blockedWorkItemId }) => blockedWorkItemId === workItem.id)\n .map(({ blockerWorkItemId }) => byId.get(blockerWorkItemId))\n .filter((candidate): candidate is WorkItem => candidate !== undefined)\n .sort(compareByCreatedAtAndId);\n const blockedWorkItems = dependencies\n .filter(({ blockerWorkItemId }) => blockerWorkItemId === workItem.id)\n .map(({ blockedWorkItemId }) => byId.get(blockedWorkItemId))\n .filter((candidate): candidate is WorkItem => candidate !== undefined)\n .sort(compareByCreatedAtAndId);\n\n return {\n parent: workItem.parentId === null ? null : (byId.get(workItem.parentId) ?? null),\n children: projectWorkItems\n .filter(({ parentId }) => parentId === workItem.id)\n .sort(compareByCreatedAtAndId),\n blockers,\n blockedWorkItems,\n // A cancelled prerequisite does not satisfy delivery; only accepted Done work does.\n unsatisfiedBlockers: blockers.filter(({ state }) => state !== \"DONE\"),\n };\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport type { SyntheticEvent } from \"react\";\nimport { useNavigate, useSearch } from \"@tanstack/react-router\";\nimport {\n isSessionPauseFailureCode,\n codeBlindOrchestrationSchema,\n modelTierSchema,\n prioritySchema,\n riskSchema,\n type AcceptanceAction,\n type AcceptancePackage,\n type AgentRunStatus,\n type Checkpoint,\n type ContextWindowUsage,\n type EvidenceArtifact,\n type HumanRequest,\n type ModelTier,\n type PipelineRun,\n type ProjectProviderSelectionResponse,\n type ProviderSession,\n type QADefect,\n type QAObservation,\n type QARunStatus,\n type QAStateResponse,\n type ReadinessCheck,\n type ReviewFinding,\n type ReviewFindingOwnerDisposition,\n type ReviewStateResponse,\n type SessionPauseFailureCode,\n type StageAttempt,\n type StageAttemptStatus,\n type VerificationCheck,\n type VerificationFailure,\n type WorkItem,\n type WorkItemChangedField,\n type WorkItemState,\n type PublishedWorkItemWorkspace,\n type WorkItemWorkspaceStatus,\n} from \"@loomrail/contracts\";\nimport {\n ActionMenu,\n AppliedFilterBar,\n Badge,\n Button,\n CascadingFilter,\n Checkbox,\n cn,\n DialogSurface,\n FeedbackState,\n Field,\n Icon,\n IconButton,\n InspectorSection,\n KanbanColumn,\n PopoverSurface,\n ProviderSessionTimeline,\n RunSummary,\n SelectControl,\n Skeleton,\n Status,\n Switch,\n TaskCard,\n Textarea,\n TextField,\n TimelineEvent,\n Tooltip,\n type BadgeTone,\n type CheckpointGroup,\n type CheckpointViewModel,\n type FilterMessages,\n type FilterNode,\n type ProviderSessionTimelineAttempt,\n type ProviderSessionViewModel,\n type StatusTone,\n type TimelineEventProps,\n} from \"@loomrail/ui\";\n\nimport { ChangesSection } from \"./ChangesSection\";\nimport {\n isWorkItemTimelineEvent,\n shouldKeepPagingForLifecycleEvent,\n type WorkItemTimelineEvent,\n} from \"./workItemTimeline\";\nimport { workItemAcceptanceExportUrl, workItemQAAttachmentUrl } from \"../api\";\nimport {\n defaultBoardView,\n isBoardOrdering,\n orderWorkItems,\n scopeShows,\n type BoardOrdering,\n type BoardScope,\n type BoardView,\n} from \"../boardView\";\nimport { PanelResizer } from \"../components/PanelResizer\";\nimport { ProjectProviderAllowanceStrip } from \"../components/ProviderAllowanceStrip\";\nimport { ProjectVerificationPanel } from \"../components/ProjectVerificationPanel\";\nimport { RunActivitySection } from \"../components/RunActivitySection\";\nimport { HumanRequestAnswerForm } from \"../components/HumanRequestAnswerForm\";\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { useI18n, type Locale, type TranslationKey, type Translator } from \"../i18n\";\nimport type { SummaryFilter } from \"../router\";\nimport { moveShortcutsFor, transitionTargets } from \"../taskMoves\";\nimport {\n suggestedAgentRunBudget,\n suggestedPipelineBudget,\n workflowPolicyFormValues,\n} from \"../workflowPolicy\";\nimport {\n useInitializeFixtureWorkspace,\n useApproveBudgetOverride,\n useDisposeReviewFinding,\n useMoveWorkItem,\n usePipelineControl,\n useProjectProviderSelection,\n useProjectHumanRequests,\n useProjectWorkItemDependencies,\n useProjectWorkItems,\n useProviderCapabilities,\n useResolveAcceptance,\n useResolveQACorrectionGate,\n useStageAttemptSessions,\n useStartPipeline,\n useSetWorkItemDependencies,\n useUpdateWorkItem,\n useWaiveQADefect,\n useWorkspace,\n useWorkItemEvents,\n useWorkItemQA,\n useWorkItemWorkflow,\n useWorkItemReviews,\n useWorkItemWorkspace,\n} from \"../workspace\";\nimport { deriveWorkItemDependencyView } from \"../workItemDependencies\";\n\nconst viewOrderingOptions = (t: Translator): readonly { label: string; value: BoardOrdering }[] => [\n { label: t(\"property.priority\"), value: \"priority\" },\n { label: t(\"view.created\"), value: \"created\" },\n { label: t(\"view.updated\"), value: \"updated\" },\n { label: t(\"view.title\"), value: \"title\" },\n];\n\ntype ViewSettingsProps = {\n onViewChange: (value: BoardView) => void;\n view: BoardView;\n};\n\nconst ViewSettings = ({ onViewChange, view }: ViewSettingsProps): React.JSX.Element => {\n const { t } = useI18n();\n const nextDirection = view.direction === \"asc\" ? \"desc\" : \"asc\";\n\n return (\n <div className=\"view-settings\">\n <div className=\"view-settings__controls\">\n <div className=\"view-settings__row\">\n <span>{t(\"view.ordering\")}</span>\n <div className=\"view-settings__ordering\">\n <Tooltip label={t(`view.direction.${nextDirection}`)}>\n <IconButton\n className={cn(\"view-settings__direction\", view.direction === \"desc\" && \"is-descending\")}\n label={t(`view.direction.${nextDirection}`)}\n name=\"sortAscending\"\n onClick={() => {\n onViewChange({ ...view, direction: nextDirection });\n }}\n size=\"sm\"\n />\n </Tooltip>\n <SelectControl\n ariaLabel={t(\"view.orderBy\")}\n onValueChange={(value) => {\n if (isBoardOrdering(value)) onViewChange({ ...view, ordering: value });\n }}\n options={viewOrderingOptions(t)}\n size=\"sm\"\n value={view.ordering}\n variant=\"compact\"\n />\n </div>\n </div>\n </div>\n <div className=\"view-settings__section\">\n <span className=\"view-settings__section-title\">{t(\"view.boardOptions\")}</span>\n <Switch\n checked={view.showEmptyColumns}\n label={t(\"view.showEmptyColumns\")}\n onCheckedChange={(checked) => {\n onViewChange({ ...view, showEmptyColumns: checked });\n }}\n />\n </div>\n </div>\n );\n};\n\ntype BoardToolbarProps = {\n filters: readonly string[];\n onClearFilters: () => void;\n onFiltersChange: (value: readonly string[]) => void;\n onScopeChange: (value: BoardScope) => void;\n onSummaryFilterChange: (value: SummaryFilter | null) => void;\n onViewChange: (value: BoardView) => void;\n options: readonly FilterNode[];\n scope: BoardScope;\n summaryFilter: SummaryFilter | null;\n view: BoardView;\n};\n\nconst BoardToolbar = ({\n filters,\n onClearFilters,\n onFiltersChange,\n onScopeChange,\n onSummaryFilterChange,\n onViewChange,\n options,\n scope,\n summaryFilter,\n view,\n}: BoardToolbarProps): React.JSX.Element => {\n const { t } = useI18n();\n const hasActiveFilters = filters.length > 0 || summaryFilter !== null;\n const summaryFilterLabel = summaryFilter ? t(`work.summary.${summaryFilter}`) : null;\n const filterMessages: Partial<FilterMessages> = {\n add: t(\"filter.add\"),\n addFilterPlaceholder: t(\"filter.addPlaceholder\"),\n backTo: t(\"filter.backTo\"),\n clear: t(\"filter.clear\"),\n close: t(\"filter.close\"),\n description: t(\"filter.description\"),\n edit: t(\"filter.edit\"),\n filterPlaceholder: t(\"filter.placeholder\"),\n is: t(\"filter.is\"),\n isAnyOf: t(\"filter.isAnyOf\"),\n noMatchingProperties: t(\"filter.noProperties\"),\n noMatchingValues: t(\"filter.noValues\"),\n oneValue: t(\"filter.oneValue\"),\n options: t(\"filter.options\"),\n remove: t(\"filter.remove\"),\n rootTitle: t(\"filter.rootTitle\"),\n search: t(\"filter.search\"),\n selectedValues: t(\"filter.selectedValues\"),\n };\n\n return (\n <div className=\"board-toolbar-stack\">\n <div className=\"board-toolbar\">\n <div className=\"board-view-tabs\">\n {(\n [\n { labelKey: \"view.active\", value: \"active\" },\n { labelKey: \"view.backlog\", value: \"backlog\" },\n { labelKey: \"view.allIssues\", value: \"all\" },\n ] as const\n ).map(({ labelKey, value }) => (\n <Button\n aria-pressed={scope === value}\n key={value}\n onClick={() => {\n onScopeChange(value);\n }}\n shape=\"pill\"\n variant=\"surface\"\n >\n {t(labelKey)}\n </Button>\n ))}\n </div>\n <div className=\"board-toolbar__actions\">\n <CascadingFilter\n ariaLabel={t(\"view.filter\")}\n messages={filterMessages}\n onValueChange={onFiltersChange}\n options={options}\n trigger={<IconButton label={t(\"view.filter\")} name=\"filter\" variant=\"surface\" />}\n triggerTooltip={t(\"view.filter\")}\n value={filters}\n />\n <PopoverSurface\n className=\"view-settings-popover\"\n label={t(\"view.display\")}\n trigger={<IconButton label={t(\"view.display\")} name=\"settings\" variant=\"surface\" />}\n triggerTooltip={t(\"view.display\")}\n >\n <ViewSettings onViewChange={onViewChange} view={view} />\n </PopoverSurface>\n <ActionMenu\n align=\"end\"\n groups={[\n [\n {\n icon: \"link\",\n label: t(\"view.copyLink\"),\n // Filters, ordering and scope live in the URL, so the address is the shareable view.\n onSelect: () => {\n void navigator.clipboard.writeText(window.location.href);\n },\n },\n ],\n ]}\n trigger={<IconButton label={t(\"view.actions\")} name=\"more\" variant=\"surface\" />}\n triggerTooltip={t(\"view.actions\")}\n />\n </div>\n </div>\n {hasActiveFilters ? (\n <AppliedFilterBar\n addFilter={\n <CascadingFilter\n ariaLabel={t(\"view.filter\")}\n messages={filterMessages}\n onValueChange={onFiltersChange}\n options={options}\n trigger={\n <IconButton className=\"board-add-filter\" label={t(\"view.filter\")} name=\"add\" size=\"sm\" />\n }\n triggerTooltip={t(\"view.filter\")}\n value={filters}\n />\n }\n ariaLabel={t(\"view.filter\")}\n className=\"board-applied-filters\"\n messages={filterMessages}\n onClear={onClearFilters}\n onValueChange={onFiltersChange}\n options={options}\n supplementalConditions={\n summaryFilter && summaryFilterLabel ? (\n <div className=\"lr-applied-filter board-summary-filter\">\n <span className=\"lr-applied-filter__property\">\n <Icon name=\"filter\" size={12} />\n {t(\"work.summary.filter\")}\n </span>\n <span className=\"lr-applied-filter__value\">{summaryFilterLabel}</span>\n <Tooltip label={t(\"work.summary.clear\")}>\n <button\n aria-label={t(\"work.summary.clear\")}\n className=\"lr-applied-filter__remove\"\n onClick={() => {\n onSummaryFilterChange(null);\n }}\n type=\"button\"\n >\n <Icon name=\"close\" size={12} />\n </button>\n </Tooltip>\n </div>\n ) : null\n }\n value={filters}\n />\n ) : null}\n </div>\n );\n};\n\nconst boardColumns = [\n { labelKey: \"state.BACKLOG\", state: \"BACKLOG\", tone: \"queued\" },\n { labelKey: \"state.READY\", state: \"READY\", tone: \"ready\" },\n { labelKey: \"state.IN_PROGRESS\", state: \"IN_PROGRESS\", tone: \"running\" },\n { labelKey: \"state.BLOCKED\", state: \"BLOCKED\", tone: \"waiting\" },\n { labelKey: \"state.DONE\", state: \"DONE\", tone: \"complete\" },\n { labelKey: \"state.CANCELLED\", state: \"CANCELLED\", tone: \"paused\" },\n] as const satisfies readonly {\n labelKey: TranslationKey;\n state: WorkItemState;\n tone: StatusTone;\n}[];\n\nconst columnsFor = (scope: BoardScope): readonly (typeof boardColumns)[number][] =>\n boardColumns.filter((column) => scopeShows(scope, column.state));\n\nconst stateLabelKeys: Record<WorkItemState, TranslationKey> = {\n BACKLOG: \"state.BACKLOG\",\n READY: \"state.READY\",\n IN_PROGRESS: \"state.IN_PROGRESS\",\n BLOCKED: \"state.BLOCKED\",\n DONE: \"state.DONE\",\n CANCELLED: \"state.CANCELLED\",\n};\n\nconst stateLabel = (state: WorkItemState, t: Translator): string => t(stateLabelKeys[state]);\n\nconst priorityLabelKeys: Record<WorkItem[\"priority\"], TranslationKey> = {\n LOW: \"priority.LOW\",\n MEDIUM: \"priority.MEDIUM\",\n HIGH: \"priority.HIGH\",\n URGENT: \"priority.URGENT\",\n};\n\nconst riskLabelKeys: Record<WorkItem[\"risk\"], TranslationKey> = {\n LOW: \"risk.LOW\",\n MEDIUM: \"risk.MEDIUM\",\n HIGH: \"risk.HIGH\",\n CRITICAL: \"risk.CRITICAL\",\n};\n\nconst typeLabelKeys: Record<WorkItem[\"type\"], TranslationKey> = {\n EPIC: \"type.EPIC\",\n FEATURE: \"type.FEATURE\",\n TASK: \"type.TASK\",\n BUG: \"type.BUG\",\n SPIKE: \"type.SPIKE\",\n SUBTASK: \"type.SUBTASK\",\n};\n\nconst stageLabelKeys: Record<NonNullable<WorkItem[\"currentStage\"]>, TranslationKey> = {\n DISCOVERY: \"stage.DISCOVERY\",\n PLAN: \"stage.PLAN\",\n IMPLEMENT: \"stage.IMPLEMENT\",\n REVIEW: \"stage.REVIEW\",\n QA: \"stage.QA\",\n ACCEPTANCE: \"stage.ACCEPTANCE\",\n};\n\nconst stateTones: Record<WorkItemState, StatusTone> = {\n BACKLOG: \"queued\",\n READY: \"ready\",\n IN_PROGRESS: \"running\",\n BLOCKED: \"waiting\",\n DONE: \"complete\",\n CANCELLED: \"paused\",\n};\n\nconst priorityTone = (priority: WorkItem[\"priority\"]): BadgeTone => {\n if (priority === \"URGENT\") return \"danger\";\n if (priority === \"HIGH\") return \"warning\";\n return \"neutral\";\n};\n\nconst displayWorkItemId = (id: string): string => {\n const suffix = id.split(\"-\").at(-1) ?? id;\n return suffix.length > 10 ? suffix.slice(0, 8).toUpperCase() : suffix.toUpperCase();\n};\n\nconst filterOptionsFor = (\n items: readonly WorkItem[],\n columns: readonly (typeof boardColumns)[number][],\n t: Translator,\n): readonly FilterNode[] => {\n const count = (predicate: (item: WorkItem) => boolean): number => items.filter(predicate).length;\n return [\n {\n id: \"status\",\n label: t(\"filter.status\"),\n icon: \"clock\",\n children: columns.map((column) => ({\n id: `status-${column.state.toLowerCase()}`,\n label: t(column.labelKey),\n count: count((item) => item.state === column.state),\n })),\n },\n {\n id: \"priority\",\n label: t(\"filter.priority\"),\n icon: \"filter\",\n children: ([\"URGENT\", \"HIGH\", \"MEDIUM\", \"LOW\"] as const).map((priority) => ({\n id: `priority-${priority.toLowerCase()}`,\n label: t(priorityLabelKeys[priority]),\n count: count((item) => item.priority === priority),\n })),\n },\n {\n id: \"risk\",\n label: t(\"filter.risk\"),\n icon: \"warning\",\n children: ([\"CRITICAL\", \"HIGH\", \"MEDIUM\", \"LOW\"] as const).map((risk) => ({\n id: `risk-${risk.toLowerCase()}`,\n label: t(riskLabelKeys[risk]),\n count: count((item) => item.risk === risk),\n })),\n },\n ];\n};\n\nconst matchesFilters = (item: WorkItem, filters: readonly string[]): boolean =>\n filters.every((filter) => {\n if (filter.startsWith(\"status-\")) return filter === `status-${item.state.toLowerCase()}`;\n if (filter.startsWith(\"priority-\")) return filter === `priority-${item.priority.toLowerCase()}`;\n if (filter.startsWith(\"risk-\")) return filter === `risk-${item.risk.toLowerCase()}`;\n return true;\n });\n\nconst changedFieldLabelKeys: Record<WorkItemChangedField, TranslationKey> = {\n title: \"field.title\",\n description: \"field.description\",\n priority: \"field.priority\",\n risk: \"field.risk\",\n acceptanceCriteria: \"field.acceptanceCriteria\",\n};\n\nconst readinessCheckKeys: Record<ReadinessCheck[\"key\"], TranslationKey> = {\n SECURITY_ACTIVE_CONSTITUTION: \"settings.readiness.check.activeConstitution\",\n SECURITY_SECRET_PATHS: \"settings.readiness.check.secretPaths\",\n SECURITY_ENV_IGNORED: \"settings.readiness.check.envIgnored\",\n SECURITY_CI_HARDENING: \"settings.readiness.check.ciHardening\",\n LEGAL_LICENSE: \"settings.readiness.check.license\",\n LEGAL_OWNER_REVIEW: \"settings.readiness.check.legalOwner\",\n PAYMENTS_OWNER_REVIEW: \"settings.readiness.check.paymentsOwner\",\n ANALYTICS_OWNER_REVIEW: \"settings.readiness.check.analyticsOwner\",\n DEPS_LOCKFILE_PRESENT: \"settings.readiness.check.lockfile\",\n ENV_PROD_SEPARATION: \"settings.readiness.check.envProdSeparation\",\n SECURITY_HEADERS_OWNER_REVIEW: \"settings.readiness.check.securityHeadersOwner\",\n OPS_HEALTH_ENDPOINT_DECLARED: \"settings.readiness.check.healthEndpoint\",\n OPS_ROLLBACK_PLAN: \"settings.readiness.check.rollbackPlan\",\n OPS_BACKUP: \"settings.readiness.check.backup\",\n};\n\nconst readinessStatusKeys: Record<ReadinessCheck[\"status\"], TranslationKey> = {\n PASSED: \"settings.readiness.status.passed\",\n ACTION_REQUIRED: \"settings.readiness.status.action\",\n CONFIRMED: \"settings.readiness.status.confirmed\",\n NOT_APPLICABLE: \"settings.readiness.status.na\",\n};\n\n// A total Record over the contract's own union, so a new quality cannot arrive without this file\n// failing to compile -- the same discipline `hardPauseLabelKeys` below is written under. Its codes\n// come from @loomrail/contracts rather than a local copy, so the cockpit's reading of \"is this a\n// session pause\" cannot drift from the domain's.\nconst usageQualityLabelKeys: Record<ContextWindowUsage[\"quality\"], TranslationKey> = {\n ACTUAL: \"workflow.sessions.usageQuality.ACTUAL\",\n PROVIDER_ESTIMATE: \"workflow.sessions.usageQuality.PROVIDER_ESTIMATE\",\n LOOMRAIL_ESTIMATE: \"workflow.sessions.usageQuality.LOOMRAIL_ESTIMATE\",\n};\n\nconst hardPauseLabelKeys: Record<SessionPauseFailureCode, TranslationKey> = {\n NO_PROGRESS: \"workflow.hardPause.noProgress\",\n CONTEXT_FLOOR_EXCEEDED: \"workflow.hardPause.contextFloor\",\n PROVIDER_REJECTED_PACK: \"workflow.hardPause.providerRejected\",\n PROVIDER_START_FAILED: \"workflow.hardPause.providerStartFailed\",\n PROVIDER_OUTCOME_REJECTED: \"workflow.hardPause.providerOutcomeRejected\",\n SESSION_LIMIT_REACHED: \"workflow.hardPause.sessionLimit\",\n};\n\n// A HARD_PAUSED attempt is not necessarily budget-paused: the session loop hard-pauses for reasons\n// that have nothing to do with tokens, and decideApproveBudgetOverride refuses a session pause.\n// `failureCode` is what tells the two apart; `budgetFallbackKey` lets both call sites below (the\n// pipeline-level Status badge and the per-stage list label) keep their own text for the\n// genuinely-budget case.\nconst hardPauseLabel = (\n failureCode: string | null,\n budgetFallbackKey: TranslationKey,\n t: Translator,\n): string =>\n isSessionPauseFailureCode(failureCode) ? t(hardPauseLabelKeys[failureCode]) : t(budgetFallbackKey);\n\nconst stageAttemptStatusLabel = (attempt: StageAttempt, t: Translator): string => {\n if (attempt.status === \"QUEUED\") return t(\"workflow.stage.QUEUED\");\n if (attempt.status === \"RUNNING\") return t(\"workflow.stage.RUNNING\");\n if (attempt.status === \"WAITING_HUMAN\") return t(\"workflow.stage.WAITING_HUMAN\");\n if (attempt.status === \"SOFT_PAUSED\") return t(\"workflow.stage.SOFT_PAUSED\");\n if (attempt.status === \"HARD_PAUSED\") {\n return hardPauseLabel(attempt.failureCode, \"workflow.stage.HARD_PAUSED\", t);\n }\n if (attempt.status === \"INTERRUPTED\") return t(\"workflow.stage.INTERRUPTED\");\n if (attempt.status === \"CANCELLED\") return t(\"workflow.stage.CANCELLED\");\n if (attempt.status === \"SUCCEEDED\") return t(\"workflow.stage.SUCCEEDED\");\n return t(\"workflow.stage.other\");\n};\n\n// A total Record over the contract's own union, matching `stateTones` and `pipelineStatusTones`\n// below: a status added to `stageAttemptStatusSchema` without a tone here must fail to compile\n// rather than silently fall through, since the attempt header (D5) is the one place on screen that\n// names which attempt the sessions list belongs to.\nconst stageAttemptStatusTones: Record<StageAttemptStatus, StatusTone> = {\n PENDING: \"queued\",\n QUEUED: \"queued\",\n RUNNING: \"running\",\n WAITING_HUMAN: \"waiting\",\n SOFT_PAUSED: \"paused\",\n HARD_PAUSED: \"waiting\",\n SUCCEEDED: \"complete\",\n FAILED: \"paused\",\n CANCELLED: \"paused\",\n INTERRUPTED: \"paused\",\n RECOVERING: \"running\",\n STALE: \"waiting\",\n};\n\nconst pipelineStatusLabelKeys: Record<PipelineRun[\"status\"], TranslationKey> = {\n RUNNING: \"workflow.status.RUNNING\",\n WAITING_HUMAN: \"workflow.status.WAITING_HUMAN\",\n SOFT_PAUSED: \"workflow.status.SOFT_PAUSED\",\n HARD_PAUSED: \"workflow.status.HARD_PAUSED\",\n INTERRUPTED: \"workflow.status.INTERRUPTED\",\n SUCCEEDED: \"workflow.status.SUCCEEDED\",\n FAILED: \"workflow.status.FAILED\",\n CANCELLED: \"workflow.status.CANCELLED\",\n};\n\nconst pipelineStatusTones: Record<PipelineRun[\"status\"], StatusTone> = {\n RUNNING: \"running\",\n WAITING_HUMAN: \"waiting\",\n SOFT_PAUSED: \"paused\",\n HARD_PAUSED: \"waiting\",\n INTERRUPTED: \"paused\",\n SUCCEEDED: \"complete\",\n FAILED: \"paused\",\n CANCELLED: \"paused\",\n};\n\nconst acceptanceStatusLabelKeys: Record<AcceptancePackage[\"status\"], TranslationKey> = {\n PENDING: \"acceptance.status.PENDING\",\n ACCEPTED: \"acceptance.status.ACCEPTED\",\n RETURNED: \"acceptance.status.RETURNED\",\n REJECTED: \"acceptance.status.REJECTED\",\n};\n\nconst acceptanceStatusTones: Record<AcceptancePackage[\"status\"], StatusTone> = {\n PENDING: \"waiting\",\n ACCEPTED: \"complete\",\n RETURNED: \"paused\",\n REJECTED: \"paused\",\n};\n\nconst agentRunStatusLabelKeys: Record<AgentRunStatus, TranslationKey> = {\n RUNNING: \"agentRun.status.RUNNING\",\n SUCCEEDED: \"agentRun.status.SUCCEEDED\",\n FAILED: \"agentRun.status.FAILED\",\n CANCELLED: \"agentRun.status.CANCELLED\",\n INTERRUPTED: \"agentRun.status.INTERRUPTED\",\n WAITING_HUMAN: \"agentRun.status.WAITING_HUMAN\",\n SOFT_PAUSED: \"agentRun.status.SOFT_PAUSED\",\n HARD_PAUSED: \"agentRun.status.HARD_PAUSED\",\n};\n\nconst verificationCheckStatusLabelKeys: Record<VerificationCheck[\"status\"], TranslationKey> = {\n QUEUED: \"verification.status.QUEUED\",\n RUNNING: \"verification.status.RUNNING\",\n PASSED: \"verification.status.PASSED\",\n FAILED: \"verification.status.FAILED\",\n ERROR: \"verification.status.ERROR\",\n INTERRUPTED: \"verification.status.INTERRUPTED\",\n};\n\nconst verificationFailureReasonLabelKeys: Record<VerificationFailure[\"reason\"], TranslationKey> = {\n REQUIRED_CHECK_FAILED: \"verification.failure.REQUIRED_CHECK_FAILED\",\n REQUIRED_CHECK_ERROR: \"verification.failure.REQUIRED_CHECK_ERROR\",\n RUN_INTERRUPTED: \"verification.failure.RUN_INTERRUPTED\",\n STALE: \"verification.failure.STALE\",\n};\n\nconst eventPresentation = (event: WorkItemTimelineEvent, t: Translator): Omit<TimelineEventProps, \"time\"> => {\n switch (event.type) {\n case \"WORK_ITEM_CREATED\":\n return {\n detail: t(\"event.createdDetail\"),\n icon: \"add\",\n label: t(\"event.created\"),\n tone: \"success\",\n };\n case \"WORK_ITEM_UPDATED\":\n return {\n detail: t(\"event.updatedDetail\", {\n fields: event.data.changedFields.map((field) => t(changedFieldLabelKeys[field])).join(\", \"),\n }),\n icon: \"settings\",\n label: t(\"event.updated\"),\n };\n case \"WORK_ITEM_DEPENDENCIES_SET\":\n return {\n detail: t(\"event.dependenciesSetDetail\", {\n count: event.data.blockerWorkItemIds.length,\n }),\n icon: \"link\",\n label: t(\"event.dependenciesSet\"),\n ...(event.data.blockerWorkItemIds.length === 0 ? {} : { tone: \"accent\" }),\n };\n case \"WORK_ITEM_STATE_CHANGED\":\n return {\n detail: t(\"event.stateChangedDetail\", {\n from: stateLabel(event.data.previousState, t),\n to: stateLabel(event.data.workItem.state, t),\n }),\n icon: event.data.workItem.state === \"BLOCKED\" ? \"pause\" : \"play\",\n label: t(\"event.stateChanged\"),\n tone: event.data.workItem.state === \"BLOCKED\" ? \"warning\" : \"accent\",\n };\n case \"PROJECT_REGISTERED\":\n return { detail: event.data.project.name, icon: \"projects\", label: t(\"event.projectRegistered\") };\n case \"PROJECT_SCAFFOLD_REQUESTED\":\n return {\n detail: event.data.operation.proposal.projectName,\n icon: \"clock\",\n label: t(\"event.projectScaffoldRequested\"),\n };\n case \"PROJECT_SCAFFOLD_COMPLETED\":\n return {\n detail: event.data.operation.proposal.projectName,\n icon: \"check\",\n label: t(\"event.projectScaffoldCompleted\"),\n tone: \"success\",\n };\n case \"PROJECT_SCAFFOLD_FAILED\":\n return {\n detail: event.data.operation.lastErrorCode ?? t(\"error.unknown\"),\n icon: \"warning\",\n label: t(\"event.projectScaffoldFailed\"),\n tone: \"warning\",\n };\n case \"PROJECT_PROVIDER_PREFERENCE_CHANGED\":\n return {\n detail: t(\"event.providerPreferenceChangedDetail\", {\n from: event.data.previousPreference,\n to: event.data.selection.preference,\n }),\n icon: \"settings\",\n label: t(\"event.providerPreferenceChanged\"),\n };\n case \"PROVIDER_ALLOWANCE_RECORDED\":\n return {\n detail: t(\"event.providerAllowanceRecordedDetail\", {\n provider: event.data.snapshot.provider.replace(\"_\", \" \"),\n freshness: t(\n event.data.snapshot.freshness === \"LIVE\"\n ? \"providerAllowance.freshness.live\"\n : event.data.snapshot.freshness === \"STALE\"\n ? \"providerAllowance.freshness.stale\"\n : \"providerAllowance.freshness.unavailable\",\n ),\n }),\n icon: \"budget\",\n label: t(\"event.providerAllowanceRecorded\"),\n };\n case \"MCP_PROFILE_CONSENTED\":\n return {\n detail: t(\"event.mcpProfileConsentedDetail\", {\n name: event.data.revision.name,\n revision: event.data.revision.revision,\n }),\n icon: \"settings\",\n label: t(\"event.mcpProfileConsented\"),\n };\n case \"MCP_GRANT_CHANGED\":\n return {\n detail: t(\"event.mcpGrantChangedDetail\", {\n count: event.data.grant.tools.length,\n state: t(event.data.grant.enabled ? \"event.mcpGrant.enabled\" : \"event.mcpGrant.revoked\"),\n }),\n icon: event.data.grant.enabled ? \"check\" : \"pause\",\n label: t(\"event.mcpGrantChanged\"),\n tone: event.data.grant.enabled ? \"success\" : \"warning\",\n };\n case \"PROJECT_CONSTITUTION_PROPOSED\":\n return {\n detail: t(\"event.constitutionProposedDetail\", { preset: event.data.proposal.presetId }),\n icon: \"settings\",\n label: t(\"event.constitutionProposed\"),\n };\n case \"PROJECT_CONSTITUTION_PUBLICATION_REQUESTED\":\n return {\n detail: t(\"event.constitutionPublicationRequestedDetail\", {\n ordinal: event.data.constitution.ordinal,\n }),\n icon: \"clock\",\n label: t(\"event.constitutionPublicationRequested\"),\n tone: \"accent\",\n };\n case \"PROJECT_CONSTITUTION_ACTIVATED\":\n return {\n detail: t(\"event.constitutionActivatedDetail\", {\n ordinal: event.data.constitution.ordinal,\n }),\n icon: \"check\",\n label: t(\"event.constitutionActivated\"),\n tone: \"success\",\n };\n case \"PROJECT_CONSTITUTION_PUBLICATION_FAILED\":\n return {\n detail: event.data.publication.lastErrorCode ?? t(\"error.unknown\"),\n icon: \"pause\",\n label: t(\"event.constitutionPublicationFailed\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_PLAN_ADOPTED\":\n return {\n detail: t(\"event.verificationPlanAdoptedDetail\", {\n count: event.data.plan.recipes.length,\n revision: event.data.plan.revision,\n }),\n icon: \"settings\",\n label: t(\"event.verificationPlanAdopted\"),\n tone: \"accent\",\n };\n case \"VERIFICATION_PLAN_DISABLED\":\n return {\n detail: t(\"event.verificationPlanDisabledDetail\", {\n revision: event.data.plan.revision,\n }),\n icon: \"pause\",\n label: t(\"event.verificationPlanDisabled\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_PLAN_PUBLICATION_APPLIED\":\n return {\n detail: t(\"event.verificationPlanPublicationAppliedDetail\", {\n revision: event.data.plan.revision,\n }),\n icon: \"check\",\n label: t(\"event.verificationPlanPublicationApplied\"),\n tone: \"success\",\n };\n case \"VERIFICATION_PLAN_PUBLICATION_FAILED\":\n return {\n detail: event.data.publication.lastErrorCode ?? t(\"error.unknown\"),\n icon: \"warning\",\n label: t(\"event.verificationPlanPublicationFailed\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_PLAN_PUBLICATION_RETRIED\":\n return {\n detail: t(\"event.verificationPlanPublicationRetriedDetail\", {\n revision: event.data.plan.revision,\n }),\n icon: \"clock\",\n label: t(\"event.verificationPlanPublicationRetried\"),\n tone: \"accent\",\n };\n case \"LAUNCH_MEASUREMENT_PLAN_CHANGED\":\n return {\n detail: t(\"event.launchPlanChangedDetail\", {\n revision: event.data.plan.revision,\n status: event.data.plan.status,\n }),\n icon: event.data.plan.status === \"ACTIVE\" ? \"settings\" : \"pause\",\n label: t(\"event.launchPlanChanged\"),\n tone: event.data.plan.status === \"ACTIVE\" ? \"accent\" : \"warning\",\n };\n case \"LAUNCH_MEASUREMENT_RUN_CHANGED\":\n return {\n detail: t(\"event.launchRunChangedDetail\", {\n status: event.data.run.status,\n tree: event.data.run.testedTree.slice(0, 8),\n }),\n icon: event.data.run.status === \"PASSED\" ? \"check\" : \"test\",\n label: t(\"event.launchRunChanged\"),\n tone:\n event.data.run.status === \"PASSED\"\n ? \"success\"\n : event.data.run.status === \"RUNNING\"\n ? \"accent\"\n : \"warning\",\n };\n case \"LAUNCH_ENVIRONMENT_CHANGED\":\n return {\n detail: t(\"event.launchEnvironmentChangedDetail\", {\n kind: event.data.environment.kind,\n version: event.data.environment.version,\n }),\n icon: \"settings\",\n label: t(\"event.launchEnvironmentChanged\"),\n tone: \"accent\",\n };\n case \"LAUNCH_RELEASE_CREATED\":\n return {\n detail: t(\"event.launchReleaseCreatedDetail\", {\n passed: event.data.release.passedRequiredGateCount,\n required: event.data.release.requiredGateCount,\n tree: event.data.release.sourceTree.slice(0, 8),\n }),\n icon:\n event.data.release.passedRequiredGateCount === event.data.release.requiredGateCount\n ? \"check\"\n : \"warning\",\n label: t(\"event.launchReleaseCreated\"),\n tone:\n event.data.release.passedRequiredGateCount === event.data.release.requiredGateCount\n ? \"success\"\n : \"warning\",\n };\n case \"DEPLOYMENT_PLAN_ADOPTED\":\n return {\n detail: t(\"event.deploymentPlanAdoptedDetail\", {\n branch: event.data.plan.target.branch,\n commit: event.data.plan.target.commitSha.slice(0, 8),\n repository: event.data.plan.target.repositorySlug,\n }),\n icon: \"settings\",\n label: t(\"event.deploymentPlanAdopted\"),\n tone: \"accent\",\n };\n case \"DEPLOYMENT_CHANGED\":\n return {\n detail: t(\"event.deploymentChangedDetail\", {\n status: t(`settings.deploy.status.${event.data.deployment.status}`),\n }),\n icon: event.data.deployment.status === \"SUCCEEDED\" ? \"check\" : \"warning\",\n label: t(\"event.deploymentChanged\"),\n tone: event.data.deployment.status === \"SUCCEEDED\" ? \"success\" : \"warning\",\n };\n case \"VERIFICATION_RUN_RESERVED\":\n return {\n detail: t(\"event.verificationRunReservedDetail\", {\n count: event.data.checks.length,\n ordinal: event.data.run.ordinal,\n }),\n icon: \"test\",\n label: t(\"event.verificationRunReserved\"),\n tone: \"accent\",\n };\n case \"VERIFICATION_CHECK_STARTED\":\n return {\n detail: t(\"event.verificationCheckStartedDetail\", { ordinal: event.data.check.ordinal }),\n icon: \"play\",\n label: t(\"event.verificationCheckStarted\"),\n tone: \"accent\",\n };\n case \"VERIFICATION_CHECK_COMPLETED\":\n return {\n detail: t(\"event.verificationCheckCompletedDetail\", {\n ordinal: event.data.check.ordinal,\n status: t(verificationCheckStatusLabelKeys[event.data.check.status]),\n }),\n icon: event.data.check.status === \"PASSED\" ? \"check\" : \"warning\",\n label: t(\"event.verificationCheckCompleted\"),\n tone: event.data.check.status === \"PASSED\" ? \"success\" : \"warning\",\n };\n case \"VERIFICATION_RUN_CANCELLATION_REQUESTED\":\n return {\n detail: t(\"event.verificationRunCancellationRequestedDetail\", {\n ordinal: event.data.run.ordinal,\n }),\n icon: \"pause\",\n label: t(\"event.verificationRunCancellationRequested\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_RUN_INTERRUPTED\":\n return {\n detail: t(\"event.verificationRunInterruptedDetail\", { ordinal: event.data.run.ordinal }),\n icon: \"pause\",\n label: t(\"event.verificationRunInterrupted\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_FAILURE_RECORDED\":\n return {\n detail: t(\"event.verificationFailureRecordedDetail\", {\n reason: t(verificationFailureReasonLabelKeys[event.data.failure.reason]),\n }),\n icon: \"warning\",\n label: t(\"event.verificationFailureRecorded\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_CORRECTION_STARTED\":\n return {\n detail: t(\"event.verificationCorrectionStartedDetail\", {\n ordinal: event.data.correctionRun.budgetPosition,\n }),\n icon: \"play\",\n label: t(\"event.verificationCorrectionStarted\"),\n tone: \"accent\",\n };\n case \"VERIFICATION_CORRECTION_PASSED\":\n return {\n detail: t(\"event.verificationCorrectionPassedDetail\", {\n ordinal: event.data.correctionRun.budgetPosition,\n }),\n icon: \"check\",\n label: t(\"event.verificationCorrectionPassed\"),\n tone: \"success\",\n };\n case \"VERIFICATION_CORRECTION_SUPERSEDED\":\n return {\n detail: t(\"event.verificationCorrectionSupersededDetail\", {\n ordinal: event.data.correctionRun.budgetPosition,\n }),\n icon: \"warning\",\n label: t(\"event.verificationCorrectionSuperseded\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_CORRECTION_EXHAUSTED\":\n return {\n detail: t(\"event.verificationCorrectionExhaustedDetail\", {\n ordinal: event.data.correctionRun.budgetPosition,\n }),\n icon: \"pause\",\n label: t(\"event.verificationCorrectionExhausted\"),\n tone: \"warning\",\n };\n case \"VERIFICATION_CORRECTION_CANCELLED\":\n return {\n detail: t(\"event.verificationCorrectionCancelledDetail\", {\n ordinal: event.data.correctionRun.budgetPosition,\n }),\n icon: \"pause\",\n label: t(\"event.verificationCorrectionCancelled\"),\n tone: \"warning\",\n };\n case \"PROJECT_READINESS_ASSESSED\":\n return {\n detail: t(\"event.readinessAssessedDetail\", {\n count: event.data.checks.filter((check) => check.status === \"ACTION_REQUIRED\").length,\n }),\n icon: event.data.run.status === \"READY\" ? \"check\" : \"warning\",\n label: t(\"event.readinessAssessed\"),\n tone: event.data.run.status === \"READY\" ? \"success\" : \"warning\",\n };\n case \"PROJECT_READINESS_ATTESTED\":\n return {\n detail: t(\"event.readinessAttestedDetail\", {\n check: t(readinessCheckKeys[event.data.check.key]),\n outcome: t(readinessStatusKeys[event.data.check.status]),\n }),\n icon: \"check\",\n label: t(\"event.readinessAttested\"),\n tone: \"success\",\n };\n case \"PIPELINE_STARTED\":\n return {\n detail: t(\"event.pipelineStartedDetail\", {\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n }),\n icon: \"play\",\n label: t(\"event.pipelineStarted\"),\n tone: \"accent\",\n };\n case \"STAGE_ATTEMPT_CHANGED\":\n return {\n detail: t(\"event.stageChangedDetail\", {\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n status: stageAttemptStatusLabel(event.data.stageAttempt, t),\n }),\n icon: event.data.stageAttempt.status === \"SUCCEEDED\" ? \"check\" : \"clock\",\n label: t(\"event.stageChanged\"),\n tone: event.data.stageAttempt.status === \"SUCCEEDED\" ? \"success\" : \"accent\",\n };\n case \"HUMAN_REQUEST_OPENED\":\n return {\n detail: t(\"event.humanRequestOpenedDetail\", { title: event.data.request.title }),\n icon: \"question\",\n label: t(\"event.humanRequestOpened\"),\n tone: \"warning\",\n };\n case \"HUMAN_REQUEST_RESOLVED\":\n return {\n detail: t(\"event.humanRequestResolvedDetail\"),\n icon: \"check\",\n label: t(\"event.humanRequestResolved\"),\n tone: \"success\",\n };\n case \"USAGE_RECORDED\":\n return {\n detail: t(\"event.usageRecordedDetail\", {\n amount: event.data.usageRecord.amount,\n total: event.data.cumulativeAmount,\n }),\n icon: \"clock\",\n label: t(\"event.usageRecorded\"),\n };\n case \"BUDGET_THRESHOLD_REACHED\":\n return {\n detail: t(\"event.budgetThresholdDetail\", {\n threshold: Math.round(event.data.threshold * 100),\n total: event.data.cumulativeAmount,\n }),\n icon: \"filter\",\n label: t(\"event.budgetThreshold\"),\n tone: event.data.threshold >= 1 ? \"warning\" : \"accent\",\n };\n case \"PIPELINE_PAUSED\":\n return {\n detail: t(\"event.pipelinePausedDetail\", {\n kind: event.data.kind,\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n }),\n icon: \"pause\",\n label: t(\"event.pipelinePaused\"),\n tone: \"warning\",\n };\n case \"PIPELINE_RESUMED\":\n return {\n detail: t(\"event.pipelineResumedDetail\", {\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n }),\n icon: \"play\",\n label: t(\"event.pipelineResumed\"),\n tone: \"accent\",\n };\n case \"PIPELINE_CANCELLED\":\n return {\n detail: t(\"event.pipelineCancelledDetail\", {\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n }),\n icon: \"pause\",\n label: t(\"event.pipelineCancelled\"),\n tone: \"warning\",\n };\n case \"BUDGET_OVERRIDE_APPROVED\":\n return {\n detail: t(\"event.budgetOverrideDetail\", {\n revision: event.data.budgetPolicy.revision,\n limit: event.data.budgetPolicy.maxEstimatedTokens,\n }),\n icon: \"settings\",\n label: t(\"event.budgetOverride\"),\n tone: \"accent\",\n };\n case \"RECOVERY_REPORT_CREATED\":\n return {\n detail: t(\"event.recoveryCreatedDetail\", {\n stage: t(stageLabelKeys[event.data.stageAttempt.stage]),\n }),\n icon: \"clock\",\n label: t(\"event.recoveryCreated\"),\n tone: \"warning\",\n };\n case \"EVIDENCE_ARTIFACT_RECORDED\":\n return {\n detail: t(\"event.evidenceRecordedDetail\", { title: event.data.artifact.title }),\n icon: \"check\",\n label: t(\"event.evidenceRecorded\"),\n tone: \"success\",\n };\n case \"REVIEW_REPORT_RECORDED\":\n return {\n detail: t(\"event.reviewReportRecordedDetail\", {\n round: event.data.report.round,\n verdict: t(`review.verdict.${event.data.report.verdict}`),\n }),\n icon: \"check\",\n label: t(\"event.reviewReportRecorded\"),\n tone: event.data.report.verdict === \"PASSED\" ? \"success\" : \"warning\",\n };\n case \"REVIEW_FINDING_RECORDED\":\n return {\n detail: event.data.finding.title,\n icon: \"warning\",\n label: t(\"event.reviewFindingRecorded\"),\n tone: \"warning\",\n };\n case \"REVIEW_FINDING_RESOLVED\":\n return {\n detail: event.data.finding.title,\n icon: \"check\",\n label: t(\"event.reviewFindingResolved\"),\n tone: \"success\",\n };\n case \"REVIEW_LOOP_EXHAUSTED\":\n return {\n detail: t(\"event.reviewLoopExhaustedDetail\", { round: event.data.report.round }),\n icon: \"pause\",\n label: t(\"event.reviewLoopExhausted\"),\n tone: \"warning\",\n };\n case \"ACCEPTANCE_REQUESTED\":\n return {\n detail: t(\"event.acceptanceRequestedDetail\"),\n icon: \"question\",\n label: t(\"event.acceptanceRequested\"),\n tone: \"warning\",\n };\n case \"ACCEPTANCE_RESOLVED\":\n return {\n detail: t(\"event.acceptanceResolvedDetail\", { action: event.data.action }),\n icon: event.data.action === \"ACCEPT\" ? \"check\" : \"pause\",\n label: t(\"event.acceptanceResolved\"),\n tone: event.data.action === \"ACCEPT\" ? \"success\" : \"warning\",\n };\n case \"PIPELINE_COMPLETED\":\n return {\n detail: t(\"event.pipelineCompletedDetail\"),\n icon: \"check\",\n label: t(\"event.pipelineCompleted\"),\n tone: \"success\",\n };\n case \"SQUAD_ASSIGNED\":\n return {\n detail: t(\"event.squadAssignedDetail\", { count: event.data.assignment.stages.length }),\n icon: \"agents\",\n label: t(\"event.squadAssigned\"),\n };\n case \"AGENT_RUN_STARTED\":\n return {\n detail: t(\"event.agentRunStartedDetail\", {\n role: t(`fleet.role.${event.data.run.profile.role}`),\n provider: event.data.run.provider.replace(\"_\", \" \"),\n }),\n icon: \"agents\",\n label: t(\"event.agentRunStarted\"),\n tone: \"accent\",\n };\n case \"AGENT_RUN_FINISHED\":\n return {\n detail: t(\"event.agentRunFinishedDetail\", {\n role: t(`fleet.role.${event.data.run.profile.role}`),\n status: t(agentRunStatusLabelKeys[event.data.run.status]),\n }),\n icon: \"agents\",\n label: t(\"event.agentRunFinished\"),\n tone: event.data.run.status === \"SUCCEEDED\" ? \"success\" : \"warning\",\n };\n case \"QA_RUN_RESERVED\":\n return {\n detail: t(\"event.qaRunReservedDetail\", {\n targets: event.data.qaRun.plan.targets.length,\n scenarios: event.data.qaRun.plan.scenarios.length,\n }),\n icon: \"sessions\",\n label: t(\"event.qaRunReserved\"),\n tone: \"accent\",\n };\n case \"QA_RUN_COMPLETED\":\n return {\n detail: t(\"event.qaRunCompletedDetail\", {\n status: event.data.qaRun.status,\n defects: event.data.defectIds.length,\n }),\n icon: event.data.qaRun.status === \"PASSED\" ? \"check\" : \"warning\",\n label: t(\"event.qaRunCompleted\"),\n tone: event.data.qaRun.status === \"PASSED\" ? \"success\" : \"warning\",\n };\n case \"QA_DEFECT_WAIVED\":\n return {\n detail: event.data.defect.title,\n icon: \"check\",\n label: t(\"event.qaDefectWaived\"),\n tone: \"warning\",\n };\n case \"QA_CORRECTION_STARTED\":\n return {\n detail: t(\"event.qaCorrectionStartedDetail\", {\n ordinal: event.data.correctionRun.ordinal,\n cells: event.data.retestPlan.cells.length,\n }),\n icon: \"play\",\n label: t(\"event.qaCorrectionStarted\"),\n tone: \"accent\",\n };\n case \"QA_CORRECTION_EXHAUSTED\":\n return {\n detail: t(\"event.qaCorrectionExhaustedDetail\", {\n ordinal: event.data.correctionRun.ordinal,\n }),\n icon: \"pause\",\n label: t(\"event.qaCorrectionExhausted\"),\n tone: \"warning\",\n };\n case \"QA_CORRECTION_PASSED\":\n return {\n detail: t(\"event.qaCorrectionPassedDetail\", {\n ordinal: event.data.correctionRun.ordinal,\n defects: event.data.resolvedDefects.length,\n }),\n icon: \"check\",\n label: t(\"event.qaCorrectionPassed\"),\n tone: \"success\",\n };\n case \"QA_CORRECTION_CANCELLED\":\n return {\n detail: t(\"event.qaCorrectionCancelledDetail\", {\n ordinal: event.data.correctionRun.ordinal,\n }),\n icon: \"warning\",\n label: t(\"event.qaCorrectionCancelled\"),\n tone: \"warning\",\n };\n case \"PROVIDER_SESSION_STARTED\":\n return {\n detail: t(\"event.providerSessionStartedDetail\", { ordinal: event.data.session.ordinal }),\n icon: \"sessions\",\n label: t(\"event.providerSessionStarted\"),\n tone: \"accent\",\n };\n case \"CHECKPOINT_PUBLISHED\":\n return {\n detail: t(\"event.checkpointPublishedDetail\", { summary: event.data.checkpoint.summary }),\n icon: \"check\",\n label: t(\"event.checkpointPublished\"),\n tone: \"success\",\n };\n case \"CONTEXT_HANDOFF_REQUESTED\":\n return {\n detail: t(\"event.contextHandoffRequestedDetail\", { ordinal: event.data.session.ordinal }),\n icon: \"clock\",\n label: t(\"event.contextHandoffRequested\"),\n tone: \"warning\",\n };\n case \"PROVIDER_SESSION_ENDED\":\n return {\n detail: t(\"event.providerSessionEndedDetail\", { reason: event.data.session.endReason ?? \"\" }),\n icon: \"sessions\",\n label: t(\"event.providerSessionEnded\"),\n tone: event.data.session.endReason === \"COMPLETED\" ? \"success\" : \"neutral\",\n };\n case \"CONTEXT_FLOOR_EXCEEDED\":\n return {\n detail: t(\"event.contextFloorExceededDetail\", {\n ordinal: event.data.sessionOrdinal,\n requiredBytes: event.data.requiredBytes,\n budgetBytes: event.data.budgetBytes,\n }),\n icon: \"pause\",\n label: t(\"event.contextFloorExceeded\"),\n tone: \"warning\",\n };\n case \"WORK_ITEM_WORKSPACE_CREATED\":\n return {\n detail: t(\"event.workspaceCreatedDetail\", {\n branch: event.data.workspace.branch,\n count: event.data.carriedPaths.length,\n mode: t(`workspace.mode.${event.data.workspace.strategy}`),\n }),\n icon: \"branch\",\n label: t(\"event.workspaceCreated\"),\n tone: \"success\",\n };\n case \"PROJECT_WORKSPACE_STRATEGY_CHANGED\":\n return {\n detail: t(\"event.workspaceStrategyChangedDetail\", {\n mode: t(`workspace.mode.${event.data.selection.strategy}`),\n }),\n icon: \"projects\",\n label: t(\"event.workspaceStrategyChanged\"),\n tone: \"neutral\",\n };\n case \"WORK_ITEM_WORKSPACE_ORPHANED\":\n return {\n detail: t(\"event.workspaceOrphanedDetail\"),\n icon: \"warning\",\n label: t(\"event.workspaceOrphaned\"),\n tone: \"warning\",\n };\n }\n};\n\nconst eventTime = (occurredAt: string, locale: Locale): string =>\n new Intl.DateTimeFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(occurredAt));\n\nconst WorkItemButton = ({\n item,\n onSelect,\n selected,\n}: {\n item: WorkItem;\n onSelect: (id: string) => void;\n selected: boolean;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // The board scrolls horizontally, so a selected task can sit in an off-screen column - including\n // after a workflow moves it there. Reveal it instead of leaving the visible columns looking empty.\n useEffect(() => {\n if (!selected) return;\n buttonRef.current?.scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }, [selected]);\n\n return (\n <button\n aria-label={item.title}\n aria-pressed={selected}\n className=\"task-card-button\"\n onClick={() => {\n onSelect(item.id);\n }}\n ref={buttonRef}\n type=\"button\"\n >\n <TaskCard\n agent={t(typeLabelKeys[item.type])}\n badge={{ label: t(priorityLabelKeys[item.priority]), tone: priorityTone(item.priority) }}\n description={item.description}\n id={displayWorkItemId(item.id)}\n meta={stateLabel(item.state, t)}\n selected={selected}\n title={item.title}\n />\n </button>\n );\n};\n\nconst criteriaFromText = (value: string): readonly string[] =>\n value\n .split(\"\\n\")\n .map((criterion) => criterion.trim())\n .filter(Boolean);\n\nconst TaskEditDialog = ({ item }: { item: WorkItem }): React.JSX.Element => {\n const { t } = useI18n();\n const updateMutation = useUpdateWorkItem();\n const formRef = useRef<HTMLFormElement>(null);\n const [open, setOpen] = useState(false);\n const [title, setTitle] = useState(item.title);\n const [description, setDescription] = useState(item.description);\n const [priority, setPriority] = useState(item.priority);\n const [risk, setRisk] = useState(item.risk);\n const [criteriaText, setCriteriaText] = useState(item.acceptanceCriteria.join(\"\\n\"));\n const acceptanceCriteria = criteriaFromText(criteriaText);\n // Same rule as the create dialog: the contract does not reject duplicates, and the acceptance\n // binding refuses them only at the end of the pipeline.\n const criteriaValid =\n acceptanceCriteria.length <= 50 &&\n new Set(acceptanceCriteria).size === acceptanceCriteria.length &&\n acceptanceCriteria.every((criterion) => criterion.length <= 500);\n const changed =\n title.trim() !== item.title ||\n description.trim() !== item.description ||\n priority !== item.priority ||\n risk !== item.risk ||\n acceptanceCriteria.length !== item.acceptanceCriteria.length ||\n acceptanceCriteria.some((criterion, index) => criterion !== item.acceptanceCriteria[index]);\n\n const resetDraft = (): void => {\n setTitle(item.title);\n setDescription(item.description);\n setPriority(item.priority);\n setRisk(item.risk);\n setCriteriaText(item.acceptanceCriteria.join(\"\\n\"));\n updateMutation.reset();\n };\n\n const submit = (event: SyntheticEvent<HTMLFormElement, SubmitEvent>): void => {\n event.preventDefault();\n const normalizedTitle = title.trim();\n const normalizedDescription = description.trim();\n if (!normalizedTitle || !criteriaValid || !changed) return;\n\n const patch = {\n ...(normalizedTitle === item.title ? {} : { title: normalizedTitle }),\n ...(normalizedDescription === item.description ? {} : { description: normalizedDescription }),\n ...(priority === item.priority ? {} : { priority }),\n ...(risk === item.risk ? {} : { risk }),\n ...(acceptanceCriteria.length === item.acceptanceCriteria.length &&\n acceptanceCriteria.every((criterion, index) => criterion === item.acceptanceCriteria[index])\n ? {}\n : { acceptanceCriteria: [...acceptanceCriteria] }),\n };\n\n updateMutation.mutate(\n { patch, workItem: item },\n {\n onSuccess: () => {\n setOpen(false);\n },\n },\n );\n };\n\n return (\n <DialogSurface\n closeLabel={t(\"action.closeDialog\")}\n description={t(\"task.edit.description\")}\n footer={\n <>\n <Button\n disabled={updateMutation.isPending}\n onClick={() => {\n setOpen(false);\n resetDraft();\n }}\n >\n {t(\"action.cancel\")}\n </Button>\n <Button\n disabled={!title.trim() || !criteriaValid || !changed}\n loading={updateMutation.isPending}\n onClick={() => {\n formRef.current?.requestSubmit();\n }}\n type=\"button\"\n variant=\"primary\"\n >\n {t(\"task.edit.submit\")}\n </Button>\n </>\n }\n onOpenChange={(nextOpen) => {\n if (nextOpen) resetDraft();\n setOpen(nextOpen);\n }}\n open={open}\n size=\"lg\"\n title={t(\"task.edit\")}\n trigger={<IconButton label={t(\"task.edit\")} name=\"edit\" size=\"sm\" variant=\"surface\" />}\n triggerTooltip={t(\"task.edit\")}\n >\n <form className=\"edit-task-form\" onSubmit={submit} ref={formRef}>\n {updateMutation.error ? (\n <LocalConnectionRecovery\n error={updateMutation.error}\n onRetry={() => {\n formRef.current?.requestSubmit();\n }}\n retrying={updateMutation.isPending}\n />\n ) : null}\n <Field htmlFor=\"edit-task-title\" label={t(\"task.create.title\")} required>\n <TextField\n autoFocus\n id=\"edit-task-title\"\n maxLength={200}\n onChange={(event) => {\n setTitle(event.currentTarget.value);\n }}\n required\n value={title}\n />\n </Field>\n <Field htmlFor=\"edit-task-description\" label={t(\"task.create.brief\")}>\n <Textarea\n id=\"edit-task-description\"\n maxLength={20_000}\n onChange={(event) => {\n setDescription(event.currentTarget.value);\n }}\n rows={5}\n value={description}\n />\n </Field>\n <div className=\"edit-task-form__row\">\n <Field htmlFor=\"edit-task-priority\" label={t(\"task.priority\")}>\n <SelectControl\n ariaLabel={t(\"task.priority\")}\n id=\"edit-task-priority\"\n onValueChange={(value) => {\n setPriority(prioritySchema.parse(value));\n }}\n options={(Object.keys(priorityLabelKeys) as WorkItem[\"priority\"][]).map((value) => ({\n label: t(priorityLabelKeys[value]),\n value,\n }))}\n value={priority}\n />\n </Field>\n <Field htmlFor=\"edit-task-risk\" label={t(\"task.risk\")}>\n <SelectControl\n ariaLabel={t(\"task.risk\")}\n id=\"edit-task-risk\"\n onValueChange={(value) => {\n setRisk(riskSchema.parse(value));\n }}\n options={(Object.keys(riskLabelKeys) as WorkItem[\"risk\"][]).map((value) => ({\n label: t(riskLabelKeys[value]),\n value,\n }))}\n value={risk}\n />\n </Field>\n </div>\n <Field\n description={t(\"task.edit.criteriaDescription\")}\n htmlFor=\"edit-work-item-criteria\"\n label={t(\"task.acceptanceCriteria\")}\n {...(criteriaValid ? {} : { error: t(\"task.edit.criteriaError\") })}\n >\n <Textarea\n aria-describedby=\"edit-work-item-criteria-description\"\n id=\"edit-work-item-criteria\"\n invalid={!criteriaValid}\n onChange={(event) => {\n setCriteriaText(event.currentTarget.value);\n }}\n rows={5}\n value={criteriaText}\n />\n </Field>\n </form>\n </DialogSurface>\n );\n};\n\ntype ReviewReportView = ReviewStateResponse[\"reports\"][number];\n\nconst reviewSeverityTones: Record<ReviewFinding[\"severity\"], BadgeTone> = {\n LOW: \"neutral\",\n MEDIUM: \"info\",\n HIGH: \"warning\",\n CRITICAL: \"danger\",\n};\n\nconst reviewFindingStatusTones: Record<ReviewFinding[\"status\"], BadgeTone> = {\n OPEN: \"danger\",\n RESOLVED: \"success\",\n WAIVED: \"warning\",\n FALSE_POSITIVE: \"neutral\",\n};\n\nconst reviewLocation = (finding: ReviewFinding): string | null => {\n if (finding.path === null) return null;\n if (finding.startLine === null) return finding.path;\n return `${finding.path}:${finding.startLine.toString()}-${(finding.endLine ?? finding.startLine).toString()}`;\n};\n\nconst ReviewPanel = ({ item }: { item: WorkItem }): React.JSX.Element | null => {\n const { t } = useI18n();\n const reviewQuery = useWorkItemReviews(item.id);\n const dispositionMutation = useDisposeReviewFinding();\n const [selected, setSelected] = useState<{\n finding: ReviewFinding;\n disposition: ReviewFindingOwnerDisposition;\n } | null>(null);\n const [reason, setReason] = useState(\"\");\n\n if (reviewQuery.error) {\n return (\n <LocalConnectionRecovery\n error={reviewQuery.error}\n onRetry={() => {\n void reviewQuery.refetch();\n }}\n retrying={reviewQuery.isFetching}\n />\n );\n }\n const review = reviewQuery.data;\n const latest: ReviewReportView | undefined = review?.reports[0];\n if (latest === undefined && (review?.findings.length ?? 0) === 0) return null;\n\n const submitDisposition = (event: SyntheticEvent<HTMLFormElement>): void => {\n event.preventDefault();\n if (selected === null || reason.trim().length === 0) return;\n dispositionMutation.mutate(\n { ...selected, reason: reason.trim() },\n {\n onSuccess: () => {\n setSelected(null);\n setReason(\"\");\n },\n },\n );\n };\n\n return (\n <section aria-label={t(\"review.title\")} className=\"review-panel\">\n {latest ? (\n <header className=\"review-panel__heading\">\n <div>\n <span>{t(\"review.round\", { round: latest.round })}</span>\n <strong>{latest.title}</strong>\n </div>\n <Badge tone={latest.verdict === \"PASSED\" ? \"success\" : \"danger\"}>\n {t(`review.verdict.${latest.verdict}`)}\n </Badge>\n </header>\n ) : null}\n {latest ? (\n <div className=\"review-panel__summary\">\n <p>{latest.summary}</p>\n <dl>\n <div>\n <dt>{t(\"review.reviewer\")}</dt>\n <dd>{latest.reviewerProvider}</dd>\n </div>\n <div>\n <dt>{t(\"review.relation\")}</dt>\n <dd>{t(`review.relation.${latest.providerRelation}`)}</dd>\n </div>\n <div>\n <dt>{t(\"review.tree\")}</dt>\n <dd>\n <code title={latest.reviewedTree}>{latest.reviewedTree.slice(0, 8)}</code>\n </dd>\n </div>\n </dl>\n </div>\n ) : null}\n {review && review.findings.length > 0 ? (\n <ol aria-label={t(\"review.findings\")} className=\"review-finding-list\">\n {review.findings.map((finding) => {\n const location = reviewLocation(finding);\n return (\n <li key={finding.id}>\n <div className=\"review-finding__heading\">\n <strong>{finding.title}</strong>\n <span>\n <Badge tone={reviewSeverityTones[finding.severity]}>\n {t(`review.severity.${finding.severity}`)}\n </Badge>\n <Badge tone={reviewFindingStatusTones[finding.status]}>\n {t(`review.findingStatus.${finding.status}`)}\n </Badge>\n </span>\n </div>\n <p>{finding.description}</p>\n {location ? <code className=\"review-finding__location\">{location}</code> : null}\n <div className=\"review-finding__detail\">\n <strong>{t(\"review.reproduction\")}</strong>\n <span>{finding.reproduction}</span>\n </div>\n {finding.status === \"OPEN\" ? (\n <div className=\"review-finding__actions\">\n <Button\n onClick={() => {\n dispositionMutation.reset();\n setReason(\"\");\n setSelected({ finding, disposition: \"WAIVED\" });\n }}\n size=\"sm\"\n variant=\"secondary\"\n >\n {t(\"review.waive\")}\n </Button>\n <Button\n onClick={() => {\n dispositionMutation.reset();\n setReason(\"\");\n setSelected({ finding, disposition: \"FALSE_POSITIVE\" });\n }}\n size=\"sm\"\n variant=\"secondary\"\n >\n {t(\"review.falsePositive\")}\n </Button>\n </div>\n ) : finding.resolutionReason ? (\n <p className=\"review-finding__resolution\">{finding.resolutionReason}</p>\n ) : null}\n {selected?.finding.id === finding.id ? (\n <form className=\"review-disposition\" onSubmit={submitDisposition}>\n <Field htmlFor={`review-disposition-${finding.id}`} label={t(\"review.reason\")}>\n <Textarea\n autoFocus\n id={`review-disposition-${finding.id}`}\n maxLength={4_000}\n onChange={(event) => {\n setReason(event.currentTarget.value);\n }}\n placeholder={t(\"review.reasonPlaceholder\")}\n rows={3}\n value={reason}\n />\n </Field>\n {dispositionMutation.error ? (\n <LocalConnectionRecovery error={dispositionMutation.error} />\n ) : null}\n <div>\n <Button\n disabled={reason.trim().length === 0}\n loading={dispositionMutation.isPending}\n size=\"sm\"\n type=\"submit\"\n variant=\"primary\"\n >\n {t(\n selected.disposition === \"WAIVED\"\n ? \"review.confirmWaive\"\n : \"review.confirmFalsePositive\",\n )}\n </Button>\n <Button\n disabled={dispositionMutation.isPending}\n onClick={() => {\n setSelected(null);\n setReason(\"\");\n }}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n >\n {t(\"action.cancel\")}\n </Button>\n </div>\n </form>\n ) : null}\n </li>\n );\n })}\n </ol>\n ) : (\n <p className=\"review-panel__empty\">{t(\"review.noFindings\")}</p>\n )}\n </section>\n );\n};\n\ntype QARunView = QAStateResponse[\"runs\"][number];\n\nconst qaRunStatusTones: Record<QARunStatus, BadgeTone> = {\n RUNNING: \"info\",\n PASSED: \"success\",\n FAILED: \"danger\",\n ERROR: \"warning\",\n};\n\nconst qaObservationTones: Record<QAObservation[\"severity\"], BadgeTone> = {\n INFO: \"neutral\",\n WARNING: \"warning\",\n ERROR: \"danger\",\n};\n\nconst qaDefectTones: Record<QADefect[\"severity\"], BadgeTone> = {\n LOW: \"neutral\",\n MEDIUM: \"info\",\n HIGH: \"warning\",\n CRITICAL: \"danger\",\n};\n\nconst qaDefectStatusTones: Record<QADefect[\"status\"], BadgeTone> = {\n OPEN: \"danger\",\n RESOLVED: \"success\",\n WAIVED: \"warning\",\n};\n\nconst qaCorrectionStatusTones: Record<QAStateResponse[\"correctionRuns\"][number][\"status\"], BadgeTone> = {\n ACTIVE: \"info\",\n PASSED: \"success\",\n SUPERSEDED: \"neutral\",\n EXHAUSTED: \"warning\",\n CANCELLED: \"neutral\",\n};\n\nconst BrowserQAPanel = ({\n correctionGate,\n item,\n}: {\n correctionGate: { correctionRunId: string | null; request: HumanRequest; run: PipelineRun } | null;\n item: WorkItem;\n}): React.JSX.Element | null => {\n const { t } = useI18n();\n const qaQuery = useWorkItemQA(item.id);\n const gateMutation = useResolveQACorrectionGate();\n const waiverMutation = useWaiveQADefect();\n const [selectedDefect, setSelectedDefect] = useState<QADefect | null>(null);\n const [waiverReason, setWaiverReason] = useState(\"\");\n if (qaQuery.error) {\n return (\n <LocalConnectionRecovery\n error={qaQuery.error}\n onRetry={() => {\n void qaQuery.refetch();\n }}\n retrying={qaQuery.isFetching}\n />\n );\n }\n\n const qa = qaQuery.data;\n const latest: QARunView | undefined = qa?.runs.at(-1);\n if (qa === undefined || latest === undefined) return null;\n const evidence = qa.evidence.find(({ qaRunId }) => qaRunId === latest.id);\n const attachments = qa.attachments.filter(({ qaRunId }) => qaRunId === latest.id);\n const defects = qa.defects;\n const environment = evidence?.environment;\n const exhaustedCorrectionId = correctionGate?.correctionRunId ?? null;\n const exhaustedCorrection =\n exhaustedCorrectionId === null\n ? undefined\n : qa.correctionRuns.find(({ id }) => id === exhaustedCorrectionId);\n\n const submitWaiver = (event: SyntheticEvent<HTMLFormElement>): void => {\n event.preventDefault();\n if (selectedDefect === null || waiverReason.trim().length === 0) return;\n waiverMutation.mutate(\n { defect: selectedDefect, reason: waiverReason.trim() },\n {\n onSuccess: () => {\n setSelectedDefect(null);\n setWaiverReason(\"\");\n },\n },\n );\n };\n\n return (\n <section aria-label={t(\"qa.title\")} className=\"qa-panel\">\n <header className=\"qa-panel__heading\">\n <div>\n <span>{t(\"qa.planRevision\", { revision: latest.plan.revision })}</span>\n <strong>{t(\"qa.title\")}</strong>\n </div>\n <Badge tone={qaRunStatusTones[latest.status]}>{t(`qa.status.${latest.status}`)}</Badge>\n </header>\n\n {correctionGate !== null &&\n (correctionGate.correctionRunId === null || exhaustedCorrection?.status === \"EXHAUSTED\") ? (\n <div className=\"human-request-card\">\n <h3>{t(\"qa.correctionGate.title\")}</h3>\n <p>\n {exhaustedCorrection === undefined\n ? correctionGate.request.context\n : t(\"qa.correctionGate.description\", { ordinal: exhaustedCorrection.ordinal })}\n </p>\n {correctionGate.request.recommendation ? (\n <div className=\"human-request-card__recommendation\">\n <strong>{t(\"humanRequest.recommendation\")}</strong>\n <span>{correctionGate.request.recommendation}</span>\n </div>\n ) : null}\n {gateMutation.error ? <LocalConnectionRecovery error={gateMutation.error} /> : null}\n <div className=\"workflow-panel__actions\">\n {correctionGate.request.options.length === 2 ? (\n <Button\n disabled={gateMutation.isPending}\n loading={gateMutation.isPending && gateMutation.variables.action === \"AUTHORIZE_FINAL\"}\n onClick={() => {\n gateMutation.mutate({\n action: \"AUTHORIZE_FINAL\",\n correctionRun: exhaustedCorrection ?? null,\n request: correctionGate.request,\n run: correctionGate.run,\n });\n }}\n variant=\"primary\"\n >\n {t(\"qa.correctionGate.authorizeFinal\")}\n </Button>\n ) : null}\n <Button\n disabled={gateMutation.isPending}\n loading={gateMutation.isPending && gateMutation.variables.action === \"CANCEL\"}\n onClick={() => {\n gateMutation.mutate({\n action: \"CANCEL\",\n correctionRun: exhaustedCorrection ?? null,\n request: correctionGate.request,\n run: correctionGate.run,\n });\n }}\n variant=\"secondary\"\n >\n {t(\"qa.correctionGate.cancel\")}\n </Button>\n </div>\n </div>\n ) : null}\n\n <dl className=\"qa-panel__facts\">\n <div>\n <dt>{t(\"qa.tree\")}</dt>\n <dd>\n <code title={latest.testedTree}>{latest.testedTree.slice(0, 8)}</code>\n </dd>\n </div>\n <div>\n <dt>{t(\"qa.target\")}</dt>\n <dd>{latest.targetOrigin}</dd>\n </div>\n <div>\n <dt>{t(\"qa.environment\")}</dt>\n <dd>\n {environment\n ? `${environment.browserName} ${environment.browserVersion} · ${environment.osFamily} · Node ${environment.runtimeVersion}`\n : t(\"qa.notRun\")}\n </dd>\n </div>\n </dl>\n\n {latest.error ? <p className=\"qa-panel__error\">{latest.error.summary}</p> : null}\n\n {qa.correctionRuns.length > 0 ? (\n <div className=\"qa-panel__section\">\n <strong>{t(\"qa.correctionTimeline\")}</strong>\n <ol aria-label={t(\"qa.correctionTimeline\")} className=\"qa-correction-list\">\n {qa.correctionRuns.map((correction) => {\n const retestPlan = qa.retestPlans.find(\n (candidate) => candidate.correctionRunId === correction.id,\n );\n return (\n <li key={correction.id}>\n <div className=\"qa-correction__heading\">\n <strong>{t(\"qa.correction\", { ordinal: correction.ordinal })}</strong>\n <Badge tone={qaCorrectionStatusTones[correction.status]}>\n {t(`qa.correctionStatus.${correction.status}`)}\n </Badge>\n </div>\n <dl className=\"qa-correction__lineage\">\n <div>\n <dt>{t(\"qa.correctionSource\")}</dt>\n <dd>\n <code title={correction.sourceQARunId}>{correction.sourceQARunId}</code>\n <span>\n {t(\"qa.correctionTree\", { tree: correction.sourceTestedTree.slice(0, 8) })}\n </span>\n </dd>\n </div>\n <div>\n <dt>{t(\"qa.correctionEvidence\")}</dt>\n <dd>\n <code title={correction.sourceEvidenceBundleId}>\n {correction.sourceEvidenceBundleId}\n </code>\n </dd>\n </div>\n <div>\n <dt>{t(\"qa.correctionBaseline\")}</dt>\n <dd>\n <code title={correction.baselineQARunId}>{correction.baselineQARunId}</code>\n </dd>\n </div>\n </dl>\n {retestPlan ? (\n <div className=\"qa-correction__scope\">\n <strong>{t(\"qa.retestScope\", { count: retestPlan.cells.length })}</strong>\n <ol>\n {retestPlan.cells.map((cell) => (\n <li key={`${cell.targetId}:${cell.scenarioId}`}>\n <code>{cell.targetId}</code>\n <span aria-hidden=\"true\">/</span>\n <code>{cell.scenarioId}</code>\n <span className=\"qa-correction__reasons\">\n {cell.reasons.map((reason) => (\n <span key={reason}>{t(`qa.retestReason.${reason}`)}</span>\n ))}\n </span>\n </li>\n ))}\n </ol>\n </div>\n ) : null}\n </li>\n );\n })}\n </ol>\n </div>\n ) : null}\n\n <div className=\"qa-panel__section\">\n <strong>{t(\"qa.matrix\")}</strong>\n <ol className=\"qa-matrix\">\n {latest.plan.targets.flatMap((target) =>\n latest.plan.scenarios.map((scenario) => {\n const execution = evidence?.executions.find(\n (candidate) => candidate.targetId === target.id && candidate.scenarioId === scenario.id,\n );\n const failedAssertions =\n execution?.assertions.filter(({ status }) => status === \"FAILED\") ?? [];\n const failedSteps = execution?.steps.filter(({ status }) => status === \"FAILED\") ?? [];\n const passed =\n execution !== undefined && failedAssertions.length === 0 && failedSteps.length === 0;\n return (\n <li key={`${target.id}:${scenario.id}`}>\n <div className=\"qa-matrix__heading\">\n <div>\n <strong>{scenario.title}</strong>\n <span>\n {target.viewport.width}×{target.viewport.height} · {target.locale} ·{\" \"}\n {t(target.theme === \"LIGHT\" ? \"theme.light\" : \"theme.dark\")}\n </span>\n </div>\n <Badge tone={execution === undefined ? \"neutral\" : passed ? \"success\" : \"danger\"}>\n {execution === undefined\n ? t(\"qa.notRun\")\n : t(passed ? \"qa.status.PASSED\" : \"qa.status.FAILED\")}\n </Badge>\n </div>\n {execution ? (\n <span className=\"qa-matrix__progress\">\n {t(\"qa.scenarioProgress\", {\n steps: execution.steps.length,\n assertions: execution.assertions.length,\n })}\n </span>\n ) : null}\n {failedAssertions.length > 0 ? (\n <ul className=\"qa-matrix__failures\">\n {failedAssertions.map((assertion) => {\n const plan = scenario.assertions.find(({ id }) => id === assertion.id);\n return (\n <li key={assertion.id}>\n {t(\"qa.assertionFailed\", { title: plan?.title ?? assertion.id })}\n {assertion.details ? <span>{assertion.details}</span> : null}\n </li>\n );\n })}\n </ul>\n ) : null}\n </li>\n );\n }),\n )}\n </ol>\n </div>\n\n {evidence && evidence.observations.length > 0 ? (\n <div className=\"qa-panel__section\">\n <strong>{t(\"qa.observations\")}</strong>\n <ul className=\"qa-observation-list\">\n {evidence.observations.map((observation, index) => (\n <li key={`${observation.targetId}:${observation.scenarioId}:${index.toString()}`}>\n <span>\n <Badge tone={qaObservationTones[observation.severity]}>\n {t(`qa.observation.${observation.kind}`)}\n </Badge>\n {observation.blocking ? <Badge tone=\"danger\">{t(\"qa.blocking\")}</Badge> : null}\n </span>\n <p>{observation.summary}</p>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {defects.length > 0 ? (\n <div className=\"qa-panel__section\">\n <strong>{t(\"qa.defects\")}</strong>\n <ol className=\"qa-defect-list\">\n {defects.map((defect) => (\n <li key={defect.id}>\n <div>\n <strong>{defect.title}</strong>\n <span className=\"qa-defect__badges\">\n <Badge tone={qaDefectTones[defect.severity]}>\n {t(`review.severity.${defect.severity}`)}\n </Badge>\n <Badge tone={qaDefectStatusTones[defect.status]}>\n {t(`qa.defectStatus.${defect.status}`)}\n </Badge>\n </span>\n </div>\n <p>{defect.description}</p>\n <span>\n <strong>{t(\"qa.reproduction\")}: </strong>\n {defect.reproduction.join(\" · \")}\n </span>\n {defect.status === \"OPEN\" ? (\n <div className=\"qa-defect__actions\">\n <Button\n onClick={() => {\n waiverMutation.reset();\n setWaiverReason(\"\");\n setSelectedDefect(defect);\n }}\n size=\"sm\"\n variant=\"secondary\"\n >\n {t(\"qa.waive\")}\n </Button>\n </div>\n ) : defect.resolutionReason ? (\n <p className=\"qa-defect__resolution\">{defect.resolutionReason}</p>\n ) : null}\n {defect.status === \"RESOLVED\" && defect.resolvedByQARunId ? (\n <span className=\"qa-defect__provenance\">\n <strong>{t(\"qa.resolvedBy\")}: </strong>\n <code title={defect.resolvedByQARunId}>{defect.resolvedByQARunId}</code>\n </span>\n ) : null}\n {selectedDefect?.id === defect.id ? (\n <form className=\"qa-defect-waiver\" onSubmit={submitWaiver}>\n <Field htmlFor={`qa-defect-waiver-${defect.id}`} label={t(\"qa.waiverReason\")}>\n <Textarea\n autoFocus\n id={`qa-defect-waiver-${defect.id}`}\n maxLength={4_000}\n onChange={(event) => {\n setWaiverReason(event.currentTarget.value);\n }}\n placeholder={t(\"qa.waiverReasonPlaceholder\")}\n rows={3}\n value={waiverReason}\n />\n </Field>\n {waiverMutation.error ? <LocalConnectionRecovery error={waiverMutation.error} /> : null}\n <div>\n <Button\n disabled={waiverReason.trim().length === 0}\n loading={waiverMutation.isPending}\n size=\"sm\"\n type=\"submit\"\n variant=\"primary\"\n >\n {t(\"qa.confirmWaive\")}\n </Button>\n <Button\n disabled={waiverMutation.isPending}\n onClick={() => {\n setSelectedDefect(null);\n setWaiverReason(\"\");\n }}\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n >\n {t(\"action.cancel\")}\n </Button>\n </div>\n </form>\n ) : null}\n </li>\n ))}\n </ol>\n </div>\n ) : null}\n\n {attachments.length > 0 ? (\n <div className=\"qa-panel__section\">\n <strong>{t(\"qa.attachments\")}</strong>\n <ul className=\"qa-attachment-list\">\n {attachments.map((attachment) => (\n <li key={attachment.id}>\n <span>{t(`qa.attachment.${attachment.kind}`)}</span>\n <a href={workItemQAAttachmentUrl(item.id, attachment.id)} rel=\"noreferrer\" target=\"_blank\">\n {t(\"qa.openAttachment\")}\n <Icon name=\"external\" size={13} />\n </a>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </section>\n );\n};\n\nconst AcceptancePanel = ({\n acceptancePackage,\n artifacts,\n item,\n run,\n}: {\n acceptancePackage: AcceptancePackage;\n artifacts: readonly EvidenceArtifact[];\n item: WorkItem;\n run: PipelineRun;\n}): React.JSX.Element => {\n const { t } = useI18n();\n const resolveMutation = useResolveAcceptance();\n const [lastAction, setLastAction] = useState<AcceptanceAction | null>(null);\n const resolve = (action: AcceptanceAction): void => {\n setLastAction(action);\n resolveMutation.mutate({ acceptancePackage, action, run, workItem: item });\n };\n\n return (\n <div className=\"acceptance-package\">\n <div className=\"acceptance-package__heading\">\n <div className=\"acceptance-package__title\">\n <span>{t(\"acceptance.eyebrow\")}</span>\n <h3>{t(\"acceptance.title\")}</h3>\n </div>\n <div className=\"acceptance-package__heading-actions\">\n <Status\n label={t(acceptanceStatusLabelKeys[acceptancePackage.status])}\n tone={acceptanceStatusTones[acceptancePackage.status]}\n />\n <a\n className=\"acceptance-package__export\"\n download\n href={workItemAcceptanceExportUrl(item.id, acceptancePackage.id)}\n >\n <Icon name=\"external\" size={13} />\n {t(\"acceptance.export\")}\n </a>\n </div>\n </div>\n <p>{acceptancePackage.releaseNote}</p>\n\n <div className=\"acceptance-evidence\" aria-label={t(\"acceptance.evidence\")}>\n {artifacts.map((artifact) => (\n <article key={artifact.id}>\n <div>\n <Icon name=\"check\" size={13} />\n <strong>\n {artifact.kind === \"REVIEW_REPORT\"\n ? t(\"acceptance.reviewEvidence\")\n : t(\"acceptance.qaEvidence\")}\n </strong>\n </div>\n <span>{artifact.summary}</span>\n <small>{t(\"acceptance.checks\", { count: artifact.checks.length })}</small>\n </article>\n ))}\n </div>\n\n <div className=\"acceptance-matrix\">\n <strong>{t(\"acceptance.matrix\")}</strong>\n {acceptancePackage.criteria.length > 0 ? (\n <ol>\n {acceptancePackage.criteria.map((criterion, index) => {\n const bound = criterion.reviewCheck !== undefined && criterion.qaCheck !== undefined;\n return (\n <li key={`${index.toString()}:${criterion.criterion}`}>\n <div>\n <Icon name={bound ? \"check\" : \"warning\"} size={13} />\n <strong>{criterion.criterion}</strong>\n </div>\n {!bound ? (\n <span className=\"acceptance-matrix__legacy\">{t(\"acceptance.legacyEvidence\")}</span>\n ) : null}\n <dl>\n <div>\n <dt>{t(\"acceptance.implementation\")}</dt>\n <dd>{criterion.implementation}</dd>\n </div>\n {bound ? (\n <>\n <div>\n <dt>{t(\"acceptance.reviewCheck\")}</dt>\n <dd>{criterion.reviewCheck}</dd>\n </div>\n <div>\n <dt>{t(\"acceptance.qaCheck\")}</dt>\n <dd>{criterion.qaCheck}</dd>\n </div>\n </>\n ) : null}\n <div>\n <dt>{t(\"acceptance.ownerVerification\")}</dt>\n <dd>{criterion.verification}</dd>\n </div>\n <div>\n <dt>{t(\"acceptance.knownRisk\")}</dt>\n <dd>{criterion.knownRisk ?? t(\"acceptance.noKnownRisk\")}</dd>\n </div>\n </dl>\n </li>\n );\n })}\n </ol>\n ) : (\n <span>{t(\"acceptance.noCriteria\")}</span>\n )}\n </div>\n\n {resolveMutation.error ? (\n <LocalConnectionRecovery\n error={resolveMutation.error}\n onRetry={() => {\n if (lastAction) resolve(lastAction);\n }}\n retrying={resolveMutation.isPending}\n />\n ) : null}\n {acceptancePackage.status === \"PENDING\" ? (\n <div className=\"acceptance-package__actions\">\n <Button\n disabled={resolveMutation.isPending}\n loading={resolveMutation.isPending && lastAction === \"ACCEPT\"}\n onClick={() => {\n resolve(\"ACCEPT\");\n }}\n variant=\"primary\"\n >\n {t(\"acceptance.accept\")}\n </Button>\n <Button\n disabled={resolveMutation.isPending}\n loading={resolveMutation.isPending && lastAction === \"RETURN_TO_WORK\"}\n onClick={() => {\n resolve(\"RETURN_TO_WORK\");\n }}\n >\n {t(\"acceptance.return\")}\n </Button>\n <Button\n disabled={resolveMutation.isPending}\n loading={resolveMutation.isPending && lastAction === \"REJECT\"}\n onClick={() => {\n resolve(\"REJECT\");\n }}\n >\n {t(\"acceptance.reject\")}\n </Button>\n </div>\n ) : null}\n </div>\n );\n};\n\n// The skeleton is shared by the workflow section and by the whole-inspector loading state; only the\n// outermost loading container announces itself, so the label - and with it the live region - is optional.\nconst WorkflowSkeleton = ({ label }: { label?: string }): React.JSX.Element => (\n <div\n aria-label={label}\n className=\"inspector-workflow-skeleton\"\n role={label === undefined ? undefined : \"status\"}\n >\n <div className=\"inspector-workflow-skeleton__status\">\n <Skeleton width=\"42%\" />\n <Skeleton width=\"68px\" />\n </div>\n <div className=\"inspector-workflow-skeleton__panel\">\n <div>\n <Skeleton width=\"48%\" />\n <Skeleton width=\"54px\" />\n </div>\n <Skeleton className=\"inspector-workflow-skeleton__meter\" width=\"100%\" />\n <Skeleton width=\"36%\" />\n </div>\n <div className=\"inspector-workflow-skeleton__steps\">\n <Skeleton width=\"58%\" />\n <Skeleton width=\"44%\" />\n </div>\n </div>\n);\n\n// Spec D5's accepted price: splitting the attempt from its execution unit means a healthy long\n// stage no longer looks like a series of failures, but only if the cockpit shows the nesting it\n// introduced. `session.status === \"RUNNING\"` is checked first because a running session always\n// carries a null endReason, which the switch below still has to type-check against.\nconst sessionStatusPresentation = (\n session: ProviderSession,\n t: Translator,\n): { label: string; tone: StatusTone } => {\n if (session.status === \"RUNNING\") return { label: t(\"workflow.sessions.status.RUNNING\"), tone: \"running\" };\n switch (session.endReason) {\n case \"COMPLETED\":\n return { label: t(\"workflow.sessions.status.COMPLETED\"), tone: \"complete\" };\n case \"HANDOFF\":\n return { label: t(\"workflow.sessions.status.HANDOFF\"), tone: \"waiting\" };\n case \"CONTEXT_EXHAUSTED\":\n return { label: t(\"workflow.sessions.status.CONTEXT_EXHAUSTED\"), tone: \"paused\" };\n case \"INTERRUPTED\":\n return { label: t(\"workflow.sessions.status.INTERRUPTED\"), tone: \"paused\" };\n case \"CANCELLED\":\n return { label: t(\"workflow.sessions.status.CANCELLED\"), tone: \"queued\" };\n case null:\n return { label: t(\"workflow.stage.other\"), tone: \"queued\" };\n }\n};\n\n// Spec §8: a checkpoint is provider output Loomrail feeds into the next session's context, and it\n// mitigates a High-rated threat only if the owner can read what is actually being carried forward\n// -- so every list renders here, not just a summary line, and an empty list is left out rather than\n// shown as a hollow heading.\nconst checkpointGroups = (checkpoint: Checkpoint, t: Translator): readonly CheckpointGroup[] => [\n { label: t(\"workflow.checkpoints.completed\"), items: checkpoint.completed },\n { label: t(\"workflow.checkpoints.remaining\"), items: checkpoint.remaining },\n { label: t(\"workflow.checkpoints.deadEnds\"), items: checkpoint.deadEnds },\n { label: t(\"workflow.checkpoints.openQuestions\"), items: checkpoint.openQuestions },\n];\n\n/**\n * The sessions inside the current stage attempt (spec §D5), with the highest window occupancy each\n * session reached, whether a handoff was requested, and the full text of every checkpoint it\n * published.\n * Renders nothing while there is no attempt to nest sessions under, or once it has none yet -- a\n * brand-new attempt has not started its first session, and an empty \"Sessions\" heading would just\n * be noise.\n */\nconst AttemptSessionsPanel = ({ attempt }: { attempt: StageAttempt }): React.JSX.Element | null => {\n const { locale, t } = useI18n();\n const sessionsQuery = useStageAttemptSessions(attempt.id);\n const capabilitiesQuery = useProviderCapabilities();\n const sessions = sessionsQuery.data?.sessions ?? [];\n const checkpoints = sessionsQuery.data?.checkpoints ?? [];\n const usageReports = sessionsQuery.data?.usageReports ?? [];\n const peakContextWindowUsage = sessionsQuery.data?.peakContextWindowUsage ?? {};\n\n if (sessions.length === 0) return null;\n\n // The single most recently published checkpoint across the whole attempt -- the one that would\n // feed the next session's context right now -- opens by default; every earlier one stays\n // collapsed behind its own summary rather than crowding the panel.\n const mostRecentCheckpointId = checkpoints.reduce<{ id: string; createdAt: string } | null>(\n (latest, checkpoint) =>\n latest === null || checkpoint.createdAt > latest.createdAt\n ? { id: checkpoint.id, createdAt: checkpoint.createdAt }\n : latest,\n null,\n )?.id;\n\n const sessionViewModels: ProviderSessionViewModel[] = [...sessions]\n .sort((a, b) => a.ordinal - b.ordinal)\n .map((session) => {\n const presentation = sessionStatusPresentation(session, t);\n const usage = peakContextWindowUsage[session.id];\n const spend = usageReports.find((report) => report.providerSessionId === session.id);\n const occupancyPercent = usage ? Math.round((usage.usedTokens / usage.windowTokens) * 100) : undefined;\n const sessionCheckpoints: CheckpointViewModel[] = checkpoints\n .filter((checkpoint) => checkpoint.providerSessionId === session.id)\n .sort((a, b) => a.ordinal - b.ordinal)\n .map((checkpoint) => ({\n id: checkpoint.id,\n summary: checkpoint.summary,\n timeLabel: eventTime(checkpoint.createdAt, locale),\n defaultOpen: checkpoint.id === mostRecentCheckpointId,\n groups: checkpointGroups(checkpoint, t),\n }));\n\n return {\n id: session.id,\n ordinal: session.ordinal,\n ariaLabel: t(\"workflow.sessions.ordinal\", { ordinal: session.ordinal }),\n statusLabel: presentation.label,\n tone: presentation.tone,\n checkpoints: sessionCheckpoints,\n // exactOptionalPropertyTypes: an optional field left undefined must be omitted, not set to\n // undefined, so each one is spread in only when it has a real value.\n ...(session.handoffRequestedAt !== null\n ? { handoffRequestedLabel: t(\"workflow.sessions.handoffRequested\") }\n : {}),\n // Spec §4.3 and §5.2 make `usageQuality` the thing that separates a measured occupancy from\n // a guessed one; dropping it here rendered a measured 92% and an estimated 92% identically.\n //\n // Occupancy is saved on every report, not only on the one that crosses the threshold, so\n // the number no longer implies a handoff and the label must not claim one -- a session\n // still running at 40% would have read as having handed off. A session that did ask for a\n // handoff stopped reporting at that moment, so its peak really is the reading at handoff\n // and keeps saying so; for every other session the honest thing to name is the peak.\n // e2e/attempt-nesting.spec.ts renders both branches.\n ...(occupancyPercent === undefined || usage === undefined\n ? {}\n : {\n occupancyPercent,\n occupancyLabel: t(\n session.handoffRequestedAt === null\n ? \"workflow.sessions.occupancyPeak\"\n : \"workflow.sessions.occupancyAtHandoff\",\n { percent: occupancyPercent },\n ),\n occupancyQualityLabel: t(usageQualityLabelKeys[usage.quality]),\n }),\n ...(spend === undefined\n ? {}\n : {\n usageLabel: t(\"workflow.sessions.tokenUsage\", {\n total: spend.totalTokens.toLocaleString(locale),\n input: spend.inputTokens.toLocaleString(locale),\n output: spend.outputTokens.toLocaleString(locale),\n cached:\n spend.cachedInputTokens === null\n ? t(\"workflow.sessions.cacheUnknown\")\n : spend.cachedInputTokens.toLocaleString(locale),\n uncached:\n spend.cachedInputTokens === null || spend.cachedInputTokens > spend.inputTokens\n ? t(\"workflow.sessions.cacheUnknown\")\n : (spend.inputTokens - spend.cachedInputTokens + spend.outputTokens).toLocaleString(\n locale,\n ),\n }),\n usageQualityLabel: t(usageQualityLabelKeys[spend.quality]),\n ...(spend.costUsd === null\n ? {}\n : {\n usageCostLabel: t(\"workflow.sessions.tokenCost\", {\n cost: spend.costUsd.toLocaleString(locale, {\n style: \"currency\",\n currency: \"USD\",\n maximumFractionDigits: 4,\n }),\n }),\n }),\n }),\n ...(sessionCheckpoints.length === 0\n ? { emptyCheckpointsLabel: t(\"workflow.checkpoints.empty\") }\n : {}),\n };\n });\n\n const attemptHeader: ProviderSessionTimelineAttempt = {\n heading: t(\"workflow.sessions.attemptHeading\", { attempt: attempt.attempt }),\n statusLabel: stageAttemptStatusLabel(attempt, t),\n tone: stageAttemptStatusTones[attempt.status],\n };\n\n return (\n <ProviderSessionTimeline\n attempt={attemptHeader}\n {...(capabilitiesQuery.data?.checkpointOnRequest === false\n ? { note: t(\"workflow.sessions.noCheckpointOnRequest\") }\n : {})}\n sessions={sessionViewModels}\n title={t(\"workflow.sessions.title\")}\n />\n );\n};\n\nconst workspaceStatusLabelKeys: Record<WorkItemWorkspaceStatus, TranslationKey> = {\n READY: \"workspace.status.READY\",\n ORPHANED: \"workspace.status.ORPHANED\",\n REMOVED: \"workspace.status.REMOVED\",\n};\n\nconst workspaceStatusTones: Record<WorkItemWorkspaceStatus, StatusTone> = {\n READY: \"ready\",\n ORPHANED: \"paused\",\n REMOVED: \"queued\",\n};\n\n/**\n * How much of the base commit the card prints.\n *\n * Twelve hex characters, not forty and not seven. The owner's use for this value is pasting it into\n * `git show`, and git resolves any unambiguous prefix, so the question is only how long a prefix\n * stays unambiguous. Seven -- git's own `--oneline` default -- collides in large repositories;\n * twelve is what `core.abbrev=auto` grows towards well past a million objects. The full forty\n * characters would wrap to a second line in a 320px inspector column and buy nothing, since a\n * prefix and the full id resolve identically.\n *\n * The complete sha is still on the element's `title`, so nothing is hidden -- only unprinted.\n */\nconst baseCommitDisplayLength = 12;\n\n/**\n * Where this work item's agent writes: the repository, the branch, the base commit it was cut from,\n * and the worktree path.\n *\n * Returns null rather than an empty panel when the item has no workspace. A prose-only stage and an\n * item before its first code stage both genuinely have none, and headings standing over blanks read\n * as a load that failed rather than as an absence -- so the section itself lives in here, not\n * around the call site.\n *\n * The paths are deliberately not in the `RunSummary` grid the overview above uses. That grid gives\n * a value roughly half the inspector's width and clips what does not fit, which for the one field\n * the owner is here to copy -- the worktree path -- would mean an ellipsis where an actionable\n * directory should be. They get full-width rows that wrap instead, so the whole path is on screen\n * and selectable in one drag.\n */\nconst WorkspacePanel = ({ item }: { item: WorkItem }): React.JSX.Element | null => {\n const { t } = useI18n();\n const { projects } = useWorkspace();\n // The published shape, not the stored one: the route deliberately does not send `leaseHolder`, and\n // the card has no use for it.\n const workspace: PublishedWorkItemWorkspace | null = useWorkItemWorkspace(item.id).data?.workspace ?? null;\n\n if (!workspace) return null;\n\n // The Project names the repository the branch actually lives in -- the worktree is a checkout of\n // it, not a repository of its own -- which is where an owner goes to delete the branch or merge\n // it. Read from the Project list the app already holds rather than added to the workspace\n // response, since the workspace row records no repository path of its own.\n const project = projects.find((candidate) => candidate.id === item.projectId) ?? null;\n\n return (\n <InspectorSection title={t(\"workspace.title\")}>\n <div className=\"workspace-identity\">\n <RunSummary\n properties={[\n {\n label: t(\"workspace.state\"),\n value: (\n <Status\n label={t(workspaceStatusLabelKeys[workspace.status])}\n tone={workspaceStatusTones[workspace.status]}\n />\n ),\n },\n {\n label: t(\"workspace.mode\"),\n value: t(`workspace.mode.${workspace.strategy}`),\n },\n {\n label: t(\"workspace.baseCommit\"),\n value:\n workspace.baseCommit === null ? (\n t(\"workspace.baseCommit.none\")\n ) : (\n <code className=\"workspace-identity__sha\" title={workspace.baseCommit}>\n {workspace.baseCommit.slice(0, baseCommitDisplayLength)}\n </code>\n ),\n },\n ]}\n />\n <dl className=\"workspace-identity__locations\">\n {project && workspace.strategy === \"ISOLATED_WORKTREE\" ? (\n <div>\n <dt>{t(\"workspace.repository\")}</dt>\n <dd>{project.repositoryPath}</dd>\n </div>\n ) : null}\n <div>\n <dt>{t(\"workspace.branch\")}</dt>\n <dd>{workspace.branch}</dd>\n </div>\n <div>\n <dt>\n {t(\n workspace.strategy === \"SHARED_CURRENT_DIRECTORY\"\n ? \"workspace.workingDirectory\"\n : \"workspace.worktree\",\n )}\n </dt>\n <dd>{workspace.worktreePath}</dd>\n </div>\n </dl>\n {workspace.status === \"READY\" ? null : (\n // No action offered, because there is none: ORPHANED is terminal -- nothing in Loomrail\n // returns a workspace to READY (session-loop.ts, workspaceNotReadyRefusal) -- and a\n // button that cannot work is worse than the plain fact.\n <p className=\"workspace-identity__note\" role=\"status\">\n {t(\n workspace.strategy === \"SHARED_CURRENT_DIRECTORY\"\n ? \"workspace.sharedNotReady\"\n : \"workspace.notReady\",\n )}\n </p>\n )}\n <p className=\"inspector-copy\">\n {t(\n workspace.strategy === \"SHARED_CURRENT_DIRECTORY\"\n ? \"workspace.sharedUncommitted\"\n : \"workspace.uncommitted\",\n )}\n </p>\n </div>\n </InspectorSection>\n );\n};\n\nconst modelTiers = [\"FAST\", \"STANDARD\", \"DEEP\"] as const;\n\nconst modelPolicyOptions = (\n selection: ProjectProviderSelectionResponse | undefined,\n t: Translator,\n): readonly { description?: string; label: string; value: ModelTier }[] =>\n modelTiers.map((tier) => {\n if (selection === undefined) {\n return { label: t(`workflow.modelTier.${tier}`), value: tier };\n }\n const preference = selection.selection.preference;\n if (preference === \"CODEX\" || preference === \"CLAUDE_CODE\") {\n const provider = selection.providers.find(({ provider: id }) => id === preference);\n const model = provider?.models?.[tier];\n if (model !== undefined) {\n return {\n description: t(\"workflow.model.providerDescription\", {\n provider: preference === \"CODEX\" ? \"Codex\" : \"Claude Code\",\n tier: t(`workflow.modelTier.${tier}`),\n }),\n label: model,\n value: tier,\n };\n }\n }\n if (preference === \"AUTO\") {\n const codex = selection.providers.find(({ provider }) => provider === \"CODEX\")?.models?.[tier];\n const claude = selection.providers.find(({ provider }) => provider === \"CLAUDE_CODE\")?.models?.[tier];\n if (codex !== undefined && claude !== undefined) {\n return {\n description: t(\"workflow.model.autoDescription\", { claude, codex }),\n label: t(\"workflow.model.autoOption\", { tier: t(`workflow.modelTier.${tier}`) }),\n value: tier,\n };\n }\n }\n return {\n description: t(\"workflow.model.loading\"),\n label: t(`workflow.modelTier.${tier}`),\n value: tier,\n };\n });\n\nconst workflowIsActive = (snapshot: ReturnType<typeof useWorkItemWorkflow>[\"data\"]): boolean =>\n snapshot === undefined ||\n [\"RUNNING\", \"WAITING_HUMAN\", \"SOFT_PAUSED\", \"HARD_PAUSED\", \"INTERRUPTED\"].includes(\n snapshot.run?.status ?? \"\",\n );\n\nconst DependencyPanel = ({ item }: { item: WorkItem }): React.JSX.Element => {\n const { t } = useI18n();\n const workItemsQuery = useProjectWorkItems(item.projectId);\n const dependenciesQuery = useProjectWorkItemDependencies(item.projectId);\n const workflowQuery = useWorkItemWorkflow(item.id);\n const mutation = useSetWorkItemDependencies();\n const [open, setOpen] = useState(false);\n const [selectedIds, setSelectedIds] = useState<readonly string[]>([]);\n const projectWorkItems = workItemsQuery.data?.workItems ?? [];\n const dependencies = dependenciesQuery.data?.dependencies ?? [];\n const view = deriveWorkItemDependencyView(item, projectWorkItems, dependencies);\n const candidateBlockers = projectWorkItems.filter(({ id }) => id !== item.id);\n const currentIds = view.blockers.map(({ id }) => id).sort();\n const nextIds = [...selectedIds].sort();\n const changed =\n currentIds.length !== nextIds.length || currentIds.some((id, index) => id !== nextIds[index]);\n const editingDisabled =\n workflowIsActive(workflowQuery.data) ||\n item.state === \"DONE\" ||\n item.state === \"CANCELLED\" ||\n workItemsQuery.isPending ||\n dependenciesQuery.isPending ||\n workItemsQuery.isError ||\n dependenciesQuery.isError;\n\n const renderItems = (items: readonly WorkItem[], emptyKey: TranslationKey): React.JSX.Element =>\n items.length === 0 ? (\n <span className=\"dependency-graph__empty\">{t(emptyKey)}</span>\n ) : (\n <ul className=\"dependency-graph__list\">\n {items.map((candidate) => (\n <li key={candidate.id}>\n <span>{candidate.title}</span>\n <Status label={stateLabel(candidate.state, t)} tone={stateTones[candidate.state]} />\n </li>\n ))}\n </ul>\n );\n\n return (\n <InspectorSection\n action={\n <DialogSurface\n closeLabel={t(\"action.closeDialog\")}\n description={t(\"dependency.editDescription\")}\n footer={\n <>\n <Button\n disabled={mutation.isPending}\n onClick={() => {\n setOpen(false);\n mutation.reset();\n }}\n >\n {t(\"action.cancel\")}\n </Button>\n <Button\n disabled={!changed}\n loading={mutation.isPending}\n onClick={() => {\n if (!changed) return;\n mutation.mutate(\n { blockerWorkItemIds: nextIds, workItem: item },\n {\n onSuccess: () => {\n setOpen(false);\n },\n },\n );\n }}\n variant=\"primary\"\n >\n {t(\"dependency.save\")}\n </Button>\n </>\n }\n onOpenChange={(nextOpen) => {\n if (nextOpen) {\n setSelectedIds(currentIds);\n mutation.reset();\n }\n setOpen(nextOpen);\n }}\n open={open}\n title={t(\"dependency.edit\")}\n trigger={\n <Button disabled={editingDisabled} icon=\"edit\" size=\"sm\" variant=\"surface\">\n {t(\"dependency.edit\")}\n </Button>\n }\n >\n {mutation.error ? (\n <LocalConnectionRecovery\n error={mutation.error}\n onRetry={() => {\n mutation.mutate({ blockerWorkItemIds: nextIds, workItem: item });\n }}\n retrying={mutation.isPending}\n />\n ) : null}\n <div className=\"dependency-dialog-list\" role=\"group\" aria-label={t(\"dependency.blockedBy\")}>\n {candidateBlockers.length === 0 ? (\n <p className=\"inspector-copy\">{t(\"dependency.noCandidates\")}</p>\n ) : (\n candidateBlockers.map((candidate) => (\n <Checkbox\n checked={selectedIds.includes(candidate.id)}\n description={stateLabel(candidate.state, t)}\n key={candidate.id}\n label={candidate.title}\n onCheckedChange={(checked) => {\n setSelectedIds((current) =>\n checked === true\n ? [...current.filter((id) => id !== candidate.id), candidate.id]\n : current.filter((id) => id !== candidate.id),\n );\n }}\n />\n ))\n )}\n </div>\n </DialogSurface>\n }\n title={t(\"dependency.title\")}\n >\n {dependenciesQuery.error || workItemsQuery.error ? (\n <LocalConnectionRecovery\n error={dependenciesQuery.error ?? workItemsQuery.error}\n onRetry={() => {\n void dependenciesQuery.refetch();\n void workItemsQuery.refetch();\n }}\n retrying={dependenciesQuery.isFetching || workItemsQuery.isFetching}\n />\n ) : dependenciesQuery.isPending || workItemsQuery.isPending ? (\n <p className=\"inspector-copy\">{t(\"dependency.loading\")}</p>\n ) : (\n <dl className=\"dependency-graph\">\n <div>\n <dt>{t(\"dependency.parent\")}</dt>\n <dd>{view.parent?.title ?? t(\"dependency.none\")}</dd>\n </div>\n <div>\n <dt>{t(\"dependency.children\")}</dt>\n <dd>{renderItems(view.children, \"dependency.noChildren\")}</dd>\n </div>\n <div>\n <dt>{t(\"dependency.blockedBy\")}</dt>\n <dd>{renderItems(view.blockers, \"dependency.noBlockers\")}</dd>\n </div>\n <div>\n <dt>{t(\"dependency.blocks\")}</dt>\n <dd>{renderItems(view.blockedWorkItems, \"dependency.blocksNone\")}</dd>\n </div>\n </dl>\n )}\n {!dependenciesQuery.isPending && !workItemsQuery.isPending && editingDisabled ? (\n <p className=\"inspector-copy\">{t(\"dependency.editUnavailable\")}</p>\n ) : null}\n </InspectorSection>\n );\n};\n\nconst WorkflowPanel = ({ item }: { item: WorkItem }): React.JSX.Element => {\n const { t } = useI18n();\n const workflowQuery = useWorkItemWorkflow(item.id);\n const providerSelectionQuery = useProjectProviderSelection(item.projectId);\n const workItemsQuery = useProjectWorkItems(item.projectId);\n const dependenciesQuery = useProjectWorkItemDependencies(item.projectId);\n const startMutation = useStartPipeline();\n const controlMutation = usePipelineControl();\n const overrideMutation = useApproveBudgetOverride();\n const [lastAction, setLastAction] = useState<\"pause\" | \"resume\" | \"cancel\" | \"override\" | null>(null);\n const [budgetLimitInput, setBudgetLimitInput] = useState(String(suggestedPipelineBudget));\n const [agentRunLimitInput, setAgentRunLimitInput] = useState(String(suggestedAgentRunBudget));\n const [modelTierOverride, setModelTierOverride] = useState<ModelTier>(\"FAST\");\n const [codeBlind, setCodeBlind] = useState(false);\n const [coordinatorOutcome, setCoordinatorOutcome] = useState(\"\");\n const coordinatorOutcomeValid =\n !codeBlind ||\n codeBlindOrchestrationSchema.safeParse({ mode: \"CODE_BLIND\", ownerOutcome: coordinatorOutcome }).success;\n const coordinatorEnabled = codeBlind || workflowQuery.data?.orchestration !== undefined;\n const displayedModelTier = coordinatorEnabled ? \"DEEP\" : modelTierOverride;\n const modelOptions = coordinatorEnabled\n ? [\n {\n value: \"DEEP\",\n label: \"Astra → Luna / Sonnet\",\n description: \"gpt-6-astra → gpt-5.6-luna / claude-sonnet-5\",\n },\n ]\n : modelPolicyOptions(providerSelectionQuery.data, t);\n const selectedModelDescription = modelOptions.find(\n ({ value }) => value === displayedModelTier,\n )?.description;\n const dependencyDataReady = workItemsQuery.data !== undefined && dependenciesQuery.data !== undefined;\n const dependencyView = deriveWorkItemDependencyView(\n item,\n workItemsQuery.data?.workItems ?? [],\n dependenciesQuery.data?.dependencies ?? [],\n );\n const dependencyDataFailed = workItemsQuery.isError || dependenciesQuery.isError;\n const snapshot = workflowQuery.data;\n const budgetPolicy = snapshot?.budgetPolicies.at(-1) ?? null;\n const persistedPolicyValues = budgetPolicy === null ? null : workflowPolicyFormValues(budgetPolicy);\n const persistedBudgetLimitInput = persistedPolicyValues?.budgetLimitInput ?? null;\n const persistedAgentRunLimitInput = persistedPolicyValues?.agentRunLimitInput ?? null;\n const persistedModelTierOverride = persistedPolicyValues?.modelTierOverride ?? null;\n useEffect(() => {\n if (\n persistedBudgetLimitInput === null ||\n persistedAgentRunLimitInput === null ||\n persistedModelTierOverride === null\n ) {\n return;\n }\n setBudgetLimitInput(persistedBudgetLimitInput);\n setAgentRunLimitInput(persistedAgentRunLimitInput);\n setModelTierOverride(persistedModelTierOverride);\n }, [persistedAgentRunLimitInput, persistedBudgetLimitInput, persistedModelTierOverride]);\n const parsedBudgetLimit = Number(budgetLimitInput);\n const parsedAgentRunLimit = Number(agentRunLimitInput);\n const budgetLimitIsValid = Number.isSafeInteger(parsedBudgetLimit) && parsedBudgetLimit > 0;\n const agentRunLimitIsValid =\n Number.isSafeInteger(parsedAgentRunLimit) &&\n parsedAgentRunLimit > 0 &&\n parsedAgentRunLimit <= parsedBudgetLimit;\n const startWorkflow = (): void => {\n if (\n !budgetLimitIsValid ||\n !coordinatorOutcomeValid ||\n !agentRunLimitIsValid ||\n !dependencyDataReady ||\n dependencyDataFailed ||\n dependencyView.children.length > 0 ||\n dependencyView.unsatisfiedBlockers.length > 0\n )\n return;\n startMutation.mutate({\n policy: {\n maxEstimatedTokens: parsedBudgetLimit,\n modelTierOverride,\n agentRunMaxEstimatedTokensOverride: parsedAgentRunLimit,\n ...(codeBlind\n ? {\n orchestration: codeBlindOrchestrationSchema.parse({\n mode: \"CODE_BLIND\",\n ownerOutcome: coordinatorOutcome,\n }),\n }\n : {}),\n },\n workItem: item,\n });\n };\n const openRequest =\n snapshot?.humanRequests.find(\n ({ id, status }) => status === \"OPEN\" && id !== snapshot.acceptancePackage?.humanRequestId,\n ) ?? null;\n\n if (workflowQuery.isPending) {\n return <WorkflowSkeleton label={t(\"workflow.loading\")} />;\n }\n\n if (!snapshot?.run) {\n return (\n <div className=\"workflow-start\">\n <p className=\"inspector-copy\">\n {dependencyDataFailed\n ? t(\"workflow.dependencyLoadFailed\")\n : dependencyView.children.length > 0\n ? t(\"workflow.containerNotExecutable\")\n : dependencyView.unsatisfiedBlockers.length > 0\n ? t(\"workflow.dependencyBlocked\")\n : item.state === \"READY\"\n ? t(\"workflow.startDescription\")\n : t(\"workflow.readyRequired\")}\n </p>\n {dependencyView.unsatisfiedBlockers.length > 0 ? (\n <ul className=\"workflow-blockers\">\n {dependencyView.unsatisfiedBlockers.map((blocker) => (\n <li key={blocker.id}>\n <span>{blocker.title}</span>\n <Status label={stateLabel(blocker.state, t)} tone={stateTones[blocker.state]} />\n </li>\n ))}\n </ul>\n ) : null}\n {startMutation.error ? (\n <LocalConnectionRecovery\n error={startMutation.error}\n onRetry={() => {\n startWorkflow();\n }}\n retrying={startMutation.isPending}\n />\n ) : null}\n <form\n className=\"workflow-policy-form\"\n onSubmit={(event) => {\n event.preventDefault();\n startWorkflow();\n }}\n >\n <Field\n {...(budgetLimitIsValid ? {} : { error: t(\"workflow.budget.invalid\") })}\n description={t(\"workflow.budget.description\")}\n htmlFor=\"workflow-start-budget\"\n label={t(\"workflow.budget.input\")}\n required\n >\n <TextField\n id=\"workflow-start-budget\"\n inputMode=\"numeric\"\n invalid={!budgetLimitIsValid}\n min={1}\n onChange={(event) => {\n setBudgetLimitInput(event.currentTarget.value);\n }}\n required\n step={1}\n type=\"number\"\n value={budgetLimitInput}\n />\n </Field>\n <Field\n {...(agentRunLimitIsValid ? {} : { error: t(\"workflow.agentRunBudget.invalid\") })}\n description={t(\"workflow.agentRunBudget.description\")}\n htmlFor=\"workflow-start-agent-run-budget\"\n label={t(\"workflow.agentRunBudget.input\")}\n required\n >\n <TextField\n id=\"workflow-start-agent-run-budget\"\n inputMode=\"numeric\"\n invalid={!agentRunLimitIsValid}\n min={1}\n onChange={(event) => {\n setAgentRunLimitInput(event.currentTarget.value);\n }}\n required\n step={1}\n type=\"number\"\n value={agentRunLimitInput}\n />\n </Field>\n <Field\n description={selectedModelDescription ?? t(\"workflow.model.loading\")}\n htmlFor=\"workflow-start-model-tier\"\n label={t(\"workflow.model.input\")}\n >\n <SelectControl\n disabled={codeBlind}\n ariaLabel={t(\"workflow.model.input\")}\n id=\"workflow-start-model-tier\"\n onValueChange={(value) => {\n setModelTierOverride(modelTierSchema.parse(value));\n }}\n options={modelOptions}\n value={displayedModelTier}\n />\n </Field>\n <div className=\"workflow-coordinator-controls\">\n <Checkbox\n checked={codeBlind}\n id=\"workflow-coordinator-mode\"\n label={t(\"workflow.coordinator.enable\")}\n description={t(\"workflow.coordinator.description\")}\n onCheckedChange={(value) => {\n setCodeBlind(value === true);\n }}\n disabled={startMutation.isPending}\n />\n {codeBlind ? (\n <Field\n htmlFor=\"workflow-coordinator-outcome\"\n label={t(\"workflow.coordinator.outcome\")}\n description={t(\"workflow.coordinator.outcomeDescription\")}\n {...(coordinatorOutcomeValid ? {} : { error: t(\"workflow.coordinator.invalid\") })}\n required\n >\n <Textarea\n id=\"workflow-coordinator-outcome\"\n value={coordinatorOutcome}\n onChange={(event) => {\n setCoordinatorOutcome(event.currentTarget.value);\n }}\n minLength={10}\n maxLength={2000}\n invalid={!coordinatorOutcomeValid}\n disabled={startMutation.isPending}\n required\n />\n </Field>\n ) : null}\n </div>\n <Button\n disabled={\n item.state !== \"READY\" ||\n !coordinatorOutcomeValid ||\n !budgetLimitIsValid ||\n !agentRunLimitIsValid ||\n !dependencyDataReady ||\n dependencyDataFailed ||\n dependencyView.children.length > 0 ||\n dependencyView.unsatisfiedBlockers.length > 0\n }\n loading={startMutation.isPending}\n type=\"submit\"\n variant=\"primary\"\n >\n {t(\"workflow.start\")}\n </Button>\n </form>\n </div>\n );\n }\n\n const run = snapshot.run;\n const currentAttempt =\n snapshot.stageAttempts.find((attempt) => attempt.id === run.currentStageAttemptId) ?? null;\n const correctionGateRequest =\n openRequest !== null &&\n currentAttempt?.stage === \"QA\" &&\n currentAttempt.status === \"WAITING_HUMAN\" &&\n currentAttempt.failureCode === \"QA_CORRECTION_EXHAUSTED\"\n ? {\n correctionRunId: currentAttempt.correctionRunId,\n request: openRequest,\n run,\n }\n : null;\n const verificationCorrectionGateRequest =\n openRequest !== null &&\n currentAttempt?.stage === \"QA\" &&\n currentAttempt.status === \"WAITING_HUMAN\" &&\n currentAttempt.failureCode === \"VERIFICATION_CORRECTION_EXHAUSTED\"\n ? openRequest\n : null;\n const used = snapshot.usageRecords.reduce((total, record) => total + record.amount, 0);\n const budgetPercent = budgetPolicy\n ? Math.min(100, Math.round((used / budgetPolicy.maxEstimatedTokens) * 100))\n : 0;\n const pipelineOverrideIsValid =\n budgetPolicy !== null &&\n budgetLimitIsValid &&\n parsedBudgetLimit >= budgetPolicy.maxEstimatedTokens &&\n parsedBudgetLimit > used;\n const agentRunOverrideRaisesPolicy =\n budgetPolicy !== null &&\n agentRunLimitIsValid &&\n (budgetPolicy.agentRunMaxEstimatedTokensOverride === undefined ||\n budgetPolicy.agentRunMaxEstimatedTokensOverride === null ||\n parsedAgentRunLimit > budgetPolicy.agentRunMaxEstimatedTokensOverride);\n const overrideLimitIsValid =\n pipelineOverrideIsValid &&\n (parsedBudgetLimit > budgetPolicy.maxEstimatedTokens || agentRunOverrideRaisesPolicy);\n const controlPending = controlMutation.isPending || overrideMutation.isPending;\n const runControl = (action: \"pause\" | \"resume\" | \"cancel\"): void => {\n controlMutation.reset();\n overrideMutation.reset();\n setLastAction(action);\n controlMutation.mutate({ action, run, workItem: item });\n };\n const approveOverride = (): void => {\n if (!overrideLimitIsValid) return;\n controlMutation.reset();\n overrideMutation.reset();\n setLastAction(\"override\");\n overrideMutation.mutate({\n maxEstimatedTokens: parsedBudgetLimit,\n modelTierOverride,\n agentRunMaxEstimatedTokensOverride: parsedAgentRunLimit,\n run,\n workItem: item,\n });\n };\n\n return (\n <div className=\"workflow-panel\">\n {snapshot.orchestration === undefined ? null : (\n <p className=\"inspector-copy\">{t(\"workflow.coordinator.description\")}</p>\n )}\n <div className=\"workflow-panel__status\">\n <span>{t(\"workflow.name\")}</span>\n <Status\n label={\n snapshot.run.status === \"HARD_PAUSED\"\n ? hardPauseLabel(currentAttempt?.failureCode ?? null, \"workflow.status.HARD_PAUSED\", t)\n : t(pipelineStatusLabelKeys[snapshot.run.status])\n }\n tone={pipelineStatusTones[snapshot.run.status]}\n />\n </div>\n {budgetPolicy ? (\n <div className=\"workflow-budget\">\n <span className=\"workflow-budget__kind\">{t(\"workflow.budget.kind\")}</span>\n <div className=\"workflow-budget__heading\">\n <span>{t(\"workflow.budget.title\")}</span>\n <strong>\n {t(\"workflow.budget.usage\", {\n used,\n limit: budgetPolicy.maxEstimatedTokens,\n })}\n </strong>\n </div>\n <progress\n aria-label={t(\"workflow.budget.title\")}\n max={budgetPolicy.maxEstimatedTokens}\n value={Math.min(used, budgetPolicy.maxEstimatedTokens)}\n />\n <div className=\"workflow-budget__meta\">\n <span>{t(\"workflow.budget.revision\", { revision: budgetPolicy.revision })}</span>\n <span>{budgetPercent}%</span>\n <span>\n {t(\"workflow.modelTier.current\", {\n tier:\n snapshot.orchestration !== undefined\n ? \"Astra → Luna / Sonnet\"\n : budgetPolicy.modelTierOverride === undefined || budgetPolicy.modelTierOverride === null\n ? t(\"workflow.modelTier.roleDefault\")\n : t(`workflow.modelTier.${budgetPolicy.modelTierOverride}`),\n })}\n </span>\n <span>\n {t(\"workflow.agentRunBudget.current\", {\n limit:\n budgetPolicy.agentRunMaxEstimatedTokensOverride ?? t(\"workflow.agentRunBudget.roleDefault\"),\n })}\n </span>\n </div>\n </div>\n ) : null}\n <ol className=\"workflow-stage-list\">\n {snapshot.stageAttempts.map((attempt) => (\n <li className={`is-${attempt.status.toLowerCase()}`} key={attempt.id}>\n <span aria-hidden=\"true\" />\n <div>\n <strong>{t(stageLabelKeys[attempt.stage])}</strong>\n <small>{stageAttemptStatusLabel(attempt, t)}</small>\n </div>\n </li>\n ))}\n </ol>\n {currentAttempt ? <AttemptSessionsPanel attempt={currentAttempt} /> : null}\n <ReviewPanel item={item} />\n <BrowserQAPanel correctionGate={correctionGateRequest} item={item} />\n {snapshot.acceptancePackage ? (\n <AcceptancePanel\n acceptancePackage={snapshot.acceptancePackage}\n artifacts={snapshot.artifacts}\n item={item}\n run={run}\n />\n ) : snapshot.artifacts.length > 0 ? (\n <div className=\"workflow-artifact-summary\">\n <strong>{t(\"acceptance.evidence\")}</strong>\n <span>{t(\"acceptance.evidenceCount\", { count: snapshot.artifacts.length })}</span>\n </div>\n ) : null}\n {openRequest && correctionGateRequest === null && verificationCorrectionGateRequest === null ? (\n <HumanRequestAnswerForm request={openRequest} />\n ) : null}\n {snapshot.recoveryReports.at(-1) ? (\n <div className=\"workflow-recovery\" role=\"status\">\n <strong>{t(\"workflow.recovery.title\")}</strong>\n <span>{t(\"workflow.recovery.description\")}</span>\n </div>\n ) : null}\n {controlMutation.error || overrideMutation.error ? (\n <LocalConnectionRecovery\n error={controlMutation.error ?? overrideMutation.error}\n onRetry={() => {\n if (lastAction === \"override\") approveOverride();\n else if (lastAction) runControl(lastAction);\n }}\n retrying={controlPending}\n />\n ) : null}\n {[\"RUNNING\", \"WAITING_HUMAN\", \"SOFT_PAUSED\", \"HARD_PAUSED\", \"INTERRUPTED\"].includes(run.status) &&\n snapshot.acceptancePackage?.status !== \"PENDING\" &&\n verificationCorrectionGateRequest === null ? (\n <div className=\"workflow-panel__actions\">\n {run.status === \"RUNNING\" ? (\n <Button\n disabled={controlPending}\n loading={controlMutation.isPending && lastAction === \"pause\"}\n onClick={() => {\n runControl(\"pause\");\n }}\n >\n {t(\"workflow.action.pause\")}\n </Button>\n ) : null}\n {run.status === \"SOFT_PAUSED\" || run.status === \"INTERRUPTED\" ? (\n <Button\n disabled={controlPending}\n loading={controlMutation.isPending && lastAction === \"resume\"}\n onClick={() => {\n runControl(\"resume\");\n }}\n variant=\"primary\"\n >\n {t(\"workflow.action.resume\")}\n </Button>\n ) : null}\n {run.status === \"HARD_PAUSED\" &&\n budgetPolicy !== null &&\n !isSessionPauseFailureCode(currentAttempt?.failureCode ?? null) ? (\n <form\n className=\"workflow-policy-form workflow-policy-form--override\"\n onSubmit={(event) => {\n event.preventDefault();\n approveOverride();\n }}\n >\n <Field\n {...(pipelineOverrideIsValid ? {} : { error: t(\"workflow.budget.overrideInvalid\") })}\n description={t(\"workflow.budget.overrideDescription\", {\n current: budgetPolicy.maxEstimatedTokens,\n used,\n })}\n htmlFor=\"workflow-override-budget\"\n label={t(\"workflow.budget.input\")}\n required\n >\n <TextField\n id=\"workflow-override-budget\"\n inputMode=\"numeric\"\n invalid={!pipelineOverrideIsValid}\n min={Math.max(budgetPolicy.maxEstimatedTokens, used + 1)}\n onChange={(event) => {\n setBudgetLimitInput(event.currentTarget.value);\n }}\n required\n step={1}\n type=\"number\"\n value={budgetLimitInput}\n />\n </Field>\n <Field\n description={selectedModelDescription ?? t(\"workflow.model.loading\")}\n htmlFor=\"workflow-override-model-tier\"\n label={t(\"workflow.model.input\")}\n >\n <SelectControl\n disabled={snapshot.orchestration !== undefined}\n ariaLabel={t(\"workflow.model.input\")}\n id=\"workflow-override-model-tier\"\n onValueChange={(value) => {\n setModelTierOverride(modelTierSchema.parse(value));\n }}\n options={modelOptions}\n value={displayedModelTier}\n />\n </Field>\n <Field\n {...(agentRunLimitIsValid &&\n (parsedBudgetLimit > budgetPolicy.maxEstimatedTokens || agentRunOverrideRaisesPolicy)\n ? {}\n : { error: t(\"workflow.agentRunBudget.overrideInvalid\") })}\n description={t(\"workflow.agentRunBudget.overrideDescription\")}\n htmlFor=\"workflow-override-agent-run-budget\"\n label={t(\"workflow.agentRunBudget.input\")}\n required\n >\n <TextField\n id=\"workflow-override-agent-run-budget\"\n inputMode=\"numeric\"\n invalid={\n !agentRunLimitIsValid ||\n (parsedBudgetLimit <= budgetPolicy.maxEstimatedTokens && !agentRunOverrideRaisesPolicy)\n }\n min={1}\n onChange={(event) => {\n setAgentRunLimitInput(event.currentTarget.value);\n }}\n required\n step={1}\n type=\"number\"\n value={agentRunLimitInput}\n />\n </Field>\n <Button\n disabled={controlPending || !overrideLimitIsValid}\n loading={overrideMutation.isPending}\n type=\"submit\"\n variant=\"primary\"\n >\n {t(\"workflow.action.override\")}\n </Button>\n </form>\n ) : null}\n <Button\n disabled={controlPending}\n loading={controlMutation.isPending && lastAction === \"cancel\"}\n onClick={() => {\n runControl(\"cancel\");\n }}\n variant=\"secondary\"\n >\n {t(\"workflow.action.cancel\")}\n </Button>\n </div>\n ) : null}\n {snapshot.run.status === \"SUCCEEDED\" ? (\n <p className=\"workflow-panel__completed\">{t(\"workflow.completed\")}</p>\n ) : null}\n </div>\n );\n};\n\nconst ActivitySkeleton = ({ label }: { label?: string }): React.JSX.Element => (\n <div\n aria-label={label}\n className=\"inspector-activity-skeleton\"\n role={label === undefined ? undefined : \"status\"}\n >\n {[\"first\", \"second\", \"third\"].map((row, index) => (\n <div className=\"inspector-activity-skeleton__row\" key={row}>\n <Skeleton className=\"inspector-activity-skeleton__icon\" />\n <span>\n <Skeleton width={index === 1 ? \"52%\" : \"68%\"} />\n <Skeleton width={index === 2 ? \"64%\" : \"82%\"} />\n </span>\n <Skeleton width=\"28px\" />\n </div>\n ))}\n </div>\n);\n\n/**\n * An item's activity grows without bound, so it is read newest first, one page at a time, rather\n * than rendering the whole log. The count stays honest about that: it reads \"30+\" while more pages\n * remain instead of claiming the loaded rows are all there is.\n */\nconst TaskActivitySection = ({ item }: { item: WorkItem }): React.JSX.Element => {\n const { locale, t } = useI18n();\n const eventsQuery = useWorkItemEvents(item.projectId, item.id);\n const events = (eventsQuery.data?.pages.flatMap((page) => page.events) ?? []).filter(\n isWorkItemTimelineEvent,\n );\n const loadMore = (): void => {\n void eventsQuery.fetchNextPage();\n };\n // See shouldKeepPagingForLifecycleEvent (workItemTimeline.ts) for why this auto-pages past a raw\n // page that filtered down to nothing, instead of showing the owner an empty list.\n const stillSearching = shouldKeepPagingForLifecycleEvent({\n hasLoadedFirstPage: eventsQuery.data !== undefined,\n hasNextPage: eventsQuery.hasNextPage,\n lifecycleEventsLoaded: events.length,\n });\n useEffect(() => {\n if (stillSearching && !eventsQuery.isFetchingNextPage) {\n void eventsQuery.fetchNextPage();\n }\n }, [eventsQuery, stillSearching]);\n\n return (\n <InspectorSection\n action={\n eventsQuery.data && !stillSearching ? (\n <span className=\"inspector-step-count\">\n {eventsQuery.hasNextPage ? t(\"task.activityCountMore\", { count: events.length }) : events.length}\n </span>\n ) : undefined\n }\n title={t(\"task.activity\")}\n >\n {events.length > 0 ? (\n <ol aria-busy={eventsQuery.isFetchingNextPage} className=\"inspector-activity\">\n {events.map((event) => (\n <li key={event.id}>\n <TimelineEvent {...eventPresentation(event, t)} time={eventTime(event.occurredAt, locale)} />\n </li>\n ))}\n </ol>\n ) : null}\n {!stillSearching && eventsQuery.hasNextPage ? (\n <Button\n className=\"inspector-activity__more\"\n disabled={eventsQuery.isFetchingNextPage}\n loading={eventsQuery.isFetchingNextPage}\n onClick={loadMore}\n size=\"sm\"\n >\n {t(\"task.loadMoreActivity\")}\n </Button>\n ) : null}\n {eventsQuery.isPending || stillSearching ? (\n <ActivitySkeleton label={t(\"task.loadingActivity\")} />\n ) : null}\n {eventsQuery.data && events.length === 0 && !stillSearching ? (\n <p className=\"inspector-copy\">{t(\"task.noActivity\")}</p>\n ) : null}\n </InspectorSection>\n );\n};\n\n/**\n * While the board loads there is nothing to select yet, so the inspector must not claim the reader\n * made no selection. It mirrors the real panel - header, overview grid, workflow and activity - so\n * the layout holds still once the first task lands.\n */\nconst TaskInspectorSkeleton = (): React.JSX.Element => {\n const { t } = useI18n();\n\n return (\n <aside\n aria-busy=\"true\"\n aria-label={t(\"loading.inspector.title\")}\n className=\"task-inspector\"\n role=\"status\"\n >\n <div className=\"task-inspector__header\">\n <div className=\"task-inspector__identity\">\n <Skeleton width=\"68px\" />\n <div className=\"inspector-skeleton__actions\">\n <Skeleton className=\"inspector-skeleton__control\" width=\"28px\" />\n <Skeleton className=\"inspector-skeleton__control\" width=\"112px\" />\n </div>\n </div>\n <Skeleton className=\"inspector-skeleton__title\" width=\"72%\" />\n </div>\n\n <section className=\"lr-inspector-section\">\n <header>\n <Skeleton width=\"64px\" />\n </header>\n <div className=\"lr-inspector-section__body\">\n <div className=\"inspector-skeleton__summary\">\n {[\"state\", \"stage\", \"type\", \"priority\", \"risk\"].map((property, index) => (\n <div key={property}>\n <Skeleton width=\"48%\" />\n <Skeleton width={index % 2 === 0 ? \"74%\" : \"56%\"} />\n </div>\n ))}\n </div>\n <div className=\"inspector-skeleton__copy\">\n <Skeleton width=\"100%\" />\n <Skeleton width=\"84%\" />\n </div>\n </div>\n </section>\n\n <section className=\"lr-inspector-section\">\n <header>\n <Skeleton width=\"76px\" />\n <Skeleton width=\"20px\" />\n </header>\n <div className=\"lr-inspector-section__body\">\n <WorkflowSkeleton />\n </div>\n </section>\n\n <section className=\"lr-inspector-section\">\n <header>\n <Skeleton width=\"120px\" />\n <Skeleton width=\"16px\" />\n </header>\n <div className=\"lr-inspector-section__body\">\n <ActivitySkeleton />\n </div>\n </section>\n </aside>\n );\n};\n\nconst TaskInspector = ({ item }: { item: WorkItem | null }): React.JSX.Element => {\n const { t } = useI18n();\n const moveMutation = useMoveWorkItem();\n const workflowQuery = useWorkItemWorkflow(item?.id);\n const [lastTarget, setLastTarget] = useState<WorkItemState | null>(null);\n\n if (!item) {\n return (\n <aside className=\"task-inspector is-empty\" aria-label={t(\"empty.noSelection.title\")}>\n <FeedbackState\n className=\"inspector-empty-feedback\"\n description={t(\"empty.noSelection.description\")}\n title={t(\"empty.noSelection.title\")}\n />\n </aside>\n );\n }\n\n // Fail closed while the workflow is still unknown: offering Move targets for a task a running\n // pipeline owns, then withdrawing them a moment later, invites a click the daemon refuses.\n const workflowActive =\n workflowQuery.data === undefined ||\n [\"RUNNING\", \"WAITING_HUMAN\", \"SOFT_PAUSED\", \"HARD_PAUSED\", \"INTERRUPTED\"].includes(\n workflowQuery.data.run?.status ?? \"\",\n );\n const targets = workflowActive ? [] : transitionTargets[item.state];\n const move = (targetState: WorkItemState): void => {\n setLastTarget(targetState);\n moveMutation.mutate({ targetState, workItem: item });\n };\n const { primary: primaryTarget, secondary: secondaryTarget } = moveShortcutsFor(item.state, workflowActive);\n\n return (\n <aside className=\"task-inspector\" aria-label={item.title}>\n <header className=\"task-inspector__header\">\n <div className=\"task-inspector__identity\">\n <span className=\"task-inspector__id\">{displayWorkItemId(item.id)}</span>\n <div className=\"task-inspector__actions\">\n <TaskEditDialog key={`${item.id}-${item.version.toString()}`} item={item} />\n <ActionMenu\n align=\"end\"\n groups={[\n targets.map((targetState) => ({\n danger: targetState === \"CANCELLED\",\n label: t(\"task.moveTo\", { state: stateLabel(targetState, t) }),\n onSelect: () => {\n move(targetState);\n },\n })),\n ]}\n trigger={\n <Button disabled={targets.length === 0} shape=\"pill\" trailingIcon=\"chevronDown\">\n {t(\"task.move\")}\n </Button>\n }\n />\n </div>\n </div>\n <h2>{item.title}</h2>\n </header>\n\n <InspectorSection title={t(\"task.overview\")}>\n <RunSummary\n properties={[\n {\n label: t(\"task.state\"),\n value: <Status label={stateLabel(item.state, t)} tone={stateTones[item.state]} />,\n },\n {\n label: t(\"task.stage\"),\n value: item.currentStage ? t(stageLabelKeys[item.currentStage]) : \"—\",\n },\n { label: t(\"task.type\"), value: t(typeLabelKeys[item.type]) },\n { label: t(\"task.priority\"), value: t(priorityLabelKeys[item.priority]) },\n { label: t(\"task.risk\"), value: t(riskLabelKeys[item.risk]) },\n ]}\n />\n <p className=\"inspector-copy\">{item.description || t(\"task.noBrief\")}</p>\n </InspectorSection>\n\n <DependencyPanel item={item} />\n\n <InspectorSection\n action={\n workflowQuery.data?.run ? (\n <span className=\"inspector-step-count\">\n {workflowQuery.data.stageAttempts.length.toString().padStart(2, \"0\")}\n </span>\n ) : undefined\n }\n title={t(\"workflow.title\")}\n >\n <ProjectProviderAllowanceStrip projectId={item.projectId} surface=\"task-cockpit\" />\n <WorkflowPanel item={item} />\n </InspectorSection>\n\n <WorkspacePanel item={item} />\n\n <ProjectVerificationPanel key={item.id} item={item} />\n\n {/* Keyed by work item, unlike its siblings, because this one holds state: which file the\n owner expanded. Without the key React would reconcile the same component across a switch\n to a different task and carry that path over, reopening a same-named file in a card the\n owner never asked it about. */}\n <ChangesSection key={item.id} workItemId={item.id} />\n\n <InspectorSection title={t(\"task.acceptanceCriteria\")}>\n {item.acceptanceCriteria.length > 0 ? (\n <div className=\"inspector-checklist\">\n {item.acceptanceCriteria.map((criterion, index) => (\n <Checkbox disabled key={`${index.toString()}:${criterion}`} label={criterion} />\n ))}\n </div>\n ) : (\n <p className=\"inspector-copy\">{t(\"task.noAcceptanceCriteria\")}</p>\n )}\n </InspectorSection>\n\n <RunActivitySection item={item} />\n\n <TaskActivitySection item={item} />\n\n {moveMutation.error ? (\n <div className=\"task-inspector__error\">\n <LocalConnectionRecovery\n error={moveMutation.error}\n onRetry={() => {\n if (lastTarget) move(lastTarget);\n }}\n retrying={moveMutation.isPending}\n />\n </div>\n ) : null}\n\n {primaryTarget !== null || secondaryTarget !== null ? (\n <footer className=\"task-inspector__footer\">\n {secondaryTarget ? (\n <Button\n aria-label={t(\"task.moveTo\", { state: stateLabel(secondaryTarget, t) })}\n loading={moveMutation.isPending}\n onClick={() => {\n move(secondaryTarget);\n }}\n variant=\"secondary\"\n >\n {t(\"task.moveToShort\", { state: stateLabel(secondaryTarget, t) })}\n </Button>\n ) : null}\n {primaryTarget ? (\n <Button\n aria-label={t(\"task.moveTo\", { state: stateLabel(primaryTarget, t) })}\n loading={moveMutation.isPending}\n onClick={() => {\n move(primaryTarget);\n }}\n variant=\"primary\"\n >\n {t(\"task.moveToShort\", { state: stateLabel(primaryTarget, t) })}\n </Button>\n ) : null}\n </footer>\n ) : null}\n </aside>\n );\n};\n\nexport const WorkbenchPage = (): React.JSX.Element => {\n const { t } = useI18n();\n const navigate = useNavigate({ from: \"/\" });\n const search = useSearch({ from: \"/\" });\n const {\n connectionPending,\n error,\n projects,\n projectsPending,\n retryConnection,\n selectedProject,\n selectProject,\n } = useWorkspace();\n const workItemsQuery = useProjectWorkItems(selectedProject?.id);\n const humanRequestsQuery = useProjectHumanRequests(selectedProject?.id);\n const initializeMutation = useInitializeFixtureWorkspace();\n const [selectedWorkItemId, setSelectedWorkItemId] = useState<string | null>(null);\n useEffect(() => {\n if (\n search.project &&\n search.project !== selectedProject?.id &&\n projects.some(({ id }) => id === search.project)\n ) {\n selectProject(search.project);\n }\n }, [projects, search.project, selectProject, selectedProject?.id]);\n const filters = search.filters?.split(\",\") ?? [];\n const summaryFilter = search.summary ?? null;\n const setFilters = (value: readonly string[]): void => {\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({\n ...current,\n filters: value.length > 0 ? value.join(\",\") : undefined,\n }),\n });\n };\n const setSummaryFilter = (value: SummaryFilter | null): void => {\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({\n ...current,\n summary: value ?? undefined,\n }),\n });\n };\n const view: BoardView = {\n direction: search.dir ?? defaultBoardView.direction,\n ordering: search.order ?? defaultBoardView.ordering,\n showEmptyColumns: search.hideEmpty !== true,\n };\n const setView = (value: BoardView): void => {\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({\n ...current,\n dir: value.direction === defaultBoardView.direction ? undefined : value.direction,\n order: value.ordering === defaultBoardView.ordering ? undefined : value.ordering,\n hideEmpty: value.showEmptyColumns ? undefined : true,\n }),\n });\n };\n const scope: BoardScope = search.scope ?? \"active\";\n const setScope = (value: BoardScope): void => {\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({\n ...current,\n scope: value === \"active\" ? undefined : value,\n // Status filters name columns that a different scope may not show.\n filters: undefined,\n }),\n });\n };\n const clearFilters = (): void => {\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({\n ...current,\n filters: undefined,\n summary: undefined,\n }),\n });\n };\n const boardPending = projectsPending || (selectedProject !== null && workItemsQuery.isPending);\n const workItems = workItemsQuery.data?.workItems ?? [];\n const columns = columnsFor(scope);\n const scopedItems = workItems.filter((item) => scopeShows(scope, item.state));\n const blockingRequests = humanRequestsQuery.data?.humanRequests.filter(({ blocking }) => blocking) ?? [];\n const blockingWorkItemIds = new Set(blockingRequests.map(({ workItemId }) => workItemId));\n const summaryFilteredItems = scopedItems.filter((item) => {\n if (summaryFilter === \"needsYou\") return blockingWorkItemIds.has(item.id);\n return true;\n });\n const visibleItems = orderWorkItems(\n summaryFilteredItems.filter((item) => matchesFilters(item, filters)),\n view,\n );\n const selectWorkItem = (workItemId: string): void => {\n setSelectedWorkItemId(workItemId);\n if (!search.project && !search.task) return;\n void navigate({\n replace: true,\n resetScroll: false,\n search: (current) => ({ ...current, project: undefined, task: undefined }),\n });\n };\n const selectedItem =\n (search.task ? workItems.find((item) => item.id === search.task) : undefined) ??\n visibleItems.find((item) => item.id === selectedWorkItemId) ??\n visibleItems.at(0) ??\n null;\n const filterOptions = filterOptionsFor(scopedItems, columns, t);\n\n return (\n <div className=\"workbench\">\n <section\n aria-label={t(\"work.boardLabel\")}\n className=\"workbench-board\"\n aria-labelledby=\"current-work-title\"\n >\n <h1 className=\"lr-visually-hidden\" id=\"current-work-title\">\n {t(\"work.current\")}\n </h1>\n <BoardToolbar\n filters={filters}\n onClearFilters={clearFilters}\n onFiltersChange={setFilters}\n onScopeChange={setScope}\n onSummaryFilterChange={setSummaryFilter}\n onViewChange={setView}\n options={filterOptions}\n scope={scope}\n summaryFilter={summaryFilter}\n view={view}\n />\n {selectedProject ? (\n <ProjectProviderAllowanceStrip projectId={selectedProject.id} surface=\"command-center\" />\n ) : null}\n {blockingRequests[0] ? (\n <button\n className=\"attention-banner\"\n onClick={() => {\n clearFilters();\n const workItemId = blockingRequests[0]?.workItemId;\n if (workItemId) selectWorkItem(workItemId);\n }}\n type=\"button\"\n >\n <span className=\"attention-banner__icon\">\n <Icon name=\"question\" size={14} />\n </span>\n <span>\n <strong>{t(\"attention.title\")}</strong>\n <small>{blockingRequests[0].title}</small>\n </span>\n <span className=\"attention-banner__count\">\n {t(blockingRequests.length === 1 ? \"attention.count\" : \"attention.countMany\", {\n count: blockingRequests.length,\n })}\n </span>\n <Icon name=\"chevronRight\" size={14} />\n </button>\n ) : null}\n\n {!selectedProject && !projectsPending && !error ? (\n <div className=\"workbench-state\">\n <FeedbackState\n action={\n <Button\n loading={initializeMutation.isPending}\n onClick={() => {\n initializeMutation.mutate();\n }}\n variant=\"primary\"\n >\n {t(\"empty.noProjects.action\")}\n </Button>\n }\n description={t(\"empty.noProjects.description\")}\n title={t(\"empty.noProjects.title\")}\n />\n {initializeMutation.error instanceof Error ? (\n <p className=\"workbench-state__error\" role=\"alert\">\n {initializeMutation.error.message}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {boardPending ? (\n <div\n aria-busy=\"true\"\n aria-label={t(\"loading.board.title\")}\n className=\"board-skeleton\"\n role=\"status\"\n >\n {columns.map((column) => (\n <div className=\"board-skeleton__column\" key={column.labelKey}>\n <header>\n <Skeleton width=\"72px\" />\n <Skeleton width=\"16px\" />\n </header>\n {[0, 1].map((card) => (\n <div className=\"board-skeleton__card\" key={card}>\n <Skeleton width=\"54px\" />\n <Skeleton width={card === 0 ? \"88%\" : \"64%\"} />\n <Skeleton width=\"46%\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n ) : null}\n\n {error || workItemsQuery.error ? (\n <div className=\"workbench-state\">\n <LocalConnectionRecovery\n error={workItemsQuery.error ?? error ?? new Error(t(\"error.unknown\"))}\n onRetry={() => {\n if (workItemsQuery.error) {\n void workItemsQuery.refetch();\n } else {\n retryConnection();\n }\n }}\n retrying={connectionPending || workItemsQuery.isFetching}\n />\n </div>\n ) : null}\n\n {selectedProject && workItemsQuery.data ? (\n <>\n <div className=\"kanban-board-scroll\">\n <div className=\"kanban-board\">\n {columns.map((column) => {\n const columnItems = visibleItems.filter((item) => item.state === column.state);\n if (columnItems.length === 0 && !view.showEmptyColumns) return null;\n return (\n <KanbanColumn\n count={columnItems.length}\n key={column.labelKey}\n label={t(column.labelKey)}\n tone={column.tone}\n >\n {columnItems.map((item) => (\n <WorkItemButton\n item={item}\n key={item.id}\n onSelect={selectWorkItem}\n selected={selectedItem?.id === item.id}\n />\n ))}\n </KanbanColumn>\n );\n })}\n </div>\n </div>\n {scopedItems.length === 0 ? (\n <div className=\"board-filter-empty\" role=\"status\">\n <span>\n <Icon name=\"inbox\" size={18} />\n </span>\n <strong>{t(`empty.${scope}.title`)}</strong>\n <p>{t(`empty.${scope}.description`)}</p>\n </div>\n ) : null}\n {(filters.length > 0 || summaryFilter !== null) && visibleItems.length === 0 ? (\n <div className=\"board-filter-empty\" role=\"status\">\n <span>\n <Icon name=\"filter\" size={18} />\n </span>\n <strong>{t(\"empty.filters.title\")}</strong>\n <p>{t(\"empty.filters.description\")}</p>\n </div>\n ) : null}\n </>\n ) : null}\n </section>\n\n <PanelResizer edge=\"end\" panel=\"inspector\" />\n {boardPending ? (\n <TaskInspectorSkeleton />\n ) : (\n <TaskInspector item={selectedItem} key={selectedItem?.id ?? \"empty\"} />\n )}\n </div>\n );\n};\n","import type { AttentionItem, AttentionSection } from \"@loomrail/contracts\";\n\nexport const canAnswerAttentionInline = (action: AttentionItem[\"action\"]): boolean =>\n action === \"ANSWER_REQUEST\";\n\nexport const attentionSectionOrder: readonly AttentionSection[] = [\n \"BLOCKING_NOW\",\n \"APPROVALS\",\n \"QUESTIONS\",\n \"MANUAL_ACTIONS\",\n \"SOON\",\n];\n\nexport const groupAttentionItems = (\n items: readonly AttentionItem[],\n): readonly { section: AttentionSection; items: readonly AttentionItem[] }[] =>\n attentionSectionOrder.flatMap((section) => {\n const sectionItems = items.filter((item) => item.section === section);\n return sectionItems.length === 0 ? [] : [{ section, items: sectionItems }];\n });\n\nexport type AttentionNavigationKey = \"ArrowDown\" | \"ArrowUp\" | \"End\" | \"Home\";\n\nexport const nextAttentionIndex = (\n currentIndex: number,\n key: AttentionNavigationKey,\n itemCount: number,\n): number => {\n if (itemCount <= 0) return -1;\n switch (key) {\n case \"ArrowDown\":\n return Math.min(itemCount - 1, currentIndex + 1);\n case \"ArrowUp\":\n return Math.max(0, currentIndex - 1);\n case \"Home\":\n return 0;\n case \"End\":\n return itemCount - 1;\n }\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { KeyboardEvent } from \"react\";\nimport { useNavigate } from \"@tanstack/react-router\";\n\nimport type { AttentionItem, AttentionSection } from \"@loomrail/contracts\";\nimport { Badge, Button, FeedbackState, Icon, Skeleton } from \"@loomrail/ui\";\n\nimport {\n canAnswerAttentionInline,\n groupAttentionItems,\n nextAttentionIndex,\n type AttentionNavigationKey,\n} from \"../attentionView\";\nimport { HumanRequestAnswerForm } from \"../components/HumanRequestAnswerForm\";\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport { useAttentionInbox, useWorkspace } from \"../workspace\";\n\nconst navigationKeys = new Set<AttentionNavigationKey>([\"ArrowDown\", \"ArrowUp\", \"End\", \"Home\"]);\n\nconst sectionKey = (section: AttentionSection): TranslationKey => `attention.section.${section}`;\n\nconst categoryKey = (category: AttentionItem[\"category\"]): TranslationKey => `attention.category.${category}`;\n\nconst priorityKey = (priority: AttentionItem[\"workItem\"][\"priority\"]): TranslationKey =>\n `priority.${priority}`;\n\nconst stageKey = (stage: AttentionItem[\"stage\"][\"name\"]): TranslationKey => `stage.${stage}`;\n\nexport const AttentionPage = (): React.JSX.Element => {\n const { locale, t } = useI18n();\n const navigate = useNavigate({ from: \"/attention\" });\n const { selectProject } = useWorkspace();\n const attentionQuery = useAttentionInbox();\n const items = attentionQuery.data?.items ?? [];\n const groups = useMemo(() => groupAttentionItems(items), [items]);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const itemRefs = useRef(new Map<string, HTMLButtonElement>());\n const selectedItem = items.find(({ id }) => id === selectedId) ?? items.at(0) ?? null;\n\n useEffect(() => {\n if (selectedItem?.id !== selectedId) setSelectedId(selectedItem?.id ?? null);\n }, [selectedId, selectedItem?.id]);\n\n const openTask = (item: AttentionItem): void => {\n selectProject(item.project.id);\n void navigate({\n to: \"/\",\n search: { project: item.project.id, task: item.workItem.id },\n });\n };\n\n const moveSelection = (event: KeyboardEvent<HTMLButtonElement>, item: AttentionItem): void => {\n if (!navigationKeys.has(event.key as AttentionNavigationKey)) return;\n event.preventDefault();\n const currentIndex = items.findIndex(({ id }) => id === item.id);\n const nextIndex = nextAttentionIndex(currentIndex, event.key as AttentionNavigationKey, items.length);\n const next = items[nextIndex];\n if (!next) return;\n setSelectedId(next.id);\n itemRefs.current.get(next.id)?.focus();\n };\n\n if (attentionQuery.isPending) {\n return (\n <div aria-busy=\"true\" aria-label={t(\"attention.loading\")} className=\"attention-inbox\">\n <section className=\"attention-inbox__index\">\n <header className=\"attention-inbox__heading\">\n <Skeleton width=\"120px\" />\n <Skeleton width=\"42px\" />\n </header>\n <div className=\"attention-inbox__skeleton\">\n <Skeleton width=\"34%\" />\n <Skeleton width=\"90%\" />\n <Skeleton width=\"70%\" />\n </div>\n </section>\n <section className=\"attention-inbox__detail\">\n <div className=\"attention-inbox__skeleton\">\n <Skeleton width=\"54%\" />\n <Skeleton width=\"86%\" />\n <Skeleton width=\"72%\" />\n </div>\n </section>\n </div>\n );\n }\n\n if (attentionQuery.error) {\n return (\n <div className=\"attention-inbox attention-inbox--state\">\n <LocalConnectionRecovery\n error={attentionQuery.error}\n onRetry={() => void attentionQuery.refetch()}\n retrying={attentionQuery.isFetching}\n />\n </div>\n );\n }\n\n if (items.length === 0) {\n return (\n <div className=\"attention-inbox attention-inbox--state\">\n <div>\n <h1 className=\"lr-visually-hidden\">{t(\"attention.inboxTitle\")}</h1>\n <FeedbackState description={t(\"attention.emptyDescription\")} title={t(\"attention.emptyTitle\")} />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"attention-inbox\">\n <section aria-label={t(\"attention.listLabel\")} className=\"attention-inbox__index\">\n <header className=\"attention-inbox__heading\">\n <div>\n <h1>{t(\"attention.inboxTitle\")}</h1>\n <p>{t(\"attention.inboxDescription\")}</p>\n </div>\n <Badge tone={items.some(({ request }) => request.blocking) ? \"warning\" : \"neutral\"}>\n {items.length.toString()}\n {attentionQuery.data.hasMore ? \"+\" : \"\"}\n </Badge>\n </header>\n\n {attentionQuery.isFetching ? (\n <p className=\"attention-inbox__refresh\" role=\"status\">\n {t(\"attention.refreshing\")}\n </p>\n ) : null}\n\n <div className=\"attention-groups\">\n {groups.map((group) => (\n <section className=\"attention-group\" key={group.section}>\n <h2>\n <span>{t(sectionKey(group.section))}</span>\n <span>{group.items.length}</span>\n </h2>\n <ul>\n {group.items.map((item) => (\n <li key={item.id}>\n <button\n aria-current={selectedItem?.id === item.id ? \"true\" : undefined}\n className=\"attention-row\"\n onClick={() => {\n setSelectedId(item.id);\n }}\n onDoubleClick={() => {\n openTask(item);\n }}\n onKeyDown={(event) => {\n moveSelection(event, item);\n }}\n ref={(node) => {\n if (node) itemRefs.current.set(item.id, node);\n else itemRefs.current.delete(item.id);\n }}\n type=\"button\"\n >\n <span className=\"attention-row__title\">{item.request.title}</span>\n <span className=\"attention-row__context\">\n {item.project.name} · {item.workItem.title}\n </span>\n <span className=\"attention-row__meta\">\n {t(categoryKey(item.category))} · {t(stageKey(item.stage.name))}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </div>\n\n {attentionQuery.data.hasMore ? (\n <p className=\"attention-inbox__limit\" role=\"status\">\n {t(\"attention.limitReached\")}\n </p>\n ) : null}\n </section>\n\n <section aria-live=\"polite\" className=\"attention-inbox__detail\">\n {selectedItem ? (\n <div className=\"attention-detail\" key={selectedItem.id}>\n <header>\n <div className=\"attention-detail__context\">\n <span>{selectedItem.project.name}</span>\n <Icon name=\"chevronRight\" size={12} />\n <span>{selectedItem.workItem.title}</span>\n </div>\n <h2>{selectedItem.request.title}</h2>\n </header>\n\n <dl className=\"attention-detail__facts\">\n <div>\n <dt>{t(\"attention.fact.category\")}</dt>\n <dd>{t(categoryKey(selectedItem.category))}</dd>\n </div>\n <div>\n <dt>{t(\"attention.fact.priority\")}</dt>\n <dd>{t(priorityKey(selectedItem.workItem.priority))}</dd>\n </div>\n <div>\n <dt>{t(\"attention.fact.stage\")}</dt>\n <dd>{t(stageKey(selectedItem.stage.name))}</dd>\n </div>\n <div>\n <dt>{t(\"attention.fact.created\")}</dt>\n <dd>\n <time dateTime={selectedItem.request.createdAt}>\n {new Intl.DateTimeFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(new Date(selectedItem.request.createdAt))}\n </time>\n </dd>\n </div>\n </dl>\n\n {canAnswerAttentionInline(selectedItem.action) ? (\n <HumanRequestAnswerForm request={selectedItem.request} showTitle={false} />\n ) : (\n <div className=\"attention-detail__acceptance\">\n <div>\n <strong>\n {selectedItem.action === \"REVIEW_ACCEPTANCE\"\n ? t(\"attention.acceptanceTitle\")\n : selectedItem.request.title}\n </strong>\n <p>\n {selectedItem.action === \"REVIEW_ACCEPTANCE\"\n ? t(\"attention.acceptanceDescription\")\n : selectedItem.request.context}\n </p>\n </div>\n <Button\n onClick={() => {\n openTask(selectedItem);\n }}\n trailingIcon=\"chevronRight\"\n variant=\"primary\"\n >\n {selectedItem.action === \"REVIEW_ACCEPTANCE\"\n ? t(\"attention.reviewAcceptance\")\n : t(\"attention.openTask\")}\n </Button>\n </div>\n )}\n\n {canAnswerAttentionInline(selectedItem.action) ? (\n <Button\n className=\"attention-detail__open-task\"\n onClick={() => {\n openTask(selectedItem);\n }}\n variant=\"secondary\"\n >\n {t(\"attention.openTask\")}\n </Button>\n ) : null}\n </div>\n ) : null}\n </section>\n </div>\n );\n};\n","import { useNavigate } from \"@tanstack/react-router\";\n\nimport type {\n AgentFleetEntry,\n AgentFleetResponse,\n AgentFleetWaitReason,\n WorkspaceToolOperation,\n} from \"@loomrail/contracts\";\nimport { FeedbackState, Skeleton } from \"@loomrail/ui\";\n\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { useI18n, type Translator, type TranslationKey } from \"../i18n\";\nimport { useAgentFleet, useWorkspace } from \"../workspace\";\n\nconst roleKey = (role: AgentFleetEntry[\"profile\"][\"role\"]): TranslationKey => `fleet.role.${role}`;\nconst stageKey = (stage: AgentFleetEntry[\"stage\"]): TranslationKey => `stage.${stage}`;\nconst statusKey = (status: AgentFleetEntry[\"status\"]): TranslationKey => `fleet.status.${status}`;\nconst waitKey = (reason: AgentFleetWaitReason): TranslationKey => `fleet.wait.${reason}`;\nconst originKey = (origin: NonNullable<AgentFleetEntry[\"latestAction\"]>[\"origin\"]): TranslationKey =>\n `fleet.latestAction.origin.${origin}`;\nconst operationKey = (operation: WorkspaceToolOperation): TranslationKey =>\n `workspaceTool.operation.${operation}`;\n\n// `workspace_tool_calls.operation` is a closed, NOT NULL SQL enum (migration 0055), so a\n// DAEMON_AUDITED label is always one of these six codes -- this list exists only to let the UI\n// confirm that at runtime instead of trusting `origin` and casting, per this task's own rule.\nconst WORKSPACE_TOOL_OPERATIONS: readonly WorkspaceToolOperation[] = [\n \"LIST_DIRECTORY\",\n \"READ_FILE\",\n \"WRITE_FILE\",\n \"EDIT_FILE\",\n \"DELETE_FILE\",\n \"RUN_RECIPE\",\n];\nconst isWorkspaceToolOperation = (value: string): value is WorkspaceToolOperation =>\n (WORKSPACE_TOOL_OPERATIONS as readonly string[]).includes(value);\n\n// A DAEMON_AUDITED entry's label is a WorkspaceToolOperation code meant for the same\n// `workspaceTool.operation.*` lookup the Run Activity feed already uses elsewhere. A\n// PROVIDER_REPORTED entry's label is the provider's own free text -- untrusted, rendered as plain\n// text and never looked up or interpreted as markup (React's own text-node escaping is the whole\n// mechanism here; nothing renders it as HTML or Markdown). An audited label that somehow does not\n// match a known operation degrades to raw text rather than a broken translation lookup.\nconst latestActionLabel = (action: NonNullable<AgentFleetEntry[\"latestAction\"]>, t: Translator): string =>\n action.origin === \"DAEMON_AUDITED\" && isWorkspaceToolOperation(action.label)\n ? t(operationKey(action.label))\n : action.label;\n\ntype AgentFleetViewProps = {\n capacity: AgentFleetResponse[\"capacity\"] | null;\n entries: AgentFleetEntry[];\n error: unknown;\n fetching: boolean;\n loading: boolean;\n onOpenTask: (entry: AgentFleetEntry) => void;\n onRetry: () => void;\n};\n\nexport const AgentFleetView = ({\n capacity,\n entries,\n error,\n fetching,\n loading,\n onOpenTask,\n onRetry,\n}: AgentFleetViewProps): React.JSX.Element => {\n const { locale, t } = useI18n();\n\n if (loading) {\n return (\n <div aria-busy=\"true\" aria-label={t(\"fleet.loading\")} className=\"agent-fleet\">\n <header className=\"agent-fleet__header\">\n <div>\n <Skeleton width=\"160px\" />\n <Skeleton width=\"320px\" />\n </div>\n <Skeleton width=\"82px\" />\n </header>\n <div className=\"agent-fleet__skeleton\">\n <Skeleton width=\"100%\" />\n <Skeleton width=\"100%\" />\n <Skeleton width=\"100%\" />\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"agent-fleet agent-fleet--state\">\n <LocalConnectionRecovery error={error} onRetry={onRetry} retrying={fetching} />\n </div>\n );\n }\n\n const stats = capacity ?? { active: 0, globalLimit: 0 };\n\n return (\n <div className=\"agent-fleet\">\n <header className=\"agent-fleet__header\">\n <div>\n <h1>{t(\"fleet.title\")}</h1>\n <p>{t(\"fleet.description\")}</p>\n </div>\n <span className=\"agent-fleet__capacity\">\n {t(\"fleet.capacity\", { active: stats.active, limit: stats.globalLimit })}\n </span>\n </header>\n\n {fetching ? (\n <p className=\"agent-fleet__refresh\" role=\"status\">\n {t(\"fleet.refreshing\")}\n </p>\n ) : null}\n\n {entries.length === 0 ? (\n <div className=\"agent-fleet__empty\">\n <FeedbackState description={t(\"fleet.emptyDescription\")} title={t(\"fleet.emptyTitle\")} />\n </div>\n ) : (\n <div className=\"agent-fleet__table-scroll\">\n <table className=\"agent-fleet__table\">\n <thead>\n <tr>\n <th scope=\"col\">{t(\"fleet.column.task\")}</th>\n <th scope=\"col\">{t(\"fleet.column.role\")}</th>\n <th scope=\"col\">{t(\"fleet.column.stage\")}</th>\n <th scope=\"col\">{t(\"fleet.column.provider\")}</th>\n <th scope=\"col\">{t(\"fleet.column.status\")}</th>\n <th scope=\"col\">{t(\"fleet.column.since\")}</th>\n <th scope=\"col\">{t(\"fleet.column.latestAction\")}</th>\n </tr>\n </thead>\n <tbody>\n {entries.map((entry) => (\n <tr key={entry.agentRunId ?? entry.dispatchId ?? entry.stageAttemptId}>\n <td data-label={t(\"fleet.column.task\")}>\n <button\n className=\"agent-fleet__task\"\n onClick={() => {\n onOpenTask(entry);\n }}\n type=\"button\"\n >\n <strong>{entry.workItem.title}</strong>\n <span>{entry.project.name}</span>\n </button>\n </td>\n <td data-label={t(\"fleet.column.role\")}>{t(roleKey(entry.profile.role))}</td>\n <td data-label={t(\"fleet.column.stage\")}>{t(stageKey(entry.stage))}</td>\n <td data-label={t(\"fleet.column.provider\")}>{entry.provider.replace(\"_\", \" \")}</td>\n <td data-label={t(\"fleet.column.status\")}>\n <span className=\"agent-fleet__status\" data-status={entry.status}>\n <span aria-hidden=\"true\" />\n {t(statusKey(entry.status))}\n </span>\n {entry.waitReason === null ? null : (\n <small className=\"agent-fleet__wait\">{t(waitKey(entry.waitReason))}</small>\n )}\n </td>\n <td data-label={t(\"fleet.column.since\")}>\n {entry.startedAt === null ? (\n <span aria-label={t(\"fleet.notStarted\")}>—</span>\n ) : (\n <time dateTime={entry.startedAt}>\n {new Intl.DateTimeFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\", {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n }).format(new Date(entry.startedAt))}\n </time>\n )}\n </td>\n <td data-label={t(\"fleet.column.latestAction\")}>\n {entry.latestAction === null ? (\n <span aria-label={t(\"fleet.noActivity\")}>—</span>\n ) : (\n <span className=\"agent-fleet__latest-action\">\n <span className=\"agent-fleet__latest-action-label\">\n {latestActionLabel(entry.latestAction, t)}\n </span>\n <span\n className=\"agent-fleet__latest-action-origin\"\n data-origin={entry.latestAction.origin}\n >\n {t(originKey(entry.latestAction.origin))}\n </span>\n </span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </div>\n );\n};\n\nexport const AgentFleetPage = (): React.JSX.Element => {\n const { selectProject } = useWorkspace();\n const navigate = useNavigate({ from: \"/fleet\" });\n const fleetQuery = useAgentFleet();\n\n const openTask = (entry: AgentFleetEntry): void => {\n selectProject(entry.project.id);\n void navigate({ to: \"/\", search: { project: entry.project.id, task: entry.workItem.id } });\n };\n\n return (\n <AgentFleetView\n capacity={fleetQuery.data?.capacity ?? null}\n entries={fleetQuery.data?.entries ?? []}\n error={fleetQuery.error}\n fetching={fleetQuery.isFetching}\n loading={fleetQuery.isPending}\n onOpenTask={openTask}\n onRetry={() => void fleetQuery.refetch()}\n />\n );\n};\n","import { anonymousReportSchema, type AnonymousReport } from \"@loomrail/contracts\";\n\nexport const serializeAnonymousReport = (report: AnonymousReport): string =>\n `${JSON.stringify(anonymousReportSchema.parse(report), null, 2)}\\n`;\n\nexport const downloadAnonymousReport = (report: AnonymousReport): void => {\n const filename =\n report.kind === \"AGGREGATE\" ? \"loomrail-aggregate-report.json\" : \"loomrail-crash-report.json\";\n const href = URL.createObjectURL(\n new Blob([serializeAnonymousReport(report)], { type: \"application/json;charset=utf-8\" }),\n );\n const anchor = document.createElement(\"a\");\n anchor.download = filename;\n anchor.href = href;\n anchor.click();\n // Revoking in the same task as the synthetic click races the download navigation: Firefox and\n // WebKit resolve the `blob:` URL asynchronously and report \"file not found\" when it is already\n // gone. Deferring the revoke keeps the object alive until the browser has taken the request.\n setTimeout(() => {\n URL.revokeObjectURL(href);\n }, 1_000);\n};\n","import type { AnonymousReport, LocalProductMetrics } from \"@loomrail/contracts\";\nimport { Button, Skeleton } from \"@loomrail/ui\";\n\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport { downloadAnonymousReport, serializeAnonymousReport } from \"../reportDownload\";\nimport { useInsights } from \"../workspace\";\n\nconst rateValue = (value: number | null, noEvidence: string): string =>\n value === null ? noEvidence : `${value.toString()}%`;\n\nconst ReportPreview = ({\n description,\n report,\n title,\n}: {\n description: string;\n report: AnonymousReport;\n title: string;\n}): React.JSX.Element => {\n const { t } = useI18n();\n return (\n <article className=\"insights-report\">\n <header>\n <h3>{title}</h3>\n <p>{description}</p>\n </header>\n <pre aria-label={t(\"insights.report.previewLabel\")}>{serializeAnonymousReport(report)}</pre>\n <div className=\"insights-report__actions\">\n <Button\n onClick={() => {\n downloadAnonymousReport(report);\n }}\n size=\"sm\"\n >\n {t(\"insights.report.download\")}\n </Button>\n </div>\n </article>\n );\n};\n\nconst countRows = (\n metrics: LocalProductMetrics,\n): readonly { label: TranslationKey; value: string | number }[] => [\n {\n label: \"insights.count.workItems\",\n value: `${metrics.workItems.accepted.toString()} / ${metrics.workItems.total.toString()}`,\n },\n {\n label: \"insights.count.activeWork\",\n value: metrics.workItems.active,\n },\n {\n label: \"insights.count.cancelledWork\",\n value: metrics.workItems.cancelled,\n },\n {\n label: \"insights.count.pipelines\",\n value: `${metrics.pipelineRuns.succeeded.toString()} / ${metrics.pipelineRuns.total.toString()}`,\n },\n {\n label: \"insights.count.pipelineFailures\",\n value: metrics.pipelineRuns.failed + metrics.pipelineRuns.interrupted + metrics.pipelineRuns.cancelled,\n },\n {\n label: \"insights.count.agentRuns\",\n value: `${metrics.agentRuns.succeeded.toString()} / ${metrics.agentRuns.total.toString()}`,\n },\n {\n label: \"insights.count.agentFailures\",\n value: metrics.agentRuns.failed + metrics.agentRuns.interrupted,\n },\n {\n label: \"insights.count.reviews\",\n value: metrics.reviews.total,\n },\n {\n label: \"insights.count.qaRuns\",\n value: metrics.qa.total,\n },\n {\n label: \"insights.count.qaDefects\",\n value: `${metrics.qa.defectsOpen.toString()} / ${(\n metrics.qa.defectsOpen +\n metrics.qa.defectsResolved +\n metrics.qa.defectsWaived\n ).toString()}`,\n },\n {\n label: \"insights.count.humanRequests\",\n value: `${metrics.humanRequests.resolved.toString()} / ${metrics.humanRequests.total.toString()}`,\n },\n {\n label: \"insights.count.tokens\",\n value: metrics.usage.estimatedTokens,\n },\n {\n label: \"insights.count.recoveries\",\n value: metrics.reliability.daemonRestartRecoveries,\n },\n];\n\nexport const InsightsPage = (): React.JSX.Element => {\n const { locale, t } = useI18n();\n const insightsQuery = useInsights();\n\n if (insightsQuery.isPending) {\n return (\n <div aria-busy=\"true\" aria-label={t(\"insights.loading\")} className=\"insights\">\n <header className=\"insights__header\">\n <div>\n <Skeleton width=\"120px\" />\n <Skeleton width=\"360px\" />\n </div>\n </header>\n <div className=\"insights__skeleton\">\n <Skeleton width=\"100%\" />\n <Skeleton width=\"100%\" />\n <Skeleton width=\"100%\" />\n </div>\n </div>\n );\n }\n\n if (insightsQuery.error) {\n return (\n <div className=\"insights insights--state\">\n <LocalConnectionRecovery\n error={insightsQuery.error}\n onRetry={() => void insightsQuery.refetch()}\n retrying={insightsQuery.isFetching}\n />\n </div>\n );\n }\n\n const insights = insightsQuery.data;\n const metrics = insights.localMetrics;\n const formatter = new Intl.NumberFormat(locale === \"ru\" ? \"ru-RU\" : \"en-US\");\n\n return (\n <div className=\"insights\">\n <header className=\"insights__header\">\n <div>\n <h1>{t(\"insights.title\")}</h1>\n <p>{t(\"insights.description\")}</p>\n </div>\n <span>{t(\"insights.localOnly\")}</span>\n </header>\n\n <section aria-labelledby=\"insights-outcomes\" className=\"insights__section\">\n <div className=\"insights__section-heading\">\n <h2 id=\"insights-outcomes\">{t(\"insights.outcomes.title\")}</h2>\n <p>{t(\"insights.outcomes.description\")}</p>\n </div>\n <dl className=\"insights-rates\">\n {[\n [\"insights.rate.acceptance\", metrics.rates.acceptedCompletionPercent],\n [\"insights.rate.firstReview\", metrics.rates.firstPassReviewPercent],\n [\"insights.rate.qa\", metrics.rates.terminalQaPassPercent],\n ].map(([label, value]) => (\n <div key={label}>\n <dt>{t(label as TranslationKey)}</dt>\n <dd>{rateValue(value as number | null, t(\"insights.noEvidence\"))}</dd>\n </div>\n ))}\n </dl>\n <dl className=\"insights-counts\">\n {countRows(metrics).map((row) => (\n <div key={row.label}>\n <dt>{t(row.label)}</dt>\n <dd>{typeof row.value === \"number\" ? formatter.format(row.value) : row.value}</dd>\n </div>\n ))}\n </dl>\n </section>\n\n <section aria-labelledby=\"insights-reports\" className=\"insights__section\">\n <div className=\"insights__section-heading\">\n <h2 id=\"insights-reports\">{t(\"insights.report.title\")}</h2>\n <p>{t(\"insights.report.description\")}</p>\n <p className=\"insights__exclusions\">{t(\"insights.report.exclusions\")}</p>\n </div>\n <ReportPreview\n description={t(\"insights.report.aggregateDescription\")}\n report={insights.aggregateReport}\n title={t(\"insights.report.aggregate\")}\n />\n {insights.crashReport === null ? (\n <p className=\"insights__empty-report\">{t(\"insights.report.noCrash\")}</p>\n ) : (\n <ReportPreview\n description={t(\"insights.report.crashDescription\")}\n report={insights.crashReport}\n title={t(\"insights.report.crash\")}\n />\n )}\n </section>\n </div>\n );\n};\n","import {\n guidedActivationContract,\n type ListedProject,\n type ProjectProviderSelectionResponse,\n type WorkItem,\n type WorkflowSnapshot,\n} from \"@loomrail/contracts\";\n\nexport const guidedActivationPhases = [\n \"WORKSPACE\",\n \"PROVIDER\",\n \"TASK\",\n \"READY\",\n \"RUN\",\n \"REQUEST\",\n \"REVIEW\",\n \"QA\",\n \"ACCEPTANCE\",\n \"COMPLETE\",\n] as const;\n\nexport type GuidedActivationPhase = (typeof guidedActivationPhases)[number];\n\nexport type GuidedActivationProjection = {\n completed: readonly GuidedActivationPhase[];\n current: GuidedActivationPhase;\n};\n\nexport const isGuidedActivationTask = (workItem: WorkItem): boolean => {\n const recipe = guidedActivationContract.task;\n return (\n workItem.title === recipe.title &&\n workItem.description === recipe.description &&\n workItem.priority === recipe.priority &&\n workItem.risk === recipe.risk &&\n workItem.type === recipe.type &&\n workItem.acceptanceCriteria.length === recipe.acceptanceCriteria.length &&\n workItem.acceptanceCriteria.every((criterion, index) => criterion === recipe.acceptanceCriteria[index])\n );\n};\n\nexport const selectGuidedActivationTask = (\n workItems: readonly WorkItem[],\n requestedTaskId?: string,\n): WorkItem | null => {\n const candidates = workItems.filter(\n (workItem) => workItem.state !== \"CANCELLED\" && isGuidedActivationTask(workItem),\n );\n const requested = candidates.find(({ id }) => id === requestedTaskId);\n if (requested !== undefined) return requested;\n return [...candidates].sort((left, right) => right.createdAt.localeCompare(left.createdAt)).at(0) ?? null;\n};\n\nconst completedBefore = (current: GuidedActivationPhase): readonly GuidedActivationPhase[] =>\n guidedActivationPhases.slice(0, guidedActivationPhases.indexOf(current));\n\nexport const projectGuidedActivation = (\n project: ListedProject | null,\n providerSelection: ProjectProviderSelectionResponse | null,\n workItem: WorkItem | null,\n workflow: WorkflowSnapshot | null,\n): GuidedActivationProjection => {\n const run = workflow?.run ?? null;\n const acceptancePackage = workflow?.acceptancePackage ?? null;\n const currentAttempt = workflow?.stageAttempts.find(({ id }) => id === run?.currentStageAttemptId) ?? null;\n let current: GuidedActivationPhase;\n if (project?.repositoryStatus !== \"READY\") current = \"WORKSPACE\";\n else if (\n providerSelection === null ||\n providerSelection.providers.find(({ provider }) => provider === providerSelection.effectiveProvider)\n ?.ready !== true\n ) {\n current = \"PROVIDER\";\n } else if (workItem === null) current = \"TASK\";\n else if (workItem.state === \"BACKLOG\") current = \"READY\";\n else if (run === null) current = \"RUN\";\n else if (acceptancePackage !== null && acceptancePackage.status !== \"PENDING\") {\n current = \"COMPLETE\";\n } else if (acceptancePackage?.status === \"PENDING\") current = \"ACCEPTANCE\";\n else if (currentAttempt?.stage === \"QA\" || currentAttempt?.stage === \"ACCEPTANCE\") current = \"QA\";\n else if (currentAttempt?.stage === \"REVIEW\") current = \"REVIEW\";\n else current = \"REQUEST\";\n return { current, completed: completedBefore(current) };\n};\n","import { useEffect } from \"react\";\nimport { useNavigate, useSearch } from \"@tanstack/react-router\";\nimport { guidedActivationContract } from \"@loomrail/contracts\";\nimport { Button, Icon, Skeleton } from \"@loomrail/ui\";\n\nimport {\n guidedActivationPhases,\n projectGuidedActivation,\n selectGuidedActivationTask,\n type GuidedActivationPhase,\n} from \"../activationView\";\nimport { LocalConnectionRecovery } from \"../components/LocalConnectionRecovery\";\nimport { useI18n, type TranslationKey } from \"../i18n\";\nimport { useOpenAppSettings } from \"../shell/appSettings\";\nimport {\n useCreateGuidedActivationWorkItem,\n useInitializeFixtureWorkspace,\n useMoveWorkItem,\n useProjectProviderSelection,\n useProjectWorkItems,\n useSetProjectProviderPreference,\n useStartPipeline,\n useWorkspace,\n useWorkItemWorkflow,\n} from \"../workspace\";\n\nconst phaseLabel: Readonly<Record<GuidedActivationPhase, TranslationKey>> = {\n WORKSPACE: \"activation.phase.workspace\",\n PROVIDER: \"activation.phase.provider\",\n TASK: \"activation.phase.task\",\n READY: \"activation.phase.ready\",\n RUN: \"activation.phase.run\",\n REQUEST: \"activation.phase.request\",\n REVIEW: \"activation.phase.review\",\n QA: \"activation.phase.qa\",\n ACCEPTANCE: \"activation.phase.acceptance\",\n COMPLETE: \"activation.phase.complete\",\n};\n\nconst phaseCopy: Readonly<Record<GuidedActivationPhase, TranslationKey>> = {\n WORKSPACE: \"activation.copy.workspace\",\n PROVIDER: \"activation.copy.provider\",\n TASK: \"activation.copy.task\",\n READY: \"activation.copy.ready\",\n RUN: \"activation.copy.run\",\n REQUEST: \"activation.copy.request\",\n REVIEW: \"activation.copy.review\",\n QA: \"activation.copy.qa\",\n ACCEPTANCE: \"activation.copy.acceptance\",\n COMPLETE: \"activation.copy.complete\",\n};\n\nexport const ActivationPage = (): React.JSX.Element => {\n const { t } = useI18n();\n const openAppSettings = useOpenAppSettings();\n const navigate = useNavigate({ from: \"/try\" });\n const search = useSearch({ from: \"/try\" });\n const { error, projects, projectsPending, retryConnection, selectedProject, selectProject } =\n useWorkspace();\n const project =\n projects.find(\n ({ fixtureId, repositoryStatus }) =>\n fixtureId === guidedActivationContract.fixtureId && repositoryStatus === \"READY\",\n ) ??\n projects.find(({ fixtureId }) => fixtureId === guidedActivationContract.fixtureId) ??\n null;\n const providerSelectionQuery = useProjectProviderSelection(project?.id);\n const workItemsQuery = useProjectWorkItems(project?.id);\n const workItem = selectGuidedActivationTask(workItemsQuery.data?.workItems ?? [], search.task);\n const workflowQuery = useWorkItemWorkflow(workItem?.id);\n const initializeMutation = useInitializeFixtureWorkspace();\n const setProviderMutation = useSetProjectProviderPreference();\n const createMutation = useCreateGuidedActivationWorkItem();\n const moveMutation = useMoveWorkItem();\n const startMutation = useStartPipeline();\n\n useEffect(() => {\n if (project !== null && project.id !== selectedProject?.id) selectProject(project.id);\n }, [project, selectProject, selectedProject?.id]);\n\n useEffect(() => {\n if (workItem !== null && search.task !== workItem.id) {\n void navigate({ replace: true, search: { task: workItem.id } });\n }\n }, [navigate, search.task, workItem]);\n\n const queryError =\n error ?? providerSelectionQuery.error ?? workItemsQuery.error ?? workflowQuery.error ?? null;\n if (queryError !== null) {\n return (\n <div className=\"activation activation--state\">\n <LocalConnectionRecovery\n error={queryError}\n onRetry={() => {\n retryConnection();\n void providerSelectionQuery.refetch();\n void workItemsQuery.refetch();\n void workflowQuery.refetch();\n }}\n retrying={\n providerSelectionQuery.isFetching || workItemsQuery.isFetching || workflowQuery.isFetching\n }\n />\n </div>\n );\n }\n\n const queriesPending =\n projectsPending ||\n (project !== null && (providerSelectionQuery.isPending || workItemsQuery.isPending)) ||\n (workItem !== null && workflowQuery.isPending);\n if (queriesPending) {\n return (\n <div aria-busy=\"true\" aria-label={t(\"activation.loading\")} className=\"activation\">\n <header className=\"activation__header\">\n <Skeleton width=\"180px\" />\n <Skeleton width=\"520px\" />\n </header>\n <div className=\"activation__loading\">\n <Skeleton width=\"100%\" />\n <Skeleton width=\"76%\" />\n <Skeleton width=\"88%\" />\n </div>\n </div>\n );\n }\n\n const projection = projectGuidedActivation(\n project,\n providerSelectionQuery.data ?? null,\n workItem,\n workflowQuery.data ?? null,\n );\n const openHumanRequest = workflowQuery.data?.humanRequests.some(\n ({ status }) => status === \"OPEN\" || status === \"CLAIMED\" || status === \"SNOOZED\",\n );\n const mutationError =\n initializeMutation.error ??\n setProviderMutation.error ??\n createMutation.error ??\n moveMutation.error ??\n startMutation.error ??\n null;\n const taskUrlSearch =\n project !== null && workItem !== null ? { project: project.id, task: workItem.id } : {};\n\n const primaryAction = (): React.JSX.Element | null => {\n switch (projection.current) {\n case \"WORKSPACE\":\n return (\n <Button\n icon=\"projects\"\n loading={initializeMutation.isPending}\n onClick={() => {\n initializeMutation.mutate();\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.workspace\")}\n </Button>\n );\n case \"PROVIDER\":\n if (project === null) return null;\n return (\n <Button\n disabled={providerSelectionQuery.data?.environmentOverrideLocked}\n icon=\"agents\"\n loading={setProviderMutation.isPending}\n onClick={() => {\n setProviderMutation.mutate({ preference: \"AUTO\", project });\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.provider\")}\n </Button>\n );\n case \"TASK\":\n if (project === null) return null;\n return (\n <Button\n icon=\"add\"\n loading={createMutation.isPending}\n onClick={() => {\n createMutation.mutate(project.id, {\n onSuccess: (created) => {\n void navigate({ replace: true, search: { task: created.id } });\n },\n });\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.task\")}\n </Button>\n );\n case \"READY\":\n if (workItem === null) return null;\n return (\n <Button\n icon=\"check\"\n loading={moveMutation.isPending}\n onClick={() => {\n moveMutation.mutate({ targetState: \"READY\", workItem });\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.ready\")}\n </Button>\n );\n case \"RUN\":\n if (workItem === null) return null;\n return (\n <Button\n icon=\"play\"\n loading={startMutation.isPending}\n onClick={() => {\n startMutation.mutate({ policy: guidedActivationContract.policy, workItem });\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.run\")}\n </Button>\n );\n case \"REQUEST\":\n case \"REVIEW\":\n case \"QA\":\n return (\n <Button\n icon={openHumanRequest ? \"question\" : \"board\"}\n onClick={() => {\n if (openHumanRequest) {\n void navigate({ to: \"/attention\" });\n } else if (project !== null && workItem !== null) {\n void navigate({ to: \"/\", search: taskUrlSearch });\n }\n }}\n variant=\"primary\"\n >\n {t(openHumanRequest ? \"activation.action.attention\" : \"activation.action.cockpit\")}\n </Button>\n );\n case \"ACCEPTANCE\":\n return (\n <Button\n icon=\"check\"\n onClick={() => {\n if (project !== null && workItem !== null) {\n void navigate({ to: \"/\", search: taskUrlSearch });\n }\n }}\n variant=\"primary\"\n >\n {t(\"activation.action.acceptance\")}\n </Button>\n );\n case \"COMPLETE\":\n return null;\n }\n };\n\n return (\n <div className=\"activation\">\n <header className=\"activation__header\">\n <div>\n <span>{t(\"activation.eyebrow\")}</span>\n <h1>{t(\"activation.title\")}</h1>\n <p>{t(\"activation.description\")}</p>\n </div>\n <p className=\"activation__boundary\">\n <Icon name=\"info\" size={15} />\n {t(\"activation.zeroQuota\")}\n </p>\n </header>\n\n <div className=\"activation__body\">\n <nav aria-label={t(\"activation.progress\")} className=\"activation-progress\">\n <ol>\n {guidedActivationPhases.map((phase, index) => {\n const complete = projection.completed.includes(phase);\n const current = projection.current === phase;\n return (\n <li\n aria-current={current ? \"step\" : undefined}\n className={complete ? \"is-complete\" : current ? \"is-current\" : undefined}\n key={phase}\n >\n <span aria-hidden=\"true\">{complete ? <Icon name=\"check\" size={13} /> : index + 1}</span>\n <div>\n <strong>{t(phaseLabel[phase])}</strong>\n <small>\n {t(\n complete\n ? \"activation.status.complete\"\n : current\n ? \"activation.status.current\"\n : \"activation.status.upcoming\",\n )}\n </small>\n </div>\n </li>\n );\n })}\n </ol>\n </nav>\n\n <section aria-live=\"polite\" className=\"activation-step\">\n <header>\n <span>\n {t(\"activation.step\", {\n current: (guidedActivationPhases.indexOf(projection.current) + 1).toString(),\n total: guidedActivationPhases.length.toString(),\n })}\n </span>\n <h2>{t(phaseLabel[projection.current])}</h2>\n <p>{t(phaseCopy[projection.current])}</p>\n </header>\n\n {projection.current === \"PROVIDER\" && providerSelectionQuery.data?.environmentOverrideLocked ? (\n <p className=\"activation-step__warning\" role=\"alert\">\n {t(\"activation.providerLocked\")}\n </p>\n ) : null}\n\n {mutationError !== null ? <LocalConnectionRecovery error={mutationError} /> : null}\n <div className=\"activation-step__action\">{primaryAction()}</div>\n\n <details className=\"activation-recipe\">\n <summary>{t(\"activation.recipe.title\")}</summary>\n <p>{guidedActivationContract.task.description}</p>\n <ol>\n {guidedActivationContract.task.acceptanceCriteria.map((criterion) => (\n <li key={criterion}>{criterion}</li>\n ))}\n </ol>\n <dl>\n <div>\n <dt>{t(\"activation.recipe.provider\")}</dt>\n <dd>{t(\"activation.provider.real\")}</dd>\n </div>\n <div>\n <dt>{t(\"activation.recipe.model\")}</dt>\n <dd>{guidedActivationContract.policy.modelTierOverride}</dd>\n </div>\n <div>\n <dt>{t(\"activation.recipe.budget\")}</dt>\n <dd>{guidedActivationContract.policy.maxEstimatedTokens.toLocaleString()}</dd>\n </div>\n </dl>\n </details>\n\n {projection.current === \"COMPLETE\" ? (\n <div className=\"activation-next\">\n <h3>{t(\"activation.next.title\")}</h3>\n <div>\n <Button\n onClick={() => {\n if (project !== null && workItem !== null) {\n void navigate({ to: \"/\", search: taskUrlSearch });\n }\n }}\n variant=\"secondary\"\n >\n {t(\"activation.next.local\")}\n </Button>\n <Button onClick={openAppSettings} variant=\"secondary\">\n {t(\"activation.next.repository\")}\n </Button>\n </div>\n <details className=\"activation-next__guided\">\n <summary>{t(\"activation.next.guidedAction\")}</summary>\n <p>{t(\"activation.next.guided\")}</p>\n </details>\n </div>\n ) : null}\n </section>\n </div>\n </div>\n );\n};\n","import { createRootRoute, createRoute, createRouter } from \"@tanstack/react-router\";\nimport { opaqueIdSchema } from \"@loomrail/contracts\";\n\nimport {\n defaultBoardView,\n isBoardDirection,\n isBoardOrdering,\n isBoardScope,\n type BoardDirection,\n type BoardOrdering,\n type BoardScope,\n} from \"./boardView\";\nimport { AppFrame } from \"./shell/AppFrame\";\nimport { WorkbenchPage } from \"./views/WorkbenchPage\";\nimport { AttentionPage } from \"./views/AttentionPage\";\nimport { AgentFleetPage } from \"./views/AgentFleetPage\";\nimport { InsightsPage } from \"./views/InsightsPage\";\nimport { ActivationPage } from \"./views/ActivationPage\";\n\nconst rootRoute = createRootRoute({ component: AppFrame });\n\n// The board retains one bounded summary filter for links shared before the global Inbox existed.\nconst summaryFilters = new Set([\"needsYou\"]);\nconst workItemFilters = new Set([\n \"priority-high\",\n \"priority-low\",\n \"priority-medium\",\n \"priority-urgent\",\n \"risk-critical\",\n \"risk-high\",\n \"risk-low\",\n \"risk-medium\",\n \"status-backlog\",\n \"status-blocked\",\n \"status-cancelled\",\n \"status-done\",\n \"status-in_progress\",\n \"status-ready\",\n]);\n\nexport type SummaryFilter = \"needsYou\";\n\nexport type WorkbenchSearch = {\n dir?: BoardDirection;\n filters?: string;\n hideEmpty?: true;\n order?: BoardOrdering;\n scope?: Exclude<BoardScope, \"active\">;\n summary?: SummaryFilter;\n project?: string;\n task?: string;\n};\n\nconst validateWorkbenchSearch = (search: Record<string, unknown>): WorkbenchSearch => {\n const rawFilters = search[\"filters\"];\n const rawSummary = search[\"summary\"];\n const project = opaqueIdSchema.safeParse(search[\"project\"]);\n const task = opaqueIdSchema.safeParse(search[\"task\"]);\n const filters =\n typeof rawFilters === \"string\"\n ? rawFilters\n .split(\",\")\n .filter((filter) => workItemFilters.has(filter))\n .join(\",\")\n : \"\";\n const summary =\n typeof rawSummary === \"string\" && summaryFilters.has(rawSummary)\n ? (rawSummary as SummaryFilter)\n : undefined;\n\n const rawOrder = search[\"order\"];\n const rawDirection = search[\"dir\"];\n const order = isBoardOrdering(rawOrder) && rawOrder !== defaultBoardView.ordering ? rawOrder : undefined;\n const dir =\n isBoardDirection(rawDirection) && rawDirection !== defaultBoardView.direction ? rawDirection : undefined;\n const hideEmpty = search[\"hideEmpty\"] === true || search[\"hideEmpty\"] === \"true\" ? true : undefined;\n const rawScope = search[\"scope\"];\n const scope = isBoardScope(rawScope) && rawScope !== \"active\" ? rawScope : undefined;\n\n return {\n ...(filters.length > 0 ? { filters } : {}),\n ...(summary === undefined ? {} : { summary }),\n ...(order === undefined ? {} : { order }),\n ...(dir === undefined ? {} : { dir }),\n ...(hideEmpty === undefined ? {} : { hideEmpty }),\n ...(scope === undefined ? {} : { scope }),\n ...(project.success ? { project: project.data } : {}),\n ...(task.success ? { task: task.data } : {}),\n };\n};\n\nconst workbenchRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: \"/\",\n component: WorkbenchPage,\n validateSearch: validateWorkbenchSearch,\n});\n\nconst attentionRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: \"/attention\",\n component: AttentionPage,\n});\n\nconst agentFleetRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: \"/fleet\",\n component: AgentFleetPage,\n});\n\nconst insightsRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: \"/insights\",\n component: InsightsPage,\n});\n\nexport type ActivationSearch = { task?: string };\n\nconst activationRoute = createRoute({\n getParentRoute: () => rootRoute,\n path: \"/try\",\n component: ActivationPage,\n validateSearch: (search: Record<string, unknown>): ActivationSearch => {\n const task = opaqueIdSchema.safeParse(search[\"task\"]);\n return task.success ? { task: task.data } : {};\n },\n});\n\nconst routeTree = rootRoute.addChildren([\n workbenchRoute,\n attentionRoute,\n agentFleetRoute,\n insightsRoute,\n activationRoute,\n]);\n\nexport const router = createRouter({\n routeTree,\n defaultPreload: \"intent\",\n scrollRestoration: true,\n});\n\ndeclare module \"@tanstack/react-router\" {\n // Interface merging is the registration mechanism required by TanStack Router.\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface Register {\n router: typeof router;\n }\n}\n","import { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { RouterProvider } from \"@tanstack/react-router\";\n\nimport { router } from \"./router\";\nimport { I18nProvider } from \"./i18n\";\nimport { WorkspaceProvider } from \"./workspace\";\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n retry: false,\n staleTime: 30_000,\n },\n },\n});\n\nexport const App = (): React.JSX.Element => (\n <QueryClientProvider client={queryClient}>\n <I18nProvider>\n <WorkspaceProvider>\n <RouterProvider router={router} />\n </WorkspaceProvider>\n </I18nProvider>\n </QueryClientProvider>\n);\n","import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport \"@loomrail/ui/styles.css\";\nimport \"./styles.css\";\n\nimport { App } from \"./App\";\nimport { applyThemePreference, readThemePreference } from \"./theme\";\n\nconst rootElement = document.getElementById(\"root\");\nif (!rootElement) {\n throw new Error(\"Loomrail root element is missing\");\n}\n\napplyThemePreference(readThemePreference());\n\ncreateRoot(rootElement).render(\n <StrictMode>\n <App />\n </StrictMode>,\n);\n"],"mappings":"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EAAO,CAC7C,QACA,cACA,WACA,OACA,oBACJ,CAAC,EACY,GAA6B,GAAgB,OAAO,CAC7D,KAAM,EAAU,mBAAmB,EACnC,cAAe,EAAU,WAAW,EACpC,KAAM,EACM,CACR,SAAU,GACV,cAAe,EAAQ,EAA0B,CAAC,CAAC,IAAI,CAAC,CAC5D,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAAkC,GAAgB,OAAO,CAClE,KAAM,EAAU,yBAAyB,EACzC,cAAe,EAAU,WAAW,EACpC,KAAM,EACM,CACR,SAAU,GACV,cAAe,EACnB,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAA2B,GAAgB,OAAO,CAC3D,KAAM,EAAU,gBAAgB,EAChC,cAAe,EAAU,WAAW,EACpC,KAAM,EAAS,CAAE,WAAY,EAAsB,CAAC,CAAC,CAAC,OAAO,CACjE,CAAC,EACY,GAA6B,GAAgB,OAAO,CAC7D,KAAM,EAAU,mBAAmB,EACnC,cAAe,EAAU,WAAW,EACpC,KAAM,EAAS,CAAE,IAAK,EAAe,CAAC,CAAC,CAAC,OAAO,CACnD,CAAC,EACY,GAA8B,GAAgB,OAAO,CAC9D,KAAM,EAAU,oBAAoB,EACpC,cAAe,EAAU,WAAW,EACpC,KAAM,EAAS,CAAE,IAAK,EAAe,CAAC,CAAC,CAAC,OAAO,CACnD,CAAC,EACY,GAAoB,EAAqB,OAAQ,CAC1D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACJ,CAAC,EACK,GAAoB,EACd,CACR,cAAe,EACf,UAAW,EACX,cAAe,EACf,MAAO,CACX,CAAC,CAAC,CACG,OAAO,EAWC,GAA+B,GAAkB,OAAO,CACjE,KAAM,EAAU,kBAAkB,EAClC,QAAS,EACG,CACR,GAAI,EACJ,UAAW,GAAuB,SAAS,EAC3C,KAAM,GACN,eAAgB,EACpB,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EAsBY,GAAqC,GAAkB,OAAO,CACvE,KAAM,EAAU,yBAAyB,EACzC,QAAS,EACG,CACR,UAAW,EAGX,UAAW,GACX,uBAAwB,GACxB,eAAgB,EACpB,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAA8B,GAAkB,OAAO,CAChE,KAAM,EAAU,kBAAkB,EAClC,QAAS,EACG,CACR,UAAW,EACX,SAAU,EAAe,SAAS,CAAC,CAAC,QAAQ,IAAI,EAChD,KAAM,GACN,MAAO,GACP,YAAa,GAAkB,QAAQ,EAAE,EACzC,SAAU,GAAe,QAAQ,QAAQ,EACzC,KAAM,GAAW,QAAQ,QAAQ,EACjC,mBAAoB,GAAyB,QAAQ,CAAC,CAAC,CAC3D,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAAsB,EACvB,CACR,MAAO,GAAY,SAAS,EAC5B,YAAa,GAAkB,SAAS,EACxC,SAAU,GAAe,SAAS,EAClC,KAAM,GAAW,SAAS,EAC1B,mBAAoB,GAAyB,SAAS,CAC1D,CAAC,CAAC,CACG,OAAO,CAAC,CACR,OAAQ,GAAU,OAAO,KAAK,CAAK,CAAC,CAAC,OAAS,EAAG,CAAE,QAAS,oCAAqC,CAAC,EAC1F,GAA8B,GAAkB,OAAO,CAChE,KAAM,EAAU,kBAAkB,EAClC,QAAS,EACG,CACR,WAAY,EACZ,gBAAiB,EAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAC3C,MAAO,EACX,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAA4B,GAAkB,OAAO,CAC9D,KAAM,EAAU,gBAAgB,EAChC,QAAS,EACG,CACR,WAAY,EACZ,gBAAiB,EAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAC3C,YAAa,EACjB,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAA6B,GAAkB,OAAO,CAC/D,KAAM,EAAU,iBAAiB,EACjC,QAAS,EACG,CACR,WAAY,EACZ,SAAU,GAGV,aAAc,GAA2B,SAAS,CAAC,CAAC,SAAS,EAC7D,OAAQ,EACZ,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACY,GAAoC,GAAkB,OAAO,CACtE,KAAM,EAAU,wBAAwB,EACxC,QAAS,EACG,CACR,UAAW,EACX,gBAAiB,EAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAC3C,YAAa,GACb,OAAQ,EAAS,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAK,CAC9C,CAAC,CAAC,CACG,OAAO,CAChB,CAAC,EACiC,EAAqB,OAAQ,CAC3D,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACJ,CAAC,EACD,IAAM,GAA0B,EACpB,CACR,cAAe,EACf,SAAU,EAAU,CACxB,CAAC,CAAC,CACG,OAAO,EACC,GAAgC,GAAwB,OAAO,CACxE,KAAM,EAAU,oBAAoB,EACpC,QAAS,GACT,MAAO,EACX,CAAC,EACY,GAA8B,GAAwB,OAAO,CACtE,KAAM,EAAU,mBAAmB,EACnC,SAAU,GACV,MAAO,EACX,CAAC,EACY,GAA8B,GAAwB,OAAO,CACtE,KAAM,EAAU,mBAAmB,EACnC,SAAU,GACV,MAAO,EACX,CAAC,EACY,GAA4B,GAAwB,OAAO,CACpE,KAAM,EAAU,iBA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"}