typebulb 0.51.3 → 0.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +4 -4
  2. package/SKILL.md +6 -6
  3. package/dist/agents/claude/client.js +201 -200
  4. package/dist/agents/claude/styles.css +34 -10
  5. package/dist/agents/codex/client.js +203 -202
  6. package/dist/agents/codex/styles.css +34 -10
  7. package/dist/agents/pi/client.js +217 -216
  8. package/dist/agents/pi/styles.css +34 -10
  9. package/dist/ai/index.d.ts +1 -1
  10. package/dist/ai/index.d.ts.map +1 -1
  11. package/dist/ai/index.js +1 -1
  12. package/dist/ai/index.js.map +1 -1
  13. package/dist/ai/protocol.d.ts +24 -0
  14. package/dist/ai/protocol.d.ts.map +1 -1
  15. package/dist/ai/protocol.js +15 -0
  16. package/dist/ai/protocol.js.map +1 -1
  17. package/dist/ai/providers/anthropic.d.ts +4 -0
  18. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  19. package/dist/ai/providers/anthropic.js +32 -1
  20. package/dist/ai/providers/anthropic.js.map +1 -1
  21. package/dist/ai/providers/chatCompletions.d.ts +13 -0
  22. package/dist/ai/providers/chatCompletions.d.ts.map +1 -1
  23. package/dist/ai/providers/chatCompletions.js +19 -11
  24. package/dist/ai/providers/chatCompletions.js.map +1 -1
  25. package/dist/ai/providers/gemini.d.ts +10 -0
  26. package/dist/ai/providers/gemini.d.ts.map +1 -1
  27. package/dist/ai/providers/gemini.js +21 -2
  28. package/dist/ai/providers/gemini.js.map +1 -1
  29. package/dist/ai/providers/ollama.d.ts +3 -0
  30. package/dist/ai/providers/ollama.d.ts.map +1 -1
  31. package/dist/ai/providers/ollama.js +5 -1
  32. package/dist/ai/providers/ollama.js.map +1 -1
  33. package/dist/ai/providers/openAI.d.ts +12 -0
  34. package/dist/ai/providers/openAI.d.ts.map +1 -1
  35. package/dist/ai/providers/openAI.js +18 -1
  36. package/dist/ai/providers/openAI.js.map +1 -1
  37. package/dist/ai/providers/openRouter.d.ts +3 -0
  38. package/dist/ai/providers/openRouter.d.ts.map +1 -1
  39. package/dist/ai/providers/openRouter.js +5 -0
  40. package/dist/ai/providers/openRouter.js.map +1 -1
  41. package/dist/ai/sseParser.d.ts +13 -1
  42. package/dist/ai/sseParser.d.ts.map +1 -1
  43. package/dist/ai/sseParser.js +26 -5
  44. package/dist/ai/sseParser.js.map +1 -1
  45. package/dist/dts/tbTypings.d.ts.map +1 -1
  46. package/dist/dts/tbTypings.js +15 -4
  47. package/dist/dts/tbTypings.js.map +1 -1
  48. package/dist/index.js +254 -229
  49. package/dist/render.js +4 -3
  50. package/dist/servers.js +103 -102
  51. package/package.json +1 -1
@@ -326,13 +326,13 @@ body {
326
326
  .shimmer-text { animation: none !important; background: none !important; -webkit-text-fill-color: currentColor; }
327
327
  }
328
328
 
329
- /* CC mid-turn: the token pill doubles as the working indicator — an accent shimmer
330
- over the chip, the count frozen until the turn flushes. Passive — driven by the
331
- live-chain leaf, not a live token stream (the JSONL is flushed in batches, so this
332
- can sit lit through a multi-minute buffering window — hence shimmer-slow). The sweep
333
- blends with --panel, not transparent like the launch buttons': statusbar pills must
334
- stay opaque over the message text the strip lets through. */
335
- .token.busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
329
+ /* THE WORKING STATE for a word pill — the token chip mid-turn, the summarize pill mid-call. Only
330
+ the shimmer's knobs live here; the sweep itself is the shared .shimmer above, composed by
331
+ `busyPill()` (ui.ts) so a new busy pill can't land at its own speed or its own base colour. The
332
+ sweep blends with --panel, not transparent like the launch buttons': a word pill sits over message
333
+ text and must keep covering it. shimmer-slow because these can sit lit for minutes (the JSONL
334
+ flushes in batches, so the token chip rides a whole buffering window). */
335
+ .pill-busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
336
336
 
337
337
  /* ── The composer (TB-Agent-Composer.md): the prompt panel under the transcript. In flow (not
338
338
  overlaid like the statusbar) — it owns real height and must never cover content. ── */
@@ -1870,8 +1870,21 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
1870
1870
  (#draftThinkingPre). Durable rows stay uncapped: finished thinking IS reading material. */
1871
1871
  .draft .thinking pre { max-height: 220px; overflow-y: auto; }
1872
1872
 
1873
- /* Copy button: an .overlay-pill revealed on bubble-hover. */
1874
- .bubble:hover .copy { opacity: 1; }
1873
+ /* The bubble's pill row (summarize, then copy), revealed on bubble-hover. The row does the corner
1874
+ anchoring so the pills inside can sit side by side — each .overlay-pill anchors itself to its
1875
+ container's bottom-right otherwise, and the second would land on the first. Same shape as the
1876
+ inline bulb's .bulb-controls. The reveal is scoped to a DIRECT child row, so an inline bulb's own
1877
+ controls keep their own (bulb-hover) reveal instead of firing on the whole bubble. */
1878
+ .bubble-controls {
1879
+ position: absolute;
1880
+ bottom: .5rem;
1881
+ right: 0; /* flush with the content column's right edge (prose / statusbar pills) */
1882
+ display: flex;
1883
+ gap: .4rem;
1884
+ }
1885
+ .bubble-controls .overlay-pill { position: static; }
1886
+ .bubble:hover > .bubble-controls .overlay-pill,
1887
+ .bubble-controls .overlay-pill:focus-visible { opacity: 1; }
1875
1888
  /* "copied" flash: eases into accent on click (CopyButton is a Component, so its
1876
1889
  node persists across re-renders and the transition actually runs). The color
1877
1890
  transition lives only on .done, not the base pill, so hover stays instant — the
@@ -1884,4 +1897,15 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
1884
1897
  }
1885
1898
  /* Assistant bubbles carry no padding, so the shared .5rem bottom would float the
1886
1899
  pill above the last line — pin it to the text's bottom edge. */
1887
- .bubble.assistant .copy { bottom: 0; }
1900
+ .bubble.assistant > .bubble-controls { bottom: 0; }
1901
+
1902
+ /* The summarize action, riding the PROMPT bubble beside its copy pill (summarizeButton.ts): above
1903
+ the prose, so the flip resizes only what's below it, and over text the reader already knows rather
1904
+ than the reply they came to read. min-width fits its two labels — near-identical in length by
1905
+ design, so the pill never changes width; the working state doesn't enter into it, since the label
1906
+ holds still and .pill-busy shimmers it. Three states outlive the pointer — working, showing,
1907
+ failed — so each holds the pill visible. */
1908
+ .summarize { min-width: 7.6rem; }
1909
+ .summarize.on, .summarize.err, .summarize.pill-busy { opacity: 1; }
1910
+ .summarize.on { color: var(--accent); border-color: var(--accent); }
1911
+ .summarize.err { color: var(--err); border-color: var(--err); }
@@ -1,7 +1,7 @@
1
1
  export * from './protocol.js';
2
2
  export { AIProvider, ProviderStreamError, type ChatRequestOpts } from './aiProvider.js';
3
3
  export { getProvider, sendAIRequest, normalizeUpstreamError, type ResolvedAIProvider, type SendAIRequestOpts } from './aiProviders.js';
4
- export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, streamAiChunks } from './sseParser.js';
4
+ export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, consumeStreamResult, streamAiChunks } from './sseParser.js';
5
5
  export { buildInferencePrompt, sanitizeJsonOutput, encodeToHash, decodeFromHash, hashContainsTb, type InferenceScriptContent, type SanitizeResult, type InferenceResult } from './inference.js';
6
6
  export * from './providers/chatCompletions.js';
7
7
  export * from './providers/anthropic.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGxH,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAA;AAGvB,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG7I,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAA;AAGvB,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
package/dist/ai/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  export * from './protocol.js';
3
3
  export { AIProvider, ProviderStreamError } from './aiProvider.js';
4
4
  export { getProvider, sendAIRequest, normalizeUpstreamError } from './aiProviders.js';
5
- export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, streamAiChunks } from './sseParser.js';
5
+ export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, consumeStreamResult, streamAiChunks } from './sseParser.js';
6
6
  // Inference layer shared with typebulb.com: prompt template, JSON sanitizer, #tb= result encoding.
7
7
  export { buildInferencePrompt, sanitizeJsonOutput, encodeToHash, decodeFromHash, hashContainsTb } from './inference.js';
8
8
  // Per-provider wire DTOs + provider implementations.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EAGvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAExH,mGAAmG;AACnG,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EAIf,MAAM,gBAAgB,CAAA;AAEvB,qDAAqD;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EAGvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE7I,mGAAmG;AACnG,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EAIf,MAAM,gBAAgB,CAAA;AAEvB,qDAAqD;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
@@ -8,6 +8,7 @@ export interface ChatResponseDto {
8
8
  reasoning?: string;
9
9
  status?: 'complete' | 'interrupted' | 'failed' | 'cancelled';
10
10
  error?: string;
11
+ usage?: AiUsage;
11
12
  }
12
13
  export interface UpstreamErrorDto {
13
14
  message: string;
@@ -17,6 +18,10 @@ export interface UpstreamErrorDto {
17
18
  export interface ChatStreamPieceDto {
18
19
  text?: string;
19
20
  reasoning?: string;
21
+ /** Partial by design: providers deliver usage across events (Anthropic: input at message_start,
22
+ * output at message_delta), so each piece carries what its event knew. `streamAiChunks` merges
23
+ * field-wise (later wins — counts are cumulative) into the one final `usage` chunk. */
24
+ usage?: Partial<AiUsage>;
20
25
  }
21
26
  /** A provider's raw JSON response body. Each AIProvider narrows it to its own DTO — the interfaces that extend this (see providers/*). */
22
27
  export interface ProviderResponseDto {
@@ -62,6 +67,22 @@ export declare const asEffort: (v: number | undefined | null) => EffortLevel | u
62
67
  * dropped — for persisted settings, where the nearest level beats falling back to a provider default.
63
68
  * The upper bound must track the dial's top if a level is ever added. */
64
69
  export declare const clampEffort: (v: number) => EffortLevel;
70
+ /** Provider-reported token counts for one call (TB-AI.md invariant 20). Normalized: `input` is
71
+ * the full prompt (cache reads included), `output` is total billed output (reasoning included),
72
+ * `reasoning`/`cacheRead` are the itemized subsets where the provider splits them (Anthropic
73
+ * doesn't split reasoning). Absent entirely when the provider reported nothing. */
74
+ export interface AiUsage {
75
+ input: number;
76
+ output: number;
77
+ reasoning?: number;
78
+ cacheRead?: number;
79
+ }
80
+ /** Fold one wire-piece usage fragment into an accumulation. Field-wise, later wins — providers
81
+ * report cumulative counts, so the last sighting of each field is the total. */
82
+ export declare const mergeUsage: (acc: Partial<AiUsage> | undefined, piece: Partial<AiUsage>) => Partial<AiUsage>;
83
+ /** Settle a partial usage accumulation into the public shape — or nothing, when no event ever
84
+ * reported a count (the whole-object absence bulbs test for). Missing halves settle to 0. */
85
+ export declare const finalizeUsage: (u: Partial<AiUsage> | undefined) => AiUsage | undefined;
65
86
  /** A streamed delta from `tb.ai.stream()`. Discriminated union — exactly one kind per chunk, so
66
87
  * `switch (chunk.kind)` is exhaustive and no `{}`/both-fields state is representable. The public
67
88
  * shape; the internal wire piece (`ChatStreamPieceDto { text?, reasoning? }`) stays loose. */
@@ -71,6 +92,9 @@ export type AiChunk = {
71
92
  } | {
72
93
  kind: 'reasoning';
73
94
  text: string;
95
+ } | {
96
+ kind: 'usage';
97
+ usage: AiUsage;
74
98
  };
75
99
  /** What backs `tb.ai` for the current user: their own keys (`own`), the quota-limited courtesy
76
100
  * model (`courtesy`), or nothing at all (`none` — the CLI without keys, an embedded bulb). Which
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAA;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAGD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,0IAA0I;AAC1I,MAAM,WAAW,mBAAmB;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAE/D,yHAAyH;AACzH,MAAM,WAAW,sBAAsB;IAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE;AAIlE,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,kBAAkB,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,CAAA;AAEvG,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,eAAe,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAAC,kBAAkB,CAAC;IAClE,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;;4CAG4C;AAC5C,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAA;AAE5G;;;;;;;oEAOoE;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE3C;sGACsG;AACtG,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,KAAG,WAAW,GAAG,SACR,CAAA;AAE9D;;0EAE0E;AAC1E,eAAO,MAAM,WAAW,GAAI,GAAG,MAAM,KAAG,WACI,CAAA;AAE5C;;+FAE+F;AAC/F,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC;;qGAEqG;AACrG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAA;AAElD,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAA;IACpB,0GAA0G;IAC1G,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,19 @@ export const asEffort = (v) => v != null && v >= 0 && v <= 4 ? v : undefined;
6
6
  * dropped — for persisted settings, where the nearest level beats falling back to a provider default.
7
7
  * The upper bound must track the dial's top if a level is ever added. */
8
8
  export const clampEffort = (v) => Math.max(0, Math.min(v, 4));
9
+ /** Fold one wire-piece usage fragment into an accumulation. Field-wise, later wins — providers
10
+ * report cumulative counts, so the last sighting of each field is the total. */
11
+ export const mergeUsage = (acc, piece) => {
12
+ const out = { ...acc };
13
+ for (const k of ['input', 'output', 'reasoning', 'cacheRead']) {
14
+ if (piece[k] !== undefined)
15
+ out[k] = piece[k];
16
+ }
17
+ return out;
18
+ };
19
+ /** Settle a partial usage accumulation into the public shape — or nothing, when no event ever
20
+ * reported a count (the whole-object absence bulbs test for). Missing halves settle to 0. */
21
+ export const finalizeUsage = (u) => u === undefined || (u.input === undefined && u.output === undefined)
22
+ ? undefined
23
+ : { input: u.input ?? 0, output: u.output ?? 0, reasoning: u.reasoning, cacheRead: u.cacheRead };
9
24
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAuExE;sGACsG;AACtG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAA2B,EAAE,CAChF,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAE9D;;0EAE0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAe,EAAE,CACpD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAAA,wEAAwE;AA4ExE;sGACsG;AACtG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAA2B,EAAE,CAChF,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAE9D;;0EAE0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAe,EAAE,CACpD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA;AAa5C;iFACiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,GAAiC,EACjC,KAAuB,EACL,EAAE;IACpB,MAAM,GAAG,GAAqB,EAAE,GAAG,GAAG,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAU,EAAE,CAAC;QACvE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;8FAC8F;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAA+B,EAAuB,EAAE,CACpF,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;IAClE,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA"}
@@ -113,6 +113,10 @@ export declare class AnthropicProvider extends AIProvider {
113
113
  buildPayload(messages: ChatMessageDto[], model: string, opts: ChatRequestOpts, stream: boolean): AnthropicRequestPayload;
114
114
  parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
115
115
  protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
116
+ /** Anthropic itemizes uncached input, cache reads and cache writes as disjoint counts; `input`
117
+ * is normalized to their sum (the full prompt, matching the other providers' inclusive count).
118
+ * Thinking tokens are folded into `output_tokens` unitemized, so `reasoning` stays absent. */
119
+ private mapUsage;
116
120
  /**
117
121
  * Cache breakpoints on the final two messages. The last extends conversations whose tail is the
118
122
  * new user turn (tb.ai bulbs, chat/raw modes); the second-to-last covers code-mode chat payloads,
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { finalizeUsage } from '../protocol.js';
1
2
  import { AIProvider } from '../aiProvider.js';
2
3
  export class AnthropicProvider extends AIProvider {
3
4
  constructor() {
@@ -90,7 +91,7 @@ export class AnthropicProvider extends AIProvider {
90
91
  .filter((block) => block.type === 'thinking')
91
92
  .map(block => block.thinking)
92
93
  .join('\n\n');
93
- return { text, reasoning: reasoning || undefined };
94
+ return { text, reasoning: reasoning || undefined, usage: finalizeUsage(this.mapUsage(json.usage)) };
94
95
  }
95
96
  parseProviderStreamChunk(json) {
96
97
  if (!this.isAnthropicEvent(json))
@@ -104,11 +105,41 @@ export class AnthropicProvider extends AIProvider {
104
105
  return { reasoning: json.delta.thinking || '' };
105
106
  }
106
107
  return null;
108
+ // Usage is split across the stream: message_start carries the input-side counts, each
109
+ // message_delta the cumulative output count. Emitted as partial pieces; the stream adapter
110
+ // merges them (later wins) into one final usage chunk.
111
+ case 'message_start': {
112
+ const usage = this.mapUsage(json.message?.usage);
113
+ return usage ? { usage } : null;
114
+ }
115
+ case 'message_delta': {
116
+ const usage = this.mapUsage(json.usage);
117
+ return usage ? { usage } : null;
118
+ }
107
119
  default:
108
120
  return null;
109
121
  }
110
122
  }
111
123
  // ── Private helpers ──────────────────────────────────────────────
124
+ /** Anthropic itemizes uncached input, cache reads and cache writes as disjoint counts; `input`
125
+ * is normalized to their sum (the full prompt, matching the other providers' inclusive count).
126
+ * Thinking tokens are folded into `output_tokens` unitemized, so `reasoning` stays absent. */
127
+ mapUsage(u) {
128
+ if (typeof u !== 'object' || u === null)
129
+ return undefined;
130
+ const r = u;
131
+ const n = (v) => (typeof v === 'number' ? v : undefined);
132
+ const uncached = n(r.input_tokens);
133
+ const cacheRead = n(r.cache_read_input_tokens);
134
+ const cacheWrite = n(r.cache_creation_input_tokens);
135
+ const output = n(r.output_tokens);
136
+ const input = uncached !== undefined || cacheRead !== undefined || cacheWrite !== undefined
137
+ ? (uncached ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0)
138
+ : undefined;
139
+ if (input === undefined && output === undefined)
140
+ return undefined;
141
+ return { input, output, cacheRead };
142
+ }
112
143
  /**
113
144
  * Cache breakpoints on the final two messages. The last extends conversations whose tail is the
114
145
  * new user turn (tb.ai bulbs, chat/raw modes); the second-to-last covers code-mode chat payloads,
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,16 @@
5
5
  */
6
6
  import type { ChatStreamPieceDto, ChatResponseDto, ProviderResponseDto, ProviderStreamEventDto } from '../protocol.js';
7
7
  import { AIProvider } from '../aiProvider.js';
8
+ export interface ChatCompletionsUsageDto {
9
+ prompt_tokens?: number;
10
+ completion_tokens?: number;
11
+ prompt_tokens_details?: {
12
+ cached_tokens?: number;
13
+ };
14
+ completion_tokens_details?: {
15
+ reasoning_tokens?: number;
16
+ };
17
+ }
8
18
  export interface ChatCompletionsMessageDto {
9
19
  content: string;
10
20
  reasoning?: string;
@@ -17,6 +27,7 @@ export interface ChatCompletionsChoiceDto {
17
27
  export interface ChatCompletionsResponseDto extends ProviderResponseDto {
18
28
  choices: ChatCompletionsChoiceDto[];
19
29
  reasoning?: string;
30
+ usage?: ChatCompletionsUsageDto;
20
31
  }
21
32
  export interface ChatCompletionsDeltaDto {
22
33
  content?: string;
@@ -29,10 +40,12 @@ export interface ChatCompletionsStreamChoiceDto {
29
40
  }
30
41
  export interface ChatCompletionsStreamEventDto extends ProviderStreamEventDto {
31
42
  choices: ChatCompletionsStreamChoiceDto[];
43
+ usage?: ChatCompletionsUsageDto;
32
44
  }
33
45
  export declare abstract class ChatCompletionsProvider extends AIProvider {
34
46
  parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
35
47
  protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
36
48
  private hasChoices;
49
+ private mapUsage;
37
50
  }
38
51
  //# sourceMappingURL=chatCompletions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatCompletions.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAK7C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,OAAO,EAAE,wBAAwB,EAAE,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAGD,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,uBAAuB,CAAA;IAC/B,OAAO,CAAC,EAAE,uBAAuB,CAAA;CAClC;AAED,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,OAAO,EAAE,8BAA8B,EAAE,CAAA;CAC1C;AAID,8BAAsB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe;IAWrE,SAAS,CAAC,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,IAAI;IAiB3F,OAAO,CAAC,UAAU;CAInB"}
1
+ {"version":3,"file":"chatCompletions.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1D;AAGD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,OAAO,EAAE,wBAAwB,EAAE,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAA;CAChC;AAGD,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,uBAAuB,CAAA;IAC/B,OAAO,CAAC,EAAE,uBAAuB,CAAA;CAClC;AAED,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,KAAK,CAAC,EAAE,uBAAuB,CAAA;CAChC;AAID,8BAAsB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe;IAWrE,SAAS,CAAC,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,IAAI;IAc3F,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,QAAQ;CASjB"}
@@ -1,3 +1,4 @@
1
+ import { finalizeUsage } from '../protocol.js';
1
2
  import { AIProvider } from '../aiProvider.js';
2
3
  // ── Shared parsing ───────────────────────────────────────────────────
3
4
  export class ChatCompletionsProvider extends AIProvider {
@@ -9,26 +10,33 @@ export class ChatCompletionsProvider extends AIProvider {
9
10
  const msg = choice?.message;
10
11
  const text = msg?.content ?? choice?.text ?? '';
11
12
  const reasoning = msg?.reasoning ?? msg?.reasoning_content ?? resp.reasoning;
12
- return { text, reasoning };
13
+ return { text, reasoning, usage: this.mapUsage(resp.usage) };
13
14
  }
14
15
  parseProviderStreamChunk(json) {
15
16
  if (!this.hasChoices(json))
16
17
  return null;
17
- const choice = json.choices[0];
18
- if (!choice)
18
+ const event = json;
19
+ const usage = this.mapUsage(event.usage);
20
+ const delta = event.choices[0]?.delta || event.choices[0]?.message;
21
+ const text = delta?.content || undefined;
22
+ const reasoning = delta?.reasoning || delta?.reasoning_content || undefined;
23
+ if (!text && !reasoning && !usage)
19
24
  return null;
20
- const delta = choice.delta || choice.message;
21
- if (!delta)
22
- return null;
23
- const text = delta.content || undefined;
24
- const reasoning = delta.reasoning || delta.reasoning_content || undefined;
25
- if (!text && !reasoning)
26
- return null;
27
- return { text, reasoning };
25
+ return { text, reasoning, usage };
28
26
  }
29
27
  hasChoices(json) {
30
28
  return typeof json === 'object' && json !== null
31
29
  && 'choices' in json && Array.isArray(json.choices);
32
30
  }
31
+ mapUsage(u) {
32
+ if (!u)
33
+ return undefined;
34
+ return finalizeUsage({
35
+ input: u.prompt_tokens,
36
+ output: u.completion_tokens,
37
+ reasoning: u.completion_tokens_details?.reasoning_tokens,
38
+ cacheRead: u.prompt_tokens_details?.cached_tokens,
39
+ });
40
+ }
33
41
  }
34
42
  //# sourceMappingURL=chatCompletions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatCompletions.js","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAsC7C,wEAAwE;AAExE,MAAM,OAAgB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAyB;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QAE/C,MAAM,IAAI,GAAG,IAAkC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAA;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,CAAA;QAC/C,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS,CAAA;QAC5E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC5B,CAAC;IAES,wBAAwB,CAAC,IAA4B;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,MAAM,MAAM,GAAI,IAAsC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAA;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,SAAS,CAAA;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,iBAAiB,IAAI,SAAS,CAAA;QAEzE,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAEpC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC5B,CAAC;IAEO,UAAU,CAAC,IAAa;QAC9B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;eAC3C,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,IAA8B,CAAC,OAAO,CAAC,CAAA;IAClF,CAAC;CACF"}
1
+ {"version":3,"file":"chatCompletions.js","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAkD7C,wEAAwE;AAExE,MAAM,OAAgB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAyB;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QAE/C,MAAM,IAAI,GAAG,IAAkC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAA;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,CAAA;QAC/C,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS,CAAA;QAC5E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9D,CAAC;IAES,wBAAwB,CAAC,IAA4B;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,MAAM,KAAK,GAAG,IAAqC,CAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;QAClE,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAA;QACxC,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,iBAAiB,IAAI,SAAS,CAAA;QAE3E,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAE9C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACnC,CAAC;IAEO,UAAU,CAAC,IAAa;QAC9B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;eAC3C,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,IAA8B,CAAC,OAAO,CAAC,CAAA;IAClF,CAAC;IAEO,QAAQ,CAAC,CAAsC;QACrD,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QACxB,OAAO,aAAa,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,aAAa;YACtB,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC3B,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,gBAAgB;YACxD,SAAS,EAAE,CAAC,CAAC,qBAAqB,EAAE,aAAa;SAClD,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -44,9 +44,16 @@ export interface GeminiCandidate {
44
44
  export interface GeminiPromptFeedback {
45
45
  blockReason?: string;
46
46
  }
47
+ export interface GeminiUsageMetadata {
48
+ promptTokenCount?: number;
49
+ candidatesTokenCount?: number;
50
+ thoughtsTokenCount?: number;
51
+ cachedContentTokenCount?: number;
52
+ }
47
53
  export interface GeminiResponseDto extends ProviderResponseDto {
48
54
  candidates?: GeminiCandidate[];
49
55
  promptFeedback?: GeminiPromptFeedback;
56
+ usageMetadata?: GeminiUsageMetadata;
50
57
  }
51
58
  export type GeminiSseEventDto = GeminiResponseDto;
52
59
  /** Request payload for native Gemini API */
@@ -67,6 +74,9 @@ export declare class GeminiProvider extends AIProvider {
67
74
  parseError(errorText: string, status: number): UpstreamErrorDto;
68
75
  parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
69
76
  protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
77
+ /** `output` is normalized to total billed output — Gemini itemizes answer and thought tokens as
78
+ * disjoint counts, where the other providers report an inclusive total with subsets. */
79
+ private mapUsage;
70
80
  /** Major.minor from a versioned model name (`gemini-3.5-flash` → 3.5); null for aliases. */
71
81
  private geminiVersion;
72
82
  /** Dial → level, clamped to the family's supported enum: `minimal` is 3.5+; earlier 3.x floors at
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { finalizeUsage } from '../protocol.js';
1
2
  import { AIProvider, ProviderStreamError } from '../aiProvider.js';
2
3
  export class GeminiProvider extends AIProvider {
3
4
  constructor() {
@@ -102,16 +103,34 @@ export class GeminiProvider extends AIProvider {
102
103
  else if (finishReason === 'SAFETY' || finishReason === 'RECITATION') {
103
104
  status = 'failed';
104
105
  }
105
- return { text, status };
106
+ return { text, status, usage: this.mapUsage(json.usageMetadata) };
106
107
  }
107
108
  parseProviderStreamChunk(json) {
108
109
  this.checkGeminiError(json);
109
110
  if (!this.isGeminiResponse(json))
110
111
  return null;
111
112
  const piece = this.extractParts(json);
112
- return (piece.text || piece.reasoning) ? piece : null;
113
+ // Counts are cumulative per chunk, so passing every sighting through is safe — the stream
114
+ // adapter's later-wins merge lands on the final (complete) one.
115
+ const usage = this.mapUsage(json.usageMetadata);
116
+ if (usage)
117
+ piece.usage = usage;
118
+ return (piece.text || piece.reasoning || piece.usage) ? piece : null;
113
119
  }
114
120
  // ── Private helpers ──────────────────────────────────────────────
121
+ /** `output` is normalized to total billed output — Gemini itemizes answer and thought tokens as
122
+ * disjoint counts, where the other providers report an inclusive total with subsets. */
123
+ mapUsage(u) {
124
+ if (!u)
125
+ return undefined;
126
+ const hasOutput = u.candidatesTokenCount !== undefined || u.thoughtsTokenCount !== undefined;
127
+ return finalizeUsage({
128
+ input: u.promptTokenCount,
129
+ output: hasOutput ? (u.candidatesTokenCount ?? 0) + (u.thoughtsTokenCount ?? 0) : undefined,
130
+ reasoning: u.thoughtsTokenCount,
131
+ cacheRead: u.cachedContentTokenCount,
132
+ });
133
+ }
115
134
  /** Major.minor from a versioned model name (`gemini-3.5-flash` → 3.5); null for aliases. */
116
135
  geminiVersion(model) {
117
136
  const m = model.match(/^gemini-(\d+(?:\.\d+)?)/);
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,9 @@ export type OllamaRequestPayload = {
20
20
  model: string;
21
21
  messages: ChatMessageDto[];
22
22
  stream: boolean;
23
+ stream_options?: {
24
+ include_usage: boolean;
25
+ };
23
26
  };
24
27
  export declare class OllamaProvider extends ChatCompletionsProvider {
25
28
  protected readonly providerName = "Ollama";
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAW;IAQ1C,QAAQ,CAAC,cAAc,4BAA2B;IAClD,QAAQ,CAAC,IAAI,uBAAsB;IAMnC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAYpD,YAAY,CACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,OAAO,GACd,oBAAoB;CAGxB"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,CAAC,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAA;CAC5C,CAAA;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAW;IAQ1C,QAAQ,CAAC,cAAc,4BAA2B;IAClD,QAAQ,CAAC,IAAI,uBAAsB;IAMnC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAcpD,YAAY,CACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,OAAO,GACd,oBAAoB;CAKxB"}
@@ -28,8 +28,12 @@ export class OllamaProvider extends ChatCompletionsProvider {
28
28
  // Web search and the reasoning-effort knob have no equivalent on the OpenAI-compat endpoint,
29
29
  // so the payload stays minimal. Ollama-specific options (num_ctx, think, …) are intentionally
30
30
  // out of scope for tb.ai — use a server.ts export for those (runtime-specs/TB-Server-Streaming.md).
31
+ // `stream_options.include_usage` is standard Chat Completions (Ollama, vLLM and LM Studio all
32
+ // honor it); an endpoint that ignores it simply reports no usage.
31
33
  buildPayload(messages, model, _opts, stream) {
32
- return { model, messages, stream };
34
+ return stream
35
+ ? { model, messages, stream, stream_options: { include_usage: true } }
36
+ : { model, messages, stream };
33
37
  }
34
38
  }
35
39
  //# sourceMappingURL=ollama.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAS9D,MAAM,OAAO,cAAe,SAAQ,uBAAuB;IAA3D;;QACqB,iBAAY,GAAG,QAAQ,CAAA;QAC1C,gGAAgG;QAChG,gGAAgG;QAChG,iGAAiG;QACjG,gGAAgG;QAChG,4GAA4G;QAC5G,kGAAkG;QAClG,6DAA6D;QACpD,mBAAc,GAAG,wBAAwB,CAAA;QACzC,SAAI,GAAG,mBAAmB,CAAA;IA0BrC,CAAC;IAxBC,oEAAoE;IAEpE,gGAAgG;IAChG,2FAA2F;IAC3F,YAAY,CAAC,MAAc;QACzB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;SAC7B,CAAA;QACD,IAAI,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAA;QACzD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,6FAA6F;IAC7F,8FAA8F;IAC9F,oGAAoG;IACpG,YAAY,CACV,QAA0B,EAC1B,KAAa,EACb,KAAsB,EACtB,MAAe;QAEf,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IACpC,CAAC;CACF"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAU9D,MAAM,OAAO,cAAe,SAAQ,uBAAuB;IAA3D;;QACqB,iBAAY,GAAG,QAAQ,CAAA;QAC1C,gGAAgG;QAChG,gGAAgG;QAChG,iGAAiG;QACjG,gGAAgG;QAChG,4GAA4G;QAC5G,kGAAkG;QAClG,6DAA6D;QACpD,mBAAc,GAAG,wBAAwB,CAAA;QACzC,SAAI,GAAG,mBAAmB,CAAA;IA8BrC,CAAC;IA5BC,oEAAoE;IAEpE,gGAAgG;IAChG,2FAA2F;IAC3F,YAAY,CAAC,MAAc;QACzB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;SAC7B,CAAA;QACD,IAAI,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAA;QACzD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,6FAA6F;IAC7F,8FAA8F;IAC9F,oGAAoG;IACpG,8FAA8F;IAC9F,kEAAkE;IAClE,YAAY,CACV,QAA0B,EAC1B,KAAa,EACb,KAAsB,EACtB,MAAe;QAEf,OAAO,MAAM;YACX,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;YACtE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IACjC,CAAC;CACF"}
@@ -37,10 +37,21 @@ export interface OpenAIResponseReasoningItem {
37
37
  summary: Array<OpenAIResponseReasoningSummary>;
38
38
  }
39
39
  export type OpenAIResponseOutputItem = OpenAIResponseOutputMessage | OpenAIResponseReasoningItem;
40
+ export interface OpenAIUsageDto {
41
+ input_tokens?: number;
42
+ output_tokens?: number;
43
+ input_tokens_details?: {
44
+ cached_tokens?: number;
45
+ };
46
+ output_tokens_details?: {
47
+ reasoning_tokens?: number;
48
+ };
49
+ }
40
50
  export interface OpenAIResponsesApiResponseDto extends ProviderResponseDto {
41
51
  object: 'response';
42
52
  output_text: string;
43
53
  output: Array<OpenAIResponseOutputItem>;
54
+ usage?: OpenAIUsageDto;
44
55
  }
45
56
  interface OpenAIResponseEventBase {
46
57
  sequence_number: number;
@@ -89,6 +100,7 @@ export declare class OpenAIProvider extends AIProvider {
89
100
  buildPayload(messages: ChatMessageDto[], model: string, opts: ChatRequestOpts, stream: boolean): OpenAIResponsesApiRequestDto;
90
101
  parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
91
102
  protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
103
+ private mapUsage;
92
104
  private convertMessagesToInput;
93
105
  private isResponsesApiEvent;
94
106
  private isResponsesApiResponse;