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,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Guardrails System - Phase 19 Category 8
|
|
3
|
+
*
|
|
4
|
+
* System-level quality checks that prevent bad outputs regardless of which
|
|
5
|
+
* AI model is used. Ensures even cheap/local models produce safe, valid responses.
|
|
6
|
+
*
|
|
7
|
+
* 8.1 Output Validation
|
|
8
|
+
* 8.2 Hallucination Detection
|
|
9
|
+
* 8.3 Safety Bounds
|
|
10
|
+
* 8.4 Quality Scoring
|
|
11
|
+
*/
|
|
12
|
+
export interface GuardrailContext {
|
|
13
|
+
/** Known file paths in the project */
|
|
14
|
+
knownFiles?: string[];
|
|
15
|
+
/** Registered tool names */
|
|
16
|
+
registeredTools?: string[];
|
|
17
|
+
/** The user's original query */
|
|
18
|
+
userQuery?: string;
|
|
19
|
+
/** Current conversation topic */
|
|
20
|
+
topic?: string;
|
|
21
|
+
/** Security mode */
|
|
22
|
+
securityMode?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ValidationResult {
|
|
25
|
+
valid: boolean;
|
|
26
|
+
issues: ValidationIssue[];
|
|
27
|
+
score: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ValidationIssue {
|
|
30
|
+
type: 'format' | 'content' | 'safety' | 'hallucination';
|
|
31
|
+
severity: 'warning' | 'error';
|
|
32
|
+
message: string;
|
|
33
|
+
autoFixed?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface HallucinationCheck {
|
|
36
|
+
detected: boolean;
|
|
37
|
+
flags: HallucinationFlag[];
|
|
38
|
+
}
|
|
39
|
+
export interface HallucinationFlag {
|
|
40
|
+
type: 'nonexistent_file' | 'nonexistent_tool' | 'nonexistent_api' | 'fabricated_data';
|
|
41
|
+
reference: string;
|
|
42
|
+
confidence: number;
|
|
43
|
+
}
|
|
44
|
+
export interface SafetyCheckResult {
|
|
45
|
+
safe: boolean;
|
|
46
|
+
blocked: BlockedAction[];
|
|
47
|
+
}
|
|
48
|
+
export interface BlockedAction {
|
|
49
|
+
action: string;
|
|
50
|
+
reason: string;
|
|
51
|
+
severity: 'warning' | 'critical';
|
|
52
|
+
}
|
|
53
|
+
export interface QualityScore {
|
|
54
|
+
overall: number;
|
|
55
|
+
components: {
|
|
56
|
+
relevance: number;
|
|
57
|
+
completeness: number;
|
|
58
|
+
safety: number;
|
|
59
|
+
formatting: number;
|
|
60
|
+
};
|
|
61
|
+
tier: 'excellent' | 'good' | 'acceptable' | 'poor';
|
|
62
|
+
shouldCorrect: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface GuardrailResult {
|
|
65
|
+
passed: boolean;
|
|
66
|
+
validation: ValidationResult;
|
|
67
|
+
hallucination: HallucinationCheck;
|
|
68
|
+
safety: SafetyCheckResult;
|
|
69
|
+
quality: QualityScore;
|
|
70
|
+
/** Modified response if auto-fixes were applied */
|
|
71
|
+
cleanedResponse?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validate an agent response for format, content, safety, and structural issues.
|
|
75
|
+
*/
|
|
76
|
+
export declare function validateAgentResponse(response: string, context: GuardrailContext): ValidationResult;
|
|
77
|
+
/**
|
|
78
|
+
* Detect potential hallucinations in a response.
|
|
79
|
+
*/
|
|
80
|
+
export declare function detectHallucinations(response: string, context: GuardrailContext): HallucinationCheck;
|
|
81
|
+
/**
|
|
82
|
+
* Check tool parameters against absolute safety bounds.
|
|
83
|
+
* These patterns are blocked even in full-autonomous mode.
|
|
84
|
+
*/
|
|
85
|
+
export declare function checkSafetyBounds(toolName: string, params: Record<string, unknown>): SafetyCheckResult;
|
|
86
|
+
/**
|
|
87
|
+
* Score response quality across relevance, completeness, safety, and formatting.
|
|
88
|
+
*/
|
|
89
|
+
export declare function scoreResponse(response: string, userQuery: string, context: GuardrailContext): QualityScore;
|
|
90
|
+
/**
|
|
91
|
+
* Run all guardrails on an agent response and its tool calls.
|
|
92
|
+
* Returns a comprehensive result with per-check details and optional cleaned response.
|
|
93
|
+
*/
|
|
94
|
+
export declare function runGuardrails(response: string, toolCalls: Array<{
|
|
95
|
+
name: string;
|
|
96
|
+
params: Record<string, unknown>;
|
|
97
|
+
}>, context: GuardrailContext): Promise<GuardrailResult>;
|
|
98
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Guardrails System - Phase 19 Category 8
|
|
3
|
+
*
|
|
4
|
+
* System-level quality checks that prevent bad outputs regardless of which
|
|
5
|
+
* AI model is used. Ensures even cheap/local models produce safe, valid responses.
|
|
6
|
+
*
|
|
7
|
+
* 8.1 Output Validation
|
|
8
|
+
* 8.2 Hallucination Detection
|
|
9
|
+
* 8.3 Safety Bounds
|
|
10
|
+
* 8.4 Quality Scoring
|
|
11
|
+
*/
|
|
12
|
+
// 8.1 Output Validation
|
|
13
|
+
const MAX_RESPONSE_CHARS = 50_000;
|
|
14
|
+
const STUTTER_THRESHOLD = 3; // same sentence repeated 3+ times
|
|
15
|
+
// Patterns for raw tool call syntax leaking into response
|
|
16
|
+
const TOOL_CALL_LEAK_PATTERNS = [
|
|
17
|
+
/<tool_call>/i,
|
|
18
|
+
/<\/tool_call>/i,
|
|
19
|
+
/\{"type":"tool_use"/,
|
|
20
|
+
/\{"role":"tool"/,
|
|
21
|
+
/"tool_calls"\s*:\s*\[/,
|
|
22
|
+
/\[TOOL_CALL\]/i,
|
|
23
|
+
/<function_calls>/i,
|
|
24
|
+
/\[FUNCTION_CALL\]/i,
|
|
25
|
+
];
|
|
26
|
+
// Patterns indicating the system prompt may be echoed back
|
|
27
|
+
const SYSTEM_PROMPT_ECHO_PATTERNS = [
|
|
28
|
+
/you are an? (helpful |professional |ai |intelligent )?assistant/i,
|
|
29
|
+
/your name is (profclaw|professor claw|prof claw)/i,
|
|
30
|
+
/you must (always|never|only) respond/i,
|
|
31
|
+
/\[system\]/i,
|
|
32
|
+
/<system>/i,
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Validate an agent response for format, content, safety, and structural issues.
|
|
36
|
+
*/
|
|
37
|
+
export function validateAgentResponse(response, context) {
|
|
38
|
+
const issues = [];
|
|
39
|
+
// Check 1: Non-empty response
|
|
40
|
+
if (!response || response.trim().length === 0) {
|
|
41
|
+
issues.push({
|
|
42
|
+
type: 'content',
|
|
43
|
+
severity: 'error',
|
|
44
|
+
message: 'Response is empty',
|
|
45
|
+
});
|
|
46
|
+
return { valid: false, issues, score: 0 };
|
|
47
|
+
}
|
|
48
|
+
// Check 2: System prompt echo detection
|
|
49
|
+
const echoMatches = SYSTEM_PROMPT_ECHO_PATTERNS.filter((p) => p.test(response));
|
|
50
|
+
if (echoMatches.length >= 2) {
|
|
51
|
+
issues.push({
|
|
52
|
+
type: 'content',
|
|
53
|
+
severity: 'error',
|
|
54
|
+
message: 'Response appears to echo the system prompt back to the user',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Check 3: Raw tool call syntax leak
|
|
58
|
+
const leakMatches = TOOL_CALL_LEAK_PATTERNS.filter((p) => p.test(response));
|
|
59
|
+
if (leakMatches.length > 0) {
|
|
60
|
+
issues.push({
|
|
61
|
+
type: 'format',
|
|
62
|
+
severity: 'error',
|
|
63
|
+
message: `Response contains raw tool call syntax (${leakMatches.length} pattern(s) matched) - model is leaking internals`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Check 4: Response length
|
|
67
|
+
if (response.length > MAX_RESPONSE_CHARS) {
|
|
68
|
+
issues.push({
|
|
69
|
+
type: 'format',
|
|
70
|
+
severity: 'warning',
|
|
71
|
+
message: `Response exceeds ${MAX_RESPONSE_CHARS} characters (${response.length} chars) - may indicate runaway generation`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Check 5: Stutter / repeated sentence detection
|
|
75
|
+
const stutterIssue = detectStuttering(response);
|
|
76
|
+
if (stutterIssue) {
|
|
77
|
+
issues.push(stutterIssue);
|
|
78
|
+
}
|
|
79
|
+
// Check 6: Code block brace balance
|
|
80
|
+
const codeBlockIssues = checkCodeBlockBalance(response);
|
|
81
|
+
issues.push(...codeBlockIssues);
|
|
82
|
+
// Check 7: Query context hint (warn if response seems completely unrelated)
|
|
83
|
+
if (context.userQuery && context.userQuery.length > 10) {
|
|
84
|
+
const queryWords = extractKeywords(context.userQuery);
|
|
85
|
+
const responseWords = extractKeywords(response);
|
|
86
|
+
const overlap = queryWords.filter((w) => responseWords.includes(w)).length;
|
|
87
|
+
if (queryWords.length > 3 && overlap === 0) {
|
|
88
|
+
issues.push({
|
|
89
|
+
type: 'content',
|
|
90
|
+
severity: 'warning',
|
|
91
|
+
message: 'Response shares no keywords with the user query - may be off-topic',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const hasErrors = issues.some((i) => i.severity === 'error');
|
|
96
|
+
const errorPenalty = issues.filter((i) => i.severity === 'error').length * 20;
|
|
97
|
+
const warningPenalty = issues.filter((i) => i.severity === 'warning').length * 10;
|
|
98
|
+
const score = Math.max(0, 100 - errorPenalty - warningPenalty);
|
|
99
|
+
return {
|
|
100
|
+
valid: !hasErrors,
|
|
101
|
+
issues,
|
|
102
|
+
score,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function detectStuttering(response) {
|
|
106
|
+
// Split into sentences by common sentence terminators
|
|
107
|
+
const sentences = response
|
|
108
|
+
.split(/[.!?]\s+/)
|
|
109
|
+
.map((s) => s.trim().toLowerCase())
|
|
110
|
+
.filter((s) => s.length > 15); // ignore short fragments
|
|
111
|
+
if (sentences.length < STUTTER_THRESHOLD)
|
|
112
|
+
return null;
|
|
113
|
+
const counts = new Map();
|
|
114
|
+
for (const sentence of sentences) {
|
|
115
|
+
const normalized = sentence.replace(/\s+/g, ' ');
|
|
116
|
+
counts.set(normalized, (counts.get(normalized) ?? 0) + 1);
|
|
117
|
+
}
|
|
118
|
+
for (const [sentence, count] of counts) {
|
|
119
|
+
if (count >= STUTTER_THRESHOLD) {
|
|
120
|
+
return {
|
|
121
|
+
type: 'format',
|
|
122
|
+
severity: 'error',
|
|
123
|
+
message: `Stutter detected: "${sentence.slice(0, 60)}..." repeated ${count} times`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function checkCodeBlockBalance(response) {
|
|
130
|
+
const issues = [];
|
|
131
|
+
// Extract code blocks
|
|
132
|
+
const codeBlockRegex = /```[\w]*\n([\s\S]*?)```/g;
|
|
133
|
+
let match;
|
|
134
|
+
while ((match = codeBlockRegex.exec(response)) !== null) {
|
|
135
|
+
const code = match[1];
|
|
136
|
+
if (!code)
|
|
137
|
+
continue;
|
|
138
|
+
// Check brace/bracket balance
|
|
139
|
+
const openBraces = (code.match(/\{/g) ?? []).length;
|
|
140
|
+
const closeBraces = (code.match(/\}/g) ?? []).length;
|
|
141
|
+
const openBrackets = (code.match(/\[/g) ?? []).length;
|
|
142
|
+
const closeBrackets = (code.match(/\]/g) ?? []).length;
|
|
143
|
+
if (openBraces !== closeBraces) {
|
|
144
|
+
issues.push({
|
|
145
|
+
type: 'format',
|
|
146
|
+
severity: 'warning',
|
|
147
|
+
message: `Code block has unbalanced braces: ${openBraces} opening vs ${closeBraces} closing`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (openBrackets !== closeBrackets) {
|
|
151
|
+
issues.push({
|
|
152
|
+
type: 'format',
|
|
153
|
+
severity: 'warning',
|
|
154
|
+
message: `Code block has unbalanced brackets: ${openBrackets} opening vs ${closeBrackets} closing`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return issues;
|
|
159
|
+
}
|
|
160
|
+
// 8.2 Hallucination Detection
|
|
161
|
+
// Fabricated URL patterns - overly versioned or nonsense paths
|
|
162
|
+
const FABRICATED_URL_PATTERNS = [
|
|
163
|
+
/https?:\/\/example\.com\/api\/v\d{2,}/i, // e.g. /api/v99/
|
|
164
|
+
/https?:\/\/(?:foo|bar|baz|test)\.example\.com/i,
|
|
165
|
+
/https?:\/\/api\.(?:fake|nonexistent|placeholder)\.(?:com|io|dev)/i,
|
|
166
|
+
];
|
|
167
|
+
// Unrealistic library version patterns
|
|
168
|
+
const UNREALISTIC_VERSION_PATTERNS = [
|
|
169
|
+
{ pattern: /React\s+v?(\d+)\./i, maxMajor: 20, name: 'React' },
|
|
170
|
+
{ pattern: /Next\.js\s+v?(\d+)\./i, maxMajor: 20, name: 'Next.js' },
|
|
171
|
+
{ pattern: /Vue\s+v?(\d+)\./i, maxMajor: 5, name: 'Vue' },
|
|
172
|
+
{ pattern: /Angular\s+v?(\d+)\./i, maxMajor: 30, name: 'Angular' },
|
|
173
|
+
{ pattern: /Node\.js\s+v?(\d+)\./i, maxMajor: 30, name: 'Node.js' },
|
|
174
|
+
{ pattern: /TypeScript\s+v?(\d+)\./i, maxMajor: 10, name: 'TypeScript' },
|
|
175
|
+
{ pattern: /Python\s+v?(\d+)\./i, maxMajor: 5, name: 'Python' },
|
|
176
|
+
{ pattern: /Django\s+v?(\d+)\./i, maxMajor: 10, name: 'Django' },
|
|
177
|
+
{ pattern: /Rust\s+v?(\d+)\./i, maxMajor: 3, name: 'Rust' },
|
|
178
|
+
{ pattern: /Go\s+v?(\d+)\./i, maxMajor: 3, name: 'Go' },
|
|
179
|
+
];
|
|
180
|
+
// File path-like patterns in response text
|
|
181
|
+
const FILE_PATH_PATTERN = /(?:^|\s|`|")(\/?(?:src|lib|app|pages|components|utils|hooks|api|routes|models|services|config|tests?)\/[\w\-./]+\.\w{1,6})(?:\s|`|"|$)/gm;
|
|
182
|
+
/**
|
|
183
|
+
* Detect potential hallucinations in a response.
|
|
184
|
+
*/
|
|
185
|
+
export function detectHallucinations(response, context) {
|
|
186
|
+
const flags = [];
|
|
187
|
+
// Check 1: File paths mentioned vs known project files
|
|
188
|
+
if (context.knownFiles && context.knownFiles.length > 0) {
|
|
189
|
+
const mentionedPaths = extractFilePaths(response);
|
|
190
|
+
for (const mentionedPath of mentionedPaths) {
|
|
191
|
+
const normalized = mentionedPath.replace(/^\.\//, '');
|
|
192
|
+
const exists = context.knownFiles.some((f) => f.endsWith(normalized) || f.includes(normalized));
|
|
193
|
+
if (!exists) {
|
|
194
|
+
flags.push({
|
|
195
|
+
type: 'nonexistent_file',
|
|
196
|
+
reference: mentionedPath,
|
|
197
|
+
confidence: 0.7,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Check 2: Tool names mentioned vs registered tools
|
|
203
|
+
if (context.registeredTools && context.registeredTools.length > 0) {
|
|
204
|
+
const toolRefs = extractToolReferences(response, context.registeredTools);
|
|
205
|
+
for (const ref of toolRefs) {
|
|
206
|
+
if (!context.registeredTools.includes(ref)) {
|
|
207
|
+
flags.push({
|
|
208
|
+
type: 'nonexistent_tool',
|
|
209
|
+
reference: ref,
|
|
210
|
+
confidence: 0.8,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Check 3: Fabricated URLs
|
|
216
|
+
for (const pattern of FABRICATED_URL_PATTERNS) {
|
|
217
|
+
const urlMatch = pattern.exec(response);
|
|
218
|
+
if (urlMatch) {
|
|
219
|
+
flags.push({
|
|
220
|
+
type: 'nonexistent_api',
|
|
221
|
+
reference: urlMatch[0],
|
|
222
|
+
confidence: 0.75,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Check 4: Unrealistic version numbers
|
|
227
|
+
for (const { pattern, maxMajor, name } of UNREALISTIC_VERSION_PATTERNS) {
|
|
228
|
+
const vMatch = pattern.exec(response);
|
|
229
|
+
if (vMatch && vMatch[1]) {
|
|
230
|
+
const major = parseInt(vMatch[1], 10);
|
|
231
|
+
if (major > maxMajor) {
|
|
232
|
+
flags.push({
|
|
233
|
+
type: 'fabricated_data',
|
|
234
|
+
reference: `${name} v${major} (max realistic major: ${maxMajor})`,
|
|
235
|
+
confidence: 0.9,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return {
|
|
241
|
+
detected: flags.length > 0,
|
|
242
|
+
flags,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function extractFilePaths(text) {
|
|
246
|
+
const paths = [];
|
|
247
|
+
const regex = new RegExp(FILE_PATH_PATTERN.source, FILE_PATH_PATTERN.flags);
|
|
248
|
+
let match;
|
|
249
|
+
while ((match = regex.exec(text)) !== null) {
|
|
250
|
+
if (match[1]) {
|
|
251
|
+
paths.push(match[1].trim());
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Deduplicate
|
|
255
|
+
return [...new Set(paths)];
|
|
256
|
+
}
|
|
257
|
+
function extractToolReferences(text, registeredTools) {
|
|
258
|
+
// Look for references to known tool name patterns and potential tool names in backticks
|
|
259
|
+
const found = [];
|
|
260
|
+
const backtickRefs = text.match(/`([a-z][a-z0-9_-]{2,40})`/gi) ?? [];
|
|
261
|
+
for (const ref of backtickRefs) {
|
|
262
|
+
const name = ref.replace(/`/g, '');
|
|
263
|
+
// Only flag if it looks like a tool (snake_case or kebab-case function name)
|
|
264
|
+
if (/^[a-z][a-z0-9_]{2,}$/.test(name) && !registeredTools.includes(name)) {
|
|
265
|
+
// Only flag if there's at least one registered tool with similar naming
|
|
266
|
+
const hasSimilarStyle = registeredTools.some((t) => /^[a-z][a-z0-9_]{2,}$/.test(t));
|
|
267
|
+
if (hasSimilarStyle) {
|
|
268
|
+
found.push(name);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return [...new Set(found)];
|
|
273
|
+
}
|
|
274
|
+
const BLOCKED_SAFETY_PATTERNS = [
|
|
275
|
+
// Destructive filesystem
|
|
276
|
+
{ pattern: /rm\s+-rf?\s+\/(?:\s|$|~|\*)/i, reason: 'Recursive deletion of root or home directory', severity: 'critical' },
|
|
277
|
+
{ pattern: /rm\s+-rf?\s+~(?:\/|$)/i, reason: 'Recursive deletion of home directory', severity: 'critical' },
|
|
278
|
+
{ pattern: /rm\s+-rf?\s+\/\*/i, reason: 'Recursive deletion of root wildcard', severity: 'critical' },
|
|
279
|
+
// SQL destructive
|
|
280
|
+
{ pattern: /DROP\s+TABLE\b/i, reason: 'SQL DROP TABLE - destructive database operation', severity: 'critical' },
|
|
281
|
+
{ pattern: /DROP\s+DATABASE\b/i, reason: 'SQL DROP DATABASE - destructive database operation', severity: 'critical' },
|
|
282
|
+
{ pattern: /TRUNCATE\s+TABLE\b/i, reason: 'SQL TRUNCATE - destroys all table data', severity: 'critical' },
|
|
283
|
+
// Dangerous chmod on system dirs
|
|
284
|
+
{ pattern: /chmod\s+(?:a\+rwx|777)\s+\/(?:etc|usr|bin|sbin|var|sys|proc)/i, reason: 'chmod 777 on system directory', severity: 'critical' },
|
|
285
|
+
// Pipe to shell
|
|
286
|
+
{ pattern: /curl\s+.*\|\s*(?:sudo\s+)?(?:ba)?sh\b/i, reason: 'Piping curl output directly to shell', severity: 'critical' },
|
|
287
|
+
{ pattern: /wget\s+.*\|\s*(?:sudo\s+)?(?:ba)?sh\b/i, reason: 'Piping wget output directly to shell', severity: 'critical' },
|
|
288
|
+
// Kill init/systemd
|
|
289
|
+
{ pattern: /kill\s+(?:-9\s+|-SIGKILL\s+)?1\b/i, reason: 'Attempting to kill PID 1 (init/systemd)', severity: 'critical' },
|
|
290
|
+
{ pattern: /kill\s+(?:-9\s+|-SIGKILL\s+)?-1\b/i, reason: 'Attempting to kill all processes', severity: 'critical' },
|
|
291
|
+
// Sensitive system file modification
|
|
292
|
+
{ pattern: /(?:echo|tee|cat|write|>>|>)\s+.*(?:\/etc\/passwd|\/etc\/shadow|\.ssh\/authorized_keys)/i, reason: 'Modifying sensitive authentication files', severity: 'critical' },
|
|
293
|
+
{ pattern: /\bchpasswd\b/i, reason: 'Changing system passwords', severity: 'critical' },
|
|
294
|
+
// Disk/device destructive writes
|
|
295
|
+
{ pattern: />\s*\/dev\/sd[a-z]\b/i, reason: 'Direct write to block device', severity: 'critical' },
|
|
296
|
+
{ pattern: /dd\s+.*of=\/dev\/(?:sd[a-z]|nvme\d)/i, reason: 'dd write to disk device', severity: 'critical' },
|
|
297
|
+
{ pattern: /mkfs\./i, reason: 'Formatting a filesystem', severity: 'critical' },
|
|
298
|
+
{ pattern: /\bformat\s+[a-z]:\\/i, reason: 'Windows disk format command', severity: 'critical' },
|
|
299
|
+
// Firewall flush
|
|
300
|
+
{ pattern: /iptables\s+-F\b/i, reason: 'Flushing all iptables firewall rules', severity: 'critical' },
|
|
301
|
+
{ pattern: /iptables\s+--flush\b/i, reason: 'Flushing all iptables firewall rules', severity: 'critical' },
|
|
302
|
+
{ pattern: /ufw\s+--force\s+reset/i, reason: 'Resetting UFW firewall rules', severity: 'warning' },
|
|
303
|
+
// System shutdown
|
|
304
|
+
{ pattern: /\bshutdown\b.*(?:-h|-r|\bnow\b)/i, reason: 'System shutdown or reboot command', severity: 'warning' },
|
|
305
|
+
{ pattern: /\breboot\b(?:\s|$)/i, reason: 'System reboot command', severity: 'warning' },
|
|
306
|
+
{ pattern: /\bhalt\b(?:\s|$)/i, reason: 'System halt command', severity: 'warning' },
|
|
307
|
+
{ pattern: /\bpoweroff\b(?:\s|$)/i, reason: 'System poweroff command', severity: 'warning' },
|
|
308
|
+
// Zero-fill writes
|
|
309
|
+
{ pattern: /dd\s+if=\/dev\/zero\s+of=\/dev\//i, reason: 'Zero-filling a block device', severity: 'critical' },
|
|
310
|
+
{ pattern: /dd\s+if=\/dev\/urandom\s+of=\/dev\//i, reason: 'Random-filling a block device', severity: 'critical' },
|
|
311
|
+
];
|
|
312
|
+
/**
|
|
313
|
+
* Check tool parameters against absolute safety bounds.
|
|
314
|
+
* These patterns are blocked even in full-autonomous mode.
|
|
315
|
+
*/
|
|
316
|
+
export function checkSafetyBounds(toolName, params) {
|
|
317
|
+
const blocked = [];
|
|
318
|
+
// Build a searchable string from all param values
|
|
319
|
+
const paramValues = extractStringValues(params);
|
|
320
|
+
const searchTarget = paramValues.join(' ');
|
|
321
|
+
if (searchTarget.length === 0) {
|
|
322
|
+
return { safe: true, blocked: [] };
|
|
323
|
+
}
|
|
324
|
+
for (const { pattern, reason, severity } of BLOCKED_SAFETY_PATTERNS) {
|
|
325
|
+
if (pattern.test(searchTarget)) {
|
|
326
|
+
blocked.push({
|
|
327
|
+
action: `${toolName}: ${searchTarget.slice(0, 120)}`,
|
|
328
|
+
reason,
|
|
329
|
+
severity,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
safe: blocked.length === 0,
|
|
335
|
+
blocked,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
function extractStringValues(obj, depth = 0) {
|
|
339
|
+
if (depth > 3)
|
|
340
|
+
return [];
|
|
341
|
+
const values = [];
|
|
342
|
+
for (const val of Object.values(obj)) {
|
|
343
|
+
if (typeof val === 'string') {
|
|
344
|
+
values.push(val);
|
|
345
|
+
}
|
|
346
|
+
else if (Array.isArray(val)) {
|
|
347
|
+
for (const item of val) {
|
|
348
|
+
if (typeof item === 'string') {
|
|
349
|
+
values.push(item);
|
|
350
|
+
}
|
|
351
|
+
else if (item !== null && typeof item === 'object') {
|
|
352
|
+
values.push(...extractStringValues(item, depth + 1));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else if (val !== null && typeof val === 'object') {
|
|
357
|
+
values.push(...extractStringValues(val, depth + 1));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return values;
|
|
361
|
+
}
|
|
362
|
+
// 8.4 Quality Scoring
|
|
363
|
+
const TIER_THRESHOLDS = {
|
|
364
|
+
excellent: 80,
|
|
365
|
+
good: 60,
|
|
366
|
+
acceptable: 40,
|
|
367
|
+
};
|
|
368
|
+
const CORRECT_BELOW = 40;
|
|
369
|
+
// Code-related keywords used to check if response should have code blocks
|
|
370
|
+
const CODE_KEYWORDS = [
|
|
371
|
+
'function', 'class', 'const ', 'let ', 'var ', 'return', 'import', 'export',
|
|
372
|
+
'interface', 'type ', 'enum ', 'async', 'await', 'promise', 'callback',
|
|
373
|
+
'snippet', 'example code', 'code block', 'implement', 'script', 'program',
|
|
374
|
+
];
|
|
375
|
+
/**
|
|
376
|
+
* Score response quality across relevance, completeness, safety, and formatting.
|
|
377
|
+
*/
|
|
378
|
+
export function scoreResponse(response, userQuery, context) {
|
|
379
|
+
const relevance = scoreRelevance(response, userQuery);
|
|
380
|
+
const completeness = scoreCompleteness(response, userQuery);
|
|
381
|
+
const safety = scoreSafety(response, context);
|
|
382
|
+
const formatting = scoreFormatting(response, userQuery);
|
|
383
|
+
const overall = Math.round((relevance + completeness + safety + formatting) / 4);
|
|
384
|
+
const tier = getTier(overall);
|
|
385
|
+
return {
|
|
386
|
+
overall,
|
|
387
|
+
components: { relevance, completeness, safety, formatting },
|
|
388
|
+
tier,
|
|
389
|
+
shouldCorrect: overall < CORRECT_BELOW,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
function scoreRelevance(response, userQuery) {
|
|
393
|
+
if (!userQuery || userQuery.trim().length === 0)
|
|
394
|
+
return 70; // neutral if no query
|
|
395
|
+
const queryKeywords = extractKeywords(userQuery);
|
|
396
|
+
const responseKeywords = extractKeywords(response);
|
|
397
|
+
if (queryKeywords.length === 0)
|
|
398
|
+
return 70;
|
|
399
|
+
const matched = queryKeywords.filter((kw) => responseKeywords.includes(kw)).length;
|
|
400
|
+
const ratio = matched / queryKeywords.length;
|
|
401
|
+
// Scale: 0% overlap = 20, 100% overlap = 100
|
|
402
|
+
return Math.round(20 + ratio * 80);
|
|
403
|
+
}
|
|
404
|
+
function scoreCompleteness(response, userQuery) {
|
|
405
|
+
const trimmed = response.trim();
|
|
406
|
+
const wordCount = trimmed.split(/\s+/).length;
|
|
407
|
+
// Estimate query complexity by word count
|
|
408
|
+
const queryWords = userQuery.trim().split(/\s+/).length;
|
|
409
|
+
const isComplexQuery = queryWords > 15;
|
|
410
|
+
const isSimpleQuery = queryWords <= 5;
|
|
411
|
+
// Check if it's a question
|
|
412
|
+
const isQuestion = /\?$/.test(userQuery.trim()) || /^(?:what|how|why|when|where|who|can|could|should|would|is|are|do|does)\b/i.test(userQuery.trim());
|
|
413
|
+
let expectedMinWords;
|
|
414
|
+
if (isSimpleQuery && !isQuestion) {
|
|
415
|
+
expectedMinWords = 10;
|
|
416
|
+
}
|
|
417
|
+
else if (isComplexQuery || isQuestion) {
|
|
418
|
+
expectedMinWords = 50;
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
expectedMinWords = 25;
|
|
422
|
+
}
|
|
423
|
+
if (wordCount < 3)
|
|
424
|
+
return 10; // near-empty response
|
|
425
|
+
if (wordCount >= expectedMinWords * 3)
|
|
426
|
+
return 100; // more than enough
|
|
427
|
+
if (wordCount >= expectedMinWords)
|
|
428
|
+
return 80;
|
|
429
|
+
if (wordCount >= expectedMinWords / 2)
|
|
430
|
+
return 55;
|
|
431
|
+
return 30;
|
|
432
|
+
}
|
|
433
|
+
function scoreSafety(response, context) {
|
|
434
|
+
// Run safety check on response text treated as a pseudo-command
|
|
435
|
+
const safetyResult = checkSafetyBounds('response_text', { content: response });
|
|
436
|
+
if (!safetyResult.safe) {
|
|
437
|
+
const criticalCount = safetyResult.blocked.filter((b) => b.severity === 'critical').length;
|
|
438
|
+
const warningCount = safetyResult.blocked.filter((b) => b.severity === 'warning').length;
|
|
439
|
+
return Math.max(0, 100 - criticalCount * 40 - warningCount * 10);
|
|
440
|
+
}
|
|
441
|
+
// Also check if securityMode context indicates elevated caution
|
|
442
|
+
if (context.securityMode === 'deny')
|
|
443
|
+
return 100; // deny mode = nothing runs = safe
|
|
444
|
+
return 100;
|
|
445
|
+
}
|
|
446
|
+
function scoreFormatting(response, userQuery) {
|
|
447
|
+
let score = 50; // baseline
|
|
448
|
+
const trimmed = response.trim();
|
|
449
|
+
const hasMultipleParagraphs = trimmed.split(/\n\n+/).length > 1;
|
|
450
|
+
const hasCodeBlock = /```[\s\S]*?```/.test(trimmed);
|
|
451
|
+
const hasBulletList = /^[-*+]\s/m.test(trimmed);
|
|
452
|
+
const hasNumberedList = /^\d+\.\s/m.test(trimmed);
|
|
453
|
+
const hasHeaders = /^#+\s/m.test(trimmed);
|
|
454
|
+
// Is the query code-related?
|
|
455
|
+
const isCodeQuery = CODE_KEYWORDS.some((kw) => userQuery.toLowerCase().includes(kw));
|
|
456
|
+
// Good structure bonuses
|
|
457
|
+
if (hasMultipleParagraphs)
|
|
458
|
+
score += 10;
|
|
459
|
+
if (hasBulletList || hasNumberedList)
|
|
460
|
+
score += 10;
|
|
461
|
+
if (hasHeaders && trimmed.length > 500)
|
|
462
|
+
score += 5; // headers only help for longer responses
|
|
463
|
+
// Code block relevance
|
|
464
|
+
if (isCodeQuery && hasCodeBlock)
|
|
465
|
+
score += 20;
|
|
466
|
+
if (isCodeQuery && !hasCodeBlock)
|
|
467
|
+
score -= 15; // expected code but none provided
|
|
468
|
+
// Penalize very short responses to complex queries
|
|
469
|
+
const wordCount = trimmed.split(/\s+/).length;
|
|
470
|
+
if (wordCount < 5)
|
|
471
|
+
score -= 30;
|
|
472
|
+
// Cap to 0-100
|
|
473
|
+
return Math.max(0, Math.min(100, score));
|
|
474
|
+
}
|
|
475
|
+
function getTier(score) {
|
|
476
|
+
if (score >= TIER_THRESHOLDS.excellent)
|
|
477
|
+
return 'excellent';
|
|
478
|
+
if (score >= TIER_THRESHOLDS.good)
|
|
479
|
+
return 'good';
|
|
480
|
+
if (score >= TIER_THRESHOLDS.acceptable)
|
|
481
|
+
return 'acceptable';
|
|
482
|
+
return 'poor';
|
|
483
|
+
}
|
|
484
|
+
// Shared Utilities
|
|
485
|
+
// Common English stop words to exclude from keyword extraction
|
|
486
|
+
const STOP_WORDS = new Set([
|
|
487
|
+
'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
|
|
488
|
+
'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
489
|
+
'has', 'have', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
490
|
+
'should', 'may', 'might', 'can', 'it', 'its', 'this', 'that', 'these',
|
|
491
|
+
'those', 'i', 'you', 'we', 'they', 'he', 'she', 'my', 'your', 'our',
|
|
492
|
+
'how', 'what', 'when', 'where', 'why', 'which', 'who', 'not', 'no',
|
|
493
|
+
'if', 'so', 'as', 'up', 'out', 'about', 'into', 'then', 'than', 'just',
|
|
494
|
+
]);
|
|
495
|
+
function extractKeywords(text) {
|
|
496
|
+
return text
|
|
497
|
+
.toLowerCase()
|
|
498
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
499
|
+
.split(/\s+/)
|
|
500
|
+
.filter((w) => w.length > 3 && !STOP_WORDS.has(w));
|
|
501
|
+
}
|
|
502
|
+
// Main Guardrail Pipeline
|
|
503
|
+
/**
|
|
504
|
+
* Run all guardrails on an agent response and its tool calls.
|
|
505
|
+
* Returns a comprehensive result with per-check details and optional cleaned response.
|
|
506
|
+
*/
|
|
507
|
+
export async function runGuardrails(response, toolCalls, context) {
|
|
508
|
+
// Run all checks (pure functions - can run in parallel conceptually)
|
|
509
|
+
const validation = validateAgentResponse(response, context);
|
|
510
|
+
const hallucination = detectHallucinations(response, context);
|
|
511
|
+
const quality = scoreResponse(response, context.userQuery ?? '', context);
|
|
512
|
+
// Safety bounds: check the response text AND all tool call params
|
|
513
|
+
const safetyChecks = [
|
|
514
|
+
checkSafetyBounds('response_text', { content: response }),
|
|
515
|
+
...toolCalls.map((tc) => checkSafetyBounds(tc.name, tc.params)),
|
|
516
|
+
];
|
|
517
|
+
const safety = {
|
|
518
|
+
safe: safetyChecks.every((r) => r.safe),
|
|
519
|
+
blocked: safetyChecks.flatMap((r) => r.blocked),
|
|
520
|
+
};
|
|
521
|
+
// Determine if guardrails passed overall
|
|
522
|
+
// Fail if: validation errors, safety violations, or very poor quality
|
|
523
|
+
const passed = validation.valid &&
|
|
524
|
+
safety.safe &&
|
|
525
|
+
!quality.shouldCorrect;
|
|
526
|
+
// Auto-clean response if there are fixable issues but otherwise valid
|
|
527
|
+
let cleanedResponse;
|
|
528
|
+
if (!passed || validation.issues.some((i) => i.autoFixed)) {
|
|
529
|
+
cleanedResponse = applyAutoFixes(response, validation.issues);
|
|
530
|
+
if (cleanedResponse === response) {
|
|
531
|
+
// No changes were made - don't return a cleanedResponse
|
|
532
|
+
cleanedResponse = undefined;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (!passed) {
|
|
536
|
+
console.error('[guardrails] Guardrail check failed', {
|
|
537
|
+
validationIssues: validation.issues.length,
|
|
538
|
+
hallucinationFlags: hallucination.flags.length,
|
|
539
|
+
safetyBlocked: safety.blocked.length,
|
|
540
|
+
qualityTier: quality.tier,
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
return {
|
|
544
|
+
passed,
|
|
545
|
+
validation,
|
|
546
|
+
hallucination,
|
|
547
|
+
safety,
|
|
548
|
+
quality,
|
|
549
|
+
cleanedResponse,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Apply automatic fixes to a response based on detected issues.
|
|
554
|
+
* Returns the (potentially modified) response.
|
|
555
|
+
*/
|
|
556
|
+
function applyAutoFixes(response, issues) {
|
|
557
|
+
let cleaned = response;
|
|
558
|
+
for (const issue of issues) {
|
|
559
|
+
if (issue.type === 'format' && issue.message.includes('raw tool call syntax')) {
|
|
560
|
+
// Strip tool call XML/JSON artifacts from the response
|
|
561
|
+
cleaned = cleaned
|
|
562
|
+
.replace(/<tool_call>[\s\S]*?<\/tool_call>/gi, '')
|
|
563
|
+
.replace(/<function_calls>[\s\S]*?<\/function_calls>/gi, '')
|
|
564
|
+
.replace(/\{"type":"tool_use"[\s\S]*?\}/g, '')
|
|
565
|
+
.replace(/\[TOOL_CALL\][\s\S]*?\[\/TOOL_CALL\]/gi, '')
|
|
566
|
+
.trim();
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
return cleaned;
|
|
570
|
+
}
|
|
571
|
+
//# sourceMappingURL=guardrails.js.map
|