profclaw 0.0.1-beta.1
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/.env.example +215 -0
- package/CHANGELOG.md +49 -0
- package/CONTRIBUTING.md +119 -0
- package/Dockerfile +107 -0
- package/LICENSE +661 -0
- package/README.md +196 -0
- package/config/agents.yml +55 -0
- package/config/budget.yml +15 -0
- package/config/pricing.yml +46 -0
- package/config/settings.yml +168 -0
- package/dist/adapters/claude-code.d.ts +46 -0
- package/dist/adapters/claude-code.js +215 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/ollama.d.ts +45 -0
- package/dist/adapters/ollama.js +277 -0
- package/dist/adapters/openclaw.d.ts +60 -0
- package/dist/adapters/openclaw.js +289 -0
- package/dist/adapters/registry.d.ts +56 -0
- package/dist/adapters/registry.js +163 -0
- package/dist/agents/executor.d.ts +78 -0
- package/dist/agents/executor.js +657 -0
- package/dist/agents/index.d.ts +10 -0
- package/dist/agents/index.js +27 -0
- package/dist/agents/stop-conditions.d.ts +108 -0
- package/dist/agents/stop-conditions.js +299 -0
- package/dist/agents/types.d.ts +185 -0
- package/dist/agents/types.js +14 -0
- package/dist/ai/embedding-service.d.ts +96 -0
- package/dist/ai/embedding-service.js +333 -0
- package/dist/auth/api-tokens.d.ts +71 -0
- package/dist/auth/api-tokens.js +235 -0
- package/dist/auth/auth-service.d.ts +75 -0
- package/dist/auth/auth-service.js +557 -0
- package/dist/auth/device-identity.d.ts +96 -0
- package/dist/auth/device-identity.js +250 -0
- package/dist/auth/github-oauth.d.ts +20 -0
- package/dist/auth/github-oauth.js +59 -0
- package/dist/auth/jira-oauth.d.ts +25 -0
- package/dist/auth/jira-oauth.js +75 -0
- package/dist/auth/linear-oauth.d.ts +21 -0
- package/dist/auth/linear-oauth.js +59 -0
- package/dist/auth/middleware.d.ts +44 -0
- package/dist/auth/middleware.js +190 -0
- package/dist/auth/pairing-codes.d.ts +109 -0
- package/dist/auth/pairing-codes.js +274 -0
- package/dist/auth/password.d.ts +53 -0
- package/dist/auth/password.js +126 -0
- package/dist/auth/qr-pairing.d.ts +36 -0
- package/dist/auth/qr-pairing.js +138 -0
- package/dist/auth/slack-oauth.d.ts +31 -0
- package/dist/auth/slack-oauth.js +80 -0
- package/dist/backup/index.d.ts +50 -0
- package/dist/backup/index.js +184 -0
- package/dist/browser/adapters.d.ts +25 -0
- package/dist/browser/adapters.js +32 -0
- package/dist/browser/cli.d.ts +19 -0
- package/dist/browser/cli.js +277 -0
- package/dist/browser/compression.d.ts +32 -0
- package/dist/browser/compression.js +269 -0
- package/dist/browser/extensions.d.ts +144 -0
- package/dist/browser/extensions.js +251 -0
- package/dist/browser/index.d.ts +37 -0
- package/dist/browser/index.js +43 -0
- package/dist/browser/refs.d.ts +46 -0
- package/dist/browser/refs.js +120 -0
- package/dist/browser/search.d.ts +36 -0
- package/dist/browser/search.js +193 -0
- package/dist/browser/service.d.ts +94 -0
- package/dist/browser/service.js +358 -0
- package/dist/browser/snapshot.d.ts +19 -0
- package/dist/browser/snapshot.js +250 -0
- package/dist/browser/tools.d.ts +259 -0
- package/dist/browser/tools.js +463 -0
- package/dist/browser/types.d.ts +134 -0
- package/dist/browser/types.js +17 -0
- package/dist/chat/agentic-executor.d.ts +108 -0
- package/dist/chat/agentic-executor.js +739 -0
- package/dist/chat/api-key-detector.d.ts +41 -0
- package/dist/chat/api-key-detector.js +290 -0
- package/dist/chat/auto-reply.d.ts +90 -0
- package/dist/chat/auto-reply.js +272 -0
- package/dist/chat/conversations.d.ts +91 -0
- package/dist/chat/conversations.js +297 -0
- package/dist/chat/execution/audit.d.ts +192 -0
- package/dist/chat/execution/audit.js +323 -0
- package/dist/chat/execution/executor.d.ts +56 -0
- package/dist/chat/execution/executor.js +654 -0
- package/dist/chat/execution/guardrails.d.ts +98 -0
- package/dist/chat/execution/guardrails.js +571 -0
- package/dist/chat/execution/index.d.ts +61 -0
- package/dist/chat/execution/index.js +129 -0
- package/dist/chat/execution/model-capability.d.ts +34 -0
- package/dist/chat/execution/model-capability.js +96 -0
- package/dist/chat/execution/process-pool.d.ts +110 -0
- package/dist/chat/execution/process-pool.js +290 -0
- package/dist/chat/execution/pty.d.ts +92 -0
- package/dist/chat/execution/pty.js +285 -0
- package/dist/chat/execution/rate-limiter.d.ts +87 -0
- package/dist/chat/execution/rate-limiter.js +305 -0
- package/dist/chat/execution/registry.d.ts +54 -0
- package/dist/chat/execution/registry.js +220 -0
- package/dist/chat/execution/sandbox.d.ts +109 -0
- package/dist/chat/execution/sandbox.js +684 -0
- package/dist/chat/execution/secrets.d.ts +45 -0
- package/dist/chat/execution/secrets.js +338 -0
- package/dist/chat/execution/security.d.ts +179 -0
- package/dist/chat/execution/security.js +739 -0
- package/dist/chat/execution/self-correction.d.ts +162 -0
- package/dist/chat/execution/self-correction.js +557 -0
- package/dist/chat/execution/session-manager.d.ts +79 -0
- package/dist/chat/execution/session-manager.js +356 -0
- package/dist/chat/execution/session-spawn/config.d.ts +37 -0
- package/dist/chat/execution/session-spawn/config.js +83 -0
- package/dist/chat/execution/session-spawn/index.d.ts +10 -0
- package/dist/chat/execution/session-spawn/index.js +10 -0
- package/dist/chat/execution/session-spawn/manager.d.ts +35 -0
- package/dist/chat/execution/session-spawn/manager.js +418 -0
- package/dist/chat/execution/session-spawn/types.d.ts +117 -0
- package/dist/chat/execution/session-spawn/types.js +16 -0
- package/dist/chat/execution/smart-prompts.d.ts +34 -0
- package/dist/chat/execution/smart-prompts.js +151 -0
- package/dist/chat/execution/stream-results.d.ts +65 -0
- package/dist/chat/execution/stream-results.js +156 -0
- package/dist/chat/execution/tool-router.d.ts +76 -0
- package/dist/chat/execution/tool-router.js +296 -0
- package/dist/chat/execution/tools/agents-list.d.ts +49 -0
- package/dist/chat/execution/tools/agents-list.js +165 -0
- package/dist/chat/execution/tools/browser.d.ts +12 -0
- package/dist/chat/execution/tools/browser.js +14 -0
- package/dist/chat/execution/tools/canvas.d.ts +61 -0
- package/dist/chat/execution/tools/canvas.js +150 -0
- package/dist/chat/execution/tools/complete-task.d.ts +72 -0
- package/dist/chat/execution/tools/complete-task.js +104 -0
- package/dist/chat/execution/tools/cron-tool.d.ts +204 -0
- package/dist/chat/execution/tools/cron-tool.js +680 -0
- package/dist/chat/execution/tools/discord-actions.d.ts +120 -0
- package/dist/chat/execution/tools/discord-actions.js +361 -0
- package/dist/chat/execution/tools/exec.d.ts +43 -0
- package/dist/chat/execution/tools/exec.js +223 -0
- package/dist/chat/execution/tools/file-ops.d.ts +175 -0
- package/dist/chat/execution/tools/file-ops.js +723 -0
- package/dist/chat/execution/tools/git.d.ts +143 -0
- package/dist/chat/execution/tools/git.js +395 -0
- package/dist/chat/execution/tools/github.d.ts +42 -0
- package/dist/chat/execution/tools/github.js +184 -0
- package/dist/chat/execution/tools/glinr-ops.d.ts +202 -0
- package/dist/chat/execution/tools/glinr-ops.js +694 -0
- package/dist/chat/execution/tools/image-analyze.d.ts +29 -0
- package/dist/chat/execution/tools/image-analyze.js +127 -0
- package/dist/chat/execution/tools/index.d.ts +64 -0
- package/dist/chat/execution/tools/index.js +245 -0
- package/dist/chat/execution/tools/integrations.d.ts +109 -0
- package/dist/chat/execution/tools/integrations.js +237 -0
- package/dist/chat/execution/tools/link-understand.d.ts +34 -0
- package/dist/chat/execution/tools/link-understand.js +307 -0
- package/dist/chat/execution/tools/maintenance.d.ts +29 -0
- package/dist/chat/execution/tools/maintenance.js +105 -0
- package/dist/chat/execution/tools/memory-tools.d.ts +76 -0
- package/dist/chat/execution/tools/memory-tools.js +278 -0
- package/dist/chat/execution/tools/openai-image-gen.d.ts +51 -0
- package/dist/chat/execution/tools/openai-image-gen.js +212 -0
- package/dist/chat/execution/tools/profclaw-ops.d.ts +204 -0
- package/dist/chat/execution/tools/profclaw-ops.js +665 -0
- package/dist/chat/execution/tools/session-spawn.d.ts +146 -0
- package/dist/chat/execution/tools/session-spawn.js +544 -0
- package/dist/chat/execution/tools/session-status.d.ts +38 -0
- package/dist/chat/execution/tools/session-status.js +185 -0
- package/dist/chat/execution/tools/sessions-list.d.ts +49 -0
- package/dist/chat/execution/tools/sessions-list.js +153 -0
- package/dist/chat/execution/tools/sessions-send.d.ts +48 -0
- package/dist/chat/execution/tools/sessions-send.js +207 -0
- package/dist/chat/execution/tools/sessions-spawn.d.ts +51 -0
- package/dist/chat/execution/tools/sessions-spawn.js +137 -0
- package/dist/chat/execution/tools/slack-actions.d.ts +90 -0
- package/dist/chat/execution/tools/slack-actions.js +272 -0
- package/dist/chat/execution/tools/subagent-orchestrate.d.ts +66 -0
- package/dist/chat/execution/tools/subagent-orchestrate.js +313 -0
- package/dist/chat/execution/tools/system.d.ts +121 -0
- package/dist/chat/execution/tools/system.js +415 -0
- package/dist/chat/execution/tools/telegram-actions.d.ts +126 -0
- package/dist/chat/execution/tools/telegram-actions.js +339 -0
- package/dist/chat/execution/tools/test-run.d.ts +43 -0
- package/dist/chat/execution/tools/test-run.js +391 -0
- package/dist/chat/execution/tools/tts-speak.d.ts +39 -0
- package/dist/chat/execution/tools/tts-speak.js +199 -0
- package/dist/chat/execution/tools/web-fetch.d.ts +42 -0
- package/dist/chat/execution/tools/web-fetch.js +247 -0
- package/dist/chat/execution/tools/web-search.d.ts +53 -0
- package/dist/chat/execution/tools/web-search.js +130 -0
- package/dist/chat/execution/types.d.ts +337 -0
- package/dist/chat/execution/types.js +8 -0
- package/dist/chat/execution/workflows/built-in.d.ts +10 -0
- package/dist/chat/execution/workflows/built-in.js +249 -0
- package/dist/chat/execution/workflows/executor.d.ts +13 -0
- package/dist/chat/execution/workflows/executor.js +259 -0
- package/dist/chat/execution/workflows/index.d.ts +5 -0
- package/dist/chat/execution/workflows/index.js +5 -0
- package/dist/chat/execution/workflows/trigger.d.ts +15 -0
- package/dist/chat/execution/workflows/trigger.js +111 -0
- package/dist/chat/execution/workflows/types.d.ts +80 -0
- package/dist/chat/execution/workflows/types.js +2 -0
- package/dist/chat/failover/error.d.ts +73 -0
- package/dist/chat/failover/error.js +412 -0
- package/dist/chat/failover/index.d.ts +10 -0
- package/dist/chat/failover/index.js +11 -0
- package/dist/chat/failover/model-fallback.d.ts +97 -0
- package/dist/chat/failover/model-fallback.js +328 -0
- package/dist/chat/failover/types.d.ts +47 -0
- package/dist/chat/failover/types.js +8 -0
- package/dist/chat/format/chunk.d.ts +59 -0
- package/dist/chat/format/chunk.js +253 -0
- package/dist/chat/format/index.d.ts +7 -0
- package/dist/chat/format/index.js +7 -0
- package/dist/chat/format/tool-result-formatter.d.ts +30 -0
- package/dist/chat/format/tool-result-formatter.js +177 -0
- package/dist/chat/group.d.ts +232 -0
- package/dist/chat/group.js +311 -0
- package/dist/chat/index.d.ts +21 -0
- package/dist/chat/index.js +30 -0
- package/dist/chat/memory.d.ts +108 -0
- package/dist/chat/memory.js +343 -0
- package/dist/chat/message-handler.d.ts +38 -0
- package/dist/chat/message-handler.js +274 -0
- package/dist/chat/proactive/index.d.ts +167 -0
- package/dist/chat/proactive/index.js +721 -0
- package/dist/chat/prompt-adapter.d.ts +52 -0
- package/dist/chat/prompt-adapter.js +245 -0
- package/dist/chat/providers/dingtalk/index.d.ts +69 -0
- package/dist/chat/providers/dingtalk/index.js +225 -0
- package/dist/chat/providers/discord/index.d.ts +264 -0
- package/dist/chat/providers/discord/index.js +657 -0
- package/dist/chat/providers/feishu/index.d.ts +97 -0
- package/dist/chat/providers/feishu/index.js +362 -0
- package/dist/chat/providers/googlechat/index.d.ts +269 -0
- package/dist/chat/providers/googlechat/index.js +634 -0
- package/dist/chat/providers/imessage/index.d.ts +61 -0
- package/dist/chat/providers/imessage/index.js +166 -0
- package/dist/chat/providers/index.d.ts +76 -0
- package/dist/chat/providers/index.js +430 -0
- package/dist/chat/providers/irc/index.d.ts +101 -0
- package/dist/chat/providers/irc/index.js +557 -0
- package/dist/chat/providers/line/index.d.ts +113 -0
- package/dist/chat/providers/line/index.js +434 -0
- package/dist/chat/providers/matrix/index.d.ts +161 -0
- package/dist/chat/providers/matrix/index.js +559 -0
- package/dist/chat/providers/mattermost/index.d.ts +106 -0
- package/dist/chat/providers/mattermost/index.js +425 -0
- package/dist/chat/providers/msteams/index.d.ts +198 -0
- package/dist/chat/providers/msteams/index.js +694 -0
- package/dist/chat/providers/nextcloud/index.d.ts +52 -0
- package/dist/chat/providers/nextcloud/index.js +156 -0
- package/dist/chat/providers/nostr/index.d.ts +60 -0
- package/dist/chat/providers/nostr/index.js +200 -0
- package/dist/chat/providers/qq/index.d.ts +57 -0
- package/dist/chat/providers/qq/index.js +260 -0
- package/dist/chat/providers/registry.d.ts +89 -0
- package/dist/chat/providers/registry.js +213 -0
- package/dist/chat/providers/signal/index.d.ts +88 -0
- package/dist/chat/providers/signal/index.js +357 -0
- package/dist/chat/providers/slack/index.d.ts +52 -0
- package/dist/chat/providers/slack/index.js +477 -0
- package/dist/chat/providers/synology/index.d.ts +50 -0
- package/dist/chat/providers/synology/index.js +138 -0
- package/dist/chat/providers/telegram/index.d.ts +148 -0
- package/dist/chat/providers/telegram/index.js +492 -0
- package/dist/chat/providers/tlon/index.d.ts +44 -0
- package/dist/chat/providers/tlon/index.js +243 -0
- package/dist/chat/providers/twitch/index.d.ts +79 -0
- package/dist/chat/providers/twitch/index.js +349 -0
- package/dist/chat/providers/types.d.ts +437 -0
- package/dist/chat/providers/types.js +14 -0
- package/dist/chat/providers/webchat/index.d.ts +38 -0
- package/dist/chat/providers/webchat/index.js +214 -0
- package/dist/chat/providers/wecom/index.d.ts +62 -0
- package/dist/chat/providers/wecom/index.js +228 -0
- package/dist/chat/providers/whatsapp/index.d.ts +147 -0
- package/dist/chat/providers/whatsapp/index.js +396 -0
- package/dist/chat/providers/zalo/index.d.ts +54 -0
- package/dist/chat/providers/zalo/index.js +158 -0
- package/dist/chat/providers/zalo-personal/index.d.ts +53 -0
- package/dist/chat/providers/zalo-personal/index.js +212 -0
- package/dist/chat/skills.d.ts +82 -0
- package/dist/chat/skills.js +410 -0
- package/dist/chat/system-prompts.d.ts +76 -0
- package/dist/chat/system-prompts.js +407 -0
- package/dist/chat/tool-handler.d.ts +57 -0
- package/dist/chat/tool-handler.js +336 -0
- package/dist/chat/tools.d.ts +373 -0
- package/dist/chat/tools.js +512 -0
- package/dist/cli/commands/agent.d.ts +3 -0
- package/dist/cli/commands/agent.js +108 -0
- package/dist/cli/commands/auth.d.ts +12 -0
- package/dist/cli/commands/auth.js +301 -0
- package/dist/cli/commands/browser.d.ts +3 -0
- package/dist/cli/commands/browser.js +138 -0
- package/dist/cli/commands/canvas.d.ts +3 -0
- package/dist/cli/commands/canvas.js +155 -0
- package/dist/cli/commands/channels.d.ts +3 -0
- package/dist/cli/commands/channels.js +167 -0
- package/dist/cli/commands/chat.d.ts +9 -0
- package/dist/cli/commands/chat.js +360 -0
- package/dist/cli/commands/completion.d.ts +3 -0
- package/dist/cli/commands/completion.js +170 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.js +193 -0
- package/dist/cli/commands/cost.d.ts +3 -0
- package/dist/cli/commands/cost.js +134 -0
- package/dist/cli/commands/daemon.d.ts +3 -0
- package/dist/cli/commands/daemon.js +381 -0
- package/dist/cli/commands/devices.d.ts +3 -0
- package/dist/cli/commands/devices.js +150 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +295 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.js +139 -0
- package/dist/cli/commands/mcp.d.ts +15 -0
- package/dist/cli/commands/mcp.js +157 -0
- package/dist/cli/commands/memory.d.ts +3 -0
- package/dist/cli/commands/memory.js +170 -0
- package/dist/cli/commands/models.d.ts +3 -0
- package/dist/cli/commands/models.js +197 -0
- package/dist/cli/commands/nodes.d.ts +3 -0
- package/dist/cli/commands/nodes.js +193 -0
- package/dist/cli/commands/onboard.d.ts +13 -0
- package/dist/cli/commands/onboard.js +360 -0
- package/dist/cli/commands/plugin.d.ts +15 -0
- package/dist/cli/commands/plugin.js +226 -0
- package/dist/cli/commands/provider.d.ts +16 -0
- package/dist/cli/commands/provider.js +320 -0
- package/dist/cli/commands/security.d.ts +3 -0
- package/dist/cli/commands/security.js +180 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.js +179 -0
- package/dist/cli/commands/session.d.ts +3 -0
- package/dist/cli/commands/session.js +172 -0
- package/dist/cli/commands/setup.d.ts +13 -0
- package/dist/cli/commands/setup.js +636 -0
- package/dist/cli/commands/skill.d.ts +15 -0
- package/dist/cli/commands/skill.js +191 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.js +71 -0
- package/dist/cli/commands/summary.d.ts +3 -0
- package/dist/cli/commands/summary.js +160 -0
- package/dist/cli/commands/task.d.ts +3 -0
- package/dist/cli/commands/task.js +170 -0
- package/dist/cli/commands/ticket.d.ts +3 -0
- package/dist/cli/commands/ticket.js +421 -0
- package/dist/cli/commands/tools.d.ts +9 -0
- package/dist/cli/commands/tools.js +508 -0
- package/dist/cli/commands/tui.d.ts +3 -0
- package/dist/cli/commands/tui.js +158 -0
- package/dist/cli/commands/tunnel.d.ts +3 -0
- package/dist/cli/commands/tunnel.js +135 -0
- package/dist/cli/commands/webhooks.d.ts +3 -0
- package/dist/cli/commands/webhooks.js +191 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +127 -0
- package/dist/cli/utils/api.d.ts +17 -0
- package/dist/cli/utils/api.js +63 -0
- package/dist/cli/utils/config.d.ts +31 -0
- package/dist/cli/utils/config.js +81 -0
- package/dist/cli/utils/output.d.ts +58 -0
- package/dist/cli/utils/output.js +148 -0
- package/dist/core/deployment.d.ts +30 -0
- package/dist/core/deployment.js +114 -0
- package/dist/core/sandbox-config.d.ts +63 -0
- package/dist/core/sandbox-config.js +148 -0
- package/dist/costs/budget.d.ts +28 -0
- package/dist/costs/budget.js +57 -0
- package/dist/costs/persistence.d.ts +77 -0
- package/dist/costs/persistence.js +210 -0
- package/dist/costs/pricing.d.ts +16 -0
- package/dist/costs/pricing.js +39 -0
- package/dist/costs/token-tracker.d.ts +34 -0
- package/dist/costs/token-tracker.js +141 -0
- package/dist/cron/heartbeat.d.ts +23 -0
- package/dist/cron/heartbeat.js +109 -0
- package/dist/cron/index.d.ts +22 -0
- package/dist/cron/index.js +37 -0
- package/dist/cron/issue-poller.d.ts +15 -0
- package/dist/cron/issue-poller.js +174 -0
- package/dist/cron/scheduler.d.ts +315 -0
- package/dist/cron/scheduler.js +1008 -0
- package/dist/cron/stale-checker.d.ts +16 -0
- package/dist/cron/stale-checker.js +61 -0
- package/dist/cron/templates.d.ts +107 -0
- package/dist/cron/templates.js +395 -0
- package/dist/diagnostics/exporters.d.ts +21 -0
- package/dist/diagnostics/exporters.js +138 -0
- package/dist/diagnostics/index.d.ts +10 -0
- package/dist/diagnostics/index.js +9 -0
- package/dist/diagnostics/middleware.d.ts +12 -0
- package/dist/diagnostics/middleware.js +58 -0
- package/dist/diagnostics/tracer.d.ts +133 -0
- package/dist/diagnostics/tracer.js +257 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.js +7 -0
- package/dist/discovery/mdns.d.ts +40 -0
- package/dist/discovery/mdns.js +249 -0
- package/dist/gateway/index.d.ts +35 -0
- package/dist/gateway/index.js +36 -0
- package/dist/gateway/router.d.ts +110 -0
- package/dist/gateway/router.js +649 -0
- package/dist/gateway/types.d.ts +275 -0
- package/dist/gateway/types.js +2 -0
- package/dist/gateway/workflows.d.ts +37 -0
- package/dist/gateway/workflows.js +748 -0
- package/dist/hooks/agent-webhook.d.ts +277 -0
- package/dist/hooks/agent-webhook.js +197 -0
- package/dist/hooks/index.d.ts +13 -0
- package/dist/hooks/index.js +15 -0
- package/dist/hooks/prompt-submit.d.ts +45 -0
- package/dist/hooks/prompt-submit.js +111 -0
- package/dist/hooks/schemas.d.ts +563 -0
- package/dist/hooks/schemas.js +108 -0
- package/dist/hooks/session-end.d.ts +25 -0
- package/dist/hooks/session-end.js +153 -0
- package/dist/hooks/tool-use.d.ts +41 -0
- package/dist/hooks/tool-use.js +201 -0
- package/dist/hooks/types.d.ts +76 -0
- package/dist/hooks/types.js +7 -0
- package/dist/integrations/cloudflare-tunnel.d.ts +78 -0
- package/dist/integrations/cloudflare-tunnel.js +268 -0
- package/dist/integrations/github-client.d.ts +27 -0
- package/dist/integrations/github-client.js +79 -0
- package/dist/integrations/github-projects.d.ts +97 -0
- package/dist/integrations/github-projects.js +433 -0
- package/dist/integrations/github-ticket-sync.d.ts +82 -0
- package/dist/integrations/github-ticket-sync.js +352 -0
- package/dist/integrations/github.d.ts +11 -0
- package/dist/integrations/github.js +241 -0
- package/dist/integrations/jira-client.d.ts +30 -0
- package/dist/integrations/jira-client.js +67 -0
- package/dist/integrations/jira.d.ts +13 -0
- package/dist/integrations/jira.js +108 -0
- package/dist/integrations/linear-client.d.ts +23 -0
- package/dist/integrations/linear-client.js +52 -0
- package/dist/integrations/linear.d.ts +15 -0
- package/dist/integrations/linear.js +312 -0
- package/dist/integrations/tailscale.d.ts +68 -0
- package/dist/integrations/tailscale.js +173 -0
- package/dist/integrations/web-search.d.ts +112 -0
- package/dist/integrations/web-search.js +287 -0
- package/dist/intelligence/index.d.ts +8 -0
- package/dist/intelligence/index.js +8 -0
- package/dist/intelligence/ollama.d.ts +50 -0
- package/dist/intelligence/ollama.js +213 -0
- package/dist/intelligence/rules.d.ts +39 -0
- package/dist/intelligence/rules.js +308 -0
- package/dist/labels/index.d.ts +93 -0
- package/dist/labels/index.js +248 -0
- package/dist/mcp/browser-tools.d.ts +10 -0
- package/dist/mcp/browser-tools.js +16 -0
- package/dist/mcp/client.d.ts +54 -0
- package/dist/mcp/client.js +153 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +13 -0
- package/dist/mcp/server.d.ts +40 -0
- package/dist/mcp/server.js +826 -0
- package/dist/mcp/tool-adapter.d.ts +49 -0
- package/dist/mcp/tool-adapter.js +193 -0
- package/dist/memory/experience-store.d.ts +121 -0
- package/dist/memory/experience-store.js +439 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.js +25 -0
- package/dist/memory/memory-service.d.ts +312 -0
- package/dist/memory/memory-service.js +1172 -0
- package/dist/memory/memory-watcher.d.ts +116 -0
- package/dist/memory/memory-watcher.js +239 -0
- package/dist/middleware/logging.d.ts +34 -0
- package/dist/middleware/logging.js +184 -0
- package/dist/middleware/rate-limit.d.ts +29 -0
- package/dist/middleware/rate-limit.js +91 -0
- package/dist/notifications/in-app.d.ts +28 -0
- package/dist/notifications/in-app.js +53 -0
- package/dist/notifications/index.d.ts +3 -0
- package/dist/notifications/index.js +3 -0
- package/dist/notifications/push.d.ts +74 -0
- package/dist/notifications/push.js +175 -0
- package/dist/notifications/slack.d.ts +32 -0
- package/dist/notifications/slack.js +157 -0
- package/dist/plugins/clawhub.d.ts +70 -0
- package/dist/plugins/clawhub.js +260 -0
- package/dist/plugins/loader.d.ts +23 -0
- package/dist/plugins/loader.js +140 -0
- package/dist/plugins/marketplace.d.ts +77 -0
- package/dist/plugins/marketplace.js +275 -0
- package/dist/plugins/registry.d.ts +122 -0
- package/dist/plugins/registry.js +352 -0
- package/dist/plugins/sandbox.d.ts +77 -0
- package/dist/plugins/sandbox.js +287 -0
- package/dist/plugins/scaffolder.d.ts +28 -0
- package/dist/plugins/scaffolder.js +409 -0
- package/dist/plugins/sdk.d.ts +35 -0
- package/dist/plugins/sdk.js +8 -0
- package/dist/plugins/search/brave.d.ts +9 -0
- package/dist/plugins/search/brave.js +157 -0
- package/dist/plugins/search/duckduckgo.d.ts +9 -0
- package/dist/plugins/search/duckduckgo.js +171 -0
- package/dist/plugins/search/index.d.ts +13 -0
- package/dist/plugins/search/index.js +23 -0
- package/dist/plugins/search/searxng.d.ts +9 -0
- package/dist/plugins/search/searxng.js +170 -0
- package/dist/plugins/search/serper.d.ts +9 -0
- package/dist/plugins/search/serper.js +135 -0
- package/dist/plugins/search/tavily.d.ts +9 -0
- package/dist/plugins/search/tavily.js +146 -0
- package/dist/plugins/types.d.ts +174 -0
- package/dist/plugins/types.js +8 -0
- package/dist/projects/index.d.ts +133 -0
- package/dist/projects/index.js +897 -0
- package/dist/projects/types.d.ts +444 -0
- package/dist/projects/types.js +207 -0
- package/dist/providers/adapters/anthropic.d.ts +26 -0
- package/dist/providers/adapters/anthropic.js +306 -0
- package/dist/providers/adapters/base.d.ts +53 -0
- package/dist/providers/adapters/base.js +99 -0
- package/dist/providers/adapters/ollama.d.ts +30 -0
- package/dist/providers/adapters/ollama.js +292 -0
- package/dist/providers/ai-sdk.d.ts +178 -0
- package/dist/providers/ai-sdk.js +1552 -0
- package/dist/providers/core/index.d.ts +8 -0
- package/dist/providers/core/index.js +10 -0
- package/dist/providers/core/models.d.ts +31 -0
- package/dist/providers/core/models.js +949 -0
- package/dist/providers/core/types.d.ts +117 -0
- package/dist/providers/core/types.js +83 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +7 -0
- package/dist/providers/registry.d.ts +93 -0
- package/dist/providers/registry.js +228 -0
- package/dist/providers/schema-utils.d.ts +23 -0
- package/dist/providers/schema-utils.js +545 -0
- package/dist/providers/types.d.ts +609 -0
- package/dist/providers/types.js +279 -0
- package/dist/queue/failure-handler.d.ts +93 -0
- package/dist/queue/failure-handler.js +379 -0
- package/dist/queue/index.d.ts +23 -0
- package/dist/queue/index.js +86 -0
- package/dist/queue/memory-queue.d.ts +30 -0
- package/dist/queue/memory-queue.js +429 -0
- package/dist/queue/notifications.d.ts +6 -0
- package/dist/queue/notifications.js +128 -0
- package/dist/queue/task-queue.d.ts +55 -0
- package/dist/queue/task-queue.js +518 -0
- package/dist/queue/webhook-queue.d.ts +47 -0
- package/dist/queue/webhook-queue.js +158 -0
- package/dist/routes/agents.d.ts +4 -0
- package/dist/routes/agents.js +45 -0
- package/dist/routes/auth.d.ts +19 -0
- package/dist/routes/auth.js +492 -0
- package/dist/routes/backup.d.ts +6 -0
- package/dist/routes/backup.js +71 -0
- package/dist/routes/chat.d.ts +10 -0
- package/dist/routes/chat.js +1678 -0
- package/dist/routes/clawhub.d.ts +8 -0
- package/dist/routes/clawhub.js +89 -0
- package/dist/routes/costs.d.ts +4 -0
- package/dist/routes/costs.js +78 -0
- package/dist/routes/cron.d.ts +11 -0
- package/dist/routes/cron.js +708 -0
- package/dist/routes/devices.d.ts +9 -0
- package/dist/routes/devices.js +490 -0
- package/dist/routes/discord.d.ts +15 -0
- package/dist/routes/discord.js +524 -0
- package/dist/routes/dlq.d.ts +4 -0
- package/dist/routes/dlq.js +64 -0
- package/dist/routes/gateway.d.ts +4 -0
- package/dist/routes/gateway.js +253 -0
- package/dist/routes/health.d.ts +29 -0
- package/dist/routes/health.js +296 -0
- package/dist/routes/hooks.d.ts +4 -0
- package/dist/routes/hooks.js +170 -0
- package/dist/routes/import.d.ts +9 -0
- package/dist/routes/import.js +540 -0
- package/dist/routes/index.d.ts +38 -0
- package/dist/routes/index.js +39 -0
- package/dist/routes/integrations.d.ts +10 -0
- package/dist/routes/integrations.js +200 -0
- package/dist/routes/labels.d.ts +8 -0
- package/dist/routes/labels.js +240 -0
- package/dist/routes/mcp.d.ts +14 -0
- package/dist/routes/mcp.js +125 -0
- package/dist/routes/memory.d.ts +10 -0
- package/dist/routes/memory.js +622 -0
- package/dist/routes/notifications.d.ts +9 -0
- package/dist/routes/notifications.js +154 -0
- package/dist/routes/oobe.d.ts +10 -0
- package/dist/routes/oobe.js +405 -0
- package/dist/routes/openapi.d.ts +9 -0
- package/dist/routes/openapi.js +537 -0
- package/dist/routes/plugins.d.ts +8 -0
- package/dist/routes/plugins.js +108 -0
- package/dist/routes/projects.d.ts +8 -0
- package/dist/routes/projects.js +592 -0
- package/dist/routes/push.d.ts +8 -0
- package/dist/routes/push.js +75 -0
- package/dist/routes/search.d.ts +4 -0
- package/dist/routes/search.js +189 -0
- package/dist/routes/security.d.ts +10 -0
- package/dist/routes/security.js +189 -0
- package/dist/routes/settings.d.ts +4 -0
- package/dist/routes/settings.js +119 -0
- package/dist/routes/setup.d.ts +11 -0
- package/dist/routes/setup.js +525 -0
- package/dist/routes/skills.d.ts +13 -0
- package/dist/routes/skills.js +152 -0
- package/dist/routes/slack.d.ts +12 -0
- package/dist/routes/slack.js +999 -0
- package/dist/routes/states.d.ts +8 -0
- package/dist/routes/states.js +123 -0
- package/dist/routes/stats.d.ts +6 -0
- package/dist/routes/stats.js +369 -0
- package/dist/routes/summaries.d.ts +4 -0
- package/dist/routes/summaries.js +344 -0
- package/dist/routes/sync.d.ts +13 -0
- package/dist/routes/sync.js +268 -0
- package/dist/routes/tasks.d.ts +4 -0
- package/dist/routes/tasks.js +473 -0
- package/dist/routes/telegram.d.ts +14 -0
- package/dist/routes/telegram.js +420 -0
- package/dist/routes/tickets.d.ts +4 -0
- package/dist/routes/tickets.js +1090 -0
- package/dist/routes/tokens.d.ts +4 -0
- package/dist/routes/tokens.js +83 -0
- package/dist/routes/tools.d.ts +14 -0
- package/dist/routes/tools.js +790 -0
- package/dist/routes/tunnels.d.ts +8 -0
- package/dist/routes/tunnels.js +145 -0
- package/dist/routes/users.d.ts +15 -0
- package/dist/routes/users.js +998 -0
- package/dist/routes/voice.d.ts +8 -0
- package/dist/routes/voice.js +127 -0
- package/dist/routes/webchat.d.ts +11 -0
- package/dist/routes/webchat.js +173 -0
- package/dist/routes/webhook-dedup.d.ts +11 -0
- package/dist/routes/webhook-dedup.js +49 -0
- package/dist/routes/webhooks.d.ts +4 -0
- package/dist/routes/webhooks.js +71 -0
- package/dist/routes/whatsapp.d.ts +14 -0
- package/dist/routes/whatsapp.js +391 -0
- package/dist/security/audit-scanner.d.ts +32 -0
- package/dist/security/audit-scanner.js +217 -0
- package/dist/security/fs-guard.d.ts +41 -0
- package/dist/security/fs-guard.js +206 -0
- package/dist/security/prompt-guard.d.ts +47 -0
- package/dist/security/prompt-guard.js +198 -0
- package/dist/security/ssrf-guard.d.ts +38 -0
- package/dist/security/ssrf-guard.js +266 -0
- package/dist/security/types.d.ts +92 -0
- package/dist/security/types.js +8 -0
- package/dist/server/route-loader.d.ts +15 -0
- package/dist/server/route-loader.js +135 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +835 -0
- package/dist/settings/index.d.ts +841 -0
- package/dist/settings/index.js +451 -0
- package/dist/skills/compiler.d.ts +83 -0
- package/dist/skills/compiler.js +358 -0
- package/dist/skills/frontmatter.d.ts +33 -0
- package/dist/skills/frontmatter.js +175 -0
- package/dist/skills/index.d.ts +19 -0
- package/dist/skills/index.js +24 -0
- package/dist/skills/installer.d.ts +22 -0
- package/dist/skills/installer.js +220 -0
- package/dist/skills/loader.d.ts +72 -0
- package/dist/skills/loader.js +484 -0
- package/dist/skills/prompt-builder.d.ts +48 -0
- package/dist/skills/prompt-builder.js +135 -0
- package/dist/skills/registry.d.ts +115 -0
- package/dist/skills/registry.js +225 -0
- package/dist/skills/types.d.ts +202 -0
- package/dist/skills/types.js +24 -0
- package/dist/states/index.d.ts +64 -0
- package/dist/states/index.js +142 -0
- package/dist/storage/adapter.d.ts +146 -0
- package/dist/storage/adapter.js +2 -0
- package/dist/storage/index.d.ts +48 -0
- package/dist/storage/index.js +135 -0
- package/dist/storage/libsql.d.ts +99 -0
- package/dist/storage/libsql.js +1873 -0
- package/dist/storage/migrations.d.ts +65 -0
- package/dist/storage/migrations.js +289 -0
- package/dist/storage/schema.d.ts +10185 -0
- package/dist/storage/schema.js +1113 -0
- package/dist/summaries/extractor.d.ts +56 -0
- package/dist/summaries/extractor.js +377 -0
- package/dist/summaries/index.d.ts +13 -0
- package/dist/summaries/index.js +14 -0
- package/dist/summaries/storage.d.ts +51 -0
- package/dist/summaries/storage.js +101 -0
- package/dist/summaries/templates.d.ts +68 -0
- package/dist/summaries/templates.js +245 -0
- package/dist/sync/adapters/base.d.ts +42 -0
- package/dist/sync/adapters/base.js +142 -0
- package/dist/sync/adapters/github.d.ts +45 -0
- package/dist/sync/adapters/github.js +445 -0
- package/dist/sync/adapters/linear.d.ts +40 -0
- package/dist/sync/adapters/linear.js +434 -0
- package/dist/sync/config.d.ts +388 -0
- package/dist/sync/config.js +281 -0
- package/dist/sync/engine.d.ts +112 -0
- package/dist/sync/engine.js +623 -0
- package/dist/sync/index.d.ts +31 -0
- package/dist/sync/index.js +34 -0
- package/dist/sync/integration.d.ts +53 -0
- package/dist/sync/integration.js +231 -0
- package/dist/sync/types.d.ts +249 -0
- package/dist/sync/types.js +30 -0
- package/dist/tickets/index.d.ts +139 -0
- package/dist/tickets/index.js +1406 -0
- package/dist/tickets/types.d.ts +817 -0
- package/dist/tickets/types.js +310 -0
- package/dist/tools/adapters.d.ts +56 -0
- package/dist/tools/adapters.js +183 -0
- package/dist/tools/index.d.ts +66 -0
- package/dist/tools/index.js +105 -0
- package/dist/tools/types.d.ts +117 -0
- package/dist/tools/types.js +20 -0
- package/dist/types/agent.d.ts +101 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/errors.d.ts +150 -0
- package/dist/types/errors.js +338 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +3 -0
- package/dist/types/summary.d.ts +638 -0
- package/dist/types/summary.js +137 -0
- package/dist/types/task.d.ts +123 -0
- package/dist/types/task.js +46 -0
- package/dist/utils/ai-cache.d.ts +72 -0
- package/dist/utils/ai-cache.js +204 -0
- package/dist/utils/ai-inference.d.ts +57 -0
- package/dist/utils/ai-inference.js +190 -0
- package/dist/utils/ai-responder.d.ts +44 -0
- package/dist/utils/ai-responder.js +272 -0
- package/dist/utils/circuit-breaker.d.ts +139 -0
- package/dist/utils/circuit-breaker.js +281 -0
- package/dist/utils/config-loader.d.ts +12 -0
- package/dist/utils/config-loader.js +44 -0
- package/dist/utils/crypto.d.ts +10 -0
- package/dist/utils/crypto.js +59 -0
- package/dist/utils/env-validator.d.ts +44 -0
- package/dist/utils/env-validator.js +236 -0
- package/dist/utils/file-lock.d.ts +85 -0
- package/dist/utils/file-lock.js +204 -0
- package/dist/utils/logger.d.ts +153 -0
- package/dist/utils/logger.js +282 -0
- package/dist/utils/metrics.d.ts +183 -0
- package/dist/utils/metrics.js +345 -0
- package/dist/utils/security.d.ts +90 -0
- package/dist/utils/security.js +347 -0
- package/dist/voice/index.d.ts +79 -0
- package/dist/voice/index.js +144 -0
- package/dist/voice/stt/whisper.d.ts +13 -0
- package/dist/voice/stt/whisper.js +116 -0
- package/dist/voice/tts/elevenlabs.d.ts +18 -0
- package/dist/voice/tts/elevenlabs.js +178 -0
- package/dist/voice/tts/openai-tts.d.ts +19 -0
- package/dist/voice/tts/openai-tts.js +127 -0
- package/dist/voice/tts/system.d.ts +26 -0
- package/dist/voice/tts/system.js +146 -0
- package/dist/voice/wake-word.d.ts +44 -0
- package/dist/voice/wake-word.js +145 -0
- package/docker-compose.yml +222 -0
- package/package.json +154 -0
- package/profclaw.mjs +24 -0
- package/skills/1password/SKILL.md +155 -0
- package/skills/api-tester/SKILL.md +177 -0
- package/skills/apple-notes/SKILL.md +167 -0
- package/skills/apple-reminders/SKILL.md +178 -0
- package/skills/bear-notes/SKILL.md +166 -0
- package/skills/blogwatcher/SKILL.md +177 -0
- package/skills/camsnap/SKILL.md +130 -0
- package/skills/code-generation/SKILL.md +139 -0
- package/skills/code-review/SKILL.md +116 -0
- package/skills/coding-agent/SKILL.md +184 -0
- package/skills/cron-manager/SKILL.md +141 -0
- package/skills/debug-helper/SKILL.md +134 -0
- package/skills/docker-ops/SKILL.md +246 -0
- package/skills/file-manager/SKILL.md +160 -0
- package/skills/git-workflow/SKILL.md +171 -0
- package/skills/github-issues/SKILL.md +244 -0
- package/skills/gog/SKILL.md +191 -0
- package/skills/goplaces/SKILL.md +156 -0
- package/skills/healthcheck/SKILL.md +270 -0
- package/skills/himalaya/SKILL.md +165 -0
- package/skills/mcp-discovery/SKILL.md +109 -0
- package/skills/memory-manager/SKILL.md +151 -0
- package/skills/model-usage/SKILL.md +177 -0
- package/skills/nano-banana-pro/SKILL.md +214 -0
- package/skills/nano-pdf/SKILL.md +165 -0
- package/skills/notion/SKILL.md +147 -0
- package/skills/obsidian/SKILL.md +163 -0
- package/skills/openai-image-gen/SKILL.md +194 -0
- package/skills/openai-whisper/SKILL.md +98 -0
- package/skills/openai-whisper-api/SKILL.md +130 -0
- package/skills/openhue/SKILL.md +203 -0
- package/skills/oracle/SKILL.md +236 -0
- package/skills/phone-control/SKILL.md +201 -0
- package/skills/profclaw-assistant/SKILL.md +81 -0
- package/skills/profclaw-projects/SKILL.md +68 -0
- package/skills/profclaw-tickets/SKILL.md +91 -0
- package/skills/session-logs/SKILL.md +216 -0
- package/skills/sherpa-onnx-tts/SKILL.md +134 -0
- package/skills/skill-creator/SKILL.md +183 -0
- package/skills/songsee/SKILL.md +170 -0
- package/skills/spotify-player/SKILL.md +254 -0
- package/skills/summarize/SKILL.md +155 -0
- package/skills/system-admin/SKILL.md +179 -0
- package/skills/things-mac/SKILL.md +179 -0
- package/skills/tmux/SKILL.md +170 -0
- package/skills/trello/SKILL.md +154 -0
- package/skills/video-frames/SKILL.md +127 -0
- package/skills/weather/SKILL.md +186 -0
- package/skills/web-research/SKILL.md +128 -0
- package/skills/xurl/SKILL.md +198 -0
- package/ui/README.md +73 -0
- package/ui/dist/assets/ActivityView-CkPgKhwm.js +1 -0
- package/ui/dist/assets/AgentList-C3SVdeEz.js +1 -0
- package/ui/dist/assets/AnalyticsDashboard-DVU--vlP.js +1 -0
- package/ui/dist/assets/AreaChart-B5qMEGWj.js +1 -0
- package/ui/dist/assets/CartesianChart-B50bcUJi.js +36 -0
- package/ui/dist/assets/ChatView-BZFJs7w_.js +10 -0
- package/ui/dist/assets/CostsDashboard-ChfH8BlG.js +1 -0
- package/ui/dist/assets/EstimateSelect-CLpB4NQO.js +1 -0
- package/ui/dist/assets/FloatingChatbot-CBzBY9a0.js +2 -0
- package/ui/dist/assets/InviteCodeManagement-DsbdPa6W.js +2 -0
- package/ui/dist/assets/ProjectDetail-BEM3tFXg.js +2 -0
- package/ui/dist/assets/ProjectDetail-D1-0B2xV.css +1 -0
- package/ui/dist/assets/ProjectIcon-CN1FmFAk.js +1 -0
- package/ui/dist/assets/ProjectList-DSDaNhxQ.js +4 -0
- package/ui/dist/assets/Settings-dPVcqC_d.js +6 -0
- package/ui/dist/assets/StatusIndicator-DA3NAo_b.js +1 -0
- package/ui/dist/assets/SummaryDetail-Bjnf9lT8.js +27 -0
- package/ui/dist/assets/SummaryList-ENwKDBKW.js +1 -0
- package/ui/dist/assets/TaskDetail-DnwG6MzB.js +1 -0
- package/ui/dist/assets/TaskList-D9Ug_HiV.js +1 -0
- package/ui/dist/assets/TicketBoard-CviH1571.js +1 -0
- package/ui/dist/assets/TicketDetail-8Jk8O-33.js +1 -0
- package/ui/dist/assets/TicketList-B-iV4rRA.js +1 -0
- package/ui/dist/assets/UserManagement-CPZ8s7s2.js +2 -0
- package/ui/dist/assets/ViewSwitcher-BUyOOWDI.js +1 -0
- package/ui/dist/assets/alert-dialog-BOmnTkN-.js +7 -0
- package/ui/dist/assets/archive-D5my9zOG.js +1 -0
- package/ui/dist/assets/badge-B4ov81_m.js +1 -0
- package/ui/dist/assets/brain-C53ElFLD.js +1 -0
- package/ui/dist/assets/bug-D0TJoCYn.js +1 -0
- package/ui/dist/assets/calendar-BkWIhKa1.js +1 -0
- package/ui/dist/assets/chevron-up-BRTtndUZ.js +1 -0
- package/ui/dist/assets/circle-x-BN89YhbS.js +1 -0
- package/ui/dist/assets/constants-fc7TFI7u.js +1 -0
- package/ui/dist/assets/cpu-B41x1-vV.js +1 -0
- package/ui/dist/assets/database-D9Cnfmzj.js +1 -0
- package/ui/dist/assets/defineProperty-CoXUr7_6.js +2 -0
- package/ui/dist/assets/dialog-DrWB4EYD.js +1 -0
- package/ui/dist/assets/element-adapter-DL0DQilL.js +4 -0
- package/ui/dist/assets/ellipsis-NuUWekvu.js +1 -0
- package/ui/dist/assets/ellipsis-vertical-BueMfuCw.js +1 -0
- package/ui/dist/assets/file-code-HR9829Jc.js +1 -0
- package/ui/dist/assets/folder-open-C_7oYEqe.js +1 -0
- package/ui/dist/assets/funnel-B5gmNXGf.js +1 -0
- package/ui/dist/assets/git-branch-BRMiJmV3.js +1 -0
- package/ui/dist/assets/git-commit-horizontal-CXOUQeJI.js +1 -0
- package/ui/dist/assets/globe-CCspjvus.js +1 -0
- package/ui/dist/assets/hash-g3102kPC.js +1 -0
- package/ui/dist/assets/history-CNqcBBrV.js +1 -0
- package/ui/dist/assets/index-27mTPKuh.js +1 -0
- package/ui/dist/assets/index-BMx3fH-e.js +1 -0
- package/ui/dist/assets/index-C9jNQXzL.js +1 -0
- package/ui/dist/assets/index-CEZ6R2Uw.js +7 -0
- package/ui/dist/assets/index-DURTouJI.js +1 -0
- package/ui/dist/assets/index-WclMPci1.css +1 -0
- package/ui/dist/assets/index-kb4AJXUB.js +67 -0
- package/ui/dist/assets/layers-CLXiHN6o.js +1 -0
- package/ui/dist/assets/layout-dashboard-B07MFhBs.js +1 -0
- package/ui/dist/assets/lightbulb-B2dgG5ks.js +1 -0
- package/ui/dist/assets/link-2-BxNmr9hL.js +1 -0
- package/ui/dist/assets/markdown-renderer-CjU6hBcW.js +36 -0
- package/ui/dist/assets/message-square-Bf2-CVbt.js +1 -0
- package/ui/dist/assets/pencil-D096Ey62.js +1 -0
- package/ui/dist/assets/play-DfdcSI3x.js +1 -0
- package/ui/dist/assets/popover-BV0QJDQq.js +1 -0
- package/ui/dist/assets/progress-DjPEDJfI.js +1 -0
- package/ui/dist/assets/rocket-CPsTc-5G.js +1 -0
- package/ui/dist/assets/select-LsO16slr.js +1 -0
- package/ui/dist/assets/send-BDYBZDUZ.js +1 -0
- package/ui/dist/assets/server-B3k6noce.js +1 -0
- package/ui/dist/assets/settings-2-Cu4xTjhG.js +1 -0
- package/ui/dist/assets/sheet-BScLnPKX.js +1 -0
- package/ui/dist/assets/shield-check-CQqkwufI.js +1 -0
- package/ui/dist/assets/shield-off-ZFruH9KO.js +1 -0
- package/ui/dist/assets/skeleton-CtkIA_MU.js +1 -0
- package/ui/dist/assets/smartphone-DnoksVkc.js +1 -0
- package/ui/dist/assets/square-uD9ZHMfW.js +1 -0
- package/ui/dist/assets/switch-MQPnwGJK.js +1 -0
- package/ui/dist/assets/table-B8cqlywA.js +1 -0
- package/ui/dist/assets/tag-wEJQRWlV.js +1 -0
- package/ui/dist/assets/textarea-D5LJCOGl.js +1 -0
- package/ui/dist/assets/timer-mbGHegmr.js +1 -0
- package/ui/dist/assets/tooltip-Df1CunSp.js +1 -0
- package/ui/dist/assets/trash-2-B4oAXsX-.js +1 -0
- package/ui/dist/assets/trending-up-BGWxvlmZ.js +1 -0
- package/ui/dist/assets/wand-sparkles-CZy4xvL3.js +1 -0
- package/ui/dist/assets/wrench-ByZkjO6m.js +1 -0
- package/ui/dist/audio-worklets/vad-processor.js +132 -0
- package/ui/dist/brand/profclaw-appicon-192.png +0 -0
- package/ui/dist/brand/profclaw-appicon-512.png +0 -0
- package/ui/dist/brand/profclaw-appicon-shadow.svg +51 -0
- package/ui/dist/brand/profclaw-appicon.svg +50 -0
- package/ui/dist/brand/profclaw-favicon-coral-bg-128.png +0 -0
- package/ui/dist/brand/profclaw-favicon-coral-bg-64.png +0 -0
- package/ui/dist/brand/profclaw-favicon-coral-bg.svg +52 -0
- package/ui/dist/brand/profclaw-favicon-coral-body-128.png +0 -0
- package/ui/dist/brand/profclaw-favicon-coral-body.svg +41 -0
- package/ui/dist/brand/profclaw-favicon-shadow-128.png +0 -0
- package/ui/dist/brand/profclaw-favicon-shadow-64.png +0 -0
- package/ui/dist/brand/profclaw-favicon-shadow.svg +51 -0
- package/ui/dist/brand/profclaw-mark-coral-256.png +0 -0
- package/ui/dist/brand/profclaw-mark-coral-64.png +0 -0
- package/ui/dist/brand/profclaw-mark-coral.svg +31 -0
- package/ui/dist/brand/profclaw-mono-white.svg +18 -0
- package/ui/dist/brand/profclaw-text-dark.svg +18 -0
- package/ui/dist/brand/profclaw-text-light.svg +18 -0
- package/ui/dist/brand/profclaw-wordmark-dark.svg +48 -0
- package/ui/dist/brand/profclaw-wordmark-light.svg +48 -0
- package/ui/dist/brand/safari-pinned-tab.svg +15 -0
- package/ui/dist/favicon/android-chrome-192x192.png +0 -0
- package/ui/dist/favicon/android-chrome-384x384.png +0 -0
- package/ui/dist/favicon/android-chrome-512x512.png +0 -0
- package/ui/dist/favicon/apple-touch-icon.png +0 -0
- package/ui/dist/favicon/browserconfig.xml +9 -0
- package/ui/dist/favicon/favicon-16x16.png +0 -0
- package/ui/dist/favicon/favicon-32x32.png +0 -0
- package/ui/dist/favicon/favicon.ico +0 -0
- package/ui/dist/favicon/mstile-150x150.png +0 -0
- package/ui/dist/favicon/safari-pinned-tab.svg +46 -0
- package/ui/dist/favicon/site.webmanifest +22 -0
- package/ui/dist/index.html +32 -0
- package/ui/dist/manifest.json +49 -0
- package/ui/dist/sw.js +124 -0
- package/ui/dist/vite.svg +1 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security utilities for input validation and XSS prevention
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Maximum allowed file sizes by type (in bytes)
|
|
6
|
+
*/
|
|
7
|
+
export const FILE_SIZE_LIMITS = {
|
|
8
|
+
image: 10 * 1024 * 1024, // 10MB for images
|
|
9
|
+
document: 25 * 1024 * 1024, // 25MB for documents
|
|
10
|
+
attachment: 50 * 1024 * 1024, // 50MB for general attachments
|
|
11
|
+
avatar: 2 * 1024 * 1024, // 2MB for avatars
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Allowed MIME types for file uploads
|
|
15
|
+
*/
|
|
16
|
+
export const ALLOWED_MIME_TYPES = {
|
|
17
|
+
image: ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'],
|
|
18
|
+
document: [
|
|
19
|
+
'application/pdf',
|
|
20
|
+
'application/msword',
|
|
21
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
22
|
+
'application/vnd.ms-excel',
|
|
23
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
24
|
+
'text/plain',
|
|
25
|
+
'text/markdown',
|
|
26
|
+
'text/csv',
|
|
27
|
+
],
|
|
28
|
+
code: [
|
|
29
|
+
'text/javascript',
|
|
30
|
+
'application/javascript',
|
|
31
|
+
'text/typescript',
|
|
32
|
+
'application/json',
|
|
33
|
+
'text/html',
|
|
34
|
+
'text/css',
|
|
35
|
+
'text/x-python',
|
|
36
|
+
'text/x-java-source',
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* HTML entities for XSS prevention
|
|
41
|
+
*/
|
|
42
|
+
const HTML_ENTITIES = {
|
|
43
|
+
'&': '&',
|
|
44
|
+
'<': '<',
|
|
45
|
+
'>': '>',
|
|
46
|
+
'"': '"',
|
|
47
|
+
"'": ''',
|
|
48
|
+
'/': '/',
|
|
49
|
+
'`': '`',
|
|
50
|
+
'=': '=',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Escape HTML special characters to prevent XSS attacks
|
|
54
|
+
* Use this for any user-generated content that will be rendered as HTML
|
|
55
|
+
*/
|
|
56
|
+
export function escapeHtml(input) {
|
|
57
|
+
return input.replace(/[&<>"'`=/]/g, (char) => HTML_ENTITIES[char] || char);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sanitize a string by removing potentially dangerous characters
|
|
61
|
+
* Use for things like filenames, labels, etc.
|
|
62
|
+
*/
|
|
63
|
+
export function sanitizeString(input, options) {
|
|
64
|
+
let result = input;
|
|
65
|
+
// Remove null bytes
|
|
66
|
+
result = result.replace(/\0/g, '');
|
|
67
|
+
// Remove control characters (except newlines if allowed)
|
|
68
|
+
if (options?.allowNewlines) {
|
|
69
|
+
result = result.replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
result = result.replace(/[\x00-\x1F\x7F]/g, '');
|
|
73
|
+
}
|
|
74
|
+
// Escape HTML unless explicitly allowed
|
|
75
|
+
if (!options?.allowHtml) {
|
|
76
|
+
result = escapeHtml(result);
|
|
77
|
+
}
|
|
78
|
+
// Truncate to max length
|
|
79
|
+
if (options?.maxLength && result.length > options.maxLength) {
|
|
80
|
+
result = result.slice(0, options.maxLength);
|
|
81
|
+
}
|
|
82
|
+
return result.trim();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Dangerous shell metacharacters and injection patterns
|
|
86
|
+
*/
|
|
87
|
+
const SHELL_INJECTION_PATTERNS = [
|
|
88
|
+
/[;&|`$(){}[\]<>\\]/, // Shell metacharacters
|
|
89
|
+
/\$\(/, // Command substitution
|
|
90
|
+
/`/, // Backtick substitution
|
|
91
|
+
/\|\|/, // OR operator
|
|
92
|
+
/&&/, // AND operator
|
|
93
|
+
/[><]/, // Redirects
|
|
94
|
+
/\n|\r/, // Newlines (command separators)
|
|
95
|
+
/\0/, // Null byte
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* Allowlist of safe commands for scheduled jobs
|
|
99
|
+
* Extend this list based on your application needs
|
|
100
|
+
*/
|
|
101
|
+
export const ALLOWED_SCRIPT_COMMANDS = new Set([
|
|
102
|
+
// Node/npm commands
|
|
103
|
+
'node',
|
|
104
|
+
'npm',
|
|
105
|
+
'npx',
|
|
106
|
+
'pnpm',
|
|
107
|
+
'yarn',
|
|
108
|
+
// System utilities
|
|
109
|
+
'curl',
|
|
110
|
+
'wget',
|
|
111
|
+
'echo',
|
|
112
|
+
'date',
|
|
113
|
+
// Database utilities
|
|
114
|
+
'sqlite3',
|
|
115
|
+
// Git
|
|
116
|
+
'git',
|
|
117
|
+
]);
|
|
118
|
+
/**
|
|
119
|
+
* Validate a command to prevent command injection
|
|
120
|
+
* Returns validation result with detailed error messages
|
|
121
|
+
*/
|
|
122
|
+
export function validateCommand(command, args) {
|
|
123
|
+
// Check the command itself
|
|
124
|
+
if (!command || typeof command !== 'string') {
|
|
125
|
+
return { valid: false, error: 'Command is required' };
|
|
126
|
+
}
|
|
127
|
+
// Extract base command (remove path)
|
|
128
|
+
const baseCommand = command.includes('/')
|
|
129
|
+
? command.split('/').pop() || command
|
|
130
|
+
: command;
|
|
131
|
+
// Check if command is in allowlist
|
|
132
|
+
if (!ALLOWED_SCRIPT_COMMANDS.has(baseCommand)) {
|
|
133
|
+
return {
|
|
134
|
+
valid: false,
|
|
135
|
+
error: `Command '${baseCommand}' is not in the allowlist. Allowed commands: ${[...ALLOWED_SCRIPT_COMMANDS].join(', ')}`
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Check command for injection patterns
|
|
139
|
+
for (const pattern of SHELL_INJECTION_PATTERNS) {
|
|
140
|
+
if (pattern.test(command)) {
|
|
141
|
+
return { valid: false, error: 'Command contains potentially dangerous characters' };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Validate and sanitize arguments
|
|
145
|
+
const sanitizedArgs = [];
|
|
146
|
+
if (args) {
|
|
147
|
+
for (const arg of args) {
|
|
148
|
+
if (typeof arg !== 'string') {
|
|
149
|
+
return { valid: false, error: 'Arguments must be strings' };
|
|
150
|
+
}
|
|
151
|
+
// Check each argument for injection
|
|
152
|
+
for (const pattern of SHELL_INJECTION_PATTERNS) {
|
|
153
|
+
if (pattern.test(arg)) {
|
|
154
|
+
return {
|
|
155
|
+
valid: false,
|
|
156
|
+
error: `Argument '${arg.slice(0, 20)}...' contains potentially dangerous characters`
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Sanitize: escape single quotes and wrap in quotes if has spaces
|
|
161
|
+
let sanitized = arg;
|
|
162
|
+
if (arg.includes(' ') || arg.includes("'") || arg.includes('"')) {
|
|
163
|
+
// Use single quotes and escape internal single quotes
|
|
164
|
+
sanitized = "'" + arg.replace(/'/g, "'\\''") + "'";
|
|
165
|
+
}
|
|
166
|
+
sanitizedArgs.push(sanitized);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
valid: true,
|
|
171
|
+
sanitizedCommand: command,
|
|
172
|
+
sanitizedArgs,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Sanitize a filename to prevent path traversal and other attacks
|
|
177
|
+
*/
|
|
178
|
+
export function sanitizeFilename(filename) {
|
|
179
|
+
// Remove path separators
|
|
180
|
+
let result = filename.replace(/[/\\]/g, '');
|
|
181
|
+
// Remove leading dots (hidden files / directory traversal)
|
|
182
|
+
result = result.replace(/^\.+/, '');
|
|
183
|
+
// Remove control characters
|
|
184
|
+
result = result.replace(/[\x00-\x1F\x7F]/g, '');
|
|
185
|
+
// Remove potentially dangerous characters
|
|
186
|
+
result = result.replace(/[<>:"|?*]/g, '');
|
|
187
|
+
// Limit length
|
|
188
|
+
if (result.length > 255) {
|
|
189
|
+
const ext = result.slice(result.lastIndexOf('.'));
|
|
190
|
+
const name = result.slice(0, result.lastIndexOf('.'));
|
|
191
|
+
result = name.slice(0, 255 - ext.length) + ext;
|
|
192
|
+
}
|
|
193
|
+
// If nothing left, use default
|
|
194
|
+
return result || 'unnamed_file';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Validate file upload metadata
|
|
198
|
+
*/
|
|
199
|
+
export function validateFileUpload(file, options) {
|
|
200
|
+
const errors = [];
|
|
201
|
+
// Check file size
|
|
202
|
+
const maxSize = options?.maxSize ??
|
|
203
|
+
(options?.category ? FILE_SIZE_LIMITS[options.category] : FILE_SIZE_LIMITS.attachment);
|
|
204
|
+
if (file.fileSize && file.fileSize > maxSize) {
|
|
205
|
+
const maxMB = (maxSize / (1024 * 1024)).toFixed(1);
|
|
206
|
+
const actualMB = (file.fileSize / (1024 * 1024)).toFixed(1);
|
|
207
|
+
errors.push(`File size ${actualMB}MB exceeds maximum allowed ${maxMB}MB`);
|
|
208
|
+
}
|
|
209
|
+
// Check file type if restrictions specified
|
|
210
|
+
if (options?.allowedTypes && file.fileType) {
|
|
211
|
+
if (!options.allowedTypes.includes(file.fileType)) {
|
|
212
|
+
errors.push(`File type '${file.fileType}' is not allowed`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Validate filename
|
|
216
|
+
const sanitizedName = sanitizeFilename(file.fileName);
|
|
217
|
+
if (sanitizedName !== file.fileName) {
|
|
218
|
+
// Name was modified, could indicate attack attempt
|
|
219
|
+
errors.push('Filename contains invalid characters');
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
valid: errors.length === 0,
|
|
223
|
+
errors,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Validate URL to prevent SSRF and unsafe redirects
|
|
228
|
+
*/
|
|
229
|
+
export function validateUrl(url, options) {
|
|
230
|
+
try {
|
|
231
|
+
const parsed = new URL(url);
|
|
232
|
+
// Check protocol
|
|
233
|
+
const allowedProtocols = options?.allowedProtocols ?? ['https:', 'http:'];
|
|
234
|
+
if (!allowedProtocols.includes(parsed.protocol)) {
|
|
235
|
+
return { valid: false, error: `Protocol ${parsed.protocol} not allowed` };
|
|
236
|
+
}
|
|
237
|
+
// Block localhost/internal IPs if specified
|
|
238
|
+
if (options?.blockLocalhost !== false) {
|
|
239
|
+
const host = parsed.hostname.toLowerCase();
|
|
240
|
+
const localPatterns = [
|
|
241
|
+
'localhost',
|
|
242
|
+
'127.0.0.1',
|
|
243
|
+
'0.0.0.0',
|
|
244
|
+
'::1',
|
|
245
|
+
/^10\./,
|
|
246
|
+
/^172\.(1[6-9]|2[0-9]|3[0-1])\./,
|
|
247
|
+
/^192\.168\./,
|
|
248
|
+
/^169\.254\./,
|
|
249
|
+
];
|
|
250
|
+
for (const pattern of localPatterns) {
|
|
251
|
+
if (typeof pattern === 'string') {
|
|
252
|
+
if (host === pattern || host.endsWith('.' + pattern)) {
|
|
253
|
+
return { valid: false, error: 'Internal URLs not allowed' };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else if (pattern.test(host)) {
|
|
257
|
+
return { valid: false, error: 'Internal URLs not allowed' };
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Check allowed hosts if specified
|
|
262
|
+
if (options?.allowedHosts && options.allowedHosts.length > 0) {
|
|
263
|
+
if (!options.allowedHosts.includes(parsed.hostname)) {
|
|
264
|
+
return { valid: false, error: `Host ${parsed.hostname} not in allowed list` };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return { valid: true };
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return { valid: false, error: 'Invalid URL format' };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Check if a redirect URL is safe (same-origin or relative path)
|
|
275
|
+
* Use this to prevent open redirect vulnerabilities
|
|
276
|
+
*/
|
|
277
|
+
export function isSafeRedirectUrl(redirectUrl, requestUrl) {
|
|
278
|
+
try {
|
|
279
|
+
// Relative paths starting with / are safe (but not //)
|
|
280
|
+
if (redirectUrl.startsWith('/') && !redirectUrl.startsWith('//')) {
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
// Parse URLs and compare origins
|
|
284
|
+
const request = new URL(requestUrl);
|
|
285
|
+
const target = new URL(redirectUrl, request.origin);
|
|
286
|
+
return target.origin === request.origin;
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Redact sensitive values from objects before logging
|
|
294
|
+
* Returns a deep copy with sensitive fields replaced
|
|
295
|
+
*/
|
|
296
|
+
export function redactSensitive(obj, additionalKeys) {
|
|
297
|
+
// All keys here should be lowercase since we compare against key.toLowerCase()
|
|
298
|
+
const sensitiveKeys = new Set([
|
|
299
|
+
'password',
|
|
300
|
+
'token',
|
|
301
|
+
'secret',
|
|
302
|
+
'apikey',
|
|
303
|
+
'api_key',
|
|
304
|
+
'accesstoken',
|
|
305
|
+
'access_token',
|
|
306
|
+
'refreshtoken',
|
|
307
|
+
'refresh_token',
|
|
308
|
+
'sessiontoken',
|
|
309
|
+
'session_token',
|
|
310
|
+
'authorization',
|
|
311
|
+
'cookie',
|
|
312
|
+
'credentials',
|
|
313
|
+
'privatekey',
|
|
314
|
+
'private_key',
|
|
315
|
+
...(additionalKeys?.map(k => k.toLowerCase()) ?? []),
|
|
316
|
+
]);
|
|
317
|
+
function redact(value, key) {
|
|
318
|
+
if (value === null || value === undefined) {
|
|
319
|
+
return value;
|
|
320
|
+
}
|
|
321
|
+
// Check if this key should be redacted
|
|
322
|
+
if (key && sensitiveKeys.has(key.toLowerCase())) {
|
|
323
|
+
return '[REDACTED]';
|
|
324
|
+
}
|
|
325
|
+
if (typeof value === 'string') {
|
|
326
|
+
// Redact values that look like secrets
|
|
327
|
+
if (value.length > 20 && /^[a-zA-Z0-9+/=_-]+$/.test(value)) {
|
|
328
|
+
// Looks like a base64 or JWT token
|
|
329
|
+
return value.slice(0, 8) + '...[REDACTED]';
|
|
330
|
+
}
|
|
331
|
+
return value;
|
|
332
|
+
}
|
|
333
|
+
if (Array.isArray(value)) {
|
|
334
|
+
return value.map((item) => redact(item));
|
|
335
|
+
}
|
|
336
|
+
if (typeof value === 'object') {
|
|
337
|
+
const result = {};
|
|
338
|
+
for (const [k, v] of Object.entries(value)) {
|
|
339
|
+
result[k] = redact(v, k);
|
|
340
|
+
}
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
return value;
|
|
344
|
+
}
|
|
345
|
+
return redact(obj);
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice I/O Service Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for:
|
|
5
|
+
* - STT (speech-to-text) via OpenAI Whisper or Deepgram
|
|
6
|
+
* - TTS (text-to-speech) via OpenAI TTS, ElevenLabs, or system fallback
|
|
7
|
+
*
|
|
8
|
+
* Provider selection is based on available environment variables.
|
|
9
|
+
*/
|
|
10
|
+
export interface TranscribeOptions {
|
|
11
|
+
/** ISO 639-1 language code (e.g. 'en', 'fr'). Auto-detected if omitted. */
|
|
12
|
+
language?: string;
|
|
13
|
+
/** Model identifier: 'whisper-1', 'deepgram-nova-2', etc. */
|
|
14
|
+
model?: string;
|
|
15
|
+
/** Explicit provider override. */
|
|
16
|
+
provider?: 'whisper' | 'deepgram';
|
|
17
|
+
/** Audio format hint: 'wav', 'mp3', 'webm', 'ogg', etc. */
|
|
18
|
+
format?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TranscribeResult {
|
|
21
|
+
text: string;
|
|
22
|
+
language?: string;
|
|
23
|
+
duration_ms?: number;
|
|
24
|
+
confidence?: number;
|
|
25
|
+
segments?: {
|
|
26
|
+
start: number;
|
|
27
|
+
end: number;
|
|
28
|
+
text: string;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
export interface SynthesizeOptions {
|
|
32
|
+
/** Voice name or ID. */
|
|
33
|
+
voice?: string;
|
|
34
|
+
/** Model identifier: 'tts-1', 'tts-1-hd', 'eleven_multilingual_v2'. */
|
|
35
|
+
model?: string;
|
|
36
|
+
/** Explicit provider override. */
|
|
37
|
+
provider?: 'openai' | 'elevenlabs' | 'system';
|
|
38
|
+
/** Playback speed multiplier (0.25 to 4.0). */
|
|
39
|
+
speed?: number;
|
|
40
|
+
/** Output audio format. */
|
|
41
|
+
format?: 'mp3' | 'opus' | 'aac' | 'wav';
|
|
42
|
+
}
|
|
43
|
+
export interface SynthesizeResult {
|
|
44
|
+
audio: Buffer;
|
|
45
|
+
format: string;
|
|
46
|
+
duration_ms?: number;
|
|
47
|
+
characters_used?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface VoiceInfo {
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
provider: string;
|
|
53
|
+
language?: string;
|
|
54
|
+
gender?: string;
|
|
55
|
+
preview_url?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface VoiceService {
|
|
58
|
+
transcribe(audio: Buffer, options?: TranscribeOptions): Promise<TranscribeResult>;
|
|
59
|
+
synthesize(text: string, options?: SynthesizeOptions): Promise<SynthesizeResult>;
|
|
60
|
+
getAvailableVoices(): Promise<VoiceInfo[]>;
|
|
61
|
+
/** Alias for getAvailableVoices - lists all voices across configured providers. */
|
|
62
|
+
listVoices(): Promise<VoiceInfo[]>;
|
|
63
|
+
isSTTAvailable(): boolean;
|
|
64
|
+
isTTSAvailable(): boolean;
|
|
65
|
+
/** Returns the active TTS provider name, or null if none configured. */
|
|
66
|
+
getTTSProvider(): string | null;
|
|
67
|
+
/** Returns the active STT provider name, or null if none configured. */
|
|
68
|
+
getSTTProvider(): string | null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns the shared VoiceService singleton.
|
|
72
|
+
* Initializes it on first call and probes system TTS availability.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getVoiceService(): Promise<VoiceService>;
|
|
75
|
+
/**
|
|
76
|
+
* Reset the singleton (useful in tests).
|
|
77
|
+
*/
|
|
78
|
+
export declare function resetVoiceService(): void;
|
|
79
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice I/O Service Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for:
|
|
5
|
+
* - STT (speech-to-text) via OpenAI Whisper or Deepgram
|
|
6
|
+
* - TTS (text-to-speech) via OpenAI TTS, ElevenLabs, or system fallback
|
|
7
|
+
*
|
|
8
|
+
* Provider selection is based on available environment variables.
|
|
9
|
+
*/
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { transcribeWithWhisper } from './stt/whisper.js';
|
|
12
|
+
import { synthesizeWithOpenAI, getOpenAIVoices, } from './tts/openai-tts.js';
|
|
13
|
+
import { synthesizeWithElevenLabs, getElevenLabsVoices, } from './tts/elevenlabs.js';
|
|
14
|
+
import { synthesizeWithSystem, isSystemTTSAvailable, probeSystemTTSAvailability, } from './tts/system.js';
|
|
15
|
+
// Provider detection helpers
|
|
16
|
+
function detectSTTProvider() {
|
|
17
|
+
if (process.env.OPENAI_API_KEY)
|
|
18
|
+
return 'whisper';
|
|
19
|
+
if (process.env.DEEPGRAM_API_KEY)
|
|
20
|
+
return 'deepgram';
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function detectTTSProvider() {
|
|
24
|
+
if (process.env.ELEVENLABS_API_KEY)
|
|
25
|
+
return 'elevenlabs';
|
|
26
|
+
if (process.env.OPENAI_API_KEY)
|
|
27
|
+
return 'openai';
|
|
28
|
+
if (isSystemTTSAvailable())
|
|
29
|
+
return 'system';
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// VoiceServiceImpl
|
|
33
|
+
class VoiceServiceImpl {
|
|
34
|
+
sttProvider;
|
|
35
|
+
ttsProvider;
|
|
36
|
+
constructor() {
|
|
37
|
+
this.sttProvider = detectSTTProvider();
|
|
38
|
+
this.ttsProvider = detectTTSProvider();
|
|
39
|
+
logger.info('[Voice] Service initialized', {
|
|
40
|
+
stt: this.sttProvider ?? 'unavailable',
|
|
41
|
+
tts: this.ttsProvider ?? 'unavailable',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
isSTTAvailable() {
|
|
45
|
+
return this.sttProvider !== null;
|
|
46
|
+
}
|
|
47
|
+
isTTSAvailable() {
|
|
48
|
+
return this.ttsProvider !== null;
|
|
49
|
+
}
|
|
50
|
+
getTTSProvider() {
|
|
51
|
+
return this.ttsProvider;
|
|
52
|
+
}
|
|
53
|
+
getSTTProvider() {
|
|
54
|
+
return this.sttProvider;
|
|
55
|
+
}
|
|
56
|
+
async listVoices() {
|
|
57
|
+
return this.getAvailableVoices();
|
|
58
|
+
}
|
|
59
|
+
async transcribe(audio, options) {
|
|
60
|
+
// Allow explicit override via options.provider
|
|
61
|
+
const provider = options?.provider ?? this.sttProvider;
|
|
62
|
+
if (!provider) {
|
|
63
|
+
throw new Error('No STT provider available. Set OPENAI_API_KEY or DEEPGRAM_API_KEY.');
|
|
64
|
+
}
|
|
65
|
+
logger.info('[Voice] Transcribing', { provider, bufferSize: audio.length });
|
|
66
|
+
switch (provider) {
|
|
67
|
+
case 'whisper':
|
|
68
|
+
return transcribeWithWhisper(audio, options);
|
|
69
|
+
case 'deepgram':
|
|
70
|
+
// Deepgram adapter is not yet implemented - delegate gracefully.
|
|
71
|
+
throw new Error('Deepgram STT provider is not yet implemented. Use provider: "whisper" instead.');
|
|
72
|
+
default: {
|
|
73
|
+
// TypeScript exhaustive check via never
|
|
74
|
+
const unreachable = provider;
|
|
75
|
+
throw new Error(`Unknown STT provider: ${String(unreachable)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async synthesize(text, options) {
|
|
80
|
+
if (!text.trim()) {
|
|
81
|
+
throw new Error('Text must not be empty');
|
|
82
|
+
}
|
|
83
|
+
// Allow explicit override via options.provider
|
|
84
|
+
const provider = options?.provider ?? this.ttsProvider;
|
|
85
|
+
if (!provider) {
|
|
86
|
+
throw new Error('No TTS provider available. Set ELEVENLABS_API_KEY, OPENAI_API_KEY, or ensure say/espeak is installed.');
|
|
87
|
+
}
|
|
88
|
+
logger.info('[Voice] Synthesizing', { provider, chars: text.length });
|
|
89
|
+
switch (provider) {
|
|
90
|
+
case 'elevenlabs':
|
|
91
|
+
return synthesizeWithElevenLabs(text, options);
|
|
92
|
+
case 'openai':
|
|
93
|
+
return synthesizeWithOpenAI(text, options);
|
|
94
|
+
case 'system':
|
|
95
|
+
return synthesizeWithSystem(text, options);
|
|
96
|
+
default: {
|
|
97
|
+
const unreachable = provider;
|
|
98
|
+
throw new Error(`Unknown TTS provider: ${String(unreachable)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async getAvailableVoices() {
|
|
103
|
+
const results = [];
|
|
104
|
+
// Collect from all configured providers in parallel where possible
|
|
105
|
+
const tasks = [];
|
|
106
|
+
if (process.env.OPENAI_API_KEY) {
|
|
107
|
+
tasks.push(Promise.resolve(getOpenAIVoices()));
|
|
108
|
+
}
|
|
109
|
+
if (process.env.ELEVENLABS_API_KEY) {
|
|
110
|
+
tasks.push(getElevenLabsVoices().catch((error) => {
|
|
111
|
+
logger.warn('[Voice] Failed to fetch ElevenLabs voices', {
|
|
112
|
+
error: error instanceof Error ? error.message : 'Unknown',
|
|
113
|
+
});
|
|
114
|
+
return [];
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
const settled = await Promise.all(tasks);
|
|
118
|
+
for (const list of settled) {
|
|
119
|
+
results.push(...list);
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Singleton accessor
|
|
125
|
+
let instance = null;
|
|
126
|
+
/**
|
|
127
|
+
* Returns the shared VoiceService singleton.
|
|
128
|
+
* Initializes it on first call and probes system TTS availability.
|
|
129
|
+
*/
|
|
130
|
+
export async function getVoiceService() {
|
|
131
|
+
if (instance)
|
|
132
|
+
return instance;
|
|
133
|
+
// Warm the system TTS availability cache before constructing
|
|
134
|
+
await probeSystemTTSAvailability().catch(() => undefined);
|
|
135
|
+
instance = new VoiceServiceImpl();
|
|
136
|
+
return instance;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Reset the singleton (useful in tests).
|
|
140
|
+
*/
|
|
141
|
+
export function resetVoiceService() {
|
|
142
|
+
instance = null;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Whisper STT Provider
|
|
3
|
+
*
|
|
4
|
+
* Transcribes audio using OpenAI's Whisper API.
|
|
5
|
+
* Supports language detection, segmentation, and confidence scoring.
|
|
6
|
+
*/
|
|
7
|
+
import type { TranscribeOptions, TranscribeResult } from '../index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Transcribe audio using OpenAI Whisper.
|
|
10
|
+
* Requires OPENAI_API_KEY environment variable.
|
|
11
|
+
*/
|
|
12
|
+
export declare function transcribeWithWhisper(audio: Buffer, options?: TranscribeOptions): Promise<TranscribeResult>;
|
|
13
|
+
//# sourceMappingURL=whisper.d.ts.map
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Whisper STT Provider
|
|
3
|
+
*
|
|
4
|
+
* Transcribes audio using OpenAI's Whisper API.
|
|
5
|
+
* Supports language detection, segmentation, and confidence scoring.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
const WHISPER_API_URL = 'https://api.openai.com/v1/audio/transcriptions';
|
|
10
|
+
const DEFAULT_MODEL = 'whisper-1';
|
|
11
|
+
// Zod schema for the verbose_json response from Whisper
|
|
12
|
+
const WhisperSegmentSchema = z.object({
|
|
13
|
+
id: z.number(),
|
|
14
|
+
start: z.number(),
|
|
15
|
+
end: z.number(),
|
|
16
|
+
text: z.string(),
|
|
17
|
+
avg_logprob: z.number().optional(),
|
|
18
|
+
});
|
|
19
|
+
const WhisperResponseSchema = z.object({
|
|
20
|
+
text: z.string(),
|
|
21
|
+
language: z.string().optional(),
|
|
22
|
+
duration: z.number().optional(),
|
|
23
|
+
segments: z.array(WhisperSegmentSchema).optional(),
|
|
24
|
+
});
|
|
25
|
+
function computeConfidence(segments) {
|
|
26
|
+
if (!segments || segments.length === 0)
|
|
27
|
+
return undefined;
|
|
28
|
+
const validSegments = segments.filter((s) => typeof s.avg_logprob === 'number');
|
|
29
|
+
if (validSegments.length === 0)
|
|
30
|
+
return undefined;
|
|
31
|
+
const avgLogProb = validSegments.reduce((sum, s) => sum + (s.avg_logprob ?? 0), 0) /
|
|
32
|
+
validSegments.length;
|
|
33
|
+
// Convert log probability to a 0-1 confidence score
|
|
34
|
+
return Math.min(1, Math.max(0, Math.exp(avgLogProb)));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Transcribe audio using OpenAI Whisper.
|
|
38
|
+
* Requires OPENAI_API_KEY environment variable.
|
|
39
|
+
*/
|
|
40
|
+
export async function transcribeWithWhisper(audio, options) {
|
|
41
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
42
|
+
if (!apiKey) {
|
|
43
|
+
throw new Error('OPENAI_API_KEY is not set');
|
|
44
|
+
}
|
|
45
|
+
const model = options?.model ?? DEFAULT_MODEL;
|
|
46
|
+
const startMs = Date.now();
|
|
47
|
+
logger.info('[Whisper] Transcribing audio', {
|
|
48
|
+
model,
|
|
49
|
+
language: options?.language,
|
|
50
|
+
bufferSize: audio.length,
|
|
51
|
+
});
|
|
52
|
+
const form = new FormData();
|
|
53
|
+
form.append('file', new Blob([audio]), 'audio.webm');
|
|
54
|
+
form.append('model', model);
|
|
55
|
+
form.append('response_format', 'verbose_json');
|
|
56
|
+
if (options?.language) {
|
|
57
|
+
form.append('language', options.language);
|
|
58
|
+
}
|
|
59
|
+
let rawResponse;
|
|
60
|
+
try {
|
|
61
|
+
rawResponse = await fetch(WHISPER_API_URL, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: {
|
|
64
|
+
Authorization: `Bearer ${apiKey}`,
|
|
65
|
+
},
|
|
66
|
+
body: form,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
logger.error('[Whisper] Network error during transcription', {
|
|
71
|
+
error: error instanceof Error ? error.message : 'Unknown',
|
|
72
|
+
});
|
|
73
|
+
throw new Error(`Whisper network error: ${error instanceof Error ? error.message : 'Unknown'}`);
|
|
74
|
+
}
|
|
75
|
+
if (!rawResponse.ok) {
|
|
76
|
+
const errorBody = await rawResponse.text();
|
|
77
|
+
logger.error('[Whisper] API error', {
|
|
78
|
+
status: rawResponse.status,
|
|
79
|
+
body: errorBody,
|
|
80
|
+
});
|
|
81
|
+
throw new Error(`Whisper API error ${rawResponse.status}: ${errorBody}`);
|
|
82
|
+
}
|
|
83
|
+
let json;
|
|
84
|
+
try {
|
|
85
|
+
json = await rawResponse.json();
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Whisper response parse error: ${error instanceof Error ? error.message : 'Unknown'}`);
|
|
89
|
+
}
|
|
90
|
+
const parsed = WhisperResponseSchema.safeParse(json);
|
|
91
|
+
if (!parsed.success) {
|
|
92
|
+
logger.error('[Whisper] Unexpected response shape', {
|
|
93
|
+
issues: parsed.error.issues,
|
|
94
|
+
});
|
|
95
|
+
throw new Error(`Unexpected Whisper response: ${parsed.error.message}`);
|
|
96
|
+
}
|
|
97
|
+
const data = parsed.data;
|
|
98
|
+
const durationMs = Date.now() - startMs;
|
|
99
|
+
logger.info('[Whisper] Transcription complete', {
|
|
100
|
+
language: data.language,
|
|
101
|
+
audioDuration: data.duration,
|
|
102
|
+
elapsed: durationMs,
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
text: data.text.trim(),
|
|
106
|
+
language: data.language,
|
|
107
|
+
duration_ms: data.duration != null ? Math.round(data.duration * 1000) : undefined,
|
|
108
|
+
confidence: computeConfidence(data.segments),
|
|
109
|
+
segments: data.segments?.map((s) => ({
|
|
110
|
+
start: s.start,
|
|
111
|
+
end: s.end,
|
|
112
|
+
text: s.text,
|
|
113
|
+
})),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=whisper.js.map
|