wispy-ai 1.4.1 → 1.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 (273) hide show
  1. package/dist/agents/tool-executor.d.ts +11 -0
  2. package/dist/agents/tool-executor.d.ts.map +1 -1
  3. package/dist/agents/tool-executor.js +248 -10
  4. package/dist/agents/tool-executor.js.map +1 -1
  5. package/dist/ai/model-registry.d.ts +8 -2
  6. package/dist/ai/model-registry.d.ts.map +1 -1
  7. package/dist/ai/model-registry.js +60 -6
  8. package/dist/ai/model-registry.js.map +1 -1
  9. package/dist/ai/prompts.d.ts.map +1 -1
  10. package/dist/ai/prompts.js +32 -1
  11. package/dist/ai/prompts.js.map +1 -1
  12. package/dist/ai/providers/anthropic.d.ts +24 -0
  13. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  14. package/dist/ai/providers/anthropic.js +153 -0
  15. package/dist/ai/providers/anthropic.js.map +1 -0
  16. package/dist/ai/tools.d.ts.map +1 -1
  17. package/dist/ai/tools.js +79 -6
  18. package/dist/ai/tools.js.map +1 -1
  19. package/dist/channels/telegram/adapter.d.ts.map +1 -1
  20. package/dist/channels/telegram/adapter.js +74 -0
  21. package/dist/channels/telegram/adapter.js.map +1 -1
  22. package/dist/cli/commands.d.ts.map +1 -1
  23. package/dist/cli/commands.js +303 -5
  24. package/dist/cli/commands.js.map +1 -1
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +20 -0
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/setup/wizard.d.ts.map +1 -1
  29. package/dist/cli/setup/wizard.js +53 -9
  30. package/dist/cli/setup/wizard.js.map +1 -1
  31. package/dist/cli/tui/output-renderer.d.ts +2 -2
  32. package/dist/cli/tui/output-renderer.js +2 -2
  33. package/dist/cli/ui/banner.d.ts +1 -1
  34. package/dist/cli/ui/banner.d.ts.map +1 -1
  35. package/dist/cli/ui/banner.js +1 -1
  36. package/dist/cli/ui/banner.js.map +1 -1
  37. package/dist/config/schema.d.ts +3 -1
  38. package/dist/config/schema.d.ts.map +1 -1
  39. package/dist/config/schema.js +20 -1
  40. package/dist/config/schema.js.map +1 -1
  41. package/dist/integrations/ai-models/anthropic.d.ts +5 -3
  42. package/dist/integrations/ai-models/anthropic.d.ts.map +1 -1
  43. package/dist/integrations/ai-models/anthropic.js +58 -31
  44. package/dist/integrations/ai-models/anthropic.js.map +1 -1
  45. package/dist/integrations/ai-models/groq.d.ts +18 -0
  46. package/dist/integrations/ai-models/groq.d.ts.map +1 -0
  47. package/dist/integrations/ai-models/groq.js +109 -0
  48. package/dist/integrations/ai-models/groq.js.map +1 -0
  49. package/dist/integrations/ai-models/kimi.d.ts +18 -0
  50. package/dist/integrations/ai-models/kimi.d.ts.map +1 -0
  51. package/dist/integrations/ai-models/kimi.js +108 -0
  52. package/dist/integrations/ai-models/kimi.js.map +1 -0
  53. package/dist/integrations/ai-models/openrouter.d.ts +18 -0
  54. package/dist/integrations/ai-models/openrouter.d.ts.map +1 -0
  55. package/dist/integrations/ai-models/openrouter.js +115 -0
  56. package/dist/integrations/ai-models/openrouter.js.map +1 -0
  57. package/dist/integrations/browser-engine/automation/auth-manager.d.ts +24 -0
  58. package/dist/integrations/browser-engine/automation/auth-manager.d.ts.map +1 -0
  59. package/dist/integrations/browser-engine/automation/auth-manager.js +102 -0
  60. package/dist/integrations/browser-engine/automation/auth-manager.js.map +1 -0
  61. package/dist/integrations/browser-engine/automation/captcha-detector.d.ts +16 -0
  62. package/dist/integrations/browser-engine/automation/captcha-detector.d.ts.map +1 -0
  63. package/dist/integrations/browser-engine/automation/captcha-detector.js +83 -0
  64. package/dist/integrations/browser-engine/automation/captcha-detector.js.map +1 -0
  65. package/dist/integrations/browser-engine/automation/cookie-banner.d.ts +17 -0
  66. package/dist/integrations/browser-engine/automation/cookie-banner.d.ts.map +1 -0
  67. package/dist/integrations/browser-engine/automation/cookie-banner.js +93 -0
  68. package/dist/integrations/browser-engine/automation/cookie-banner.js.map +1 -0
  69. package/dist/integrations/browser-engine/automation/dialog-handler.d.ts +37 -0
  70. package/dist/integrations/browser-engine/automation/dialog-handler.d.ts.map +1 -0
  71. package/dist/integrations/browser-engine/automation/dialog-handler.js +92 -0
  72. package/dist/integrations/browser-engine/automation/dialog-handler.js.map +1 -0
  73. package/dist/integrations/browser-engine/automation/download-manager.d.ts +32 -0
  74. package/dist/integrations/browser-engine/automation/download-manager.d.ts.map +1 -0
  75. package/dist/integrations/browser-engine/automation/download-manager.js +96 -0
  76. package/dist/integrations/browser-engine/automation/download-manager.js.map +1 -0
  77. package/dist/integrations/browser-engine/automation/drag-drop.d.ts +24 -0
  78. package/dist/integrations/browser-engine/automation/drag-drop.d.ts.map +1 -0
  79. package/dist/integrations/browser-engine/automation/drag-drop.js +59 -0
  80. package/dist/integrations/browser-engine/automation/drag-drop.js.map +1 -0
  81. package/dist/integrations/browser-engine/automation/form-filler.d.ts +39 -0
  82. package/dist/integrations/browser-engine/automation/form-filler.d.ts.map +1 -0
  83. package/dist/integrations/browser-engine/automation/form-filler.js +185 -0
  84. package/dist/integrations/browser-engine/automation/form-filler.js.map +1 -0
  85. package/dist/integrations/browser-engine/automation/wait-strategies.d.ts +21 -0
  86. package/dist/integrations/browser-engine/automation/wait-strategies.d.ts.map +1 -0
  87. package/dist/integrations/browser-engine/automation/wait-strategies.js +73 -0
  88. package/dist/integrations/browser-engine/automation/wait-strategies.js.map +1 -0
  89. package/dist/integrations/browser-engine/automation/workflow-engine.d.ts +15 -0
  90. package/dist/integrations/browser-engine/automation/workflow-engine.d.ts.map +1 -0
  91. package/dist/integrations/browser-engine/automation/workflow-engine.js +403 -0
  92. package/dist/integrations/browser-engine/automation/workflow-engine.js.map +1 -0
  93. package/dist/integrations/browser-engine/config.d.ts +58 -0
  94. package/dist/integrations/browser-engine/config.d.ts.map +1 -0
  95. package/dist/integrations/browser-engine/config.js +75 -0
  96. package/dist/integrations/browser-engine/config.js.map +1 -0
  97. package/dist/integrations/browser-engine/core/history-navigator.d.ts +25 -0
  98. package/dist/integrations/browser-engine/core/history-navigator.d.ts.map +1 -0
  99. package/dist/integrations/browser-engine/core/history-navigator.js +68 -0
  100. package/dist/integrations/browser-engine/core/history-navigator.js.map +1 -0
  101. package/dist/integrations/browser-engine/core/network-monitor.d.ts +44 -0
  102. package/dist/integrations/browser-engine/core/network-monitor.d.ts.map +1 -0
  103. package/dist/integrations/browser-engine/core/network-monitor.js +145 -0
  104. package/dist/integrations/browser-engine/core/network-monitor.js.map +1 -0
  105. package/dist/integrations/browser-engine/core/page-monitor.d.ts +61 -0
  106. package/dist/integrations/browser-engine/core/page-monitor.d.ts.map +1 -0
  107. package/dist/integrations/browser-engine/core/page-monitor.js +111 -0
  108. package/dist/integrations/browser-engine/core/page-monitor.js.map +1 -0
  109. package/dist/integrations/browser-engine/core/page-search.d.ts +51 -0
  110. package/dist/integrations/browser-engine/core/page-search.d.ts.map +1 -0
  111. package/dist/integrations/browser-engine/core/page-search.js +146 -0
  112. package/dist/integrations/browser-engine/core/page-search.js.map +1 -0
  113. package/dist/integrations/browser-engine/core/proxy-manager.d.ts +31 -0
  114. package/dist/integrations/browser-engine/core/proxy-manager.d.ts.map +1 -0
  115. package/dist/integrations/browser-engine/core/proxy-manager.js +90 -0
  116. package/dist/integrations/browser-engine/core/proxy-manager.js.map +1 -0
  117. package/dist/integrations/browser-engine/core/retry-engine.d.ts +38 -0
  118. package/dist/integrations/browser-engine/core/retry-engine.d.ts.map +1 -0
  119. package/dist/integrations/browser-engine/core/retry-engine.js +117 -0
  120. package/dist/integrations/browser-engine/core/retry-engine.js.map +1 -0
  121. package/dist/integrations/browser-engine/core/session-manager.d.ts +45 -0
  122. package/dist/integrations/browser-engine/core/session-manager.d.ts.map +1 -0
  123. package/dist/integrations/browser-engine/core/session-manager.js +233 -0
  124. package/dist/integrations/browser-engine/core/session-manager.js.map +1 -0
  125. package/dist/integrations/browser-engine/core/stealth-engine.d.ts +19 -0
  126. package/dist/integrations/browser-engine/core/stealth-engine.d.ts.map +1 -0
  127. package/dist/integrations/browser-engine/core/stealth-engine.js +233 -0
  128. package/dist/integrations/browser-engine/core/stealth-engine.js.map +1 -0
  129. package/dist/integrations/browser-engine/core/tab-manager.d.ts +40 -0
  130. package/dist/integrations/browser-engine/core/tab-manager.d.ts.map +1 -0
  131. package/dist/integrations/browser-engine/core/tab-manager.js +94 -0
  132. package/dist/integrations/browser-engine/core/tab-manager.js.map +1 -0
  133. package/dist/integrations/browser-engine/extraction/dom-processor.d.ts +22 -0
  134. package/dist/integrations/browser-engine/extraction/dom-processor.d.ts.map +1 -0
  135. package/dist/integrations/browser-engine/extraction/dom-processor.js +197 -0
  136. package/dist/integrations/browser-engine/extraction/dom-processor.js.map +1 -0
  137. package/dist/integrations/browser-engine/extraction/element-finder.d.ts +53 -0
  138. package/dist/integrations/browser-engine/extraction/element-finder.d.ts.map +1 -0
  139. package/dist/integrations/browser-engine/extraction/element-finder.js +108 -0
  140. package/dist/integrations/browser-engine/extraction/element-finder.js.map +1 -0
  141. package/dist/integrations/browser-engine/extraction/iframe-processor.d.ts +69 -0
  142. package/dist/integrations/browser-engine/extraction/iframe-processor.d.ts.map +1 -0
  143. package/dist/integrations/browser-engine/extraction/iframe-processor.js +199 -0
  144. package/dist/integrations/browser-engine/extraction/iframe-processor.js.map +1 -0
  145. package/dist/integrations/browser-engine/extraction/media-extractor.d.ts +24 -0
  146. package/dist/integrations/browser-engine/extraction/media-extractor.d.ts.map +1 -0
  147. package/dist/integrations/browser-engine/extraction/media-extractor.js +108 -0
  148. package/dist/integrations/browser-engine/extraction/media-extractor.js.map +1 -0
  149. package/dist/integrations/browser-engine/extraction/schema-extractor.d.ts +34 -0
  150. package/dist/integrations/browser-engine/extraction/schema-extractor.d.ts.map +1 -0
  151. package/dist/integrations/browser-engine/extraction/schema-extractor.js +149 -0
  152. package/dist/integrations/browser-engine/extraction/schema-extractor.js.map +1 -0
  153. package/dist/integrations/browser-engine/extraction/table-extractor.d.ts +16 -0
  154. package/dist/integrations/browser-engine/extraction/table-extractor.d.ts.map +1 -0
  155. package/dist/integrations/browser-engine/extraction/table-extractor.js +87 -0
  156. package/dist/integrations/browser-engine/extraction/table-extractor.js.map +1 -0
  157. package/dist/integrations/browser-engine/index.d.ts +77 -0
  158. package/dist/integrations/browser-engine/index.d.ts.map +1 -0
  159. package/dist/integrations/browser-engine/index.js +1819 -0
  160. package/dist/integrations/browser-engine/index.js.map +1 -0
  161. package/dist/integrations/browser-engine/profiles/cookie-jar.d.ts +14 -0
  162. package/dist/integrations/browser-engine/profiles/cookie-jar.d.ts.map +1 -0
  163. package/dist/integrations/browser-engine/profiles/cookie-jar.js +82 -0
  164. package/dist/integrations/browser-engine/profiles/cookie-jar.js.map +1 -0
  165. package/dist/integrations/browser-engine/profiles/profile-store.d.ts +30 -0
  166. package/dist/integrations/browser-engine/profiles/profile-store.d.ts.map +1 -0
  167. package/dist/integrations/browser-engine/profiles/profile-store.js +101 -0
  168. package/dist/integrations/browser-engine/profiles/profile-store.js.map +1 -0
  169. package/dist/integrations/browser-engine/skills/built-in/developer/index.d.ts +6 -0
  170. package/dist/integrations/browser-engine/skills/built-in/developer/index.d.ts.map +1 -0
  171. package/dist/integrations/browser-engine/skills/built-in/developer/index.js +229 -0
  172. package/dist/integrations/browser-engine/skills/built-in/developer/index.js.map +1 -0
  173. package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.d.ts +6 -0
  174. package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.d.ts.map +1 -0
  175. package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.js +194 -0
  176. package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.js.map +1 -0
  177. package/dist/integrations/browser-engine/skills/built-in/financial/index.d.ts +6 -0
  178. package/dist/integrations/browser-engine/skills/built-in/financial/index.d.ts.map +1 -0
  179. package/dist/integrations/browser-engine/skills/built-in/financial/index.js +194 -0
  180. package/dist/integrations/browser-engine/skills/built-in/financial/index.js.map +1 -0
  181. package/dist/integrations/browser-engine/skills/built-in/jobs/index.d.ts +6 -0
  182. package/dist/integrations/browser-engine/skills/built-in/jobs/index.d.ts.map +1 -0
  183. package/dist/integrations/browser-engine/skills/built-in/jobs/index.js +132 -0
  184. package/dist/integrations/browser-engine/skills/built-in/jobs/index.js.map +1 -0
  185. package/dist/integrations/browser-engine/skills/built-in/news/index.d.ts +6 -0
  186. package/dist/integrations/browser-engine/skills/built-in/news/index.d.ts.map +1 -0
  187. package/dist/integrations/browser-engine/skills/built-in/news/index.js +183 -0
  188. package/dist/integrations/browser-engine/skills/built-in/news/index.js.map +1 -0
  189. package/dist/integrations/browser-engine/skills/built-in/productivity/index.d.ts +6 -0
  190. package/dist/integrations/browser-engine/skills/built-in/productivity/index.d.ts.map +1 -0
  191. package/dist/integrations/browser-engine/skills/built-in/productivity/index.js +115 -0
  192. package/dist/integrations/browser-engine/skills/built-in/productivity/index.js.map +1 -0
  193. package/dist/integrations/browser-engine/skills/built-in/search/index.d.ts +6 -0
  194. package/dist/integrations/browser-engine/skills/built-in/search/index.d.ts.map +1 -0
  195. package/dist/integrations/browser-engine/skills/built-in/search/index.js +156 -0
  196. package/dist/integrations/browser-engine/skills/built-in/search/index.js.map +1 -0
  197. package/dist/integrations/browser-engine/skills/built-in/social/index.d.ts +6 -0
  198. package/dist/integrations/browser-engine/skills/built-in/social/index.d.ts.map +1 -0
  199. package/dist/integrations/browser-engine/skills/built-in/social/index.js +217 -0
  200. package/dist/integrations/browser-engine/skills/built-in/social/index.js.map +1 -0
  201. package/dist/integrations/browser-engine/skills/built-in/travel/index.d.ts +6 -0
  202. package/dist/integrations/browser-engine/skills/built-in/travel/index.d.ts.map +1 -0
  203. package/dist/integrations/browser-engine/skills/built-in/travel/index.js +135 -0
  204. package/dist/integrations/browser-engine/skills/built-in/travel/index.js.map +1 -0
  205. package/dist/integrations/browser-engine/skills/built-in/utility/index.d.ts +6 -0
  206. package/dist/integrations/browser-engine/skills/built-in/utility/index.d.ts.map +1 -0
  207. package/dist/integrations/browser-engine/skills/built-in/utility/index.js +150 -0
  208. package/dist/integrations/browser-engine/skills/built-in/utility/index.js.map +1 -0
  209. package/dist/integrations/browser-engine/skills/executor.d.ts +10 -0
  210. package/dist/integrations/browser-engine/skills/executor.d.ts.map +1 -0
  211. package/dist/integrations/browser-engine/skills/executor.js +179 -0
  212. package/dist/integrations/browser-engine/skills/executor.js.map +1 -0
  213. package/dist/integrations/browser-engine/skills/registry.d.ts +24 -0
  214. package/dist/integrations/browser-engine/skills/registry.d.ts.map +1 -0
  215. package/dist/integrations/browser-engine/skills/registry.js +94 -0
  216. package/dist/integrations/browser-engine/skills/registry.js.map +1 -0
  217. package/dist/integrations/browser-engine/skills/skill-generator.d.ts +21 -0
  218. package/dist/integrations/browser-engine/skills/skill-generator.d.ts.map +1 -0
  219. package/dist/integrations/browser-engine/skills/skill-generator.js +205 -0
  220. package/dist/integrations/browser-engine/skills/skill-generator.js.map +1 -0
  221. package/dist/integrations/browser-engine/skills/skill-store.d.ts +24 -0
  222. package/dist/integrations/browser-engine/skills/skill-store.d.ts.map +1 -0
  223. package/dist/integrations/browser-engine/skills/skill-store.js +86 -0
  224. package/dist/integrations/browser-engine/skills/skill-store.js.map +1 -0
  225. package/dist/integrations/browser-engine/skills/types.d.ts +61 -0
  226. package/dist/integrations/browser-engine/skills/types.d.ts.map +1 -0
  227. package/dist/integrations/browser-engine/skills/types.js +8 -0
  228. package/dist/integrations/browser-engine/skills/types.js.map +1 -0
  229. package/dist/integrations/browser-engine/types.d.ts +260 -0
  230. package/dist/integrations/browser-engine/types.d.ts.map +1 -0
  231. package/dist/integrations/browser-engine/types.js +5 -0
  232. package/dist/integrations/browser-engine/types.js.map +1 -0
  233. package/dist/integrations/loader.js +8 -0
  234. package/dist/integrations/loader.js.map +1 -1
  235. package/dist/integrations/social/zoho-email.d.ts +25 -0
  236. package/dist/integrations/social/zoho-email.d.ts.map +1 -0
  237. package/dist/integrations/social/zoho-email.js +208 -0
  238. package/dist/integrations/social/zoho-email.js.map +1 -0
  239. package/dist/security/action-guard.d.ts.map +1 -1
  240. package/dist/security/action-guard.js +2 -0
  241. package/dist/security/action-guard.js.map +1 -1
  242. package/dist/security/input-sanitizer.d.ts +41 -0
  243. package/dist/security/input-sanitizer.d.ts.map +1 -0
  244. package/dist/security/input-sanitizer.js +138 -0
  245. package/dist/security/input-sanitizer.js.map +1 -0
  246. package/dist/vision/live-stream.d.ts +50 -0
  247. package/dist/vision/live-stream.d.ts.map +1 -0
  248. package/dist/vision/live-stream.js +129 -0
  249. package/dist/vision/live-stream.js.map +1 -0
  250. package/dist/vision/webcam.d.ts +43 -0
  251. package/dist/vision/webcam.d.ts.map +1 -0
  252. package/dist/vision/webcam.js +259 -0
  253. package/dist/vision/webcam.js.map +1 -0
  254. package/dist/wallet/explorer.d.ts.map +1 -1
  255. package/dist/wallet/explorer.js +9 -1
  256. package/dist/wallet/explorer.js.map +1 -1
  257. package/dist/wallet/solana.d.ts +48 -0
  258. package/dist/wallet/solana.d.ts.map +1 -0
  259. package/dist/wallet/solana.js +126 -0
  260. package/dist/wallet/solana.js.map +1 -0
  261. package/dist/wallet/x402.d.ts +11 -0
  262. package/dist/wallet/x402.d.ts.map +1 -1
  263. package/dist/wallet/x402.js +38 -1
  264. package/dist/wallet/x402.js.map +1 -1
  265. package/package.json +1 -1
  266. package/wispy/skills/shadcn-ui/SKILL.md +170 -170
  267. package/wispy/skills/tabler-icons/SKILL.md +141 -141
  268. package/wispy/memory/2026-01-29.md +0 -35
  269. package/wispy/memory/2026-01-30.md +0 -4
  270. package/wispy/memory/2026-02-03.md +0 -41
  271. package/wispy/memory/2026-02-04.md +0 -46
  272. package/wispy/memory/2026-02-05.md +0 -48
  273. package/wispy/memory/2026-02-06.md +0 -15
@@ -29,7 +29,12 @@ export declare class ToolExecutor {
29
29
  private cronService?;
30
30
  private reminderService?;
31
31
  private progressCallback?;
32
+ private liveStream?;
32
33
  constructor(config: WispyConfig, runtimeDir: string, soulDir: string, memoryManager?: MemoryManager, integrationRegistry?: IntegrationRegistry, mcpRegistry?: McpRegistry);
34
+ /**
35
+ * Check if a file path is allowed based on filesystem access settings.
36
+ */
37
+ private isPathAllowed;
33
38
  /**
34
39
  * Set callback for progress notifications (used by Telegram visuals)
35
40
  */
@@ -145,6 +150,7 @@ export declare class ToolExecutor {
145
150
  private executeResearchReport;
146
151
  private executeGenerateX402Report;
147
152
  private executeSendDocumentToTelegram;
153
+ private executeTelegramListFiles;
148
154
  private executeSendProgressUpdate;
149
155
  private executeAskUserConfirmation;
150
156
  private executeFilePermissions;
@@ -160,6 +166,11 @@ export declare class ToolExecutor {
160
166
  private executeRealisticVoiceReply;
161
167
  private executeDesktopScreenshot;
162
168
  private executeScreenRecord;
169
+ private executeWebcamCapture;
170
+ private executeWebcamRecord;
171
+ private executeWebcamListDevices;
172
+ private executeWebcamLiveStart;
173
+ private executeWebcamLiveStop;
163
174
  private executeGitInit;
164
175
  private executeGitCommit;
165
176
  private executeGitPush;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agents/tool-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agents/tool-executor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2CD,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE;IACrC,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAC;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAsD;gBAGvE,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,aAAa,EAC7B,mBAAmB,CAAC,EAAE,mBAAmB,EACzC,WAAW,CAAC,EAAE,WAAW;IAU3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrD;;OAEG;YACW,YAAY;IAU1B;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAI9C;;OAEG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAIpD,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;YAgQpC,WAAW;IA0EzB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAyDlC,OAAO,CAAC,eAAe;YAoBT,gBAAgB;IA+C9B,OAAO,CAAC,iBAAiB;YA6BX,mBAAmB;IAiBjC,OAAO,CAAC,iBAAiB;YAUX,eAAe;YA0Cf,gBAAgB;YAkBhB,oBAAoB;YA4EpB,4BAA4B;YAsC5B,2BAA2B;IAkGzC,OAAO,CAAC,kBAAkB,CAAC,CAAsH;IAE1I,cAAc,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE;YAIhI,sBAAsB;YA+CtB,kBAAkB;IAchC,OAAO,CAAC,mBAAmB;IAsC3B,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,aAAa,CAAC,CAAwD;IAE9E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIvF;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,eAAe,IAAI,MAAM;YAIX,iBAAiB;IAmE/B,OAAO,CAAC,mBAAmB;YAsBb,mBAAmB;YAyBnB,gBAAgB;YAwBhB,oBAAoB;YA6DpB,gBAAgB;YAoGhB,qBAAqB;YAmFrB,oBAAoB;IAiDlC,OAAO,CAAC,oBAAoB;YAad,mBAAmB;YA4BnB,iBAAiB;YA+BjB,eAAe;YAuBf,eAAe;YAgBf,qBAAqB;IAyInC;;OAEG;YACW,sBAAsB;YAwBtB,sBAAsB;YAmBtB,mBAAmB;YAmBnB,kBAAkB;YAoBlB,wBAAwB;YAcxB,sBAAsB;YAqBtB,oBAAoB;YAcpB,kBAAkB;YAkBlB,oBAAoB;YAkBpB,sBAAsB;YAqBtB,mBAAmB;YAgCnB,uBAAuB;YAsBvB,gBAAgB;YA6BhB,kBAAkB;YAyBlB,sBAAsB;YAwBtB,wBAAwB;YA4BxB,sBAAsB;YA6BtB,oBAAoB;YAoCpB,kBAAkB;YAsBlB,kBAAkB;YA6BlB,wBAAwB;YA4BxB,kBAAkB;YAyDlB,gBAAgB;YA+BhB,oBAAoB;IAuGlC,OAAO,CAAC,qBAAqB;IAyf7B,OAAO,CAAC,sBAAsB;YA+EhB,qBAAqB;YAiDrB,mBAAmB;YAiEnB,mBAAmB;YAsGnB,qBAAqB;YAsCrB,oBAAoB;YAuCpB,wBAAwB;YAsCxB,oBAAoB;YAsCpB,mBAAmB;YAuBnB,qBAAqB;YA0CrB,yBAAyB;YA6DzB,6BAA6B;YAyD7B,wBAAwB;YAuCxB,yBAAyB;YAmCzB,0BAA0B;YAqC1B,sBAAsB;YA8CtB,eAAe;YAiCf,iBAAiB;YAoCjB,sBAAsB;YAgDtB,2BAA2B;YA+D3B,wBAAwB;YAuDxB,wBAAwB;YA0DxB,sBAAsB;YA4CtB,wBAAwB;YAgDxB,kCAAkC;YAiElC,0BAA0B;YA0E1B,wBAAwB;YA8GxB,mBAAmB;YAmGnB,oBAAoB;YAiCpB,mBAAmB;YAqCnB,wBAAwB;YAkCxB,sBAAsB;YA2DtB,qBAAqB;YAoBrB,cAAc;YAwCd,gBAAgB;YAuChB,cAAc;YAgEd,gBAAgB;YAgChB,mBAAmB;YAuDnB,iBAAiB;YAoCjB,iBAAiB;YAmCjB,aAAa;YAmDb,gBAAgB;YAwEhB,gBAAgB;YA4DhB,mBAAmB;CA8ClC"}
@@ -58,6 +58,7 @@ export class ToolExecutor {
58
58
  cronService;
59
59
  reminderService;
60
60
  progressCallback;
61
+ liveStream;
61
62
  constructor(config, runtimeDir, soulDir, memoryManager, integrationRegistry, mcpRegistry) {
62
63
  this.config = config;
63
64
  this.runtimeDir = runtimeDir;
@@ -66,6 +67,22 @@ export class ToolExecutor {
66
67
  this.integrationRegistry = integrationRegistry;
67
68
  this.mcpRegistry = mcpRegistry;
68
69
  }
70
+ /**
71
+ * Check if a file path is allowed based on filesystem access settings.
72
+ */
73
+ isPathAllowed(filePath) {
74
+ // Always allow runtime and soul directories
75
+ if (filePath.startsWith(this.runtimeDir) || filePath.startsWith(this.soulDir))
76
+ return true;
77
+ // Autonomous mode or full filesystem access: allow all
78
+ if (this.config.security.autonomousMode || this.config.security.fullFilesystemAccess)
79
+ return true;
80
+ // Standard mode: restrict to workspace
81
+ const workspaceDir = resolve(this.runtimeDir, "workspace");
82
+ if (filePath.startsWith(workspaceDir))
83
+ return true;
84
+ return false;
85
+ }
69
86
  /**
70
87
  * Set callback for progress notifications (used by Telegram visuals)
71
88
  */
@@ -242,6 +259,8 @@ export class ToolExecutor {
242
259
  // === Telegram Document Delivery ===
243
260
  case "send_document_to_telegram":
244
261
  return this.executeSendDocumentToTelegram(tool.args);
262
+ case "telegram_list_files":
263
+ return this.executeTelegramListFiles(tool.args);
245
264
  case "send_progress_update":
246
265
  return this.executeSendProgressUpdate(tool.args);
247
266
  case "ask_user_confirmation":
@@ -276,6 +295,17 @@ export class ToolExecutor {
276
295
  return this.executeDesktopScreenshot(tool.args);
277
296
  case "screen_record":
278
297
  return this.executeScreenRecord(tool.args);
298
+ // === Webcam & Live Vision ===
299
+ case "webcam_capture":
300
+ return this.executeWebcamCapture(tool.args);
301
+ case "webcam_record":
302
+ return this.executeWebcamRecord(tool.args);
303
+ case "webcam_list_devices":
304
+ return this.executeWebcamListDevices();
305
+ case "webcam_live_start":
306
+ return this.executeWebcamLiveStart(tool.args);
307
+ case "webcam_live_stop":
308
+ return this.executeWebcamLiveStop();
279
309
  // === Git & GitHub ===
280
310
  case "git_init":
281
311
  return this.executeGitInit(tool.args);
@@ -363,14 +393,22 @@ export class ToolExecutor {
363
393
  }
364
394
  }
365
395
  try {
366
- // Use workspace directory as cwd for relative commands
367
- const { join } = await import("path");
368
- const workspaceDir = join(this.runtimeDir, "workspace");
369
- ensureDir(workspaceDir);
396
+ // Determine working directory: explicit cwd arg, or fallback to workspace
397
+ const { join, isAbsolute } = await import("path");
398
+ const customCwd = args.cwd ? String(args.cwd) : "";
399
+ let effectiveCwd;
400
+ if (customCwd && isAbsolute(customCwd) && existsSync(customCwd)) {
401
+ effectiveCwd = customCwd;
402
+ }
403
+ else {
404
+ const workspaceDir = join(this.runtimeDir, "workspace");
405
+ ensureDir(workspaceDir);
406
+ effectiveCwd = workspaceDir;
407
+ }
370
408
  const { stdout, stderr } = await execAsync(command, {
371
409
  timeout: 180000, // 3 minutes for npm operations
372
410
  maxBuffer: 10 * 1024 * 1024, // 10MB for large outputs
373
- cwd: workspaceDir, // Run commands in workspace
411
+ cwd: effectiveCwd,
374
412
  env: { ...process.env },
375
413
  });
376
414
  const combined = stdout + (stderr ? `\nSTDERR: ${stderr}` : "");
@@ -449,6 +487,9 @@ export class ToolExecutor {
449
487
  const path = String(args.path || "");
450
488
  if (!path)
451
489
  return { success: false, output: "", error: "No path provided" };
490
+ if (!this.isPathAllowed(resolve(path))) {
491
+ return { success: false, output: "", error: `Access denied: ${path}\nEnable full filesystem access with: /setup or set security.fullFilesystemAccess in config.` };
492
+ }
452
493
  if (!existsSync(path))
453
494
  return { success: false, output: "", error: `File not found: ${path}` };
454
495
  try {
@@ -476,6 +517,9 @@ export class ToolExecutor {
476
517
  ensureDir(workspaceDir);
477
518
  path = resolvePath(workspaceDir, path);
478
519
  }
520
+ if (!this.isPathAllowed(path)) {
521
+ return { success: false, output: "", error: `Access denied: ${path}\nEnable full filesystem access with: /setup or set security.fullFilesystemAccess in config.` };
522
+ }
479
523
  // Create checkpoint before overwrite
480
524
  if (existsSync(path)) {
481
525
  try {
@@ -498,11 +542,10 @@ export class ToolExecutor {
498
542
  catch (err) {
499
543
  // Handle permission errors with helpful message
500
544
  if (err.code === "EPERM" || err.code === "EACCES") {
501
- const workspaceDir = join(this.runtimeDir, "workspace");
502
545
  return {
503
546
  success: false,
504
547
  output: "",
505
- error: `Permission denied: ${path}\n\nI don't have write access to this location. Try using a relative path (e.g., "calculator/index.html") and I'll create it in my workspace: ${workspaceDir}`,
548
+ error: `Permission denied: ${path}\n\nI don't have write access to this location. Try a different directory, or check folder permissions.`,
506
549
  };
507
550
  }
508
551
  return { success: false, output: "", error: err.message };
@@ -1410,11 +1453,10 @@ export class ToolExecutor {
1410
1453
  catch (err) {
1411
1454
  // Handle permission errors with helpful message
1412
1455
  if (err.code === "EPERM" || err.code === "EACCES") {
1413
- const workspaceDir = join(this.runtimeDir, "workspace");
1414
1456
  return {
1415
1457
  success: false,
1416
1458
  output: "",
1417
- error: `Permission denied: ${path}\n\nTry using a relative path (e.g., "my-project") and I'll create it in my workspace: ${workspaceDir}`,
1459
+ error: `Permission denied: ${path}\n\nI don't have access to this location. Try a different directory, or check folder permissions.`,
1418
1460
  };
1419
1461
  }
1420
1462
  return { success: false, output: "", error: err.message };
@@ -3295,6 +3337,40 @@ export default ${componentName};
3295
3337
  return { success: false, output: "", error: `Send document error: ${err.message}` };
3296
3338
  }
3297
3339
  }
3340
+ async executeTelegramListFiles(args) {
3341
+ try {
3342
+ const { homedir } = await import("os");
3343
+ const { join, basename } = await import("path");
3344
+ const targetDir = String(args.directory || join(homedir(), "Downloads"));
3345
+ if (!existsSync(targetDir)) {
3346
+ return { success: false, output: "", error: `Directory not found: ${targetDir}` };
3347
+ }
3348
+ const entries = readdirSync(targetDir, { withFileTypes: true })
3349
+ .slice(0, 50)
3350
+ .map((e) => {
3351
+ const icon = e.isDirectory() ? "[DIR]" : "[FILE]";
3352
+ return `${icon} ${e.name}`;
3353
+ });
3354
+ const listing = `Directory: ${targetDir}\n\n${entries.join("\n") || "(empty)"}`;
3355
+ // If sendFile is specified, also send that file as attachment
3356
+ const sendFile = args.sendFile ? String(args.sendFile) : "";
3357
+ if (sendFile && existsSync(sendFile)) {
3358
+ const chatId = this.currentChatContext?.chatId
3359
+ || process.env.TELEGRAM_CHAT_ID;
3360
+ if (chatId) {
3361
+ try {
3362
+ const { sendTelegramDocument } = await import("../channels/telegram/adapter.js");
3363
+ await sendTelegramDocument(chatId, sendFile, basename(sendFile));
3364
+ }
3365
+ catch { /* non-fatal */ }
3366
+ }
3367
+ }
3368
+ return { success: true, output: listing };
3369
+ }
3370
+ catch (err) {
3371
+ return { success: false, output: "", error: `List files error: ${err.message}` };
3372
+ }
3373
+ }
3298
3374
  async executeSendProgressUpdate(args) {
3299
3375
  const type = String(args.type || "update");
3300
3376
  const message = String(args.message || "");
@@ -3392,7 +3468,7 @@ export default ${componentName};
3392
3468
  // For grant actions, we just report what would happen (actual chmod is too dangerous)
3393
3469
  return {
3394
3470
  success: true,
3395
- output: `Permission action '${action}' noted. In sandboxed mode, use workspace directory for full access: ${resolve(this.runtimeDir, "workspace")}`,
3471
+ output: `Permission action '${action}' noted. Use file_write with an absolute path to write files anywhere you have access.`,
3396
3472
  };
3397
3473
  }
3398
3474
  catch (err) {
@@ -4019,6 +4095,168 @@ ${newTaskContext}
4019
4095
  }
4020
4096
  }
4021
4097
  // ═══════════════════════════════════════════════════════════════════════════════
4098
+ // WEBCAM & LIVE VISION TOOLS
4099
+ // ═══════════════════════════════════════════════════════════════════════════════
4100
+ async executeWebcamCapture(args) {
4101
+ try {
4102
+ const { captureFrame } = await import("../vision/webcam.js");
4103
+ const outputDir = resolve(this.runtimeDir, "captures");
4104
+ const framePath = captureFrame({
4105
+ device: args.device ? String(args.device) : undefined,
4106
+ width: args.width ? Number(args.width) : undefined,
4107
+ height: args.height ? Number(args.height) : undefined,
4108
+ outputDir,
4109
+ });
4110
+ // Send to chat if requested
4111
+ if (args.sendToChat && this.currentChatContext?.chatId) {
4112
+ try {
4113
+ const { sendDocument } = await import("../documents/telegram-delivery.js");
4114
+ await sendDocument(this.currentChatContext.chatId, framePath, {
4115
+ caption: "Webcam capture",
4116
+ });
4117
+ }
4118
+ catch (sendErr) {
4119
+ log.warn("Failed to send webcam capture to chat: %s", sendErr.message);
4120
+ }
4121
+ }
4122
+ return {
4123
+ success: true,
4124
+ output: `Webcam frame captured!\nPath: ${framePath}${args.sendToChat ? "\nSent to Telegram: Yes" : ""}`,
4125
+ };
4126
+ }
4127
+ catch (err) {
4128
+ return { success: false, output: "", error: `Webcam capture failed: ${err.message}` };
4129
+ }
4130
+ }
4131
+ async executeWebcamRecord(args) {
4132
+ try {
4133
+ const { recordVideo } = await import("../vision/webcam.js");
4134
+ const outputDir = resolve(this.runtimeDir, "captures");
4135
+ const videoPath = recordVideo({
4136
+ device: args.device ? String(args.device) : undefined,
4137
+ duration: args.duration ? Number(args.duration) : undefined,
4138
+ fps: args.fps ? Number(args.fps) : undefined,
4139
+ outputDir,
4140
+ });
4141
+ const { statSync } = await import("fs");
4142
+ const stats = statSync(videoPath);
4143
+ const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
4144
+ // Send to chat if requested
4145
+ if (args.sendToChat && this.currentChatContext?.chatId) {
4146
+ try {
4147
+ const { sendDocument } = await import("../documents/telegram-delivery.js");
4148
+ await sendDocument(this.currentChatContext.chatId, videoPath, {
4149
+ caption: `Webcam recording (${args.duration || 10}s)`,
4150
+ });
4151
+ }
4152
+ catch (sendErr) {
4153
+ log.warn("Failed to send webcam video to chat: %s", sendErr.message);
4154
+ }
4155
+ }
4156
+ return {
4157
+ success: true,
4158
+ output: `Webcam video recorded!\nPath: ${videoPath}\nDuration: ${args.duration || 10}s\nSize: ${sizeMB} MB${args.sendToChat ? "\nSent to Telegram: Yes" : ""}`,
4159
+ };
4160
+ }
4161
+ catch (err) {
4162
+ return { success: false, output: "", error: `Webcam recording failed: ${err.message}` };
4163
+ }
4164
+ }
4165
+ async executeWebcamListDevices() {
4166
+ try {
4167
+ const { listDevices, isFfmpegAvailable } = await import("../vision/webcam.js");
4168
+ if (!isFfmpegAvailable()) {
4169
+ return {
4170
+ success: false,
4171
+ output: "",
4172
+ error: "FFmpeg not found. Install FFmpeg to use webcam features: https://ffmpeg.org/download.html",
4173
+ };
4174
+ }
4175
+ const devices = listDevices();
4176
+ if (devices.length === 0) {
4177
+ return {
4178
+ success: true,
4179
+ output: "No video capture devices found. Make sure a webcam is connected.",
4180
+ };
4181
+ }
4182
+ const lines = devices.map((d, i) => `${i + 1}. ${d.name} (ID: ${d.id}, Type: ${d.type})`);
4183
+ return {
4184
+ success: true,
4185
+ output: `Found ${devices.length} video device(s):\n${lines.join("\n")}`,
4186
+ };
4187
+ }
4188
+ catch (err) {
4189
+ return { success: false, output: "", error: `Device listing failed: ${err.message}` };
4190
+ }
4191
+ }
4192
+ async executeWebcamLiveStart(args) {
4193
+ try {
4194
+ // Check if already running
4195
+ if (this.liveStream?.getStatus().running) {
4196
+ return {
4197
+ success: false,
4198
+ output: "",
4199
+ error: "A live stream is already running. Call webcam_live_stop first.",
4200
+ };
4201
+ }
4202
+ const { LiveVisionStream } = await import("../vision/live-stream.js");
4203
+ this.liveStream = new LiveVisionStream();
4204
+ const intervalMs = args.intervalMs ? Number(args.intervalMs) : 2000;
4205
+ const maxFrames = args.maxFrames ? Number(args.maxFrames) : 30;
4206
+ const prompt = args.prompt ? String(args.prompt) : undefined;
4207
+ const device = args.device ? String(args.device) : undefined;
4208
+ const outputDir = resolve(this.runtimeDir, "captures");
4209
+ // Start the stream -- onFrame sends analysis to chat or logs it
4210
+ const chatCtx = this.currentChatContext;
4211
+ await this.liveStream.start({
4212
+ device,
4213
+ intervalMs,
4214
+ maxFrames,
4215
+ prompt,
4216
+ outputDir,
4217
+ onFrame: async (analysis, frameIndex) => {
4218
+ const msg = `[Frame ${frameIndex}] ${analysis}`;
4219
+ log.info(msg);
4220
+ // Send to Telegram if available
4221
+ if (chatCtx?.chatId) {
4222
+ try {
4223
+ const { sendDocument } = await import("../documents/telegram-delivery.js");
4224
+ // Use Telegram bot API to send text message
4225
+ const token = process.env.TELEGRAM_BOT_TOKEN;
4226
+ if (token) {
4227
+ await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
4228
+ method: "POST",
4229
+ headers: { "Content-Type": "application/json" },
4230
+ body: JSON.stringify({ chat_id: chatCtx.chatId, text: msg }),
4231
+ });
4232
+ }
4233
+ }
4234
+ catch { /* best-effort */ }
4235
+ }
4236
+ },
4237
+ });
4238
+ return {
4239
+ success: true,
4240
+ output: `Live vision stream started!\nInterval: ${intervalMs}ms\nMax frames: ${maxFrames}\nPrompt: ${prompt || "Describe what you see"}\nDevice: ${device || "default"}`,
4241
+ };
4242
+ }
4243
+ catch (err) {
4244
+ return { success: false, output: "", error: `Live stream failed: ${err.message}` };
4245
+ }
4246
+ }
4247
+ async executeWebcamLiveStop() {
4248
+ if (!this.liveStream) {
4249
+ return { success: false, output: "", error: "No live stream is running." };
4250
+ }
4251
+ const status = this.liveStream.getStatus();
4252
+ this.liveStream.stop();
4253
+ const elapsed = status.startedAt ? Math.round((Date.now() - status.startedAt) / 1000) : 0;
4254
+ return {
4255
+ success: true,
4256
+ output: `Live stream stopped.\nFrames analyzed: ${status.framesAnalyzed}\nDuration: ${elapsed}s\nLast analysis: ${status.lastAnalysis || "N/A"}`,
4257
+ };
4258
+ }
4259
+ // ═══════════════════════════════════════════════════════════════════════════════
4022
4260
  // GIT & GITHUB TOOLS
4023
4261
  // ═══════════════════════════════════════════════════════════════════════════════
4024
4262
  async executeGitInit(args) {