@chatcops/core 0.3.2 → 0.5.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 (162) hide show
  1. package/dist/agent/chat.d.ts +13 -0
  2. package/dist/agent/chat.d.ts.map +1 -0
  3. package/dist/agent/chat.js +42 -0
  4. package/dist/agent/chat.js.map +1 -0
  5. package/dist/agent/errors.d.ts +14 -0
  6. package/dist/agent/errors.d.ts.map +1 -0
  7. package/dist/agent/errors.js +24 -0
  8. package/dist/agent/errors.js.map +1 -0
  9. package/dist/agent/index.d.ts +5 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +5 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/run-turn.d.ts +68 -0
  14. package/dist/agent/run-turn.d.ts.map +1 -0
  15. package/dist/agent/run-turn.js +344 -0
  16. package/dist/agent/run-turn.js.map +1 -0
  17. package/dist/agent/tool-registry.d.ts +28 -0
  18. package/dist/agent/tool-registry.d.ts.map +1 -0
  19. package/dist/agent/tool-registry.js +69 -0
  20. package/dist/agent/tool-registry.js.map +1 -0
  21. package/dist/analytics/index.d.ts +1 -0
  22. package/dist/analytics/index.d.ts.map +1 -1
  23. package/dist/analytics/index.js +1 -0
  24. package/dist/analytics/index.js.map +1 -1
  25. package/dist/analytics/sink.d.ts +24 -0
  26. package/dist/analytics/sink.d.ts.map +1 -0
  27. package/dist/analytics/sink.js +106 -0
  28. package/dist/analytics/sink.js.map +1 -0
  29. package/dist/conversation/index.d.ts +1 -0
  30. package/dist/conversation/index.d.ts.map +1 -1
  31. package/dist/conversation/index.js.map +1 -1
  32. package/dist/conversation/manager.d.ts +62 -6
  33. package/dist/conversation/manager.d.ts.map +1 -1
  34. package/dist/conversation/manager.js +109 -30
  35. package/dist/conversation/manager.js.map +1 -1
  36. package/dist/conversation/store.d.ts +6 -5
  37. package/dist/conversation/store.d.ts.map +1 -1
  38. package/dist/conversation/store.js +4 -0
  39. package/dist/conversation/store.js.map +1 -1
  40. package/dist/index.d.ts +18 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +14 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/limits/budget.d.ts +84 -0
  45. package/dist/limits/budget.d.ts.map +1 -0
  46. package/dist/limits/budget.js +114 -0
  47. package/dist/limits/budget.js.map +1 -0
  48. package/dist/limits/rate-limit.d.ts +53 -0
  49. package/dist/limits/rate-limit.d.ts.map +1 -0
  50. package/dist/limits/rate-limit.js +68 -0
  51. package/dist/limits/rate-limit.js.map +1 -0
  52. package/dist/parts.d.ts +9 -0
  53. package/dist/parts.d.ts.map +1 -0
  54. package/dist/parts.js +17 -0
  55. package/dist/parts.js.map +1 -0
  56. package/dist/protocol/ai-sdk.d.ts +27 -0
  57. package/dist/protocol/ai-sdk.d.ts.map +1 -0
  58. package/dist/protocol/ai-sdk.js +127 -0
  59. package/dist/protocol/ai-sdk.js.map +1 -0
  60. package/dist/protocol/errors.d.ts +10 -0
  61. package/dist/protocol/errors.d.ts.map +1 -0
  62. package/dist/protocol/errors.js +42 -0
  63. package/dist/protocol/errors.js.map +1 -0
  64. package/dist/protocol/index.d.ts +9 -0
  65. package/dist/protocol/index.d.ts.map +1 -0
  66. package/dist/protocol/index.js +6 -0
  67. package/dist/protocol/index.js.map +1 -0
  68. package/dist/protocol/legacy.d.ts +18 -0
  69. package/dist/protocol/legacy.d.ts.map +1 -0
  70. package/dist/protocol/legacy.js +41 -0
  71. package/dist/protocol/legacy.js.map +1 -0
  72. package/dist/protocol/sse.d.ts +10 -0
  73. package/dist/protocol/sse.d.ts.map +1 -0
  74. package/dist/protocol/sse.js +15 -0
  75. package/dist/protocol/sse.js.map +1 -0
  76. package/dist/protocol/v1.d.ts +140 -0
  77. package/dist/protocol/v1.d.ts.map +1 -0
  78. package/dist/protocol/v1.js +15 -0
  79. package/dist/protocol/v1.js.map +1 -0
  80. package/dist/providers/base.d.ts +17 -15
  81. package/dist/providers/base.d.ts.map +1 -1
  82. package/dist/providers/base.js +43 -31
  83. package/dist/providers/base.js.map +1 -1
  84. package/dist/providers/claude.d.ts +40 -2
  85. package/dist/providers/claude.d.ts.map +1 -1
  86. package/dist/providers/claude.js +250 -113
  87. package/dist/providers/claude.js.map +1 -1
  88. package/dist/providers/gemini.d.ts +23 -3
  89. package/dist/providers/gemini.d.ts.map +1 -1
  90. package/dist/providers/gemini.js +245 -102
  91. package/dist/providers/gemini.js.map +1 -1
  92. package/dist/providers/history.d.ts +52 -0
  93. package/dist/providers/history.d.ts.map +1 -0
  94. package/dist/providers/history.js +212 -0
  95. package/dist/providers/history.js.map +1 -0
  96. package/dist/providers/index.d.ts +5 -5
  97. package/dist/providers/index.d.ts.map +1 -1
  98. package/dist/providers/index.js +5 -4
  99. package/dist/providers/index.js.map +1 -1
  100. package/dist/providers/openai.d.ts +37 -3
  101. package/dist/providers/openai.d.ts.map +1 -1
  102. package/dist/providers/openai.js +246 -140
  103. package/dist/providers/openai.js.map +1 -1
  104. package/dist/providers/registry.d.ts +7 -0
  105. package/dist/providers/registry.d.ts.map +1 -0
  106. package/dist/providers/registry.js +12 -0
  107. package/dist/providers/registry.js.map +1 -0
  108. package/dist/providers/schema.d.ts +16 -0
  109. package/dist/providers/schema.d.ts.map +1 -0
  110. package/dist/providers/schema.js +80 -0
  111. package/dist/providers/schema.js.map +1 -0
  112. package/dist/providers/tool-execution.d.ts +10 -0
  113. package/dist/providers/tool-execution.d.ts.map +1 -1
  114. package/dist/providers/tool-execution.js +38 -12
  115. package/dist/providers/tool-execution.js.map +1 -1
  116. package/dist/providers/types.d.ts +71 -0
  117. package/dist/providers/types.d.ts.map +1 -0
  118. package/dist/providers/types.js +2 -0
  119. package/dist/providers/types.js.map +1 -0
  120. package/dist/storage/adapt.d.ts +15 -0
  121. package/dist/storage/adapt.d.ts.map +1 -0
  122. package/dist/storage/adapt.js +83 -0
  123. package/dist/storage/adapt.js.map +1 -0
  124. package/dist/storage/errors.d.ts +18 -0
  125. package/dist/storage/errors.d.ts.map +1 -0
  126. package/dist/storage/errors.js +28 -0
  127. package/dist/storage/errors.js.map +1 -0
  128. package/dist/storage/index.d.ts +5 -0
  129. package/dist/storage/index.d.ts.map +1 -0
  130. package/dist/storage/index.js +4 -0
  131. package/dist/storage/index.js.map +1 -0
  132. package/dist/storage/memory.d.ts +24 -0
  133. package/dist/storage/memory.d.ts.map +1 -0
  134. package/dist/storage/memory.js +265 -0
  135. package/dist/storage/memory.js.map +1 -0
  136. package/dist/storage/types.d.ts +118 -0
  137. package/dist/storage/types.d.ts.map +1 -0
  138. package/dist/storage/types.js +2 -0
  139. package/dist/storage/types.js.map +1 -0
  140. package/dist/testing/conformance.d.ts +29 -0
  141. package/dist/testing/conformance.d.ts.map +1 -0
  142. package/dist/testing/conformance.js +335 -0
  143. package/dist/testing/conformance.js.map +1 -0
  144. package/dist/testing/index.d.ts +3 -0
  145. package/dist/testing/index.d.ts.map +1 -0
  146. package/dist/testing/index.js +5 -0
  147. package/dist/testing/index.js.map +1 -0
  148. package/dist/testing/provider.d.ts +45 -0
  149. package/dist/testing/provider.d.ts.map +1 -0
  150. package/dist/testing/provider.js +82 -0
  151. package/dist/testing/provider.js.map +1 -0
  152. package/dist/tools/base.d.ts +14 -4
  153. package/dist/tools/base.d.ts.map +1 -1
  154. package/dist/tools/base.js +4 -2
  155. package/dist/tools/base.js.map +1 -1
  156. package/dist/tools/lead-capture.d.ts +3 -1
  157. package/dist/tools/lead-capture.d.ts.map +1 -1
  158. package/dist/tools/lead-capture.js +6 -1
  159. package/dist/tools/lead-capture.js.map +1 -1
  160. package/dist/types.d.ts +168 -4
  161. package/dist/types.d.ts.map +1 -1
  162. package/package.json +53 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/protocol/errors.ts"],"names":[],"mappings":"AAGA,MAAM,cAAc,GAAkC;IACpD,eAAe,EAAE,GAAG;IACpB,gBAAgB,EAAE,GAAG;IACrB,gBAAgB,EAAE,GAAG;IACrB,aAAa,EAAE,GAAG;IAClB,qBAAqB,EAAE,GAAG;IAC1B,gBAAgB,EAAE,GAAG;IACrB,kBAAkB,EAAE,GAAG;IACvB,iBAAiB,EAAE,GAAG;IACtB,iBAAiB,EAAE,GAAG;IACtB,YAAY,EAAE,GAAG;IACjB,eAAe,EAAE,GAAG;IACpB,UAAU,EAAE,GAAG;IACf,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;IACnB,oBAAoB,EAAE,GAAG;IACzB,OAAO,EAAE,GAAG;CACb,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,IAAmB,EACnB,OAAqD;IAErD,MAAM,KAAK,GAA2B,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC;QACnB,CAAC,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpD,CAAC,CAAC,iBAAiB,CAAC;AACxB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { PROTOCOL_VERSION } from './v1.js';
2
+ export { encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS } from './sse.js';
3
+ export { statusForError, errorBody, describeInvalidRequest } from './errors.js';
4
+ export { toLegacyChunk } from './legacy.js';
5
+ export { aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './ai-sdk.js';
6
+ export type { AiSdkChunk } from './ai-sdk.js';
7
+ export type { LegacyChunk } from './legacy.js';
8
+ export type { WirePart, WirePartType, WireErrorCode, WireFinishReason, WireAgent, WireErrorBody, ChatRequestV1, ClientToolManifest, } from './v1.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { PROTOCOL_VERSION } from './v1.js';
2
+ export { encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS } from './sse.js';
3
+ export { statusForError, errorBody, describeInvalidRequest } from './errors.js';
4
+ export { toLegacyChunk } from './legacy.js';
5
+ export { aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './ai-sdk.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { WirePart } from './v1.js';
2
+ /**
3
+ * One chunk of the stream servers before 0.6 send, and widgets before 0.6
4
+ * read: `data: {"content":"Hi"}`, `data: {"done":true}` and so on.
5
+ */
6
+ export interface LegacyChunk {
7
+ content?: string;
8
+ done?: boolean;
9
+ error?: string;
10
+ /** Seconds. */
11
+ retryAfter?: number;
12
+ leadCaptured?: boolean;
13
+ leadData?: Record<string, unknown>;
14
+ suggestedActions?: string[];
15
+ }
16
+ /** The chunk an old widget expects for this part, or null for parts it has no use for. */
17
+ export declare function toLegacyChunk(part: WirePart): LegacyChunk | null;
18
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/protocol/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAkBhE"}
@@ -0,0 +1,41 @@
1
+ /** The chunk an old widget expects for this part, or null for parts it has no use for. */
2
+ export function toLegacyChunk(part) {
3
+ switch (part.type) {
4
+ case 'text-delta':
5
+ return { content: part.delta };
6
+ case 'lead-captured':
7
+ return { leadCaptured: true, leadData: part.lead };
8
+ case 'suggestions':
9
+ return { suggestedActions: part.items };
10
+ case 'error':
11
+ return legacyError(part);
12
+ case 'finish':
13
+ // After an error the error chunk already went out, and after an abort
14
+ // nobody is listening.
15
+ return part.reason === 'error' || part.reason === 'aborted' ? null : { done: true };
16
+ default:
17
+ // Parts old widgets have no use for, and parts added after this was written.
18
+ return null;
19
+ }
20
+ }
21
+ function legacyError(part) {
22
+ switch (part.code) {
23
+ case 'rate_limited': {
24
+ const { retryAfterMs } = part;
25
+ if (retryAfterMs === undefined || !Number.isFinite(retryAfterMs) || retryAfterMs <= 0) {
26
+ return { error: 'rate_limit' };
27
+ }
28
+ return { error: 'rate_limit', retryAfter: Math.ceil(retryAfterMs / 1000) };
29
+ }
30
+ case 'timeout':
31
+ return { error: 'timeout' };
32
+ case 'internal_error':
33
+ return { error: 'internal_error' };
34
+ case 'invalid_request':
35
+ // What 0.5 servers send for a request they can't read.
36
+ return { error: 'Invalid request' };
37
+ default:
38
+ return { error: 'provider_error' };
39
+ }
40
+ }
41
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/protocol/legacy.ts"],"names":[],"mappings":"AAiBA,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,KAAK,eAAe;YAClB,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACrD,KAAK,aAAa;YAChB,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1C,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,QAAQ;YACX,sEAAsE;YACtE,uBAAuB;YACvB,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtF;YACE,6EAA6E;YAC7E,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAA0C;IAC7D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;YAC9B,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YACjC,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC9B,KAAK,gBAAgB;YACnB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACrC,KAAK,iBAAiB;YACpB,uDAAuD;YACvD,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACtC;YACE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { WirePart } from './v1.js';
2
+ /** One event: `data: <json>` and a blank line. */
3
+ export declare function encodeSSE(part: WirePart | Record<string, unknown>): string;
4
+ /** A comment line that keeps the connection busy while nothing else is sent. */
5
+ export declare const SSE_PING = ": ping\n\n";
6
+ /** Ends the stream. */
7
+ export declare const SSE_DONE = "data: [DONE]\n\n";
8
+ /** Standard HTTP headers for an SSE response. */
9
+ export declare const SSE_HEADERS: Readonly<Record<string, string>>;
10
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/protocol/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE1E;AAED,gFAAgF;AAChF,eAAO,MAAM,QAAQ,eAAe,CAAC;AAErC,uBAAuB;AACvB,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAE3C,iDAAiD;AACjD,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIvD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** One event: `data: <json>` and a blank line. */
2
+ export function encodeSSE(part) {
3
+ return `data: ${JSON.stringify(part)}\n\n`;
4
+ }
5
+ /** A comment line that keeps the connection busy while nothing else is sent. */
6
+ export const SSE_PING = ': ping\n\n';
7
+ /** Ends the stream. */
8
+ export const SSE_DONE = 'data: [DONE]\n\n';
9
+ /** Standard HTTP headers for an SSE response. */
10
+ export const SSE_HEADERS = Object.freeze({
11
+ 'Content-Type': 'text/event-stream; charset=utf-8',
12
+ 'Cache-Control': 'no-cache, no-transform',
13
+ 'X-Accel-Buffering': 'no',
14
+ });
15
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/protocol/sse.ts"],"names":[],"mappings":"AAEA,kDAAkD;AAClD,MAAM,UAAU,SAAS,CAAC,IAAwC;IAChE,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7C,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAErC,uBAAuB;AACvB,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAE3C,iDAAiD;AACjD,MAAM,CAAC,MAAM,WAAW,GAAqC,MAAM,CAAC,MAAM,CAAC;IACzE,cAAc,EAAE,kCAAkC;IAClD,eAAe,EAAE,wBAAwB;IACzC,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAC"}
@@ -0,0 +1,140 @@
1
+ import type { JSONSchema, PageContext, ToolExecutor } from '../types.js';
2
+ /**
3
+ * Version 1 of the stream between the widget and the server.
4
+ *
5
+ * The widget asks for it with `"protocol": 1` in the request body. A body
6
+ * field rather than a header, because servers before 0.6 only allow
7
+ * `Content-Type` in their CORS preflight. A server that doesn't know the field
8
+ * ignores it and answers in the old format, and the widget tells the two apart
9
+ * by the first part: v1 always starts with `start`.
10
+ *
11
+ * Every part is one SSE line, `data: <json>`. Clients ignore part types they
12
+ * don't know, so adding a part is not a version change; changing or removing
13
+ * one is.
14
+ */
15
+ export declare const PROTOCOL_VERSION: 1;
16
+ export type WireErrorCode = 'invalid_request' | 'session_required' | 'token_expired' | 'conversation_mismatch' | 'turnstile_failed' | 'origin_not_allowed' | 'conversation_busy' | 'payload_too_large' | 'rate_limited' | 'provider_unavailable' | 'provider_error' | 'tool_error' | 'budget_exceeded' | 'content_filtered' | 'internal_error' | 'timeout';
17
+ export type WireFinishReason = 'stop' | 'length' | 'client-tool-calls' | 'approval-required' | 'handoff' | 'error' | 'aborted';
18
+ export interface WireAgent {
19
+ name: string;
20
+ avatarUrl?: string;
21
+ }
22
+ export type WirePart = {
23
+ type: 'start';
24
+ protocol: typeof PROTOCOL_VERSION;
25
+ conversationId: string;
26
+ /** The id the server saves the reply under. */
27
+ messageId: string;
28
+ resumed?: boolean;
29
+ /** Optional server features the widget can turn on. */
30
+ capabilities?: {
31
+ session?: boolean;
32
+ };
33
+ } | {
34
+ type: 'text-start';
35
+ id: string;
36
+ } | {
37
+ type: 'text-delta';
38
+ id: string;
39
+ delta: string;
40
+ } | {
41
+ type: 'text-end';
42
+ id: string;
43
+ } | {
44
+ type: 'source';
45
+ sourceId: string;
46
+ url: string;
47
+ title?: string;
48
+ snippet?: string;
49
+ } | {
50
+ type: 'tool-call';
51
+ toolCallId: string;
52
+ toolName: string;
53
+ input: unknown;
54
+ executor: ToolExecutor;
55
+ needsApproval?: boolean;
56
+ title?: string;
57
+ } | {
58
+ type: 'tool-result';
59
+ toolCallId: string;
60
+ output?: unknown;
61
+ error?: string;
62
+ } | {
63
+ type: 'lead-captured';
64
+ lead: Record<string, unknown>;
65
+ } | {
66
+ type: 'handoff';
67
+ status: 'requested' | 'queued' | 'connected' | 'ended';
68
+ agent?: WireAgent;
69
+ pollAfterMs?: number;
70
+ } | {
71
+ type: 'agent-message';
72
+ messageId: string;
73
+ text: string;
74
+ agent: WireAgent;
75
+ timestamp: number;
76
+ } | {
77
+ type: 'suggestions';
78
+ items: string[];
79
+ } | {
80
+ type: 'error';
81
+ code: WireErrorCode;
82
+ message?: string;
83
+ retryable: boolean;
84
+ retryAfterMs?: number;
85
+ scope?: 'conversation' | 'session' | 'ip' | 'global';
86
+ } | {
87
+ type: 'finish';
88
+ reason: WireFinishReason;
89
+ /** Only sent when the server is configured to expose usage. */
90
+ usage?: {
91
+ inputTokens: number;
92
+ outputTokens: number;
93
+ };
94
+ pendingToolCalls?: string[];
95
+ resumeToken?: string;
96
+ };
97
+ export type WirePartType = WirePart['type'];
98
+ /** A tool the page offers, run in the browser (page tools). */
99
+ export interface ClientToolManifest {
100
+ name: string;
101
+ description: string;
102
+ inputSchema: JSONSchema;
103
+ needsApproval?: boolean;
104
+ title?: string;
105
+ }
106
+ export interface ChatRequestV1 {
107
+ protocol: typeof PROTOCOL_VERSION;
108
+ conversationId: string;
109
+ /** Absent when the request only sends tool results or approvals. */
110
+ message?: string;
111
+ messageId?: string;
112
+ /** `true` is the 0.5 form and regenerates the latest reply. */
113
+ regenerate?: boolean | {
114
+ assistantMessageId: string;
115
+ };
116
+ toolResults?: Array<{
117
+ toolCallId: string;
118
+ output?: unknown;
119
+ error?: string;
120
+ }>;
121
+ toolApprovals?: Array<{
122
+ toolCallId: string;
123
+ approved: boolean;
124
+ reason?: string;
125
+ }>;
126
+ resumeToken?: string;
127
+ clientTools?: ClientToolManifest[];
128
+ pageContext?: PageContext;
129
+ locale?: string;
130
+ userData?: Record<string, string>;
131
+ }
132
+ /** The JSON body of an error answered before the stream starts. */
133
+ export interface WireErrorBody {
134
+ error: {
135
+ code: WireErrorCode;
136
+ message?: string;
137
+ retryAfterMs?: number;
138
+ };
139
+ }
140
+ //# sourceMappingURL=v1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.d.ts","sourceRoot":"","sources":["../../src/protocol/v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Version 1 of the stream between the widget and the server.
3
+ *
4
+ * The widget asks for it with `"protocol": 1` in the request body. A body
5
+ * field rather than a header, because servers before 0.6 only allow
6
+ * `Content-Type` in their CORS preflight. A server that doesn't know the field
7
+ * ignores it and answers in the old format, and the widget tells the two apart
8
+ * by the first part: v1 always starts with `start`.
9
+ *
10
+ * Every part is one SSE line, `data: <json>`. Clients ignore part types they
11
+ * don't know, so adding a part is not a version change; changing or removing
12
+ * one is.
13
+ */
14
+ export const PROTOCOL_VERSION = 1;
15
+ //# sourceMappingURL=v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.js","sourceRoot":"","sources":["../../src/protocol/v1.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC"}
@@ -1,22 +1,28 @@
1
- import { type Tool } from '@google/generative-ai';
2
- import type { ChatMessage, ProviderChatParams, ProviderConfig, ToolDefinition } from '../types.js';
3
- export interface AIProvider {
4
- name: string;
5
- chat(params: ProviderChatParams): AsyncGenerator<string>;
6
- chatSync(params: ProviderChatParams): Promise<string>;
7
- }
1
+ import type { Tool as GeminiTool } from '@google/genai';
2
+ import type { ChatMessage, ProviderConfig, ToolDefinition } from '../types.js';
3
+ import type { AIProvider } from './types.js';
4
+ export type { AIProvider } from './types.js';
5
+ /** Output token limit used when neither the server config nor the request sets one. */
6
+ export declare const DEFAULT_MAX_TOKENS = 4096;
7
+ /**
8
+ * True for a provider object, false for a provider config. A config never
9
+ * has functions, so an object with a `step` or `chat` function is a provider.
10
+ */
11
+ export declare function isAIProvider(value: unknown): value is AIProvider;
8
12
  export declare function createProvider(config: ProviderConfig): Promise<AIProvider>;
9
13
  export declare function toProviderMessages(messages: ChatMessage[]): Array<{
10
14
  role: string;
11
15
  content: string;
12
16
  }>;
17
+ export { normalizeHistory, normalizeTurns, trimHistory, estimateTokens, type NormalizedMessage, type NormalizedTurn, type TurnPart, } from './history.js';
18
+ /** Logs a configuration warning once per process. */
19
+ export declare function warnOnce(key: string, message: string): void;
13
20
  export declare function toClaudeTools(tools: ToolDefinition[]): {
14
21
  name: string;
15
22
  description: string;
16
23
  input_schema: {
17
24
  type: "object";
18
- properties: Record<string, import("../types.js").ToolParameter>;
19
- required: string[];
25
+ [key: string]: unknown;
20
26
  };
21
27
  }[];
22
28
  export declare function toOpenAITools(tools: ToolDefinition[]): {
@@ -24,12 +30,8 @@ export declare function toOpenAITools(tools: ToolDefinition[]): {
24
30
  function: {
25
31
  name: string;
26
32
  description: string;
27
- parameters: {
28
- type: "object";
29
- properties: Record<string, import("../types.js").ToolParameter>;
30
- required: string[];
31
- };
33
+ parameters: import("../types.js").JSONSchema;
32
34
  };
33
35
  }[];
34
- export declare function toGeminiTools(tools: ToolDefinition[]): Tool[];
36
+ export declare function toGeminiTools(tools: ToolDefinition[]): GeminiTool[];
35
37
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAA4B,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACvD;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBhF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;;;;;;IAUpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;;;;;;;;;IAapD;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,CAkB7D"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,uFAAuF;AACvF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAIhE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAwBhF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAIpG;AAED,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC;AAItB,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;kBAIb;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;IAEjF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE;;;;;;;IAapD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAQnE"}
@@ -1,5 +1,21 @@
1
- import { SchemaType } from '@google/generative-ai';
1
+ import { toolInputSchema } from './schema.js';
2
+ import { getProviderFactory } from './registry.js';
3
+ /** Output token limit used when neither the server config nor the request sets one. */
4
+ export const DEFAULT_MAX_TOKENS = 4096;
5
+ /**
6
+ * True for a provider object, false for a provider config. A config never
7
+ * has functions, so an object with a `step` or `chat` function is a provider.
8
+ */
9
+ export function isAIProvider(value) {
10
+ if (typeof value !== 'object' || value === null)
11
+ return false;
12
+ const candidate = value;
13
+ return typeof candidate.step === 'function' || typeof candidate.chat === 'function';
14
+ }
2
15
  export async function createProvider(config) {
16
+ const factory = getProviderFactory(config.type);
17
+ if (factory)
18
+ return factory(config);
3
19
  switch (config.type) {
4
20
  case 'claude': {
5
21
  const { ClaudeProvider } = await import('./claude.js');
@@ -9,6 +25,10 @@ export async function createProvider(config) {
9
25
  const { OpenAIProvider } = await import('./openai.js');
10
26
  return new OpenAIProvider(config);
11
27
  }
28
+ case 'openai-compatible': {
29
+ const { OpenAIProvider } = await import('./openai.js');
30
+ return new OpenAIProvider(config, { compatible: true });
31
+ }
12
32
  case 'gemini': {
13
33
  const { GeminiProvider } = await import('./gemini.js');
14
34
  return new GeminiProvider(config);
@@ -22,50 +42,42 @@ export function toProviderMessages(messages) {
22
42
  .filter((m) => m.role !== 'system')
23
43
  .map((m) => ({ role: m.role, content: m.content }));
24
44
  }
45
+ export { normalizeHistory, normalizeTurns, trimHistory, estimateTokens, } from './history.js';
46
+ const warned = new Set();
47
+ /** Logs a configuration warning once per process. */
48
+ export function warnOnce(key, message) {
49
+ if (warned.has(key))
50
+ return;
51
+ warned.add(key);
52
+ console.warn(`[chatcops] ${message}`);
53
+ }
25
54
  export function toClaudeTools(tools) {
26
55
  return tools.map((t) => ({
27
56
  name: t.name,
28
57
  description: t.description,
29
- input_schema: {
30
- type: 'object',
31
- properties: t.parameters,
32
- required: t.required,
33
- },
58
+ input_schema: toolInputSchema(t),
34
59
  }));
35
60
  }
36
61
  export function toOpenAITools(tools) {
37
- return tools.map((t) => ({
38
- type: 'function',
39
- function: {
40
- name: t.name,
41
- description: t.description,
42
- parameters: {
43
- type: 'object',
44
- properties: t.parameters,
45
- required: t.required,
62
+ return tools.map((t) => {
63
+ const schema = toolInputSchema(t);
64
+ return {
65
+ type: 'function',
66
+ function: {
67
+ name: t.name,
68
+ description: t.description,
69
+ // OpenAI rejects an object schema without `properties`.
70
+ parameters: 'properties' in schema ? schema : { ...schema, properties: {} },
46
71
  },
47
- },
48
- }));
72
+ };
73
+ });
49
74
  }
50
- const SCHEMA_TYPE_MAP = {
51
- string: SchemaType.STRING,
52
- number: SchemaType.NUMBER,
53
- boolean: SchemaType.BOOLEAN,
54
- };
55
75
  export function toGeminiTools(tools) {
56
76
  return [{
57
77
  functionDeclarations: tools.map((t) => ({
58
78
  name: t.name,
59
79
  description: t.description,
60
- parameters: {
61
- type: SchemaType.OBJECT,
62
- properties: Object.fromEntries(Object.entries(t.parameters).map(([k, v]) => [k, {
63
- type: SCHEMA_TYPE_MAP[v.type] ?? SchemaType.STRING,
64
- description: v.description,
65
- ...(v.enum ? { enum: v.enum } : {}),
66
- }])),
67
- required: t.required,
68
- },
80
+ parametersJsonSchema: toolInputSchema(t),
69
81
  })),
70
82
  }];
71
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,49 @@
1
- import type { ProviderConfig, ProviderChatParams } from '../types.js';
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import type { ChatMessage, ProviderChatParams, ProviderConfig } from '../types.js';
2
3
  import type { AIProvider } from './base.js';
4
+ import type { ProviderEvent, ProviderStepParams } from './types.js';
5
+ interface ClaudeVersion {
6
+ family: string;
7
+ major: number;
8
+ minor: number;
9
+ }
10
+ /** Reads family and version from ids like `claude-haiku-5-5` or `claude-haiku-4-5-20251001`. */
11
+ export declare function parseClaudeModel(model: string): ClaudeVersion | null;
12
+ /** `output_config.effort` exists on Opus 4.5 and on every model from 4.6 on. */
13
+ export declare function claudeSupportsEffort(model: string): boolean;
14
+ /** Fable, Mythos, every 5.x model and Opus 4.7+ reject non-default `temperature`. */
15
+ export declare function claudeRejectsTemperature(model: string): boolean;
16
+ type MessageParam = Anthropic.Messages.MessageParam;
17
+ /**
18
+ * Stored history as Claude messages. An assistant message with tool calls
19
+ * becomes the assistant turn with its `tool_use` blocks, then a user turn
20
+ * with the results, and so on for each step. Thinking blocks go back with
21
+ * their signatures, as Claude requires within a tool loop.
22
+ */
23
+ export declare function toClaudeStepMessages(messages: ChatMessage[]): MessageParam[];
3
24
  export declare class ClaudeProvider implements AIProvider {
4
25
  name: string;
5
26
  private client;
6
- private model;
27
+ readonly model: string;
28
+ private effort;
29
+ private promptCaching;
7
30
  constructor(config: ProviderConfig);
31
+ /**
32
+ * The system prompt, with a cache breakpoint after it. Claude caches tools
33
+ * and system together, in that order, so both are read from the cache on
34
+ * later requests. Per-request context goes after the breakpoint.
35
+ */
36
+ private system;
37
+ private request;
38
+ /** One model request: streams text and reasoning, then reports tool calls and why it stopped. */
39
+ step(params: ProviderStepParams): AsyncGenerator<ProviderEvent>;
40
+ /**
41
+ * A turn with tools run through `params.toolExecutor`, as text.
42
+ * @deprecated Use `runTurn()`, which also returns the reply's parts, status and usage.
43
+ */
8
44
  chat(params: ProviderChatParams): AsyncGenerator<string>;
45
+ /** @deprecated Use `runTurn()`. */
9
46
  chatSync(params: ProviderChatParams): Promise<string>;
10
47
  }
48
+ export {};
11
49
  //# sourceMappingURL=claude.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAyC5C,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,cAAc;IAK3B,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IA2DzD,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAqD5D"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/providers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EACV,WAAW,EAEX,kBAAkB,EAClB,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,KAAK,EAAgB,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKlF,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIpE;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO3D;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAM/D;AAED,KAAK,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AAgDpD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE,CAyC5E;AA0DD,qBAAa,cAAe,YAAW,UAAU;IAC/C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAY;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,aAAa,CAAU;gBAEnB,MAAM,EAAE,cAAc;IAiBlC;;;;OAIG;IACH,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,OAAO;IAwBf,iGAAiG;IAC1F,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,aAAa,CAAC;IAmCtE;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC;IAIxD,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;CAGtD"}