clawdbot 2026.1.4-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/CHANGELOG.md +120 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +297 -0
- package/dist/agents/agent-paths.js +17 -0
- package/dist/agents/bash-process-registry.js +126 -0
- package/dist/agents/bash-tools.js +837 -0
- package/dist/agents/clawdbot-tools.js +30 -0
- package/dist/agents/clawdis-tools.js +27 -0
- package/dist/agents/context.js +34 -0
- package/dist/agents/defaults.js +6 -0
- package/dist/agents/model-auth.js +112 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +191 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +116 -0
- package/dist/agents/models-config.js +49 -0
- package/dist/agents/pi-embedded-helpers.js +74 -0
- package/dist/agents/pi-embedded-runner.js +407 -0
- package/dist/agents/pi-embedded-subscribe.js +568 -0
- package/dist/agents/pi-embedded-utils.js +20 -0
- package/dist/agents/pi-embedded.js +1 -0
- package/dist/agents/pi-oauth.js +88 -0
- package/dist/agents/pi-tools.js +433 -0
- package/dist/agents/sandbox-paths.js +68 -0
- package/dist/agents/sandbox.js +644 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +157 -0
- package/dist/agents/skills.js +470 -0
- package/dist/agents/steerable-agent-loop.js +338 -0
- package/dist/agents/steerable-provider-transport.js +48 -0
- package/dist/agents/system-prompt.js +104 -0
- package/dist/agents/tool-display.js +162 -0
- package/dist/agents/tool-images.js +138 -0
- package/dist/agents/tools/browser-tool.js +339 -0
- package/dist/agents/tools/canvas-tool.js +193 -0
- package/dist/agents/tools/common.js +88 -0
- package/dist/agents/tools/cron-tool.js +124 -0
- package/dist/agents/tools/discord-actions-guild.js +186 -0
- package/dist/agents/tools/discord-actions-messaging.js +285 -0
- package/dist/agents/tools/discord-actions-moderation.js +70 -0
- package/dist/agents/tools/discord-actions.js +56 -0
- package/dist/agents/tools/discord-schema.js +199 -0
- package/dist/agents/tools/discord-tool.js +16 -0
- package/dist/agents/tools/gateway-tool.js +46 -0
- package/dist/agents/tools/gateway.js +27 -0
- package/dist/agents/tools/image-tool.js +132 -0
- package/dist/agents/tools/nodes-tool.js +413 -0
- package/dist/agents/tools/nodes-utils.js +92 -0
- package/dist/agents/tools/sessions-helpers.js +88 -0
- package/dist/agents/tools/sessions-history-tool.js +53 -0
- package/dist/agents/tools/sessions-list-tool.js +143 -0
- package/dist/agents/tools/sessions-send-helpers.js +100 -0
- package/dist/agents/tools/sessions-send-tool.js +347 -0
- package/dist/agents/tools/slack-actions.js +129 -0
- package/dist/agents/tools/slack-schema.js +59 -0
- package/dist/agents/tools/slack-tool.js +16 -0
- package/dist/agents/usage.js +39 -0
- package/dist/agents/workspace.js +241 -0
- package/dist/auto-reply/chunk.js +76 -0
- package/dist/auto-reply/envelope.js +38 -0
- package/dist/auto-reply/group-activation.js +20 -0
- package/dist/auto-reply/heartbeat.js +57 -0
- package/dist/auto-reply/model.js +14 -0
- package/dist/auto-reply/reply/abort.js +14 -0
- package/dist/auto-reply/reply/agent-runner.js +371 -0
- package/dist/auto-reply/reply/block-streaming.js +34 -0
- package/dist/auto-reply/reply/body.js +29 -0
- package/dist/auto-reply/reply/commands.js +207 -0
- package/dist/auto-reply/reply/directive-handling.js +361 -0
- package/dist/auto-reply/reply/directives.js +47 -0
- package/dist/auto-reply/reply/followup-runner.js +149 -0
- package/dist/auto-reply/reply/groups.js +91 -0
- package/dist/auto-reply/reply/mentions.js +38 -0
- package/dist/auto-reply/reply/model-selection.js +114 -0
- package/dist/auto-reply/reply/queue.js +399 -0
- package/dist/auto-reply/reply/reply-tags.js +26 -0
- package/dist/auto-reply/reply/session-updates.js +87 -0
- package/dist/auto-reply/reply/session.js +160 -0
- package/dist/auto-reply/reply/typing.js +75 -0
- package/dist/auto-reply/reply.js +535 -0
- package/dist/auto-reply/send-policy.js +28 -0
- package/dist/auto-reply/status.js +158 -0
- package/dist/auto-reply/templating.js +9 -0
- package/dist/auto-reply/thinking.js +49 -0
- package/dist/auto-reply/tokens.js +2 -0
- package/dist/auto-reply/tool-meta.js +74 -0
- package/dist/auto-reply/transcription.js +57 -0
- package/dist/auto-reply/types.js +1 -0
- package/dist/browser/bridge-server.js +37 -0
- package/dist/browser/cdp.js +382 -0
- package/dist/browser/chrome.js +432 -0
- package/dist/browser/client-actions-core.js +67 -0
- package/dist/browser/client-actions-observe.js +24 -0
- package/dist/browser/client-actions-types.js +1 -0
- package/dist/browser/client-actions.js +3 -0
- package/dist/browser/client-fetch.js +43 -0
- package/dist/browser/client.js +105 -0
- package/dist/browser/config.js +140 -0
- package/dist/browser/constants.js +4 -0
- package/dist/browser/profiles-service.js +122 -0
- package/dist/browser/profiles.js +85 -0
- package/dist/browser/pw-ai.js +2 -0
- package/dist/browser/pw-session.js +144 -0
- package/dist/browser/pw-tools-core.js +363 -0
- package/dist/browser/routes/agent.js +535 -0
- package/dist/browser/routes/basic.js +155 -0
- package/dist/browser/routes/index.js +8 -0
- package/dist/browser/routes/tabs.js +105 -0
- package/dist/browser/routes/utils.js +62 -0
- package/dist/browser/screenshot.js +40 -0
- package/dist/browser/server-context.js +377 -0
- package/dist/browser/server.js +81 -0
- package/dist/browser/target-id.js +18 -0
- package/dist/browser/trash.js +21 -0
- package/dist/canvas-host/a2ui/.bundle.hash +1 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
- package/dist/canvas-host/a2ui/index.html +246 -0
- package/dist/canvas-host/a2ui.js +187 -0
- package/dist/canvas-host/server.js +382 -0
- package/dist/cli/browser-cli-actions-input.js +459 -0
- package/dist/cli/browser-cli-actions-observe.js +56 -0
- package/dist/cli/browser-cli-examples.js +31 -0
- package/dist/cli/browser-cli-inspect.js +97 -0
- package/dist/cli/browser-cli-manage.js +286 -0
- package/dist/cli/browser-cli-shared.js +1 -0
- package/dist/cli/browser-cli.js +26 -0
- package/dist/cli/canvas-cli.js +416 -0
- package/dist/cli/cron-cli.js +454 -0
- package/dist/cli/deps.js +17 -0
- package/dist/cli/dns-cli.js +180 -0
- package/dist/cli/gateway-cli.js +489 -0
- package/dist/cli/gateway-rpc.js +20 -0
- package/dist/cli/hooks-cli.js +135 -0
- package/dist/cli/models-cli.js +248 -0
- package/dist/cli/nodes-camera.js +57 -0
- package/dist/cli/nodes-canvas.js +26 -0
- package/dist/cli/nodes-cli.js +946 -0
- package/dist/cli/nodes-screen.js +37 -0
- package/dist/cli/parse-duration.js +20 -0
- package/dist/cli/ports.js +97 -0
- package/dist/cli/program.js +406 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/wait.js +8 -0
- package/dist/commands/agent.js +645 -0
- package/dist/commands/antigravity-oauth.js +327 -0
- package/dist/commands/configure.js +480 -0
- package/dist/commands/doctor.js +484 -0
- package/dist/commands/health.js +108 -0
- package/dist/commands/models/aliases.js +64 -0
- package/dist/commands/models/fallbacks.js +99 -0
- package/dist/commands/models/image-fallbacks.js +99 -0
- package/dist/commands/models/list.js +323 -0
- package/dist/commands/models/scan.js +266 -0
- package/dist/commands/models/set-image.js +23 -0
- package/dist/commands/models/set.js +23 -0
- package/dist/commands/models/shared.js +72 -0
- package/dist/commands/models.js +7 -0
- package/dist/commands/onboard-auth.js +70 -0
- package/dist/commands/onboard-helpers.js +295 -0
- package/dist/commands/onboard-interactive.js +17 -0
- package/dist/commands/onboard-non-interactive.js +202 -0
- package/dist/commands/onboard-providers.js +634 -0
- package/dist/commands/onboard-remote.js +120 -0
- package/dist/commands/onboard-skills.js +148 -0
- package/dist/commands/onboard-types.js +1 -0
- package/dist/commands/onboard.js +12 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +58 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/status.js +207 -0
- package/dist/commands/update.js +16 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +61 -0
- package/dist/config/io.js +147 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +159 -0
- package/dist/config/paths.js +71 -0
- package/dist/config/schema.js +150 -0
- package/dist/config/sessions.js +282 -0
- package/dist/config/talk.js +31 -0
- package/dist/config/types.js +1 -0
- package/dist/config/validation.js +29 -0
- package/dist/config/zod-schema.js +831 -0
- package/dist/control-ui/assets/index-BFID3yAA.css +1 -0
- package/dist/control-ui/assets/index-CE_axlTS.js +2235 -0
- package/dist/control-ui/assets/index-CE_axlTS.js.map +1 -0
- package/dist/control-ui/index.html +15 -0
- package/dist/cron/isolated-agent.js +499 -0
- package/dist/cron/run-log.js +72 -0
- package/dist/cron/schedule.js +24 -0
- package/dist/cron/service.js +471 -0
- package/dist/cron/store.js +43 -0
- package/dist/cron/types.js +1 -0
- package/dist/daemon/constants.js +10 -0
- package/dist/daemon/launchd.js +276 -0
- package/dist/daemon/legacy.js +63 -0
- package/dist/daemon/program-args.js +76 -0
- package/dist/daemon/schtasks.js +257 -0
- package/dist/daemon/service.js +60 -0
- package/dist/daemon/systemd.js +266 -0
- package/dist/discord/index.js +2 -0
- package/dist/discord/monitor.js +1188 -0
- package/dist/discord/probe.js +54 -0
- package/dist/discord/send.js +577 -0
- package/dist/discord/token.js +8 -0
- package/dist/gateway/auth.js +121 -0
- package/dist/gateway/call.js +94 -0
- package/dist/gateway/chat-attachments.js +41 -0
- package/dist/gateway/client.js +180 -0
- package/dist/gateway/config-reload.js +274 -0
- package/dist/gateway/control-ui.js +184 -0
- package/dist/gateway/hooks-mapping.js +282 -0
- package/dist/gateway/hooks.js +168 -0
- package/dist/gateway/net.js +29 -0
- package/dist/gateway/protocol/index.js +61 -0
- package/dist/gateway/protocol/schema.js +560 -0
- package/dist/gateway/server-bridge-subscriptions.js +93 -0
- package/dist/gateway/server-bridge.js +1013 -0
- package/dist/gateway/server-browser.js +12 -0
- package/dist/gateway/server-chat.js +159 -0
- package/dist/gateway/server-constants.js +8 -0
- package/dist/gateway/server-discovery.js +62 -0
- package/dist/gateway/server-http.js +165 -0
- package/dist/gateway/server-methods/agent-job.js +125 -0
- package/dist/gateway/server-methods/agent.js +250 -0
- package/dist/gateway/server-methods/chat.js +200 -0
- package/dist/gateway/server-methods/config.js +50 -0
- package/dist/gateway/server-methods/connect.js +6 -0
- package/dist/gateway/server-methods/cron.js +83 -0
- package/dist/gateway/server-methods/health.js +28 -0
- package/dist/gateway/server-methods/models.js +16 -0
- package/dist/gateway/server-methods/nodes.js +294 -0
- package/dist/gateway/server-methods/providers.js +217 -0
- package/dist/gateway/server-methods/send.js +166 -0
- package/dist/gateway/server-methods/sessions.js +305 -0
- package/dist/gateway/server-methods/skills.js +83 -0
- package/dist/gateway/server-methods/system.js +118 -0
- package/dist/gateway/server-methods/talk.js +22 -0
- package/dist/gateway/server-methods/types.js +1 -0
- package/dist/gateway/server-methods/voicewake.js +30 -0
- package/dist/gateway/server-methods/web.js +58 -0
- package/dist/gateway/server-methods/wizard.js +100 -0
- package/dist/gateway/server-methods.js +53 -0
- package/dist/gateway/server-providers.js +644 -0
- package/dist/gateway/server-shared.js +1 -0
- package/dist/gateway/server-utils.js +35 -0
- package/dist/gateway/server.js +1437 -0
- package/dist/gateway/session-utils.js +216 -0
- package/dist/gateway/ws-log.js +349 -0
- package/dist/gateway/ws-logging.js +8 -0
- package/dist/globals.js +41 -0
- package/dist/hooks/gmail-ops.js +236 -0
- package/dist/hooks/gmail-setup-utils.js +278 -0
- package/dist/hooks/gmail-watcher.js +175 -0
- package/dist/hooks/gmail.js +177 -0
- package/dist/imessage/client.js +165 -0
- package/dist/imessage/index.js +3 -0
- package/dist/imessage/monitor.js +272 -0
- package/dist/imessage/probe.js +26 -0
- package/dist/imessage/send.js +83 -0
- package/dist/imessage/targets.js +176 -0
- package/dist/index.js +50 -0
- package/dist/infra/agent-events.js +46 -0
- package/dist/infra/binaries.js +9 -0
- package/dist/infra/bonjour-discovery.js +163 -0
- package/dist/infra/bonjour.js +200 -0
- package/dist/infra/bridge/server.js +562 -0
- package/dist/infra/canvas-host-url.js +54 -0
- package/dist/infra/env.js +8 -0
- package/dist/infra/errors.js +28 -0
- package/dist/infra/gateway-lock.js +8 -0
- package/dist/infra/heartbeat-events.js +21 -0
- package/dist/infra/heartbeat-runner.js +453 -0
- package/dist/infra/heartbeat-wake.js +61 -0
- package/dist/infra/is-main.js +37 -0
- package/dist/infra/machine-name.js +40 -0
- package/dist/infra/node-pairing.js +211 -0
- package/dist/infra/pam.js +42 -0
- package/dist/infra/path-env.js +92 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/restart.js +29 -0
- package/dist/infra/retry.js +16 -0
- package/dist/infra/runtime-guard.js +59 -0
- package/dist/infra/system-events.js +44 -0
- package/dist/infra/system-presence.js +216 -0
- package/dist/infra/tailnet.js +46 -0
- package/dist/infra/tailscale.js +149 -0
- package/dist/infra/voicewake.js +77 -0
- package/dist/infra/widearea-dns.js +123 -0
- package/dist/infra/ws.js +13 -0
- package/dist/logger.js +52 -0
- package/dist/logging.js +490 -0
- package/dist/macos/gateway-daemon.js +141 -0
- package/dist/macos/relay.js +46 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +121 -0
- package/dist/media/mime.js +115 -0
- package/dist/media/parse.js +81 -0
- package/dist/media/server.js +64 -0
- package/dist/media/store.js +139 -0
- package/dist/process/command-queue.js +97 -0
- package/dist/process/exec.js +75 -0
- package/dist/protocol.schema.json +2918 -0
- package/dist/provider-web.js +8 -0
- package/dist/providers/web/index.js +2 -0
- package/dist/runtime.js +8 -0
- package/dist/sessions/send-policy.js +68 -0
- package/dist/signal/client.js +134 -0
- package/dist/signal/daemon.js +69 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/monitor.js +336 -0
- package/dist/signal/probe.js +46 -0
- package/dist/signal/send.js +91 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1029 -0
- package/dist/slack/probe.js +47 -0
- package/dist/slack/send.js +131 -0
- package/dist/slack/token.js +10 -0
- package/dist/telegram/bot.js +394 -0
- package/dist/telegram/download.js +34 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/monitor.js +47 -0
- package/dist/telegram/probe.js +63 -0
- package/dist/telegram/proxy.js +9 -0
- package/dist/telegram/send.js +138 -0
- package/dist/telegram/token.js +30 -0
- package/dist/telegram/webhook-set.js +12 -0
- package/dist/telegram/webhook.js +56 -0
- package/dist/tui/commands.js +74 -0
- package/dist/tui/components/assistant-message.js +16 -0
- package/dist/tui/components/chat-log.js +92 -0
- package/dist/tui/components/custom-editor.js +53 -0
- package/dist/tui/components/selectors.js +8 -0
- package/dist/tui/components/tool-execution.js +111 -0
- package/dist/tui/components/user-message.js +17 -0
- package/dist/tui/gateway-chat.js +140 -0
- package/dist/tui/layout.js +41 -0
- package/dist/tui/message-list.js +57 -0
- package/dist/tui/theme/theme.js +80 -0
- package/dist/tui/theme.js +25 -0
- package/dist/tui/tui.js +708 -0
- package/dist/utils.js +133 -0
- package/dist/version.js +18 -0
- package/dist/web/active-listener.js +7 -0
- package/dist/web/auto-reply.js +1203 -0
- package/dist/web/inbound.js +481 -0
- package/dist/web/login-qr.js +204 -0
- package/dist/web/login.js +59 -0
- package/dist/web/media.js +148 -0
- package/dist/web/outbound.js +67 -0
- package/dist/web/qr-image.js +97 -0
- package/dist/web/reconnect.js +60 -0
- package/dist/web/reply-heartbeat-wake.js +61 -0
- package/dist/web/session.js +346 -0
- package/dist/wizard/clack-prompter.js +56 -0
- package/dist/wizard/onboarding.js +452 -0
- package/dist/wizard/prompts.js +6 -0
- package/dist/wizard/session.js +203 -0
- package/docs/AGENTS.default.md +116 -0
- package/docs/CNAME +1 -0
- package/docs/RELEASING.md +64 -0
- package/docs/_config.yml +51 -0
- package/docs/_layouts/default.html +145 -0
- package/docs/agent-send.md +21 -0
- package/docs/agent.md +104 -0
- package/docs/android/connect.md +131 -0
- package/docs/architecture.md +89 -0
- package/docs/assets/markdown.css +130 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/terminal.css +497 -0
- package/docs/assets/theme.js +55 -0
- package/docs/audio.md +50 -0
- package/docs/background-process.md +74 -0
- package/docs/bash.md +32 -0
- package/docs/bonjour.md +159 -0
- package/docs/browser.md +289 -0
- package/docs/camera.md +152 -0
- package/docs/clawd.md +199 -0
- package/docs/clawdbot-mac.md +104 -0
- package/docs/configuration.md +1177 -0
- package/docs/control-api.md +49 -0
- package/docs/control-ui.md +83 -0
- package/docs/cron.md +374 -0
- package/docs/dashboard.md +17 -0
- package/docs/device-models.md +46 -0
- package/docs/discord.md +293 -0
- package/docs/discovery.md +112 -0
- package/docs/docker.md +251 -0
- package/docs/docs.json +86 -0
- package/docs/doctor.md +47 -0
- package/docs/elevated.md +31 -0
- package/docs/faq.md +640 -0
- package/docs/gateway/pairing.md +109 -0
- package/docs/gateway-lock.md +28 -0
- package/docs/gateway.md +174 -0
- package/docs/gmail-pubsub.md +191 -0
- package/docs/grammy.md +27 -0
- package/docs/group-messages.md +71 -0
- package/docs/groups.md +78 -0
- package/docs/health.md +28 -0
- package/docs/heartbeat.md +64 -0
- package/docs/images.md +52 -0
- package/docs/imessage.md +63 -0
- package/docs/index.md +182 -0
- package/docs/ios/connect.md +177 -0
- package/docs/ios/spec.md +236 -0
- package/docs/location-command.md +95 -0
- package/docs/logging.md +99 -0
- package/docs/lore.md +131 -0
- package/docs/mac/bun.md +133 -0
- package/docs/mac/canvas.md +161 -0
- package/docs/mac/child-process.md +72 -0
- package/docs/mac/dev-setup.md +81 -0
- package/docs/mac/health.md +28 -0
- package/docs/mac/icon.md +26 -0
- package/docs/mac/logging.md +51 -0
- package/docs/mac/menu-bar.md +69 -0
- package/docs/mac/peekaboo.md +170 -0
- package/docs/mac/permissions.md +40 -0
- package/docs/mac/release.md +76 -0
- package/docs/mac/remote.md +57 -0
- package/docs/mac/signing.md +41 -0
- package/docs/mac/skills.md +27 -0
- package/docs/mac/voice-overlay.md +52 -0
- package/docs/mac/voicewake.md +56 -0
- package/docs/mac/webchat.md +27 -0
- package/docs/mac/xpc.md +40 -0
- package/docs/models.md +90 -0
- package/docs/nix.md +49 -0
- package/docs/nodes.md +157 -0
- package/docs/onboarding-config-protocol.md +29 -0
- package/docs/onboarding.md +185 -0
- package/docs/presence.md +133 -0
- package/docs/queue.md +78 -0
- package/docs/refactor/browser-control-simplification.md +58 -0
- package/docs/refactor/canvas-a2ui.md +93 -0
- package/docs/refactor/cli-unification.md +64 -0
- package/docs/refactor/gateway-client.md +31 -0
- package/docs/refactor/gateway.md +99 -0
- package/docs/refactor/new-arch.md +171 -0
- package/docs/refactor/tui.md +26 -0
- package/docs/refactor/web-gateway-troubleshooting.md +37 -0
- package/docs/refactor/webagent-session.md +46 -0
- package/docs/remote-gateway-readme.md +148 -0
- package/docs/remote.md +66 -0
- package/docs/research/memory.md +227 -0
- package/docs/rpc.md +35 -0
- package/docs/security.md +168 -0
- package/docs/session-tool.md +119 -0
- package/docs/session.md +84 -0
- package/docs/sessions.md +8 -0
- package/docs/setup.md +118 -0
- package/docs/signal.md +113 -0
- package/docs/skills-config.md +58 -0
- package/docs/skills.md +149 -0
- package/docs/slack.md +158 -0
- package/docs/surface.md +20 -0
- package/docs/tailscale.md +71 -0
- package/docs/talk.md +79 -0
- package/docs/telegram.md +90 -0
- package/docs/templates/AGENTS.md +126 -0
- package/docs/templates/BOOTSTRAP.md +53 -0
- package/docs/templates/IDENTITY.md +17 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +22 -0
- package/docs/test.md +35 -0
- package/docs/thinking.md +46 -0
- package/docs/tools.md +248 -0
- package/docs/troubleshooting.md +227 -0
- package/docs/tui.md +69 -0
- package/docs/typebox.md +42 -0
- package/docs/voicewake.md +61 -0
- package/docs/web.md +115 -0
- package/docs/webchat.md +34 -0
- package/docs/webhook.md +132 -0
- package/docs/whatsapp-clawd.jpg +0 -0
- package/docs/whatsapp.md +142 -0
- package/docs/wizard.md +158 -0
- package/package.json +186 -0
- package/skills/apple-notes/SKILL.md +50 -0
- package/skills/apple-reminders/SKILL.md +67 -0
- package/skills/bear-notes/SKILL.md +79 -0
- package/skills/bird/SKILL.md +25 -0
- package/skills/blogwatcher/SKILL.md +46 -0
- package/skills/blucli/SKILL.md +27 -0
- package/skills/brave-search/SKILL.md +30 -0
- package/skills/brave-search/scripts/content.mjs +53 -0
- package/skills/brave-search/scripts/search.mjs +79 -0
- package/skills/camsnap/SKILL.md +25 -0
- package/skills/clawdhub/SKILL.md +53 -0
- package/skills/coding-agent/SKILL.md +275 -0
- package/skills/discord/SKILL.md +369 -0
- package/skills/eightctl/SKILL.md +29 -0
- package/skills/food-order/SKILL.md +41 -0
- package/skills/gemini/SKILL.md +23 -0
- package/skills/gifgrep/SKILL.md +47 -0
- package/skills/github/SKILL.md +47 -0
- package/skills/gog/SKILL.md +36 -0
- package/skills/goplaces/SKILL.md +30 -0
- package/skills/imsg/SKILL.md +25 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +91 -0
- package/skills/local-places/pyproject.toml +27 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +38 -0
- package/skills/nano-banana-pro/SKILL.md +29 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
- package/skills/nano-pdf/SKILL.md +20 -0
- package/skills/notion/SKILL.md +156 -0
- package/skills/obsidian/SKILL.md +55 -0
- package/skills/openai-image-gen/SKILL.md +31 -0
- package/skills/openai-image-gen/scripts/gen.py +173 -0
- package/skills/openai-whisper/SKILL.md +19 -0
- package/skills/openai-whisper-api/SKILL.md +43 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +30 -0
- package/skills/oracle/SKILL.md +105 -0
- package/skills/ordercli/SKILL.md +47 -0
- package/skills/peekaboo/SKILL.md +153 -0
- package/skills/qmd/SKILL.md +26 -0
- package/skills/sag/SKILL.md +62 -0
- package/skills/slack/SKILL.md +143 -0
- package/skills/songsee/SKILL.md +29 -0
- package/skills/sonoscli/SKILL.md +26 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/summarize/SKILL.md +49 -0
- package/skills/things-mac/SKILL.md +61 -0
- package/skills/tmux/SKILL.md +121 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +84 -0
- package/skills/video-frames/SKILL.md +29 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/wacli/SKILL.md +42 -0
- package/skills/weather/SKILL.md +49 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { formatSkillsForPrompt, loadSkillsFromDir, } from "@mariozechner/pi-coding-agent";
|
|
5
|
+
import { CONFIG_DIR, resolveUserPath } from "../utils.js";
|
|
6
|
+
function resolveBundledSkillsDir() {
|
|
7
|
+
const override = process.env.CLAWDBOT_BUNDLED_SKILLS_DIR?.trim();
|
|
8
|
+
if (override)
|
|
9
|
+
return override;
|
|
10
|
+
// bun --compile: ship a sibling `skills/` next to the executable.
|
|
11
|
+
try {
|
|
12
|
+
const execDir = path.dirname(process.execPath);
|
|
13
|
+
const sibling = path.join(execDir, "skills");
|
|
14
|
+
if (fs.existsSync(sibling))
|
|
15
|
+
return sibling;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// ignore
|
|
19
|
+
}
|
|
20
|
+
// npm/dev: resolve `<packageRoot>/skills` relative to this module.
|
|
21
|
+
try {
|
|
22
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
const root = path.resolve(moduleDir, "..", "..");
|
|
24
|
+
const candidate = path.join(root, "skills");
|
|
25
|
+
if (fs.existsSync(candidate))
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// ignore
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
function getFrontmatterValue(frontmatter, key) {
|
|
34
|
+
const raw = frontmatter[key];
|
|
35
|
+
return typeof raw === "string" ? raw : undefined;
|
|
36
|
+
}
|
|
37
|
+
function stripQuotes(value) {
|
|
38
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
39
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
40
|
+
return value.slice(1, -1);
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function parseFrontmatter(content) {
|
|
45
|
+
const frontmatter = {};
|
|
46
|
+
const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
47
|
+
if (!normalized.startsWith("---"))
|
|
48
|
+
return frontmatter;
|
|
49
|
+
const endIndex = normalized.indexOf("\n---", 3);
|
|
50
|
+
if (endIndex === -1)
|
|
51
|
+
return frontmatter;
|
|
52
|
+
const block = normalized.slice(4, endIndex);
|
|
53
|
+
for (const line of block.split("\n")) {
|
|
54
|
+
const match = line.match(/^([\w-]+):\s*(.*)$/);
|
|
55
|
+
if (!match)
|
|
56
|
+
continue;
|
|
57
|
+
const key = match[1];
|
|
58
|
+
const value = stripQuotes(match[2].trim());
|
|
59
|
+
if (!key || !value)
|
|
60
|
+
continue;
|
|
61
|
+
frontmatter[key] = value;
|
|
62
|
+
}
|
|
63
|
+
return frontmatter;
|
|
64
|
+
}
|
|
65
|
+
function normalizeStringList(input) {
|
|
66
|
+
if (!input)
|
|
67
|
+
return [];
|
|
68
|
+
if (Array.isArray(input)) {
|
|
69
|
+
return input.map((value) => String(value).trim()).filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
if (typeof input === "string") {
|
|
72
|
+
return input
|
|
73
|
+
.split(",")
|
|
74
|
+
.map((value) => value.trim())
|
|
75
|
+
.filter(Boolean);
|
|
76
|
+
}
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
function parseInstallSpec(input) {
|
|
80
|
+
if (!input || typeof input !== "object")
|
|
81
|
+
return undefined;
|
|
82
|
+
const raw = input;
|
|
83
|
+
const kindRaw = typeof raw.kind === "string"
|
|
84
|
+
? raw.kind
|
|
85
|
+
: typeof raw.type === "string"
|
|
86
|
+
? raw.type
|
|
87
|
+
: "";
|
|
88
|
+
const kind = kindRaw.trim().toLowerCase();
|
|
89
|
+
if (kind !== "brew" && kind !== "node" && kind !== "go" && kind !== "uv") {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const spec = {
|
|
93
|
+
kind: kind,
|
|
94
|
+
};
|
|
95
|
+
if (typeof raw.id === "string")
|
|
96
|
+
spec.id = raw.id;
|
|
97
|
+
if (typeof raw.label === "string")
|
|
98
|
+
spec.label = raw.label;
|
|
99
|
+
const bins = normalizeStringList(raw.bins);
|
|
100
|
+
if (bins.length > 0)
|
|
101
|
+
spec.bins = bins;
|
|
102
|
+
if (typeof raw.formula === "string")
|
|
103
|
+
spec.formula = raw.formula;
|
|
104
|
+
if (typeof raw.package === "string")
|
|
105
|
+
spec.package = raw.package;
|
|
106
|
+
if (typeof raw.module === "string")
|
|
107
|
+
spec.module = raw.module;
|
|
108
|
+
return spec;
|
|
109
|
+
}
|
|
110
|
+
function isTruthy(value) {
|
|
111
|
+
if (value === undefined || value === null)
|
|
112
|
+
return false;
|
|
113
|
+
if (typeof value === "boolean")
|
|
114
|
+
return value;
|
|
115
|
+
if (typeof value === "number")
|
|
116
|
+
return value !== 0;
|
|
117
|
+
if (typeof value === "string")
|
|
118
|
+
return value.trim().length > 0;
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
const DEFAULT_CONFIG_VALUES = {
|
|
122
|
+
"browser.enabled": true,
|
|
123
|
+
};
|
|
124
|
+
export function resolveSkillsInstallPreferences(config) {
|
|
125
|
+
const raw = config?.skills?.install;
|
|
126
|
+
const preferBrew = raw?.preferBrew ?? true;
|
|
127
|
+
const managerRaw = typeof raw?.nodeManager === "string" ? raw.nodeManager.trim() : "";
|
|
128
|
+
const manager = managerRaw.toLowerCase();
|
|
129
|
+
const nodeManager = manager === "pnpm" ||
|
|
130
|
+
manager === "yarn" ||
|
|
131
|
+
manager === "bun" ||
|
|
132
|
+
manager === "npm"
|
|
133
|
+
? manager
|
|
134
|
+
: "npm";
|
|
135
|
+
return { preferBrew, nodeManager };
|
|
136
|
+
}
|
|
137
|
+
export function resolveRuntimePlatform() {
|
|
138
|
+
return process.platform;
|
|
139
|
+
}
|
|
140
|
+
export function resolveConfigPath(config, pathStr) {
|
|
141
|
+
const parts = pathStr.split(".").filter(Boolean);
|
|
142
|
+
let current = config;
|
|
143
|
+
for (const part of parts) {
|
|
144
|
+
if (typeof current !== "object" || current === null)
|
|
145
|
+
return undefined;
|
|
146
|
+
current = current[part];
|
|
147
|
+
}
|
|
148
|
+
return current;
|
|
149
|
+
}
|
|
150
|
+
export function isConfigPathTruthy(config, pathStr) {
|
|
151
|
+
const value = resolveConfigPath(config, pathStr);
|
|
152
|
+
if (value === undefined && pathStr in DEFAULT_CONFIG_VALUES) {
|
|
153
|
+
return DEFAULT_CONFIG_VALUES[pathStr] === true;
|
|
154
|
+
}
|
|
155
|
+
return isTruthy(value);
|
|
156
|
+
}
|
|
157
|
+
export function resolveSkillConfig(config, skillKey) {
|
|
158
|
+
const skills = config?.skills?.entries;
|
|
159
|
+
if (!skills || typeof skills !== "object")
|
|
160
|
+
return undefined;
|
|
161
|
+
const entry = skills[skillKey];
|
|
162
|
+
if (!entry || typeof entry !== "object")
|
|
163
|
+
return undefined;
|
|
164
|
+
return entry;
|
|
165
|
+
}
|
|
166
|
+
function normalizeAllowlist(input) {
|
|
167
|
+
if (!input)
|
|
168
|
+
return undefined;
|
|
169
|
+
if (!Array.isArray(input))
|
|
170
|
+
return undefined;
|
|
171
|
+
const normalized = input.map((entry) => String(entry).trim()).filter(Boolean);
|
|
172
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
173
|
+
}
|
|
174
|
+
function isBundledSkill(entry) {
|
|
175
|
+
return entry.skill.source === "clawdbot-bundled";
|
|
176
|
+
}
|
|
177
|
+
export function isBundledSkillAllowed(entry, allowlist) {
|
|
178
|
+
if (!allowlist || allowlist.length === 0)
|
|
179
|
+
return true;
|
|
180
|
+
if (!isBundledSkill(entry))
|
|
181
|
+
return true;
|
|
182
|
+
const key = resolveSkillKey(entry.skill, entry);
|
|
183
|
+
return allowlist.includes(key) || allowlist.includes(entry.skill.name);
|
|
184
|
+
}
|
|
185
|
+
export function hasBinary(bin) {
|
|
186
|
+
const pathEnv = process.env.PATH ?? "";
|
|
187
|
+
const parts = pathEnv.split(path.delimiter).filter(Boolean);
|
|
188
|
+
for (const part of parts) {
|
|
189
|
+
const candidate = path.join(part, bin);
|
|
190
|
+
try {
|
|
191
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// keep scanning
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
function resolveClawdbotMetadata(frontmatter) {
|
|
201
|
+
const raw = getFrontmatterValue(frontmatter, "metadata");
|
|
202
|
+
if (!raw)
|
|
203
|
+
return undefined;
|
|
204
|
+
try {
|
|
205
|
+
const parsed = JSON.parse(raw);
|
|
206
|
+
if (!parsed || typeof parsed !== "object")
|
|
207
|
+
return undefined;
|
|
208
|
+
const clawdbot = parsed.clawdbot;
|
|
209
|
+
if (!clawdbot || typeof clawdbot !== "object")
|
|
210
|
+
return undefined;
|
|
211
|
+
const clawdbotObj = clawdbot;
|
|
212
|
+
const requiresRaw = typeof clawdbotObj.requires === "object" && clawdbotObj.requires !== null
|
|
213
|
+
? clawdbotObj.requires
|
|
214
|
+
: undefined;
|
|
215
|
+
const installRaw = Array.isArray(clawdbotObj.install)
|
|
216
|
+
? clawdbotObj.install
|
|
217
|
+
: [];
|
|
218
|
+
const install = installRaw
|
|
219
|
+
.map((entry) => parseInstallSpec(entry))
|
|
220
|
+
.filter((entry) => Boolean(entry));
|
|
221
|
+
const osRaw = normalizeStringList(clawdbotObj.os);
|
|
222
|
+
return {
|
|
223
|
+
always: typeof clawdbotObj.always === "boolean"
|
|
224
|
+
? clawdbotObj.always
|
|
225
|
+
: undefined,
|
|
226
|
+
emoji: typeof clawdbotObj.emoji === "string" ? clawdbotObj.emoji : undefined,
|
|
227
|
+
homepage: typeof clawdbotObj.homepage === "string"
|
|
228
|
+
? clawdbotObj.homepage
|
|
229
|
+
: undefined,
|
|
230
|
+
skillKey: typeof clawdbotObj.skillKey === "string"
|
|
231
|
+
? clawdbotObj.skillKey
|
|
232
|
+
: undefined,
|
|
233
|
+
primaryEnv: typeof clawdbotObj.primaryEnv === "string"
|
|
234
|
+
? clawdbotObj.primaryEnv
|
|
235
|
+
: undefined,
|
|
236
|
+
os: osRaw.length > 0 ? osRaw : undefined,
|
|
237
|
+
requires: requiresRaw
|
|
238
|
+
? {
|
|
239
|
+
bins: normalizeStringList(requiresRaw.bins),
|
|
240
|
+
anyBins: normalizeStringList(requiresRaw.anyBins),
|
|
241
|
+
env: normalizeStringList(requiresRaw.env),
|
|
242
|
+
config: normalizeStringList(requiresRaw.config),
|
|
243
|
+
}
|
|
244
|
+
: undefined,
|
|
245
|
+
install: install.length > 0 ? install : undefined,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function resolveSkillKey(skill, entry) {
|
|
253
|
+
return entry?.clawdbot?.skillKey ?? skill.name;
|
|
254
|
+
}
|
|
255
|
+
function shouldIncludeSkill(params) {
|
|
256
|
+
const { entry, config } = params;
|
|
257
|
+
const skillKey = resolveSkillKey(entry.skill, entry);
|
|
258
|
+
const skillConfig = resolveSkillConfig(config, skillKey);
|
|
259
|
+
const allowBundled = normalizeAllowlist(config?.skills?.allowBundled);
|
|
260
|
+
const osList = entry.clawdbot?.os ?? [];
|
|
261
|
+
if (skillConfig?.enabled === false)
|
|
262
|
+
return false;
|
|
263
|
+
if (!isBundledSkillAllowed(entry, allowBundled))
|
|
264
|
+
return false;
|
|
265
|
+
if (osList.length > 0 && !osList.includes(resolveRuntimePlatform())) {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
if (entry.clawdbot?.always === true) {
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
const requiredBins = entry.clawdbot?.requires?.bins ?? [];
|
|
272
|
+
if (requiredBins.length > 0) {
|
|
273
|
+
for (const bin of requiredBins) {
|
|
274
|
+
if (!hasBinary(bin))
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const requiredAnyBins = entry.clawdbot?.requires?.anyBins ?? [];
|
|
279
|
+
if (requiredAnyBins.length > 0) {
|
|
280
|
+
const anyFound = requiredAnyBins.some((bin) => hasBinary(bin));
|
|
281
|
+
if (!anyFound)
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
const requiredEnv = entry.clawdbot?.requires?.env ?? [];
|
|
285
|
+
if (requiredEnv.length > 0) {
|
|
286
|
+
for (const envName of requiredEnv) {
|
|
287
|
+
if (process.env[envName])
|
|
288
|
+
continue;
|
|
289
|
+
if (skillConfig?.env?.[envName])
|
|
290
|
+
continue;
|
|
291
|
+
if (skillConfig?.apiKey && entry.clawdbot?.primaryEnv === envName) {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const requiredConfig = entry.clawdbot?.requires?.config ?? [];
|
|
298
|
+
if (requiredConfig.length > 0) {
|
|
299
|
+
for (const configPath of requiredConfig) {
|
|
300
|
+
if (!isConfigPathTruthy(config, configPath))
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
function filterSkillEntries(entries, config) {
|
|
307
|
+
return entries.filter((entry) => shouldIncludeSkill({ entry, config }));
|
|
308
|
+
}
|
|
309
|
+
export function applySkillEnvOverrides(params) {
|
|
310
|
+
const { skills, config } = params;
|
|
311
|
+
const updates = [];
|
|
312
|
+
for (const entry of skills) {
|
|
313
|
+
const skillKey = resolveSkillKey(entry.skill, entry);
|
|
314
|
+
const skillConfig = resolveSkillConfig(config, skillKey);
|
|
315
|
+
if (!skillConfig)
|
|
316
|
+
continue;
|
|
317
|
+
if (skillConfig.env) {
|
|
318
|
+
for (const [envKey, envValue] of Object.entries(skillConfig.env)) {
|
|
319
|
+
if (!envValue || process.env[envKey])
|
|
320
|
+
continue;
|
|
321
|
+
updates.push({ key: envKey, prev: process.env[envKey] });
|
|
322
|
+
process.env[envKey] = envValue;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const primaryEnv = entry.clawdbot?.primaryEnv;
|
|
326
|
+
if (primaryEnv && skillConfig.apiKey && !process.env[primaryEnv]) {
|
|
327
|
+
updates.push({ key: primaryEnv, prev: process.env[primaryEnv] });
|
|
328
|
+
process.env[primaryEnv] = skillConfig.apiKey;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return () => {
|
|
332
|
+
for (const update of updates) {
|
|
333
|
+
if (update.prev === undefined)
|
|
334
|
+
delete process.env[update.key];
|
|
335
|
+
else
|
|
336
|
+
process.env[update.key] = update.prev;
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
export function applySkillEnvOverridesFromSnapshot(params) {
|
|
341
|
+
const { snapshot, config } = params;
|
|
342
|
+
if (!snapshot)
|
|
343
|
+
return () => { };
|
|
344
|
+
const updates = [];
|
|
345
|
+
for (const skill of snapshot.skills) {
|
|
346
|
+
const skillConfig = resolveSkillConfig(config, skill.name);
|
|
347
|
+
if (!skillConfig)
|
|
348
|
+
continue;
|
|
349
|
+
if (skillConfig.env) {
|
|
350
|
+
for (const [envKey, envValue] of Object.entries(skillConfig.env)) {
|
|
351
|
+
if (!envValue || process.env[envKey])
|
|
352
|
+
continue;
|
|
353
|
+
updates.push({ key: envKey, prev: process.env[envKey] });
|
|
354
|
+
process.env[envKey] = envValue;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (skill.primaryEnv &&
|
|
358
|
+
skillConfig.apiKey &&
|
|
359
|
+
!process.env[skill.primaryEnv]) {
|
|
360
|
+
updates.push({
|
|
361
|
+
key: skill.primaryEnv,
|
|
362
|
+
prev: process.env[skill.primaryEnv],
|
|
363
|
+
});
|
|
364
|
+
process.env[skill.primaryEnv] = skillConfig.apiKey;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return () => {
|
|
368
|
+
for (const update of updates) {
|
|
369
|
+
if (update.prev === undefined)
|
|
370
|
+
delete process.env[update.key];
|
|
371
|
+
else
|
|
372
|
+
process.env[update.key] = update.prev;
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
function loadSkillEntries(workspaceDir, opts) {
|
|
377
|
+
const loadSkills = (params) => {
|
|
378
|
+
const loaded = loadSkillsFromDir(params);
|
|
379
|
+
if (Array.isArray(loaded))
|
|
380
|
+
return loaded;
|
|
381
|
+
if (loaded &&
|
|
382
|
+
typeof loaded === "object" &&
|
|
383
|
+
"skills" in loaded &&
|
|
384
|
+
Array.isArray(loaded.skills)) {
|
|
385
|
+
return loaded.skills;
|
|
386
|
+
}
|
|
387
|
+
return [];
|
|
388
|
+
};
|
|
389
|
+
const managedSkillsDir = opts?.managedSkillsDir ?? path.join(CONFIG_DIR, "skills");
|
|
390
|
+
const workspaceSkillsDir = path.join(workspaceDir, "skills");
|
|
391
|
+
const bundledSkillsDir = opts?.bundledSkillsDir ?? resolveBundledSkillsDir();
|
|
392
|
+
const extraDirsRaw = opts?.config?.skills?.load?.extraDirs ?? [];
|
|
393
|
+
const extraDirs = extraDirsRaw
|
|
394
|
+
.map((d) => (typeof d === "string" ? d.trim() : ""))
|
|
395
|
+
.filter(Boolean);
|
|
396
|
+
const bundledSkills = bundledSkillsDir
|
|
397
|
+
? loadSkills({
|
|
398
|
+
dir: bundledSkillsDir,
|
|
399
|
+
source: "clawdbot-bundled",
|
|
400
|
+
})
|
|
401
|
+
: [];
|
|
402
|
+
const extraSkills = extraDirs.flatMap((dir) => {
|
|
403
|
+
const resolved = resolveUserPath(dir);
|
|
404
|
+
return loadSkills({
|
|
405
|
+
dir: resolved,
|
|
406
|
+
source: "clawdbot-extra",
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
const managedSkills = loadSkills({
|
|
410
|
+
dir: managedSkillsDir,
|
|
411
|
+
source: "clawdbot-managed",
|
|
412
|
+
});
|
|
413
|
+
const workspaceSkills = loadSkills({
|
|
414
|
+
dir: workspaceSkillsDir,
|
|
415
|
+
source: "clawdbot-workspace",
|
|
416
|
+
});
|
|
417
|
+
const merged = new Map();
|
|
418
|
+
// Precedence: extra < bundled < managed < workspace
|
|
419
|
+
for (const skill of extraSkills)
|
|
420
|
+
merged.set(skill.name, skill);
|
|
421
|
+
for (const skill of bundledSkills)
|
|
422
|
+
merged.set(skill.name, skill);
|
|
423
|
+
for (const skill of managedSkills)
|
|
424
|
+
merged.set(skill.name, skill);
|
|
425
|
+
for (const skill of workspaceSkills)
|
|
426
|
+
merged.set(skill.name, skill);
|
|
427
|
+
const skillEntries = Array.from(merged.values()).map((skill) => {
|
|
428
|
+
let frontmatter = {};
|
|
429
|
+
try {
|
|
430
|
+
const raw = fs.readFileSync(skill.filePath, "utf-8");
|
|
431
|
+
frontmatter = parseFrontmatter(raw);
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
// ignore malformed skills
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
skill,
|
|
438
|
+
frontmatter,
|
|
439
|
+
clawdbot: resolveClawdbotMetadata(frontmatter),
|
|
440
|
+
};
|
|
441
|
+
});
|
|
442
|
+
return skillEntries;
|
|
443
|
+
}
|
|
444
|
+
export function buildWorkspaceSkillSnapshot(workspaceDir, opts) {
|
|
445
|
+
const skillEntries = opts?.entries ?? loadSkillEntries(workspaceDir, opts);
|
|
446
|
+
const eligible = filterSkillEntries(skillEntries, opts?.config);
|
|
447
|
+
const resolvedSkills = eligible.map((entry) => entry.skill);
|
|
448
|
+
return {
|
|
449
|
+
prompt: formatSkillsForPrompt(resolvedSkills),
|
|
450
|
+
skills: eligible.map((entry) => ({
|
|
451
|
+
name: entry.skill.name,
|
|
452
|
+
primaryEnv: entry.clawdbot?.primaryEnv,
|
|
453
|
+
})),
|
|
454
|
+
resolvedSkills,
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
export function buildWorkspaceSkillsPrompt(workspaceDir, opts) {
|
|
458
|
+
const skillEntries = opts?.entries ?? loadSkillEntries(workspaceDir, opts);
|
|
459
|
+
const eligible = filterSkillEntries(skillEntries, opts?.config);
|
|
460
|
+
return formatSkillsForPrompt(eligible.map((entry) => entry.skill));
|
|
461
|
+
}
|
|
462
|
+
export function loadWorkspaceSkillEntries(workspaceDir, opts) {
|
|
463
|
+
return loadSkillEntries(workspaceDir, opts);
|
|
464
|
+
}
|
|
465
|
+
export function filterWorkspaceSkillEntries(entries, config) {
|
|
466
|
+
return filterSkillEntries(entries, config);
|
|
467
|
+
}
|
|
468
|
+
export function resolveBundledAllowlist(config) {
|
|
469
|
+
return normalizeAllowlist(config?.skills?.allowBundled);
|
|
470
|
+
}
|