clinkx 0.3.0 → 1.1.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.
- package/CHANGELOG.md +119 -0
- package/LICENSE +10 -0
- package/README.md +154 -26
- package/clinkx-workflows/dist/allowed-roots.d.ts +1 -0
- package/clinkx-workflows/dist/allowed-roots.js +5 -0
- package/clinkx-workflows/dist/allowed-roots.js.map +1 -0
- package/clinkx-workflows/dist/artifacts.d.ts +20 -1
- package/clinkx-workflows/dist/artifacts.js +38 -9
- package/clinkx-workflows/dist/artifacts.js.map +1 -1
- package/clinkx-workflows/dist/backend.d.ts +4 -0
- package/clinkx-workflows/dist/chairman-knobs.d.ts +24 -0
- package/clinkx-workflows/dist/chairman-knobs.js +27 -0
- package/clinkx-workflows/dist/chairman-knobs.js.map +1 -0
- package/clinkx-workflows/dist/citation-check.d.ts +40 -0
- package/clinkx-workflows/dist/citation-check.js +348 -0
- package/clinkx-workflows/dist/citation-check.js.map +1 -0
- package/clinkx-workflows/dist/clink-client.d.ts +12 -1
- package/clinkx-workflows/dist/clink-client.js +56 -5
- package/clinkx-workflows/dist/clink-client.js.map +1 -1
- package/clinkx-workflows/dist/config.d.ts +173 -16
- package/clinkx-workflows/dist/config.js +417 -26
- package/clinkx-workflows/dist/config.js.map +1 -1
- package/clinkx-workflows/dist/contained-file.d.ts +172 -0
- package/clinkx-workflows/dist/contained-file.js +483 -0
- package/clinkx-workflows/dist/contained-file.js.map +1 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-contract.d.ts +416 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-contract.js +328 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-contract.js.map +1 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-router.d.ts +24 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-router.js +39 -0
- package/clinkx-workflows/dist/context-builder-lifecycle-router.js.map +1 -0
- package/clinkx-workflows/dist/context-cache-key.d.ts +53 -0
- package/clinkx-workflows/dist/context-cache-key.js +91 -0
- package/clinkx-workflows/dist/context-cache-key.js.map +1 -0
- package/clinkx-workflows/dist/context-mode-resolver.d.ts +27 -0
- package/clinkx-workflows/dist/context-mode-resolver.js +126 -0
- package/clinkx-workflows/dist/context-mode-resolver.js.map +1 -0
- package/clinkx-workflows/dist/context-preflight.d.ts +189 -0
- package/clinkx-workflows/dist/context-preflight.js +91 -0
- package/clinkx-workflows/dist/context-preflight.js.map +1 -0
- package/clinkx-workflows/dist/council-execution-policy.d.ts +68 -0
- package/clinkx-workflows/dist/council-execution-policy.js +110 -0
- package/clinkx-workflows/dist/council-execution-policy.js.map +1 -0
- package/clinkx-workflows/dist/council-expander.d.ts +10 -9
- package/clinkx-workflows/dist/council-expander.js +20 -10
- package/clinkx-workflows/dist/council-expander.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +5718 -0
- package/clinkx-workflows/dist/dashboard/activity-contract.js +157 -0
- package/clinkx-workflows/dist/dashboard/activity-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/activity-lease.d.ts +25 -0
- package/clinkx-workflows/dist/dashboard/activity-lease.js +34 -0
- package/clinkx-workflows/dist/dashboard/activity-lease.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/activity-reader.d.ts +90 -0
- package/clinkx-workflows/dist/dashboard/activity-reader.js +493 -0
- package/clinkx-workflows/dist/dashboard/activity-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/api-routes.d.ts +40 -0
- package/clinkx-workflows/dist/dashboard/api-routes.js +1155 -0
- package/clinkx-workflows/dist/dashboard/api-routes.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/artifact-index.d.ts +37 -0
- package/clinkx-workflows/dist/dashboard/artifact-index.js +145 -0
- package/clinkx-workflows/dist/dashboard/artifact-index.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/challenge-store.d.ts +31 -0
- package/clinkx-workflows/dist/dashboard/auth/challenge-store.js +65 -0
- package/clinkx-workflows/dist/dashboard/auth/challenge-store.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/controller.d.ts +26 -0
- package/clinkx-workflows/dist/dashboard/auth/controller.js +596 -0
- package/clinkx-workflows/dist/dashboard/auth/controller.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/credential-store.d.ts +60 -0
- package/clinkx-workflows/dist/dashboard/auth/credential-store.js +776 -0
- package/clinkx-workflows/dist/dashboard/auth/credential-store.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.d.ts +9 -0
- package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.js +44 -0
- package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/session-store.d.ts +17 -0
- package/clinkx-workflows/dist/dashboard/auth/session-store.js +77 -0
- package/clinkx-workflows/dist/dashboard/auth/session-store.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/auth/webauthn-service.d.ts +25 -0
- package/clinkx-workflows/dist/dashboard/auth/webauthn-service.js +71 -0
- package/clinkx-workflows/dist/dashboard/auth/webauthn-service.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/context-builder-invocation-contract.d.ts +3865 -0
- package/clinkx-workflows/dist/dashboard/context-builder-invocation-contract.js +69 -0
- package/clinkx-workflows/dist/dashboard/context-builder-invocation-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/context-run-liveness.d.ts +37 -0
- package/clinkx-workflows/dist/dashboard/context-run-liveness.js +49 -0
- package/clinkx-workflows/dist/dashboard/context-run-liveness.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/context-run-reader.d.ts +256 -0
- package/clinkx-workflows/dist/dashboard/context-run-reader.js +1301 -0
- package/clinkx-workflows/dist/dashboard/context-run-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/contracts.d.ts +28483 -0
- package/clinkx-workflows/dist/dashboard/contracts.js +1284 -0
- package/clinkx-workflows/dist/dashboard/contracts.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/generation.d.ts +14 -0
- package/clinkx-workflows/dist/dashboard/generation.js +41 -0
- package/clinkx-workflows/dist/dashboard/generation.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/index.d.ts +32 -0
- package/clinkx-workflows/dist/dashboard/index.js +20 -0
- package/clinkx-workflows/dist/dashboard/index.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/invocation-contract.d.ts +786 -0
- package/clinkx-workflows/dist/dashboard/invocation-contract.js +201 -0
- package/clinkx-workflows/dist/dashboard/invocation-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.d.ts +114 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.js +799 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/contract.d.ts +90 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/contract.js +31 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/projection.d.ts +12 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/projection.js +286 -0
- package/clinkx-workflows/dist/dashboard/native-transcript/projection.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +446 -0
- package/clinkx-workflows/dist/dashboard/progress-report-contract.js +221 -0
- package/clinkx-workflows/dist/dashboard/progress-report-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/progress-report-reader.d.ts +50 -0
- package/clinkx-workflows/dist/dashboard/progress-report-reader.js +529 -0
- package/clinkx-workflows/dist/dashboard/progress-report-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.d.ts +89 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.js +71 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-store.d.ts +29 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-store.js +111 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-store.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-contract.d.ts +194 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-contract.js +89 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-store.d.ts +26 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-store.js +102 -0
- package/clinkx-workflows/dist/dashboard/prompt-builder-library-store.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/read-model.d.ts +86 -0
- package/clinkx-workflows/dist/dashboard/read-model.js +440 -0
- package/clinkx-workflows/dist/dashboard/read-model.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/request-admission.d.ts +31 -0
- package/clinkx-workflows/dist/dashboard/request-admission.js +130 -0
- package/clinkx-workflows/dist/dashboard/request-admission.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/scanner.d.ts +78 -0
- package/clinkx-workflows/dist/dashboard/scanner.js +1154 -0
- package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/server-factory.d.ts +63 -0
- package/clinkx-workflows/dist/dashboard/server-factory.js +483 -0
- package/clinkx-workflows/dist/dashboard/server-factory.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +2778 -0
- package/clinkx-workflows/dist/dashboard/session-log-contract.js +506 -0
- package/clinkx-workflows/dist/dashboard/session-log-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-identity.d.ts +21 -0
- package/clinkx-workflows/dist/dashboard/session-log-identity.js +101 -0
- package/clinkx-workflows/dist/dashboard/session-log-identity.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-journal.d.ts +43 -0
- package/clinkx-workflows/dist/dashboard/session-log-journal.js +529 -0
- package/clinkx-workflows/dist/dashboard/session-log-journal.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-reader.d.ts +61 -0
- package/clinkx-workflows/dist/dashboard/session-log-reader.js +378 -0
- package/clinkx-workflows/dist/dashboard/session-log-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.d.ts +14 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js +1101 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-retention.d.ts +23 -0
- package/clinkx-workflows/dist/dashboard/session-log-retention.js +212 -0
- package/clinkx-workflows/dist/dashboard/session-log-retention.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/static-responses.d.ts +10 -0
- package/clinkx-workflows/dist/dashboard/static-responses.js +94 -0
- package/clinkx-workflows/dist/dashboard/static-responses.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/worker-lock-observer.d.ts +28 -0
- package/clinkx-workflows/dist/dashboard/worker-lock-observer.js +241 -0
- package/clinkx-workflows/dist/dashboard/worker-lock-observer.js.map +1 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/index-JPHQVtn9.js +106 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/style-DOMHk-j6.css +1 -0
- package/clinkx-workflows/dist/dashboard-ui/contracts/council-plan-review-input-v1.json +158 -0
- package/clinkx-workflows/dist/dashboard-ui/index.html +15 -0
- package/clinkx-workflows/dist/dashboard-ui/licenses/IBM-Plex-Mono-OFL.txt +93 -0
- package/clinkx-workflows/dist/dashboard-ui/licenses/IBM-Plex-Sans-OFL.txt +93 -0
- package/clinkx-workflows/dist/dashboard-ui/licenses/JetBrains-Mono-OFL.txt +93 -0
- package/clinkx-workflows/dist/dashboard-ui/licenses/NOTICE.md +32 -0
- package/clinkx-workflows/dist/dashboard-ui/theme-init.js +8 -0
- package/clinkx-workflows/dist/definition-normalizer.d.ts +19 -0
- package/clinkx-workflows/dist/definition-normalizer.js.map +1 -1
- package/clinkx-workflows/dist/delegate-finalizer-policy.d.ts +26 -0
- package/clinkx-workflows/dist/delegate-finalizer-policy.js +72 -0
- package/clinkx-workflows/dist/delegate-finalizer-policy.js.map +1 -0
- package/clinkx-workflows/dist/delegate-signature.d.ts +14 -0
- package/clinkx-workflows/dist/delegate-signature.js +14 -0
- package/clinkx-workflows/dist/delegate-signature.js.map +1 -0
- package/clinkx-workflows/dist/delegate-validate.d.ts +108 -0
- package/clinkx-workflows/dist/delegate-validate.js +148 -0
- package/clinkx-workflows/dist/delegate-validate.js.map +1 -0
- package/clinkx-workflows/dist/engine.d.ts +251 -0
- package/clinkx-workflows/dist/engine.js +1342 -92
- package/clinkx-workflows/dist/engine.js.map +1 -1
- package/clinkx-workflows/dist/errors.d.ts +24 -2
- package/clinkx-workflows/dist/errors.js +30 -2
- package/clinkx-workflows/dist/errors.js.map +1 -1
- package/clinkx-workflows/dist/fidelity.d.ts +47 -1
- package/clinkx-workflows/dist/fidelity.js +54 -1
- package/clinkx-workflows/dist/fidelity.js.map +1 -1
- package/clinkx-workflows/dist/fingerprint.d.ts +25 -7
- package/clinkx-workflows/dist/fingerprint.js +33 -10
- package/clinkx-workflows/dist/fingerprint.js.map +1 -1
- package/clinkx-workflows/dist/index.d.ts +19 -0
- package/clinkx-workflows/dist/index.js +68 -1
- package/clinkx-workflows/dist/index.js.map +1 -1
- package/clinkx-workflows/dist/loader.d.ts +9 -3
- package/clinkx-workflows/dist/loader.js +92 -21
- package/clinkx-workflows/dist/loader.js.map +1 -1
- package/clinkx-workflows/dist/logger.d.ts +1 -1
- package/clinkx-workflows/dist/logger.js +17 -3
- package/clinkx-workflows/dist/logger.js.map +1 -1
- package/clinkx-workflows/dist/monotonic-clock.d.ts +19 -0
- package/clinkx-workflows/dist/monotonic-clock.js +22 -0
- package/clinkx-workflows/dist/monotonic-clock.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/admission.d.ts +160 -0
- package/clinkx-workflows/dist/plan-review/admission.js +290 -0
- package/clinkx-workflows/dist/plan-review/admission.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/context-policy.d.ts +55 -0
- package/clinkx-workflows/dist/plan-review/context-policy.js +146 -0
- package/clinkx-workflows/dist/plan-review/context-policy.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/contract.d.ts +763 -0
- package/clinkx-workflows/dist/plan-review/contract.js +289 -0
- package/clinkx-workflows/dist/plan-review/contract.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/digest.d.ts +68 -0
- package/clinkx-workflows/dist/plan-review/digest.js +241 -0
- package/clinkx-workflows/dist/plan-review/digest.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/discovery.d.ts +45 -0
- package/clinkx-workflows/dist/plan-review/discovery.js +36 -0
- package/clinkx-workflows/dist/plan-review/discovery.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/execution-contract.d.ts +298 -0
- package/clinkx-workflows/dist/plan-review/execution-contract.js +194 -0
- package/clinkx-workflows/dist/plan-review/execution-contract.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/expander.d.ts +48 -0
- package/clinkx-workflows/dist/plan-review/expander.js +243 -0
- package/clinkx-workflows/dist/plan-review/expander.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/projector.d.ts +126 -0
- package/clinkx-workflows/dist/plan-review/projector.js +437 -0
- package/clinkx-workflows/dist/plan-review/projector.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/publication.d.ts +95 -0
- package/clinkx-workflows/dist/plan-review/publication.js +182 -0
- package/clinkx-workflows/dist/plan-review/publication.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/ranking-reducer.d.ts +34 -0
- package/clinkx-workflows/dist/plan-review/ranking-reducer.js +139 -0
- package/clinkx-workflows/dist/plan-review/ranking-reducer.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/resume.d.ts +38 -0
- package/clinkx-workflows/dist/plan-review/resume.js +122 -0
- package/clinkx-workflows/dist/plan-review/resume.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/rubric.d.ts +7 -0
- package/clinkx-workflows/dist/plan-review/rubric.js +24 -0
- package/clinkx-workflows/dist/plan-review/rubric.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/run-state.d.ts +398 -0
- package/clinkx-workflows/dist/plan-review/run-state.js +183 -0
- package/clinkx-workflows/dist/plan-review/run-state.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/runtime-policy.d.ts +74 -0
- package/clinkx-workflows/dist/plan-review/runtime-policy.js +186 -0
- package/clinkx-workflows/dist/plan-review/runtime-policy.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/snapshot.d.ts +81 -0
- package/clinkx-workflows/dist/plan-review/snapshot.js +170 -0
- package/clinkx-workflows/dist/plan-review/snapshot.js.map +1 -0
- package/clinkx-workflows/dist/plan-review/stage-error.d.ts +19 -0
- package/clinkx-workflows/dist/plan-review/stage-error.js +20 -0
- package/clinkx-workflows/dist/plan-review/stage-error.js.map +1 -0
- package/clinkx-workflows/dist/post-processors/index.d.ts +20 -0
- package/clinkx-workflows/dist/post-processors/index.js +21 -0
- package/clinkx-workflows/dist/post-processors/index.js.map +1 -0
- package/clinkx-workflows/dist/prompt-budget.d.ts +7 -0
- package/clinkx-workflows/dist/prompt-budget.js +7 -1
- package/clinkx-workflows/dist/prompt-budget.js.map +1 -1
- package/clinkx-workflows/dist/reducers/index.js +2 -0
- package/clinkx-workflows/dist/reducers/index.js.map +1 -1
- package/clinkx-workflows/dist/roster-contract.d.ts +889 -0
- package/clinkx-workflows/dist/roster-contract.js +180 -0
- package/clinkx-workflows/dist/roster-contract.js.map +1 -0
- package/clinkx-workflows/dist/rosters.d.ts +14 -0
- package/clinkx-workflows/dist/rosters.js +169 -0
- package/clinkx-workflows/dist/rosters.js.map +1 -0
- package/clinkx-workflows/dist/run-health.d.ts +7 -0
- package/clinkx-workflows/dist/run-health.js +25 -0
- package/clinkx-workflows/dist/run-health.js.map +1 -0
- package/clinkx-workflows/dist/run-lock-heartbeat.d.ts +2 -0
- package/clinkx-workflows/dist/run-lock-heartbeat.js +3 -0
- package/clinkx-workflows/dist/run-lock-heartbeat.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/council-plan-review.d.ts +34 -0
- package/clinkx-workflows/dist/run-summary/cards/council-plan-review.js +74 -0
- package/clinkx-workflows/dist/run-summary/cards/council-plan-review.js.map +1 -0
- package/clinkx-workflows/dist/run-summary/cards/index.js +5 -0
- package/clinkx-workflows/dist/run-summary/cards/index.js.map +1 -1
- package/clinkx-workflows/dist/run-summary.d.ts +13 -0
- package/clinkx-workflows/dist/run-summary.js +29 -1
- package/clinkx-workflows/dist/run-summary.js.map +1 -1
- package/clinkx-workflows/dist/schema.d.ts +140 -21
- package/clinkx-workflows/dist/schema.js +34 -1
- package/clinkx-workflows/dist/schema.js.map +1 -1
- package/clinkx-workflows/dist/seed-terms.d.ts +30 -0
- package/clinkx-workflows/dist/seed-terms.js +176 -0
- package/clinkx-workflows/dist/seed-terms.js.map +1 -0
- package/clinkx-workflows/dist/server.d.ts +5 -2
- package/clinkx-workflows/dist/server.js +84 -52
- package/clinkx-workflows/dist/server.js.map +1 -1
- package/clinkx-workflows/dist/shutdown.d.ts +29 -18
- package/clinkx-workflows/dist/shutdown.js +90 -64
- package/clinkx-workflows/dist/shutdown.js.map +1 -1
- package/clinkx-workflows/dist/state-schema.d.ts +61 -0
- package/clinkx-workflows/dist/state.d.ts +175 -3
- package/clinkx-workflows/dist/state.js +1398 -44
- package/clinkx-workflows/dist/state.js.map +1 -1
- package/clinkx-workflows/dist/stdio-watchdog.d.ts +52 -0
- package/clinkx-workflows/dist/stdio-watchdog.js +212 -0
- package/clinkx-workflows/dist/stdio-watchdog.js.map +1 -0
- package/clinkx-workflows/dist/transport.d.ts +15 -0
- package/clinkx-workflows/dist/transport.js +19 -10
- package/clinkx-workflows/dist/transport.js.map +1 -1
- package/clinkx-workflows/dist/types.d.ts +20 -2
- package/clinkx-workflows/dist/validators/council.d.ts +334 -101
- package/clinkx-workflows/dist/validators/council.js +52 -13
- package/clinkx-workflows/dist/validators/council.js.map +1 -1
- package/clinkx-workflows/dist/validators/index.d.ts +1 -0
- package/clinkx-workflows/dist/validators/index.js +3 -0
- package/clinkx-workflows/dist/validators/index.js.map +1 -1
- package/clinkx-workflows/dist/validators/plan-review.d.ts +398 -0
- package/clinkx-workflows/dist/validators/plan-review.js +316 -0
- package/clinkx-workflows/dist/validators/plan-review.js.map +1 -0
- package/clinkx-workflows/dist/workflow-receipt.js +188 -4
- package/clinkx-workflows/dist/workflow-receipt.js.map +1 -1
- package/clinkx-workflows/dist/workflow-tools.d.ts +118 -3
- package/clinkx-workflows/dist/workflow-tools.js +2110 -175
- package/clinkx-workflows/dist/workflow-tools.js.map +1 -1
- package/clinkx-workflows/dist/workspace-signature.d.ts +16 -0
- package/clinkx-workflows/dist/workspace-signature.js +388 -0
- package/clinkx-workflows/dist/workspace-signature.js.map +1 -0
- package/clinkx-workflows/templates/council/answer-chairman.txt +3 -0
- package/clinkx-workflows/templates/council/answer-cross-reviewer.txt +3 -0
- package/clinkx-workflows/templates/council/answer-specialist.txt +5 -1
- package/clinkx-workflows/templates/council/chairman.txt +3 -0
- package/clinkx-workflows/templates/council/code-review-chairman.txt +16 -0
- package/clinkx-workflows/templates/council/code-review-cross-reviewer.txt +7 -1
- package/clinkx-workflows/templates/council/code-review-reviewer.txt +22 -3
- package/clinkx-workflows/templates/council/debug-chairman.txt +3 -0
- package/clinkx-workflows/templates/council/debug-cross-reviewer.txt +3 -0
- package/clinkx-workflows/templates/council/debug-debugger.txt +5 -1
- package/clinkx-workflows/templates/council/discover-analyst.txt +5 -1
- package/clinkx-workflows/templates/council/discover-chairman.txt +3 -0
- package/clinkx-workflows/templates/council/discover-cross-reviewer.txt +3 -0
- package/clinkx-workflows/templates/council/member.txt +5 -1
- package/clinkx-workflows/templates/council/plan-review-chairman.txt +71 -0
- package/clinkx-workflows/templates/council/plan-review-cross-reviewer.txt +54 -0
- package/clinkx-workflows/templates/council/plan-review-reviewer.txt +63 -0
- package/clinkx-workflows/templates/council/reviewer.txt +3 -0
- package/clinkx-workflows/templates/plan-review/chairman.txt +48 -0
- package/clinkx-workflows/templates/plan-review/cross-review.txt +52 -0
- package/clinkx-workflows/templates/plan-review/ranking.txt +16 -0
- package/clinkx-workflows/templates/plan-review/reviewer.txt +57 -0
- package/clinkx-workflows/workflows/council-answer.yaml +100 -8
- package/clinkx-workflows/workflows/council-code-review.yaml +106 -8
- package/clinkx-workflows/workflows/council-debug.yaml +100 -8
- package/clinkx-workflows/workflows/council-default.yaml +104 -8
- package/clinkx-workflows/workflows/council-discover.yaml +100 -8
- package/clinkx-workflows/workflows/council-plan-review.yaml +253 -0
- package/clinkx-workflows/workflows/plan-review-receipts.yaml +230 -0
- package/conf/adapters/agy.json +56 -0
- package/conf/adapters/claude.json +12 -0
- package/conf/adapters/codex-app-server.json +44 -0
- package/conf/adapters/codex.json +14 -2
- package/conf/adapters/glm.json +24 -3
- package/conf/adapters/grok.json +67 -0
- package/conf/adapters/hapi/agy.json +59 -0
- package/conf/adapters/hapi/claude.json +12 -0
- package/conf/adapters/hapi/codex.json +14 -2
- package/conf/adapters/hapi/glm.json +25 -4
- package/conf/rosters/default-council.json +21 -0
- package/dist/activity-journal.d.ts +56 -0
- package/dist/activity-journal.js +706 -0
- package/dist/activity-journal.js.map +1 -0
- package/dist/allowed-roots.d.ts +41 -0
- package/dist/allowed-roots.js +125 -3
- package/dist/allowed-roots.js.map +1 -1
- package/dist/codex/activity-session-log.d.ts +14 -0
- package/dist/codex/activity-session-log.js +206 -0
- package/dist/codex/activity-session-log.js.map +1 -0
- package/dist/codex/agent-tools.d.ts +23 -0
- package/dist/codex/agent-tools.js +1306 -0
- package/dist/codex/agent-tools.js.map +1 -0
- package/dist/codex/app-server-client.d.ts +79 -0
- package/dist/codex/app-server-client.js +593 -0
- package/dist/codex/app-server-client.js.map +1 -0
- package/dist/codex/app-server-registry.d.ts +407 -0
- package/dist/codex/app-server-registry.js +1493 -0
- package/dist/codex/app-server-registry.js.map +1 -0
- package/dist/codex/client-types.d.ts +115 -0
- package/dist/codex/client-types.js +2 -0
- package/dist/codex/client-types.js.map +1 -0
- package/dist/codex/protocol.d.ts +5375 -0
- package/dist/codex/protocol.js +614 -0
- package/dist/codex/protocol.js.map +1 -0
- package/dist/codex/session.d.ts +263 -0
- package/dist/codex/session.js +466 -0
- package/dist/codex/session.js.map +1 -0
- package/dist/config.d.ts +386 -23
- package/dist/config.js +184 -15
- package/dist/config.js.map +1 -1
- package/dist/context-builder/anchors.d.ts +1 -0
- package/dist/context-builder/anchors.js +3 -0
- package/dist/context-builder/anchors.js.map +1 -1
- package/dist/context-builder/bundle.d.ts +48 -2
- package/dist/context-builder/bundle.js +388 -2417
- package/dist/context-builder/bundle.js.map +1 -1
- package/dist/context-builder/codemap.d.ts +5 -0
- package/dist/context-builder/codemap.js +387 -13
- package/dist/context-builder/codemap.js.map +1 -1
- package/dist/context-builder/config.d.ts +1 -0
- package/dist/context-builder/config.js +12 -0
- package/dist/context-builder/config.js.map +1 -1
- package/dist/context-builder/context-run-catalog.d.ts +17 -0
- package/dist/context-builder/context-run-catalog.js +99 -0
- package/dist/context-builder/context-run-catalog.js.map +1 -0
- package/dist/context-builder/delegate-finalizer-effective.d.ts +33 -0
- package/dist/context-builder/delegate-finalizer-effective.js +82 -0
- package/dist/context-builder/delegate-finalizer-effective.js.map +1 -0
- package/dist/context-builder/delegate-packet.d.ts +55 -0
- package/dist/context-builder/delegate-packet.js +430 -74
- package/dist/context-builder/delegate-packet.js.map +1 -1
- package/dist/context-builder/delegate-reconstruction.d.ts +29 -0
- package/dist/context-builder/delegate-reconstruction.js +110 -41
- package/dist/context-builder/delegate-reconstruction.js.map +1 -1
- package/dist/context-builder/delegate-validation.d.ts +41 -1
- package/dist/context-builder/delegate-validation.js +237 -48
- package/dist/context-builder/delegate-validation.js.map +1 -1
- package/dist/context-builder/delegate.d.ts +11 -0
- package/dist/context-builder/delegate.js +210 -58
- package/dist/context-builder/delegate.js.map +1 -1
- package/dist/context-builder/diagnostics.d.ts +11 -2
- package/dist/context-builder/diagnostics.js +39 -6
- package/dist/context-builder/diagnostics.js.map +1 -1
- package/dist/context-builder/discovery-progress.d.ts +25 -0
- package/dist/context-builder/discovery-progress.js +64 -0
- package/dist/context-builder/discovery-progress.js.map +1 -0
- package/dist/context-builder/discovery-watchdog.d.ts +15 -0
- package/dist/context-builder/discovery-watchdog.js +39 -0
- package/dist/context-builder/discovery-watchdog.js.map +1 -0
- package/dist/context-builder/discovery.d.ts +36 -1
- package/dist/context-builder/discovery.js +584 -172
- package/dist/context-builder/discovery.js.map +1 -1
- package/dist/context-builder/external-gaps.d.ts +73 -0
- package/dist/context-builder/external-gaps.js +248 -0
- package/dist/context-builder/external-gaps.js.map +1 -0
- package/dist/context-builder/globs.d.ts +1 -0
- package/dist/context-builder/globs.js +25 -10
- package/dist/context-builder/globs.js.map +1 -1
- package/dist/context-builder/handler.d.ts +67 -2
- package/dist/context-builder/handler.js +1810 -2440
- package/dist/context-builder/handler.js.map +1 -1
- package/dist/context-builder/invocation-sidecar.d.ts +41 -0
- package/dist/context-builder/invocation-sidecar.js +189 -0
- package/dist/context-builder/invocation-sidecar.js.map +1 -0
- package/dist/context-builder/lifecycle-contract.d.ts +424 -0
- package/dist/context-builder/lifecycle-contract.js +523 -0
- package/dist/context-builder/lifecycle-contract.js.map +1 -0
- package/dist/context-builder/lifecycle-journal.d.ts +62 -0
- package/dist/context-builder/lifecycle-journal.js +88 -0
- package/dist/context-builder/lifecycle-journal.js.map +1 -0
- package/dist/context-builder/lifecycle-observer.d.ts +102 -0
- package/dist/context-builder/lifecycle-observer.js +258 -0
- package/dist/context-builder/lifecycle-observer.js.map +1 -0
- package/dist/context-builder/lifecycle-reconcile.d.ts +32 -0
- package/dist/context-builder/lifecycle-reconcile.js +191 -0
- package/dist/context-builder/lifecycle-reconcile.js.map +1 -0
- package/dist/context-builder/lifecycle-recovery.d.ts +2 -0
- package/dist/context-builder/lifecycle-recovery.js +14 -0
- package/dist/context-builder/lifecycle-recovery.js.map +1 -0
- package/dist/context-builder/mutation-lock.d.ts +32 -0
- package/dist/context-builder/mutation-lock.js +321 -0
- package/dist/context-builder/mutation-lock.js.map +1 -0
- package/dist/context-builder/path-signals.js +9 -5
- package/dist/context-builder/path-signals.js.map +1 -1
- package/dist/context-builder/progress.d.ts +3 -1
- package/dist/context-builder/progress.js +23 -0
- package/dist/context-builder/progress.js.map +1 -1
- package/dist/context-builder/receipt.d.ts +6 -4
- package/dist/context-builder/receipt.js +12 -1
- package/dist/context-builder/receipt.js.map +1 -1
- package/dist/context-builder/refine-handler.d.ts +14 -0
- package/dist/context-builder/refine-handler.js +790 -0
- package/dist/context-builder/refine-handler.js.map +1 -0
- package/dist/context-builder/review-coverage.d.ts +116 -0
- package/dist/context-builder/review-coverage.js +544 -0
- package/dist/context-builder/review-coverage.js.map +1 -0
- package/dist/context-builder/schema.d.ts +315 -2
- package/dist/context-builder/schema.js +133 -7
- package/dist/context-builder/schema.js.map +1 -1
- package/dist/context-builder/secrets.d.ts +59 -0
- package/dist/context-builder/secrets.js +2255 -44
- package/dist/context-builder/secrets.js.map +1 -1
- package/dist/context-builder/selection.d.ts +7 -3
- package/dist/context-builder/selection.js +200 -738
- package/dist/context-builder/selection.js.map +1 -1
- package/dist/context-builder/session-log-identity.d.ts +1 -0
- package/dist/context-builder/session-log-identity.js +66 -0
- package/dist/context-builder/session-log-identity.js.map +1 -0
- package/dist/context-builder/slice-range-math.d.ts +16 -0
- package/dist/context-builder/slice-range-math.js +137 -0
- package/dist/context-builder/slice-range-math.js.map +1 -0
- package/dist/context-builder/status.d.ts +23 -2
- package/dist/context-builder/status.js +60 -4
- package/dist/context-builder/status.js.map +1 -1
- package/dist/context-builder/storage.d.ts +59 -2
- package/dist/context-builder/storage.js +500 -168
- package/dist/context-builder/storage.js.map +1 -1
- package/dist/context-builder/token-estimate.d.ts +13 -2
- package/dist/context-builder/token-estimate.js +77 -4
- package/dist/context-builder/token-estimate.js.map +1 -1
- package/dist/context-builder/versions.d.ts +44 -0
- package/dist/context-builder/versions.js +45 -0
- package/dist/context-builder/versions.js.map +1 -0
- package/dist/context-builder/workflow-runner.d.ts +75 -0
- package/dist/context-builder/workflow-runner.js +1241 -0
- package/dist/context-builder/workflow-runner.js.map +1 -0
- package/dist/context-builder/write-watchdog.d.ts +14 -0
- package/dist/context-builder/write-watchdog.js +38 -0
- package/dist/context-builder/write-watchdog.js.map +1 -0
- package/dist/dashboard-adapter-catalog.d.ts +9 -0
- package/dist/dashboard-adapter-catalog.js +53 -0
- package/dist/dashboard-adapter-catalog.js.map +1 -0
- package/dist/dashboard-cli.d.ts +81 -0
- package/dist/dashboard-cli.js +623 -0
- package/dist/dashboard-cli.js.map +1 -0
- package/dist/dashboard-companion/client.d.ts +37 -0
- package/dist/dashboard-companion/client.js +229 -0
- package/dist/dashboard-companion/client.js.map +1 -0
- package/dist/dashboard-companion/config.d.ts +8 -0
- package/dist/dashboard-companion/config.js +52 -0
- package/dist/dashboard-companion/config.js.map +1 -0
- package/dist/dashboard-companion/http-proxy.d.ts +10 -0
- package/dist/dashboard-companion/http-proxy.js +234 -0
- package/dist/dashboard-companion/http-proxy.js.map +1 -0
- package/dist/dashboard-companion/protocol.d.ts +80 -0
- package/dist/dashboard-companion/protocol.js +458 -0
- package/dist/dashboard-companion/protocol.js.map +1 -0
- package/dist/dashboard-companion/standalone-assets.d.ts +12 -0
- package/dist/dashboard-companion/standalone-assets.js +72 -0
- package/dist/dashboard-companion/standalone-assets.js.map +1 -0
- package/dist/dashboard-companion/standalone-entry.d.ts +1 -0
- package/dist/dashboard-companion/standalone-entry.js +17 -0
- package/dist/dashboard-companion/standalone-entry.js.map +1 -0
- package/dist/dashboard-gateway/config.d.ts +9 -0
- package/dist/dashboard-gateway/config.js +44 -0
- package/dist/dashboard-gateway/config.js.map +1 -0
- package/dist/dashboard-gateway/index.d.ts +12 -0
- package/dist/dashboard-gateway/index.js +786 -0
- package/dist/dashboard-gateway/index.js.map +1 -0
- package/dist/dashboard-gateway/main.d.ts +1 -0
- package/dist/dashboard-gateway/main.js +25 -0
- package/dist/dashboard-gateway/main.js.map +1 -0
- package/dist/dashboard-pairing-token.d.ts +1 -0
- package/dist/dashboard-pairing-token.js +5 -0
- package/dist/dashboard-pairing-token.js.map +1 -0
- package/dist/elaris/client.d.ts +73 -0
- package/dist/elaris/client.js +825 -0
- package/dist/elaris/client.js.map +1 -0
- package/dist/elaris/config.d.ts +18 -0
- package/dist/elaris/config.js +75 -0
- package/dist/elaris/config.js.map +1 -0
- package/dist/elaris/errors.d.ts +41 -0
- package/dist/elaris/errors.js +205 -0
- package/dist/elaris/errors.js.map +1 -0
- package/dist/elaris/github-repo.d.ts +18 -0
- package/dist/elaris/github-repo.js +89 -0
- package/dist/elaris/github-repo.js.map +1 -0
- package/dist/elaris/index.d.ts +10 -0
- package/dist/elaris/index.js +11 -0
- package/dist/elaris/index.js.map +1 -0
- package/dist/elaris/redact.d.ts +89 -0
- package/dist/elaris/redact.js +423 -0
- package/dist/elaris/redact.js.map +1 -0
- package/dist/elaris/run-id.d.ts +5 -0
- package/dist/elaris/run-id.js +20 -0
- package/dist/elaris/run-id.js.map +1 -0
- package/dist/elaris/status.d.ts +45 -0
- package/dist/elaris/status.js +122 -0
- package/dist/elaris/status.js.map +1 -0
- package/dist/elaris/tool-schemas.d.ts +314 -0
- package/dist/elaris/tool-schemas.js +208 -0
- package/dist/elaris/tool-schemas.js.map +1 -0
- package/dist/elaris/tools.d.ts +73 -0
- package/dist/elaris/tools.js +1065 -0
- package/dist/elaris/tools.js.map +1 -0
- package/dist/elaris/types.d.ts +1541 -0
- package/dist/elaris/types.js +252 -0
- package/dist/elaris/types.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +19 -0
- package/dist/errors.js.map +1 -1
- package/dist/handler.d.ts +4 -0
- package/dist/handler.js +15 -2
- package/dist/handler.js.map +1 -1
- package/dist/index.d.ts +20 -2
- package/dist/index.js +154 -6
- package/dist/index.js.map +1 -1
- package/dist/local-clink-backend.d.ts +3 -0
- package/dist/local-clink-backend.js +4 -0
- package/dist/local-clink-backend.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +18 -3
- package/dist/logger.js.map +1 -1
- package/dist/package-info.d.ts +2 -0
- package/dist/package-info.js +18 -0
- package/dist/package-info.js.map +1 -0
- package/dist/parsers/agy-stream-json.d.ts +14 -0
- package/dist/parsers/agy-stream-json.js +172 -0
- package/dist/parsers/agy-stream-json.js.map +1 -0
- package/dist/parsers/codex-jsonl.js +48 -3
- package/dist/parsers/codex-jsonl.js.map +1 -1
- package/dist/parsers/extract.d.ts +10 -1
- package/dist/parsers/extract.js +16 -4
- package/dist/parsers/extract.js.map +1 -1
- package/dist/parsers/observed-invocation.d.ts +20 -0
- package/dist/parsers/observed-invocation.js +42 -0
- package/dist/parsers/observed-invocation.js.map +1 -0
- package/dist/pipeline.d.ts +17 -0
- package/dist/pipeline.js +181 -10
- package/dist/pipeline.js.map +1 -1
- package/dist/progress-report/lock.d.ts +74 -0
- package/dist/progress-report/lock.js +343 -0
- package/dist/progress-report/lock.js.map +1 -0
- package/dist/progress-report/schema.d.ts +808 -0
- package/dist/progress-report/schema.js +119 -0
- package/dist/progress-report/schema.js.map +1 -0
- package/dist/progress-report/store.d.ts +66 -0
- package/dist/progress-report/store.js +766 -0
- package/dist/progress-report/store.js.map +1 -0
- package/dist/progress-report/tools.d.ts +20 -0
- package/dist/progress-report/tools.js +141 -0
- package/dist/progress-report/tools.js.map +1 -0
- package/dist/prompt-mode.d.ts +1 -1
- package/dist/prompt-mode.js +7 -2
- package/dist/prompt-mode.js.map +1 -1
- package/dist/run-dir.d.ts +24 -0
- package/dist/run-dir.js +201 -2
- package/dist/run-dir.js.map +1 -1
- package/dist/runner.d.ts +20 -0
- package/dist/runner.js +192 -16
- package/dist/runner.js.map +1 -1
- package/dist/safety.d.ts +54 -4
- package/dist/safety.js +186 -5
- package/dist/safety.js.map +1 -1
- package/dist/schema.d.ts +15 -7
- package/dist/schema.js +20 -0
- package/dist/schema.js.map +1 -1
- package/dist/server.d.ts +7 -1
- package/dist/server.js +451 -23
- package/dist/server.js.map +1 -1
- package/dist/session-log-stream.d.ts +18 -0
- package/dist/session-log-stream.js +566 -0
- package/dist/session-log-stream.js.map +1 -0
- package/dist/stdio-activity.d.ts +28 -0
- package/dist/stdio-activity.js +72 -0
- package/dist/stdio-activity.js.map +1 -0
- package/package.json +47 -5
- package/conf/adapters/gemini.json +0 -44
- package/conf/adapters/hapi/gemini.json +0 -47
- package/dist/parsers/gemini-json.d.ts +0 -2
- package/dist/parsers/gemini-json.js +0 -72
- package/dist/parsers/gemini-json.js.map +0 -1
|
@@ -0,0 +1,1284 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { PLAN_REVIEW_RESULT_RELPATH } from "../plan-review/publication.js";
|
|
3
|
+
import { EFFORT_VALUE_MAX, EFFORT_VALUE_PATTERN, IdSchema, MODEL_VALUE_MAX, MODEL_VALUE_PATTERN, } from "../schema.js";
|
|
4
|
+
import { CONTEXT_BUILDER_EXECUTION_STATUSES, CONTEXT_BUILDER_FALLBACK_STATUSES, CONTEXT_BUILDER_LIFECYCLE_PHASES, CONTEXT_BUILDER_LIFECYCLE_REASON_CODES, CONTEXT_BUILDER_LIFECYCLE_STATUSES, CONTEXT_BUILDER_OPERATION_KINDS, ContextBuilderLifecycleStateV1Schema, isContextBuilderOperationId, } from "../context-builder-lifecycle-contract.js";
|
|
5
|
+
import { ActivityIdSchema, ActivityKindSchema, ActivityOutcomeKindSchema, ActivityPhaseSchema, } from "./activity-contract.js";
|
|
6
|
+
import { ContextBuilderInvocationAuditReadSchema } from "./context-builder-invocation-contract.js";
|
|
7
|
+
import { InvocationAuditReadSchema, ObservedInvocationV1Schema, } from "./invocation-contract.js";
|
|
8
|
+
import { SESSION_LOG_V1_SCHEMA_VERSION, parseSessionLogEventV1, } from "./session-log-contract.js";
|
|
9
|
+
import { PROGRESS_REPORT_SCHEMA_VERSION, BoundedIdSchema, BoundedMessageSchema, BoundedTitleSchema, NonnegativeSafeIntegerSchema, ProjectFolderPathSchema, ProgressReportSessionIdSchema, StrictRfc3339TimestampSchema, } from "./progress-report-contract.js";
|
|
10
|
+
export const MAX_DASHBOARD_STAGE_CALL_RECORDS = 2_000;
|
|
11
|
+
export const MAX_DASHBOARD_ID_CHARS = 128;
|
|
12
|
+
export const MAX_DASHBOARD_PATH_CHARS = 4_096;
|
|
13
|
+
export const MAX_DASHBOARD_RAW_TEXT_CHARS = 2 * 1_024 * 1_024;
|
|
14
|
+
export const MAX_DASHBOARD_STATE_TEXT_CHARS = 64 * 1_024 * 1_024;
|
|
15
|
+
export const MAX_DASHBOARD_WORKFLOW_INPUT_CHARS = 1_024 * 1_024;
|
|
16
|
+
export const MAX_DASHBOARD_WORKFLOW_INPUT_PATHS = 2_048;
|
|
17
|
+
export const MAX_DASHBOARD_ADAPTERS = 256;
|
|
18
|
+
export const DashboardCanonicalHttpsOriginSchema = z.string().superRefine((value, context) => {
|
|
19
|
+
let parsed;
|
|
20
|
+
try {
|
|
21
|
+
parsed = new URL(value);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
context.addIssue({
|
|
25
|
+
code: z.ZodIssueCode.custom,
|
|
26
|
+
message: "must be a canonical absolute HTTPS origin",
|
|
27
|
+
});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (parsed.protocol !== "https:" ||
|
|
31
|
+
parsed.username !== "" ||
|
|
32
|
+
parsed.password !== "" ||
|
|
33
|
+
parsed.pathname !== "/" ||
|
|
34
|
+
parsed.search !== "" ||
|
|
35
|
+
parsed.hash !== "" ||
|
|
36
|
+
parsed.origin !== value) {
|
|
37
|
+
context.addIssue({
|
|
38
|
+
code: z.ZodIssueCode.custom,
|
|
39
|
+
message: "must be a canonical absolute HTTPS origin",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
export const DashboardAgentInstanceIdSchema = z.string().regex(/^[A-Za-z0-9_-]{22}$/);
|
|
44
|
+
export const DashboardBearerCapabilitySchema = z.string().regex(/^[A-Za-z0-9_-]{43}$/);
|
|
45
|
+
export const DashboardRemoteAccessConfigSchema = z.object({
|
|
46
|
+
apiOrigin: DashboardCanonicalHttpsOriginSchema,
|
|
47
|
+
uiOrigin: DashboardCanonicalHttpsOriginSchema,
|
|
48
|
+
}).strict();
|
|
49
|
+
export const DashboardConnectionResponseSchema = z.object({
|
|
50
|
+
schemaVersion: z.literal("dashboard-connection-v1"),
|
|
51
|
+
agentInstanceId: DashboardAgentInstanceIdSchema,
|
|
52
|
+
}).strict();
|
|
53
|
+
export const DashboardRemoteFragmentInputSchema = z.object({
|
|
54
|
+
apiOrigin: DashboardCanonicalHttpsOriginSchema,
|
|
55
|
+
agentInstanceId: DashboardAgentInstanceIdSchema,
|
|
56
|
+
token: DashboardBearerCapabilitySchema,
|
|
57
|
+
}).strict();
|
|
58
|
+
export function formatDashboardRemoteFragment(input) {
|
|
59
|
+
const parsed = DashboardRemoteFragmentInputSchema.parse(input);
|
|
60
|
+
return [
|
|
61
|
+
"#v=1",
|
|
62
|
+
`apiOrigin=${encodeURIComponent(parsed.apiOrigin)}`,
|
|
63
|
+
`agentInstanceId=${parsed.agentInstanceId}`,
|
|
64
|
+
`token=${parsed.token}`,
|
|
65
|
+
].join("&");
|
|
66
|
+
}
|
|
67
|
+
const RUN_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
68
|
+
const SHA256_PATTERN = /^[0-9a-f]{64}$/;
|
|
69
|
+
const COMPLEXITY_ISSUE = "dashboard_stage_call_limit_exceeded";
|
|
70
|
+
const RunIdSchema = z.string().max(64).regex(RUN_ID_PATTERN);
|
|
71
|
+
const DashboardIdSchema = IdSchema.max(MAX_DASHBOARD_ID_CHARS);
|
|
72
|
+
export const DashboardModelSchema = z
|
|
73
|
+
.string()
|
|
74
|
+
.min(1)
|
|
75
|
+
.max(MODEL_VALUE_MAX)
|
|
76
|
+
.regex(MODEL_VALUE_PATTERN);
|
|
77
|
+
export const DashboardEffortSchema = z
|
|
78
|
+
.string()
|
|
79
|
+
.min(1)
|
|
80
|
+
.max(EFFORT_VALUE_MAX)
|
|
81
|
+
.regex(EFFORT_VALUE_PATTERN);
|
|
82
|
+
const TimestampSchema = z.string().max(64).datetime({ offset: true });
|
|
83
|
+
const RelativePathSchema = z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS);
|
|
84
|
+
const DashboardCallStateSchema = z.enum([
|
|
85
|
+
"pending",
|
|
86
|
+
"running",
|
|
87
|
+
"succeeded",
|
|
88
|
+
"failed",
|
|
89
|
+
"cancelled",
|
|
90
|
+
]);
|
|
91
|
+
const DashboardFailureClassSchema = z.enum(["transient", "permanent"]);
|
|
92
|
+
/**
|
|
93
|
+
* `heartbeat_live` is appended, never reordered: a producer on a foreign host
|
|
94
|
+
* refreshed its `run.lock` mtime within the declared staleness window. It is
|
|
95
|
+
* weaker evidence than `live` (a same-host PID probe) and is reported as a
|
|
96
|
+
* distinct value rather than folded into `live`.
|
|
97
|
+
*/
|
|
98
|
+
export const WorkerLockObservationSchema = z.enum([
|
|
99
|
+
"live",
|
|
100
|
+
"orphaned",
|
|
101
|
+
"unknown",
|
|
102
|
+
"heartbeat_live",
|
|
103
|
+
]);
|
|
104
|
+
/** Strict display contract for the exact persisted pre-dispatch Clink input. */
|
|
105
|
+
export const DashboardWorkflowInputSchema = z.object({
|
|
106
|
+
prompt: z.string().max(MAX_DASHBOARD_WORKFLOW_INPUT_CHARS),
|
|
107
|
+
cli_name: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
108
|
+
role: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
109
|
+
model: DashboardModelSchema.optional(),
|
|
110
|
+
effort: DashboardEffortSchema.optional(),
|
|
111
|
+
absolute_file_paths: z
|
|
112
|
+
.array(z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS))
|
|
113
|
+
.max(MAX_DASHBOARD_WORKFLOW_INPUT_PATHS)
|
|
114
|
+
.optional(),
|
|
115
|
+
images: z
|
|
116
|
+
.array(z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS))
|
|
117
|
+
.max(MAX_DASHBOARD_WORKFLOW_INPUT_PATHS)
|
|
118
|
+
.optional(),
|
|
119
|
+
context: z.string().max(MAX_DASHBOARD_WORKFLOW_INPUT_CHARS).optional(),
|
|
120
|
+
continuation_id: z.string().min(1).max(256).optional(),
|
|
121
|
+
timeout_seconds: z.number().finite().positive().optional(),
|
|
122
|
+
max_response_chars: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),
|
|
123
|
+
expect_json: z.boolean().optional(),
|
|
124
|
+
debug: z.boolean().optional(),
|
|
125
|
+
debug_keep_artifacts: z.boolean().optional(),
|
|
126
|
+
}).strict();
|
|
127
|
+
const SortedUniqueStringsSchema = z
|
|
128
|
+
.array(z.string().min(1).max(MAX_DASHBOARD_ID_CHARS))
|
|
129
|
+
.max(256)
|
|
130
|
+
.refine((values) => values.every((value, index) => index === 0 || values[index - 1] < value), "must be sorted and unique");
|
|
131
|
+
/**
|
|
132
|
+
* Per-adapter invocation capabilities, projected from
|
|
133
|
+
* `invocation_overrides` (model template presence, effort vocabulary).
|
|
134
|
+
* The prompt builder mirrors admission with this block; absent on
|
|
135
|
+
* descriptors produced before it shipped.
|
|
136
|
+
*/
|
|
137
|
+
export const AdapterInvocationCapabilitiesSchema = z.object({
|
|
138
|
+
supportsModel: z.boolean(),
|
|
139
|
+
supportsEffort: z.boolean(),
|
|
140
|
+
effortAllowedValues: z
|
|
141
|
+
// Empty = the adapter declares no effort override (app_server backends
|
|
142
|
+
// cannot); the projection always emits the block.
|
|
143
|
+
.array(z.string().regex(/^[a-z0-9][a-z0-9_-]*$/))
|
|
144
|
+
.max(16),
|
|
145
|
+
}).strict();
|
|
146
|
+
/** Positive allowlist for root-injected adapter metadata. */
|
|
147
|
+
export const SafeAdapterDescriptorSchema = z.object({
|
|
148
|
+
name: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS),
|
|
149
|
+
command: z
|
|
150
|
+
.string()
|
|
151
|
+
.min(1)
|
|
152
|
+
.max(256)
|
|
153
|
+
.refine((value) => !value.includes("/") && !value.includes("\\"), "command must be a basename"),
|
|
154
|
+
parser: z.enum(["text", "json_extract", "codex_jsonl", "claude_json", "claude_stream_json", "agy_stream_json"]),
|
|
155
|
+
promptMode: z.enum(["stdin", "arg", "file"]),
|
|
156
|
+
timeoutSeconds: z.number().finite().positive(),
|
|
157
|
+
idleTimeoutSeconds: z.number().finite().min(0).optional(),
|
|
158
|
+
idleTimeoutStartupSeconds: z.number().finite().min(0).optional(),
|
|
159
|
+
roleNames: SortedUniqueStringsSchema,
|
|
160
|
+
environmentKeys: SortedUniqueStringsSchema,
|
|
161
|
+
supportsImages: z.boolean(),
|
|
162
|
+
resultContract: z.object({
|
|
163
|
+
enabled: z.boolean(),
|
|
164
|
+
filename: z.enum(["RESULT.md", "RESULT.json"]),
|
|
165
|
+
}).strict(),
|
|
166
|
+
backend: z.enum(["subprocess", "app_server"]),
|
|
167
|
+
workflowEligible: z.boolean().optional(),
|
|
168
|
+
usableVia: z.array(z.enum([
|
|
169
|
+
"clink",
|
|
170
|
+
"context_builder",
|
|
171
|
+
"run_workflow",
|
|
172
|
+
"clink_agent_run",
|
|
173
|
+
"clink_agent_manage",
|
|
174
|
+
])).max(5).optional(),
|
|
175
|
+
capabilities: AdapterInvocationCapabilitiesSchema.optional(),
|
|
176
|
+
}).strict();
|
|
177
|
+
export const MAX_DASHBOARD_PAGE_SIZE = 500;
|
|
178
|
+
const OpaqueCursorSchema = z.string().min(1).max(1_024).regex(/^[A-Za-z0-9_-]+$/);
|
|
179
|
+
const OpaqueGenerationSchema = z.string().min(16).max(128).regex(/^[A-Za-z0-9_-]+$/);
|
|
180
|
+
const SingleCursorValuesSchema = z.array(OpaqueCursorSchema).length(1).transform(([value]) => value);
|
|
181
|
+
const SingleGenerationValuesSchema = z
|
|
182
|
+
.array(OpaqueGenerationSchema)
|
|
183
|
+
.length(1)
|
|
184
|
+
.transform(([value]) => value);
|
|
185
|
+
const SingleLimitValuesSchema = z
|
|
186
|
+
.array(z.string().regex(/^[1-9][0-9]{0,2}$/))
|
|
187
|
+
.length(1)
|
|
188
|
+
.transform(([value]) => Number(value))
|
|
189
|
+
.refine((value) => value <= MAX_DASHBOARD_PAGE_SIZE, `limit must be <= ${String(MAX_DASHBOARD_PAGE_SIZE)}`);
|
|
190
|
+
/** Query contracts consume a multimap so duplicate security fields stay visible. */
|
|
191
|
+
export const PaginationQuerySchema = z.object({
|
|
192
|
+
limit: SingleLimitValuesSchema.optional(),
|
|
193
|
+
before: SingleCursorValuesSchema.optional(),
|
|
194
|
+
}).strict().transform((query) => ({
|
|
195
|
+
limit: query.limit ?? 100,
|
|
196
|
+
...(query.before === undefined ? {} : { before: query.before }),
|
|
197
|
+
}));
|
|
198
|
+
export const GenerationQuerySchema = z.object({
|
|
199
|
+
generation: SingleGenerationValuesSchema,
|
|
200
|
+
}).strict().transform((query) => ({ generation: query.generation }));
|
|
201
|
+
const SingleSessionLogSequenceValuesSchema = z
|
|
202
|
+
.array(z.string().regex(/^(?:0|[1-9][0-9]{0,15})$/))
|
|
203
|
+
.length(1)
|
|
204
|
+
.transform(([value]) => Number(value))
|
|
205
|
+
.refine(Number.isSafeInteger, "sequence must be a safe integer");
|
|
206
|
+
export const SessionLogLaneIndexQuerySchema = z.object({
|
|
207
|
+
generation: SingleGenerationValuesSchema,
|
|
208
|
+
}).strict().transform((query) => ({ generation: query.generation }));
|
|
209
|
+
export const SessionLogPageQuerySchema = z.object({
|
|
210
|
+
generation: SingleGenerationValuesSchema,
|
|
211
|
+
sequence: SingleSessionLogSequenceValuesSchema.optional(),
|
|
212
|
+
limit: SingleLimitValuesSchema.optional(),
|
|
213
|
+
}).strict().transform((query) => ({
|
|
214
|
+
generation: query.generation,
|
|
215
|
+
sequence: query.sequence ?? 0,
|
|
216
|
+
limit: query.limit ?? 100,
|
|
217
|
+
}));
|
|
218
|
+
const SessionLogLaneDescriptorResponseSchema = z.object({
|
|
219
|
+
owner: z.record(z.unknown()),
|
|
220
|
+
lane: z.object({
|
|
221
|
+
laneId: z.string().min(1).max(160).regex(/^[A-Za-z0-9_:-]+$/),
|
|
222
|
+
}).strict(),
|
|
223
|
+
nextSequence: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
|
|
224
|
+
}).strict().superRefine((descriptor, context) => {
|
|
225
|
+
try {
|
|
226
|
+
parseSessionLogEventV1({
|
|
227
|
+
schemaVersion: SESSION_LOG_V1_SCHEMA_VERSION,
|
|
228
|
+
sequence: 0,
|
|
229
|
+
timestamp: "2000-01-01T00:00:00.000Z",
|
|
230
|
+
producerFamily: descriptor.owner.family,
|
|
231
|
+
owner: descriptor.owner,
|
|
232
|
+
lane: descriptor.lane,
|
|
233
|
+
authority: "observability_only",
|
|
234
|
+
redaction: { ran: true, status: "no_matches", count: 0 },
|
|
235
|
+
truncation: "none",
|
|
236
|
+
completeness: "complete",
|
|
237
|
+
parseWarnings: [],
|
|
238
|
+
event: { kind: "lifecycle", state: "pending" },
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
context.addIssue({
|
|
243
|
+
code: z.ZodIssueCode.custom,
|
|
244
|
+
message: "invalid session-log lane descriptor",
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
export const SessionLogLaneIndexResponseSchema = z.object({
|
|
249
|
+
schemaVersion: z.literal("session-log-index-v1"),
|
|
250
|
+
availability: z.discriminatedUnion("availability", [
|
|
251
|
+
z.object({ availability: z.literal("available") }).strict(),
|
|
252
|
+
z.object({
|
|
253
|
+
availability: z.literal("not_retained"),
|
|
254
|
+
reason: z.literal("producer_did_not_retain"),
|
|
255
|
+
}).strict(),
|
|
256
|
+
]),
|
|
257
|
+
lanes: z.array(SessionLogLaneDescriptorResponseSchema).max(2_000),
|
|
258
|
+
}).strict().superRefine((response, context) => {
|
|
259
|
+
if ((response.availability.availability === "available") !==
|
|
260
|
+
(response.lanes.length > 0)) {
|
|
261
|
+
context.addIssue({
|
|
262
|
+
code: z.ZodIssueCode.custom,
|
|
263
|
+
message: "session-log lane availability must match discovered lanes",
|
|
264
|
+
path: ["availability"],
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
export const StructuredDetailQuerySchema = z.object({
|
|
269
|
+
generation: SingleGenerationValuesSchema.optional(),
|
|
270
|
+
}).strict().transform((query) => query.generation === undefined ? {} : { generation: query.generation });
|
|
271
|
+
/** Detail routes resolve the current incarnation and admit no query fields. */
|
|
272
|
+
export const EmptyQuerySchema = z.object({}).strict();
|
|
273
|
+
export const ContextRunListQuerySchema = z.object({
|
|
274
|
+
limit: SingleLimitValuesSchema.optional(),
|
|
275
|
+
}).strict().transform((query) => ({ limit: query.limit ?? 100 }));
|
|
276
|
+
const ContextRunRouteIdSchema = z.string()
|
|
277
|
+
.max(64)
|
|
278
|
+
.regex(/^[A-Za-z0-9_-]{1,64}$/)
|
|
279
|
+
.refine((id) => !id.startsWith("wfctx") && !id.startsWith("wfpre"), "workflow-owned context records are not context runs");
|
|
280
|
+
export const ContextRunRouteParamsSchema = z.object({
|
|
281
|
+
id: ContextRunRouteIdSchema,
|
|
282
|
+
}).strict();
|
|
283
|
+
/**
|
|
284
|
+
* Artifact keys servable via the bounded `/context-runs/:id/artifacts/:key`
|
|
285
|
+
* body endpoint. Mirrors the producer artifact filename map; the reader pins its
|
|
286
|
+
* own copy to the producer export via a parity test, so this enum and the
|
|
287
|
+
* reader's `CONTEXT_RUN_ARTIFACT_FILE_NAMES` cannot drift independently.
|
|
288
|
+
*/
|
|
289
|
+
export const ContextRunArtifactKeySchema = z.enum([
|
|
290
|
+
"manifest_json",
|
|
291
|
+
"bundle_md",
|
|
292
|
+
"selected_context_jsonl",
|
|
293
|
+
"tree_json",
|
|
294
|
+
"search_jsonl",
|
|
295
|
+
"slices_jsonl",
|
|
296
|
+
"codemap_jsonl",
|
|
297
|
+
"summary_json",
|
|
298
|
+
]);
|
|
299
|
+
export const ContextRunArtifactRouteParamsSchema = z.object({
|
|
300
|
+
id: ContextRunRouteIdSchema,
|
|
301
|
+
artifactKey: ContextRunArtifactKeySchema,
|
|
302
|
+
}).strict();
|
|
303
|
+
export const RunRouteParamsSchema = z.object({
|
|
304
|
+
runId: RunIdSchema,
|
|
305
|
+
}).strict();
|
|
306
|
+
export const ActivityRouteParamsSchema = z.object({
|
|
307
|
+
activityId: ActivityIdSchema,
|
|
308
|
+
}).strict();
|
|
309
|
+
export const CallRouteParamsSchema = z.object({
|
|
310
|
+
runId: RunIdSchema,
|
|
311
|
+
stageId: DashboardIdSchema,
|
|
312
|
+
callId: DashboardIdSchema,
|
|
313
|
+
contentKind: z.enum(["prompt", "output", "error", "artifact"]),
|
|
314
|
+
}).strict();
|
|
315
|
+
export const SessionLogWorkflowRouteParamsSchema = z.object({
|
|
316
|
+
runId: RunIdSchema,
|
|
317
|
+
stageId: DashboardIdSchema,
|
|
318
|
+
callId: DashboardIdSchema,
|
|
319
|
+
}).strict();
|
|
320
|
+
export const SessionLogLaneRouteParamsSchema = z.object({
|
|
321
|
+
laneId: z.string().min(1).max(160).regex(/^[A-Za-z0-9_:-]+$/),
|
|
322
|
+
}).strict();
|
|
323
|
+
const WorkflowVariableDescriptorSchema = z.object({
|
|
324
|
+
name: DashboardIdSchema,
|
|
325
|
+
type: z.enum(["string", "number", "boolean", "string[]"]),
|
|
326
|
+
required: z.boolean(),
|
|
327
|
+
description: z.string().max(4_096).optional(),
|
|
328
|
+
}).strict();
|
|
329
|
+
/**
|
|
330
|
+
* Stage context reference: a stage id, or "stage.call" for one call's output
|
|
331
|
+
* (the workflow grammar's reference syntax). Bounded so a projection of a
|
|
332
|
+
* legal definition can never overflow the dashboard contract.
|
|
333
|
+
*/
|
|
334
|
+
const WorkflowContextRefSchema = z
|
|
335
|
+
.string()
|
|
336
|
+
.min(1)
|
|
337
|
+
.max((MAX_DASHBOARD_ID_CHARS * 2) + 1)
|
|
338
|
+
.regex(/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?$/, "must be a stage id or stage.call reference");
|
|
339
|
+
/**
|
|
340
|
+
* One declared call in a projected stage. Selectors are bounded free-form
|
|
341
|
+
* strings (the definition grammar only requires min(1) on cli_name/role), so
|
|
342
|
+
* the allowlist constrains length, not alphabet — never prompt or path fields.
|
|
343
|
+
*/
|
|
344
|
+
const WorkflowStageCallDescriptorSchema = z.object({
|
|
345
|
+
id: DashboardIdSchema,
|
|
346
|
+
cliName: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
347
|
+
role: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
348
|
+
reducer: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
349
|
+
}).strict();
|
|
350
|
+
/** One declared stage in a projected workflow (positive allowlist; no prompts, templates, or validator ids). */
|
|
351
|
+
const WorkflowStageDescriptorSchema = z.object({
|
|
352
|
+
id: DashboardIdSchema,
|
|
353
|
+
parallel: z.boolean(),
|
|
354
|
+
onFailure: z.enum(["abort", "continue"]),
|
|
355
|
+
maxRetries: z.number().int().min(0).max(1_000),
|
|
356
|
+
contextFrom: z.array(WorkflowContextRefSchema).max(256),
|
|
357
|
+
anonymizeContext: z.boolean(),
|
|
358
|
+
/** Set by the projection for plan-review seed stages the expander clones per admitted roster seat. */
|
|
359
|
+
expands: z.literal("per_roster_seat").optional(),
|
|
360
|
+
calls: z.array(WorkflowStageCallDescriptorSchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
361
|
+
}).strict();
|
|
362
|
+
export const WorkflowDescriptorSchema = z.object({
|
|
363
|
+
name: DashboardIdSchema,
|
|
364
|
+
version: z.string().min(1).max(128),
|
|
365
|
+
description: z.string().max(4_096),
|
|
366
|
+
timeoutSeconds: z.number().finite().positive().optional(),
|
|
367
|
+
stages: z.array(WorkflowStageDescriptorSchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS).optional(),
|
|
368
|
+
stageCount: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
369
|
+
callCount: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
370
|
+
variables: z.array(WorkflowVariableDescriptorSchema).max(512),
|
|
371
|
+
}).strict();
|
|
372
|
+
const DashboardChildConfigSourceSchema = z.discriminatedUnion("source", [
|
|
373
|
+
z.object({
|
|
374
|
+
source: z.literal("explicit"),
|
|
375
|
+
configured: z.literal(true),
|
|
376
|
+
path: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
377
|
+
}).strict(),
|
|
378
|
+
z.object({
|
|
379
|
+
source: z.literal("ambient"),
|
|
380
|
+
configured: z.literal(false),
|
|
381
|
+
}).strict(),
|
|
382
|
+
]);
|
|
383
|
+
export const DashboardEnvironmentSchema = z.object({
|
|
384
|
+
stateDir: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
385
|
+
activitiesRoot: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS).optional(),
|
|
386
|
+
progressReportsRoot: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS).optional(),
|
|
387
|
+
runsRoot: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
388
|
+
workspaceRoot: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
389
|
+
workflowsPath: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
390
|
+
templatesPath: z.string().min(1).max(MAX_DASHBOARD_PATH_CHARS),
|
|
391
|
+
childConfig: DashboardChildConfigSourceSchema,
|
|
392
|
+
}).strict();
|
|
393
|
+
const RunIdentitySchema = z.object({
|
|
394
|
+
runId: RunIdSchema,
|
|
395
|
+
runGeneration: OpaqueGenerationSchema,
|
|
396
|
+
stateRevision: OpaqueGenerationSchema,
|
|
397
|
+
});
|
|
398
|
+
const DashboardStageMarkerSchema = z.object({
|
|
399
|
+
stageId: DashboardIdSchema,
|
|
400
|
+
state: DashboardCallStateSchema,
|
|
401
|
+
}).strict();
|
|
402
|
+
export const MAX_DASHBOARD_STAGE_MARKERS = 64;
|
|
403
|
+
export const MAX_DASHBOARD_LIVE_RUNS = 500;
|
|
404
|
+
/** Cap on projected `cb_roots` (mirrors the search-terms channel cap). */
|
|
405
|
+
export const MAX_DASHBOARD_ROOTS = 20;
|
|
406
|
+
export const MAX_DASHBOARD_AGGREGATE_RETRY_COUNT = MAX_DASHBOARD_STAGE_CALL_RECORDS * 1_000_000;
|
|
407
|
+
const CompactStateCountsSchema = z.object({
|
|
408
|
+
pending: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
409
|
+
running: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
410
|
+
succeeded: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
411
|
+
failed: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
412
|
+
cancelled: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
413
|
+
}).strict();
|
|
414
|
+
const HealthyRunListItemSchema = RunIdentitySchema.extend({
|
|
415
|
+
availability: z.literal("available"),
|
|
416
|
+
workflowName: DashboardIdSchema,
|
|
417
|
+
workflowVersion: z.string().min(1).max(128),
|
|
418
|
+
status: DashboardCallStateSchema,
|
|
419
|
+
orphaned: z.boolean(),
|
|
420
|
+
workerLockObservation: WorkerLockObservationSchema.optional(),
|
|
421
|
+
resumable: z.boolean(),
|
|
422
|
+
startedAt: TimestampSchema.optional(),
|
|
423
|
+
completedAt: TimestampSchema.optional(),
|
|
424
|
+
stateUpdatedAt: TimestampSchema,
|
|
425
|
+
failureClass: DashboardFailureClassSchema.optional(),
|
|
426
|
+
async: z.boolean(),
|
|
427
|
+
debugKeepArtifacts: z.boolean(),
|
|
428
|
+
retryCount: z.number().int().min(0).max(MAX_DASHBOARD_AGGREGATE_RETRY_COUNT),
|
|
429
|
+
reportedRunningCalls: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
430
|
+
stageCounts: CompactStateCountsSchema,
|
|
431
|
+
callCounts: CompactStateCountsSchema,
|
|
432
|
+
stageMarkers: z.array(DashboardStageMarkerSchema).max(MAX_DASHBOARD_STAGE_MARKERS),
|
|
433
|
+
additionalStageCount: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
434
|
+
/**
|
|
435
|
+
* Project folder(s) the run was created for, sourced from the persisted
|
|
436
|
+
* `variables.cb_roots`. Always present (empty when no roots were recorded) so
|
|
437
|
+
* the detail page can show a stable "project folder" row.
|
|
438
|
+
*/
|
|
439
|
+
projectFolders: z.array(z.string()).max(MAX_DASHBOARD_ROOTS),
|
|
440
|
+
}).strict();
|
|
441
|
+
const UnavailableReasonSchema = z.enum([
|
|
442
|
+
"state_unreadable",
|
|
443
|
+
"state_invalid",
|
|
444
|
+
"too_large_for_dashboard",
|
|
445
|
+
"too_complex_for_dashboard",
|
|
446
|
+
"path_rejected",
|
|
447
|
+
"identity_mismatch",
|
|
448
|
+
"run_generation_race",
|
|
449
|
+
]);
|
|
450
|
+
const UnavailableRunSchema = RunIdentitySchema.extend({
|
|
451
|
+
availability: z.literal("unavailable"),
|
|
452
|
+
reason: UnavailableReasonSchema,
|
|
453
|
+
chronologyAt: TimestampSchema.optional(),
|
|
454
|
+
}).strict();
|
|
455
|
+
export const ActivityLeaseObservationSchema = z.enum([
|
|
456
|
+
"live",
|
|
457
|
+
"orphaned",
|
|
458
|
+
"unknown",
|
|
459
|
+
]);
|
|
460
|
+
function requireConsistentActivityLease(item, ctx) {
|
|
461
|
+
if (item.orphaned !== (item.leaseObservation === "orphaned")) {
|
|
462
|
+
ctx.addIssue({
|
|
463
|
+
code: z.ZodIssueCode.custom,
|
|
464
|
+
message: "orphaned must agree with leaseObservation",
|
|
465
|
+
path: ["orphaned"],
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
if (item.status !== "running") {
|
|
469
|
+
if (item.orphaned || item.leaseObservation !== "unknown") {
|
|
470
|
+
ctx.addIssue({
|
|
471
|
+
code: z.ZodIssueCode.custom,
|
|
472
|
+
message: "terminal activities cannot carry a live or orphaned lease",
|
|
473
|
+
path: ["leaseObservation"],
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
function requireConsistentWorkerLockObservation(item, ctx) {
|
|
479
|
+
if (item.workerLockObservation !== undefined &&
|
|
480
|
+
item.orphaned !== (item.workerLockObservation === "orphaned")) {
|
|
481
|
+
ctx.addIssue({
|
|
482
|
+
code: z.ZodIssueCode.custom,
|
|
483
|
+
message: "orphaned must agree with workerLockObservation",
|
|
484
|
+
path: ["orphaned"],
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
const ConsistentHealthyRunListItemSchema = HealthyRunListItemSchema.superRefine(requireConsistentWorkerLockObservation);
|
|
489
|
+
export const RunListItemSchema = z.discriminatedUnion("availability", [
|
|
490
|
+
HealthyRunListItemSchema,
|
|
491
|
+
UnavailableRunSchema,
|
|
492
|
+
]).superRefine((item, ctx) => {
|
|
493
|
+
if (item.availability === "available")
|
|
494
|
+
requireConsistentWorkerLockObservation(item, ctx);
|
|
495
|
+
});
|
|
496
|
+
export const RunListResponseSchema = z.object({
|
|
497
|
+
live: z.array(ConsistentHealthyRunListItemSchema).max(MAX_DASHBOARD_LIVE_RUNS),
|
|
498
|
+
history: z.array(RunListItemSchema).max(MAX_DASHBOARD_PAGE_SIZE),
|
|
499
|
+
nextBefore: OpaqueCursorSchema.optional(),
|
|
500
|
+
serverNow: TimestampSchema,
|
|
501
|
+
}).strict();
|
|
502
|
+
export const RunsResponseSchema = RunListResponseSchema;
|
|
503
|
+
const ActivityIdentitySchema = z.object({
|
|
504
|
+
activityId: ActivityIdSchema,
|
|
505
|
+
activityGeneration: OpaqueGenerationSchema,
|
|
506
|
+
stateRevision: OpaqueGenerationSchema,
|
|
507
|
+
}).strict();
|
|
508
|
+
export const ActivityListItemObjectSchema = ActivityIdentitySchema.extend({
|
|
509
|
+
kind: ActivityKindSchema,
|
|
510
|
+
phase: ActivityPhaseSchema,
|
|
511
|
+
status: z.enum(["running", "succeeded", "failed", "cancelled"]),
|
|
512
|
+
adapter: DashboardIdSchema,
|
|
513
|
+
role: DashboardIdSchema,
|
|
514
|
+
startedAt: TimestampSchema,
|
|
515
|
+
stateUpdatedAt: TimestampSchema,
|
|
516
|
+
completedAt: TimestampSchema.optional(),
|
|
517
|
+
hasResult: z.boolean(),
|
|
518
|
+
projectFolders: z.array(z.string()).max(MAX_DASHBOARD_ROOTS),
|
|
519
|
+
orphaned: z.boolean(),
|
|
520
|
+
leaseObservation: ActivityLeaseObservationSchema,
|
|
521
|
+
}).strict();
|
|
522
|
+
export const ActivityListItemSchema = ActivityListItemObjectSchema
|
|
523
|
+
.superRefine(requireConsistentActivityLease);
|
|
524
|
+
export const ActivityListResponseSchema = z.object({
|
|
525
|
+
activities: z.array(ActivityListItemSchema).max(MAX_DASHBOARD_PAGE_SIZE),
|
|
526
|
+
nextBefore: OpaqueCursorSchema.optional(),
|
|
527
|
+
serverNow: TimestampSchema,
|
|
528
|
+
}).strict();
|
|
529
|
+
export const ActivityDetailSchema = ActivityListItemObjectSchema.extend({
|
|
530
|
+
outcome: z.object({
|
|
531
|
+
kind: ActivityOutcomeKindSchema,
|
|
532
|
+
}).strict().optional(),
|
|
533
|
+
resultTruncated: z.boolean().optional(),
|
|
534
|
+
invocation: InvocationAuditReadSchema.optional(),
|
|
535
|
+
observedInvocation: ObservedInvocationV1Schema.optional(),
|
|
536
|
+
}).strict().superRefine(requireConsistentActivityLease);
|
|
537
|
+
const ContextRunCountSchema = z.number().int().min(0).max(250_000_000);
|
|
538
|
+
export const ContextRunLifecycleProjectionSchema = z.object({
|
|
539
|
+
status: z.enum(CONTEXT_BUILDER_LIFECYCLE_STATUSES),
|
|
540
|
+
phase: z.enum(CONTEXT_BUILDER_LIFECYCLE_PHASES),
|
|
541
|
+
createdAt: TimestampSchema.nullable(),
|
|
542
|
+
updatedAt: TimestampSchema.nullable(),
|
|
543
|
+
startedAt: TimestampSchema.nullable(),
|
|
544
|
+
completedAt: TimestampSchema.nullable(),
|
|
545
|
+
durationMs: z.number().int().min(0).max(86_400_000).nullable(),
|
|
546
|
+
curator: z.object({
|
|
547
|
+
status: z.enum(CONTEXT_BUILDER_EXECUTION_STATUSES),
|
|
548
|
+
score: z.number().finite().min(0).max(10).nullable(),
|
|
549
|
+
}).strict(),
|
|
550
|
+
finalizer: z.object({
|
|
551
|
+
status: z.enum(CONTEXT_BUILDER_EXECUTION_STATUSES),
|
|
552
|
+
score: z.number().finite().min(0).max(10).nullable(),
|
|
553
|
+
}).strict(),
|
|
554
|
+
cache: z.object({
|
|
555
|
+
lookup: z.enum(["not_checked", "miss", "hit"]),
|
|
556
|
+
write: z.enum(["not_attempted", "skipped", "written"]),
|
|
557
|
+
}).strict(),
|
|
558
|
+
fallback: z.object({
|
|
559
|
+
status: z.enum(CONTEXT_BUILDER_FALLBACK_STATUSES),
|
|
560
|
+
}).strict(),
|
|
561
|
+
counts: z.object({
|
|
562
|
+
filesSeen: ContextRunCountSchema,
|
|
563
|
+
filesConsidered: ContextRunCountSchema,
|
|
564
|
+
filesSelected: ContextRunCountSchema,
|
|
565
|
+
filesOmitted: ContextRunCountSchema,
|
|
566
|
+
searchResults: ContextRunCountSchema,
|
|
567
|
+
bytesRead: ContextRunCountSchema,
|
|
568
|
+
bytesWritten: ContextRunCountSchema,
|
|
569
|
+
}).strict(),
|
|
570
|
+
coverage: z.object({
|
|
571
|
+
policy: z.literal("review_deep_v1").nullable(),
|
|
572
|
+
status: z.enum(["satisfied", "degraded", "not_evaluated"]),
|
|
573
|
+
required: ContextRunCountSchema,
|
|
574
|
+
selected: ContextRunCountSchema,
|
|
575
|
+
missing: ContextRunCountSchema,
|
|
576
|
+
}).strict(),
|
|
577
|
+
reasonCodes: z.array(z.enum(CONTEXT_BUILDER_LIFECYCLE_REASON_CODES))
|
|
578
|
+
.max(16)
|
|
579
|
+
.refine((codes) => new Set(codes).size === codes.length, "reason codes must be unique"),
|
|
580
|
+
artifactRunId: RunIdSchema.nullable(),
|
|
581
|
+
}).strict();
|
|
582
|
+
/**
|
|
583
|
+
* Configured curator/finalizer knobs projected by the scanner. Nested under
|
|
584
|
+
* `effectiveDelegate` because `availability:"current"` already uses top-level
|
|
585
|
+
* `curator`/`finalizer` for lifecycle `{status, score}`. Bounded strings (not
|
|
586
|
+
* DashboardIdSchema) so dotted adapter names survive. Historical payloads omit
|
|
587
|
+
* the key; `availability:"absent"` never carries it.
|
|
588
|
+
*/
|
|
589
|
+
const DashboardConfiguredDelegateActorSchema = z.object({
|
|
590
|
+
cli_name: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
591
|
+
role: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
592
|
+
model: DashboardModelSchema.optional(),
|
|
593
|
+
effort: DashboardEffortSchema.optional(),
|
|
594
|
+
}).strict();
|
|
595
|
+
const DashboardEffectiveDelegateProjectionSchema = z.object({
|
|
596
|
+
curator: DashboardConfiguredDelegateActorSchema.nullable(),
|
|
597
|
+
finalizer: DashboardConfiguredDelegateActorSchema.nullable(),
|
|
598
|
+
}).strict();
|
|
599
|
+
const CurrentDashboardContextPreflightSchema = ContextRunLifecycleProjectionSchema.extend({
|
|
600
|
+
availability: z.literal("current"),
|
|
601
|
+
profile: z.enum([
|
|
602
|
+
"handoff_small",
|
|
603
|
+
"implementation_medium",
|
|
604
|
+
"review_deep",
|
|
605
|
+
]).nullable(),
|
|
606
|
+
effectiveMode: z.enum(["full", "deterministic", "off", "disabled"]).nullable(),
|
|
607
|
+
failurePolicy: z.enum(["fallback", "fail"]).nullable(),
|
|
608
|
+
// The ctxop_… operation id, present when a preflight session-log generation
|
|
609
|
+
// sidecar exists. Pairs with the sidecar under <runDir>/.context-preflight.
|
|
610
|
+
contextRunId: z.string().max(40).refine(isContextBuilderOperationId, "invalid context builder operation ID").optional(),
|
|
611
|
+
effectiveDelegate: DashboardEffectiveDelegateProjectionSchema.optional(),
|
|
612
|
+
// Run-detail only (E4). Never add these to
|
|
613
|
+
// ContextRunLifecycleProjectionSchema.finalizer — Context Runs exact-keys
|
|
614
|
+
// parser pins {status, score}.
|
|
615
|
+
finalizerEffectiveEnabled: z.boolean().optional(),
|
|
616
|
+
finalizerExecutionStatus: z.enum(CONTEXT_BUILDER_EXECUTION_STATUSES).optional(),
|
|
617
|
+
}).strict();
|
|
618
|
+
const LegacyDashboardContextPreflightSchema = z.object({
|
|
619
|
+
availability: z.literal("legacy_without_telemetry"),
|
|
620
|
+
status: z.enum(["succeeded", "partial"]),
|
|
621
|
+
profile: z.enum([
|
|
622
|
+
"handoff_small",
|
|
623
|
+
"implementation_medium",
|
|
624
|
+
"review_deep",
|
|
625
|
+
]).nullable(),
|
|
626
|
+
effectiveMode: z.enum(["full", "deterministic", "off", "disabled"]).nullable(),
|
|
627
|
+
failurePolicy: z.enum(["fallback", "fail"]).nullable(),
|
|
628
|
+
effectiveDelegate: DashboardEffectiveDelegateProjectionSchema.optional(),
|
|
629
|
+
}).strict();
|
|
630
|
+
const PolicyOnlyDashboardContextPreflightSchema = z.object({
|
|
631
|
+
profile: z.enum([
|
|
632
|
+
"handoff_small",
|
|
633
|
+
"implementation_medium",
|
|
634
|
+
"review_deep",
|
|
635
|
+
]).nullable(),
|
|
636
|
+
effectiveMode: z.enum(["full", "deterministic", "off", "disabled"]),
|
|
637
|
+
failurePolicy: z.enum(["fallback", "fail"]).nullable(),
|
|
638
|
+
effectiveDelegate: DashboardEffectiveDelegateProjectionSchema.optional(),
|
|
639
|
+
}).strict();
|
|
640
|
+
export const DashboardContextPreflightSchema = z.discriminatedUnion("availability", [
|
|
641
|
+
CurrentDashboardContextPreflightSchema,
|
|
642
|
+
LegacyDashboardContextPreflightSchema,
|
|
643
|
+
PolicyOnlyDashboardContextPreflightSchema.extend({
|
|
644
|
+
availability: z.literal("bypassed"),
|
|
645
|
+
}).strict(),
|
|
646
|
+
PolicyOnlyDashboardContextPreflightSchema.extend({
|
|
647
|
+
availability: z.literal("awaiting_telemetry"),
|
|
648
|
+
}).strict(),
|
|
649
|
+
PolicyOnlyDashboardContextPreflightSchema.extend({
|
|
650
|
+
availability: z.literal("telemetry_unavailable"),
|
|
651
|
+
}).strict(),
|
|
652
|
+
z.object({ availability: z.literal("absent") }).strict(),
|
|
653
|
+
]);
|
|
654
|
+
export const ContextRunLivenessSchema = z.enum([
|
|
655
|
+
"live",
|
|
656
|
+
"orphaned",
|
|
657
|
+
"unknown",
|
|
658
|
+
]);
|
|
659
|
+
function requireConsistentContextRunLiveness(row, ctx) {
|
|
660
|
+
if (row.orphaned !== (row.liveness === "orphaned")) {
|
|
661
|
+
ctx.addIssue({
|
|
662
|
+
code: z.ZodIssueCode.custom,
|
|
663
|
+
message: "orphaned must agree with liveness",
|
|
664
|
+
path: ["orphaned"],
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
const status = row.lifecycle?.status;
|
|
668
|
+
const active = status === "pending" || status === "running";
|
|
669
|
+
if (!active && (row.orphaned || row.liveness !== "unknown")) {
|
|
670
|
+
ctx.addIssue({
|
|
671
|
+
code: z.ZodIssueCode.custom,
|
|
672
|
+
message: "terminal or unsupported context runs cannot carry live or orphaned liveness",
|
|
673
|
+
path: ["liveness"],
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
const ContextRunRowObjectSchema = z.object({
|
|
678
|
+
id: ContextRunRouteIdSchema,
|
|
679
|
+
contextGeneration: OpaqueGenerationSchema,
|
|
680
|
+
source: z.enum(["journal", "historical_manifest"]),
|
|
681
|
+
compatibility: z.enum([
|
|
682
|
+
"current",
|
|
683
|
+
"legacy_synthesized",
|
|
684
|
+
"legacy_unsupported",
|
|
685
|
+
]),
|
|
686
|
+
operationKind: z.enum(CONTEXT_BUILDER_OPERATION_KINDS),
|
|
687
|
+
lifecycle: ContextRunLifecycleProjectionSchema.nullable(),
|
|
688
|
+
/**
|
|
689
|
+
* Project folder(s) from the manifest `roots[].path`. Defaults to `[]` so the
|
|
690
|
+
* strict parse accepts both journal producers (no roots) and historical rows.
|
|
691
|
+
*/
|
|
692
|
+
projectFolders: z.array(z.string()).max(MAX_DASHBOARD_ROOTS).default([]),
|
|
693
|
+
orphaned: z.boolean().default(false),
|
|
694
|
+
liveness: ContextRunLivenessSchema.default("unknown"),
|
|
695
|
+
}).strict();
|
|
696
|
+
function refineContextRunRow(row, context) {
|
|
697
|
+
if ((row.compatibility === "legacy_unsupported") !== (row.lifecycle === null)) {
|
|
698
|
+
context.addIssue({
|
|
699
|
+
code: z.ZodIssueCode.custom,
|
|
700
|
+
message: "only legacy_unsupported context runs omit lifecycle detail",
|
|
701
|
+
path: ["lifecycle"],
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
requireConsistentContextRunLiveness(row, context);
|
|
705
|
+
}
|
|
706
|
+
export const ContextRunRowSchema = ContextRunRowObjectSchema
|
|
707
|
+
.superRefine(refineContextRunRow);
|
|
708
|
+
export const ContextRunDetailSchema = ContextRunRowObjectSchema.extend({
|
|
709
|
+
invocationAudit: z.object({
|
|
710
|
+
curator: InvocationAuditReadSchema.optional(),
|
|
711
|
+
finalizer: InvocationAuditReadSchema.optional(),
|
|
712
|
+
}).strict().optional(),
|
|
713
|
+
}).strict().superRefine(refineContextRunRow);
|
|
714
|
+
export const ContextRunListResponseSchema = z.object({
|
|
715
|
+
contextRuns: z.array(ContextRunRowSchema).max(MAX_DASHBOARD_PAGE_SIZE),
|
|
716
|
+
serverNow: TimestampSchema,
|
|
717
|
+
truncated: z.boolean(),
|
|
718
|
+
}).strict();
|
|
719
|
+
const DashboardCallSummarySchema = z.object({
|
|
720
|
+
stageId: DashboardIdSchema,
|
|
721
|
+
callId: DashboardIdSchema,
|
|
722
|
+
state: DashboardCallStateSchema,
|
|
723
|
+
retryCount: z.number().int().min(0).max(1_000_000),
|
|
724
|
+
attemptsConsumed: z.number().int().min(0).max(1_000_000).optional(),
|
|
725
|
+
startedAt: TimestampSchema.optional(),
|
|
726
|
+
completedAt: TimestampSchema.optional(),
|
|
727
|
+
durationMs: z.number().finite().min(0).max(Number.MAX_SAFE_INTEGER).optional(),
|
|
728
|
+
failureClass: DashboardFailureClassSchema.optional(),
|
|
729
|
+
snapshotIdentity: z.object({
|
|
730
|
+
adapter: DashboardIdSchema,
|
|
731
|
+
role: DashboardIdSchema,
|
|
732
|
+
model: DashboardModelSchema.optional(),
|
|
733
|
+
effort: DashboardEffortSchema.optional(),
|
|
734
|
+
}).strict().optional(),
|
|
735
|
+
invocation: InvocationAuditReadSchema.optional(),
|
|
736
|
+
observedInvocation: ObservedInvocationV1Schema.optional(),
|
|
737
|
+
hasWorkflowInput: z.boolean(),
|
|
738
|
+
hasOutput: z.boolean(),
|
|
739
|
+
hasRawError: z.boolean(),
|
|
740
|
+
hasArtifactReference: z.boolean(),
|
|
741
|
+
}).strict();
|
|
742
|
+
const DashboardStageDetailSchema = z.object({
|
|
743
|
+
stageId: DashboardIdSchema,
|
|
744
|
+
state: DashboardCallStateSchema,
|
|
745
|
+
startedAt: TimestampSchema.optional(),
|
|
746
|
+
completedAt: TimestampSchema.optional(),
|
|
747
|
+
calls: z.array(DashboardCallSummarySchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
748
|
+
}).strict();
|
|
749
|
+
const SnapshotEnrichmentSchema = z.discriminatedUnion("availability", [
|
|
750
|
+
z.object({
|
|
751
|
+
availability: z.literal("available"),
|
|
752
|
+
stages: z.array(z.object({
|
|
753
|
+
stageId: DashboardIdSchema,
|
|
754
|
+
label: z.string().min(1).max(256).optional(),
|
|
755
|
+
dependsOn: z.array(DashboardIdSchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
756
|
+
}).strict()).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
757
|
+
}).strict(),
|
|
758
|
+
z.object({
|
|
759
|
+
availability: z.literal("unavailable"),
|
|
760
|
+
reason: z.enum(["missing", "not_loaded", "unreadable", "invalid", "too_large", "hash_mismatch"]),
|
|
761
|
+
}).strict(),
|
|
762
|
+
]);
|
|
763
|
+
const ResultAvailabilitySchema = z.discriminatedUnion("availability", [
|
|
764
|
+
z.object({
|
|
765
|
+
availability: z.literal("available"),
|
|
766
|
+
kind: z.enum(["text", "json", "plan_review"]),
|
|
767
|
+
}).strict(),
|
|
768
|
+
z.object({
|
|
769
|
+
availability: z.literal("unavailable"),
|
|
770
|
+
reason: z.enum([
|
|
771
|
+
"run_pending",
|
|
772
|
+
"run_running",
|
|
773
|
+
"run_failed",
|
|
774
|
+
"run_cancelled",
|
|
775
|
+
"not_persisted",
|
|
776
|
+
"missing",
|
|
777
|
+
"invalid",
|
|
778
|
+
"too_large",
|
|
779
|
+
]),
|
|
780
|
+
}).strict(),
|
|
781
|
+
]);
|
|
782
|
+
const DecisiveFailureSchema = z.object({
|
|
783
|
+
stageId: DashboardIdSchema,
|
|
784
|
+
callId: DashboardIdSchema.optional(),
|
|
785
|
+
failureClass: DashboardFailureClassSchema,
|
|
786
|
+
}).strict();
|
|
787
|
+
const StateCountsSchema = z.object({
|
|
788
|
+
pending: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
789
|
+
running: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
790
|
+
succeeded: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
791
|
+
failed: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
792
|
+
cancelled: z.number().int().min(0).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
793
|
+
}).strict();
|
|
794
|
+
const GenericDetailCardSchema = z.object({
|
|
795
|
+
kind: z.literal("generic"),
|
|
796
|
+
stageCounts: StateCountsSchema,
|
|
797
|
+
callCounts: StateCountsSchema,
|
|
798
|
+
}).strict();
|
|
799
|
+
const PlanReviewTransportCardSchema = z.object({
|
|
800
|
+
kind: z.literal("council-plan-review"),
|
|
801
|
+
executionStatus: z.enum(["complete", "partial"]),
|
|
802
|
+
seatCount: z.number().int().min(1).max(10),
|
|
803
|
+
completedSeats: z.number().int().min(0).max(10),
|
|
804
|
+
failedSeats: z.number().int().min(0).max(10),
|
|
805
|
+
missingSeats: z.number().int().min(0).max(10),
|
|
806
|
+
executionContractDigestPrefix: z.string().length(16).regex(/^[0-9a-f]{16}$/),
|
|
807
|
+
chairmanStatus: z.enum(["completed", "failed", "skipped"]),
|
|
808
|
+
contextStatus: z.enum(["succeeded", "partial", "absent"]),
|
|
809
|
+
}).strict().superRefine((card, ctx) => {
|
|
810
|
+
if (card.completedSeats + card.failedSeats + card.missingSeats !== card.seatCount) {
|
|
811
|
+
ctx.addIssue({
|
|
812
|
+
code: z.ZodIssueCode.custom,
|
|
813
|
+
message: "plan-review seat counts must equal seatCount",
|
|
814
|
+
path: ["seatCount"],
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
});
|
|
818
|
+
const DashboardDetailCardSchema = z.union([
|
|
819
|
+
GenericDetailCardSchema,
|
|
820
|
+
PlanReviewTransportCardSchema,
|
|
821
|
+
]);
|
|
822
|
+
export const DashboardContextPreflightInvocationSchema = z.object({
|
|
823
|
+
execution: z.enum(["current", "cache_source"]),
|
|
824
|
+
artifactRunId: RunIdSchema,
|
|
825
|
+
audit: ContextBuilderInvocationAuditReadSchema,
|
|
826
|
+
}).strict();
|
|
827
|
+
const HealthyRunDetailSchema = HealthyRunListItemSchema.extend({
|
|
828
|
+
snapshotEnrichment: SnapshotEnrichmentSchema,
|
|
829
|
+
result: ResultAvailabilitySchema,
|
|
830
|
+
decisiveFailure: DecisiveFailureSchema.optional(),
|
|
831
|
+
card: DashboardDetailCardSchema,
|
|
832
|
+
stages: z.array(DashboardStageDetailSchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
833
|
+
contextPreflight: DashboardContextPreflightSchema.optional(),
|
|
834
|
+
contextPreflightInvocation: DashboardContextPreflightInvocationSchema.optional(),
|
|
835
|
+
}).strict();
|
|
836
|
+
export const RunDetailSchema = z.discriminatedUnion("availability", [
|
|
837
|
+
HealthyRunDetailSchema,
|
|
838
|
+
UnavailableRunSchema,
|
|
839
|
+
]).superRefine((detail, ctx) => {
|
|
840
|
+
if (detail.availability !== "available")
|
|
841
|
+
return;
|
|
842
|
+
requireConsistentWorkerLockObservation(detail, ctx);
|
|
843
|
+
const count = detail.stages.length + detail.stages.reduce((sum, stage) => sum + stage.calls.length, 0);
|
|
844
|
+
if (count > MAX_DASHBOARD_STAGE_CALL_RECORDS) {
|
|
845
|
+
ctx.addIssue({
|
|
846
|
+
code: z.ZodIssueCode.custom,
|
|
847
|
+
message: COMPLEXITY_ISSUE,
|
|
848
|
+
path: ["stages"],
|
|
849
|
+
});
|
|
850
|
+
}
|
|
851
|
+
const detailStageIds = new Set(detail.stages.map((stage) => stage.stageId));
|
|
852
|
+
if (detail.snapshotEnrichment.availability === "available") {
|
|
853
|
+
const snapshotStageIds = new Set();
|
|
854
|
+
for (const [index, snapshotStage] of detail.snapshotEnrichment.stages.entries()) {
|
|
855
|
+
if (snapshotStageIds.has(snapshotStage.stageId)) {
|
|
856
|
+
ctx.addIssue({
|
|
857
|
+
code: z.ZodIssueCode.custom,
|
|
858
|
+
message: "snapshot enrichment stage IDs must be unique",
|
|
859
|
+
path: ["snapshotEnrichment", "stages", index, "stageId"],
|
|
860
|
+
});
|
|
861
|
+
}
|
|
862
|
+
snapshotStageIds.add(snapshotStage.stageId);
|
|
863
|
+
if (!detailStageIds.has(snapshotStage.stageId)) {
|
|
864
|
+
ctx.addIssue({
|
|
865
|
+
code: z.ZodIssueCode.custom,
|
|
866
|
+
message: "snapshot enrichment stage must match persisted state",
|
|
867
|
+
path: ["snapshotEnrichment", "stages", index, "stageId"],
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
if (snapshotStageIds.size !== detailStageIds.size) {
|
|
872
|
+
ctx.addIssue({
|
|
873
|
+
code: z.ZodIssueCode.custom,
|
|
874
|
+
message: "available snapshot enrichment must cover every persisted stage",
|
|
875
|
+
path: ["snapshotEnrichment", "stages"],
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
for (const [stageIndex, stage] of detail.stages.entries()) {
|
|
879
|
+
for (const [callIndex, call] of stage.calls.entries()) {
|
|
880
|
+
if (call.snapshotIdentity === undefined) {
|
|
881
|
+
ctx.addIssue({
|
|
882
|
+
code: z.ZodIssueCode.custom,
|
|
883
|
+
message: "available snapshot enrichment must identify every persisted call",
|
|
884
|
+
path: ["stages", stageIndex, "calls", callIndex, "snapshotIdentity"],
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
else {
|
|
891
|
+
for (const [stageIndex, stage] of detail.stages.entries()) {
|
|
892
|
+
for (const [callIndex, call] of stage.calls.entries()) {
|
|
893
|
+
if (call.snapshotIdentity !== undefined) {
|
|
894
|
+
ctx.addIssue({
|
|
895
|
+
code: z.ZodIssueCode.custom,
|
|
896
|
+
message: "unavailable snapshot enrichment cannot supply call identity",
|
|
897
|
+
path: ["stages", stageIndex, "calls", callIndex, "snapshotIdentity"],
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
if (detail.decisiveFailure !== undefined) {
|
|
904
|
+
const failureStage = detail.stages.find((stage) => stage.stageId === detail.decisiveFailure?.stageId);
|
|
905
|
+
if (failureStage === undefined || (detail.decisiveFailure.callId !== undefined &&
|
|
906
|
+
!failureStage.calls.some((call) => call.callId === detail.decisiveFailure?.callId))) {
|
|
907
|
+
ctx.addIssue({
|
|
908
|
+
code: z.ZodIssueCode.custom,
|
|
909
|
+
message: "decisive failure must identify a persisted stage/call",
|
|
910
|
+
path: ["decisiveFailure"],
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
// The transport-card kind literal "council-plan-review" is a wire-contract
|
|
915
|
+
// identifier, not the workflow name. Typed runs are named
|
|
916
|
+
// "plan-review-receipts" since the rename; legacy typed runs persist the
|
|
917
|
+
// pre-rename name "council-plan-review" (which now also names the generic
|
|
918
|
+
// plan-review council — its runs carry a generic card, never this one).
|
|
919
|
+
if (detail.card.kind === "council-plan-review" &&
|
|
920
|
+
detail.workflowName !== "plan-review-receipts" &&
|
|
921
|
+
detail.workflowName !== "council-plan-review") {
|
|
922
|
+
ctx.addIssue({
|
|
923
|
+
code: z.ZodIssueCode.custom,
|
|
924
|
+
message: "plan-review transport card requires the plan-review-receipts workflow",
|
|
925
|
+
path: ["card", "kind"],
|
|
926
|
+
});
|
|
927
|
+
}
|
|
928
|
+
});
|
|
929
|
+
export const RunDetailResponseSchema = RunDetailSchema;
|
|
930
|
+
export const ArtifactReferenceSchema = RunIdentitySchema.extend({
|
|
931
|
+
stageId: DashboardIdSchema,
|
|
932
|
+
callId: DashboardIdSchema,
|
|
933
|
+
kind: z.literal("json"),
|
|
934
|
+
validation: z.literal("deferred"),
|
|
935
|
+
}).strict();
|
|
936
|
+
export const WorkflowsResponseSchema = z.object({
|
|
937
|
+
workflows: z.array(WorkflowDescriptorSchema).max(1_000),
|
|
938
|
+
}).strict();
|
|
939
|
+
export const AdaptersResponseSchema = z.object({
|
|
940
|
+
adapters: z.array(SafeAdapterDescriptorSchema).max(MAX_DASHBOARD_ADAPTERS),
|
|
941
|
+
}).strict();
|
|
942
|
+
export const ArtifactsResponseSchema = z.object({
|
|
943
|
+
artifacts: z.array(ArtifactReferenceSchema).max(MAX_DASHBOARD_PAGE_SIZE),
|
|
944
|
+
nextBefore: OpaqueCursorSchema.optional(),
|
|
945
|
+
serverNow: TimestampSchema,
|
|
946
|
+
}).strict();
|
|
947
|
+
export const EnvironmentResponseSchema = DashboardEnvironmentSchema;
|
|
948
|
+
export const ApiErrorResponseSchema = z.object({
|
|
949
|
+
error: z.object({
|
|
950
|
+
code: z.enum([
|
|
951
|
+
"unauthorized",
|
|
952
|
+
"invalid_request",
|
|
953
|
+
"method_not_allowed",
|
|
954
|
+
"host_rejected",
|
|
955
|
+
"origin_rejected",
|
|
956
|
+
"not_found",
|
|
957
|
+
"dashboard_busy",
|
|
958
|
+
"run_directory_limit_exceeded",
|
|
959
|
+
"scan_byte_budget_exceeded",
|
|
960
|
+
"projection_cache_budget_exceeded",
|
|
961
|
+
"live_run_limit_exceeded",
|
|
962
|
+
"artifact_catalog_limit_exceeded",
|
|
963
|
+
"run_generation_changed",
|
|
964
|
+
"run_state_changed",
|
|
965
|
+
"activity_generation_changed",
|
|
966
|
+
"activity_state_changed",
|
|
967
|
+
"context_generation_changed",
|
|
968
|
+
"agent_instance_changed",
|
|
969
|
+
"content_too_large_for_dashboard",
|
|
970
|
+
"context_runs_unavailable",
|
|
971
|
+
"session_logs_unavailable",
|
|
972
|
+
"progress_report_malformed",
|
|
973
|
+
"progress_report_overrides_unavailable",
|
|
974
|
+
"prompt_builder_library_unavailable",
|
|
975
|
+
"internal_error",
|
|
976
|
+
]),
|
|
977
|
+
}).strict(),
|
|
978
|
+
}).strict();
|
|
979
|
+
const DashboardCallStateEntrySchema = z.object({
|
|
980
|
+
callId: DashboardIdSchema,
|
|
981
|
+
stageId: DashboardIdSchema,
|
|
982
|
+
state: DashboardCallStateSchema,
|
|
983
|
+
retryCount: z.number().int().min(0).max(1_000_000),
|
|
984
|
+
attemptsConsumed: z.number().int().min(0).max(1_000_000).optional(),
|
|
985
|
+
startedAt: TimestampSchema.optional(),
|
|
986
|
+
completedAt: TimestampSchema.optional(),
|
|
987
|
+
durationMs: z.number().finite().min(0).max(Number.MAX_SAFE_INTEGER).optional(),
|
|
988
|
+
failureClass: DashboardFailureClassSchema.optional(),
|
|
989
|
+
errorMessage: z.string().max(MAX_DASHBOARD_STATE_TEXT_CHARS).optional(),
|
|
990
|
+
outputPath: RelativePathSchema.optional(),
|
|
991
|
+
outputInline: z.string().max(MAX_DASHBOARD_STATE_TEXT_CHARS).optional(),
|
|
992
|
+
materializedInputPath: RelativePathSchema.optional(),
|
|
993
|
+
artifactPath: RelativePathSchema.optional(),
|
|
994
|
+
invocation: InvocationAuditReadSchema.optional(),
|
|
995
|
+
observedInvocation: ObservedInvocationV1Schema.optional(),
|
|
996
|
+
});
|
|
997
|
+
const DashboardStageStateEntrySchema = z.object({
|
|
998
|
+
stageId: DashboardIdSchema,
|
|
999
|
+
state: DashboardCallStateSchema,
|
|
1000
|
+
startedAt: TimestampSchema.optional(),
|
|
1001
|
+
completedAt: TimestampSchema.optional(),
|
|
1002
|
+
calls: z.array(DashboardCallStateEntrySchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
1003
|
+
});
|
|
1004
|
+
const DashboardPlanReviewPublicationSchema = z.discriminatedUnion("committed", [
|
|
1005
|
+
z.object({ committed: z.literal(false) }),
|
|
1006
|
+
z.object({
|
|
1007
|
+
committed: z.literal(true),
|
|
1008
|
+
sidecar_relpath: z.literal(PLAN_REVIEW_RESULT_RELPATH),
|
|
1009
|
+
sidecar_sha256: z.string().length(64).regex(SHA256_PATTERN),
|
|
1010
|
+
bytes: z.number().int().min(0).max(MAX_DASHBOARD_STATE_TEXT_CHARS),
|
|
1011
|
+
}),
|
|
1012
|
+
]);
|
|
1013
|
+
/**
|
|
1014
|
+
* Consumed-field decoder for persisted engine state.
|
|
1015
|
+
*
|
|
1016
|
+
* Deliberately strips unknown producer fields: this is a dashboard read schema,
|
|
1017
|
+
* not the execution engine's complete RunState authority.
|
|
1018
|
+
*/
|
|
1019
|
+
export const DashboardRunStateSchema = z.object({
|
|
1020
|
+
state_version: z.literal(1),
|
|
1021
|
+
runId: RunIdSchema,
|
|
1022
|
+
workflowName: DashboardIdSchema,
|
|
1023
|
+
workflowVersion: z.string().min(1).max(128),
|
|
1024
|
+
status: DashboardCallStateSchema,
|
|
1025
|
+
resumable: z.boolean(),
|
|
1026
|
+
workflowSnapshotPath: z.literal("workflow.snapshot.json").optional(),
|
|
1027
|
+
workflowSnapshotHash: z.string().length(64).regex(SHA256_PATTERN).optional(),
|
|
1028
|
+
stages: z.array(DashboardStageStateEntrySchema).max(MAX_DASHBOARD_STAGE_CALL_RECORDS),
|
|
1029
|
+
startedAt: TimestampSchema.optional(),
|
|
1030
|
+
completedAt: TimestampSchema.optional(),
|
|
1031
|
+
failureClass: DashboardFailureClassSchema.optional(),
|
|
1032
|
+
debugKeepArtifacts: z.boolean().optional(),
|
|
1033
|
+
async: z.boolean().optional(),
|
|
1034
|
+
variables: z.object({
|
|
1035
|
+
cb_profile: z.enum([
|
|
1036
|
+
"handoff_small",
|
|
1037
|
+
"implementation_medium",
|
|
1038
|
+
"review_deep",
|
|
1039
|
+
]).optional(),
|
|
1040
|
+
/**
|
|
1041
|
+
* Context-builder source roots the run operated on — the project folder(s)
|
|
1042
|
+
* the run was created for. Persisted by the workflow engine as a string
|
|
1043
|
+
* array; surfaced on the run detail page as "project folder".
|
|
1044
|
+
*/
|
|
1045
|
+
cb_roots: z.array(z.string()).optional(),
|
|
1046
|
+
}).optional(),
|
|
1047
|
+
initialContextPolicy: z.object({
|
|
1048
|
+
effectiveMode: z.enum(["full", "deterministic", "off", "disabled"]),
|
|
1049
|
+
effectiveDelegate: z.object({
|
|
1050
|
+
failure_policy: z.enum(["fallback", "fail"]).optional(),
|
|
1051
|
+
curator: z.object({
|
|
1052
|
+
cli_name: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
1053
|
+
role: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
1054
|
+
model: DashboardModelSchema.optional(),
|
|
1055
|
+
effort: DashboardEffortSchema.optional(),
|
|
1056
|
+
}).optional(),
|
|
1057
|
+
finalizer: z.object({
|
|
1058
|
+
cli_name: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
1059
|
+
role: z.string().min(1).max(MAX_DASHBOARD_ID_CHARS).optional(),
|
|
1060
|
+
model: DashboardModelSchema.optional(),
|
|
1061
|
+
effort: DashboardEffortSchema.optional(),
|
|
1062
|
+
}).optional(),
|
|
1063
|
+
}).optional(),
|
|
1064
|
+
}).optional(),
|
|
1065
|
+
context_builder_lifecycle: ContextBuilderLifecycleStateV1Schema.refine((lifecycle) => lifecycle.operation_kind === "workflow_preflight", "dashboard workflow preflight lifecycle must have operation_kind workflow_preflight").optional(),
|
|
1066
|
+
workflow_context: z.object({
|
|
1067
|
+
context_builder: z.object({
|
|
1068
|
+
status: z.enum(["succeeded", "partial"]),
|
|
1069
|
+
context_mode: z.enum(["full", "deterministic", "off", "disabled"]).optional(),
|
|
1070
|
+
}),
|
|
1071
|
+
}).optional(),
|
|
1072
|
+
plan_review_state: z.object({
|
|
1073
|
+
publication: DashboardPlanReviewPublicationSchema.optional(),
|
|
1074
|
+
}).optional(),
|
|
1075
|
+
}).superRefine((state, ctx) => {
|
|
1076
|
+
const stageIds = new Set();
|
|
1077
|
+
let recordCount = state.stages.length;
|
|
1078
|
+
for (const [stageIndex, stage] of state.stages.entries()) {
|
|
1079
|
+
if (stageIds.has(stage.stageId)) {
|
|
1080
|
+
ctx.addIssue({
|
|
1081
|
+
code: z.ZodIssueCode.custom,
|
|
1082
|
+
message: `duplicate stageId ${stage.stageId}`,
|
|
1083
|
+
path: ["stages", stageIndex, "stageId"],
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
stageIds.add(stage.stageId);
|
|
1087
|
+
const callIds = new Set();
|
|
1088
|
+
recordCount += stage.calls.length;
|
|
1089
|
+
for (const [callIndex, call] of stage.calls.entries()) {
|
|
1090
|
+
const callPath = ["stages", stageIndex, "calls", callIndex];
|
|
1091
|
+
if (callIds.has(call.callId)) {
|
|
1092
|
+
ctx.addIssue({
|
|
1093
|
+
code: z.ZodIssueCode.custom,
|
|
1094
|
+
message: `duplicate callId ${call.callId} in stage ${stage.stageId}`,
|
|
1095
|
+
path: [...callPath, "callId"],
|
|
1096
|
+
});
|
|
1097
|
+
}
|
|
1098
|
+
callIds.add(call.callId);
|
|
1099
|
+
if (call.stageId !== stage.stageId) {
|
|
1100
|
+
ctx.addIssue({
|
|
1101
|
+
code: z.ZodIssueCode.custom,
|
|
1102
|
+
message: "call.stageId must equal its enclosing stageId",
|
|
1103
|
+
path: [...callPath, "stageId"],
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
const inputPath = `${stage.stageId}.${call.callId}.input.json`;
|
|
1107
|
+
if (call.materializedInputPath !== undefined && call.materializedInputPath !== inputPath) {
|
|
1108
|
+
ctx.addIssue({
|
|
1109
|
+
code: z.ZodIssueCode.custom,
|
|
1110
|
+
message: "materializedInputPath does not match its producer call",
|
|
1111
|
+
path: [...callPath, "materializedInputPath"],
|
|
1112
|
+
});
|
|
1113
|
+
}
|
|
1114
|
+
const hasInline = call.outputInline !== undefined;
|
|
1115
|
+
const hasPath = call.outputPath !== undefined;
|
|
1116
|
+
if (hasInline && hasPath) {
|
|
1117
|
+
ctx.addIssue({
|
|
1118
|
+
code: z.ZodIssueCode.custom,
|
|
1119
|
+
message: "outputInline and outputPath are mutually exclusive",
|
|
1120
|
+
path: callPath,
|
|
1121
|
+
});
|
|
1122
|
+
}
|
|
1123
|
+
if (call.state === "succeeded" && !hasInline && !hasPath) {
|
|
1124
|
+
ctx.addIssue({
|
|
1125
|
+
code: z.ZodIssueCode.custom,
|
|
1126
|
+
message: "succeeded call must have one persisted output representation",
|
|
1127
|
+
path: callPath,
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
const outputPath = `${stage.stageId}.${call.callId}.output.txt`;
|
|
1131
|
+
if (hasPath && call.outputPath !== outputPath) {
|
|
1132
|
+
ctx.addIssue({
|
|
1133
|
+
code: z.ZodIssueCode.custom,
|
|
1134
|
+
message: "outputPath does not match its producer call",
|
|
1135
|
+
path: [...callPath, "outputPath"],
|
|
1136
|
+
});
|
|
1137
|
+
}
|
|
1138
|
+
const artifactPath = `artifacts/${stage.stageId}/${String(callIndex + 1).padStart(2, "0")}-${call.callId}.json`;
|
|
1139
|
+
if (call.artifactPath !== undefined && call.artifactPath !== artifactPath) {
|
|
1140
|
+
ctx.addIssue({
|
|
1141
|
+
code: z.ZodIssueCode.custom,
|
|
1142
|
+
message: "artifactPath does not match its producer call ordinal",
|
|
1143
|
+
path: [...callPath, "artifactPath"],
|
|
1144
|
+
});
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
if (recordCount > MAX_DASHBOARD_STAGE_CALL_RECORDS) {
|
|
1149
|
+
ctx.addIssue({
|
|
1150
|
+
code: z.ZodIssueCode.custom,
|
|
1151
|
+
message: COMPLEXITY_ISSUE,
|
|
1152
|
+
path: ["stages"],
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
});
|
|
1156
|
+
export function parseDashboardRunState(raw, expectedRunId) {
|
|
1157
|
+
if (!RunIdSchema.safeParse(expectedRunId).success) {
|
|
1158
|
+
return { ok: false, reason: "state_invalid", issues: ["invalid expected runId"] };
|
|
1159
|
+
}
|
|
1160
|
+
const parsed = DashboardRunStateSchema.safeParse(raw);
|
|
1161
|
+
if (!parsed.success) {
|
|
1162
|
+
const issues = parsed.error.issues.map((issue) => issue.message);
|
|
1163
|
+
return {
|
|
1164
|
+
ok: false,
|
|
1165
|
+
reason: issues.includes(COMPLEXITY_ISSUE)
|
|
1166
|
+
? "too_complex_for_dashboard"
|
|
1167
|
+
: "state_invalid",
|
|
1168
|
+
issues,
|
|
1169
|
+
};
|
|
1170
|
+
}
|
|
1171
|
+
if (parsed.data.runId !== expectedRunId) {
|
|
1172
|
+
return { ok: false, reason: "state_invalid", issues: ["persisted runId does not match directory runId"] };
|
|
1173
|
+
}
|
|
1174
|
+
return { ok: true, state: parsed.data };
|
|
1175
|
+
}
|
|
1176
|
+
// --- Progress report wire schemas ---------------------------------------
|
|
1177
|
+
/**
|
|
1178
|
+
* Re-export of the producer-side schema version literal so dashboard
|
|
1179
|
+
* consumers can import it from the single wire-contract module.
|
|
1180
|
+
*/
|
|
1181
|
+
export { PROGRESS_REPORT_SCHEMA_VERSION } from "./progress-report-contract.js";
|
|
1182
|
+
/**
|
|
1183
|
+
* Timestamp validator shared across the progress-report wire schemas. Mirrors
|
|
1184
|
+
* the producer contract's strict RFC3339 validator (calendar + offset bounds +
|
|
1185
|
+
* finite epoch) so the wire layer never admits a timestamp the producer or
|
|
1186
|
+
* reader would reject. Kept local to progress reports; the dashboard-wide
|
|
1187
|
+
* `TimestampSchema` above is intentionally unchanged.
|
|
1188
|
+
*/
|
|
1189
|
+
const ProgressReportTimestampSchema = StrictRfc3339TimestampSchema;
|
|
1190
|
+
/**
|
|
1191
|
+
* LIST wire row for a progress report session, camelCase.
|
|
1192
|
+
* Derived by the reader from the producer document's `session` section.
|
|
1193
|
+
*/
|
|
1194
|
+
export const ProgressReportRowSchema = z.object({
|
|
1195
|
+
id: ProgressReportSessionIdSchema,
|
|
1196
|
+
title: BoundedTitleSchema,
|
|
1197
|
+
status: z.enum(["running", "paused", "blocked", "done", "failed"]),
|
|
1198
|
+
projectFolder: ProjectFolderPathSchema,
|
|
1199
|
+
startedAt: ProgressReportTimestampSchema,
|
|
1200
|
+
updatedAt: ProgressReportTimestampSchema,
|
|
1201
|
+
agentCount: NonnegativeSafeIntegerSchema,
|
|
1202
|
+
taskCounts: z.object({
|
|
1203
|
+
total: NonnegativeSafeIntegerSchema,
|
|
1204
|
+
done: NonnegativeSafeIntegerSchema,
|
|
1205
|
+
}).optional(),
|
|
1206
|
+
publishedStatus: z.enum(["running", "paused", "blocked", "done", "failed"]).optional(),
|
|
1207
|
+
}).strict();
|
|
1208
|
+
/**
|
|
1209
|
+
* DETAIL wire document for a progress report, camelCase. One camelCase
|
|
1210
|
+
* wire field for each producer field across all 8 sections. The `session`
|
|
1211
|
+
* section is required; the other 7 sections are optional.
|
|
1212
|
+
*/
|
|
1213
|
+
export const ProgressReportWireDocumentSchema = z.object({
|
|
1214
|
+
schemaVersion: z.literal(PROGRESS_REPORT_SCHEMA_VERSION),
|
|
1215
|
+
session: z.object({
|
|
1216
|
+
id: ProgressReportSessionIdSchema,
|
|
1217
|
+
title: BoundedTitleSchema,
|
|
1218
|
+
goal: BoundedTitleSchema,
|
|
1219
|
+
status: z.enum(["running", "paused", "blocked", "done", "failed"]),
|
|
1220
|
+
startedAt: ProgressReportTimestampSchema,
|
|
1221
|
+
updatedAt: ProgressReportTimestampSchema,
|
|
1222
|
+
projectFolder: ProjectFolderPathSchema,
|
|
1223
|
+
}).strict(),
|
|
1224
|
+
agents: z.array(z.object({
|
|
1225
|
+
name: BoundedIdSchema,
|
|
1226
|
+
role: BoundedIdSchema,
|
|
1227
|
+
status: z.enum(["working", "idle", "blocked", "done"]),
|
|
1228
|
+
activity: BoundedMessageSchema,
|
|
1229
|
+
updatedAt: ProgressReportTimestampSchema,
|
|
1230
|
+
}).strict()).max(50).optional(),
|
|
1231
|
+
tasks: z.array(z.object({
|
|
1232
|
+
id: BoundedIdSchema,
|
|
1233
|
+
title: BoundedTitleSchema,
|
|
1234
|
+
status: z.enum(["pending", "active", "done", "blocked", "failed"]),
|
|
1235
|
+
agent: BoundedIdSchema.optional(),
|
|
1236
|
+
note: BoundedMessageSchema.optional(),
|
|
1237
|
+
}).strict()).max(200).optional(),
|
|
1238
|
+
log: z.array(z.object({
|
|
1239
|
+
t: ProgressReportTimestampSchema,
|
|
1240
|
+
agent: BoundedIdSchema,
|
|
1241
|
+
kind: z.enum(["info", "success", "warn", "error"]),
|
|
1242
|
+
msg: BoundedMessageSchema,
|
|
1243
|
+
}).strict()).max(200).optional(),
|
|
1244
|
+
files: z.array(z.object({
|
|
1245
|
+
path: BoundedIdSchema,
|
|
1246
|
+
change: z.enum(["added", "modified", "deleted"]),
|
|
1247
|
+
adds: NonnegativeSafeIntegerSchema,
|
|
1248
|
+
dels: NonnegativeSafeIntegerSchema,
|
|
1249
|
+
}).strict()).max(500).optional(),
|
|
1250
|
+
tests: z.object({
|
|
1251
|
+
passed: NonnegativeSafeIntegerSchema,
|
|
1252
|
+
failed: NonnegativeSafeIntegerSchema,
|
|
1253
|
+
skipped: NonnegativeSafeIntegerSchema,
|
|
1254
|
+
failing: z.array(BoundedMessageSchema).max(100),
|
|
1255
|
+
lastRun: ProgressReportTimestampSchema,
|
|
1256
|
+
}).strict().optional(),
|
|
1257
|
+
blockers: z.array(z.object({
|
|
1258
|
+
msg: BoundedMessageSchema,
|
|
1259
|
+
raisedBy: BoundedIdSchema,
|
|
1260
|
+
needsHuman: z.boolean(),
|
|
1261
|
+
}).strict()).max(50).optional(),
|
|
1262
|
+
decisions: z.array(z.object({
|
|
1263
|
+
t: ProgressReportTimestampSchema,
|
|
1264
|
+
by: BoundedIdSchema,
|
|
1265
|
+
msg: BoundedMessageSchema,
|
|
1266
|
+
}).strict()).max(100).optional(),
|
|
1267
|
+
}).strict();
|
|
1268
|
+
/**
|
|
1269
|
+
* Cap on projected progress-report rows surfaced by the list endpoint. The
|
|
1270
|
+
* reader never reads more than this many candidate directories per request.
|
|
1271
|
+
*/
|
|
1272
|
+
export const MAX_DASHBOARD_PROGRESS_REPORTS = 200;
|
|
1273
|
+
export const ProgressReportListResponseSchema = z.object({
|
|
1274
|
+
progressReports: z.array(ProgressReportRowSchema).max(MAX_DASHBOARD_PROGRESS_REPORTS),
|
|
1275
|
+
serverNow: ProgressReportTimestampSchema,
|
|
1276
|
+
truncated: z.boolean(),
|
|
1277
|
+
}).strict();
|
|
1278
|
+
export const ProgressReportDetailResponseSchema = z.object({
|
|
1279
|
+
progressReport: ProgressReportWireDocumentSchema,
|
|
1280
|
+
serverNow: ProgressReportTimestampSchema,
|
|
1281
|
+
omittedSections: z.array(z.string()).max(16),
|
|
1282
|
+
publishedSessionStatus: z.enum(["running", "paused", "blocked", "done", "failed"]).optional(),
|
|
1283
|
+
}).strict();
|
|
1284
|
+
//# sourceMappingURL=contracts.js.map
|