@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
@@ -4,4 +4,6 @@ export * from './base.js';
4
4
  export * from './wire/index.js';
5
5
  export * from './event-processor.js';
6
6
  export * from './worker-request-factory.js';
7
+ export * from './json-output.js';
8
+ export * from './thinking.js';
7
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { HoloResponseFormat } from '@holokai/holo-types/holo';
2
+ import type { IProviderPlugin } from '@holokai/holo-types/plugin';
3
+ import type { ProviderEvent } from '@holokai/holo-types/provider';
4
+ import type { HoloWorkerRequest } from '@holokai/holo-types/worker';
5
+ export declare function wantsJsonOutput(format: HoloResponseFormat | undefined): boolean;
6
+ /**
7
+ * The response format the client asked for. A Holo-native payload carries it directly; a
8
+ * provider-native one is read by the plugin at its family's native location (for Claude and
9
+ * Bedrock, the system-block marker Holo carries it through).
10
+ */
11
+ export declare function resolveResponseFormat(workerRequest: HoloWorkerRequest, plugin: IProviderPlugin): HoloResponseFormat | undefined;
12
+ /**
13
+ * Strips the markdown fences (and, when the whole body is in hand, the prose) a model wraps
14
+ * around the JSON the request asked for, from every body the client will see: native stream
15
+ * chunks (through the plugin that owns their shape), Holo text deltas, and the final `done`
16
+ * message, Holo response and accumulated text. A streaming request applies the fence-only
17
+ * streaming policy to its complete texts too, so snapshots agree with the deltas. The provider's
18
+ * own final body is preserved on `providerMessage` for the audit, and the done event is flagged
19
+ * `jsonUnwrapped` when anything was removed.
20
+ */
21
+ export declare function unwrapJsonOutputEvents(events: AsyncIterable<ProviderEvent>, plugin: IProviderPlugin, protocolName: string | undefined, isStreaming: boolean): AsyncIterable<ProviderEvent>;
22
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/provider/json-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAC,eAAe,EAAqB,MAAM,4BAA4B,CAAC;AACpF,OAAO,KAAK,EAAoB,aAAa,EAAC,MAAM,8BAA8B,CAAC;AACnF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAIlE,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,eAAe,GACxB,kBAAkB,GAAG,SAAS,CAKhC;AAkBD;;;;;;;;GAQG;AACH,wBAAuB,sBAAsB,CACzC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO,GACrB,aAAa,CAAC,aAAa,CAAC,CAkB9B"}
@@ -0,0 +1,88 @@
1
+ import { ProtocolCapability } from '@holokai/holo-types/entities';
2
+ import { JsonOutputStreamFilter, stripStreamedFences, unwrapJsonText } from '../core/index.js';
3
+ export function wantsJsonOutput(format) {
4
+ return format?.type === 'json_schema' || format?.type === 'json_object';
5
+ }
6
+ /**
7
+ * The response format the client asked for. A Holo-native payload carries it directly; a
8
+ * provider-native one is read by the plugin at its family's native location (for Claude and
9
+ * Bedrock, the system-block marker Holo carries it through).
10
+ */
11
+ export function resolveResponseFormat(workerRequest, plugin) {
12
+ const capability = workerRequest.protocol?.capability;
13
+ if (capability !== ProtocolCapability.CHAT && capability !== ProtocolCapability.GENERATE)
14
+ return undefined;
15
+ if (workerRequest.isHoloNative)
16
+ return workerRequest.payload?.response_format;
17
+ return plugin.getResponseFormatFromRequest(workerRequest.payload, workerRequest.protocol?.name);
18
+ }
19
+ function rewriteHoloResponseText(response, rewrite) {
20
+ return {
21
+ ...response,
22
+ output: response.output.map(message => {
23
+ if (message.role !== 'assistant')
24
+ return message;
25
+ if (typeof message.content === 'string')
26
+ return { ...message, content: rewrite(message.content) };
27
+ return {
28
+ ...message,
29
+ content: message.content.map(block => block.type === 'text' ? { ...block, text: rewrite(block.text) } : block),
30
+ };
31
+ }),
32
+ };
33
+ }
34
+ /**
35
+ * Strips the markdown fences (and, when the whole body is in hand, the prose) a model wraps
36
+ * around the JSON the request asked for, from every body the client will see: native stream
37
+ * chunks (through the plugin that owns their shape), Holo text deltas, and the final `done`
38
+ * message, Holo response and accumulated text. A streaming request applies the fence-only
39
+ * streaming policy to its complete texts too, so snapshots agree with the deltas. The provider's
40
+ * own final body is preserved on `providerMessage` for the audit, and the done event is flagged
41
+ * `jsonUnwrapped` when anything was removed.
42
+ */
43
+ export async function* unwrapJsonOutputEvents(events, plugin, protocolName, isStreaming) {
44
+ const chunkFilter = new JsonOutputStreamFilter();
45
+ const deltaFilter = new JsonOutputStreamFilter();
46
+ const full = isStreaming ? stripStreamedFences : (text) => unwrapJsonText(text).text;
47
+ const rewriter = { delta: text => chunkFilter.push(text), full };
48
+ for await (const ev of events) {
49
+ if (ev.type === 'stream_event') {
50
+ const event = plugin.rewriteStreamEventText(ev.event, rewriter, protocolName);
51
+ yield event === ev.event ? ev : { ...ev, event };
52
+ }
53
+ else if (ev.type === 'text_delta') {
54
+ yield { ...ev, text: deltaFilter.push(ev.text) };
55
+ }
56
+ else if (ev.type === 'done') {
57
+ yield unwrapDone(ev, plugin, protocolName, full, chunkFilter.fenced || deltaFilter.fenced);
58
+ }
59
+ else {
60
+ yield ev;
61
+ }
62
+ }
63
+ }
64
+ function unwrapDone(ev, plugin, protocolName, rewrite, streamWasFenced) {
65
+ let changed = false;
66
+ const tracked = (text) => {
67
+ const out = rewrite(text);
68
+ if (out !== text)
69
+ changed = true;
70
+ return out;
71
+ };
72
+ const message = plugin.rewriteResponseText(ev.message, tracked, protocolName);
73
+ const holoResponse = ev.holoResponse ? rewriteHoloResponseText(ev.holoResponse, tracked) : undefined;
74
+ const text = ev.text ? tracked(ev.text) : ev.text;
75
+ if (!changed && !streamWasFenced)
76
+ return ev;
77
+ const done = {
78
+ ...ev,
79
+ message,
80
+ text,
81
+ providerMessage: ev.providerMessage ?? ev.message,
82
+ jsonUnwrapped: true,
83
+ };
84
+ if (holoResponse)
85
+ done.holoResponse = holoResponse;
86
+ return done;
87
+ }
88
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/provider/json-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { HoloEffort, HoloThinking } from '@holokai/holo-types/holo';
2
+ /**
3
+ * Every effort level, ordered least to most.
4
+ *
5
+ * Providers accept different subsets of this. Rather than each translator inventing its own
6
+ * table, a family declares what it supports and {@link clampEffort} maps the canonical value
7
+ * onto it, so the same `HoloRequest` produces comparable depth everywhere.
8
+ */
9
+ export declare const EFFORT_ORDER: readonly ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
10
+ /** Lowest budget any provider accepts for a thinking-enabled request (Anthropic's floor). */
11
+ export declare const MIN_THINKING_BUDGET = 1024;
12
+ /**
13
+ * Clamp `effort` to the nearest level in `supported`. Returns `undefined` when nothing is supported.
14
+ *
15
+ * Ties round **down**: a caller asking for a level this family lacks should not be quietly
16
+ * charged for a deeper one than they asked for. The result does not depend on the order of
17
+ * `supported`.
18
+ */
19
+ export declare function clampEffort(effort: HoloEffort, supported: readonly HoloEffort[]): HoloEffort | undefined;
20
+ export interface BudgetBounds {
21
+ min?: number | undefined;
22
+ max?: number | undefined;
23
+ }
24
+ /** Fit a budget into `[min, max]`. The floor wins, so a family's minimum is never undercut. */
25
+ export declare function clampBudget(budget: number, bounds?: BudgetBounds): number;
26
+ /** Token budget for an effort level, clamped into `[min, max]` when the family constrains it. */
27
+ export declare function effortToBudget(effort: HoloEffort, bounds?: BudgetBounds): number;
28
+ /** Inverse of {@link effortToBudget}: the highest level whose budget the caller's fits. */
29
+ export declare function budgetToEffort(budget: number): HoloEffort;
30
+ /** True when the caller asked for no reasoning at all. */
31
+ export declare function isThinkingOff(thinking: HoloThinking | undefined): boolean;
32
+ /**
33
+ * Whether reasoning content should be returned. Defaults to `true` — Claude and Gemini both
34
+ * hide it unless asked, and Holo's reasoning stream exists to surface it.
35
+ */
36
+ export declare function wantsThoughts(thinking: HoloThinking | undefined): boolean;
37
+ /**
38
+ * Effective effort for a request, deriving from `budget_tokens` when only that was supplied
39
+ * and clamping to `supported` when the family constrains the range.
40
+ */
41
+ export declare function resolveEffort(thinking: HoloThinking | undefined, supported?: readonly HoloEffort[]): HoloEffort | undefined;
42
+ /**
43
+ * Effective token budget for a request, deriving from `effort` when only that was supplied.
44
+ * Returns `undefined` when thinking is off or nothing was configured.
45
+ *
46
+ * @remarks An explicitly supplied `budget_tokens` is passed through, bounds-clamped only. Only a
47
+ * derived budget goes through the ladder — routing the caller's own number through it would snap
48
+ * it to the nearest rung and silently cut the value they asked for.
49
+ *
50
+ * @param effortOverride depth already clamped to what the target accepts. Pass it wherever the
51
+ * family clamps effort, so the budget agrees with the level actually being sent.
52
+ */
53
+ export declare function resolveBudget(thinking: HoloThinking | undefined, bounds?: BudgetBounds, effortOverride?: HoloEffort | undefined): number | undefined;
54
+ /**
55
+ * Build a {@link HoloThinking} for the `toHolo` direction, dropping undefined fields and
56
+ * collapsing to `undefined` when the native request carried no reasoning configuration.
57
+ */
58
+ export declare function toHoloThinking(partial: {
59
+ type: HoloThinking['type'];
60
+ effort?: HoloEffort | undefined;
61
+ budget_tokens?: number | undefined;
62
+ include_thoughts?: boolean | undefined;
63
+ }): HoloThinking | undefined;
64
+ /**
65
+ * Canonical thinking for a family whose only dial is an effort level (OpenAI, Ollama, and
66
+ * Gemini's `thinkingLevel`). `none` is how those families spell "off", so it maps to
67
+ * `disabled` rather than to an enabled request with zero depth.
68
+ */
69
+ export declare function thinkingFromEffort(effort: HoloEffort | null | undefined, include_thoughts?: boolean | undefined): HoloThinking | undefined;
70
+ /**
71
+ * Effort for a family where the level **is** the on/off switch (OpenAI), rather than a separate
72
+ * field alongside one (Claude).
73
+ *
74
+ * There, `none` is how the API spells "off", so an explicit `disabled` has to collapse onto it.
75
+ * {@link resolveEffort} deliberately preserves a stated depth instead, which on these families
76
+ * would turn reasoning back on for a caller who asked to switch it off.
77
+ */
78
+ export declare function resolveEffortDial(thinking: HoloThinking | undefined, supported?: readonly HoloEffort[]): HoloEffort | undefined;
79
+ //# sourceMappingURL=thinking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking.d.ts","sourceRoot":"","sources":["../../src/provider/thinking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAGvE;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,uEAAwE,CAAC;AAoBlG,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAmBxG;AAED,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,YAAiB,GAAG,MAAM,CAM7E;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAE,YAAiB,GAAG,MAAM,CAEpF;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAMzD;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAEzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,SAAS,GAAE,SAAS,UAAU,EAAiB,GAChD,UAAU,GAAG,SAAS,CAYxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CACzB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,MAAM,GAAE,YAAiB,EACzB,cAAc,CAAC,EAAE,UAAU,GAAG,SAAS,GACxC,MAAM,GAAG,SAAS,CAQpB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACpC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C,GAAG,YAAY,GAAG,SAAS,CAgB3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACrC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,GACvC,YAAY,GAAG,SAAS,CAO1B;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,SAAS,GAAE,SAAS,UAAU,EAAiB,GAChD,UAAU,GAAG,SAAS,CAGxB"}
@@ -0,0 +1,173 @@
1
+ import { pickDefined } from '../core/index.js';
2
+ /**
3
+ * Every effort level, ordered least to most.
4
+ *
5
+ * Providers accept different subsets of this. Rather than each translator inventing its own
6
+ * table, a family declares what it supports and {@link clampEffort} maps the canonical value
7
+ * onto it, so the same `HoloRequest` produces comparable depth everywhere.
8
+ */
9
+ export const EFFORT_ORDER = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
10
+ /**
11
+ * Effort → thinking-token budget.
12
+ *
13
+ * The rungs are deliberately shared: a caller who sets only `effort` still drives Gemini and
14
+ * older Claude models, and one who sets only `budget_tokens` still drives OpenAI and Ollama.
15
+ * If each plugin picked its own thresholds the same request would mean different things per
16
+ * family, which is the whole problem this table exists to avoid.
17
+ */
18
+ const EFFORT_BUDGET = {
19
+ none: 0,
20
+ minimal: 1024,
21
+ low: 4096,
22
+ medium: 8192,
23
+ high: 16384,
24
+ xhigh: 32768,
25
+ max: 65536,
26
+ };
27
+ /** Lowest budget any provider accepts for a thinking-enabled request (Anthropic's floor). */
28
+ export const MIN_THINKING_BUDGET = 1024;
29
+ /**
30
+ * Clamp `effort` to the nearest level in `supported`. Returns `undefined` when nothing is supported.
31
+ *
32
+ * Ties round **down**: a caller asking for a level this family lacks should not be quietly
33
+ * charged for a deeper one than they asked for. The result does not depend on the order of
34
+ * `supported`.
35
+ */
36
+ export function clampEffort(effort, supported) {
37
+ if (!supported.length)
38
+ return undefined;
39
+ if (supported.includes(effort))
40
+ return effort;
41
+ const target = EFFORT_ORDER.indexOf(effort);
42
+ let best;
43
+ let bestIndex = -1;
44
+ let bestDistance = Number.POSITIVE_INFINITY;
45
+ for (const candidate of supported) {
46
+ const index = EFFORT_ORDER.indexOf(candidate);
47
+ const distance = Math.abs(index - target);
48
+ if (distance < bestDistance || (distance === bestDistance && index < bestIndex)) {
49
+ bestDistance = distance;
50
+ bestIndex = index;
51
+ best = candidate;
52
+ }
53
+ }
54
+ return best;
55
+ }
56
+ /** Fit a budget into `[min, max]`. The floor wins, so a family's minimum is never undercut. */
57
+ export function clampBudget(budget, bounds = {}) {
58
+ const { min, max } = bounds;
59
+ let clamped = budget;
60
+ if (max !== undefined)
61
+ clamped = Math.min(clamped, max);
62
+ if (min !== undefined)
63
+ clamped = Math.max(clamped, min);
64
+ return clamped;
65
+ }
66
+ /** Token budget for an effort level, clamped into `[min, max]` when the family constrains it. */
67
+ export function effortToBudget(effort, bounds = {}) {
68
+ return clampBudget(EFFORT_BUDGET[effort], bounds);
69
+ }
70
+ /** Inverse of {@link effortToBudget}: the highest level whose budget the caller's fits. */
71
+ export function budgetToEffort(budget) {
72
+ let resolved = 'none';
73
+ for (const effort of EFFORT_ORDER) {
74
+ if (budget >= EFFORT_BUDGET[effort])
75
+ resolved = effort;
76
+ }
77
+ return resolved;
78
+ }
79
+ /** True when the caller asked for no reasoning at all. */
80
+ export function isThinkingOff(thinking) {
81
+ return thinking?.type === 'disabled' || thinking?.effort === 'none';
82
+ }
83
+ /**
84
+ * Whether reasoning content should be returned. Defaults to `true` — Claude and Gemini both
85
+ * hide it unless asked, and Holo's reasoning stream exists to surface it.
86
+ */
87
+ export function wantsThoughts(thinking) {
88
+ return thinking?.include_thoughts !== false;
89
+ }
90
+ /**
91
+ * Effective effort for a request, deriving from `budget_tokens` when only that was supplied
92
+ * and clamping to `supported` when the family constrains the range.
93
+ */
94
+ export function resolveEffort(thinking, supported = EFFORT_ORDER) {
95
+ if (!thinking)
96
+ return undefined;
97
+ // An explicitly stated depth always wins, including on a disabled request. On most families
98
+ // effort *is* the on/off dial, but Claude keeps them as separate fields, so collapsing the
99
+ // two here would silently discard a caller's depth. Deciding what a contradictory pair means
100
+ // belongs to each family's mapper, not to depth resolution.
101
+ const stated = thinking.effort ?? (thinking.budget_tokens !== undefined ? budgetToEffort(thinking.budget_tokens) : undefined);
102
+ const effort = stated ?? (thinking.type === 'disabled' ? 'none' : undefined);
103
+ return effort === undefined ? undefined : clampEffort(effort, supported);
104
+ }
105
+ /**
106
+ * Effective token budget for a request, deriving from `effort` when only that was supplied.
107
+ * Returns `undefined` when thinking is off or nothing was configured.
108
+ *
109
+ * @remarks An explicitly supplied `budget_tokens` is passed through, bounds-clamped only. Only a
110
+ * derived budget goes through the ladder — routing the caller's own number through it would snap
111
+ * it to the nearest rung and silently cut the value they asked for.
112
+ *
113
+ * @param effortOverride depth already clamped to what the target accepts. Pass it wherever the
114
+ * family clamps effort, so the budget agrees with the level actually being sent.
115
+ */
116
+ export function resolveBudget(thinking, bounds = {}, effortOverride) {
117
+ if (!thinking || isThinkingOff(thinking))
118
+ return undefined;
119
+ if (thinking.budget_tokens !== undefined) {
120
+ return clampBudget(thinking.budget_tokens, bounds);
121
+ }
122
+ const effort = effortOverride ?? thinking.effort;
123
+ if (effort !== undefined)
124
+ return effortToBudget(effort, bounds);
125
+ return undefined;
126
+ }
127
+ /**
128
+ * Build a {@link HoloThinking} for the `toHolo` direction, dropping undefined fields and
129
+ * collapsing to `undefined` when the native request carried no reasoning configuration.
130
+ */
131
+ export function toHoloThinking(partial) {
132
+ const { effort, budget_tokens, include_thoughts } = partial;
133
+ if (partial.type === 'auto' &&
134
+ effort === undefined &&
135
+ budget_tokens === undefined &&
136
+ include_thoughts === undefined) {
137
+ return undefined;
138
+ }
139
+ return pickDefined({
140
+ type: partial.type,
141
+ effort,
142
+ budget_tokens,
143
+ include_thoughts,
144
+ });
145
+ }
146
+ /**
147
+ * Canonical thinking for a family whose only dial is an effort level (OpenAI, Ollama, and
148
+ * Gemini's `thinkingLevel`). `none` is how those families spell "off", so it maps to
149
+ * `disabled` rather than to an enabled request with zero depth.
150
+ */
151
+ export function thinkingFromEffort(effort, include_thoughts) {
152
+ if (effort === null || effort === undefined)
153
+ return undefined;
154
+ return toHoloThinking({
155
+ type: effort === 'none' ? 'disabled' : 'enabled',
156
+ effort,
157
+ include_thoughts,
158
+ });
159
+ }
160
+ /**
161
+ * Effort for a family where the level **is** the on/off switch (OpenAI), rather than a separate
162
+ * field alongside one (Claude).
163
+ *
164
+ * There, `none` is how the API spells "off", so an explicit `disabled` has to collapse onto it.
165
+ * {@link resolveEffort} deliberately preserves a stated depth instead, which on these families
166
+ * would turn reasoning back on for a caller who asked to switch it off.
167
+ */
168
+ export function resolveEffortDial(thinking, supported = EFFORT_ORDER) {
169
+ if (isThinkingOff(thinking))
170
+ return clampEffort('none', supported);
171
+ return resolveEffort(thinking, supported);
172
+ }
173
+ //# sourceMappingURL=thinking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking.js","sourceRoot":"","sources":["../../src/provider/thinking.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"translate-provider-events.d.ts","sourceRoot":"","sources":["../../../src/provider/translator/translate-provider-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,mBAAmB,EAAE,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAE3G;;;;;;;;;;;GAWG;AACH,wBAAuB,uBAAuB,CAC1C,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE,mBAAmB,GAC1B,aAAa,CAAC,aAAa,CAAC,CAwH9B"}
1
+ {"version":3,"file":"translate-provider-events.d.ts","sourceRoot":"","sources":["../../../src/provider/translator/translate-provider-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,mBAAmB,EAAE,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAE3G;;;;;;;;;;;GAWG;AACH,wBAAuB,uBAAuB,CAC1C,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE,mBAAmB,GAC1B,aAAa,CAAC,aAAa,CAAC,CAgI9B"}
@@ -107,10 +107,18 @@ export async function* translateProviderEvents(events, source, wire) {
107
107
  holoResp = Object.assign({}, baseResp, { usage: usage });
108
108
  }
109
109
  }
110
- yield { ...done, message: await wire.fromHoloResponse(holoResp) };
110
+ // `message` becomes the wire-family body the client receives; keep the provider's own
111
+ // body so the audit still sees what the provider returned (usage details included).
112
+ yield {
113
+ ...done,
114
+ message: await wire.fromHoloResponse(holoResp),
115
+ providerMessage: done.providerMessage ?? done.message,
116
+ chunksForwarded: false,
117
+ };
111
118
  }
112
- catch {
113
- yield done;
119
+ catch (e) {
120
+ // The client gets the provider-shaped body; the audit records that the translation failed.
121
+ yield { ...done, translationError: e.message, chunksForwarded: false };
114
122
  }
115
123
  }
116
124
  const err = ctx.pendingError;
@@ -1 +1 @@
1
- {"version":3,"file":"translate-provider-events.js","sourceRoot":"","sources":["../../../src/provider/translator/translate-provider-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"translate-provider-events.js","sourceRoot":"","sources":["../../../src/provider/translator/translate-provider-events.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,uBAAuB,CAC1C,MAAoC,EACpC,MAA2B,EAC3B,IAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACvB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM;YAAE,MAAM,EAAE,CAAC;QACxC,OAAO;IACX,CAAC;IAGD,MAAM,GAAG,GAKL,EAAC,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAC,CAAC;IAEpF,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAChC,CAAC,KAAK,SAAS,CAAC;QACZ,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBACjD,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,KAAK,CAAC;YACnB,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;gBAClD,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC;gBACrB,OAAO;YACX,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;gBACtB,OAAO;YACX,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;IACL,CAAC,CAAC,EAAE,CACP,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,QAA0C,CAAC,EAAE,CAAC;QAC5F,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC;QAChC,IAAI,GAAG;YAAE,MAAM,EAAC,GAAG,GAAG,EAAE,KAAK,EAAE,SAAS,EAAC,CAAC;IAC9C,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW;QAAE,MAAM,EAAE,CAAC;IAE3C,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IAC7B,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAiB,CAAC;YACpG,kEAAkE;YAClE,4DAA4D;YAC5D,2DAA2D;YAC3D,+DAA+D;YAC/D,0DAA0D;YAC1D,MAAM,CAAC,GACH,IASH,CAAC,OAAO,CAAC;YACV,IAAI,QAAQ,GAAiB,QAAQ,CAAC;YACtC,IAAI,CAAC,EAAE,CAAC;gBACJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAChC,MAAM,KAAK,GAA4B,QAAQ,CAAC,CAAC,CAAC,EAAC,GAAG,QAAQ,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,iEAAiE;gBACjE,6DAA6D;gBAC7D,0DAA0D;gBAC1D,4DAA4D;gBAC5D,6DAA6D;gBAC7D,0DAA0D;gBAC1D,wDAAwD;gBACxD,MAAM,SAAS,GAAG,CAAC,WAAoB,EAAE,IAAa,EAAsB,EAAE;oBAC1E,MAAM,CAAC,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5D,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrB,OAAO,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;oBACrE,CAAC;oBACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,CAAC,CAAC;gBACF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,KAAK,KAAK,SAAS;oBAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;gBACpD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC9D,IAAI,MAAM,KAAK,SAAS;oBAAE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;gBACvD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,KAAK,KAAK,SAAS;oBAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;gBACpD,mEAAmE;gBACnE,mEAAmE;gBACnE,4DAA4D;gBAC5D,+DAA+D;gBAC/D,0BAA0B;gBAC1B,MAAM,eAAe,GAAI,QAA2D,EAAE,OAAO,IAAI,EAAE,CAAC;gBACpG,MAAM,OAAO,GAA2B,EAAC,GAAG,eAAe,EAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;gBAC7C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,mBAAmB,KAAK,QAAQ,EAAE,CAAC;oBAC3E,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;oBAC9E,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBACpD,CAAC;gBACD,IACI,OAAO,CAAC,IAAI,KAAK,SAAS;oBAC1B,OAAO,CAAC,CAAC,mBAAmB,KAAK,QAAQ;oBACzC,OAAO,CAAC,CAAC,gBAAgB,KAAK,QAAQ,EACxC,CAAC;oBACC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAClF,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC5B,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAC,KAAK,EAAE,KAA8B,EAAC,CAAC,CAAC;gBACpF,CAAC;YACL,CAAC;YACD,sFAAsF;YACtF,oFAAoF;YACpF,MAAM;gBACF,GAAG,IAAI;gBACP,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;gBAC9C,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO;gBACrD,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,2FAA2F;YAC3F,MAAM,EAAC,GAAG,IAAI,EAAE,gBAAgB,EAAG,CAAW,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAC,CAAC;QACpF,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC;IAC7B,IAAI,GAAG;QAAE,MAAM,GAAG,CAAC;AACvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holokai/holo-sdk",
3
- "version": "1.6.0",
3
+ "version": "1.9.0",
4
4
  "type": "module",
5
5
  "description": "Common SDK for Holo plugin system - contracts, types, and validators",
6
6
  "author": "Holokai",
@@ -86,9 +86,8 @@
86
86
  ],
87
87
  "sideEffects": false,
88
88
  "dependencies": {
89
- "tiktoken": "^1.0.0",
90
89
  "uuid": "^14.0.1",
91
- "@holokai/holo-types": "^1.6.0"
90
+ "@holokai/holo-types": "^1.9.0"
92
91
  },
93
92
  "peerDependencies": {
94
93
  "express": "^5.0.0",
@@ -1,2 +0,0 @@
1
- export declare function countTokens(text: string): number;
2
- //# sourceMappingURL=tokenizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"AAWA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -1,12 +0,0 @@
1
- import { encoding_for_model } from 'tiktoken';
2
- let encoder;
3
- function getEncoder() {
4
- if (!encoder) {
5
- encoder = encoding_for_model('gpt-4o');
6
- }
7
- return encoder;
8
- }
9
- export function countTokens(text) {
10
- return getEncoder().encode(text).length;
11
- }
12
- //# sourceMappingURL=tokenizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/core/tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAC,MAAM,UAAU,CAAC;AAE5C,IAAI,OAA0D,CAAC;AAE/D,SAAS,UAAU;IACf,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,OAAO,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC"}