clinkx 0.2.3 → 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 (574) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +10 -0
  3. package/README.md +113 -18
  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/conf/prompts/json-codereviewer.txt +1 -0
  317. package/conf/prompts/json.txt +1 -0
  318. package/dist/activity-journal.d.ts +42 -0
  319. package/dist/activity-journal.js +381 -0
  320. package/dist/activity-journal.js.map +1 -0
  321. package/dist/allowed-roots.d.ts +53 -0
  322. package/dist/allowed-roots.js +216 -0
  323. package/dist/allowed-roots.js.map +1 -0
  324. package/dist/codex/activity-session-log.d.ts +14 -0
  325. package/dist/codex/activity-session-log.js +206 -0
  326. package/dist/codex/activity-session-log.js.map +1 -0
  327. package/dist/codex/agent-tools.d.ts +23 -0
  328. package/dist/codex/agent-tools.js +1270 -0
  329. package/dist/codex/agent-tools.js.map +1 -0
  330. package/dist/codex/app-server-client.d.ts +76 -0
  331. package/dist/codex/app-server-client.js +582 -0
  332. package/dist/codex/app-server-client.js.map +1 -0
  333. package/dist/codex/app-server-registry.d.ts +389 -0
  334. package/dist/codex/app-server-registry.js +1407 -0
  335. package/dist/codex/app-server-registry.js.map +1 -0
  336. package/dist/codex/client-types.d.ts +109 -0
  337. package/dist/codex/client-types.js +2 -0
  338. package/dist/codex/client-types.js.map +1 -0
  339. package/dist/codex/protocol.d.ts +5375 -0
  340. package/dist/codex/protocol.js +614 -0
  341. package/dist/codex/protocol.js.map +1 -0
  342. package/dist/codex/session.d.ts +263 -0
  343. package/dist/codex/session.js +466 -0
  344. package/dist/codex/session.js.map +1 -0
  345. package/dist/config.d.ts +185 -19
  346. package/dist/config.js +82 -16
  347. package/dist/config.js.map +1 -1
  348. package/dist/context-builder/anchors.d.ts +12 -0
  349. package/dist/context-builder/anchors.js +22 -0
  350. package/dist/context-builder/anchors.js.map +1 -0
  351. package/dist/context-builder/bundle.d.ts +109 -0
  352. package/dist/context-builder/bundle.js +1498 -0
  353. package/dist/context-builder/bundle.js.map +1 -0
  354. package/dist/context-builder/codemap.d.ts +22 -0
  355. package/dist/context-builder/codemap.js +675 -0
  356. package/dist/context-builder/codemap.js.map +1 -0
  357. package/dist/context-builder/config.d.ts +61 -0
  358. package/dist/context-builder/config.js +216 -0
  359. package/dist/context-builder/config.js.map +1 -0
  360. package/dist/context-builder/context-run-catalog.d.ts +17 -0
  361. package/dist/context-builder/context-run-catalog.js +99 -0
  362. package/dist/context-builder/context-run-catalog.js.map +1 -0
  363. package/dist/context-builder/delegate-packet.d.ts +219 -0
  364. package/dist/context-builder/delegate-packet.js +1190 -0
  365. package/dist/context-builder/delegate-packet.js.map +1 -0
  366. package/dist/context-builder/delegate-reconstruction.d.ts +13 -0
  367. package/dist/context-builder/delegate-reconstruction.js +220 -0
  368. package/dist/context-builder/delegate-reconstruction.js.map +1 -0
  369. package/dist/context-builder/delegate-validation.d.ts +27 -0
  370. package/dist/context-builder/delegate-validation.js +479 -0
  371. package/dist/context-builder/delegate-validation.js.map +1 -0
  372. package/dist/context-builder/delegate.d.ts +26 -0
  373. package/dist/context-builder/delegate.js +134 -0
  374. package/dist/context-builder/delegate.js.map +1 -0
  375. package/dist/context-builder/diagnostics.d.ts +36 -0
  376. package/dist/context-builder/diagnostics.js +107 -0
  377. package/dist/context-builder/diagnostics.js.map +1 -0
  378. package/dist/context-builder/discovery.d.ts +146 -0
  379. package/dist/context-builder/discovery.js +2129 -0
  380. package/dist/context-builder/discovery.js.map +1 -0
  381. package/dist/context-builder/globs.d.ts +14 -0
  382. package/dist/context-builder/globs.js +175 -0
  383. package/dist/context-builder/globs.js.map +1 -0
  384. package/dist/context-builder/handler.d.ts +41 -0
  385. package/dist/context-builder/handler.js +2590 -0
  386. package/dist/context-builder/handler.js.map +1 -0
  387. package/dist/context-builder/lifecycle-contract.d.ts +424 -0
  388. package/dist/context-builder/lifecycle-contract.js +523 -0
  389. package/dist/context-builder/lifecycle-contract.js.map +1 -0
  390. package/dist/context-builder/lifecycle-journal.d.ts +62 -0
  391. package/dist/context-builder/lifecycle-journal.js +88 -0
  392. package/dist/context-builder/lifecycle-journal.js.map +1 -0
  393. package/dist/context-builder/lifecycle-observer.d.ts +102 -0
  394. package/dist/context-builder/lifecycle-observer.js +258 -0
  395. package/dist/context-builder/lifecycle-observer.js.map +1 -0
  396. package/dist/context-builder/lifecycle-reconcile.d.ts +32 -0
  397. package/dist/context-builder/lifecycle-reconcile.js +191 -0
  398. package/dist/context-builder/lifecycle-reconcile.js.map +1 -0
  399. package/dist/context-builder/lifecycle-recovery.d.ts +2 -0
  400. package/dist/context-builder/lifecycle-recovery.js +14 -0
  401. package/dist/context-builder/lifecycle-recovery.js.map +1 -0
  402. package/dist/context-builder/path-signals.d.ts +7 -0
  403. package/dist/context-builder/path-signals.js +70 -0
  404. package/dist/context-builder/path-signals.js.map +1 -0
  405. package/dist/context-builder/paths.d.ts +30 -0
  406. package/dist/context-builder/paths.js +153 -0
  407. package/dist/context-builder/paths.js.map +1 -0
  408. package/dist/context-builder/progress.d.ts +17 -0
  409. package/dist/context-builder/progress.js +93 -0
  410. package/dist/context-builder/progress.js.map +1 -0
  411. package/dist/context-builder/receipt.d.ts +91 -0
  412. package/dist/context-builder/receipt.js +180 -0
  413. package/dist/context-builder/receipt.js.map +1 -0
  414. package/dist/context-builder/refine-handler.d.ts +14 -0
  415. package/dist/context-builder/refine-handler.js +790 -0
  416. package/dist/context-builder/refine-handler.js.map +1 -0
  417. package/dist/context-builder/review-coverage.d.ts +84 -0
  418. package/dist/context-builder/review-coverage.js +437 -0
  419. package/dist/context-builder/review-coverage.js.map +1 -0
  420. package/dist/context-builder/run-id.d.ts +7 -0
  421. package/dist/context-builder/run-id.js +31 -0
  422. package/dist/context-builder/run-id.js.map +1 -0
  423. package/dist/context-builder/schema.d.ts +669 -0
  424. package/dist/context-builder/schema.js +399 -0
  425. package/dist/context-builder/schema.js.map +1 -0
  426. package/dist/context-builder/secrets.d.ts +41 -0
  427. package/dist/context-builder/secrets.js +1651 -0
  428. package/dist/context-builder/secrets.js.map +1 -0
  429. package/dist/context-builder/selection.d.ts +56 -0
  430. package/dist/context-builder/selection.js +1111 -0
  431. package/dist/context-builder/selection.js.map +1 -0
  432. package/dist/context-builder/session-log-identity.d.ts +1 -0
  433. package/dist/context-builder/session-log-identity.js +66 -0
  434. package/dist/context-builder/session-log-identity.js.map +1 -0
  435. package/dist/context-builder/slice-range-math.d.ts +16 -0
  436. package/dist/context-builder/slice-range-math.js +137 -0
  437. package/dist/context-builder/slice-range-math.js.map +1 -0
  438. package/dist/context-builder/status.d.ts +66 -0
  439. package/dist/context-builder/status.js +160 -0
  440. package/dist/context-builder/status.js.map +1 -0
  441. package/dist/context-builder/storage.d.ts +118 -0
  442. package/dist/context-builder/storage.js +1003 -0
  443. package/dist/context-builder/storage.js.map +1 -0
  444. package/dist/context-builder/token-estimate.d.ts +19 -0
  445. package/dist/context-builder/token-estimate.js +90 -0
  446. package/dist/context-builder/token-estimate.js.map +1 -0
  447. package/dist/context-builder/versions.d.ts +29 -0
  448. package/dist/context-builder/versions.js +30 -0
  449. package/dist/context-builder/versions.js.map +1 -0
  450. package/dist/context-builder/workflow-runner.d.ts +69 -0
  451. package/dist/context-builder/workflow-runner.js +1051 -0
  452. package/dist/context-builder/workflow-runner.js.map +1 -0
  453. package/dist/context-builder/write-watchdog.d.ts +14 -0
  454. package/dist/context-builder/write-watchdog.js +38 -0
  455. package/dist/context-builder/write-watchdog.js.map +1 -0
  456. package/dist/dashboard-adapter-catalog.d.ts +9 -0
  457. package/dist/dashboard-adapter-catalog.js +46 -0
  458. package/dist/dashboard-adapter-catalog.js.map +1 -0
  459. package/dist/dashboard-cli.d.ts +79 -0
  460. package/dist/dashboard-cli.js +585 -0
  461. package/dist/dashboard-cli.js.map +1 -0
  462. package/dist/dashboard-companion/client.d.ts +36 -0
  463. package/dist/dashboard-companion/client.js +210 -0
  464. package/dist/dashboard-companion/client.js.map +1 -0
  465. package/dist/dashboard-companion/config.d.ts +8 -0
  466. package/dist/dashboard-companion/config.js +52 -0
  467. package/dist/dashboard-companion/config.js.map +1 -0
  468. package/dist/dashboard-companion/http-proxy.d.ts +10 -0
  469. package/dist/dashboard-companion/http-proxy.js +234 -0
  470. package/dist/dashboard-companion/http-proxy.js.map +1 -0
  471. package/dist/dashboard-companion/protocol.d.ts +80 -0
  472. package/dist/dashboard-companion/protocol.js +455 -0
  473. package/dist/dashboard-companion/protocol.js.map +1 -0
  474. package/dist/dashboard-companion/standalone-assets.d.ts +12 -0
  475. package/dist/dashboard-companion/standalone-assets.js +72 -0
  476. package/dist/dashboard-companion/standalone-assets.js.map +1 -0
  477. package/dist/dashboard-companion/standalone-entry.d.ts +1 -0
  478. package/dist/dashboard-companion/standalone-entry.js +17 -0
  479. package/dist/dashboard-companion/standalone-entry.js.map +1 -0
  480. package/dist/dashboard-gateway/config.d.ts +9 -0
  481. package/dist/dashboard-gateway/config.js +44 -0
  482. package/dist/dashboard-gateway/config.js.map +1 -0
  483. package/dist/dashboard-gateway/index.d.ts +11 -0
  484. package/dist/dashboard-gateway/index.js +755 -0
  485. package/dist/dashboard-gateway/index.js.map +1 -0
  486. package/dist/dashboard-gateway/main.d.ts +1 -0
  487. package/dist/dashboard-gateway/main.js +25 -0
  488. package/dist/dashboard-gateway/main.js.map +1 -0
  489. package/dist/dashboard-pairing-token.d.ts +1 -0
  490. package/dist/dashboard-pairing-token.js +5 -0
  491. package/dist/dashboard-pairing-token.js.map +1 -0
  492. package/dist/elaris/client.d.ts +73 -0
  493. package/dist/elaris/client.js +825 -0
  494. package/dist/elaris/client.js.map +1 -0
  495. package/dist/elaris/config.d.ts +18 -0
  496. package/dist/elaris/config.js +75 -0
  497. package/dist/elaris/config.js.map +1 -0
  498. package/dist/elaris/errors.d.ts +41 -0
  499. package/dist/elaris/errors.js +205 -0
  500. package/dist/elaris/errors.js.map +1 -0
  501. package/dist/elaris/github-repo.d.ts +18 -0
  502. package/dist/elaris/github-repo.js +89 -0
  503. package/dist/elaris/github-repo.js.map +1 -0
  504. package/dist/elaris/index.d.ts +10 -0
  505. package/dist/elaris/index.js +11 -0
  506. package/dist/elaris/index.js.map +1 -0
  507. package/dist/elaris/redact.d.ts +89 -0
  508. package/dist/elaris/redact.js +423 -0
  509. package/dist/elaris/redact.js.map +1 -0
  510. package/dist/elaris/run-id.d.ts +5 -0
  511. package/dist/elaris/run-id.js +20 -0
  512. package/dist/elaris/run-id.js.map +1 -0
  513. package/dist/elaris/status.d.ts +45 -0
  514. package/dist/elaris/status.js +122 -0
  515. package/dist/elaris/status.js.map +1 -0
  516. package/dist/elaris/tool-schemas.d.ts +314 -0
  517. package/dist/elaris/tool-schemas.js +208 -0
  518. package/dist/elaris/tool-schemas.js.map +1 -0
  519. package/dist/elaris/tools.d.ts +73 -0
  520. package/dist/elaris/tools.js +1065 -0
  521. package/dist/elaris/tools.js.map +1 -0
  522. package/dist/elaris/types.d.ts +1541 -0
  523. package/dist/elaris/types.js +252 -0
  524. package/dist/elaris/types.js.map +1 -0
  525. package/dist/errors.d.ts +16 -0
  526. package/dist/errors.js +19 -0
  527. package/dist/errors.js.map +1 -1
  528. package/dist/handler.d.ts +4 -0
  529. package/dist/handler.js +10 -1
  530. package/dist/handler.js.map +1 -1
  531. package/dist/index.d.ts +2 -1
  532. package/dist/index.js +13 -3
  533. package/dist/index.js.map +1 -1
  534. package/dist/local-clink-backend.d.ts +3 -0
  535. package/dist/local-clink-backend.js +4 -0
  536. package/dist/local-clink-backend.js.map +1 -1
  537. package/dist/package-info.d.ts +2 -0
  538. package/dist/package-info.js +18 -0
  539. package/dist/package-info.js.map +1 -0
  540. package/dist/parsers/codex-jsonl.js +48 -3
  541. package/dist/parsers/codex-jsonl.js.map +1 -1
  542. package/dist/parsers/extract.d.ts +10 -1
  543. package/dist/parsers/extract.js +11 -3
  544. package/dist/parsers/extract.js.map +1 -1
  545. package/dist/paths.d.ts +8 -0
  546. package/dist/paths.js +31 -43
  547. package/dist/paths.js.map +1 -1
  548. package/dist/pipeline.d.ts +51 -3
  549. package/dist/pipeline.js +264 -47
  550. package/dist/pipeline.js.map +1 -1
  551. package/dist/run-dir.d.ts +24 -0
  552. package/dist/run-dir.js +201 -2
  553. package/dist/run-dir.js.map +1 -1
  554. package/dist/runner.d.ts +13 -0
  555. package/dist/runner.js +184 -15
  556. package/dist/runner.js.map +1 -1
  557. package/dist/safety.d.ts +4 -4
  558. package/dist/safety.js +4 -4
  559. package/dist/schema.d.ts +7 -7
  560. package/dist/server.d.ts +2 -0
  561. package/dist/server.js +396 -24
  562. package/dist/server.js.map +1 -1
  563. package/dist/session-log-stream.d.ts +18 -0
  564. package/dist/session-log-stream.js +319 -0
  565. package/dist/session-log-stream.js.map +1 -0
  566. package/package.json +47 -5
  567. package/conf/adapters/gemini.json +0 -44
  568. package/conf/adapters/hapi/gemini.json +0 -47
  569. package/dist/artifacts.d.ts +0 -9
  570. package/dist/artifacts.js +0 -24
  571. package/dist/artifacts.js.map +0 -1
  572. package/dist/parsers/gemini-json.d.ts +0 -2
  573. package/dist/parsers/gemini-json.js +0 -72
  574. package/dist/parsers/gemini-json.js.map +0 -1
@@ -0,0 +1,1065 @@
1
+ import { zodToJsonSchema } from "zod-to-json-schema";
2
+ import { CancellationError, ExecutionError, InvalidParamsError } from "../errors.js";
3
+ import { ElarisClient, isElarisHttpError, waitForNextElarisPoll } from "./client.js";
4
+ import { loadElarisConfig, resolveElarisApiKey, validateElarisBaseUrl } from "./config.js";
5
+ import { buildElarisFailureBody, classifyElarisHttpError, elarisResult, errorEnvelopeDetail, errorEnvelopeRequestId, errorEnvelopeRunId, inferFollowUpConflictReason, } from "./errors.js";
6
+ import { generateElarisRunId } from "./run-id.js";
7
+ import { mapCreateResponseToSnapshot, mapStatusResponseToSnapshot, mergeCreateProvenance, isTerminalElarisStatus, normalizeElarisStatus, rawStatusIsError, snapshotIsError, withKnownKeepAlive, } from "./status.js";
8
+ import { ElarisRunInputSchema, parseElarisManageInput, parseElarisRunInput, } from "./tool-schemas.js";
9
+ export const ELARIS_TOOL_NAMES = new Set([
10
+ "clink_elaris_run",
11
+ "clink_elaris_manage",
12
+ ]);
13
+ export function getElarisToolDefinitions() {
14
+ const runSchema = zodToJsonSchema(ElarisRunInputSchema, {
15
+ target: "jsonSchema7",
16
+ $refStrategy: "none",
17
+ });
18
+ const manageSchema = {
19
+ $schema: "http://json-schema.org/draft-07/schema#",
20
+ type: "object",
21
+ additionalProperties: false,
22
+ required: ["op"],
23
+ properties: {
24
+ op: {
25
+ type: "string",
26
+ enum: [
27
+ "poll",
28
+ "wait",
29
+ "result",
30
+ "content",
31
+ "logs",
32
+ "artifacts",
33
+ "artifact_raw",
34
+ "message",
35
+ "cancel",
36
+ "cleanup",
37
+ "health",
38
+ ],
39
+ description: "Operation for an Elaris remote agent-session. Deferred remote analogs return unsupported_v1 explicitly.",
40
+ },
41
+ session_id: { type: "string", minLength: 1 },
42
+ status_url: { type: "string", minLength: 1 },
43
+ cursor: { type: "string" },
44
+ limit: { type: "integer", minimum: 1, maximum: 200 },
45
+ fetch_all: { type: "boolean" },
46
+ file_path: { type: "string", minLength: 1 },
47
+ range: {
48
+ type: "object",
49
+ additionalProperties: false,
50
+ required: ["start"],
51
+ properties: {
52
+ start: { type: "integer", minimum: 0 },
53
+ end: { type: "integer", minimum: 0 },
54
+ },
55
+ },
56
+ prompt: { type: "string", minLength: 1 },
57
+ model_id: { type: "string", minLength: 1 },
58
+ permission_mode: {
59
+ type: "string",
60
+ enum: ["plan", "acceptEdits", "auto", "fullAccess"],
61
+ },
62
+ effort_level: {
63
+ type: "string",
64
+ enum: ["low", "medium", "high", "xhigh", "max"],
65
+ },
66
+ metadata: { type: "object", additionalProperties: true },
67
+ idempotency_key: {
68
+ type: "string",
69
+ minLength: 1,
70
+ maxLength: 128,
71
+ pattern: "^[A-Za-z0-9_.:-]+$",
72
+ },
73
+ wait: { type: "boolean" },
74
+ timeout_seconds: { type: "number", exclusiveMinimum: 0 },
75
+ poll_interval_ms: { type: "integer", minimum: 1 },
76
+ max_response_chars: { type: "integer", minimum: 1 },
77
+ },
78
+ };
79
+ return [
80
+ {
81
+ name: "clink_elaris_run",
82
+ description: "Start an Elaris remote agent-session over HTTP. This scaffold freezes the advertised v1 input contract; runtime execution lands in Phase 3.",
83
+ inputSchema: runSchema,
84
+ annotations: {
85
+ readOnlyHint: false,
86
+ },
87
+ },
88
+ {
89
+ name: "clink_elaris_manage",
90
+ description: "Inspect or drive an Elaris remote agent-session: poll, wait, result/content, logs, artifacts, follow-up message, cancel, cleanup, and health.",
91
+ inputSchema: manageSchema,
92
+ annotations: {
93
+ readOnlyHint: false,
94
+ destructiveHint: true,
95
+ },
96
+ },
97
+ ];
98
+ }
99
+ export async function handleElarisToolCall(name, args, signal, options = {}) {
100
+ if (name === "clink_elaris_run") {
101
+ return handleElarisRun(args, signal, options);
102
+ }
103
+ if (name === "clink_elaris_manage") {
104
+ return handleElarisManage(args, signal, options);
105
+ }
106
+ return elarisResult({
107
+ ok: false,
108
+ error_kind: "unsupported_v1",
109
+ operation: name,
110
+ detail: "Unknown Elaris tool.",
111
+ }, { isError: true });
112
+ }
113
+ async function handleElarisRun(args, signal, options) {
114
+ throwIfCancelled(signal);
115
+ const input = parseElarisRunInput(args);
116
+ const config = options.config ?? loadElarisConfig();
117
+ const modelId = input.model_id ?? config.DEFAULT_MODEL_ID ?? process.env.CLINKX_ELARIS_DEFAULT_MODEL_ID;
118
+ if (modelId === undefined || modelId.trim().length === 0) {
119
+ throw new InvalidParamsError("model_id is required. Provide model_id or set CLINKX_ELARIS_DEFAULT_MODEL_ID.");
120
+ }
121
+ const runId = input.run_id ?? (options.generateRunId ?? generateElarisRunId)();
122
+ const client = options.client ?? createDefaultClient(config);
123
+ const nowMs = options.nowMs ?? Date.now;
124
+ const waitForNextPoll = options.waitForNextPoll ?? waitForNextElarisPoll;
125
+ const maxResponseChars = input.max_response_chars ?? 20000;
126
+ const timeoutSeconds = input.timeout_seconds
127
+ ?? (input.wait ? config.WAIT_TIMEOUT_SECONDS : config.REQUEST_TIMEOUT_SECONDS)
128
+ ?? 60;
129
+ const deadlineMs = nowMs() + Math.max(1, timeoutSeconds) * 1000;
130
+ const request = buildCreateRequest(input, modelId.trim(), runId);
131
+ try {
132
+ return await executeElarisRun({
133
+ client,
134
+ input,
135
+ request,
136
+ runId,
137
+ signal,
138
+ deadlineMs,
139
+ waitForNextPoll,
140
+ nowMs,
141
+ maxResponseChars,
142
+ });
143
+ }
144
+ catch (err) {
145
+ // MCP cancellation must yield no response: an external-signal abort landing in
146
+ // the full request RTT of a wait/duplicate status fetch can surface as a raw
147
+ // AbortError (not CancellationError). Surface it as CancellationError before any
148
+ // structured-failure handling so it can never be masked as an isError result.
149
+ rethrowIfCancelled(err, signal);
150
+ if (err instanceof ElarisStructuredFailure) {
151
+ return elarisResult(err.body, { isError: true, maxChars: maxResponseChars });
152
+ }
153
+ throw err;
154
+ }
155
+ }
156
+ async function handleElarisManage(args, signal, options) {
157
+ throwIfCancelled(signal);
158
+ const input = parseElarisManageInput(args);
159
+ const maxResponseChars = input.max_response_chars ?? 20000;
160
+ if (isUnsupportedManageOp(input.op)) {
161
+ return unsupportedManageResult(input.op, maxResponseChars);
162
+ }
163
+ if (input.op === "health") {
164
+ return handleElarisHealth(signal, options, maxResponseChars);
165
+ }
166
+ const config = options.config ?? loadElarisConfig();
167
+ const client = options.client ?? createDefaultClient(config);
168
+ const nowMs = options.nowMs ?? Date.now;
169
+ const waitForNextPoll = options.waitForNextPoll ?? waitForNextElarisPoll;
170
+ const timeoutSeconds = input.timeout_seconds
171
+ ?? (input.op === "wait" || input.wait ? config.WAIT_TIMEOUT_SECONDS : config.REQUEST_TIMEOUT_SECONDS)
172
+ ?? 60;
173
+ const deadlineMs = nowMs() + Math.max(1, timeoutSeconds) * 1000;
174
+ try {
175
+ switch (input.op) {
176
+ case "poll":
177
+ return await handleManagePoll({ client, input, signal, maxResponseChars, operation: "poll" });
178
+ case "wait":
179
+ return await handleManageWait({ client, input, signal, maxResponseChars, deadlineMs, waitForNextPoll, nowMs });
180
+ case "result":
181
+ return await handleManageResult({ client, input, signal, maxResponseChars });
182
+ case "content":
183
+ return await handleReadOperation("content", () => client.getResultContent(input.session_id, { signal }), maxResponseChars);
184
+ case "logs":
185
+ return await handleReadOperation("logs", () => (input.fetch_all
186
+ ? client.getAllLogs(input.session_id, { signal, limit: input.limit })
187
+ : client.getLogsPage(input.session_id, { signal, cursor: input.cursor, limit: input.limit })), maxResponseChars);
188
+ case "artifacts":
189
+ return await handleReadOperation("artifacts", () => (input.fetch_all
190
+ ? client.getAllArtifacts(input.session_id, { signal, limit: input.limit })
191
+ : client.getArtifactsPage(input.session_id, { signal, cursor: input.cursor, limit: input.limit })), maxResponseChars);
192
+ case "artifact_raw":
193
+ return await handleReadOperation("artifact_raw", () => client.getArtifactRaw(input.session_id, input.file_path, { signal, range: input.range }), maxResponseChars);
194
+ case "message":
195
+ return await handleManageMessage({ client, input, signal, maxResponseChars, deadlineMs, waitForNextPoll, nowMs });
196
+ case "cancel":
197
+ return await handleStatusMutation("cancel", () => client.cancel(input.session_id, { signal }), input.session_id, maxResponseChars);
198
+ case "cleanup":
199
+ return await handleStatusMutation("cleanup", () => client.cleanup(input.session_id, { signal }), input.session_id, maxResponseChars);
200
+ }
201
+ }
202
+ catch (err) {
203
+ // MCP cancellation must yield no response: surface CancellationError before
204
+ // any transport classification so an external abort can never be masked as a
205
+ // backend_unavailable/isError result.
206
+ rethrowIfCancelled(err, signal);
207
+ if (err instanceof ElarisStructuredFailure) {
208
+ return elarisResult(err.body, {
209
+ isError: manageFailureIsError(input.op, err.body.error_kind),
210
+ maxChars: maxResponseChars,
211
+ });
212
+ }
213
+ const remote = remoteFailureFromUnknown(err);
214
+ if (remote !== undefined) {
215
+ const errorKind = classifyManageRemote(input.op, remote);
216
+ return elarisResult(buildFailureForRemote(errorKind, remote, input.op, undefined), {
217
+ isError: manageFailureIsError(input.op, errorKind),
218
+ maxChars: maxResponseChars,
219
+ });
220
+ }
221
+ throw err;
222
+ }
223
+ }
224
+ async function executeElarisRun(args) {
225
+ const { client, input, request, runId, signal, deadlineMs, waitForNextPoll, nowMs, maxResponseChars } = args;
226
+ const createResult = await createWithBoundedRetry({
227
+ client,
228
+ request,
229
+ input,
230
+ signal,
231
+ deadlineMs,
232
+ waitForNextPoll,
233
+ nowMs,
234
+ });
235
+ if (createResult.kind === "tool_result") {
236
+ return elarisResult(createResult.body, {
237
+ isError: createResult.isError,
238
+ maxChars: maxResponseChars,
239
+ });
240
+ }
241
+ if (createResult.kind === "duplicate") {
242
+ return recoverDuplicate({
243
+ client,
244
+ input,
245
+ signal,
246
+ runId,
247
+ locator: createResult.locator,
248
+ maxResponseChars,
249
+ deadlineMs,
250
+ waitForNextPoll,
251
+ nowMs,
252
+ });
253
+ }
254
+ const createSnapshot = withKnownKeepAlive(mapCreateResponseToSnapshot(createResult.response), input.keep_alive);
255
+ if (!input.wait) {
256
+ return elarisResult({
257
+ ok: true,
258
+ operation: "clink_elaris_run",
259
+ ...createSnapshot,
260
+ wait_result: "not_requested",
261
+ next_action: nextAction(createSnapshot),
262
+ }, {
263
+ isError: snapshotIsError(createSnapshot),
264
+ maxChars: maxResponseChars,
265
+ });
266
+ }
267
+ const waited = await waitForTerminal({
268
+ client,
269
+ createSnapshot,
270
+ signal,
271
+ deadlineMs,
272
+ pollIntervalMs: input.poll_interval_ms,
273
+ waitForNextPoll,
274
+ nowMs,
275
+ runId,
276
+ });
277
+ return elarisResult({
278
+ ok: true,
279
+ operation: "clink_elaris_run",
280
+ ...waited.snapshot,
281
+ wait_result: waited.waitResult,
282
+ next_action: waited.waitResult === "timed_out" ? nextAction(waited.snapshot) : undefined,
283
+ }, {
284
+ isError: snapshotIsError(waited.snapshot),
285
+ maxChars: maxResponseChars,
286
+ });
287
+ }
288
+ async function handleManagePoll(input) {
289
+ const status = await fetchManageStatus(input.client, input.input, input.signal, input.operation);
290
+ const snapshot = echoStatusLocator(mapStatusResponseToSnapshot(status), input.input);
291
+ return elarisResult({
292
+ ok: true,
293
+ operation: input.operation,
294
+ ...snapshot,
295
+ next_action: nextAction(snapshot),
296
+ }, {
297
+ isError: snapshotIsError(snapshot),
298
+ maxChars: input.maxResponseChars,
299
+ });
300
+ }
301
+ async function handleManageWait(input) {
302
+ const first = await fetchManageStatus(input.client, input.input, input.signal, "wait");
303
+ const firstSnapshot = echoStatusLocator(mapStatusResponseToSnapshot(first), input.input);
304
+ const waited = await waitForTerminal({
305
+ client: input.client,
306
+ createSnapshot: firstSnapshot,
307
+ signal: input.signal,
308
+ deadlineMs: input.deadlineMs,
309
+ pollIntervalMs: input.input.poll_interval_ms,
310
+ waitForNextPoll: input.waitForNextPoll,
311
+ nowMs: input.nowMs,
312
+ runId: firstSnapshot.run_id,
313
+ });
314
+ const snapshot = waited.snapshot;
315
+ return elarisResult({
316
+ ok: true,
317
+ operation: "wait",
318
+ ...snapshot,
319
+ wait_result: waited.waitResult,
320
+ next_action: waited.waitResult === "timed_out" ? nextAction(snapshot) : undefined,
321
+ }, {
322
+ isError: snapshotIsError(snapshot),
323
+ maxChars: input.maxResponseChars,
324
+ });
325
+ }
326
+ async function handleManageResult(input) {
327
+ try {
328
+ const result = await input.client.getResult(input.input.session_id, { signal: input.signal });
329
+ const redactionCount = readRedactionCount(objectOrValue(result));
330
+ return elarisResult({
331
+ ok: true,
332
+ operation: "result",
333
+ ready: true,
334
+ ...result,
335
+ content_url: result.content_url,
336
+ redaction_count: redactionCount,
337
+ redacted: redactionCount > 0,
338
+ }, { maxChars: input.maxResponseChars });
339
+ }
340
+ catch (err) {
341
+ const remote = remoteFailureFromUnknown(err);
342
+ if (remote !== undefined) {
343
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
344
+ if (errorKind === "not_terminal") {
345
+ return elarisResult({
346
+ ok: true,
347
+ operation: "result",
348
+ ready: false,
349
+ next_action: pollAction(input.input.session_id),
350
+ }, { maxChars: input.maxResponseChars });
351
+ }
352
+ throw new ElarisStructuredFailure(buildFailureForRemote(errorKind, remote, "result", undefined));
353
+ }
354
+ throw err;
355
+ }
356
+ }
357
+ async function handleReadOperation(operation, read, maxResponseChars) {
358
+ const body = objectOrValue(await read());
359
+ const redactionCount = readRedactionCount(body);
360
+ return elarisResult({
361
+ ok: true,
362
+ operation,
363
+ ...body,
364
+ redaction_count: redactionCount,
365
+ redacted: redactionCount > 0,
366
+ }, { maxChars: maxResponseChars });
367
+ }
368
+ // The client attaches a first-class `redaction_count` on read responses only
369
+ // when at least one redaction fired (omitted at zero). Normalize it to a
370
+ // non-negative number so the read-path envelope always carries a definite
371
+ // redaction_count plus the derived `redacted` boolean.
372
+ function readRedactionCount(body) {
373
+ const value = body["redaction_count"];
374
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
375
+ }
376
+ async function handleManageMessage(input) {
377
+ const idempotencyKey = input.input.idempotency_key ?? generateMessageIdempotencyKey();
378
+ const request = buildMessageRequest(input.input, idempotencyKey);
379
+ const message = await postMessageWithBoundedRetry({
380
+ client: input.client,
381
+ sessionId: input.input.session_id,
382
+ request,
383
+ signal: input.signal,
384
+ deadlineMs: input.deadlineMs,
385
+ waitForNextPoll: input.waitForNextPoll,
386
+ pollIntervalMs: input.input.poll_interval_ms,
387
+ });
388
+ const observed = messageFields(message);
389
+ if (input.input.wait) {
390
+ // Short-circuit: if the initial message response is already terminal (e.g. an
391
+ // idempotent replay of a completed turn), settle immediately instead of
392
+ // sleeping/polling — which would otherwise report a spurious timed_out.
393
+ if (isTerminalElarisStatus(observed.status)) {
394
+ return elarisResult({
395
+ ok: true,
396
+ operation: "message",
397
+ turn_id: observed.turn_id,
398
+ idempotency_key: idempotencyKey,
399
+ idempotent_replay: observed.idempotent_replay,
400
+ ...messageSnapshot(message),
401
+ wait_result: "settled",
402
+ }, {
403
+ isError: rawStatusIsError(observed.status),
404
+ maxChars: input.maxResponseChars,
405
+ });
406
+ }
407
+ const waited = await waitForMessageTerminal({
408
+ client: input.client,
409
+ message,
410
+ signal: input.signal,
411
+ deadlineMs: input.deadlineMs,
412
+ pollIntervalMs: input.input.poll_interval_ms,
413
+ waitForNextPoll: input.waitForNextPoll,
414
+ nowMs: input.nowMs,
415
+ });
416
+ const waitedBody = "snapshot" in waited ? waited.snapshot : messageSnapshot(waited.message);
417
+ const waitedIsError = "snapshot" in waited ? snapshotIsError(waited.snapshot) : false;
418
+ const waitedNextAction = "snapshot" in waited
419
+ ? (waited.waitResult === "timed_out" ? nextAction(waited.snapshot) : undefined)
420
+ : pollAction(observed.session_id, observed.status_url);
421
+ return elarisResult({
422
+ ok: true,
423
+ operation: "message",
424
+ turn_id: observed.turn_id,
425
+ idempotency_key: idempotencyKey,
426
+ idempotent_replay: observed.idempotent_replay,
427
+ ...waitedBody,
428
+ wait_result: waited.waitResult,
429
+ next_action: waitedNextAction,
430
+ }, {
431
+ isError: waitedIsError,
432
+ maxChars: input.maxResponseChars,
433
+ });
434
+ }
435
+ return elarisResult({
436
+ ok: true,
437
+ operation: "message",
438
+ turn_id: observed.turn_id,
439
+ idempotency_key: idempotencyKey,
440
+ idempotent_replay: observed.idempotent_replay,
441
+ ...messageSnapshot(message),
442
+ wait_result: "not_requested",
443
+ next_action: pollAction(observed.session_id, observed.status_url),
444
+ }, { maxChars: input.maxResponseChars });
445
+ }
446
+ async function handleStatusMutation(operation, mutate, sessionId, maxResponseChars) {
447
+ try {
448
+ const response = await mutate();
449
+ const snapshot = {
450
+ ...mapStatusResponseToSnapshot(response),
451
+ session_id: sessionId,
452
+ };
453
+ return elarisResult({
454
+ ok: true,
455
+ operation,
456
+ ...snapshot,
457
+ next_action: operation === "cancel" ? pollAction(sessionId) : nextAction(snapshot),
458
+ }, {
459
+ isError: snapshotIsError(snapshot),
460
+ maxChars: maxResponseChars,
461
+ });
462
+ }
463
+ catch (err) {
464
+ const remote = remoteFailureFromUnknown(err);
465
+ if (remote !== undefined) {
466
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
467
+ if (operation === "cleanup" && errorKind === "not_terminal") {
468
+ return elarisResult({
469
+ ok: true,
470
+ operation,
471
+ ready: false,
472
+ next_action: pollAction(sessionId),
473
+ }, { maxChars: maxResponseChars });
474
+ }
475
+ throw new ElarisStructuredFailure(buildFailureForRemote(errorKind, remote, operation, undefined));
476
+ }
477
+ throw err;
478
+ }
479
+ }
480
+ async function handleElarisHealth(signal, options, maxResponseChars) {
481
+ throwIfCancelled(signal);
482
+ let config;
483
+ try {
484
+ config = options.config ?? loadElarisConfig();
485
+ }
486
+ catch (err) {
487
+ return elarisResult({
488
+ ok: false,
489
+ operation: "health",
490
+ error_kind: "invalid_config",
491
+ config_ok: false,
492
+ key_present: false,
493
+ router: "not_checked",
494
+ supported_ops: SUPPORTED_MANAGE_OPS,
495
+ ...scopeHealthFields(),
496
+ detail: err instanceof Error ? err.message : "Invalid Elaris config.",
497
+ }, { maxChars: maxResponseChars });
498
+ }
499
+ const apiKeyEnv = config.API_KEY_ENV ?? "CLINKX_ELARIS_API_KEY";
500
+ const apiKey = process.env[apiKeyEnv]?.trim() ?? "";
501
+ let baseUrl;
502
+ try {
503
+ if (config.BASE_URL === undefined)
504
+ throw new InvalidParamsError("CLINKX_ELARIS_BASE_URL is required when Elaris is enabled");
505
+ baseUrl = validateElarisBaseUrl(config.BASE_URL);
506
+ }
507
+ catch (err) {
508
+ return elarisResult({
509
+ ok: false,
510
+ operation: "health",
511
+ error_kind: "invalid_config",
512
+ config_ok: false,
513
+ key_env: apiKeyEnv,
514
+ key_present: apiKey.length > 0,
515
+ router: "not_checked",
516
+ supported_ops: SUPPORTED_MANAGE_OPS,
517
+ ...scopeHealthFields(),
518
+ detail: err instanceof Error ? err.message : "Invalid Elaris base URL.",
519
+ }, { maxChars: maxResponseChars });
520
+ }
521
+ const client = options.client ?? new ElarisClient({
522
+ fetch: globalThis.fetch,
523
+ baseUrl,
524
+ apiKey,
525
+ requestTimeoutMs: (config.REQUEST_TIMEOUT_SECONDS ?? 30) * 1000,
526
+ });
527
+ const probe = await client.healthProbe({ signal });
528
+ // healthProbe swallows fetch failures (including the external abort) into a normal
529
+ // diagnostics body, so re-check the external signal here: a swallowed abort must
530
+ // become CancellationError (no MCP response), not a successful health body.
531
+ throwIfCancelled(signal);
532
+ return elarisResult({
533
+ ok: true,
534
+ operation: "health",
535
+ config_ok: true,
536
+ key_env: apiKeyEnv,
537
+ key_present: apiKey.length > 0,
538
+ router: "indeterminate",
539
+ supported_ops: SUPPORTED_MANAGE_OPS,
540
+ ...scopeHealthFields(),
541
+ probe,
542
+ }, { maxChars: maxResponseChars });
543
+ }
544
+ function unsupportedManageResult(op, maxResponseChars = 20000) {
545
+ return elarisResult({
546
+ ok: false,
547
+ error_kind: "unsupported_v1",
548
+ operation: op,
549
+ detail: "This Elaris manage operation has no v1 remote endpoint or is deferred.",
550
+ }, { isError: true, maxChars: maxResponseChars });
551
+ }
552
+ const SUPPORTED_MANAGE_OPS = [
553
+ "poll",
554
+ "wait",
555
+ "result",
556
+ "content",
557
+ "logs",
558
+ "artifacts",
559
+ "artifact_raw",
560
+ "message",
561
+ "cancel",
562
+ "cleanup",
563
+ "health",
564
+ ];
565
+ // tool-schemas.ts owns the schema-side source of truth (`unsupportedManageOps`).
566
+ // This map is keyed by the `ElarisUnsupportedManageOp` union, so any change to that
567
+ // union there fails compilation here — keeping the two definitions from drifting.
568
+ const UNSUPPORTED_MANAGE_OP_FLAGS = {
569
+ list: true,
570
+ list_models: true,
571
+ events: true,
572
+ steer: true,
573
+ approvals: true,
574
+ };
575
+ const UNSUPPORTED_MANAGE_OPS = new Set(Object.keys(UNSUPPORTED_MANAGE_OP_FLAGS));
576
+ const REQUIRED_SCOPES_BY_OPERATION = {
577
+ clink_elaris_run: ["agent_sessions:create"],
578
+ clink_elaris_run_wait: ["agent_sessions:create", "agent_sessions:read"],
579
+ duplicate_recovery: ["agent_sessions:read"],
580
+ poll: ["agent_sessions:read"],
581
+ wait: ["agent_sessions:read"],
582
+ result: ["agent_sessions:read"],
583
+ content: ["agent_sessions:read"],
584
+ logs: ["agent_sessions:logs"],
585
+ artifacts: ["agent_sessions:artifacts"],
586
+ artifact_raw: ["agent_sessions:artifacts"],
587
+ message: ["agent_sessions:message"],
588
+ message_wait: ["agent_sessions:message", "agent_sessions:read"],
589
+ cancel: ["agent_sessions:cancel"],
590
+ cleanup: ["agent_sessions:cleanup"],
591
+ health: ["agent_sessions:read"],
592
+ };
593
+ const REQUIRED_SCOPES = Array.from(new Set(Object.values(REQUIRED_SCOPES_BY_OPERATION).flat())).sort();
594
+ const SCOPES_BY_OPERATION = Object.fromEntries(Object.entries(REQUIRED_SCOPES_BY_OPERATION).map(([op, scopes]) => [op, [...scopes]]));
595
+ function scopeHealthFields() {
596
+ return {
597
+ required_scopes: [...REQUIRED_SCOPES],
598
+ scopes_by_operation: Object.fromEntries(Object.entries(SCOPES_BY_OPERATION).map(([op, scopes]) => [op, [...scopes]])),
599
+ };
600
+ }
601
+ function messageFields(message) {
602
+ return message;
603
+ }
604
+ function isUnsupportedManageOp(op) {
605
+ return UNSUPPORTED_MANAGE_OPS.has(op);
606
+ }
607
+ async function fetchManageStatus(client, input, signal, operation) {
608
+ try {
609
+ return input.status_url !== undefined
610
+ ? await client.getStatusByHandle(input.status_url, { signal })
611
+ : await client.getStatusBySessionId(input.session_id, { signal });
612
+ }
613
+ catch (err) {
614
+ rethrowIfCancelled(err, signal);
615
+ const remote = remoteFailureFromUnknown(err);
616
+ if (remote !== undefined) {
617
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
618
+ throw new ElarisStructuredFailure(buildFailureForRemote(errorKind, remote, operation, undefined));
619
+ }
620
+ throw err;
621
+ }
622
+ }
623
+ function echoStatusLocator(snapshot, input) {
624
+ return {
625
+ ...snapshot,
626
+ session_id: input.session_id,
627
+ status_url: input.status_url,
628
+ keep_alive_known: false,
629
+ };
630
+ }
631
+ function manageFailureIsError(op, errorKind) {
632
+ if (errorKind === "unknown_session" && (op === "poll" || op === "wait")) {
633
+ return false;
634
+ }
635
+ return true;
636
+ }
637
+ function pollAction(sessionId, statusUrl) {
638
+ return {
639
+ tool: "clink_elaris_manage",
640
+ op: "poll",
641
+ session_id: sessionId,
642
+ status_url: statusUrl,
643
+ };
644
+ }
645
+ function objectOrValue(value) {
646
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
647
+ return value;
648
+ }
649
+ return { value };
650
+ }
651
+ function buildMessageRequest(input, idempotencyKey) {
652
+ const request = {
653
+ prompt: input.prompt,
654
+ permission_mode: input.permission_mode,
655
+ idempotency_key: idempotencyKey,
656
+ };
657
+ if (input.model_id !== undefined)
658
+ request.model_id = input.model_id;
659
+ if (input.effort_level !== undefined)
660
+ request.effort_level = input.effort_level;
661
+ if (input.metadata !== undefined)
662
+ request.metadata = input.metadata;
663
+ return request;
664
+ }
665
+ async function postMessageWithBoundedRetry(input) {
666
+ const maxAttempts = 2;
667
+ let lastError;
668
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
669
+ throwIfCancelled(input.signal);
670
+ try {
671
+ return await input.client.postMessage(input.sessionId, input.request, { signal: input.signal });
672
+ }
673
+ catch (err) {
674
+ rethrowIfCancelled(err, input.signal);
675
+ const remote = remoteFailureFromUnknown(err);
676
+ if (remote !== undefined) {
677
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
678
+ throw new ElarisStructuredFailure(buildFailureForRemote(errorKind, remote, "message", undefined));
679
+ }
680
+ if (!isAmbiguousTransportError(err))
681
+ throw err;
682
+ lastError = err;
683
+ if (attempt >= maxAttempts)
684
+ break;
685
+ const slept = await input.waitForNextPoll({
686
+ deadlineMs: input.deadlineMs,
687
+ pollIntervalMs: input.pollIntervalMs,
688
+ signal: input.signal,
689
+ });
690
+ if (!slept)
691
+ break;
692
+ }
693
+ }
694
+ throw new ElarisStructuredFailure(buildElarisFailureBody({
695
+ error_kind: "backend_unavailable",
696
+ operation: "message",
697
+ idempotency_key: input.request.idempotency_key,
698
+ detail: `Message dispatch outcome is ambiguous after retry budget; retry with the returned idempotency_key to recover if the MCP response was lost. Last error: ${lastError instanceof Error ? lastError.message : "unknown transport failure"}`,
699
+ }));
700
+ }
701
+ async function waitForMessageTerminal(input) {
702
+ while (true) {
703
+ if (input.nowMs() >= input.deadlineMs) {
704
+ return { message: input.message, waitResult: "timed_out" };
705
+ }
706
+ const slept = await input.waitForNextPoll({
707
+ deadlineMs: input.deadlineMs,
708
+ pollIntervalMs: input.pollIntervalMs,
709
+ signal: input.signal,
710
+ });
711
+ if (!slept) {
712
+ return { message: input.message, waitResult: "timed_out" };
713
+ }
714
+ throwIfCancelled(input.signal);
715
+ const observed = messageFields(input.message);
716
+ const status = await fetchStatusOrStructured(() => input.client.getStatusByHandle(observed.status_url, { signal: input.signal }), undefined, "message");
717
+ const snapshot = {
718
+ ...mapStatusResponseToSnapshot(status),
719
+ session_id: observed.session_id,
720
+ status_url: observed.status_url,
721
+ result_url: observed.result_url,
722
+ };
723
+ if (snapshot.terminal)
724
+ return { snapshot, waitResult: "settled" };
725
+ }
726
+ }
727
+ function messageSnapshot(message) {
728
+ const observed = messageFields(message);
729
+ return {
730
+ session_id: observed.session_id,
731
+ raw_status: observed.status,
732
+ normalized_status: normalizeElarisStatus(observed.status),
733
+ terminal: isTerminalElarisStatus(observed.status),
734
+ status_url: observed.status_url,
735
+ result_url: observed.result_url,
736
+ };
737
+ }
738
+ function generateMessageIdempotencyKey() {
739
+ const timestamp = new Date().toISOString().replace(/\D/g, "").slice(0, 14);
740
+ const random = Math.random().toString(36).slice(2, 12);
741
+ return `cxmsg_${timestamp}_${random}`;
742
+ }
743
+ async function createWithBoundedRetry(input) {
744
+ const maxAttempts = 3;
745
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
746
+ throwIfCancelled(input.signal);
747
+ try {
748
+ const response = await input.client.createSession(input.request, { signal: input.signal });
749
+ return { kind: "created", response };
750
+ }
751
+ catch (err) {
752
+ throwIfCancelled(input.signal);
753
+ if (err instanceof InvalidParamsError || err instanceof ExecutionError || err instanceof CancellationError) {
754
+ throw err;
755
+ }
756
+ const remote = remoteFailureFromUnknown(err);
757
+ if (remote !== undefined) {
758
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
759
+ if (errorKind === "duplicate_run_id") {
760
+ return { kind: "duplicate", locator: duplicateLocator(remote.rawEnvelope) };
761
+ }
762
+ if (shouldRetryCreate(errorKind) && attempt < maxAttempts) {
763
+ const slept = await maybeWaitForCreateRetry({
764
+ retryAfterMs: remote.retry_after_ms,
765
+ pollIntervalMs: input.input.poll_interval_ms,
766
+ deadlineMs: input.deadlineMs,
767
+ signal: input.signal,
768
+ waitForNextPoll: input.waitForNextPoll,
769
+ nowMs: input.nowMs,
770
+ });
771
+ if (slept)
772
+ continue;
773
+ }
774
+ return {
775
+ kind: "tool_result",
776
+ body: buildFailureForRemote(errorKind, remote, "clink_elaris_run", input.request.run_id),
777
+ isError: true,
778
+ };
779
+ }
780
+ if (!isAmbiguousTransportError(err)) {
781
+ throw new ExecutionError(err instanceof Error ? err.message : "Unexpected Elaris create failure");
782
+ }
783
+ if (attempt < maxAttempts) {
784
+ const slept = await maybeWaitForCreateRetry({
785
+ retryAfterMs: undefined,
786
+ pollIntervalMs: input.input.poll_interval_ms,
787
+ deadlineMs: input.deadlineMs,
788
+ signal: input.signal,
789
+ waitForNextPoll: input.waitForNextPoll,
790
+ nowMs: input.nowMs,
791
+ });
792
+ if (slept)
793
+ continue;
794
+ }
795
+ return {
796
+ kind: "tool_result",
797
+ body: buildElarisFailureBody({
798
+ error_kind: "backend_unavailable",
799
+ operation: "clink_elaris_run",
800
+ detail: ambiguousCreateDetail(err),
801
+ run_id: input.request.run_id,
802
+ }),
803
+ isError: true,
804
+ };
805
+ }
806
+ }
807
+ throw new ExecutionError("unreachable Elaris create retry state");
808
+ }
809
+ async function recoverDuplicate(input) {
810
+ if (input.locator.status_url === undefined && input.locator.session_id === undefined) {
811
+ return elarisResult(buildElarisFailureBody({
812
+ error_kind: "duplicate_run_id",
813
+ operation: "clink_elaris_run",
814
+ detail: "Duplicate run_id was reported without a poll locator.",
815
+ run_id: input.runId,
816
+ }), { isError: true, maxChars: input.maxResponseChars });
817
+ }
818
+ const status = await fetchStatusOrStructured(() => input.locator.status_url !== undefined
819
+ ? input.client.getStatusByHandle(input.locator.status_url, { signal: input.signal })
820
+ : input.client.getStatusBySessionId(input.locator.session_id, { signal: input.signal }), input.runId);
821
+ let snapshot = mapStatusResponseToSnapshot(status);
822
+ snapshot = {
823
+ ...snapshot,
824
+ session_id: input.locator.session_id,
825
+ status_url: input.locator.status_url,
826
+ };
827
+ let waitResult = "not_requested";
828
+ if (input.input.wait) {
829
+ const waited = await waitForTerminal({
830
+ client: input.client,
831
+ createSnapshot: snapshot,
832
+ signal: input.signal,
833
+ deadlineMs: input.deadlineMs,
834
+ pollIntervalMs: input.input.poll_interval_ms,
835
+ waitForNextPoll: input.waitForNextPoll,
836
+ nowMs: input.nowMs,
837
+ runId: input.runId,
838
+ });
839
+ snapshot = waited.snapshot;
840
+ waitResult = waited.waitResult;
841
+ }
842
+ const body = {
843
+ ok: true,
844
+ operation: "clink_elaris_run",
845
+ recovered_duplicate: true,
846
+ duplicate_recovery_note: "Recovered duplicate run_id for polling/read-only status. Multi-turn message continuation requires the same Elaris API key.",
847
+ session_id: input.locator.session_id,
848
+ status_url: input.locator.status_url,
849
+ ...snapshot,
850
+ wait_result: waitResult,
851
+ next_action: snapshot.terminal ? undefined : nextAction({ ...snapshot, session_id: input.locator.session_id, status_url: input.locator.status_url }),
852
+ };
853
+ return elarisResult(body, {
854
+ isError: snapshotIsError(snapshot),
855
+ maxChars: input.maxResponseChars,
856
+ });
857
+ }
858
+ async function waitForTerminal(input) {
859
+ let latest = input.createSnapshot;
860
+ while (!latest.terminal) {
861
+ if (input.nowMs() >= input.deadlineMs) {
862
+ return { snapshot: latest, waitResult: "timed_out" };
863
+ }
864
+ const slept = await input.waitForNextPoll({
865
+ deadlineMs: input.deadlineMs,
866
+ pollIntervalMs: input.pollIntervalMs,
867
+ signal: input.signal,
868
+ });
869
+ if (!slept) {
870
+ return { snapshot: latest, waitResult: "timed_out" };
871
+ }
872
+ throwIfCancelled(input.signal);
873
+ const status = await fetchStatusOrStructured(() => latest.status_url !== undefined
874
+ ? input.client.getStatusByHandle(latest.status_url, { signal: input.signal })
875
+ : input.client.getStatusBySessionId(requiredSessionId(latest), { signal: input.signal }), input.runId);
876
+ latest = mergeCreateProvenance(mapStatusResponseToSnapshot(status), input.createSnapshot);
877
+ }
878
+ return { snapshot: latest, waitResult: "settled" };
879
+ }
880
+ function buildCreateRequest(input, modelId, runId) {
881
+ const request = {
882
+ prompt: input.prompt,
883
+ model_id: modelId,
884
+ permission_mode: input.permission_mode,
885
+ run_id: runId,
886
+ keep_alive: input.keep_alive,
887
+ };
888
+ if (input.effort_level !== undefined)
889
+ request.effort_level = input.effort_level;
890
+ if (input.metadata !== undefined)
891
+ request.metadata = input.metadata;
892
+ if (input.github_repo !== undefined)
893
+ request.github_repo = input.github_repo;
894
+ return request;
895
+ }
896
+ function createDefaultClient(config) {
897
+ if (config.BASE_URL === undefined || config.API_KEY_ENV === undefined || config.REQUEST_TIMEOUT_SECONDS === undefined) {
898
+ throw new InvalidParamsError("Elaris config is incomplete.");
899
+ }
900
+ return new ElarisClient({
901
+ fetch: globalThis.fetch,
902
+ baseUrl: validateElarisBaseUrl(config.BASE_URL),
903
+ apiKey: resolveElarisApiKey(config.API_KEY_ENV),
904
+ requestTimeoutMs: config.REQUEST_TIMEOUT_SECONDS * 1000,
905
+ });
906
+ }
907
+ function nextAction(snapshot) {
908
+ if (snapshot.terminal)
909
+ return undefined;
910
+ return {
911
+ tool: "clink_elaris_manage",
912
+ op: "poll",
913
+ session_id: snapshot.session_id,
914
+ status_url: snapshot.status_url,
915
+ };
916
+ }
917
+ function shouldRetryCreate(errorKind) {
918
+ return errorKind === "rate_limited" || errorKind === "backend_unavailable";
919
+ }
920
+ async function maybeWaitForCreateRetry(input) {
921
+ const slept = await input.waitForNextPoll({
922
+ deadlineMs: input.deadlineMs,
923
+ retryAfterMs: input.retryAfterMs,
924
+ pollIntervalMs: input.pollIntervalMs,
925
+ signal: input.signal,
926
+ });
927
+ if (!slept)
928
+ return false;
929
+ throwIfCancelled(input.signal);
930
+ return true;
931
+ }
932
+ function remoteFailureFromUnknown(err) {
933
+ if (isElarisHttpError(err)) {
934
+ const envelope = err.payload ?? {};
935
+ return {
936
+ status: err.status,
937
+ envelope,
938
+ rawEnvelope: err.rawPayload ?? envelope,
939
+ retry_after_ms: err.retryAfterMs,
940
+ };
941
+ }
942
+ if (typeof err !== "object" || err === null)
943
+ return undefined;
944
+ const record = err;
945
+ const status = firstNumber(record.status, record.statusCode, record.http_status, record.httpStatus);
946
+ if (status === undefined)
947
+ return undefined;
948
+ const envelope = record.envelope ?? record.payload ?? record.body ?? record.responseBody ?? record.data ?? {};
949
+ return {
950
+ status,
951
+ envelope,
952
+ rawEnvelope: record.rawPayload ?? envelope,
953
+ retry_after_ms: firstNumber(record.retry_after_ms, record.retryAfterMs),
954
+ };
955
+ }
956
+ class ElarisStructuredFailure extends Error {
957
+ body;
958
+ constructor(body) {
959
+ super("elaris structured failure");
960
+ this.body = body;
961
+ this.name = "ElarisStructuredFailure";
962
+ }
963
+ }
964
+ async function fetchStatusOrStructured(fetchStatus, runId, operation = "clink_elaris_run") {
965
+ try {
966
+ return await fetchStatus();
967
+ }
968
+ catch (err) {
969
+ if (err instanceof CancellationError)
970
+ throw err;
971
+ const remote = remoteFailureFromUnknown(err);
972
+ if (remote !== undefined) {
973
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
974
+ throw new ElarisStructuredFailure(buildFailureForRemote(errorKind, remote, operation, runId));
975
+ }
976
+ throw err;
977
+ }
978
+ }
979
+ function buildFailureForRemote(errorKind, remote, operation, runId) {
980
+ const inferredReason = errorKind === "follow_up_conflict"
981
+ ? inferFollowUpConflictReason(remote.rawEnvelope)
982
+ : undefined;
983
+ return buildElarisFailureBody({
984
+ error_kind: errorKind,
985
+ operation,
986
+ http_status: remote.status,
987
+ retry_after_ms: remote.retry_after_ms,
988
+ request_id: errorEnvelopeRequestId(remote.envelope),
989
+ detail: errorEnvelopeDetail(remote.envelope) ?? errorKind,
990
+ run_id: errorEnvelopeRunId(remote.envelope) ?? runId,
991
+ inferred_reason: inferredReason,
992
+ });
993
+ }
994
+ function duplicateLocator(envelope) {
995
+ if (typeof envelope !== "object" || envelope === null)
996
+ return {};
997
+ const record = envelope;
998
+ const details = typeof record.details === "object" && record.details !== null
999
+ ? record.details
1000
+ : {};
1001
+ return {
1002
+ session_id: firstString(record.session_id, details.session_id),
1003
+ status_url: firstString(record.status_url, details.status_url),
1004
+ };
1005
+ }
1006
+ function ambiguousCreateDetail(err) {
1007
+ const message = err instanceof Error ? err.message : "unknown transport failure";
1008
+ return `Create outcome is ambiguous after retry budget; retry with the same caller-supplied run_id to recover if the MCP response was lost. Last error: ${message}`;
1009
+ }
1010
+ function isAmbiguousTransportError(err) {
1011
+ if (!(err instanceof Error))
1012
+ return false;
1013
+ if (err.name === "AbortError" || err.name === "TimeoutError" || err.name === "TypeError") {
1014
+ return true;
1015
+ }
1016
+ return /fetch|network|timeout|timed out|econn|socket|terminated/i.test(err.message);
1017
+ }
1018
+ function requiredSessionId(snapshot) {
1019
+ if (snapshot.session_id === undefined) {
1020
+ throw new ExecutionError("Elaris status polling requires session_id or status_url.");
1021
+ }
1022
+ return snapshot.session_id;
1023
+ }
1024
+ function throwIfCancelled(signal) {
1025
+ if (signal?.aborted === true) {
1026
+ throw new CancellationError();
1027
+ }
1028
+ }
1029
+ // Normalizes an observed failure into MCP cancellation when warranted: rethrows a
1030
+ // CancellationError verbatim, and converts a fetch/transport rejection into a
1031
+ // CancellationError when the EXTERNAL request signal is aborted. It does NOT
1032
+ // translate the client's internal request-timeout abort — only `signal.aborted`.
1033
+ function rethrowIfCancelled(err, signal) {
1034
+ if (err instanceof CancellationError)
1035
+ throw err;
1036
+ throwIfCancelled(signal);
1037
+ }
1038
+ // artifact_raw has file-level taxonomy in addition to session-level taxonomy.
1039
+ // Provider session-not-found includes error_code AGENT_SESSION_NOT_FOUND; a bare
1040
+ // 404 means the artifact file/sandbox was not found.
1041
+ function classifyManageRemote(op, remote) {
1042
+ const errorKind = classifyElarisHttpError(remote.status, remote.rawEnvelope);
1043
+ if (op === "artifact_raw" &&
1044
+ remote.status === 404 &&
1045
+ errorEnvelopeCode(remote.rawEnvelope) !== "AGENT_SESSION_NOT_FOUND") {
1046
+ return "artifact_not_found";
1047
+ }
1048
+ if (op === "artifact_raw" && (remote.status === 400 || remote.status === 422)) {
1049
+ return "artifact_request_error";
1050
+ }
1051
+ return errorKind;
1052
+ }
1053
+ function errorEnvelopeCode(envelope) {
1054
+ if (typeof envelope !== "object" || envelope === null)
1055
+ return undefined;
1056
+ const record = envelope;
1057
+ return typeof record.error_code === "string" ? record.error_code : undefined;
1058
+ }
1059
+ function firstNumber(...values) {
1060
+ return values.find((value) => typeof value === "number" && Number.isFinite(value));
1061
+ }
1062
+ function firstString(...values) {
1063
+ return values.find((value) => typeof value === "string" && value.length > 0);
1064
+ }
1065
+ //# sourceMappingURL=tools.js.map