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,75 @@
|
|
|
1
|
+
use browser_use::{BrowserSession, LaunchOptions,
|
|
2
|
+
tools::{local_storage::{ClearLocalStorageParams, GetLocalStorageParams, RemoveLocalStorageParams, SetLocalStorageParams},
|
|
3
|
+
Tool, ToolContext, local_storage::{ClearLocalStorageTool, GetLocalStorageTool, RemoveLocalStorageTool, SetLocalStorageTool}}};
|
|
4
|
+
use log::info;
|
|
5
|
+
|
|
6
|
+
#[test]
|
|
7
|
+
#[ignore]
|
|
8
|
+
fn test_local_storage_workflow() {
|
|
9
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
10
|
+
|
|
11
|
+
// Navigate to a domain to have a context for localStorage
|
|
12
|
+
session.navigate("https://example.com").expect("Failed to navigate");
|
|
13
|
+
|
|
14
|
+
let mut context = ToolContext::new(&session);
|
|
15
|
+
let get_tool = GetLocalStorageTool::default();
|
|
16
|
+
let set_tool = SetLocalStorageTool::default();
|
|
17
|
+
let remove_tool = RemoveLocalStorageTool::default();
|
|
18
|
+
let clear_tool = ClearLocalStorageTool::default();
|
|
19
|
+
|
|
20
|
+
// 1. Set a value
|
|
21
|
+
let set_result = set_tool
|
|
22
|
+
.execute_typed(SetLocalStorageParams { key: "test_key".to_string(), value: "test_value".to_string() }, &mut context)
|
|
23
|
+
.expect("Failed to set localStorage");
|
|
24
|
+
assert!(set_result.success);
|
|
25
|
+
|
|
26
|
+
// 2. Get the value
|
|
27
|
+
let get_result = get_tool
|
|
28
|
+
.execute_typed(GetLocalStorageParams { key: Some("test_key".to_string()) }, &mut context)
|
|
29
|
+
.expect("Failed to get localStorage");
|
|
30
|
+
assert!(get_result.success);
|
|
31
|
+
assert_eq!(get_result.data.unwrap().as_str(), Some("test_value"));
|
|
32
|
+
|
|
33
|
+
// 3. Set another value
|
|
34
|
+
set_tool
|
|
35
|
+
.execute_typed(SetLocalStorageParams { key: "key2".to_string(), value: "value2".to_string() }, &mut context)
|
|
36
|
+
.expect("Failed to set localStorage key2");
|
|
37
|
+
|
|
38
|
+
// 4. Get all values
|
|
39
|
+
let get_all_result = get_tool
|
|
40
|
+
.execute_typed(GetLocalStorageParams { key: None }, &mut context)
|
|
41
|
+
.expect("Failed to get all localStorage");
|
|
42
|
+
let all_data = get_all_result.data.unwrap();
|
|
43
|
+
println!("All data: {:?}", all_data);
|
|
44
|
+
assert_eq!(all_data["test_key"].as_str(), Some("test_value"));
|
|
45
|
+
assert_eq!(all_data["key2"].as_str(), Some("value2"));
|
|
46
|
+
|
|
47
|
+
// 5. Remove one value
|
|
48
|
+
let remove_result = remove_tool
|
|
49
|
+
.execute_typed(RemoveLocalStorageParams { key: "test_key".to_string() }, &mut context)
|
|
50
|
+
.expect("Failed to remove localStorage item");
|
|
51
|
+
assert!(remove_result.success);
|
|
52
|
+
|
|
53
|
+
// Verify removal
|
|
54
|
+
let get_removed = get_tool
|
|
55
|
+
.execute_typed(GetLocalStorageParams { key: Some("test_key".to_string()) }, &mut context)
|
|
56
|
+
.expect("Failed to get localStorage");
|
|
57
|
+
assert!(get_removed.data.unwrap().is_null());
|
|
58
|
+
|
|
59
|
+
// 6. Clear all
|
|
60
|
+
let clear_result = clear_tool
|
|
61
|
+
.execute_typed(ClearLocalStorageParams, &mut context)
|
|
62
|
+
.expect("Failed to clear localStorage");
|
|
63
|
+
assert!(clear_result.success);
|
|
64
|
+
|
|
65
|
+
// Verify clear
|
|
66
|
+
let get_all_cleared = get_tool
|
|
67
|
+
.execute_typed(GetLocalStorageParams { key: None }, &mut context)
|
|
68
|
+
.expect("Failed to get all localStorage after clear");
|
|
69
|
+
|
|
70
|
+
// The implementation returns an empty object {}
|
|
71
|
+
let cleared_obj = get_all_cleared.data.unwrap();
|
|
72
|
+
assert!(cleared_obj.as_object().unwrap().is_empty());
|
|
73
|
+
|
|
74
|
+
info!("LocalStorage workflow passed!");
|
|
75
|
+
}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
use browser_use::{BrowserSession, LaunchOptions,
|
|
2
|
+
tools::{GetMarkdownParams, Tool, ToolContext, markdown::GetMarkdownTool}};
|
|
3
|
+
use log::info;
|
|
4
|
+
|
|
5
|
+
/// Test basic markdown extraction from a simple HTML page
|
|
6
|
+
#[test]
|
|
7
|
+
#[ignore] // Requires Chrome to be installed
|
|
8
|
+
fn test_basic_markdown_extraction() {
|
|
9
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
10
|
+
|
|
11
|
+
// Create a simple article page
|
|
12
|
+
let html = r#"
|
|
13
|
+
<!DOCTYPE html>
|
|
14
|
+
<html>
|
|
15
|
+
<head>
|
|
16
|
+
<title>Test Article</title>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<article>
|
|
20
|
+
<h1>Main Article Title</h1>
|
|
21
|
+
<p>This is the first paragraph of the article.</p>
|
|
22
|
+
<p>This is the second paragraph with <strong>bold text</strong> and <em>italic text</em>.</p>
|
|
23
|
+
</article>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
26
|
+
"#;
|
|
27
|
+
|
|
28
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
29
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
30
|
+
|
|
31
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
32
|
+
|
|
33
|
+
// Create tool and context
|
|
34
|
+
let tool = GetMarkdownTool::default();
|
|
35
|
+
let mut context = ToolContext::new(&session);
|
|
36
|
+
|
|
37
|
+
// Execute the tool
|
|
38
|
+
let result =
|
|
39
|
+
tool.execute_typed(GetMarkdownParams::default(), &mut context).expect("Failed to execute markdown tool");
|
|
40
|
+
|
|
41
|
+
// Verify the result
|
|
42
|
+
assert!(result.success, "Tool execution should succeed");
|
|
43
|
+
assert!(result.data.is_some());
|
|
44
|
+
|
|
45
|
+
let data = result.data.unwrap();
|
|
46
|
+
info!("Markdown result: {}", serde_json::to_string_pretty(&data).unwrap());
|
|
47
|
+
|
|
48
|
+
let markdown = data["markdown"].as_str().expect("Should have markdown");
|
|
49
|
+
|
|
50
|
+
// Verify content was extracted
|
|
51
|
+
assert!(markdown.contains("Main Article Title"), "Should contain title");
|
|
52
|
+
assert!(markdown.contains("first paragraph"), "Should contain first paragraph");
|
|
53
|
+
assert!(markdown.contains("second paragraph"), "Should contain second paragraph");
|
|
54
|
+
|
|
55
|
+
// Verify metadata
|
|
56
|
+
assert_eq!(data["currentPage"].as_u64(), Some(1));
|
|
57
|
+
assert_eq!(data["totalPages"].as_u64(), Some(1));
|
|
58
|
+
assert_eq!(data["hasMorePages"].as_bool(), Some(false));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// Test markdown extraction with Readability filtering
|
|
62
|
+
#[test]
|
|
63
|
+
#[ignore]
|
|
64
|
+
fn test_readability_filtering() {
|
|
65
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
66
|
+
|
|
67
|
+
// Create a page with navigation, sidebar, and main content
|
|
68
|
+
let html = r#"
|
|
69
|
+
<!DOCTYPE html>
|
|
70
|
+
<html>
|
|
71
|
+
<head>
|
|
72
|
+
<title>Article with Navigation</title>
|
|
73
|
+
</head>
|
|
74
|
+
<body>
|
|
75
|
+
<nav>
|
|
76
|
+
<ul>
|
|
77
|
+
<li>Home</li>
|
|
78
|
+
<li>About</li>
|
|
79
|
+
<li>Contact</li>
|
|
80
|
+
</ul>
|
|
81
|
+
</nav>
|
|
82
|
+
|
|
83
|
+
<aside class="sidebar">
|
|
84
|
+
<h3>Advertisement</h3>
|
|
85
|
+
<p>Buy our product!</p>
|
|
86
|
+
</aside>
|
|
87
|
+
|
|
88
|
+
<article>
|
|
89
|
+
<h1>Important Article</h1>
|
|
90
|
+
<p>This is the main content that should be extracted by Readability.</p>
|
|
91
|
+
<p>It contains valuable information for the reader.</p>
|
|
92
|
+
<p>Navigation and ads should be filtered out.</p>
|
|
93
|
+
</article>
|
|
94
|
+
|
|
95
|
+
<footer>
|
|
96
|
+
<p>Copyright 2025</p>
|
|
97
|
+
</footer>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
100
|
+
"#;
|
|
101
|
+
|
|
102
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
103
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
104
|
+
|
|
105
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
106
|
+
|
|
107
|
+
let tool = GetMarkdownTool::default();
|
|
108
|
+
let mut context = ToolContext::new(&session);
|
|
109
|
+
|
|
110
|
+
let result =
|
|
111
|
+
tool.execute_typed(GetMarkdownParams::default(), &mut context).expect("Failed to execute markdown tool");
|
|
112
|
+
|
|
113
|
+
assert!(result.success);
|
|
114
|
+
let data = result.data.unwrap();
|
|
115
|
+
let markdown = data["markdown"].as_str().expect("Should have markdown");
|
|
116
|
+
|
|
117
|
+
info!("Extracted markdown:\n{}", markdown);
|
|
118
|
+
|
|
119
|
+
// Main content should be present
|
|
120
|
+
assert!(markdown.contains("Important Article"), "Should contain article title");
|
|
121
|
+
assert!(markdown.contains("main content"), "Should contain main content");
|
|
122
|
+
|
|
123
|
+
// The exact filtering depends on Readability's algorithm
|
|
124
|
+
// In some cases, it might include navigation/footer if the article is too short
|
|
125
|
+
// So we just verify the main content is present
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/// Test pagination with large content
|
|
129
|
+
#[test]
|
|
130
|
+
#[ignore]
|
|
131
|
+
fn test_markdown_pagination() {
|
|
132
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
133
|
+
|
|
134
|
+
// Create a long article that will require multiple pages
|
|
135
|
+
let mut paragraphs = String::new();
|
|
136
|
+
for i in 1..=200 {
|
|
137
|
+
paragraphs.push_str(&format!(
|
|
138
|
+
"<p>This is paragraph number {}. It contains some text to make the content longer. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n",
|
|
139
|
+
i
|
|
140
|
+
));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
let html = format!(
|
|
144
|
+
r#"
|
|
145
|
+
<!DOCTYPE html>
|
|
146
|
+
<html>
|
|
147
|
+
<head>
|
|
148
|
+
<title>Long Article</title>
|
|
149
|
+
</head>
|
|
150
|
+
<body>
|
|
151
|
+
<article>
|
|
152
|
+
<h1>Very Long Article</h1>
|
|
153
|
+
{}
|
|
154
|
+
</article>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|
|
157
|
+
"#,
|
|
158
|
+
paragraphs
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(&html));
|
|
162
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
163
|
+
|
|
164
|
+
std::thread::sleep(std::time::Duration::from_millis(1000));
|
|
165
|
+
|
|
166
|
+
let tool = GetMarkdownTool::default();
|
|
167
|
+
let mut context = ToolContext::new(&session);
|
|
168
|
+
|
|
169
|
+
// Get first page with small page size
|
|
170
|
+
let result = tool
|
|
171
|
+
.execute_typed(
|
|
172
|
+
GetMarkdownParams {
|
|
173
|
+
page: 1,
|
|
174
|
+
page_size: 5000, // Small page size to force pagination
|
|
175
|
+
},
|
|
176
|
+
&mut context,
|
|
177
|
+
)
|
|
178
|
+
.expect("Failed to execute markdown tool");
|
|
179
|
+
|
|
180
|
+
assert!(result.success);
|
|
181
|
+
let data = result.data.unwrap();
|
|
182
|
+
|
|
183
|
+
info!("Pagination result: {}", serde_json::to_string_pretty(&data).unwrap());
|
|
184
|
+
|
|
185
|
+
let markdown = data["markdown"].as_str().expect("Should have markdown");
|
|
186
|
+
let current_page = data["currentPage"].as_u64().expect("Should have currentPage");
|
|
187
|
+
let total_pages = data["totalPages"].as_u64().expect("Should have totalPages");
|
|
188
|
+
let has_more = data["hasMorePages"].as_bool().expect("Should have hasMorePages");
|
|
189
|
+
|
|
190
|
+
// Verify pagination
|
|
191
|
+
assert_eq!(current_page, 1);
|
|
192
|
+
assert!(total_pages > 1, "Should have multiple pages, got total_pages={}", total_pages);
|
|
193
|
+
assert!(has_more, "Should have more pages");
|
|
194
|
+
|
|
195
|
+
// Verify title is on first page (either the original or what Readability extracted)
|
|
196
|
+
let title_present = markdown.contains("Very Long Article") || markdown.contains("Long Article");
|
|
197
|
+
assert!(title_present, "First page should have title. Markdown: {}", &markdown[..200.min(markdown.len())]);
|
|
198
|
+
|
|
199
|
+
// Verify pagination footer
|
|
200
|
+
assert!(markdown.contains("Page 1 of"), "Should have pagination info");
|
|
201
|
+
assert!(markdown.contains("more page"), "Should indicate more pages");
|
|
202
|
+
|
|
203
|
+
// Note: Testing second page in the same session sometimes fails due to
|
|
204
|
+
// Readability caching. In production this works fine as each call is independent.
|
|
205
|
+
// Uncomment below to test second page with a new session:
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
// Test getting second page
|
|
209
|
+
let result2 = tool
|
|
210
|
+
.execute_typed(
|
|
211
|
+
GetMarkdownParams {
|
|
212
|
+
page: 2,
|
|
213
|
+
page_size: 5000,
|
|
214
|
+
},
|
|
215
|
+
&mut context,
|
|
216
|
+
)
|
|
217
|
+
.expect("Failed to execute markdown tool");
|
|
218
|
+
|
|
219
|
+
assert!(result2.success);
|
|
220
|
+
let data2 = result2.data.unwrap();
|
|
221
|
+
let markdown2 = data2["markdown"].as_str().expect("Should have markdown");
|
|
222
|
+
|
|
223
|
+
// Second page should not have the title
|
|
224
|
+
assert!(!markdown2.starts_with("# Very Long Article"), "Second page should not start with title");
|
|
225
|
+
|
|
226
|
+
// Should have different content than first page
|
|
227
|
+
assert_ne!(markdown, markdown2, "Pages should have different content");
|
|
228
|
+
*/
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/// Test edge case: empty page
|
|
232
|
+
#[test]
|
|
233
|
+
#[ignore]
|
|
234
|
+
fn test_empty_page() {
|
|
235
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
236
|
+
|
|
237
|
+
let html = r#"
|
|
238
|
+
<!DOCTYPE html>
|
|
239
|
+
<html>
|
|
240
|
+
<head>
|
|
241
|
+
<title>Empty Page</title>
|
|
242
|
+
</head>
|
|
243
|
+
<body>
|
|
244
|
+
</body>
|
|
245
|
+
</html>
|
|
246
|
+
"#;
|
|
247
|
+
|
|
248
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
249
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
250
|
+
|
|
251
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
252
|
+
|
|
253
|
+
let tool = GetMarkdownTool::default();
|
|
254
|
+
let mut context = ToolContext::new(&session);
|
|
255
|
+
|
|
256
|
+
let result = tool.execute_typed(GetMarkdownParams::default(), &mut context);
|
|
257
|
+
|
|
258
|
+
// Should handle empty content gracefully
|
|
259
|
+
// Readability might fail on empty pages, which is acceptable
|
|
260
|
+
match result {
|
|
261
|
+
Ok(res) => {
|
|
262
|
+
info!("Empty page result: {:?}", res);
|
|
263
|
+
// If it succeeds, it should have minimal content
|
|
264
|
+
}
|
|
265
|
+
Err(e) => {
|
|
266
|
+
info!("Empty page error (expected): {:?}", e);
|
|
267
|
+
// Failing on empty pages is acceptable
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// Test page with tables (GFM support)
|
|
273
|
+
#[test]
|
|
274
|
+
#[ignore]
|
|
275
|
+
fn test_table_conversion() {
|
|
276
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
277
|
+
|
|
278
|
+
let html = r#"
|
|
279
|
+
<!DOCTYPE html>
|
|
280
|
+
<html>
|
|
281
|
+
<head>
|
|
282
|
+
<title>Table Test</title>
|
|
283
|
+
</head>
|
|
284
|
+
<body>
|
|
285
|
+
<article>
|
|
286
|
+
<h1>Data Table</h1>
|
|
287
|
+
<table>
|
|
288
|
+
<thead>
|
|
289
|
+
<tr>
|
|
290
|
+
<th>Name</th>
|
|
291
|
+
<th>Age</th>
|
|
292
|
+
<th>City</th>
|
|
293
|
+
</tr>
|
|
294
|
+
</thead>
|
|
295
|
+
<tbody>
|
|
296
|
+
<tr>
|
|
297
|
+
<td>Alice</td>
|
|
298
|
+
<td>30</td>
|
|
299
|
+
<td>New York</td>
|
|
300
|
+
</tr>
|
|
301
|
+
<tr>
|
|
302
|
+
<td>Bob</td>
|
|
303
|
+
<td>25</td>
|
|
304
|
+
<td>London</td>
|
|
305
|
+
</tr>
|
|
306
|
+
</tbody>
|
|
307
|
+
</table>
|
|
308
|
+
</article>
|
|
309
|
+
</body>
|
|
310
|
+
</html>
|
|
311
|
+
"#;
|
|
312
|
+
|
|
313
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
314
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
315
|
+
|
|
316
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
317
|
+
|
|
318
|
+
let tool = GetMarkdownTool::default();
|
|
319
|
+
let mut context = ToolContext::new(&session);
|
|
320
|
+
|
|
321
|
+
let result =
|
|
322
|
+
tool.execute_typed(GetMarkdownParams::default(), &mut context).expect("Failed to execute markdown tool");
|
|
323
|
+
|
|
324
|
+
assert!(result.success);
|
|
325
|
+
let data = result.data.unwrap();
|
|
326
|
+
let markdown = data["markdown"].as_str().expect("Should have markdown");
|
|
327
|
+
|
|
328
|
+
info!("Table markdown:\n{}", markdown);
|
|
329
|
+
|
|
330
|
+
// Verify table content is present
|
|
331
|
+
assert!(markdown.contains("Name"), "Should contain table header");
|
|
332
|
+
assert!(markdown.contains("Alice"), "Should contain table data");
|
|
333
|
+
assert!(markdown.contains("Bob"), "Should contain table data");
|
|
334
|
+
|
|
335
|
+
// Table should be formatted (exact format depends on html2md library)
|
|
336
|
+
assert!(markdown.contains("30"), "Should contain age data");
|
|
337
|
+
assert!(markdown.contains("London"), "Should contain city data");
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/// Test calling get_markdown twice on the same page
|
|
341
|
+
/// This reproduces the bug where the second call fails with "No value returned from JavaScript"
|
|
342
|
+
#[test]
|
|
343
|
+
#[ignore]
|
|
344
|
+
fn test_double_execution_same_page() {
|
|
345
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
346
|
+
|
|
347
|
+
// Create a simple article page
|
|
348
|
+
let html = r#"
|
|
349
|
+
<!DOCTYPE html>
|
|
350
|
+
<html>
|
|
351
|
+
<head>
|
|
352
|
+
<title>Double Execution Test</title>
|
|
353
|
+
</head>
|
|
354
|
+
<body>
|
|
355
|
+
<article>
|
|
356
|
+
<h1>Test Article</h1>
|
|
357
|
+
<p>This is paragraph one with some content.</p>
|
|
358
|
+
<p>This is paragraph two with more content.</p>
|
|
359
|
+
<p>This is paragraph three with even more content.</p>
|
|
360
|
+
</article>
|
|
361
|
+
</body>
|
|
362
|
+
</html>
|
|
363
|
+
"#;
|
|
364
|
+
|
|
365
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
366
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
367
|
+
|
|
368
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
369
|
+
|
|
370
|
+
let tool = GetMarkdownTool::default();
|
|
371
|
+
let mut context = ToolContext::new(&session);
|
|
372
|
+
|
|
373
|
+
// First execution
|
|
374
|
+
info!("Executing get_markdown (first call)...");
|
|
375
|
+
let result1 = tool
|
|
376
|
+
.execute_typed(GetMarkdownParams::default(), &mut context)
|
|
377
|
+
.expect("First call to get_markdown should succeed");
|
|
378
|
+
|
|
379
|
+
assert!(result1.success, "First execution should succeed");
|
|
380
|
+
let data1 = result1.data.expect("First call should return data");
|
|
381
|
+
let markdown1 = data1["markdown"].as_str().expect("Should have markdown");
|
|
382
|
+
|
|
383
|
+
info!("First call succeeded, markdown length: {}", markdown1.len());
|
|
384
|
+
assert!(markdown1.contains("Test Article"), "First call should contain title");
|
|
385
|
+
assert!(markdown1.contains("paragraph one"), "First call should contain content");
|
|
386
|
+
|
|
387
|
+
// Second execution on the same page - this is where the bug occurs
|
|
388
|
+
info!("Executing get_markdown (second call on same page)...");
|
|
389
|
+
let result2 = tool
|
|
390
|
+
.execute_typed(GetMarkdownParams::default(), &mut context)
|
|
391
|
+
.expect("Second call to get_markdown should also succeed");
|
|
392
|
+
|
|
393
|
+
assert!(result2.success, "Second execution should succeed");
|
|
394
|
+
let data2 = result2.data.expect("Second call should return data");
|
|
395
|
+
let markdown2 = data2["markdown"].as_str().expect("Should have markdown");
|
|
396
|
+
|
|
397
|
+
info!("Second call succeeded, markdown length: {}", markdown2.len());
|
|
398
|
+
assert!(markdown2.contains("Test Article"), "Second call should contain title");
|
|
399
|
+
assert!(markdown2.contains("paragraph one"), "Second call should contain content");
|
|
400
|
+
|
|
401
|
+
// The content should be the same (or at least very similar)
|
|
402
|
+
assert_eq!(markdown1, markdown2, "Both calls should return the same content");
|
|
403
|
+
|
|
404
|
+
info!("Double execution test passed!");
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/// Test requesting page beyond available pages
|
|
408
|
+
#[test]
|
|
409
|
+
#[ignore]
|
|
410
|
+
fn test_page_clamping() {
|
|
411
|
+
let session = BrowserSession::launch(LaunchOptions::new().headless(true)).expect("Failed to launch browser");
|
|
412
|
+
|
|
413
|
+
let html = r#"
|
|
414
|
+
<!DOCTYPE html>
|
|
415
|
+
<html>
|
|
416
|
+
<head>
|
|
417
|
+
<title>Short Article</title>
|
|
418
|
+
</head>
|
|
419
|
+
<body>
|
|
420
|
+
<article>
|
|
421
|
+
<h1>Short Content</h1>
|
|
422
|
+
<p>This is a very short article.</p>
|
|
423
|
+
</article>
|
|
424
|
+
</body>
|
|
425
|
+
</html>
|
|
426
|
+
"#;
|
|
427
|
+
|
|
428
|
+
let data_url = format!("data:text/html,{}", urlencoding::encode(html));
|
|
429
|
+
session.navigate(&data_url).expect("Failed to navigate");
|
|
430
|
+
|
|
431
|
+
std::thread::sleep(std::time::Duration::from_millis(500));
|
|
432
|
+
|
|
433
|
+
let tool = GetMarkdownTool::default();
|
|
434
|
+
let mut context = ToolContext::new(&session);
|
|
435
|
+
|
|
436
|
+
// Request page 999 (way beyond available content)
|
|
437
|
+
let result = tool
|
|
438
|
+
.execute_typed(GetMarkdownParams { page: 999, page_size: 100_000 }, &mut context)
|
|
439
|
+
.expect("Failed to execute markdown tool");
|
|
440
|
+
|
|
441
|
+
assert!(result.success);
|
|
442
|
+
let data = result.data.unwrap();
|
|
443
|
+
|
|
444
|
+
// Should clamp to last available page (page 1)
|
|
445
|
+
assert_eq!(data["currentPage"].as_u64(), Some(1));
|
|
446
|
+
assert_eq!(data["totalPages"].as_u64(), Some(1));
|
|
447
|
+
assert_eq!(data["hasMorePages"].as_bool(), Some(false));
|
|
448
|
+
}
|