@kernel.chat/kbot 1.3.1 → 2.3.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 (176) hide show
  1. package/README.md +94 -0
  2. package/dist/agent.d.ts +9 -0
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +576 -119
  5. package/dist/agent.js.map +1 -1
  6. package/dist/auth.d.ts +20 -35
  7. package/dist/auth.d.ts.map +1 -1
  8. package/dist/auth.js +224 -66
  9. package/dist/auth.js.map +1 -1
  10. package/dist/auth.test.d.ts +2 -0
  11. package/dist/auth.test.d.ts.map +1 -0
  12. package/dist/auth.test.js +89 -0
  13. package/dist/auth.test.js.map +1 -0
  14. package/dist/build-targets.d.ts +37 -0
  15. package/dist/build-targets.d.ts.map +1 -0
  16. package/dist/build-targets.js +507 -0
  17. package/dist/build-targets.js.map +1 -0
  18. package/dist/cli.js +1210 -130
  19. package/dist/cli.js.map +1 -1
  20. package/dist/context.d.ts +2 -0
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +72 -22
  23. package/dist/context.js.map +1 -1
  24. package/dist/hooks.d.ts +27 -0
  25. package/dist/hooks.d.ts.map +1 -0
  26. package/dist/hooks.js +145 -0
  27. package/dist/hooks.js.map +1 -0
  28. package/dist/ide/acp-server.d.ts +6 -0
  29. package/dist/ide/acp-server.d.ts.map +1 -0
  30. package/dist/ide/acp-server.js +319 -0
  31. package/dist/ide/acp-server.js.map +1 -0
  32. package/dist/ide/bridge.d.ts +128 -0
  33. package/dist/ide/bridge.d.ts.map +1 -0
  34. package/dist/ide/bridge.js +185 -0
  35. package/dist/ide/bridge.js.map +1 -0
  36. package/dist/ide/index.d.ts +5 -0
  37. package/dist/ide/index.d.ts.map +1 -0
  38. package/dist/ide/index.js +11 -0
  39. package/dist/ide/index.js.map +1 -0
  40. package/dist/ide/lsp-bridge.d.ts +27 -0
  41. package/dist/ide/lsp-bridge.d.ts.map +1 -0
  42. package/dist/ide/lsp-bridge.js +267 -0
  43. package/dist/ide/lsp-bridge.js.map +1 -0
  44. package/dist/ide/mcp-server.d.ts +7 -0
  45. package/dist/ide/mcp-server.d.ts.map +1 -0
  46. package/dist/ide/mcp-server.js +451 -0
  47. package/dist/ide/mcp-server.js.map +1 -0
  48. package/dist/learning.d.ts +179 -0
  49. package/dist/learning.d.ts.map +1 -0
  50. package/dist/learning.js +829 -0
  51. package/dist/learning.js.map +1 -0
  52. package/dist/learning.test.d.ts +2 -0
  53. package/dist/learning.test.d.ts.map +1 -0
  54. package/dist/learning.test.js +115 -0
  55. package/dist/learning.test.js.map +1 -0
  56. package/dist/matrix.d.ts +49 -0
  57. package/dist/matrix.d.ts.map +1 -0
  58. package/dist/matrix.js +302 -0
  59. package/dist/matrix.js.map +1 -0
  60. package/dist/memory.d.ts +11 -0
  61. package/dist/memory.d.ts.map +1 -1
  62. package/dist/memory.js +54 -2
  63. package/dist/memory.js.map +1 -1
  64. package/dist/multimodal.d.ts +57 -0
  65. package/dist/multimodal.d.ts.map +1 -0
  66. package/dist/multimodal.js +206 -0
  67. package/dist/multimodal.js.map +1 -0
  68. package/dist/permissions.d.ts +21 -0
  69. package/dist/permissions.d.ts.map +1 -0
  70. package/dist/permissions.js +122 -0
  71. package/dist/permissions.js.map +1 -0
  72. package/dist/planner.d.ts +54 -0
  73. package/dist/planner.d.ts.map +1 -0
  74. package/dist/planner.js +298 -0
  75. package/dist/planner.js.map +1 -0
  76. package/dist/plugins.d.ts +30 -0
  77. package/dist/plugins.d.ts.map +1 -0
  78. package/dist/plugins.js +135 -0
  79. package/dist/plugins.js.map +1 -0
  80. package/dist/sessions.d.ts +38 -0
  81. package/dist/sessions.d.ts.map +1 -0
  82. package/dist/sessions.js +177 -0
  83. package/dist/sessions.js.map +1 -0
  84. package/dist/streaming.d.ts +88 -0
  85. package/dist/streaming.d.ts.map +1 -0
  86. package/dist/streaming.js +317 -0
  87. package/dist/streaming.js.map +1 -0
  88. package/dist/tools/background.d.ts +2 -0
  89. package/dist/tools/background.d.ts.map +1 -0
  90. package/dist/tools/background.js +163 -0
  91. package/dist/tools/background.js.map +1 -0
  92. package/dist/tools/bash.d.ts.map +1 -1
  93. package/dist/tools/bash.js +26 -1
  94. package/dist/tools/bash.js.map +1 -1
  95. package/dist/tools/browser.js +7 -7
  96. package/dist/tools/browser.js.map +1 -1
  97. package/dist/tools/build-matrix.d.ts +2 -0
  98. package/dist/tools/build-matrix.d.ts.map +1 -0
  99. package/dist/tools/build-matrix.js +463 -0
  100. package/dist/tools/build-matrix.js.map +1 -0
  101. package/dist/tools/computer.js +5 -5
  102. package/dist/tools/computer.js.map +1 -1
  103. package/dist/tools/fetch.d.ts +2 -0
  104. package/dist/tools/fetch.d.ts.map +1 -0
  105. package/dist/tools/fetch.js +106 -0
  106. package/dist/tools/fetch.js.map +1 -0
  107. package/dist/tools/files.d.ts.map +1 -1
  108. package/dist/tools/files.js +112 -6
  109. package/dist/tools/files.js.map +1 -1
  110. package/dist/tools/git.js +3 -3
  111. package/dist/tools/git.js.map +1 -1
  112. package/dist/tools/github.d.ts +2 -0
  113. package/dist/tools/github.d.ts.map +1 -0
  114. package/dist/tools/github.js +196 -0
  115. package/dist/tools/github.js.map +1 -0
  116. package/dist/tools/index.d.ts +29 -5
  117. package/dist/tools/index.d.ts.map +1 -1
  118. package/dist/tools/index.js +136 -20
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tools/index.test.d.ts +2 -0
  121. package/dist/tools/index.test.d.ts.map +1 -0
  122. package/dist/tools/index.test.js +162 -0
  123. package/dist/tools/index.test.js.map +1 -0
  124. package/dist/tools/matrix.d.ts +2 -0
  125. package/dist/tools/matrix.d.ts.map +1 -0
  126. package/dist/tools/matrix.js +79 -0
  127. package/dist/tools/matrix.js.map +1 -0
  128. package/dist/tools/mcp-client.d.ts +2 -0
  129. package/dist/tools/mcp-client.d.ts.map +1 -0
  130. package/dist/tools/mcp-client.js +295 -0
  131. package/dist/tools/mcp-client.js.map +1 -0
  132. package/dist/tools/notebook.d.ts +2 -0
  133. package/dist/tools/notebook.d.ts.map +1 -0
  134. package/dist/tools/notebook.js +207 -0
  135. package/dist/tools/notebook.js.map +1 -0
  136. package/dist/tools/openclaw.d.ts +2 -0
  137. package/dist/tools/openclaw.d.ts.map +1 -0
  138. package/dist/tools/openclaw.js +187 -0
  139. package/dist/tools/openclaw.js.map +1 -0
  140. package/dist/tools/parallel.d.ts +2 -0
  141. package/dist/tools/parallel.d.ts.map +1 -0
  142. package/dist/tools/parallel.js +60 -0
  143. package/dist/tools/parallel.js.map +1 -0
  144. package/dist/tools/sandbox.d.ts +2 -0
  145. package/dist/tools/sandbox.d.ts.map +1 -0
  146. package/dist/tools/sandbox.js +352 -0
  147. package/dist/tools/sandbox.js.map +1 -0
  148. package/dist/tools/search.d.ts.map +1 -1
  149. package/dist/tools/search.js +135 -28
  150. package/dist/tools/search.js.map +1 -1
  151. package/dist/tools/subagent.d.ts +4 -0
  152. package/dist/tools/subagent.d.ts.map +1 -0
  153. package/dist/tools/subagent.js +260 -0
  154. package/dist/tools/subagent.js.map +1 -0
  155. package/dist/tools/tasks.d.ts +14 -0
  156. package/dist/tools/tasks.d.ts.map +1 -0
  157. package/dist/tools/tasks.js +210 -0
  158. package/dist/tools/tasks.js.map +1 -0
  159. package/dist/tools/worktree.d.ts +2 -0
  160. package/dist/tools/worktree.d.ts.map +1 -0
  161. package/dist/tools/worktree.js +223 -0
  162. package/dist/tools/worktree.js.map +1 -0
  163. package/dist/tui.d.ts +73 -0
  164. package/dist/tui.d.ts.map +1 -0
  165. package/dist/tui.js +257 -0
  166. package/dist/tui.js.map +1 -0
  167. package/dist/ui.d.ts +11 -19
  168. package/dist/ui.d.ts.map +1 -1
  169. package/dist/ui.js +143 -171
  170. package/dist/ui.js.map +1 -1
  171. package/dist/updater.d.ts +3 -0
  172. package/dist/updater.d.ts.map +1 -0
  173. package/dist/updater.js +70 -0
  174. package/dist/updater.js.map +1 -0
  175. package/install.sh +5 -7
  176. package/package.json +8 -4
package/dist/memory.js CHANGED
@@ -69,7 +69,59 @@ export function clearHistory() {
69
69
  }
70
70
  /** Get the previous_messages array for the API */
71
71
  export function getPreviousMessages() {
72
- // Send last 6 turns to keep token usage efficient
73
- return sessionHistory.slice(-6).map(t => ({ role: t.role, content: t.content }));
72
+ // Send last 16 turns (8 exchanges) — enough context to maintain coherent conversation
73
+ return sessionHistory.slice(-16).map(t => ({ role: t.role, content: t.content }));
74
+ }
75
+ /** Compact/compress conversation history into a summary.
76
+ * Keeps the last 4 turns verbatim, summarizes everything before.
77
+ * This extends session length without losing context.
78
+ */
79
+ export function compactHistory() {
80
+ const before = sessionHistory.length;
81
+ if (before <= 4) {
82
+ return { before, after: before, summary: 'History too short to compact.' };
83
+ }
84
+ // Keep last 4 turns verbatim
85
+ const keepVerbatim = sessionHistory.slice(-4);
86
+ const toSummarize = sessionHistory.slice(0, -4);
87
+ // Build a summary of the older turns
88
+ const summaryParts = ['Conversation summary (compacted):'];
89
+ const userMessages = [];
90
+ const assistantTopics = [];
91
+ for (const turn of toSummarize) {
92
+ if (turn.role === 'user') {
93
+ userMessages.push(turn.content.slice(0, 100));
94
+ }
95
+ else {
96
+ // Extract first line or first 100 chars as topic
97
+ const firstLine = turn.content.split('\n')[0].slice(0, 100);
98
+ assistantTopics.push(firstLine);
99
+ }
100
+ }
101
+ if (userMessages.length > 0) {
102
+ summaryParts.push(`User asked about: ${userMessages.join('; ')}`);
103
+ }
104
+ if (assistantTopics.length > 0) {
105
+ summaryParts.push(`Topics covered: ${assistantTopics.join('; ')}`);
106
+ }
107
+ const summaryText = summaryParts.join('\n');
108
+ // Replace history with summary + recent turns
109
+ sessionHistory = [
110
+ { role: 'assistant', content: summaryText },
111
+ ...keepVerbatim,
112
+ ];
113
+ return {
114
+ before,
115
+ after: sessionHistory.length,
116
+ summary: `Compacted ${before} turns → ${sessionHistory.length} (${before - sessionHistory.length} turns summarized)`,
117
+ };
118
+ }
119
+ /** Restore session history from a saved session */
120
+ export function restoreHistory(turns) {
121
+ sessionHistory = [...turns];
122
+ // Keep manageable size
123
+ if (sessionHistory.length > 20) {
124
+ sessionHistory = sessionHistory.slice(-20);
125
+ }
74
126
  }
75
127
  //# sourceMappingURL=memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /** Content block types for multimodal messages */
2
+ export interface TextBlock {
3
+ type: 'text';
4
+ text: string;
5
+ }
6
+ export interface ImageBlock {
7
+ type: 'image';
8
+ source: {
9
+ type: 'base64';
10
+ media_type: string;
11
+ data: string;
12
+ };
13
+ }
14
+ export type ContentBlock = TextBlock | ImageBlock;
15
+ /** Result of parsing a message for multimodal content */
16
+ export interface ParsedMessage {
17
+ /** Clean text message with image paths removed */
18
+ text: string;
19
+ /** Content blocks for the API (text + images interleaved) */
20
+ blocks: ContentBlock[];
21
+ /** Number of images found */
22
+ imageCount: number;
23
+ /** Whether the message has multimodal content */
24
+ isMultimodal: boolean;
25
+ }
26
+ /** Check if a file path looks like an image */
27
+ export declare function isImagePath(path: string): boolean;
28
+ /** Encode an image file to a base64 content block */
29
+ export declare function encodeImage(filePath: string): ImageBlock | null;
30
+ /**
31
+ * Parse a user message for embedded image paths.
32
+ *
33
+ * Detects patterns like:
34
+ * "what's in ./screenshot.png"
35
+ * "describe /path/to/img.jpg and compare with other.png"
36
+ * "analyze these: img1.png img2.webp"
37
+ */
38
+ export declare function parseMultimodalMessage(message: string): ParsedMessage;
39
+ /**
40
+ * Read image data from stdin pipe.
41
+ * Used for: cat image.png | kbot -p "what's this?"
42
+ */
43
+ export declare function readStdinImage(): Promise<ImageBlock | null>;
44
+ /**
45
+ * Convert ParsedMessage blocks to Anthropic Messages API format.
46
+ * Returns the content array for the user message.
47
+ */
48
+ export declare function toAnthropicContent(parsed: ParsedMessage): Array<Record<string, unknown>>;
49
+ /**
50
+ * Convert ParsedMessage to OpenAI Vision API format.
51
+ */
52
+ export declare function toOpenAIContent(parsed: ParsedMessage): Array<Record<string, unknown>>;
53
+ /**
54
+ * Convert ParsedMessage to Google Gemini API format.
55
+ */
56
+ export declare function toGeminiParts(parsed: ParsedMessage): Array<Record<string, unknown>>;
57
+ //# sourceMappingURL=multimodal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.d.ts","sourceRoot":"","sources":["../src/multimodal.ts"],"names":[],"mappings":"AA2BA,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,CAAA;AAEjD,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAqB/D;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAgDrE;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsBjE;AA+BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUxF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYnF"}
@@ -0,0 +1,206 @@
1
+ // K:BOT Multimodal Input — Accept images, PDFs, and binary files in CLI
2
+ //
3
+ // Detects image paths in user messages, encodes them to base64,
4
+ // and builds content blocks for vision-capable providers.
5
+ //
6
+ // Supported:
7
+ // kbot "what's in this image?" ./screenshot.png
8
+ // kbot "describe this" /path/to/photo.jpg
9
+ // cat image.png | kbot -p "what's this?"
10
+ // kbot "compare these" img1.png img2.png
11
+ import { readFileSync, existsSync, statSync } from 'node:fs';
12
+ import { extname, resolve } from 'node:path';
13
+ /** MIME types for supported image formats */
14
+ const IMAGE_MIMES = {
15
+ '.png': 'image/png',
16
+ '.jpg': 'image/jpeg',
17
+ '.jpeg': 'image/jpeg',
18
+ '.gif': 'image/gif',
19
+ '.webp': 'image/webp',
20
+ '.bmp': 'image/bmp',
21
+ '.svg': 'image/svg+xml',
22
+ };
23
+ const MAX_IMAGE_SIZE = 20 * 1024 * 1024; // 20MB per image
24
+ /** Check if a file path looks like an image */
25
+ export function isImagePath(path) {
26
+ const ext = extname(path).toLowerCase();
27
+ return ext in IMAGE_MIMES;
28
+ }
29
+ /** Encode an image file to a base64 content block */
30
+ export function encodeImage(filePath) {
31
+ const absPath = resolve(filePath);
32
+ if (!existsSync(absPath))
33
+ return null;
34
+ const stat = statSync(absPath);
35
+ if (stat.size > MAX_IMAGE_SIZE)
36
+ return null;
37
+ if (stat.isDirectory())
38
+ return null;
39
+ const ext = extname(absPath).toLowerCase();
40
+ const mime = IMAGE_MIMES[ext];
41
+ if (!mime)
42
+ return null;
43
+ const data = readFileSync(absPath).toString('base64');
44
+ return {
45
+ type: 'image',
46
+ source: {
47
+ type: 'base64',
48
+ media_type: mime,
49
+ data,
50
+ },
51
+ };
52
+ }
53
+ /**
54
+ * Parse a user message for embedded image paths.
55
+ *
56
+ * Detects patterns like:
57
+ * "what's in ./screenshot.png"
58
+ * "describe /path/to/img.jpg and compare with other.png"
59
+ * "analyze these: img1.png img2.webp"
60
+ */
61
+ export function parseMultimodalMessage(message) {
62
+ // Match file paths that look like images
63
+ // Patterns: ./file.png, /abs/path.jpg, relative/path.webp, ~/path.gif
64
+ const pathRegex = /(?:^|\s)((?:\.{0,2}\/|~\/|[a-zA-Z0-9_-]+\/)*[a-zA-Z0-9_.-]+\.(?:png|jpg|jpeg|gif|webp|bmp|svg))(?:\s|$)/gi;
65
+ const images = [];
66
+ const foundPaths = [];
67
+ let match;
68
+ while ((match = pathRegex.exec(message)) !== null) {
69
+ const filePath = match[1].trim();
70
+ const encoded = encodeImage(filePath);
71
+ if (encoded) {
72
+ images.push(encoded);
73
+ foundPaths.push(filePath);
74
+ }
75
+ }
76
+ if (images.length === 0) {
77
+ return {
78
+ text: message,
79
+ blocks: [{ type: 'text', text: message }],
80
+ imageCount: 0,
81
+ isMultimodal: false,
82
+ };
83
+ }
84
+ // Remove image paths from the text message
85
+ let cleanText = message;
86
+ for (const p of foundPaths) {
87
+ cleanText = cleanText.replace(p, '').trim();
88
+ }
89
+ // Clean up double spaces
90
+ cleanText = cleanText.replace(/\s{2,}/g, ' ').trim();
91
+ if (!cleanText)
92
+ cleanText = 'Describe this image.';
93
+ // Build interleaved content blocks: text first, then images
94
+ const blocks = [
95
+ { type: 'text', text: cleanText },
96
+ ...images,
97
+ ];
98
+ return {
99
+ text: cleanText,
100
+ blocks,
101
+ imageCount: images.length,
102
+ isMultimodal: true,
103
+ };
104
+ }
105
+ /**
106
+ * Read image data from stdin pipe.
107
+ * Used for: cat image.png | kbot -p "what's this?"
108
+ */
109
+ export async function readStdinImage() {
110
+ if (process.stdin.isTTY)
111
+ return null;
112
+ const chunks = [];
113
+ for await (const chunk of process.stdin) {
114
+ chunks.push(chunk);
115
+ }
116
+ const data = Buffer.concat(chunks);
117
+ if (data.length === 0)
118
+ return null;
119
+ // Detect image type from magic bytes
120
+ const mime = detectMimeFromBytes(data);
121
+ if (!mime)
122
+ return null;
123
+ return {
124
+ type: 'image',
125
+ source: {
126
+ type: 'base64',
127
+ media_type: mime,
128
+ data: data.toString('base64'),
129
+ },
130
+ };
131
+ }
132
+ /** Detect image MIME type from file magic bytes */
133
+ function detectMimeFromBytes(data) {
134
+ if (data.length < 4)
135
+ return null;
136
+ // PNG: 89 50 4E 47
137
+ if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4E && data[3] === 0x47) {
138
+ return 'image/png';
139
+ }
140
+ // JPEG: FF D8 FF
141
+ if (data[0] === 0xFF && data[1] === 0xD8 && data[2] === 0xFF) {
142
+ return 'image/jpeg';
143
+ }
144
+ // GIF: 47 49 46
145
+ if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46) {
146
+ return 'image/gif';
147
+ }
148
+ // WebP: 52 49 46 46 ... 57 45 42 50
149
+ if (data[0] === 0x52 && data[1] === 0x49 && data[2] === 0x46 && data[3] === 0x46 &&
150
+ data.length > 11 && data[8] === 0x57 && data[9] === 0x45 && data[10] === 0x42 && data[11] === 0x50) {
151
+ return 'image/webp';
152
+ }
153
+ // BMP: 42 4D
154
+ if (data[0] === 0x42 && data[1] === 0x4D) {
155
+ return 'image/bmp';
156
+ }
157
+ return null;
158
+ }
159
+ /**
160
+ * Convert ParsedMessage blocks to Anthropic Messages API format.
161
+ * Returns the content array for the user message.
162
+ */
163
+ export function toAnthropicContent(parsed) {
164
+ return parsed.blocks.map(block => {
165
+ if (block.type === 'text') {
166
+ return { type: 'text', text: block.text };
167
+ }
168
+ return {
169
+ type: 'image',
170
+ source: block.source,
171
+ };
172
+ });
173
+ }
174
+ /**
175
+ * Convert ParsedMessage to OpenAI Vision API format.
176
+ */
177
+ export function toOpenAIContent(parsed) {
178
+ return parsed.blocks.map(block => {
179
+ if (block.type === 'text') {
180
+ return { type: 'text', text: block.text };
181
+ }
182
+ return {
183
+ type: 'image_url',
184
+ image_url: {
185
+ url: `data:${block.source.media_type};base64,${block.source.data}`,
186
+ },
187
+ };
188
+ });
189
+ }
190
+ /**
191
+ * Convert ParsedMessage to Google Gemini API format.
192
+ */
193
+ export function toGeminiParts(parsed) {
194
+ return parsed.blocks.map(block => {
195
+ if (block.type === 'text') {
196
+ return { text: block.text };
197
+ }
198
+ return {
199
+ inline_data: {
200
+ mime_type: block.source.media_type,
201
+ data: block.source.data,
202
+ },
203
+ };
204
+ });
205
+ }
206
+ //# sourceMappingURL=multimodal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multimodal.js","sourceRoot":"","sources":["../src/multimodal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export type PermissionMode = 'permissive' | 'normal' | 'strict';
2
+ /** Set the permission mode */
3
+ export declare function setPermissionMode(mode: PermissionMode): void;
4
+ /** Get the current permission mode */
5
+ export declare function getPermissionMode(): PermissionMode;
6
+ /**
7
+ * Check if a tool call requires user confirmation.
8
+ * Returns the reason if confirmation is needed, null otherwise.
9
+ */
10
+ export declare function needsConfirmation(toolName: string, args: Record<string, unknown>): string | null;
11
+ /**
12
+ * Ask the user to confirm a tool call.
13
+ * Returns true if approved, false if denied.
14
+ */
15
+ export declare function confirmToolCall(toolName: string, args: Record<string, unknown>, reason: string): Promise<boolean>;
16
+ /**
17
+ * Check and confirm a tool call. Returns true to proceed, false to skip.
18
+ * Used as middleware in the tool execution pipeline.
19
+ */
20
+ export declare function checkPermission(toolName: string, args: Record<string, unknown>): Promise<boolean>;
21
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAuB/D,8BAA8B;AAC9B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE5D;AAED,sCAAsC;AACtC,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,IAAI,CA+Bf;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAmClB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAIlB"}
@@ -0,0 +1,122 @@
1
+ // K:BOT Permission System — Confirmation before destructive operations
2
+ //
3
+ // Like Claude Code's permission modes. K:BOT asks before:
4
+ // - git push, git reset --hard, git checkout -- files
5
+ // - rm -rf (non-trivial deletes)
6
+ // - Docker operations that affect running containers
7
+ // - Network requests to unknown endpoints
8
+ // - Any tool call that could lose data
9
+ //
10
+ // Modes:
11
+ // 'permissive' — auto-approve everything (for scripts/CI)
12
+ // 'normal' — confirm destructive ops (default)
13
+ // 'strict' — confirm all file writes and tool calls
14
+ import { createInterface } from 'node:readline';
15
+ import chalk from 'chalk';
16
+ let currentMode = 'normal';
17
+ /** Patterns that always require confirmation in normal mode */
18
+ const DESTRUCTIVE_PATTERNS = [
19
+ { pattern: /^git\s+push/, reason: 'Pushes code to remote — visible to others' },
20
+ { pattern: /^git\s+reset\s+--hard/, reason: 'Discards all uncommitted changes' },
21
+ { pattern: /^git\s+checkout\s+--\s/, reason: 'Discards file changes' },
22
+ { pattern: /^git\s+branch\s+-[dD]\s/, reason: 'Deletes a git branch' },
23
+ { pattern: /^git\s+push\s+.*--force/, reason: 'Force push — can overwrite remote history' },
24
+ { pattern: /^rm\s+-rf?\s+[^.]/, reason: 'Recursive delete' },
25
+ { pattern: /^docker\s+rm\s+-f/, reason: 'Force removes Docker containers' },
26
+ { pattern: /^docker\s+system\s+prune/, reason: 'Removes unused Docker data' },
27
+ { pattern: /^kubectl\s+delete/, reason: 'Deletes Kubernetes resources' },
28
+ { pattern: /^npm\s+publish/, reason: 'Publishes package to npm' },
29
+ { pattern: /^npx\s+supabase\s+functions\s+deploy/, reason: 'Deploys edge function to production' },
30
+ { pattern: /^npx\s+supabase\s+db\s+push/, reason: 'Pushes database migrations to production' },
31
+ { pattern: /DROP\s+TABLE/i, reason: 'Drops a database table' },
32
+ { pattern: /TRUNCATE/i, reason: 'Truncates a database table' },
33
+ { pattern: /DELETE\s+FROM/i, reason: 'Deletes database rows' },
34
+ ];
35
+ /** Set the permission mode */
36
+ export function setPermissionMode(mode) {
37
+ currentMode = mode;
38
+ }
39
+ /** Get the current permission mode */
40
+ export function getPermissionMode() {
41
+ return currentMode;
42
+ }
43
+ /**
44
+ * Check if a tool call requires user confirmation.
45
+ * Returns the reason if confirmation is needed, null otherwise.
46
+ */
47
+ export function needsConfirmation(toolName, args) {
48
+ if (currentMode === 'permissive')
49
+ return null;
50
+ // Strict mode: confirm everything except reads
51
+ if (currentMode === 'strict') {
52
+ const readOnlyTools = ['read_file', 'glob', 'grep', 'list_directory', 'git_status', 'git_diff', 'git_log',
53
+ 'web_search', 'task_list', 'task_get', 'build_detect', 'build_targets', 'build_check',
54
+ 'mcp_list_tools', 'mcp_list_resources', 'mcp_servers', 'agent_list', 'agent_result',
55
+ 'background_list', 'sandbox_list', 'notebook_read'];
56
+ if (!readOnlyTools.includes(toolName)) {
57
+ return `${toolName} modifies state (strict mode)`;
58
+ }
59
+ return null;
60
+ }
61
+ // Normal mode: only confirm destructive operations
62
+ if (toolName === 'bash') {
63
+ const command = String(args.command || '');
64
+ for (const { pattern, reason } of DESTRUCTIVE_PATTERNS) {
65
+ if (pattern.test(command.trim())) {
66
+ return reason;
67
+ }
68
+ }
69
+ }
70
+ // git_push always needs confirmation
71
+ if (toolName === 'git_push') {
72
+ return 'Pushes code to remote repository';
73
+ }
74
+ return null;
75
+ }
76
+ /**
77
+ * Ask the user to confirm a tool call.
78
+ * Returns true if approved, false if denied.
79
+ */
80
+ export async function confirmToolCall(toolName, args, reason) {
81
+ const AMETHYST = chalk.hex('#6B5B95');
82
+ console.log();
83
+ console.log(` ${chalk.yellow('⚠')} ${chalk.bold('Confirmation required')}`);
84
+ console.log(` ${chalk.dim(reason)}`);
85
+ console.log();
86
+ console.log(` ${AMETHYST('Tool:')} ${toolName}`);
87
+ // Show relevant args
88
+ for (const [key, value] of Object.entries(args)) {
89
+ const display = typeof value === 'string' && value.length > 80
90
+ ? value.slice(0, 80) + '...'
91
+ : String(value);
92
+ console.log(` ${chalk.dim(key + ':')} ${display}`);
93
+ }
94
+ console.log();
95
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
96
+ const answer = await new Promise((resolve) => {
97
+ rl.question(` ${chalk.bold('Approve?')} ${chalk.dim('[y/N]')} `, (a) => {
98
+ resolve(a.trim().toLowerCase());
99
+ rl.close();
100
+ });
101
+ });
102
+ const approved = answer === 'y' || answer === 'yes';
103
+ if (approved) {
104
+ console.log(` ${chalk.green('✓')} Approved`);
105
+ }
106
+ else {
107
+ console.log(` ${chalk.red('✗')} Denied`);
108
+ }
109
+ console.log();
110
+ return approved;
111
+ }
112
+ /**
113
+ * Check and confirm a tool call. Returns true to proceed, false to skip.
114
+ * Used as middleware in the tool execution pipeline.
115
+ */
116
+ export async function checkPermission(toolName, args) {
117
+ const reason = needsConfirmation(toolName, args);
118
+ if (!reason)
119
+ return true;
120
+ return confirmToolCall(toolName, args, reason);
121
+ }
122
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,0DAA0D;AAC1D,wDAAwD;AACxD,mCAAmC;AACnC,uDAAuD;AACvD,4CAA4C;AAC5C,yCAAyC;AACzC,EAAE;AACF,SAAS;AACT,6DAA6D;AAC7D,sDAAsD;AACtD,2DAA2D;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,IAAI,WAAW,GAAmB,QAAQ,CAAA;AAE1C,+DAA+D;AAC/D,MAAM,oBAAoB,GAA+C;IACvE,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,2CAA2C,EAAE;IAC/E,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,kCAAkC,EAAE;IAChF,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,uBAAuB,EAAE;IACtE,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,sBAAsB,EAAE;IACtE,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,2CAA2C,EAAE;IAC3F,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,kBAAkB,EAAE;IAC5D,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,iCAAiC,EAAE;IAC3E,EAAE,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,4BAA4B,EAAE;IAC7E,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,8BAA8B,EAAE;IACxE,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,0BAA0B,EAAE;IACjE,EAAE,OAAO,EAAE,sCAAsC,EAAE,MAAM,EAAE,qCAAqC,EAAE;IAClG,EAAE,OAAO,EAAE,6BAA6B,EAAE,MAAM,EAAE,0CAA0C,EAAE;IAC9F,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE;IAC9D,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,4BAA4B,EAAE;IAC9D,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,uBAAuB,EAAE;CAC/D,CAAA;AAED,8BAA8B;AAC9B,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,WAAW,GAAG,IAAI,CAAA;AACpB,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,IAA6B;IAE7B,IAAI,WAAW,KAAK,YAAY;QAAE,OAAO,IAAI,CAAA;IAE7C,+CAA+C;IAC/C,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS;YACvG,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa;YACrF,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc;YACnF,iBAAiB,EAAE,cAAc,EAAE,eAAe,CAAC,CAAA;QACrD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,QAAQ,+BAA+B,CAAA;QACnD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,mDAAmD;IACnD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QAC1C,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACjC,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,kCAAkC,CAAA;IAC3C,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,IAA6B,EAC7B,MAAc;IAEd,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAErC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAA;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACrC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAA;IAEjD,qBAAqB;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;YAC5D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;YAC5B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACnD,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;YACtE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAA;QACZ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAA;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,IAA6B;IAE7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;AAChD,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { type AgentOptions } from './agent.js';
2
+ export interface PlanStep {
3
+ id: number;
4
+ description: string;
5
+ tool?: string;
6
+ args?: Record<string, unknown>;
7
+ /** Files this step reads */
8
+ reads?: string[];
9
+ /** Files this step modifies */
10
+ writes?: string[];
11
+ status: 'pending' | 'running' | 'done' | 'failed' | 'skipped';
12
+ result?: string;
13
+ error?: string;
14
+ /** Step IDs this depends on */
15
+ dependsOn?: number[];
16
+ }
17
+ export interface Plan {
18
+ task: string;
19
+ summary: string;
20
+ steps: PlanStep[];
21
+ filesInScope: string[];
22
+ estimatedToolCalls: number;
23
+ status: 'planning' | 'awaiting_approval' | 'executing' | 'completed' | 'failed';
24
+ createdAt: string;
25
+ }
26
+ /**
27
+ * Generate a plan for a complex task.
28
+ * Uses the AI to analyze the task and produce structured steps.
29
+ */
30
+ export declare function generatePlan(task: string, agentOpts: AgentOptions): Promise<Plan>;
31
+ /**
32
+ * Display a plan to the user for approval.
33
+ */
34
+ export declare function displayPlan(plan: Plan): void;
35
+ /**
36
+ * Execute a plan step by step.
37
+ * Supports parallel execution for independent steps.
38
+ */
39
+ export declare function executePlan(plan: Plan, agentOpts: AgentOptions, onStepComplete?: (step: PlanStep) => void): Promise<Plan>;
40
+ /**
41
+ * Full autonomous flow: Plan → Confirm → Execute → Verify
42
+ * This is the top-level entry point for complex tasks.
43
+ */
44
+ export declare function autonomousExecute(task: string, agentOpts: AgentOptions, options?: {
45
+ /** Skip approval — execute immediately */
46
+ autoApprove?: boolean;
47
+ /** Callback for user approval (return true to proceed) */
48
+ onApproval?: (plan: Plan) => Promise<boolean>;
49
+ }): Promise<Plan>;
50
+ /**
51
+ * Format a plan summary for display after completion
52
+ */
53
+ export declare function formatPlanSummary(plan: Plan): string;
54
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAaA,OAAO,EAAY,KAAK,YAAY,EAAsB,MAAM,YAAY,CAAA;AAW5E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAA;IAC/E,SAAS,EAAE,MAAM,CAAA;CAClB;AAkCD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAqB5C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,YAAY,EACvB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GACxC,OAAO,CAAC,IAAI,CAAC,CA0Gf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE;IACR,0CAA0C;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9C,GACA,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBpD"}