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,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker Implementation
|
|
3
|
+
*
|
|
4
|
+
* Protects against cascading failures by "opening" the circuit
|
|
5
|
+
* when error rates exceed thresholds, preventing further requests
|
|
6
|
+
* until the service has time to recover.
|
|
7
|
+
*/
|
|
8
|
+
import { AppError, ErrorCategory, ErrorSeverity } from '../types/errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Circuit breaker states
|
|
11
|
+
*/
|
|
12
|
+
export var CircuitState;
|
|
13
|
+
(function (CircuitState) {
|
|
14
|
+
/** Circuit is closed, requests flow normally */
|
|
15
|
+
CircuitState["CLOSED"] = "CLOSED";
|
|
16
|
+
/** Circuit is open, requests are blocked */
|
|
17
|
+
CircuitState["OPEN"] = "OPEN";
|
|
18
|
+
/** Circuit is testing if service recovered */
|
|
19
|
+
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
20
|
+
})(CircuitState || (CircuitState = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Circuit breaker error
|
|
23
|
+
*/
|
|
24
|
+
export class CircuitBreakerError extends AppError {
|
|
25
|
+
constructor(name, state) {
|
|
26
|
+
super(`Circuit breaker '${name}' is ${state}`, {
|
|
27
|
+
category: ErrorCategory.EXTERNAL_API,
|
|
28
|
+
severity: ErrorSeverity.MEDIUM,
|
|
29
|
+
retryable: state === CircuitState.HALF_OPEN,
|
|
30
|
+
statusCode: 503,
|
|
31
|
+
metadata: { circuitName: name, circuitState: state },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Circuit Breaker implementation
|
|
37
|
+
*/
|
|
38
|
+
export class CircuitBreaker {
|
|
39
|
+
config;
|
|
40
|
+
state = CircuitState.CLOSED;
|
|
41
|
+
failureCount = 0;
|
|
42
|
+
successCount = 0;
|
|
43
|
+
totalRequests = 0;
|
|
44
|
+
lastFailureTime;
|
|
45
|
+
lastSuccessTime;
|
|
46
|
+
stateChangedAt = new Date();
|
|
47
|
+
failures = [];
|
|
48
|
+
resetTimer;
|
|
49
|
+
constructor(config) {
|
|
50
|
+
this.config = config;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Execute a function through the circuit breaker
|
|
54
|
+
*/
|
|
55
|
+
async execute(fn) {
|
|
56
|
+
this.totalRequests++;
|
|
57
|
+
// Check circuit state
|
|
58
|
+
if (this.state === CircuitState.OPEN) {
|
|
59
|
+
// Check if we should attempt recovery
|
|
60
|
+
const timeSinceOpen = Date.now() - this.stateChangedAt.getTime();
|
|
61
|
+
if (timeSinceOpen >= this.config.resetTimeout) {
|
|
62
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new CircuitBreakerError(this.config.name, this.state);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
// Apply timeout if configured
|
|
70
|
+
const result = this.config.timeout
|
|
71
|
+
? await this.withTimeout(fn, this.config.timeout)
|
|
72
|
+
: await fn();
|
|
73
|
+
this.onSuccess();
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.onFailure(error);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Execute function with timeout
|
|
83
|
+
*/
|
|
84
|
+
async withTimeout(fn, timeoutMs) {
|
|
85
|
+
return Promise.race([
|
|
86
|
+
fn(),
|
|
87
|
+
new Promise((_, reject) => setTimeout(() => reject(new AppError(`Operation timed out after ${timeoutMs}ms`, {
|
|
88
|
+
category: ErrorCategory.TIMEOUT,
|
|
89
|
+
retryable: true,
|
|
90
|
+
statusCode: 504,
|
|
91
|
+
})), timeoutMs)),
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Handle successful execution
|
|
96
|
+
*/
|
|
97
|
+
onSuccess() {
|
|
98
|
+
this.lastSuccessTime = new Date();
|
|
99
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
100
|
+
this.successCount++;
|
|
101
|
+
if (this.successCount >= this.config.successThreshold) {
|
|
102
|
+
this.transitionTo(CircuitState.CLOSED);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (this.state === CircuitState.CLOSED) {
|
|
106
|
+
// Reset failure count on success in closed state
|
|
107
|
+
this.failureCount = 0;
|
|
108
|
+
this.failures = [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Handle failed execution
|
|
113
|
+
*/
|
|
114
|
+
onFailure(error) {
|
|
115
|
+
this.lastFailureTime = new Date();
|
|
116
|
+
this.failureCount++;
|
|
117
|
+
this.failures.push(new Date());
|
|
118
|
+
// Clean up old failures outside the window
|
|
119
|
+
const cutoff = Date.now() - this.config.failureWindow;
|
|
120
|
+
this.failures = this.failures.filter((f) => f.getTime() > cutoff);
|
|
121
|
+
// Check if we should open the circuit
|
|
122
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
123
|
+
// Any failure in half-open state reopens the circuit
|
|
124
|
+
this.transitionTo(CircuitState.OPEN);
|
|
125
|
+
}
|
|
126
|
+
else if (this.state === CircuitState.CLOSED) {
|
|
127
|
+
// Check if failures exceed threshold within window
|
|
128
|
+
if (this.failures.length >= this.config.failureThreshold) {
|
|
129
|
+
this.transitionTo(CircuitState.OPEN);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
console.error(`[CircuitBreaker:${this.config.name}] Failure recorded. ` +
|
|
133
|
+
`Count: ${this.failures.length}/${this.config.failureThreshold} ` +
|
|
134
|
+
`State: ${this.state}`, error);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Transition to a new state
|
|
138
|
+
*/
|
|
139
|
+
transitionTo(newState) {
|
|
140
|
+
const oldState = this.state;
|
|
141
|
+
this.state = newState;
|
|
142
|
+
this.stateChangedAt = new Date();
|
|
143
|
+
if (newState === CircuitState.CLOSED) {
|
|
144
|
+
// Reset counters when closing
|
|
145
|
+
this.failureCount = 0;
|
|
146
|
+
this.successCount = 0;
|
|
147
|
+
this.failures = [];
|
|
148
|
+
}
|
|
149
|
+
else if (newState === CircuitState.HALF_OPEN) {
|
|
150
|
+
// Reset success counter when entering half-open
|
|
151
|
+
this.successCount = 0;
|
|
152
|
+
}
|
|
153
|
+
else if (newState === CircuitState.OPEN) {
|
|
154
|
+
// Schedule automatic transition to half-open
|
|
155
|
+
if (this.resetTimer) {
|
|
156
|
+
clearTimeout(this.resetTimer);
|
|
157
|
+
}
|
|
158
|
+
this.resetTimer = setTimeout(() => {
|
|
159
|
+
if (this.state === CircuitState.OPEN) {
|
|
160
|
+
this.transitionTo(CircuitState.HALF_OPEN);
|
|
161
|
+
}
|
|
162
|
+
}, this.config.resetTimeout);
|
|
163
|
+
}
|
|
164
|
+
console.log(`[CircuitBreaker:${this.config.name}] State changed: ${oldState} → ${newState}`);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get current statistics
|
|
168
|
+
*/
|
|
169
|
+
getStats() {
|
|
170
|
+
return {
|
|
171
|
+
state: this.state,
|
|
172
|
+
failureCount: this.failureCount,
|
|
173
|
+
successCount: this.successCount,
|
|
174
|
+
totalRequests: this.totalRequests,
|
|
175
|
+
lastFailureTime: this.lastFailureTime,
|
|
176
|
+
lastSuccessTime: this.lastSuccessTime,
|
|
177
|
+
stateChangedAt: this.stateChangedAt,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Manually reset the circuit breaker
|
|
182
|
+
*/
|
|
183
|
+
reset() {
|
|
184
|
+
if (this.resetTimer) {
|
|
185
|
+
clearTimeout(this.resetTimer);
|
|
186
|
+
}
|
|
187
|
+
this.state = CircuitState.CLOSED;
|
|
188
|
+
this.failureCount = 0;
|
|
189
|
+
this.successCount = 0;
|
|
190
|
+
this.failures = [];
|
|
191
|
+
this.stateChangedAt = new Date();
|
|
192
|
+
console.log(`[CircuitBreaker:${this.config.name}] Manually reset`);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Manually open the circuit breaker
|
|
196
|
+
*/
|
|
197
|
+
open() {
|
|
198
|
+
this.transitionTo(CircuitState.OPEN);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get current state
|
|
202
|
+
*/
|
|
203
|
+
getState() {
|
|
204
|
+
return this.state;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Circuit breaker registry for managing multiple breakers
|
|
209
|
+
*/
|
|
210
|
+
class CircuitBreakerRegistry {
|
|
211
|
+
breakers = new Map();
|
|
212
|
+
/**
|
|
213
|
+
* Get or create a circuit breaker
|
|
214
|
+
*/
|
|
215
|
+
getOrCreate(name, config) {
|
|
216
|
+
let breaker = this.breakers.get(name);
|
|
217
|
+
if (!breaker) {
|
|
218
|
+
const defaultConfig = {
|
|
219
|
+
name,
|
|
220
|
+
failureThreshold: 5,
|
|
221
|
+
failureWindow: 60000, // 1 minute
|
|
222
|
+
resetTimeout: 30000, // 30 seconds
|
|
223
|
+
successThreshold: 2,
|
|
224
|
+
timeout: 10000, // 10 seconds
|
|
225
|
+
...config,
|
|
226
|
+
};
|
|
227
|
+
breaker = new CircuitBreaker(defaultConfig);
|
|
228
|
+
this.breakers.set(name, breaker);
|
|
229
|
+
}
|
|
230
|
+
return breaker;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get all circuit breakers
|
|
234
|
+
*/
|
|
235
|
+
getAll() {
|
|
236
|
+
return new Map(this.breakers);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get stats for all breakers
|
|
240
|
+
*/
|
|
241
|
+
getAllStats() {
|
|
242
|
+
const stats = {};
|
|
243
|
+
for (const [name, breaker] of this.breakers) {
|
|
244
|
+
stats[name] = breaker.getStats();
|
|
245
|
+
}
|
|
246
|
+
return stats;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Reset a specific breaker
|
|
250
|
+
*/
|
|
251
|
+
reset(name) {
|
|
252
|
+
this.breakers.get(name)?.reset();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Reset all breakers
|
|
256
|
+
*/
|
|
257
|
+
resetAll() {
|
|
258
|
+
for (const breaker of this.breakers.values()) {
|
|
259
|
+
breaker.reset();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Singleton registry
|
|
264
|
+
export const circuitBreakers = new CircuitBreakerRegistry();
|
|
265
|
+
/**
|
|
266
|
+
* Decorator to wrap a function with a circuit breaker
|
|
267
|
+
*/
|
|
268
|
+
export function withCircuitBreaker(name, config) {
|
|
269
|
+
return function (_target, _propertyKey, descriptor) {
|
|
270
|
+
const original = descriptor.value;
|
|
271
|
+
if (!original) {
|
|
272
|
+
return descriptor;
|
|
273
|
+
}
|
|
274
|
+
descriptor.value = async function (...args) {
|
|
275
|
+
const breaker = circuitBreakers.getOrCreate(name, config);
|
|
276
|
+
return breaker.execute(() => original.apply(this, args));
|
|
277
|
+
};
|
|
278
|
+
return descriptor;
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Loads and parses a YAML configuration file
|
|
4
|
+
* @param fileName Name of the file in the config/ directory
|
|
5
|
+
* @returns Parsed configuration object
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadConfig<T>(fileName: string): T;
|
|
8
|
+
/**
|
|
9
|
+
* Watch a config file for changes and reload (optional)
|
|
10
|
+
*/
|
|
11
|
+
export declare function watchConfig<T>(fileName: string, onUpdate: (config: T) => void): fs.FSWatcher;
|
|
12
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
import { logger } from './logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Loads and parses a YAML configuration file
|
|
7
|
+
* @param fileName Name of the file in the config/ directory
|
|
8
|
+
* @returns Parsed configuration object
|
|
9
|
+
*/
|
|
10
|
+
export function loadConfig(fileName) {
|
|
11
|
+
try {
|
|
12
|
+
const configPath = path.resolve(process.cwd(), 'config', fileName);
|
|
13
|
+
if (!fs.existsSync(configPath)) {
|
|
14
|
+
logger.warn(`Config file not found: ${configPath}, using defaults`);
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const fileContents = fs.readFileSync(configPath, 'utf8');
|
|
18
|
+
// Interpolate environment variables: ${VAR_NAME} or ${VAR_NAME:-default}
|
|
19
|
+
const interpolated = fileContents.replace(/\${(\w+)(?::-([^}]*))?}/g, (_, name, defaultValue) => {
|
|
20
|
+
return process.env[name] || defaultValue || '';
|
|
21
|
+
});
|
|
22
|
+
const config = yaml.load(interpolated);
|
|
23
|
+
logger.debug(`Loaded configuration from ${fileName}`);
|
|
24
|
+
return config;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
logger.error(`Error loading config file ${fileName}:`, error);
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Watch a config file for changes and reload (optional)
|
|
33
|
+
*/
|
|
34
|
+
export function watchConfig(fileName, onUpdate) {
|
|
35
|
+
const configPath = path.resolve(process.cwd(), 'config', fileName);
|
|
36
|
+
return fs.watch(configPath, (eventType) => {
|
|
37
|
+
if (eventType === 'change') {
|
|
38
|
+
logger.info(`Config file changed: ${fileName}, reloading...`);
|
|
39
|
+
const newConfig = loadConfig(fileName);
|
|
40
|
+
onUpdate(newConfig);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encrypt sensitive data
|
|
3
|
+
* @returns Base64 string containing [iv]:[authTag]:[encryptedData]
|
|
4
|
+
*/
|
|
5
|
+
export declare function encrypt(text: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Decrypt sensitive data
|
|
8
|
+
*/
|
|
9
|
+
export declare function decrypt(encryptedText: string): string;
|
|
10
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes } from 'crypto';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
4
|
+
const IV_LENGTH = 12; // Recommended for GCM
|
|
5
|
+
/**
|
|
6
|
+
* Get the encryption key from environment variable
|
|
7
|
+
*/
|
|
8
|
+
function getEncryptionKey() {
|
|
9
|
+
const key = process.env.ENCRYPTION_KEY;
|
|
10
|
+
if (!key) {
|
|
11
|
+
if (process.env.NODE_ENV === 'production') {
|
|
12
|
+
throw new Error('ENCRYPTION_KEY environment variable is required in production');
|
|
13
|
+
}
|
|
14
|
+
// Fallback for development/testing
|
|
15
|
+
return Buffer.from('default_development_key_32_bytes_long_12345678');
|
|
16
|
+
}
|
|
17
|
+
// Key must be 32 bytes for aes-256-gcm
|
|
18
|
+
const bufferedKey = Buffer.from(key, 'hex');
|
|
19
|
+
if (bufferedKey.length !== 32) {
|
|
20
|
+
throw new Error('ENCRYPTION_KEY must be a 32-byte hex string');
|
|
21
|
+
}
|
|
22
|
+
return bufferedKey;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Encrypt sensitive data
|
|
26
|
+
* @returns Base64 string containing [iv]:[authTag]:[encryptedData]
|
|
27
|
+
*/
|
|
28
|
+
export function encrypt(text) {
|
|
29
|
+
const iv = randomBytes(IV_LENGTH);
|
|
30
|
+
const cipher = createCipheriv(ALGORITHM, getEncryptionKey(), iv);
|
|
31
|
+
const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);
|
|
32
|
+
const authTag = cipher.getAuthTag();
|
|
33
|
+
return `${iv.toString('base64')}:${authTag.toString('base64')}:${encrypted.toString('base64')}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Decrypt sensitive data
|
|
37
|
+
*/
|
|
38
|
+
export function decrypt(encryptedText) {
|
|
39
|
+
try {
|
|
40
|
+
const [ivBase64, authTagBase64, dataBase64] = encryptedText.split(':');
|
|
41
|
+
if (!ivBase64 || !authTagBase64 || !dataBase64) {
|
|
42
|
+
throw new Error('Invalid encrypted text format');
|
|
43
|
+
}
|
|
44
|
+
const iv = Buffer.from(ivBase64, 'base64');
|
|
45
|
+
const authTag = Buffer.from(authTagBase64, 'base64');
|
|
46
|
+
const encrypted = Buffer.from(dataBase64, 'base64');
|
|
47
|
+
const decipher = createDecipheriv(ALGORITHM, getEncryptionKey(), iv);
|
|
48
|
+
decipher.setAuthTag(authTag);
|
|
49
|
+
return decipher.update(encrypted) + decipher.final('utf8');
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error('[Crypto] Decryption failed:', error);
|
|
53
|
+
// If decryption fails, it might be due to a key mismatch or corrupted data.
|
|
54
|
+
// In some cases, we might want to return the original text if it's not encrypted (migration path),
|
|
55
|
+
// but for security it's better to throw.
|
|
56
|
+
throw new Error('Failed to decrypt data');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates required and optional environment variables at startup.
|
|
5
|
+
* Fails fast with clear error messages if required variables are missing.
|
|
6
|
+
*/
|
|
7
|
+
export interface EnvVarSpec {
|
|
8
|
+
name: string;
|
|
9
|
+
required: boolean;
|
|
10
|
+
default?: string;
|
|
11
|
+
description: string;
|
|
12
|
+
secret?: boolean;
|
|
13
|
+
validate?: (value: string) => boolean | string;
|
|
14
|
+
}
|
|
15
|
+
export interface ValidationResult {
|
|
16
|
+
valid: boolean;
|
|
17
|
+
errors: string[];
|
|
18
|
+
warnings: string[];
|
|
19
|
+
loaded: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* All environment variables used by the application
|
|
23
|
+
*/
|
|
24
|
+
export declare const ENV_SPEC: EnvVarSpec[];
|
|
25
|
+
/**
|
|
26
|
+
* Validate all environment variables
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateEnvironment(options?: {
|
|
29
|
+
exitOnError?: boolean;
|
|
30
|
+
logResults?: boolean;
|
|
31
|
+
}): ValidationResult;
|
|
32
|
+
/**
|
|
33
|
+
* Get a summary of configured integrations
|
|
34
|
+
*/
|
|
35
|
+
export declare function getConfiguredIntegrations(): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Get a summary of configured AI providers
|
|
38
|
+
*/
|
|
39
|
+
export declare function getConfiguredAIProviders(): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Generate .env.example content
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateEnvExample(): string;
|
|
44
|
+
//# sourceMappingURL=env-validator.d.ts.map
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates required and optional environment variables at startup.
|
|
5
|
+
* Fails fast with clear error messages if required variables are missing.
|
|
6
|
+
*/
|
|
7
|
+
import { createContextualLogger } from './logger.js';
|
|
8
|
+
const log = createContextualLogger('EnvValidator');
|
|
9
|
+
/**
|
|
10
|
+
* All environment variables used by the application
|
|
11
|
+
*/
|
|
12
|
+
export const ENV_SPEC = [
|
|
13
|
+
// Server
|
|
14
|
+
{ name: 'PORT', required: false, default: '3000', description: 'HTTP server port' },
|
|
15
|
+
{ name: 'NODE_ENV', required: false, default: 'development', description: 'Node environment (development/production/test)' },
|
|
16
|
+
// Storage
|
|
17
|
+
{ name: 'STORAGE_TIER', required: false, default: 'local', description: 'Storage backend: memory, local (file), libsql' },
|
|
18
|
+
{ name: 'LIBSQL_URL', required: false, description: 'LibSQL database URL (required if STORAGE_TIER=libsql)' },
|
|
19
|
+
{ name: 'LIBSQL_AUTH_TOKEN', required: false, secret: true, description: 'LibSQL auth token for Turso cloud' },
|
|
20
|
+
{ name: 'DATA_PATH', required: false, default: './data', description: 'Path for file-based storage' },
|
|
21
|
+
// Redis/Queue
|
|
22
|
+
{ name: 'REDIS_URL', required: false, description: 'Redis URL for task queue (optional, enables background jobs)' },
|
|
23
|
+
// Cron
|
|
24
|
+
{ name: 'ENABLE_CRON', required: false, default: 'true', description: 'Enable scheduled job execution' },
|
|
25
|
+
// CORS
|
|
26
|
+
{ name: 'CORS_ORIGIN', required: false, description: 'Allowed CORS origin (comma-separated for multiple)' },
|
|
27
|
+
// AI Providers
|
|
28
|
+
{ name: 'ANTHROPIC_API_KEY', required: false, secret: true, description: 'Anthropic API key for Claude models' },
|
|
29
|
+
{ name: 'OPENAI_API_KEY', required: false, secret: true, description: 'OpenAI API key for GPT models' },
|
|
30
|
+
{ name: 'GOOGLE_AI_API_KEY', required: false, secret: true, description: 'Google AI API key for Gemini models' },
|
|
31
|
+
{ name: 'AZURE_OPENAI_API_KEY', required: false, secret: true, description: 'Azure OpenAI API key' },
|
|
32
|
+
{ name: 'AZURE_OPENAI_ENDPOINT', required: false, description: 'Azure OpenAI endpoint URL' },
|
|
33
|
+
{ name: 'OLLAMA_URL', required: false, default: 'http://localhost:11434', description: 'Ollama server URL for local models' },
|
|
34
|
+
// Integrations - GitHub
|
|
35
|
+
{ name: 'GITHUB_CLIENT_ID', required: false, description: 'GitHub OAuth app client ID' },
|
|
36
|
+
{ name: 'GITHUB_CLIENT_SECRET', required: false, secret: true, description: 'GitHub OAuth app client secret' },
|
|
37
|
+
{ name: 'GITHUB_TOKEN', required: false, secret: true, description: 'GitHub personal access token' },
|
|
38
|
+
{ name: 'GITHUB_WEBHOOK_SECRET', required: false, secret: true, description: 'GitHub webhook signature secret' },
|
|
39
|
+
// Integrations - JIRA
|
|
40
|
+
{ name: 'JIRA_CLIENT_ID', required: false, description: 'JIRA OAuth client ID' },
|
|
41
|
+
{ name: 'JIRA_CLIENT_SECRET', required: false, secret: true, description: 'JIRA OAuth client secret' },
|
|
42
|
+
{ name: 'JIRA_CLOUD_ID', required: false, description: 'JIRA Cloud instance ID' },
|
|
43
|
+
// Integrations - Linear
|
|
44
|
+
{ name: 'LINEAR_API_KEY', required: false, secret: true, description: 'Linear API key' },
|
|
45
|
+
{ name: 'LINEAR_WEBHOOK_SECRET', required: false, secret: true, description: 'Linear webhook signature secret' },
|
|
46
|
+
// Integrations - Slack
|
|
47
|
+
{ name: 'SLACK_BOT_TOKEN', required: false, secret: true, description: 'Slack bot OAuth token' },
|
|
48
|
+
{ name: 'SLACK_SIGNING_SECRET', required: false, secret: true, description: 'Slack request signing secret' },
|
|
49
|
+
{ name: 'SLACK_APP_TOKEN', required: false, secret: true, description: 'Slack app-level token (for Socket Mode)' },
|
|
50
|
+
// Integrations - Discord
|
|
51
|
+
{ name: 'DISCORD_BOT_TOKEN', required: false, secret: true, description: 'Discord bot token' },
|
|
52
|
+
{ name: 'DISCORD_APPLICATION_ID', required: false, description: 'Discord application ID' },
|
|
53
|
+
{ name: 'DISCORD_PUBLIC_KEY', required: false, description: 'Discord public key for verification' },
|
|
54
|
+
{ name: 'DISCORD_CLIENT_SECRET', required: false, secret: true, description: 'Discord client secret for OAuth' },
|
|
55
|
+
// Integrations - Telegram
|
|
56
|
+
{ name: 'TELEGRAM_BOT_TOKEN', required: false, secret: true, description: 'Telegram bot token from BotFather' },
|
|
57
|
+
// Integrations - WhatsApp
|
|
58
|
+
{ name: 'WHATSAPP_ACCESS_TOKEN', required: false, secret: true, description: 'WhatsApp Business API access token' },
|
|
59
|
+
{ name: 'WHATSAPP_PHONE_NUMBER_ID', required: false, description: 'WhatsApp Business phone number ID' },
|
|
60
|
+
{ name: 'WHATSAPP_VERIFY_TOKEN', required: false, secret: true, description: 'WhatsApp webhook verify token' },
|
|
61
|
+
// Search
|
|
62
|
+
{ name: 'SEARXNG_URL', required: false, default: 'https://searx.tiekoetter.com', description: 'SearXNG instance for web search' },
|
|
63
|
+
// Embeddings
|
|
64
|
+
{ name: 'EMBEDDING_PROVIDER', required: false, default: 'local', description: 'Embedding provider: local, openai, voyage' },
|
|
65
|
+
{ name: 'VOYAGE_API_KEY', required: false, secret: true, description: 'Voyage AI API key for embeddings' },
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* Validate all environment variables
|
|
69
|
+
*/
|
|
70
|
+
export function validateEnvironment(options = {}) {
|
|
71
|
+
const { exitOnError = false, logResults = true } = options;
|
|
72
|
+
const result = {
|
|
73
|
+
valid: true,
|
|
74
|
+
errors: [],
|
|
75
|
+
warnings: [],
|
|
76
|
+
loaded: {},
|
|
77
|
+
};
|
|
78
|
+
for (const spec of ENV_SPEC) {
|
|
79
|
+
const value = process.env[spec.name];
|
|
80
|
+
if (!value && spec.required) {
|
|
81
|
+
result.valid = false;
|
|
82
|
+
result.errors.push(`Missing required environment variable: ${spec.name} - ${spec.description}`);
|
|
83
|
+
}
|
|
84
|
+
else if (!value && spec.default) {
|
|
85
|
+
// Apply default
|
|
86
|
+
process.env[spec.name] = spec.default;
|
|
87
|
+
result.loaded[spec.name] = spec.default;
|
|
88
|
+
if (logResults) {
|
|
89
|
+
log.debug(`Using default for ${spec.name}: ${spec.secret ? '[HIDDEN]' : spec.default}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (value) {
|
|
93
|
+
result.loaded[spec.name] = value;
|
|
94
|
+
// Run custom validation if provided
|
|
95
|
+
if (spec.validate) {
|
|
96
|
+
const validateResult = spec.validate(value);
|
|
97
|
+
if (validateResult !== true) {
|
|
98
|
+
result.valid = false;
|
|
99
|
+
result.errors.push(`Invalid value for ${spec.name}: ${validateResult}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Cross-validation checks
|
|
105
|
+
if (process.env.STORAGE_TIER === 'libsql' && !process.env.LIBSQL_URL) {
|
|
106
|
+
result.valid = false;
|
|
107
|
+
result.errors.push('STORAGE_TIER=libsql requires LIBSQL_URL to be set');
|
|
108
|
+
}
|
|
109
|
+
// Warnings for missing optional but recommended vars
|
|
110
|
+
const hasAnyAIKey = process.env.ANTHROPIC_API_KEY ||
|
|
111
|
+
process.env.OPENAI_API_KEY ||
|
|
112
|
+
process.env.GOOGLE_AI_API_KEY;
|
|
113
|
+
if (!hasAnyAIKey) {
|
|
114
|
+
result.warnings.push('No AI provider configured. Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GOOGLE_AI_API_KEY for AI features.');
|
|
115
|
+
}
|
|
116
|
+
// Log results
|
|
117
|
+
if (logResults) {
|
|
118
|
+
if (result.errors.length > 0) {
|
|
119
|
+
log.error('Environment validation failed:');
|
|
120
|
+
result.errors.forEach(err => log.error(` ❌ ${err}`));
|
|
121
|
+
}
|
|
122
|
+
if (result.warnings.length > 0) {
|
|
123
|
+
result.warnings.forEach(warn => log.warn(` ⚠️ ${warn}`));
|
|
124
|
+
}
|
|
125
|
+
if (result.valid && result.errors.length === 0) {
|
|
126
|
+
log.info('Environment validation passed ✓');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Exit if configured to do so
|
|
130
|
+
if (!result.valid && exitOnError) {
|
|
131
|
+
log.error('Server startup aborted due to environment errors. Fix the issues above and restart.');
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get a summary of configured integrations
|
|
138
|
+
*/
|
|
139
|
+
export function getConfiguredIntegrations() {
|
|
140
|
+
const integrations = [];
|
|
141
|
+
if (process.env.GITHUB_TOKEN || process.env.GITHUB_CLIENT_ID)
|
|
142
|
+
integrations.push('GitHub');
|
|
143
|
+
if (process.env.JIRA_CLIENT_ID)
|
|
144
|
+
integrations.push('JIRA');
|
|
145
|
+
if (process.env.LINEAR_API_KEY)
|
|
146
|
+
integrations.push('Linear');
|
|
147
|
+
if (process.env.SLACK_BOT_TOKEN)
|
|
148
|
+
integrations.push('Slack');
|
|
149
|
+
if (process.env.DISCORD_BOT_TOKEN)
|
|
150
|
+
integrations.push('Discord');
|
|
151
|
+
if (process.env.TELEGRAM_BOT_TOKEN)
|
|
152
|
+
integrations.push('Telegram');
|
|
153
|
+
if (process.env.WHATSAPP_ACCESS_TOKEN)
|
|
154
|
+
integrations.push('WhatsApp');
|
|
155
|
+
return integrations;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get a summary of configured AI providers
|
|
159
|
+
*/
|
|
160
|
+
export function getConfiguredAIProviders() {
|
|
161
|
+
const providers = [];
|
|
162
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
163
|
+
providers.push('Anthropic (Claude)');
|
|
164
|
+
if (process.env.OPENAI_API_KEY)
|
|
165
|
+
providers.push('OpenAI (GPT)');
|
|
166
|
+
if (process.env.GOOGLE_AI_API_KEY)
|
|
167
|
+
providers.push('Google (Gemini)');
|
|
168
|
+
if (process.env.AZURE_OPENAI_API_KEY)
|
|
169
|
+
providers.push('Azure OpenAI');
|
|
170
|
+
if (process.env.OLLAMA_URL)
|
|
171
|
+
providers.push('Ollama (local)');
|
|
172
|
+
return providers;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Generate .env.example content
|
|
176
|
+
*/
|
|
177
|
+
export function generateEnvExample() {
|
|
178
|
+
const lines = [
|
|
179
|
+
'# profClaw Environment Configuration',
|
|
180
|
+
'# Generated from ENV_SPEC in src/utils/env-validator.ts',
|
|
181
|
+
'# Copy this file to .env and fill in your values',
|
|
182
|
+
'',
|
|
183
|
+
];
|
|
184
|
+
let currentCategory = '';
|
|
185
|
+
for (const spec of ENV_SPEC) {
|
|
186
|
+
// Add category headers based on name patterns
|
|
187
|
+
const category = spec.name.split('_')[0];
|
|
188
|
+
if (category !== currentCategory) {
|
|
189
|
+
currentCategory = category;
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push(`# ─── ${getCategory(spec.name)} ───`);
|
|
192
|
+
}
|
|
193
|
+
// Add description and example
|
|
194
|
+
lines.push(`# ${spec.description}`);
|
|
195
|
+
if (spec.default) {
|
|
196
|
+
lines.push(`${spec.name}=${spec.default}`);
|
|
197
|
+
}
|
|
198
|
+
else if (spec.secret) {
|
|
199
|
+
lines.push(`# ${spec.name}=your_secret_here`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
lines.push(`# ${spec.name}=`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return lines.join('\n');
|
|
206
|
+
}
|
|
207
|
+
function getCategory(name) {
|
|
208
|
+
const prefix = name.split('_')[0];
|
|
209
|
+
const categories = {
|
|
210
|
+
PORT: 'Server',
|
|
211
|
+
NODE: 'Server',
|
|
212
|
+
STORAGE: 'Storage',
|
|
213
|
+
LIBSQL: 'Storage',
|
|
214
|
+
DATA: 'Storage',
|
|
215
|
+
REDIS: 'Queue',
|
|
216
|
+
ENABLE: 'Features',
|
|
217
|
+
CORS: 'Security',
|
|
218
|
+
ANTHROPIC: 'AI Providers',
|
|
219
|
+
OPENAI: 'AI Providers',
|
|
220
|
+
GOOGLE: 'AI Providers',
|
|
221
|
+
AZURE: 'AI Providers',
|
|
222
|
+
OLLAMA: 'AI Providers',
|
|
223
|
+
GITHUB: 'GitHub Integration',
|
|
224
|
+
JIRA: 'JIRA Integration',
|
|
225
|
+
LINEAR: 'Linear Integration',
|
|
226
|
+
SLACK: 'Slack Integration',
|
|
227
|
+
DISCORD: 'Discord Integration',
|
|
228
|
+
TELEGRAM: 'Telegram Integration',
|
|
229
|
+
WHATSAPP: 'WhatsApp Integration',
|
|
230
|
+
SEARXNG: 'Search',
|
|
231
|
+
EMBEDDING: 'Embeddings',
|
|
232
|
+
VOYAGE: 'Embeddings',
|
|
233
|
+
};
|
|
234
|
+
return categories[prefix] || 'Other';
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=env-validator.js.map
|