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.
Files changed (555) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +10 -0
  3. package/README.md +82 -26
  4. package/clinkx-workflows/dist/allowed-roots.d.ts +1 -0
  5. package/clinkx-workflows/dist/allowed-roots.js +5 -0
  6. package/clinkx-workflows/dist/allowed-roots.js.map +1 -0
  7. package/clinkx-workflows/dist/artifacts.d.ts +20 -1
  8. package/clinkx-workflows/dist/artifacts.js +38 -9
  9. package/clinkx-workflows/dist/artifacts.js.map +1 -1
  10. package/clinkx-workflows/dist/backend.d.ts +4 -0
  11. package/clinkx-workflows/dist/citation-check.d.ts +40 -0
  12. package/clinkx-workflows/dist/citation-check.js +348 -0
  13. package/clinkx-workflows/dist/citation-check.js.map +1 -0
  14. package/clinkx-workflows/dist/clink-client.d.ts +2 -1
  15. package/clinkx-workflows/dist/clink-client.js +17 -4
  16. package/clinkx-workflows/dist/clink-client.js.map +1 -1
  17. package/clinkx-workflows/dist/config.d.ts +145 -16
  18. package/clinkx-workflows/dist/config.js +384 -26
  19. package/clinkx-workflows/dist/config.js.map +1 -1
  20. package/clinkx-workflows/dist/contained-file.d.ts +172 -0
  21. package/clinkx-workflows/dist/contained-file.js +483 -0
  22. package/clinkx-workflows/dist/contained-file.js.map +1 -0
  23. package/clinkx-workflows/dist/context-builder-lifecycle-contract.d.ts +416 -0
  24. package/clinkx-workflows/dist/context-builder-lifecycle-contract.js +328 -0
  25. package/clinkx-workflows/dist/context-builder-lifecycle-contract.js.map +1 -0
  26. package/clinkx-workflows/dist/context-builder-lifecycle-router.d.ts +24 -0
  27. package/clinkx-workflows/dist/context-builder-lifecycle-router.js +39 -0
  28. package/clinkx-workflows/dist/context-builder-lifecycle-router.js.map +1 -0
  29. package/clinkx-workflows/dist/context-cache-key.d.ts +53 -0
  30. package/clinkx-workflows/dist/context-cache-key.js +91 -0
  31. package/clinkx-workflows/dist/context-cache-key.js.map +1 -0
  32. package/clinkx-workflows/dist/context-mode-resolver.d.ts +27 -0
  33. package/clinkx-workflows/dist/context-mode-resolver.js +126 -0
  34. package/clinkx-workflows/dist/context-mode-resolver.js.map +1 -0
  35. package/clinkx-workflows/dist/context-preflight.d.ts +184 -0
  36. package/clinkx-workflows/dist/context-preflight.js +91 -0
  37. package/clinkx-workflows/dist/context-preflight.js.map +1 -0
  38. package/clinkx-workflows/dist/council-expander.d.ts +1 -1
  39. package/clinkx-workflows/dist/council-expander.js +2 -1
  40. package/clinkx-workflows/dist/council-expander.js.map +1 -1
  41. package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +165 -0
  42. package/clinkx-workflows/dist/dashboard/activity-contract.js +105 -0
  43. package/clinkx-workflows/dist/dashboard/activity-contract.js.map +1 -0
  44. package/clinkx-workflows/dist/dashboard/activity-lease.d.ts +25 -0
  45. package/clinkx-workflows/dist/dashboard/activity-lease.js +34 -0
  46. package/clinkx-workflows/dist/dashboard/activity-lease.js.map +1 -0
  47. package/clinkx-workflows/dist/dashboard/activity-reader.d.ts +86 -0
  48. package/clinkx-workflows/dist/dashboard/activity-reader.js +480 -0
  49. package/clinkx-workflows/dist/dashboard/activity-reader.js.map +1 -0
  50. package/clinkx-workflows/dist/dashboard/api-routes.d.ts +36 -0
  51. package/clinkx-workflows/dist/dashboard/api-routes.js +1047 -0
  52. package/clinkx-workflows/dist/dashboard/api-routes.js.map +1 -0
  53. package/clinkx-workflows/dist/dashboard/artifact-index.d.ts +37 -0
  54. package/clinkx-workflows/dist/dashboard/artifact-index.js +145 -0
  55. package/clinkx-workflows/dist/dashboard/artifact-index.js.map +1 -0
  56. package/clinkx-workflows/dist/dashboard/auth/challenge-store.d.ts +31 -0
  57. package/clinkx-workflows/dist/dashboard/auth/challenge-store.js +65 -0
  58. package/clinkx-workflows/dist/dashboard/auth/challenge-store.js.map +1 -0
  59. package/clinkx-workflows/dist/dashboard/auth/controller.d.ts +26 -0
  60. package/clinkx-workflows/dist/dashboard/auth/controller.js +596 -0
  61. package/clinkx-workflows/dist/dashboard/auth/controller.js.map +1 -0
  62. package/clinkx-workflows/dist/dashboard/auth/credential-store.d.ts +60 -0
  63. package/clinkx-workflows/dist/dashboard/auth/credential-store.js +776 -0
  64. package/clinkx-workflows/dist/dashboard/auth/credential-store.js.map +1 -0
  65. package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.d.ts +9 -0
  66. package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.js +44 -0
  67. package/clinkx-workflows/dist/dashboard/auth/enrollment-gate.js.map +1 -0
  68. package/clinkx-workflows/dist/dashboard/auth/session-store.d.ts +17 -0
  69. package/clinkx-workflows/dist/dashboard/auth/session-store.js +77 -0
  70. package/clinkx-workflows/dist/dashboard/auth/session-store.js.map +1 -0
  71. package/clinkx-workflows/dist/dashboard/auth/webauthn-service.d.ts +25 -0
  72. package/clinkx-workflows/dist/dashboard/auth/webauthn-service.js +71 -0
  73. package/clinkx-workflows/dist/dashboard/auth/webauthn-service.js.map +1 -0
  74. package/clinkx-workflows/dist/dashboard/context-run-liveness.d.ts +37 -0
  75. package/clinkx-workflows/dist/dashboard/context-run-liveness.js +49 -0
  76. package/clinkx-workflows/dist/dashboard/context-run-liveness.js.map +1 -0
  77. package/clinkx-workflows/dist/dashboard/context-run-reader.d.ts +222 -0
  78. package/clinkx-workflows/dist/dashboard/context-run-reader.js +1178 -0
  79. package/clinkx-workflows/dist/dashboard/context-run-reader.js.map +1 -0
  80. package/clinkx-workflows/dist/dashboard/contracts.d.ts +8936 -0
  81. package/clinkx-workflows/dist/dashboard/contracts.js +1157 -0
  82. package/clinkx-workflows/dist/dashboard/contracts.js.map +1 -0
  83. package/clinkx-workflows/dist/dashboard/generation.d.ts +14 -0
  84. package/clinkx-workflows/dist/dashboard/generation.js +41 -0
  85. package/clinkx-workflows/dist/dashboard/generation.js.map +1 -0
  86. package/clinkx-workflows/dist/dashboard/index.d.ts +28 -0
  87. package/clinkx-workflows/dist/dashboard/index.js +16 -0
  88. package/clinkx-workflows/dist/dashboard/index.js.map +1 -0
  89. package/clinkx-workflows/dist/dashboard/lazy-content.d.ts +101 -0
  90. package/clinkx-workflows/dist/dashboard/lazy-content.js +748 -0
  91. package/clinkx-workflows/dist/dashboard/lazy-content.js.map +1 -0
  92. package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +303 -0
  93. package/clinkx-workflows/dist/dashboard/progress-report-contract.js +221 -0
  94. package/clinkx-workflows/dist/dashboard/progress-report-contract.js.map +1 -0
  95. package/clinkx-workflows/dist/dashboard/progress-report-reader.d.ts +50 -0
  96. package/clinkx-workflows/dist/dashboard/progress-report-reader.js +581 -0
  97. package/clinkx-workflows/dist/dashboard/progress-report-reader.js.map +1 -0
  98. package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.d.ts +89 -0
  99. package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.js +71 -0
  100. package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.js.map +1 -0
  101. package/clinkx-workflows/dist/dashboard/progress-report-status-store.d.ts +28 -0
  102. package/clinkx-workflows/dist/dashboard/progress-report-status-store.js +110 -0
  103. package/clinkx-workflows/dist/dashboard/progress-report-status-store.js.map +1 -0
  104. package/clinkx-workflows/dist/dashboard/read-model.d.ts +86 -0
  105. package/clinkx-workflows/dist/dashboard/read-model.js +440 -0
  106. package/clinkx-workflows/dist/dashboard/read-model.js.map +1 -0
  107. package/clinkx-workflows/dist/dashboard/request-admission.d.ts +31 -0
  108. package/clinkx-workflows/dist/dashboard/request-admission.js +126 -0
  109. package/clinkx-workflows/dist/dashboard/request-admission.js.map +1 -0
  110. package/clinkx-workflows/dist/dashboard/scanner.d.ts +75 -0
  111. package/clinkx-workflows/dist/dashboard/scanner.js +1110 -0
  112. package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -0
  113. package/clinkx-workflows/dist/dashboard/server-factory.d.ts +50 -0
  114. package/clinkx-workflows/dist/dashboard/server-factory.js +431 -0
  115. package/clinkx-workflows/dist/dashboard/server-factory.js.map +1 -0
  116. package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +2611 -0
  117. package/clinkx-workflows/dist/dashboard/session-log-contract.js +480 -0
  118. package/clinkx-workflows/dist/dashboard/session-log-contract.js.map +1 -0
  119. package/clinkx-workflows/dist/dashboard/session-log-identity.d.ts +21 -0
  120. package/clinkx-workflows/dist/dashboard/session-log-identity.js +101 -0
  121. package/clinkx-workflows/dist/dashboard/session-log-identity.js.map +1 -0
  122. package/clinkx-workflows/dist/dashboard/session-log-journal.d.ts +43 -0
  123. package/clinkx-workflows/dist/dashboard/session-log-journal.js +522 -0
  124. package/clinkx-workflows/dist/dashboard/session-log-journal.js.map +1 -0
  125. package/clinkx-workflows/dist/dashboard/session-log-reader.d.ts +61 -0
  126. package/clinkx-workflows/dist/dashboard/session-log-reader.js +378 -0
  127. package/clinkx-workflows/dist/dashboard/session-log-reader.js.map +1 -0
  128. package/clinkx-workflows/dist/dashboard/session-log-redaction.d.ts +6 -0
  129. package/clinkx-workflows/dist/dashboard/session-log-redaction.js +367 -0
  130. package/clinkx-workflows/dist/dashboard/session-log-redaction.js.map +1 -0
  131. package/clinkx-workflows/dist/dashboard/session-log-retention.d.ts +23 -0
  132. package/clinkx-workflows/dist/dashboard/session-log-retention.js +212 -0
  133. package/clinkx-workflows/dist/dashboard/session-log-retention.js.map +1 -0
  134. package/clinkx-workflows/dist/dashboard/static-responses.d.ts +10 -0
  135. package/clinkx-workflows/dist/dashboard/static-responses.js +94 -0
  136. package/clinkx-workflows/dist/dashboard/static-responses.js.map +1 -0
  137. package/clinkx-workflows/dist/dashboard/worker-lock-observer.d.ts +28 -0
  138. package/clinkx-workflows/dist/dashboard/worker-lock-observer.js +241 -0
  139. package/clinkx-workflows/dist/dashboard/worker-lock-observer.js.map +1 -0
  140. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  141. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  142. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  143. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  144. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  145. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  146. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  147. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  148. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  149. package/clinkx-workflows/dist/dashboard-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  150. package/clinkx-workflows/dist/dashboard-ui/assets/index-DOkMXTfB.js +25 -0
  151. package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  152. package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  153. package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  154. package/clinkx-workflows/dist/dashboard-ui/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  155. package/clinkx-workflows/dist/dashboard-ui/assets/style-ChJsn0KD.css +1 -0
  156. package/clinkx-workflows/dist/dashboard-ui/contracts/council-plan-review-input-v1.json +158 -0
  157. package/clinkx-workflows/dist/dashboard-ui/index.html +15 -0
  158. package/clinkx-workflows/dist/dashboard-ui/licenses/IBM-Plex-Mono-OFL.txt +93 -0
  159. package/clinkx-workflows/dist/dashboard-ui/licenses/IBM-Plex-Sans-OFL.txt +93 -0
  160. package/clinkx-workflows/dist/dashboard-ui/licenses/JetBrains-Mono-OFL.txt +93 -0
  161. package/clinkx-workflows/dist/dashboard-ui/licenses/NOTICE.md +32 -0
  162. package/clinkx-workflows/dist/dashboard-ui/theme-init.js +8 -0
  163. package/clinkx-workflows/dist/definition-normalizer.d.ts +19 -0
  164. package/clinkx-workflows/dist/definition-normalizer.js.map +1 -1
  165. package/clinkx-workflows/dist/delegate-validate.d.ts +78 -0
  166. package/clinkx-workflows/dist/delegate-validate.js +97 -0
  167. package/clinkx-workflows/dist/delegate-validate.js.map +1 -0
  168. package/clinkx-workflows/dist/engine.d.ts +141 -0
  169. package/clinkx-workflows/dist/engine.js +882 -28
  170. package/clinkx-workflows/dist/engine.js.map +1 -1
  171. package/clinkx-workflows/dist/errors.d.ts +2 -0
  172. package/clinkx-workflows/dist/errors.js.map +1 -1
  173. package/clinkx-workflows/dist/fingerprint.d.ts +1 -1
  174. package/clinkx-workflows/dist/fingerprint.js +1 -1
  175. package/clinkx-workflows/dist/index.d.ts +19 -0
  176. package/clinkx-workflows/dist/index.js +15 -0
  177. package/clinkx-workflows/dist/index.js.map +1 -1
  178. package/clinkx-workflows/dist/loader.d.ts +9 -3
  179. package/clinkx-workflows/dist/loader.js +92 -21
  180. package/clinkx-workflows/dist/loader.js.map +1 -1
  181. package/clinkx-workflows/dist/plan-review/admission.d.ts +160 -0
  182. package/clinkx-workflows/dist/plan-review/admission.js +290 -0
  183. package/clinkx-workflows/dist/plan-review/admission.js.map +1 -0
  184. package/clinkx-workflows/dist/plan-review/context-policy.d.ts +55 -0
  185. package/clinkx-workflows/dist/plan-review/context-policy.js +146 -0
  186. package/clinkx-workflows/dist/plan-review/context-policy.js.map +1 -0
  187. package/clinkx-workflows/dist/plan-review/contract.d.ts +763 -0
  188. package/clinkx-workflows/dist/plan-review/contract.js +289 -0
  189. package/clinkx-workflows/dist/plan-review/contract.js.map +1 -0
  190. package/clinkx-workflows/dist/plan-review/digest.d.ts +68 -0
  191. package/clinkx-workflows/dist/plan-review/digest.js +241 -0
  192. package/clinkx-workflows/dist/plan-review/digest.js.map +1 -0
  193. package/clinkx-workflows/dist/plan-review/discovery.d.ts +45 -0
  194. package/clinkx-workflows/dist/plan-review/discovery.js +36 -0
  195. package/clinkx-workflows/dist/plan-review/discovery.js.map +1 -0
  196. package/clinkx-workflows/dist/plan-review/execution-contract.d.ts +298 -0
  197. package/clinkx-workflows/dist/plan-review/execution-contract.js +194 -0
  198. package/clinkx-workflows/dist/plan-review/execution-contract.js.map +1 -0
  199. package/clinkx-workflows/dist/plan-review/expander.d.ts +48 -0
  200. package/clinkx-workflows/dist/plan-review/expander.js +243 -0
  201. package/clinkx-workflows/dist/plan-review/expander.js.map +1 -0
  202. package/clinkx-workflows/dist/plan-review/projector.d.ts +126 -0
  203. package/clinkx-workflows/dist/plan-review/projector.js +437 -0
  204. package/clinkx-workflows/dist/plan-review/projector.js.map +1 -0
  205. package/clinkx-workflows/dist/plan-review/publication.d.ts +95 -0
  206. package/clinkx-workflows/dist/plan-review/publication.js +182 -0
  207. package/clinkx-workflows/dist/plan-review/publication.js.map +1 -0
  208. package/clinkx-workflows/dist/plan-review/ranking-reducer.d.ts +34 -0
  209. package/clinkx-workflows/dist/plan-review/ranking-reducer.js +139 -0
  210. package/clinkx-workflows/dist/plan-review/ranking-reducer.js.map +1 -0
  211. package/clinkx-workflows/dist/plan-review/resume.d.ts +38 -0
  212. package/clinkx-workflows/dist/plan-review/resume.js +122 -0
  213. package/clinkx-workflows/dist/plan-review/resume.js.map +1 -0
  214. package/clinkx-workflows/dist/plan-review/rubric.d.ts +7 -0
  215. package/clinkx-workflows/dist/plan-review/rubric.js +24 -0
  216. package/clinkx-workflows/dist/plan-review/rubric.js.map +1 -0
  217. package/clinkx-workflows/dist/plan-review/run-state.d.ts +398 -0
  218. package/clinkx-workflows/dist/plan-review/run-state.js +183 -0
  219. package/clinkx-workflows/dist/plan-review/run-state.js.map +1 -0
  220. package/clinkx-workflows/dist/plan-review/runtime-policy.d.ts +74 -0
  221. package/clinkx-workflows/dist/plan-review/runtime-policy.js +186 -0
  222. package/clinkx-workflows/dist/plan-review/runtime-policy.js.map +1 -0
  223. package/clinkx-workflows/dist/plan-review/snapshot.d.ts +81 -0
  224. package/clinkx-workflows/dist/plan-review/snapshot.js +170 -0
  225. package/clinkx-workflows/dist/plan-review/snapshot.js.map +1 -0
  226. package/clinkx-workflows/dist/plan-review/stage-error.d.ts +19 -0
  227. package/clinkx-workflows/dist/plan-review/stage-error.js +20 -0
  228. package/clinkx-workflows/dist/plan-review/stage-error.js.map +1 -0
  229. package/clinkx-workflows/dist/post-processors/index.d.ts +20 -0
  230. package/clinkx-workflows/dist/post-processors/index.js +21 -0
  231. package/clinkx-workflows/dist/post-processors/index.js.map +1 -0
  232. package/clinkx-workflows/dist/prompt-budget.d.ts +7 -0
  233. package/clinkx-workflows/dist/prompt-budget.js +7 -1
  234. package/clinkx-workflows/dist/prompt-budget.js.map +1 -1
  235. package/clinkx-workflows/dist/reducers/index.js +2 -0
  236. package/clinkx-workflows/dist/reducers/index.js.map +1 -1
  237. package/clinkx-workflows/dist/run-lock-heartbeat.d.ts +2 -0
  238. package/clinkx-workflows/dist/run-lock-heartbeat.js +3 -0
  239. package/clinkx-workflows/dist/run-lock-heartbeat.js.map +1 -0
  240. package/clinkx-workflows/dist/run-summary/cards/council-plan-review.d.ts +34 -0
  241. package/clinkx-workflows/dist/run-summary/cards/council-plan-review.js +74 -0
  242. package/clinkx-workflows/dist/run-summary/cards/council-plan-review.js.map +1 -0
  243. package/clinkx-workflows/dist/run-summary/cards/index.js +5 -0
  244. package/clinkx-workflows/dist/run-summary/cards/index.js.map +1 -1
  245. package/clinkx-workflows/dist/run-summary.d.ts +13 -0
  246. package/clinkx-workflows/dist/run-summary.js +29 -1
  247. package/clinkx-workflows/dist/run-summary.js.map +1 -1
  248. package/clinkx-workflows/dist/schema.d.ts +76 -21
  249. package/clinkx-workflows/dist/schema.js +10 -1
  250. package/clinkx-workflows/dist/schema.js.map +1 -1
  251. package/clinkx-workflows/dist/seed-terms.d.ts +30 -0
  252. package/clinkx-workflows/dist/seed-terms.js +176 -0
  253. package/clinkx-workflows/dist/seed-terms.js.map +1 -0
  254. package/clinkx-workflows/dist/server.d.ts +5 -2
  255. package/clinkx-workflows/dist/server.js +82 -52
  256. package/clinkx-workflows/dist/server.js.map +1 -1
  257. package/clinkx-workflows/dist/shutdown.d.ts +18 -20
  258. package/clinkx-workflows/dist/shutdown.js +43 -61
  259. package/clinkx-workflows/dist/shutdown.js.map +1 -1
  260. package/clinkx-workflows/dist/state-schema.d.ts +38 -0
  261. package/clinkx-workflows/dist/state.d.ts +170 -3
  262. package/clinkx-workflows/dist/state.js +1275 -28
  263. package/clinkx-workflows/dist/state.js.map +1 -1
  264. package/clinkx-workflows/dist/transport.d.ts +15 -0
  265. package/clinkx-workflows/dist/transport.js +19 -10
  266. package/clinkx-workflows/dist/transport.js.map +1 -1
  267. package/clinkx-workflows/dist/types.d.ts +14 -2
  268. package/clinkx-workflows/dist/validators/council.d.ts +318 -85
  269. package/clinkx-workflows/dist/validators/council.js +52 -13
  270. package/clinkx-workflows/dist/validators/council.js.map +1 -1
  271. package/clinkx-workflows/dist/validators/index.d.ts +1 -0
  272. package/clinkx-workflows/dist/validators/index.js +3 -0
  273. package/clinkx-workflows/dist/validators/index.js.map +1 -1
  274. package/clinkx-workflows/dist/validators/plan-review.d.ts +398 -0
  275. package/clinkx-workflows/dist/validators/plan-review.js +316 -0
  276. package/clinkx-workflows/dist/validators/plan-review.js.map +1 -0
  277. package/clinkx-workflows/dist/workflow-receipt.js +188 -4
  278. package/clinkx-workflows/dist/workflow-receipt.js.map +1 -1
  279. package/clinkx-workflows/dist/workflow-tools.d.ts +48 -3
  280. package/clinkx-workflows/dist/workflow-tools.js +1402 -59
  281. package/clinkx-workflows/dist/workflow-tools.js.map +1 -1
  282. package/clinkx-workflows/dist/workspace-signature.d.ts +16 -0
  283. package/clinkx-workflows/dist/workspace-signature.js +388 -0
  284. package/clinkx-workflows/dist/workspace-signature.js.map +1 -0
  285. package/clinkx-workflows/templates/council/answer-specialist.txt +2 -1
  286. package/clinkx-workflows/templates/council/code-review-chairman.txt +13 -0
  287. package/clinkx-workflows/templates/council/code-review-cross-reviewer.txt +4 -1
  288. package/clinkx-workflows/templates/council/code-review-reviewer.txt +19 -3
  289. package/clinkx-workflows/templates/council/debug-debugger.txt +2 -1
  290. package/clinkx-workflows/templates/council/discover-analyst.txt +2 -1
  291. package/clinkx-workflows/templates/council/member.txt +2 -1
  292. package/clinkx-workflows/templates/council/plan-review-chairman.txt +68 -0
  293. package/clinkx-workflows/templates/council/plan-review-cross-reviewer.txt +51 -0
  294. package/clinkx-workflows/templates/council/plan-review-reviewer.txt +60 -0
  295. package/clinkx-workflows/templates/plan-review/chairman.txt +48 -0
  296. package/clinkx-workflows/templates/plan-review/cross-review.txt +52 -0
  297. package/clinkx-workflows/templates/plan-review/ranking.txt +16 -0
  298. package/clinkx-workflows/templates/plan-review/reviewer.txt +57 -0
  299. package/clinkx-workflows/workflows/council-answer.yaml +97 -8
  300. package/clinkx-workflows/workflows/council-code-review.yaml +103 -8
  301. package/clinkx-workflows/workflows/council-debug.yaml +97 -8
  302. package/clinkx-workflows/workflows/council-default.yaml +97 -8
  303. package/clinkx-workflows/workflows/council-discover.yaml +97 -8
  304. package/clinkx-workflows/workflows/council-plan-review.yaml +250 -0
  305. package/clinkx-workflows/workflows/plan-review-receipts.yaml +230 -0
  306. package/conf/adapters/agy.json +49 -0
  307. package/conf/adapters/claude.json +5 -0
  308. package/conf/adapters/codex-app-server.json +44 -0
  309. package/conf/adapters/codex.json +7 -2
  310. package/conf/adapters/glm.json +5 -0
  311. package/conf/adapters/grok.json +60 -0
  312. package/conf/adapters/hapi/agy.json +52 -0
  313. package/conf/adapters/hapi/claude.json +5 -0
  314. package/conf/adapters/hapi/codex.json +7 -2
  315. package/conf/adapters/hapi/glm.json +5 -0
  316. package/dist/activity-journal.d.ts +42 -0
  317. package/dist/activity-journal.js +381 -0
  318. package/dist/activity-journal.js.map +1 -0
  319. package/dist/allowed-roots.d.ts +41 -0
  320. package/dist/allowed-roots.js +125 -3
  321. package/dist/allowed-roots.js.map +1 -1
  322. package/dist/codex/activity-session-log.d.ts +14 -0
  323. package/dist/codex/activity-session-log.js +206 -0
  324. package/dist/codex/activity-session-log.js.map +1 -0
  325. package/dist/codex/agent-tools.d.ts +23 -0
  326. package/dist/codex/agent-tools.js +1270 -0
  327. package/dist/codex/agent-tools.js.map +1 -0
  328. package/dist/codex/app-server-client.d.ts +76 -0
  329. package/dist/codex/app-server-client.js +582 -0
  330. package/dist/codex/app-server-client.js.map +1 -0
  331. package/dist/codex/app-server-registry.d.ts +389 -0
  332. package/dist/codex/app-server-registry.js +1407 -0
  333. package/dist/codex/app-server-registry.js.map +1 -0
  334. package/dist/codex/client-types.d.ts +109 -0
  335. package/dist/codex/client-types.js +2 -0
  336. package/dist/codex/client-types.js.map +1 -0
  337. package/dist/codex/protocol.d.ts +5375 -0
  338. package/dist/codex/protocol.js +614 -0
  339. package/dist/codex/protocol.js.map +1 -0
  340. package/dist/codex/session.d.ts +263 -0
  341. package/dist/codex/session.js +466 -0
  342. package/dist/codex/session.js.map +1 -0
  343. package/dist/config.d.ts +185 -19
  344. package/dist/config.js +82 -16
  345. package/dist/config.js.map +1 -1
  346. package/dist/context-builder/anchors.d.ts +1 -0
  347. package/dist/context-builder/anchors.js +3 -0
  348. package/dist/context-builder/anchors.js.map +1 -1
  349. package/dist/context-builder/bundle.d.ts +35 -2
  350. package/dist/context-builder/bundle.js +342 -2417
  351. package/dist/context-builder/bundle.js.map +1 -1
  352. package/dist/context-builder/codemap.d.ts +5 -0
  353. package/dist/context-builder/codemap.js +387 -13
  354. package/dist/context-builder/codemap.js.map +1 -1
  355. package/dist/context-builder/config.d.ts +1 -0
  356. package/dist/context-builder/config.js +12 -0
  357. package/dist/context-builder/config.js.map +1 -1
  358. package/dist/context-builder/context-run-catalog.d.ts +17 -0
  359. package/dist/context-builder/context-run-catalog.js +99 -0
  360. package/dist/context-builder/context-run-catalog.js.map +1 -0
  361. package/dist/context-builder/delegate-packet.d.ts +37 -0
  362. package/dist/context-builder/delegate-packet.js +359 -67
  363. package/dist/context-builder/delegate-packet.js.map +1 -1
  364. package/dist/context-builder/delegate-validation.d.ts +10 -1
  365. package/dist/context-builder/delegate-validation.js +153 -41
  366. package/dist/context-builder/delegate-validation.js.map +1 -1
  367. package/dist/context-builder/delegate.d.ts +2 -0
  368. package/dist/context-builder/delegate.js +1 -0
  369. package/dist/context-builder/delegate.js.map +1 -1
  370. package/dist/context-builder/diagnostics.d.ts +11 -2
  371. package/dist/context-builder/diagnostics.js +39 -6
  372. package/dist/context-builder/diagnostics.js.map +1 -1
  373. package/dist/context-builder/discovery.d.ts +29 -1
  374. package/dist/context-builder/discovery.js +475 -175
  375. package/dist/context-builder/discovery.js.map +1 -1
  376. package/dist/context-builder/globs.js +10 -10
  377. package/dist/context-builder/globs.js.map +1 -1
  378. package/dist/context-builder/handler.d.ts +26 -2
  379. package/dist/context-builder/handler.js +1158 -2416
  380. package/dist/context-builder/handler.js.map +1 -1
  381. package/dist/context-builder/lifecycle-contract.d.ts +424 -0
  382. package/dist/context-builder/lifecycle-contract.js +523 -0
  383. package/dist/context-builder/lifecycle-contract.js.map +1 -0
  384. package/dist/context-builder/lifecycle-journal.d.ts +62 -0
  385. package/dist/context-builder/lifecycle-journal.js +88 -0
  386. package/dist/context-builder/lifecycle-journal.js.map +1 -0
  387. package/dist/context-builder/lifecycle-observer.d.ts +102 -0
  388. package/dist/context-builder/lifecycle-observer.js +258 -0
  389. package/dist/context-builder/lifecycle-observer.js.map +1 -0
  390. package/dist/context-builder/lifecycle-reconcile.d.ts +32 -0
  391. package/dist/context-builder/lifecycle-reconcile.js +191 -0
  392. package/dist/context-builder/lifecycle-reconcile.js.map +1 -0
  393. package/dist/context-builder/lifecycle-recovery.d.ts +2 -0
  394. package/dist/context-builder/lifecycle-recovery.js +14 -0
  395. package/dist/context-builder/lifecycle-recovery.js.map +1 -0
  396. package/dist/context-builder/path-signals.js +9 -5
  397. package/dist/context-builder/path-signals.js.map +1 -1
  398. package/dist/context-builder/progress.d.ts +3 -1
  399. package/dist/context-builder/progress.js +23 -0
  400. package/dist/context-builder/progress.js.map +1 -1
  401. package/dist/context-builder/receipt.d.ts +6 -4
  402. package/dist/context-builder/receipt.js +12 -1
  403. package/dist/context-builder/receipt.js.map +1 -1
  404. package/dist/context-builder/refine-handler.d.ts +14 -0
  405. package/dist/context-builder/refine-handler.js +790 -0
  406. package/dist/context-builder/refine-handler.js.map +1 -0
  407. package/dist/context-builder/review-coverage.d.ts +84 -0
  408. package/dist/context-builder/review-coverage.js +437 -0
  409. package/dist/context-builder/review-coverage.js.map +1 -0
  410. package/dist/context-builder/schema.d.ts +239 -1
  411. package/dist/context-builder/schema.js +112 -6
  412. package/dist/context-builder/schema.js.map +1 -1
  413. package/dist/context-builder/secrets.d.ts +28 -0
  414. package/dist/context-builder/secrets.js +1473 -44
  415. package/dist/context-builder/secrets.js.map +1 -1
  416. package/dist/context-builder/selection.d.ts +7 -3
  417. package/dist/context-builder/selection.js +200 -738
  418. package/dist/context-builder/selection.js.map +1 -1
  419. package/dist/context-builder/session-log-identity.d.ts +1 -0
  420. package/dist/context-builder/session-log-identity.js +66 -0
  421. package/dist/context-builder/session-log-identity.js.map +1 -0
  422. package/dist/context-builder/slice-range-math.d.ts +16 -0
  423. package/dist/context-builder/slice-range-math.js +137 -0
  424. package/dist/context-builder/slice-range-math.js.map +1 -0
  425. package/dist/context-builder/status.d.ts +22 -1
  426. package/dist/context-builder/status.js +59 -4
  427. package/dist/context-builder/status.js.map +1 -1
  428. package/dist/context-builder/storage.d.ts +35 -2
  429. package/dist/context-builder/storage.js +271 -14
  430. package/dist/context-builder/storage.js.map +1 -1
  431. package/dist/context-builder/token-estimate.d.ts +13 -2
  432. package/dist/context-builder/token-estimate.js +77 -4
  433. package/dist/context-builder/token-estimate.js.map +1 -1
  434. package/dist/context-builder/versions.d.ts +29 -0
  435. package/dist/context-builder/versions.js +30 -0
  436. package/dist/context-builder/versions.js.map +1 -0
  437. package/dist/context-builder/workflow-runner.d.ts +69 -0
  438. package/dist/context-builder/workflow-runner.js +1051 -0
  439. package/dist/context-builder/workflow-runner.js.map +1 -0
  440. package/dist/context-builder/write-watchdog.d.ts +14 -0
  441. package/dist/context-builder/write-watchdog.js +38 -0
  442. package/dist/context-builder/write-watchdog.js.map +1 -0
  443. package/dist/dashboard-adapter-catalog.d.ts +9 -0
  444. package/dist/dashboard-adapter-catalog.js +46 -0
  445. package/dist/dashboard-adapter-catalog.js.map +1 -0
  446. package/dist/dashboard-cli.d.ts +79 -0
  447. package/dist/dashboard-cli.js +585 -0
  448. package/dist/dashboard-cli.js.map +1 -0
  449. package/dist/dashboard-companion/client.d.ts +36 -0
  450. package/dist/dashboard-companion/client.js +210 -0
  451. package/dist/dashboard-companion/client.js.map +1 -0
  452. package/dist/dashboard-companion/config.d.ts +8 -0
  453. package/dist/dashboard-companion/config.js +52 -0
  454. package/dist/dashboard-companion/config.js.map +1 -0
  455. package/dist/dashboard-companion/http-proxy.d.ts +10 -0
  456. package/dist/dashboard-companion/http-proxy.js +234 -0
  457. package/dist/dashboard-companion/http-proxy.js.map +1 -0
  458. package/dist/dashboard-companion/protocol.d.ts +80 -0
  459. package/dist/dashboard-companion/protocol.js +455 -0
  460. package/dist/dashboard-companion/protocol.js.map +1 -0
  461. package/dist/dashboard-companion/standalone-assets.d.ts +12 -0
  462. package/dist/dashboard-companion/standalone-assets.js +72 -0
  463. package/dist/dashboard-companion/standalone-assets.js.map +1 -0
  464. package/dist/dashboard-companion/standalone-entry.d.ts +1 -0
  465. package/dist/dashboard-companion/standalone-entry.js +17 -0
  466. package/dist/dashboard-companion/standalone-entry.js.map +1 -0
  467. package/dist/dashboard-gateway/config.d.ts +9 -0
  468. package/dist/dashboard-gateway/config.js +44 -0
  469. package/dist/dashboard-gateway/config.js.map +1 -0
  470. package/dist/dashboard-gateway/index.d.ts +11 -0
  471. package/dist/dashboard-gateway/index.js +755 -0
  472. package/dist/dashboard-gateway/index.js.map +1 -0
  473. package/dist/dashboard-gateway/main.d.ts +1 -0
  474. package/dist/dashboard-gateway/main.js +25 -0
  475. package/dist/dashboard-gateway/main.js.map +1 -0
  476. package/dist/dashboard-pairing-token.d.ts +1 -0
  477. package/dist/dashboard-pairing-token.js +5 -0
  478. package/dist/dashboard-pairing-token.js.map +1 -0
  479. package/dist/elaris/client.d.ts +73 -0
  480. package/dist/elaris/client.js +825 -0
  481. package/dist/elaris/client.js.map +1 -0
  482. package/dist/elaris/config.d.ts +18 -0
  483. package/dist/elaris/config.js +75 -0
  484. package/dist/elaris/config.js.map +1 -0
  485. package/dist/elaris/errors.d.ts +41 -0
  486. package/dist/elaris/errors.js +205 -0
  487. package/dist/elaris/errors.js.map +1 -0
  488. package/dist/elaris/github-repo.d.ts +18 -0
  489. package/dist/elaris/github-repo.js +89 -0
  490. package/dist/elaris/github-repo.js.map +1 -0
  491. package/dist/elaris/index.d.ts +10 -0
  492. package/dist/elaris/index.js +11 -0
  493. package/dist/elaris/index.js.map +1 -0
  494. package/dist/elaris/redact.d.ts +89 -0
  495. package/dist/elaris/redact.js +423 -0
  496. package/dist/elaris/redact.js.map +1 -0
  497. package/dist/elaris/run-id.d.ts +5 -0
  498. package/dist/elaris/run-id.js +20 -0
  499. package/dist/elaris/run-id.js.map +1 -0
  500. package/dist/elaris/status.d.ts +45 -0
  501. package/dist/elaris/status.js +122 -0
  502. package/dist/elaris/status.js.map +1 -0
  503. package/dist/elaris/tool-schemas.d.ts +314 -0
  504. package/dist/elaris/tool-schemas.js +208 -0
  505. package/dist/elaris/tool-schemas.js.map +1 -0
  506. package/dist/elaris/tools.d.ts +73 -0
  507. package/dist/elaris/tools.js +1065 -0
  508. package/dist/elaris/tools.js.map +1 -0
  509. package/dist/elaris/types.d.ts +1541 -0
  510. package/dist/elaris/types.js +252 -0
  511. package/dist/elaris/types.js.map +1 -0
  512. package/dist/errors.d.ts +16 -0
  513. package/dist/errors.js +19 -0
  514. package/dist/errors.js.map +1 -1
  515. package/dist/handler.d.ts +4 -0
  516. package/dist/handler.js +10 -1
  517. package/dist/handler.js.map +1 -1
  518. package/dist/index.d.ts +2 -1
  519. package/dist/index.js +13 -3
  520. package/dist/index.js.map +1 -1
  521. package/dist/local-clink-backend.d.ts +3 -0
  522. package/dist/local-clink-backend.js +4 -0
  523. package/dist/local-clink-backend.js.map +1 -1
  524. package/dist/package-info.d.ts +2 -0
  525. package/dist/package-info.js +18 -0
  526. package/dist/package-info.js.map +1 -0
  527. package/dist/parsers/codex-jsonl.js +48 -3
  528. package/dist/parsers/codex-jsonl.js.map +1 -1
  529. package/dist/parsers/extract.d.ts +10 -1
  530. package/dist/parsers/extract.js +11 -3
  531. package/dist/parsers/extract.js.map +1 -1
  532. package/dist/pipeline.d.ts +4 -0
  533. package/dist/pipeline.js +129 -8
  534. package/dist/pipeline.js.map +1 -1
  535. package/dist/run-dir.d.ts +24 -0
  536. package/dist/run-dir.js +201 -2
  537. package/dist/run-dir.js.map +1 -1
  538. package/dist/runner.d.ts +13 -0
  539. package/dist/runner.js +184 -15
  540. package/dist/runner.js.map +1 -1
  541. package/dist/safety.d.ts +4 -4
  542. package/dist/safety.js +4 -4
  543. package/dist/schema.d.ts +7 -7
  544. package/dist/server.d.ts +1 -0
  545. package/dist/server.js +359 -17
  546. package/dist/server.js.map +1 -1
  547. package/dist/session-log-stream.d.ts +18 -0
  548. package/dist/session-log-stream.js +319 -0
  549. package/dist/session-log-stream.js.map +1 -0
  550. package/package.json +46 -5
  551. package/conf/adapters/gemini.json +0 -44
  552. package/conf/adapters/hapi/gemini.json +0 -47
  553. package/dist/parsers/gemini-json.d.ts +0 -2
  554. package/dist/parsers/gemini-json.js +0 -72
  555. package/dist/parsers/gemini-json.js.map +0 -1
@@ -0,0 +1,755 @@
1
+ import { createServer, validateHeaderValue, } from "node:http";
2
+ import { timingSafeEqual } from "node:crypto";
3
+ import { randomUUID } from "node:crypto";
4
+ import { WebSocketServer } from "ws";
5
+ import { DASHBOARD_GATEWAY_V2_SUBPROTOCOL, MAX_GATEWAY_V2_REQUEST_BODY_BYTES, isForwardableV2PostPath, parseGatewayRequest, parseGatewayV2Request, parseGatewayV2Response, } from "../dashboard-companion/protocol.js";
6
+ import { isDashboardPairingToken } from "../dashboard-pairing-token.js";
7
+ const MAX_AGENT_FRAME_BYTES = 24 * 1024 * 1024;
8
+ const MAX_FORWARD_PATH_BYTES = 2_048;
9
+ const MAX_FORWARD_HEADER_BYTES = 64 * 1024;
10
+ const MAX_REQUEST_MESSAGE_BYTES = 64 * 1024;
11
+ const MAX_RESPONSE_BODY_BYTES = 16 * 1024 * 1024;
12
+ const MAX_IN_FLIGHT = 128;
13
+ const MAX_V2_IN_FLIGHT = 8;
14
+ const MAX_V2_SMALL_POST_BYTES = 4 * 1024;
15
+ const MAX_RETIRED_REQUEST_IDS = 1_024;
16
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
17
+ const RESPONSE_HEADER_ALLOWLIST = new Set([
18
+ "access-control-allow-headers",
19
+ "access-control-allow-methods",
20
+ "access-control-allow-origin",
21
+ "access-control-expose-headers",
22
+ "cache-control",
23
+ "content-length",
24
+ "content-type",
25
+ "etag",
26
+ "vary",
27
+ "x-clinkx-agent-instance-id",
28
+ ]);
29
+ function sendText(response, status, body) {
30
+ response.writeHead(status, {
31
+ "cache-control": "no-store",
32
+ "content-type": "text/plain; charset=utf-8",
33
+ });
34
+ response.end(body);
35
+ }
36
+ function sendJson(response, status, error) {
37
+ const body = `${JSON.stringify({ error })}\n`;
38
+ response.writeHead(status, {
39
+ "cache-control": "no-store",
40
+ "content-type": "application/json; charset=utf-8",
41
+ "content-length": Buffer.byteLength(body),
42
+ });
43
+ response.end(body);
44
+ }
45
+ function requestHeaders(request) {
46
+ const result = { host: request.headers.host ?? "" };
47
+ const copy = (source, target) => {
48
+ const value = request.headers[source];
49
+ if (typeof value === "string")
50
+ result[target] = value;
51
+ };
52
+ copy("origin", "origin");
53
+ copy("authorization", "authorization");
54
+ copy("access-control-request-method", "accessControlRequestMethod");
55
+ copy("access-control-request-headers", "accessControlRequestHeaders");
56
+ copy("x-clinkx-agent-instance-id", "agentInstanceId");
57
+ return result;
58
+ }
59
+ function oneHeader(request, name) {
60
+ const values = request.headersDistinct[name];
61
+ if (values === undefined)
62
+ return undefined;
63
+ return values.length === 1 && values[0] !== undefined && values[0] !== ""
64
+ ? values[0]
65
+ : null;
66
+ }
67
+ const V2_PROGRESS_REPORT_STATUS_OVERRIDE_PATH = /^\/api\/progress-reports\/[A-Za-z0-9][A-Za-z0-9_-]{0,63}\/status-override$/;
68
+ function v2PostBodyLimit(path) {
69
+ return path === "/api/auth/register/options"
70
+ || path === "/api/auth/login/options"
71
+ || path === "/api/auth/logout"
72
+ || V2_PROGRESS_REPORT_STATUS_OVERRIDE_PATH.test(path)
73
+ ? MAX_V2_SMALL_POST_BYTES
74
+ : MAX_GATEWAY_V2_REQUEST_BODY_BYTES;
75
+ }
76
+ function v2RequestHeaders(request, method, path) {
77
+ const host = oneHeader(request, "host");
78
+ const origin = oneHeader(request, "origin");
79
+ const cookie = oneHeader(request, "cookie");
80
+ const contentType = oneHeader(request, "content-type");
81
+ const enrollmentCode = oneHeader(request, "x-enrollment-code");
82
+ if (host == null || origin === null || cookie === null || contentType === null || enrollmentCode === null) {
83
+ return undefined;
84
+ }
85
+ if (method === "POST") {
86
+ if (contentType === undefined || contentType.toLowerCase() !== "application/json")
87
+ return undefined;
88
+ if (enrollmentCode !== undefined
89
+ && path !== "/api/auth/register/options"
90
+ && path !== "/api/auth/register/verify")
91
+ return undefined;
92
+ }
93
+ else if (contentType !== undefined || enrollmentCode !== undefined) {
94
+ return undefined;
95
+ }
96
+ return {
97
+ host,
98
+ ...(origin === undefined ? {} : { origin }),
99
+ ...(cookie === undefined ? {} : { cookie }),
100
+ ...(contentType === undefined ? {} : { contentType }),
101
+ ...(enrollmentCode === undefined ? {} : { enrollmentCode }),
102
+ };
103
+ }
104
+ async function readV2RequestBody(request, maximumBytes, signal) {
105
+ return new Promise((resolve, reject) => {
106
+ const chunks = [];
107
+ let total = 0;
108
+ let settled = false;
109
+ const cleanup = () => {
110
+ request.off("data", onData);
111
+ request.off("end", onEnd);
112
+ request.off("error", onError);
113
+ request.off("aborted", onAborted);
114
+ signal.removeEventListener("abort", onAbort);
115
+ };
116
+ const finish = (body) => {
117
+ if (settled)
118
+ return;
119
+ settled = true;
120
+ cleanup();
121
+ resolve(body);
122
+ };
123
+ const onData = (chunk) => {
124
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
125
+ total += bytes.byteLength;
126
+ if (total > maximumBytes) {
127
+ request.resume();
128
+ finish(undefined);
129
+ return;
130
+ }
131
+ chunks.push(bytes);
132
+ };
133
+ const onEnd = () => finish(Buffer.concat(chunks));
134
+ const onError = (error) => {
135
+ if (settled)
136
+ return;
137
+ settled = true;
138
+ cleanup();
139
+ reject(error);
140
+ };
141
+ const onAborted = () => finish(undefined);
142
+ const onAbort = () => {
143
+ request.resume();
144
+ finish(undefined);
145
+ };
146
+ if (signal.aborted) {
147
+ onAbort();
148
+ return;
149
+ }
150
+ request.on("data", onData);
151
+ request.once("end", onEnd);
152
+ request.once("error", onError);
153
+ request.once("aborted", onAborted);
154
+ signal.addEventListener("abort", onAbort, { once: true });
155
+ });
156
+ }
157
+ function byteSize(value) {
158
+ return Buffer.byteLength(JSON.stringify(value));
159
+ }
160
+ function isAllowedApiTarget(path) {
161
+ if (Buffer.byteLength(path) > MAX_FORWARD_PATH_BYTES)
162
+ return false;
163
+ const rawPathname = path.split("?", 1)[0] ?? "";
164
+ if (/%(?:00|2e|2f|5c)/i.test(rawPathname) || rawPathname.includes("\\"))
165
+ return false;
166
+ try {
167
+ const parsed = new URL(path, "http://dashboard-gateway.invalid");
168
+ return parsed.origin === "http://dashboard-gateway.invalid"
169
+ && `${parsed.pathname}${parsed.search}` === path
170
+ && (parsed.pathname === "/api" || parsed.pathname.startsWith("/api/"));
171
+ }
172
+ catch {
173
+ return false;
174
+ }
175
+ }
176
+ function decodeBase64(value) {
177
+ if (typeof value !== "string" || value.length % 4 !== 0)
178
+ return undefined;
179
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
180
+ const decodedLength = (value.length / 4) * 3 - padding;
181
+ if (decodedLength > MAX_RESPONSE_BODY_BYTES)
182
+ return undefined;
183
+ const decoded = Buffer.from(value, "base64");
184
+ return decoded.length === decodedLength && decoded.toString("base64") === value
185
+ ? decoded
186
+ : undefined;
187
+ }
188
+ function allowedResponseHeaders(value) {
189
+ if (typeof value !== "object" || value === null || Array.isArray(value))
190
+ return undefined;
191
+ if (byteSize(value) > MAX_FORWARD_HEADER_BYTES)
192
+ return undefined;
193
+ const result = {};
194
+ for (const [name, headerValue] of Object.entries(value)) {
195
+ const normalized = name.toLowerCase();
196
+ if (typeof headerValue !== "string")
197
+ return undefined;
198
+ if (RESPONSE_HEADER_ALLOWLIST.has(normalized)) {
199
+ try {
200
+ validateHeaderValue(normalized, headerValue);
201
+ }
202
+ catch {
203
+ return undefined;
204
+ }
205
+ result[normalized] = headerValue;
206
+ }
207
+ }
208
+ return result;
209
+ }
210
+ function tokenMatches(header, expectedToken) {
211
+ const prefix = "Bearer ";
212
+ if (header === undefined || !header.startsWith(prefix))
213
+ return false;
214
+ const actual = Buffer.from(header.slice(prefix.length));
215
+ const expected = Buffer.from(expectedToken);
216
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
217
+ }
218
+ function rejectUpgrade(socket, status, reason) {
219
+ const body = `${reason}\n`;
220
+ socket.end(`HTTP/1.1 ${status} ${reason}\r\n` +
221
+ "Connection: close\r\n" +
222
+ "Cache-Control: no-store\r\n" +
223
+ "Content-Type: text/plain; charset=utf-8\r\n" +
224
+ `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`);
225
+ }
226
+ export function createDashboardGateway(options) {
227
+ if (!isDashboardPairingToken(options.token)) {
228
+ throw new Error("Dashboard gateway token is invalid");
229
+ }
230
+ const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
231
+ if (!Number.isSafeInteger(requestTimeoutMs) || requestTimeoutMs <= 0) {
232
+ throw new Error("Dashboard gateway request timeout must be a positive integer");
233
+ }
234
+ const pending = new Map();
235
+ const retiredRequestIds = new Set();
236
+ let agent;
237
+ let v2Reservations = 0;
238
+ const reserveV2Request = () => {
239
+ if (v2Reservations >= MAX_V2_IN_FLIGHT)
240
+ return false;
241
+ v2Reservations += 1;
242
+ return true;
243
+ };
244
+ const releaseV2Request = () => {
245
+ if (v2Reservations > 0)
246
+ v2Reservations -= 1;
247
+ };
248
+ const dropPending = (id) => {
249
+ const item = pending.get(id);
250
+ if (item === undefined)
251
+ return undefined;
252
+ pending.delete(id);
253
+ if (item.version === 2)
254
+ releaseV2Request();
255
+ return item;
256
+ };
257
+ const retireRequestId = (id) => {
258
+ retiredRequestIds.add(id);
259
+ while (retiredRequestIds.size > MAX_RETIRED_REQUEST_IDS) {
260
+ const oldest = retiredRequestIds.values().next().value;
261
+ if (oldest === undefined)
262
+ break;
263
+ retiredRequestIds.delete(oldest);
264
+ }
265
+ };
266
+ const failPending = (status, error) => {
267
+ for (const [id, item] of pending) {
268
+ clearTimeout(item.timeout);
269
+ dropPending(id);
270
+ if (!item.response.writableEnded)
271
+ sendJson(item.response, status, error);
272
+ }
273
+ };
274
+ const server = createServer({ maxHeaderSize: MAX_FORWARD_HEADER_BYTES }, (request, response) => {
275
+ if (request.method === "GET" && request.url === "/healthz") {
276
+ sendText(response, 200, "ok\n");
277
+ return;
278
+ }
279
+ const method = request.method ?? "";
280
+ const path = request.url ?? "";
281
+ if (!isAllowedApiTarget(path)) {
282
+ sendJson(response, 404, "not_found");
283
+ return;
284
+ }
285
+ const v2Post = method === "POST" && isForwardableV2PostPath(path);
286
+ if (v2Post) {
287
+ if (agent === undefined || agent.websocket.readyState !== 1 || agent.version !== 2) {
288
+ request.resume();
289
+ sendJson(response, 503, "dashboard_passkey_companion_unavailable");
290
+ return;
291
+ }
292
+ if (!reserveV2Request()) {
293
+ request.resume();
294
+ sendJson(response, 503, "dashboard_gateway_capacity_exceeded");
295
+ return;
296
+ }
297
+ const bodyReadAbort = new AbortController();
298
+ const requestDeadlineAt = Date.now() + requestTimeoutMs;
299
+ let pendingId;
300
+ let reservationHeld = true;
301
+ let bodyTimedOut = false;
302
+ let bodyDeadline;
303
+ const clearBodyDeadline = () => {
304
+ if (bodyDeadline !== undefined) {
305
+ clearTimeout(bodyDeadline);
306
+ bodyDeadline = undefined;
307
+ }
308
+ };
309
+ const releaseReservation = () => {
310
+ if (!reservationHeld)
311
+ return;
312
+ reservationHeld = false;
313
+ releaseV2Request();
314
+ };
315
+ response.once("close", () => {
316
+ if (pendingId !== undefined) {
317
+ const item = dropPending(pendingId);
318
+ if (item !== undefined) {
319
+ clearTimeout(item.timeout);
320
+ retireRequestId(pendingId);
321
+ }
322
+ return;
323
+ }
324
+ clearBodyDeadline();
325
+ bodyReadAbort.abort();
326
+ releaseReservation();
327
+ });
328
+ bodyDeadline = setTimeout(() => {
329
+ if (!reservationHeld)
330
+ return;
331
+ bodyTimedOut = true;
332
+ bodyReadAbort.abort();
333
+ releaseReservation();
334
+ if (!response.destroyed && !response.writableEnded) {
335
+ sendJson(response, 504, "dashboard_companion_timeout");
336
+ }
337
+ }, Math.max(1, requestDeadlineAt - Date.now()));
338
+ bodyDeadline.unref();
339
+ const headers = v2RequestHeaders(request, "POST", path);
340
+ if (headers === undefined) {
341
+ request.resume();
342
+ clearBodyDeadline();
343
+ bodyReadAbort.abort();
344
+ releaseReservation();
345
+ sendJson(response, 400, "invalid_request");
346
+ return;
347
+ }
348
+ void readV2RequestBody(request, v2PostBodyLimit(path), bodyReadAbort.signal).then((body) => {
349
+ clearBodyDeadline();
350
+ if (bodyTimedOut || response.destroyed || response.writableEnded || !reservationHeld)
351
+ return;
352
+ if (Date.now() >= requestDeadlineAt) {
353
+ releaseReservation();
354
+ sendJson(response, 504, "dashboard_companion_timeout");
355
+ return;
356
+ }
357
+ if (body === undefined) {
358
+ releaseReservation();
359
+ sendJson(response, 413, "payload_too_large");
360
+ return;
361
+ }
362
+ if (agent === undefined || agent.websocket.readyState !== 1 || agent.version !== 2) {
363
+ releaseReservation();
364
+ sendJson(response, 503, "dashboard_passkey_companion_unavailable");
365
+ return;
366
+ }
367
+ const id = randomUUID();
368
+ let wireRequest;
369
+ try {
370
+ wireRequest = JSON.stringify(parseGatewayV2Request(JSON.stringify({
371
+ v: 2,
372
+ type: "request",
373
+ id,
374
+ method: "POST",
375
+ path,
376
+ headers,
377
+ bodyBase64: body.toString("base64"),
378
+ })));
379
+ }
380
+ catch {
381
+ releaseReservation();
382
+ sendJson(response, 400, "invalid_request");
383
+ return;
384
+ }
385
+ const timeout = setTimeout(() => {
386
+ const item = dropPending(id);
387
+ if (item === undefined)
388
+ return;
389
+ retireRequestId(id);
390
+ sendJson(item.response, 504, "dashboard_companion_timeout");
391
+ }, requestDeadlineAt - Date.now());
392
+ timeout.unref();
393
+ pending.set(id, { response, method, timeout, version: 2 });
394
+ pendingId = id;
395
+ reservationHeld = false;
396
+ try {
397
+ agent.websocket.send(wireRequest, (error) => {
398
+ if (!error)
399
+ return;
400
+ const item = dropPending(id);
401
+ if (item === undefined)
402
+ return;
403
+ clearTimeout(item.timeout);
404
+ retireRequestId(id);
405
+ sendJson(item.response, 503, "dashboard_passkey_companion_unavailable");
406
+ });
407
+ }
408
+ catch {
409
+ const item = dropPending(id);
410
+ if (item !== undefined) {
411
+ clearTimeout(item.timeout);
412
+ retireRequestId(id);
413
+ sendJson(item.response, 503, "dashboard_passkey_companion_unavailable");
414
+ }
415
+ }
416
+ }).catch(() => {
417
+ clearBodyDeadline();
418
+ if (bodyTimedOut || response.destroyed || response.writableEnded)
419
+ return;
420
+ releaseReservation();
421
+ sendJson(response, 400, "invalid_request");
422
+ });
423
+ return;
424
+ }
425
+ if (method !== "GET" && method !== "HEAD" && method !== "OPTIONS") {
426
+ response.setHeader("allow", "GET, HEAD, OPTIONS");
427
+ sendJson(response, 405, "method_not_allowed");
428
+ return;
429
+ }
430
+ const contentLength = request.headers["content-length"];
431
+ if (request.headers["transfer-encoding"] !== undefined ||
432
+ (contentLength !== undefined && contentLength !== "0")) {
433
+ request.resume();
434
+ response.setHeader("connection", "close");
435
+ sendJson(response, 413, "request_body_not_allowed");
436
+ return;
437
+ }
438
+ if (agent === undefined || agent.websocket.readyState !== 1) {
439
+ sendJson(response, 503, "dashboard_companion_unavailable");
440
+ return;
441
+ }
442
+ if (agent.version === 2 && method === "OPTIONS") {
443
+ response.setHeader("allow", "GET, HEAD");
444
+ sendJson(response, 405, "method_not_allowed");
445
+ return;
446
+ }
447
+ if (agent.version === 2 && method !== "OPTIONS") {
448
+ if (!reserveV2Request()) {
449
+ sendJson(response, 503, "dashboard_gateway_capacity_exceeded");
450
+ return;
451
+ }
452
+ const headers = v2RequestHeaders(request, method, path);
453
+ if (headers === undefined) {
454
+ releaseV2Request();
455
+ sendJson(response, 400, "invalid_request");
456
+ return;
457
+ }
458
+ const id = randomUUID();
459
+ let wireRequest;
460
+ try {
461
+ wireRequest = JSON.stringify(parseGatewayV2Request(JSON.stringify({
462
+ v: 2,
463
+ type: "request",
464
+ id,
465
+ method,
466
+ path,
467
+ headers,
468
+ bodyBase64: "",
469
+ })));
470
+ }
471
+ catch {
472
+ releaseV2Request();
473
+ sendJson(response, 400, "invalid_request");
474
+ return;
475
+ }
476
+ const timeout = setTimeout(() => {
477
+ const item = dropPending(id);
478
+ if (item === undefined)
479
+ return;
480
+ retireRequestId(id);
481
+ sendJson(item.response, 504, "dashboard_companion_timeout");
482
+ }, requestTimeoutMs);
483
+ timeout.unref();
484
+ pending.set(id, { response, method, timeout, version: 2 });
485
+ try {
486
+ agent.websocket.send(wireRequest, (error) => {
487
+ if (!error)
488
+ return;
489
+ const item = dropPending(id);
490
+ if (item === undefined)
491
+ return;
492
+ clearTimeout(item.timeout);
493
+ retireRequestId(id);
494
+ sendJson(item.response, 503, "dashboard_companion_unavailable");
495
+ });
496
+ }
497
+ catch {
498
+ const item = dropPending(id);
499
+ if (item !== undefined) {
500
+ clearTimeout(item.timeout);
501
+ retireRequestId(id);
502
+ sendJson(item.response, 503, "dashboard_companion_unavailable");
503
+ }
504
+ }
505
+ response.once("close", () => {
506
+ if (response.writableEnded)
507
+ return;
508
+ const item = dropPending(id);
509
+ if (item !== undefined) {
510
+ clearTimeout(item.timeout);
511
+ retireRequestId(id);
512
+ }
513
+ });
514
+ return;
515
+ }
516
+ if (pending.size >= MAX_IN_FLIGHT) {
517
+ sendJson(response, 503, "dashboard_gateway_capacity_exceeded");
518
+ return;
519
+ }
520
+ const headers = requestHeaders(request);
521
+ if (byteSize(headers) > MAX_FORWARD_HEADER_BYTES) {
522
+ sendJson(response, 431, "request_headers_too_large");
523
+ return;
524
+ }
525
+ const id = randomUUID();
526
+ let wireRequest;
527
+ try {
528
+ const admitted = parseGatewayRequest(JSON.stringify({ v: 1, type: "request", id, method, path, headers }));
529
+ wireRequest = JSON.stringify(admitted);
530
+ }
531
+ catch {
532
+ sendJson(response, 431, "request_headers_too_large");
533
+ return;
534
+ }
535
+ if (Buffer.byteLength(wireRequest) > MAX_REQUEST_MESSAGE_BYTES) {
536
+ sendJson(response, 431, "request_headers_too_large");
537
+ return;
538
+ }
539
+ const timeout = setTimeout(() => {
540
+ const item = pending.get(id);
541
+ if (item === undefined)
542
+ return;
543
+ dropPending(id);
544
+ retireRequestId(id);
545
+ sendJson(item.response, 504, "dashboard_companion_timeout");
546
+ }, requestTimeoutMs);
547
+ timeout.unref();
548
+ pending.set(id, { response, method, timeout, version: 1 });
549
+ agent.websocket.send(wireRequest, (error) => {
550
+ if (!error)
551
+ return;
552
+ const item = pending.get(id);
553
+ if (item === undefined)
554
+ return;
555
+ clearTimeout(item.timeout);
556
+ dropPending(id);
557
+ retireRequestId(id);
558
+ sendJson(item.response, 503, "dashboard_companion_unavailable");
559
+ });
560
+ response.once("close", () => {
561
+ if (response.writableEnded)
562
+ return;
563
+ const item = pending.get(id);
564
+ if (item !== undefined)
565
+ clearTimeout(item.timeout);
566
+ dropPending(id);
567
+ if (item !== undefined)
568
+ retireRequestId(id);
569
+ });
570
+ });
571
+ const websocketServer = new WebSocketServer({
572
+ noServer: true,
573
+ maxPayload: MAX_AGENT_FRAME_BYTES,
574
+ perMessageDeflate: false,
575
+ handleProtocols(protocols) {
576
+ return protocols.has(DASHBOARD_GATEWAY_V2_SUBPROTOCOL)
577
+ ? DASHBOARD_GATEWAY_V2_SUBPROTOCOL
578
+ : false;
579
+ },
580
+ });
581
+ websocketServer.on("connection", (websocket) => {
582
+ websocket.on("error", () => undefined);
583
+ const version = websocket.protocol === DASHBOARD_GATEWAY_V2_SUBPROTOCOL ? 2 : 1;
584
+ websocket.on("message", (data, isBinary) => {
585
+ if (isBinary) {
586
+ websocket.close(1003, "text messages required");
587
+ return;
588
+ }
589
+ let message;
590
+ try {
591
+ const parsed = JSON.parse(data.toString());
592
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
593
+ throw new Error();
594
+ message = parsed;
595
+ }
596
+ catch {
597
+ websocket.close(1007, "invalid response");
598
+ return;
599
+ }
600
+ if (typeof message.id !== "string") {
601
+ websocket.close(1008, "invalid response");
602
+ return;
603
+ }
604
+ const item = pending.get(message.id);
605
+ if (item === undefined) {
606
+ if (retiredRequestIds.delete(message.id))
607
+ return;
608
+ websocket.close(1008, "unknown response id");
609
+ return;
610
+ }
611
+ if (item.version !== version) {
612
+ websocket.close(1008, "invalid response");
613
+ return;
614
+ }
615
+ if (version === 2) {
616
+ let parsed;
617
+ try {
618
+ parsed = parseGatewayV2Response(data.toString());
619
+ }
620
+ catch {
621
+ clearTimeout(item.timeout);
622
+ dropPending(message.id);
623
+ sendJson(item.response, 502, "invalid_companion_response");
624
+ websocket.close(1008, "invalid response");
625
+ return;
626
+ }
627
+ const body = Buffer.from(parsed.bodyBase64, "base64");
628
+ const headers = {
629
+ ...(parsed.headers.allow === undefined ? {} : { allow: parsed.headers.allow }),
630
+ ...(parsed.headers.cacheControl === undefined ? {} : { "cache-control": parsed.headers.cacheControl }),
631
+ ...(parsed.headers.contentLength === undefined ? {} : { "content-length": parsed.headers.contentLength }),
632
+ ...(parsed.headers.contentType === undefined ? {} : { "content-type": parsed.headers.contentType }),
633
+ ...(parsed.headers.etag === undefined ? {} : { etag: parsed.headers.etag }),
634
+ ...(parsed.headers.retryAfter === undefined ? {} : { "retry-after": parsed.headers.retryAfter }),
635
+ ...(parsed.headers.setCookies === undefined ? {} : { "set-cookie": [...parsed.headers.setCookies] }),
636
+ ...(parsed.headers.validatorSchemaId === undefined ? {} : { "x-clinkx-validator-schema-id": parsed.headers.validatorSchemaId }),
637
+ ...(parsed.headers.vary === undefined ? {} : { vary: parsed.headers.vary }),
638
+ };
639
+ if (parsed.headers.contentLength !== undefined
640
+ && item.method !== "HEAD"
641
+ && Number(parsed.headers.contentLength) !== body.byteLength) {
642
+ clearTimeout(item.timeout);
643
+ dropPending(parsed.id);
644
+ sendJson(item.response, 502, "invalid_companion_response");
645
+ websocket.close(1008, "invalid response");
646
+ return;
647
+ }
648
+ try {
649
+ item.response.writeHead(parsed.status, headers);
650
+ }
651
+ catch {
652
+ clearTimeout(item.timeout);
653
+ dropPending(parsed.id);
654
+ try {
655
+ if (!item.response.headersSent && !item.response.writableEnded) {
656
+ sendJson(item.response, 502, "invalid_companion_response");
657
+ }
658
+ else {
659
+ item.response.destroy();
660
+ }
661
+ }
662
+ catch {
663
+ item.response.destroy();
664
+ }
665
+ websocket.close(1008, "invalid response");
666
+ return;
667
+ }
668
+ clearTimeout(item.timeout);
669
+ dropPending(parsed.id);
670
+ item.response.end(item.method === "HEAD" ? undefined : body);
671
+ return;
672
+ }
673
+ if (message.v !== 1 || message.type !== "response") {
674
+ websocket.close(1008, "invalid response");
675
+ return;
676
+ }
677
+ const status = message.status;
678
+ const headers = allowedResponseHeaders(message.headers);
679
+ const body = decodeBase64(message.bodyBase64);
680
+ if (!Number.isInteger(status) || status < 100 || status > 599 || headers === undefined || body === undefined) {
681
+ clearTimeout(item.timeout);
682
+ dropPending(message.id);
683
+ sendJson(item.response, 502, "invalid_companion_response");
684
+ websocket.close(1008, "invalid response");
685
+ return;
686
+ }
687
+ clearTimeout(item.timeout);
688
+ dropPending(message.id);
689
+ item.response.writeHead(status, headers);
690
+ item.response.end(item.method === "HEAD" ? undefined : body);
691
+ });
692
+ });
693
+ server.on("upgrade", (request, socket, head) => {
694
+ if (request.url !== "/agent") {
695
+ rejectUpgrade(socket, 404, "Not Found");
696
+ return;
697
+ }
698
+ if (!tokenMatches(request.headers.authorization, options.token)) {
699
+ rejectUpgrade(socket, 401, "Unauthorized");
700
+ return;
701
+ }
702
+ const offeredProtocols = request.headersDistinct["sec-websocket-protocol"];
703
+ const offersV2 = offeredProtocols?.some((value) => value.split(",").some((protocol) => protocol.trim() === DASHBOARD_GATEWAY_V2_SUBPROTOCOL)) ?? false;
704
+ if (offeredProtocols !== undefined && !offersV2) {
705
+ rejectUpgrade(socket, 426, "Upgrade Required");
706
+ return;
707
+ }
708
+ if (agent !== undefined && agent.websocket.readyState === 1) {
709
+ rejectUpgrade(socket, 409, "Conflict");
710
+ return;
711
+ }
712
+ websocketServer.handleUpgrade(request, socket, head, (websocket) => {
713
+ agent = { websocket, version: websocket.protocol === DASHBOARD_GATEWAY_V2_SUBPROTOCOL ? 2 : 1 };
714
+ retiredRequestIds.clear();
715
+ websocket.once("close", () => {
716
+ if (agent?.websocket === websocket) {
717
+ agent = undefined;
718
+ failPending(503, "dashboard_companion_unavailable");
719
+ }
720
+ });
721
+ websocketServer.emit("connection", websocket, request);
722
+ });
723
+ });
724
+ return {
725
+ listen(port, host) {
726
+ return new Promise((resolve, reject) => {
727
+ const onError = (error) => reject(error);
728
+ server.once("error", onError);
729
+ server.listen(port, host, () => {
730
+ server.off("error", onError);
731
+ resolve();
732
+ });
733
+ });
734
+ },
735
+ address() {
736
+ return server.address();
737
+ },
738
+ close() {
739
+ return new Promise((resolve, reject) => {
740
+ agent?.websocket.terminate();
741
+ if (!server.listening) {
742
+ resolve();
743
+ return;
744
+ }
745
+ server.close((error) => {
746
+ if (error)
747
+ reject(error);
748
+ else
749
+ resolve();
750
+ });
751
+ });
752
+ },
753
+ };
754
+ }
755
+ //# sourceMappingURL=index.js.map