@lerianstudio/matcher-mcp 5.0.0-beta.64 → 5.0.0-beta.66
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/dist/auth/request-token.js +11 -69
- package/dist/auth/request-token.js.map +1 -1
- package/dist/config.js +5 -20
- package/dist/config.js.map +1 -1
- package/dist/copilot/agent.js +5 -9
- package/dist/copilot/agent.js.map +1 -1
- package/dist/copilot/provider-anthropic.js +2 -16
- package/dist/copilot/provider-anthropic.js.map +1 -1
- package/dist/copilot/provider-openrouter.js +5 -18
- package/dist/copilot/provider-openrouter.js.map +1 -1
- package/dist/copilot/provider-shared.js +11 -0
- package/dist/copilot/provider-shared.js.map +1 -1
- package/dist/copilot/speech-provider.js +84 -0
- package/dist/copilot/speech-provider.js.map +1 -0
- package/dist/copilot/sse.js +5 -0
- package/dist/copilot/sse.js.map +1 -1
- package/dist/copilot/test_helpers.js +50 -0
- package/dist/copilot/test_helpers.js.map +1 -0
- package/dist/copilot/tools.js +14 -65
- package/dist/copilot/tools.js.map +1 -1
- package/dist/copilot/transcribe-handler.js +8 -93
- package/dist/copilot/transcribe-handler.js.map +1 -1
- package/dist/copilot/turn-request.js +76 -0
- package/dist/copilot/turn-request.js.map +1 -0
- package/dist/copilot/turns-handler.js +11 -102
- package/dist/copilot/turns-handler.js.map +1 -1
- package/dist/observability/otel.js +7 -29
- package/dist/observability/otel.js.map +1 -1
- package/dist/server.js +12 -81
- package/dist/server.js.map +1 -1
- package/dist/spec/enum-policy.js +9 -41
- package/dist/spec/enum-policy.js.map +1 -1
- package/dist/spec/schema-parity.js +4 -18
- package/dist/spec/schema-parity.js.map +1 -1
- package/dist/tools/context/list.js +7 -34
- package/dist/tools/context/list.js.map +1 -1
- package/dist/tools/context/shared.js +3 -29
- package/dist/tools/context/shared.js.map +1 -1
- package/dist/tools/context/update.js +2 -3
- package/dist/tools/context/update.js.map +1 -1
- package/dist/tools/dashboard/aggregates.js +2 -8
- package/dist/tools/dashboard/aggregates.js.map +1 -1
- package/dist/tools/dashboard/cash-impact.js +2 -8
- package/dist/tools/dashboard/cash-impact.js.map +1 -1
- package/dist/tools/dashboard/match-rate.js +2 -8
- package/dist/tools/dashboard/match-rate.js.map +1 -1
- package/dist/tools/dashboard/metrics.js +2 -8
- package/dist/tools/dashboard/metrics.js.map +1 -1
- package/dist/tools/dashboard/shared.js +5 -26
- package/dist/tools/dashboard/shared.js.map +1 -1
- package/dist/tools/dashboard/sla.js +2 -8
- package/dist/tools/dashboard/sla.js.map +1 -1
- package/dist/tools/dashboard/source-breakdown.js +2 -8
- package/dist/tools/dashboard/source-breakdown.js.map +1 -1
- package/dist/tools/dashboard/volume.js +2 -8
- package/dist/tools/dashboard/volume.js.map +1 -1
- package/dist/tools/dispute/close.js +2 -3
- package/dist/tools/dispute/close.js.map +1 -1
- package/dist/tools/dispute/list.js +16 -46
- package/dist/tools/dispute/list.js.map +1 -1
- package/dist/tools/dispute/shared.js +3 -29
- package/dist/tools/dispute/shared.js.map +1 -1
- package/dist/tools/dispute/submit-evidence.js +2 -3
- package/dist/tools/dispute/submit-evidence.js.map +1 -1
- package/dist/tools/exception/adjust-entry.js +2 -3
- package/dist/tools/exception/adjust-entry.js.map +1 -1
- package/dist/tools/exception/history.js +6 -23
- package/dist/tools/exception/history.js.map +1 -1
- package/dist/tools/exception/list.js +9 -53
- package/dist/tools/exception/list.js.map +1 -1
- package/dist/tools/exception/shared.js +3 -29
- package/dist/tools/exception/shared.js.map +1 -1
- package/dist/tools/fee-rule/create.js +2 -3
- package/dist/tools/fee-rule/create.js.map +1 -1
- package/dist/tools/fee-rule/list.js +7 -28
- package/dist/tools/fee-rule/list.js.map +1 -1
- package/dist/tools/fee-rule/shared.js +3 -29
- package/dist/tools/fee-rule/shared.js.map +1 -1
- package/dist/tools/fee-rule/update.js +2 -3
- package/dist/tools/fee-rule/update.js.map +1 -1
- package/dist/tools/fee-schedule/list.js +6 -23
- package/dist/tools/fee-schedule/list.js.map +1 -1
- package/dist/tools/fee-schedule/shared.js +3 -29
- package/dist/tools/fee-schedule/shared.js.map +1 -1
- package/dist/tools/fee-schedule/simulate.js +2 -3
- package/dist/tools/fee-schedule/simulate.js.map +1 -1
- package/dist/tools/fee-schedule/update.js +2 -3
- package/dist/tools/fee-schedule/update.js.map +1 -1
- package/dist/tools/field-map/get.js +2 -5
- package/dist/tools/field-map/get.js.map +1 -1
- package/dist/tools/field-map/list.js +7 -28
- package/dist/tools/field-map/list.js.map +1 -1
- package/dist/tools/field-map/shared.js +3 -29
- package/dist/tools/field-map/shared.js.map +1 -1
- package/dist/tools/generic/invoke.js +4 -26
- package/dist/tools/generic/invoke.js.map +1 -1
- package/dist/tools/ingestion/job-errors-list.js +2 -5
- package/dist/tools/ingestion/job-errors-list.js.map +1 -1
- package/dist/tools/ingestion/job-get.js +2 -5
- package/dist/tools/ingestion/job-get.js.map +1 -1
- package/dist/tools/ingestion/job-transactions-list.js +8 -39
- package/dist/tools/ingestion/job-transactions-list.js.map +1 -1
- package/dist/tools/ingestion/jobs-list.js +7 -34
- package/dist/tools/ingestion/jobs-list.js.map +1 -1
- package/dist/tools/ingestion/shared.js +3 -29
- package/dist/tools/ingestion/shared.js.map +1 -1
- package/dist/tools/ingestion/transaction-ignore.js +2 -5
- package/dist/tools/ingestion/transaction-ignore.js.map +1 -1
- package/dist/tools/ingestion/transactions-search.js +7 -43
- package/dist/tools/ingestion/transactions-search.js.map +1 -1
- package/dist/tools/input-fields.js +36 -0
- package/dist/tools/input-fields.js.map +1 -0
- package/dist/tools/match-rule/delete.js +2 -4
- package/dist/tools/match-rule/delete.js.map +1 -1
- package/dist/tools/match-rule/get.js +2 -4
- package/dist/tools/match-rule/get.js.map +1 -1
- package/dist/tools/match-rule/list.js +7 -31
- package/dist/tools/match-rule/list.js.map +1 -1
- package/dist/tools/match-rule/shared.js +3 -29
- package/dist/tools/match-rule/shared.js.map +1 -1
- package/dist/tools/match-rule/update.js +4 -8
- package/dist/tools/match-rule/update.js.map +1 -1
- package/dist/tools/matching/groups.js +3 -12
- package/dist/tools/matching/groups.js.map +1 -1
- package/dist/tools/matching/list.js +7 -31
- package/dist/tools/matching/list.js.map +1 -1
- package/dist/tools/matching/shared.js +3 -31
- package/dist/tools/matching/shared.js.map +1 -1
- package/dist/tools/query-handler.js +8 -0
- package/dist/tools/query-handler.js.map +1 -0
- package/dist/tools/report/count-exceptions.js +2 -8
- package/dist/tools/report/count-exceptions.js.map +1 -1
- package/dist/tools/report/count-matched.js +2 -8
- package/dist/tools/report/count-matched.js.map +1 -1
- package/dist/tools/report/count-transactions.js +2 -8
- package/dist/tools/report/count-transactions.js.map +1 -1
- package/dist/tools/report/count-unmatched.js +2 -8
- package/dist/tools/report/count-unmatched.js.map +1 -1
- package/dist/tools/report/export-exceptions.js +2 -8
- package/dist/tools/report/export-exceptions.js.map +1 -1
- package/dist/tools/report/export-matched.js +2 -8
- package/dist/tools/report/export-matched.js.map +1 -1
- package/dist/tools/report/export-summary.js +2 -8
- package/dist/tools/report/export-summary.js.map +1 -1
- package/dist/tools/report/export-unmatched.js +2 -8
- package/dist/tools/report/export-unmatched.js.map +1 -1
- package/dist/tools/report/export-variance.js +2 -8
- package/dist/tools/report/export-variance.js.map +1 -1
- package/dist/tools/report/matched.js +2 -8
- package/dist/tools/report/matched.js.map +1 -1
- package/dist/tools/report/shared.js +9 -55
- package/dist/tools/report/shared.js.map +1 -1
- package/dist/tools/report/summary.js +2 -8
- package/dist/tools/report/summary.js.map +1 -1
- package/dist/tools/report/unmatched.js +2 -8
- package/dist/tools/report/unmatched.js.map +1 -1
- package/dist/tools/report/variance.js +2 -8
- package/dist/tools/report/variance.js.map +1 -1
- package/dist/tools/request-fields.js +17 -0
- package/dist/tools/request-fields.js.map +1 -0
- package/dist/tools/shared-dispatch.js +38 -0
- package/dist/tools/shared-dispatch.js.map +1 -0
- package/dist/tools/source/archive.js +2 -5
- package/dist/tools/source/archive.js.map +1 -1
- package/dist/tools/source/create.js +2 -3
- package/dist/tools/source/create.js.map +1 -1
- package/dist/tools/source/get.js +2 -5
- package/dist/tools/source/get.js.map +1 -1
- package/dist/tools/source/list.js +7 -31
- package/dist/tools/source/list.js.map +1 -1
- package/dist/tools/source/restore.js +2 -5
- package/dist/tools/source/restore.js.map +1 -1
- package/dist/tools/source/shared.js +3 -29
- package/dist/tools/source/shared.js.map +1 -1
- package/dist/tools/source/update.js +4 -9
- package/dist/tools/source/update.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,45 +1,16 @@
|
|
|
1
|
-
// Request-scoped
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
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
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
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":"AAAA,
|
|
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
|
-
//
|
|
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';
|
|
@@ -33,9 +27,7 @@ function parsePort(raw, fallback) {
|
|
|
33
27
|
return value;
|
|
34
28
|
}
|
|
35
29
|
/**
|
|
36
|
-
*
|
|
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).
|
|
30
|
+
* Default an unset timeout; reject explicit invalid millisecond values at boot.
|
|
39
31
|
*/
|
|
40
32
|
function parseTimeoutMs(raw, fallback) {
|
|
41
33
|
if (raw === undefined || raw === '') {
|
|
@@ -48,9 +40,7 @@ function parseTimeoutMs(raw, fallback) {
|
|
|
48
40
|
return value;
|
|
49
41
|
}
|
|
50
42
|
/**
|
|
51
|
-
*
|
|
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).
|
|
43
|
+
* Default an unset body limit; reject explicit invalid byte counts at boot.
|
|
54
44
|
*/
|
|
55
45
|
function parseMaxBodyBytes(raw, fallback) {
|
|
56
46
|
if (raw === undefined || raw === '') {
|
|
@@ -82,10 +72,7 @@ function parseBool(raw, fallback, key) {
|
|
|
82
72
|
throw new Error(`invalid ${key}: ${raw} (expected one of true, false, 1, 0)`);
|
|
83
73
|
}
|
|
84
74
|
/**
|
|
85
|
-
*
|
|
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.
|
|
75
|
+
* Default an unset provider; trim and case-fold explicit names, rejecting unknowns.
|
|
89
76
|
*/
|
|
90
77
|
function parseCopilotProvider(raw, fallback) {
|
|
91
78
|
if (raw === undefined || raw === '') {
|
|
@@ -113,9 +100,7 @@ function parseMaxToolIterations(raw, fallback) {
|
|
|
113
100
|
return value;
|
|
114
101
|
}
|
|
115
102
|
/**
|
|
116
|
-
*
|
|
117
|
-
* when unset. An explicitly-set non-positive or non-integer value is a
|
|
118
|
-
* misconfiguration and throws (fail-loud at boot), mirroring parseMaxBodyBytes.
|
|
103
|
+
* Default an unset integer; reject explicit non-positive or fractional values.
|
|
119
104
|
*/
|
|
120
105
|
function parsePositiveInt(raw, fallback, key) {
|
|
121
106
|
if (raw === undefined || raw === '') {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/copilot/agent.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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":"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;
|
|
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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// call — nothing persists across turns.
|
|
6
6
|
import Anthropic from '@anthropic-ai/sdk';
|
|
7
7
|
import { CopilotUnconfiguredError } from './provider-factory.js';
|
|
8
|
-
import {
|
|
8
|
+
import { buildTurnResult } from './provider-shared.js';
|
|
9
9
|
// Max tokens the Messages API requires per request. A fixed ceiling is fine for
|
|
10
10
|
// grounded read-only answers.
|
|
11
11
|
// ponytail: fixed cap; make configurable if turns start truncating.
|
|
@@ -123,21 +123,7 @@ export function createAnthropicProvider(config, streamFn) {
|
|
|
123
123
|
cacheCreationTokens,
|
|
124
124
|
cacheReadTokens,
|
|
125
125
|
});
|
|
126
|
-
|
|
127
|
-
// ponytail: turn-end is inferred from the absence of tool_use blocks —
|
|
128
|
-
// we do NOT inspect stop_reason, so a max_tokens-truncated text answer
|
|
129
|
-
// renders as a clean end. Acceptable: 4096 tokens is ample for grounded
|
|
130
|
-
// config answers, and a truncated WRITE fails safe (partial tool JSON →
|
|
131
|
-
// parseToolInput → {} → assemble rejects → proposal_invalid). Upgrade
|
|
132
|
-
// path: capture stop_reason into the done label if operators hit it.
|
|
133
|
-
return { stop: 'end', ...(usage !== undefined ? { usage } : {}) };
|
|
134
|
-
}
|
|
135
|
-
const calls = [...toolBlocks.values()].map((block) => ({
|
|
136
|
-
id: block.id,
|
|
137
|
-
name: block.name,
|
|
138
|
-
input: parseToolInput(block.json),
|
|
139
|
-
}));
|
|
140
|
-
return { stop: 'tool_use', calls, ...(usage !== undefined ? { usage } : {}) };
|
|
126
|
+
return buildTurnResult([...toolBlocks.values()], usage);
|
|
141
127
|
},
|
|
142
128
|
};
|
|
143
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-anthropic.js","sourceRoot":"","sources":["../../src/copilot/provider-anthropic.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,8EAA8E;AAC9E,wCAAwC;AAExC,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAGzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-anthropic.js","sourceRoot":"","sources":["../../src/copilot/provider-anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// back into the LLMProvider seam. Stateless per call.
|
|
7
7
|
import OpenAI from 'openai';
|
|
8
8
|
import { CopilotModelRequiredError, CopilotUnconfiguredError } from './provider-factory.js';
|
|
9
|
-
import {
|
|
9
|
+
import { buildTurnResult } from './provider-shared.js';
|
|
10
10
|
const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
|
|
11
11
|
// The seam's LLMToolResult carries only { id, content }. OpenAI requires each
|
|
12
12
|
// role:'tool' message to answer an assistant message carrying a tool_call with
|
|
@@ -63,7 +63,7 @@ export function createOpenRouterProvider(config, streamFn) {
|
|
|
63
63
|
handlers.onTextDelta(delta.content);
|
|
64
64
|
}
|
|
65
65
|
for (const fragment of delta.tool_calls ?? []) {
|
|
66
|
-
const call = toolCalls.get(fragment.index) ?? { id: '', name: '',
|
|
66
|
+
const call = toolCalls.get(fragment.index) ?? { id: '', name: '', json: '' };
|
|
67
67
|
if (fragment.id !== undefined) {
|
|
68
68
|
call.id = fragment.id;
|
|
69
69
|
}
|
|
@@ -71,28 +71,15 @@ export function createOpenRouterProvider(config, streamFn) {
|
|
|
71
71
|
call.name = fragment.function.name;
|
|
72
72
|
}
|
|
73
73
|
if (fragment.function?.arguments !== undefined) {
|
|
74
|
-
call.
|
|
74
|
+
call.json += fragment.function.arguments;
|
|
75
75
|
}
|
|
76
76
|
toolCalls.set(fragment.index, call);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
if (toolCalls.size === 0) {
|
|
80
|
-
// ponytail: turn-end is inferred from the absence of tool calls — we do
|
|
81
|
-
// NOT inspect finish_reason, so a length-truncated text answer renders as
|
|
82
|
-
// a clean end. Acceptable: 4096 tokens is ample for grounded config
|
|
83
|
-
// answers, and a truncated WRITE fails safe (partial tool JSON →
|
|
84
|
-
// parseToolInput → {} → assemble rejects → proposal_invalid). Upgrade
|
|
85
|
-
// path: capture finish_reason into the done label if operators hit it.
|
|
86
|
-
return { stop: 'end', ...(usage !== undefined ? { usage } : {}) };
|
|
87
|
-
}
|
|
88
79
|
const calls = [...toolCalls.entries()]
|
|
89
80
|
.sort(([a], [b]) => a - b)
|
|
90
|
-
.map(([, call]) =>
|
|
91
|
-
|
|
92
|
-
name: call.name,
|
|
93
|
-
input: parseToolInput(call.args),
|
|
94
|
-
}));
|
|
95
|
-
return { stop: 'tool_use', calls, ...(usage !== undefined ? { usage } : {}) };
|
|
81
|
+
.map(([, call]) => call);
|
|
82
|
+
return buildTurnResult(calls, usage);
|
|
96
83
|
},
|
|
97
84
|
};
|
|
98
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-openrouter.js","sourceRoot":"","sources":["../../src/copilot/provider-openrouter.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,iFAAiF;AACjF,sDAAsD;AAEtD,OAAO,MAAM,MAAM,QAAQ,CAAA;AAG3B,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAC3F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-openrouter.js","sourceRoot":"","sources":["../../src/copilot/provider-openrouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
// Helpers shared by the Anthropic and OpenRouter LLMProvider adapters.
|
|
2
|
+
/** Normalize completed calls; each adapter owns ordering and usage accounting.
|
|
3
|
+
* Stop is inferred from calls, not provider finish reasons: truncated text still
|
|
4
|
+
* ends cleanly, while malformed tool JSON becomes {} for downstream validation.
|
|
5
|
+
*/
|
|
6
|
+
export function buildTurnResult(blocks, usage) {
|
|
7
|
+
const metering = usage !== undefined ? { usage } : {};
|
|
8
|
+
if (blocks.length === 0)
|
|
9
|
+
return { stop: 'end', ...metering };
|
|
10
|
+
const calls = blocks.map(({ id, name, json }) => ({ id, name, input: parseToolInput(json) }));
|
|
11
|
+
return { stop: 'tool_use', calls, ...metering };
|
|
12
|
+
}
|
|
2
13
|
/**
|
|
3
14
|
* Parse accumulated tool-call argument JSON into an input object. A blank or
|
|
4
15
|
* unparseable value resolves to `{}` so a malformed stream never crashes the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-shared.js","sourceRoot":"","sources":["../../src/copilot/provider-shared.ts"],"names":[],"mappings":"AAAA,uEAAuE;
|
|
1
|
+
{"version":3,"file":"provider-shared.js","sourceRoot":"","sources":["../../src/copilot/provider-shared.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAoD,EACpD,KAA2B;IAE3B,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,OAAO,MAAiC,CAAA;QAC1C,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/** Thrown by the default transcriber when the endpoint answers badly. Carries a
|
|
2
|
+
* status only — never any part of the request or the response body. */
|
|
3
|
+
export class TranscriptionProviderError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(status) {
|
|
6
|
+
super(status === undefined
|
|
7
|
+
? 'the transcription endpoint could not be reached'
|
|
8
|
+
: `the transcription endpoint answered ${status}`);
|
|
9
|
+
this.name = 'TranscriptionProviderError';
|
|
10
|
+
this.status = status;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Raised when no transcription capability is configured on this deployment. */
|
|
14
|
+
export class SpeechUnconfiguredError extends Error {
|
|
15
|
+
constructor() {
|
|
16
|
+
super('no transcription capability is configured on this server');
|
|
17
|
+
this.name = 'SpeechUnconfiguredError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Describe the capability for the console's pre-flight probe. */
|
|
21
|
+
export function describeSpeechCapability(config) {
|
|
22
|
+
return {
|
|
23
|
+
available: config.speechTranscriptionEndpoint !== undefined,
|
|
24
|
+
region: config.speechTranscriptionRegion,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The default transcriber: POST the raw bytes to the configured in-region
|
|
29
|
+
* endpoint with the region and locale as query parameters, and read back
|
|
30
|
+
* `{ "text": "…" }`. Deliberately generic — no vendor SDK, no vendor name. A
|
|
31
|
+
* concrete adapter replaces this behind the same seam once a provider is chosen.
|
|
32
|
+
*/
|
|
33
|
+
export function createHttpTranscriber(config) {
|
|
34
|
+
const endpoint = config.speechTranscriptionEndpoint;
|
|
35
|
+
if (endpoint === undefined) {
|
|
36
|
+
throw new SpeechUnconfiguredError();
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
async transcribe(audio, request) {
|
|
40
|
+
const url = new URL(endpoint);
|
|
41
|
+
url.searchParams.set('region', request.region);
|
|
42
|
+
if (request.locale !== undefined) {
|
|
43
|
+
url.searchParams.set('locale', request.locale);
|
|
44
|
+
}
|
|
45
|
+
const headers = { 'Content-Type': request.contentType };
|
|
46
|
+
if (config.speechTranscriptionApiKey !== undefined) {
|
|
47
|
+
headers.Authorization = `Bearer ${config.speechTranscriptionApiKey}`;
|
|
48
|
+
}
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
// Bounded like every other outbound call this server makes: a hung
|
|
52
|
+
// provider must not pin the request — and the audio buffer with it —
|
|
53
|
+
// open indefinitely. The abort surfaces as the same generic provider
|
|
54
|
+
// error, so no transport detail reaches the caller.
|
|
55
|
+
response = await fetch(url, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers,
|
|
58
|
+
body: audio,
|
|
59
|
+
signal: AbortSignal.timeout(config.timeoutMs),
|
|
60
|
+
// The configured endpoint is validated HTTPS-only, but a redirect is a
|
|
61
|
+
// second destination that validation never saw: a 307/308 would forward
|
|
62
|
+
// the recording — and the bearer key — wherever the provider points.
|
|
63
|
+
// Refuse redirects outright; the failure surfaces as the same generic
|
|
64
|
+
// provider error every other transport fault maps to.
|
|
65
|
+
redirect: 'error',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// The transport error is swallowed on purpose: an undici/agent error can
|
|
70
|
+
// carry the request (headers, body) in its cause chain.
|
|
71
|
+
throw new TranscriptionProviderError();
|
|
72
|
+
}
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new TranscriptionProviderError(response.status);
|
|
75
|
+
}
|
|
76
|
+
const payload = (await response.json());
|
|
77
|
+
if (typeof payload.text !== 'string') {
|
|
78
|
+
throw new TranscriptionProviderError(response.status);
|
|
79
|
+
}
|
|
80
|
+
return payload.text;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=speech-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech-provider.js","sourceRoot":"","sources":["../../src/copilot/speech-provider.ts"],"names":[],"mappings":"AAyBA;uEACuE;AACvE,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,MAAM,CAAoB;IAEnC,YAAY,MAAe;QACzB,KAAK,CACH,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,iDAAiD;YACnD,CAAC,CAAC,uCAAuC,MAAM,EAAE,CACpD,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD;QACE,KAAK,CAAC,0DAA0D,CAAC,CAAA;QACjE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF;AAQD,kEAAkE;AAClE,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,2BAA2B,KAAK,SAAS;QAC3D,MAAM,EAAE,MAAM,CAAC,yBAAyB;KACzC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,2BAA2B,CAAA;IACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,uBAAuB,EAAE,CAAA;IACrC,CAAC;IACD,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO;YAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC7B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YAChD,CAAC;YACD,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,CAAA;YAC/E,IAAI,MAAM,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;gBACnD,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,CAAC,yBAAyB,EAAE,CAAA;YACtE,CAAC;YACD,IAAI,QAAkB,CAAA;YACtB,IAAI,CAAC;gBACH,mEAAmE;gBACnE,qEAAqE;gBACrE,qEAAqE;gBACrE,oDAAoD;gBACpD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAC1B,MAAM,EAAE,MAAM;oBACd,OAAO;oBACP,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC7C,uEAAuE;oBACvE,wEAAwE;oBACxE,qEAAqE;oBACrE,sEAAsE;oBACtE,sDAAsD;oBACtD,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;gBACzE,wDAAwD;gBACxD,MAAM,IAAI,0BAA0B,EAAE,CAAA;YACxC,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACvD,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAA;YAC7D,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,CAAA;QACrB,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/copilot/sse.js
CHANGED
|
@@ -66,4 +66,9 @@ export function createSseSink(res) {
|
|
|
66
66
|
isClosed: () => closed,
|
|
67
67
|
};
|
|
68
68
|
}
|
|
69
|
+
/** End a failed turn without changing the sink's recoverable-error contract. */
|
|
70
|
+
export function finishWithError(sink, code, detail) {
|
|
71
|
+
sink.error(code, detail);
|
|
72
|
+
sink.done('end');
|
|
73
|
+
}
|
|
69
74
|
//# sourceMappingURL=sse.js.map
|
package/dist/copilot/sse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/copilot/sse.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,UAAU;AAIV,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAA;AAmClC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAmB;IAC/C,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAa,EAAQ,EAAE;QAClD,IAAI,MAAM;YAAE,OAAM;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAA;YACd,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,UAAU,EAAE,YAAY;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC,CAAA;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,MAAM,IAAI,CAAC,OAAO;YAAE,OAAM;QAC9B,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACzB,CAAC,EAAE,YAAY,CAAC,CAAA;IAChB,2DAA2D;IAC3D,SAAS,CAAC,KAAK,EAAE,EAAE,CAAA;IAEnB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,MAAM;YAAE,OAAM;QAClB,MAAM,GAAG,IAAI,CAAA;QACb,aAAa,CAAC,SAAS,CAAC,CAAA;QACxB,GAAG,CAAC,GAAG,EAAE,CAAA;IACX,CAAC,CAAA;IAED,4DAA4D;IAC5D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAEtB,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;QACxC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACtD,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QAChD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACtB,KAAK,EAAE,CAAA;QACT,CAAC;QACD,KAAK;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/copilot/sse.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,UAAU;AAIV,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAA;AAmClC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAmB;IAC/C,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAa,EAAQ,EAAE;QAClD,IAAI,MAAM;YAAE,OAAM;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAA;YACd,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,UAAU,EAAE,YAAY;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC,CAAA;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,MAAM,IAAI,CAAC,OAAO;YAAE,OAAM;QAC9B,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACzB,CAAC,EAAE,YAAY,CAAC,CAAA;IAChB,2DAA2D;IAC3D,SAAS,CAAC,KAAK,EAAE,EAAE,CAAA;IAEnB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,MAAM;YAAE,OAAM;QAClB,MAAM,GAAG,IAAI,CAAA;QACb,aAAa,CAAC,SAAS,CAAC,CAAA;QACxB,GAAG,CAAC,GAAG,EAAE,CAAA;IACX,CAAC,CAAA;IAED,4DAA4D;IAC5D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAEtB,OAAO;QACL,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;QACxC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACtD,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QAChD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YACtB,KAAK,EAAE,CAAA;QACT,CAAC;QACD,KAAK;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAA;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,IAAa,EAAE,IAAY,EAAE,MAAc;IACzE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/** Allow unrelated boundary tests to pass the tenant quota gate. */
|
|
3
|
+
export const allowAll = { check: () => ({ allowed: true, retryAfterSeconds: 0 }) };
|
|
4
|
+
/** Successful auth probe with no network or credential. */
|
|
5
|
+
export const okProbeClient = {
|
|
6
|
+
async request() {
|
|
7
|
+
return { items: [], hasMore: false };
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
export function mockRequest(body, headers) {
|
|
11
|
+
return {
|
|
12
|
+
headers,
|
|
13
|
+
async *[Symbol.asyncIterator]() {
|
|
14
|
+
if (body.length > 0)
|
|
15
|
+
yield typeof body === 'string' ? Buffer.from(body, 'utf8') : body;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Captures JSON and SSE responses; closing remains explicitly test-controlled. */
|
|
20
|
+
export class MockRes extends EventEmitter {
|
|
21
|
+
status = 0;
|
|
22
|
+
headers = {};
|
|
23
|
+
writes = [];
|
|
24
|
+
ended = false;
|
|
25
|
+
headersSent = false;
|
|
26
|
+
writeHead(status, headers) {
|
|
27
|
+
this.status = status;
|
|
28
|
+
if (headers !== undefined)
|
|
29
|
+
this.headers = headers;
|
|
30
|
+
this.headersSent = true;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
write(chunk) {
|
|
34
|
+
this.writes.push(chunk);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
end(chunk) {
|
|
38
|
+
if (chunk !== undefined)
|
|
39
|
+
this.writes.push(chunk);
|
|
40
|
+
this.ended = true;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
get body() {
|
|
44
|
+
return this.writes.join('');
|
|
45
|
+
}
|
|
46
|
+
json() {
|
|
47
|
+
return JSON.parse(this.body);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=test_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_helpers.js","sourceRoot":"","sources":["../../src/copilot/test_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1C,oEAAoE;AACpE,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AAElF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,KAAK,CAAC,OAAO;QACX,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAO,CAAA;IAC3C,CAAC;CACF,CAAA;AAED,MAAM,UAAU,WAAW,CAAC,IAAqB,EAAE,OAA+B;IAChF,OAAO;QACL,OAAO;QACP,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACxF,CAAC;KAC4B,CAAA;AACjC,CAAC;AAED,mFAAmF;AACnF,MAAM,OAAO,OAAQ,SAAQ,YAAY;IACvC,MAAM,GAAG,CAAC,CAAA;IACV,OAAO,GAA2B,EAAE,CAAA;IACpC,MAAM,GAAa,EAAE,CAAA;IACrB,KAAK,GAAG,KAAK,CAAA;IACb,WAAW,GAAG,KAAK,CAAA;IAEnB,SAAS,CAAC,MAAc,EAAE,OAAgC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG,CAAC,KAAc;QAChB,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAA4B,CAAA;IACzD,CAAC;CACF"}
|