@framers/agentos 0.11.1 → 0.11.4

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.
@@ -75,11 +75,30 @@ export declare function modelSupportsStrictToolUse(modelId: string): boolean;
75
75
  * `not` / `contains` / `unevaluatedProperties`) — a FIELD literally named
76
76
  * `additionalProperties` inside `properties` must not trip the check.
77
77
  *
78
+ * The check also applies Anthropic's explicit complexity limits (see
79
+ * {@link STRICT_MAX_UNION_TYPED_PARAMETERS}): a schema over them 400s on every
80
+ * attempt, so it degrades to the non-strict forced tool too.
81
+ *
78
82
  * @param inputSchema Lowered JSON Schema destined for `tool.input_schema`.
79
83
  * @returns `true` when no reachable node carries a non-`false`
80
- * `additionalProperties`; `false` otherwise (caller must omit `strict`).
84
+ * `additionalProperties` and the schema is within the complexity limits;
85
+ * `false` otherwise (caller must omit `strict`).
81
86
  */
82
87
  export declare function toolInputSchemaSupportsStrict(inputSchema: unknown): boolean;
88
+ /**
89
+ * Anthropic's explicit limit on parameters that use `anyOf` or a type array
90
+ * (`"type": ["string", "null"]`), summed over every strict schema in a request:
91
+ * https://platform.claude.com/docs/en/build-with-claude/structured-outputs
92
+ * ("Schema complexity limits"). The forced structured-output tool is the only
93
+ * strict schema in its request, so its own count is the request's total.
94
+ */
95
+ export declare const STRICT_MAX_UNION_TYPED_PARAMETERS = 16;
96
+ /**
97
+ * Anthropic's explicit limit on parameters left out of `required`, summed over
98
+ * every strict schema in a request (same page as
99
+ * {@link STRICT_MAX_UNION_TYPED_PARAMETERS}).
100
+ */
101
+ export declare const STRICT_MAX_OPTIONAL_PARAMETERS = 24;
83
102
  /**
84
103
  * Rewrite a strict-compatible `input_schema` so every reachable object node
85
104
  * carries `additionalProperties: false` EXPLICITLY.
@@ -1 +1 @@
1
- {"version":3,"file":"model-strict-tool-use.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/model-strict-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAE3E;AAuFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAErF"}
1
+ {"version":3,"file":"model-strict-tool-use.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/model-strict-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAInE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAQ3E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,KAAK,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAsIjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAErF"}
@@ -77,12 +77,83 @@ export function modelSupportsStrictToolUse(modelId) {
77
77
  * `not` / `contains` / `unevaluatedProperties`) — a FIELD literally named
78
78
  * `additionalProperties` inside `properties` must not trip the check.
79
79
  *
80
+ * The check also applies Anthropic's explicit complexity limits (see
81
+ * {@link STRICT_MAX_UNION_TYPED_PARAMETERS}): a schema over them 400s on every
82
+ * attempt, so it degrades to the non-strict forced tool too.
83
+ *
80
84
  * @param inputSchema Lowered JSON Schema destined for `tool.input_schema`.
81
85
  * @returns `true` when no reachable node carries a non-`false`
82
- * `additionalProperties`; `false` otherwise (caller must omit `strict`).
86
+ * `additionalProperties` and the schema is within the complexity limits;
87
+ * `false` otherwise (caller must omit `strict`).
83
88
  */
84
89
  export function toolInputSchemaSupportsStrict(inputSchema) {
85
- return nodeSupportsStrict(inputSchema, 0);
90
+ if (!nodeSupportsStrict(inputSchema, 0))
91
+ return false;
92
+ const counts = { unionTyped: 0, optional: 0 };
93
+ countStrictParameters(inputSchema, 0, counts);
94
+ return (counts.unionTyped <= STRICT_MAX_UNION_TYPED_PARAMETERS &&
95
+ counts.optional <= STRICT_MAX_OPTIONAL_PARAMETERS);
96
+ }
97
+ /**
98
+ * Anthropic's explicit limit on parameters that use `anyOf` or a type array
99
+ * (`"type": ["string", "null"]`), summed over every strict schema in a request:
100
+ * https://platform.claude.com/docs/en/build-with-claude/structured-outputs
101
+ * ("Schema complexity limits"). The forced structured-output tool is the only
102
+ * strict schema in its request, so its own count is the request's total.
103
+ */
104
+ export const STRICT_MAX_UNION_TYPED_PARAMETERS = 16;
105
+ /**
106
+ * Anthropic's explicit limit on parameters left out of `required`, summed over
107
+ * every strict schema in a request (same page as
108
+ * {@link STRICT_MAX_UNION_TYPED_PARAMETERS}).
109
+ */
110
+ export const STRICT_MAX_OPTIONAL_PARAMETERS = 24;
111
+ /**
112
+ * Count, below the root, the nodes that use `anyOf` / `oneOf` or a type array,
113
+ * and the object properties left out of `required`. It walks the positions
114
+ * {@link nodeSupportsStrict} walks. A node reached twice (a shared `$defs`
115
+ * entry) counts once per position, which can only over-count, and an
116
+ * over-count only costs strict mode, never the request.
117
+ */
118
+ function countStrictParameters(node, depth, counts) {
119
+ if (depth > MAX_STRICT_SCAN_DEPTH)
120
+ return;
121
+ if (!node || typeof node !== 'object' || Array.isArray(node))
122
+ return;
123
+ const schema = node;
124
+ if (depth > 0 &&
125
+ (Array.isArray(schema.type) || Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf))) {
126
+ counts.unionTyped += 1;
127
+ }
128
+ const properties = schema.properties;
129
+ if (properties && typeof properties === 'object' && !Array.isArray(properties)) {
130
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
131
+ for (const name of Object.keys(properties)) {
132
+ if (!required.has(name))
133
+ counts.optional += 1;
134
+ }
135
+ }
136
+ const subschemas = [];
137
+ for (const key of ['properties', 'patternProperties', '$defs', 'definitions', 'dependentSchemas']) {
138
+ const map = schema[key];
139
+ if (map && typeof map === 'object' && !Array.isArray(map)) {
140
+ subschemas.push(...Object.values(map));
141
+ }
142
+ }
143
+ for (const key of ['items', 'prefixItems', 'anyOf', 'oneOf', 'allOf']) {
144
+ const value = schema[key];
145
+ if (Array.isArray(value))
146
+ subschemas.push(...value);
147
+ else if (value && typeof value === 'object')
148
+ subschemas.push(value);
149
+ }
150
+ for (const key of ['if', 'then', 'else', 'not', 'contains', 'unevaluatedProperties']) {
151
+ const value = schema[key];
152
+ if (value && typeof value === 'object' && !Array.isArray(value))
153
+ subschemas.push(value);
154
+ }
155
+ for (const sub of subschemas)
156
+ countStrictParameters(sub, depth + 1, counts);
86
157
  }
87
158
  /** Defensive recursion bound — lowered schemas are shallow trees; anything
88
159
  * deeper is malformed and must not stack-overflow the request path. */
@@ -1 +1 @@
1
- {"version":3,"file":"model-strict-tool-use.js","sourceRoot":"","sources":["../../../../src/core/llm/providers/model-strict-tool-use.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-strict-tool-use.js","sourceRoot":"","sources":["../../../../src/core/llm/providers/model-strict-tool-use.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,34 @@ export interface BuildResponseFormatInput {
31
31
  */
32
32
  schemaName: string;
33
33
  }
34
+ /**
35
+ * Adapt a lowered JSON Schema into a shape Anthropic's tool `input_schema`
36
+ * accepts. The Anthropic Messages API requires the tool input_schema to be a
37
+ * JSON Schema **object** with a top-level `type`, and REJECTS a top-level
38
+ * `oneOf` / `allOf` / `anyOf` (`input_schema does not support … at the top
39
+ * level`). {@link lowerZodToJsonSchema} emits `{ anyOf: [...] }` for a top-level
40
+ * `z.union` / `z.discriminatedUnion` and `{}` for shapes it does not model.
41
+ * Two adaptations:
42
+ *
43
+ * 1. **Union of objects → one merged object.** Union the members' `properties`
44
+ * (merging same-named `enum` members so a discriminant like `kind` becomes
45
+ * the full set of variant values, and keeping a shared property's differing
46
+ * schemas under a nested `anyOf`), and keep in `required` only the fields
47
+ * required by EVERY member, so variant-specific fields stay optional. The
48
+ * model returns one flat object; the caller's Zod schema re-validates the
49
+ * exact variant, so strictness is preserved. Nested `anyOf` (inside a
50
+ * property / `additionalProperties`) is left intact — Anthropic only forbids
51
+ * it at the TOP level.
52
+ * 2. **No top-level `type` (e.g. `{}` or a non-object union) → `{ type: 'object' }`**
53
+ * (mirrors the `?? { type: 'object' }` fallback AnthropicProvider's regular
54
+ * tool-conversion path applies). An object schema already carrying a `type`
55
+ * passes through unchanged.
56
+ *
57
+ * @internal Exported for tests: {@link lowerZodToJsonSchema} gives an enum no
58
+ * other fields, so some merge rules can only be reached with a hand-written
59
+ * schema. Callers use {@link buildResponseFormat}.
60
+ */
61
+ export declare function ensureAnthropicObjectSchema(jsonSchema: unknown): Record<string, unknown>;
34
62
  /**
35
63
  * Build a provider-specific structured-output payload from a Zod schema.
36
64
  *
@@ -1 +1 @@
1
- {"version":3,"file":"structuredOutputFormat.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/structuredOutputFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAGnC;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AA6GD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoCzB"}
1
+ {"version":3,"file":"structuredOutputFormat.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/providers/structuredOutputFormat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAGnC;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AA2ED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2DxF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoCzB"}
@@ -12,6 +12,60 @@ function sanitizeName(name) {
12
12
  return 'response';
13
13
  return name.replace(SCHEMA_NAME_INVALID_CHARS, '_').slice(0, SCHEMA_NAME_MAX_LEN);
14
14
  }
15
+ /** JSON with object keys sorted, so two schemas that differ only in key order compare equal. */
16
+ function stableStringify(value) {
17
+ if (Array.isArray(value)) {
18
+ return `[${value.map(stableStringify).join(',')}]`;
19
+ }
20
+ if (value && typeof value === 'object') {
21
+ const entries = Object.keys(value)
22
+ .sort()
23
+ .map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`);
24
+ return `{${entries.join(',')}}`;
25
+ }
26
+ return JSON.stringify(value) ?? 'undefined';
27
+ }
28
+ /**
29
+ * Merges the schemas that the variants of a top-level union give one property.
30
+ * Enum schemas (a discriminant such as `kind`) become one enum of every value,
31
+ * keeping the fields they all share;
32
+ * otherwise identical schemas collapse to one, and different ones are kept side
33
+ * by side under a nested `anyOf`, which Anthropic accepts below the top level.
34
+ * Keeping only the first variant's schema would tell the model a later
35
+ * variant's value has the first variant's type, and the reply would then fail
36
+ * the caller's Zod schema.
37
+ */
38
+ function mergePropertySchemas(schemas) {
39
+ if (schemas.length === 1) {
40
+ return schemas[0];
41
+ }
42
+ if (schemas.every((s) => s && typeof s === 'object' && Array.isArray(s.enum))) {
43
+ const records = schemas;
44
+ // Fields every variant gives the same value (`type`, a shared `description`) stay.
45
+ const shared = {};
46
+ for (const [field, value] of Object.entries(records[0])) {
47
+ if (field === 'enum')
48
+ continue;
49
+ if (records.every((r) => field in r && stableStringify(r[field]) === stableStringify(value))) {
50
+ shared[field] = value;
51
+ }
52
+ }
53
+ return {
54
+ ...shared,
55
+ enum: Array.from(new Set(records.flatMap((r) => r.enum))),
56
+ };
57
+ }
58
+ const distinct = [];
59
+ const seen = new Set();
60
+ for (const schema of schemas) {
61
+ const key = stableStringify(schema);
62
+ if (!seen.has(key)) {
63
+ seen.add(key);
64
+ distinct.push(schema);
65
+ }
66
+ }
67
+ return distinct.length === 1 ? distinct[0] : { anyOf: distinct };
68
+ }
15
69
  /**
16
70
  * Adapt a lowered JSON Schema into a shape Anthropic's tool `input_schema`
17
71
  * accepts. The Anthropic Messages API requires the tool input_schema to be a
@@ -23,7 +77,8 @@ function sanitizeName(name) {
23
77
  *
24
78
  * 1. **Union of objects → one merged object.** Union the members' `properties`
25
79
  * (merging same-named `enum` members so a discriminant like `kind` becomes
26
- * the full set of variant values), and keep in `required` only the fields
80
+ * the full set of variant values, and keeping a shared property's differing
81
+ * schemas under a nested `anyOf`), and keep in `required` only the fields
27
82
  * required by EVERY member, so variant-specific fields stay optional. The
28
83
  * model returns one flat object; the caller's Zod schema re-validates the
29
84
  * exact variant, so strictness is preserved. Nested `anyOf` (inside a
@@ -33,8 +88,12 @@ function sanitizeName(name) {
33
88
  * (mirrors the `?? { type: 'object' }` fallback AnthropicProvider's regular
34
89
  * tool-conversion path applies). An object schema already carrying a `type`
35
90
  * passes through unchanged.
91
+ *
92
+ * @internal Exported for tests: {@link lowerZodToJsonSchema} gives an enum no
93
+ * other fields, so some merge rules can only be reached with a hand-written
94
+ * schema. Callers use {@link buildResponseFormat}.
36
95
  */
37
- function ensureAnthropicObjectSchema(jsonSchema) {
96
+ export function ensureAnthropicObjectSchema(jsonSchema) {
38
97
  if (!jsonSchema || typeof jsonSchema !== 'object') {
39
98
  return { type: 'object' };
40
99
  }
@@ -47,28 +106,17 @@ function ensureAnthropicObjectSchema(jsonSchema) {
47
106
  if (variants &&
48
107
  variants.length > 0 &&
49
108
  variants.every((v) => v && typeof v === 'object' && v.type === 'object')) {
50
- const mergedProperties = {};
109
+ // Every variant's schema for each property, in the order properties first appear.
110
+ const propertySchemas = new Map();
51
111
  const requiredCounts = {};
52
112
  for (const variant of variants) {
53
113
  const props = variant.properties && typeof variant.properties === 'object'
54
114
  ? variant.properties
55
115
  : {};
56
116
  for (const [key, propSchema] of Object.entries(props)) {
57
- const existing = mergedProperties[key];
58
- const incoming = propSchema;
59
- if (existing &&
60
- Array.isArray(existing.enum) &&
61
- incoming &&
62
- Array.isArray(incoming.enum)) {
63
- // Same field is an enum across variants (e.g. the discriminant) —
64
- // union the allowed values so the model can satisfy any variant.
65
- mergedProperties[key] = {
66
- enum: Array.from(new Set([...existing.enum, ...incoming.enum])),
67
- };
68
- }
69
- else if (!(key in mergedProperties)) {
70
- mergedProperties[key] = propSchema;
71
- }
117
+ const schemas = propertySchemas.get(key) ?? [];
118
+ schemas.push(propSchema);
119
+ propertySchemas.set(key, schemas);
72
120
  }
73
121
  const variantRequired = Array.isArray(variant.required)
74
122
  ? variant.required
@@ -80,6 +128,10 @@ function ensureAnthropicObjectSchema(jsonSchema) {
80
128
  // A field is required in the merged object only when EVERY variant requires
81
129
  // it; variant-specific fields must stay optional.
82
130
  const required = Object.keys(requiredCounts).filter((field) => requiredCounts[field] === variants.length);
131
+ const mergedProperties = {};
132
+ for (const [key, schemas] of propertySchemas) {
133
+ mergedProperties[key] = mergePropertySchemas(schemas);
134
+ }
83
135
  return {
84
136
  type: 'object',
85
137
  properties: mergedProperties,
@@ -1 +1 @@
1
- {"version":3,"file":"structuredOutputFormat.js","sourceRoot":"","sources":["../../../../src/core/llm/providers/structuredOutputFormat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structuredOutputFormat.js","sourceRoot":"","sources":["../../../../src/core/llm/providers/structuredOutputFormat.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAmBzF,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AACnD,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,SAAS,YAAY,CAAC,IAAY;IAChC,wEAAwE;IACxE,wEAAwE;IACxE,qEAAqE;IACrE,sEAAsE;IACtE,mBAAmB;IACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAC;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACpF,CAAC;AAED,gGAAgG;AAChG,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC;aAC1D,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC;AAC9C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,OAAkB;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IACE,OAAO,CAAC,KAAK,CACX,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,CAA6B,CAAC,IAAI,CAAC,CACxF,EACD,CAAC;QACD,MAAM,OAAO,GAAG,OAAyC,CAAC;QAC1D,mFAAmF;QACnF,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,IAAI,KAAK,KAAK,MAAM;gBAAE,SAAS;YAC/B,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC7F,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAiB,CAAC,CAAC,CAAC;SACvE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,2BAA2B,CAAC,UAAmB;IAC7D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,UAAqC,CAAC;IAErD,MAAM,QAAQ,GAAG,CACf,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,IAAI,CAC8B,CAAC;IAE3C,IACE,QAAQ;QACR,QAAQ,CAAC,MAAM,GAAG,CAAC;QACnB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EACxE,CAAC;QACD,kFAAkF;QAClF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;QACrD,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GACT,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;gBAC1D,CAAC,CAAE,OAAO,CAAC,UAAsC;gBACjD,CAAC,CAAC,EAAE,CAAC;YACT,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACrD,CAAC,CAAE,OAAO,CAAC,QAAqB;gBAChC,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,4EAA4E;QAC5E,kDAAkD;QAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CACjD,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,MAAM,CACrD,CAAC;QACF,MAAM,gBAAgB,GAA4B,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,eAAe,EAAE,CAAC;YAC7C,gBAAgB,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,gBAAgB;YAC5B,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA+B;IAE/B,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAElD,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE;oBACX,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,UAAU;iBACnB;aACF,CAAC;QACJ,KAAK,WAAW;YACd,OAAO;gBACL,kCAAkC,EAAE,IAAI;gBACxC,IAAI,EAAE;oBACJ,IAAI,EAAE,UAAU;oBAChB,YAAY,EAAE,2BAA2B,CAAC,UAAU,CAAC;iBACtD;aACF,CAAC;QACJ,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;aACxC,CAAC;QACJ,KAAK,YAAY,CAAC;QAClB;YACE,iEAAiE;YACjE,+DAA+D;YAC/D,6DAA6D;YAC7D,iDAAiD;YACjD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -9,8 +9,10 @@
9
9
  * or a file path is decoded directly. One that looks like a path is read as
10
10
  * a file first, and decoded when no file exists there and it is base64
11
11
  * (standard or URL-safe) whose bytes start with a PNG, JPEG, GIF, WebP, TIFF,
12
- * AVIF or HEIC signature: standard base64 uses `/` (RFC 4648, Table 1), so a
13
- * JPEG's base64 begins with `/9j/`. A missing path is still an error.
12
+ * AVIF, HEIC, BMP, ICO, JPEG 2000, JPEG XL or SVG signature: standard base64
13
+ * uses `/` (RFC 4648, Table 1), so a JPEG's base64 begins with `/9j/`. A
14
+ * missing path is still an error; when the string is base64 of another
15
+ * format, the error says so without repeating the string.
14
16
  * - **`file://` URL** — resolved to a local filesystem path and read.
15
17
  * - **HTTP/HTTPS URL** — fetched via `globalThis.fetch` and buffered.
16
18
  * - **Local file path** — a string that contains `/` or `\`, or ends in a
@@ -1 +1 @@
1
- {"version":3,"file":"imageToBuffer.d.ts","sourceRoot":"","sources":["../../../../src/io/media/images/imageToBuffer.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D3E;AA+CD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAI3D"}
1
+ {"version":3,"file":"imageToBuffer.d.ts","sourceRoot":"","sources":["../../../../src/io/media/images/imageToBuffer.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE3E;AAsDD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAI3D"}
@@ -20,8 +20,10 @@ import * as fs from 'node:fs/promises';
20
20
  * or a file path is decoded directly. One that looks like a path is read as
21
21
  * a file first, and decoded when no file exists there and it is base64
22
22
  * (standard or URL-safe) whose bytes start with a PNG, JPEG, GIF, WebP, TIFF,
23
- * AVIF or HEIC signature: standard base64 uses `/` (RFC 4648, Table 1), so a
24
- * JPEG's base64 begins with `/9j/`. A missing path is still an error.
23
+ * AVIF, HEIC, BMP, ICO, JPEG 2000, JPEG XL or SVG signature: standard base64
24
+ * uses `/` (RFC 4648, Table 1), so a JPEG's base64 begins with `/9j/`. A
25
+ * missing path is still an error; when the string is base64 of another
26
+ * format, the error says so without repeating the string.
25
27
  * - **`file://` URL** — resolved to a local filesystem path and read.
26
28
  * - **HTTP/HTTPS URL** — fetched via `globalThis.fetch` and buffered.
27
29
  * - **Local file path** — a string that contains `/` or `\`, or ends in a
@@ -85,11 +87,19 @@ export async function imageToBuffer(input) {
85
87
  // Standard base64 uses `/` (RFC 4648, Table 1), so raw base64 looks like a
86
88
  // path. When no file exists there and the string decodes to image bytes,
87
89
  // it is the image; a missing path that does not stays an error.
88
- const decoded = isMissingFileError(error) ? decodeBase64Image(trimmed) : null;
89
- if (decoded) {
90
- return decoded;
90
+ const compact = trimmed.replace(/\s+/g, '');
91
+ if (!isMissingFileError(error) || !BASE64_PATTERN.test(compact)) {
92
+ throw error;
91
93
  }
92
- throw error;
94
+ const bytes = Buffer.from(compact, 'base64');
95
+ if (hasImageSignature(bytes)) {
96
+ return bytes;
97
+ }
98
+ // Node's error names the whole string as the path, which for a base64
99
+ // payload can run to megabytes in a message or a log line.
100
+ throw Object.assign(new Error(`imageToBuffer: no file exists at ${preview(trimmed)}, and it is not base64 of a ` +
101
+ 'recognised image format (PNG, JPEG, GIF, WebP, TIFF, AVIF, HEIC, BMP, ICO, ' +
102
+ 'JPEG 2000, JPEG XL or SVG). Pass the image as a data URL or a Buffer.'), { code: error.code, cause: error });
93
103
  }
94
104
  }
95
105
  // Fallback: raw base64 string (no data URL prefix).
@@ -97,24 +107,18 @@ export async function imageToBuffer(input) {
97
107
  }
98
108
  /** The standard and URL-safe base64 alphabets of RFC 4648, with optional padding. */
99
109
  const BASE64_PATTERN = /^[A-Za-z0-9+/_-]+={0,2}$/;
100
- /**
101
- * Decodes `value` when it is base64 whose bytes start with an image signature.
102
- *
103
- * @param value - A string `fs.readFile` found no file at.
104
- * @returns The decoded bytes, or `null` when `value` is not base64 or its bytes
105
- * do not start with a PNG, JPEG, GIF, WebP, TIFF, AVIF or HEIC signature.
106
- */
107
- function decodeBase64Image(value) {
108
- const compact = value.replace(/\s+/g, '');
109
- if (!BASE64_PATTERN.test(compact)) {
110
- return null;
111
- }
112
- const bytes = Buffer.from(compact, 'base64');
113
- return hasImageSignature(bytes) ? bytes : null;
110
+ /** A short, quoted form of `value` for an error message. */
111
+ function preview(value) {
112
+ return value.length <= 80
113
+ ? JSON.stringify(value)
114
+ : `${JSON.stringify(value.slice(0, 40))}... (${value.length} characters)`;
114
115
  }
115
116
  /**
116
- * True when `bytes` start with the signature of PNG, JPEG, GIF, WebP, TIFF, or
117
- * an ISO media file such as AVIF or HEIC (`ftyp` at offset 4).
117
+ * True when `bytes` start with the signature of PNG, JPEG, GIF, WebP, TIFF, an
118
+ * ISO media file such as AVIF or HEIC (`ftyp` at offset 4), BMP, ICO, JPEG 2000,
119
+ * the JPEG XL container, or SVG text. JPEG XL's bare codestream marker (FF 0A)
120
+ * is left out: two bytes are too few, and a path such as `/work...` decodes to
121
+ * them.
118
122
  */
119
123
  function hasImageSignature(bytes) {
120
124
  const startsWith = (...signature) => signature.every((byte, i) => bytes[i] === byte);
@@ -124,7 +128,19 @@ function hasImageSignature(bytes) {
124
128
  (startsWith(0x52, 0x49, 0x46, 0x46) && bytes.subarray(8, 12).toString('latin1') === 'WEBP') ||
125
129
  startsWith(0x49, 0x49, 0x2a, 0x00) || // TIFF, little-endian
126
130
  startsWith(0x4d, 0x4d, 0x00, 0x2a) || // TIFF, big-endian
127
- bytes.subarray(4, 8).toString('latin1') === 'ftyp');
131
+ bytes.subarray(4, 8).toString('latin1') === 'ftyp' ||
132
+ // BMP: "BM", then the file size, which a whole file's bytes match.
133
+ (startsWith(0x42, 0x4d) && bytes.length >= 6 && bytes.readUInt32LE(2) === bytes.length) ||
134
+ startsWith(0x00, 0x00, 0x01, 0x00) || // ICO
135
+ startsWith(0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a) || // JPEG 2000 (JP2)
136
+ startsWith(0xff, 0x4f, 0xff, 0x51) || // JPEG 2000 codestream
137
+ startsWith(0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a) || // JPEG XL container
138
+ isSvgText(bytes));
139
+ }
140
+ /** True when `bytes` are SVG markup: `<svg`, or an XML declaration followed by `<svg`. */
141
+ function isSvgText(bytes) {
142
+ const head = bytes.subarray(0, 1024).toString('utf8').replace(/^\uFEFF/, '').trimStart();
143
+ return head.startsWith('<svg') || (head.startsWith('<?xml') && head.includes('<svg'));
128
144
  }
129
145
  /**
130
146
  * True for the errors `fs.readFile` gives when nothing exists at the path,
@@ -1 +1 @@
1
- {"version":3,"file":"imageToBuffer.js","sourceRoot":"","sources":["../../../../src/io/media/images/imageToBuffer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imageToBuffer.js","sourceRoot":"","sources":["../../../../src/io/media/images/imageToBuffer.ts"],"names":[],"mappings":"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"}
@@ -58,11 +58,25 @@ export declare class SpeechProviderResolver extends EventEmitter {
58
58
  private readonly config?;
59
59
  private readonly env;
60
60
  /**
61
- * Internal registry of all providers keyed by their unique string id.
62
- * Overwrites are allowed — re-registering with the same id replaces the
63
- * previous entry, which lets hot-reload and extension refresh work seamlessly.
61
+ * Internal registry of all providers, keyed by kind and id (`keyOf()`), so a
62
+ * speech-to-text and a text-to-speech provider can share an id. Overwrites
63
+ * are allowed — re-registering the same kind and id replaces the previous
64
+ * entry, which lets hot-reload and extension refresh work seamlessly.
64
65
  */
65
66
  private registrations;
67
+ /**
68
+ * The priority each provider was registered with. `refresh()` restores it
69
+ * before applying the preferred lists, so a provider that is no longer
70
+ * preferred loses its boost.
71
+ */
72
+ private basePriorities;
73
+ /**
74
+ * The providers the last `refresh(extensionManager)` read from the manager,
75
+ * by key, so the next one can drop those the manager no longer lists.
76
+ */
77
+ private discovered;
78
+ /** Map key of a registration: providers of different kinds may share an id. */
79
+ private static keyOf;
66
80
  /**
67
81
  * Creates a new SpeechProviderResolver.
68
82
  *
@@ -83,7 +97,10 @@ export declare class SpeechProviderResolver extends EventEmitter {
83
97
  */
84
98
  constructor(config?: SpeechResolverConfig | undefined, env?: Record<string, string | undefined>);
85
99
  /**
86
- * Register a provider, overwriting any existing registration with the same id.
100
+ * Register a provider, overwriting any existing registration with the same
101
+ * kind and id. Re-registering at the priority the resolver shows (a preferred
102
+ * boost included), as `register({ ...entry, provider })` does, keeps the
103
+ * priority the provider was first registered with.
87
104
  *
88
105
  * Emits a `provider_registered` event with `{ id, kind, source }` so that
89
106
  * listeners (e.g. UI dashboards, logging middleware) can track what's available.
@@ -213,17 +230,20 @@ export declare class SpeechProviderResolver extends EventEmitter {
213
230
  * optionally discovering extension providers, and applying user-configured
214
231
  * preferred priorities.
215
232
  *
216
- * The three-phase refresh sequence is:
217
- * 1. `registerCoreProviders()` — register all built-in providers from the
233
+ * The refresh sequence is:
234
+ * 1. `discoverExtensionProviders()` — if an ExtensionManager is provided, read
235
+ * the speech providers it lists as active, and drop the ones an earlier
236
+ * refresh read from it that it no longer lists.
237
+ * 2. `registerCoreProviders()` — register all built-in providers from the
218
238
  * static catalog, marking each as configured/unconfigured based on env vars.
219
- * 2. `discoverExtensionProviders()` — if an ExtensionManager is provided,
220
- * discover and register any additional speech providers from extensions.
221
- * 3. `applyPreferredPriorities()` — boost priority for providers listed in
239
+ * 3. Register the providers read in step 1, at priority 200.
240
+ * 4. `applyPreferredPriorities()` — boost priority for providers listed in
222
241
  * the user's `config.stt.preferred` / `config.tts.preferred` arrays.
223
242
  *
224
- * @param extensionManager - Optional object exposing `getDescriptorsByKind(kind)`.
225
- * Uses `any` type because the ExtensionManager interface is defined in the
226
- * extensions package and importing it here would create a circular dependency.
243
+ * @param extensionManager - Optional `ExtensionManager` (its speech provider
244
+ * registries are read through `getRegistry(kind).listActive()`), or any
245
+ * object exposing `getDescriptorsByKind(kind)`. Uses `any` type because
246
+ * importing the ExtensionManager type here would create a circular dependency.
227
247
  *
228
248
  * @example
229
249
  * ```ts
@@ -304,27 +324,43 @@ export declare class SpeechProviderResolver extends EventEmitter {
304
324
  */
305
325
  private registerCoreProviders;
306
326
  /**
307
- * Discover speech providers exposed by an ExtensionManager via
308
- * `getDescriptorsByKind()`.
327
+ * Read the speech providers an ExtensionManager lists as active, as
328
+ * registrations for `refresh()` to register.
309
329
  *
310
330
  * Extension providers are registered with `priority: 200` (lower than core's
311
331
  * 100) so they serve as fallbacks unless the user explicitly boosts them via
312
- * `config.stt.preferred` / `config.tts.preferred`.
332
+ * `config.stt.preferred` / `config.tts.preferred`. Each is registered under
333
+ * the provider's own `id` (the descriptor id when the provider has none), the
334
+ * id preferred lists and `SpeechRuntime` use, and counts as configured: the
335
+ * pack built the instance with its own options and secrets.
313
336
  *
314
337
  * The `extensionManager` parameter uses `any` because the ExtensionManager
315
338
  * type lives in the extensions package — importing it would create a circular
316
- * dependency. We only rely on the `getDescriptorsByKind` method signature.
339
+ * dependency. An `ExtensionManager` is read through
340
+ * `getRegistry(kind).listActive()`; another object can expose
341
+ * `getDescriptorsByKind(kind)` instead.
317
342
  *
318
- * @param extensionManager - Object exposing `getDescriptorsByKind(kind)` that
319
- * returns an array of `{ id: string; payload: unknown }` descriptors.
343
+ * @param extensionManager - An `ExtensionManager`, or an object exposing
344
+ * `getDescriptorsByKind(kind)`; either returns `{ id: string; payload: unknown }`
345
+ * descriptors.
346
+ * @returns One registration per active descriptor that carries a provider.
320
347
  *
321
348
  * @example
322
349
  * ```ts
323
350
  * // Called internally by refresh():
324
- * this.discoverExtensionProviders(extensionManager);
351
+ * const discovered = this.discoverExtensionProviders(extensionManager);
325
352
  * ```
326
353
  */
327
354
  private discoverExtensionProviders;
355
+ /**
356
+ * Remove the providers an earlier `refresh(extensionManager)` read that the
357
+ * manager no longer lists as active (an unloaded pack or a deactivated
358
+ * descriptor), so the resolve methods stop returning them. A registration
359
+ * that now holds a different provider is left alone.
360
+ *
361
+ * @param discovered - The registrations read from the manager this refresh.
362
+ */
363
+ private dropProvidersNoLongerDiscovered;
328
364
  /**
329
365
  * Boost priority for providers listed in `config.stt.preferred` /
330
366
  * `config.tts.preferred`.
@@ -1 +1 @@
1
- {"version":3,"file":"SpeechProviderResolver.d.ts","sourceRoot":"","sources":["../../../src/io/speech/SpeechProviderResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IA2BpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IA3BtB;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAA2C;IAEhE;;;;;;;;;;;;;;;;;OAiBG;gBAEgB,MAAM,CAAC,EAAE,oBAAoB,YAAA,EAC7B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe;IAKxE;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,QAAQ,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI;IAKzC;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,EAAE;IAM/D;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,oBAAoB;IAiBrE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,oBAAoB;IAgBrE;;;;;;;;;;;;;;;OAeG;IACH,UAAU,IAAI,iBAAiB;IAQ/B;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,IAAI,gBAAgB,GAAG,IAAI;IAS1C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,qBAAqB;IAsD7B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,0BAA0B;IA6ClC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,wBAAwB;CAcjC"}
1
+ {"version":3,"file":"SpeechProviderResolver.d.ts","sourceRoot":"","sources":["../../../src/io/speech/SpeechProviderResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IA8CpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG;IA9CtB;;;;;OAKG;IACH,OAAO,CAAC,aAAa,CAA2C;IAEhE;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;OAGG;IACH,OAAO,CAAC,UAAU,CAA8B;IAEhD,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,KAAK;IAIpB;;;;;;;;;;;;;;;;;OAiBG;gBAEgB,MAAM,CAAC,EAAE,oBAAoB,YAAA,EAC7B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe;IAKxE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI;IAYzC;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,EAAE;IAM/D;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,oBAAoB;IAiBrE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,UAAU,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,oBAAoB;IAgBrE;;;;;;;;;;;;;;;OAeG;IACH,UAAU,IAAI,iBAAiB;IAQ/B;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,IAAI,gBAAgB,GAAG,IAAI;IAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACG,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,qBAAqB;IAsD7B;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,0BAA0B;IAoDlC;;;;;;;OAOG;IACH,OAAO,CAAC,+BAA+B;IAUvC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,wBAAwB;CAmBjC"}
@@ -56,6 +56,10 @@ import { findSpeechProviderCatalogEntry } from './providerCatalog.js';
56
56
  * ```
57
57
  */
58
58
  export class SpeechProviderResolver extends EventEmitter {
59
+ /** Map key of a registration: providers of different kinds may share an id. */
60
+ static keyOf(kind, id) {
61
+ return `${kind}:${id}`;
62
+ }
59
63
  /**
60
64
  * Creates a new SpeechProviderResolver.
61
65
  *
@@ -79,14 +83,29 @@ export class SpeechProviderResolver extends EventEmitter {
79
83
  this.config = config;
80
84
  this.env = env;
81
85
  /**
82
- * Internal registry of all providers keyed by their unique string id.
83
- * Overwrites are allowed — re-registering with the same id replaces the
84
- * previous entry, which lets hot-reload and extension refresh work seamlessly.
86
+ * Internal registry of all providers, keyed by kind and id (`keyOf()`), so a
87
+ * speech-to-text and a text-to-speech provider can share an id. Overwrites
88
+ * are allowed — re-registering the same kind and id replaces the previous
89
+ * entry, which lets hot-reload and extension refresh work seamlessly.
85
90
  */
86
91
  this.registrations = new Map();
92
+ /**
93
+ * The priority each provider was registered with. `refresh()` restores it
94
+ * before applying the preferred lists, so a provider that is no longer
95
+ * preferred loses its boost.
96
+ */
97
+ this.basePriorities = new Map();
98
+ /**
99
+ * The providers the last `refresh(extensionManager)` read from the manager,
100
+ * by key, so the next one can drop those the manager no longer lists.
101
+ */
102
+ this.discovered = new Map();
87
103
  }
88
104
  /**
89
- * Register a provider, overwriting any existing registration with the same id.
105
+ * Register a provider, overwriting any existing registration with the same
106
+ * kind and id. Re-registering at the priority the resolver shows (a preferred
107
+ * boost included), as `register({ ...entry, provider })` does, keeps the
108
+ * priority the provider was first registered with.
90
109
  *
91
110
  * Emits a `provider_registered` event with `{ id, kind, source }` so that
92
111
  * listeners (e.g. UI dashboards, logging middleware) can track what's available.
@@ -108,7 +127,13 @@ export class SpeechProviderResolver extends EventEmitter {
108
127
  * ```
109
128
  */
110
129
  register(reg) {
111
- this.registrations.set(reg.id, reg);
130
+ const key = SpeechProviderResolver.keyOf(reg.kind, reg.id);
131
+ const current = this.registrations.get(key);
132
+ const base = current && reg.priority === current.priority
133
+ ? (this.basePriorities.get(key) ?? reg.priority)
134
+ : reg.priority;
135
+ this.registrations.set(key, reg);
136
+ this.basePriorities.set(key, base);
112
137
  this.emit('provider_registered', { id: reg.id, kind: reg.kind, source: reg.source });
113
138
  }
114
139
  /**
@@ -256,17 +281,20 @@ export class SpeechProviderResolver extends EventEmitter {
256
281
  * optionally discovering extension providers, and applying user-configured
257
282
  * preferred priorities.
258
283
  *
259
- * The three-phase refresh sequence is:
260
- * 1. `registerCoreProviders()` — register all built-in providers from the
284
+ * The refresh sequence is:
285
+ * 1. `discoverExtensionProviders()` — if an ExtensionManager is provided, read
286
+ * the speech providers it lists as active, and drop the ones an earlier
287
+ * refresh read from it that it no longer lists.
288
+ * 2. `registerCoreProviders()` — register all built-in providers from the
261
289
  * static catalog, marking each as configured/unconfigured based on env vars.
262
- * 2. `discoverExtensionProviders()` — if an ExtensionManager is provided,
263
- * discover and register any additional speech providers from extensions.
264
- * 3. `applyPreferredPriorities()` — boost priority for providers listed in
290
+ * 3. Register the providers read in step 1, at priority 200.
291
+ * 4. `applyPreferredPriorities()` — boost priority for providers listed in
265
292
  * the user's `config.stt.preferred` / `config.tts.preferred` arrays.
266
293
  *
267
- * @param extensionManager - Optional object exposing `getDescriptorsByKind(kind)`.
268
- * Uses `any` type because the ExtensionManager interface is defined in the
269
- * extensions package and importing it here would create a circular dependency.
294
+ * @param extensionManager - Optional `ExtensionManager` (its speech provider
295
+ * registries are read through `getRegistry(kind).listActive()`), or any
296
+ * object exposing `getDescriptorsByKind(kind)`. Uses `any` type because
297
+ * importing the ExtensionManager type here would create a circular dependency.
270
298
  *
271
299
  * @example
272
300
  * ```ts
@@ -276,9 +304,15 @@ export class SpeechProviderResolver extends EventEmitter {
276
304
  * ```
277
305
  */
278
306
  async refresh(extensionManager) {
307
+ const discovered = extensionManager ? this.discoverExtensionProviders(extensionManager) : null;
308
+ if (discovered) {
309
+ this.dropProvidersNoLongerDiscovered(discovered);
310
+ }
279
311
  this.registerCoreProviders();
280
- if (extensionManager) {
281
- this.discoverExtensionProviders(extensionManager);
312
+ if (discovered) {
313
+ for (const reg of discovered)
314
+ this.register(reg);
315
+ this.discovered = new Map(discovered.map((reg) => [SpeechProviderResolver.keyOf(reg.kind, reg.id), reg.provider]));
282
316
  }
283
317
  this.applyPreferredPriorities();
284
318
  }
@@ -316,7 +350,7 @@ export class SpeechProviderResolver extends EventEmitter {
316
350
  if (requirements?.preferredIds?.length) {
317
351
  const results = [];
318
352
  for (const id of requirements.preferredIds) {
319
- const reg = this.registrations.get(id);
353
+ const reg = this.registrations.get(SpeechProviderResolver.keyOf(kind, id));
320
354
  if (reg &&
321
355
  reg.kind === kind &&
322
356
  reg.isConfigured &&
@@ -418,7 +452,7 @@ export class SpeechProviderResolver extends EventEmitter {
418
452
  ];
419
453
  for (const def of coreProviders) {
420
454
  // Keep an instance that SpeechRuntime or an extension registered under this id.
421
- if (this.registrations.get(def.id)?.provider)
455
+ if (this.registrations.get(SpeechProviderResolver.keyOf(def.kind, def.id))?.provider)
422
456
  continue;
423
457
  const catalogEntry = findSpeechProviderCatalogEntry(def.id);
424
458
  // Skip providers not found in the catalog (should not happen, but defensive)
@@ -442,24 +476,31 @@ export class SpeechProviderResolver extends EventEmitter {
442
476
  }
443
477
  }
444
478
  /**
445
- * Discover speech providers exposed by an ExtensionManager via
446
- * `getDescriptorsByKind()`.
479
+ * Read the speech providers an ExtensionManager lists as active, as
480
+ * registrations for `refresh()` to register.
447
481
  *
448
482
  * Extension providers are registered with `priority: 200` (lower than core's
449
483
  * 100) so they serve as fallbacks unless the user explicitly boosts them via
450
- * `config.stt.preferred` / `config.tts.preferred`.
484
+ * `config.stt.preferred` / `config.tts.preferred`. Each is registered under
485
+ * the provider's own `id` (the descriptor id when the provider has none), the
486
+ * id preferred lists and `SpeechRuntime` use, and counts as configured: the
487
+ * pack built the instance with its own options and secrets.
451
488
  *
452
489
  * The `extensionManager` parameter uses `any` because the ExtensionManager
453
490
  * type lives in the extensions package — importing it would create a circular
454
- * dependency. We only rely on the `getDescriptorsByKind` method signature.
491
+ * dependency. An `ExtensionManager` is read through
492
+ * `getRegistry(kind).listActive()`; another object can expose
493
+ * `getDescriptorsByKind(kind)` instead.
455
494
  *
456
- * @param extensionManager - Object exposing `getDescriptorsByKind(kind)` that
457
- * returns an array of `{ id: string; payload: unknown }` descriptors.
495
+ * @param extensionManager - An `ExtensionManager`, or an object exposing
496
+ * `getDescriptorsByKind(kind)`; either returns `{ id: string; payload: unknown }`
497
+ * descriptors.
498
+ * @returns One registration per active descriptor that carries a provider.
458
499
  *
459
500
  * @example
460
501
  * ```ts
461
502
  * // Called internally by refresh():
462
- * this.discoverExtensionProviders(extensionManager);
503
+ * const discovered = this.discoverExtensionProviders(extensionManager);
463
504
  * ```
464
505
  */
465
506
  discoverExtensionProviders(extensionManager) {
@@ -474,34 +515,58 @@ export class SpeechProviderResolver extends EventEmitter {
474
515
  'vad-provider': 'vad',
475
516
  'wake-word-provider': 'wake-word',
476
517
  };
518
+ const found = [];
477
519
  for (const descriptorKind of Object.keys(kindMap)) {
478
- const descriptors = extensionManager.getDescriptorsByKind?.(descriptorKind) ?? [];
520
+ const kind = kindMap[descriptorKind] ?? 'stt';
521
+ const descriptors = typeof extensionManager.getDescriptorsByKind === 'function'
522
+ ? (extensionManager.getDescriptorsByKind(descriptorKind) ?? [])
523
+ : typeof extensionManager.getRegistry === 'function'
524
+ ? (extensionManager.getRegistry(descriptorKind)?.listActive?.() ?? [])
525
+ : [];
479
526
  for (const desc of descriptors) {
480
- // Try to find a catalog entry for known extensions; fall back to a
481
- // synthetic entry for unknown/third-party extensions.
482
- const catalogEntry = findSpeechProviderCatalogEntry(desc.id);
483
- const isConfigured = catalogEntry
484
- ? catalogEntry.envVars.length === 0 ||
485
- catalogEntry.envVars.every((v) => Boolean(this.env[v]))
486
- : true; // Unknown extensions are assumed configured since we can't check
487
- this.register({
488
- id: desc.id,
489
- kind: kindMap[descriptorKind] ?? 'stt',
490
- provider: desc.payload,
527
+ const provider = desc?.payload;
528
+ if (!provider)
529
+ continue;
530
+ const id = typeof provider.id === 'string' && provider.id ? provider.id : desc.id;
531
+ // Known providers keep their catalog entry (capabilities); others get a
532
+ // synthetic one.
533
+ const catalogEntry = findSpeechProviderCatalogEntry(id);
534
+ found.push({
535
+ id,
536
+ kind,
537
+ provider,
491
538
  catalogEntry: catalogEntry ?? {
492
- id: desc.id,
493
- kind: kindMap[descriptorKind] ?? 'stt',
494
- label: desc.id,
539
+ id,
540
+ kind,
541
+ label: id,
495
542
  envVars: [],
496
543
  local: false,
497
544
  description: '',
498
545
  },
499
- isConfigured,
546
+ isConfigured: true,
500
547
  priority: 200, // Extensions rank below core by default
501
548
  source: 'extension',
502
549
  });
503
550
  }
504
551
  }
552
+ return found;
553
+ }
554
+ /**
555
+ * Remove the providers an earlier `refresh(extensionManager)` read that the
556
+ * manager no longer lists as active (an unloaded pack or a deactivated
557
+ * descriptor), so the resolve methods stop returning them. A registration
558
+ * that now holds a different provider is left alone.
559
+ *
560
+ * @param discovered - The registrations read from the manager this refresh.
561
+ */
562
+ dropProvidersNoLongerDiscovered(discovered) {
563
+ const current = new Set(discovered.map((reg) => SpeechProviderResolver.keyOf(reg.kind, reg.id)));
564
+ for (const [key, provider] of this.discovered) {
565
+ if (!current.has(key) && this.registrations.get(key)?.provider === provider) {
566
+ this.registrations.delete(key);
567
+ this.basePriorities.delete(key);
568
+ }
569
+ }
505
570
  }
506
571
  /**
507
572
  * Boost priority for providers listed in `config.stt.preferred` /
@@ -521,16 +586,21 @@ export class SpeechProviderResolver extends EventEmitter {
521
586
  * ```
522
587
  */
523
588
  applyPreferredPriorities() {
589
+ // Start from the registered priorities, so a provider dropped from a
590
+ // preferred list does not keep the boost an earlier refresh gave it.
591
+ for (const [key, reg] of this.registrations) {
592
+ reg.priority = this.basePriorities.get(key) ?? reg.priority;
593
+ }
524
594
  if (this.config?.stt?.preferred) {
525
595
  for (let i = 0; i < this.config.stt.preferred.length; i++) {
526
- const reg = this.registrations.get(this.config.stt.preferred[i]);
596
+ const reg = this.registrations.get(SpeechProviderResolver.keyOf('stt', this.config.stt.preferred[i]));
527
597
  if (reg)
528
598
  reg.priority = 50 + i;
529
599
  }
530
600
  }
531
601
  if (this.config?.tts?.preferred) {
532
602
  for (let i = 0; i < this.config.tts.preferred.length; i++) {
533
- const reg = this.registrations.get(this.config.tts.preferred[i]);
603
+ const reg = this.registrations.get(SpeechProviderResolver.keyOf('tts', this.config.tts.preferred[i]));
534
604
  if (reg)
535
605
  reg.priority = 50 + i;
536
606
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SpeechProviderResolver.js","sourceRoot":"","sources":["../../../src/io/speech/SpeechProviderResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpeechProviderResolver.js","sourceRoot":"","sources":["../../../src/io/speech/SpeechProviderResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IAsBtD,+EAA+E;IACvE,MAAM,CAAC,KAAK,CAAC,IAAwB,EAAE,EAAU;QACvD,OAAO,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,YACmB,MAA6B,EAC7B,MAA0C,OAAO,CAAC,GAAG;QAEtE,KAAK,EAAE,CAAC;QAHS,WAAM,GAAN,MAAM,CAAuB;QAC7B,QAAG,GAAH,GAAG,CAAkD;QA9CxE;;;;;WAKG;QACK,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;QAEhE;;;;WAIG;QACK,mBAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEnD;;;WAGG;QACK,eAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IA8BhD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,QAAQ,CAAC,GAAyB;QAChC,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,IAAI,GACR,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;YAChD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,CAAC,IAAwB;QACpC,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;aAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,UAAU,CAAC,YAAmC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,sEAAsE;QACtE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,gBAAgB,CACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAgC,CAAC,EACzD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,QAAgC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,UAAU,CAAC,YAAmC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,uEAAuE;QACvE,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,gBAAgB,CACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAgC,CAAC,EACzD,IAAI,CACL,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,QAAgC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,UAAU;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,QAA6B,CAAC;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAChF,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,CAAC;IAED,8EAA8E;IAC9E,4BAA4B;IAC5B,8EAA8E;IAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,KAAK,CAAC,OAAO,CAAC,gBAAsB;QAClC,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,UAAU;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,CACvB,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAqB,EAAE,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAC3G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACK,aAAa,CACnB,IAAwB,EACxB,YAAmC;QAEnC,sDAAsD;QACtD,IAAI,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YACvC,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC3E,IACE,GAAG;oBACH,GAAG,CAAC,IAAI,KAAK,IAAI;oBACjB,GAAG,CAAC,YAAY;oBAChB,GAAG,CAAC,QAAQ,IAAI,IAAI;oBACpB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,EAC3C,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,oDAAoD;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACK,mBAAmB,CAAC,GAAyB,EAAE,GAA0B;QAC/E,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,mCAAmC;QACnC,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE9F,qCAAqC;QACrC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAElF,0EAA0E;QAC1E,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACzB,MAAM,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC7E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACK,qBAAqB;QAC3B;;;;;WAKG;QACH,MAAM,aAAa,GAAG;YACpB,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE;YAC3E,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE;YAC7E,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;YAC3E;gBACE,EAAE,EAAE,kBAAkB;gBACtB,IAAI,EAAE,KAAc;gBACpB,OAAO,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;aACrD;YACD,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE;YACvE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;YAC3E,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,CAAC,kBAAkB,CAAC,EAAE;YAC5E;gBACE,EAAE,EAAE,kBAAkB;gBACtB,IAAI,EAAE,KAAc;gBACpB,OAAO,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;aACrD;YACD,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,KAAc,EAAE,OAAO,EAAE,EAAc,EAAE;SAC9E,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,gFAAgF;YAChF,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ;gBAAE,SAAS;YAE/F,MAAM,YAAY,GAAG,8BAA8B,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5D,6EAA6E;YAC7E,IAAI,CAAC,YAAY;gBAAE,SAAS;YAC5B,8EAA8E;YAC9E,IAAI,YAAY,CAAC,SAAS,KAAK,KAAK;gBAAE,SAAS;YAE/C,6EAA6E;YAC7E,2DAA2D;YAC3D,MAAM,YAAY,GAChB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE7E,IAAI,CAAC,QAAQ,CAAC;gBACZ,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,IAAW,EAAE,0EAA0E;gBACjG,YAAY;gBACZ,YAAY;gBACZ,QAAQ,EAAE,GAAG;gBACb,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACK,0BAA0B,CAAC,gBAAqB;QACtD;;;;WAIG;QACH,MAAM,OAAO,GAAuC;YAClD,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;YACrB,oBAAoB,EAAE,WAAW;SAClC,CAAC;QAEF,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;YAC9C,MAAM,WAAW,GACf,OAAO,gBAAgB,CAAC,oBAAoB,KAAK,UAAU;gBACzD,CAAC,CAAC,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC/D,CAAC,CAAC,OAAO,gBAAgB,CAAC,WAAW,KAAK,UAAU;oBAClD,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC;oBACtE,CAAC,CAAC,EAAE,CAAC;YAEX,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,IAAI,EAAE,OAAO,CAAC;gBAC/B,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,EAAE,GAAG,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClF,wEAAwE;gBACxE,iBAAiB;gBACjB,MAAM,YAAY,GAAG,8BAA8B,CAAC,EAAE,CAAC,CAAC;gBAExD,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE;oBACF,IAAI;oBACJ,QAAQ;oBACR,YAAY,EAAE,YAAY,IAAI;wBAC5B,EAAE;wBACF,IAAI;wBACJ,KAAK,EAAE,EAAE;wBACT,OAAO,EAAE,EAAE;wBACX,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,EAAE;qBAChB;oBACD,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,GAAG,EAAE,wCAAwC;oBACvD,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACK,+BAA+B,CAAC,UAAkC;QACxE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjG,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC5E,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,wBAAwB;QAC9B,qEAAqE;QACrE,qEAAqE;QACrE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtG,IAAI,GAAG;oBAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtG,IAAI,GAAG;oBAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framers/agentos",
3
- "version": "0.11.1",
3
+ "version": "0.11.4",
4
4
  "description": "AgentOS: open-source TypeScript framework for autonomous AI agents. Unified graph orchestration, cognitive memory, runtime tool forging, multi-tier guardrails, voice pipeline, and 11 LLM providers.",
5
5
  "homepage": "https://agentos.sh",
6
6
  "repository": {