@lerianstudio/matcher-mcp 5.0.0-beta.14 → 5.0.0-beta.140

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 (283) hide show
  1. package/README.md +29 -14
  2. package/dist/auth/request-token.js +11 -69
  3. package/dist/auth/request-token.js.map +1 -1
  4. package/dist/config.js +19 -85
  5. package/dist/config.js.map +1 -1
  6. package/dist/copilot/agent.js +5 -9
  7. package/dist/copilot/agent.js.map +1 -1
  8. package/dist/copilot/provider-anthropic.js +75 -23
  9. package/dist/copilot/provider-anthropic.js.map +1 -1
  10. package/dist/copilot/provider-openrouter.js +5 -18
  11. package/dist/copilot/provider-openrouter.js.map +1 -1
  12. package/dist/copilot/provider-shared.js +11 -0
  13. package/dist/copilot/provider-shared.js.map +1 -1
  14. package/dist/copilot/speech-provider.js +84 -0
  15. package/dist/copilot/speech-provider.js.map +1 -0
  16. package/dist/copilot/sse.js +5 -0
  17. package/dist/copilot/sse.js.map +1 -1
  18. package/dist/copilot/system-prompt.js +17 -2
  19. package/dist/copilot/system-prompt.js.map +1 -1
  20. package/dist/copilot/tools.js +14 -65
  21. package/dist/copilot/tools.js.map +1 -1
  22. package/dist/copilot/transcribe-handler.js +8 -93
  23. package/dist/copilot/transcribe-handler.js.map +1 -1
  24. package/dist/copilot/turn-request.js +76 -0
  25. package/dist/copilot/turn-request.js.map +1 -0
  26. package/dist/copilot/turns-handler.js +11 -102
  27. package/dist/copilot/turns-handler.js.map +1 -1
  28. package/dist/matcher/client.js +1 -1
  29. package/dist/matcher/client.js.map +1 -1
  30. package/dist/matcher/idempotency.js +1 -1
  31. package/dist/matcher/idempotency.js.map +1 -1
  32. package/dist/observability/otel.js +86 -125
  33. package/dist/observability/otel.js.map +1 -1
  34. package/dist/server.js +12 -81
  35. package/dist/server.js.map +1 -1
  36. package/dist/spec/curated-operations.js +114 -98
  37. package/dist/spec/curated-operations.js.map +1 -1
  38. package/dist/spec/enum-policy.js +21 -26
  39. package/dist/spec/enum-policy.js.map +1 -1
  40. package/dist/spec/index.js +1 -1
  41. package/dist/spec/index.js.map +1 -1
  42. package/dist/spec/openapi.yaml +901 -74
  43. package/dist/spec/schema-parity.js +25 -30
  44. package/dist/spec/schema-parity.js.map +1 -1
  45. package/dist/tools/context/create.js +16 -5
  46. package/dist/tools/context/create.js.map +1 -1
  47. package/dist/tools/context/index.js +137 -17
  48. package/dist/tools/context/index.js.map +1 -1
  49. package/dist/tools/context/list.js +10 -36
  50. package/dist/tools/context/list.js.map +1 -1
  51. package/dist/tools/context/setup-progress.js +4 -3
  52. package/dist/tools/context/setup-progress.js.map +1 -1
  53. package/dist/tools/context/shared.js +5 -53
  54. package/dist/tools/context/shared.js.map +1 -1
  55. package/dist/tools/context/update.js +15 -7
  56. package/dist/tools/context/update.js.map +1 -1
  57. package/dist/tools/curated-tool.js +37 -0
  58. package/dist/tools/curated-tool.js.map +1 -0
  59. package/dist/tools/dashboard/index.js +124 -19
  60. package/dist/tools/dashboard/index.js.map +1 -1
  61. package/dist/tools/dashboard/shared.js +9 -76
  62. package/dist/tools/dashboard/shared.js.map +1 -1
  63. package/dist/tools/dispute/close.js +5 -5
  64. package/dist/tools/dispute/close.js.map +1 -1
  65. package/dist/tools/dispute/index.js +34 -6
  66. package/dist/tools/dispute/index.js.map +1 -1
  67. package/dist/tools/dispute/list.js +19 -48
  68. package/dist/tools/dispute/list.js.map +1 -1
  69. package/dist/tools/dispute/shared.js +4 -50
  70. package/dist/tools/dispute/shared.js.map +1 -1
  71. package/dist/tools/dispute/submit-evidence.js +5 -5
  72. package/dist/tools/dispute/submit-evidence.js.map +1 -1
  73. package/dist/tools/exception/add-comment.js +3 -2
  74. package/dist/tools/exception/add-comment.js.map +1 -1
  75. package/dist/tools/exception/adjust-entry.js +5 -5
  76. package/dist/tools/exception/adjust-entry.js.map +1 -1
  77. package/dist/tools/exception/bulk-assign.js +3 -2
  78. package/dist/tools/exception/bulk-assign.js.map +1 -1
  79. package/dist/tools/exception/bulk-dispatch.js +3 -2
  80. package/dist/tools/exception/bulk-dispatch.js.map +1 -1
  81. package/dist/tools/exception/bulk-resolve.js +3 -2
  82. package/dist/tools/exception/bulk-resolve.js.map +1 -1
  83. package/dist/tools/exception/dispatch.js +3 -2
  84. package/dist/tools/exception/dispatch.js.map +1 -1
  85. package/dist/tools/exception/force-match.js +3 -2
  86. package/dist/tools/exception/force-match.js.map +1 -1
  87. package/dist/tools/exception/history.js +10 -26
  88. package/dist/tools/exception/history.js.map +1 -1
  89. package/dist/tools/exception/index.js +88 -18
  90. package/dist/tools/exception/index.js.map +1 -1
  91. package/dist/tools/exception/list.js +17 -60
  92. package/dist/tools/exception/list.js.map +1 -1
  93. package/dist/tools/exception/open-dispute.js +3 -2
  94. package/dist/tools/exception/open-dispute.js.map +1 -1
  95. package/dist/tools/exception/shared.js +3 -51
  96. package/dist/tools/exception/shared.js.map +1 -1
  97. package/dist/tools/fee-rule/create.js +5 -5
  98. package/dist/tools/fee-rule/create.js.map +1 -1
  99. package/dist/tools/fee-rule/index.js +50 -8
  100. package/dist/tools/fee-rule/index.js.map +1 -1
  101. package/dist/tools/fee-rule/list.js +10 -30
  102. package/dist/tools/fee-rule/list.js.map +1 -1
  103. package/dist/tools/fee-rule/shared.js +3 -53
  104. package/dist/tools/fee-rule/shared.js.map +1 -1
  105. package/dist/tools/fee-rule/update.js +5 -5
  106. package/dist/tools/fee-rule/update.js.map +1 -1
  107. package/dist/tools/fee-schedule/create.js +9 -4
  108. package/dist/tools/fee-schedule/create.js.map +1 -1
  109. package/dist/tools/fee-schedule/index.js +62 -11
  110. package/dist/tools/fee-schedule/index.js.map +1 -1
  111. package/dist/tools/fee-schedule/list.js +9 -25
  112. package/dist/tools/fee-schedule/list.js.map +1 -1
  113. package/dist/tools/fee-schedule/shared.js +4 -50
  114. package/dist/tools/fee-schedule/shared.js.map +1 -1
  115. package/dist/tools/fee-schedule/simulate.js +5 -5
  116. package/dist/tools/fee-schedule/simulate.js.map +1 -1
  117. package/dist/tools/fee-schedule/update.js +5 -5
  118. package/dist/tools/fee-schedule/update.js.map +1 -1
  119. package/dist/tools/field-map/create.js +4 -3
  120. package/dist/tools/field-map/create.js.map +1 -1
  121. package/dist/tools/field-map/index.js +65 -11
  122. package/dist/tools/field-map/index.js.map +1 -1
  123. package/dist/tools/field-map/list.js +10 -30
  124. package/dist/tools/field-map/list.js.map +1 -1
  125. package/dist/tools/field-map/shared.js +21 -73
  126. package/dist/tools/field-map/shared.js.map +1 -1
  127. package/dist/tools/field-map/update.js +6 -4
  128. package/dist/tools/field-map/update.js.map +1 -1
  129. package/dist/tools/generic/describe-operation.js +2 -8
  130. package/dist/tools/generic/describe-operation.js.map +1 -1
  131. package/dist/tools/generic/invoke.js +5 -40
  132. package/dist/tools/generic/invoke.js.map +1 -1
  133. package/dist/tools/generic/list-operations.js +1 -1
  134. package/dist/tools/generic/list-operations.js.map +1 -1
  135. package/dist/tools/ingestion/index.js +100 -12
  136. package/dist/tools/ingestion/index.js.map +1 -1
  137. package/dist/tools/ingestion/job-transactions-list.js +12 -42
  138. package/dist/tools/ingestion/job-transactions-list.js.map +1 -1
  139. package/dist/tools/ingestion/jobs-list.js +11 -37
  140. package/dist/tools/ingestion/jobs-list.js.map +1 -1
  141. package/dist/tools/ingestion/shared.js +3 -49
  142. package/dist/tools/ingestion/shared.js.map +1 -1
  143. package/dist/tools/ingestion/transactions-search.js +11 -46
  144. package/dist/tools/ingestion/transactions-search.js.map +1 -1
  145. package/dist/tools/ingestion/upload-begin.js +1 -1
  146. package/dist/tools/ingestion/upload-begin.js.map +1 -1
  147. package/dist/tools/ingestion/upload.js +3 -2
  148. package/dist/tools/ingestion/upload.js.map +1 -1
  149. package/dist/tools/input-fields.js +51 -0
  150. package/dist/tools/input-fields.js.map +1 -0
  151. package/dist/tools/match-rule/index.js +130 -13
  152. package/dist/tools/match-rule/index.js.map +1 -1
  153. package/dist/tools/match-rule/list.js +10 -34
  154. package/dist/tools/match-rule/list.js.map +1 -1
  155. package/dist/tools/match-rule/shared.js +14 -53
  156. package/dist/tools/match-rule/shared.js.map +1 -1
  157. package/dist/tools/match-rule/update.js +7 -11
  158. package/dist/tools/match-rule/update.js.map +1 -1
  159. package/dist/tools/matching/get.js +6 -6
  160. package/dist/tools/matching/get.js.map +1 -1
  161. package/dist/tools/matching/groups.js +7 -15
  162. package/dist/tools/matching/groups.js.map +1 -1
  163. package/dist/tools/matching/index.js +77 -5
  164. package/dist/tools/matching/index.js.map +1 -1
  165. package/dist/tools/matching/list.js +10 -33
  166. package/dist/tools/matching/list.js.map +1 -1
  167. package/dist/tools/matching/shared.js +3 -52
  168. package/dist/tools/matching/shared.js.map +1 -1
  169. package/dist/tools/query-handler.js +9 -0
  170. package/dist/tools/query-handler.js.map +1 -0
  171. package/dist/tools/report/index.js +264 -30
  172. package/dist/tools/report/index.js.map +1 -1
  173. package/dist/tools/report/shared.js +21 -106
  174. package/dist/tools/report/shared.js.map +1 -1
  175. package/dist/tools/request-fields.js +17 -0
  176. package/dist/tools/request-fields.js.map +1 -0
  177. package/dist/tools/shared-dispatch.js +42 -0
  178. package/dist/tools/shared-dispatch.js.map +1 -0
  179. package/dist/tools/source/create.js +146 -23
  180. package/dist/tools/source/create.js.map +1 -1
  181. package/dist/tools/source/index.js +101 -13
  182. package/dist/tools/source/index.js.map +1 -1
  183. package/dist/tools/source/list.js +10 -33
  184. package/dist/tools/source/list.js.map +1 -1
  185. package/dist/tools/source/shared.js +3 -48
  186. package/dist/tools/source/shared.js.map +1 -1
  187. package/dist/tools/source/update.js +16 -33
  188. package/dist/tools/source/update.js.map +1 -1
  189. package/dist/tools/workspace/usage.js +27 -41
  190. package/dist/tools/workspace/usage.js.map +1 -1
  191. package/dist/transport/body-limit.js +1 -6
  192. package/dist/transport/body-limit.js.map +1 -1
  193. package/package.json +4 -4
  194. package/dist/tools/context/archive.js +0 -37
  195. package/dist/tools/context/archive.js.map +0 -1
  196. package/dist/tools/context/get.js +0 -31
  197. package/dist/tools/context/get.js.map +0 -1
  198. package/dist/tools/context/next-step.js +0 -99
  199. package/dist/tools/context/next-step.js.map +0 -1
  200. package/dist/tools/context/restore.js +0 -34
  201. package/dist/tools/context/restore.js.map +0 -1
  202. package/dist/tools/dashboard/aggregates.js +0 -37
  203. package/dist/tools/dashboard/aggregates.js.map +0 -1
  204. package/dist/tools/dashboard/cash-impact.js +0 -37
  205. package/dist/tools/dashboard/cash-impact.js.map +0 -1
  206. package/dist/tools/dashboard/match-rate.js +0 -37
  207. package/dist/tools/dashboard/match-rate.js.map +0 -1
  208. package/dist/tools/dashboard/metrics.js +0 -37
  209. package/dist/tools/dashboard/metrics.js.map +0 -1
  210. package/dist/tools/dashboard/sla.js +0 -34
  211. package/dist/tools/dashboard/sla.js.map +0 -1
  212. package/dist/tools/dashboard/source-breakdown.js +0 -37
  213. package/dist/tools/dashboard/source-breakdown.js.map +0 -1
  214. package/dist/tools/dashboard/volume.js +0 -37
  215. package/dist/tools/dashboard/volume.js.map +0 -1
  216. package/dist/tools/dispute/get.js +0 -27
  217. package/dist/tools/dispute/get.js.map +0 -1
  218. package/dist/tools/exception/delete-comment.js +0 -40
  219. package/dist/tools/exception/delete-comment.js.map +0 -1
  220. package/dist/tools/exception/get.js +0 -34
  221. package/dist/tools/exception/get.js.map +0 -1
  222. package/dist/tools/exception/list-comments.js +0 -35
  223. package/dist/tools/exception/list-comments.js.map +0 -1
  224. package/dist/tools/fee-rule/delete.js +0 -27
  225. package/dist/tools/fee-rule/delete.js.map +0 -1
  226. package/dist/tools/fee-rule/get.js +0 -27
  227. package/dist/tools/fee-rule/get.js.map +0 -1
  228. package/dist/tools/fee-schedule/delete.js +0 -32
  229. package/dist/tools/fee-schedule/delete.js.map +0 -1
  230. package/dist/tools/fee-schedule/get.js +0 -30
  231. package/dist/tools/fee-schedule/get.js.map +0 -1
  232. package/dist/tools/field-map/delete.js +0 -37
  233. package/dist/tools/field-map/delete.js.map +0 -1
  234. package/dist/tools/field-map/get.js +0 -43
  235. package/dist/tools/field-map/get.js.map +0 -1
  236. package/dist/tools/ingestion/job-errors-list.js +0 -45
  237. package/dist/tools/ingestion/job-errors-list.js.map +0 -1
  238. package/dist/tools/ingestion/job-get.js +0 -42
  239. package/dist/tools/ingestion/job-get.js.map +0 -1
  240. package/dist/tools/ingestion/transaction-ignore.js +0 -51
  241. package/dist/tools/ingestion/transaction-ignore.js.map +0 -1
  242. package/dist/tools/match-rule/create.js +0 -67
  243. package/dist/tools/match-rule/create.js.map +0 -1
  244. package/dist/tools/match-rule/delete.js +0 -35
  245. package/dist/tools/match-rule/delete.js.map +0 -1
  246. package/dist/tools/match-rule/get.js +0 -32
  247. package/dist/tools/match-rule/get.js.map +0 -1
  248. package/dist/tools/match-rule/reorder.js +0 -45
  249. package/dist/tools/match-rule/reorder.js.map +0 -1
  250. package/dist/tools/matching/start.js +0 -81
  251. package/dist/tools/matching/start.js.map +0 -1
  252. package/dist/tools/report/count-exceptions.js +0 -46
  253. package/dist/tools/report/count-exceptions.js.map +0 -1
  254. package/dist/tools/report/count-matched.js +0 -47
  255. package/dist/tools/report/count-matched.js.map +0 -1
  256. package/dist/tools/report/count-transactions.js +0 -45
  257. package/dist/tools/report/count-transactions.js.map +0 -1
  258. package/dist/tools/report/count-unmatched.js +0 -45
  259. package/dist/tools/report/count-unmatched.js.map +0 -1
  260. package/dist/tools/report/export-exceptions.js +0 -48
  261. package/dist/tools/report/export-exceptions.js.map +0 -1
  262. package/dist/tools/report/export-matched.js +0 -49
  263. package/dist/tools/report/export-matched.js.map +0 -1
  264. package/dist/tools/report/export-summary.js +0 -49
  265. package/dist/tools/report/export-summary.js.map +0 -1
  266. package/dist/tools/report/export-unmatched.js +0 -49
  267. package/dist/tools/report/export-unmatched.js.map +0 -1
  268. package/dist/tools/report/export-variance.js +0 -48
  269. package/dist/tools/report/export-variance.js.map +0 -1
  270. package/dist/tools/report/matched.js +0 -48
  271. package/dist/tools/report/matched.js.map +0 -1
  272. package/dist/tools/report/summary.js +0 -43
  273. package/dist/tools/report/summary.js.map +0 -1
  274. package/dist/tools/report/unmatched.js +0 -48
  275. package/dist/tools/report/unmatched.js.map +0 -1
  276. package/dist/tools/report/variance.js +0 -48
  277. package/dist/tools/report/variance.js.map +0 -1
  278. package/dist/tools/source/archive.js +0 -46
  279. package/dist/tools/source/archive.js.map +0 -1
  280. package/dist/tools/source/get.js +0 -57
  281. package/dist/tools/source/get.js.map +0 -1
  282. package/dist/tools/source/restore.js +0 -39
  283. package/dist/tools/source/restore.js.map +0 -1
package/README.md CHANGED
@@ -44,13 +44,16 @@ as the matcher app, which also pins the embedded OpenAPI spec to the matched
44
44
  matcher version. The bearer token the relay forwards is never baked into the
45
45
  image.
46
46
 
47
- It speaks **Streamable HTTP** and binds `MCP_PORT` (default `4019`), exposing two
48
- endpoints:
47
+ It speaks **Streamable HTTP** and binds `MCP_PORT` (default `4019`). The server
48
+ also hosts the optional console copilot and voice routes:
49
49
 
50
50
  | Method | Path | Purpose |
51
51
  |--------|------------|--------------------------------------------------|
52
52
  | `GET` | `/healthz` | Plain liveness probe. |
53
53
  | `POST` | `/mcp` | The Streamable HTTP MCP endpoint clients connect to. |
54
+ | `POST` | `/agent/turns` | Stream an authenticated copilot turn when a provider is configured. |
55
+ | `GET` | `/agent/transcribe` | Report voice-transcription availability for the authenticated caller. |
56
+ | `POST` | `/agent/transcribe` | Transcribe an authenticated voice recording when configured. |
54
57
 
55
58
  Point any Streamable-HTTP MCP client at `POST /mcp` and send the matcher bearer
56
59
  token as the `Authorization` header.
@@ -73,6 +76,9 @@ Three options for `<mcp-url>`:
73
76
  - **Local matcher dev (repo clone).** `make up` brings the relay up as a compose
74
77
  service on `:4019` alongside the rest of the stack (`restart: unless-stopped`,
75
78
  so it stays up — no separate process to babysit). Use `http://localhost:4019/mcp`.
79
+ If Matcher runs on the host, stop both Compose `app` and `mcp` first and start
80
+ the host relay with `MATCHER_API_URL=http://localhost:4018`; the Compose relay
81
+ targets the Docker-only name `app:4018`. See [`../docs/development.md`](../docs/development.md).
76
82
  - **Run it standalone with `npx`.** `@lerianstudio/matcher-mcp` is a **public**
77
83
  package (Apache-2.0) — no registry auth needed. Start the relay (binds `:4019`)
78
84
  pointed at your Matcher API:
@@ -186,7 +192,7 @@ degrading to a default. Env names mirror the matcher Go service.
186
192
  | `MCP_PORT` | `4019` | Port the Streamable HTTP server binds (4018 is matcher, so this avoids a dev collision). |
187
193
  | `MATCHER_API_URL` | `http://localhost:4018` | Base URL the relay's own HTTP client calls for every proxied tool. In cluster deployments this is normally an internal service DNS name. Trailing slashes are trimmed. |
188
194
  | `MATCHER_PUBLIC_API_URL` | same as `MATCHER_API_URL` | Base URL handed back to the client's own Claude as the upload target by `ingestion_upload_begin`. MUST be client-reachable. Set this separately from `MATCHER_API_URL` when the relay's internal address isn't reachable from outside the cluster (hairpin NAT). Trailing slashes are trimmed. |
189
- | `MATCHER_TIMEOUT_MS` | `30000` | Per-request timeout the matcher HTTP client enforces via `AbortController`, matching matcher's 30s transaction timeout. |
195
+ | `MATCHER_TIMEOUT_MS` | `30000` | Per-request timeout the matcher HTTP client enforces via `AbortController`, matching matcher's 30s transaction timeout. Integer `1..2147483647`, the Node timer ceiling. |
190
196
  | `MAX_BODY_BYTES` | `1048576` (1 MiB) | Maximum accepted inbound request body size; the transport rejects an over-limit body with `413` before parsing, so an unbounded read cannot exhaust memory. |
191
197
  | `ENABLE_TELEMETRY` | `false` | Whether OpenTelemetry traces + metrics are exported. **Off** by default. |
192
198
  | `OTEL_EXPORTER_OTLP_ENDPOINT` | _(SDK default)_ | OTLP HTTP endpoint traces + metrics export to when telemetry is enabled. When unset, the OTel SDK falls back to its own default (`localhost:4318`). |
@@ -215,7 +221,7 @@ read server-side only, never sent to the browser.
215
221
  | `OPENROUTER_API_KEY` | _(unset)_ | OpenRouter API key. Required when `COPILOT_PROVIDER=openrouter`. Never logged, never returned. |
216
222
  | `COPILOT_MODEL` | _(provider default)_ | Model id passed to the selected provider. Anthropic falls back to its own default when unset; OpenRouter has **no** safe default and requires `COPILOT_MODEL` to be set explicitly (an Anthropic id 404s there), otherwise provider construction raises `CopilotModelRequiredError`. |
217
223
  | `COPILOT_MAX_TOOL_ITERATIONS` | `8` | Max read-tool rounds the agent loop runs before forcing a stop. Integer `1..20`. |
218
- | `COPILOT_MAX_TURN_TOKENS` | `300000` | Per-turn token ceiling; the loop truncates between rounds once crossed. Sized to clear a full 8-round turn at the measured ~34.3k tokens/round, so `COPILOT_MAX_TOOL_ITERATIONS` is what stops a turn. |
224
+ | `COPILOT_MAX_TURN_TOKENS` | `400000` | Per-turn ceiling on accumulated input+output; the loop truncates between rounds once crossed. Sized to clear a full 8-round turn at the measured ~39.7k tokens/round (2026-09-08), so `COPILOT_MAX_TOOL_ITERATIONS` is what stops a turn. Not a reservation and not a context-window limit — it is compared against usage already billed, so raising it costs nothing on a turn that ends normally. |
219
225
  | `COPILOT_RATE_LIMIT_PER_MIN` | `60` | Per-tenant token-bucket refill rate (turns/min). Per-tenant-overridable. |
220
226
  | `COPILOT_RATE_LIMIT_BURST` | `20` | Per-tenant token-bucket burst capacity. Per-tenant-overridable. |
221
227
  | `COPILOT_TENANT_CONFIG_PATH` | _(unset)_ | Path to a JSON file mapping `tenantId → { provider, model?, apiKey, maxTurnTokens?, rateLimitPerMin?, rateLimitBurst? }` for per-tenant provider/key overrides. Unset = one global config (BYOC single-tenant). |
@@ -264,13 +270,14 @@ full embedded OpenAPI spec.
264
270
  | `fee_schedule_*` | Manage fee schedules — create, list, get, update, delete, and simulate. |
265
271
  | `fee_rule_*` | Manage fee rules attached to schedules — create, list, get, update, delete. |
266
272
  | `match_rule_*` | Manage a context's match rules — create, list, get, update, delete, reorder. |
267
- | `context_*` | Manage reconciliation contexts — create, list, get, update, delete. |
268
- | `source_*` | Manage a context's data sources — create, list, get, update, delete. |
273
+ | `context_*` | Manage reconciliation contexts — create, list, get, update, archive, restore, setup progress, and next-step guidance. |
274
+ | `source_*` | Manage a context's data sources — create, list, get, update, archive, and restore. |
275
+ | `field_map_*` | Manage field maps — create, list by context, get by source, update, and delete. |
269
276
  | `match_run_*` | Drive reconciliation runs — start a run, list runs, get a run, inspect match groups. |
270
277
  | `exception_*` | Work reconciliation exceptions — list/get, history and comments (list/add/delete), per-exception action verbs (dispatch, open-dispute, force-match, adjust-entry), and cross-exception bulk actions (assign/resolve/dispatch). |
271
278
  | `dispute_*` | Manage the dispute lifecycle — list, get, close, submit evidence. |
272
- | `ingestion_*` | Inspect a context's import lifecycle — list jobs, get a job, list a job's per-row errors and transactions, search transactions, ignore a transaction. |
273
- | `dashboard_*` | Read a context's reporting dashboard — combined aggregates plus focused slices (cash-impact, match-rate, metrics, SLA, source-breakdown, volume). |
279
+ | `ingestion_*` | Inspect a context's import lifecycle — list jobs, get a job, list a job's per-row errors and transactions, search transactions, ignore a transaction, and upload files through `ingestion_upload` or `ingestion_upload_begin`. |
280
+ | `dashboard_*` | Read combined aggregates and focused slices (cash-impact, match-rate, metrics, SLA, source-breakdown, volume). The console uses the aggregate for volume, match rate and SLA, plus separate metrics, source-breakdown and cash-impact queries. Only standalone volume, match-rate and SLA reads have no console consumer. |
274
281
  | `report_*` | Pull a context's reports — paginated matched/unmatched/variance reads, the summary read, four counts (exceptions/matched/unmatched/transactions), and five base64 exports (exceptions/matched/summary/unmatched/variance). |
275
282
  | `workspace_usage` | Read the caller's own commercial state and free-tier consumption — plan, billing status, both trial axes (days remaining, matched lines against the cap), the expiry verdict, and the derived percentage consumed. Takes no arguments; the workspace comes from the relayed credential. |
276
283
 
@@ -288,11 +295,16 @@ HTTP client and a single token relay, so both surfaces map matcher errors
288
295
 
289
296
  ### Intentionally not curated
290
297
 
291
- Multipart **file upload** (`uploadFile`) and **document extraction**
292
- (`extractDocument`) carry a `multipart/form-data` binary body that a JSON tool
293
- cannot express, and the inbound **webhook receiver** (`processCallback`) is an
294
- inbound endpoint, not an operator action. These are deliberately left off the
295
- curated surface and remain reachable only via `matcher_invoke`.
298
+ `uploadFile` has curated replacements. Use `ingestion_upload` for a small
299
+ base64-in-JSON payload or `ingestion_upload_begin` for a real local file; the
300
+ relay rebuilds or brokers the multipart request. `matcher_invoke` cannot build
301
+ that binary body and points callers to the curated tools.
302
+
303
+ `extractDocument` accepts a raw document body and has no MCP path today; call
304
+ the Matcher HTTP API directly for that operation. Inbound callback and webhook
305
+ receivers (`processCallback`, aggregator webhooks, and hub events) stay
306
+ generic-only because they are machine- or hub-initiated deliveries rather than
307
+ operator actions.
296
308
 
297
309
  ## Project layout
298
310
 
@@ -309,7 +321,7 @@ mcp/
309
321
  └── src/
310
322
  ├── server.ts # entry point: builds the per-request server, wires tools + telemetry
311
323
  ├── config.ts # frozen, fail-loud bootstrap config
312
- ├── transport/ # Streamable HTTP transport (GET /healthz + POST /mcp)
324
+ ├── transport/ # HTTP routing for /healthz, /mcp, /agent/turns and /agent/transcribe
313
325
  ├── auth/ # request-scoped fail-closed bearer-token relay
314
326
  ├── matcher/ # Matcher HTTP client
315
327
  ├── observability/ # OpenTelemetry init + token-free tool instrumentation
@@ -330,6 +342,9 @@ pnpm test # run vitest
330
342
  pnpm dev # run with --watch
331
343
  ```
332
344
 
345
+ For the Compose and host-process topologies, including the `:4018`/`:4019`
346
+ proxy variables used by the UI, see [`../docs/development.md`](../docs/development.md).
347
+
333
348
  ## Toolchain
334
349
 
335
350
  Mirrors the `ui/` sub-project: **pnpm** (`pnpm@11.5.2`), Node `>=22`, ESLint flat
@@ -1,45 +1,16 @@
1
- // Request-scoped bearer-token relay — the security spine.
2
- //
3
- // Every tool that touches matcher data must use the *inbound caller's* bearer
4
- // token, resolved per request, and fail closed when it is absent. This module
5
- // owns that contract:
6
- //
7
- // - `runWithBearerToken(token, fn)` seeds an AsyncLocalStorage store at the
8
- // HTTP boundary (transport/http.ts) so handlers can recover the token even
9
- // when the SDK does not thread request headers through `extra`.
10
- // - `getRequestBearerToken(extra?)` returns the current caller's token,
11
- // preferring the SDK-native `extra.requestInfo.headers.authorization` when
12
- // present and falling back to the ALS store seeded at the boundary.
13
- // - `requireMatcherClient(extra?)` is the single chokepoint tools call: it
14
- // reads the token, throws `UnauthenticatedError` when it is missing / empty
15
- // / not a Bearer credential, and otherwise builds a per-request
16
- // `MatcherClient` from it.
17
- //
18
- // Security invariants (asserted by tests):
19
- // - The token is NEVER logged and NEVER placed in an error message.
20
- // - The tenant id MAY be decoded from the relayed JWT (getRequestTenantId),
21
- // but ONLY unverified and KEY-ONLY: used solely to SCOPE config, limits, and
22
- // telemetry to an organization, NEVER as an authorization input. Matcher
23
- // still owns enforcement via the verbatim relayed token, so the tenant
24
- // third rail stays intact (the decode is not trusted for authz). The token
25
- // and its decoded claims are never logged.
1
+ // Request-scoped caller-token relay; data tools fail closed without credentials.
2
+ // SDK request headers take precedence over the transport's AsyncLocalStorage.
3
+ // Never log tokens or claims. Unverified tenant claims scope config, limits and
4
+ // telemetry only; Matcher authorizes using the verbatim relayed bearer token.
26
5
  import { AsyncLocalStorage } from 'node:async_hooks';
27
6
  import { loadConfig } from '../config.js';
28
7
  import { createMatcherClient } from '../matcher/client.js';
29
8
  const authStorage = new AsyncLocalStorage();
30
- /**
31
- * Operator-facing remediation text shown when the caller did not relay a usable
32
- * bearer token. It deliberately contains no token material and no internal
33
- * detail — just what the operator must do to fix their connection.
34
- */
9
+ /** Credential remediation without token material or internal details. */
35
10
  export const UNAUTHENTICATED_REMEDIATION = 'No matcher credential was provided. Configure your MCP client to send an ' +
36
11
  '`Authorization: Bearer <your-matcher-jwt>` header on each request, then ' +
37
12
  'retry. This server holds no credentials of its own and relays yours verbatim.';
38
- /**
39
- * Thrown when a tool requires the caller's matcher credential but none was
40
- * relayed (missing, empty, or not a Bearer credential). Carries only the
41
- * operator remediation text — never any token material.
42
- */
13
+ /** Missing or unusable caller credential; contains remediation, never the token. */
43
14
  export class UnauthenticatedError extends Error {
44
15
  constructor(message = UNAUTHENTICATED_REMEDIATION) {
45
16
  super(message);
@@ -84,17 +55,7 @@ function parseBearer(authorization) {
84
55
  const token = match[1]?.trim();
85
56
  return token && token.length > 0 ? token : undefined;
86
57
  }
87
- /**
88
- * Resolve the current caller's bearer token, request-scoped.
89
- *
90
- * Resolution order:
91
- * 1. SDK-native `extra.requestInfo.headers.authorization`, when the handler
92
- * was given an `extra` carrying request headers.
93
- * 2. The ALS store seeded by `runWithBearerToken` at the HTTP boundary.
94
- *
95
- * Returns `undefined` when no usable Bearer credential is present (missing,
96
- * empty, or non-Bearer scheme) — callers fail closed on that.
97
- */
58
+ /** Prefer a usable SDK bearer, then transport ALS; absent credentials fail closed. */
98
59
  export function getRequestBearerToken(extra) {
99
60
  const fromExtra = parseBearer(authorizationFromExtra(extra));
100
61
  if (fromExtra) {
@@ -103,20 +64,9 @@ export function getRequestBearerToken(extra) {
103
64
  return parseBearer(authStorage.getStore()?.authorization);
104
65
  }
105
66
  /**
106
- * Decode the tenant id from the relayed JWT, request-scoped. UNVERIFIED and
107
- * KEY-ONLY: the value SCOPES config / rate limits / telemetry to an
108
- * organization — it is NEVER an authorization input. Matcher owns enforcement
109
- * via the verbatim relayed token, so the tenant third rail stays intact even
110
- * though this reads the claim.
111
- *
112
- * Reads the same request-scoped bearer `getRequestBearerToken` resolves, splits
113
- * the JWT, base64url-decodes the payload segment (Node stdlib `Buffer` — NO JWT
114
- * library), and reads the tenant claim. Matches the Go/lib-auth extraction order
115
- * (`claimString(claims, "tenant_id", "tenantId")`): prefers `tenant_id`, then
116
- * `tenantId`. Returns `undefined` on ANY malformed/absent token or a
117
- * missing/non-string/empty claim, and NEVER throws — a decode failure fails open
118
- * to the global-config path rather than breaking the turn. The token and its
119
- * claims are never logged.
67
+ * Unverified tenant key for config, limits and telemetry — NEVER authorization.
68
+ * Prefers tenant_id to tenantId. Malformed/absent claims yield undefined and
69
+ * select global config; neither the token nor its claims may enter logs.
120
70
  */
121
71
  export function getRequestTenantId(extra) {
122
72
  const token = getRequestBearerToken(extra);
@@ -146,15 +96,7 @@ export function getRequestTenantId(extra) {
146
96
  return undefined;
147
97
  }
148
98
  }
149
- /**
150
- * The single chokepoint every matcher-touching tool calls. Reads the caller's
151
- * request-scoped token and, when present, returns a `MatcherClient` bound to it.
152
- * Fails closed with `UnauthenticatedError` when the token is absent / empty /
153
- * not a Bearer credential.
154
- *
155
- * `config` is injectable for tests; production callers pass nothing and get the
156
- * process config.
157
- */
99
+ /** Build a caller-bound client or fail closed; config is injectable for tests. */
158
100
  export function requireMatcherClient(extra, config = loadConfig()) {
159
101
  const token = getRequestBearerToken(extra);
160
102
  if (!token) {
@@ -1 +1 @@
1
- {"version":3,"file":"request-token.js","sourceRoot":"","sources":["../../src/auth/request-token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request-token.js","sourceRoot":"","sources":["../../src/auth/request-token.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -1,10 +1,4 @@
1
- // Bootstrap configuration for the Matcher MCP server.
2
- //
3
- // Values are read from the environment once and frozen into a typed object.
4
- // Defaults are chosen to avoid collisions with matcher dev (matcher runs on
5
- // 4018; this server defaults to 4019). The matcher base URL is surfaced here
6
- // so the HTTP client (task 1.3.1) and the generic invoke / curated tools
7
- // consume a single source of truth instead of reading process.env directly.
1
+ // Environment configuration is loaded once and frozen for all relay consumers.
8
2
  import { loadTenantConfig } from './copilot/tenant-config.js';
9
3
  const DEFAULT_PORT = 4019;
10
4
  const DEFAULT_MATCHER_API_URL = 'http://localhost:4018';
@@ -13,52 +7,25 @@ const DEFAULT_MAX_BODY_BYTES = 1_048_576; // 1 MiB
13
7
  const DEFAULT_OTEL_SERVICE_NAME = 'matcher-mcp';
14
8
  const DEFAULT_COPILOT_PROVIDER = 'anthropic';
15
9
  const DEFAULT_COPILOT_MAX_TOOL_ITERATIONS = 8;
16
- const DEFAULT_COPILOT_MAX_TURN_TOKENS = 300_000;
10
+ const DEFAULT_COPILOT_MAX_TURN_TOKENS = 400_000;
17
11
  const DEFAULT_COPILOT_RATE_LIMIT_PER_MIN = 60;
18
12
  const DEFAULT_COPILOT_RATE_LIMIT_BURST = 20;
19
13
  const DEFAULT_SPEECH_TRANSCRIPTION_REGION = 'sa-east-1';
14
+ /** Node fires any timer longer than this after 1 ms instead of waiting. */
15
+ const MAX_TIMER_MS = 2_147_483_647;
20
16
  /**
21
- * Parse a port from a raw env string, falling back to the default when unset.
22
- * An explicitly-set but invalid value is a misconfiguration and throws, rather
23
- * than silently degrading to the default (fail-loud at boot).
17
+ * Default an unset integer; an explicitly-set value that is not a decimal
18
+ * integer in 1..max throws (fail-loud at boot). Exponent form is accepted:
19
+ * Helm renders an unquoted value of 1e6 or more as `2.097152e+06`.
24
20
  */
25
- function parsePort(raw, fallback) {
21
+ function parseBoundedInt(raw, fallback, key, expected, max = Number.MAX_SAFE_INTEGER) {
26
22
  if (raw === undefined || raw === '') {
27
23
  return fallback;
28
24
  }
29
25
  const value = Number(raw);
30
- if (!Number.isInteger(value) || value < 1 || value > 65535) {
31
- throw new Error(`invalid MCP_PORT: ${raw} (expected an integer in 1..65535)`);
32
- }
33
- return value;
34
- }
35
- /**
36
- * Parse a positive timeout (ms) from a raw env string, falling back to the
37
- * default when unset. An explicitly-set but invalid value is a misconfiguration
38
- * and throws, rather than silently degrading to the default (fail-loud at boot).
39
- */
40
- function parseTimeoutMs(raw, fallback) {
41
- if (raw === undefined || raw === '') {
42
- return fallback;
43
- }
44
- const value = Number(raw);
45
- if (!Number.isInteger(value) || value < 1) {
46
- throw new Error(`invalid MATCHER_TIMEOUT_MS: ${raw} (expected a positive integer of milliseconds)`);
47
- }
48
- return value;
49
- }
50
- /**
51
- * Parse a positive byte count from a raw env string, falling back to the default
52
- * when unset. An explicitly-set but invalid value is a misconfiguration and
53
- * throws, rather than silently degrading to the default (fail-loud at boot).
54
- */
55
- function parseMaxBodyBytes(raw, fallback) {
56
- if (raw === undefined || raw === '') {
57
- return fallback;
58
- }
59
- const value = Number(raw);
60
- if (!Number.isInteger(value) || value < 1) {
61
- throw new Error(`invalid MAX_BODY_BYTES: ${raw} (expected a positive integer of bytes)`);
26
+ const decimal = /^\d+(\.\d+)?(e\+?\d+)?$/.test(raw);
27
+ if (!decimal || !Number.isInteger(value) || value < 1 || value > max) {
28
+ throw new Error(`invalid ${key}: ${raw} (expected ${expected})`);
62
29
  }
63
30
  return value;
64
31
  }
@@ -82,10 +49,7 @@ function parseBool(raw, fallback, key) {
82
49
  throw new Error(`invalid ${key}: ${raw} (expected one of true, false, 1, 0)`);
83
50
  }
84
51
  /**
85
- * Parse the copilot provider from a raw env string, falling back to the default
86
- * when unset. Trimmed + case-insensitive. An explicitly-set but unrecognized
87
- * value is a misconfiguration and throws, rather than silently coercing to a
88
- * default (fail-loud at boot), mirroring parseBool.
52
+ * Default an unset provider; trim and case-fold explicit names, rejecting unknowns.
89
53
  */
90
54
  function parseCopilotProvider(raw, fallback) {
91
55
  if (raw === undefined || raw === '') {
@@ -97,36 +61,6 @@ function parseCopilotProvider(raw, fallback) {
97
61
  }
98
62
  throw new Error(`invalid COPILOT_PROVIDER: ${raw} (expected one of anthropic, openrouter)`);
99
63
  }
100
- /**
101
- * Parse the agent-loop iteration cap from a raw env string, falling back to the
102
- * default when unset. Bounded to 1..20. An explicitly-set but out-of-range or
103
- * non-integer value is a misconfiguration and throws (fail-loud at boot).
104
- */
105
- function parseMaxToolIterations(raw, fallback) {
106
- if (raw === undefined || raw === '') {
107
- return fallback;
108
- }
109
- const value = Number(raw);
110
- if (!Number.isInteger(value) || value < 1 || value > 20) {
111
- throw new Error(`invalid COPILOT_MAX_TOOL_ITERATIONS: ${raw} (expected an integer in 1..20)`);
112
- }
113
- return value;
114
- }
115
- /**
116
- * Parse a positive integer from a raw env string, falling back to the default
117
- * when unset. An explicitly-set non-positive or non-integer value is a
118
- * misconfiguration and throws (fail-loud at boot), mirroring parseMaxBodyBytes.
119
- */
120
- function parsePositiveInt(raw, fallback, key) {
121
- if (raw === undefined || raw === '') {
122
- return fallback;
123
- }
124
- const value = Number(raw);
125
- if (!Number.isInteger(value) || value < 1) {
126
- throw new Error(`invalid ${key}: ${raw} (expected a positive integer)`);
127
- }
128
- return value;
129
- }
130
64
  /**
131
65
  * Parse the speech-transcription endpoint. Unset means the capability is absent
132
66
  * (the shipping default, not an error). An explicitly-set value that is not an
@@ -162,11 +96,11 @@ export function loadConfig(env = process.env) {
162
96
  const otelEndpoint = env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
163
97
  const otelServiceName = env.OTEL_RESOURCE_SERVICE_NAME?.trim() || DEFAULT_OTEL_SERVICE_NAME;
164
98
  return Object.freeze({
165
- port: parsePort(env.MCP_PORT, DEFAULT_PORT),
99
+ port: parseBoundedInt(env.MCP_PORT, DEFAULT_PORT, 'MCP_PORT', 'an integer in 1..65535', 65535),
166
100
  matcherApiUrl: matcherApiUrl.replace(/\/+$/, ''),
167
101
  matcherPublicApiUrl: matcherPublicApiUrl.replace(/\/+$/, ''),
168
- timeoutMs: parseTimeoutMs(env.MATCHER_TIMEOUT_MS, DEFAULT_TIMEOUT_MS),
169
- maxBodyBytes: parseMaxBodyBytes(env.MAX_BODY_BYTES, DEFAULT_MAX_BODY_BYTES),
102
+ timeoutMs: parseBoundedInt(env.MATCHER_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, 'MATCHER_TIMEOUT_MS', 'an integer of milliseconds in 1..2147483647', MAX_TIMER_MS),
103
+ maxBodyBytes: parseBoundedInt(env.MAX_BODY_BYTES, DEFAULT_MAX_BODY_BYTES, 'MAX_BODY_BYTES', 'a positive integer of bytes'),
170
104
  enableTelemetry: parseBool(env.ENABLE_TELEMETRY, false, 'ENABLE_TELEMETRY'),
171
105
  otelExporterOtlpEndpoint: otelEndpoint || undefined,
172
106
  otelServiceName,
@@ -174,10 +108,10 @@ export function loadConfig(env = process.env) {
174
108
  openrouterApiKey: env.OPENROUTER_API_KEY?.trim() || undefined,
175
109
  copilotProvider: parseCopilotProvider(env.COPILOT_PROVIDER, DEFAULT_COPILOT_PROVIDER),
176
110
  copilotModel: env.COPILOT_MODEL?.trim() || undefined,
177
- copilotMaxToolIterations: parseMaxToolIterations(env.COPILOT_MAX_TOOL_ITERATIONS, DEFAULT_COPILOT_MAX_TOOL_ITERATIONS),
178
- copilotMaxTurnTokens: parsePositiveInt(env.COPILOT_MAX_TURN_TOKENS, DEFAULT_COPILOT_MAX_TURN_TOKENS, 'COPILOT_MAX_TURN_TOKENS'),
179
- copilotRateLimitPerMin: parsePositiveInt(env.COPILOT_RATE_LIMIT_PER_MIN, DEFAULT_COPILOT_RATE_LIMIT_PER_MIN, 'COPILOT_RATE_LIMIT_PER_MIN'),
180
- copilotRateLimitBurst: parsePositiveInt(env.COPILOT_RATE_LIMIT_BURST, DEFAULT_COPILOT_RATE_LIMIT_BURST, 'COPILOT_RATE_LIMIT_BURST'),
111
+ copilotMaxToolIterations: parseBoundedInt(env.COPILOT_MAX_TOOL_ITERATIONS, DEFAULT_COPILOT_MAX_TOOL_ITERATIONS, 'COPILOT_MAX_TOOL_ITERATIONS', 'an integer in 1..20', 20),
112
+ copilotMaxTurnTokens: parseBoundedInt(env.COPILOT_MAX_TURN_TOKENS, DEFAULT_COPILOT_MAX_TURN_TOKENS, 'COPILOT_MAX_TURN_TOKENS', 'a positive integer'),
113
+ copilotRateLimitPerMin: parseBoundedInt(env.COPILOT_RATE_LIMIT_PER_MIN, DEFAULT_COPILOT_RATE_LIMIT_PER_MIN, 'COPILOT_RATE_LIMIT_PER_MIN', 'a positive integer'),
114
+ copilotRateLimitBurst: parseBoundedInt(env.COPILOT_RATE_LIMIT_BURST, DEFAULT_COPILOT_RATE_LIMIT_BURST, 'COPILOT_RATE_LIMIT_BURST', 'a positive integer'),
181
115
  speechTranscriptionEndpoint: parseSpeechEndpoint(env.SPEECH_TRANSCRIPTION_ENDPOINT),
182
116
  speechTranscriptionRegion: env.SPEECH_TRANSCRIPTION_REGION?.trim() || DEFAULT_SPEECH_TRANSCRIPTION_REGION,
183
117
  speechTranscriptionApiKey: env.SPEECH_TRANSCRIPTION_API_KEY?.trim() || undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@
14
14
  // module — the request-scoped executor resolves it from the ALS store.
15
15
  import { instrumentCopilotTool, instrumentCopilotTurn, instrumentProviderStream, recordCopilotTokens, } from '../observability/otel.js';
16
16
  import { InvokeError, Invoker } from '../tools/generic/invoke.js';
17
+ import { finishWithError } from './sse.js';
17
18
  import { executeReadTool, WRITE_ALLOWLIST } from './tools.js';
18
19
  /**
19
20
  * Sum a round's input+output tokens, failing open: `undefined` usage (a provider
@@ -66,8 +67,7 @@ function emitProposal(call, index, sink) {
66
67
  // is latent; but a future one would execute WITHOUT it (a silently wrong
67
68
  // write). Refuse loudly instead of minting a lossy proposal.
68
69
  if (request.query !== undefined && Object.keys(request.query).length > 0) {
69
- sink.error('proposal_invalid', 'write proposals cannot carry query parameters');
70
- sink.done('end');
70
+ finishWithError(sink, 'proposal_invalid', 'write proposals cannot carry query parameters');
71
71
  return 'end';
72
72
  }
73
73
  const op = index.operations.get(call.name);
@@ -91,8 +91,7 @@ function emitProposal(call, index, sink) {
91
91
  }
92
92
  catch (err) {
93
93
  const detail = err instanceof InvokeError ? err.message : 'failed to prepare the proposal';
94
- sink.error('proposal_invalid', detail);
95
- sink.done('end');
94
+ finishWithError(sink, 'proposal_invalid', detail);
96
95
  return 'end';
97
96
  }
98
97
  }
@@ -145,9 +144,7 @@ export async function runAgentTurn(opts) {
145
144
  // renders as an error, mirroring the iteration-cap path.
146
145
  if (maxTurnTokens !== undefined && totalTokens >= maxTurnTokens) {
147
146
  setStop('token_limit');
148
- sink.error('turn_token_limit', `reached the per-turn token limit (${maxTurnTokens})`);
149
- sink.done('end');
150
- return;
147
+ return finishWithError(sink, 'turn_token_limit', `reached the per-turn token limit (${maxTurnTokens})`);
151
148
  }
152
149
  // ponytail: sequential tool exec; parallelize only if a turn routinely
153
150
  // fans out many reads. Matcher reads are cheap, so ordering keeps the SSE
@@ -174,8 +171,7 @@ export async function runAgentTurn(opts) {
174
171
  }
175
172
  // Ran `maxIterations` tool rounds and the model still wants more: hard stop.
176
173
  setStop('iteration_limit');
177
- sink.error('tool_iteration_limit', `reached the tool-call limit (${maxIterations})`);
178
- sink.done('end');
174
+ finishWithError(sink, 'tool_iteration_limit', `reached the tool-call limit (${maxIterations})`);
179
175
  });
180
176
  }
181
177
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/copilot/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/copilot/agent.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,gFAAgF;AAChF,iFAAiF;AACjF,yEAAyE;AACzE,0EAA0E;AAC1E,uCAAuC;AACvC,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,uEAAuE;AAEvE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AASjE,OAAO,EAAE,eAAe,EAAgB,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA+B7D;;;;;GAKG;AACH,SAAS,WAAW,CAAC,KAA2B;IAC9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3E,OAAO,KAAK,GAAG,MAAM,CAAA;AACvB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,YAAY,CACnB,IAAiB,EACjB,KAAqB,EACrB,IAAa;IAEb,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAgD,CAAA;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAoD,CAAA;IAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;IAC5B,IAAI,CAAC;QACH,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;YAC1C,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAA;QACF,0EAA0E;QAC1E,2EAA2E;QAC3E,4EAA4E;QAC5E,yEAAyE;QACzE,6DAA6D;QAC7D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzE,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,+CAA+C,CAAC,CAAA;YAC1F,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,OAAO,GACX,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC,OAAO;YACZ,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA;QACtC,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,IAAI;YACrB,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAChC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAC1B,CAAC,CAAE,OAAO,CAAC,IAAgC;YAC3C,CAAC,CAAC,EAAE,CAAA;QACR,IAAI,CAAC,QAAQ,CAAC;YACZ,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM;YACN,OAAO;SACR,CAAC,CAAA;QACF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrB,OAAO,UAAU,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GACV,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAA;QAC7E,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAA;QACjD,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;IAC9E,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,SAAS,CAAA;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,eAAe,CAAA;IAEvD,MAAM,qBAAqB,CACzB;QACE,QAAQ,EAAE,YAAY;QACtB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,aAAa;KACd,EACD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,WAAwC,CAAA;QAC5C,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;YAClE,uEAAuE;YACvE,8EAA8E;YAC9E,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACpB,OAAO,CAAC,SAAS,CAAC,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAC3C,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACrE,GAAG,EAAE,CACH,QAAQ,CAAC,UAAU,CACjB;gBACE,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,EACD,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAC7C,CACJ,CAAA;YAED,wEAAwE;YACxE,0EAA0E;YAC1E,mBAAmB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/C,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAExC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,wEAAwE;gBACxE,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,CAAA;gBACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAChB,OAAM;YACR,CAAC;YAED,yEAAyE;YACzE,wEAAwE;YACxE,sEAAsE;YACtE,yDAAyD;YACzD,IAAI,aAAa,KAAK,SAAS,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;gBAChE,OAAO,CAAC,aAAa,CAAC,CAAA;gBACtB,OAAO,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,qCAAqC,aAAa,GAAG,CAAC,CAAA;YACzG,CAAC;YAED,uEAAuE;YACvE,0EAA0E;YAC1E,uCAAuC;YACvC,MAAM,OAAO,GAAoB,EAAE,CAAA;YACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,iEAAiE;gBACjE,mEAAmE;gBACnE,oBAAoB;gBACpB,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;oBACxC,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;gBAC/B,mEAAmE;gBACnE,kEAAkE;gBAClE,MAAM,CAAC,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;gBAChF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,2EAA2E;YAC3E,yEAAyE;YACzE,WAAW,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAA;QACpD,CAAC;QAED,6EAA6E;QAC7E,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAC1B,eAAe,CAAC,IAAI,EAAE,sBAAsB,EAAE,gCAAgC,aAAa,GAAG,CAAC,CAAA;IACjG,CAAC,CACF,CAAA;AACH,CAAC"}