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,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Fallback System
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic failover between AI providers when requests fail.
|
|
5
|
+
* Based on OpenClaw's sophisticated model fallback patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '../../utils/logger.js';
|
|
8
|
+
import { FailoverError, coerceToFailoverError, describeFailoverError, isFailoverError, shouldRethrowWithoutFallback, getUserFriendlyErrorMessage, } from './error.js';
|
|
9
|
+
// Cooldown Management
|
|
10
|
+
/**
|
|
11
|
+
* Cooldown durations by failure reason (in milliseconds)
|
|
12
|
+
*/
|
|
13
|
+
const COOLDOWN_DURATIONS = {
|
|
14
|
+
rate_limit: 60000, // 1 minute for rate limits
|
|
15
|
+
billing: 300000, // 5 minutes for billing issues
|
|
16
|
+
auth: 300000, // 5 minutes for auth issues (need user action)
|
|
17
|
+
timeout: 30000, // 30 seconds for timeouts
|
|
18
|
+
format: 0, // No cooldown for format errors (may be request-specific)
|
|
19
|
+
unknown: 60000, // 1 minute for unknown errors
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* In-memory provider cooldown tracking
|
|
23
|
+
* Maps provider name to cooldown entry
|
|
24
|
+
*/
|
|
25
|
+
const providerCooldowns = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Check if a provider is currently in cooldown
|
|
28
|
+
*/
|
|
29
|
+
export function isProviderInCooldown(provider) {
|
|
30
|
+
const cooldown = providerCooldowns.get(provider);
|
|
31
|
+
if (!cooldown)
|
|
32
|
+
return false;
|
|
33
|
+
if (Date.now() >= cooldown.cooldownUntil) {
|
|
34
|
+
// Cooldown expired, remove it
|
|
35
|
+
providerCooldowns.delete(provider);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the remaining cooldown time for a provider
|
|
42
|
+
*/
|
|
43
|
+
export function getProviderCooldownRemaining(provider) {
|
|
44
|
+
const cooldown = providerCooldowns.get(provider);
|
|
45
|
+
if (!cooldown)
|
|
46
|
+
return 0;
|
|
47
|
+
const remaining = cooldown.cooldownUntil - Date.now();
|
|
48
|
+
return remaining > 0 ? remaining : 0;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Put a provider into cooldown
|
|
52
|
+
*/
|
|
53
|
+
export function setProviderCooldown(provider, reason, error) {
|
|
54
|
+
const duration = COOLDOWN_DURATIONS[reason] || COOLDOWN_DURATIONS.unknown;
|
|
55
|
+
if (duration === 0)
|
|
56
|
+
return;
|
|
57
|
+
providerCooldowns.set(provider, {
|
|
58
|
+
provider,
|
|
59
|
+
reason,
|
|
60
|
+
cooldownUntil: Date.now() + duration,
|
|
61
|
+
lastError: error,
|
|
62
|
+
});
|
|
63
|
+
logger.info('[ModelFallback] Provider put in cooldown', {
|
|
64
|
+
provider,
|
|
65
|
+
reason,
|
|
66
|
+
durationMs: duration,
|
|
67
|
+
error: error.substring(0, 100),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Clear cooldown for a provider (e.g., after successful request)
|
|
72
|
+
*/
|
|
73
|
+
export function clearProviderCooldown(provider) {
|
|
74
|
+
providerCooldowns.delete(provider);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get all providers currently in cooldown
|
|
78
|
+
*/
|
|
79
|
+
export function getProvidersInCooldown() {
|
|
80
|
+
const now = Date.now();
|
|
81
|
+
const result = [];
|
|
82
|
+
for (const [provider, cooldown] of providerCooldowns.entries()) {
|
|
83
|
+
if (now < cooldown.cooldownUntil) {
|
|
84
|
+
result.push(cooldown);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
providerCooldowns.delete(provider);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Default models for each provider
|
|
94
|
+
*/
|
|
95
|
+
const DEFAULT_MODELS = {
|
|
96
|
+
anthropic: 'claude-sonnet-4-5-20251014',
|
|
97
|
+
openai: 'gpt-4.1',
|
|
98
|
+
azure: 'default', // Uses configured deployment - not hardcoded
|
|
99
|
+
google: 'gemini-2.5-pro-preview-05-06',
|
|
100
|
+
groq: 'llama-3.3-70b-versatile',
|
|
101
|
+
ollama: 'llama3.2',
|
|
102
|
+
openrouter: 'anthropic/claude-3.5-sonnet',
|
|
103
|
+
xai: 'grok-2',
|
|
104
|
+
mistral: 'mistral-large-latest',
|
|
105
|
+
cohere: 'command-r-plus',
|
|
106
|
+
perplexity: 'llama-3.1-sonar-huge-128k-online',
|
|
107
|
+
deepseek: 'deepseek-chat',
|
|
108
|
+
together: 'meta-llama/Llama-3.3-70B-Instruct-Turbo',
|
|
109
|
+
cerebras: 'llama3.1-70b',
|
|
110
|
+
fireworks: 'accounts/fireworks/models/llama-v3p1-70b-instruct',
|
|
111
|
+
copilot: 'gpt-4o',
|
|
112
|
+
bedrock: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
|
|
113
|
+
zhipu: 'glm-4-plus',
|
|
114
|
+
moonshot: 'moonshot-v1-32k',
|
|
115
|
+
qwen: 'qwen-max',
|
|
116
|
+
replicate: 'meta/llama-3.1-405b-instruct',
|
|
117
|
+
'github-models': 'gpt-4o',
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Preferred fallback order for providers
|
|
121
|
+
*/
|
|
122
|
+
const FALLBACK_PROVIDER_ORDER = [
|
|
123
|
+
'anthropic',
|
|
124
|
+
'openai',
|
|
125
|
+
'google',
|
|
126
|
+
'azure',
|
|
127
|
+
'bedrock',
|
|
128
|
+
'groq',
|
|
129
|
+
'openrouter',
|
|
130
|
+
'mistral',
|
|
131
|
+
'deepseek',
|
|
132
|
+
'together',
|
|
133
|
+
'xai',
|
|
134
|
+
'zhipu',
|
|
135
|
+
'moonshot',
|
|
136
|
+
'qwen',
|
|
137
|
+
'cohere',
|
|
138
|
+
'perplexity',
|
|
139
|
+
'fireworks',
|
|
140
|
+
'cerebras',
|
|
141
|
+
'replicate',
|
|
142
|
+
'github-models',
|
|
143
|
+
'ollama',
|
|
144
|
+
'copilot',
|
|
145
|
+
];
|
|
146
|
+
/**
|
|
147
|
+
* Build the list of model candidates for fallback
|
|
148
|
+
*/
|
|
149
|
+
export function buildFallbackCandidates(params) {
|
|
150
|
+
const seen = new Set();
|
|
151
|
+
const candidates = [];
|
|
152
|
+
const addCandidate = (provider, model) => {
|
|
153
|
+
const key = `${provider}/${model}`;
|
|
154
|
+
if (seen.has(key))
|
|
155
|
+
return;
|
|
156
|
+
seen.add(key);
|
|
157
|
+
candidates.push({ provider, model });
|
|
158
|
+
};
|
|
159
|
+
// 1. Add primary model first
|
|
160
|
+
addCandidate(params.primaryProvider, params.primaryModel);
|
|
161
|
+
// 2. If fallback overrides are provided, use those
|
|
162
|
+
if (params.fallbackOverrides && params.fallbackOverrides.length > 0) {
|
|
163
|
+
for (const fallback of params.fallbackOverrides) {
|
|
164
|
+
const parts = fallback.split('/');
|
|
165
|
+
if (parts.length === 2) {
|
|
166
|
+
const [provider, model] = parts;
|
|
167
|
+
if (params.configuredProviders.includes(provider)) {
|
|
168
|
+
addCandidate(provider, model);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return candidates;
|
|
173
|
+
}
|
|
174
|
+
// 3. Add other configured providers in preferred order
|
|
175
|
+
for (const provider of FALLBACK_PROVIDER_ORDER) {
|
|
176
|
+
if (provider === params.primaryProvider)
|
|
177
|
+
continue;
|
|
178
|
+
if (!params.configuredProviders.includes(provider))
|
|
179
|
+
continue;
|
|
180
|
+
// Use the resolver if provided (gets user's configured model for provider)
|
|
181
|
+
// Otherwise fall back to hardcoded defaults
|
|
182
|
+
const model = params.modelResolver?.(provider) || DEFAULT_MODELS[provider] || 'default';
|
|
183
|
+
addCandidate(provider, model);
|
|
184
|
+
}
|
|
185
|
+
return candidates;
|
|
186
|
+
}
|
|
187
|
+
// Run With Model Fallback
|
|
188
|
+
/**
|
|
189
|
+
* Run an operation with automatic model fallback.
|
|
190
|
+
* Tries the primary provider first, then falls back to other providers on failure.
|
|
191
|
+
*
|
|
192
|
+
* @param params.primaryProvider - The primary provider to try first
|
|
193
|
+
* @param params.primaryModel - The primary model to try first
|
|
194
|
+
* @param params.configuredProviders - List of all configured/available providers
|
|
195
|
+
* @param params.fallbackOverrides - Optional explicit fallback list (e.g., ["openai/gpt-4", "anthropic/claude-3"])
|
|
196
|
+
* @param params.modelResolver - Optional resolver to get provider-specific configured models
|
|
197
|
+
* @param params.run - The operation to run with provider and model
|
|
198
|
+
* @param params.onError - Optional callback when an attempt fails
|
|
199
|
+
* @returns Result with the successful provider/model and attempt history
|
|
200
|
+
*/
|
|
201
|
+
export async function runWithModelFallback(params) {
|
|
202
|
+
const candidates = buildFallbackCandidates({
|
|
203
|
+
primaryProvider: params.primaryProvider,
|
|
204
|
+
primaryModel: params.primaryModel,
|
|
205
|
+
configuredProviders: params.configuredProviders,
|
|
206
|
+
fallbackOverrides: params.fallbackOverrides,
|
|
207
|
+
modelResolver: params.modelResolver,
|
|
208
|
+
});
|
|
209
|
+
const attempts = [];
|
|
210
|
+
let lastError;
|
|
211
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
212
|
+
const candidate = candidates[i];
|
|
213
|
+
// Check if provider is in cooldown
|
|
214
|
+
if (isProviderInCooldown(candidate.provider)) {
|
|
215
|
+
const remaining = getProviderCooldownRemaining(candidate.provider);
|
|
216
|
+
attempts.push({
|
|
217
|
+
provider: candidate.provider,
|
|
218
|
+
model: candidate.model,
|
|
219
|
+
error: `Provider ${candidate.provider} is in cooldown (${Math.ceil(remaining / 1000)}s remaining)`,
|
|
220
|
+
reason: 'rate_limit',
|
|
221
|
+
skippedDueToCooldown: true,
|
|
222
|
+
});
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
logger.debug('[ModelFallback] Trying candidate', {
|
|
227
|
+
provider: candidate.provider,
|
|
228
|
+
model: candidate.model,
|
|
229
|
+
attempt: i + 1,
|
|
230
|
+
total: candidates.length,
|
|
231
|
+
});
|
|
232
|
+
const result = await params.run(candidate.provider, candidate.model);
|
|
233
|
+
// Success! Clear any cooldown for this provider
|
|
234
|
+
clearProviderCooldown(candidate.provider);
|
|
235
|
+
return {
|
|
236
|
+
result,
|
|
237
|
+
provider: candidate.provider,
|
|
238
|
+
model: candidate.model,
|
|
239
|
+
attempts,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
// Check if this is a user abort that shouldn't trigger fallback
|
|
244
|
+
if (shouldRethrowWithoutFallback(err)) {
|
|
245
|
+
throw err;
|
|
246
|
+
}
|
|
247
|
+
// Try to classify the error
|
|
248
|
+
const normalized = coerceToFailoverError(err, {
|
|
249
|
+
provider: candidate.provider,
|
|
250
|
+
model: candidate.model,
|
|
251
|
+
});
|
|
252
|
+
// If we couldn't classify it as a failover error, it may be a code bug - rethrow
|
|
253
|
+
if (!normalized && !isFailoverError(err)) {
|
|
254
|
+
// Check if the error at least looks like a provider error
|
|
255
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
256
|
+
const looksLikeProviderError = message.includes('API') ||
|
|
257
|
+
message.includes('request') ||
|
|
258
|
+
message.includes('connection') ||
|
|
259
|
+
message.includes('timeout') ||
|
|
260
|
+
message.includes('error');
|
|
261
|
+
if (!looksLikeProviderError) {
|
|
262
|
+
throw err;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
lastError = normalized || err;
|
|
266
|
+
const described = describeFailoverError(lastError);
|
|
267
|
+
// Record the attempt
|
|
268
|
+
attempts.push({
|
|
269
|
+
provider: candidate.provider,
|
|
270
|
+
model: candidate.model,
|
|
271
|
+
error: described.message,
|
|
272
|
+
reason: described.reason,
|
|
273
|
+
status: described.status,
|
|
274
|
+
code: described.code,
|
|
275
|
+
});
|
|
276
|
+
// Put provider in cooldown if appropriate
|
|
277
|
+
if (described.reason) {
|
|
278
|
+
setProviderCooldown(candidate.provider, described.reason, described.message);
|
|
279
|
+
}
|
|
280
|
+
// Notify about the error
|
|
281
|
+
await params.onError?.({
|
|
282
|
+
provider: candidate.provider,
|
|
283
|
+
model: candidate.model,
|
|
284
|
+
error: lastError,
|
|
285
|
+
attempt: i + 1,
|
|
286
|
+
total: candidates.length,
|
|
287
|
+
});
|
|
288
|
+
logger.warn('[ModelFallback] Attempt failed', {
|
|
289
|
+
provider: candidate.provider,
|
|
290
|
+
model: candidate.model,
|
|
291
|
+
error: described.message,
|
|
292
|
+
reason: described.reason,
|
|
293
|
+
attempt: i + 1,
|
|
294
|
+
total: candidates.length,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// All attempts failed
|
|
299
|
+
if (attempts.length <= 1 && lastError) {
|
|
300
|
+
// Single attempt, throw the original error
|
|
301
|
+
throw lastError;
|
|
302
|
+
}
|
|
303
|
+
// Multiple attempts, create a summary error
|
|
304
|
+
const summary = attempts.length > 0
|
|
305
|
+
? attempts
|
|
306
|
+
.map((attempt) => `${attempt.provider}/${attempt.model}: ${attempt.error}${attempt.reason ? ` (${attempt.reason})` : ''}`)
|
|
307
|
+
.join(' | ')
|
|
308
|
+
: 'unknown';
|
|
309
|
+
throw new FailoverError(`All ${attempts.length} providers failed: ${summary}`, {
|
|
310
|
+
reason: 'unknown',
|
|
311
|
+
cause: lastError instanceof Error ? lastError : undefined,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Convenience wrapper for simple fallback scenarios
|
|
316
|
+
*/
|
|
317
|
+
export async function runWithFallback(params) {
|
|
318
|
+
const allProviders = [params.primary, ...params.fallbacks].map((p) => p.provider);
|
|
319
|
+
return runWithModelFallback({
|
|
320
|
+
primaryProvider: params.primary.provider,
|
|
321
|
+
primaryModel: params.primary.model,
|
|
322
|
+
configuredProviders: [...new Set(allProviders)],
|
|
323
|
+
fallbackOverrides: params.fallbacks.map((f) => `${f.provider}/${f.model}`),
|
|
324
|
+
run: params.run,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
export { FailoverError, getUserFriendlyErrorMessage };
|
|
328
|
+
//# sourceMappingURL=model-fallback.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Failover Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the provider failover system.
|
|
5
|
+
* Based on OpenClaw's sophisticated error handling patterns.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Reasons why a provider request might fail that warrant trying a fallback.
|
|
9
|
+
* - auth: Invalid API key, expired token, authentication failure
|
|
10
|
+
* - format: Invalid request format, malformed parameters
|
|
11
|
+
* - rate_limit: Rate limited or quota exceeded (includes overloaded)
|
|
12
|
+
* - billing: Payment required, insufficient credits
|
|
13
|
+
* - timeout: Request timeout, connection timeout
|
|
14
|
+
* - unknown: Unknown error that still warrants fallback
|
|
15
|
+
*/
|
|
16
|
+
export type FailoverReason = 'auth' | 'format' | 'rate_limit' | 'billing' | 'timeout' | 'unknown';
|
|
17
|
+
/**
|
|
18
|
+
* Record of a fallback attempt
|
|
19
|
+
*/
|
|
20
|
+
export interface FallbackAttempt {
|
|
21
|
+
provider: string;
|
|
22
|
+
model: string;
|
|
23
|
+
error: string;
|
|
24
|
+
reason?: FailoverReason;
|
|
25
|
+
status?: number;
|
|
26
|
+
code?: string;
|
|
27
|
+
skippedDueToCooldown?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Result of running with model fallback
|
|
31
|
+
*/
|
|
32
|
+
export interface ModelFallbackResult<T> {
|
|
33
|
+
result: T;
|
|
34
|
+
provider: string;
|
|
35
|
+
model: string;
|
|
36
|
+
attempts: FallbackAttempt[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Provider cooldown entry
|
|
40
|
+
*/
|
|
41
|
+
export interface ProviderCooldown {
|
|
42
|
+
provider: string;
|
|
43
|
+
reason: FailoverReason;
|
|
44
|
+
cooldownUntil: number;
|
|
45
|
+
lastError: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text Chunking Utility
|
|
3
|
+
*
|
|
4
|
+
* Splits long text into chunks that fit within per-platform message limits.
|
|
5
|
+
* Handles two splitting strategies:
|
|
6
|
+
* - length: split at word boundaries up to the character limit
|
|
7
|
+
* - newline: split at paragraph/newline boundaries
|
|
8
|
+
*
|
|
9
|
+
* Code blocks (```) are always kept intact - never split mid-block.
|
|
10
|
+
*/
|
|
11
|
+
import type { ChatProviderId } from '../providers/types.js';
|
|
12
|
+
/** How to determine split points when chunking */
|
|
13
|
+
export type ChunkMode = 'length' | 'newline';
|
|
14
|
+
export interface ChunkOptions {
|
|
15
|
+
/** Splitting strategy. Defaults to 'length'. */
|
|
16
|
+
mode?: ChunkMode;
|
|
17
|
+
/**
|
|
18
|
+
* Override the platform character limit.
|
|
19
|
+
* Use 0 for unlimited (returns single-element array).
|
|
20
|
+
*/
|
|
21
|
+
limit?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ChunkResult {
|
|
24
|
+
/** The split text chunks, each within the platform limit. */
|
|
25
|
+
chunks: string[];
|
|
26
|
+
/** Character limit that was applied (0 = unlimited). */
|
|
27
|
+
limit: number;
|
|
28
|
+
/** Total characters in the original text. */
|
|
29
|
+
totalLength: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Per-platform character limits for outgoing messages.
|
|
33
|
+
* 0 means unlimited - the text is returned as a single chunk.
|
|
34
|
+
*/
|
|
35
|
+
export declare const PLATFORM_LIMITS: Readonly<Record<ChatProviderId | 'default', number>>;
|
|
36
|
+
/**
|
|
37
|
+
* Get the character limit for a platform.
|
|
38
|
+
* Returns 0 for unlimited platforms.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getPlatformLimit(platform: ChatProviderId | string): number;
|
|
41
|
+
/**
|
|
42
|
+
* Chunk text for a specific platform.
|
|
43
|
+
*
|
|
44
|
+
* @param text - The text to chunk
|
|
45
|
+
* @param platform - Target platform ID (used to look up character limit)
|
|
46
|
+
* @param options - Optional overrides for mode and limit
|
|
47
|
+
* @returns A ChunkResult with the chunks array and metadata
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const { chunks } = chunkForPlatform(longText, 'discord');
|
|
51
|
+
* for (const chunk of chunks) await sendMessage(chunk);
|
|
52
|
+
*/
|
|
53
|
+
export declare function chunkForPlatform(text: string, platform: ChatProviderId | string, options?: ChunkOptions): ChunkResult;
|
|
54
|
+
/**
|
|
55
|
+
* Simple helper: returns just the chunks array.
|
|
56
|
+
* Useful when you don't need the metadata.
|
|
57
|
+
*/
|
|
58
|
+
export declare function chunkText(text: string, platform: ChatProviderId | string, options?: ChunkOptions): string[];
|
|
59
|
+
//# sourceMappingURL=chunk.d.ts.map
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text Chunking Utility
|
|
3
|
+
*
|
|
4
|
+
* Splits long text into chunks that fit within per-platform message limits.
|
|
5
|
+
* Handles two splitting strategies:
|
|
6
|
+
* - length: split at word boundaries up to the character limit
|
|
7
|
+
* - newline: split at paragraph/newline boundaries
|
|
8
|
+
*
|
|
9
|
+
* Code blocks (```) are always kept intact - never split mid-block.
|
|
10
|
+
*/
|
|
11
|
+
// Platform limits
|
|
12
|
+
/**
|
|
13
|
+
* Per-platform character limits for outgoing messages.
|
|
14
|
+
* 0 means unlimited - the text is returned as a single chunk.
|
|
15
|
+
*/
|
|
16
|
+
export const PLATFORM_LIMITS = {
|
|
17
|
+
telegram: 4096,
|
|
18
|
+
discord: 2000,
|
|
19
|
+
slack: 4000,
|
|
20
|
+
whatsapp: 4096,
|
|
21
|
+
matrix: 65536,
|
|
22
|
+
msteams: 28000,
|
|
23
|
+
googlechat: 4096,
|
|
24
|
+
irc: 512,
|
|
25
|
+
mattermost: 16383,
|
|
26
|
+
line: 5000,
|
|
27
|
+
webchat: 0,
|
|
28
|
+
// Remaining platforms default to 4000 (conservative safe value)
|
|
29
|
+
signal: 4000,
|
|
30
|
+
dingtalk: 4000,
|
|
31
|
+
wecom: 4000,
|
|
32
|
+
feishu: 4000,
|
|
33
|
+
qq: 4000,
|
|
34
|
+
nostr: 4000,
|
|
35
|
+
twitch: 4000,
|
|
36
|
+
zalo: 4000,
|
|
37
|
+
nextcloud: 4000,
|
|
38
|
+
imessage: 4000,
|
|
39
|
+
synology: 4000,
|
|
40
|
+
tlon: 4000,
|
|
41
|
+
'zalo-personal': 4000,
|
|
42
|
+
custom: 4000,
|
|
43
|
+
default: 4000,
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Get the character limit for a platform.
|
|
47
|
+
* Returns 0 for unlimited platforms.
|
|
48
|
+
*/
|
|
49
|
+
export function getPlatformLimit(platform) {
|
|
50
|
+
const key = platform;
|
|
51
|
+
if (key in PLATFORM_LIMITS) {
|
|
52
|
+
return PLATFORM_LIMITS[key];
|
|
53
|
+
}
|
|
54
|
+
return PLATFORM_LIMITS.default;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Split text into alternating prose and code-block segments.
|
|
58
|
+
* Code blocks (delimited by ```) are marked so they are never split.
|
|
59
|
+
*/
|
|
60
|
+
function splitIntoSegments(text) {
|
|
61
|
+
const segments = [];
|
|
62
|
+
// Match fenced code blocks: ```optional-lang\n...\n```
|
|
63
|
+
const codeBlockPattern = /```[\s\S]*?```/g;
|
|
64
|
+
let lastIndex = 0;
|
|
65
|
+
let match;
|
|
66
|
+
while ((match = codeBlockPattern.exec(text)) !== null) {
|
|
67
|
+
// Prose before this code block
|
|
68
|
+
if (match.index > lastIndex) {
|
|
69
|
+
segments.push({ text: text.slice(lastIndex, match.index), isCodeBlock: false });
|
|
70
|
+
}
|
|
71
|
+
// The code block itself
|
|
72
|
+
segments.push({ text: match[0], isCodeBlock: true });
|
|
73
|
+
lastIndex = match.index + match[0].length;
|
|
74
|
+
}
|
|
75
|
+
// Remaining prose after the last code block
|
|
76
|
+
if (lastIndex < text.length) {
|
|
77
|
+
segments.push({ text: text.slice(lastIndex), isCodeBlock: false });
|
|
78
|
+
}
|
|
79
|
+
return segments;
|
|
80
|
+
}
|
|
81
|
+
// Splitting strategies
|
|
82
|
+
/**
|
|
83
|
+
* Split prose text by length, respecting word boundaries.
|
|
84
|
+
* Never cuts in the middle of a word.
|
|
85
|
+
*/
|
|
86
|
+
function splitByLength(text, limit) {
|
|
87
|
+
const chunks = [];
|
|
88
|
+
let remaining = text;
|
|
89
|
+
while (remaining.length > 0) {
|
|
90
|
+
if (remaining.length <= limit) {
|
|
91
|
+
chunks.push(remaining);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
// Find the last whitespace at or before the limit
|
|
95
|
+
let splitAt = limit;
|
|
96
|
+
const candidateSlice = remaining.slice(0, limit + 1);
|
|
97
|
+
const lastSpace = candidateSlice.lastIndexOf(' ');
|
|
98
|
+
const lastNewline = candidateSlice.lastIndexOf('\n');
|
|
99
|
+
const lastBreak = Math.max(lastSpace, lastNewline);
|
|
100
|
+
if (lastBreak > 0) {
|
|
101
|
+
splitAt = lastBreak;
|
|
102
|
+
}
|
|
103
|
+
// If no whitespace found, hard-split at limit (e.g. extremely long word)
|
|
104
|
+
chunks.push(remaining.slice(0, splitAt).trimEnd());
|
|
105
|
+
remaining = remaining.slice(splitAt).trimStart();
|
|
106
|
+
}
|
|
107
|
+
return chunks;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Split text at paragraph/newline boundaries.
|
|
111
|
+
* Accumulates paragraphs into a chunk until the limit would be exceeded,
|
|
112
|
+
* then starts a new chunk.
|
|
113
|
+
*
|
|
114
|
+
* If a single paragraph exceeds the limit, it is further split by length.
|
|
115
|
+
*/
|
|
116
|
+
function splitByNewline(text, limit) {
|
|
117
|
+
// Split on double-newlines (paragraphs) first, then single newlines
|
|
118
|
+
const paragraphs = text.split(/\n{2,}/);
|
|
119
|
+
const chunks = [];
|
|
120
|
+
let current = '';
|
|
121
|
+
for (const para of paragraphs) {
|
|
122
|
+
const trimmedPara = para.trim();
|
|
123
|
+
if (!trimmedPara)
|
|
124
|
+
continue;
|
|
125
|
+
const separator = current ? '\n\n' : '';
|
|
126
|
+
const candidate = current + separator + trimmedPara;
|
|
127
|
+
if (candidate.length <= limit) {
|
|
128
|
+
current = candidate;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Flush the current chunk
|
|
132
|
+
if (current) {
|
|
133
|
+
chunks.push(current);
|
|
134
|
+
current = '';
|
|
135
|
+
}
|
|
136
|
+
// Paragraph itself fits in a new chunk
|
|
137
|
+
if (trimmedPara.length <= limit) {
|
|
138
|
+
current = trimmedPara;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Paragraph is too large - fall back to length splitting
|
|
142
|
+
const subChunks = splitByLength(trimmedPara, limit);
|
|
143
|
+
const last = subChunks.pop();
|
|
144
|
+
chunks.push(...subChunks);
|
|
145
|
+
current = last ?? '';
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (current) {
|
|
150
|
+
chunks.push(current);
|
|
151
|
+
}
|
|
152
|
+
return chunks;
|
|
153
|
+
}
|
|
154
|
+
// Core chunking logic
|
|
155
|
+
/**
|
|
156
|
+
* Chunk a text string so every chunk fits within `limit` characters.
|
|
157
|
+
* Code blocks are preserved - they may occupy their own chunk if large,
|
|
158
|
+
* but are never split mid-block.
|
|
159
|
+
*/
|
|
160
|
+
function chunkWithLimit(text, limit, mode) {
|
|
161
|
+
const segments = splitIntoSegments(text);
|
|
162
|
+
const resultChunks = [];
|
|
163
|
+
let currentChunk = '';
|
|
164
|
+
for (const segment of segments) {
|
|
165
|
+
if (segment.isCodeBlock) {
|
|
166
|
+
// If the code block alone exceeds the limit we still emit it intact
|
|
167
|
+
// (truncation is not acceptable for code blocks).
|
|
168
|
+
if (currentChunk) {
|
|
169
|
+
resultChunks.push(currentChunk.trimEnd());
|
|
170
|
+
currentChunk = '';
|
|
171
|
+
}
|
|
172
|
+
if (segment.text.length <= limit || limit === 0) {
|
|
173
|
+
resultChunks.push(segment.text);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Code block exceeds limit - emit as-is, callers must handle
|
|
177
|
+
resultChunks.push(segment.text);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
// Prose: split according to mode
|
|
182
|
+
const proseChunks = mode === 'newline'
|
|
183
|
+
? splitByNewline(segment.text, limit)
|
|
184
|
+
: splitByLength(segment.text, limit);
|
|
185
|
+
for (let i = 0; i < proseChunks.length; i++) {
|
|
186
|
+
const prose = proseChunks[i];
|
|
187
|
+
if (i === 0 && currentChunk) {
|
|
188
|
+
// Try to append the first prose chunk to whatever we have buffered
|
|
189
|
+
const separator = currentChunk.endsWith('\n') ? '' : '\n\n';
|
|
190
|
+
const candidate = currentChunk + separator + prose;
|
|
191
|
+
if (candidate.length <= limit) {
|
|
192
|
+
currentChunk = candidate;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Doesn't fit - flush the buffer first
|
|
196
|
+
resultChunks.push(currentChunk.trimEnd());
|
|
197
|
+
currentChunk = prose;
|
|
198
|
+
}
|
|
199
|
+
else if (currentChunk) {
|
|
200
|
+
// Middle/last chunk from this segment: flush previous and start fresh
|
|
201
|
+
resultChunks.push(currentChunk.trimEnd());
|
|
202
|
+
currentChunk = prose;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
currentChunk = prose;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (currentChunk.trim()) {
|
|
211
|
+
resultChunks.push(currentChunk.trimEnd());
|
|
212
|
+
}
|
|
213
|
+
return resultChunks.filter(c => c.trim().length > 0);
|
|
214
|
+
}
|
|
215
|
+
// Public API
|
|
216
|
+
/**
|
|
217
|
+
* Chunk text for a specific platform.
|
|
218
|
+
*
|
|
219
|
+
* @param text - The text to chunk
|
|
220
|
+
* @param platform - Target platform ID (used to look up character limit)
|
|
221
|
+
* @param options - Optional overrides for mode and limit
|
|
222
|
+
* @returns A ChunkResult with the chunks array and metadata
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* const { chunks } = chunkForPlatform(longText, 'discord');
|
|
226
|
+
* for (const chunk of chunks) await sendMessage(chunk);
|
|
227
|
+
*/
|
|
228
|
+
export function chunkForPlatform(text, platform, options = {}) {
|
|
229
|
+
const { mode = 'length' } = options;
|
|
230
|
+
const limit = options.limit !== undefined ? options.limit : getPlatformLimit(platform);
|
|
231
|
+
// Edge cases
|
|
232
|
+
if (!text) {
|
|
233
|
+
return { chunks: [], limit, totalLength: 0 };
|
|
234
|
+
}
|
|
235
|
+
// Unlimited or text fits in one chunk
|
|
236
|
+
if (limit === 0 || text.length <= limit) {
|
|
237
|
+
return { chunks: [text], limit, totalLength: text.length };
|
|
238
|
+
}
|
|
239
|
+
const chunks = chunkWithLimit(text, limit, mode);
|
|
240
|
+
return {
|
|
241
|
+
chunks,
|
|
242
|
+
limit,
|
|
243
|
+
totalLength: text.length,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Simple helper: returns just the chunks array.
|
|
248
|
+
* Useful when you don't need the metadata.
|
|
249
|
+
*/
|
|
250
|
+
export function chunkText(text, platform, options) {
|
|
251
|
+
return chunkForPlatform(text, platform, options).chunks;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=chunk.js.map
|