cf-claw 3.0.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 (273) hide show
  1. package/dist/agent.d.ts +15 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +262 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/agents.d.ts +51 -0
  6. package/dist/agents.d.ts.map +1 -0
  7. package/dist/agents.js +478 -0
  8. package/dist/agents.js.map +1 -0
  9. package/dist/api/routes.d.ts +3 -0
  10. package/dist/api/routes.d.ts.map +1 -0
  11. package/dist/api/routes.js +491 -0
  12. package/dist/api/routes.js.map +1 -0
  13. package/dist/bot.d.ts +4 -0
  14. package/dist/bot.d.ts.map +1 -0
  15. package/dist/bot.js +295 -0
  16. package/dist/bot.js.map +1 -0
  17. package/dist/canvas.d.ts +37 -0
  18. package/dist/canvas.d.ts.map +1 -0
  19. package/dist/canvas.js +47 -0
  20. package/dist/canvas.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +202 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands.d.ts +6 -0
  26. package/dist/commands.d.ts.map +1 -0
  27. package/dist/commands.js +384 -0
  28. package/dist/commands.js.map +1 -0
  29. package/dist/components/TaskList.d.ts +7 -0
  30. package/dist/components/TaskList.d.ts.map +1 -0
  31. package/dist/components/TaskList.js +37 -0
  32. package/dist/components/TaskList.js.map +1 -0
  33. package/dist/config/encryption.d.ts +10 -0
  34. package/dist/config/encryption.d.ts.map +1 -0
  35. package/dist/config/encryption.js +111 -0
  36. package/dist/config/encryption.js.map +1 -0
  37. package/dist/config/json-config.d.ts +114 -0
  38. package/dist/config/json-config.d.ts.map +1 -0
  39. package/dist/config/json-config.js +388 -0
  40. package/dist/config/json-config.js.map +1 -0
  41. package/dist/config.d.ts +51 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +137 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/context/pruning.d.ts +30 -0
  46. package/dist/context/pruning.d.ts.map +1 -0
  47. package/dist/context/pruning.js +132 -0
  48. package/dist/context/pruning.js.map +1 -0
  49. package/dist/dashboard/404/index.html +1 -0
  50. package/dist/dashboard/404.html +1 -0
  51. package/dist/dashboard/_next/static/chunks/117-c657912d4a6fa056.js +2 -0
  52. package/dist/dashboard/_next/static/chunks/191-a6922264096cb3ad.js +11 -0
  53. package/dist/dashboard/_next/static/chunks/343-71498a8257bc1e81.js +1 -0
  54. package/dist/dashboard/_next/static/chunks/app/_not-found/page-15cbe4395e02a084.js +1 -0
  55. package/dist/dashboard/_next/static/chunks/app/layout-191efbc962809bb4.js +1 -0
  56. package/dist/dashboard/_next/static/chunks/app/manual/page-3c401ecf89979cd7.js +1 -0
  57. package/dist/dashboard/_next/static/chunks/app/page-dff55e58941a3c4d.js +1 -0
  58. package/dist/dashboard/_next/static/chunks/fd9d1056-9583fa19bc194043.js +1 -0
  59. package/dist/dashboard/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  60. package/dist/dashboard/_next/static/chunks/main-2461f93106bcf687.js +1 -0
  61. package/dist/dashboard/_next/static/chunks/main-app-89f5ec28b3bb0e7f.js +1 -0
  62. package/dist/dashboard/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  63. package/dist/dashboard/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  64. package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  65. package/dist/dashboard/_next/static/chunks/webpack-616e068a201ad621.js +1 -0
  66. package/dist/dashboard/_next/static/css/baff0f221c10680b.css +3 -0
  67. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_buildManifest.js +1 -0
  68. package/dist/dashboard/_next/static/pyqPyo6dkz4uTWdfdFAOJ/_ssgManifest.js +1 -0
  69. package/dist/dashboard/index.html +1 -0
  70. package/dist/dashboard/index.txt +7 -0
  71. package/dist/dashboard/manual/index.html +1 -0
  72. package/dist/dashboard/manual/index.txt +7 -0
  73. package/dist/documents.d.ts +20 -0
  74. package/dist/documents.d.ts.map +1 -0
  75. package/dist/documents.js +227 -0
  76. package/dist/documents.js.map +1 -0
  77. package/dist/embeddings.d.ts +15 -0
  78. package/dist/embeddings.d.ts.map +1 -0
  79. package/dist/embeddings.js +40 -0
  80. package/dist/embeddings.js.map +1 -0
  81. package/dist/factory.d.ts +72 -0
  82. package/dist/factory.d.ts.map +1 -0
  83. package/dist/factory.js +2010 -0
  84. package/dist/factory.js.map +1 -0
  85. package/dist/groups.d.ts +13 -0
  86. package/dist/groups.d.ts.map +1 -0
  87. package/dist/groups.js +42 -0
  88. package/dist/groups.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +223 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/lib/taskStorage.d.ts +4 -0
  94. package/dist/lib/taskStorage.d.ts.map +1 -0
  95. package/dist/lib/taskStorage.js +28 -0
  96. package/dist/lib/taskStorage.js.map +1 -0
  97. package/dist/llm/anthropic.d.ts +13 -0
  98. package/dist/llm/anthropic.d.ts.map +1 -0
  99. package/dist/llm/anthropic.js +96 -0
  100. package/dist/llm/anthropic.js.map +1 -0
  101. package/dist/llm/failover.d.ts +13 -0
  102. package/dist/llm/failover.d.ts.map +1 -0
  103. package/dist/llm/failover.js +42 -0
  104. package/dist/llm/failover.js.map +1 -0
  105. package/dist/llm/google.d.ts +13 -0
  106. package/dist/llm/google.d.ts.map +1 -0
  107. package/dist/llm/google.js +112 -0
  108. package/dist/llm/google.js.map +1 -0
  109. package/dist/llm/groq.d.ts +8 -0
  110. package/dist/llm/groq.d.ts.map +1 -0
  111. package/dist/llm/groq.js +13 -0
  112. package/dist/llm/groq.js.map +1 -0
  113. package/dist/llm/index.d.ts +11 -0
  114. package/dist/llm/index.d.ts.map +1 -0
  115. package/dist/llm/index.js +10 -0
  116. package/dist/llm/index.js.map +1 -0
  117. package/dist/llm/ollama.d.ts +9 -0
  118. package/dist/llm/ollama.d.ts.map +1 -0
  119. package/dist/llm/ollama.js +27 -0
  120. package/dist/llm/ollama.js.map +1 -0
  121. package/dist/llm/openai-compat.d.ts +17 -0
  122. package/dist/llm/openai-compat.d.ts.map +1 -0
  123. package/dist/llm/openai-compat.js +69 -0
  124. package/dist/llm/openai-compat.js.map +1 -0
  125. package/dist/llm/openrouter.d.ts +8 -0
  126. package/dist/llm/openrouter.d.ts.map +1 -0
  127. package/dist/llm/openrouter.js +20 -0
  128. package/dist/llm/openrouter.js.map +1 -0
  129. package/dist/llm/provider.d.ts +41 -0
  130. package/dist/llm/provider.d.ts.map +1 -0
  131. package/dist/llm/provider.js +2 -0
  132. package/dist/llm/provider.js.map +1 -0
  133. package/dist/llm/registry.d.ts +10 -0
  134. package/dist/llm/registry.d.ts.map +1 -0
  135. package/dist/llm/registry.js +90 -0
  136. package/dist/llm/registry.js.map +1 -0
  137. package/dist/llm/thinking.d.ts +7 -0
  138. package/dist/llm/thinking.d.ts.map +1 -0
  139. package/dist/llm/thinking.js +34 -0
  140. package/dist/llm/thinking.js.map +1 -0
  141. package/dist/llm.d.ts +17 -0
  142. package/dist/llm.d.ts.map +1 -0
  143. package/dist/llm.js +184 -0
  144. package/dist/llm.js.map +1 -0
  145. package/dist/logs.d.ts +11 -0
  146. package/dist/logs.d.ts.map +1 -0
  147. package/dist/logs.js +54 -0
  148. package/dist/logs.js.map +1 -0
  149. package/dist/memory/knowledge-graph.d.ts +34 -0
  150. package/dist/memory/knowledge-graph.d.ts.map +1 -0
  151. package/dist/memory/knowledge-graph.js +137 -0
  152. package/dist/memory/knowledge-graph.js.map +1 -0
  153. package/dist/memory.d.ts +73 -0
  154. package/dist/memory.d.ts.map +1 -0
  155. package/dist/memory.js +320 -0
  156. package/dist/memory.js.map +1 -0
  157. package/dist/mesh.d.ts +18 -0
  158. package/dist/mesh.d.ts.map +1 -0
  159. package/dist/mesh.js +120 -0
  160. package/dist/mesh.js.map +1 -0
  161. package/dist/paths.d.ts +11 -0
  162. package/dist/paths.d.ts.map +1 -0
  163. package/dist/paths.js +51 -0
  164. package/dist/paths.js.map +1 -0
  165. package/dist/proactive/heartbeat.d.ts +4 -0
  166. package/dist/proactive/heartbeat.d.ts.map +1 -0
  167. package/dist/proactive/heartbeat.js +56 -0
  168. package/dist/proactive/heartbeat.js.map +1 -0
  169. package/dist/proactive/recap.d.ts +12 -0
  170. package/dist/proactive/recap.d.ts.map +1 -0
  171. package/dist/proactive/recap.js +90 -0
  172. package/dist/proactive/recap.js.map +1 -0
  173. package/dist/proactive/recommendations.d.ts +11 -0
  174. package/dist/proactive/recommendations.d.ts.map +1 -0
  175. package/dist/proactive/recommendations.js +92 -0
  176. package/dist/proactive/recommendations.js.map +1 -0
  177. package/dist/projects.d.ts +44 -0
  178. package/dist/projects.d.ts.map +1 -0
  179. package/dist/projects.js +101 -0
  180. package/dist/projects.js.map +1 -0
  181. package/dist/scheduler/index.d.ts +17 -0
  182. package/dist/scheduler/index.d.ts.map +1 -0
  183. package/dist/scheduler/index.js +116 -0
  184. package/dist/scheduler/index.js.map +1 -0
  185. package/dist/sessions.d.ts +19 -0
  186. package/dist/sessions.d.ts.map +1 -0
  187. package/dist/sessions.js +176 -0
  188. package/dist/sessions.js.map +1 -0
  189. package/dist/skills/index.d.ts +14 -0
  190. package/dist/skills/index.d.ts.map +1 -0
  191. package/dist/skills/index.js +126 -0
  192. package/dist/skills/index.js.map +1 -0
  193. package/dist/swarm.d.ts +18 -0
  194. package/dist/swarm.d.ts.map +1 -0
  195. package/dist/swarm.js +146 -0
  196. package/dist/swarm.js.map +1 -0
  197. package/dist/taskListWidget.d.ts +76 -0
  198. package/dist/taskListWidget.d.ts.map +1 -0
  199. package/dist/taskListWidget.js +312 -0
  200. package/dist/taskListWidget.js.map +1 -0
  201. package/dist/tools/browser.d.ts +5 -0
  202. package/dist/tools/browser.d.ts.map +1 -0
  203. package/dist/tools/browser.js +104 -0
  204. package/dist/tools/browser.js.map +1 -0
  205. package/dist/tools/config-tools.d.ts +4 -0
  206. package/dist/tools/config-tools.d.ts.map +1 -0
  207. package/dist/tools/config-tools.js +154 -0
  208. package/dist/tools/config-tools.js.map +1 -0
  209. package/dist/tools/files.d.ts +3 -0
  210. package/dist/tools/files.d.ts.map +1 -0
  211. package/dist/tools/files.js +208 -0
  212. package/dist/tools/files.js.map +1 -0
  213. package/dist/tools/index.d.ts +11 -0
  214. package/dist/tools/index.d.ts.map +1 -0
  215. package/dist/tools/index.js +1109 -0
  216. package/dist/tools/index.js.map +1 -0
  217. package/dist/tools/mcp-bridge.d.ts +5 -0
  218. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  219. package/dist/tools/mcp-bridge.js +200 -0
  220. package/dist/tools/mcp-bridge.js.map +1 -0
  221. package/dist/tools/shell.d.ts +8 -0
  222. package/dist/tools/shell.d.ts.map +1 -0
  223. package/dist/tools/shell.js +78 -0
  224. package/dist/tools/shell.js.map +1 -0
  225. package/dist/tools/skills-manage.d.ts +25 -0
  226. package/dist/tools/skills-manage.d.ts.map +1 -0
  227. package/dist/tools/skills-manage.js +155 -0
  228. package/dist/tools/skills-manage.js.map +1 -0
  229. package/dist/tools/web-search.d.ts +4 -0
  230. package/dist/tools/web-search.d.ts.map +1 -0
  231. package/dist/tools/web-search.js +60 -0
  232. package/dist/tools/web-search.js.map +1 -0
  233. package/dist/tts.d.ts +6 -0
  234. package/dist/tts.d.ts.map +1 -0
  235. package/dist/tts.js +42 -0
  236. package/dist/tts.js.map +1 -0
  237. package/dist/types/task.d.ts +7 -0
  238. package/dist/types/task.d.ts.map +1 -0
  239. package/dist/types/task.js +2 -0
  240. package/dist/types/task.js.map +1 -0
  241. package/dist/typing.d.ts +18 -0
  242. package/dist/typing.d.ts.map +1 -0
  243. package/dist/typing.js +63 -0
  244. package/dist/typing.js.map +1 -0
  245. package/dist/usage.d.ts +28 -0
  246. package/dist/usage.d.ts.map +1 -0
  247. package/dist/usage.js +69 -0
  248. package/dist/usage.js.map +1 -0
  249. package/dist/voice.d.ts +6 -0
  250. package/dist/voice.d.ts.map +1 -0
  251. package/dist/voice.js +47 -0
  252. package/dist/voice.js.map +1 -0
  253. package/dist/webchat/index.d.ts +3 -0
  254. package/dist/webchat/index.d.ts.map +1 -0
  255. package/dist/webchat/index.js +3 -0
  256. package/dist/webchat/index.js.map +1 -0
  257. package/dist/webchat/public/index.html +344 -0
  258. package/dist/webchat/public/public/index.html +344 -0
  259. package/dist/webchat/public/public/task-list-widget.js +410 -0
  260. package/dist/webchat/public/task-list-widget.js +410 -0
  261. package/dist/webchat/server.d.ts +3 -0
  262. package/dist/webchat/server.d.ts.map +1 -0
  263. package/dist/webchat/server.js +80 -0
  264. package/dist/webchat/server.js.map +1 -0
  265. package/dist/webchat/ws.d.ts +4 -0
  266. package/dist/webchat/ws.d.ts.map +1 -0
  267. package/dist/webchat/ws.js +232 -0
  268. package/dist/webchat/ws.js.map +1 -0
  269. package/dist/webhooks/index.d.ts +14 -0
  270. package/dist/webhooks/index.d.ts.map +1 -0
  271. package/dist/webhooks/index.js +86 -0
  272. package/dist/webhooks/index.js.map +1 -0
  273. package/package.json +53 -0
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Task List Widget (US-3)
3
+ *
4
+ * Features:
5
+ * - Checkbox/toggle for each task item
6
+ * - Click handler updates task.completed in state
7
+ * - Visual indicator class (strikethrough + opacity) on completed tasks
8
+ * - Full keyboard accessibility
9
+ * - Proper label/checkbox association with id/for attributes
10
+ *
11
+ * NOTE: This widget is designed as a singleton. Calling mount() multiple times
12
+ * will unmount the previous instance. Only one instance is supported per page.
13
+ */
14
+ // ─── State ───────────────────────────────────────────────────────────────────
15
+ let tasks = [];
16
+ let mounted = false;
17
+ let containerEl = null;
18
+ let itemsEl = null;
19
+ let countEl = null;
20
+ // ─── Utilities ───────────────────────────────────────────────────────────────
21
+ function uid() {
22
+ return Math.random().toString(36).slice(2, 10);
23
+ }
24
+ function escapeAttr(str) {
25
+ return str.replace(/"/g, '"').replace(/'/g, ''');
26
+ }
27
+ // ─── Render Helpers ──────────────────────────────────────────────────────────
28
+ function createTaskEl(task) {
29
+ const itemEl = document.createElement('div');
30
+ itemEl.className = 'task-item';
31
+ if (task.completed) {
32
+ itemEl.classList.add('task-item--completed');
33
+ }
34
+ itemEl.dataset.taskId = task.id;
35
+ // Generate unique IDs for accessibility association
36
+ const checkboxId = `task-checkbox-${task.id}`;
37
+ const labelId = `task-label-${task.id}`;
38
+ // Label element with explicit `for` attribute
39
+ const labelEl = document.createElement('label');
40
+ labelEl.className = 'task-item__label';
41
+ labelEl.setAttribute('for', checkboxId);
42
+ labelEl.id = labelId;
43
+ // Checkbox with explicit `id` attribute
44
+ const checkbox = document.createElement('input');
45
+ checkbox.type = 'checkbox';
46
+ checkbox.className = 'task-item__checkbox';
47
+ checkbox.id = checkboxId;
48
+ checkbox.checked = task.completed;
49
+ checkbox.setAttribute('aria-labelledby', labelId);
50
+ checkbox.setAttribute('aria-label', `Mark "${task.text}" as ${task.completed ? 'incomplete' : 'complete'}`);
51
+ // Text span
52
+ const textSpan = document.createElement('span');
53
+ textSpan.className = 'task-item__text';
54
+ textSpan.textContent = task.text;
55
+ // Assemble: label wraps checkbox + text
56
+ labelEl.appendChild(checkbox);
57
+ labelEl.appendChild(textSpan);
58
+ itemEl.appendChild(labelEl);
59
+ // ─── Event Handling (US-3) ─────────────────────────────────────────────
60
+ // Use click on label with preventDefault to avoid browser double-toggle bug.
61
+ // This makes the flow deterministic:
62
+ // user clicks label → preventDefault stops browser toggle
63
+ // → toggleCompleted flips state AND sets checkbox.checked
64
+ // → single source of truth
65
+ labelEl.addEventListener('click', (e) => {
66
+ e.preventDefault();
67
+ toggleCompleted(task.id);
68
+ });
69
+ // Keyboard support: Enter/Space on checkbox triggers toggle
70
+ checkbox.addEventListener('keydown', (e) => {
71
+ if (e.key === 'Enter' || e.key === ' ') {
72
+ e.preventDefault();
73
+ toggleCompleted(task.id);
74
+ }
75
+ });
76
+ return itemEl;
77
+ }
78
+ function renderItems() {
79
+ if (!itemsEl)
80
+ return;
81
+ // Clear existing items
82
+ itemsEl.innerHTML = '';
83
+ // Render each task
84
+ tasks.forEach((task) => {
85
+ itemsEl.appendChild(createTaskEl(task));
86
+ });
87
+ updateCount();
88
+ }
89
+ function updateCount() {
90
+ if (!countEl)
91
+ return;
92
+ const completed = tasks.filter((t) => t.completed).length;
93
+ const total = tasks.length;
94
+ if (total === 0) {
95
+ countEl.textContent = '';
96
+ }
97
+ else {
98
+ countEl.textContent = `${completed} of ${total} completed`;
99
+ }
100
+ }
101
+ // ─── Public API ──────────────────────────────────────────────────────────────
102
+ /**
103
+ * Toggle the completed state of a task.
104
+ *
105
+ * Flow:
106
+ * 1. Find task in state array
107
+ * 2. Flip task.completed boolean
108
+ * 3. Update DOM: toggle visual indicator class
109
+ * 4. Update DOM: sync checkbox.checked property
110
+ * 5. Update DOM: sync aria-label for screen readers
111
+ * 6. Update count display
112
+ */
113
+ function toggleCompleted(taskId) {
114
+ // 1. Find task in state
115
+ const task = tasks.find((t) => t.id === taskId);
116
+ if (!task)
117
+ return;
118
+ // 2. Flip completed boolean
119
+ task.completed = !task.completed;
120
+ // 3. Find DOM element (use data attribute selector with proper escaping)
121
+ const escapedId = CSS.escape
122
+ ? CSS.escape(taskId)
123
+ : taskId.replace(/[^a-zA-Z0-9_-]/g, '\\$&');
124
+ const itemEl = itemsEl?.querySelector(`[data-task-id="${escapedId}"]`);
125
+ if (!itemEl)
126
+ return;
127
+ // 4. Toggle visual indicator class
128
+ itemEl.classList.toggle('task-item--completed', task.completed);
129
+ // 5. Sync checkbox and aria-label (inside null guard)
130
+ const checkbox = itemEl.querySelector('input[type="checkbox"]');
131
+ if (checkbox) {
132
+ checkbox.checked = task.completed;
133
+ checkbox.setAttribute('aria-label', `Mark "${task.text}" as ${task.completed ? 'incomplete' : 'complete'}`);
134
+ }
135
+ // 6. Update count
136
+ updateCount();
137
+ }
138
+ /**
139
+ * Add a new task to the list.
140
+ */
141
+ function addTask(text) {
142
+ const task = { id: uid(), text, completed: false };
143
+ tasks.push(task);
144
+ if (itemsEl) {
145
+ itemsEl.appendChild(createTaskEl(task));
146
+ }
147
+ updateCount();
148
+ return task;
149
+ }
150
+ /**
151
+ * Remove a task from the list.
152
+ */
153
+ function removeTask(taskId) {
154
+ const index = tasks.findIndex((t) => t.id === taskId);
155
+ if (index === -1)
156
+ return false;
157
+ tasks.splice(index, 1);
158
+ // Remove from DOM
159
+ const escapedId = CSS.escape
160
+ ? CSS.escape(taskId)
161
+ : taskId.replace(/[^a-zA-Z0-9_-]/g, '\\$&');
162
+ const itemEl = itemsEl?.querySelector(`[data-task-id="${escapedId}"]`);
163
+ if (itemEl) {
164
+ itemEl.remove();
165
+ }
166
+ updateCount();
167
+ return true;
168
+ }
169
+ /**
170
+ * Replace all tasks (e.g., for hydration from external source).
171
+ */
172
+ function setTasks(newTasks) {
173
+ tasks = newTasks
174
+ .filter((t) => t && t.text)
175
+ .map((t) => ({
176
+ id: t.id || uid(),
177
+ text: t.text,
178
+ completed: !!t.completed,
179
+ }));
180
+ renderItems();
181
+ }
182
+ /**
183
+ * Get a copy of the current tasks array.
184
+ */
185
+ function getTasks() {
186
+ return tasks.map((t) => ({ ...t }));
187
+ }
188
+ /**
189
+ * Mount the widget into a container element.
190
+ *
191
+ * NOTE: This widget is a singleton. Calling mount() multiple times will
192
+ * unmount any previous instance. Only one instance is supported per page.
193
+ */
194
+ function mount(container) {
195
+ // Singleton behavior: unmount previous instance if exists
196
+ if (mounted) {
197
+ unmount();
198
+ }
199
+ containerEl = container;
200
+ containerEl.innerHTML = '';
201
+ // Create wrapper
202
+ const wrapper = document.createElement('div');
203
+ wrapper.className = 'task-list-widget';
204
+ // Create items container
205
+ itemsEl = document.createElement('div');
206
+ itemsEl.className = 'task-list-widget__items';
207
+ itemsEl.setAttribute('role', 'list');
208
+ itemsEl.setAttribute('aria-label', 'Task list');
209
+ // Create count display
210
+ countEl = document.createElement('div');
211
+ countEl.className = 'task-list-widget__count';
212
+ countEl.setAttribute('aria-live', 'polite');
213
+ countEl.setAttribute('aria-atomic', 'true');
214
+ wrapper.appendChild(itemsEl);
215
+ wrapper.appendChild(countEl);
216
+ containerEl.appendChild(wrapper);
217
+ mounted = true;
218
+ // Render existing tasks
219
+ renderItems();
220
+ }
221
+ /**
222
+ * Unmount the widget and clean up.
223
+ */
224
+ function unmount() {
225
+ if (containerEl) {
226
+ containerEl.innerHTML = '';
227
+ }
228
+ containerEl = null;
229
+ itemsEl = null;
230
+ countEl = null;
231
+ mounted = false;
232
+ }
233
+ window.__taskListWidget = {
234
+ mount,
235
+ unmount,
236
+ addTask,
237
+ removeTask,
238
+ setTasks,
239
+ getTasks,
240
+ toggleCompleted,
241
+ };
242
+ // ─── Styles ──────────────────────────────────────────────────────────────────
243
+ const styles = document.createElement('style');
244
+ styles.textContent = `
245
+ .task-list-widget {
246
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
247
+ max-width: 500px;
248
+ }
249
+
250
+ .task-list-widget__items {
251
+ display: flex;
252
+ flex-direction: column;
253
+ gap: 4px;
254
+ }
255
+
256
+ .task-item {
257
+ padding: 12px 16px;
258
+ background: #fff;
259
+ border: 1px solid #e0e0e0;
260
+ border-radius: 8px;
261
+ transition: opacity 0.2s ease, background-color 0.2s ease;
262
+ }
263
+
264
+ .task-item:hover {
265
+ background: #f9f9f9;
266
+ }
267
+
268
+ .task-item--completed {
269
+ opacity: 0.7;
270
+ background: #f5f5f5;
271
+ }
272
+
273
+ .task-item__label {
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 12px;
277
+ cursor: pointer;
278
+ user-select: none;
279
+ }
280
+
281
+ .task-item__checkbox {
282
+ width: 18px;
283
+ height: 18px;
284
+ cursor: pointer;
285
+ accent-color: #4caf50;
286
+ flex-shrink: 0;
287
+ }
288
+
289
+ .task-item__text {
290
+ flex: 1;
291
+ font-size: 14px;
292
+ line-height: 1.4;
293
+ color: #333;
294
+ transition: color 0.2s ease, text-decoration 0.2s ease;
295
+ }
296
+
297
+ .task-item--completed .task-item__text {
298
+ text-decoration: line-through;
299
+ color: #888;
300
+ }
301
+
302
+ .task-list-widget__count {
303
+ margin-top: 12px;
304
+ padding: 8px 16px;
305
+ font-size: 12px;
306
+ color: #666;
307
+ text-align: right;
308
+ }
309
+ `;
310
+ document.head.appendChild(styles);
311
+ export { mount, unmount, addTask, removeTask, setTasks, getTasks, toggleCompleted };
312
+ //# sourceMappingURL=taskListWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskListWidget.js","sourceRoot":"","sources":["../src/taskListWidget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Tool } from "./index.js";
2
+ declare const browser: Tool;
3
+ export declare function closeBrowser(): Promise<void>;
4
+ export default browser;
5
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA8BvC,QAAA,MAAM,OAAO,EAAE,IAuEd,CAAC;AAEF,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,104 @@
1
+ let browserInstance = null;
2
+ let browserPage = null;
3
+ async function getBrowser() {
4
+ if (browserPage)
5
+ return { page: browserPage };
6
+ try {
7
+ // @ts-ignore - optional dependency
8
+ const pw = await import("playwright");
9
+ const { chromium } = pw;
10
+ browserInstance = await chromium.launch({ headless: true });
11
+ browserPage = await browserInstance.newPage({
12
+ viewport: { width: 1280, height: 720 },
13
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
14
+ });
15
+ return { page: browserPage };
16
+ }
17
+ catch (err) {
18
+ throw new Error(`Playwright not available. Install with: npx playwright install chromium\n${err.message}`);
19
+ }
20
+ }
21
+ async function takeScreenshot() {
22
+ const { page } = await getBrowser();
23
+ const screenshot = await page.screenshot({ type: "png" });
24
+ const base64 = Buffer.from(screenshot).toString("base64");
25
+ return `data:image/png;base64,${base64.substring(0, 500)}... (${(screenshot.length / 1024).toFixed(1)}KB screenshot taken)`;
26
+ }
27
+ const browser = {
28
+ name: "browser",
29
+ description: "Automate a web browser. Actions: navigate, click, type, screenshot, extract. Use for web browsing, scraping, form filling.",
30
+ input_schema: {
31
+ type: "object",
32
+ properties: {
33
+ action: {
34
+ type: "string",
35
+ description: 'One of: "navigate", "click", "type", "screenshot", "extract"',
36
+ },
37
+ url: { type: "string", description: "URL to navigate to (for navigate action)." },
38
+ selector: { type: "string", description: "CSS selector for click/type actions." },
39
+ text: { type: "string", description: "Text to type (for type action)." },
40
+ query: { type: "string", description: "What to extract from the page (for extract action)." },
41
+ },
42
+ required: ["action"],
43
+ },
44
+ execute: async (input) => {
45
+ const action = input.action;
46
+ try {
47
+ const { page } = await getBrowser();
48
+ switch (action) {
49
+ case "navigate": {
50
+ const url = input.url;
51
+ if (!url)
52
+ return "Error: url is required for navigate action.";
53
+ await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
54
+ const title = await page.title();
55
+ return `Navigated to: ${title}\nURL: ${page.url()}`;
56
+ }
57
+ case "click": {
58
+ const selector = input.selector;
59
+ if (!selector)
60
+ return "Error: selector is required for click action.";
61
+ await page.click(selector, { timeout: 10000 });
62
+ return `Clicked: ${selector}`;
63
+ }
64
+ case "type": {
65
+ const selector = input.selector;
66
+ const text = input.text;
67
+ if (!selector || !text)
68
+ return "Error: selector and text are required for type action.";
69
+ await page.fill(selector, text);
70
+ return `Typed "${text}" into ${selector}`;
71
+ }
72
+ case "screenshot": {
73
+ const desc = await takeScreenshot();
74
+ return desc;
75
+ }
76
+ case "extract": {
77
+ const query = input.query || "all text";
78
+ const content = await page.evaluate((q) => {
79
+ const body = document.body;
80
+ if (q === "all text")
81
+ return body.innerText.substring(0, 10000);
82
+ const elements = document.querySelectorAll(q);
83
+ return Array.from(elements).map((el) => el.textContent).join("\n").substring(0, 10000);
84
+ }, query);
85
+ return content || "No content found.";
86
+ }
87
+ default:
88
+ return `Error: Unknown action "${action}". Use: navigate, click, type, screenshot, extract.`;
89
+ }
90
+ }
91
+ catch (err) {
92
+ return `Error: ${err.message}`;
93
+ }
94
+ },
95
+ };
96
+ export async function closeBrowser() {
97
+ if (browserInstance) {
98
+ await browserInstance.close();
99
+ browserInstance = null;
100
+ browserPage = null;
101
+ }
102
+ }
103
+ export default browser;
104
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Tool } from "./index.js";
2
+ declare const configTools: Tool[];
3
+ export default configTools;
4
+ //# sourceMappingURL=config-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-tools.d.ts","sourceRoot":"","sources":["../../src/tools/config-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,QAAA,MAAM,WAAW,EAAE,IAAI,EAgKtB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,154 @@
1
+ import { getConfig, setConfig, setConfigSecret, listConfigPaths, isSecretField, loadConfig } from "../config.js";
2
+ const configTools = [
3
+ {
4
+ name: "config_read",
5
+ description: "Read configuration values from config.json. Specify a path to read a specific value, or no path to read everything. Secrets (API keys, tokens) are automatically decrypted.",
6
+ input_schema: {
7
+ type: "object",
8
+ properties: {
9
+ path: {
10
+ type: "string",
11
+ description: "Dot-notation path to read (e.g., 'models.active', 'shell.allowlist'). If omitted, returns entire config.",
12
+ },
13
+ },
14
+ },
15
+ execute: async (input) => {
16
+ const path = input.path;
17
+ if (!path) {
18
+ const fullConfig = await getConfig();
19
+ return JSON.stringify(fullConfig, null, 2);
20
+ }
21
+ const value = await getConfig(path);
22
+ if (value === undefined) {
23
+ return `Config path '${path}' not found.`;
24
+ }
25
+ if (isSecretField(path) && typeof value === "string") {
26
+ return `[Secret] ${value}`;
27
+ }
28
+ return JSON.stringify(value, null, 2);
29
+ },
30
+ },
31
+ {
32
+ name: "config_write",
33
+ description: "Write a configuration value to config.json. For secret values (API keys, tokens), the value will be automatically encrypted. Use this to update settings, add API keys, or modify configuration.",
34
+ input_schema: {
35
+ type: "object",
36
+ properties: {
37
+ path: {
38
+ type: "string",
39
+ description: "Dot-notation path to write (e.g., 'models.active', 'shell.allowlist', 'features.maxAgentIterations')",
40
+ },
41
+ value: {
42
+ description: "The value to write. For secret fields (paths ending in apiKey, token, password), encryption is automatic.",
43
+ },
44
+ encrypt: {
45
+ type: "boolean",
46
+ description: "Set to true to encrypt the value (for secrets). Usually not needed as encryption is automatic for known secret paths.",
47
+ },
48
+ },
49
+ required: ["path", "value"],
50
+ },
51
+ execute: async (input) => {
52
+ const path = input.path;
53
+ const value = input.value;
54
+ const forceEncrypt = input.encrypt;
55
+ if (!path || !value) {
56
+ return "Error: path and value are required.";
57
+ }
58
+ try {
59
+ if (isSecretField(path) || forceEncrypt) {
60
+ await setConfigSecret(path, String(value));
61
+ return `✅ Secret saved and encrypted at '${path}'`;
62
+ }
63
+ await setConfig(path, value);
64
+ return `✅ Config updated at '${path}'`;
65
+ }
66
+ catch (error) {
67
+ const message = error instanceof Error ? error.message : String(error);
68
+ return `❌ Failed to write config: ${message}`;
69
+ }
70
+ },
71
+ },
72
+ {
73
+ name: "config_list",
74
+ description: "List all available configuration paths in config.json. Useful to discover what settings can be modified.",
75
+ input_schema: {
76
+ type: "object",
77
+ properties: {},
78
+ },
79
+ execute: async () => {
80
+ try {
81
+ const config = loadConfig();
82
+ const paths = listConfigPaths(config);
83
+ const categorized = {
84
+ models: [],
85
+ telegram: [],
86
+ shell: [],
87
+ webchat: [],
88
+ voice: [],
89
+ features: [],
90
+ };
91
+ for (const p of paths) {
92
+ const section = p.split(".")[0];
93
+ if (categorized[section]) {
94
+ categorized[section].push(p);
95
+ }
96
+ else {
97
+ categorized.models.push(p);
98
+ }
99
+ }
100
+ let output = "📋 Available config paths:\n\n";
101
+ for (const [section, paths] of Object.entries(categorized)) {
102
+ if (paths.length > 0) {
103
+ output += `### ${section}\n`;
104
+ for (const p of paths.sort()) {
105
+ const isSecret = isSecretField(p);
106
+ output += ` - ${p}${isSecret ? " 🔒" : ""}\n`;
107
+ }
108
+ output += "\n";
109
+ }
110
+ }
111
+ return output;
112
+ }
113
+ catch (error) {
114
+ const message = error instanceof Error ? error.message : String(error);
115
+ return `❌ Failed to list config paths: ${message}`;
116
+ }
117
+ },
118
+ },
119
+ {
120
+ name: "config_set_secret",
121
+ description: "Explicitly encrypt and store a secret value (API key, token, password). Use this for API keys that need to be stored securely.",
122
+ input_schema: {
123
+ type: "object",
124
+ properties: {
125
+ path: {
126
+ type: "string",
127
+ description: "Dot-notation path for the secret (e.g., 'models.providers.glm.apiKey')",
128
+ },
129
+ value: {
130
+ type: "string",
131
+ description: "The secret value to encrypt and store",
132
+ },
133
+ },
134
+ required: ["path", "value"],
135
+ },
136
+ execute: async (input) => {
137
+ const path = input.path;
138
+ const value = input.value;
139
+ if (!path || !value) {
140
+ return "Error: path and value are required.";
141
+ }
142
+ try {
143
+ await setConfigSecret(path, value);
144
+ return `✅ Secret encrypted and saved at '${path}'`;
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : String(error);
148
+ return `❌ Failed to save secret: ${message}`;
149
+ }
150
+ },
151
+ },
152
+ ];
153
+ export default configTools;
154
+ //# sourceMappingURL=config-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-tools.js","sourceRoot":"","sources":["../../src/tools/config-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Tool } from "./index.js";
2
+ export declare const fileTools: Tool[];
3
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/tools/files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA2MvC,eAAO,MAAM,SAAS,EAAE,IAAI,EAAwE,CAAC"}