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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart API Key Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects API keys in chat messages and extracts provider information.
|
|
5
|
+
* Inspired by OpenClaw's configure wizard - users can naturally say
|
|
6
|
+
* "here's my OpenAI key: sk-..." and we auto-configure.
|
|
7
|
+
*/
|
|
8
|
+
export interface DetectedApiKey {
|
|
9
|
+
provider: 'openai' | 'anthropic' | 'azure' | 'google' | 'groq' | 'openrouter' | 'ollama';
|
|
10
|
+
apiKey: string;
|
|
11
|
+
confidence: 'high' | 'medium' | 'low';
|
|
12
|
+
matchedPattern: string;
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ApiKeyDetectionResult {
|
|
16
|
+
detected: boolean;
|
|
17
|
+
keys: DetectedApiKey[];
|
|
18
|
+
sanitizedMessage: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Detect API keys in a message
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectApiKeys(message: string): ApiKeyDetectionResult;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a message likely contains an API key
|
|
26
|
+
* (quick check without full detection)
|
|
27
|
+
*/
|
|
28
|
+
export declare function mightContainApiKey(message: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a system prompt addition for API key handling
|
|
31
|
+
*/
|
|
32
|
+
export declare function getApiKeyHandlingPrompt(): string;
|
|
33
|
+
/**
|
|
34
|
+
* Create tool invocation suggestion for detected keys
|
|
35
|
+
*/
|
|
36
|
+
export declare function createConfigureToolCall(key: DetectedApiKey): {
|
|
37
|
+
name: string;
|
|
38
|
+
arguments: Record<string, unknown>;
|
|
39
|
+
};
|
|
40
|
+
export declare function logDetection(result: ApiKeyDetectionResult): void;
|
|
41
|
+
//# sourceMappingURL=api-key-detector.d.ts.map
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart API Key Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects API keys in chat messages and extracts provider information.
|
|
5
|
+
* Inspired by OpenClaw's configure wizard - users can naturally say
|
|
6
|
+
* "here's my OpenAI key: sk-..." and we auto-configure.
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
const API_KEY_PATTERNS = [
|
|
10
|
+
{
|
|
11
|
+
provider: 'openai',
|
|
12
|
+
keyPattern: /sk-[a-zA-Z0-9_-]{20,}/g,
|
|
13
|
+
contextPatterns: [
|
|
14
|
+
/openai\s*(api)?\s*key/i,
|
|
15
|
+
/gpt\s*(api)?\s*key/i,
|
|
16
|
+
/chatgpt\s*key/i,
|
|
17
|
+
/OPENAI_API_KEY/i,
|
|
18
|
+
],
|
|
19
|
+
keyPrefix: 'sk-',
|
|
20
|
+
minLength: 40,
|
|
21
|
+
maxLength: 200,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
provider: 'anthropic',
|
|
25
|
+
keyPattern: /sk-ant-[a-zA-Z0-9_-]{20,}/g,
|
|
26
|
+
contextPatterns: [
|
|
27
|
+
/anthropic\s*(api)?\s*key/i,
|
|
28
|
+
/claude\s*(api)?\s*key/i,
|
|
29
|
+
/ANTHROPIC_API_KEY/i,
|
|
30
|
+
],
|
|
31
|
+
keyPrefix: 'sk-ant-',
|
|
32
|
+
minLength: 50,
|
|
33
|
+
maxLength: 200,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
provider: 'groq',
|
|
37
|
+
keyPattern: /gsk_[a-zA-Z0-9]{20,}/g,
|
|
38
|
+
contextPatterns: [
|
|
39
|
+
/groq\s*(api)?\s*key/i,
|
|
40
|
+
/GROQ_API_KEY/i,
|
|
41
|
+
],
|
|
42
|
+
keyPrefix: 'gsk_',
|
|
43
|
+
minLength: 40,
|
|
44
|
+
maxLength: 100,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
provider: 'openrouter',
|
|
48
|
+
keyPattern: /sk-or-[a-zA-Z0-9_-]{20,}/g,
|
|
49
|
+
contextPatterns: [
|
|
50
|
+
/openrouter\s*(api)?\s*key/i,
|
|
51
|
+
/OPENROUTER_API_KEY/i,
|
|
52
|
+
],
|
|
53
|
+
keyPrefix: 'sk-or-',
|
|
54
|
+
minLength: 40,
|
|
55
|
+
maxLength: 100,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
provider: 'google',
|
|
59
|
+
// Google API keys are typically 39 chars, alphanumeric with underscores
|
|
60
|
+
keyPattern: /AIza[a-zA-Z0-9_-]{35}/g,
|
|
61
|
+
contextPatterns: [
|
|
62
|
+
/google\s*(ai)?\s*(api)?\s*key/i,
|
|
63
|
+
/gemini\s*(api)?\s*key/i,
|
|
64
|
+
/GOOGLE_API_KEY/i,
|
|
65
|
+
/GOOGLE_GENERATIVE_AI_API_KEY/i,
|
|
66
|
+
],
|
|
67
|
+
keyPrefix: 'AIza',
|
|
68
|
+
minLength: 39,
|
|
69
|
+
maxLength: 45,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
provider: 'azure',
|
|
73
|
+
// Azure keys are typically 32 hex chars
|
|
74
|
+
keyPattern: /[a-fA-F0-9]{32}/g,
|
|
75
|
+
contextPatterns: [
|
|
76
|
+
/azure\s*(openai)?\s*(api)?\s*key/i,
|
|
77
|
+
/AZURE_OPENAI_API_KEY/i,
|
|
78
|
+
/AZURE_API_KEY/i,
|
|
79
|
+
],
|
|
80
|
+
minLength: 32,
|
|
81
|
+
maxLength: 40,
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
// URL/Endpoint Patterns
|
|
85
|
+
const ENDPOINT_PATTERNS = [
|
|
86
|
+
{
|
|
87
|
+
provider: 'ollama',
|
|
88
|
+
patterns: [
|
|
89
|
+
/(?:ollama\s*(?:url|endpoint|base\s*url|server)?:?\s*)(https?:\/\/[^\s]+)/i,
|
|
90
|
+
/(?:OLLAMA_BASE_URL|OLLAMA_HOST)\s*[=:]\s*['"]?(https?:\/\/[^\s'"]+)/i,
|
|
91
|
+
/(https?:\/\/localhost:\d+)(?:\/|$)/i,
|
|
92
|
+
/(https?:\/\/127\.0\.0\.1:\d+)(?:\/|$)/i,
|
|
93
|
+
],
|
|
94
|
+
defaultPort: 11434,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
provider: 'azure',
|
|
98
|
+
patterns: [
|
|
99
|
+
/(?:azure\s*(?:openai)?\s*(?:url|endpoint|base\s*url)?:?\s*)(https:\/\/[^\s]+\.openai\.azure\.com)/i,
|
|
100
|
+
/AZURE_OPENAI_ENDPOINT\s*[=:]\s*['"]?(https:\/\/[^\s'"]+)/i,
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
// Detection Functions
|
|
105
|
+
/**
|
|
106
|
+
* Detect API keys in a message
|
|
107
|
+
*/
|
|
108
|
+
export function detectApiKeys(message) {
|
|
109
|
+
const keys = [];
|
|
110
|
+
let sanitizedMessage = message;
|
|
111
|
+
// First, try to detect provider from context
|
|
112
|
+
const detectedProviders = detectProviderContext(message);
|
|
113
|
+
// Then, look for API key patterns
|
|
114
|
+
for (const pattern of API_KEY_PATTERNS) {
|
|
115
|
+
const matches = message.matchAll(pattern.keyPattern);
|
|
116
|
+
for (const match of matches) {
|
|
117
|
+
const apiKey = match[0];
|
|
118
|
+
// Validate key length
|
|
119
|
+
if (apiKey.length < pattern.minLength || apiKey.length > pattern.maxLength) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Determine confidence based on context
|
|
123
|
+
let confidence = 'low';
|
|
124
|
+
// High confidence if we have explicit context
|
|
125
|
+
if (detectedProviders.includes(pattern.provider)) {
|
|
126
|
+
confidence = 'high';
|
|
127
|
+
}
|
|
128
|
+
// Medium confidence if key has distinctive prefix
|
|
129
|
+
else if (pattern.keyPrefix && apiKey.startsWith(pattern.keyPrefix)) {
|
|
130
|
+
confidence = 'medium';
|
|
131
|
+
}
|
|
132
|
+
// Check for Azure endpoint in message
|
|
133
|
+
let baseUrl;
|
|
134
|
+
if (pattern.provider === 'azure') {
|
|
135
|
+
const endpoint = detectEndpoint(message, 'azure');
|
|
136
|
+
if (endpoint) {
|
|
137
|
+
baseUrl = endpoint;
|
|
138
|
+
confidence = 'high'; // Higher confidence with endpoint
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
keys.push({
|
|
142
|
+
provider: pattern.provider,
|
|
143
|
+
apiKey,
|
|
144
|
+
confidence,
|
|
145
|
+
matchedPattern: pattern.keyPattern.source,
|
|
146
|
+
baseUrl,
|
|
147
|
+
});
|
|
148
|
+
// Redact key in sanitized message
|
|
149
|
+
sanitizedMessage = sanitizedMessage.replace(apiKey, `[${pattern.provider.toUpperCase()}_KEY_REDACTED]`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Check for Ollama endpoint (doesn't need API key)
|
|
153
|
+
const ollamaEndpoint = detectEndpoint(message, 'ollama');
|
|
154
|
+
if (ollamaEndpoint) {
|
|
155
|
+
keys.push({
|
|
156
|
+
provider: 'ollama',
|
|
157
|
+
apiKey: '', // Ollama doesn't need an API key
|
|
158
|
+
confidence: 'high',
|
|
159
|
+
matchedPattern: 'ollama_endpoint',
|
|
160
|
+
baseUrl: ollamaEndpoint,
|
|
161
|
+
});
|
|
162
|
+
sanitizedMessage = sanitizedMessage.replace(ollamaEndpoint, '[OLLAMA_ENDPOINT_REDACTED]');
|
|
163
|
+
}
|
|
164
|
+
// De-duplicate by provider (keep highest confidence)
|
|
165
|
+
const uniqueKeys = deduplicateKeys(keys);
|
|
166
|
+
return {
|
|
167
|
+
detected: uniqueKeys.length > 0,
|
|
168
|
+
keys: uniqueKeys,
|
|
169
|
+
sanitizedMessage,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Detect provider context from message
|
|
174
|
+
*/
|
|
175
|
+
function detectProviderContext(message) {
|
|
176
|
+
const providers = [];
|
|
177
|
+
for (const pattern of API_KEY_PATTERNS) {
|
|
178
|
+
for (const contextPattern of pattern.contextPatterns) {
|
|
179
|
+
if (contextPattern.test(message)) {
|
|
180
|
+
providers.push(pattern.provider);
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return providers;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Detect endpoint URL for a provider
|
|
189
|
+
*/
|
|
190
|
+
function detectEndpoint(message, provider) {
|
|
191
|
+
const endpointPattern = ENDPOINT_PATTERNS.find(p => p.provider === provider);
|
|
192
|
+
if (!endpointPattern)
|
|
193
|
+
return undefined;
|
|
194
|
+
for (const pattern of endpointPattern.patterns) {
|
|
195
|
+
const match = message.match(pattern);
|
|
196
|
+
if (match && match[1]) {
|
|
197
|
+
return match[1];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// For Ollama, also check for localhost mentions without full URL
|
|
201
|
+
if (provider === 'ollama') {
|
|
202
|
+
const localhostMatch = message.match(/localhost:(\d+)/i);
|
|
203
|
+
if (localhostMatch) {
|
|
204
|
+
return `http://localhost:${localhostMatch[1]}`;
|
|
205
|
+
}
|
|
206
|
+
// Check for just "ollama" mentioned with no key - user might want local
|
|
207
|
+
if (/\bollama\b/i.test(message) && !/key|api/i.test(message)) {
|
|
208
|
+
return 'http://localhost:11434';
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* De-duplicate keys, keeping highest confidence per provider
|
|
215
|
+
*/
|
|
216
|
+
function deduplicateKeys(keys) {
|
|
217
|
+
const byProvider = new Map();
|
|
218
|
+
const confidenceRank = { high: 3, medium: 2, low: 1 };
|
|
219
|
+
for (const key of keys) {
|
|
220
|
+
const existing = byProvider.get(key.provider);
|
|
221
|
+
if (!existing || confidenceRank[key.confidence] > confidenceRank[existing.confidence]) {
|
|
222
|
+
byProvider.set(key.provider, key);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return Array.from(byProvider.values());
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Check if a message likely contains an API key
|
|
229
|
+
* (quick check without full detection)
|
|
230
|
+
*/
|
|
231
|
+
export function mightContainApiKey(message) {
|
|
232
|
+
// Quick patterns to check
|
|
233
|
+
const quickPatterns = [
|
|
234
|
+
/sk-[a-zA-Z0-9]/, // OpenAI, OpenRouter, Anthropic prefixes
|
|
235
|
+
/gsk_[a-zA-Z0-9]/, // Groq prefix
|
|
236
|
+
/AIza[a-zA-Z0-9]/, // Google prefix
|
|
237
|
+
/api.?key/i, // "api key" mentions
|
|
238
|
+
/API_KEY/, // Environment variable style
|
|
239
|
+
/\b(openai|anthropic|claude|gemini|groq|azure)\b.*\b(key|token|secret)\b/i,
|
|
240
|
+
];
|
|
241
|
+
return quickPatterns.some(p => p.test(message));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Generate a system prompt addition for API key handling
|
|
245
|
+
*/
|
|
246
|
+
export function getApiKeyHandlingPrompt() {
|
|
247
|
+
return `
|
|
248
|
+
When users provide API keys in their messages, you should:
|
|
249
|
+
1. Immediately use the configureProvider tool to save the key
|
|
250
|
+
2. Confirm which provider was configured
|
|
251
|
+
3. Never repeat the full API key back to the user
|
|
252
|
+
4. Suggest they test the connection
|
|
253
|
+
|
|
254
|
+
Supported providers:
|
|
255
|
+
- OpenAI (keys start with sk-)
|
|
256
|
+
- Anthropic/Claude (keys start with sk-ant-)
|
|
257
|
+
- Google/Gemini (keys start with AIza)
|
|
258
|
+
- Groq (keys start with gsk_)
|
|
259
|
+
- OpenRouter (keys start with sk-or-)
|
|
260
|
+
- Azure OpenAI (32 character hex keys, needs endpoint)
|
|
261
|
+
- Ollama (local, no key needed, just endpoint URL)
|
|
262
|
+
|
|
263
|
+
If the user mentions wanting to use a local model or Ollama, configure Ollama with the appropriate endpoint (default: http://localhost:11434).
|
|
264
|
+
`.trim();
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Create tool invocation suggestion for detected keys
|
|
268
|
+
*/
|
|
269
|
+
export function createConfigureToolCall(key) {
|
|
270
|
+
return {
|
|
271
|
+
name: 'configureProvider',
|
|
272
|
+
arguments: {
|
|
273
|
+
provider: key.provider,
|
|
274
|
+
apiKey: key.apiKey,
|
|
275
|
+
baseUrl: key.baseUrl,
|
|
276
|
+
setAsDefault: true, // Default to setting as default when user provides key
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Log detection for debugging (without exposing keys)
|
|
281
|
+
export function logDetection(result) {
|
|
282
|
+
if (result.detected) {
|
|
283
|
+
logger.info(`[ApiKeyDetector] Detected ${result.keys.length} API key(s)`, {
|
|
284
|
+
component: 'ApiKeyDetector',
|
|
285
|
+
providers: result.keys.map(k => k.provider),
|
|
286
|
+
confidences: result.keys.map(k => k.confidence),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=api-key-detector.js.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Reply System
|
|
3
|
+
*
|
|
4
|
+
* Template-based automatic responses for chat messages.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Out-of-office / away mode
|
|
7
|
+
* - Busy/DND mode with queue position
|
|
8
|
+
* - Keyword-triggered quick replies
|
|
9
|
+
* - Rate-limited to prevent spam
|
|
10
|
+
* - Per-channel configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface AutoReplyTemplate {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
trigger: AutoReplyTrigger;
|
|
16
|
+
message: string;
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
channels?: string[];
|
|
19
|
+
cooldownMs: number;
|
|
20
|
+
maxPerHour?: number;
|
|
21
|
+
priority: number;
|
|
22
|
+
variables?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export type AutoReplyTrigger = {
|
|
25
|
+
type: 'always';
|
|
26
|
+
} | {
|
|
27
|
+
type: 'keyword';
|
|
28
|
+
keywords: string[];
|
|
29
|
+
} | {
|
|
30
|
+
type: 'regex';
|
|
31
|
+
pattern: string;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'no_agent';
|
|
34
|
+
} | {
|
|
35
|
+
type: 'after_hours';
|
|
36
|
+
schedule: WeeklySchedule;
|
|
37
|
+
};
|
|
38
|
+
export interface WeeklySchedule {
|
|
39
|
+
timezone: string;
|
|
40
|
+
hours: {
|
|
41
|
+
start: number;
|
|
42
|
+
end: number;
|
|
43
|
+
};
|
|
44
|
+
days: number[];
|
|
45
|
+
}
|
|
46
|
+
export interface AutoReplyConfig {
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
templates: AutoReplyTemplate[];
|
|
49
|
+
globalCooldownMs: number;
|
|
50
|
+
maxRepliesPerHour: number;
|
|
51
|
+
}
|
|
52
|
+
export interface AutoReplyResult {
|
|
53
|
+
shouldReply: boolean;
|
|
54
|
+
templateId?: string;
|
|
55
|
+
message?: string;
|
|
56
|
+
reason?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Load auto-reply configuration
|
|
60
|
+
*/
|
|
61
|
+
export declare function configureAutoReply(newConfig: Partial<AutoReplyConfig>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get current auto-reply configuration
|
|
64
|
+
*/
|
|
65
|
+
export declare function getAutoReplyConfig(): AutoReplyConfig;
|
|
66
|
+
/**
|
|
67
|
+
* Check if a message should trigger an auto-reply
|
|
68
|
+
*/
|
|
69
|
+
export declare function checkAutoReply(message: string, userId: string, channelId?: string): AutoReplyResult;
|
|
70
|
+
/**
|
|
71
|
+
* Add or replace a template by ID
|
|
72
|
+
*/
|
|
73
|
+
export declare function addTemplate(template: AutoReplyTemplate): void;
|
|
74
|
+
/**
|
|
75
|
+
* Remove a template by ID
|
|
76
|
+
*/
|
|
77
|
+
export declare function removeTemplate(id: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Get built-in template presets
|
|
80
|
+
*/
|
|
81
|
+
export declare function getTemplatePresets(): AutoReplyTemplate[];
|
|
82
|
+
/**
|
|
83
|
+
* Cleanup stale tracking entries (call periodically)
|
|
84
|
+
*/
|
|
85
|
+
export declare function cleanupAutoReplyState(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Reset all state (for testing)
|
|
88
|
+
*/
|
|
89
|
+
export declare function resetAutoReply(): void;
|
|
90
|
+
//# sourceMappingURL=auto-reply.d.ts.map
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Reply System
|
|
3
|
+
*
|
|
4
|
+
* Template-based automatic responses for chat messages.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Out-of-office / away mode
|
|
7
|
+
* - Busy/DND mode with queue position
|
|
8
|
+
* - Keyword-triggered quick replies
|
|
9
|
+
* - Rate-limited to prevent spam
|
|
10
|
+
* - Per-channel configuration
|
|
11
|
+
*/
|
|
12
|
+
import { logger } from '../utils/logger.js';
|
|
13
|
+
// --- State ---
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
enabled: false,
|
|
16
|
+
templates: [],
|
|
17
|
+
globalCooldownMs: 30_000, // 30 seconds between replies to same user
|
|
18
|
+
maxRepliesPerHour: 10,
|
|
19
|
+
};
|
|
20
|
+
let config = { ...DEFAULT_CONFIG };
|
|
21
|
+
// Track last reply time per user to enforce cooldowns
|
|
22
|
+
const lastReplyMap = new Map();
|
|
23
|
+
// --- Core Functions ---
|
|
24
|
+
/**
|
|
25
|
+
* Load auto-reply configuration
|
|
26
|
+
*/
|
|
27
|
+
export function configureAutoReply(newConfig) {
|
|
28
|
+
config = { ...config, ...newConfig };
|
|
29
|
+
if (newConfig.templates) {
|
|
30
|
+
// Sort by priority descending
|
|
31
|
+
config.templates.sort((a, b) => b.priority - a.priority);
|
|
32
|
+
}
|
|
33
|
+
logger.info('[AutoReply] Configuration updated', {
|
|
34
|
+
enabled: config.enabled,
|
|
35
|
+
templates: config.templates.length,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get current auto-reply configuration
|
|
40
|
+
*/
|
|
41
|
+
export function getAutoReplyConfig() {
|
|
42
|
+
return { ...config };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check if a message should trigger an auto-reply
|
|
46
|
+
*/
|
|
47
|
+
export function checkAutoReply(message, userId, channelId) {
|
|
48
|
+
if (!config.enabled || config.templates.length === 0) {
|
|
49
|
+
return { shouldReply: false, reason: 'disabled' };
|
|
50
|
+
}
|
|
51
|
+
// Check global cooldown
|
|
52
|
+
const userState = lastReplyMap.get(userId);
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
if (userState) {
|
|
55
|
+
// Reset hourly counter if hour has passed
|
|
56
|
+
if (now - userState.hourStart > 3_600_000) {
|
|
57
|
+
userState.count = 0;
|
|
58
|
+
userState.hourStart = now;
|
|
59
|
+
}
|
|
60
|
+
// Check cooldown
|
|
61
|
+
if (now - userState.time < config.globalCooldownMs) {
|
|
62
|
+
return { shouldReply: false, reason: 'cooldown' };
|
|
63
|
+
}
|
|
64
|
+
// Check rate limit
|
|
65
|
+
if (userState.count >= config.maxRepliesPerHour) {
|
|
66
|
+
return { shouldReply: false, reason: 'rate_limited' };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Find matching template (sorted by priority)
|
|
70
|
+
for (const template of config.templates) {
|
|
71
|
+
if (!template.enabled)
|
|
72
|
+
continue;
|
|
73
|
+
// Check channel filter
|
|
74
|
+
if (template.channels && template.channels.length > 0 && channelId) {
|
|
75
|
+
if (!template.channels.includes(channelId))
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Check per-template cooldown
|
|
79
|
+
const templateKey = `${userId}:${template.id}`;
|
|
80
|
+
const templateState = lastReplyMap.get(templateKey);
|
|
81
|
+
if (templateState && now - templateState.time < template.cooldownMs) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Check trigger
|
|
85
|
+
if (matchesTrigger(template.trigger, message)) {
|
|
86
|
+
// Update global user state
|
|
87
|
+
const existing = lastReplyMap.get(userId);
|
|
88
|
+
const updatedState = existing
|
|
89
|
+
? { ...existing, time: now, count: existing.count + 1 }
|
|
90
|
+
: { time: now, count: 1, hourStart: now };
|
|
91
|
+
lastReplyMap.set(userId, updatedState);
|
|
92
|
+
// Update per-template state
|
|
93
|
+
lastReplyMap.set(templateKey, { time: now, count: 1, hourStart: now });
|
|
94
|
+
// Render message with variables
|
|
95
|
+
const rendered = renderTemplate(template.message, {
|
|
96
|
+
...template.variables,
|
|
97
|
+
user: userId,
|
|
98
|
+
channel: channelId ?? 'unknown',
|
|
99
|
+
time: new Date().toLocaleTimeString(),
|
|
100
|
+
date: new Date().toLocaleDateString(),
|
|
101
|
+
});
|
|
102
|
+
logger.debug('[AutoReply] Triggered', { templateId: template.id, userId, channelId });
|
|
103
|
+
return {
|
|
104
|
+
shouldReply: true,
|
|
105
|
+
templateId: template.id,
|
|
106
|
+
message: rendered,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { shouldReply: false, reason: 'no_match' };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a trigger matches the message
|
|
114
|
+
*/
|
|
115
|
+
function matchesTrigger(trigger, message) {
|
|
116
|
+
switch (trigger.type) {
|
|
117
|
+
case 'always':
|
|
118
|
+
return true;
|
|
119
|
+
case 'keyword': {
|
|
120
|
+
const lower = message.toLowerCase();
|
|
121
|
+
return trigger.keywords.some(kw => lower.includes(kw.toLowerCase()));
|
|
122
|
+
}
|
|
123
|
+
case 'regex': {
|
|
124
|
+
try {
|
|
125
|
+
const re = new RegExp(trigger.pattern, 'i');
|
|
126
|
+
return re.test(message);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
case 'no_agent':
|
|
133
|
+
// This is checked externally - always matches when the trigger is selected
|
|
134
|
+
return true;
|
|
135
|
+
case 'after_hours':
|
|
136
|
+
return isAfterHours(trigger.schedule);
|
|
137
|
+
default:
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Check if current time is outside business hours
|
|
143
|
+
*/
|
|
144
|
+
function isAfterHours(schedule) {
|
|
145
|
+
try {
|
|
146
|
+
const now = new Date();
|
|
147
|
+
// Use Intl to get time in the specified timezone
|
|
148
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
149
|
+
timeZone: schedule.timezone,
|
|
150
|
+
hour: 'numeric',
|
|
151
|
+
minute: 'numeric',
|
|
152
|
+
hour12: false,
|
|
153
|
+
weekday: 'short',
|
|
154
|
+
});
|
|
155
|
+
const parts = formatter.formatToParts(now);
|
|
156
|
+
const hour = Number(parts.find(p => p.type === 'hour')?.value ?? 0);
|
|
157
|
+
const weekday = parts.find(p => p.type === 'weekday')?.value ?? '';
|
|
158
|
+
// Map weekday names to numbers
|
|
159
|
+
const dayMap = {
|
|
160
|
+
Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6,
|
|
161
|
+
};
|
|
162
|
+
const dayNum = dayMap[weekday] ?? -1;
|
|
163
|
+
// Check if today is a business day
|
|
164
|
+
if (!schedule.days.includes(dayNum))
|
|
165
|
+
return true;
|
|
166
|
+
// Check if current hour is outside business hours
|
|
167
|
+
return hour < schedule.hours.start || hour >= schedule.hours.end;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Render template variables: {{variable}} -> value
|
|
175
|
+
*/
|
|
176
|
+
function renderTemplate(template, vars) {
|
|
177
|
+
return template.replace(/\{\{(\w+)\}\}/g, (_match, key) => {
|
|
178
|
+
return vars[key] ?? `{{${key}}}`;
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Add or replace a template by ID
|
|
183
|
+
*/
|
|
184
|
+
export function addTemplate(template) {
|
|
185
|
+
// Remove existing with same ID
|
|
186
|
+
config.templates = config.templates.filter(t => t.id !== template.id);
|
|
187
|
+
config.templates.push(template);
|
|
188
|
+
config.templates.sort((a, b) => b.priority - a.priority);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Remove a template by ID
|
|
192
|
+
*/
|
|
193
|
+
export function removeTemplate(id) {
|
|
194
|
+
const before = config.templates.length;
|
|
195
|
+
config.templates = config.templates.filter(t => t.id !== id);
|
|
196
|
+
return config.templates.length < before;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get built-in template presets
|
|
200
|
+
*/
|
|
201
|
+
export function getTemplatePresets() {
|
|
202
|
+
return [
|
|
203
|
+
{
|
|
204
|
+
id: 'away',
|
|
205
|
+
name: 'Away / Out of Office',
|
|
206
|
+
trigger: { type: 'always' },
|
|
207
|
+
message: "I'm currently away and will respond when I return. For urgent matters, please contact the team directly.",
|
|
208
|
+
enabled: false,
|
|
209
|
+
cooldownMs: 300_000, // 5 min
|
|
210
|
+
maxPerHour: 5,
|
|
211
|
+
priority: 100,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: 'after-hours',
|
|
215
|
+
name: 'After Hours',
|
|
216
|
+
trigger: {
|
|
217
|
+
type: 'after_hours',
|
|
218
|
+
schedule: {
|
|
219
|
+
timezone: 'America/New_York',
|
|
220
|
+
hours: { start: 9, end: 17 },
|
|
221
|
+
days: [1, 2, 3, 4, 5], // Mon-Fri
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
message: "Thanks for your message! I'm currently outside business hours (Mon-Fri 9AM-5PM ET). I'll respond during the next business day.",
|
|
225
|
+
enabled: false,
|
|
226
|
+
cooldownMs: 600_000, // 10 min
|
|
227
|
+
maxPerHour: 3,
|
|
228
|
+
priority: 90,
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: 'help',
|
|
232
|
+
name: 'Help / FAQ',
|
|
233
|
+
trigger: { type: 'keyword', keywords: ['help', 'faq', 'how to', 'getting started'] },
|
|
234
|
+
message: "Need help? Here are some commands:\n- `/help` - Show all commands\n- `/status` - System status\n- `/skills` - Available skills\n\nOr just ask me anything!",
|
|
235
|
+
enabled: false,
|
|
236
|
+
cooldownMs: 60_000,
|
|
237
|
+
maxPerHour: 10,
|
|
238
|
+
priority: 50,
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: 'no-agent',
|
|
242
|
+
name: 'No Agent Available',
|
|
243
|
+
trigger: { type: 'no_agent' },
|
|
244
|
+
message: "All agents are currently busy. Your message has been queued and will be processed shortly. Current wait time: approximately {{waitTime}}.",
|
|
245
|
+
enabled: false,
|
|
246
|
+
cooldownMs: 120_000,
|
|
247
|
+
maxPerHour: 5,
|
|
248
|
+
priority: 80,
|
|
249
|
+
variables: { waitTime: '1-2 minutes' },
|
|
250
|
+
},
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Cleanup stale tracking entries (call periodically)
|
|
255
|
+
*/
|
|
256
|
+
export function cleanupAutoReplyState() {
|
|
257
|
+
const now = Date.now();
|
|
258
|
+
const staleThreshold = 3_600_000; // 1 hour
|
|
259
|
+
for (const [key, state] of lastReplyMap) {
|
|
260
|
+
if (now - state.time > staleThreshold) {
|
|
261
|
+
lastReplyMap.delete(key);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Reset all state (for testing)
|
|
267
|
+
*/
|
|
268
|
+
export function resetAutoReply() {
|
|
269
|
+
config = { ...DEFAULT_CONFIG };
|
|
270
|
+
lastReplyMap.clear();
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=auto-reply.js.map
|