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,636 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Setup Wizard
|
|
3
|
+
*
|
|
4
|
+
* Interactive first-time setup for profClaw.
|
|
5
|
+
* Configures AI provider, admin account, registration mode, and GitHub OAuth.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* profclaw setup # Interactive wizard
|
|
9
|
+
* profclaw setup --non-interactive # CI/Docker automation
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import figlet from 'figlet';
|
|
14
|
+
import { createInterface } from 'readline/promises';
|
|
15
|
+
import { randomUUID } from 'crypto';
|
|
16
|
+
import { eq } from 'drizzle-orm';
|
|
17
|
+
import { initStorage, getDb, saveProviderConfig } from '../../storage/index.js';
|
|
18
|
+
import { users, inviteCodes } from '../../storage/schema.js';
|
|
19
|
+
import { hashPassword, validatePasswordStrength, generateRecoveryCodes, hashRecoveryCodes, generateInviteCode, hashInviteCode, } from '../../auth/password.js';
|
|
20
|
+
import { updateSettings } from '../../settings/index.js';
|
|
21
|
+
import { success, error, info, warn, spinner } from '../utils/output.js';
|
|
22
|
+
// Helpers
|
|
23
|
+
function showBanner() {
|
|
24
|
+
const banner = figlet.textSync('profClaw', {
|
|
25
|
+
font: 'Standard',
|
|
26
|
+
horizontalLayout: 'default',
|
|
27
|
+
});
|
|
28
|
+
console.log(chalk.cyan(banner));
|
|
29
|
+
console.log(chalk.dim(' Setup Wizard\n'));
|
|
30
|
+
}
|
|
31
|
+
async function prompt(rl, question) {
|
|
32
|
+
const answer = await rl.question(chalk.bold(question));
|
|
33
|
+
return answer.trim();
|
|
34
|
+
}
|
|
35
|
+
async function promptPassword(rl, question) {
|
|
36
|
+
// readline/promises doesn't natively hide input, but for a CLI wizard this is acceptable
|
|
37
|
+
const answer = await rl.question(chalk.bold(question));
|
|
38
|
+
return answer.trim();
|
|
39
|
+
}
|
|
40
|
+
async function promptChoice(rl, question, options) {
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log(chalk.bold(question));
|
|
43
|
+
for (const opt of options) {
|
|
44
|
+
console.log(` ${chalk.cyan(opt.key)}) ${opt.label}`);
|
|
45
|
+
}
|
|
46
|
+
const validKeys = options.map((o) => o.key);
|
|
47
|
+
while (true) {
|
|
48
|
+
const answer = await prompt(rl, `Choice [${validKeys.join('/')}]: `);
|
|
49
|
+
if (validKeys.includes(answer))
|
|
50
|
+
return answer;
|
|
51
|
+
console.log(chalk.red(` Invalid choice. Options: ${validKeys.join(', ')}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function promptYesNo(rl, question, defaultYes = false) {
|
|
55
|
+
const hint = defaultYes ? 'Y/n' : 'y/N';
|
|
56
|
+
const answer = await prompt(rl, `${question} [${hint}]: `);
|
|
57
|
+
if (!answer)
|
|
58
|
+
return defaultYes;
|
|
59
|
+
return answer.toLowerCase().startsWith('y');
|
|
60
|
+
}
|
|
61
|
+
async function checkRedis() {
|
|
62
|
+
try {
|
|
63
|
+
const IORedis = (await import('ioredis')).default;
|
|
64
|
+
const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
|
|
65
|
+
const redis = new IORedis(redisUrl, {
|
|
66
|
+
maxRetriesPerRequest: 1,
|
|
67
|
+
connectTimeout: 3000,
|
|
68
|
+
lazyConnect: true,
|
|
69
|
+
});
|
|
70
|
+
await redis.connect();
|
|
71
|
+
await redis.ping();
|
|
72
|
+
await redis.disconnect();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function checkOllama(baseUrl) {
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(`${baseUrl}/api/tags`, { signal: AbortSignal.timeout(3000) });
|
|
82
|
+
return response.ok;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getExistingAdmins(db) {
|
|
89
|
+
if (!db)
|
|
90
|
+
return [];
|
|
91
|
+
const admins = await db
|
|
92
|
+
.select({ id: users.id, email: users.email, name: users.name })
|
|
93
|
+
.from(users)
|
|
94
|
+
.where(eq(users.role, 'admin'));
|
|
95
|
+
return admins;
|
|
96
|
+
}
|
|
97
|
+
async function checkAdminExists(db) {
|
|
98
|
+
const admins = await getExistingAdmins(db);
|
|
99
|
+
return admins.length > 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if the profClaw server is running locally (for API-based admin creation).
|
|
103
|
+
* When the CLI runs inside Docker alongside the server, using the API ensures
|
|
104
|
+
* both processes see the same DB state (avoids LibSQL cross-process issues).
|
|
105
|
+
*/
|
|
106
|
+
async function getServerBaseUrl() {
|
|
107
|
+
const port = process.env.PORT || '3000';
|
|
108
|
+
const url = `http://localhost:${port}/health`;
|
|
109
|
+
try {
|
|
110
|
+
const res = await fetch(url, { signal: AbortSignal.timeout(2000) });
|
|
111
|
+
if (res.ok)
|
|
112
|
+
return `http://localhost:${port}`;
|
|
113
|
+
}
|
|
114
|
+
catch { /* server not running */ }
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create or update admin via server API (preferred when server is running).
|
|
119
|
+
* Returns recovery codes on success, null if API unavailable.
|
|
120
|
+
*/
|
|
121
|
+
async function createAdminViaApi(baseUrl, email, password, name) {
|
|
122
|
+
try {
|
|
123
|
+
const res = await fetch(`${baseUrl}/api/setup/admin`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: { 'Content-Type': 'application/json' },
|
|
126
|
+
body: JSON.stringify({ email, password, name }),
|
|
127
|
+
signal: AbortSignal.timeout(10000),
|
|
128
|
+
});
|
|
129
|
+
const data = await res.json();
|
|
130
|
+
if (data.success && data.recoveryCodes) {
|
|
131
|
+
return {
|
|
132
|
+
email: data.user?.email || email,
|
|
133
|
+
recoveryCodes: data.recoveryCodes,
|
|
134
|
+
isNew: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (data.error === 'Email already registered') {
|
|
138
|
+
// Email exists — try password reset via direct DB (API doesn't expose this)
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
// Other API error — fall back to direct DB
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function hasEnvKey(key) {
|
|
149
|
+
const val = process.env[key];
|
|
150
|
+
return !!val && val !== '' && !val.startsWith('sk-ant-xxxx') && !val.startsWith('sk-xxxx');
|
|
151
|
+
}
|
|
152
|
+
// Step 1: System Check
|
|
153
|
+
async function stepSystemCheck(db) {
|
|
154
|
+
console.log(chalk.bold.white('\n Step 1: System Check\n'));
|
|
155
|
+
const spin = spinner('Checking system...');
|
|
156
|
+
spin.start();
|
|
157
|
+
const redisOk = await checkRedis();
|
|
158
|
+
const hasAdmin = await checkAdminExists(db);
|
|
159
|
+
const hasAnthropicKey = hasEnvKey('ANTHROPIC_API_KEY');
|
|
160
|
+
const hasOpenAIKey = hasEnvKey('OPENAI_API_KEY');
|
|
161
|
+
spin.stop();
|
|
162
|
+
const mark = (ok) => (ok ? chalk.green(' ✓') : chalk.red(' ✗'));
|
|
163
|
+
console.log(`${mark(redisOk)} Redis: ${redisOk ? 'connected' : 'not reachable'}`);
|
|
164
|
+
console.log(`${mark(hasAdmin)} Admin account: ${hasAdmin ? 'exists' : 'not created'}`);
|
|
165
|
+
console.log(`${mark(hasAnthropicKey || hasOpenAIKey)} AI provider: ${hasAnthropicKey ? 'Anthropic key found' :
|
|
166
|
+
hasOpenAIKey ? 'OpenAI key found' :
|
|
167
|
+
'not configured'}`);
|
|
168
|
+
if (!redisOk) {
|
|
169
|
+
warn('Redis is required for task processing.');
|
|
170
|
+
info('Start Redis: docker compose up redis -d');
|
|
171
|
+
}
|
|
172
|
+
return { redisOk, hasAdmin, hasAnthropicKey, hasOpenAIKey };
|
|
173
|
+
}
|
|
174
|
+
// Step 2: AI Provider
|
|
175
|
+
async function stepAiProvider(rl, status) {
|
|
176
|
+
if (status.hasAnthropicKey || status.hasOpenAIKey) {
|
|
177
|
+
const provider = status.hasAnthropicKey ? 'Anthropic' : 'OpenAI';
|
|
178
|
+
info(`AI provider already configured (${provider} from env).`);
|
|
179
|
+
const reconfigure = await promptYesNo(rl, ' Reconfigure AI provider?', false);
|
|
180
|
+
if (!reconfigure)
|
|
181
|
+
return 'skip';
|
|
182
|
+
}
|
|
183
|
+
const choice = await promptChoice(rl, ' Select AI Provider:', [
|
|
184
|
+
{ key: '1', label: 'Anthropic API Key (recommended)' },
|
|
185
|
+
{ key: '2', label: 'OpenAI API Key' },
|
|
186
|
+
{ key: '3', label: 'Ollama (free, local AI)' },
|
|
187
|
+
{ key: '4', label: 'Skip for now' },
|
|
188
|
+
]);
|
|
189
|
+
if (choice === '4') {
|
|
190
|
+
info('AI provider skipped. You can configure it later in Settings.');
|
|
191
|
+
return 'skip';
|
|
192
|
+
}
|
|
193
|
+
if (choice === '1') {
|
|
194
|
+
const apiKey = await prompt(rl, ' Anthropic API Key: ');
|
|
195
|
+
if (!apiKey) {
|
|
196
|
+
warn('No key provided, skipping.');
|
|
197
|
+
return 'skip';
|
|
198
|
+
}
|
|
199
|
+
await saveProviderConfig({ type: 'anthropic', apiKey, enabled: true });
|
|
200
|
+
success('Anthropic provider configured.');
|
|
201
|
+
return 'anthropic';
|
|
202
|
+
}
|
|
203
|
+
if (choice === '2') {
|
|
204
|
+
const apiKey = await prompt(rl, ' OpenAI API Key: ');
|
|
205
|
+
if (!apiKey) {
|
|
206
|
+
warn('No key provided, skipping.');
|
|
207
|
+
return 'skip';
|
|
208
|
+
}
|
|
209
|
+
await saveProviderConfig({ type: 'openai', apiKey, enabled: true });
|
|
210
|
+
success('OpenAI provider configured.');
|
|
211
|
+
return 'openai';
|
|
212
|
+
}
|
|
213
|
+
// Ollama
|
|
214
|
+
const ollamaUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434';
|
|
215
|
+
const spin = spinner(`Checking Ollama at ${ollamaUrl}...`);
|
|
216
|
+
spin.start();
|
|
217
|
+
const ollamaOk = await checkOllama(ollamaUrl);
|
|
218
|
+
spin.stop();
|
|
219
|
+
if (ollamaOk) {
|
|
220
|
+
success(`Ollama reachable at ${ollamaUrl}`);
|
|
221
|
+
await saveProviderConfig({ type: 'ollama', apiKey: ollamaUrl, enabled: true });
|
|
222
|
+
await updateSettings({
|
|
223
|
+
integrations: { ollamaEndpoint: ollamaUrl },
|
|
224
|
+
plugins: { ollama: { enabled: true, autoStart: false } },
|
|
225
|
+
});
|
|
226
|
+
success('Ollama provider configured.');
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
warn(`Ollama not reachable at ${ollamaUrl}`);
|
|
230
|
+
info('Start Ollama: docker compose --profile ai up -d');
|
|
231
|
+
info('Then re-run: profclaw setup');
|
|
232
|
+
await saveProviderConfig({ type: 'ollama', apiKey: ollamaUrl, enabled: true });
|
|
233
|
+
}
|
|
234
|
+
return 'ollama';
|
|
235
|
+
}
|
|
236
|
+
// Step 3: Admin Account
|
|
237
|
+
async function createAdminUser(db, name, email, password) {
|
|
238
|
+
const passwordHash = hashPassword(password);
|
|
239
|
+
const recoveryCodes = generateRecoveryCodes(8);
|
|
240
|
+
const hashedCodes = hashRecoveryCodes(recoveryCodes);
|
|
241
|
+
await db.insert(users).values({
|
|
242
|
+
id: randomUUID(),
|
|
243
|
+
email: email.toLowerCase(),
|
|
244
|
+
name,
|
|
245
|
+
passwordHash,
|
|
246
|
+
role: 'admin',
|
|
247
|
+
status: 'active',
|
|
248
|
+
recoveryCodes: JSON.stringify(hashedCodes),
|
|
249
|
+
createdAt: new Date(),
|
|
250
|
+
updatedAt: new Date(),
|
|
251
|
+
});
|
|
252
|
+
return { email, recoveryCodes };
|
|
253
|
+
}
|
|
254
|
+
function showRecoveryCodes(codes) {
|
|
255
|
+
console.log('');
|
|
256
|
+
warn('Save these recovery codes in a safe place:');
|
|
257
|
+
console.log('');
|
|
258
|
+
for (const code of codes) {
|
|
259
|
+
console.log(` ${chalk.yellow(code)}`);
|
|
260
|
+
}
|
|
261
|
+
console.log('');
|
|
262
|
+
warn('These codes cannot be shown again!');
|
|
263
|
+
}
|
|
264
|
+
async function stepAdminAccount(rl, db) {
|
|
265
|
+
if (!db) {
|
|
266
|
+
error('Database not available. Cannot create admin account.');
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
console.log(chalk.bold.white('\n Step 3: Admin Account\n'));
|
|
270
|
+
const existingAdmins = await getExistingAdmins(db);
|
|
271
|
+
if (existingAdmins.length > 0) {
|
|
272
|
+
console.log(chalk.dim(' Existing admin accounts:'));
|
|
273
|
+
for (const admin of existingAdmins) {
|
|
274
|
+
console.log(` ${chalk.green('•')} ${admin.name} ${chalk.dim(`<${admin.email}>`)}`);
|
|
275
|
+
}
|
|
276
|
+
console.log('');
|
|
277
|
+
console.log(' What would you like to do?');
|
|
278
|
+
console.log(` ${chalk.bold('1)')} Keep existing — no changes`);
|
|
279
|
+
console.log(` ${chalk.bold('2)')} Reset password for an existing admin`);
|
|
280
|
+
console.log(` ${chalk.bold('3)')} Create an additional admin`);
|
|
281
|
+
console.log('');
|
|
282
|
+
const choice = await prompt(rl, ' Choice [1]: ');
|
|
283
|
+
const picked = choice || '1';
|
|
284
|
+
if (picked === '1') {
|
|
285
|
+
success(`Keeping ${existingAdmins.length} existing admin(s).`);
|
|
286
|
+
return existingAdmins[0].email;
|
|
287
|
+
}
|
|
288
|
+
if (picked === '2') {
|
|
289
|
+
// Reset password for existing admin
|
|
290
|
+
let targetAdmin = existingAdmins[0];
|
|
291
|
+
if (existingAdmins.length > 1) {
|
|
292
|
+
console.log('');
|
|
293
|
+
for (let i = 0; i < existingAdmins.length; i++) {
|
|
294
|
+
console.log(` ${chalk.bold(`${i + 1})`)} ${existingAdmins[i].email}`);
|
|
295
|
+
}
|
|
296
|
+
const idx = await prompt(rl, ` Which admin? [1]: `);
|
|
297
|
+
const n = parseInt(idx || '1', 10) - 1;
|
|
298
|
+
if (n >= 0 && n < existingAdmins.length) {
|
|
299
|
+
targetAdmin = existingAdmins[n];
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
let newPassword = '';
|
|
303
|
+
while (true) {
|
|
304
|
+
newPassword = await promptPassword(rl, ' New password (min 8 chars, 1 letter, 1 number): ');
|
|
305
|
+
const strengthError = validatePasswordStrength(newPassword);
|
|
306
|
+
if (!strengthError)
|
|
307
|
+
break;
|
|
308
|
+
console.log(chalk.red(` ${strengthError}`));
|
|
309
|
+
}
|
|
310
|
+
const newHash = hashPassword(newPassword);
|
|
311
|
+
const recoveryCodes = generateRecoveryCodes(8);
|
|
312
|
+
const hashedCodes = hashRecoveryCodes(recoveryCodes);
|
|
313
|
+
await db.update(users)
|
|
314
|
+
.set({
|
|
315
|
+
passwordHash: newHash,
|
|
316
|
+
recoveryCodes: JSON.stringify(hashedCodes),
|
|
317
|
+
updatedAt: new Date(),
|
|
318
|
+
})
|
|
319
|
+
.where(eq(users.id, targetAdmin.id));
|
|
320
|
+
success(`Password reset for ${targetAdmin.email}`);
|
|
321
|
+
showRecoveryCodes(recoveryCodes);
|
|
322
|
+
return targetAdmin.email;
|
|
323
|
+
}
|
|
324
|
+
// picked === '3' — fall through to create new admin
|
|
325
|
+
console.log('');
|
|
326
|
+
}
|
|
327
|
+
// Create new admin
|
|
328
|
+
const name = await prompt(rl, ' Name: ');
|
|
329
|
+
if (!name) {
|
|
330
|
+
warn('Admin account creation skipped.');
|
|
331
|
+
return existingAdmins.length > 0 ? existingAdmins[0].email : null;
|
|
332
|
+
}
|
|
333
|
+
const email = await prompt(rl, ' Email: ');
|
|
334
|
+
if (!email || !email.includes('@')) {
|
|
335
|
+
error('Invalid email address.');
|
|
336
|
+
return existingAdmins.length > 0 ? existingAdmins[0].email : null;
|
|
337
|
+
}
|
|
338
|
+
// Check email uniqueness
|
|
339
|
+
const existing = await db
|
|
340
|
+
.select({ id: users.id })
|
|
341
|
+
.from(users)
|
|
342
|
+
.where(eq(users.email, email.toLowerCase()))
|
|
343
|
+
.limit(1);
|
|
344
|
+
if (existing.length > 0) {
|
|
345
|
+
error(`User with email ${email} already exists.`);
|
|
346
|
+
return existingAdmins.length > 0 ? existingAdmins[0].email : null;
|
|
347
|
+
}
|
|
348
|
+
let password = '';
|
|
349
|
+
while (true) {
|
|
350
|
+
password = await promptPassword(rl, ' Password (min 8 chars, 1 letter, 1 number): ');
|
|
351
|
+
const strengthError = validatePasswordStrength(password);
|
|
352
|
+
if (!strengthError)
|
|
353
|
+
break;
|
|
354
|
+
console.log(chalk.red(` ${strengthError}`));
|
|
355
|
+
}
|
|
356
|
+
// Prefer server API (avoids cross-process LibSQL issues in Docker)
|
|
357
|
+
const serverUrl = await getServerBaseUrl();
|
|
358
|
+
if (serverUrl) {
|
|
359
|
+
const apiResult = await createAdminViaApi(serverUrl, email, password, name);
|
|
360
|
+
if (apiResult) {
|
|
361
|
+
success(`Admin account created: ${apiResult.email}`);
|
|
362
|
+
showRecoveryCodes(apiResult.recoveryCodes);
|
|
363
|
+
return apiResult.email;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Fall back to direct DB
|
|
367
|
+
const result = await createAdminUser(db, name, email, password);
|
|
368
|
+
success(`Admin account created: ${result.email}`);
|
|
369
|
+
showRecoveryCodes(result.recoveryCodes);
|
|
370
|
+
return result.email;
|
|
371
|
+
}
|
|
372
|
+
// Step 4: Registration Mode
|
|
373
|
+
async function stepRegistrationMode(rl, db) {
|
|
374
|
+
console.log(chalk.bold.white('\n Step 4: Registration Mode\n'));
|
|
375
|
+
const choice = await promptChoice(rl, ' How should new users register?', [
|
|
376
|
+
{ key: '1', label: 'Invite only (default, more secure)' },
|
|
377
|
+
{ key: '2', label: 'Open registration' },
|
|
378
|
+
]);
|
|
379
|
+
const mode = choice === '1' ? 'invite' : 'open';
|
|
380
|
+
await updateSettings({
|
|
381
|
+
system: { registrationMode: mode },
|
|
382
|
+
});
|
|
383
|
+
success(`Registration mode set to ${chalk.bold(mode)}.`);
|
|
384
|
+
const codes = [];
|
|
385
|
+
if (mode === 'invite' && db) {
|
|
386
|
+
const generate = await promptYesNo(rl, ' Generate 3 invite codes now?', true);
|
|
387
|
+
if (generate) {
|
|
388
|
+
for (let i = 0; i < 3; i++) {
|
|
389
|
+
const code = generateInviteCode();
|
|
390
|
+
const codeHash = hashInviteCode(code);
|
|
391
|
+
await db.insert(inviteCodes).values({
|
|
392
|
+
id: randomUUID(),
|
|
393
|
+
codeHash,
|
|
394
|
+
createdBy: 'setup-wizard',
|
|
395
|
+
createdAt: new Date(),
|
|
396
|
+
label: `Setup wizard #${i + 1}`,
|
|
397
|
+
});
|
|
398
|
+
codes.push(code);
|
|
399
|
+
}
|
|
400
|
+
console.log('');
|
|
401
|
+
success('Invite codes generated:');
|
|
402
|
+
for (const code of codes) {
|
|
403
|
+
console.log(` ${chalk.cyan.bold(code)}`);
|
|
404
|
+
}
|
|
405
|
+
console.log('');
|
|
406
|
+
info('Share these with users who need to register.');
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return { mode, codes };
|
|
410
|
+
}
|
|
411
|
+
// Step 5: GitHub OAuth (optional)
|
|
412
|
+
async function stepGitHubOAuth(rl) {
|
|
413
|
+
console.log(chalk.bold.white('\n Step 5: GitHub OAuth (Optional)\n'));
|
|
414
|
+
const configure = await promptYesNo(rl, ' Configure GitHub OAuth login?', false);
|
|
415
|
+
if (!configure) {
|
|
416
|
+
info('GitHub OAuth skipped. Configure later in Settings.');
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
const port = process.env.PORT || '3000';
|
|
420
|
+
console.log('');
|
|
421
|
+
info(`Callback URL: ${chalk.cyan(`http://localhost:${port}/api/auth/github/callback`)}`);
|
|
422
|
+
info('Create a GitHub OAuth App at: https://github.com/settings/developers');
|
|
423
|
+
console.log('');
|
|
424
|
+
const clientId = await prompt(rl, ' GitHub Client ID: ');
|
|
425
|
+
const clientSecret = await prompt(rl, ' GitHub Client Secret: ');
|
|
426
|
+
if (!clientId || !clientSecret) {
|
|
427
|
+
warn('Incomplete credentials, skipping GitHub OAuth.');
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
await updateSettings({
|
|
431
|
+
oauth: {
|
|
432
|
+
github: {
|
|
433
|
+
clientId,
|
|
434
|
+
clientSecret,
|
|
435
|
+
redirectUri: `http://localhost:${port}/api/auth/github/callback`,
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
});
|
|
439
|
+
success('GitHub OAuth configured.');
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
// Step 6: Summary
|
|
443
|
+
function showSummary(results) {
|
|
444
|
+
const port = process.env.PORT || '3000';
|
|
445
|
+
console.log(chalk.bold.white('\n Setup Complete!\n'));
|
|
446
|
+
console.log(' ' + '─'.repeat(44));
|
|
447
|
+
const mark = (ok) => (ok ? chalk.green('✓') : chalk.yellow('✗'));
|
|
448
|
+
console.log(` ${mark(results.redisOk)} Redis: ${results.redisOk ? 'connected' : 'not connected'}`);
|
|
449
|
+
console.log(` ${mark(results.aiProvider !== 'skip')} AI: ${results.aiProvider === 'skip' ? 'not configured' : results.aiProvider}`);
|
|
450
|
+
console.log(` ${mark(!!results.adminEmail)} Admin: ${results.adminEmail || 'not created'}`);
|
|
451
|
+
console.log(` ${mark(true)} Registration: ${results.registrationMode}${results.inviteCodes.length ? ` (${results.inviteCodes.length} codes)` : ''}`);
|
|
452
|
+
console.log(` ${mark(results.githubOAuth)} GitHub OAuth: ${results.githubOAuth ? 'configured' : 'skipped'}`);
|
|
453
|
+
console.log(' ' + '─'.repeat(44));
|
|
454
|
+
console.log('');
|
|
455
|
+
console.log(` Open ${chalk.cyan.bold(`http://localhost:${port}`)} to get started.`);
|
|
456
|
+
console.log('');
|
|
457
|
+
}
|
|
458
|
+
// Non-Interactive Mode
|
|
459
|
+
async function runNonInteractive(options) {
|
|
460
|
+
showBanner();
|
|
461
|
+
console.log(chalk.dim(' Running in non-interactive mode...\n'));
|
|
462
|
+
await initStorage();
|
|
463
|
+
const db = getDb();
|
|
464
|
+
if (!db) {
|
|
465
|
+
error('Failed to initialize database.');
|
|
466
|
+
process.exit(1);
|
|
467
|
+
}
|
|
468
|
+
// System check
|
|
469
|
+
const redisOk = await checkRedis();
|
|
470
|
+
console.log(` ${redisOk ? chalk.green('✓') : chalk.red('✗')} Redis: ${redisOk ? 'connected' : 'not reachable'}`);
|
|
471
|
+
// AI Provider
|
|
472
|
+
const aiChoice = options.aiProvider || 'skip';
|
|
473
|
+
if (aiChoice !== 'skip') {
|
|
474
|
+
info(`AI provider: ${aiChoice} (configure key via env var or settings)`);
|
|
475
|
+
}
|
|
476
|
+
// Admin Account
|
|
477
|
+
let adminEmail = null;
|
|
478
|
+
if (options.adminEmail && options.adminPassword) {
|
|
479
|
+
const strengthError = validatePasswordStrength(options.adminPassword);
|
|
480
|
+
if (strengthError) {
|
|
481
|
+
error(`Password too weak: ${strengthError}`);
|
|
482
|
+
process.exit(1);
|
|
483
|
+
}
|
|
484
|
+
const emailLower = options.adminEmail.toLowerCase();
|
|
485
|
+
const name = options.adminName || 'Admin';
|
|
486
|
+
// Try server API first (ensures server sees the new user immediately)
|
|
487
|
+
const serverUrl = await getServerBaseUrl();
|
|
488
|
+
let handled = false;
|
|
489
|
+
if (serverUrl) {
|
|
490
|
+
const apiResult = await createAdminViaApi(serverUrl, emailLower, options.adminPassword, name);
|
|
491
|
+
if (apiResult) {
|
|
492
|
+
adminEmail = apiResult.email;
|
|
493
|
+
success(`Admin created: ${adminEmail}`);
|
|
494
|
+
console.log('');
|
|
495
|
+
warn('Recovery codes (save these!):');
|
|
496
|
+
for (const code of apiResult.recoveryCodes) {
|
|
497
|
+
console.log(` ${code}`);
|
|
498
|
+
}
|
|
499
|
+
console.log('');
|
|
500
|
+
handled = true;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// Fall back to direct DB if API unavailable or email already exists
|
|
504
|
+
if (!handled) {
|
|
505
|
+
const existingAdmins = await getExistingAdmins(db);
|
|
506
|
+
const matchingAdmin = existingAdmins.find(a => a.email === emailLower);
|
|
507
|
+
if (matchingAdmin) {
|
|
508
|
+
// Admin with this email exists — update password
|
|
509
|
+
const newHash = hashPassword(options.adminPassword);
|
|
510
|
+
const recoveryCodes = generateRecoveryCodes(8);
|
|
511
|
+
const hashedCodes = hashRecoveryCodes(recoveryCodes);
|
|
512
|
+
await db.update(users)
|
|
513
|
+
.set({
|
|
514
|
+
passwordHash: newHash,
|
|
515
|
+
recoveryCodes: JSON.stringify(hashedCodes),
|
|
516
|
+
updatedAt: new Date(),
|
|
517
|
+
})
|
|
518
|
+
.where(eq(users.id, matchingAdmin.id));
|
|
519
|
+
adminEmail = matchingAdmin.email;
|
|
520
|
+
success(`Admin password updated: ${adminEmail}`);
|
|
521
|
+
console.log('');
|
|
522
|
+
warn('Recovery codes (save these!):');
|
|
523
|
+
for (const code of recoveryCodes) {
|
|
524
|
+
console.log(` ${code}`);
|
|
525
|
+
}
|
|
526
|
+
console.log('');
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
// Create new admin directly in DB
|
|
530
|
+
const result = await createAdminUser(db, name, emailLower, options.adminPassword);
|
|
531
|
+
adminEmail = result.email;
|
|
532
|
+
success(`Admin created: ${adminEmail}`);
|
|
533
|
+
console.log('');
|
|
534
|
+
warn('Recovery codes (save these!):');
|
|
535
|
+
for (const code of result.recoveryCodes) {
|
|
536
|
+
console.log(` ${code}`);
|
|
537
|
+
}
|
|
538
|
+
console.log('');
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
// Registration Mode
|
|
543
|
+
const regMode = options.registrationMode || 'invite';
|
|
544
|
+
await updateSettings({
|
|
545
|
+
system: { registrationMode: regMode },
|
|
546
|
+
});
|
|
547
|
+
success(`Registration mode: ${regMode}`);
|
|
548
|
+
// Generate invite codes if invite mode
|
|
549
|
+
if (regMode === 'invite') {
|
|
550
|
+
const codes = [];
|
|
551
|
+
for (let i = 0; i < 3; i++) {
|
|
552
|
+
const code = generateInviteCode();
|
|
553
|
+
const codeHash = hashInviteCode(code);
|
|
554
|
+
await db.insert(inviteCodes).values({
|
|
555
|
+
id: randomUUID(),
|
|
556
|
+
codeHash,
|
|
557
|
+
createdBy: 'setup-wizard',
|
|
558
|
+
createdAt: new Date(),
|
|
559
|
+
label: `Setup #${i + 1}`,
|
|
560
|
+
});
|
|
561
|
+
codes.push(code);
|
|
562
|
+
}
|
|
563
|
+
success('Invite codes:');
|
|
564
|
+
for (const code of codes) {
|
|
565
|
+
console.log(` ${code}`);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
console.log('');
|
|
569
|
+
success('Setup complete.');
|
|
570
|
+
}
|
|
571
|
+
// Command Registration
|
|
572
|
+
export function setupCommand() {
|
|
573
|
+
const cmd = new Command('setup')
|
|
574
|
+
.description('Interactive first-time setup wizard')
|
|
575
|
+
.option('--non-interactive', 'Run without prompts (for CI/Docker)')
|
|
576
|
+
.option('--admin-email <email>', 'Admin email (non-interactive)')
|
|
577
|
+
.option('--admin-password <password>', 'Admin password (non-interactive)')
|
|
578
|
+
.option('--admin-name <name>', 'Admin display name (non-interactive)')
|
|
579
|
+
.option('--ai-provider <provider>', 'AI provider: anthropic, openai, ollama, skip (non-interactive)')
|
|
580
|
+
.option('--registration-mode <mode>', 'Registration mode: invite, open (non-interactive)')
|
|
581
|
+
.action(async (options) => {
|
|
582
|
+
try {
|
|
583
|
+
// Non-interactive mode
|
|
584
|
+
if (options.nonInteractive) {
|
|
585
|
+
await runNonInteractive({
|
|
586
|
+
adminEmail: options.adminEmail,
|
|
587
|
+
adminPassword: options.adminPassword,
|
|
588
|
+
adminName: options.adminName,
|
|
589
|
+
aiProvider: options.aiProvider,
|
|
590
|
+
registrationMode: options.registrationMode,
|
|
591
|
+
});
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
// Interactive mode
|
|
595
|
+
showBanner();
|
|
596
|
+
const spin = spinner('Initializing...');
|
|
597
|
+
spin.start();
|
|
598
|
+
await initStorage();
|
|
599
|
+
const db = getDb();
|
|
600
|
+
spin.stop();
|
|
601
|
+
if (!db) {
|
|
602
|
+
error('Failed to initialize database.');
|
|
603
|
+
process.exit(1);
|
|
604
|
+
}
|
|
605
|
+
// Create a single readline interface for all steps
|
|
606
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
607
|
+
// Step 1: System Check
|
|
608
|
+
const status = await stepSystemCheck(db);
|
|
609
|
+
// Step 2: AI Provider
|
|
610
|
+
console.log(chalk.bold.white('\n Step 2: AI Provider\n'));
|
|
611
|
+
const aiProvider = await stepAiProvider(rl, status);
|
|
612
|
+
// Step 3: Admin Account
|
|
613
|
+
const adminEmail = await stepAdminAccount(rl, db);
|
|
614
|
+
// Step 4: Registration Mode
|
|
615
|
+
const regResult = await stepRegistrationMode(rl, db);
|
|
616
|
+
// Step 5: GitHub OAuth
|
|
617
|
+
const githubOAuth = await stepGitHubOAuth(rl);
|
|
618
|
+
rl.close();
|
|
619
|
+
// Step 6: Summary
|
|
620
|
+
showSummary({
|
|
621
|
+
redisOk: status.redisOk,
|
|
622
|
+
aiProvider,
|
|
623
|
+
adminEmail,
|
|
624
|
+
registrationMode: regResult.mode,
|
|
625
|
+
inviteCodes: regResult.codes,
|
|
626
|
+
githubOAuth,
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
catch (err) {
|
|
630
|
+
error(err instanceof Error ? err.message : 'Setup failed');
|
|
631
|
+
process.exit(1);
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
return cmd;
|
|
635
|
+
}
|
|
636
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Manage profClaw skills from the command line.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* profclaw skill list
|
|
8
|
+
* profclaw skill info <name>
|
|
9
|
+
* profclaw skill enable <name>
|
|
10
|
+
* profclaw skill disable <name>
|
|
11
|
+
* profclaw skill reload
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
export declare function skillCommands(): Command;
|
|
15
|
+
//# sourceMappingURL=skill.d.ts.map
|