@ggui-ai/protocol 0.5.0-rc.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,7 +12,7 @@ export declare const STDLIB_GADGETS_PACKAGE = "@ggui-ai/gadgets";
12
12
  * in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
13
13
  * bump to the runtime package without updating this constant fails CI.
14
14
  */
15
- export declare const STDLIB_GADGETS_VERSION = "0.5.0-rc.1";
15
+ export declare const STDLIB_GADGETS_VERSION = "0.6.0";
16
16
  /**
17
17
  * v1 catalog of stdlib gadget descriptors. Every entry's
18
18
  * `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
@@ -1 +1 @@
1
- {"version":3,"file":"stdlib-gadgets.d.ts","sourceRoot":"","sources":["../../src/gadgets/stdlib-gadgets.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,CAAC,gBAAgB,CAAC,EAkH/D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUnD,CAAC"}
1
+ {"version":3,"file":"stdlib-gadgets.d.ts","sourceRoot":"","sources":["../../src/gadgets/stdlib-gadgets.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,CAAC,gBAAgB,CAAC,EAkH/D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUnD,CAAC"}
@@ -39,7 +39,7 @@ export const STDLIB_GADGETS_PACKAGE = '@ggui-ai/gadgets';
39
39
  * in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
40
40
  * bump to the runtime package without updating this constant fails CI.
41
41
  */
42
- export const STDLIB_GADGETS_VERSION = '0.5.0-rc.1';
42
+ export const STDLIB_GADGETS_VERSION = '0.6.0';
43
43
  /**
44
44
  * v1 catalog of stdlib gadget descriptors. Every entry's
45
45
  * `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
@@ -175,8 +175,8 @@ export declare function isValidLlmRoute(provider: string, model: string): boolea
175
175
  * → `'anthropic:claude-haiku-4-5-20251001'`
176
176
  * `{provider: 'bedrock', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'}`
177
177
  * → `'bedrock:us.anthropic.claude-haiku-4-5-20251001-v1:0'`
178
- * `{provider: 'openrouter', model: 'anthropic/claude-3-5-sonnet'}`
179
- * → `'openrouter:anthropic/claude-3-5-sonnet'`
178
+ * `{provider: 'openrouter', model: 'anthropic/claude-haiku-4.5'}`
179
+ * → `'openrouter:anthropic/claude-haiku-4.5'`
180
180
  */
181
181
  export declare function serializeLlmRoute(route: LlmRoute): string;
182
182
  /**
@@ -200,8 +200,8 @@ export declare function parseLlmRoute(serialized: string): LlmRoute | null;
200
200
  * - `gemini/gemini-3.5-flash` → `{google, gemini-3.5-flash}`
201
201
  * - `openai/gpt-5.5-...` → `{openai, gpt-5.5-...}`
202
202
  * - `bedrock/us.anthropic...` → `{bedrock, us.anthropic...}`
203
- * - `openrouter/anthropic/claude-3-5-sonnet`
204
- * → `{openrouter, anthropic/claude-3-5-sonnet}`
203
+ * - `openrouter/anthropic/claude-haiku-4.5`
204
+ * → `{openrouter, anthropic/claude-haiku-4.5}`
205
205
  *
206
206
  * Used at wire boundaries (ggui.json parser, CLI flag, env var) so
207
207
  * existing operator configs keep working without a forced migration.
@@ -262,7 +262,7 @@ export function isValidLlmRoute(provider, model) {
262
262
  /**
263
263
  * Canonical wire format separator. `:` chosen over `/` because
264
264
  * `/` collides with OpenRouter's own `<author>/<model>` form
265
- * (`openrouter/anthropic/claude-3-5-sonnet` has TWO slashes; ambiguous
265
+ * (`openrouter/anthropic/claude-haiku-4.5` has TWO slashes; ambiguous
266
266
  * to split). Bedrock's model string also contains `.` and `:` — `:`
267
267
  * is fine as the OUTER separator because the inner `:` is always
268
268
  * preceded by a `.` or alphanumerics; the FIRST `:` in the serialized
@@ -279,8 +279,8 @@ const CANONICAL_SEPARATOR = ':';
279
279
  * → `'anthropic:claude-haiku-4-5-20251001'`
280
280
  * `{provider: 'bedrock', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'}`
281
281
  * → `'bedrock:us.anthropic.claude-haiku-4-5-20251001-v1:0'`
282
- * `{provider: 'openrouter', model: 'anthropic/claude-3-5-sonnet'}`
283
- * → `'openrouter:anthropic/claude-3-5-sonnet'`
282
+ * `{provider: 'openrouter', model: 'anthropic/claude-haiku-4.5'}`
283
+ * → `'openrouter:anthropic/claude-haiku-4.5'`
284
284
  */
285
285
  export function serializeLlmRoute(route) {
286
286
  return `${route.provider}${CANONICAL_SEPARATOR}${route.model}`;
@@ -358,8 +358,8 @@ const LITELLM_TO_WIRE = {
358
358
  * - `gemini/gemini-3.5-flash` → `{google, gemini-3.5-flash}`
359
359
  * - `openai/gpt-5.5-...` → `{openai, gpt-5.5-...}`
360
360
  * - `bedrock/us.anthropic...` → `{bedrock, us.anthropic...}`
361
- * - `openrouter/anthropic/claude-3-5-sonnet`
362
- * → `{openrouter, anthropic/claude-3-5-sonnet}`
361
+ * - `openrouter/anthropic/claude-haiku-4.5`
362
+ * → `{openrouter, anthropic/claude-haiku-4.5}`
363
363
  *
364
364
  * Used at wire boundaries (ggui.json parser, CLI flag, env var) so
365
365
  * existing operator configs keep working without a forced migration.
@@ -25,14 +25,27 @@
25
25
  * `LLMProvider` (capital)) were deleted in the slice #43 close-out —
26
26
  * routing went through `parseAnyLlmRoute` + typed dispatch.
27
27
  *
28
- * Pricing last verified: March 2026
28
+ * Pricing last verified: 2026-08-04 (all three providers re-checked
29
+ * against the vendored LiteLLM snapshot + vendor announcements).
29
30
  * Sources:
30
31
  * https://docs.anthropic.com/en/docs/about-claude/pricing
31
32
  * https://developers.openai.com/api/docs/pricing/
32
33
  * https://ai.google.dev/gemini-api/docs/pricing
34
+ *
35
+ * KEEPING THIS HONEST: `costs` here is what the benchmark harness and
36
+ * every cost read price against, and until 2026-07-31 nothing compared
37
+ * it to anything — the vendored-snapshot test only asserted a row
38
+ * EXISTS, and `scripts/check-litellm-pricing-drift.ts` compares the
39
+ * snapshot against upstream, never the registry. That gap let this
40
+ * table sit four months stale while production routed to models it did
41
+ * not even list. The pod's `pricing-tables.test.ts` now asserts every
42
+ * entry's `costs` match the vendored rate (with an explicit, dated
43
+ * PENDING_UPSTREAM allowlist for prices we learn before LiteLLM does).
44
+ * Add a model here and you MUST re-vendor the snapshot in the same
45
+ * slice.
33
46
  */
34
47
  import type { LlmProvider } from "./llm-route.js";
35
- export type ModelId = "anthropic/claude-haiku-4-5" | "anthropic/claude-sonnet-4-6" | "anthropic/claude-opus-4-6" | "gemini/gemini-3.5-flash" | "gemini/gemini-3.1-flash-lite" | "gemini/gemini-3-flash-preview" | "gemini/gemini-3.1-pro-preview" | "openai/gpt-5.3-codex" | "openai/gpt-5.4" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano";
48
+ export type ModelId = "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4-5" | "anthropic/claude-opus-4-7" | "anthropic/claude-sonnet-4-6" | "anthropic/claude-opus-4-6" | "gemini/gemini-3.6-flash" | "gemini/gemini-3.5-flash" | "gemini/gemini-3.5-flash-lite" | "gemini/gemini-3.1-flash-lite" | "gemini/gemini-3-flash-preview" | "gemini/gemini-3.1-pro-preview" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.3-codex" | "openai/gpt-5.4" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano";
36
49
  export type ModelTier = "fast" | "balanced" | "premium";
37
50
  export interface ModelConfig {
38
51
  id: ModelId;
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,MAAM,OAAO,GAEf,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAE3B,yBAAyB,GACzB,8BAA8B,GAC9B,+BAA+B,GAC/B,+BAA+B,GAE/B,sBAAsB,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAgI9C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,OAAsC,CAAC"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,MAAM,OAAO,GAEf,0BAA0B,GAC1B,yBAAyB,GACzB,2BAA2B,GAC3B,4BAA4B,GAC5B,2BAA2B,GAC3B,6BAA6B,GAC7B,2BAA2B,GAE3B,yBAAyB,GACzB,yBAAyB,GACzB,8BAA8B,GAC9B,8BAA8B,GAC9B,+BAA+B,GAC/B,+BAA+B,GAE/B,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,sBAAsB,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAuP9C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,OAAsC,CAAC"}
package/dist/types/llm.js CHANGED
@@ -25,17 +25,76 @@
25
25
  * `LLMProvider` (capital)) were deleted in the slice #43 close-out —
26
26
  * routing went through `parseAnyLlmRoute` + typed dispatch.
27
27
  *
28
- * Pricing last verified: March 2026
28
+ * Pricing last verified: 2026-08-04 (all three providers re-checked
29
+ * against the vendored LiteLLM snapshot + vendor announcements).
29
30
  * Sources:
30
31
  * https://docs.anthropic.com/en/docs/about-claude/pricing
31
32
  * https://developers.openai.com/api/docs/pricing/
32
33
  * https://ai.google.dev/gemini-api/docs/pricing
34
+ *
35
+ * KEEPING THIS HONEST: `costs` here is what the benchmark harness and
36
+ * every cost read price against, and until 2026-07-31 nothing compared
37
+ * it to anything — the vendored-snapshot test only asserted a row
38
+ * EXISTS, and `scripts/check-litellm-pricing-drift.ts` compares the
39
+ * snapshot against upstream, never the registry. That gap let this
40
+ * table sit four months stale while production routed to models it did
41
+ * not even list. The pod's `pricing-tables.test.ts` now asserts every
42
+ * entry's `costs` match the vendored rate (with an explicit, dated
43
+ * PENDING_UPSTREAM allowlist for prices we learn before LiteLLM does).
44
+ * Add a model here and you MUST re-vendor the snapshot in the same
45
+ * slice.
33
46
  */
34
47
  // =============================================================================
35
48
  // Model Registry — verified pricing March 2026
36
49
  // =============================================================================
37
50
  export const MODEL_REGISTRY = {
38
51
  // ── Anthropic Claude ──────────────────────────────────────────────
52
+ "anthropic/claude-fable-5": {
53
+ id: "anthropic/claude-fable-5",
54
+ provider: "anthropic",
55
+ displayName: "Claude Fable 5",
56
+ tier: "premium",
57
+ costs: {
58
+ inputPer1M: 10.0,
59
+ outputPer1M: 50.0,
60
+ cacheWritePer1M: 12.5,
61
+ cacheReadPer1M: 1.0,
62
+ },
63
+ maxTokens: 1000000,
64
+ supportsTools: true,
65
+ },
66
+ "anthropic/claude-opus-5": {
67
+ id: "anthropic/claude-opus-5",
68
+ provider: "anthropic",
69
+ displayName: "Claude Opus 5",
70
+ tier: "premium",
71
+ costs: {
72
+ inputPer1M: 5.0,
73
+ outputPer1M: 25.0,
74
+ cacheWritePer1M: 6.25,
75
+ cacheReadPer1M: 0.5,
76
+ },
77
+ maxTokens: 1000000,
78
+ supportsTools: true,
79
+ },
80
+ // NOTE(pricing): $2/$10 is Anthropic's INTRODUCTORY rate, in effect
81
+ // through 2026-08-31; it reverts to $3/$15 on 2026-09-01. Re-check
82
+ // this entry then — the vendored LiteLLM snapshot carries the intro
83
+ // rate too, so the drift guard will not flag the reversion for us.
84
+ "anthropic/claude-sonnet-5": {
85
+ id: "anthropic/claude-sonnet-5",
86
+ provider: "anthropic",
87
+ displayName: "Claude Sonnet 5",
88
+ tier: "balanced",
89
+ costs: {
90
+ inputPer1M: 2.0,
91
+ outputPer1M: 10.0,
92
+ cacheWritePer1M: 2.5,
93
+ cacheReadPer1M: 0.2,
94
+ },
95
+ maxTokens: 1000000,
96
+ supportsTools: true,
97
+ },
39
98
  // Default generation model (ui-gen's default engine; see
40
99
  // DEFAULT_MODEL below). Hosted pools default here too.
41
100
  "anthropic/claude-haiku-4-5": {
@@ -66,6 +125,20 @@ export const MODEL_REGISTRY = {
66
125
  maxTokens: 200000,
67
126
  supportsTools: true,
68
127
  },
128
+ "anthropic/claude-opus-4-7": {
129
+ id: "anthropic/claude-opus-4-7",
130
+ provider: "anthropic",
131
+ displayName: "Claude Opus 4.7",
132
+ tier: "premium",
133
+ costs: {
134
+ inputPer1M: 5.0,
135
+ outputPer1M: 25.0,
136
+ cacheWritePer1M: 6.25,
137
+ cacheReadPer1M: 0.5,
138
+ },
139
+ maxTokens: 1000000,
140
+ supportsTools: true,
141
+ },
69
142
  "anthropic/claude-opus-4-6": {
70
143
  id: "anthropic/claude-opus-4-6",
71
144
  provider: "anthropic",
@@ -85,6 +158,16 @@ export const MODEL_REGISTRY = {
85
158
  // (https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json);
86
159
  // host-side consumers may apply a more authoritative price table
87
160
  // if they ship one.
161
+ "gemini/gemini-3.6-flash": {
162
+ id: "gemini/gemini-3.6-flash",
163
+ provider: "google",
164
+ displayName: "Gemini 3.6 Flash",
165
+ tier: "fast",
166
+ costs: { inputPer1M: 1.5, outputPer1M: 7.5, cacheReadPer1M: 0.15 },
167
+ maxTokens: 1048576,
168
+ supportsTools: true,
169
+ supportsCaching: true,
170
+ },
88
171
  "gemini/gemini-3.5-flash": {
89
172
  id: "gemini/gemini-3.5-flash",
90
173
  provider: "google",
@@ -95,6 +178,17 @@ export const MODEL_REGISTRY = {
95
178
  supportsTools: true,
96
179
  supportsCaching: true,
97
180
  },
181
+ // Google-lane generation default (`evaluator.ts`, `generation-probe.ts`).
182
+ "gemini/gemini-3.5-flash-lite": {
183
+ id: "gemini/gemini-3.5-flash-lite",
184
+ provider: "google",
185
+ displayName: "Gemini 3.5 Flash Lite",
186
+ tier: "fast",
187
+ costs: { inputPer1M: 0.3, outputPer1M: 2.5, cacheReadPer1M: 0.03 },
188
+ maxTokens: 1048576,
189
+ supportsTools: true,
190
+ supportsCaching: true,
191
+ },
98
192
  // Google-lane reference model (cost-per-token floor).
99
193
  "gemini/gemini-3.1-flash-lite": {
100
194
  id: "gemini/gemini-3.1-flash-lite",
@@ -124,6 +218,44 @@ export const MODEL_REGISTRY = {
124
218
  supportsTools: true,
125
219
  },
126
220
  // ── OpenAI ────────────────────────────────────────────────────────
221
+ // GPT-5.6 family (2026-07). OpenAI cut Luna 80% and Terra 20% on
222
+ // 2026-07-30; Sol was left unchanged. The 2026-08-04 re-vendor
223
+ // confirmed upstream LiteLLM has ingested both cuts, so these costs
224
+ // now agree with the vendored snapshot (no PENDING_UPSTREAM
225
+ // exemption needed).
226
+ "openai/gpt-5.6-sol": {
227
+ id: "openai/gpt-5.6-sol",
228
+ provider: "openai",
229
+ displayName: "GPT-5.6 Sol",
230
+ tier: "premium",
231
+ costs: {
232
+ inputPer1M: 5.0,
233
+ outputPer1M: 30.0,
234
+ cacheWritePer1M: 6.25,
235
+ cacheReadPer1M: 0.5,
236
+ },
237
+ maxTokens: 1050000,
238
+ supportsTools: true,
239
+ },
240
+ "openai/gpt-5.6-terra": {
241
+ id: "openai/gpt-5.6-terra",
242
+ provider: "openai",
243
+ displayName: "GPT-5.6 Terra",
244
+ tier: "balanced",
245
+ costs: { inputPer1M: 2.0, outputPer1M: 12.0, cacheReadPer1M: 0.2 },
246
+ maxTokens: 1050000,
247
+ supportsTools: true,
248
+ },
249
+ // OpenAI-lane generation default (`evaluator.ts`, `generation-probe.ts`).
250
+ "openai/gpt-5.6-luna": {
251
+ id: "openai/gpt-5.6-luna",
252
+ provider: "openai",
253
+ displayName: "GPT-5.6 Luna",
254
+ tier: "fast",
255
+ costs: { inputPer1M: 0.2, outputPer1M: 1.2, cacheReadPer1M: 0.02 },
256
+ maxTokens: 1050000,
257
+ supportsTools: true,
258
+ },
127
259
  "openai/gpt-5.3-codex": {
128
260
  id: "openai/gpt-5.3-codex",
129
261
  provider: "openai",
@@ -563,7 +563,7 @@ export function validateContractStructure(contract) {
563
563
  }
564
564
  // Schema-compat invariants: action.schema ⊆ tool.inputSchema and
565
565
  // channel.schema ⊇ tool.outputSchema, validated against the
566
- // contract's OWN agentTools catalog. Distinct scope from the
566
+ // contract's OWN agentCapabilities.tools catalog. Distinct scope from the
567
567
  // server-level F4 check (which compares against the live tool
568
568
  // registry's zod schemas).
569
569
  for (const violation of checkSchemaCompat(contract)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggui-ai/protocol",
3
- "version": "0.5.0-rc.1",
3
+ "version": "0.6.0",
4
4
  "description": "ggui protocol types — events, renders, WebSocket, MCP, LLM models",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [