@holokai/holo-sdk 1.6.0 → 1.9.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.
Files changed (103) hide show
  1. package/dist/client/builder.d.ts +36 -3
  2. package/dist/client/builder.d.ts.map +1 -1
  3. package/dist/client/builder.js +57 -10
  4. package/dist/client/builder.js.map +1 -1
  5. package/dist/client/client.d.ts +15 -3
  6. package/dist/client/client.d.ts.map +1 -1
  7. package/dist/client/client.js +60 -25
  8. package/dist/client/client.js.map +1 -1
  9. package/dist/client/errors.d.ts +10 -2
  10. package/dist/client/errors.d.ts.map +1 -1
  11. package/dist/client/errors.js +15 -3
  12. package/dist/client/errors.js.map +1 -1
  13. package/dist/client/index.d.ts +2 -2
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +1 -1
  16. package/dist/client/index.js.map +1 -1
  17. package/dist/client/merge.d.ts +5 -0
  18. package/dist/client/merge.d.ts.map +1 -1
  19. package/dist/client/merge.js +13 -0
  20. package/dist/client/merge.js.map +1 -1
  21. package/dist/client/runner.d.ts +2 -0
  22. package/dist/client/runner.d.ts.map +1 -1
  23. package/dist/client/runner.js.map +1 -1
  24. package/dist/client/sse.d.ts.map +1 -1
  25. package/dist/client/sse.js +4 -0
  26. package/dist/client/sse.js.map +1 -1
  27. package/dist/client/stream.d.ts +11 -1
  28. package/dist/client/stream.d.ts.map +1 -1
  29. package/dist/client/stream.js +114 -12
  30. package/dist/client/stream.js.map +1 -1
  31. package/dist/client/transport.d.ts +11 -0
  32. package/dist/client/transport.d.ts.map +1 -1
  33. package/dist/client/transport.js +25 -9
  34. package/dist/client/transport.js.map +1 -1
  35. package/dist/client/types.d.ts +35 -0
  36. package/dist/client/types.d.ts.map +1 -1
  37. package/dist/core/index.d.ts +2 -1
  38. package/dist/core/index.d.ts.map +1 -1
  39. package/dist/core/index.js +2 -1
  40. package/dist/core/index.js.map +1 -1
  41. package/dist/core/json-output.d.ts +36 -0
  42. package/dist/core/json-output.d.ts.map +1 -0
  43. package/dist/core/json-output.js +108 -0
  44. package/dist/core/json-output.js.map +1 -0
  45. package/dist/core/logger.d.ts +2 -2
  46. package/dist/core/logger.d.ts.map +1 -1
  47. package/dist/core/redact-binary.d.ts +6 -0
  48. package/dist/core/redact-binary.d.ts.map +1 -0
  49. package/dist/core/redact-binary.js +23 -0
  50. package/dist/core/redact-binary.js.map +1 -0
  51. package/dist/core/version.d.ts +1 -1
  52. package/dist/core/version.js +1 -1
  53. package/dist/plugin/base.d.ts +7 -10
  54. package/dist/plugin/base.d.ts.map +1 -1
  55. package/dist/plugin/base.js +11 -24
  56. package/dist/plugin/base.js.map +1 -1
  57. package/dist/plugin/index.d.ts +1 -0
  58. package/dist/plugin/index.d.ts.map +1 -1
  59. package/dist/plugin/index.js +1 -0
  60. package/dist/plugin/index.js.map +1 -1
  61. package/dist/plugin/pricing.d.ts +13 -0
  62. package/dist/plugin/pricing.d.ts.map +1 -0
  63. package/dist/plugin/pricing.js +70 -0
  64. package/dist/plugin/pricing.js.map +1 -0
  65. package/dist/provider/auditor/base.d.ts +10 -5
  66. package/dist/provider/auditor/base.d.ts.map +1 -1
  67. package/dist/provider/auditor/base.js +69 -16
  68. package/dist/provider/auditor/base.js.map +1 -1
  69. package/dist/provider/auditor/index.d.ts +2 -0
  70. package/dist/provider/auditor/index.d.ts.map +1 -1
  71. package/dist/provider/auditor/index.js +2 -0
  72. package/dist/provider/auditor/index.js.map +1 -1
  73. package/dist/provider/auditor/payload-shape.d.ts +2 -0
  74. package/dist/provider/auditor/payload-shape.d.ts.map +1 -0
  75. package/dist/provider/auditor/payload-shape.js +19 -0
  76. package/dist/provider/auditor/payload-shape.js.map +1 -0
  77. package/dist/provider/auditor/token-breakdown.d.ts +14 -0
  78. package/dist/provider/auditor/token-breakdown.d.ts.map +1 -0
  79. package/dist/provider/auditor/token-breakdown.js +50 -0
  80. package/dist/provider/auditor/token-breakdown.js.map +1 -0
  81. package/dist/provider/base.d.ts.map +1 -1
  82. package/dist/provider/base.js +39 -15
  83. package/dist/provider/base.js.map +1 -1
  84. package/dist/provider/index.d.ts +2 -0
  85. package/dist/provider/index.d.ts.map +1 -1
  86. package/dist/provider/index.js +2 -0
  87. package/dist/provider/index.js.map +1 -1
  88. package/dist/provider/json-output.d.ts +22 -0
  89. package/dist/provider/json-output.d.ts.map +1 -0
  90. package/dist/provider/json-output.js +88 -0
  91. package/dist/provider/json-output.js.map +1 -0
  92. package/dist/provider/thinking.d.ts +79 -0
  93. package/dist/provider/thinking.d.ts.map +1 -0
  94. package/dist/provider/thinking.js +173 -0
  95. package/dist/provider/thinking.js.map +1 -0
  96. package/dist/provider/translator/translate-provider-events.d.ts.map +1 -1
  97. package/dist/provider/translator/translate-provider-events.js +11 -3
  98. package/dist/provider/translator/translate-provider-events.js.map +1 -1
  99. package/package.json +2 -3
  100. package/dist/core/tokenizer.d.ts +0 -2
  101. package/dist/core/tokenizer.d.ts.map +0 -1
  102. package/dist/core/tokenizer.js +0 -12
  103. package/dist/core/tokenizer.js.map +0 -1
@@ -23,12 +23,47 @@ export interface HoloChatParams {
23
23
  response_format?: HoloRequest['response_format'];
24
24
  metadata?: HoloRequestMetadata | null;
25
25
  service_tier?: HoloRequest['service_tier'];
26
+ /**
27
+ * Reasoning depth. `effort` is the portable dial; `budget_tokens` is the legacy one and
28
+ * only a couple of families still accept it. Translators derive whichever the target needs.
29
+ */
30
+ thinking?: HoloRequest['thinking'];
26
31
  provider?: string;
27
32
  application?: string;
28
33
  thread_id?: string;
29
34
  branch?: string;
30
35
  protocol?: string;
31
36
  }
37
+ /** Running size of a streamed answer while the model is still writing it. */
38
+ export interface HoloStreamProgress {
39
+ outputChars: number;
40
+ reasoningChars: number;
41
+ /** `outputChars / 4`, rounded up — a rough figure until `usage` arrives on completion. */
42
+ estimatedOutputTokens: number;
43
+ /**
44
+ * `reasoningChars / 4`, rounded up — the same rough figure for thinking. Non-zero
45
+ * before `estimatedOutputTokens` moves on a model that reasons first, which is how a
46
+ * caller tells "thinking" from "nothing arriving".
47
+ */
48
+ estimatedReasoningTokens: number;
49
+ }
50
+ export interface HoloStreamOptions {
51
+ /**
52
+ * Abort the stream when no event arrives for this long. Measured between events, never
53
+ * against total elapsed time, so a long generation that keeps writing is never cut off.
54
+ * Rejects with {@link HoloTimeoutError} (`kind: 'idle'`).
55
+ *
56
+ * On a client that set no `timeout` it ALSO bounds the wait for response headers, so a
57
+ * caller who names only this one still cannot hang forever on a gateway that never
58
+ * answers; that header wait rejects with `kind: 'total'`, because nothing has started.
59
+ * A client `timeout` always wins for the header wait — the two bounds are independent.
60
+ */
61
+ idleTimeoutMs?: number | undefined;
62
+ /** External cancellation: aborting it aborts the request and the stream, which then rejects with {@link HoloAbortError}. */
63
+ signal?: AbortSignal | undefined;
64
+ /** Called after every text or reasoning delta with the running counts. A throw here aborts the stream. */
65
+ onProgress?: ((progress: HoloStreamProgress) => void) | undefined;
66
+ }
32
67
  /** Configuration options for {@link HoloClient}. */
33
68
  export interface HoloClientOptions {
34
69
  /** Base URL of the Holo API (e.g. `'https://holo.example.com'`). Trailing slashes are stripped. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EACnB,MAAM,0BAA0B,CAAC;AAElC,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAC9B,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+GAA+G;IAC/G,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY,EACR,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EACnB,MAAM,0BAA0B,CAAC;AAElC,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,wBAAwB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAC9B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,4HAA4H;IAC5H,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,0GAA0G;IAC1G,UAAU,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACrE;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAC9B,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+GAA+G;IAC/G,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,YAAY,EACR,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,CAAC"}
@@ -12,8 +12,9 @@ export * from './safe-parse.js';
12
12
  export * from './headers.js';
13
13
  export * from './binary.js';
14
14
  export * from './time-utils.js';
15
- export * from './tokenizer.js';
16
15
  export * from './version.js';
17
16
  export * from './mime.js';
18
17
  export * from './system.js';
18
+ export * from './redact-binary.js';
19
+ export * from './json-output.js';
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -12,8 +12,9 @@ export * from './safe-parse.js';
12
12
  export * from './headers.js';
13
13
  export * from './binary.js';
14
14
  export * from './time-utils.js';
15
- export * from './tokenizer.js';
16
15
  export * from './version.js';
17
16
  export * from './mime.js';
18
17
  export * from './system.js';
18
+ export * from './redact-binary.js';
19
+ export * from './json-output.js';
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,36 @@
1
+ export interface UnwrappedJson {
2
+ text: string;
3
+ /** True when `text` differs from the input: fences or surrounding prose were removed. */
4
+ unwrapped: boolean;
5
+ }
6
+ /**
7
+ * Recovers the JSON document a model was asked for from text that wraps it in a markdown fence
8
+ * and/or prose. Only a candidate that parses as a JSON object or array replaces the input, so
9
+ * text that carries no JSON document comes back untouched.
10
+ */
11
+ export declare function unwrapJsonText(text: string): UnwrappedJson;
12
+ /**
13
+ * Strips a markdown fence from streamed model text one fragment at a time.
14
+ *
15
+ * Text is held back only while it is still ambiguous: at the head of the stream while it could
16
+ * still be an opening fence (bounded by {@link JsonOutputStreamFilter.HEAD_WAIT_LIMIT}), and
17
+ * inside a fence the trailing whitespace/backtick run that could open the closer. Everything after
18
+ * the closing fence is dropped. A fence that opens later in the stream is stripped when the whole
19
+ * opener arrives in one fragment; the prose already sent ahead of it stays, since emitted
20
+ * fragments cannot be retracted. A stream that never opens a fence passes through untouched, and
21
+ * nothing is ever released after the last fragment: whatever is still held when the stream ends
22
+ * is a partial fence or whitespace and is dropped.
23
+ */
24
+ export declare class JsonOutputStreamFilter {
25
+ static readonly HEAD_WAIT_LIMIT = 32;
26
+ private phase;
27
+ private buffer;
28
+ private _fenced;
29
+ /** True once an opening fence was stripped from the stream. */
30
+ get fenced(): boolean;
31
+ push(fragment: string): string;
32
+ private pushFenced;
33
+ }
34
+ /** Applies the streaming fence policy to a complete text, so snapshots agree with the deltas they summarize. */
35
+ export declare function stripStreamedFences(text: string): string;
36
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/core/json-output.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,SAAS,EAAE,OAAO,CAAC;CACtB;AAwBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAS1D;AASD;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAsB;IAC/B,MAAM,CAAC,QAAQ,CAAC,eAAe,MAAM;IAErC,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAAS;IAExB,+DAA+D;IAC/D,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAuB9B,OAAO,CAAC,UAAU;CAYrB;AAED,gHAAgH;AAChH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,108 @@
1
+ const FENCED_BLOCK = /^\s*```[\w.+-]*[ \t]*\r?\n?([\s\S]*?)\r?\n?[ \t]*```\s*$/;
2
+ const FENCED_BLOCK_ANYWHERE = /```[\w.+-]*[ \t]*\r?\n?([\s\S]*?)\r?\n?[ \t]*```/;
3
+ function isJsonDocument(text) {
4
+ try {
5
+ const value = JSON.parse(text);
6
+ return typeof value === 'object' && value !== null;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ function embeddedJsonDocument(text) {
13
+ const starts = [text.indexOf('{'), text.indexOf('[')].filter(i => i >= 0);
14
+ if (starts.length === 0)
15
+ return undefined;
16
+ const start = Math.min(...starts);
17
+ const end = Math.max(text.lastIndexOf('}'), text.lastIndexOf(']'));
18
+ if (end <= start)
19
+ return undefined;
20
+ const candidate = text.slice(start, end + 1);
21
+ return isJsonDocument(candidate) ? candidate : undefined;
22
+ }
23
+ /**
24
+ * Recovers the JSON document a model was asked for from text that wraps it in a markdown fence
25
+ * and/or prose. Only a candidate that parses as a JSON object or array replaces the input, so
26
+ * text that carries no JSON document comes back untouched.
27
+ */
28
+ export function unwrapJsonText(text) {
29
+ if (isJsonDocument(text))
30
+ return { text, unwrapped: false };
31
+ for (const pattern of [FENCED_BLOCK, FENCED_BLOCK_ANYWHERE]) {
32
+ const fenced = pattern.exec(text)?.[1];
33
+ if (fenced !== undefined && isJsonDocument(fenced))
34
+ return { text: fenced, unwrapped: true };
35
+ }
36
+ const embedded = embeddedJsonDocument(text);
37
+ if (embedded !== undefined)
38
+ return { text: embedded, unwrapped: true };
39
+ return { text, unwrapped: false };
40
+ }
41
+ /** Text that could still grow into an opening fence: whitespace, then optionally backticks and a language tag. */
42
+ const OPENER_PREFIX = /^\s*(`{1,3}[\w.+-]*[ \t]*)?$/;
43
+ /** A complete opening fence: the tag is ended by a newline or by a character that cannot extend it. */
44
+ const OPENER = /```[\w.+-]*[ \t]*(?:\r?\n|(?=[^\w.+\-\s]))/;
45
+ const CLOSER = /\r?\n[ \t]*```/;
46
+ const FENCE_TAIL = /[\s`]*$/;
47
+ /**
48
+ * Strips a markdown fence from streamed model text one fragment at a time.
49
+ *
50
+ * Text is held back only while it is still ambiguous: at the head of the stream while it could
51
+ * still be an opening fence (bounded by {@link JsonOutputStreamFilter.HEAD_WAIT_LIMIT}), and
52
+ * inside a fence the trailing whitespace/backtick run that could open the closer. Everything after
53
+ * the closing fence is dropped. A fence that opens later in the stream is stripped when the whole
54
+ * opener arrives in one fragment; the prose already sent ahead of it stays, since emitted
55
+ * fragments cannot be retracted. A stream that never opens a fence passes through untouched, and
56
+ * nothing is ever released after the last fragment: whatever is still held when the stream ends
57
+ * is a partial fence or whitespace and is dropped.
58
+ */
59
+ export class JsonOutputStreamFilter {
60
+ static HEAD_WAIT_LIMIT = 32;
61
+ phase = 'head';
62
+ buffer = '';
63
+ _fenced = false;
64
+ /** True once an opening fence was stripped from the stream. */
65
+ get fenced() {
66
+ return this._fenced;
67
+ }
68
+ push(fragment) {
69
+ if (this.phase === 'closed')
70
+ return '';
71
+ if (this._fenced)
72
+ return this.pushFenced(fragment);
73
+ const pending = this.buffer + fragment;
74
+ this.buffer = '';
75
+ const opener = OPENER.exec(pending);
76
+ if (opener) {
77
+ const before = this.phase === 'head' ? '' : pending.slice(0, opener.index);
78
+ this._fenced = true;
79
+ this.phase = 'body';
80
+ return before + this.pushFenced(pending.slice(opener.index + opener[0].length));
81
+ }
82
+ if (this.phase === 'head') {
83
+ if (OPENER_PREFIX.test(pending) && pending.length < JsonOutputStreamFilter.HEAD_WAIT_LIMIT) {
84
+ this.buffer = pending;
85
+ return '';
86
+ }
87
+ this.phase = 'body';
88
+ }
89
+ return pending;
90
+ }
91
+ pushFenced(fragment) {
92
+ const pending = this.buffer + fragment;
93
+ const closer = CLOSER.exec(pending);
94
+ if (closer) {
95
+ this.buffer = '';
96
+ this.phase = 'closed';
97
+ return pending.slice(0, closer.index);
98
+ }
99
+ const tail = FENCE_TAIL.exec(pending)?.[0] ?? '';
100
+ this.buffer = tail;
101
+ return pending.slice(0, pending.length - tail.length);
102
+ }
103
+ }
104
+ /** Applies the streaming fence policy to a complete text, so snapshots agree with the deltas they summarize. */
105
+ export function stripStreamedFences(text) {
106
+ return new JsonOutputStreamFilter().push(text);
107
+ }
108
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/core/json-output.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ export declare function withClassLogger<TBase extends Constructor>(Base: TBase):
19
19
  new (...args: any[]): {
20
20
  _log?: HoloLogger;
21
21
  _className?: string;
22
- get log(): HoloLogger;
22
+ readonly log: HoloLogger;
23
23
  mlog(methodName: Function | string): HoloLogger;
24
24
  };
25
25
  } & TBase;
@@ -27,7 +27,7 @@ declare const ObservableClassLogger_base: {
27
27
  new (...args: any[]): {
28
28
  _log?: HoloLogger;
29
29
  _className?: string;
30
- get log(): HoloLogger;
30
+ readonly log: HoloLogger;
31
31
  mlog(methodName: Function | string): HoloLogger;
32
32
  };
33
33
  } & typeof Transform;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAY,KAAK,cAAc,EAAC,MAAM,UAAU,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAMtC,KAAK,WAAW,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,KAAK,UAAU,CAAC;AAMvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAWpE;AAMD,qBAAa,eAAgB,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI9B;AAMD,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,KAAK,UAAU,CAAmB,CAAC;AAI1G,wBAAgB,gBAAgB,IAAI,iBAAiB,CASpD;AAMD,8BAAsB,WAAW;IAC7B,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,IAAI,CAAC,CAAa;IAE1B,SAAS,KAAK,GAAG,IAAI,UAAU,CAG9B;IAED,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU;CAG5D;AAMD,wBAAgB,eAAe,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK;kBA1E7B,GAAG,EAAE;eA4E/B,UAAU;qBACJ,MAAM;mBAER,UAAU;yBAKJ,QAAQ,GAAG,MAAM,GAAG,UAAU;;UAItD;;kBAxFwC,GAAG,EAAE;eA4E/B,UAAU;qBACJ,MAAM;mBAER,UAAU;yBAKJ,QAAQ,GAAG,MAAM,GAAG,UAAU;;;AAMvD,8BAAsB,qBAAsB,SAAQ,0BAA0B;CAAG"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAY,KAAK,cAAc,EAAC,MAAM,UAAU,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAMtC,KAAK,WAAW,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,KAAK,UAAU,CAAC;AAMvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAWpE;AAMD,qBAAa,eAAgB,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI9B;AAMD,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,KAAK,UAAU,CAAmB,CAAC;AAI1G,wBAAgB,gBAAgB,IAAI,iBAAiB,CASpD;AAMD,8BAAsB,WAAW;IAC7B,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,IAAI,CAAC,CAAa;IAE1B,SAAS,KAAK,GAAG,IAAI,UAAU,CAG9B;IAED,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU;CAG5D;AAMD,wBAAgB,eAAe,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,EAAE,KAAK;kBA1E7B,GAAG,EAAE;eA4E/B,UAAU;qBACJ,MAAM;sBAER,UAAU;yBAKJ,QAAQ,GAAG,MAAM,GAAG,UAAU;;UAItD;;kBAxFwC,GAAG,EAAE;eA4E/B,UAAU;qBACJ,MAAM;sBAER,UAAU;yBAKJ,QAAQ,GAAG,MAAM,GAAG,UAAU;;;AAMvD,8BAAsB,qBAAsB,SAAQ,0BAA0B;CAAG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Replace binary payload parts with a size marker so a body can be audited as JSON without
3
+ * serialising image/file bytes as numeric arrays. Strings are left alone.
4
+ */
5
+ export declare function redactBinary<T>(value: T, depth?: number): T;
6
+ //# sourceMappingURL=redact-binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-binary.d.ts","sourceRoot":"","sources":["../../src/core/redact-binary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,SAAI,GAAG,CAAC,CAatD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Replace binary payload parts with a size marker so a body can be audited as JSON without
3
+ * serialising image/file bytes as numeric arrays. Strings are left alone.
4
+ */
5
+ export function redactBinary(value, depth = 0) {
6
+ if (value === null || value === undefined || depth > 16)
7
+ return value;
8
+ if (Buffer.isBuffer(value) || value instanceof Uint8Array) {
9
+ return { __binary: true, bytes: value.byteLength };
10
+ }
11
+ if (value instanceof ArrayBuffer)
12
+ return { __binary: true, bytes: value.byteLength };
13
+ if (Array.isArray(value))
14
+ return value.map(v => redactBinary(v, depth + 1));
15
+ if (typeof value === 'object') {
16
+ const out = {};
17
+ for (const [k, v] of Object.entries(value))
18
+ out[k] = redactBinary(v, depth + 1);
19
+ return out;
20
+ }
21
+ return value;
22
+ }
23
+ //# sourceMappingURL=redact-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact-binary.js","sourceRoot":"","sources":["../../src/core/redact-binary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAI,KAAQ,EAAE,KAAK,GAAG,CAAC;IAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QACxD,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAG,KAAoB,CAAC,UAAU,EAAiB,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAiB,CAAC;IACnG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAiB,CAAC;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC3G,OAAO,GAAQ,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "1.6.0";
1
+ export declare const VERSION = "1.9.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated — do not edit
2
- export const VERSION = "1.6.0";
2
+ export const VERSION = "1.9.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -1,7 +1,8 @@
1
- import { type IPlugin, type PluginContext, type PluginManifest, PluginState, PluginType } from '@holokai/holo-types/plugin';
1
+ import { type IPlugin, type OutputTextRewriter, type PluginContext, type PluginManifest, PluginState, PluginType } from '@holokai/holo-types/plugin';
2
2
  import { ClassLogger } from '../core/index.js';
3
- import type { CostResult, PricingSheetModel, ProtocolCapability } from '@holokai/holo-types/entities';
3
+ import type { CostResult, PricingSheetModel, ProtocolCapability, TokenBreakdown } from '@holokai/holo-types/entities';
4
4
  import type { RouteDefinition } from '@holokai/holo-types/routing';
5
+ import type { HoloResponseFormat } from '@holokai/holo-types/holo';
5
6
  export declare abstract class BasePlugin extends ClassLogger implements IPlugin {
6
7
  id?: string;
7
8
  abstract readonly manifest: PluginManifest;
@@ -25,20 +26,16 @@ export declare abstract class BasePlugin extends ClassLogger implements IPlugin
25
26
  initialize(context: PluginContext): Promise<void>;
26
27
  destroy(): Promise<void>;
27
28
  getModelNameFromRequest(payload: any, _protocolName?: string): string | undefined;
29
+ getResponseFormatFromRequest(_payload: any, _protocolName?: string): HoloResponseFormat | undefined;
28
30
  abstract getRoutes(): RouteDefinition[];
29
31
  getProtocolByCapability(capability: ProtocolCapability): string | undefined;
30
32
  setModelNameInRequest(payload: any, model: string, _protocolName?: string): void;
31
33
  mergeParametersIntoRequest(payload: any, parameters: Record<string, any>, _protocolName?: string): void;
32
34
  protected mergeIntoTarget(target: Record<string, any>, parameters: Record<string, any>): void;
33
35
  setSystemPromptInRequest(_payload: any, _systemPrompt: string, _protocolName?: string): void;
34
- calculateCost(tokens: Record<string, number>, pricing: PricingSheetModel): CostResult;
35
- protected abstract calculateExtraCosts(tokens: Record<string, number>, pricing: PricingSheetModel): {
36
- total: number;
37
- detail: Record<string, {
38
- tokens: number;
39
- cost: number;
40
- }>;
41
- };
36
+ rewriteResponseText(message: any, _rewrite: (text: string) => string, _protocolName?: string): any;
37
+ rewriteStreamEventText(event: any, _rewrite: OutputTextRewriter, _protocolName?: string): any;
38
+ calculateCost(tokens: TokenBreakdown, pricing: PricingSheetModel): CostResult;
42
39
  protected abstract onInitialize(context: PluginContext): Promise<void>;
43
40
  protected abstract onDestroy(): Promise<void>;
44
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/plugin/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,WAAW,EACX,UAAU,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAC,MAAM,8BAA8B,CAAC;AACpG,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAEjE,8BAAsB,UAAW,SAAQ,WAAY,YAAW,OAAO;IACnE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,SAAS,CAAC,MAAM,EAAE,WAAW,CAA6B;IAE1D,IAAI,KAAK,IAAI,WAAW,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,SAAS,KAAK,aAAa,IAAI,aAAa,CAS3C;IAED,QAAQ,IAAI,WAAW;IAIjB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC9B,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjF,QAAQ,CAAC,SAAS,IAAI,eAAe,EAAE;IAEvC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS;IAM3E,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhF,0BAA0B,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvG,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAQ7F,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAE5F,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,iBAAiB,GAAG,UAAU;IA8BrF,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,iBAAiB,GAC3B;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAC,CAAC,CAAA;KAAC;IAE1E,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtE,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAChD"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/plugin/base.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,OAAO,EACZ,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,WAAW,EACX,UAAU,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACpH,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAGjE,8BAAsB,UAAW,SAAQ,WAAY,YAAW,OAAO;IACnE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,SAAS,CAAC,MAAM,EAAE,WAAW,CAA6B;IAE1D,IAAI,KAAK,IAAI,WAAW,CAEvB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,SAAS,KAAK,aAAa,IAAI,aAAa,CAS3C;IAED,QAAQ,IAAI,WAAW;IAIjB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC9B,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjF,4BAA4B,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAInG,QAAQ,CAAC,SAAS,IAAI,eAAe,EAAE;IAEvC,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS;IAM3E,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhF,0BAA0B,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvG,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAQ7F,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAE5F,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,GAAG;IAIlG,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,GAAG;IAI7F,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,UAAU;IAI7E,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtE,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAChD"}
@@ -1,6 +1,7 @@
1
1
  import { PluginState, PluginType, } from '@holokai/holo-types/plugin';
2
2
  import { PluginError, PluginErrorCode } from './errors.js';
3
3
  import { ClassLogger } from '../core/index.js';
4
+ import { priceTokenBreakdown } from './pricing.js';
4
5
  export class BasePlugin extends ClassLogger {
5
6
  id;
6
7
  /**
@@ -86,6 +87,9 @@ export class BasePlugin extends ClassLogger {
86
87
  getModelNameFromRequest(payload, _protocolName) {
87
88
  return payload?.model;
88
89
  }
90
+ getResponseFormatFromRequest(_payload, _protocolName) {
91
+ return undefined;
92
+ }
89
93
  getProtocolByCapability(capability) {
90
94
  const routes = this.getRoutes().filter(r => r.protocol.capability === capability);
91
95
  const preferred = routes.find(r => r.protocol.name === this.defaultProtocol);
@@ -105,31 +109,14 @@ export class BasePlugin extends ClassLogger {
105
109
  }
106
110
  }
107
111
  setSystemPromptInRequest(_payload, _systemPrompt, _protocolName) { }
112
+ rewriteResponseText(message, _rewrite, _protocolName) {
113
+ return message;
114
+ }
115
+ rewriteStreamEventText(event, _rewrite, _protocolName) {
116
+ return event;
117
+ }
108
118
  calculateCost(tokens, pricing) {
109
- let inputRate = Number(pricing.input_cost);
110
- let outputRate = Number(pricing.output_cost);
111
- if (pricing.context_threshold && pricing.extended_input_cost && pricing.extended_output_cost) {
112
- const totalInput = Object.entries(tokens)
113
- .filter(([k]) => k !== 'output')
114
- .reduce((sum, [, v]) => sum + v, 0);
115
- if (totalInput > pricing.context_threshold) {
116
- inputRate = Number(pricing.extended_input_cost);
117
- outputRate = Number(pricing.extended_output_cost);
118
- }
119
- }
120
- const inputCost = (tokens.input ?? 0) * inputRate;
121
- const outputCost = (tokens.output ?? 0) * outputRate;
122
- const extraCosts = this.calculateExtraCosts(tokens, pricing);
123
- return {
124
- input_cost: inputCost,
125
- output_cost: outputCost,
126
- total_cost: inputCost + outputCost + extraCosts.total,
127
- detail: {
128
- input: { tokens: tokens.input ?? 0, cost: inputCost },
129
- output: { tokens: tokens.output ?? 0, cost: outputCost },
130
- ...extraCosts.detail,
131
- },
132
- };
119
+ return priceTokenBreakdown(tokens, pricing);
133
120
  }
134
121
  }
135
122
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/plugin/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/plugin/base.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,5 @@ export * from './datastore-base.js';
3
3
  export * from './errors.js';
4
4
  export * from './loader.js';
5
5
  export * from './normalize.js';
6
+ export * from './pricing.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -3,4 +3,5 @@ export * from './datastore-base.js';
3
3
  export * from './errors.js';
4
4
  export * from './loader.js';
5
5
  export * from './normalize.js';
6
+ export * from './pricing.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CostResult, PricingSheetModel, TokenBreakdown } from '@holokai/holo-types/entities';
2
+ type Tier = CostResult['tier'];
3
+ /**
4
+ * Rate for one bucket. `token_costs[bucket]` wins, then the extended-tier columns when the tier
5
+ * applies, then the standard column. `thinking` falls back to the output rate — every provider bills
6
+ * thinking at least as output; a sheet only sets `token_costs.thinking` when it charges more.
7
+ */
8
+ export declare function rateForBucket(bucket: string, pricing: PricingSheetModel, tier: Tier): number | undefined;
9
+ export declare function resolveTier(breakdown: TokenBreakdown, pricing: PricingSheetModel): Tier;
10
+ /** `tokens × rate` per bucket. A bucket with tokens but no rate is listed in `incomplete` and contributes nothing. */
11
+ export declare function priceTokenBreakdown(breakdown: TokenBreakdown, pricing: PricingSheetModel): CostResult;
12
+ export {};
13
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/plugin/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAC,MAAM,8BAA8B,CAAC;AAGhH,KAAK,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAe/B;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAaxG;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAIvF;AAED,sHAAsH;AACtH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA0BrG"}
@@ -0,0 +1,70 @@
1
+ import { billableBuckets, promptTokens } from '../provider/auditor/token-breakdown.js';
2
+ const COLUMN_RATES = {
3
+ input: 'input_cost',
4
+ output: 'output_cost',
5
+ cache_read: 'cache_read_cost',
6
+ cache_write: 'cache_write_cost',
7
+ };
8
+ function asRate(value) {
9
+ if (value === null || value === undefined || value === '')
10
+ return undefined;
11
+ const n = Number(value);
12
+ return Number.isFinite(n) ? n : undefined;
13
+ }
14
+ /**
15
+ * Rate for one bucket. `token_costs[bucket]` wins, then the extended-tier columns when the tier
16
+ * applies, then the standard column. `thinking` falls back to the output rate — every provider bills
17
+ * thinking at least as output; a sheet only sets `token_costs.thinking` when it charges more.
18
+ */
19
+ export function rateForBucket(bucket, pricing, tier) {
20
+ const override = asRate(pricing.token_costs?.[bucket]);
21
+ if (override !== undefined)
22
+ return override;
23
+ if (tier === 'extended') {
24
+ if (bucket === 'input')
25
+ return asRate(pricing.extended_input_cost) ?? asRate(pricing.input_cost);
26
+ if (bucket === 'output' || bucket === 'thinking') {
27
+ return asRate(pricing.extended_output_cost) ?? asRate(pricing.output_cost);
28
+ }
29
+ }
30
+ const column = COLUMN_RATES[bucket];
31
+ if (column)
32
+ return asRate(pricing[column]);
33
+ if (bucket === 'thinking')
34
+ return rateForBucket('output', pricing, tier);
35
+ return undefined;
36
+ }
37
+ export function resolveTier(breakdown, pricing) {
38
+ const threshold = asRate(pricing.context_threshold);
39
+ if (!threshold || !pricing.extended_input_cost || !pricing.extended_output_cost)
40
+ return 'standard';
41
+ return promptTokens(breakdown) > threshold ? 'extended' : 'standard';
42
+ }
43
+ /** `tokens × rate` per bucket. A bucket with tokens but no rate is listed in `incomplete` and contributes nothing. */
44
+ export function priceTokenBreakdown(breakdown, pricing) {
45
+ const tier = resolveTier(breakdown, pricing);
46
+ const detail = {};
47
+ const incomplete = [];
48
+ let total = 0;
49
+ for (const [bucket, tokens] of billableBuckets(breakdown)) {
50
+ const rate = rateForBucket(bucket, pricing, tier);
51
+ if (rate === undefined) {
52
+ detail[bucket] = { tokens, rate: null, cost: 0 };
53
+ if (tokens > 0)
54
+ incomplete.push(bucket);
55
+ continue;
56
+ }
57
+ const cost = tokens * rate;
58
+ detail[bucket] = { tokens, rate, cost };
59
+ total += cost;
60
+ }
61
+ return {
62
+ input_cost: detail.input?.cost ?? 0,
63
+ output_cost: detail.output?.cost ?? 0,
64
+ total_cost: total,
65
+ detail,
66
+ tier,
67
+ incomplete,
68
+ };
69
+ }
70
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/plugin/pricing.ts"],"names":[],"mappings":"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"}