@lerianstudio/matcher-mcp 5.0.0-beta.98 → 5.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -11
- package/dist/config.js +16 -67
- package/dist/config.js.map +1 -1
- package/dist/copilot/system-prompt.js +17 -2
- package/dist/copilot/system-prompt.js.map +1 -1
- package/dist/matcher/client.js +1 -1
- package/dist/matcher/client.js.map +1 -1
- package/dist/matcher/idempotency.js +1 -1
- package/dist/matcher/idempotency.js.map +1 -1
- package/dist/observability/otel.js +79 -96
- package/dist/observability/otel.js.map +1 -1
- package/dist/spec/curated-operations.js +3 -3
- package/dist/spec/curated-operations.js.map +1 -1
- package/dist/spec/index.js +1 -1
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/openapi.yaml +69 -15
- package/dist/spec/schema-parity.js +2 -2
- package/dist/spec/schema-parity.js.map +1 -1
- package/dist/tools/context/create.js +13 -3
- package/dist/tools/context/create.js.map +1 -1
- package/dist/tools/context/list.js +1 -1
- package/dist/tools/context/list.js.map +1 -1
- package/dist/tools/context/setup-progress.js +1 -1
- package/dist/tools/context/setup-progress.js.map +1 -1
- package/dist/tools/context/shared.js +2 -9
- package/dist/tools/context/shared.js.map +1 -1
- package/dist/tools/context/update.js +10 -2
- package/dist/tools/context/update.js.map +1 -1
- package/dist/tools/curated-tool.js +2 -4
- package/dist/tools/curated-tool.js.map +1 -1
- package/dist/tools/dashboard/shared.js +3 -11
- package/dist/tools/dashboard/shared.js.map +1 -1
- package/dist/tools/dispute/list.js +1 -1
- package/dist/tools/dispute/list.js.map +1 -1
- package/dist/tools/dispute/shared.js +2 -9
- package/dist/tools/dispute/shared.js.map +1 -1
- package/dist/tools/exception/history.js +2 -2
- package/dist/tools/exception/history.js.map +1 -1
- package/dist/tools/exception/list.js +3 -3
- package/dist/tools/exception/list.js.map +1 -1
- package/dist/tools/exception/shared.js +1 -8
- package/dist/tools/exception/shared.js.map +1 -1
- package/dist/tools/fee-rule/list.js +1 -1
- package/dist/tools/fee-rule/list.js.map +1 -1
- package/dist/tools/fee-rule/shared.js +1 -9
- package/dist/tools/fee-rule/shared.js.map +1 -1
- package/dist/tools/fee-schedule/create.js +1 -1
- package/dist/tools/fee-schedule/create.js.map +1 -1
- package/dist/tools/fee-schedule/list.js +1 -1
- package/dist/tools/fee-schedule/list.js.map +1 -1
- package/dist/tools/fee-schedule/shared.js +2 -9
- package/dist/tools/fee-schedule/shared.js.map +1 -1
- package/dist/tools/field-map/create.js +1 -1
- package/dist/tools/field-map/create.js.map +1 -1
- package/dist/tools/field-map/list.js +1 -1
- package/dist/tools/field-map/list.js.map +1 -1
- package/dist/tools/field-map/shared.js +20 -36
- package/dist/tools/field-map/shared.js.map +1 -1
- package/dist/tools/field-map/update.js +3 -2
- package/dist/tools/field-map/update.js.map +1 -1
- package/dist/tools/generic/describe-operation.js +2 -8
- package/dist/tools/generic/describe-operation.js.map +1 -1
- package/dist/tools/generic/invoke.js +1 -1
- package/dist/tools/generic/invoke.js.map +1 -1
- package/dist/tools/generic/list-operations.js +1 -1
- package/dist/tools/generic/list-operations.js.map +1 -1
- package/dist/tools/ingestion/job-transactions-list.js +2 -2
- package/dist/tools/ingestion/job-transactions-list.js.map +1 -1
- package/dist/tools/ingestion/jobs-list.js +2 -2
- package/dist/tools/ingestion/jobs-list.js.map +1 -1
- package/dist/tools/ingestion/shared.js +1 -10
- package/dist/tools/ingestion/shared.js.map +1 -1
- package/dist/tools/ingestion/transactions-search.js +2 -2
- package/dist/tools/ingestion/transactions-search.js.map +1 -1
- package/dist/tools/ingestion/upload-begin.js +1 -1
- package/dist/tools/ingestion/upload-begin.js.map +1 -1
- package/dist/tools/ingestion/upload.js +1 -1
- package/dist/tools/ingestion/upload.js.map +1 -1
- package/dist/tools/match-rule/list.js +1 -1
- package/dist/tools/match-rule/list.js.map +1 -1
- package/dist/tools/match-rule/shared.js +1 -10
- package/dist/tools/match-rule/shared.js.map +1 -1
- package/dist/tools/matching/get.js +1 -1
- package/dist/tools/matching/get.js.map +1 -1
- package/dist/tools/matching/groups.js +1 -1
- package/dist/tools/matching/groups.js.map +1 -1
- package/dist/tools/matching/list.js +1 -1
- package/dist/tools/matching/list.js.map +1 -1
- package/dist/tools/matching/shared.js +1 -9
- package/dist/tools/matching/shared.js.map +1 -1
- package/dist/tools/report/index.js +5 -1
- package/dist/tools/report/index.js.map +1 -1
- package/dist/tools/report/shared.js +1 -12
- package/dist/tools/report/shared.js.map +1 -1
- package/dist/tools/shared-dispatch.js +4 -0
- package/dist/tools/shared-dispatch.js.map +1 -1
- package/dist/tools/source/create.js +9 -9
- package/dist/tools/source/create.js.map +1 -1
- package/dist/tools/source/list.js +1 -1
- package/dist/tools/source/list.js.map +1 -1
- package/dist/tools/source/shared.js +1 -9
- package/dist/tools/source/shared.js.map +1 -1
- package/dist/transport/body-limit.js +1 -6
- package/dist/transport/body-limit.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -192,7 +192,7 @@ degrading to a default. Env names mirror the matcher Go service.
|
|
|
192
192
|
| `MCP_PORT` | `4019` | Port the Streamable HTTP server binds (4018 is matcher, so this avoids a dev collision). |
|
|
193
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. |
|
|
194
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. |
|
|
195
|
-
| `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. |
|
|
196
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. |
|
|
197
197
|
| `ENABLE_TELEMETRY` | `false` | Whether OpenTelemetry traces + metrics are exported. **Off** by default. |
|
|
198
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`). |
|
|
@@ -309,14 +309,13 @@ operator actions.
|
|
|
309
309
|
## Project layout
|
|
310
310
|
|
|
311
311
|
This is a **standalone pnpm project** with its own lockfile — not a workspace
|
|
312
|
-
member
|
|
313
|
-
module at the repo root.
|
|
312
|
+
member. It shares no dependency tree with the Go module at the repo root.
|
|
314
313
|
|
|
315
314
|
```
|
|
316
315
|
mcp/
|
|
317
316
|
├── package.json # pnpm@11.5.2, Node >=22
|
|
318
317
|
├── tsconfig.json # strict, NodeNext (matches the MCP SDK's ESM packaging)
|
|
319
|
-
├── eslint.config.js # flat config
|
|
318
|
+
├── eslint.config.js # flat config
|
|
320
319
|
├── vitest.config.ts
|
|
321
320
|
└── src/
|
|
322
321
|
├── server.ts # entry point: builds the per-request server, wires tools + telemetry
|
|
@@ -342,14 +341,12 @@ pnpm test # run vitest
|
|
|
342
341
|
pnpm dev # run with --watch
|
|
343
342
|
```
|
|
344
343
|
|
|
345
|
-
For the Compose and host-process topologies,
|
|
346
|
-
|
|
344
|
+
For the Compose and host-process topologies, see
|
|
345
|
+
[`../docs/development.md`](../docs/development.md).
|
|
347
346
|
|
|
348
347
|
## Toolchain
|
|
349
348
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
`ui/` does not use one, so neither does this project.
|
|
349
|
+
**pnpm** (`pnpm@11.5.2`), Node `>=22`, ESLint flat config (`@eslint/js` +
|
|
350
|
+
`typescript-eslint`), and Vitest. There is no Prettier.
|
|
353
351
|
|
|
354
|
-
Build uses `tsc
|
|
355
|
-
deliberate divergence from `ui/`'s Vite build.
|
|
352
|
+
Build uses `tsc`: this is a Node service, not a browser bundle.
|
package/dist/config.js
CHANGED
|
@@ -11,44 +11,21 @@ const DEFAULT_COPILOT_MAX_TURN_TOKENS = 400_000;
|
|
|
11
11
|
const DEFAULT_COPILOT_RATE_LIMIT_PER_MIN = 60;
|
|
12
12
|
const DEFAULT_COPILOT_RATE_LIMIT_BURST = 20;
|
|
13
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;
|
|
14
16
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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`.
|
|
18
20
|
*/
|
|
19
|
-
function
|
|
21
|
+
function parseBoundedInt(raw, fallback, key, expected, max = Number.MAX_SAFE_INTEGER) {
|
|
20
22
|
if (raw === undefined || raw === '') {
|
|
21
23
|
return fallback;
|
|
22
24
|
}
|
|
23
25
|
const value = Number(raw);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Default an unset timeout; reject explicit invalid millisecond values at boot.
|
|
31
|
-
*/
|
|
32
|
-
function parseTimeoutMs(raw, fallback) {
|
|
33
|
-
if (raw === undefined || raw === '') {
|
|
34
|
-
return fallback;
|
|
35
|
-
}
|
|
36
|
-
const value = Number(raw);
|
|
37
|
-
if (!Number.isInteger(value) || value < 1) {
|
|
38
|
-
throw new Error(`invalid MATCHER_TIMEOUT_MS: ${raw} (expected a positive integer of milliseconds)`);
|
|
39
|
-
}
|
|
40
|
-
return value;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Default an unset body limit; reject explicit invalid byte counts at boot.
|
|
44
|
-
*/
|
|
45
|
-
function parseMaxBodyBytes(raw, fallback) {
|
|
46
|
-
if (raw === undefined || raw === '') {
|
|
47
|
-
return fallback;
|
|
48
|
-
}
|
|
49
|
-
const value = Number(raw);
|
|
50
|
-
if (!Number.isInteger(value) || value < 1) {
|
|
51
|
-
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})`);
|
|
52
29
|
}
|
|
53
30
|
return value;
|
|
54
31
|
}
|
|
@@ -84,34 +61,6 @@ function parseCopilotProvider(raw, fallback) {
|
|
|
84
61
|
}
|
|
85
62
|
throw new Error(`invalid COPILOT_PROVIDER: ${raw} (expected one of anthropic, openrouter)`);
|
|
86
63
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Parse the agent-loop iteration cap from a raw env string, falling back to the
|
|
89
|
-
* default when unset. Bounded to 1..20. An explicitly-set but out-of-range or
|
|
90
|
-
* non-integer value is a misconfiguration and throws (fail-loud at boot).
|
|
91
|
-
*/
|
|
92
|
-
function parseMaxToolIterations(raw, fallback) {
|
|
93
|
-
if (raw === undefined || raw === '') {
|
|
94
|
-
return fallback;
|
|
95
|
-
}
|
|
96
|
-
const value = Number(raw);
|
|
97
|
-
if (!Number.isInteger(value) || value < 1 || value > 20) {
|
|
98
|
-
throw new Error(`invalid COPILOT_MAX_TOOL_ITERATIONS: ${raw} (expected an integer in 1..20)`);
|
|
99
|
-
}
|
|
100
|
-
return value;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Default an unset integer; reject explicit non-positive or fractional values.
|
|
104
|
-
*/
|
|
105
|
-
function parsePositiveInt(raw, fallback, key) {
|
|
106
|
-
if (raw === undefined || raw === '') {
|
|
107
|
-
return fallback;
|
|
108
|
-
}
|
|
109
|
-
const value = Number(raw);
|
|
110
|
-
if (!Number.isInteger(value) || value < 1) {
|
|
111
|
-
throw new Error(`invalid ${key}: ${raw} (expected a positive integer)`);
|
|
112
|
-
}
|
|
113
|
-
return value;
|
|
114
|
-
}
|
|
115
64
|
/**
|
|
116
65
|
* Parse the speech-transcription endpoint. Unset means the capability is absent
|
|
117
66
|
* (the shipping default, not an error). An explicitly-set value that is not an
|
|
@@ -147,11 +96,11 @@ export function loadConfig(env = process.env) {
|
|
|
147
96
|
const otelEndpoint = env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
|
|
148
97
|
const otelServiceName = env.OTEL_RESOURCE_SERVICE_NAME?.trim() || DEFAULT_OTEL_SERVICE_NAME;
|
|
149
98
|
return Object.freeze({
|
|
150
|
-
port:
|
|
99
|
+
port: parseBoundedInt(env.MCP_PORT, DEFAULT_PORT, 'MCP_PORT', 'an integer in 1..65535', 65535),
|
|
151
100
|
matcherApiUrl: matcherApiUrl.replace(/\/+$/, ''),
|
|
152
101
|
matcherPublicApiUrl: matcherPublicApiUrl.replace(/\/+$/, ''),
|
|
153
|
-
timeoutMs:
|
|
154
|
-
maxBodyBytes:
|
|
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'),
|
|
155
104
|
enableTelemetry: parseBool(env.ENABLE_TELEMETRY, false, 'ENABLE_TELEMETRY'),
|
|
156
105
|
otelExporterOtlpEndpoint: otelEndpoint || undefined,
|
|
157
106
|
otelServiceName,
|
|
@@ -159,10 +108,10 @@ export function loadConfig(env = process.env) {
|
|
|
159
108
|
openrouterApiKey: env.OPENROUTER_API_KEY?.trim() || undefined,
|
|
160
109
|
copilotProvider: parseCopilotProvider(env.COPILOT_PROVIDER, DEFAULT_COPILOT_PROVIDER),
|
|
161
110
|
copilotModel: env.COPILOT_MODEL?.trim() || undefined,
|
|
162
|
-
copilotMaxToolIterations:
|
|
163
|
-
copilotMaxTurnTokens:
|
|
164
|
-
copilotRateLimitPerMin:
|
|
165
|
-
copilotRateLimitBurst:
|
|
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'),
|
|
166
115
|
speechTranscriptionEndpoint: parseSpeechEndpoint(env.SPEECH_TRANSCRIPTION_ENDPOINT),
|
|
167
116
|
speechTranscriptionRegion: env.SPEECH_TRANSCRIPTION_REGION?.trim() || DEFAULT_SPEECH_TRANSCRIPTION_REGION,
|
|
168
117
|
speechTranscriptionApiKey: env.SPEECH_TRANSCRIPTION_API_KEY?.trim() || undefined,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,EAAE,gBAAgB,EAA+B,MAAM,4BAA4B,CAAA;AA+I1F,MAAM,YAAY,GAAG,IAAI,CAAA;AACzB,MAAM,uBAAuB,GAAG,uBAAuB,CAAA;AACvD,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,MAAM,sBAAsB,GAAG,SAAS,CAAA,CAAC,QAAQ;AACjD,MAAM,yBAAyB,GAAG,aAAa,CAAA;AAC/C,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAC5C,MAAM,mCAAmC,GAAG,CAAC,CAAA;AAC7C,MAAM,+BAA+B,GAAG,OAAO,CAAA;AAC/C,MAAM,kCAAkC,GAAG,EAAE,CAAA;AAC7C,MAAM,gCAAgC,GAAG,EAAE,CAAA;AAC3C,MAAM,mCAAmC,GAAG,WAAW,CAAA;AAEvD
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -130,6 +130,17 @@ ask the operator which column carries each required field and wait for their \
|
|
|
130
130
|
answer. Never guess a column name, never infer one from the header text, and never \
|
|
131
131
|
propose a field map whose columns did not come from the engine or from the \
|
|
132
132
|
operator's own answer. A camt053 source maps itself and needs none of this.
|
|
133
|
+
- A CSV, JSON or XML file can mark each row as a debit or a credit in a column \
|
|
134
|
+
of its own instead of with a sign on the amount; such a file needs \
|
|
135
|
+
\`mapping.direction\` in its field map, an object with \`column\`, \`debit\` \
|
|
136
|
+
and \`credit\`. \`proposeMapping\` never proposes it. Before proposing a field \
|
|
137
|
+
map for a CSV, JSON or XML source, ask the operator whether the file shows a \
|
|
138
|
+
debit with a minus sign on the amount or with a marker in a column of its own. \
|
|
139
|
+
When it is a column, ask which column carries the marker and which value in it \
|
|
140
|
+
means a debit and which a credit. Add \`direction\` only from that answer, never \
|
|
141
|
+
from your own reading of the sample, and never offer a column or a value you saw \
|
|
142
|
+
in the sample for them to confirm. An update replaces the whole mapping, so carry \
|
|
143
|
+
an existing \`direction\` over unchanged unless the operator changes it.
|
|
133
144
|
- The pasted lines are the customer's own data. Do not echo them back, do not \
|
|
134
145
|
quote rows, and do not restate the sample. Refer to columns by name only when you \
|
|
135
146
|
explain what the mapping does.
|
|
@@ -203,6 +214,9 @@ calendar; a United States one on US_FED. If neither is clear, leave the calendar
|
|
|
203
214
|
unset (raw calendar days) and say that in the ledger.
|
|
204
215
|
- A fee deducted before the money arrives makes the context's feeNormalization NET \
|
|
205
216
|
and calls for a fee schedule; a fee billed separately is GROSS.
|
|
217
|
+
- A payment that arrives with the opposite sign of the invoice it settles makes the \
|
|
218
|
+
context's signConvention OPPOSITE; data where every amount is positive and only \
|
|
219
|
+
reversals are negative is SAME.
|
|
206
220
|
|
|
207
221
|
ASK, DO NOT GUESS. Where an answer does not determine a value, ask one short \
|
|
208
222
|
question instead of picking a plausible default. These are never inferred: the \
|
|
@@ -210,8 +224,9 @@ currency of a context or a fee schedule; the number of days in a date lag when \
|
|
|
210
224
|
they only said "later"; the size of a tolerance when they only said "a few cents \
|
|
211
225
|
off"; the settlement calendar when the country is not clear; which of 1:N and N:M \
|
|
212
226
|
applies when the description fits both; every fee rate, fixed charge and tier \
|
|
213
|
-
boundary;
|
|
214
|
-
|
|
227
|
+
boundary; the signConvention when they have not said how a payment appears next \
|
|
228
|
+
to its invoice; and every column name (those come from \`proposeMapping\` or \
|
|
229
|
+
from their own answer, per the mapping rule above).
|
|
215
230
|
|
|
216
231
|
FEES IN THEIR WORDS. Ask what is deducted and by whom, in money terms, and do the \
|
|
217
232
|
translation yourself. "2.9% plus R$0.39 per transaction" is ONE schedule with TWO \
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/copilot/system-prompt.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,aAAa;AACb,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,6EAA6E;AAC7E,qEAAqE;AACrE,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAa5E,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/copilot/system-prompt.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,aAAa;AACb,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,6EAA6E;AAC7E,qEAAqE;AACrE,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,gFAAgF;AAChF,6EAA6E;AAC7E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAa5E,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iEAuQ6C,CAAA;AAEjE;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
package/dist/matcher/client.js
CHANGED
|
@@ -134,7 +134,7 @@ export function createMatcherClient(baseUrl, bearerToken) {
|
|
|
134
134
|
? deriveDispatchIdempotencyKey(req.path, req.body)
|
|
135
135
|
: undefined);
|
|
136
136
|
if (idempotencyKey !== undefined) {
|
|
137
|
-
headers['x-idempotency
|
|
137
|
+
headers['x-idempotency'] = idempotencyKey;
|
|
138
138
|
}
|
|
139
139
|
let outgoingBody;
|
|
140
140
|
if (isFormData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/matcher/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/matcher/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Idempotency keys for the requests the relay must never send twice.
|
|
2
2
|
//
|
|
3
3
|
// WHY THIS IS IN THE TRANSPORT LAYER
|
|
4
|
-
// Matcher's idempotency is opt-in on `X-Idempotency
|
|
4
|
+
// Matcher's idempotency is opt-in on `X-Idempotency`, so an unkeyed request
|
|
5
5
|
// is a request nobody can deduplicate. The relay aborts on its own
|
|
6
6
|
// `MATCHER_TIMEOUT_MS`: a dispatch that succeeds slowly at Jira/ServiceNow still
|
|
7
7
|
// hands the model a transport error, the model retries the tool, and a second
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/matcher/idempotency.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,qCAAqC;AACrC,
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/matcher/idempotency.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,qCAAqC;AACrC,4EAA4E;AAC5E,mEAAmE;AACnE,iFAAiF;AACjF,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,kFAAkF;AAClF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,wBAAwB;AACxB,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,iDAAiD;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,iEAAiE;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAA;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,EAAE;KACR,KAAK,CACJ,uBAAuB,EACvB,yDAAyD,CAC1D;KACA,QAAQ,EAAE;KACV,QAAQ,CACP,sEAAsE;IACpE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,uEAAuE;IACvE,sBAAsB,CACzB,CAAA;AAEH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAY,EACZ,IAAa;IAEb,OAAO,YAAY,UAAU,CAAC,QAAQ,CAAC;SACpC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;SAC3D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,IAAI,IAAI,IAAI,CAAA;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAA+B,CAAA;IAC9C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACjB,yEAAyE;QACzE,uEAAuE;QACvE,oEAAoE;QACpE,4CAA4C;SAC3C,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;SAC1C,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACZ,GAAG;QACH,GAAG,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC,GAAI,MAAM,CAAC,GAAG,CAAe,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YACpD,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAClC,CAAC,CACL,CAAA;AACH,CAAC"}
|
|
@@ -98,7 +98,7 @@ export async function shutdownTelemetry() {
|
|
|
98
98
|
sdk = undefined;
|
|
99
99
|
await stopping.shutdown();
|
|
100
100
|
}
|
|
101
|
-
/** Whether telemetry is currently active. Exposed for tests
|
|
101
|
+
/** Whether telemetry is currently active. Exposed for tests. */
|
|
102
102
|
export function isTelemetryEnabled() {
|
|
103
103
|
return sdk !== undefined;
|
|
104
104
|
}
|
|
@@ -148,11 +148,60 @@ function matcherStatusOf(err) {
|
|
|
148
148
|
}
|
|
149
149
|
return undefined;
|
|
150
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* A tool result fails when it carries `isError: true`. Its matcher status is the
|
|
153
|
+
* `status` of a last text block that parses as JSON: the payload `toToolError` writes.
|
|
154
|
+
*/
|
|
155
|
+
function toolResultOutcome(result) {
|
|
156
|
+
const { isError, content } = (result ?? {});
|
|
157
|
+
if (isError !== true) {
|
|
158
|
+
return { failed: false };
|
|
159
|
+
}
|
|
160
|
+
const last = Array.isArray(content) ? content.at(-1) : undefined;
|
|
161
|
+
if (typeof last?.text !== 'string') {
|
|
162
|
+
return { failed: true };
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
return { failed: true, status: matcherStatusOf(JSON.parse(last.text)) };
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return { failed: true };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Run `fn` in an active span carrying the defined `attrs`. A throw fails the span
|
|
173
|
+
* and is re-thrown, recording only the matcher status, never the message.
|
|
174
|
+
* `outcomeOf` grades a returned value; `onEnd` runs just before the span ends.
|
|
175
|
+
*/
|
|
176
|
+
async function withSpan(name, attrs, fn, hooks = {}) {
|
|
177
|
+
return getTracer().startActiveSpan(name, async (span) => {
|
|
178
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
179
|
+
if (value !== undefined) {
|
|
180
|
+
span.setAttribute(key, value);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
let outcome = { failed: true };
|
|
184
|
+
try {
|
|
185
|
+
const result = await fn();
|
|
186
|
+
outcome = hooks.outcomeOf?.(result) ?? { failed: false };
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
outcome = { failed: true, status: matcherStatusOf(err) };
|
|
191
|
+
throw err;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
span.setStatus({ code: outcome.failed ? SpanStatusCode.ERROR : SpanStatusCode.OK });
|
|
195
|
+
hooks.onEnd?.(outcome, span);
|
|
196
|
+
span.end();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
151
200
|
/**
|
|
152
201
|
* Wrap a tool's execution in a span + metrics. Opens a span named
|
|
153
|
-
* `mcp.tool.<name
|
|
154
|
-
*
|
|
155
|
-
* thrown value carries one.
|
|
202
|
+
* `mcp.tool.<name>` and records the call counter and the latency histogram. A
|
|
203
|
+
* throw or a returned `isError: true` result marks the call error, with the
|
|
204
|
+
* matcher HTTP status when the thrown value or the result's payload carries one.
|
|
156
205
|
*
|
|
157
206
|
* Records ONLY: the tool name, the outcome (ok/error), and — on a matcher
|
|
158
207
|
* failure — the matcher HTTP status. It NEVER records the caller's token, the
|
|
@@ -161,43 +210,23 @@ function matcherStatusOf(err) {
|
|
|
161
210
|
* so it is always safe to wrap a handler with it.
|
|
162
211
|
*/
|
|
163
212
|
export async function instrumentToolCall(name, fn) {
|
|
164
|
-
const tracer = getTracer();
|
|
165
213
|
const counter = getToolCallCounter();
|
|
166
214
|
const histogram = getToolLatencyHistogram();
|
|
167
215
|
const startedAt = Date.now();
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const result = await fn();
|
|
172
|
-
span.setAttribute(ATTR_OUTCOME, OUTCOME_OK);
|
|
173
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
174
|
-
counter.add(1, { [ATTR_TOOL_NAME]: name, [ATTR_OUTCOME]: OUTCOME_OK });
|
|
175
|
-
return result;
|
|
176
|
-
}
|
|
177
|
-
catch (err) {
|
|
178
|
-
const status = matcherStatusOf(err);
|
|
179
|
-
span.setAttribute(ATTR_OUTCOME, OUTCOME_ERROR);
|
|
180
|
-
if (status !== undefined) {
|
|
181
|
-
span.setAttribute(ATTR_MATCHER_STATUS, status);
|
|
182
|
-
}
|
|
183
|
-
// Record only that the call failed and (when present) the matcher status.
|
|
184
|
-
// The error message is NOT recorded — it could be operator-influenced and
|
|
185
|
-
// is never worth the leakage risk.
|
|
186
|
-
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
216
|
+
return withSpan(`mcp.tool.${name}`, { [ATTR_TOOL_NAME]: name }, fn, {
|
|
217
|
+
outcomeOf: toolResultOutcome,
|
|
218
|
+
onEnd: ({ failed, status }, span) => {
|
|
187
219
|
const attrs = {
|
|
188
220
|
[ATTR_TOOL_NAME]: name,
|
|
189
|
-
[ATTR_OUTCOME]: OUTCOME_ERROR,
|
|
221
|
+
[ATTR_OUTCOME]: failed ? OUTCOME_ERROR : OUTCOME_OK,
|
|
190
222
|
};
|
|
191
223
|
if (status !== undefined) {
|
|
192
224
|
attrs[ATTR_MATCHER_STATUS] = status;
|
|
193
225
|
}
|
|
226
|
+
span.setAttributes(attrs);
|
|
194
227
|
counter.add(1, attrs);
|
|
195
|
-
throw err;
|
|
196
|
-
}
|
|
197
|
-
finally {
|
|
198
228
|
histogram.record(Date.now() - startedAt, { [ATTR_TOOL_NAME]: name });
|
|
199
|
-
|
|
200
|
-
}
|
|
229
|
+
},
|
|
201
230
|
});
|
|
202
231
|
}
|
|
203
232
|
// --- Copilot agent-loop instrumentation (task 4.2.1) ---------------------------
|
|
@@ -208,11 +237,8 @@ export async function instrumentToolCall(name, fn) {
|
|
|
208
237
|
// span active, `injectTraceContext` in the matcher client writes a real
|
|
209
238
|
// traceparent instead of an empty context.
|
|
210
239
|
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
// rather than throwing, so `instrumentToolCall`'s catch never fires and every
|
|
214
|
-
// span would falsely read `ok`. `instrumentCopilotTool` inspects the returned
|
|
215
|
-
// result's `isError` instead.
|
|
240
|
+
// `instrumentCopilotTool` grades results through `toolResultOutcome` too, ignoring the
|
|
241
|
+
// status; it keeps its own span name and outcome key and stays out of `mcp.tool.*` metrics.
|
|
216
242
|
/** Lazily-created copilot metrics, shared across turns (no-op when telemetry off). */
|
|
217
243
|
let copilotTurnCounter;
|
|
218
244
|
let copilotTurnDuration;
|
|
@@ -248,7 +274,6 @@ function getCopilotTokenCounter() {
|
|
|
248
274
|
* safe: with telemetry disabled this is just `fn(setStop)`.
|
|
249
275
|
*/
|
|
250
276
|
export async function instrumentCopilotTurn(attrs, fn) {
|
|
251
|
-
const tracer = getTracer();
|
|
252
277
|
const counter = getCopilotTurnCounter();
|
|
253
278
|
const histogram = getCopilotTurnDuration();
|
|
254
279
|
const startedAt = Date.now();
|
|
@@ -256,33 +281,24 @@ export async function instrumentCopilotTurn(attrs, fn) {
|
|
|
256
281
|
const setStop = (next) => {
|
|
257
282
|
stop = next;
|
|
258
283
|
};
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
span.setAttribute(ATTR_COPILOT_MAX_ITERATIONS, attrs.maxIterations);
|
|
268
|
-
try {
|
|
269
|
-
await fn(setStop);
|
|
270
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
271
|
-
}
|
|
272
|
-
catch (err) {
|
|
284
|
+
const spanAttrs = {
|
|
285
|
+
[ATTR_COPILOT_PROVIDER]: attrs.provider,
|
|
286
|
+
[ATTR_COPILOT_MODEL]: attrs.model,
|
|
287
|
+
[ATTR_COPILOT_TENANT]: attrs.tenant,
|
|
288
|
+
[ATTR_COPILOT_MAX_ITERATIONS]: attrs.maxIterations,
|
|
289
|
+
};
|
|
290
|
+
return withSpan('copilot.turn', spanAttrs, () => fn(setStop), {
|
|
291
|
+
onEnd: ({ failed }, span) => {
|
|
273
292
|
// A crashed turn is its own terminal label: without this it defaults to
|
|
274
293
|
// 'end' and records under the clean-completion series, hiding the error
|
|
275
294
|
// rate in the very copilot.turns counter that scopes it.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
finally {
|
|
295
|
+
if (failed) {
|
|
296
|
+
stop = 'error';
|
|
297
|
+
}
|
|
281
298
|
span.setAttribute(ATTR_COPILOT_STOP, stop);
|
|
282
299
|
counter.add(1, { [ATTR_COPILOT_PROVIDER]: attrs.provider, [ATTR_COPILOT_STOP]: stop });
|
|
283
300
|
histogram.record(Date.now() - startedAt, { [ATTR_COPILOT_PROVIDER]: attrs.provider });
|
|
284
|
-
|
|
285
|
-
}
|
|
301
|
+
},
|
|
286
302
|
});
|
|
287
303
|
}
|
|
288
304
|
/**
|
|
@@ -290,25 +306,7 @@ export async function instrumentCopilotTurn(attrs, fn) {
|
|
|
290
306
|
* only provider/model (no prompt content, no token). No-op safe.
|
|
291
307
|
*/
|
|
292
308
|
export async function instrumentProviderStream(attrs, fn) {
|
|
293
|
-
|
|
294
|
-
return tracer.startActiveSpan('copilot.provider.stream', async (span) => {
|
|
295
|
-
span.setAttribute(ATTR_COPILOT_PROVIDER, attrs.provider);
|
|
296
|
-
if (attrs.model !== undefined) {
|
|
297
|
-
span.setAttribute(ATTR_COPILOT_MODEL, attrs.model);
|
|
298
|
-
}
|
|
299
|
-
try {
|
|
300
|
-
const result = await fn();
|
|
301
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
302
|
-
return result;
|
|
303
|
-
}
|
|
304
|
-
catch (err) {
|
|
305
|
-
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
306
|
-
throw err;
|
|
307
|
-
}
|
|
308
|
-
finally {
|
|
309
|
-
span.end();
|
|
310
|
-
}
|
|
311
|
-
});
|
|
309
|
+
return withSpan('copilot.provider.stream', { [ATTR_COPILOT_PROVIDER]: attrs.provider, [ATTR_COPILOT_MODEL]: attrs.model }, fn);
|
|
312
310
|
}
|
|
313
311
|
/**
|
|
314
312
|
* Wrap one tool execution in a `copilot.tool.<name>` active child span. The tool
|
|
@@ -319,26 +317,11 @@ export async function instrumentProviderStream(attrs, fn) {
|
|
|
319
317
|
* unexpected throw (defensive; the executor does not throw).
|
|
320
318
|
*/
|
|
321
319
|
export async function instrumentCopilotTool(name, fn) {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const outcome = result.isError === true ? OUTCOME_ERROR : OUTCOME_OK;
|
|
328
|
-
span.setAttribute(ATTR_COPILOT_TOOL_OUTCOME, outcome);
|
|
329
|
-
span.setStatus({
|
|
330
|
-
code: result.isError === true ? SpanStatusCode.ERROR : SpanStatusCode.OK,
|
|
331
|
-
});
|
|
332
|
-
return result;
|
|
333
|
-
}
|
|
334
|
-
catch (err) {
|
|
335
|
-
span.setAttribute(ATTR_COPILOT_TOOL_OUTCOME, OUTCOME_ERROR);
|
|
336
|
-
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
337
|
-
throw err;
|
|
338
|
-
}
|
|
339
|
-
finally {
|
|
340
|
-
span.end();
|
|
341
|
-
}
|
|
320
|
+
return withSpan(`copilot.tool.${name}`, { [ATTR_TOOL_NAME]: name }, fn, {
|
|
321
|
+
outcomeOf: toolResultOutcome,
|
|
322
|
+
onEnd: ({ failed }, span) => {
|
|
323
|
+
span.setAttribute(ATTR_COPILOT_TOOL_OUTCOME, failed ? OUTCOME_ERROR : OUTCOME_OK);
|
|
324
|
+
},
|
|
342
325
|
});
|
|
343
326
|
}
|
|
344
327
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/observability/otel.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,mFAAmF;AACnF,oFAAoF;AAEpF,OAAO,EACL,OAAO,EACP,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/observability/otel.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// covers — the registry the drift guard checks against.
|
|
3
3
|
//
|
|
4
4
|
// WHY THIS EXISTS
|
|
5
|
-
// The server exposes two surfaces over the
|
|
5
|
+
// The server exposes two surfaces over the matcher spec:
|
|
6
6
|
// 1. The GENERIC trio (matcher_list_operations / describe / invoke) reads the
|
|
7
7
|
// spec at runtime, so it tracks the spec automatically. `load.test.ts`
|
|
8
|
-
// already pins `index.operations.size
|
|
9
|
-
// 2. The CURATED tools (the
|
|
8
|
+
// already pins `index.operations.size` as that side's canary.
|
|
9
|
+
// 2. The CURATED tools (the hand-written Zod tools under `src/tools/*/`)
|
|
10
10
|
// hard-code their own method+path. NOTHING in those tools consults the
|
|
11
11
|
// spec, and their unit tests assert against the same hard-coded literal —
|
|
12
12
|
// tautological w.r.t. the spec. So if matcher renames or removes an
|