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,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Authentication Middleware
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified auth middleware that supports:
|
|
5
|
+
* - Cookie-based sessions (profclaw_session)
|
|
6
|
+
* - API token authentication (Authorization: Bearer profclaw_...)
|
|
7
|
+
*
|
|
8
|
+
* Applied globally to /api/* routes with configurable exclusions.
|
|
9
|
+
*/
|
|
10
|
+
import { getCookie } from 'hono/cookie';
|
|
11
|
+
import { validateSession } from './auth-service.js';
|
|
12
|
+
import { validateToken, hasScope } from './api-tokens.js';
|
|
13
|
+
import { getSettingsRaw } from '../settings/index.js';
|
|
14
|
+
import { getDb } from '../storage/index.js';
|
|
15
|
+
import { users } from '../storage/schema.js';
|
|
16
|
+
import { eq } from 'drizzle-orm';
|
|
17
|
+
// Cached admin user for local-mode bypass (avoids DB query per request)
|
|
18
|
+
let cachedLocalAdmin = null;
|
|
19
|
+
let cachedLocalAdminExpiry = 0;
|
|
20
|
+
const LOCAL_ADMIN_CACHE_TTL = 60_000; // 60s
|
|
21
|
+
/** Routes that don't require authentication */
|
|
22
|
+
const PUBLIC_ROUTES = [
|
|
23
|
+
'/api/auth/login',
|
|
24
|
+
'/api/auth/signup',
|
|
25
|
+
'/api/auth/github',
|
|
26
|
+
'/api/auth/github/callback',
|
|
27
|
+
'/api/auth/github/url',
|
|
28
|
+
'/api/auth/github/token',
|
|
29
|
+
'/api/auth/jira',
|
|
30
|
+
'/api/auth/jira/callback',
|
|
31
|
+
'/api/auth/linear',
|
|
32
|
+
'/api/auth/linear/callback',
|
|
33
|
+
'/api/auth/verify-access-key',
|
|
34
|
+
'/api/setup',
|
|
35
|
+
'/health',
|
|
36
|
+
'/auth',
|
|
37
|
+
];
|
|
38
|
+
/** Route prefixes that don't require authentication */
|
|
39
|
+
const PUBLIC_PREFIXES = [
|
|
40
|
+
'/api/setup/',
|
|
41
|
+
'/api/oobe/',
|
|
42
|
+
'/api/auth/github/',
|
|
43
|
+
'/api/auth/jira/',
|
|
44
|
+
'/api/auth/linear/',
|
|
45
|
+
'/auth/',
|
|
46
|
+
// Webhook routes use their own signature verification
|
|
47
|
+
'/webhooks/',
|
|
48
|
+
// Messaging channels have their own auth (bot tokens, signatures)
|
|
49
|
+
'/api/telegram/',
|
|
50
|
+
'/api/whatsapp/',
|
|
51
|
+
'/api/discord/',
|
|
52
|
+
];
|
|
53
|
+
function isPublicRoute(path) {
|
|
54
|
+
// Exact matches
|
|
55
|
+
if (PUBLIC_ROUTES.includes(path))
|
|
56
|
+
return true;
|
|
57
|
+
// Prefix matches
|
|
58
|
+
for (const prefix of PUBLIC_PREFIXES) {
|
|
59
|
+
if (path.startsWith(prefix))
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Unified auth middleware for all API routes.
|
|
66
|
+
*
|
|
67
|
+
* Checks authentication via:
|
|
68
|
+
* 1. Cookie-based session (profclaw_session)
|
|
69
|
+
* 2. API token (Authorization: Bearer profclaw_...)
|
|
70
|
+
*
|
|
71
|
+
* Sets `user` and optionally `apiToken` in the context.
|
|
72
|
+
*/
|
|
73
|
+
export function authMiddleware() {
|
|
74
|
+
return async (c, next) => {
|
|
75
|
+
const path = c.req.path;
|
|
76
|
+
// Skip auth for public routes
|
|
77
|
+
if (isPublicRoute(path)) {
|
|
78
|
+
return next();
|
|
79
|
+
}
|
|
80
|
+
// Skip non-API routes (static assets, root info, etc.)
|
|
81
|
+
if (!path.startsWith('/api/') && !path.startsWith('/api')) {
|
|
82
|
+
return next();
|
|
83
|
+
}
|
|
84
|
+
// Local-mode bypass: auto-inject admin user when authMode is 'local'
|
|
85
|
+
// Skip auto-inject if an access key is set (require session cookie instead)
|
|
86
|
+
try {
|
|
87
|
+
const settings = await getSettingsRaw();
|
|
88
|
+
if (settings.system.authMode === 'local' && !settings.system.accessKeyHash) {
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
if (!cachedLocalAdmin || now > cachedLocalAdminExpiry) {
|
|
91
|
+
const db = getDb();
|
|
92
|
+
if (db) {
|
|
93
|
+
const admins = await db
|
|
94
|
+
.select()
|
|
95
|
+
.from(users)
|
|
96
|
+
.where(eq(users.role, 'admin'))
|
|
97
|
+
.limit(1);
|
|
98
|
+
if (admins.length > 0) {
|
|
99
|
+
const admin = admins[0];
|
|
100
|
+
cachedLocalAdmin = {
|
|
101
|
+
id: admin.id,
|
|
102
|
+
email: admin.email,
|
|
103
|
+
name: admin.name ?? 'Owner',
|
|
104
|
+
role: admin.role,
|
|
105
|
+
status: admin.status,
|
|
106
|
+
createdAt: admin.createdAt ?? new Date(),
|
|
107
|
+
onboardingCompleted: admin.onboardingCompleted ?? true,
|
|
108
|
+
};
|
|
109
|
+
cachedLocalAdminExpiry = now + LOCAL_ADMIN_CACHE_TTL;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (cachedLocalAdmin) {
|
|
114
|
+
c.set('user', cachedLocalAdmin);
|
|
115
|
+
return next();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Fall through to normal auth if settings read fails
|
|
121
|
+
}
|
|
122
|
+
// Try cookie-based session first
|
|
123
|
+
const sessionToken = getCookie(c, 'profclaw_session');
|
|
124
|
+
if (sessionToken) {
|
|
125
|
+
const user = await validateSession(sessionToken);
|
|
126
|
+
if (user) {
|
|
127
|
+
c.set('user', user);
|
|
128
|
+
return next();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Try API token authentication
|
|
132
|
+
const authHeader = c.req.header('Authorization');
|
|
133
|
+
if (authHeader?.startsWith('Bearer profclaw_')) {
|
|
134
|
+
const token = authHeader.slice(7);
|
|
135
|
+
const result = await validateToken(token);
|
|
136
|
+
if (result.valid && result.token) {
|
|
137
|
+
c.set('apiToken', result.token);
|
|
138
|
+
// API token requests don't have a user context by default
|
|
139
|
+
// but they are authenticated
|
|
140
|
+
c.set('authType', 'api_token');
|
|
141
|
+
return next();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Also allow Bearer with non-profclaw tokens to pass through
|
|
145
|
+
// for device/CLI auth that may use different token formats
|
|
146
|
+
if (authHeader?.startsWith('Bearer ') && !authHeader.startsWith('Bearer profclaw_')) {
|
|
147
|
+
// Let the specific route handler validate this token type
|
|
148
|
+
return next();
|
|
149
|
+
}
|
|
150
|
+
// No valid authentication found
|
|
151
|
+
return c.json({ error: 'Authentication required' }, 401);
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Scope-checking middleware for API token routes.
|
|
156
|
+
* Use after authMiddleware to require specific scopes.
|
|
157
|
+
*/
|
|
158
|
+
export function requireScope(...scopes) {
|
|
159
|
+
return async (c, next) => {
|
|
160
|
+
const apiToken = c.get('apiToken');
|
|
161
|
+
if (!apiToken) {
|
|
162
|
+
// Session-based users have full access
|
|
163
|
+
if (c.get('user'))
|
|
164
|
+
return next();
|
|
165
|
+
return c.json({ error: 'Authentication required' }, 401);
|
|
166
|
+
}
|
|
167
|
+
for (const scope of scopes) {
|
|
168
|
+
if (!hasScope(apiToken, scope)) {
|
|
169
|
+
return c.json({ error: `Missing required scope: ${scope}` }, 403);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return next();
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Helper to get the authenticated user from context.
|
|
177
|
+
* Returns null if not authenticated via session.
|
|
178
|
+
*/
|
|
179
|
+
export function getAuthUser(c) {
|
|
180
|
+
return c.get('user') || null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Invalidate cached local admin user.
|
|
184
|
+
* Call when authMode changes or admin user is updated.
|
|
185
|
+
*/
|
|
186
|
+
export function invalidateLocalAdminCache() {
|
|
187
|
+
cachedLocalAdmin = null;
|
|
188
|
+
cachedLocalAdminExpiry = 0;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-Friendly Pairing Codes
|
|
3
|
+
*
|
|
4
|
+
* Provides secure, easy-to-type pairing codes for device authorization.
|
|
5
|
+
* Adapted from OpenClaw reference implementation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - 8-character codes without ambiguous characters (no 0/O, 1/I)
|
|
9
|
+
* - Time-limited pending requests (1 hour TTL)
|
|
10
|
+
* - Database-backed persistence
|
|
11
|
+
* - Rate limiting on code generation
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Pairing request record
|
|
15
|
+
*/
|
|
16
|
+
export interface PairingRequest {
|
|
17
|
+
id: string;
|
|
18
|
+
code: string;
|
|
19
|
+
/** User or device identifier requesting pairing */
|
|
20
|
+
requesterId: string;
|
|
21
|
+
/** Optional metadata about the requester */
|
|
22
|
+
meta?: Record<string, string>;
|
|
23
|
+
/** Expiration timestamp */
|
|
24
|
+
expiresAt: Date;
|
|
25
|
+
/** Status: pending, approved, rejected, expired */
|
|
26
|
+
status: 'pending' | 'approved' | 'rejected' | 'expired';
|
|
27
|
+
/** Who approved/rejected */
|
|
28
|
+
resolvedBy?: string;
|
|
29
|
+
/** Resolution timestamp */
|
|
30
|
+
resolvedAt?: Date;
|
|
31
|
+
/** Token issued on approval */
|
|
32
|
+
token?: string;
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
lastSeenAt: Date;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize pairing codes table
|
|
38
|
+
*/
|
|
39
|
+
export declare function initPairingCodesTable(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Request a new pairing code
|
|
42
|
+
*/
|
|
43
|
+
export declare function requestPairingCode(params: {
|
|
44
|
+
requesterId: string;
|
|
45
|
+
meta?: Record<string, string>;
|
|
46
|
+
}): Promise<{
|
|
47
|
+
code: string;
|
|
48
|
+
expiresAt: Date;
|
|
49
|
+
created: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Approve a pairing code
|
|
53
|
+
*/
|
|
54
|
+
export declare function approvePairingCode(params: {
|
|
55
|
+
code: string;
|
|
56
|
+
approvedBy: string;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
request: PairingRequest;
|
|
59
|
+
token: string;
|
|
60
|
+
} | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Reject a pairing code
|
|
63
|
+
*/
|
|
64
|
+
export declare function rejectPairingCode(params: {
|
|
65
|
+
code: string;
|
|
66
|
+
rejectedBy: string;
|
|
67
|
+
reason?: string;
|
|
68
|
+
}): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Check pairing code status
|
|
71
|
+
*/
|
|
72
|
+
export declare function checkPairingStatus(code: string): Promise<{
|
|
73
|
+
status: 'pending' | 'approved' | 'rejected' | 'expired' | 'not_found';
|
|
74
|
+
token?: string;
|
|
75
|
+
expiresAt?: Date;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* List pending pairing requests (for admin UI)
|
|
79
|
+
*/
|
|
80
|
+
export declare function listPendingPairingRequests(): Promise<Array<{
|
|
81
|
+
id: string;
|
|
82
|
+
code: string;
|
|
83
|
+
requesterId: string;
|
|
84
|
+
meta?: Record<string, string>;
|
|
85
|
+
expiresAt: Date;
|
|
86
|
+
createdAt: Date;
|
|
87
|
+
lastSeenAt: Date;
|
|
88
|
+
}>>;
|
|
89
|
+
/**
|
|
90
|
+
* Clean up expired pairing requests
|
|
91
|
+
*/
|
|
92
|
+
export declare function cleanupExpiredPairingRequests(): Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* Validate a pairing token
|
|
95
|
+
*/
|
|
96
|
+
export declare function validatePairingToken(token: string): Promise<{
|
|
97
|
+
valid: boolean;
|
|
98
|
+
requesterId?: string;
|
|
99
|
+
meta?: Record<string, string>;
|
|
100
|
+
}>;
|
|
101
|
+
/**
|
|
102
|
+
* Format a pairing code for display (with spaces for readability)
|
|
103
|
+
*/
|
|
104
|
+
export declare function formatPairingCode(code: string): string;
|
|
105
|
+
/**
|
|
106
|
+
* Parse a pairing code from user input (removes spaces, dashes, converts to uppercase)
|
|
107
|
+
*/
|
|
108
|
+
export declare function parsePairingCode(input: string): string;
|
|
109
|
+
//# sourceMappingURL=pairing-codes.d.ts.map
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-Friendly Pairing Codes
|
|
3
|
+
*
|
|
4
|
+
* Provides secure, easy-to-type pairing codes for device authorization.
|
|
5
|
+
* Adapted from OpenClaw reference implementation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - 8-character codes without ambiguous characters (no 0/O, 1/I)
|
|
9
|
+
* - Time-limited pending requests (1 hour TTL)
|
|
10
|
+
* - Database-backed persistence
|
|
11
|
+
* - Rate limiting on code generation
|
|
12
|
+
*/
|
|
13
|
+
import { randomBytes, randomUUID } from 'crypto';
|
|
14
|
+
import { getStorage } from '../storage/index.js';
|
|
15
|
+
// Code generation alphabet (no ambiguous chars: 0O1I)
|
|
16
|
+
const PAIRING_CODE_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
|
17
|
+
const PAIRING_CODE_LENGTH = 8;
|
|
18
|
+
// Limits
|
|
19
|
+
const PAIRING_PENDING_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
20
|
+
const PAIRING_PENDING_MAX = 5; // Max concurrent pending requests per user
|
|
21
|
+
/**
|
|
22
|
+
* Initialize pairing codes table
|
|
23
|
+
*/
|
|
24
|
+
export async function initPairingCodesTable() {
|
|
25
|
+
const storage = getStorage();
|
|
26
|
+
await storage.execute(`
|
|
27
|
+
CREATE TABLE IF NOT EXISTS pairing_requests (
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
code TEXT NOT NULL UNIQUE,
|
|
30
|
+
requester_id TEXT NOT NULL,
|
|
31
|
+
meta TEXT,
|
|
32
|
+
expires_at INTEGER NOT NULL,
|
|
33
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
34
|
+
resolved_by TEXT,
|
|
35
|
+
resolved_at INTEGER,
|
|
36
|
+
token TEXT,
|
|
37
|
+
created_at INTEGER NOT NULL,
|
|
38
|
+
last_seen_at INTEGER NOT NULL
|
|
39
|
+
)
|
|
40
|
+
`);
|
|
41
|
+
// Index for fast code lookup
|
|
42
|
+
await storage.execute(`
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_pairing_code ON pairing_requests(code)
|
|
44
|
+
`);
|
|
45
|
+
// Index for requester lookup
|
|
46
|
+
await storage.execute(`
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_pairing_requester ON pairing_requests(requester_id)
|
|
48
|
+
`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate a random pairing code
|
|
52
|
+
*/
|
|
53
|
+
function generatePairingCode() {
|
|
54
|
+
const bytes = randomBytes(PAIRING_CODE_LENGTH);
|
|
55
|
+
let code = '';
|
|
56
|
+
for (let i = 0; i < PAIRING_CODE_LENGTH; i++) {
|
|
57
|
+
code += PAIRING_CODE_ALPHABET[bytes[i] % PAIRING_CODE_ALPHABET.length];
|
|
58
|
+
}
|
|
59
|
+
return code;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generate a secure token for approved devices
|
|
63
|
+
*/
|
|
64
|
+
function generateToken() {
|
|
65
|
+
return `profclaw_pair_${randomBytes(32).toString('base64url')}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Request a new pairing code
|
|
69
|
+
*/
|
|
70
|
+
export async function requestPairingCode(params) {
|
|
71
|
+
const storage = getStorage();
|
|
72
|
+
// Check for existing pending request
|
|
73
|
+
const existingRows = await storage.query(`SELECT id, code, expires_at FROM pairing_requests
|
|
74
|
+
WHERE requester_id = ? AND status = 'pending' AND expires_at > ?`, [params.requesterId, Math.floor(Date.now() / 1000)]);
|
|
75
|
+
// Return existing code if still valid
|
|
76
|
+
if (existingRows.length > 0) {
|
|
77
|
+
const existing = existingRows[0];
|
|
78
|
+
// Update last seen
|
|
79
|
+
await storage.execute(`UPDATE pairing_requests SET last_seen_at = ? WHERE id = ?`, [Math.floor(Date.now() / 1000), existing.id]);
|
|
80
|
+
return {
|
|
81
|
+
code: existing.code,
|
|
82
|
+
expiresAt: new Date(existing.expires_at * 1000),
|
|
83
|
+
created: false,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Check rate limit (max pending requests)
|
|
87
|
+
const pendingCountRows = await storage.query(`SELECT COUNT(*) as count FROM pairing_requests
|
|
88
|
+
WHERE requester_id = ? AND status = 'pending' AND expires_at > ?`, [params.requesterId, Math.floor(Date.now() / 1000)]);
|
|
89
|
+
if (pendingCountRows[0].count >= PAIRING_PENDING_MAX) {
|
|
90
|
+
throw new Error(`Maximum pending pairing requests reached (${PAIRING_PENDING_MAX})`);
|
|
91
|
+
}
|
|
92
|
+
// Generate new code (retry if collision)
|
|
93
|
+
let code = generatePairingCode();
|
|
94
|
+
let attempts = 0;
|
|
95
|
+
const maxAttempts = 10;
|
|
96
|
+
while (attempts < maxAttempts) {
|
|
97
|
+
const collision = await storage.query(`SELECT id FROM pairing_requests WHERE code = ?`, [code]);
|
|
98
|
+
if (collision.length === 0)
|
|
99
|
+
break;
|
|
100
|
+
code = generatePairingCode();
|
|
101
|
+
attempts++;
|
|
102
|
+
}
|
|
103
|
+
if (attempts >= maxAttempts) {
|
|
104
|
+
throw new Error('Failed to generate unique pairing code');
|
|
105
|
+
}
|
|
106
|
+
// Create new pairing request
|
|
107
|
+
const id = randomUUID();
|
|
108
|
+
const now = Math.floor(Date.now() / 1000);
|
|
109
|
+
const expiresAt = Math.floor((Date.now() + PAIRING_PENDING_TTL_MS) / 1000);
|
|
110
|
+
await storage.execute(`INSERT INTO pairing_requests (id, code, requester_id, meta, expires_at, status, created_at, last_seen_at)
|
|
111
|
+
VALUES (?, ?, ?, ?, ?, 'pending', ?, ?)`, [
|
|
112
|
+
id,
|
|
113
|
+
code,
|
|
114
|
+
params.requesterId,
|
|
115
|
+
params.meta ? JSON.stringify(params.meta) : null,
|
|
116
|
+
expiresAt,
|
|
117
|
+
now,
|
|
118
|
+
now,
|
|
119
|
+
]);
|
|
120
|
+
console.log(`[Pairing] Created code ${code} for requester ${params.requesterId}`);
|
|
121
|
+
return {
|
|
122
|
+
code,
|
|
123
|
+
expiresAt: new Date(expiresAt * 1000),
|
|
124
|
+
created: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Approve a pairing code
|
|
129
|
+
*/
|
|
130
|
+
export async function approvePairingCode(params) {
|
|
131
|
+
const storage = getStorage();
|
|
132
|
+
// Find pending request by code
|
|
133
|
+
const rows = await storage.query(`SELECT * FROM pairing_requests
|
|
134
|
+
WHERE code = ? AND status = 'pending' AND expires_at > ?`, [params.code.toUpperCase(), Math.floor(Date.now() / 1000)]);
|
|
135
|
+
if (rows.length === 0) {
|
|
136
|
+
console.log(`[Pairing] Code ${params.code} not found or expired`);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const row = rows[0];
|
|
140
|
+
const token = generateToken();
|
|
141
|
+
const now = Math.floor(Date.now() / 1000);
|
|
142
|
+
// Update to approved
|
|
143
|
+
await storage.execute(`UPDATE pairing_requests
|
|
144
|
+
SET status = 'approved', resolved_by = ?, resolved_at = ?, token = ?
|
|
145
|
+
WHERE id = ?`, [params.approvedBy, now, token, row.id]);
|
|
146
|
+
console.log(`[Pairing] Code ${params.code} approved by ${params.approvedBy}`);
|
|
147
|
+
return {
|
|
148
|
+
request: {
|
|
149
|
+
id: row.id,
|
|
150
|
+
code: row.code,
|
|
151
|
+
requesterId: row.requester_id,
|
|
152
|
+
meta: row.meta ? JSON.parse(row.meta) : undefined,
|
|
153
|
+
expiresAt: new Date(row.expires_at * 1000),
|
|
154
|
+
status: 'approved',
|
|
155
|
+
resolvedBy: params.approvedBy,
|
|
156
|
+
resolvedAt: new Date(now * 1000),
|
|
157
|
+
token,
|
|
158
|
+
createdAt: new Date(row.created_at * 1000),
|
|
159
|
+
lastSeenAt: new Date(row.last_seen_at * 1000),
|
|
160
|
+
},
|
|
161
|
+
token,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reject a pairing code
|
|
166
|
+
*/
|
|
167
|
+
export async function rejectPairingCode(params) {
|
|
168
|
+
const storage = getStorage();
|
|
169
|
+
const now = Math.floor(Date.now() / 1000);
|
|
170
|
+
// Check if code exists and is pending first
|
|
171
|
+
const existing = await storage.query(`SELECT id FROM pairing_requests WHERE code = ? AND status = 'pending'`, [params.code.toUpperCase()]);
|
|
172
|
+
if (existing.length === 0) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
await storage.execute(`UPDATE pairing_requests
|
|
176
|
+
SET status = 'rejected', resolved_by = ?, resolved_at = ?
|
|
177
|
+
WHERE code = ? AND status = 'pending'`, [params.rejectedBy, now, params.code.toUpperCase()]);
|
|
178
|
+
console.log(`[Pairing] Code ${params.code} rejected by ${params.rejectedBy}`);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Check pairing code status
|
|
183
|
+
*/
|
|
184
|
+
export async function checkPairingStatus(code) {
|
|
185
|
+
const storage = getStorage();
|
|
186
|
+
const rows = await storage.query(`SELECT status, token, expires_at FROM pairing_requests WHERE code = ?`, [
|
|
187
|
+
code.toUpperCase(),
|
|
188
|
+
]);
|
|
189
|
+
if (rows.length === 0) {
|
|
190
|
+
return { status: 'not_found' };
|
|
191
|
+
}
|
|
192
|
+
const row = rows[0];
|
|
193
|
+
const expiresAt = new Date(row.expires_at * 1000);
|
|
194
|
+
// Check if expired
|
|
195
|
+
if (row.status === 'pending' && expiresAt < new Date()) {
|
|
196
|
+
// Mark as expired
|
|
197
|
+
await storage.execute(`UPDATE pairing_requests SET status = 'expired' WHERE code = ?`, [code.toUpperCase()]);
|
|
198
|
+
return { status: 'expired', expiresAt };
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
status: row.status,
|
|
202
|
+
token: row.token || undefined,
|
|
203
|
+
expiresAt,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* List pending pairing requests (for admin UI)
|
|
208
|
+
*/
|
|
209
|
+
export async function listPendingPairingRequests() {
|
|
210
|
+
const storage = getStorage();
|
|
211
|
+
const rows = await storage.query(`SELECT id, code, requester_id, meta, expires_at, created_at, last_seen_at
|
|
212
|
+
FROM pairing_requests
|
|
213
|
+
WHERE status = 'pending' AND expires_at > ?
|
|
214
|
+
ORDER BY created_at DESC`, [Math.floor(Date.now() / 1000)]);
|
|
215
|
+
return rows.map((row) => ({
|
|
216
|
+
id: row.id,
|
|
217
|
+
code: row.code,
|
|
218
|
+
requesterId: row.requester_id,
|
|
219
|
+
meta: row.meta ? JSON.parse(row.meta) : undefined,
|
|
220
|
+
expiresAt: new Date(row.expires_at * 1000),
|
|
221
|
+
createdAt: new Date(row.created_at * 1000),
|
|
222
|
+
lastSeenAt: new Date(row.last_seen_at * 1000),
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Clean up expired pairing requests
|
|
227
|
+
*/
|
|
228
|
+
export async function cleanupExpiredPairingRequests() {
|
|
229
|
+
const storage = getStorage();
|
|
230
|
+
const now = Math.floor(Date.now() / 1000);
|
|
231
|
+
// Count old requests before delete
|
|
232
|
+
const sevenDaysAgo = now - 7 * 24 * 60 * 60;
|
|
233
|
+
const countResult = await storage.query(`SELECT COUNT(*) as count FROM pairing_requests WHERE created_at < ? AND status IN ('expired', 'rejected')`, [sevenDaysAgo]);
|
|
234
|
+
const toDelete = countResult[0]?.count || 0;
|
|
235
|
+
// Mark expired requests
|
|
236
|
+
await storage.execute(`UPDATE pairing_requests SET status = 'expired' WHERE status = 'pending' AND expires_at < ?`, [now]);
|
|
237
|
+
// Delete old requests (older than 7 days)
|
|
238
|
+
await storage.execute(`DELETE FROM pairing_requests WHERE created_at < ? AND status IN ('expired', 'rejected')`, [sevenDaysAgo]);
|
|
239
|
+
return toDelete;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Validate a pairing token
|
|
243
|
+
*/
|
|
244
|
+
export async function validatePairingToken(token) {
|
|
245
|
+
const storage = getStorage();
|
|
246
|
+
const rows = await storage.query(`SELECT requester_id, meta FROM pairing_requests WHERE token = ? AND status = 'approved'`, [
|
|
247
|
+
token,
|
|
248
|
+
]);
|
|
249
|
+
if (rows.length === 0) {
|
|
250
|
+
return { valid: false };
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
valid: true,
|
|
254
|
+
requesterId: rows[0].requester_id,
|
|
255
|
+
meta: rows[0].meta ? JSON.parse(rows[0].meta) : undefined,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Format a pairing code for display (with spaces for readability)
|
|
260
|
+
*/
|
|
261
|
+
export function formatPairingCode(code) {
|
|
262
|
+
if (code.length !== PAIRING_CODE_LENGTH) {
|
|
263
|
+
return code;
|
|
264
|
+
}
|
|
265
|
+
// Split into two groups of 4: ABCD-EFGH
|
|
266
|
+
return `${code.slice(0, 4)}-${code.slice(4)}`;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Parse a pairing code from user input (removes spaces, dashes, converts to uppercase)
|
|
270
|
+
*/
|
|
271
|
+
export function parsePairingCode(input) {
|
|
272
|
+
return input.replace(/[\s-]/g, '').toUpperCase();
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=pairing-codes.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password Hashing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Uses Node.js built-in scrypt for secure password hashing.
|
|
5
|
+
* Supports transparent upgrade from legacy SHA256 hashes.
|
|
6
|
+
*
|
|
7
|
+
* Recovery codes use deterministic SHA256 (acceptable since codes are random, high-entropy).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Hash a password using scrypt.
|
|
11
|
+
* Returns format: scrypt:<salt>:<hash>
|
|
12
|
+
*/
|
|
13
|
+
export declare function hashPassword(password: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Verify a password against a stored hash.
|
|
16
|
+
* Supports both scrypt and legacy SHA256 formats.
|
|
17
|
+
*
|
|
18
|
+
* @returns { valid, needsUpgrade } - needsUpgrade is true when using legacy SHA256
|
|
19
|
+
*/
|
|
20
|
+
export declare function verifyPassword(password: string, storedHash: string): {
|
|
21
|
+
valid: boolean;
|
|
22
|
+
needsUpgrade: boolean;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Validate password strength.
|
|
26
|
+
* Requires: 8+ chars, at least 1 letter, at least 1 number.
|
|
27
|
+
* Returns null if valid, or an error message string.
|
|
28
|
+
*/
|
|
29
|
+
export declare function validatePasswordStrength(password: string): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Deterministic hash for recovery codes.
|
|
32
|
+
* SHA256 is acceptable here since recovery codes are random, high-entropy strings.
|
|
33
|
+
*/
|
|
34
|
+
export declare function hashRecoveryCode(code: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Generate recovery codes (XXXX-XXXX format).
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateRecoveryCodes(count?: number): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Hash an array of recovery codes.
|
|
41
|
+
*/
|
|
42
|
+
export declare function hashRecoveryCodes(codes: string[]): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Generate a human-friendly invite code.
|
|
45
|
+
* Format: PC-XXXX-XXXX-XXXX (12 hex chars)
|
|
46
|
+
*/
|
|
47
|
+
export declare function generateInviteCode(): string;
|
|
48
|
+
/**
|
|
49
|
+
* Hash an invite code for secure storage.
|
|
50
|
+
* Normalizes by removing dashes and uppercasing before hashing.
|
|
51
|
+
*/
|
|
52
|
+
export declare function hashInviteCode(code: string): string;
|
|
53
|
+
//# sourceMappingURL=password.d.ts.map
|