openclaw-node-harness 2.0.0
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/LICENSE +21 -0
- package/README.md +184 -0
- package/bin/discord-read.js +228 -0
- package/bin/fleet-deploy.js +365 -0
- package/bin/lane-watchdog.js +232 -0
- package/bin/mesh-agent.js +714 -0
- package/bin/mesh-bridge.js +535 -0
- package/bin/mesh-deploy-listener.js +322 -0
- package/bin/mesh-deploy.js +1048 -0
- package/bin/mesh-health-publisher.js +247 -0
- package/bin/mesh-task-daemon.js +451 -0
- package/bin/mesh-tool-discord.js +293 -0
- package/bin/mesh.js +649 -0
- package/boot/manifest.yaml +187 -0
- package/cli.js +35 -0
- package/config/daemon.json.template +16 -0
- package/config/obsidian-sync.json.template +39 -0
- package/config/openclaw.json.template +124 -0
- package/config/transcript-sources.json.template +22 -0
- package/identity/AGENTS.md +201 -0
- package/identity/CLAUDE.md +64 -0
- package/identity/DELEGATION.md +304 -0
- package/identity/HEARTBEAT.md +163 -0
- package/identity/MEMORY_SPEC.md +368 -0
- package/identity/PRINCIPLES.md +81 -0
- package/identity/SOUL.md +48 -0
- package/identity/TOOLS.md +47 -0
- package/install.sh +895 -0
- package/lib/agent-activity.js +390 -0
- package/lib/kanban-io.js +352 -0
- package/lib/mesh-registry.js +194 -0
- package/lib/mesh-roles.js +13 -0
- package/lib/mesh-tasks.js +306 -0
- package/lib/nats-resolve.js +108 -0
- package/mission-control/README.md +36 -0
- package/mission-control/drizzle/0000_simple_silhouette.sql +62 -0
- package/mission-control/drizzle/meta/0000_snapshot.json +413 -0
- package/mission-control/drizzle/meta/_journal.json +13 -0
- package/mission-control/drizzle.config.ts +13 -0
- package/mission-control/eslint.config.mjs +18 -0
- package/mission-control/next.config.ts +7 -0
- package/mission-control/package-lock.json +10518 -0
- package/mission-control/package.json +49 -0
- package/mission-control/postcss.config.mjs +7 -0
- package/mission-control/public/file.svg +1 -0
- package/mission-control/public/globe.svg +1 -0
- package/mission-control/public/next.svg +1 -0
- package/mission-control/public/vercel.svg +1 -0
- package/mission-control/public/window.svg +1 -0
- package/mission-control/scripts/enrich-descriptions.js +193 -0
- package/mission-control/scripts/gen-chronology.js +102 -0
- package/mission-control/scripts/import-pipeline-v2.js +523 -0
- package/mission-control/scripts/import-pipeline.js +295 -0
- package/mission-control/src/app/api/activity/live/route.ts +27 -0
- package/mission-control/src/app/api/activity/route.ts +47 -0
- package/mission-control/src/app/api/burndown/route.ts +112 -0
- package/mission-control/src/app/api/critical-path/route.ts +159 -0
- package/mission-control/src/app/api/dependencies/route.ts +176 -0
- package/mission-control/src/app/api/memory/categories/route.ts +93 -0
- package/mission-control/src/app/api/memory/consolidate/route.ts +107 -0
- package/mission-control/src/app/api/memory/doc/route.ts +89 -0
- package/mission-control/src/app/api/memory/flush/route.ts +129 -0
- package/mission-control/src/app/api/memory/graph/route.ts +105 -0
- package/mission-control/src/app/api/memory/items/route.ts +86 -0
- package/mission-control/src/app/api/memory/list/route.ts +48 -0
- package/mission-control/src/app/api/memory/retrieve/route.ts +51 -0
- package/mission-control/src/app/api/memory/search/route.ts +143 -0
- package/mission-control/src/app/api/memory/sync/route.ts +23 -0
- package/mission-control/src/app/api/memory/wikilinks/route.ts +75 -0
- package/mission-control/src/app/api/mesh/events/route.ts +67 -0
- package/mission-control/src/app/api/mesh/nodes/route.ts +221 -0
- package/mission-control/src/app/api/mesh/tokens/route.ts +133 -0
- package/mission-control/src/app/api/projects/route.ts +102 -0
- package/mission-control/src/app/api/resolve-path/route.ts +92 -0
- package/mission-control/src/app/api/scheduler/tick/route.ts +38 -0
- package/mission-control/src/app/api/scheduler/waves/route.ts +54 -0
- package/mission-control/src/app/api/screenshot/route.ts +127 -0
- package/mission-control/src/app/api/settings/gateway/route.ts +92 -0
- package/mission-control/src/app/api/skills/[id]/health/route.ts +57 -0
- package/mission-control/src/app/api/skills/list/route.ts +41 -0
- package/mission-control/src/app/api/souls/[id]/evolution/route.ts +253 -0
- package/mission-control/src/app/api/souls/[id]/prompt/route.ts +205 -0
- package/mission-control/src/app/api/souls/[id]/propagate/route.ts +146 -0
- package/mission-control/src/app/api/souls/route.ts +174 -0
- package/mission-control/src/app/api/tasks/[id]/handoff/route.ts +115 -0
- package/mission-control/src/app/api/tasks/[id]/route.ts +266 -0
- package/mission-control/src/app/api/tasks/[id]/tree/route.ts +94 -0
- package/mission-control/src/app/api/tasks/route.ts +253 -0
- package/mission-control/src/app/api/tts/route.ts +47 -0
- package/mission-control/src/app/api/workspace/files/route.ts +88 -0
- package/mission-control/src/app/api/workspace/read/route.ts +73 -0
- package/mission-control/src/app/burndown/page.tsx +309 -0
- package/mission-control/src/app/calendar/page.tsx +839 -0
- package/mission-control/src/app/favicon.ico +0 -0
- package/mission-control/src/app/globals.css +67 -0
- package/mission-control/src/app/graph/page.tsx +352 -0
- package/mission-control/src/app/layout.tsx +35 -0
- package/mission-control/src/app/live/page.tsx +232 -0
- package/mission-control/src/app/memory/page.tsx +154 -0
- package/mission-control/src/app/mesh/page.tsx +457 -0
- package/mission-control/src/app/obsidian/page.tsx +252 -0
- package/mission-control/src/app/page.tsx +70 -0
- package/mission-control/src/app/roadmap/page.tsx +1757 -0
- package/mission-control/src/app/settings/page.tsx +260 -0
- package/mission-control/src/app/souls/page.tsx +573 -0
- package/mission-control/src/components/board/activity-timeline.tsx +96 -0
- package/mission-control/src/components/board/daily-board.tsx +373 -0
- package/mission-control/src/components/board/kanban-board.tsx +364 -0
- package/mission-control/src/components/board/kanban-column.tsx +105 -0
- package/mission-control/src/components/board/live-stream.tsx +116 -0
- package/mission-control/src/components/board/skill-health-card.tsx +128 -0
- package/mission-control/src/components/board/status-banner.tsx +124 -0
- package/mission-control/src/components/board/task-card.tsx +454 -0
- package/mission-control/src/components/board/unified-task-dialog.tsx +1043 -0
- package/mission-control/src/components/layout/resizable-layout.tsx +68 -0
- package/mission-control/src/components/layout/sidebar.tsx +90 -0
- package/mission-control/src/components/live/audio-spectrum.tsx +106 -0
- package/mission-control/src/components/live/chat-bubble.tsx +52 -0
- package/mission-control/src/components/live/chat-input.tsx +92 -0
- package/mission-control/src/components/memory/doc-reader.tsx +172 -0
- package/mission-control/src/components/memory/memory-list.tsx +169 -0
- package/mission-control/src/components/memory/search-bar.tsx +67 -0
- package/mission-control/src/components/memory/search-results.tsx +149 -0
- package/mission-control/src/components/obsidian/backlinks-panel.tsx +52 -0
- package/mission-control/src/components/obsidian/file-tree.tsx +186 -0
- package/mission-control/src/components/obsidian/local-graph.tsx +107 -0
- package/mission-control/src/components/obsidian/obsidian-graph.tsx +192 -0
- package/mission-control/src/components/obsidian/obsidian-reader.tsx +246 -0
- package/mission-control/src/lib/activity.ts +29 -0
- package/mission-control/src/lib/config.ts +21 -0
- package/mission-control/src/lib/db/index.ts +429 -0
- package/mission-control/src/lib/db/schema.ts +218 -0
- package/mission-control/src/lib/gateway-notify.ts +113 -0
- package/mission-control/src/lib/hooks.ts +536 -0
- package/mission-control/src/lib/memory/categories.ts +125 -0
- package/mission-control/src/lib/memory/entities.ts +482 -0
- package/mission-control/src/lib/memory/extract.ts +369 -0
- package/mission-control/src/lib/memory/retrieval.ts +281 -0
- package/mission-control/src/lib/memory/wikilinks.ts +147 -0
- package/mission-control/src/lib/nats.ts +126 -0
- package/mission-control/src/lib/parsers/clawvault-doc.ts +98 -0
- package/mission-control/src/lib/parsers/daily-log.ts +73 -0
- package/mission-control/src/lib/parsers/memory-md.ts +81 -0
- package/mission-control/src/lib/parsers/task-markdown.ts +459 -0
- package/mission-control/src/lib/parsers/transcript.ts +209 -0
- package/mission-control/src/lib/scheduler.ts +394 -0
- package/mission-control/src/lib/speech/use-speech-pipeline.ts +176 -0
- package/mission-control/src/lib/sync/memory.ts +224 -0
- package/mission-control/src/lib/sync/tasks.ts +271 -0
- package/mission-control/src/lib/tts/edge.ts +31 -0
- package/mission-control/src/lib/tts/google.ts +78 -0
- package/mission-control/src/lib/tts/index.ts +39 -0
- package/mission-control/src/lib/tts/types.ts +18 -0
- package/mission-control/tsconfig.json +42 -0
- package/obsidian-vault/.obsidian/app.json +10 -0
- package/obsidian-vault/.obsidian/community-plugins.json +8 -0
- package/obsidian-vault/.obsidian/graph.json +40 -0
- package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/main.js +58769 -0
- package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/manifest.json +10 -0
- package/obsidian-vault/.obsidian/plugins/obsidian-local-rest-api/styles.css +47 -0
- package/obsidian-vault/00-meta/.gitkeep +0 -0
- package/obsidian-vault/01-architecture/.gitkeep +0 -0
- package/obsidian-vault/02-smart-contracts/.gitkeep +0 -0
- package/obsidian-vault/03-backend/.gitkeep +0 -0
- package/obsidian-vault/04-mobile/.gitkeep +0 -0
- package/obsidian-vault/05-ar-mapping/.gitkeep +0 -0
- package/obsidian-vault/06-3d-assets/.gitkeep +0 -0
- package/obsidian-vault/07-sound-music/.gitkeep +0 -0
- package/obsidian-vault/08-lore/.gitkeep +0 -0
- package/obsidian-vault/09-quests-playthrough/.gitkeep +0 -0
- package/obsidian-vault/10-economy/.gitkeep +0 -0
- package/obsidian-vault/11-nft-assets/.gitkeep +0 -0
- package/obsidian-vault/12-nft-mechanics/.gitkeep +0 -0
- package/obsidian-vault/13-dao-guild-social/.gitkeep +0 -0
- package/obsidian-vault/14-game-progression/.gitkeep +0 -0
- package/obsidian-vault/15-analytics/.gitkeep +0 -0
- package/obsidian-vault/16-security/.gitkeep +0 -0
- package/obsidian-vault/17-devops/.gitkeep +0 -0
- package/obsidian-vault/18-marketplace/.gitkeep +0 -0
- package/obsidian-vault/19-decisions/.gitkeep +0 -0
- package/obsidian-vault/20-business-strategy/.gitkeep +0 -0
- package/obsidian-vault/21-legal-regulatory/.gitkeep +0 -0
- package/obsidian-vault/nodes/.gitkeep +0 -0
- package/openclaw.env.example +17 -0
- package/package.json +45 -0
- package/services/launchd/ai.openclaw.gateway.plist +59 -0
- package/services/launchd/ai.openclaw.lane-watchdog.plist +32 -0
- package/services/launchd/ai.openclaw.log-rotate.plist +28 -0
- package/services/launchd/ai.openclaw.memory-daemon.plist +36 -0
- package/services/launchd/ai.openclaw.mesh-agent.plist +38 -0
- package/services/launchd/ai.openclaw.mesh-bridge.plist +36 -0
- package/services/launchd/ai.openclaw.mesh-deploy-listener.plist +33 -0
- package/services/launchd/ai.openclaw.mesh-health-publisher.plist +29 -0
- package/services/launchd/ai.openclaw.mesh-task-daemon.plist +36 -0
- package/services/launchd/ai.openclaw.mesh-tool-discord.plist +36 -0
- package/services/launchd/ai.openclaw.mission-control.plist +41 -0
- package/services/service-manifest.json +13 -0
- package/services/systemd/openclaw-gateway.service +21 -0
- package/services/systemd/openclaw-lane-watchdog.service +21 -0
- package/services/systemd/openclaw-log-rotate.service +13 -0
- package/services/systemd/openclaw-log-rotate.timer +9 -0
- package/services/systemd/openclaw-memory-daemon.service +21 -0
- package/services/systemd/openclaw-mesh-agent.service +19 -0
- package/services/systemd/openclaw-mesh-bridge.service +21 -0
- package/services/systemd/openclaw-mesh-deploy-listener.service +23 -0
- package/services/systemd/openclaw-mesh-health-publisher.service +21 -0
- package/services/systemd/openclaw-mesh-task-daemon.service +21 -0
- package/services/systemd/openclaw-mesh-tool-discord.service +21 -0
- package/services/systemd/openclaw-mission-control.service +22 -0
- package/skills/1password/.clawhub/origin.json +7 -0
- package/skills/1password/SKILL.md +63 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/acquisition-channel-advisor/SKILL.md +643 -0
- package/skills/acquisition-channel-advisor/examples/conversation-flow.md +531 -0
- package/skills/agent-browser/.clawhub/origin.json +7 -0
- package/skills/agent-browser/CONTRIBUTING.md +63 -0
- package/skills/agent-browser/SKILL.md +338 -0
- package/skills/agentic-compass/.clawhub/origin.json +7 -0
- package/skills/agentic-compass/README.md +96 -0
- package/skills/agentic-compass/SKILL.md +112 -0
- package/skills/agentic-compass/references/README.md +5 -0
- package/skills/agentic-compass/scripts/agentic-compass.py +196 -0
- package/skills/arcane-dev-ops/SKILL.md +61 -0
- package/skills/arcane-dev-ops/references/checklist.md +22 -0
- package/skills/arcane-dev-ops/references/validation-cases.md +11 -0
- package/skills/arcane-dev-ops/scripts/prepush_check.sh +41 -0
- package/skills/auto-updater/.clawhub/origin.json +7 -0
- package/skills/auto-updater/SKILL.md +158 -0
- package/skills/auto-updater/references/agent-guide.md +152 -0
- package/skills/auto-updater/references/summary-examples.md +109 -0
- package/skills/business-health-diagnostic/SKILL.md +782 -0
- package/skills/byterover/.clawhub/origin.json +7 -0
- package/skills/byterover/SKILL.md +105 -0
- package/skills/byterover/TROUBLESHOOTING.md +50 -0
- package/skills/byterover/WORKFLOWS.md +229 -0
- package/skills/capability-evolver/.clawhub/origin.json +7 -0
- package/skills/capability-evolver/CONTRIBUTING.md +11 -0
- package/skills/capability-evolver/README.md +157 -0
- package/skills/capability-evolver/README.zh-CN.md +112 -0
- package/skills/capability-evolver/SKILL.md +93 -0
- package/skills/capability-evolver/assets/gep/capsules.json +5 -0
- package/skills/capability-evolver/assets/gep/genes.json +104 -0
- package/skills/capability-evolver/index.js +59 -0
- package/skills/capability-evolver/package.json +22 -0
- package/skills/capability-evolver/scripts/analyze_by_skill.js +121 -0
- package/skills/capability-evolver/scripts/build_public.js +350 -0
- package/skills/capability-evolver/scripts/export_history.js +98 -0
- package/skills/capability-evolver/scripts/extract_log.js +85 -0
- package/skills/capability-evolver/scripts/generate_history.js +75 -0
- package/skills/capability-evolver/scripts/human_report.js +147 -0
- package/skills/capability-evolver/scripts/publish_public.js +516 -0
- package/skills/capability-evolver/scripts/suggest_version.js +89 -0
- package/skills/capability-evolver/src/evolve.js +594 -0
- package/skills/capability-evolver/src/gep/assetStore.js +204 -0
- package/skills/capability-evolver/src/gep/candidates.js +134 -0
- package/skills/capability-evolver/src/gep/paths.js +23 -0
- package/skills/capability-evolver/src/gep/prompt.js +254 -0
- package/skills/capability-evolver/src/gep/selector.js +89 -0
- package/skills/capability-evolver/src/gep/signals.js +27 -0
- package/skills/cc-godmode/.clawhub/origin.json +7 -0
- package/skills/cc-godmode/CHANGELOG.md +66 -0
- package/skills/cc-godmode/README.md +293 -0
- package/skills/cc-godmode/SKILL.md +242 -0
- package/skills/cc-godmode/docs/AGENTS.md +332 -0
- package/skills/cc-godmode/docs/MIGRATION.md +206 -0
- package/skills/cc-godmode/docs/TROUBLESHOOTING.md +357 -0
- package/skills/cc-godmode/docs/WORKFLOWS.md +329 -0
- package/skills/cc-godmode/references/agents.md +433 -0
- package/skills/cc-godmode/scripts/build-skill.js +232 -0
- package/skills/clawdbot-filesystem/.clawhub/origin.json +7 -0
- package/skills/clawdbot-filesystem/LICENSE.md +21 -0
- package/skills/clawdbot-filesystem/README.md +322 -0
- package/skills/clawdbot-filesystem/SKILL.md +219 -0
- package/skills/clawdbot-filesystem/config.json +41 -0
- package/skills/clawdbot-filesystem/package.json +69 -0
- package/skills/clawdbot-security-check/.clawhub/origin.json +7 -0
- package/skills/clawdbot-security-check/README.md +168 -0
- package/skills/clawdbot-security-check/SKILL.md +145 -0
- package/skills/clawdbot-security-check/references/audit-checks.md +521 -0
- package/skills/clawdbot-security-check/skill.json +42 -0
- package/skills/clawddocs/.clawhub/origin.json +7 -0
- package/skills/clawddocs/SKILL.md +176 -0
- package/skills/clawddocs/package.json +9 -0
- package/skills/clawddocs/scripts/build-index.sh +17 -0
- package/skills/clawddocs/scripts/cache.sh +13 -0
- package/skills/clawddocs/scripts/fetch-doc.sh +7 -0
- package/skills/clawddocs/scripts/recent.sh +5 -0
- package/skills/clawddocs/scripts/search.sh +8 -0
- package/skills/clawddocs/scripts/sitemap.sh +23 -0
- package/skills/clawddocs/scripts/track-changes.sh +16 -0
- package/skills/clawddocs/snippets/common-configs.md +69 -0
- package/skills/clawguard/.clawhub/origin.json +7 -0
- package/skills/clawguard/SKILL.md +137 -0
- package/skills/company-research/SKILL.md +393 -0
- package/skills/company-research/examples/sample.md +164 -0
- package/skills/company-research/template.md +60 -0
- package/skills/crypto-price/.clawhub/origin.json +7 -0
- package/skills/crypto-price/ARCHITECTURE.md +437 -0
- package/skills/crypto-price/README.md +194 -0
- package/skills/crypto-price/SKILL.md +61 -0
- package/skills/crypto-price/requirements.txt +1 -0
- package/skills/crypto-price/scripts/get_price_chart.py +988 -0
- package/skills/customer-journey-map/SKILL.md +343 -0
- package/skills/customer-journey-map/examples/sample.md +33 -0
- package/skills/customer-journey-map/template.md +28 -0
- package/skills/customer-journey-mapping-workshop/SKILL.md +522 -0
- package/skills/deep-research/.clawhub/origin.json +7 -0
- package/skills/deep-research/SKILL.md +93 -0
- package/skills/deep-research/rules/logic.md +32 -0
- package/skills/discord-telegram-triage/SKILL.md +59 -0
- package/skills/discord-telegram-triage/references/discord-runbook.md +28 -0
- package/skills/discord-telegram-triage/references/validation-cases.md +11 -0
- package/skills/discord-telegram-triage/scripts/triage_snapshot.sh +23 -0
- package/skills/discovery-interview-prep/SKILL.md +408 -0
- package/skills/discovery-process/SKILL.md +503 -0
- package/skills/discovery-process/examples/sample.md +60 -0
- package/skills/discovery-process/template.md +39 -0
- package/skills/dist/arcane-dev-ops.skill +0 -0
- package/skills/dist/discord-telegram-triage.skill +0 -0
- package/skills/dist/founder-brief-summarizer.skill +0 -0
- package/skills/epic-breakdown-advisor/SKILL.md +664 -0
- package/skills/epic-hypothesis/SKILL.md +285 -0
- package/skills/epic-hypothesis/examples/sample.md +104 -0
- package/skills/epic-hypothesis/template.md +30 -0
- package/skills/excel/.clawhub/origin.json +7 -0
- package/skills/excel/SKILL.md +332 -0
- package/skills/excel/scripts/excel.py +1120 -0
- package/skills/fast-browser-use/.clawhub/origin.json +7 -0
- package/skills/fast-browser-use/CODEBUDDY.md +142 -0
- package/skills/fast-browser-use/Cargo.toml +77 -0
- package/skills/fast-browser-use/README.md +62 -0
- package/skills/fast-browser-use/SKILL.md +217 -0
- package/skills/fast-browser-use/package-lock.json +28 -0
- package/skills/fast-browser-use/package.json +8 -0
- package/skills/fast-browser-use/rustfmt.toml +10 -0
- package/skills/fast-browser-use/src/bin/cli.rs +373 -0
- package/skills/fast-browser-use/src/bin/mcp_server.rs +203 -0
- package/skills/fast-browser-use/src/browser/config.rs +136 -0
- package/skills/fast-browser-use/src/browser/debug.rs +16 -0
- package/skills/fast-browser-use/src/browser/mod.rs +61 -0
- package/skills/fast-browser-use/src/browser/session.rs +478 -0
- package/skills/fast-browser-use/src/dom/element.rs +442 -0
- package/skills/fast-browser-use/src/dom/extract_dom.js +849 -0
- package/skills/fast-browser-use/src/dom/mod.rs +14 -0
- package/skills/fast-browser-use/src/dom/tree.rs +296 -0
- package/skills/fast-browser-use/src/dom/yaml.rs +149 -0
- package/skills/fast-browser-use/src/error.rs +115 -0
- package/skills/fast-browser-use/src/lib.rs +17 -0
- package/skills/fast-browser-use/src/mcp/handler.rs +63 -0
- package/skills/fast-browser-use/src/mcp/mod.rs +81 -0
- package/skills/fast-browser-use/src/tools/Readability.min.js +1480 -0
- package/skills/fast-browser-use/src/tools/annotate.rs +165 -0
- package/skills/fast-browser-use/src/tools/click.rs +84 -0
- package/skills/fast-browser-use/src/tools/close.rs +35 -0
- package/skills/fast-browser-use/src/tools/close_tab.rs +45 -0
- package/skills/fast-browser-use/src/tools/convert_to_markdown.js +117 -0
- package/skills/fast-browser-use/src/tools/cookies.rs +58 -0
- package/skills/fast-browser-use/src/tools/debug.rs +44 -0
- package/skills/fast-browser-use/src/tools/evaluate.rs +40 -0
- package/skills/fast-browser-use/src/tools/extract.rs +66 -0
- package/skills/fast-browser-use/src/tools/go_back.rs +35 -0
- package/skills/fast-browser-use/src/tools/go_forward.rs +35 -0
- package/skills/fast-browser-use/src/tools/hover.js +33 -0
- package/skills/fast-browser-use/src/tools/hover.rs +97 -0
- package/skills/fast-browser-use/src/tools/html_to_markdown.rs +99 -0
- package/skills/fast-browser-use/src/tools/input.rs +93 -0
- package/skills/fast-browser-use/src/tools/local_storage.rs +159 -0
- package/skills/fast-browser-use/src/tools/markdown.rs +181 -0
- package/skills/fast-browser-use/src/tools/mod.rs +326 -0
- package/skills/fast-browser-use/src/tools/navigate.rs +55 -0
- package/skills/fast-browser-use/src/tools/new_tab.rs +60 -0
- package/skills/fast-browser-use/src/tools/press_key.rs +78 -0
- package/skills/fast-browser-use/src/tools/read_links.rs +59 -0
- package/skills/fast-browser-use/src/tools/readability_script.rs +8 -0
- package/skills/fast-browser-use/src/tools/screenshot.rs +47 -0
- package/skills/fast-browser-use/src/tools/scroll.js +22 -0
- package/skills/fast-browser-use/src/tools/scroll.rs +95 -0
- package/skills/fast-browser-use/src/tools/select.js +23 -0
- package/skills/fast-browser-use/src/tools/select.rs +129 -0
- package/skills/fast-browser-use/src/tools/sitemap.rs +426 -0
- package/skills/fast-browser-use/src/tools/snapshot.rs +324 -0
- package/skills/fast-browser-use/src/tools/switch_tab.rs +69 -0
- package/skills/fast-browser-use/src/tools/tab_list.rs +76 -0
- package/skills/fast-browser-use/src/tools/utils.rs +92 -0
- package/skills/fast-browser-use/src/tools/wait.rs +53 -0
- package/skills/fast-browser-use/test_auth.json +3 -0
- package/skills/fast-browser-use/test_state.json +6 -0
- package/skills/fast-browser-use/tests/browser_tools_integration.rs +233 -0
- package/skills/fast-browser-use/tests/cli_recipes_integration.rs +112 -0
- package/skills/fast-browser-use/tests/cookies_integration.rs +56 -0
- package/skills/fast-browser-use/tests/debug_integration.rs +83 -0
- package/skills/fast-browser-use/tests/dom_integration.rs +170 -0
- package/skills/fast-browser-use/tests/local_storage_integration.rs +75 -0
- package/skills/fast-browser-use/tests/markdown_integration.rs +448 -0
- package/skills/fast-browser-use/tests/navigation_integration.rs +241 -0
- package/skills/fast-browser-use/tests/sitemap_integration.rs +326 -0
- package/skills/fast-browser-use/tests/tab_management_integration.rs +300 -0
- package/skills/feature-investment-advisor/SKILL.md +639 -0
- package/skills/feature-investment-advisor/examples/conversation-flow.md +538 -0
- package/skills/finance-based-pricing-advisor/SKILL.md +763 -0
- package/skills/finance-metrics-quickref/SKILL.md +309 -0
- package/skills/find-skills/.clawhub/origin.json +7 -0
- package/skills/find-skills/SKILL.md +143 -0
- package/skills/flavor-text-writer/SKILL.md +27 -0
- package/skills/founder-brief-summarizer/SKILL.md +52 -0
- package/skills/founder-brief-summarizer/references/response-templates.md +15 -0
- package/skills/founder-brief-summarizer/references/validation-cases.md +11 -0
- package/skills/founder-brief-summarizer/scripts/brief_template.sh +28 -0
- package/skills/frontend-design/.clawhub/origin.json +7 -0
- package/skills/frontend-design/LICENSE.txt +190 -0
- package/skills/frontend-design/SKILL.md +53 -0
- package/skills/gemini/.clawhub/origin.json +7 -0
- package/skills/gemini/SKILL.md +33 -0
- package/skills/gemini-deep-research/.clawhub/origin.json +7 -0
- package/skills/gemini-deep-research/SKILL.md +78 -0
- package/skills/gemini-deep-research/scripts/deep_research.py +176 -0
- package/skills/git-essentials/.clawhub/origin.json +7 -0
- package/skills/git-essentials/SKILL.md +239 -0
- package/skills/git-essentials/references/advanced.md +211 -0
- package/skills/github/.clawhub/origin.json +7 -0
- package/skills/github/SKILL.md +57 -0
- package/skills/google-drive/.clawhub/origin.json +7 -0
- package/skills/google-drive/LICENSE.txt +21 -0
- package/skills/google-drive/SKILL.md +320 -0
- package/skills/growth-loop/SKILL.md +270 -0
- package/skills/growth-loop/_meta.json +9 -0
- package/skills/growth-loop/references/diagnosis-framework.md +84 -0
- package/skills/growth-loop/references/platform-benchmarks.md +79 -0
- package/skills/growth-loop/scripts/init-campaign.sh +274 -0
- package/skills/humanize-ai-text/.clawhub/origin.json +7 -0
- package/skills/humanize-ai-text/SKILL.md +192 -0
- package/skills/humanize-ai-text/scripts/compare.py +58 -0
- package/skills/humanize-ai-text/scripts/detect.py +160 -0
- package/skills/humanize-ai-text/scripts/patterns.json +191 -0
- package/skills/humanize-ai-text/scripts/transform.py +127 -0
- package/skills/humanizer/.clawhub/origin.json +7 -0
- package/skills/humanizer/README.md +82 -0
- package/skills/humanizer/SKILL.md +443 -0
- package/skills/jobs-to-be-done/SKILL.md +378 -0
- package/skills/jobs-to-be-done/examples/sample.md +80 -0
- package/skills/jobs-to-be-done/template.md +65 -0
- package/skills/lean-ux-canvas/SKILL.md +561 -0
- package/skills/lean-ux-canvas/examples/sample.md +88 -0
- package/skills/lean-ux-canvas/template.md +32 -0
- package/skills/markdown-formatter/.clawhub/origin.json +7 -0
- package/skills/markdown-formatter/README.md +137 -0
- package/skills/markdown-formatter/SKILL.md +369 -0
- package/skills/markdown-formatter/config.json +20 -0
- package/skills/markdown-formatter/index.js +439 -0
- package/skills/markdown-formatter/package.json +23 -0
- package/skills/markdown-formatter/test.js +23 -0
- package/skills/marketing-mode/.clawhub/origin.json +7 -0
- package/skills/marketing-mode/README.md +49 -0
- package/skills/marketing-mode/SKILL.md +703 -0
- package/skills/marketing-mode/mode-prompt.md +39 -0
- package/skills/marketing-mode/skill.json +51 -0
- package/skills/memory-hygiene/.clawhub/origin.json +7 -0
- package/skills/memory-hygiene/SKILL.md +91 -0
- package/skills/memory-setup/.clawhub/origin.json +7 -0
- package/skills/memory-setup/SKILL.md +180 -0
- package/skills/memorylayer/.clawhub/origin.json +7 -0
- package/skills/memorylayer/README.md +197 -0
- package/skills/memorylayer/SKILL.md +227 -0
- package/skills/memorylayer/examples/agent-integration.js +145 -0
- package/skills/memorylayer/examples/basic-usage.js +87 -0
- package/skills/memorylayer/examples/token-savings-demo.js +183 -0
- package/skills/memorylayer/index.js +115 -0
- package/skills/memorylayer/package-lock.json +295 -0
- package/skills/memorylayer/package.json +27 -0
- package/skills/memorylayer/python/memorylayer_skill.py +230 -0
- package/skills/memorylayer/python/requirements.txt +7 -0
- package/skills/mesh/SKILL.md +184 -0
- package/skills/model-usage/.clawhub/origin.json +7 -0
- package/skills/model-usage/SKILL.md +54 -0
- package/skills/model-usage/references/codexbar-cli.md +28 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/moltbook-interact/.clawhub/origin.json +7 -0
- package/skills/moltbook-interact/INSTALL.md +139 -0
- package/skills/moltbook-interact/README.md +198 -0
- package/skills/moltbook-interact/SKILL.md +72 -0
- package/skills/moltbook-interact/references/api.md +106 -0
- package/skills/moltbook-interact/scripts/moltbook.sh +142 -0
- package/skills/moltbook-registry/.clawhub/origin.json +7 -0
- package/skills/moltbook-registry/README.md +26 -0
- package/skills/moltbook-registry/SKILL.md +82 -0
- package/skills/moltbook-registry/index.js +180 -0
- package/skills/moltbook-registry/package.json +11 -0
- package/skills/mythril-scanner/SKILL.md +27 -0
- package/skills/n8n/.clawhub/origin.json +7 -0
- package/skills/n8n/SKILL.md +141 -0
- package/skills/n8n/references/api.md +156 -0
- package/skills/n8n/scripts/n8n_api.py +158 -0
- package/skills/n8n-workflow-automation/.clawhub/origin.json +7 -0
- package/skills/n8n-workflow-automation/SKILL.md +103 -0
- package/skills/n8n-workflow-automation/assets/runbook-template.md +32 -0
- package/skills/narrative-designer/SKILL.md +27 -0
- package/skills/ontology/.clawhub/origin.json +7 -0
- package/skills/ontology/SKILL.md +236 -0
- package/skills/ontology/references/queries.md +211 -0
- package/skills/ontology/references/schema.md +322 -0
- package/skills/ontology/scripts/ontology.py +374 -0
- package/skills/openai-image-gen/.clawhub/origin.json +7 -0
- package/skills/openai-image-gen/SKILL.md +45 -0
- package/skills/openai-image-gen/scripts/gen.py +227 -0
- package/skills/openclaw-agent-optimize/.clawhub/origin.json +7 -0
- package/skills/openclaw-agent-optimize/SKILL.md +33 -0
- package/skills/openclaw-agent-optimize/references/agent-orchestration.md +20 -0
- package/skills/openclaw-agent-optimize/references/context-management.md +15 -0
- package/skills/openclaw-agent-optimize/references/continuous-learning.md +14 -0
- package/skills/openclaw-agent-optimize/references/cron-optimization.md +16 -0
- package/skills/openclaw-agent-optimize/references/memory-patterns.md +14 -0
- package/skills/openclaw-agent-optimize/references/model-selection.md +18 -0
- package/skills/openclaw-skill-scanner/.clawhub/origin.json +7 -0
- package/skills/openclaw-skill-scanner/SKILL.md +88 -0
- package/skills/openclaw-skill-scanner/install-hook.sh +294 -0
- package/skills/openclaw-skill-scanner/report-template.md +53 -0
- package/skills/openclaw-skill-scanner/scanner.py +929 -0
- package/skills/openclaw-skill-scanner/whitelist.json +18 -0
- package/skills/opportunity-solution-tree/SKILL.md +428 -0
- package/skills/opportunity-solution-tree/examples/sample.md +104 -0
- package/skills/opportunity-solution-tree/template.md +33 -0
- package/skills/pdf/.clawhub/origin.json +7 -0
- package/skills/pdf/SKILL.md +304 -0
- package/skills/pestel-analysis/SKILL.md +384 -0
- package/skills/pestel-analysis/examples/sample.md +143 -0
- package/skills/pestel-analysis/template.md +53 -0
- package/skills/pol-probe/SKILL.md +217 -0
- package/skills/pol-probe/examples/sample.md +136 -0
- package/skills/pol-probe/template.md +59 -0
- package/skills/pol-probe-advisor/SKILL.md +492 -0
- package/skills/positioning-statement/SKILL.md +229 -0
- package/skills/positioning-statement/examples/sample.md +51 -0
- package/skills/positioning-statement/template.md +25 -0
- package/skills/positioning-workshop/SKILL.md +424 -0
- package/skills/prd-development/SKILL.md +654 -0
- package/skills/prd-development/examples/sample.md +43 -0
- package/skills/prd-development/template.md +55 -0
- package/skills/press-release/SKILL.md +277 -0
- package/skills/press-release/examples/sample.md +73 -0
- package/skills/press-release/template.md +39 -0
- package/skills/prioritization-advisor/SKILL.md +451 -0
- package/skills/proactive-messages/.clawhub/origin.json +7 -0
- package/skills/proactive-messages/SKILL.md +91 -0
- package/skills/problem-framing-canvas/SKILL.md +466 -0
- package/skills/problem-framing-canvas/examples/sample.md +58 -0
- package/skills/problem-framing-canvas/template.md +22 -0
- package/skills/problem-statement/SKILL.md +255 -0
- package/skills/problem-statement/examples/sample.md +82 -0
- package/skills/problem-statement/template.md +37 -0
- package/skills/product-strategy-session/SKILL.md +434 -0
- package/skills/product-strategy-session/examples/sample.md +67 -0
- package/skills/product-strategy-session/template.md +38 -0
- package/skills/prompt-guard/.clawhub/origin.json +7 -0
- package/skills/prompt-guard/ARCHITECTURE.md +364 -0
- package/skills/prompt-guard/CHANGELOG.md +200 -0
- package/skills/prompt-guard/README.md +215 -0
- package/skills/prompt-guard/SECURITY.md +66 -0
- package/skills/prompt-guard/SKILL.md +174 -0
- package/skills/prompt-guard/blog/how-i-secured-my-ai-agent.md +185 -0
- package/skills/prompt-guard/config.example.yaml +56 -0
- package/skills/prompt-guard/references/detection-patterns.md +298 -0
- package/skills/prompt-guard/requirements.txt +1 -0
- package/skills/prompt-guard/scripts/analyze_log.py +224 -0
- package/skills/prompt-guard/scripts/audit.py +344 -0
- package/skills/prompt-guard/scripts/detect.py +1587 -0
- package/skills/prompt-guard/scripts/hivefence.py +345 -0
- package/skills/proto-persona/SKILL.md +336 -0
- package/skills/proto-persona/examples/sample.md +97 -0
- package/skills/proto-persona/template.md +45 -0
- package/skills/recommendation-canvas/SKILL.md +382 -0
- package/skills/recommendation-canvas/examples/sample.md +94 -0
- package/skills/recommendation-canvas/template.md +86 -0
- package/skills/refactor-suggest/.clawhub/origin.json +7 -0
- package/skills/refactor-suggest/SKILL.md +94 -0
- package/skills/roadmap-planning/SKILL.md +506 -0
- package/skills/roadmap-planning/examples/sample.md +62 -0
- package/skills/roadmap-planning/template.md +30 -0
- package/skills/saas-economics-efficiency-metrics/SKILL.md +694 -0
- package/skills/saas-economics-efficiency-metrics/examples/cash-trap.md +365 -0
- package/skills/saas-economics-efficiency-metrics/examples/healthy-unit-economics.md +279 -0
- package/skills/saas-economics-efficiency-metrics/template.md +263 -0
- package/skills/saas-revenue-growth-metrics/SKILL.md +629 -0
- package/skills/saas-revenue-growth-metrics/examples/healthy-saas.md +131 -0
- package/skills/saas-revenue-growth-metrics/examples/warning-signs.md +229 -0
- package/skills/saas-revenue-growth-metrics/template.md +192 -0
- package/skills/save-money/.clawhub/origin.json +7 -0
- package/skills/save-money/SKILL.md +173 -0
- package/skills/scripts/golden_skills_v3.sh +32 -0
- package/skills/search/.clawhub/origin.json +7 -0
- package/skills/search/SKILL.md +18 -0
- package/skills/search/skill.json +1 -0
- package/skills/second-brain/.clawhub/origin.json +7 -0
- package/skills/second-brain/SKILL.md +278 -0
- package/skills/second-brain/scripts/ensue-api.sh +37 -0
- package/skills/self-improving-agent/.clawhub/origin.json +7 -0
- package/skills/self-improving-agent/.learnings/ERRORS.md +5 -0
- package/skills/self-improving-agent/.learnings/FEATURE_REQUESTS.md +5 -0
- package/skills/self-improving-agent/.learnings/LEARNINGS.md +5 -0
- package/skills/self-improving-agent/SKILL.md +130 -0
- package/skills/self-improving-agent/assets/LEARNINGS.md +45 -0
- package/skills/self-improving-agent/assets/SKILL-TEMPLATE.md +177 -0
- package/skills/self-improving-agent/hooks/openclaw/HOOK.md +23 -0
- package/skills/self-improving-agent/hooks/openclaw/handler.js +56 -0
- package/skills/self-improving-agent/hooks/openclaw/handler.ts +62 -0
- package/skills/self-improving-agent/references/examples.md +374 -0
- package/skills/self-improving-agent/references/hooks-setup.md +223 -0
- package/skills/self-improving-agent/references/openclaw-integration.md +248 -0
- package/skills/self-improving-agent/references/templates.md +480 -0
- package/skills/self-improving-agent/scripts/activator.sh +20 -0
- package/skills/self-improving-agent/scripts/error-detector.sh +55 -0
- package/skills/self-improving-agent/scripts/extract-skill.sh +203 -0
- package/skills/self-improving-agent-1-0-2/.clawhub/origin.json +7 -0
- package/skills/self-improving-agent-1-0-2/SKILL.md +562 -0
- package/skills/self-improving-agent-1-0-2/assets/LEARNINGS.md +45 -0
- package/skills/self-improving-agent-1-0-2/assets/SKILL-TEMPLATE.md +182 -0
- package/skills/self-improving-agent-1-0-2/references/clawdbot-integration.md +311 -0
- package/skills/self-improving-agent-1-0-2/references/examples.md +374 -0
- package/skills/self-improving-agent-1-0-2/references/hooks-setup.md +223 -0
- package/skills/self-improving-agent-1-0-2/scripts/activator.sh +20 -0
- package/skills/self-improving-agent-1-0-2/scripts/error-detector.sh +55 -0
- package/skills/self-improving-agent-1-0-2/scripts/extract-skill.sh +203 -0
- package/skills/self-love-confidence/.clawhub/origin.json +7 -0
- package/skills/self-love-confidence/SKILL.md +79 -0
- package/skills/self-reflection/.clawhub/origin.json +7 -0
- package/skills/self-reflection/README.md +292 -0
- package/skills/self-reflection/SKILL.md +110 -0
- package/skills/self-reflection/self-reflection.example.json +6 -0
- package/skills/slither-analyzer/SKILL.md +27 -0
- package/skills/solidity-audit/SKILL.md +27 -0
- package/skills/soulcraft/.clawhub/origin.json +7 -0
- package/skills/soulcraft/README.md +123 -0
- package/skills/soulcraft/SKILL.md +340 -0
- package/skills/soulcraft/references/question-bank.md +154 -0
- package/skills/soulcraft/references/soul-examples.md +207 -0
- package/skills/soulcraft/research/RESEARCH_REPORT.md +317 -0
- package/skills/spotify-player/.clawhub/origin.json +7 -0
- package/skills/spotify-player/SKILL.md +44 -0
- package/skills/storyboard/SKILL.md +259 -0
- package/skills/storyboard/examples/sample.md +71 -0
- package/skills/storyboard/template.md +41 -0
- package/skills/summarize/.clawhub/origin.json +7 -0
- package/skills/summarize/SKILL.md +59 -0
- package/skills/superdesign/.clawhub/origin.json +7 -0
- package/skills/superdesign/SKILL.md +224 -0
- package/skills/tam-sam-som-calculator/SKILL.md +399 -0
- package/skills/tam-sam-som-calculator/examples/sample.md +142 -0
- package/skills/tam-sam-som-calculator/scripts/market-sizing.py +95 -0
- package/skills/tam-sam-som-calculator/template.md +35 -0
- package/skills/tavily-search/.clawhub/origin.json +7 -0
- package/skills/tavily-search/SKILL.md +49 -0
- package/skills/tavily-search/scripts/extract.mjs +59 -0
- package/skills/tavily-search/scripts/search.mjs +101 -0
- package/skills/twitter/SKILL.md +74 -0
- package/skills/twitter/_meta.json +9 -0
- package/skills/twitter/references/validation-cases.md +53 -0
- package/skills/twitter/scripts/twitter.sh +421 -0
- package/skills/ui-ux-pro-max/.clawhub/origin.json +7 -0
- package/skills/ui-ux-pro-max/SKILL.md +54 -0
- package/skills/ui-ux-pro-max/assets/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/assets/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/assets/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/assets/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/assets/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/assets/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/assets/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/assets/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/assets/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/references/upstream-README.md +488 -0
- package/skills/ui-ux-pro-max/references/upstream-skill-content.md +288 -0
- package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1071 -0
- package/skills/ui-ux-pro-max/scripts/search.py +111 -0
- package/skills/user-story/SKILL.md +272 -0
- package/skills/user-story/examples/sample.md +110 -0
- package/skills/user-story/scripts/user-story-template.py +65 -0
- package/skills/user-story/template.md +32 -0
- package/skills/user-story-mapping/SKILL.md +296 -0
- package/skills/user-story-mapping/examples/sample.md +77 -0
- package/skills/user-story-mapping/template.md +41 -0
- package/skills/user-story-mapping-workshop/SKILL.md +485 -0
- package/skills/user-story-mapping-workshop/template.md +28 -0
- package/skills/user-story-splitting/SKILL.md +313 -0
- package/skills/user-story-splitting/examples/sample.md +147 -0
- package/skills/user-story-splitting/template.md +37 -0
- package/skills/wacli/.clawhub/origin.json +7 -0
- package/skills/wacli/SKILL.md +53 -0
- package/skills/web-search/.clawhub/origin.json +7 -0
- package/skills/web-search/SKILL.md +151 -0
- package/skills/web-search/references/api-details.md +207 -0
- package/skills/web-search/scripts/search.py +576 -0
- package/skills/workshop-facilitation/SKILL.md +88 -0
- package/skills/world-builder/SKILL.md +27 -0
- package/souls/blockchain-auditor/PRINCIPLES.md +75 -0
- package/souls/blockchain-auditor/SOUL.md +56 -0
- package/souls/blockchain-auditor/capabilities.json +33 -0
- package/souls/blockchain-auditor/evolution/capsules.json +4 -0
- package/souls/blockchain-auditor/evolution/events.jsonl +1 -0
- package/souls/blockchain-auditor/evolution/genes.json +62 -0
- package/souls/daedalus/PRINCIPLES.md +78 -0
- package/souls/daedalus/SOUL.md +48 -0
- package/souls/daedalus/capabilities.json +46 -0
- package/souls/identity-architect/PRINCIPLES.md +83 -0
- package/souls/identity-architect/SOUL.md +66 -0
- package/souls/identity-architect/capabilities.json +38 -0
- package/souls/identity-architect/evolution/capsules.json +4 -0
- package/souls/identity-architect/evolution/events.jsonl +0 -0
- package/souls/identity-architect/evolution/genes.json +4 -0
- package/souls/infra-ops/PRINCIPLES.md +77 -0
- package/souls/infra-ops/SOUL.md +56 -0
- package/souls/infra-ops/capabilities.json +33 -0
- package/souls/infra-ops/evolution/capsules.json +4 -0
- package/souls/infra-ops/evolution/events.jsonl +0 -0
- package/souls/infra-ops/evolution/genes.json +4 -0
- package/souls/lore-writer/PRINCIPLES.md +74 -0
- package/souls/lore-writer/SOUL.md +54 -0
- package/souls/lore-writer/capabilities.json +37 -0
- package/souls/lore-writer/evolution/capsules.json +4 -0
- package/souls/lore-writer/evolution/events.jsonl +0 -0
- package/souls/lore-writer/evolution/genes.json +4 -0
- package/souls/qa-evidence/PRINCIPLES.md +97 -0
- package/souls/qa-evidence/SOUL.md +66 -0
- package/souls/qa-evidence/capabilities.json +32 -0
- package/souls/qa-evidence/evolution/capsules.json +4 -0
- package/souls/qa-evidence/evolution/events.jsonl +0 -0
- package/souls/qa-evidence/evolution/genes.json +4 -0
- package/souls/registry.json +211 -0
- package/souls/sync-registry.js +65 -0
- package/uninstall.sh +102 -0
- package/workspace-bin/auto-checkpoint +60 -0
- package/workspace-bin/clawvault-access-control +65 -0
- package/workspace-bin/clawvault-local +28 -0
- package/workspace-bin/compile-boot +494 -0
- package/workspace-bin/daily-log-writer.mjs +251 -0
- package/workspace-bin/evolve +540 -0
- package/workspace-bin/fitness_score.py +395 -0
- package/workspace-bin/hooks/pre-commit +80 -0
- package/workspace-bin/install-daemon +299 -0
- package/workspace-bin/lane-watchdog.js +232 -0
- package/workspace-bin/lib/__init__.py +0 -0
- package/workspace-bin/lib/frontmatter.py +114 -0
- package/workspace-bin/memory-daemon.mjs +879 -0
- package/workspace-bin/memory-maintenance.mjs +531 -0
- package/workspace-bin/mesh-bridge.mjs +154 -0
- package/workspace-bin/multi-review +130 -0
- package/workspace-bin/obsidian +125 -0
- package/workspace-bin/obsidian-sync.mjs +888 -0
- package/workspace-bin/openclaw-register-source +102 -0
- package/workspace-bin/proactive-scan +147 -0
- package/workspace-bin/quality-gate +175 -0
- package/workspace-bin/screenshot +96 -0
- package/workspace-bin/session-recap +453 -0
- package/workspace-bin/skill-audit +494 -0
- package/workspace-bin/skill-quality-check +134 -0
- package/workspace-bin/skill-routing-eval +599 -0
- package/workspace-bin/soul-prompt +251 -0
- package/workspace-bin/subagent-audit.mjs +267 -0
- package/workspace-bin/test-multi-soul-workflow +130 -0
- package/workspace-bin/trust-registry +465 -0
- package/workspace-docs/AGENTS.md +201 -0
- package/workspace-docs/CLAUDE.md +64 -0
- package/workspace-docs/PRINCIPLES.md +81 -0
- package/workspace-docs/SOUL.md +48 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
use crate::{
|
|
2
|
+
error::{BrowserError, Result},
|
|
3
|
+
tools::{Tool, ToolContext, ToolResult},
|
|
4
|
+
dom::element::AriaChild,
|
|
5
|
+
};
|
|
6
|
+
use schemars::JsonSchema;
|
|
7
|
+
use serde::{Deserialize, Serialize};
|
|
8
|
+
use std::collections::HashMap;
|
|
9
|
+
use image::Rgba;
|
|
10
|
+
use imageproc::drawing::{draw_filled_rect_mut, draw_text_mut};
|
|
11
|
+
use imageproc::rect::Rect as ImageRect;
|
|
12
|
+
use rusttype::{Font, Scale};
|
|
13
|
+
use std::io::Cursor;
|
|
14
|
+
use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64};
|
|
15
|
+
|
|
16
|
+
/// Parameters for the annotate tool
|
|
17
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
18
|
+
pub struct AnnotateParams {
|
|
19
|
+
/// Whether to return the base64 image (default: false, saves to file)
|
|
20
|
+
#[serde(default)]
|
|
21
|
+
pub return_base64: bool,
|
|
22
|
+
|
|
23
|
+
/// Path to save the annotated screenshot (if not returning base64)
|
|
24
|
+
pub path: Option<String>,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// Tool for capturing a screenshot with annotated interactive elements
|
|
28
|
+
#[derive(Default)]
|
|
29
|
+
pub struct AnnotateTool;
|
|
30
|
+
|
|
31
|
+
impl Tool for AnnotateTool {
|
|
32
|
+
type Params = AnnotateParams;
|
|
33
|
+
|
|
34
|
+
fn name(&self) -> &str {
|
|
35
|
+
"annotate"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
fn execute_typed(&self, params: AnnotateParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
39
|
+
// 1. Capture screenshot
|
|
40
|
+
let screenshot_data = context
|
|
41
|
+
.session
|
|
42
|
+
.tab()?
|
|
43
|
+
.capture_screenshot(
|
|
44
|
+
headless_chrome::protocol::cdp::Page::CaptureScreenshotFormatOption::Png,
|
|
45
|
+
None,
|
|
46
|
+
None,
|
|
47
|
+
false, // Viewport only for annotation usually makes more sense to match coordinates
|
|
48
|
+
)
|
|
49
|
+
.map_err(|e| BrowserError::ScreenshotFailed(e.to_string()))?;
|
|
50
|
+
|
|
51
|
+
// 2. Extract DOM with bounding boxes
|
|
52
|
+
let dom = context.get_dom()?;
|
|
53
|
+
|
|
54
|
+
// 3. Load image
|
|
55
|
+
let mut img = image::load_from_memory(&screenshot_data)
|
|
56
|
+
.map_err(|e| BrowserError::ScreenshotFailed(format!("Failed to load screenshot image: {}", e)))?
|
|
57
|
+
.to_rgba8();
|
|
58
|
+
|
|
59
|
+
let (width, height) = img.dimensions();
|
|
60
|
+
|
|
61
|
+
// 4. Load font (using a built-in font or loading from bytes if possible, otherwise we might fail)
|
|
62
|
+
// Since we can't easily rely on system fonts in a portable way, we'll try to use a bundled font or fallback.
|
|
63
|
+
// For this environment, let's assume we can't bundle a font easily without adding it to the repo.
|
|
64
|
+
// Actually, we can use `ab_glyph` with a font file.
|
|
65
|
+
// A better approach for a self-contained binary is to include a font as bytes.
|
|
66
|
+
// Let's use a very simple fallback or a known system font path if we can't embed.
|
|
67
|
+
// Wait, `imageproc` examples often use `DejaVuSans`.
|
|
68
|
+
// I'll try to look for a system font, or if that fails, just draw boxes without text?
|
|
69
|
+
// No, numbers are crucial.
|
|
70
|
+
// I will embed a font. `DejaVuSans.ttf` is open.
|
|
71
|
+
// Since I can't download files easily right now, I'll assume a system path or try to find one.
|
|
72
|
+
// MacOS: /System/Library/Fonts/Helvetica.ttc
|
|
73
|
+
// Linux: /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
|
|
74
|
+
|
|
75
|
+
let font_path = if cfg!(target_os = "macos") {
|
|
76
|
+
"/System/Library/Fonts/Helvetica.ttc"
|
|
77
|
+
} else {
|
|
78
|
+
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// Very basic font loading fallback
|
|
82
|
+
let font_bytes = std::fs::read(font_path).unwrap_or_default();
|
|
83
|
+
let font = Font::try_from_bytes(&font_bytes);
|
|
84
|
+
|
|
85
|
+
// 5. Draw annotations
|
|
86
|
+
let mut map = HashMap::new();
|
|
87
|
+
let mut valid_indices = Vec::new();
|
|
88
|
+
|
|
89
|
+
// Collect all interactive elements with valid rects
|
|
90
|
+
// We traverse the DOM tree
|
|
91
|
+
let mut queue = vec![&dom.root];
|
|
92
|
+
while let Some(node) = queue.pop() {
|
|
93
|
+
if let Some(index) = node.index {
|
|
94
|
+
if let Some(rect) = &node.box_info.rect {
|
|
95
|
+
if rect.width > 0.0 && rect.height > 0.0 && rect.x >= 0.0 && rect.y >= 0.0 {
|
|
96
|
+
// Check if rect is within viewport roughly
|
|
97
|
+
if rect.x < width as f64 && rect.y < height as f64 {
|
|
98
|
+
valid_indices.push((index, rect.clone()));
|
|
99
|
+
|
|
100
|
+
// Add to selector map
|
|
101
|
+
if let Some(selector) = dom.get_selector(index) {
|
|
102
|
+
map.insert(index.to_string(), selector.clone());
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
for child in &node.children {
|
|
110
|
+
if let AriaChild::Node(child_node) = child {
|
|
111
|
+
queue.push(child_node);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Sort indices for consistent visualization if needed, but they are already indexed
|
|
117
|
+
|
|
118
|
+
for (index, rect) in valid_indices {
|
|
119
|
+
// Draw yellow box
|
|
120
|
+
let x = rect.x as i32;
|
|
121
|
+
let y = rect.y as i32;
|
|
122
|
+
let w = rect.width as u32;
|
|
123
|
+
let h = rect.height as u32;
|
|
124
|
+
|
|
125
|
+
// Define color: Yellow with alpha
|
|
126
|
+
let color = Rgba([255, 255, 0, 128]); // Semi-transparent yellow
|
|
127
|
+
let border_color = Rgba([255, 0, 0, 255]); // Red border
|
|
128
|
+
|
|
129
|
+
// Draw filled rect (marker)
|
|
130
|
+
// We'll draw a small badge at the top-left corner of the element
|
|
131
|
+
let badge_size = 20;
|
|
132
|
+
let badge_rect = ImageRect::at(x, y).of_size(badge_size, badge_size);
|
|
133
|
+
|
|
134
|
+
draw_filled_rect_mut(&mut img, badge_rect, border_color);
|
|
135
|
+
|
|
136
|
+
// Draw text number
|
|
137
|
+
if let Some(font) = &font {
|
|
138
|
+
let scale = Scale::uniform(16.0);
|
|
139
|
+
let text = index.to_string();
|
|
140
|
+
draw_text_mut(&mut img, Rgba([255, 255, 255, 255]), x + 2, y + 2, scale, font, &text);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// 6. Save or return
|
|
145
|
+
let mut bytes: Vec<u8> = Vec::new();
|
|
146
|
+
img.write_to(&mut Cursor::new(&mut bytes), image::ImageOutputFormat::Png)
|
|
147
|
+
.map_err(|e| BrowserError::ScreenshotFailed(format!("Failed to encode annotated image: {}", e)))?;
|
|
148
|
+
|
|
149
|
+
let mut result_data = serde_json::Map::new();
|
|
150
|
+
result_data.insert("map".to_string(), serde_json::to_value(&map).unwrap());
|
|
151
|
+
|
|
152
|
+
if params.return_base64 {
|
|
153
|
+
let base64_string = BASE64.encode(&bytes);
|
|
154
|
+
result_data.insert("image_base64".to_string(), serde_json::Value::String(base64_string));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if let Some(path) = params.path {
|
|
158
|
+
std::fs::write(&path, &bytes)
|
|
159
|
+
.map_err(|e| BrowserError::ScreenshotFailed(format!("Failed to save annotated screenshot: {}", e)))?;
|
|
160
|
+
result_data.insert("path".to_string(), serde_json::Value::String(path));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
Ok(ToolResult::success(Some(serde_json::Value::Object(result_data))))
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
use crate::{error::{BrowserError, Result},
|
|
2
|
+
tools::{Tool, ToolContext, ToolResult}};
|
|
3
|
+
use schemars::JsonSchema;
|
|
4
|
+
use serde::{Deserialize, Serialize};
|
|
5
|
+
|
|
6
|
+
/// Parameters for the click tool
|
|
7
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
8
|
+
pub struct ClickParams {
|
|
9
|
+
/// CSS selector (use either this or index, not both)
|
|
10
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
11
|
+
pub selector: Option<String>,
|
|
12
|
+
|
|
13
|
+
/// Element index from DOM tree (use either this or selector, not both)
|
|
14
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
15
|
+
pub index: Option<usize>,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// Tool for clicking elements
|
|
19
|
+
#[derive(Default)]
|
|
20
|
+
pub struct ClickTool;
|
|
21
|
+
|
|
22
|
+
impl Tool for ClickTool {
|
|
23
|
+
type Params = ClickParams;
|
|
24
|
+
|
|
25
|
+
fn name(&self) -> &str {
|
|
26
|
+
"click"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fn execute_typed(&self, params: ClickParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
30
|
+
// Validate that exactly one selector method is provided
|
|
31
|
+
match (¶ms.selector, ¶ms.index) {
|
|
32
|
+
(Some(_), Some(_)) => {
|
|
33
|
+
return Err(BrowserError::ToolExecutionFailed {
|
|
34
|
+
tool: "click".to_string(),
|
|
35
|
+
reason: "Cannot specify both 'selector' and 'index'. Use one or the other.".to_string(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
(None, None) => {
|
|
39
|
+
return Err(BrowserError::ToolExecutionFailed {
|
|
40
|
+
tool: "click".to_string(),
|
|
41
|
+
reason: "Must specify either 'selector' or 'index'.".to_string(),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
_ => {}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if let Some(selector) = params.selector {
|
|
48
|
+
// CSS selector path
|
|
49
|
+
let tab = context.session.tab()?;
|
|
50
|
+
let element = context.session.find_element(&tab, &selector)?;
|
|
51
|
+
element
|
|
52
|
+
.click()
|
|
53
|
+
.map_err(|e| BrowserError::ToolExecutionFailed { tool: "click".to_string(), reason: e.to_string() })?;
|
|
54
|
+
|
|
55
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
56
|
+
"selector": selector,
|
|
57
|
+
"method": "css"
|
|
58
|
+
})))
|
|
59
|
+
} else if let Some(index) = params.index {
|
|
60
|
+
// Index path - convert index to CSS selector
|
|
61
|
+
let css_selector = {
|
|
62
|
+
let dom = context.get_dom()?;
|
|
63
|
+
let selector = dom
|
|
64
|
+
.get_selector(index)
|
|
65
|
+
.ok_or_else(|| BrowserError::ElementNotFound(format!("No element with index {}", index)))?;
|
|
66
|
+
selector.clone()
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
let tab = context.session.tab()?;
|
|
70
|
+
let element = context.session.find_element(&tab, &css_selector)?;
|
|
71
|
+
element
|
|
72
|
+
.click()
|
|
73
|
+
.map_err(|e| BrowserError::ToolExecutionFailed { tool: "click".to_string(), reason: e.to_string() })?;
|
|
74
|
+
|
|
75
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
76
|
+
"index": index,
|
|
77
|
+
"selector": css_selector,
|
|
78
|
+
"method": "index"
|
|
79
|
+
})))
|
|
80
|
+
} else {
|
|
81
|
+
unreachable!("Validation above ensures one field is Some")
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
use crate::{error::{BrowserError, Result},
|
|
2
|
+
tools::{Tool, ToolContext, ToolResult}};
|
|
3
|
+
use schemars::JsonSchema;
|
|
4
|
+
use serde::{Deserialize, Serialize};
|
|
5
|
+
|
|
6
|
+
/// Parameters for the close tool (no parameters needed)
|
|
7
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
8
|
+
pub struct CloseParams {}
|
|
9
|
+
|
|
10
|
+
/// Tool for closing the browser
|
|
11
|
+
#[derive(Default)]
|
|
12
|
+
pub struct CloseTool;
|
|
13
|
+
|
|
14
|
+
impl Tool for CloseTool {
|
|
15
|
+
type Params = CloseParams;
|
|
16
|
+
|
|
17
|
+
fn name(&self) -> &str {
|
|
18
|
+
"close"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn execute_typed(&self, _params: CloseParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
22
|
+
// Note: Closing the browser via BrowserSession is tricky because we hold a reference
|
|
23
|
+
// In a real implementation, this would need to signal the session owner to close
|
|
24
|
+
// For now, we'll close all tabs as a proxy for closing the browser
|
|
25
|
+
|
|
26
|
+
context
|
|
27
|
+
.session
|
|
28
|
+
.close()
|
|
29
|
+
.map_err(|e| BrowserError::ToolExecutionFailed { tool: "close".to_string(), reason: e.to_string() })?;
|
|
30
|
+
|
|
31
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
32
|
+
"message": "Browser closed successfully"
|
|
33
|
+
})))
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
use crate::{error::Result,
|
|
2
|
+
tools::{Tool, ToolContext, ToolResult}};
|
|
3
|
+
use schemars::JsonSchema;
|
|
4
|
+
use serde::{Deserialize, Serialize};
|
|
5
|
+
|
|
6
|
+
/// Parameters for the close_tab tool (no parameters needed)
|
|
7
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
8
|
+
pub struct CloseTabParams {}
|
|
9
|
+
|
|
10
|
+
/// Tool for closing the current active tab
|
|
11
|
+
#[derive(Default)]
|
|
12
|
+
pub struct CloseTabTool;
|
|
13
|
+
|
|
14
|
+
impl Tool for CloseTabTool {
|
|
15
|
+
type Params = CloseTabParams;
|
|
16
|
+
|
|
17
|
+
fn name(&self) -> &str {
|
|
18
|
+
"close_tab"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn execute_typed(&self, _params: CloseTabParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
22
|
+
// Get the current tab info before closing
|
|
23
|
+
let active_tab = context.session.tab()?;
|
|
24
|
+
let tab_title = active_tab.get_title().unwrap_or_default();
|
|
25
|
+
let tab_url = active_tab.get_url();
|
|
26
|
+
|
|
27
|
+
// Get the current tab index
|
|
28
|
+
let tabs = context.session.get_tabs()?;
|
|
29
|
+
let current_index = tabs.iter().position(|tab| std::sync::Arc::ptr_eq(tab, &active_tab)).unwrap_or(0);
|
|
30
|
+
|
|
31
|
+
// Close the active tab
|
|
32
|
+
active_tab
|
|
33
|
+
.close(true)
|
|
34
|
+
.map_err(|e| crate::error::BrowserError::TabOperationFailed(format!("Failed to close tab: {}", e)))?;
|
|
35
|
+
|
|
36
|
+
let message = format!("Closed tab [{}]: {} ({})", current_index, tab_title, tab_url);
|
|
37
|
+
|
|
38
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
39
|
+
"index": current_index,
|
|
40
|
+
"title": tab_title,
|
|
41
|
+
"url": tab_url,
|
|
42
|
+
"message": message
|
|
43
|
+
})))
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Enhanced JavaScript code to convert HTML to markdown using Mozilla Readability
|
|
2
|
+
// Based on UI-TARS implementation
|
|
3
|
+
// Returns JSON string with title, HTML content, and metadata
|
|
4
|
+
|
|
5
|
+
(function () {
|
|
6
|
+
try {
|
|
7
|
+
// Load Readability constructor from the injected script
|
|
8
|
+
// The script should be injected as READABILITY_SCRIPT constant
|
|
9
|
+
if (typeof READABILITY_SCRIPT === "undefined") {
|
|
10
|
+
throw new Error(
|
|
11
|
+
"READABILITY_SCRIPT not defined. Readability.js must be injected first.",
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Always re-evaluate Readability to ensure fresh instance
|
|
16
|
+
// This prevents issues with state pollution between multiple calls
|
|
17
|
+
// Use Function constructor instead of eval to create a clean scope
|
|
18
|
+
var ReadabilityConstructor;
|
|
19
|
+
var __readabilityModule = { exports: {} };
|
|
20
|
+
|
|
21
|
+
// Create an isolated function scope for Readability
|
|
22
|
+
var loadReadability = new Function(
|
|
23
|
+
"module",
|
|
24
|
+
"exports",
|
|
25
|
+
READABILITY_SCRIPT + "; return module.exports;",
|
|
26
|
+
);
|
|
27
|
+
ReadabilityConstructor = loadReadability(
|
|
28
|
+
__readabilityModule,
|
|
29
|
+
__readabilityModule.exports,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
if (!ReadabilityConstructor) {
|
|
33
|
+
throw new Error("Failed to load Readability constructor");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Clone the document to avoid DOM flickering (visual artifacts)
|
|
37
|
+
// This prevents the page from changing appearance during extraction
|
|
38
|
+
// Use deep clone with true parameter to ensure all children are cloned
|
|
39
|
+
var documentClone = document.cloneNode(true);
|
|
40
|
+
|
|
41
|
+
// Clean up unwanted elements from the clone
|
|
42
|
+
// These elements don't contribute to the main content and can interfere with extraction
|
|
43
|
+
var elementsToRemove = [
|
|
44
|
+
"script", // JavaScript code
|
|
45
|
+
"noscript", // Fallback content
|
|
46
|
+
"style", // CSS styles
|
|
47
|
+
"link", // External resources
|
|
48
|
+
"svg", // Vector graphics
|
|
49
|
+
"img", // Images (handled separately by Readability)
|
|
50
|
+
"video", // Videos
|
|
51
|
+
"iframe", // Embedded frames
|
|
52
|
+
"canvas", // Canvas elements
|
|
53
|
+
".reflist", // Reference lists (Wikipedia-style)
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
documentClone
|
|
57
|
+
.querySelectorAll(elementsToRemove.join(","))
|
|
58
|
+
.forEach(function (el) {
|
|
59
|
+
el.remove();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Use Mozilla Readability algorithm to extract main content
|
|
63
|
+
// This filters out navigation, ads, sidebars, etc.
|
|
64
|
+
var reader = new ReadabilityConstructor(documentClone);
|
|
65
|
+
var article = reader.parse();
|
|
66
|
+
|
|
67
|
+
if (!article) {
|
|
68
|
+
// Readability failed to extract content, fall back to basic extraction
|
|
69
|
+
// This can happen on pages with insufficient content or unusual structure
|
|
70
|
+
var fallbackContent = document.body ? document.body.innerHTML : "";
|
|
71
|
+
var fallbackText = document.body ? document.body.textContent : "";
|
|
72
|
+
|
|
73
|
+
return JSON.stringify({
|
|
74
|
+
title: document.title || "",
|
|
75
|
+
content: fallbackContent,
|
|
76
|
+
textContent: fallbackText,
|
|
77
|
+
url: window.location.href,
|
|
78
|
+
excerpt: "",
|
|
79
|
+
byline: "",
|
|
80
|
+
siteName: "",
|
|
81
|
+
length: fallbackText.length,
|
|
82
|
+
lang: document.documentElement.lang || "",
|
|
83
|
+
dir: document.documentElement.dir || "",
|
|
84
|
+
publishedTime: "",
|
|
85
|
+
readabilityFailed: true,
|
|
86
|
+
error: "Readability.parse() returned null - using fallback extraction",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Return structured data as JSON string
|
|
91
|
+
// The HTML content will be converted to Markdown on the Rust side
|
|
92
|
+
return JSON.stringify({
|
|
93
|
+
title: article.title || document.title || "",
|
|
94
|
+
content: article.content || "", // Main HTML content
|
|
95
|
+
textContent: article.textContent || "", // Plain text version
|
|
96
|
+
url: window.location.href,
|
|
97
|
+
excerpt: article.excerpt || "",
|
|
98
|
+
byline: article.byline || "",
|
|
99
|
+
siteName: article.siteName || "",
|
|
100
|
+
length: article.length || 0,
|
|
101
|
+
lang: article.lang || document.documentElement.lang || "",
|
|
102
|
+
dir: article.dir || document.documentElement.dir || "",
|
|
103
|
+
publishedTime: article.publishedTime || "",
|
|
104
|
+
readabilityFailed: false,
|
|
105
|
+
});
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// If anything goes wrong, return error information
|
|
108
|
+
return JSON.stringify({
|
|
109
|
+
title: document.title || "",
|
|
110
|
+
content: "",
|
|
111
|
+
textContent: "",
|
|
112
|
+
url: window.location.href,
|
|
113
|
+
error: error.message + " (stack: " + (error.stack || "no stack") + ")",
|
|
114
|
+
readabilityFailed: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
})();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
use crate::{error::Result, tools::{Tool, ToolContext, ToolResult}};
|
|
2
|
+
use serde::{Deserialize, Serialize};
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
|
|
5
|
+
pub struct GetCookiesParams {
|
|
6
|
+
/// Optional list of URLs to filter cookies by
|
|
7
|
+
pub urls: Option<Vec<String>>,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
|
|
11
|
+
pub struct CookieParam {
|
|
12
|
+
pub name: String,
|
|
13
|
+
pub value: String,
|
|
14
|
+
pub domain: Option<String>,
|
|
15
|
+
pub path: Option<String>,
|
|
16
|
+
pub secure: Option<bool>,
|
|
17
|
+
pub http_only: Option<bool>,
|
|
18
|
+
pub same_site: Option<String>,
|
|
19
|
+
pub expires: Option<f64>,
|
|
20
|
+
pub url: Option<String>,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
|
|
24
|
+
pub struct SetCookiesParams {
|
|
25
|
+
pub cookies: Vec<CookieParam>,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
#[derive(Default)]
|
|
29
|
+
pub struct GetCookiesTool;
|
|
30
|
+
|
|
31
|
+
impl Tool for GetCookiesTool {
|
|
32
|
+
type Params = GetCookiesParams;
|
|
33
|
+
|
|
34
|
+
fn name(&self) -> &str {
|
|
35
|
+
"get_cookies"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
fn execute_typed(&self, _params: Self::Params, context: &mut ToolContext) -> Result<ToolResult> {
|
|
39
|
+
let cookies = context.session.get_cookies()?;
|
|
40
|
+
Ok(ToolResult::success_with(cookies))
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#[derive(Default)]
|
|
45
|
+
pub struct SetCookiesTool;
|
|
46
|
+
|
|
47
|
+
impl Tool for SetCookiesTool {
|
|
48
|
+
type Params = SetCookiesParams;
|
|
49
|
+
|
|
50
|
+
fn name(&self) -> &str {
|
|
51
|
+
"set_cookies"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fn execute_typed(&self, params: Self::Params, context: &mut ToolContext) -> Result<ToolResult> {
|
|
55
|
+
context.session.set_cookies(params.cookies)?;
|
|
56
|
+
Ok(ToolResult::success(None))
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
use crate::{browser::debug::{ConsoleLog, NetworkError}, error::Result, tools::{Tool, ToolContext, ToolResult}};
|
|
2
|
+
use serde::{Deserialize, Serialize};
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
|
|
5
|
+
pub struct GetConsoleLogsParams {
|
|
6
|
+
// No params needed, gets all logs since session start
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
#[derive(Debug, Serialize, Deserialize, schemars::JsonSchema)]
|
|
10
|
+
pub struct GetNetworkErrorsParams {
|
|
11
|
+
// No params needed
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
#[derive(Default)]
|
|
15
|
+
pub struct GetConsoleLogsTool;
|
|
16
|
+
|
|
17
|
+
impl Tool for GetConsoleLogsTool {
|
|
18
|
+
type Params = GetConsoleLogsParams;
|
|
19
|
+
|
|
20
|
+
fn name(&self) -> &str {
|
|
21
|
+
"get_console_logs"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fn execute_typed(&self, _params: Self::Params, context: &mut ToolContext) -> Result<ToolResult> {
|
|
25
|
+
let logs = context.session.get_console_logs()?;
|
|
26
|
+
Ok(ToolResult::success_with(logs))
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[derive(Default)]
|
|
31
|
+
pub struct GetNetworkErrorsTool;
|
|
32
|
+
|
|
33
|
+
impl Tool for GetNetworkErrorsTool {
|
|
34
|
+
type Params = GetNetworkErrorsParams;
|
|
35
|
+
|
|
36
|
+
fn name(&self) -> &str {
|
|
37
|
+
"get_network_errors"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
fn execute_typed(&self, _params: Self::Params, context: &mut ToolContext) -> Result<ToolResult> {
|
|
41
|
+
let errors = context.session.get_network_errors()?;
|
|
42
|
+
Ok(ToolResult::success_with(errors))
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
use crate::{error::{BrowserError, Result},
|
|
2
|
+
tools::{Tool, ToolContext, ToolResult}};
|
|
3
|
+
use schemars::JsonSchema;
|
|
4
|
+
use serde::{Deserialize, Serialize};
|
|
5
|
+
use serde_json::Value;
|
|
6
|
+
|
|
7
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
8
|
+
pub struct EvaluateParams {
|
|
9
|
+
/// JavaScript code to execute
|
|
10
|
+
pub code: String,
|
|
11
|
+
|
|
12
|
+
/// Wait for promise resolution (default: false)
|
|
13
|
+
#[serde(default)]
|
|
14
|
+
pub await_promise: bool,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#[derive(Default)]
|
|
18
|
+
pub struct EvaluateTool;
|
|
19
|
+
|
|
20
|
+
impl Tool for EvaluateTool {
|
|
21
|
+
type Params = EvaluateParams;
|
|
22
|
+
|
|
23
|
+
fn name(&self) -> &str {
|
|
24
|
+
"evaluate"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
fn execute_typed(&self, params: EvaluateParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
28
|
+
let result = context
|
|
29
|
+
.session
|
|
30
|
+
.tab()?
|
|
31
|
+
.evaluate(¶ms.code, params.await_promise)
|
|
32
|
+
.map_err(|e| BrowserError::EvaluationFailed(e.to_string()))?;
|
|
33
|
+
|
|
34
|
+
let result_value = result.value.unwrap_or(Value::Null);
|
|
35
|
+
|
|
36
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
37
|
+
"result": result_value
|
|
38
|
+
})))
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
use crate::{error::{BrowserError, Result},
|
|
2
|
+
tools::{Tool, ToolContext, ToolResult}};
|
|
3
|
+
use schemars::JsonSchema;
|
|
4
|
+
use serde::{Deserialize, Serialize};
|
|
5
|
+
|
|
6
|
+
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
|
7
|
+
pub struct ExtractParams {
|
|
8
|
+
/// CSS selector (optional, defaults to body)
|
|
9
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
10
|
+
pub selector: Option<String>,
|
|
11
|
+
|
|
12
|
+
/// Format: "text" or "html"
|
|
13
|
+
#[serde(default = "default_format")]
|
|
14
|
+
pub format: String,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
fn default_format() -> String {
|
|
18
|
+
"text".to_string()
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#[derive(Default)]
|
|
22
|
+
pub struct ExtractContentTool;
|
|
23
|
+
|
|
24
|
+
impl Tool for ExtractContentTool {
|
|
25
|
+
type Params = ExtractParams;
|
|
26
|
+
|
|
27
|
+
fn name(&self) -> &str {
|
|
28
|
+
"extract"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fn execute_typed(&self, params: ExtractParams, context: &mut ToolContext) -> Result<ToolResult> {
|
|
32
|
+
let content = if let Some(selector) = ¶ms.selector {
|
|
33
|
+
let tab = context.session.tab()?;
|
|
34
|
+
let element = context.session.find_element(&tab, selector)?;
|
|
35
|
+
|
|
36
|
+
if params.format == "html" {
|
|
37
|
+
element.get_content().map_err(|e| BrowserError::ToolExecutionFailed {
|
|
38
|
+
tool: "extract".to_string(),
|
|
39
|
+
reason: e.to_string(),
|
|
40
|
+
})?
|
|
41
|
+
} else {
|
|
42
|
+
element.get_inner_text().map_err(|e| BrowserError::ToolExecutionFailed {
|
|
43
|
+
tool: "extract".to_string(),
|
|
44
|
+
reason: e.to_string(),
|
|
45
|
+
})?
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
// Extract from body
|
|
49
|
+
let js_code = if params.format == "html" { "document.body.innerHTML" } else { "document.body.innerText" };
|
|
50
|
+
|
|
51
|
+
let result = context
|
|
52
|
+
.session
|
|
53
|
+
.tab()?
|
|
54
|
+
.evaluate(js_code, false)
|
|
55
|
+
.map_err(|e| BrowserError::EvaluationFailed(e.to_string()))?;
|
|
56
|
+
|
|
57
|
+
result.value.and_then(|v| v.as_str().map(String::from)).unwrap_or_default()
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
Ok(ToolResult::success_with(serde_json::json!({
|
|
61
|
+
"content": content,
|
|
62
|
+
"format": params.format,
|
|
63
|
+
"length": content.len()
|
|
64
|
+
})))
|
|
65
|
+
}
|
|
66
|
+
}
|