@holokai/holo-sdk 1.4.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +264 -0
  3. package/dist/client/builder.d.ts +82 -0
  4. package/dist/client/builder.d.ts.map +1 -0
  5. package/dist/client/builder.js +207 -0
  6. package/dist/client/builder.js.map +1 -0
  7. package/dist/client/client.d.ts +148 -0
  8. package/dist/client/client.d.ts.map +1 -0
  9. package/dist/client/client.js +309 -0
  10. package/dist/client/client.js.map +1 -0
  11. package/dist/client/errors.d.ts +20 -0
  12. package/dist/client/errors.d.ts.map +1 -0
  13. package/dist/client/errors.js +36 -0
  14. package/dist/client/errors.js.map +1 -0
  15. package/dist/client/index.d.ts +11 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +8 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/client/merge.d.ts +28 -0
  20. package/dist/client/merge.d.ts.map +1 -0
  21. package/dist/client/merge.js +185 -0
  22. package/dist/client/merge.js.map +1 -0
  23. package/dist/client/output.d.ts +26 -0
  24. package/dist/client/output.d.ts.map +1 -0
  25. package/dist/client/output.js +75 -0
  26. package/dist/client/output.js.map +1 -0
  27. package/dist/client/runner.d.ts +92 -0
  28. package/dist/client/runner.d.ts.map +1 -0
  29. package/dist/client/runner.js +121 -0
  30. package/dist/client/runner.js.map +1 -0
  31. package/dist/client/sse.d.ts +3 -0
  32. package/dist/client/sse.d.ts.map +1 -0
  33. package/dist/client/sse.js +72 -0
  34. package/dist/client/sse.js.map +1 -0
  35. package/dist/client/stream.d.ts +60 -0
  36. package/dist/client/stream.d.ts.map +1 -0
  37. package/dist/client/stream.js +137 -0
  38. package/dist/client/stream.js.map +1 -0
  39. package/dist/client/transport.d.ts +42 -0
  40. package/dist/client/transport.d.ts.map +1 -0
  41. package/dist/client/transport.js +129 -0
  42. package/dist/client/transport.js.map +1 -0
  43. package/dist/client/types.d.ts +41 -0
  44. package/dist/client/types.d.ts.map +1 -0
  45. package/dist/client/types.js +2 -0
  46. package/dist/client/types.js.map +1 -0
  47. package/dist/core/async-event-queue.d.ts +11 -0
  48. package/dist/core/async-event-queue.d.ts.map +1 -0
  49. package/dist/core/async-event-queue.js +38 -0
  50. package/dist/core/async-event-queue.js.map +1 -0
  51. package/dist/core/binary.d.ts +3 -0
  52. package/dist/core/binary.d.ts.map +1 -0
  53. package/dist/core/binary.js +11 -0
  54. package/dist/core/binary.js.map +1 -0
  55. package/dist/core/errors.d.ts +11 -0
  56. package/dist/core/errors.d.ts.map +1 -0
  57. package/dist/core/errors.js +24 -0
  58. package/dist/core/errors.js.map +1 -0
  59. package/dist/core/headers.d.ts +3 -0
  60. package/dist/core/headers.d.ts.map +1 -0
  61. package/dist/core/headers.js +42 -0
  62. package/dist/core/headers.js.map +1 -0
  63. package/dist/core/index.d.ts +13 -0
  64. package/dist/core/index.d.ts.map +1 -0
  65. package/dist/core/index.js +13 -0
  66. package/dist/core/index.js.map +1 -0
  67. package/dist/core/logger.d.ts +37 -0
  68. package/dist/core/logger.d.ts.map +1 -0
  69. package/dist/core/logger.js +73 -0
  70. package/dist/core/logger.js.map +1 -0
  71. package/dist/core/pick-defined.d.ts +9 -0
  72. package/dist/core/pick-defined.d.ts.map +1 -0
  73. package/dist/core/pick-defined.js +79 -0
  74. package/dist/core/pick-defined.js.map +1 -0
  75. package/dist/core/safe-parse.d.ts +2 -0
  76. package/dist/core/safe-parse.d.ts.map +1 -0
  77. package/dist/core/safe-parse.js +11 -0
  78. package/dist/core/safe-parse.js.map +1 -0
  79. package/dist/core/sanitize.object.d.ts +2 -0
  80. package/dist/core/sanitize.object.d.ts.map +1 -0
  81. package/dist/core/sanitize.object.js +10 -0
  82. package/dist/core/sanitize.object.js.map +1 -0
  83. package/dist/core/stable-id.d.ts +2 -0
  84. package/dist/core/stable-id.d.ts.map +1 -0
  85. package/dist/core/stable-id.js +11 -0
  86. package/dist/core/stable-id.js.map +1 -0
  87. package/dist/core/stringify-any.d.ts +2 -0
  88. package/dist/core/stringify-any.d.ts.map +1 -0
  89. package/dist/core/stringify-any.js +4 -0
  90. package/dist/core/stringify-any.js.map +1 -0
  91. package/dist/core/time-utils.d.ts +2 -0
  92. package/dist/core/time-utils.d.ts.map +1 -0
  93. package/dist/core/time-utils.js +2 -0
  94. package/dist/core/time-utils.js.map +1 -0
  95. package/dist/core/tokenizer.d.ts +2 -0
  96. package/dist/core/tokenizer.d.ts.map +1 -0
  97. package/dist/core/tokenizer.js +12 -0
  98. package/dist/core/tokenizer.js.map +1 -0
  99. package/dist/holo/content.d.ts +9 -0
  100. package/dist/holo/content.d.ts.map +1 -0
  101. package/dist/holo/content.js +22 -0
  102. package/dist/holo/content.js.map +1 -0
  103. package/dist/holo/factories/index.d.ts +2 -0
  104. package/dist/holo/factories/index.d.ts.map +1 -0
  105. package/dist/holo/factories/index.js +2 -0
  106. package/dist/holo/factories/index.js.map +1 -0
  107. package/dist/holo/factories/request-factory.d.ts +3 -0
  108. package/dist/holo/factories/request-factory.d.ts.map +1 -0
  109. package/dist/holo/factories/request-factory.js +8 -0
  110. package/dist/holo/factories/request-factory.js.map +1 -0
  111. package/dist/holo/index.d.ts +3 -0
  112. package/dist/holo/index.d.ts.map +1 -0
  113. package/dist/holo/index.js +3 -0
  114. package/dist/holo/index.js.map +1 -0
  115. package/dist/index.d.ts +5 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +5 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/matching/index.d.ts +3 -0
  120. package/dist/matching/index.d.ts.map +1 -0
  121. package/dist/matching/index.js +2 -0
  122. package/dist/matching/index.js.map +1 -0
  123. package/dist/matching/normalize.d.ts +19 -0
  124. package/dist/matching/normalize.d.ts.map +1 -0
  125. package/dist/matching/normalize.js +169 -0
  126. package/dist/matching/normalize.js.map +1 -0
  127. package/dist/notification/index.d.ts +4 -0
  128. package/dist/notification/index.d.ts.map +1 -0
  129. package/dist/notification/index.js +4 -0
  130. package/dist/notification/index.js.map +1 -0
  131. package/dist/notification/service.d.ts +8 -0
  132. package/dist/notification/service.d.ts.map +1 -0
  133. package/dist/notification/service.js +16 -0
  134. package/dist/notification/service.js.map +1 -0
  135. package/dist/notification/store.d.ts +2 -0
  136. package/dist/notification/store.d.ts.map +1 -0
  137. package/dist/notification/store.js +2 -0
  138. package/dist/notification/store.js.map +1 -0
  139. package/dist/notification/types.d.ts +11 -0
  140. package/dist/notification/types.d.ts.map +1 -0
  141. package/dist/notification/types.js +63 -0
  142. package/dist/notification/types.js.map +1 -0
  143. package/dist/plugin/base.d.ts +29 -0
  144. package/dist/plugin/base.d.ts.map +1 -0
  145. package/dist/plugin/base.js +105 -0
  146. package/dist/plugin/base.js.map +1 -0
  147. package/dist/plugin/errors.d.ts +9 -0
  148. package/dist/plugin/errors.d.ts.map +1 -0
  149. package/dist/plugin/errors.js +15 -0
  150. package/dist/plugin/errors.js.map +1 -0
  151. package/dist/plugin/index.d.ts +5 -0
  152. package/dist/plugin/index.d.ts.map +1 -0
  153. package/dist/plugin/index.js +5 -0
  154. package/dist/plugin/index.js.map +1 -0
  155. package/dist/plugin/loader.d.ts +14 -0
  156. package/dist/plugin/loader.d.ts.map +1 -0
  157. package/dist/plugin/loader.js +67 -0
  158. package/dist/plugin/loader.js.map +1 -0
  159. package/dist/plugin/normalize.d.ts +3 -0
  160. package/dist/plugin/normalize.d.ts.map +1 -0
  161. package/dist/plugin/normalize.js +160 -0
  162. package/dist/plugin/normalize.js.map +1 -0
  163. package/dist/provider/auditor/base.d.ts +47 -0
  164. package/dist/provider/auditor/base.d.ts.map +1 -0
  165. package/dist/provider/auditor/base.js +254 -0
  166. package/dist/provider/auditor/base.js.map +1 -0
  167. package/dist/provider/auditor/index.d.ts +2 -0
  168. package/dist/provider/auditor/index.d.ts.map +1 -0
  169. package/dist/provider/auditor/index.js +2 -0
  170. package/dist/provider/auditor/index.js.map +1 -0
  171. package/dist/provider/base.d.ts +36 -0
  172. package/dist/provider/base.d.ts.map +1 -0
  173. package/dist/provider/base.js +185 -0
  174. package/dist/provider/base.js.map +1 -0
  175. package/dist/provider/event-processor.d.ts +13 -0
  176. package/dist/provider/event-processor.d.ts.map +1 -0
  177. package/dist/provider/event-processor.js +22 -0
  178. package/dist/provider/event-processor.js.map +1 -0
  179. package/dist/provider/index.d.ts +7 -0
  180. package/dist/provider/index.d.ts.map +1 -0
  181. package/dist/provider/index.js +7 -0
  182. package/dist/provider/index.js.map +1 -0
  183. package/dist/provider/translator/base.d.ts +15 -0
  184. package/dist/provider/translator/base.d.ts.map +1 -0
  185. package/dist/provider/translator/base.js +33 -0
  186. package/dist/provider/translator/base.js.map +1 -0
  187. package/dist/provider/translator/index.d.ts +3 -0
  188. package/dist/provider/translator/index.d.ts.map +1 -0
  189. package/dist/provider/translator/index.js +3 -0
  190. package/dist/provider/translator/index.js.map +1 -0
  191. package/dist/provider/translator/stream.d.ts +24 -0
  192. package/dist/provider/translator/stream.d.ts.map +1 -0
  193. package/dist/provider/translator/stream.js +50 -0
  194. package/dist/provider/translator/stream.js.map +1 -0
  195. package/dist/provider/wire/base.d.ts +39 -0
  196. package/dist/provider/wire/base.d.ts.map +1 -0
  197. package/dist/provider/wire/base.js +106 -0
  198. package/dist/provider/wire/base.js.map +1 -0
  199. package/dist/provider/wire/holo.wire.adapter.d.ts +33 -0
  200. package/dist/provider/wire/holo.wire.adapter.d.ts.map +1 -0
  201. package/dist/provider/wire/holo.wire.adapter.js +220 -0
  202. package/dist/provider/wire/holo.wire.adapter.js.map +1 -0
  203. package/dist/provider/wire/index.d.ts +3 -0
  204. package/dist/provider/wire/index.d.ts.map +1 -0
  205. package/dist/provider/wire/index.js +3 -0
  206. package/dist/provider/wire/index.js.map +1 -0
  207. package/dist/provider/worker-request-factory.d.ts +23 -0
  208. package/dist/provider/worker-request-factory.d.ts.map +1 -0
  209. package/dist/provider/worker-request-factory.js +38 -0
  210. package/dist/provider/worker-request-factory.js.map +1 -0
  211. package/package.json +106 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Accumulates {@link HoloStreamEvent} deltas into a complete {@link HoloResponse}.
3
+ *
4
+ * Feed events via {@link push}, then call {@link toResponse} to get the assembled result.
5
+ * Used internally by {@link HoloStream} but can also be used standalone.
6
+ */
7
+ export class HoloStreamAccumulator {
8
+ id = '';
9
+ model;
10
+ created;
11
+ textParts = [];
12
+ reasoningParts = [];
13
+ toolCalls = new Map();
14
+ invalidToolCalls = [];
15
+ usage;
16
+ finishReason = null;
17
+ /** Process a single stream event, merging its data into the accumulated state. */
18
+ push(event) {
19
+ switch (event.type) {
20
+ case 'response.created':
21
+ if (event.response) {
22
+ if (event.response.id)
23
+ this.id = event.response.id;
24
+ this.model = event.response.model;
25
+ this.created = event.response.created;
26
+ }
27
+ break;
28
+ case 'response.output_text.delta':
29
+ if (event.delta) {
30
+ this.textParts.push(event.delta);
31
+ }
32
+ break;
33
+ case 'response.reasoning.delta':
34
+ if (event.delta) {
35
+ this.reasoningParts.push(event.delta);
36
+ }
37
+ break;
38
+ case 'response.tool_call.delta':
39
+ if (event.tool_call_delta && event.index !== undefined) {
40
+ const existing = this.toolCalls.get(event.index) ?? { name: '', arguments: '' };
41
+ if (event.tool_call_delta.id)
42
+ existing.id = event.tool_call_delta.id;
43
+ if (event.tool_call_delta.name)
44
+ existing.name += event.tool_call_delta.name;
45
+ if (event.tool_call_delta.arguments_delta)
46
+ existing.arguments += event.tool_call_delta.arguments_delta;
47
+ this.toolCalls.set(event.index, existing);
48
+ }
49
+ break;
50
+ case 'response.content_block.start':
51
+ case 'response.content_block.delta':
52
+ case 'response.content_block.stop':
53
+ case 'response.message.start':
54
+ case 'response.message.stop':
55
+ break;
56
+ case 'response.usage':
57
+ if (event.usage)
58
+ this.usage = event.usage;
59
+ break;
60
+ case 'response.completed':
61
+ if (event.response)
62
+ return;
63
+ if (event.usage)
64
+ this.usage = event.usage;
65
+ if (event.finish_reason !== undefined)
66
+ this.finishReason = event.finish_reason;
67
+ break;
68
+ case 'response.failed':
69
+ this.finishReason = 'error';
70
+ break;
71
+ }
72
+ }
73
+ /** Assemble all accumulated deltas into a complete {@link HoloResponse}. */
74
+ toResponse() {
75
+ const text = this.textParts.join('');
76
+ const reasoning = this.reasoningParts.join('');
77
+ const hasText = text.length > 0;
78
+ const hasReasoning = reasoning.length > 0;
79
+ const hasToolCalls = this.toolCalls.size > 0;
80
+ const output = [];
81
+ if (hasText || hasReasoning || hasToolCalls) {
82
+ const isStructured = hasReasoning || hasToolCalls;
83
+ if (isStructured) {
84
+ const contentBlocks = [];
85
+ if (hasReasoning) {
86
+ const block = { type: 'reasoning' };
87
+ block.text = reasoning;
88
+ contentBlocks.push(block);
89
+ }
90
+ if (hasText) {
91
+ const block = { type: 'text', text };
92
+ contentBlocks.push(block);
93
+ }
94
+ if (hasToolCalls) {
95
+ const toolCallBlocks = this.buildToolCallBlocks();
96
+ contentBlocks.push(...toolCallBlocks);
97
+ }
98
+ const message = { role: 'assistant', content: contentBlocks };
99
+ if (hasToolCalls) {
100
+ message.tool_calls = this.buildToolCallProjections();
101
+ if (this.invalidToolCalls.length > 0) {
102
+ message.invalid_tool_calls = this.invalidToolCalls;
103
+ }
104
+ }
105
+ output.push(message);
106
+ }
107
+ else {
108
+ output.push({ role: 'assistant', content: text });
109
+ }
110
+ }
111
+ const response = {
112
+ model: this.model ?? '',
113
+ output,
114
+ created: this.created ?? Date.now(),
115
+ finish_reason: this.finishReason,
116
+ usage: this.usage ?? {},
117
+ };
118
+ if (this.id)
119
+ response.id = this.id;
120
+ return response;
121
+ }
122
+ /** Return the concatenated text output accumulated so far. */
123
+ getText() {
124
+ return this.textParts.join('');
125
+ }
126
+ buildToolCallBlocks() {
127
+ const blocks = [];
128
+ for (const [, tc] of [...this.toolCalls.entries()].sort((a, b) => a[0] - b[0])) {
129
+ const parsed = this.parseArguments(tc.arguments);
130
+ const block = {
131
+ type: 'tool_call',
132
+ name: tc.name,
133
+ arguments: parsed ?? {},
134
+ };
135
+ if (tc.id)
136
+ block.id = tc.id;
137
+ if (parsed === null) {
138
+ block.raw_arguments = tc.arguments;
139
+ const invalid = {
140
+ error: 'Failed to parse tool call arguments as JSON',
141
+ raw_arguments: tc.arguments,
142
+ };
143
+ if (tc.id)
144
+ invalid.id = tc.id;
145
+ if (tc.name)
146
+ invalid.name = tc.name;
147
+ this.invalidToolCalls.push(invalid);
148
+ }
149
+ blocks.push(block);
150
+ }
151
+ return blocks;
152
+ }
153
+ buildToolCallProjections() {
154
+ const calls = [];
155
+ for (const [, tc] of [...this.toolCalls.entries()].sort((a, b) => a[0] - b[0])) {
156
+ const parsed = this.parseArguments(tc.arguments);
157
+ const call = {
158
+ type: 'function',
159
+ function: {
160
+ name: tc.name,
161
+ arguments: parsed ?? {},
162
+ },
163
+ };
164
+ if (tc.id)
165
+ call.id = tc.id;
166
+ calls.push(call);
167
+ }
168
+ return calls;
169
+ }
170
+ parseArguments(raw) {
171
+ if (!raw)
172
+ return {};
173
+ try {
174
+ const parsed = JSON.parse(raw);
175
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
176
+ return parsed;
177
+ }
178
+ return {};
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/client/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { HoloInvalidToolCall, HoloMessage, HoloResponse, HoloToolCall } from '@holokai/holo-types/holo';
2
+ /** Extract concatenated text from a single message. Returns `''` if content is not text-based. */
3
+ export declare function getMessageText(message: HoloMessage): string;
4
+ /** Extract concatenated reasoning text from a single message. Returns `''` if no reasoning blocks. */
5
+ export declare function getMessageReasoning(message: HoloMessage): string;
6
+ /**
7
+ * Extract tool calls from a single message.
8
+ * Prefers `message.tool_calls` projection if present and non-empty; otherwise falls back to content blocks.
9
+ */
10
+ export declare function getMessageToolCalls(message: HoloMessage): HoloToolCall[];
11
+ /** Extract invalid tool calls from a single message. */
12
+ export declare function getMessageInvalidToolCalls(message: HoloMessage): HoloInvalidToolCall[];
13
+ /** Aggregation helpers for extracting structured data from a {@link HoloResponse}. */
14
+ export declare const HoloOutput: {
15
+ /** Concatenate all assistant text across output messages. */
16
+ text(response: HoloResponse): string;
17
+ /** Concatenate all reasoning text across output messages. */
18
+ reasoning(response: HoloResponse): string;
19
+ /** Collect all tool calls across output messages in order. */
20
+ toolCalls(response: HoloResponse): HoloToolCall[];
21
+ /** Collect all invalid tool calls across output messages in order. */
22
+ invalidToolCalls(response: HoloResponse): HoloInvalidToolCall[];
23
+ /** Return the last message in the output array, or `undefined` if empty. */
24
+ lastMessage(response: HoloResponse): HoloMessage | undefined;
25
+ };
26
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/client/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG5G,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAM3D;AAED,sGAAsG;AACtG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAMhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,EAAE,CAexE;AAED,wDAAwD;AACxD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,mBAAmB,EAAE,CAEtF;AAED,sFAAsF;AACtF,eAAO,MAAM,UAAU;IACnB,6DAA6D;mBAC9C,YAAY,GAAG,MAAM;IAOpC,6DAA6D;wBACzC,YAAY,GAAG,MAAM;IAOzC,8DAA8D;wBAC1C,YAAY,GAAG,YAAY,EAAE;IAIjD,sEAAsE;+BAC3C,YAAY,GAAG,mBAAmB,EAAE;IAI/D,4EAA4E;0BACtD,YAAY,GAAG,WAAW,GAAG,SAAS;CAG/D,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { isReasoningContent, isTextContent, isToolCallContent } from '../holo';
2
+ /** Extract concatenated text from a single message. Returns `''` if content is not text-based. */
3
+ export function getMessageText(message) {
4
+ if (typeof message.content === 'string')
5
+ return message.content;
6
+ return message.content
7
+ .filter(isTextContent)
8
+ .map(b => b.text)
9
+ .join('');
10
+ }
11
+ /** Extract concatenated reasoning text from a single message. Returns `''` if no reasoning blocks. */
12
+ export function getMessageReasoning(message) {
13
+ if (typeof message.content === 'string')
14
+ return '';
15
+ return message.content
16
+ .filter(isReasoningContent)
17
+ .map(b => b.text ?? '')
18
+ .join('');
19
+ }
20
+ /**
21
+ * Extract tool calls from a single message.
22
+ * Prefers `message.tool_calls` projection if present and non-empty; otherwise falls back to content blocks.
23
+ */
24
+ export function getMessageToolCalls(message) {
25
+ if (message.tool_calls && message.tool_calls.length > 0) {
26
+ return message.tool_calls;
27
+ }
28
+ if (!Array.isArray(message.content))
29
+ return [];
30
+ return message.content
31
+ .filter(isToolCallContent)
32
+ .map(block => {
33
+ const call = {
34
+ type: 'function',
35
+ function: { name: block.name, arguments: block.arguments },
36
+ };
37
+ if (block.id)
38
+ call.id = block.id;
39
+ return call;
40
+ });
41
+ }
42
+ /** Extract invalid tool calls from a single message. */
43
+ export function getMessageInvalidToolCalls(message) {
44
+ return message.invalid_tool_calls ?? [];
45
+ }
46
+ /** Aggregation helpers for extracting structured data from a {@link HoloResponse}. */
47
+ export const HoloOutput = {
48
+ /** Concatenate all assistant text across output messages. */
49
+ text(response) {
50
+ return response.output
51
+ .filter(m => m.role === 'assistant')
52
+ .map(getMessageText)
53
+ .join('');
54
+ },
55
+ /** Concatenate all reasoning text across output messages. */
56
+ reasoning(response) {
57
+ return response.output
58
+ .filter(m => m.role === 'assistant')
59
+ .map(getMessageReasoning)
60
+ .join('');
61
+ },
62
+ /** Collect all tool calls across output messages in order. */
63
+ toolCalls(response) {
64
+ return response.output.flatMap(getMessageToolCalls);
65
+ },
66
+ /** Collect all invalid tool calls across output messages in order. */
67
+ invalidToolCalls(response) {
68
+ return response.output.flatMap(getMessageInvalidToolCalls);
69
+ },
70
+ /** Return the last message in the output array, or `undefined` if empty. */
71
+ lastMessage(response) {
72
+ return response.output[response.output.length - 1];
73
+ },
74
+ };
75
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/client/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAE7E,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,OAAoB;IAC/C,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAChE,OAAO,OAAO,CAAC,OAAO;SACjB,MAAM,CAAC,aAAa,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAChB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACpD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,OAAO,CAAC,OAAO;SACjB,MAAM,CAAC,kBAAkB,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;SACtB,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAoB;IACpD,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,UAAU,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,OAAO,CAAC,OAAO;SACjB,MAAM,CAAC,iBAAiB,CAAC;SACzB,GAAG,CAAC,KAAK,CAAC,EAAE;QACT,MAAM,IAAI,GAAiB;YACvB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAC;SAC3D,CAAC;QACF,IAAI,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACX,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC3D,OAAO,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,6DAA6D;IAC7D,IAAI,CAAC,QAAsB;QACvB,OAAO,QAAQ,CAAC,MAAM;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;aACnC,GAAG,CAAC,cAAc,CAAC;aACnB,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,6DAA6D;IAC7D,SAAS,CAAC,QAAsB;QAC5B,OAAO,QAAQ,CAAC,MAAM;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;aACnC,GAAG,CAAC,mBAAmB,CAAC;aACxB,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,SAAS,CAAC,QAAsB;QAC5B,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxD,CAAC;IAED,sEAAsE;IACtE,gBAAgB,CAAC,QAAsB;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAED,4EAA4E;IAC5E,WAAW,CAAC,QAAsB;QAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;CACJ,CAAC"}
@@ -0,0 +1,92 @@
1
+ import type { HoloContent, HoloMessage, HoloResponse, HoloTool, HoloToolChoice } from '@holokai/holo-types/holo';
2
+ import type { HoloStream } from './stream';
3
+ import type { HoloChatParams } from './types';
4
+ /** Extracted tool call information passed to the user's tool handler. */
5
+ export interface HoloToolCallInfo {
6
+ id: string;
7
+ name: string;
8
+ arguments: Record<string, unknown>;
9
+ }
10
+ /**
11
+ * The result returned by a tool handler, sent back to the model as a tool message.
12
+ * @see {@link HoloContentToolResult} for the content-block representation.
13
+ */
14
+ export interface HoloToolResult {
15
+ tool_call_id: string;
16
+ content: string | HoloContent[];
17
+ is_error?: boolean;
18
+ }
19
+ /**
20
+ * Configuration for {@link HoloToolRunner}.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const runner = client.chat.runner({
25
+ * model: 'gpt-4o',
26
+ * messages: [{ role: 'user', content: 'What is the weather in SF?' }],
27
+ * tools: [weatherTool],
28
+ * toolHandler: async (call) => {
29
+ * const result = await executeWeatherLookup(call.arguments);
30
+ * return { tool_call_id: call.id, content: JSON.stringify(result) };
31
+ * },
32
+ * });
33
+ * const response = await runner.finalResponse();
34
+ * ```
35
+ */
36
+ export interface HoloToolRunnerOptions {
37
+ messages: HoloMessage[];
38
+ tools: HoloTool[];
39
+ /** Async callback invoked for each tool call. Return the result to feed back to the model. */
40
+ toolHandler: (call: HoloToolCallInfo) => Promise<HoloToolResult>;
41
+ model?: string;
42
+ application?: string;
43
+ provider?: string;
44
+ thread_id?: string;
45
+ branch?: string;
46
+ temperature?: number;
47
+ max_tokens?: number;
48
+ tool_choice?: HoloToolChoice;
49
+ /** Maximum number of tool-call round-trips before returning the last response (default: 50). */
50
+ maxIterations?: number;
51
+ }
52
+ type EventHandler<T> = (data: T) => void;
53
+ type RunnerEventMap = {
54
+ 'text.delta': string;
55
+ 'tool_calls': HoloToolCallInfo[];
56
+ 'tool_result': {
57
+ id: string;
58
+ result: HoloToolResult;
59
+ };
60
+ 'iteration': {
61
+ index: number;
62
+ response: HoloResponse;
63
+ };
64
+ 'error': Error;
65
+ };
66
+ type RunnerEventType = keyof RunnerEventMap;
67
+ /**
68
+ * Agentic tool-use loop that streams requests, executes tool calls, and feeds results back until the model stops calling tools.
69
+ *
70
+ * @remarks Create via {@link ChatNamespace.runner} rather than constructing directly.
71
+ *
72
+ * @see {@link HoloToolRunnerOptions} for configuration.
73
+ * @see {@link HoloStream} for the underlying streaming interface.
74
+ */
75
+ export declare class HoloToolRunner {
76
+ private readonly options;
77
+ private readonly streamFn;
78
+ private handlers;
79
+ private abortController;
80
+ private aborted;
81
+ private currentStream;
82
+ constructor(streamFn: (params: HoloChatParams) => Promise<HoloStream>, options: HoloToolRunnerOptions);
83
+ /** Register an event handler for runner lifecycle events. */
84
+ on<K extends RunnerEventType>(event: K, fn: EventHandler<RunnerEventMap[K]>): this;
85
+ /** Abort the runner, cancelling any in-flight stream. */
86
+ abort(): void;
87
+ /** Execute the tool loop and return the final model response (after all tool calls are resolved). */
88
+ finalResponse(): Promise<HoloResponse>;
89
+ private emit;
90
+ }
91
+ export {};
92
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAG5C,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,8FAA8F;IAC9F,WAAW,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEzC,KAAK,cAAc,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;IACtD,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;IACvD,OAAO,EAAE,KAAK,CAAC;CAClB,CAAC;AAEF,KAAK,eAAe,GAAG,MAAM,cAAc,CAAC;AAE5C;;;;;;;GAOG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkD;IAC3E,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAyB;gBAG1C,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,UAAU,CAAC,EACzD,OAAO,EAAE,qBAAqB;IAMlC,6DAA6D;IAC7D,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAOlF,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAMb,qGAAqG;IAC/F,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC;IAiF5C,OAAO,CAAC,IAAI;CAWf"}
@@ -0,0 +1,121 @@
1
+ import { HoloOutput } from './output';
2
+ /**
3
+ * Agentic tool-use loop that streams requests, executes tool calls, and feeds results back until the model stops calling tools.
4
+ *
5
+ * @remarks Create via {@link ChatNamespace.runner} rather than constructing directly.
6
+ *
7
+ * @see {@link HoloToolRunnerOptions} for configuration.
8
+ * @see {@link HoloStream} for the underlying streaming interface.
9
+ */
10
+ export class HoloToolRunner {
11
+ options;
12
+ streamFn;
13
+ handlers = new Map();
14
+ abortController = new AbortController();
15
+ aborted = false;
16
+ currentStream;
17
+ constructor(streamFn, options) {
18
+ this.streamFn = streamFn;
19
+ this.options = options;
20
+ }
21
+ /** Register an event handler for runner lifecycle events. */
22
+ on(event, fn) {
23
+ const handlers = this.handlers.get(event) ?? [];
24
+ handlers.push(fn);
25
+ this.handlers.set(event, handlers);
26
+ return this;
27
+ }
28
+ /** Abort the runner, cancelling any in-flight stream. */
29
+ abort() {
30
+ this.aborted = true;
31
+ this.currentStream?.abort();
32
+ this.abortController.abort();
33
+ }
34
+ /** Execute the tool loop and return the final model response (after all tool calls are resolved). */
35
+ async finalResponse() {
36
+ const maxIterations = this.options.maxIterations ?? 50;
37
+ const messages = [...this.options.messages];
38
+ let lastResponse;
39
+ for (let i = 0; i < maxIterations; i++) {
40
+ if (this.aborted) {
41
+ throw new Error('Runner aborted');
42
+ }
43
+ const params = { messages };
44
+ if (this.options.model !== undefined)
45
+ params.model = this.options.model;
46
+ if (this.options.tools)
47
+ params.tools = this.options.tools;
48
+ if (this.options.tool_choice)
49
+ params.tool_choice = this.options.tool_choice;
50
+ if (this.options.application !== undefined)
51
+ params.application = this.options.application;
52
+ if (this.options.provider !== undefined)
53
+ params.provider = this.options.provider;
54
+ if (this.options.thread_id !== undefined)
55
+ params.thread_id = this.options.thread_id;
56
+ if (this.options.branch !== undefined)
57
+ params.branch = this.options.branch;
58
+ if (this.options.temperature !== undefined)
59
+ params.temperature = this.options.temperature;
60
+ if (this.options.max_tokens !== undefined)
61
+ params.max_tokens = this.options.max_tokens;
62
+ const stream = await this.streamFn(params);
63
+ this.currentStream = stream;
64
+ stream.on('response.output_text.delta', (delta) => {
65
+ this.emit('text.delta', delta);
66
+ });
67
+ const response = await stream.finalResponse();
68
+ this.currentStream = undefined;
69
+ lastResponse = response;
70
+ this.emit('iteration', { index: i, response });
71
+ const hasToolCallsInOutput = response.output?.some((m) => m.tool_calls?.length || (Array.isArray(m.content) && m.content.some((b) => b.type === 'tool_call')));
72
+ if (response.finish_reason !== 'tool_calls' && !hasToolCallsInOutput) {
73
+ return response;
74
+ }
75
+ const rawCalls = HoloOutput.toolCalls(response);
76
+ const toolCalls = rawCalls.map(tc => ({
77
+ id: tc.id ?? '',
78
+ name: tc.function.name,
79
+ arguments: tc.function.arguments,
80
+ }));
81
+ if (toolCalls.length === 0) {
82
+ return response;
83
+ }
84
+ this.emit('tool_calls', toolCalls);
85
+ const assistantMessage = response.output?.[response.output.length - 1];
86
+ if (assistantMessage) {
87
+ messages.push(assistantMessage);
88
+ }
89
+ const results = await Promise.all(toolCalls.map(async (call) => {
90
+ const result = await this.options.toolHandler(call);
91
+ this.emit('tool_result', { id: call.id, result });
92
+ return result;
93
+ }));
94
+ for (const result of results) {
95
+ const toolMessage = {
96
+ role: 'tool',
97
+ content: result.content,
98
+ tool_call_id: result.tool_call_id,
99
+ };
100
+ messages.push(toolMessage);
101
+ }
102
+ }
103
+ if (lastResponse)
104
+ return lastResponse;
105
+ throw new Error('Runner did not produce a response');
106
+ }
107
+ emit(event, data) {
108
+ const handlers = this.handlers.get(event);
109
+ if (!handlers?.length)
110
+ return;
111
+ for (const h of handlers) {
112
+ try {
113
+ h(data);
114
+ }
115
+ catch (e) {
116
+ this.emit('error', e instanceof Error ? e : new Error(String(e)));
117
+ }
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/client/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HoloStreamEvent } from '@holokai/holo-types/holo';
2
+ export declare function parseSSEStream(body: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<HoloStreamEvent>;
3
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/client/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAE9D,wBAAuB,cAAc,CACjC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,GACrB,cAAc,CAAC,eAAe,CAAC,CAmCjC"}
@@ -0,0 +1,72 @@
1
+ export async function* parseSSEStream(body, signal) {
2
+ const reader = body.getReader();
3
+ const decoder = new TextDecoder();
4
+ let buffer = '';
5
+ try {
6
+ while (true) {
7
+ if (signal?.aborted)
8
+ break;
9
+ const { done, value } = await reader.read();
10
+ if (done)
11
+ break;
12
+ buffer += decoder.decode(value, { stream: true });
13
+ buffer = buffer.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
14
+ const events = extractEvents(buffer);
15
+ buffer = events.remaining;
16
+ for (const event of events.parsed) {
17
+ yield event;
18
+ }
19
+ }
20
+ // Flush any remaining bytes from the decoder
21
+ const flushed = decoder.decode();
22
+ if (flushed) {
23
+ buffer += flushed.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
24
+ const events = extractEvents(buffer);
25
+ for (const event of events.parsed) {
26
+ yield event;
27
+ }
28
+ }
29
+ }
30
+ finally {
31
+ reader.releaseLock();
32
+ }
33
+ }
34
+ function extractEvents(buffer) {
35
+ const parsed = [];
36
+ let remaining = buffer;
37
+ while (true) {
38
+ const doubleNewline = remaining.indexOf('\n\n');
39
+ if (doubleNewline === -1)
40
+ break;
41
+ const block = remaining.slice(0, doubleNewline);
42
+ remaining = remaining.slice(doubleNewline + 2);
43
+ const event = parseSSEBlock(block);
44
+ if (event) {
45
+ parsed.push(event);
46
+ }
47
+ }
48
+ return { parsed, remaining };
49
+ }
50
+ function parseSSEBlock(block) {
51
+ const dataLines = [];
52
+ for (const line of block.split('\n')) {
53
+ if (line.startsWith('data: ')) {
54
+ dataLines.push(line.slice(6));
55
+ }
56
+ else if (line.startsWith('data:')) {
57
+ dataLines.push(line.slice(5));
58
+ }
59
+ }
60
+ if (dataLines.length === 0)
61
+ return null;
62
+ const data = dataLines.join('\n');
63
+ if (data === '[DONE]')
64
+ return null;
65
+ try {
66
+ return JSON.parse(data);
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/client/sse.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACjC,IAAgC,EAChC,MAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;YACV,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM;YAE3B,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC;YAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;QAED,6CAA6C;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;YAAS,CAAC;QACP,MAAM,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC;AACL,CAAC;AAOD,SAAS,aAAa,CAAC,MAAc;IACjC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,SAAS,GAAG,MAAM,CAAC;IAEvB,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,aAAa,KAAK,CAAC,CAAC;YAAE,MAAM;QAEhC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAChD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}