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.
- package/dist/agents/tool-executor.d.ts +11 -0
- package/dist/agents/tool-executor.d.ts.map +1 -1
- package/dist/agents/tool-executor.js +248 -10
- package/dist/agents/tool-executor.js.map +1 -1
- package/dist/ai/model-registry.d.ts +8 -2
- package/dist/ai/model-registry.d.ts.map +1 -1
- package/dist/ai/model-registry.js +60 -6
- package/dist/ai/model-registry.js.map +1 -1
- package/dist/ai/prompts.d.ts.map +1 -1
- package/dist/ai/prompts.js +32 -1
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/providers/anthropic.d.ts +24 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +153 -0
- package/dist/ai/providers/anthropic.js.map +1 -0
- package/dist/ai/tools.d.ts.map +1 -1
- package/dist/ai/tools.js +79 -6
- package/dist/ai/tools.js.map +1 -1
- package/dist/channels/telegram/adapter.d.ts.map +1 -1
- package/dist/channels/telegram/adapter.js +74 -0
- package/dist/channels/telegram/adapter.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +303 -5
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +20 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/setup/wizard.d.ts.map +1 -1
- package/dist/cli/setup/wizard.js +53 -9
- package/dist/cli/setup/wizard.js.map +1 -1
- package/dist/cli/tui/output-renderer.d.ts +2 -2
- package/dist/cli/tui/output-renderer.js +2 -2
- package/dist/cli/ui/banner.d.ts +1 -1
- package/dist/cli/ui/banner.d.ts.map +1 -1
- package/dist/cli/ui/banner.js +1 -1
- package/dist/cli/ui/banner.js.map +1 -1
- package/dist/config/schema.d.ts +3 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +20 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/integrations/ai-models/anthropic.d.ts +5 -3
- package/dist/integrations/ai-models/anthropic.d.ts.map +1 -1
- package/dist/integrations/ai-models/anthropic.js +58 -31
- package/dist/integrations/ai-models/anthropic.js.map +1 -1
- package/dist/integrations/ai-models/groq.d.ts +18 -0
- package/dist/integrations/ai-models/groq.d.ts.map +1 -0
- package/dist/integrations/ai-models/groq.js +109 -0
- package/dist/integrations/ai-models/groq.js.map +1 -0
- package/dist/integrations/ai-models/kimi.d.ts +18 -0
- package/dist/integrations/ai-models/kimi.d.ts.map +1 -0
- package/dist/integrations/ai-models/kimi.js +108 -0
- package/dist/integrations/ai-models/kimi.js.map +1 -0
- package/dist/integrations/ai-models/openrouter.d.ts +18 -0
- package/dist/integrations/ai-models/openrouter.d.ts.map +1 -0
- package/dist/integrations/ai-models/openrouter.js +115 -0
- package/dist/integrations/ai-models/openrouter.js.map +1 -0
- package/dist/integrations/browser-engine/automation/auth-manager.d.ts +24 -0
- package/dist/integrations/browser-engine/automation/auth-manager.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/auth-manager.js +102 -0
- package/dist/integrations/browser-engine/automation/auth-manager.js.map +1 -0
- package/dist/integrations/browser-engine/automation/captcha-detector.d.ts +16 -0
- package/dist/integrations/browser-engine/automation/captcha-detector.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/captcha-detector.js +83 -0
- package/dist/integrations/browser-engine/automation/captcha-detector.js.map +1 -0
- package/dist/integrations/browser-engine/automation/cookie-banner.d.ts +17 -0
- package/dist/integrations/browser-engine/automation/cookie-banner.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/cookie-banner.js +93 -0
- package/dist/integrations/browser-engine/automation/cookie-banner.js.map +1 -0
- package/dist/integrations/browser-engine/automation/dialog-handler.d.ts +37 -0
- package/dist/integrations/browser-engine/automation/dialog-handler.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/dialog-handler.js +92 -0
- package/dist/integrations/browser-engine/automation/dialog-handler.js.map +1 -0
- package/dist/integrations/browser-engine/automation/download-manager.d.ts +32 -0
- package/dist/integrations/browser-engine/automation/download-manager.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/download-manager.js +96 -0
- package/dist/integrations/browser-engine/automation/download-manager.js.map +1 -0
- package/dist/integrations/browser-engine/automation/drag-drop.d.ts +24 -0
- package/dist/integrations/browser-engine/automation/drag-drop.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/drag-drop.js +59 -0
- package/dist/integrations/browser-engine/automation/drag-drop.js.map +1 -0
- package/dist/integrations/browser-engine/automation/form-filler.d.ts +39 -0
- package/dist/integrations/browser-engine/automation/form-filler.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/form-filler.js +185 -0
- package/dist/integrations/browser-engine/automation/form-filler.js.map +1 -0
- package/dist/integrations/browser-engine/automation/wait-strategies.d.ts +21 -0
- package/dist/integrations/browser-engine/automation/wait-strategies.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/wait-strategies.js +73 -0
- package/dist/integrations/browser-engine/automation/wait-strategies.js.map +1 -0
- package/dist/integrations/browser-engine/automation/workflow-engine.d.ts +15 -0
- package/dist/integrations/browser-engine/automation/workflow-engine.d.ts.map +1 -0
- package/dist/integrations/browser-engine/automation/workflow-engine.js +403 -0
- package/dist/integrations/browser-engine/automation/workflow-engine.js.map +1 -0
- package/dist/integrations/browser-engine/config.d.ts +58 -0
- package/dist/integrations/browser-engine/config.d.ts.map +1 -0
- package/dist/integrations/browser-engine/config.js +75 -0
- package/dist/integrations/browser-engine/config.js.map +1 -0
- package/dist/integrations/browser-engine/core/history-navigator.d.ts +25 -0
- package/dist/integrations/browser-engine/core/history-navigator.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/history-navigator.js +68 -0
- package/dist/integrations/browser-engine/core/history-navigator.js.map +1 -0
- package/dist/integrations/browser-engine/core/network-monitor.d.ts +44 -0
- package/dist/integrations/browser-engine/core/network-monitor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/network-monitor.js +145 -0
- package/dist/integrations/browser-engine/core/network-monitor.js.map +1 -0
- package/dist/integrations/browser-engine/core/page-monitor.d.ts +61 -0
- package/dist/integrations/browser-engine/core/page-monitor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/page-monitor.js +111 -0
- package/dist/integrations/browser-engine/core/page-monitor.js.map +1 -0
- package/dist/integrations/browser-engine/core/page-search.d.ts +51 -0
- package/dist/integrations/browser-engine/core/page-search.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/page-search.js +146 -0
- package/dist/integrations/browser-engine/core/page-search.js.map +1 -0
- package/dist/integrations/browser-engine/core/proxy-manager.d.ts +31 -0
- package/dist/integrations/browser-engine/core/proxy-manager.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/proxy-manager.js +90 -0
- package/dist/integrations/browser-engine/core/proxy-manager.js.map +1 -0
- package/dist/integrations/browser-engine/core/retry-engine.d.ts +38 -0
- package/dist/integrations/browser-engine/core/retry-engine.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/retry-engine.js +117 -0
- package/dist/integrations/browser-engine/core/retry-engine.js.map +1 -0
- package/dist/integrations/browser-engine/core/session-manager.d.ts +45 -0
- package/dist/integrations/browser-engine/core/session-manager.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/session-manager.js +233 -0
- package/dist/integrations/browser-engine/core/session-manager.js.map +1 -0
- package/dist/integrations/browser-engine/core/stealth-engine.d.ts +19 -0
- package/dist/integrations/browser-engine/core/stealth-engine.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/stealth-engine.js +233 -0
- package/dist/integrations/browser-engine/core/stealth-engine.js.map +1 -0
- package/dist/integrations/browser-engine/core/tab-manager.d.ts +40 -0
- package/dist/integrations/browser-engine/core/tab-manager.d.ts.map +1 -0
- package/dist/integrations/browser-engine/core/tab-manager.js +94 -0
- package/dist/integrations/browser-engine/core/tab-manager.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/dom-processor.d.ts +22 -0
- package/dist/integrations/browser-engine/extraction/dom-processor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/dom-processor.js +197 -0
- package/dist/integrations/browser-engine/extraction/dom-processor.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/element-finder.d.ts +53 -0
- package/dist/integrations/browser-engine/extraction/element-finder.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/element-finder.js +108 -0
- package/dist/integrations/browser-engine/extraction/element-finder.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/iframe-processor.d.ts +69 -0
- package/dist/integrations/browser-engine/extraction/iframe-processor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/iframe-processor.js +199 -0
- package/dist/integrations/browser-engine/extraction/iframe-processor.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/media-extractor.d.ts +24 -0
- package/dist/integrations/browser-engine/extraction/media-extractor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/media-extractor.js +108 -0
- package/dist/integrations/browser-engine/extraction/media-extractor.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/schema-extractor.d.ts +34 -0
- package/dist/integrations/browser-engine/extraction/schema-extractor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/schema-extractor.js +149 -0
- package/dist/integrations/browser-engine/extraction/schema-extractor.js.map +1 -0
- package/dist/integrations/browser-engine/extraction/table-extractor.d.ts +16 -0
- package/dist/integrations/browser-engine/extraction/table-extractor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/extraction/table-extractor.js +87 -0
- package/dist/integrations/browser-engine/extraction/table-extractor.js.map +1 -0
- package/dist/integrations/browser-engine/index.d.ts +77 -0
- package/dist/integrations/browser-engine/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/index.js +1819 -0
- package/dist/integrations/browser-engine/index.js.map +1 -0
- package/dist/integrations/browser-engine/profiles/cookie-jar.d.ts +14 -0
- package/dist/integrations/browser-engine/profiles/cookie-jar.d.ts.map +1 -0
- package/dist/integrations/browser-engine/profiles/cookie-jar.js +82 -0
- package/dist/integrations/browser-engine/profiles/cookie-jar.js.map +1 -0
- package/dist/integrations/browser-engine/profiles/profile-store.d.ts +30 -0
- package/dist/integrations/browser-engine/profiles/profile-store.d.ts.map +1 -0
- package/dist/integrations/browser-engine/profiles/profile-store.js +101 -0
- package/dist/integrations/browser-engine/profiles/profile-store.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/developer/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/developer/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/developer/index.js +229 -0
- package/dist/integrations/browser-engine/skills/built-in/developer/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.js +194 -0
- package/dist/integrations/browser-engine/skills/built-in/ecommerce/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/financial/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/financial/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/financial/index.js +194 -0
- package/dist/integrations/browser-engine/skills/built-in/financial/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/jobs/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/jobs/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/jobs/index.js +132 -0
- package/dist/integrations/browser-engine/skills/built-in/jobs/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/news/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/news/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/news/index.js +183 -0
- package/dist/integrations/browser-engine/skills/built-in/news/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/productivity/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/productivity/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/productivity/index.js +115 -0
- package/dist/integrations/browser-engine/skills/built-in/productivity/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/search/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/search/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/search/index.js +156 -0
- package/dist/integrations/browser-engine/skills/built-in/search/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/social/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/social/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/social/index.js +217 -0
- package/dist/integrations/browser-engine/skills/built-in/social/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/travel/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/travel/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/travel/index.js +135 -0
- package/dist/integrations/browser-engine/skills/built-in/travel/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/utility/index.d.ts +6 -0
- package/dist/integrations/browser-engine/skills/built-in/utility/index.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/built-in/utility/index.js +150 -0
- package/dist/integrations/browser-engine/skills/built-in/utility/index.js.map +1 -0
- package/dist/integrations/browser-engine/skills/executor.d.ts +10 -0
- package/dist/integrations/browser-engine/skills/executor.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/executor.js +179 -0
- package/dist/integrations/browser-engine/skills/executor.js.map +1 -0
- package/dist/integrations/browser-engine/skills/registry.d.ts +24 -0
- package/dist/integrations/browser-engine/skills/registry.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/registry.js +94 -0
- package/dist/integrations/browser-engine/skills/registry.js.map +1 -0
- package/dist/integrations/browser-engine/skills/skill-generator.d.ts +21 -0
- package/dist/integrations/browser-engine/skills/skill-generator.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/skill-generator.js +205 -0
- package/dist/integrations/browser-engine/skills/skill-generator.js.map +1 -0
- package/dist/integrations/browser-engine/skills/skill-store.d.ts +24 -0
- package/dist/integrations/browser-engine/skills/skill-store.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/skill-store.js +86 -0
- package/dist/integrations/browser-engine/skills/skill-store.js.map +1 -0
- package/dist/integrations/browser-engine/skills/types.d.ts +61 -0
- package/dist/integrations/browser-engine/skills/types.d.ts.map +1 -0
- package/dist/integrations/browser-engine/skills/types.js +8 -0
- package/dist/integrations/browser-engine/skills/types.js.map +1 -0
- package/dist/integrations/browser-engine/types.d.ts +260 -0
- package/dist/integrations/browser-engine/types.d.ts.map +1 -0
- package/dist/integrations/browser-engine/types.js +5 -0
- package/dist/integrations/browser-engine/types.js.map +1 -0
- package/dist/integrations/loader.js +8 -0
- package/dist/integrations/loader.js.map +1 -1
- package/dist/integrations/social/zoho-email.d.ts +25 -0
- package/dist/integrations/social/zoho-email.d.ts.map +1 -0
- package/dist/integrations/social/zoho-email.js +208 -0
- package/dist/integrations/social/zoho-email.js.map +1 -0
- package/dist/security/action-guard.d.ts.map +1 -1
- package/dist/security/action-guard.js +2 -0
- package/dist/security/action-guard.js.map +1 -1
- package/dist/security/input-sanitizer.d.ts +41 -0
- package/dist/security/input-sanitizer.d.ts.map +1 -0
- package/dist/security/input-sanitizer.js +138 -0
- package/dist/security/input-sanitizer.js.map +1 -0
- package/dist/vision/live-stream.d.ts +50 -0
- package/dist/vision/live-stream.d.ts.map +1 -0
- package/dist/vision/live-stream.js +129 -0
- package/dist/vision/live-stream.js.map +1 -0
- package/dist/vision/webcam.d.ts +43 -0
- package/dist/vision/webcam.d.ts.map +1 -0
- package/dist/vision/webcam.js +259 -0
- package/dist/vision/webcam.js.map +1 -0
- package/dist/wallet/explorer.d.ts.map +1 -1
- package/dist/wallet/explorer.js +9 -1
- package/dist/wallet/explorer.js.map +1 -1
- package/dist/wallet/solana.d.ts +48 -0
- package/dist/wallet/solana.d.ts.map +1 -0
- package/dist/wallet/solana.js +126 -0
- package/dist/wallet/solana.js.map +1 -0
- package/dist/wallet/x402.d.ts +11 -0
- package/dist/wallet/x402.d.ts.map +1 -1
- package/dist/wallet/x402.js +38 -1
- package/dist/wallet/x402.js.map +1 -1
- package/package.json +1 -1
- package/wispy/skills/shadcn-ui/SKILL.md +170 -170
- package/wispy/skills/tabler-icons/SKILL.md +141 -141
- package/wispy/memory/2026-01-29.md +0 -35
- package/wispy/memory/2026-01-30.md +0 -4
- package/wispy/memory/2026-02-03.md +0 -41
- package/wispy/memory/2026-02-04.md +0 -46
- package/wispy/memory/2026-02-05.md +0 -48
- 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":"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;
|
|
1
|
+
{"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agents/tool-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
//
|
|
367
|
-
const { join } = await import("path");
|
|
368
|
-
const
|
|
369
|
-
|
|
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:
|
|
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
|
|
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\
|
|
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.
|
|
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) {
|