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,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation Memory Management
|
|
3
|
+
*
|
|
4
|
+
* Handles context window optimization and automatic message compaction
|
|
5
|
+
* to keep conversations within model limits while preserving context.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Automatic compaction when context window is near limit
|
|
9
|
+
* - AI-powered summarization of older messages
|
|
10
|
+
* - Tool result truncation for large outputs
|
|
11
|
+
* - Priority-based message retention
|
|
12
|
+
* - Sliding window with importance scoring
|
|
13
|
+
*/
|
|
14
|
+
import { MODEL_CATALOG } from '../providers/core/models.js';
|
|
15
|
+
export const DEFAULT_MEMORY_CONFIG = {
|
|
16
|
+
compactThreshold: 0.7,
|
|
17
|
+
preserveRecentCount: 6, // Keep last 3 exchanges (user + assistant)
|
|
18
|
+
minMessagesForCompaction: 10,
|
|
19
|
+
targetAfterCompaction: 0.5,
|
|
20
|
+
maxToolResultTokens: 2000, // ~8KB of text
|
|
21
|
+
summarizeLargeToolResults: true,
|
|
22
|
+
};
|
|
23
|
+
// === Token Estimation ===
|
|
24
|
+
/**
|
|
25
|
+
* Rough token estimation (4 chars per token average)
|
|
26
|
+
* This is a fast approximation - actual tokenization varies by model
|
|
27
|
+
*/
|
|
28
|
+
export function estimateTokens(text) {
|
|
29
|
+
return Math.ceil(text.length / 4);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Estimate tokens for a message array
|
|
33
|
+
*/
|
|
34
|
+
export function estimateMessagesTokens(messages) {
|
|
35
|
+
return messages.reduce((total, msg) => {
|
|
36
|
+
// Content + role overhead (~10 tokens per message for structure)
|
|
37
|
+
return total + estimateTokens(msg.content) + 10;
|
|
38
|
+
}, 0);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get context window for the current model
|
|
42
|
+
*/
|
|
43
|
+
export function getContextWindow(model) {
|
|
44
|
+
// Default to 128k if model not specified
|
|
45
|
+
if (!model)
|
|
46
|
+
return 128000;
|
|
47
|
+
const modelInfo = MODEL_CATALOG.find((m) => m.id === model || m.id.includes(model) || model.includes(m.id));
|
|
48
|
+
return modelInfo?.contextWindow || 128000;
|
|
49
|
+
}
|
|
50
|
+
// === Tool Result Processing ===
|
|
51
|
+
/**
|
|
52
|
+
* Truncate large tool results to save context space
|
|
53
|
+
*/
|
|
54
|
+
export function truncateToolResult(result, maxTokens = DEFAULT_MEMORY_CONFIG.maxToolResultTokens) {
|
|
55
|
+
const resultStr = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
56
|
+
const originalTokens = estimateTokens(resultStr);
|
|
57
|
+
if (originalTokens <= maxTokens) {
|
|
58
|
+
return { result, wasTruncated: false, originalTokens };
|
|
59
|
+
}
|
|
60
|
+
// Truncate to maxTokens worth of characters (rough estimate)
|
|
61
|
+
const maxChars = maxTokens * 4;
|
|
62
|
+
const truncated = resultStr.slice(0, maxChars);
|
|
63
|
+
// Try to parse back if it was JSON
|
|
64
|
+
if (typeof result !== 'string') {
|
|
65
|
+
try {
|
|
66
|
+
return {
|
|
67
|
+
result: {
|
|
68
|
+
_truncated: true,
|
|
69
|
+
_originalLength: resultStr.length,
|
|
70
|
+
data: truncated + '\n\n[... truncated]',
|
|
71
|
+
},
|
|
72
|
+
wasTruncated: true,
|
|
73
|
+
originalTokens,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Fall through to string return
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
result: truncated + '\n\n[... truncated, ' + (originalTokens - maxTokens) + ' tokens removed]',
|
|
82
|
+
wasTruncated: true,
|
|
83
|
+
originalTokens,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Process tool calls in a message, truncating large results
|
|
88
|
+
*/
|
|
89
|
+
export function processToolCallsForCompaction(toolCalls, config = DEFAULT_MEMORY_CONFIG) {
|
|
90
|
+
if (!toolCalls || toolCalls.length === 0) {
|
|
91
|
+
return { toolCalls, tokensSaved: 0 };
|
|
92
|
+
}
|
|
93
|
+
let tokensSaved = 0;
|
|
94
|
+
const processedCalls = toolCalls.map((tc) => {
|
|
95
|
+
if (tc.result === undefined)
|
|
96
|
+
return tc;
|
|
97
|
+
const { result, wasTruncated, originalTokens } = truncateToolResult(tc.result, config.maxToolResultTokens);
|
|
98
|
+
if (wasTruncated) {
|
|
99
|
+
const newTokens = estimateTokens(typeof result === 'string' ? result : JSON.stringify(result));
|
|
100
|
+
tokensSaved += originalTokens - newTokens;
|
|
101
|
+
}
|
|
102
|
+
return { ...tc, result };
|
|
103
|
+
});
|
|
104
|
+
return { toolCalls: processedCalls, tokensSaved };
|
|
105
|
+
}
|
|
106
|
+
// === Priority-Based Retention ===
|
|
107
|
+
/**
|
|
108
|
+
* Message importance scoring for retention decisions
|
|
109
|
+
*/
|
|
110
|
+
export function scoreMessageImportance(message) {
|
|
111
|
+
let score = 0;
|
|
112
|
+
// System messages are always high priority
|
|
113
|
+
if (message.role === 'system') {
|
|
114
|
+
score += 100;
|
|
115
|
+
}
|
|
116
|
+
// User messages that ask questions or give instructions
|
|
117
|
+
if (message.role === 'user') {
|
|
118
|
+
score += 20;
|
|
119
|
+
if (message.content.includes('?'))
|
|
120
|
+
score += 10;
|
|
121
|
+
if (/^(create|make|build|implement|fix|update|change)/i.test(message.content)) {
|
|
122
|
+
score += 15;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Assistant messages with tool calls are important
|
|
126
|
+
if (message.role === 'assistant') {
|
|
127
|
+
score += 10;
|
|
128
|
+
if (message.toolCalls && message.toolCalls.length > 0) {
|
|
129
|
+
score += 5 * message.toolCalls.length;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Messages that mention errors or important keywords
|
|
133
|
+
if (/error|fail|success|complete|done|critical|important/i.test(message.content)) {
|
|
134
|
+
score += 10;
|
|
135
|
+
}
|
|
136
|
+
// Longer messages likely contain more context
|
|
137
|
+
const tokens = estimateTokens(message.content);
|
|
138
|
+
if (tokens > 100)
|
|
139
|
+
score += 5;
|
|
140
|
+
if (tokens > 500)
|
|
141
|
+
score += 10;
|
|
142
|
+
return score;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Select messages to keep based on importance scoring
|
|
146
|
+
*/
|
|
147
|
+
export function selectMessagesForRetention(messages, targetTokens, config = DEFAULT_MEMORY_CONFIG) {
|
|
148
|
+
// Always keep the most recent messages
|
|
149
|
+
const recentMessages = messages.slice(-config.preserveRecentCount);
|
|
150
|
+
const olderMessages = messages.slice(0, -config.preserveRecentCount);
|
|
151
|
+
// Score and sort older messages by importance
|
|
152
|
+
const scoredMessages = olderMessages.map((m) => ({
|
|
153
|
+
message: m,
|
|
154
|
+
score: scoreMessageImportance(m),
|
|
155
|
+
tokens: estimateTokens(m.content),
|
|
156
|
+
}));
|
|
157
|
+
scoredMessages.sort((a, b) => b.score - a.score);
|
|
158
|
+
// Select older messages until we hit target
|
|
159
|
+
const recentTokens = estimateMessagesTokens(recentMessages);
|
|
160
|
+
let remainingBudget = targetTokens - recentTokens;
|
|
161
|
+
const selectedOlder = [];
|
|
162
|
+
for (const { message, tokens } of scoredMessages) {
|
|
163
|
+
if (remainingBudget <= 0)
|
|
164
|
+
break;
|
|
165
|
+
if (tokens <= remainingBudget) {
|
|
166
|
+
selectedOlder.push(message);
|
|
167
|
+
remainingBudget -= tokens;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Sort selected older messages by timestamp to maintain order
|
|
171
|
+
selectedOlder.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
|
|
172
|
+
return [...selectedOlder, ...recentMessages];
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if messages need compaction based on token count
|
|
176
|
+
*/
|
|
177
|
+
export function needsCompaction(messages, model, config = DEFAULT_MEMORY_CONFIG) {
|
|
178
|
+
if (messages.length < config.minMessagesForCompaction) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const contextWindow = getContextWindow(model);
|
|
182
|
+
const currentTokens = estimateMessagesTokens(messages);
|
|
183
|
+
const threshold = contextWindow * config.compactThreshold;
|
|
184
|
+
return currentTokens > threshold;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a summary of messages using AI
|
|
188
|
+
*/
|
|
189
|
+
export async function summarizeMessages(messages, model) {
|
|
190
|
+
const content = messages
|
|
191
|
+
.map((m) => `${m.role.toUpperCase()}: ${m.content}`)
|
|
192
|
+
.join('\n\n');
|
|
193
|
+
const summaryPrompt = `Summarize this conversation concisely, preserving key information, decisions made, and context needed for continuing the discussion. Be brief but complete.
|
|
194
|
+
|
|
195
|
+
CONVERSATION:
|
|
196
|
+
${content}
|
|
197
|
+
|
|
198
|
+
SUMMARY:`;
|
|
199
|
+
try {
|
|
200
|
+
const { aiProvider } = await import('../providers/ai-sdk.js');
|
|
201
|
+
const response = await aiProvider.chat({
|
|
202
|
+
messages: [
|
|
203
|
+
{
|
|
204
|
+
id: 'summary-request',
|
|
205
|
+
role: 'user',
|
|
206
|
+
content: summaryPrompt,
|
|
207
|
+
timestamp: new Date().toISOString(),
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
model: model || 'local', // Prefer local/free model for summaries
|
|
211
|
+
maxTokens: 500,
|
|
212
|
+
temperature: 0.3,
|
|
213
|
+
});
|
|
214
|
+
return response.content;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
// Fallback to simple truncation if AI fails
|
|
218
|
+
console.warn('[Memory] AI summarization failed, using truncation:', error);
|
|
219
|
+
return `Previous conversation summary (${messages.length} messages): ${messages
|
|
220
|
+
.slice(-3)
|
|
221
|
+
.map((m) => m.content.slice(0, 100))
|
|
222
|
+
.join(' ... ')}`;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Compact messages by summarizing older ones and truncating large tool results
|
|
227
|
+
*/
|
|
228
|
+
export async function compactMessages(messages, model, config = DEFAULT_MEMORY_CONFIG) {
|
|
229
|
+
const originalCount = messages.length;
|
|
230
|
+
const originalTokens = estimateMessagesTokens(messages);
|
|
231
|
+
// Don't compact if not needed
|
|
232
|
+
if (!needsCompaction(messages, model, config)) {
|
|
233
|
+
return {
|
|
234
|
+
messages,
|
|
235
|
+
originalCount,
|
|
236
|
+
compactedCount: messages.length,
|
|
237
|
+
tokensReduced: 0,
|
|
238
|
+
wasCompacted: false,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// First pass: Truncate large tool results in all messages
|
|
242
|
+
let toolResultsTruncated = 0;
|
|
243
|
+
let tokensSavedFromToolResults = 0;
|
|
244
|
+
const messagesWithTruncatedTools = messages.map((m) => {
|
|
245
|
+
if (!m.toolCalls || m.toolCalls.length === 0)
|
|
246
|
+
return m;
|
|
247
|
+
const { toolCalls, tokensSaved } = processToolCallsForCompaction(m.toolCalls, config);
|
|
248
|
+
if (tokensSaved > 0) {
|
|
249
|
+
toolResultsTruncated++;
|
|
250
|
+
tokensSavedFromToolResults += tokensSaved;
|
|
251
|
+
}
|
|
252
|
+
return { ...m, toolCalls };
|
|
253
|
+
});
|
|
254
|
+
// Check if tool truncation was enough
|
|
255
|
+
const tokensAfterToolTruncation = estimateMessagesTokens(messagesWithTruncatedTools);
|
|
256
|
+
const contextWindow = getContextWindow(model);
|
|
257
|
+
const targetTokens = contextWindow * config.targetAfterCompaction;
|
|
258
|
+
if (tokensAfterToolTruncation <= contextWindow * config.compactThreshold) {
|
|
259
|
+
// Tool truncation was sufficient
|
|
260
|
+
return {
|
|
261
|
+
messages: messagesWithTruncatedTools,
|
|
262
|
+
originalCount,
|
|
263
|
+
compactedCount: messagesWithTruncatedTools.length,
|
|
264
|
+
tokensReduced: tokensSavedFromToolResults,
|
|
265
|
+
wasCompacted: tokensSavedFromToolResults > 0,
|
|
266
|
+
toolResultsTruncated: toolResultsTruncated > 0 ? toolResultsTruncated : undefined,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
// Second pass: Use priority-based selection or summarization
|
|
270
|
+
const preserveCount = Math.min(config.preserveRecentCount, messagesWithTruncatedTools.length - 1);
|
|
271
|
+
const messagesToSummarize = messagesWithTruncatedTools.slice(0, -preserveCount);
|
|
272
|
+
const messagesToKeep = messagesWithTruncatedTools.slice(-preserveCount);
|
|
273
|
+
// Try priority-based selection first for moderate compaction needs
|
|
274
|
+
const tokensNeeded = tokensAfterToolTruncation - targetTokens;
|
|
275
|
+
const olderMessagesTokens = estimateMessagesTokens(messagesToSummarize);
|
|
276
|
+
if (tokensNeeded < olderMessagesTokens * 0.5) {
|
|
277
|
+
// We only need to remove ~50% of older messages, use priority selection
|
|
278
|
+
const selected = selectMessagesForRetention(messagesWithTruncatedTools, Math.floor(targetTokens), config);
|
|
279
|
+
const selectedTokens = estimateMessagesTokens(selected);
|
|
280
|
+
return {
|
|
281
|
+
messages: selected,
|
|
282
|
+
originalCount,
|
|
283
|
+
compactedCount: selected.length,
|
|
284
|
+
tokensReduced: originalTokens - selectedTokens,
|
|
285
|
+
wasCompacted: true,
|
|
286
|
+
toolResultsTruncated: toolResultsTruncated > 0 ? toolResultsTruncated : undefined,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Full summarization needed for heavy compaction
|
|
290
|
+
const summary = await summarizeMessages(messagesToSummarize, model);
|
|
291
|
+
// Create summary message
|
|
292
|
+
const summaryMessage = {
|
|
293
|
+
id: `summary-${Date.now()}`,
|
|
294
|
+
conversationId: messages[0]?.conversationId || '',
|
|
295
|
+
role: 'system',
|
|
296
|
+
content: `[CONVERSATION SUMMARY - ${messagesToSummarize.length} messages compacted]\n\n${summary}`,
|
|
297
|
+
createdAt: new Date().toISOString(),
|
|
298
|
+
};
|
|
299
|
+
// New message array: summary + recent messages
|
|
300
|
+
const compactedMessages = [summaryMessage, ...messagesToKeep];
|
|
301
|
+
const compactedTokens = estimateMessagesTokens(compactedMessages);
|
|
302
|
+
return {
|
|
303
|
+
messages: compactedMessages,
|
|
304
|
+
summary,
|
|
305
|
+
originalCount,
|
|
306
|
+
compactedCount: compactedMessages.length,
|
|
307
|
+
tokensReduced: originalTokens - compactedTokens,
|
|
308
|
+
wasCompacted: true,
|
|
309
|
+
toolResultsTruncated: toolResultsTruncated > 0 ? toolResultsTruncated : undefined,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get memory stats for a conversation
|
|
314
|
+
*/
|
|
315
|
+
export function getMemoryStats(messages, model, config = DEFAULT_MEMORY_CONFIG) {
|
|
316
|
+
const contextWindow = getContextWindow(model);
|
|
317
|
+
const estimatedTokens = estimateMessagesTokens(messages);
|
|
318
|
+
const summaryCount = messages.filter((m) => m.content.startsWith('[CONVERSATION SUMMARY')).length;
|
|
319
|
+
return {
|
|
320
|
+
messageCount: messages.length,
|
|
321
|
+
estimatedTokens,
|
|
322
|
+
contextWindow,
|
|
323
|
+
usagePercentage: (estimatedTokens / contextWindow) * 100,
|
|
324
|
+
needsCompaction: needsCompaction(messages, model, config),
|
|
325
|
+
summaryCount,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
export default {
|
|
329
|
+
DEFAULT_MEMORY_CONFIG,
|
|
330
|
+
estimateTokens,
|
|
331
|
+
estimateMessagesTokens,
|
|
332
|
+
getContextWindow,
|
|
333
|
+
needsCompaction,
|
|
334
|
+
summarizeMessages,
|
|
335
|
+
compactMessages,
|
|
336
|
+
getMemoryStats,
|
|
337
|
+
// Advanced pruning
|
|
338
|
+
truncateToolResult,
|
|
339
|
+
processToolCallsForCompaction,
|
|
340
|
+
scoreMessageImportance,
|
|
341
|
+
selectMessagesForRetention,
|
|
342
|
+
};
|
|
343
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Messenger-to-AI Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Handles incoming messages from all 22 chat providers (Telegram, Discord,
|
|
5
|
+
* Slack, WhatsApp, etc.) by routing them through the AI and replying on
|
|
6
|
+
* the same channel.
|
|
7
|
+
*
|
|
8
|
+
* Architecture inspired by OpenClaw (text chunking, channel dock pattern)
|
|
9
|
+
* and NanoClaw (cursor rollback on error, concurrency limiting, typing
|
|
10
|
+
* indicators, GroupQueue pattern).
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* Provider webhook -> parseMessage() -> IncomingMessage
|
|
14
|
+
* -> getChatRegistry().emit({ type: 'message', payload })
|
|
15
|
+
* -> handleIncomingMessage()
|
|
16
|
+
* 1. shouldRespond() mention gating
|
|
17
|
+
* 2. checkRateLimit() sliding window
|
|
18
|
+
* 3. getOrCreateConversation() keyed by provider:accountId:chatId
|
|
19
|
+
* 4. Load history + compaction check
|
|
20
|
+
* 5. buildSystemPrompt() with channel personality
|
|
21
|
+
* 6. aiProvider.chat() call AI
|
|
22
|
+
* 7. provider.outbound.send() reply to user
|
|
23
|
+
* 8. addMessage() x2 persist user + assistant
|
|
24
|
+
*/
|
|
25
|
+
import type { ChatEvent, ChatContext as RegistryChatContext } from './providers/types.js';
|
|
26
|
+
/** In-memory cache: "telegram:default:12345" -> conversationId */
|
|
27
|
+
declare const channelConversations: Map<string, string>;
|
|
28
|
+
declare function getOrCreateChannelConversation(provider: string, accountId: string, chatId: string, chatName?: string): Promise<string>;
|
|
29
|
+
declare function friendlyErrorReply(error: unknown): string;
|
|
30
|
+
declare function handleIncomingMessage(event: ChatEvent, _context: RegistryChatContext): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Register the messenger message handler.
|
|
33
|
+
* Call once at startup after conversation tables are initialized.
|
|
34
|
+
* Returns an unsubscribe function.
|
|
35
|
+
*/
|
|
36
|
+
export declare function registerMessageHandler(): () => void;
|
|
37
|
+
export { handleIncomingMessage, getOrCreateChannelConversation, friendlyErrorReply, channelConversations };
|
|
38
|
+
//# sourceMappingURL=message-handler.d.ts.map
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Messenger-to-AI Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Handles incoming messages from all 22 chat providers (Telegram, Discord,
|
|
5
|
+
* Slack, WhatsApp, etc.) by routing them through the AI and replying on
|
|
6
|
+
* the same channel.
|
|
7
|
+
*
|
|
8
|
+
* Architecture inspired by OpenClaw (text chunking, channel dock pattern)
|
|
9
|
+
* and NanoClaw (cursor rollback on error, concurrency limiting, typing
|
|
10
|
+
* indicators, GroupQueue pattern).
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* Provider webhook -> parseMessage() -> IncomingMessage
|
|
14
|
+
* -> getChatRegistry().emit({ type: 'message', payload })
|
|
15
|
+
* -> handleIncomingMessage()
|
|
16
|
+
* 1. shouldRespond() mention gating
|
|
17
|
+
* 2. checkRateLimit() sliding window
|
|
18
|
+
* 3. getOrCreateConversation() keyed by provider:accountId:chatId
|
|
19
|
+
* 4. Load history + compaction check
|
|
20
|
+
* 5. buildSystemPrompt() with channel personality
|
|
21
|
+
* 6. aiProvider.chat() call AI
|
|
22
|
+
* 7. provider.outbound.send() reply to user
|
|
23
|
+
* 8. addMessage() x2 persist user + assistant
|
|
24
|
+
*/
|
|
25
|
+
import { logger } from '../utils/logger.js';
|
|
26
|
+
import { getChatRegistry } from './providers/registry.js';
|
|
27
|
+
import { getGroupChatManager } from './group.js';
|
|
28
|
+
import { buildSystemPrompt } from './system-prompts.js';
|
|
29
|
+
import { createConversation, addMessage, getConversationMessages, } from './conversations.js';
|
|
30
|
+
import { needsCompaction, compactMessages } from './memory.js';
|
|
31
|
+
import { getSessionModel } from './execution/tools/session-status.js';
|
|
32
|
+
// CONSTANTS
|
|
33
|
+
/** Max concurrent AI calls to prevent overload (inspired by NanoClaw GroupQueue) */
|
|
34
|
+
const MAX_CONCURRENT = parseInt(process.env['POOL_MAX_CONCURRENT'] ?? '50', 10);
|
|
35
|
+
/** Currently processing count */
|
|
36
|
+
let activeCount = 0;
|
|
37
|
+
// CONVERSATION CACHE
|
|
38
|
+
/** In-memory cache: "telegram:default:12345" -> conversationId */
|
|
39
|
+
const channelConversations = new Map();
|
|
40
|
+
let sendMessagePromise = null;
|
|
41
|
+
async function sendProviderMessage(message) {
|
|
42
|
+
if (!sendMessagePromise) {
|
|
43
|
+
sendMessagePromise = import('./providers/index.js').then((mod) => mod.sendMessage);
|
|
44
|
+
}
|
|
45
|
+
const sendMessage = await sendMessagePromise;
|
|
46
|
+
return sendMessage(message);
|
|
47
|
+
}
|
|
48
|
+
function makeConversationKey(provider, accountId, chatId) {
|
|
49
|
+
return `${provider}:${accountId}:${chatId}`;
|
|
50
|
+
}
|
|
51
|
+
async function getOrCreateChannelConversation(provider, accountId, chatId, chatName) {
|
|
52
|
+
const key = makeConversationKey(provider, accountId, chatId);
|
|
53
|
+
// Cache hit
|
|
54
|
+
const cached = channelConversations.get(key);
|
|
55
|
+
if (cached)
|
|
56
|
+
return cached;
|
|
57
|
+
// No DB metadata column for messenger key, so create a new conversation.
|
|
58
|
+
// Title encodes the provider and chat for discoverability.
|
|
59
|
+
const title = chatName
|
|
60
|
+
? `${provider} - ${chatName}`
|
|
61
|
+
: `${provider} #${chatId.slice(0, 12)}`;
|
|
62
|
+
const conversation = await createConversation({
|
|
63
|
+
title,
|
|
64
|
+
presetId: 'profclaw-assistant',
|
|
65
|
+
});
|
|
66
|
+
channelConversations.set(key, conversation.id);
|
|
67
|
+
return conversation.id;
|
|
68
|
+
}
|
|
69
|
+
// ERROR HELPERS
|
|
70
|
+
function friendlyErrorReply(error) {
|
|
71
|
+
if (!(error instanceof Error)) {
|
|
72
|
+
return 'Something went wrong. Please try again.';
|
|
73
|
+
}
|
|
74
|
+
const msg = error.message.toLowerCase();
|
|
75
|
+
if (msg.includes('rate limit') || msg.includes('429') || msg.includes('too many requests')) {
|
|
76
|
+
return "I'm being rate limited by the AI provider. Please wait a moment.";
|
|
77
|
+
}
|
|
78
|
+
if (msg.includes('quota') || msg.includes('insufficient_quota') || msg.includes('billing')) {
|
|
79
|
+
return 'My API quota is used up. Please check the billing.';
|
|
80
|
+
}
|
|
81
|
+
if (msg.includes('401') || msg.includes('403') || msg.includes('unauthorized') || msg.includes('invalid.*key') || msg.includes('authentication')) {
|
|
82
|
+
return "My API key isn't working. Configuration needed.";
|
|
83
|
+
}
|
|
84
|
+
if (msg.includes('timeout') || msg.includes('timed out') || msg.includes('econnrefused')) {
|
|
85
|
+
return "The AI service isn't responding. Try again shortly.";
|
|
86
|
+
}
|
|
87
|
+
if (msg.includes('context_length') || msg.includes('too long') || msg.includes('token')) {
|
|
88
|
+
return 'The conversation is too long. Starting a fresh context may help.';
|
|
89
|
+
}
|
|
90
|
+
return 'Something went wrong. Please try again.';
|
|
91
|
+
}
|
|
92
|
+
// MESSAGE HANDLER
|
|
93
|
+
async function handleIncomingMessage(event, _context) {
|
|
94
|
+
const message = event.payload;
|
|
95
|
+
// Skip if no text content
|
|
96
|
+
if (!message.text?.trim())
|
|
97
|
+
return;
|
|
98
|
+
// Concurrency guard (NanoClaw pattern) - send busy reply instead of silent drop
|
|
99
|
+
if (activeCount >= MAX_CONCURRENT) {
|
|
100
|
+
logger.warn('[MessageHandler] At concurrency limit', {
|
|
101
|
+
provider: message.provider,
|
|
102
|
+
chatId: message.chatId,
|
|
103
|
+
activeCount,
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
await sendProviderMessage({
|
|
107
|
+
provider: message.provider,
|
|
108
|
+
accountId: message.accountId,
|
|
109
|
+
to: message.chatId,
|
|
110
|
+
text: "I'm handling many requests right now. Please try again in a moment.",
|
|
111
|
+
threadId: message.threadId,
|
|
112
|
+
replyToId: message.id,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// If we can't even send the busy reply, just log and move on
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const groupManager = getGroupChatManager();
|
|
121
|
+
// Mention gating - respects DM, reply, mention rules
|
|
122
|
+
if (!groupManager.shouldRespond(message)) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Rate limiting (sliding window)
|
|
126
|
+
const rateCheck = groupManager.checkRateLimit(message.senderId, message.chatId);
|
|
127
|
+
if (!rateCheck.allowed) {
|
|
128
|
+
const cooldownMsg = rateCheck.message ?? "You're sending messages too fast. Please wait a moment.";
|
|
129
|
+
await sendProviderMessage({
|
|
130
|
+
provider: message.provider,
|
|
131
|
+
accountId: message.accountId,
|
|
132
|
+
to: message.chatId,
|
|
133
|
+
text: cooldownMsg,
|
|
134
|
+
threadId: message.threadId,
|
|
135
|
+
replyToId: message.id,
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Track user activity
|
|
140
|
+
groupManager.trackUser(message);
|
|
141
|
+
activeCount++;
|
|
142
|
+
let responseSentToUser = false;
|
|
143
|
+
try {
|
|
144
|
+
// Get or create conversation keyed by provider:accountId:chatId
|
|
145
|
+
const conversationId = await getOrCreateChannelConversation(message.provider, message.accountId, message.chatId, message.chatName);
|
|
146
|
+
// Load history
|
|
147
|
+
const history = await getConversationMessages(conversationId);
|
|
148
|
+
// Compaction check
|
|
149
|
+
let messages = history;
|
|
150
|
+
if (needsCompaction(messages)) {
|
|
151
|
+
const result = await compactMessages(messages);
|
|
152
|
+
messages = result.messages;
|
|
153
|
+
}
|
|
154
|
+
// Resolve model - per-conversation override or system default
|
|
155
|
+
const modelOverride = getSessionModel(conversationId);
|
|
156
|
+
// Build system prompt with channel personality
|
|
157
|
+
const personality = groupManager.getPersonality(message.chatId, message.provider);
|
|
158
|
+
const promptContext = {
|
|
159
|
+
user: {
|
|
160
|
+
name: message.senderName || message.senderUsername,
|
|
161
|
+
},
|
|
162
|
+
runtime: {
|
|
163
|
+
model: modelOverride,
|
|
164
|
+
conversationId,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
let systemPrompt = await buildSystemPrompt('profclaw-assistant', promptContext);
|
|
168
|
+
if (personality?.systemPrompt) {
|
|
169
|
+
systemPrompt += `\n\n${personality.systemPrompt}`;
|
|
170
|
+
}
|
|
171
|
+
// Convert history to ChatMessage format for the AI
|
|
172
|
+
const aiMessages = messages.map((m) => ({
|
|
173
|
+
id: m.id,
|
|
174
|
+
role: m.role,
|
|
175
|
+
content: m.content,
|
|
176
|
+
timestamp: m.createdAt,
|
|
177
|
+
}));
|
|
178
|
+
// Add the new user message
|
|
179
|
+
aiMessages.push({
|
|
180
|
+
id: message.id,
|
|
181
|
+
role: 'user',
|
|
182
|
+
content: message.text,
|
|
183
|
+
timestamp: message.timestamp.toISOString(),
|
|
184
|
+
});
|
|
185
|
+
// Call AI (lazy import to avoid loading all AI SDKs at startup)
|
|
186
|
+
const { aiProvider } = await import('../providers/ai-sdk.js');
|
|
187
|
+
const response = await aiProvider.chat({
|
|
188
|
+
messages: aiMessages,
|
|
189
|
+
model: modelOverride,
|
|
190
|
+
systemPrompt,
|
|
191
|
+
temperature: 0.7,
|
|
192
|
+
});
|
|
193
|
+
// Get reply target (thread/reply context from group manager)
|
|
194
|
+
const replyTarget = groupManager.getReplyTarget(message);
|
|
195
|
+
// Send response back to the channel
|
|
196
|
+
const sendResult = await sendProviderMessage({
|
|
197
|
+
provider: message.provider,
|
|
198
|
+
accountId: message.accountId,
|
|
199
|
+
to: message.chatId,
|
|
200
|
+
text: response.content,
|
|
201
|
+
threadId: replyTarget.threadId,
|
|
202
|
+
replyToId: replyTarget.replyToId,
|
|
203
|
+
});
|
|
204
|
+
responseSentToUser = sendResult.success;
|
|
205
|
+
// Persist both messages
|
|
206
|
+
await addMessage({
|
|
207
|
+
conversationId,
|
|
208
|
+
role: 'user',
|
|
209
|
+
content: message.text,
|
|
210
|
+
});
|
|
211
|
+
await addMessage({
|
|
212
|
+
conversationId,
|
|
213
|
+
role: 'assistant',
|
|
214
|
+
content: response.content,
|
|
215
|
+
model: response.model,
|
|
216
|
+
provider: response.provider,
|
|
217
|
+
tokenUsage: {
|
|
218
|
+
prompt: response.usage.promptTokens,
|
|
219
|
+
completion: response.usage.completionTokens,
|
|
220
|
+
total: response.usage.totalTokens,
|
|
221
|
+
},
|
|
222
|
+
cost: response.usage.cost,
|
|
223
|
+
});
|
|
224
|
+
logger.info('[MessageHandler] Processed message', {
|
|
225
|
+
provider: message.provider,
|
|
226
|
+
chatId: message.chatId,
|
|
227
|
+
conversationId,
|
|
228
|
+
model: response.model,
|
|
229
|
+
tokens: response.usage.totalTokens,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
logger.error('[MessageHandler] Failed to process message', {
|
|
234
|
+
provider: message.provider,
|
|
235
|
+
chatId: message.chatId,
|
|
236
|
+
error: error instanceof Error ? error.message : String(error),
|
|
237
|
+
});
|
|
238
|
+
// Send friendly error reply (NanoClaw pattern: only if we haven't sent output yet)
|
|
239
|
+
if (!responseSentToUser) {
|
|
240
|
+
try {
|
|
241
|
+
await sendProviderMessage({
|
|
242
|
+
provider: message.provider,
|
|
243
|
+
accountId: message.accountId,
|
|
244
|
+
to: message.chatId,
|
|
245
|
+
text: friendlyErrorReply(error),
|
|
246
|
+
threadId: message.threadId,
|
|
247
|
+
replyToId: message.id,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// If we can't even send the error, just log it
|
|
252
|
+
logger.error('[MessageHandler] Failed to send error reply');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
activeCount--;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// REGISTRATION
|
|
261
|
+
/**
|
|
262
|
+
* Register the messenger message handler.
|
|
263
|
+
* Call once at startup after conversation tables are initialized.
|
|
264
|
+
* Returns an unsubscribe function.
|
|
265
|
+
*/
|
|
266
|
+
export function registerMessageHandler() {
|
|
267
|
+
const registry = getChatRegistry();
|
|
268
|
+
const unsubscribe = registry.on('message', handleIncomingMessage);
|
|
269
|
+
logger.info('[MessageHandler] Registered messenger-to-AI pipeline');
|
|
270
|
+
return unsubscribe;
|
|
271
|
+
}
|
|
272
|
+
// Exported for testing
|
|
273
|
+
export { handleIncomingMessage, getOrCreateChannelConversation, friendlyErrorReply, channelConversations };
|
|
274
|
+
//# sourceMappingURL=message-handler.js.map
|