clinkx 0.3.0 → 1.0.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 +33 -0
- package/LICENSE +10 -0
- package/README.md +82 -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/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 +2 -1
- package/clinkx-workflows/dist/clink-client.js +17 -4
- package/clinkx-workflows/dist/clink-client.js.map +1 -1
- package/clinkx-workflows/dist/config.d.ts +145 -16
- package/clinkx-workflows/dist/config.js +384 -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 +184 -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-expander.d.ts +1 -1
- package/clinkx-workflows/dist/council-expander.js +2 -1
- package/clinkx-workflows/dist/council-expander.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +165 -0
- package/clinkx-workflows/dist/dashboard/activity-contract.js +105 -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 +86 -0
- package/clinkx-workflows/dist/dashboard/activity-reader.js +480 -0
- package/clinkx-workflows/dist/dashboard/activity-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/api-routes.d.ts +36 -0
- package/clinkx-workflows/dist/dashboard/api-routes.js +1047 -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-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 +222 -0
- package/clinkx-workflows/dist/dashboard/context-run-reader.js +1178 -0
- package/clinkx-workflows/dist/dashboard/context-run-reader.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/contracts.d.ts +8936 -0
- package/clinkx-workflows/dist/dashboard/contracts.js +1157 -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 +28 -0
- package/clinkx-workflows/dist/dashboard/index.js +16 -0
- package/clinkx-workflows/dist/dashboard/index.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.d.ts +101 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.js +748 -0
- package/clinkx-workflows/dist/dashboard/lazy-content.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +303 -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 +581 -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 +28 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-store.js +110 -0
- package/clinkx-workflows/dist/dashboard/progress-report-status-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 +126 -0
- package/clinkx-workflows/dist/dashboard/request-admission.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/scanner.d.ts +75 -0
- package/clinkx-workflows/dist/dashboard/scanner.js +1110 -0
- package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/server-factory.d.ts +50 -0
- package/clinkx-workflows/dist/dashboard/server-factory.js +431 -0
- package/clinkx-workflows/dist/dashboard/server-factory.js.map +1 -0
- package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +2611 -0
- package/clinkx-workflows/dist/dashboard/session-log-contract.js +480 -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 +522 -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 +6 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js +367 -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-DOkMXTfB.js +25 -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-ChJsn0KD.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-validate.d.ts +78 -0
- package/clinkx-workflows/dist/delegate-validate.js +97 -0
- package/clinkx-workflows/dist/delegate-validate.js.map +1 -0
- package/clinkx-workflows/dist/engine.d.ts +141 -0
- package/clinkx-workflows/dist/engine.js +882 -28
- package/clinkx-workflows/dist/engine.js.map +1 -1
- package/clinkx-workflows/dist/errors.d.ts +2 -0
- package/clinkx-workflows/dist/errors.js.map +1 -1
- package/clinkx-workflows/dist/fingerprint.d.ts +1 -1
- package/clinkx-workflows/dist/fingerprint.js +1 -1
- package/clinkx-workflows/dist/index.d.ts +19 -0
- package/clinkx-workflows/dist/index.js +15 -0
- 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/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/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 +76 -21
- package/clinkx-workflows/dist/schema.js +10 -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 +82 -52
- package/clinkx-workflows/dist/server.js.map +1 -1
- package/clinkx-workflows/dist/shutdown.d.ts +18 -20
- package/clinkx-workflows/dist/shutdown.js +43 -61
- package/clinkx-workflows/dist/shutdown.js.map +1 -1
- package/clinkx-workflows/dist/state-schema.d.ts +38 -0
- package/clinkx-workflows/dist/state.d.ts +170 -3
- package/clinkx-workflows/dist/state.js +1275 -28
- package/clinkx-workflows/dist/state.js.map +1 -1
- 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 +14 -2
- package/clinkx-workflows/dist/validators/council.d.ts +318 -85
- 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 +48 -3
- package/clinkx-workflows/dist/workflow-tools.js +1402 -59
- 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-specialist.txt +2 -1
- package/clinkx-workflows/templates/council/code-review-chairman.txt +13 -0
- package/clinkx-workflows/templates/council/code-review-cross-reviewer.txt +4 -1
- package/clinkx-workflows/templates/council/code-review-reviewer.txt +19 -3
- package/clinkx-workflows/templates/council/debug-debugger.txt +2 -1
- package/clinkx-workflows/templates/council/discover-analyst.txt +2 -1
- package/clinkx-workflows/templates/council/member.txt +2 -1
- package/clinkx-workflows/templates/council/plan-review-chairman.txt +68 -0
- package/clinkx-workflows/templates/council/plan-review-cross-reviewer.txt +51 -0
- package/clinkx-workflows/templates/council/plan-review-reviewer.txt +60 -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 +97 -8
- package/clinkx-workflows/workflows/council-code-review.yaml +103 -8
- package/clinkx-workflows/workflows/council-debug.yaml +97 -8
- package/clinkx-workflows/workflows/council-default.yaml +97 -8
- package/clinkx-workflows/workflows/council-discover.yaml +97 -8
- package/clinkx-workflows/workflows/council-plan-review.yaml +250 -0
- package/clinkx-workflows/workflows/plan-review-receipts.yaml +230 -0
- package/conf/adapters/agy.json +49 -0
- package/conf/adapters/claude.json +5 -0
- package/conf/adapters/codex-app-server.json +44 -0
- package/conf/adapters/codex.json +7 -2
- package/conf/adapters/glm.json +5 -0
- package/conf/adapters/grok.json +60 -0
- package/conf/adapters/hapi/agy.json +52 -0
- package/conf/adapters/hapi/claude.json +5 -0
- package/conf/adapters/hapi/codex.json +7 -2
- package/conf/adapters/hapi/glm.json +5 -0
- package/dist/activity-journal.d.ts +42 -0
- package/dist/activity-journal.js +381 -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 +1270 -0
- package/dist/codex/agent-tools.js.map +1 -0
- package/dist/codex/app-server-client.d.ts +76 -0
- package/dist/codex/app-server-client.js +582 -0
- package/dist/codex/app-server-client.js.map +1 -0
- package/dist/codex/app-server-registry.d.ts +389 -0
- package/dist/codex/app-server-registry.js +1407 -0
- package/dist/codex/app-server-registry.js.map +1 -0
- package/dist/codex/client-types.d.ts +109 -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 +185 -19
- package/dist/config.js +82 -16
- 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 +35 -2
- package/dist/context-builder/bundle.js +342 -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-packet.d.ts +37 -0
- package/dist/context-builder/delegate-packet.js +359 -67
- package/dist/context-builder/delegate-packet.js.map +1 -1
- package/dist/context-builder/delegate-validation.d.ts +10 -1
- package/dist/context-builder/delegate-validation.js +153 -41
- package/dist/context-builder/delegate-validation.js.map +1 -1
- package/dist/context-builder/delegate.d.ts +2 -0
- package/dist/context-builder/delegate.js +1 -0
- 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.d.ts +29 -1
- package/dist/context-builder/discovery.js +475 -175
- package/dist/context-builder/discovery.js.map +1 -1
- package/dist/context-builder/globs.js +10 -10
- package/dist/context-builder/globs.js.map +1 -1
- package/dist/context-builder/handler.d.ts +26 -2
- package/dist/context-builder/handler.js +1158 -2416
- package/dist/context-builder/handler.js.map +1 -1
- 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/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 +84 -0
- package/dist/context-builder/review-coverage.js +437 -0
- package/dist/context-builder/review-coverage.js.map +1 -0
- package/dist/context-builder/schema.d.ts +239 -1
- package/dist/context-builder/schema.js +112 -6
- package/dist/context-builder/schema.js.map +1 -1
- package/dist/context-builder/secrets.d.ts +28 -0
- package/dist/context-builder/secrets.js +1473 -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 +22 -1
- package/dist/context-builder/status.js +59 -4
- package/dist/context-builder/status.js.map +1 -1
- package/dist/context-builder/storage.d.ts +35 -2
- package/dist/context-builder/storage.js +271 -14
- 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 +29 -0
- package/dist/context-builder/versions.js +30 -0
- package/dist/context-builder/versions.js.map +1 -0
- package/dist/context-builder/workflow-runner.d.ts +69 -0
- package/dist/context-builder/workflow-runner.js +1051 -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 +46 -0
- package/dist/dashboard-adapter-catalog.js.map +1 -0
- package/dist/dashboard-cli.d.ts +79 -0
- package/dist/dashboard-cli.js +585 -0
- package/dist/dashboard-cli.js.map +1 -0
- package/dist/dashboard-companion/client.d.ts +36 -0
- package/dist/dashboard-companion/client.js +210 -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 +455 -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 +11 -0
- package/dist/dashboard-gateway/index.js +755 -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 +10 -1
- package/dist/handler.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +13 -3
- 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/package-info.d.ts +2 -0
- package/dist/package-info.js +18 -0
- package/dist/package-info.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 +11 -3
- package/dist/parsers/extract.js.map +1 -1
- package/dist/pipeline.d.ts +4 -0
- package/dist/pipeline.js +129 -8
- package/dist/pipeline.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 +13 -0
- package/dist/runner.js +184 -15
- package/dist/runner.js.map +1 -1
- package/dist/safety.d.ts +4 -4
- package/dist/safety.js +4 -4
- package/dist/schema.d.ts +7 -7
- package/dist/server.d.ts +1 -0
- package/dist/server.js +359 -17
- package/dist/server.js.map +1 -1
- package/dist/session-log-stream.d.ts +18 -0
- package/dist/session-log-stream.js +319 -0
- package/dist/session-log-stream.js.map +1 -0
- package/package.json +46 -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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic seed-term synthesis (Plan Phase 5, tasks 5-1/5-2/5-3).
|
|
3
|
+
*
|
|
4
|
+
* Pure function: no clock, no RNG, no LLM, no I/O. Identical input always
|
|
5
|
+
* yields a byte-identical array (verified by tests/seed-terms.test.ts).
|
|
6
|
+
*
|
|
7
|
+
* Used to seed context_builder discovery when a workflow runs preflight in
|
|
8
|
+
* `full`/`deterministic` mode but the caller supplied neither focus paths nor
|
|
9
|
+
* search terms (wiring lives in Phase 3 — not here).
|
|
10
|
+
*
|
|
11
|
+
* Algorithm (pinned in plan task 5-3, authoritative):
|
|
12
|
+
* 1. Preserve quoted phrases, then camelCase/snake_case/dotted identifiers as
|
|
13
|
+
* WHOLE terms before any prose splitting (5-2).
|
|
14
|
+
* 2. Lowercase and split the remaining prose; drop the fixed 21-word stop set
|
|
15
|
+
* and tokens shorter than 3 chars (5-3).
|
|
16
|
+
* 3. Dedupe case-insensitively; rank by `score = frequency + lengthBonus`
|
|
17
|
+
* with a first-seen tie-break; cap at 12 terms (5-3).
|
|
18
|
+
*/
|
|
19
|
+
export declare const MAX_SEED_SOURCE_CHARACTERS = 4000;
|
|
20
|
+
export declare const MAX_CONTEXT_SEARCH_TERMS = 20;
|
|
21
|
+
export declare const MAX_CONTEXT_SEARCH_TERM_CODE_POINTS = 256;
|
|
22
|
+
export declare const MAX_CONTEXT_SEARCH_TERMS_UTF8_BYTES = 4096;
|
|
23
|
+
/** Resolve the workflow context task using the runner's nonblank cb_task rule. */
|
|
24
|
+
export declare function resolveSeedSource(cbTask: string | undefined, userRequest: string | undefined): string;
|
|
25
|
+
/** Match the root task schema's trim-before-max character bound. */
|
|
26
|
+
export declare function seedSourceExceedsLimit(seedSource: string): boolean;
|
|
27
|
+
/** Match the root NonBlankStringSchema + post-parse task bound. */
|
|
28
|
+
export declare function contextSeedSourceValidationError(seedSource: string): string | undefined;
|
|
29
|
+
export declare function contextSearchTermsValidationError(searchTerms: readonly string[]): string | undefined;
|
|
30
|
+
export declare function synthesizeSeedTerms(text: string): string[];
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic seed-term synthesis (Plan Phase 5, tasks 5-1/5-2/5-3).
|
|
3
|
+
*
|
|
4
|
+
* Pure function: no clock, no RNG, no LLM, no I/O. Identical input always
|
|
5
|
+
* yields a byte-identical array (verified by tests/seed-terms.test.ts).
|
|
6
|
+
*
|
|
7
|
+
* Used to seed context_builder discovery when a workflow runs preflight in
|
|
8
|
+
* `full`/`deterministic` mode but the caller supplied neither focus paths nor
|
|
9
|
+
* search terms (wiring lives in Phase 3 — not here).
|
|
10
|
+
*
|
|
11
|
+
* Algorithm (pinned in plan task 5-3, authoritative):
|
|
12
|
+
* 1. Preserve quoted phrases, then camelCase/snake_case/dotted identifiers as
|
|
13
|
+
* WHOLE terms before any prose splitting (5-2).
|
|
14
|
+
* 2. Lowercase and split the remaining prose; drop the fixed 21-word stop set
|
|
15
|
+
* and tokens shorter than 3 chars (5-3).
|
|
16
|
+
* 3. Dedupe case-insensitively; rank by `score = frequency + lengthBonus`
|
|
17
|
+
* with a first-seen tie-break; cap at 12 terms (5-3).
|
|
18
|
+
*/
|
|
19
|
+
/** Fixed stop-word set — exactly the 21 words pinned in plan task 5-3. */
|
|
20
|
+
const STOP_WORDS = new Set([
|
|
21
|
+
"the", "a", "an", "of", "to", "and", "or", "is", "are", "for", "with",
|
|
22
|
+
"on", "in", "this", "that", "please", "add", "fix", "make", "use", "run",
|
|
23
|
+
]);
|
|
24
|
+
const MIN_TERM_LENGTH = 3;
|
|
25
|
+
const MAX_TERMS = 12;
|
|
26
|
+
export const MAX_SEED_SOURCE_CHARACTERS = 4000;
|
|
27
|
+
export const MAX_CONTEXT_SEARCH_TERMS = 20;
|
|
28
|
+
export const MAX_CONTEXT_SEARCH_TERM_CODE_POINTS = 256;
|
|
29
|
+
export const MAX_CONTEXT_SEARCH_TERMS_UTF8_BYTES = 4_096;
|
|
30
|
+
/** Resolve the workflow context task using the runner's nonblank cb_task rule. */
|
|
31
|
+
export function resolveSeedSource(cbTask, userRequest) {
|
|
32
|
+
return cbTask != null && cbTask.trim() !== "" ? cbTask : userRequest ?? "";
|
|
33
|
+
}
|
|
34
|
+
/** Match the root task schema's trim-before-max character bound. */
|
|
35
|
+
export function seedSourceExceedsLimit(seedSource) {
|
|
36
|
+
return seedSource.trim().length > MAX_SEED_SOURCE_CHARACTERS;
|
|
37
|
+
}
|
|
38
|
+
/** Match the root NonBlankStringSchema + post-parse task bound. */
|
|
39
|
+
export function contextSeedSourceValidationError(seedSource) {
|
|
40
|
+
const normalized = seedSource.trim();
|
|
41
|
+
if (normalized.length === 0) {
|
|
42
|
+
return "Context seed source must be nonblank after trimming";
|
|
43
|
+
}
|
|
44
|
+
if (normalized.length > MAX_SEED_SOURCE_CHARACTERS) {
|
|
45
|
+
return `Context seed source must be at most ${String(MAX_SEED_SOURCE_CHARACTERS)} characters`;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
export function contextSearchTermsValidationError(searchTerms) {
|
|
50
|
+
if (searchTerms.length > MAX_CONTEXT_SEARCH_TERMS) {
|
|
51
|
+
return `context_builder search_terms must contain at most ${String(MAX_CONTEXT_SEARCH_TERMS)} terms`;
|
|
52
|
+
}
|
|
53
|
+
let aggregateBytes = 0;
|
|
54
|
+
for (const [index, rawTerm] of searchTerms.entries()) {
|
|
55
|
+
const term = rawTerm.trim();
|
|
56
|
+
if (term.length === 0) {
|
|
57
|
+
return `context_builder search_terms[${String(index)}] must be nonblank after trimming`;
|
|
58
|
+
}
|
|
59
|
+
if (countCodePoints(term) > MAX_CONTEXT_SEARCH_TERM_CODE_POINTS) {
|
|
60
|
+
return `context_builder search_terms[${String(index)}] must be <= ${String(MAX_CONTEXT_SEARCH_TERM_CODE_POINTS)} characters`;
|
|
61
|
+
}
|
|
62
|
+
aggregateBytes += Buffer.byteLength(term, "utf8");
|
|
63
|
+
}
|
|
64
|
+
if (aggregateBytes > MAX_CONTEXT_SEARCH_TERMS_UTF8_BYTES) {
|
|
65
|
+
return `context_builder search_terms must total <= ${String(MAX_CONTEXT_SEARCH_TERMS_UTF8_BYTES)} UTF-8 bytes after trimming`;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
function countCodePoints(value) {
|
|
70
|
+
let count = 0;
|
|
71
|
+
for (const _character of value) {
|
|
72
|
+
count += 1;
|
|
73
|
+
}
|
|
74
|
+
return count;
|
|
75
|
+
}
|
|
76
|
+
function termFitsPublicChannel(term) {
|
|
77
|
+
return countCodePoints(term.trim()) <= MAX_CONTEXT_SEARCH_TERM_CODE_POINTS;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Pinned, pure length bonus in [0, 1]: monotonic non-decreasing in length,
|
|
81
|
+
* saturating at 12 chars. Fixed rational of the term length — no clock/RNG —
|
|
82
|
+
* which keeps scoring (and therefore ordering) byte-deterministic.
|
|
83
|
+
*/
|
|
84
|
+
function lengthBonus(term) {
|
|
85
|
+
return Math.min(term.length, 12) / 12;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A token qualifies as a preservable identifier when it contains an internal
|
|
89
|
+
* underscore (snake_case), an internal dot (dotted identifier), or a
|
|
90
|
+
* lower→upper transition (camelCase / PascalCase). "Internal" means an
|
|
91
|
+
* alphanumeric on both sides, so a trailing sentence dot does not qualify.
|
|
92
|
+
*/
|
|
93
|
+
function isPreservableIdentifier(token) {
|
|
94
|
+
if (/[A-Za-z0-9]_[A-Za-z0-9]/.test(token))
|
|
95
|
+
return true;
|
|
96
|
+
if (/[A-Za-z0-9]\.[A-Za-z0-9]/.test(token))
|
|
97
|
+
return true;
|
|
98
|
+
if (/[a-z][A-Z]/.test(token))
|
|
99
|
+
return true;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
export function synthesizeSeedTerms(text) {
|
|
103
|
+
if (typeof text !== "string" || text.trim() === "") {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
// First-seen-ordered accumulation. `order` holds dedup keys in the order they
|
|
107
|
+
// first appear; `firstForm` records the surface form to emit; `freq` counts
|
|
108
|
+
// case-insensitive occurrences for scoring.
|
|
109
|
+
const order = [];
|
|
110
|
+
const firstForm = new Map();
|
|
111
|
+
const freq = new Map();
|
|
112
|
+
const consider = (term) => {
|
|
113
|
+
const key = term.toLowerCase();
|
|
114
|
+
const current = freq.get(key);
|
|
115
|
+
if (current === undefined) {
|
|
116
|
+
freq.set(key, 1);
|
|
117
|
+
firstForm.set(key, term);
|
|
118
|
+
order.push(key);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
freq.set(key, current + 1);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
// 5-2: preserve quoted phrases as whole terms, then blank them out so the
|
|
125
|
+
// identifier/prose passes never re-split their contents.
|
|
126
|
+
let working = text.replace(/"([^"]+)"|'([^']+)'/g, (_match, dq, sq) => {
|
|
127
|
+
const phrase = (dq ?? sq ?? "").trim();
|
|
128
|
+
if (phrase === "")
|
|
129
|
+
return " ";
|
|
130
|
+
consider(phrase);
|
|
131
|
+
return termFitsPublicChannel(phrase) ? " " : ` ${phrase} `;
|
|
132
|
+
});
|
|
133
|
+
// 5-2: preserve camelCase/snake_case/dotted identifiers as whole terms,
|
|
134
|
+
// blanking only the ones we preserve so plain words flow to the prose pass.
|
|
135
|
+
working = working.replace(/[A-Za-z0-9_.]+/g, (token) => {
|
|
136
|
+
if (isPreservableIdentifier(token)) {
|
|
137
|
+
consider(token);
|
|
138
|
+
return termFitsPublicChannel(token) ? " " : token;
|
|
139
|
+
}
|
|
140
|
+
return token;
|
|
141
|
+
});
|
|
142
|
+
// 5-3: lowercase the remaining prose, split into alphanumeric tokens, drop
|
|
143
|
+
// stop words and sub-3-char tokens.
|
|
144
|
+
const proseTokens = working.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
145
|
+
for (const token of proseTokens) {
|
|
146
|
+
if (token.length < MIN_TERM_LENGTH)
|
|
147
|
+
continue;
|
|
148
|
+
if (STOP_WORDS.has(token))
|
|
149
|
+
continue;
|
|
150
|
+
consider(token);
|
|
151
|
+
}
|
|
152
|
+
// 5-3: rank by score = frequency + lengthBonus, first-seen tie-break, cap 12.
|
|
153
|
+
const ranked = order.map((key, idx) => {
|
|
154
|
+
const term = firstForm.get(key);
|
|
155
|
+
return { term, idx, score: freq.get(key) + lengthBonus(term) };
|
|
156
|
+
});
|
|
157
|
+
ranked.sort((a, b) => (b.score !== a.score ? b.score - a.score : a.idx - b.idx));
|
|
158
|
+
const selected = [];
|
|
159
|
+
let aggregateBytes = 0;
|
|
160
|
+
for (const { term } of ranked) {
|
|
161
|
+
if (selected.length >= MAX_TERMS) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
if (!termFitsPublicChannel(term)) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const termBytes = Buffer.byteLength(term.trim(), "utf8");
|
|
168
|
+
if (aggregateBytes + termBytes > MAX_CONTEXT_SEARCH_TERMS_UTF8_BYTES) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
selected.push(term);
|
|
172
|
+
aggregateBytes += termBytes;
|
|
173
|
+
}
|
|
174
|
+
return selected;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=seed-terms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-terms.js","sourceRoot":"","sources":["../src/seed-terms.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
9
9
|
/**
|
|
10
10
|
* Create the clinkx-workflows MCP server.
|
|
11
11
|
*
|
|
12
|
-
* Registers
|
|
12
|
+
* Registers five tools: run_workflow, resume_workflow, list_workflows,
|
|
13
|
+
* workflow_run_status, cancel_workflow.
|
|
13
14
|
* Uses ClinkSession (child process) as the backend.
|
|
14
15
|
* Does NOT connect transport — caller is responsible.
|
|
15
16
|
*
|
|
@@ -18,6 +19,8 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
|
18
19
|
* standalone server schema enum injection and parse-time validation
|
|
19
20
|
* without requiring the caller to wire discovery manually.
|
|
20
21
|
*/
|
|
22
|
+
export type WorkflowServer = Server;
|
|
21
23
|
export declare function createWorkflowServer(options?: {
|
|
22
24
|
availableCliNames?: readonly string[];
|
|
23
|
-
|
|
25
|
+
asyncAdmissionCap?: number;
|
|
26
|
+
}): WorkflowServer;
|
|
@@ -8,52 +8,44 @@
|
|
|
8
8
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
9
9
|
import { join, extname } from "node:path";
|
|
10
10
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
11
|
-
import { getChildConfigPath } from "./config.js";
|
|
11
|
+
import { getChildConfigPath, getRunsDir, hasExplicitWorkspaceRoot, resolveWorkspaceRoot, } from "./config.js";
|
|
12
12
|
import { logger } from "./logger.js";
|
|
13
|
-
import {
|
|
13
|
+
import { reconcileStaleRunDirectories } from "./state.js";
|
|
14
|
+
import { ClinkSession, resolveClinkChildRuntime } from "./transport.js";
|
|
14
15
|
import { registerWorkflowTools } from "./workflow-tools.js";
|
|
15
|
-
|
|
16
|
-
// Adapter name discovery
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
/**
|
|
19
|
-
* Best-effort adapter name discovery from child config path.
|
|
20
|
-
*
|
|
21
|
-
* Reads CLINKX_WORKFLOWS_CHILD_CONFIG_PATH — supports both directory
|
|
22
|
-
* (scan for .json files) and single-file paths, mirroring the path-
|
|
23
|
-
* resolution behavior of AdapterRegistry.loadFromPath.
|
|
24
|
-
*
|
|
25
|
-
* This performs lightweight structural validation (requires `name` +
|
|
26
|
-
* `command` fields) rather than full CliAdapterConfigSchema parsing,
|
|
27
|
-
* which lives in the root package and cannot be imported without
|
|
28
|
-
* creating a circular dependency. Runtime validation in the child
|
|
29
|
-
* process remains the authoritative gate. Returns undefined when no
|
|
30
|
-
* config path is set or no valid adapters are found.
|
|
31
|
-
*/
|
|
32
|
-
function discoverChildAdapterNames() {
|
|
16
|
+
function discoverChildAdapters() {
|
|
33
17
|
const configPath = getChildConfigPath();
|
|
34
18
|
if (configPath == null)
|
|
35
19
|
return undefined;
|
|
36
20
|
try {
|
|
37
21
|
const stat = statSync(configPath);
|
|
38
|
-
const
|
|
22
|
+
const cliNames = [];
|
|
23
|
+
const planReviewCliNames = [];
|
|
24
|
+
const record = (entry) => {
|
|
25
|
+
if (entry == null)
|
|
26
|
+
return;
|
|
27
|
+
if (!cliNames.includes(entry.name))
|
|
28
|
+
cliNames.push(entry.name);
|
|
29
|
+
if (entry.hasJsonRole && !planReviewCliNames.includes(entry.name)) {
|
|
30
|
+
planReviewCliNames.push(entry.name);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
39
33
|
if (stat.isFile()) {
|
|
40
34
|
// Single-file config path
|
|
41
|
-
|
|
42
|
-
if (name != null)
|
|
43
|
-
names.push(name);
|
|
35
|
+
record(extractAdapter(configPath));
|
|
44
36
|
}
|
|
45
37
|
else if (stat.isDirectory()) {
|
|
46
38
|
// Directory config path — scan for .json files
|
|
47
|
-
const files = readdirSync(configPath)
|
|
39
|
+
const files = readdirSync(configPath)
|
|
40
|
+
.filter((f) => extname(f) === ".json")
|
|
41
|
+
.sort();
|
|
48
42
|
for (const file of files) {
|
|
49
|
-
|
|
50
|
-
if (name != null)
|
|
51
|
-
names.push(name);
|
|
43
|
+
record(extractAdapter(join(configPath, file)));
|
|
52
44
|
}
|
|
53
45
|
}
|
|
54
|
-
if (
|
|
55
|
-
logger.debug({ names, configPath }, "discovered child adapter names for standalone server");
|
|
56
|
-
return
|
|
46
|
+
if (cliNames.length > 0) {
|
|
47
|
+
logger.debug({ names: cliNames, planReviewNames: planReviewCliNames, configPath }, "discovered child adapter names for standalone server");
|
|
48
|
+
return { cliNames, planReviewCliNames };
|
|
57
49
|
}
|
|
58
50
|
}
|
|
59
51
|
catch (err) {
|
|
@@ -62,19 +54,35 @@ function discoverChildAdapterNames() {
|
|
|
62
54
|
return undefined;
|
|
63
55
|
}
|
|
64
56
|
/**
|
|
65
|
-
* Extract
|
|
57
|
+
* Extract adapter name (+ plan-review role eligibility) from a config JSON file.
|
|
66
58
|
*
|
|
67
59
|
* Requires both `name` (string) and `command` (string) fields to be
|
|
68
60
|
* present — the two mandatory fields in any valid adapter config.
|
|
69
61
|
* Skips files that don't meet this minimum bar.
|
|
62
|
+
*
|
|
63
|
+
* `backend: "app_server"` adapters are EXCLUDED. They are driven exclusively by
|
|
64
|
+
* the async `clink_agent_run` / `clink_agent_manage` tools; the synchronous
|
|
65
|
+
* pipeline every workflow seat runs through rejects them with `-32602`. Naming
|
|
66
|
+
* one in a workflow enum would advertise a seat that can only fail at dispatch.
|
|
67
|
+
* The root server filters these already; this is the standalone path, which the
|
|
68
|
+
* removal of the `eligible:false` bit left unguarded.
|
|
69
|
+
*
|
|
70
|
+
* Plan-review eligibility is presence of a `roles` object with a `"json"` key
|
|
71
|
+
* (raw JSON field read only — no AdapterRegistry import, no dependency cycle).
|
|
70
72
|
*/
|
|
71
|
-
function
|
|
73
|
+
function extractAdapter(filePath) {
|
|
72
74
|
try {
|
|
73
75
|
const raw = readFileSync(filePath, "utf-8");
|
|
74
76
|
const parsed = JSON.parse(raw);
|
|
75
77
|
if (typeof parsed["name"] === "string" && parsed["name"] !== "" &&
|
|
76
|
-
typeof parsed["command"] === "string" && parsed["command"] !== ""
|
|
77
|
-
|
|
78
|
+
typeof parsed["command"] === "string" && parsed["command"] !== "" &&
|
|
79
|
+
parsed["backend"] !== "app_server") {
|
|
80
|
+
const roles = parsed["roles"];
|
|
81
|
+
const hasJsonRole = roles != null &&
|
|
82
|
+
typeof roles === "object" &&
|
|
83
|
+
!Array.isArray(roles) &&
|
|
84
|
+
Object.prototype.hasOwnProperty.call(roles, "json");
|
|
85
|
+
return { name: parsed["name"], hasJsonRole };
|
|
78
86
|
}
|
|
79
87
|
}
|
|
80
88
|
catch {
|
|
@@ -82,21 +90,6 @@ function extractAdapterName(filePath) {
|
|
|
82
90
|
}
|
|
83
91
|
return undefined;
|
|
84
92
|
}
|
|
85
|
-
// ---------------------------------------------------------------------------
|
|
86
|
-
// Server factory
|
|
87
|
-
// ---------------------------------------------------------------------------
|
|
88
|
-
/**
|
|
89
|
-
* Create the clinkx-workflows MCP server.
|
|
90
|
-
*
|
|
91
|
-
* Registers three tools: run_workflow, resume_workflow, list_workflows.
|
|
92
|
-
* Uses ClinkSession (child process) as the backend.
|
|
93
|
-
* Does NOT connect transport — caller is responsible.
|
|
94
|
-
*
|
|
95
|
-
* When `availableCliNames` is not explicitly provided, attempts to
|
|
96
|
-
* discover adapter names from the child config path. This gives the
|
|
97
|
-
* standalone server schema enum injection and parse-time validation
|
|
98
|
-
* without requiring the caller to wire discovery manually.
|
|
99
|
-
*/
|
|
100
93
|
export function createWorkflowServer(options) {
|
|
101
94
|
const server = new Server({ name: "clinkx-workflows", version: "0.1.0" }, {
|
|
102
95
|
capabilities: { tools: {} },
|
|
@@ -104,15 +97,52 @@ export function createWorkflowServer(options) {
|
|
|
104
97
|
"Use run_workflow to start a new workflow, resume_workflow to continue a failed run, " +
|
|
105
98
|
"or list_workflows to see available workflows.",
|
|
106
99
|
});
|
|
100
|
+
// `resolveWorkspaceRoot()` silently falls back to process.cwd(), and an MCP
|
|
101
|
+
// server's cwd is chosen by the client — so the same request can pass or fail
|
|
102
|
+
// purely on where the client happened to spawn us. Surface the implicit root
|
|
103
|
+
// instead of leaving it invisible (config.ts cannot log: logger imports it).
|
|
104
|
+
if (!hasExplicitWorkspaceRoot()) {
|
|
105
|
+
logger.warn({
|
|
106
|
+
env_var: "CLINKX_WORKFLOWS_WORKSPACE_ROOT",
|
|
107
|
+
workspace_root: resolveWorkspaceRoot(),
|
|
108
|
+
cwd: process.cwd(),
|
|
109
|
+
}, "CLINKX_WORKFLOWS_WORKSPACE_ROOT is not set; defaulting the workflows workspace root to process.cwd(). " +
|
|
110
|
+
"This root governs plan_file containment and the workflow child process cwd, so workflow behavior " +
|
|
111
|
+
"depends on the cwd the MCP client spawned this server with. Set CLINKX_WORKFLOWS_WORKSPACE_ROOT explicitly.");
|
|
112
|
+
}
|
|
113
|
+
// One-time startup reconcile of runs frozen as running/pending with no live
|
|
114
|
+
// worker (fire-and-forget: bounded, idempotent, never blocks startup).
|
|
115
|
+
try {
|
|
116
|
+
void reconcileStaleRunDirectories(getRunsDir()).catch((err) => {
|
|
117
|
+
logger.warn({ err: err instanceof Error ? err.message : String(err) }, "startup stale workflow run reconcile failed");
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
logger.warn({ err: err instanceof Error ? err.message : String(err) }, "startup stale workflow run reconcile could not be scheduled");
|
|
122
|
+
}
|
|
123
|
+
const childRuntime = resolveClinkChildRuntime();
|
|
107
124
|
// Normalize empty arrays to undefined — an empty list would suppress schema
|
|
108
125
|
// hints while still enabling validation (rejecting all adapter names).
|
|
109
126
|
const explicit = options?.availableCliNames;
|
|
127
|
+
const discovered = explicit != null && explicit.length > 0
|
|
128
|
+
? undefined
|
|
129
|
+
: discoverChildAdapters();
|
|
110
130
|
const cliNames = (explicit != null && explicit.length > 0)
|
|
111
131
|
? explicit
|
|
112
|
-
:
|
|
132
|
+
: discovered?.cliNames;
|
|
133
|
+
// When the caller supplies availableCliNames explicitly, they own filtering
|
|
134
|
+
// (or accept the availableCliNames fallback in workflow-tools). Auto-discovery
|
|
135
|
+
// always supplies the roles.json-filtered plan-review set.
|
|
136
|
+
const planReviewCliNames = discovered?.planReviewCliNames;
|
|
113
137
|
registerWorkflowTools(server, {
|
|
114
|
-
createBackend: (runId) => new ClinkSession({ runId }),
|
|
138
|
+
createBackend: (runId) => new ClinkSession({ runId, runtime: childRuntime }),
|
|
115
139
|
...(cliNames != null ? { availableCliNames: cliNames } : {}),
|
|
140
|
+
...(planReviewCliNames != null
|
|
141
|
+
? { planReviewAvailableCliNames: planReviewCliNames }
|
|
142
|
+
: {}),
|
|
143
|
+
...(options?.asyncAdmissionCap != null
|
|
144
|
+
? { asyncAdmissionCap: options.asyncAdmissionCap }
|
|
145
|
+
: {}),
|
|
116
146
|
});
|
|
117
147
|
return server;
|
|
118
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,39 +11,37 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { ClinkBackend } from "./backend.js";
|
|
13
13
|
type StatePersister = () => Promise<void>;
|
|
14
|
+
/** Opaque handle returned by register(); identifies a single run's entry. */
|
|
15
|
+
export type ShutdownHandle = number;
|
|
14
16
|
/**
|
|
15
17
|
* Manages graceful shutdown across signal handlers and MCP cancellation.
|
|
18
|
+
*
|
|
19
|
+
* Keyed registry: each run registers its own entry so concurrent runs (cap > 1)
|
|
20
|
+
* never clobber each other. Shutdown/cancel iterate over ALL registered entries.
|
|
16
21
|
*/
|
|
17
22
|
export declare class ShutdownCoordinator {
|
|
18
|
-
private
|
|
23
|
+
private readonly entries;
|
|
24
|
+
private nextHandle;
|
|
19
25
|
private shuttingDown;
|
|
20
26
|
/**
|
|
21
|
-
* Register
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
register(session: ClinkBackend, controller: AbortController, persistState: StatePersister): void;
|
|
25
|
-
/**
|
|
26
|
-
* Unregister the current run (on normal completion).
|
|
27
|
-
*/
|
|
28
|
-
unregister(): void;
|
|
29
|
-
/**
|
|
30
|
-
* Get the AbortSignal for the current run.
|
|
31
|
-
* Use this to propagate cancellation to in-flight calls.
|
|
27
|
+
* Register a run's session and abort controller. Returns an opaque handle
|
|
28
|
+
* to be passed to unregister(). Each call adds a new entry; existing entries
|
|
29
|
+
* are never clobbered.
|
|
32
30
|
*/
|
|
33
|
-
|
|
31
|
+
register(session: ClinkBackend, controller: AbortController, persistState: StatePersister): ShutdownHandle;
|
|
34
32
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* Does NOT call process.exit — caller decides response behavior.
|
|
33
|
+
* Unregister a single run (on normal completion). Deletes only this handle's
|
|
34
|
+
* entry; other registered runs remain.
|
|
38
35
|
*/
|
|
39
|
-
|
|
36
|
+
unregister(handle: ShutdownHandle): void;
|
|
40
37
|
/**
|
|
41
38
|
* Handle process shutdown.
|
|
42
|
-
* Cancel, persist, and terminate. The entrypoint owns
|
|
39
|
+
* Cancel, persist, and terminate all registered runs. The entrypoint owns
|
|
40
|
+
* process.exit.
|
|
43
41
|
*/
|
|
44
42
|
shutdown(signal: string): Promise<void>;
|
|
45
|
-
|
|
46
|
-
private
|
|
43
|
+
/** Abort, persist, and terminate every registered entry (best-effort). */
|
|
44
|
+
private handleAll;
|
|
47
45
|
}
|
|
48
46
|
/** Singleton shutdown coordinator. */
|
|
49
47
|
export declare const shutdownCoordinator: ShutdownCoordinator;
|
|
@@ -12,55 +12,36 @@
|
|
|
12
12
|
import { logger } from "./logger.js";
|
|
13
13
|
/**
|
|
14
14
|
* Manages graceful shutdown across signal handlers and MCP cancellation.
|
|
15
|
+
*
|
|
16
|
+
* Keyed registry: each run registers its own entry so concurrent runs (cap > 1)
|
|
17
|
+
* never clobber each other. Shutdown/cancel iterate over ALL registered entries.
|
|
15
18
|
*/
|
|
16
19
|
export class ShutdownCoordinator {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
controller: null,
|
|
20
|
-
persistState: null,
|
|
21
|
-
};
|
|
20
|
+
entries = new Map();
|
|
21
|
+
nextHandle = 1;
|
|
22
22
|
shuttingDown = false;
|
|
23
23
|
/**
|
|
24
|
-
* Register
|
|
25
|
-
*
|
|
24
|
+
* Register a run's session and abort controller. Returns an opaque handle
|
|
25
|
+
* to be passed to unregister(). Each call adds a new entry; existing entries
|
|
26
|
+
* are never clobbered.
|
|
26
27
|
*/
|
|
27
28
|
register(session, controller, persistState) {
|
|
28
|
-
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* Unregister the current run (on normal completion).
|
|
33
|
-
*/
|
|
34
|
-
unregister() {
|
|
35
|
-
this.state = { session: null, controller: null, persistState: null };
|
|
29
|
+
const handle = this.nextHandle;
|
|
30
|
+
this.nextHandle += 1;
|
|
31
|
+
this.entries.set(handle, { session, controller, persistState });
|
|
32
|
+
return handle;
|
|
36
33
|
}
|
|
37
34
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
35
|
+
* Unregister a single run (on normal completion). Deletes only this handle's
|
|
36
|
+
* entry; other registered runs remain.
|
|
40
37
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Cancel the current run (e.g., from MCP notifications/cancelled).
|
|
46
|
-
* Aborts in-flight calls, persists state, terminates child.
|
|
47
|
-
* Does NOT call process.exit — caller decides response behavior.
|
|
48
|
-
*/
|
|
49
|
-
async cancelRun() {
|
|
50
|
-
if (this.shuttingDown)
|
|
51
|
-
return;
|
|
52
|
-
this.shuttingDown = true;
|
|
53
|
-
logger.info("cancelling current workflow run");
|
|
54
|
-
// 1. Abort in-flight calls
|
|
55
|
-
this.state.controller?.abort(new Error("Workflow cancelled"));
|
|
56
|
-
// 2. Best-effort state persistence
|
|
57
|
-
await this.safePersistState();
|
|
58
|
-
// 3. Terminate child session
|
|
59
|
-
await this.safeTerminateSession();
|
|
38
|
+
unregister(handle) {
|
|
39
|
+
this.entries.delete(handle);
|
|
60
40
|
}
|
|
61
41
|
/**
|
|
62
42
|
* Handle process shutdown.
|
|
63
|
-
* Cancel, persist, and terminate. The entrypoint owns
|
|
43
|
+
* Cancel, persist, and terminate all registered runs. The entrypoint owns
|
|
44
|
+
* process.exit.
|
|
64
45
|
*/
|
|
65
46
|
async shutdown(signal) {
|
|
66
47
|
if (this.shuttingDown) {
|
|
@@ -69,32 +50,33 @@ export class ShutdownCoordinator {
|
|
|
69
50
|
}
|
|
70
51
|
this.shuttingDown = true;
|
|
71
52
|
logger.info({ signal }, "received shutdown signal");
|
|
72
|
-
|
|
73
|
-
this.state.controller?.abort(new Error(`Shutdown: ${signal}`));
|
|
74
|
-
// 2. Best-effort state persistence
|
|
75
|
-
await this.safePersistState();
|
|
76
|
-
// 3. Terminate child session
|
|
77
|
-
await this.safeTerminateSession();
|
|
53
|
+
await this.handleAll(new Error(`Shutdown: ${signal}`));
|
|
78
54
|
logger.info({ signal }, "shutdown cleanup complete");
|
|
79
55
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
56
|
+
/** Abort, persist, and terminate every registered entry (best-effort). */
|
|
57
|
+
async handleAll(abortReason) {
|
|
58
|
+
// Snapshot before iterating: an entry registered after this point is left
|
|
59
|
+
// intact rather than silently wiped by a blanket clear().
|
|
60
|
+
const snapshot = Array.from(this.entries.entries());
|
|
61
|
+
for (const [handle, entry] of snapshot) {
|
|
62
|
+
// 1. Abort in-flight calls
|
|
63
|
+
entry.controller.abort(abortReason);
|
|
64
|
+
// 2. Best-effort state persistence
|
|
65
|
+
try {
|
|
66
|
+
await entry.persistState();
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logger.error({ err: err instanceof Error ? err.message : String(err) }, "failed to persist state during shutdown");
|
|
70
|
+
}
|
|
71
|
+
// 3. Terminate child session
|
|
72
|
+
try {
|
|
73
|
+
await entry.session.terminate();
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
logger.error({ err: err instanceof Error ? err.message : String(err) }, "failed to terminate child session during shutdown");
|
|
77
|
+
}
|
|
78
|
+
// 4. Delete only the processed handle.
|
|
79
|
+
this.entries.delete(handle);
|
|
98
80
|
}
|
|
99
81
|
}
|
|
100
82
|
}
|