15 lines
376 KiB
Plaintext
15 lines
376 KiB
Plaintext
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"session.started","ts":"2026-06-01T08:13:06.906Z","seq":1,"sourceSeq":1,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"trigger":"user","sessionFile":"/home/yangxuan/.openclaw/agents/main/sessions/5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d.jsonl","workspaceDir":"/home/yangxuan/.openclaw/workspace","agentId":"main","messageProvider":"webchat","localModelLean":false,"toolCount":16,"clientToolCount":0}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"trace.metadata","ts":"2026-06-01T08:13:06.909Z","seq":2,"sourceSeq":2,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"capturedAt":"2026-06-01T08:13:06.907Z","harness":{"type":"openclaw","name":"OpenClaw","version":"2026.5.28","gitSha":"5c39670","os":{"platform":"linux","arch":"x64","release":"6.6.87.2-microsoft-standard-WSL2","label":"linux 6.6.87.2-microsoft-standard-WSL2 (x64)"},"runtime":{"node":"v25.2.0"},"invocation":["~/.nvm/versions/node/v25.2.0/bin/node","~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/index.js","gateway","--port","18789"],"entrypoint":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/index.js","workspaceDir":"$OPENCLAW_STATE_DIR/workspace","sessionFile":"$OPENCLAW_STATE_DIR/agents/main/sessions/5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d.jsonl"},"model":{"provider":"deepseek","name":"deepseek-v4-flash","api":"openai-completions","fastMode":false,"thinkLevel":"off","reasoningLevel":"off"},"config":{"redacted":{"meta":{"lastTouchedVersion":"2026.5.28","lastTouchedAt":"2026-06-01T02:32:13.669Z"},"wizard":{"lastRunAt":"2026-06-01T02:32:03.942Z","lastRunVersion":"2026.5.28","lastRunCommand":"doctor","lastRunMode":"local"},"auth":{"profiles":{"ollama:default":{"provider":"ollama","mode":"api_key"}}},"models":{"mode":"merge","providers":{"ollama":{"baseUrl":"http://127.0.0.1:11434","api":"ollama","models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"new-api":{"baseUrl":"http://192.168.2.74:3000/v1","api":"openai-completions","request":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"deepseek":{"baseUrl":"https://api.deepseek.com/v1","api":"openai-completions","models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}}},"agents":{"defaults":{"model":{"primary":"new-api/deepseek-v4-flash"},"models":{"ollama/huihui_ai/glm-4.7-flash-abliterated:latest":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"ollama/deepseek-v4-flash:cloud":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"deepseek/deepseek-v4-pro":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"deepseek/deepseek-v4-flash":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/deepseek-v4-flash":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/qwen3.5-plus":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/qwen3.7-max":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/glm-5.1":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"workspace":"/home/yangxuan/.openclaw/workspace","compaction":{"mode":"safeguard"},"timeoutSeconds":3600,"maxConcurrent":2,"subagents":{"maxConcurrent":4,"archiveAfterMinutes":60},"sandbox":{"mode":"off"}},"list":[{"id":"main","name":"生活助手","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"bt","name":"下载助手","workspace":"/home/yangxuan/.openclaw/workspace/bt","agentDir":"/home/yangxuan/.openclaw/agents/bt/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"storage","name":"仓库管理员","workspace":"/home/yangxuan/.openclaw/workspace/storage","agentDir":"/home/yangxuan/.openclaw/agents/storage/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"java","name":"Java 后端","workspace":"/home/yangxuan/.openclaw/workspace/java","agentDir":"/home/yangxuan/.openclaw/agents/java/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"front","name":"前端","workspace":"/home/yangxuan/.openclaw/workspace/front","agentDir":"/home/yangxuan/.openclaw/agents/front/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"resume","name":"简历助手","workspace":"/home/yangxuan/.openclaw/workspace/resume","agentDir":"/home/yangxuan/.openclaw/agents/resume/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"travel","name":"旅途助手","workspace":"/home/yangxuan/.openclaw/workspace/travel","agentDir":"/home/yangxuan/.openclaw/agents/travel/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}]},"tools":{"profile":"coding","deny":["group:web","browser"],"web":{"search":{"enabled":true,"provider":"searxng","openaiCodex":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"fetch":{"enabled":true}}},"bindings":[{"agentId":"travel","match":{"channel":"openclaw-weixin","accountId":"4a0926e2cb5f-im-bot"}},{"agentId":"java","match":{"channel":"dingtalk-connector"}}],"messages":{"groupChat":{"visibleReplies":"message_tool"},"ackReactionScope":"group-mentions"},"commands":{"native":"auto","nativeSkills":"auto","restart":true,"ownerDisplay":"raw"},"session":{"dmScope":"per-channel-peer"},"channels":{"openclaw-weixin":{"enabled":true,"defaultAccount":"4a0926e2cb5f-im-bot"},"dingtalk-connector":{"enabled":true,"defaultAccount":"default","clientId":"dingnumf057etbbowhfu","dmPolicy":"open","groupPolicy":"open","requireMention":true,"allowFrom":["*"],"groupAllowFrom":["*"],"separateSessionByConversation":true,"sharedMemoryAcrossConversations":false,"groupSessionScope":"group"}},"gateway":{"port":18789,"mode":"local","bind":"loopback","controlUi":{"allowedOrigins":["http://localhost:18789","http://127.0.0.1:18789","https://xuan-pc-nj-wsl.baiji-algieba.ts.net"],"allowInsecureAuth":true},"auth":{"mode":"token","allowTailscale":true},"trustedProxies":["127.0.0.1","100.115.195.0/24"],"tailscale":{"mode":"serve","resetOnExit":false},"http":{"endpoints":{"chatCompletions":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"nodes":{"denyCommands":[]}},"skills":{"entries":{"agent-browser":{"enabled":true},"Github":{"enabled":true},"notion":{"enabled":false},"openai-whisper":{"enabled":false},"openai-whisper-api":{"enabled":false},"oracle":{"enabled":false},"apple-notes":{"enabled":false},"apple-reminders":{"enabled":false},"bear-notes":{"enabled":false},"himalaya":{"enabled":false},"xurl":{"enabled":false},"blogwatcher":{"enabled":false},"blucli":{"enabled":false},"bluebubbles":{"enabled":false},"camsnap":{"enabled":false},"coding-agent":{"enabled":false},"discord":{"enabled":false},"eightctl":{"enabled":false},"gemini":{"enabled":false},"gifgrep":{"enabled":false},"gog":{"enabled":false},"goplaces":{"enabled":false},"imsg":{"enabled":false},"model-usage":{"enabled":false},"nano-pdf":{"enabled":false},"obsidian":{"enabled":false},"openhue":{"enabled":false},"ordercli":{"enabled":false},"peekaboo":{"enabled":false},"sag":{"enabled":false},"searxng-web-search":{"enabled":false},"session-logs":{"enabled":false},"sherpa-onnx-tts":{"enabled":false},"slack":{"enabled":false},"songsee":{"enabled":false},"sonoscli":{"enabled":false},"spotify-player":{"enabled":false},"summarize":{"enabled":false},"things-mac":{"enabled":false},"trello":{"enabled":false},"voice-call":{"enabled":false},"wacli":{"enabled":false}}},"plugins":{"allow":["deepseek","memory-core","ollama","openclaw-weixin","searxng","dingtalk-connector"],"entries":{"ollama":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"deepseek":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"searxng":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"openclaw-weixin":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"browser":{"enabled":false},"dingtalk-connector":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"memory-core":{"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"bundledDiscovery":"compat"},"cron":{"maxConcurrentRuns":8}},"runtime":{"timeoutMs":3600000,"trigger":"user","disableTools":false,"toolResultFormat":"markdown"}},"plugins":{"source":"active-registry","importedRuntimePluginIds":["anthropic","deepseek","dingtalk-connector","lmstudio","memory-core","ollama","openclaw-weixin","searxng","xai"],"entries":[{"id":"active-memory","name":"Active Memory","description":"Runs a bounded blocking memory sub-agent before eligible conversational replies and injects relevant memory into prompt context.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/active-memory/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/active-memory"},{"id":"admin-http-rpc","name":"@openclaw/admin-http-rpc","version":"2026.5.28","description":"OpenClaw admin HTTP RPC endpoint","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/admin-http-rpc/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/admin-http-rpc"},{"id":"alibaba","name":"@openclaw/alibaba-provider","version":"2026.5.28","description":"OpenClaw Alibaba Model Studio video provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/alibaba/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/alibaba","videoGenerationProviderIds":["alibaba"]},{"id":"anthropic","name":"@openclaw/anthropic-provider","version":"2026.5.28","description":"OpenClaw Anthropic provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/anthropic/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/anthropic","providerIds":["anthropic"],"mediaUnderstandingProviderIds":["anthropic"]},{"id":"arcee","name":"@openclaw/arcee-provider","version":"2026.5.28","description":"OpenClaw Arcee provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/arcee/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/arcee","providerIds":["arcee"]},{"id":"azure-speech","name":"Azure Speech","version":"2026.5.28","description":"Azure AI Speech text-to-speech (MP3, native Ogg/Opus voice notes, PCM telephony).","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/azure-speech/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/azure-speech","speechProviderIds":["azure","azure-speech"]},{"id":"bonjour","name":"Bonjour Gateway Discovery","version":"2026.5.28","description":"Advertise the local OpenClaw gateway over Bonjour/mDNS.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/bonjour/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/bonjour"},{"id":"browser","name":"@openclaw/browser-plugin","version":"2026.5.28","description":"OpenClaw browser tool plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"disabled in config","status":"disabled","error":"disabled in config","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/browser/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/browser"},{"id":"byteplus","name":"@openclaw/byteplus-provider","version":"2026.5.28","description":"OpenClaw BytePlus provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/byteplus/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/byteplus","providerIds":["byteplus","byteplus-plan"],"videoGenerationProviderIds":["byteplus"]},{"id":"canvas","name":"Canvas","version":"2026.5.28","description":"Experimental Canvas control and A2UI rendering surfaces for paired nodes.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/canvas/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/canvas"},{"id":"cerebras","name":"@openclaw/cerebras-provider","version":"2026.5.28","description":"OpenClaw Cerebras provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cerebras/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cerebras","providerIds":["cerebras"]},{"id":"chutes","name":"@openclaw/chutes-provider","version":"2026.5.28","description":"OpenClaw Chutes.ai provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/chutes/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/chutes","providerIds":["chutes"]},{"id":"clickclack","name":"@openclaw/clickclack","version":"2026.5.28","description":"OpenClaw ClickClack channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/clickclack/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/clickclack","channelIds":["clickclack"]},{"id":"cloudflare-ai-gateway","name":"@openclaw/cloudflare-ai-gateway-provider","version":"2026.5.28","description":"OpenClaw Cloudflare AI Gateway provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cloudflare-ai-gateway/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cloudflare-ai-gateway","providerIds":["cloudflare-ai-gateway"]},{"id":"codex-supervisor","name":"Codex Supervisor","version":"2026.5.28","description":"Supervise Codex app-server sessions from OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/codex-supervisor/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/codex-supervisor"},{"id":"comfy","name":"@openclaw/comfy-provider","version":"2026.5.28","description":"OpenClaw ComfyUI provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/comfy/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/comfy","providerIds":["comfy"],"imageGenerationProviderIds":["comfy"],"videoGenerationProviderIds":["comfy"],"musicGenerationProviderIds":["comfy"]},{"id":"copilot-proxy","name":"@openclaw/copilot-proxy","version":"2026.5.28","description":"OpenClaw Copilot Proxy provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/copilot-proxy/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/copilot-proxy","providerIds":["copilot-proxy"]},{"id":"deepgram","name":"@openclaw/deepgram-provider","version":"2026.5.28","description":"OpenClaw Deepgram media-understanding provider","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepgram/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepgram","realtimeTranscriptionProviderIds":["deepgram"],"mediaUnderstandingProviderIds":["deepgram"]},{"id":"deepinfra","name":"@openclaw/deepinfra-provider","version":"2026.5.28","description":"OpenClaw DeepInfra provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepinfra/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepinfra","providerIds":["deepinfra"],"speechProviderIds":["deepinfra"],"mediaUnderstandingProviderIds":["deepinfra"],"imageGenerationProviderIds":["deepinfra"],"videoGenerationProviderIds":["deepinfra"],"memoryEmbeddingProviderIds":["deepinfra"]},{"id":"deepseek","name":"DeepSeek Provider","version":"2026.5.28","description":"Bundled DeepSeek provider plugin","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepseek/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepseek","providerIds":["deepseek"]},{"id":"device-pair","name":"Device Pairing","description":"Generate setup codes and approve device pairing requests.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/device-pair/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/device-pair"},{"id":"dingtalk-connector","name":"DingTalk Channel","version":"0.8.23","description":"Official OpenClaw DingTalk channel plugin | 钉钉官方 OpenClaw 插件","origin":"global","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/dist/index.mjs","rootDir":"/home/yangxuan/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector","workspaceDir":"/home/yangxuan/.openclaw/workspace","channelIds":["dingtalk-connector"]},{"id":"document-extract","name":"Document Extraction","version":"2026.5.28","description":"Extract text and fallback page images from local document attachments.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/document-extract/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/document-extract"},{"id":"duckduckgo","name":"@openclaw/duckduckgo-plugin","version":"2026.5.28","description":"OpenClaw DuckDuckGo plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/duckduckgo/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/duckduckgo","webSearchProviderIds":["duckduckgo"]},{"id":"elevenlabs","name":"@openclaw/elevenlabs-speech","version":"2026.5.28","description":"OpenClaw ElevenLabs speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/elevenlabs/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/elevenlabs","speechProviderIds":["elevenlabs"],"realtimeTranscriptionProviderIds":["elevenlabs"],"mediaUnderstandingProviderIds":["elevenlabs"]},{"id":"exa","name":"@openclaw/exa-plugin","version":"2026.5.28","description":"OpenClaw Exa plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/exa/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/exa","webSearchProviderIds":["exa"]},{"id":"fal","name":"@openclaw/fal-provider","version":"2026.5.28","description":"OpenClaw fal provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fal/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fal","providerIds":["fal"],"imageGenerationProviderIds":["fal"],"videoGenerationProviderIds":["fal"],"musicGenerationProviderIds":["fal"]},{"id":"file-transfer","name":"File Transfer","version":"2026.5.28","description":"Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/file-transfer/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/file-transfer"},{"id":"firecrawl","name":"@openclaw/firecrawl-plugin","version":"2026.5.28","description":"OpenClaw Firecrawl plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/firecrawl/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/firecrawl","webFetchProviderIds":["firecrawl"],"webSearchProviderIds":["firecrawl"]},{"id":"fireworks","name":"@openclaw/fireworks-provider","version":"2026.5.28","description":"OpenClaw Fireworks provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fireworks/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fireworks","providerIds":["fireworks"]},{"id":"github-copilot","name":"@openclaw/github-copilot-provider","version":"2026.5.28","description":"OpenClaw GitHub Copilot provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/github-copilot/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/github-copilot","providerIds":["github-copilot"],"memoryEmbeddingProviderIds":["github-copilot"]},{"id":"google","name":"@openclaw/google-plugin","version":"2026.5.28","description":"OpenClaw Google plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/google/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/google","providerIds":["google","google-gemini-cli","google-vertex"],"speechProviderIds":["google"],"realtimeVoiceProviderIds":["google"],"mediaUnderstandingProviderIds":["google"],"imageGenerationProviderIds":["google"],"videoGenerationProviderIds":["google"],"musicGenerationProviderIds":["google"],"webSearchProviderIds":["gemini"],"memoryEmbeddingProviderIds":["gemini"]},{"id":"gradium","name":"@openclaw/gradium-speech","version":"2026.5.28","description":"OpenClaw Gradium speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/gradium/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/gradium","speechProviderIds":["gradium"]},{"id":"groq","name":"@openclaw/groq-provider","version":"2026.5.28","description":"OpenClaw Groq media-understanding provider","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/groq/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/groq","providerIds":["groq"],"mediaUnderstandingProviderIds":["groq"]},{"id":"huggingface","name":"@openclaw/huggingface-provider","version":"2026.5.28","description":"OpenClaw Hugging Face provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/huggingface/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/huggingface","providerIds":["huggingface"]},{"id":"imessage","name":"@openclaw/imessage","version":"2026.5.28","description":"OpenClaw iMessage channel plugin using imsg on a signed-in Mac","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/imessage/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/imessage","channelIds":["imessage"]},{"id":"inworld","name":"Inworld","version":"2026.5.28","description":"Inworld streaming text-to-speech (MP3, OGG_OPUS, PCM telephony).","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/inworld/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/inworld","speechProviderIds":["inworld"]},{"id":"irc","name":"@openclaw/irc","version":"2026.5.28","description":"OpenClaw IRC channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/irc/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/irc","channelIds":["irc"]},{"id":"kilocode","name":"@openclaw/kilocode-provider","version":"2026.5.28","description":"OpenClaw Kilo Gateway provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kilocode/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kilocode","providerIds":["kilocode"]},{"id":"kimi","name":"@openclaw/kimi-provider","version":"2026.5.28","description":"OpenClaw Kimi provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kimi-coding/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kimi-coding","providerIds":["kimi","kimi-coding"]},{"id":"litellm","name":"@openclaw/litellm-provider","version":"2026.5.28","description":"OpenClaw LiteLLM provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/litellm/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/litellm","providerIds":["litellm"],"imageGenerationProviderIds":["litellm"]},{"id":"llm-task","name":"LLM Task","version":"2026.5.21","description":"Generic JSON-only LLM tool for structured tasks callable from workflows.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/llm-task/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/llm-task"},{"id":"lmstudio","name":"@openclaw/lmstudio-provider","version":"2026.5.28","description":"OpenClaw LM Studio provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/lmstudio/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/lmstudio","providerIds":["lmstudio"],"memoryEmbeddingProviderIds":["lmstudio"]},{"id":"mattermost","name":"@openclaw/mattermost","version":"2026.5.28","description":"OpenClaw Mattermost channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mattermost/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mattermost","channelIds":["mattermost"]},{"id":"memory-core","name":"Memory (Core)","version":"2026.5.28","description":"File-backed memory search tools and CLI","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"selected memory slot","status":"loaded","format":"openclaw","kind":"memory","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-core/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-core","toolNames":["memory_get","memory_search"],"memoryEmbeddingProviderIds":["local"]},{"id":"memory-wiki","name":"Memory Wiki","version":"2026.5.28","description":"Persistent wiki compiler and Obsidian-friendly knowledge vault for OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-wiki/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-wiki"},{"id":"microsoft","name":"@openclaw/microsoft-speech","version":"2026.5.28","description":"OpenClaw Microsoft speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft","speechProviderIds":["microsoft"]},{"id":"microsoft-foundry","name":"@openclaw/microsoft-foundry","version":"2026.5.28","description":"OpenClaw Microsoft Foundry provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft-foundry/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft-foundry","providerIds":["microsoft-foundry"]},{"id":"migrate-claude","name":"Claude Migration","version":"2026.5.28","description":"Imports Claude Code and Claude Desktop instructions, MCP servers, skills, and safe configuration into OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-claude/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-claude"},{"id":"migrate-hermes","name":"Hermes Migration","version":"2026.5.28","description":"Imports Hermes configuration, memories, skills, and supported credentials into OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-hermes/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-hermes"},{"id":"minimax","name":"@openclaw/minimax-provider","version":"2026.5.28","description":"OpenClaw MiniMax provider and OAuth plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/minimax/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/minimax","providerIds":["minimax","minimax-portal"],"speechProviderIds":["minimax"],"mediaUnderstandingProviderIds":["minimax","minimax-portal"],"imageGenerationProviderIds":["minimax","minimax-portal"],"videoGenerationProviderIds":["minimax","minimax-portal"],"musicGenerationProviderIds":["minimax","minimax-portal"],"webSearchProviderIds":["minimax"]},{"id":"mistral","name":"@openclaw/mistral-provider","version":"2026.5.28","description":"OpenClaw Mistral provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mistral/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mistral","providerIds":["mistral"],"realtimeTranscriptionProviderIds":["mistral"],"mediaUnderstandingProviderIds":["mistral"],"memoryEmbeddingProviderIds":["mistral"]},{"id":"moonshot","name":"@openclaw/moonshot-provider","version":"2026.5.28","description":"OpenClaw Moonshot provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/moonshot/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/moonshot","providerIds":["moonshot"],"mediaUnderstandingProviderIds":["moonshot"],"webSearchProviderIds":["kimi"]},{"id":"nvidia","name":"@openclaw/nvidia-provider","version":"2026.5.28","description":"OpenClaw NVIDIA provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/nvidia/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/nvidia","providerIds":["nvidia"]},{"id":"oc-path","name":"OC Path","version":"2026.5.28","description":"Adds the openclaw path CLI for oc:// workspace file addressing.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/oc-path/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/oc-path"},{"id":"ollama","name":"Ollama Provider","version":"2026.5.28","description":"Bundled Ollama provider plugin","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/ollama/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/ollama","providerIds":["ollama"],"mediaUnderstandingProviderIds":["ollama"],"webSearchProviderIds":["ollama"],"memoryEmbeddingProviderIds":["ollama"]},{"id":"open-prose","name":"OpenProse","version":"2026.5.28","description":"OpenProse VM skill pack with a /prose slash command.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/open-prose/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/open-prose"},{"id":"openai","name":"@openclaw/openai-provider","version":"2026.5.28","description":"OpenClaw OpenAI provider plugins","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openai/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openai","providerIds":["openai","openai-codex"],"speechProviderIds":["openai"],"realtimeTranscriptionProviderIds":["openai"],"realtimeVoiceProviderIds":["openai"],"mediaUnderstandingProviderIds":["openai","openai-codex"],"imageGenerationProviderIds":["openai"],"videoGenerationProviderIds":["openai"],"memoryEmbeddingProviderIds":["openai"]},{"id":"openclaw-weixin","name":"Weixin","version":"2.4.3","description":"Weixin channel (getUpdates long-poll + sendMessage)","origin":"global","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.openclaw/npm/node_modules/@tencent-weixin/openclaw-weixin/dist/index.js","rootDir":"/home/yangxuan/.openclaw/npm/node_modules/@tencent-weixin/openclaw-weixin","workspaceDir":"/home/yangxuan/.openclaw/workspace","channelIds":["openclaw-weixin"]},{"id":"opencode","name":"@openclaw/opencode-provider","version":"2026.5.28","description":"OpenClaw OpenCode Zen provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode","providerIds":["opencode"],"mediaUnderstandingProviderIds":["opencode"]},{"id":"opencode-go","name":"@openclaw/opencode-go-provider","version":"2026.5.28","description":"OpenClaw OpenCode Go provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode-go/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode-go","providerIds":["opencode-go"],"mediaUnderstandingProviderIds":["opencode-go"]},{"id":"openrouter","name":"@openclaw/openrouter-provider","version":"2026.5.28","description":"OpenClaw OpenRouter provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openrouter/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openrouter","providerIds":["openrouter"],"speechProviderIds":["openrouter"],"mediaUnderstandingProviderIds":["openrouter"],"imageGenerationProviderIds":["openrouter"],"videoGenerationProviderIds":["openrouter"],"musicGenerationProviderIds":["openrouter"]},{"id":"perplexity","name":"@openclaw/perplexity-plugin","version":"2026.5.28","description":"OpenClaw Perplexity plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/perplexity/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/perplexity","webSearchProviderIds":["perplexity"]},{"id":"phone-control","name":"Phone Control","description":"Arm/disarm high-risk phone node commands (camera/screen/writes) with an optional auto-expiry.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/phone-control/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/phone-control"},{"truncated":true,"reason":"trajectory-array-size-limit","originalLength":94,"limitItems":64}]},"skills":{"snapshotVersion":0,"entries":[{"id":"canvas","name":"canvas","description":"Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"clawhub","name":"clawhub","description":"Search, install, update, sync, or publish agent skills with the ClawHub CLI and registry.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"Code","name":"Code","description":"Coding workflow with planning, implementation, verification, and testing for clean software development.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"database-admin","name":"database-admin","description":"Comprehensive database administration, schema management, data operations, and optimization. Use when Codex needs to: (1) Create or modify database tables with proper indexing, (2) Perform bulk data insertions with type safety and constraint handling, (3) Execute complex queries with JOINs, aggregations, and subqueries, (4) Optimize query performance through indexing and execution plan analysis, (5) Manage database backups, restores, and migrations, (6) Handle special data types (BIGINT, UUID, JSONB, enums), (7) Implement transactional safety with ACID compliance, or (8) Debug and resolve database errors including constraint violations, type mismatches, and foreign key issues","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"database-schema-designer","name":"database-schema-designer","description":"Database Schema Designer","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"db-query","name":"db-query","description":"Query project databases with automatic SSH tunnel management. Use when you need to execute SQL queries against configured databases, especially those accessible only via SSH tunnels. Automatically manages SSH connection lifecycle (establishes tunnel before query, closes after). Supports multiple databases distinguished by description/name from config file.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/db-query/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-query","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-query","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/db-query/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"db-schema","name":"db-schema","description":"Generate database schemas, migrations, and ERD diagrams from plain English descriptions — supports PostgreSQL, MySQL, SQLite, and MongoDB with proper indexes and constraints.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"deep-research-pro","name":"deep-research-pro","description":"Multi-source deep research agent. Searches the web, synthesizes findings, and delivers cited reports. No API keys required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"diagram-maker","name":"diagram-maker","description":"Create SVG/HTML or Excalidraw diagrams for concepts, architecture, flows, and whiteboards.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"dingtalk-channel-rules","name":"dingtalk-channel-rules","description":"钉钉会话输出规则。在钉钉会话中始终生效。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"dingtalk-troubleshoot","name":"dingtalk-troubleshoot","description":"钉钉连接器问题排查。包含 dws CLI 常见错误处理、授权问题排查和连接故障诊断。\n当 dws 命令执行失败、授权异常、连接中断时自动激活。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"docker-essentials","name":"docker-essentials","description":"Essential Docker commands and workflows for container management, image operations, and debugging.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"dws","name":"dws","description":"管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/开放平台文档/钉钉文档/钉钉云盘/AI听记/邮箱/在线电子表格/知识库等)。当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报(钉钉日志模版)、读写钉钉文档、上传下载云盘文件、查询听记纪要、收发邮件、读写在线电子表格(axls)、管理钉钉知识库时使用。","filePath":"~/.agents/skills/dws/SKILL.md","baseDir":"~/.agents/skills/dws","source":"agents-skills-personal","sourceInfo":{"baseDir":"~/.agents/skills/dws","origin":"top-level","path":"~/.agents/skills/dws/SKILL.md","scope":"project","source":"agents-skills-personal"},"disableModelInvocation":false,"available":true},{"id":"dws-cli","name":"dws-cli","description":"在钉钉会话中通过 dws CLI 管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/工作台等)。\n当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报时使用。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"gh-issues","name":"gh-issues","description":"Fetch GitHub issues, select candidates, spawn background fix agents, open PRs, and optionally process PR review comments.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"github","name":"github","description":"GitHub CLI for issues, PRs, CI/check logs, comments, reviews, releases, repos, and gh api queries.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"healthcheck","name":"healthcheck","description":"Audit/harden OpenClaw hosts: SSH, firewall, updates, exposure, backups, disk encryption, gateway security.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"humanizer","name":"humanizer","description":"Remove signs of AI-generated writing from text. Use when editing or reviewing\ntext to make it sound more natural and human-written. Based on Wikipedia's\ncomprehensive \"Signs of AI writing\" guide. Detects and fixes patterns including:\ninflated symbolism, promotional language, superficial -ing analyses, vague\nattributions, em dash overuse, rule of three, AI vocabulary words, negative\nparallelisms, and excessive conjunctive phrases.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"imap-smtp-email","name":"imap-smtp-email","description":"Read and send email via IMAP/SMTP. Check for new/unread messages, fetch content, search mailboxes, mark as read/unread, and send emails with attachments. Supports multiple accounts. Works with any IMAP/SMTP server including Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, and vip.188.com.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"mcporter","name":"mcporter","description":"Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"meme-maker","name":"meme-maker","description":"Search meme templates, suggest formats, and generate local or hosted image memes.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"multi-search-engine","name":"multi-search-engine","description":"Multi search engine integration with 17 engines (8 CN + 9 Global). Supports advanced search operators, time filters, site search, privacy engines, and WolframAlpha knowledge queries. No API keys required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"MySQL","name":"MySQL","description":"Write correct MySQL queries with proper character sets, indexing, transactions, and production patterns.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"news-summary","name":"news-summary","description":"This skill should be used when the user asks for news updates, daily briefings, or what's happening in the world. Fetches news from trusted international RSS feeds and can create voice summaries.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"node-connect","name":"node-connect","description":"Diagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"node-inspect-debugger","name":"node-inspect-debugger","description":"Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"obsidian-official-cli","name":"obsidian-official-cli","description":"Work with Obsidian vaults using the official Obsidian CLI (v1.12+). Open, search, create, move, and manage notes from the terminal. Use when working with Obsidian vaults for note management, file operations, searching content, managing tasks, properties, links, plugins, themes, sync operations, or any command-line interaction with Obsidian.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"opencode-controller","name":"opencode-controller","description":"Control and operate Opencode via slash commands. Use this skill to manage sessions, select models, switch agents (plan/build), and coordinate coding through Opencode.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"openspec","name":"openspec","description":"Spec-driven development with OpenSpec CLI. Use when building features, migrations, refactors, or any structured development work. Manages proposal → specs → design → tasks → implementation workflows. Supports custom schemas (TDD, rapid, etc.). Trigger on requests involving feature planning, spec writing, change management, or when /opsx commands are mentioned.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/openspec/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openspec","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openspec","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/openspec/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"python-debugpy","name":"python-debugpy","description":"Debug Python with pdb, breakpoint(), post-mortem inspection, and debugpy remote attach.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"qiushi-openclaw-skills","name":"qiushi-openclaw-skills","description":"求是 OpenClaw Skills 是基于毛泽东思想方法论的 AI Agent 技能集合,按照 OpenClaw 技能格式进行改造,旨在为 AI 提供系统化的思考和行动框架。","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"rss-ai-reader","name":"rss-ai-reader","description":"📰 RSS AI 阅读器 — 自动抓取订阅、LLM生成摘要、多渠道推送!\n支持 Claude/OpenAI 生成中文摘要,推送到飞书/Telegram/Email。\n触发条件: 用户要求订阅RSS、监控博客、抓取新闻、生成摘要、设置定时抓取、\n\"帮我订阅\"、\"监控这个网站\"、\"每天推送新闻\"、RSS/Atom feed 相关。","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"skill-creator","name":"skill-creator","description":"Create, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"spike","name":"spike","description":"Run throwaway prototypes to validate feasibility, compare approaches, and report a verdict.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"sql-toolkit","name":"sql-toolkit","description":"Query, design, migrate, and optimize SQL databases. Use when working with SQLite, PostgreSQL, or MySQL — schema design, writing queries, creating migrations, indexing, backup/restore, and debugging slow queries. No ORMs required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"taskflow","name":"taskflow","description":"Coordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"taskflow-inbox-triage","name":"taskflow-inbox-triage","description":"Example TaskFlow pattern for inbox triage, intent routing, waiting on replies, and later summaries.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"tmux","name":"tmux","description":"Control tmux sessions/panes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"using-superpowers","name":"using-superpowers","description":"Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"video-frames","name":"video-frames","description":"Extract frames or short clips from videos using ffmpeg.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"weather","name":"weather","description":"Get current weather and forecasts (no API key required).","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/weather/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/weather","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/weather","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/weather/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"web-search","name":"web-search","description":"This skill should be used when users need to search the web for information, find current content, look up news articles, search for images, or find videos. It uses a self-hosted SearXNG instance to return results in clean, formatted output (text, markdown, or JSON). Use for research, fact-checking, finding recent information, or gathering web resources.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/web-search/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/web-search","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/web-search","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/web-search/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true}]},"prompting":{"skillsPrompt":"\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n<available_skills>\n <skill>\n <name>canvas</name>\n <description>Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md</location>\n </skill>\n <skill>\n <name>clawhub</name>\n <description>Search, install, update, sync, or publish agent skills with the ClawHub CLI and registry.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md</location>\n </skill>\n <skill>\n <name>Code</name>\n <description>Coding workflow with planning, implementation, verification, and testing for clean software development.</description>\n <location>~/.openclaw/workspace/skills/openclaw-code/SKILL.md</location>\n </skill>\n <skill>\n <name>database-admin</name>\n <description>Comprehensive database administration, schema management, data operations, and optimization. Use when Codex needs to: (1) Create or modify database tables with proper indexing, (2) Perform bulk data insertions with type safety and constraint handling, (3) Execute complex queries with JOINs, aggregations, and subqueries, (4) Optimize query performance through indexing and execution plan analysis, (5) Manage database backups, restores, and migrations, (6) Handle special data types (BIGINT, UUID, JSONB, enums), (7) Implement transactional safety with ACID compliance, or (8) Debug and resolve database errors including constraint violations, type mismatches, and foreign key issues</description>\n <location>~/.openclaw/workspace/skills/database-admin/SKILL.md</location>\n </skill>\n <skill>\n <name>database-schema-designer</name>\n <description>Database Schema Designer</description>\n <location>~/.openclaw/workspace/skills/database-schema-designer/SKILL.md</location>\n </skill>\n <skill>\n <name>db-query</name>\n <description>Query project databases with automatic SSH tunnel management. Use when you need to execute SQL queries against configured databases, especially those accessible only via SSH tunnels. Automatically manages SSH connection lifecycle (establishes tunnel before query, closes after). Supports multiple databases distinguished by description/name from config file.</description>\n <location>~/.openclaw/workspace/skills/db-query/SKILL.md</location>\n </skill>\n <skill>\n <name>db-schema</name>\n <description>Generate database schemas, migrations, and ERD diagrams from plain English descriptions — supports PostgreSQL, MySQL, SQLite, and MongoDB with proper indexes and constraints.</description>\n <location>~/.openclaw/workspace/skills/db-schema-gen/SKILL.md</location>\n </skill>\n <skill>\n <name>deep-research-pro</name>\n <description>Multi-source deep research agent. Searches the web, synthesizes findings, and delivers cited reports. No API keys required.</description>\n <location>~/.openclaw/workspace/skills/deep-research-pro/SKILL.md</location>\n </skill>\n <skill>\n <name>diagram-maker</name>\n <description>Create SVG/HTML or Excalidraw diagrams for concepts, architecture, flows, and whiteboards.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md</location>\n </skill>\n <skill>\n <name>dingtalk-channel-rules</name>\n <description>钉钉会话输出规则。在钉钉会话中始终生效。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md</location>\n </skill>\n <skill>\n <name>dingtalk-troubleshoot</name>\n <description>钉钉连接器问题排查。包含 dws CLI 常见错误处理、授权问题排查和连接故障诊断。\n当 dws 命令执行失败、授权异常、连接中断时自动激活。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md</location>\n </skill>\n <skill>\n <name>docker-essentials</name>\n <description>Essential Docker commands and workflows for container management, image operations, and debugging.</description>\n <location>~/.openclaw/workspace/skills/docker-essentials/SKILL.md</location>\n </skill>\n <skill>\n <name>dws</name>\n <description>管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/开放平台文档/钉钉文档/钉钉云盘/AI听记/邮箱/在线电子表格/知识库等)。当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报(钉钉日志模版)、读写钉钉文档、上传下载云盘文件、查询听记纪要、收发邮件、读写在线电子表格(axls)、管理钉钉知识库时使用。</description>\n <location>~/.agents/skills/dws/SKILL.md</location>\n </skill>\n <skill>\n <name>dws-cli</name>\n <description>在钉钉会话中通过 dws CLI 管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/工作台等)。\n当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报时使用。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md</location>\n </skill>\n <skill>\n <name>gh-issues</name>\n <description>Fetch GitHub issues, select candidates, spawn background fix agents, open PRs, and optionally process PR review comments.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md</location>\n </skill>\n <skill>\n <name>github</name>\n <description>GitHub CLI for issues, PRs, CI/check logs, comments, reviews, releases, repos, and gh api queries.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md</location>\n </skill>\n <skill>\n <name>healthcheck</name>\n <description>Audit/harden OpenClaw hosts: SSH, firewall, updates, exposure, backups, disk encryption, gateway security.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md</location>\n </skill>\n <skill>\n <name>humanizer</name>\n <description>Remove signs of AI-generated writing from text. Use when editing or reviewing\ntext to make it sound more natural and human-written. Based on Wikipedia's\ncomprehensive "Signs of AI writing" guide. Detects and fixes patterns including:\ninflated symbolism, promotional language, superficial -ing analyses, vague\nattributions, em dash overuse, rule of three, AI vocabulary words, negative\nparallelisms, and excessive conjunctive phrases.</description>\n <location>~/.openclaw/workspace/skills/humanizer/SKILL.md</location>\n </skill>\n <skill>\n <name>imap-smtp-email</name>\n <description>Read and send email via IMAP/SMTP. Check for new/unread messages, fetch content, search mailboxes, mark as read/unread, and send emails with attachments. Supports multiple accounts. Works with any IMAP/SMTP server including Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, and vip.188.com.</description>\n <location>~/.openclaw/workspace/skills/imap-smtp-email/SKILL.md</location>\n </skill>\n <skill>\n <name>mcporter</name>\n <description>Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.</description>\n <location>~/.openclaw/workspace/skills/mcporter/SKILL.md</location>\n </skill>\n <skill>\n <name>meme-maker</name>\n <description>Search meme templates, suggest formats, and generate local or hosted image memes.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md</location>\n </skill>\n <skill>\n <name>multi-search-engine</name>\n <description>Multi search engine integration with 17 engines (8 CN + 9 Global). Supports advanced search operators, time filters, site search, privacy engines, and WolframAlpha knowledge queries. No API keys required.</description>\n <location>~/.openclaw/workspace/skills/multi-search-engine/SKILL.md</location>\n </skill>\n <skill>\n <name>MySQL</name>\n <description>Write correct MySQL queries with proper character sets, indexing, transactions, and production patterns.</description>\n <location>~/.openclaw/workspace/skills/MySQL/SKILL.md</location>\n </skill>\n <skill>\n <name>news-summary</name>\n <description>This skill should be used when the user asks for news updates, daily briefings, or what's happening in the world. Fetches news from trusted international RSS feeds and can create voice summaries.</description>\n <location>~/.openclaw/workspace/skills/news-summary/SKILL.md</location>\n </skill>\n <skill>\n <name>node-connect</name>\n <description>Diagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md</location>\n </skill>\n <skill>\n <name>node-inspect-debugger</name>\n <description>Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md</location>\n </skill>\n <skill>\n <name>obsidian-official-cli</name>\n <description>Work with Obsidian vaults using the official Obsidian CLI (v1.12+). Open, search, create, move, and manage notes from the terminal. Use when working with Obsidian vaults for note management, file operations, searching content, managing tasks, properties, links, plugins, themes, sync operations, or any command-line interaction with Obsidian.</description>\n <location>~/.openclaw/workspace/skills/obsidian-official-cli/SKILL.md</location>\n </skill>\n <skill>\n <name>opencode-controller</name>\n <description>Control and operate Opencode via slash commands. Use this skill to manage sessions, select models, switch agents (plan/build), and coordinate coding through Opencode.</description>\n <location>~/.openclaw/workspace/skills/opencode-controller/SKILL.md</location>\n </skill>\n <skill>\n <name>openspec</name>\n <description>Spec-driven development with OpenSpec CLI. Use when building features, migrations, refactors, or any structured development work. Manages proposal → specs → design → tasks → implementation workflows. Supports custom schemas (TDD, rapid, etc.). Trigger on requests involving feature planning, spec writing, change management, or when /opsx commands are mentioned.</description>\n <location>~/.openclaw/workspace/skills/openspec/SKILL.md</location>\n </skill>\n <skill>\n <name>python-debugpy</name>\n <description>Debug Python with pdb, breakpoint(), post-mortem inspection, and debugpy remote attach.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md</location>\n </skill>\n <skill>\n <name>qiushi-openclaw-skills</name>\n <description>求是 OpenClaw Skills 是基于毛泽东思想方法论的 AI Agent 技能集合,按照 OpenClaw 技能格式进行改造,旨在为 AI 提供系统化的思考和行动框架。</description>\n <location>~/.openclaw/workspace/skills/qiushi-openclaw-skill/SKILL.md</location>\n </skill>\n <skill>\n <name>rss-ai-reader</name>\n <description>📰 RSS AI 阅读器 — 自动抓取订阅、LLM生成摘要、多渠道推送!\n支持 Claude/OpenAI 生成中文摘要,推送到飞书/Telegram/Email。\n触发条件: 用户要求订阅RSS、监控博客、抓取新闻、生成摘要、设置定时抓取、\n"帮我订阅"、"监控这个网站"、"每天推送新闻"、RSS/Atom feed 相关。</description>\n <location>~/.openclaw/workspace/skills/rss-ai-reader/SKILL.md</location>\n </skill>\n <skill>\n <name>skill-creator</name>\n <description>Create, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md</location>\n </skill>\n <skill>\n <name>spike</name>\n <description>Run throwaway prototypes to validate feasibility, compare approaches, and report a verdict.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md</location>\n </skill>\n <skill>\n <name>sql-toolkit</name>\n <description>Query, design, migrate, and optimize SQL databases. Use when working with SQLite, PostgreSQL, or MySQL — schema design, writing queries, creating migrations, indexing, backup/restore, and debugging slow queries. No ORMs required.</description>\n <location>~/.openclaw/workspace/skills/sql-toolkit/SKILL.md</location>\n </skill>\n <skill>\n <name>taskflow</name>\n <description>Coordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md</location>\n </skill>\n <skill>\n <name>taskflow-inbox-triage</name>\n <description>Example TaskFlow pattern for inbox triage, intent routing, waiting on replies, and later summaries.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md</location>\n </skill>\n <skill>\n <name>tmux</name>\n <description>Control tmux sessions/panes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md</location>\n </skill>\n <skill>\n <name>using-superpowers</name>\n <description>Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions</description>\n <location>~/.openclaw/workspace/skills/using-superpowers/SKILL.md</location>\n </skill>\n <skill>\n <name>video-frames</name>\n <description>Extract frames or short clips from videos using ffmpeg.</description>\n <location>~/.openclaw/workspace/skills/video-frames/SKILL.md</location>\n </skill>\n <skill>\n <name>weather</name>\n <description>Get current weather and forecasts (no API key required).</description>\n <location>~/.openclaw/workspace/skills/weather/SKILL.md</location>\n </skill>\n <skill>\n <name>web-search</name>\n <description>This skill should be used when users need to search the web for information, find current content, look up news articles, search for images, or find videos. It uses a self-hosted SearXNG instance to return results in clean, formatted output (text, markdown, or JSON). Use for research, fact-checking, finding recent information, or gathering web resources.</description>\n <location>~/.openclaw/workspace/skills/web-search/SKILL.md</location>\n </skill>\n</available_skills>","systemPromptReport":{"source":"run","generatedAt":1780301586884,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","provider":"deepseek","model":"deepseek-v4-flash","workspaceDir":"/home/yangxuan/.openclaw/workspace","bootstrapMaxChars":12000,"bootstrapTotalMaxChars":60000,"bootstrapTruncation":{"warningMode":"always","warningShown":false,"truncatedFiles":0,"nearLimitFiles":0,"totalNearLimit":false},"sandbox":{"mode":"off","sandboxed":false},"systemPrompt":{"chars":33596,"hash":"31a1bce1661ce2d34e5e7f875a5223f5d2c5ec4dbe7587c92890b8530f967398","projectContextChars":7760,"nonProjectContextChars":25836},"injectedWorkspaceFiles":[{"name":"AGENTS.md","path":"/home/yangxuan/.openclaw/workspace/AGENTS.md","missing":false,"rawChars":3727,"injectedChars":3727,"truncated":false},{"name":"SOUL.md","path":"/home/yangxuan/.openclaw/workspace/SOUL.md","missing":false,"rawChars":1193,"injectedChars":1193,"truncated":false},{"name":"TOOLS.md","path":"/home/yangxuan/.openclaw/workspace/TOOLS.md","missing":false,"rawChars":169,"injectedChars":169,"truncated":false},{"name":"IDENTITY.md","path":"/home/yangxuan/.openclaw/workspace/IDENTITY.md","missing":false,"rawChars":1129,"injectedChars":1129,"truncated":false},{"name":"USER.md","path":"/home/yangxuan/.openclaw/workspace/USER.md","missing":false,"rawChars":281,"injectedChars":281,"truncated":false},{"name":"HEARTBEAT.md","path":"/home/yangxuan/.openclaw/workspace/HEARTBEAT.md","missing":false,"rawChars":151,"injectedChars":151,"truncated":false},{"name":"MEMORY.md","path":"/home/yangxuan/.openclaw/workspace/MEMORY.md","missing":false,"rawChars":673,"injectedChars":673,"truncated":false}],"skills":{"promptChars":14755,"hash":"c80c28490f650af9463492f371112bcc1170605a1ed9fbd3a1a3751309190ba3","entries":[{"name":"canvas","blockChars":278},{"name":"clawhub","blockChars":268},{"name":"Code","blockChars":253},{"name":"database-admin","blockChars":844},{"name":"database-schema-designer","blockChars":204},{"name":"db-query","blockChars":506},{"name":"db-schema","blockChars":328},{"name":"deep-research-pro","blockChars":289},{"name":"diagram-maker","blockChars":281},{"name":"dingtalk-channel-rules","blockChars":296},{"name":"dingtalk-troubleshoot","blockChars":345},{"name":"docker-essentials","blockChars":264},{"name":"dws","blockChars":332},{"name":"dws-cli","blockChars":379},{"name":"gh-issues","blockChars":304},{"name":"github","blockChars":275},{"name":"healthcheck","blockChars":293},{"name":"humanizer","blockChars":598},{"name":"imap-smtp-email","blockChars":471},{"name":"mcporter","blockChars":312},{"name":"meme-maker","blockChars":266},{"name":"multi-search-engine","blockChars":374},{"name":"MySQL","blockChars":246},{"name":"news-summary","blockChars":356},{"name":"node-connect","blockChars":296},{"name":"node-inspect-debugger","blockChars":292},{"name":"obsidian-official-cli","blockChars":516},{"name":"opencode-controller","blockChars":336},{"name":"openspec","blockChars":510},{"name":"python-debugpy","blockChars":280},{"name":"qiushi-openclaw-skills","blockChars":263},{"name":"rss-ai-reader","blockChars":353},{"name":"skill-creator","blockChars":274},{"name":"spike","blockChars":266},{"name":"sql-toolkit","blockChars":383},{"name":"taskflow","blockChars":296},{"name":"taskflow-inbox-triage","blockChars":306},{"name":"tmux","blockChars":284},{"name":"using-superpowers","blockChars":325},{"name":"video-frames","blockChars":211},{"name":"weather","blockChars":202},{"name":"web-search","blockChars":508}]},"tools":{"listChars":0,"schemaChars":14296,"entries":[{"name":"read","summaryChars":298,"summaryHash":"f8a1d7cf1ecfe02b1b5865c93387e6a5891e5079117b4fe18614b6f912521727","schemaChars":304,"schemaHash":"134f19bcabe3e29d63c5cebb38f1d2556759fd08adad6bc90a4b4d3cd1fb8441","propertiesCount":3},{"name":"edit","summaryChars":326,"summaryHash":"c498a85576e187d069e8e8ea4f70f81bddd57829600d385ef61c4359fd634c9e","schemaChars":834,"schemaHash":"457e8bb9f800b21be76c4fd8c0e3078bf07ee9bf93ac82f39944c171bd8f6d84","propertiesCount":2},{"name":"write","summaryChars":127,"summaryHash":"cdb1c46027b22d1f1b923b47bfe297821d9fe589a9f9d92994961948060a4d89","schemaChars":225,"schemaHash":"e98a2484f667cf7c22d76ca103bf2022bf9113dc63fe38b899e71c328cb1e833","propertiesCount":2},{"name":"exec","summaryChars":539,"summaryHash":"4825198988fbfa8ebf5c2a8fbe3946da0be639b1e3b737ceaa4364195bba3f04","schemaChars":1187,"schemaHash":"0c03eeccccb7b7e97234d2c8245c6060e2b292588f02455eae20c60b61bb8bb8","propertiesCount":12},{"name":"process","summaryChars":456,"summaryHash":"55297e65d460e0e1e06e7fad4cedb75ffda8fac9fa8b10aa06d6cead3c5a76ea","schemaChars":1074,"schemaHash":"a2d30a25569f409d7e8539844c89a088044535388b24031d014577b96ed27c5c","propertiesCount":12},{"name":"cron","summaryChars":3610,"summaryHash":"262e6a7b421538d13ca6d79fc14616de3ea0c24fde8b050d6fa1652fe991e5c5","schemaChars":7299,"schemaHash":"1eaad399158d457d3bbd1d8f58723148c03500c5fc0f7af8e4adb118d3a928c0","propertiesCount":14},{"name":"update_plan","summaryChars":163,"summaryHash":"ea18cc44224e849c68cdf0a4839c295c1b20daf2699e2fc2be4c4e1552327455","schemaChars":489,"schemaHash":"50cb08b8a29e72637eb6720e6f5f3786783824537574f05ee9ae7a5f4ecacc4b","propertiesCount":2},{"name":"sessions_list","summaryChars":135,"summaryHash":"c7e411ae02e3adff5504aaee48f02d262a8abb9152558a3172aae289e3b05faf","schemaChars":435,"schemaHash":"c29c6b82c36a2d95a88c8944f129929b2621ee2af6d17b2ab101d4d7e9633d89","propertiesCount":9},{"name":"sessions_history","summaryChars":117,"summaryHash":"f5d45b76f11a8ac63cc45d456fb6f675f0b1a2e191feb9671924cb5830058f03","schemaChars":162,"schemaHash":"ac33b8af2252262afe479236046f5a04bc018f1fcf24d1a8bf32743f0e867598","propertiesCount":3},{"name":"sessions_send","summaryChars":224,"summaryHash":"56fd935fc97400f8c60b16ae58268660a2d84d8014a60abed515576c45a6f307","schemaChars":275,"schemaHash":"f1fbaa412fe6b6aee102234c87c5aa140f39c9086f9bae6e1e9691309a602ffb","propertiesCount":5},{"name":"sessions_spawn","summaryChars":332,"summaryHash":"5ced554d0c09b9c71fa003139eca7871bbfdc0917a323fc17af2a9faec46c5b7","schemaChars":1250,"schemaHash":"2d1670783c8e0c6cae4a1d0a2bdcc059520837661a88702e827905e742a194c9","propertiesCount":17},{"name":"sessions_yield","summaryChars":79,"summaryHash":"f3782fc41c1522657e1d3494f486a2df998fed38a6b89dcf7f6934fb41424320","schemaChars":60,"schemaHash":"b1c4c753820bc3096d85ef7a266a14c9fbe12450536db58076b75bb61d14dbbb","propertiesCount":1},{"name":"subagents","summaryChars":132,"summaryHash":"1c2ffd38549c0444b118d43736fc4b875ea1aaabc446bbf8bc1fc4ee9180cca4","schemaChars":122,"schemaHash":"c4a241d2c3d46ba7985abfce4d3fcd63298ce81f89d49183c8f3d584c48d0c33","propertiesCount":2},{"name":"session_status","summaryChars":278,"summaryHash":"71177e543dc6235bad4b1a26761995681dcec27ab58dcb4f4f8a7fc9a7b2b5aa","schemaChars":89,"schemaHash":"d2995f3d69d126e98ac93eec3c2a9fe5556925bd7979a8e4b6b5a2bf62d329dd","propertiesCount":2},{"name":"memory_search","summaryChars":605,"summaryHash":"0f918d28864d3682ae77731f149273997c84773592a466b18c7cd0121b599a05","schemaChars":250,"schemaHash":"088cd2a3d3a47b251429ff7c56844cdedd1c45c3af0fa8bfaf7aa795766976bf","propertiesCount":4},{"name":"memory_get","summaryChars":239,"summaryHash":"bff1141a3da31a345c550337417efc9ace4da2909004606c727c59ca1a294495","schemaChars":241,"schemaHash":"78f5d58460a82f9104deebad2f1873a8cde05d1ce7328b3ba4da6e994653e70a","propertiesCount":4}]}}},"redaction":{"config":{"mode":"redactConfigObject","secretsMasked":true},"payloads":{"mode":"sanitizeDiagnosticPayload","credentialsRemoved":true,"imageDataRedacted":true},"harness":{"mode":"diagnostic-support-redaction","programArgumentsRedacted":true,"localPathsRedacted":true}},"metadata":{"sessionKey":"agent:main:main","agentId":"main","messageProvider":"webchat"}}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"context.compiled","ts":"2026-06-01T08:13:06.939Z","seq":3,"sourceSeq":3,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"systemPrompt":{"truncated":true,"reason":"trajectory-field-size-limit","originalChars":33596,"limitChars":32768},"prompt":"[Mon 2026-06-01 16:13 GMT+8] 创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","messages":[],"tools":[{"name":"cron","description":"Manage Gateway cron jobs and wake events: reminders, check-back-later, delayed follow-ups, recurring work. Do not emulate scheduling with exec sleep/process polling.\n\nMain cron => system events for heartbeat. Isolated cron => background task in `openclaw tasks`.\n\nACTIONS:\n- status: scheduler status\n- list: jobs; includeDisabled true includes disabled; agentId filter auto-filled from session\n- get: one job; needs jobId\n- add: create job; needs job object\n- update: patch job; needs jobId + patch\n- remove: delete job; needs jobId\n- run: trigger now; needs jobId\n- runs: run history; needs jobId\n- wake: send wake event; needs text, optional mode\n\nJOB SCHEMA (for add action):\n{\n \"name\": \"string\",\n \"schedule\": { ... }, // required\n \"payload\": { ... }, // required\n \"delivery\": { ... }, // optional announce for isolated/current/session, webhook for any target\n \"sessionTarget\": \"main\" | \"isolated\" | \"current\" | \"session:<id>\",\n \"enabled\": true | false // default true\n}\n\nSESSION TARGET OPTIONS:\n- \"main\": main session; requires payload.kind=\"systemEvent\"\n- \"isolated\": ephemeral isolated session; requires payload.kind=\"agentTurn\"\n- \"current\": bind current session at creation\n- \"session:<id>\": persistent named session\n\nDEFAULTS:\n- payload.kind=\"systemEvent\" → defaults to \"main\"\n- payload.kind=\"agentTurn\" → defaults to \"isolated\"\nCurrent binding needs sessionTarget=\"current\".\n\nSCHEDULE TYPES (schedule.kind):\n- \"at\": one-shot absolute time\n { \"kind\": \"at\", \"at\": \"<ISO-8601 timestamp>\" }\n- \"every\": recurring interval\n { \"kind\": \"every\", \"everyMs\": <ms>, \"anchorMs\": <optional-ms> }\n- \"cron\": expr in supplied timezone, or Gateway host local timezone when tz omitted\n { \"kind\": \"cron\", \"expr\": \"<cron-expression>\", \"tz\": \"<optional-IANA-timezone>\" }\n Write expr in local wall-clock time; do not convert the requested local time to UTC first.\n tz omitted => Gateway host local timezone, not UTC.\n Example 6pm Shanghai daily: { \"kind\": \"cron\", \"expr\": \"0 18 * * *\", \"tz\": \"Asia/Shanghai\" }\n\nFor \"at\", ISO timestamps without timezone are UTC.\n\nPAYLOAD TYPES (payload.kind):\n- \"systemEvent\": inject text as system event\n { \"kind\": \"systemEvent\", \"text\": \"<message>\" }\n- \"agentTurn\": run agent with prompt; isolated/current/session only\n { \"kind\": \"agentTurn\", \"message\": \"<prompt>\", \"model\": \"<optional>\", \"thinking\": \"<optional>\", \"timeoutSeconds\": <optional, 0=no timeout> }\n\nDELIVERY (top-level):\n { \"mode\": \"none|announce|webhook\", \"channel\": \"<optional>\", \"to\": \"<optional>\", \"threadId\": \"<optional>\", \"bestEffort\": <optional-bool> }\n - isolated agentTurn default when omitted: \"announce\"\n - announce: send to chat channel; isolated/current/session only; optional channel/to\n - threadId: chat thread/topic id\n - webhook: POST finished-run event to delivery.to URL\n - Specific chat/recipient: set announce delivery.channel/to; do not call messaging tools inside run.\n\nCRITICAL CONSTRAINTS:\n- sessionTarget=\"main\" REQUIRES payload.kind=\"systemEvent\"\n- sessionTarget=\"isolated\" | \"current\" | \"session:xxx\" REQUIRES payload.kind=\"agentTurn\"\n- Webhook: delivery.mode=\"webhook\" and delivery.to URL.\nDefault: prefer isolated agentTurn jobs unless the user explicitly wants current-session binding.\n\nRESTRICTED CRON RUNS:\n- Some isolated cron runs get narrow self-cleanup grant: status/list self-only, get/runs current job only, mutation only remove current job.\n\nWAKE MODES (for wake action):\n- \"next-heartbeat\" default: wake next heartbeat\n- \"now\": wake immediately\n\nUse jobId canonical; id accepted compat. contextMessages (0-10) adds previous messages as job context.","parameters":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"gatewayUrl":{"type":"string"},"timeoutMs":{"type":"integer","minimum":1},"includeDisabled":{"type":"boolean"},"job":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"additionalProperties":true},"jobId":{"type":"string"},"id":{"type":"string"},"patch":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"additionalProperties":true},"text":{"type":"string"},"mode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"runMode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"contextMessages":{"type":"integer","minimum":0,"maximum":10},"agentId":{"type":"string","description":"List filter: agent id"}},"additionalProperties":true}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}},"additionalProperties":false}},{"name":"exec","description":"Execute shell commands with background continuation for work that starts now. Use yieldMs/background to continue later via process tool. For long-running work started now, rely on automatic completion wake when it is enabled and the command emits output or fails; otherwise use process to confirm completion. Use process whenever you need logs, status, input, or intervention. Do not use exec sleep or delay loops for reminders or deferred follow-ups; use cron instead. Use pty=true for TTY-required commands (terminal UIs, coding agents).","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"workdir":{"type":"string","description":"Working directory (defaults to cwd)"},"env":{"type":"object","patternProperties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"yieldMs":{"type":"number","description":"Milliseconds to wait before backgrounding (default 10000)"},"background":{"type":"boolean","description":"Run in background immediately"},"timeout":{"type":"number","description":"Timeout in seconds (optional, kills process on expiry)"},"pty":{"type":"boolean","description":"Run in a pseudo-terminal (PTY) when available (TTY-required CLIs, coding agents)"},"elevated":{"type":"boolean","description":"Run on the host with elevated permissions (if allowed)"},"host":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Exec host/target (auto|sandbox|gateway|node)."},"security":{"type":"string","description":"Ignored for normal calls; exec security is set by tools.exec.security and host approvals."},"ask":{"type":"string","description":"Exec ask mode (off|on-miss|always)."},"node":{"type":"string","description":"Node id/name for host=node."}}}},{"name":"memory_get","description":"Safe exact excerpt read from MEMORY.md or memory/*.md. Defaults to a bounded excerpt when lines are omitted, includes truncation/continuation info when more content exists, and `corpus=wiki` reads from registered compiled-wiki supplements.","parameters":{"type":"object","properties":{"path":{"type":"string"},"from":{"type":"integer","minimum":1},"lines":{"type":"integer","minimum":1},"corpus":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"required":["path"],"additionalProperties":false}},{"name":"memory_search","description":"Mandatory recall step: semantically search MEMORY.md + memory/*.md (and optional session transcripts) before answering questions about prior work, decisions, dates, people, preferences, or todos. Optional `corpus=wiki` or `corpus=all` also searches registered compiled-wiki supplements. `corpus=memory` restricts hits to indexed memory files (excludes session transcript chunks from ranking). `corpus=sessions` restricts hits to indexed session transcripts (same visibility rules as session history tools). If response has disabled=true, memory retrieval is unavailable and should be surfaced to the user.","parameters":{"type":"object","properties":{"query":{"type":"string"},"maxResults":{"type":"integer","minimum":1},"minScore":{"type":"number"},"corpus":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"required":["query"],"additionalProperties":false}},{"name":"process","description":"Manage running exec sessions for commands already started: list, poll, log, write, send-keys, submit, paste, kill. Use poll/log when you need status, logs, quiet-success confirmation, or completion confirmation when automatic completion wake is unavailable. Use poll/log also for input-wait hints. Use write/send-keys/submit/paste/kill for input or intervention. Do not use process polling to emulate timers or reminders; use cron for scheduled follow-ups.","parameters":{"type":"object","required":["action"],"properties":{"action":{"type":"string","description":"Process action (list|poll|log|write|send-keys|submit|paste|kill|clear|remove)"},"sessionId":{"type":"string","description":"Session id for actions other than list"},"data":{"type":"string","description":"Data to write for write"},"keys":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Key tokens to send for send-keys"},"hex":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Hex bytes to send for send-keys"},"literal":{"type":"string","description":"Literal string for send-keys"},"text":{"type":"string","description":"Text to paste for paste"},"bracketed":{"type":"boolean","description":"Wrap paste in bracketed mode"},"eof":{"type":"boolean","description":"Close stdin after write"},"offset":{"type":"number","description":"Log offset"},"limit":{"type":"number","description":"Log length"},"timeout":{"type":"number","description":"For poll: wait up to this many milliseconds before returning; max 30000 ms, higher values are clamped to 30000","minimum":0}}}},{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}}},{"name":"session_status","description":"Show /status-like card for current/visible session: model, usage, time, cost, tasks. Use `sessionKey=\"current\"` for current session; UI labels like `openclaw-tui` are not keys. `model` sets session override; `model=default` resets. Use for active model/session config questions.","parameters":{"type":"object","properties":{"sessionKey":{"type":"string"},"model":{"type":"string"}}}},{"name":"sessions_history","description":"Fetch sanitized history for visible session. Use before replying, debugging, resuming; supports limits/tool messages.","parameters":{"type":"object","required":["sessionKey"],"properties":{"sessionKey":{"type":"string"},"limit":{"type":"integer","minimum":1},"includeTools":{"type":"boolean"}}}},{"name":"sessions_list","description":"List visible sessions; filter by kind, label, agentId, search, activity. Use before sessions_history or sessions_send target selection.","parameters":{"type":"object","properties":{"kinds":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"limit":{"type":"integer","minimum":1},"activeMinutes":{"type":"integer","minimum":1},"messageLimit":{"type":"integer","minimum":0},"label":{"type":"string","minLength":1},"agentId":{"type":"string","minLength":1,"maxLength":64},"search":{"type":"string","minLength":1},"includeDerivedTitles":{"type":"boolean"},"includeLastMessage":{"type":"boolean"}}}},{"name":"sessions_send","description":"Send message to visible session by sessionKey/label, or configured agent by agentId. Thread-scoped chats rejected; target parent channel session. Creates missing configured-agent main session; waits for reply when available.","parameters":{"type":"object","required":["message"],"properties":{"sessionKey":{"type":"string"},"label":{"type":"string","minLength":1,"maxLength":512},"agentId":{"type":"string","minLength":1,"maxLength":64},"message":{"type":"string"},"timeoutSeconds":{"type":"integer","minimum":0}}}},{"name":"sessions_spawn","description":"Spawn clean child session; default `runtime=\"subagent\"`. `mode=\"run\"` one-shot background work. Subagents inherit parent workspace. Native subagents get task in first visible `[Subagent Task]` message. Native only: `context=\"fork\"` only when child needs current transcript; else omit or `isolated`. Use for fresh child-session work.","parameters":{"type":"object","required":["task"],"properties":{"task":{"type":"string"},"taskName":{"type":"string","description":"Stable alias for later targeting; lowercase letters/digits/underscores/hyphens, starts letter."},"label":{"type":"string"},"runtime":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"agentId":{"type":"string"},"model":{"type":"string"},"thinking":{"type":"string"},"cwd":{"type":"string"},"runTimeoutSeconds":{"type":"integer","minimum":0},"timeoutSeconds":{"type":"integer","minimum":0},"mode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"cleanup":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"sandbox":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"context":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Native context. Omit/\"isolated\" for clean child; \"fork\" only when child needs requester transcript."},"lightContext":{"type":"boolean","description":"Light bootstrap context; runtime=\"subagent\" only."},"attachments":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"maxItems":50},"attachAs":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}}}},{"name":"sessions_yield","description":"End current turn. Use after spawning subagents; results arrive as next message.","parameters":{"type":"object","properties":{"message":{"type":"string"}}}},{"name":"subagents","description":"List active and recent subagents for the requester session. If sessions_yield exists, use it for completion; do not poll wait loops.","parameters":{"type":"object","properties":{"action":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"recentMinutes":{"type":"integer","minimum":1}}}},{"name":"update_plan","description":"Update current run plan. Use for non-trivial multi-step work; keep plan current while executing. Short steps; max one `in_progress`; skip for simple one-step work.","parameters":{"type":"object","required":["plan"],"properties":{"explanation":{"type":"string","description":"Short note: what changed."},"plan":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"minItems":1,"description":"Ordered steps; max one in_progress."}}}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}}}],"imagesCount":0,"streamStrategy":"boundary-aware:openai-completions","transport":"auto","transcriptLeafId":"edface9b"}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"prompt.submitted","ts":"2026-06-01T08:13:06.941Z","seq":4,"sourceSeq":4,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"prompt":"[Mon 2026-06-01 16:13 GMT+8] 创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","systemPrompt":{"truncated":true,"reason":"trajectory-field-size-limit","originalChars":33596,"limitChars":32768},"messages":[],"imagesCount":0}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"model.completed","ts":"2026-06-01T08:13:19.336Z","seq":5,"sourceSeq":5,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false,"promptErrorSource":null,"usage":{"input":18596,"output":1376,"cacheRead":56064,"total":76036},"promptCache":{"lastCallUsage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"total":19773},"lastCacheTouchAt":1780301596661},"compactionCount":0,"assistantTexts":["好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:","已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"],"finalPromptText":"[Mon 2026-06-01 16:13 GMT+8] 创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","messagesSnapshot":[{"role":"user","content":[{"type":"text","text":"[Mon 2026-06-01 16:13 GMT+8] 创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}"}],"timestamp":1780301586943},{"role":"assistant","content":[{"type":"text","text":"好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:"},{"type":"toolCall","id":"call_00_A0oxTlAMYgYWRnOviKk87034","name":"exec","arguments":{"command":"ls ~/.openclaw/workspace/skills/"},"partialArgs":"{\"command\": \"ls ~/.openclaw/workspace/skills/\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":18214,"output":89,"cacheRead":0,"cacheWrite":0,"totalTokens":18303,"cost":{"input":0.018213999999999998,"output":0.000178,"cacheRead":0,"cacheWrite":0,"total":0.018392}},"stopReason":"toolUse","timestamp":1780301587022,"responseId":"fd743bba-bb3a-4d01-a073-7b7720ee1c67"},{"role":"toolResult","toolCallId":"call_00_A0oxTlAMYgYWRnOviKk87034","toolName":"exec","content":[{"type":"text","text":"MySQL\nObsidian\nblogwatcher\nbrowser\ndatabase-admin\ndatabase-schema-designer\ndb-query\ndb-schema-gen\ndeep-research-pro\ndocker-essentials\nhumanizer\nimap-smtp-email\nmcporter\nmulti-search-engine\nnews-summary\nobsidian\nobsidian-official-cli\nopenclaw-code\nopencode-controller\nopenspec\nqiushi-openclaw-skill\nrss-ai-reader\nsql-toolkit\nusing-superpowers\nvideo-frames\nweather\nweb-search"}],"details":{"status":"completed","exitCode":0,"durationMs":9,"aggregated":"MySQL\nObsidian\nblogwatcher\nbrowser\ndatabase-admin\ndatabase-schema-designer\ndb-query\ndb-schema-gen\ndeep-research-pro\ndocker-essentials\nhumanizer\nimap-smtp-email\nmcporter\nmulti-search-engine\nnews-summary\nobsidian\nobsidian-official-cli\nopenclaw-code\nopencode-controller\nopenspec\nqiushi-openclaw-skill\nrss-ai-reader\nsql-toolkit\nusing-superpowers\nvideo-frames\nweather\nweb-search","cwd":"/home/yangxuan/.openclaw/workspace"},"isError":false,"timestamp":1780301588868},{"role":"assistant","content":[{"type":"toolCall","id":"call_00_7XMRwq7o85F0QJJE5CFU2056","name":"exec","arguments":{"command":"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst"},"partialArgs":"{\"command\": \"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":257,"output":59,"cacheRead":18176,"cacheWrite":0,"totalTokens":18492,"cost":{"input":0.000257,"output":0.000118,"cacheRead":0,"cacheWrite":0,"total":0.000375}},"stopReason":"toolUse","timestamp":1780301588871,"responseId":"1413735d-56f0-4dca-aef2-44293b4085b8"},{"role":"toolResult","toolCallId":"call_00_7XMRwq7o85F0QJJE5CFU2056","toolName":"exec","content":[{"type":"text","text":"(no output)"}],"details":{"status":"completed","exitCode":0,"durationMs":77,"aggregated":"","cwd":"/home/yangxuan/.openclaw/workspace"},"isError":false,"timestamp":1780301590043},{"role":"assistant","content":[{"type":"toolCall","id":"call_00_225ww3C6dPbensrhCCBn1085","name":"write","arguments":{"path":"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md","content":"# 通用需求分析 Agent\n\n## 描述\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\n\n## 触发条件\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\n- 用户提出了一个功能想法,需要拆解技术方案\n- 用户需要前后端分工的技术文档\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}\n```\n\n### 交互逻辑\n[事件处理、表单校验、加载状态等]\n\n### API 调用\n[请求参数、响应处理、错误处理]\n\n## 五、后端规范\n\n### 接口定义\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| [API路径] | GET/POST/PUT/DELETE | | | |\n\n### 业务规则\n[关键业务校验逻辑]\n\n### 异常处理\n[错误码或异常场景]\n\n## 六、代码框架\n\n### 前端组件骨架\n```vue\n<template>\n <!-- 模板代码 -->\n</template>\n\n<script>\nexport default {\n // 组件代码\n}\n</script>\n```\n\n### 后端 Service 骨架\n```java/python/go\n// Service 层代码框架\n```\n\n## 七、注意事项\n- [性能/安全/兼容性等方面的提醒]\n\n## 约束与原则\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\n- **离线性优先**:产出物应详细到无需联网即可编码实现\n- **结构化输出**:严格按模板输出,不可随意删减章节\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\n"},"partialArgs":"{\"path\": \"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md\", \"content\": \"# 通用需求分析 Agent\\n\\n## 描述\\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\\n\\n## 触发条件\\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\\n- 用户提出了一个功能想法,需要拆解技术方案\\n- 用户需要前后端分工的技术文档\\n\\n## 工作流程(必须按顺序执行)\\n\\n### 第一步:需求理解与澄清\\n- 识别需求中的【实体】、【动作】、【约束】\\n- 标记模糊点,提出待澄清问题(不超过5个)\\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\\n\\n### 第二步:数据模型设计\\n- 列出涉及的数据实体和字段\\n- 标注新增字段 vs 现有字段\\n- 定义字段类型、长度、必填、默认值、关联关系\\n\\n### 第三步:前端规范输出\\n- 页面/组件结构\\n- 状态管理(data/computed/watch)\\n- 交互逻辑(事件处理、表单校验、错误提示)\\n- API调用(请求参数、响应处理、加载状态)\\n\\n### 第四步:后端规范输出\\n- 接口定义(路径、方法、请求/响应结构)\\n- 数据库操作(SQL或ORM代码)\\n- 业务规则校验\\n- 边界条件与异常处理\\n\\n### 第五步:代码框架生成\\n- 前端:组件骨架代码(可直接复制)\\n- 后端:Service/Controller骨架代码\\n\\n## 输出模板(必须严格遵守)\\n\\n# [需求名称] - 技术规范文档\\n\\n## 一、需求摘要\\n[2-3句话总结核心需求]\\n\\n## 二、待澄清问题(如有)\\n- [ ] 问题1\\n- [ ] 问题2\\n\\n## 三、数据模型\\n\\n### 涉及实体\\n| 实体名 | 操作类型 | 说明 |\\n|--------|----------|------|\\n| [实体] | 新增/修改/查询 | |\\n\\n### 字段变更\\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\\n|------|------|------|------|------|------|\\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\\n\\n## 四、前端规范\\n\\n### 页面/组件结构\\n[组件树或目录结构]\\n\\n### 状态定义\\n```javascript\\ndata() {\\n return {\\n // 定义所有响应式数据\\n }\\n}\\n```\\n\\n### 交互逻辑\\n[事件处理、表单校验、加载状态等]\\n\\n### API 调用\\n[请求参数、响应处理、错误处理]\\n\\n## 五、后端规范\\n\\n### 接口定义\\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\\n|------|------|------|----------|----------|\\n| [API路径] | GET/POST/PUT/DELETE | | | |\\n\\n### 业务规则\\n[关键业务校验逻辑]\\n\\n### 异常处理\\n[错误码或异常场景]\\n\\n## 六、代码框架\\n\\n### 前端组件骨架\\n```vue\\n<template>\\n <!-- 模板代码 -->\\n</template>\\n\\n<script>\\nexport default {\\n // 组件代码\\n}\\n</script>\\n```\\n\\n### 后端 Service 骨架\\n```java/python/go\\n// Service 层代码框架\\n```\\n\\n## 七、注意事项\\n- [性能/安全/兼容性等方面的提醒]\\n\\n## 约束与原则\\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\\n- **离线性优先**:产出物应详细到无需联网即可编码实现\\n- **结构化输出**:严格按模板输出,不可随意删减章节\\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\\n\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":74,"output":962,"cacheRead":18432,"cacheWrite":0,"totalTokens":19468,"cost":{"input":0.000074,"output":0.001924,"cacheRead":0,"cacheWrite":0,"total":0.0019979999999999998}},"stopReason":"toolUse","timestamp":1780301590044,"responseId":"7bfec30a-df97-4fc4-80c9-cf89739f20a0"},{"role":"toolResult","toolCallId":"call_00_225ww3C6dPbensrhCCBn1085","toolName":"write","content":[{"type":"text","text":"Successfully wrote 1721 bytes to ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"}],"isError":false,"timestamp":1780301596658},{"role":"assistant","content":[{"type":"text","text":"已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"totalTokens":19773,"cost":{"input":0.000051,"output":0.000532,"cacheRead":0,"cacheWrite":0,"total":0.0005830000000000001}},"stopReason":"stop","timestamp":1780301596661,"responseId":"9a9b9dd9-65c3-4868-ac75-874a7aed115f"}]}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"trace.artifacts","ts":"2026-06-01T08:13:19.337Z","seq":6,"sourceSeq":6,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"capturedAt":"2026-06-01T08:13:19.337Z","finalStatus":"success","aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false,"promptErrorSource":null,"usage":{"input":18596,"output":1376,"cacheRead":56064,"total":76036},"promptCache":{"lastCallUsage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"total":19773},"lastCacheTouchAt":1780301596661},"compactionCount":0,"assistantTexts":["好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:","已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"],"finalPromptText":"[Mon 2026-06-01 16:13 GMT+8] 创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","itemLifecycle":{"startedCount":5,"completedCount":5,"activeCount":0},"toolMetas":[{"toolName":"exec","meta":"list files in ~/.openclaw/workspace/skills/"},{"toolName":"exec","meta":"create folder ~/.openclaw/workspace/skills/requirements-analyst"},{"toolName":"write","meta":"to ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md (1721 chars)"}],"didSendViaMessagingTool":false,"successfulCronAdds":0,"messagingToolSentTexts":[],"messagingToolSentMediaUrls":[],"messagingToolSentTargets":[]}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"session.ended","ts":"2026-06-01T08:13:19.337Z","seq":7,"sourceSeq":7,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"1a816b82-81df-4f52-973d-ad83c4bebf6c","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"status":"success","aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"session.started","ts":"2026-06-01T08:14:36.200Z","seq":1,"sourceSeq":8,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"trigger":"user","sessionFile":"/home/yangxuan/.openclaw/agents/main/sessions/5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d.jsonl","workspaceDir":"/home/yangxuan/.openclaw/workspace","agentId":"main","messageProvider":"webchat","localModelLean":false,"toolCount":16,"clientToolCount":0}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"trace.metadata","ts":"2026-06-01T08:14:36.202Z","seq":2,"sourceSeq":9,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"capturedAt":"2026-06-01T08:14:36.200Z","harness":{"type":"openclaw","name":"OpenClaw","version":"2026.5.28","gitSha":"5c39670","os":{"platform":"linux","arch":"x64","release":"6.6.87.2-microsoft-standard-WSL2","label":"linux 6.6.87.2-microsoft-standard-WSL2 (x64)"},"runtime":{"node":"v25.2.0"},"invocation":["~/.nvm/versions/node/v25.2.0/bin/node","~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/index.js","gateway","--port","18789"],"entrypoint":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/index.js","workspaceDir":"$OPENCLAW_STATE_DIR/workspace","sessionFile":"$OPENCLAW_STATE_DIR/agents/main/sessions/5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d.jsonl"},"model":{"provider":"deepseek","name":"deepseek-v4-flash","api":"openai-completions","fastMode":false,"thinkLevel":"off","reasoningLevel":"off"},"config":{"redacted":{"meta":{"lastTouchedVersion":"2026.5.28","lastTouchedAt":"2026-06-01T02:32:13.669Z"},"wizard":{"lastRunAt":"2026-06-01T02:32:03.942Z","lastRunVersion":"2026.5.28","lastRunCommand":"doctor","lastRunMode":"local"},"auth":{"profiles":{"ollama:default":{"provider":"ollama","mode":"api_key"}}},"models":{"mode":"merge","providers":{"ollama":{"baseUrl":"http://127.0.0.1:11434","api":"ollama","models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"new-api":{"baseUrl":"http://192.168.2.74:3000/v1","api":"openai-completions","request":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"deepseek":{"baseUrl":"https://api.deepseek.com/v1","api":"openai-completions","models":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}}},"agents":{"defaults":{"model":{"primary":"new-api/deepseek-v4-flash"},"models":{"ollama/huihui_ai/glm-4.7-flash-abliterated:latest":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"ollama/deepseek-v4-flash:cloud":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"deepseek/deepseek-v4-pro":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"deepseek/deepseek-v4-flash":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/deepseek-v4-flash":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/qwen3.5-plus":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/qwen3.7-max":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"new-api/glm-5.1":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"workspace":"/home/yangxuan/.openclaw/workspace","compaction":{"mode":"safeguard"},"timeoutSeconds":3600,"maxConcurrent":2,"subagents":{"maxConcurrent":4,"archiveAfterMinutes":60},"sandbox":{"mode":"off"}},"list":[{"id":"main","name":"生活助手","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"bt","name":"下载助手","workspace":"/home/yangxuan/.openclaw/workspace/bt","agentDir":"/home/yangxuan/.openclaw/agents/bt/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"storage","name":"仓库管理员","workspace":"/home/yangxuan/.openclaw/workspace/storage","agentDir":"/home/yangxuan/.openclaw/agents/storage/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"java","name":"Java 后端","workspace":"/home/yangxuan/.openclaw/workspace/java","agentDir":"/home/yangxuan/.openclaw/agents/java/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"front","name":"前端","workspace":"/home/yangxuan/.openclaw/workspace/front","agentDir":"/home/yangxuan/.openclaw/agents/front/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"resume","name":"简历助手","workspace":"/home/yangxuan/.openclaw/workspace/resume","agentDir":"/home/yangxuan/.openclaw/agents/resume/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},{"id":"travel","name":"旅途助手","workspace":"/home/yangxuan/.openclaw/workspace/travel","agentDir":"/home/yangxuan/.openclaw/agents/travel/agent","model":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"identity":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}]},"tools":{"profile":"coding","deny":["group:web","browser"],"web":{"search":{"enabled":true,"provider":"searxng","openaiCodex":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"fetch":{"enabled":true}}},"bindings":[{"agentId":"travel","match":{"channel":"openclaw-weixin","accountId":"4a0926e2cb5f-im-bot"}},{"agentId":"java","match":{"channel":"dingtalk-connector"}}],"messages":{"groupChat":{"visibleReplies":"message_tool"},"ackReactionScope":"group-mentions"},"commands":{"native":"auto","nativeSkills":"auto","restart":true,"ownerDisplay":"raw"},"session":{"dmScope":"per-channel-peer"},"channels":{"openclaw-weixin":{"enabled":true,"defaultAccount":"4a0926e2cb5f-im-bot"},"dingtalk-connector":{"enabled":true,"defaultAccount":"default","clientId":"dingnumf057etbbowhfu","dmPolicy":"open","groupPolicy":"open","requireMention":true,"allowFrom":["*"],"groupAllowFrom":["*"],"separateSessionByConversation":true,"sharedMemoryAcrossConversations":false,"groupSessionScope":"group"}},"gateway":{"port":18789,"mode":"local","bind":"loopback","controlUi":{"allowedOrigins":["http://localhost:18789","http://127.0.0.1:18789","https://xuan-pc-nj-wsl.baiji-algieba.ts.net"],"allowInsecureAuth":true},"auth":{"mode":"token","allowTailscale":true},"trustedProxies":["127.0.0.1","100.115.195.0/24"],"tailscale":{"mode":"serve","resetOnExit":false},"http":{"endpoints":{"chatCompletions":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"nodes":{"denyCommands":[]}},"skills":{"entries":{"agent-browser":{"enabled":true},"Github":{"enabled":true},"notion":{"enabled":false},"openai-whisper":{"enabled":false},"openai-whisper-api":{"enabled":false},"oracle":{"enabled":false},"apple-notes":{"enabled":false},"apple-reminders":{"enabled":false},"bear-notes":{"enabled":false},"himalaya":{"enabled":false},"xurl":{"enabled":false},"blogwatcher":{"enabled":false},"blucli":{"enabled":false},"bluebubbles":{"enabled":false},"camsnap":{"enabled":false},"coding-agent":{"enabled":false},"discord":{"enabled":false},"eightctl":{"enabled":false},"gemini":{"enabled":false},"gifgrep":{"enabled":false},"gog":{"enabled":false},"goplaces":{"enabled":false},"imsg":{"enabled":false},"model-usage":{"enabled":false},"nano-pdf":{"enabled":false},"obsidian":{"enabled":false},"openhue":{"enabled":false},"ordercli":{"enabled":false},"peekaboo":{"enabled":false},"sag":{"enabled":false},"searxng-web-search":{"enabled":false},"session-logs":{"enabled":false},"sherpa-onnx-tts":{"enabled":false},"slack":{"enabled":false},"songsee":{"enabled":false},"sonoscli":{"enabled":false},"spotify-player":{"enabled":false},"summarize":{"enabled":false},"things-mac":{"enabled":false},"trello":{"enabled":false},"voice-call":{"enabled":false},"wacli":{"enabled":false}}},"plugins":{"allow":["deepseek","memory-core","ollama","openclaw-weixin","searxng","dingtalk-connector"],"entries":{"ollama":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"deepseek":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"searxng":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"openclaw-weixin":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"browser":{"enabled":false},"dingtalk-connector":{"enabled":true,"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"memory-core":{"config":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"bundledDiscovery":"compat"},"cron":{"maxConcurrentRuns":8}},"runtime":{"timeoutMs":3600000,"trigger":"user","disableTools":false,"toolResultFormat":"markdown"}},"plugins":{"source":"active-registry","importedRuntimePluginIds":["anthropic","deepseek","dingtalk-connector","lmstudio","memory-core","ollama","openclaw-weixin","searxng","xai"],"entries":[{"id":"active-memory","name":"Active Memory","description":"Runs a bounded blocking memory sub-agent before eligible conversational replies and injects relevant memory into prompt context.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/active-memory/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/active-memory"},{"id":"admin-http-rpc","name":"@openclaw/admin-http-rpc","version":"2026.5.28","description":"OpenClaw admin HTTP RPC endpoint","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/admin-http-rpc/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/admin-http-rpc"},{"id":"alibaba","name":"@openclaw/alibaba-provider","version":"2026.5.28","description":"OpenClaw Alibaba Model Studio video provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/alibaba/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/alibaba","videoGenerationProviderIds":["alibaba"]},{"id":"anthropic","name":"@openclaw/anthropic-provider","version":"2026.5.28","description":"OpenClaw Anthropic provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/anthropic/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/anthropic","providerIds":["anthropic"],"mediaUnderstandingProviderIds":["anthropic"]},{"id":"arcee","name":"@openclaw/arcee-provider","version":"2026.5.28","description":"OpenClaw Arcee provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/arcee/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/arcee","providerIds":["arcee"]},{"id":"azure-speech","name":"Azure Speech","version":"2026.5.28","description":"Azure AI Speech text-to-speech (MP3, native Ogg/Opus voice notes, PCM telephony).","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/azure-speech/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/azure-speech","speechProviderIds":["azure","azure-speech"]},{"id":"bonjour","name":"Bonjour Gateway Discovery","version":"2026.5.28","description":"Advertise the local OpenClaw gateway over Bonjour/mDNS.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/bonjour/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/bonjour"},{"id":"browser","name":"@openclaw/browser-plugin","version":"2026.5.28","description":"OpenClaw browser tool plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"disabled in config","status":"disabled","error":"disabled in config","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/browser/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/browser"},{"id":"byteplus","name":"@openclaw/byteplus-provider","version":"2026.5.28","description":"OpenClaw BytePlus provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/byteplus/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/byteplus","providerIds":["byteplus","byteplus-plan"],"videoGenerationProviderIds":["byteplus"]},{"id":"canvas","name":"Canvas","version":"2026.5.28","description":"Experimental Canvas control and A2UI rendering surfaces for paired nodes.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/canvas/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/canvas"},{"id":"cerebras","name":"@openclaw/cerebras-provider","version":"2026.5.28","description":"OpenClaw Cerebras provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cerebras/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cerebras","providerIds":["cerebras"]},{"id":"chutes","name":"@openclaw/chutes-provider","version":"2026.5.28","description":"OpenClaw Chutes.ai provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/chutes/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/chutes","providerIds":["chutes"]},{"id":"clickclack","name":"@openclaw/clickclack","version":"2026.5.28","description":"OpenClaw ClickClack channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/clickclack/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/clickclack","channelIds":["clickclack"]},{"id":"cloudflare-ai-gateway","name":"@openclaw/cloudflare-ai-gateway-provider","version":"2026.5.28","description":"OpenClaw Cloudflare AI Gateway provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cloudflare-ai-gateway/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/cloudflare-ai-gateway","providerIds":["cloudflare-ai-gateway"]},{"id":"codex-supervisor","name":"Codex Supervisor","version":"2026.5.28","description":"Supervise Codex app-server sessions from OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/codex-supervisor/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/codex-supervisor"},{"id":"comfy","name":"@openclaw/comfy-provider","version":"2026.5.28","description":"OpenClaw ComfyUI provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/comfy/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/comfy","providerIds":["comfy"],"imageGenerationProviderIds":["comfy"],"videoGenerationProviderIds":["comfy"],"musicGenerationProviderIds":["comfy"]},{"id":"copilot-proxy","name":"@openclaw/copilot-proxy","version":"2026.5.28","description":"OpenClaw Copilot Proxy provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/copilot-proxy/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/copilot-proxy","providerIds":["copilot-proxy"]},{"id":"deepgram","name":"@openclaw/deepgram-provider","version":"2026.5.28","description":"OpenClaw Deepgram media-understanding provider","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepgram/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepgram","realtimeTranscriptionProviderIds":["deepgram"],"mediaUnderstandingProviderIds":["deepgram"]},{"id":"deepinfra","name":"@openclaw/deepinfra-provider","version":"2026.5.28","description":"OpenClaw DeepInfra provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepinfra/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepinfra","providerIds":["deepinfra"],"speechProviderIds":["deepinfra"],"mediaUnderstandingProviderIds":["deepinfra"],"imageGenerationProviderIds":["deepinfra"],"videoGenerationProviderIds":["deepinfra"],"memoryEmbeddingProviderIds":["deepinfra"]},{"id":"deepseek","name":"DeepSeek Provider","version":"2026.5.28","description":"Bundled DeepSeek provider plugin","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepseek/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/deepseek","providerIds":["deepseek"]},{"id":"device-pair","name":"Device Pairing","description":"Generate setup codes and approve device pairing requests.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/device-pair/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/device-pair"},{"id":"dingtalk-connector","name":"DingTalk Channel","version":"0.8.23","description":"Official OpenClaw DingTalk channel plugin | 钉钉官方 OpenClaw 插件","origin":"global","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/dist/index.mjs","rootDir":"/home/yangxuan/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector","workspaceDir":"/home/yangxuan/.openclaw/workspace","channelIds":["dingtalk-connector"]},{"id":"document-extract","name":"Document Extraction","version":"2026.5.28","description":"Extract text and fallback page images from local document attachments.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/document-extract/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/document-extract"},{"id":"duckduckgo","name":"@openclaw/duckduckgo-plugin","version":"2026.5.28","description":"OpenClaw DuckDuckGo plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/duckduckgo/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/duckduckgo","webSearchProviderIds":["duckduckgo"]},{"id":"elevenlabs","name":"@openclaw/elevenlabs-speech","version":"2026.5.28","description":"OpenClaw ElevenLabs speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/elevenlabs/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/elevenlabs","speechProviderIds":["elevenlabs"],"realtimeTranscriptionProviderIds":["elevenlabs"],"mediaUnderstandingProviderIds":["elevenlabs"]},{"id":"exa","name":"@openclaw/exa-plugin","version":"2026.5.28","description":"OpenClaw Exa plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/exa/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/exa","webSearchProviderIds":["exa"]},{"id":"fal","name":"@openclaw/fal-provider","version":"2026.5.28","description":"OpenClaw fal provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fal/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fal","providerIds":["fal"],"imageGenerationProviderIds":["fal"],"videoGenerationProviderIds":["fal"],"musicGenerationProviderIds":["fal"]},{"id":"file-transfer","name":"File Transfer","version":"2026.5.28","description":"Fetch, list, and write files on paired nodes via dedicated node commands. Bypasses bash stdout truncation by using base64 over node.invoke for binaries up to 16 MB.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/file-transfer/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/file-transfer"},{"id":"firecrawl","name":"@openclaw/firecrawl-plugin","version":"2026.5.28","description":"OpenClaw Firecrawl plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/firecrawl/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/firecrawl","webFetchProviderIds":["firecrawl"],"webSearchProviderIds":["firecrawl"]},{"id":"fireworks","name":"@openclaw/fireworks-provider","version":"2026.5.28","description":"OpenClaw Fireworks provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fireworks/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/fireworks","providerIds":["fireworks"]},{"id":"github-copilot","name":"@openclaw/github-copilot-provider","version":"2026.5.28","description":"OpenClaw GitHub Copilot provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/github-copilot/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/github-copilot","providerIds":["github-copilot"],"memoryEmbeddingProviderIds":["github-copilot"]},{"id":"google","name":"@openclaw/google-plugin","version":"2026.5.28","description":"OpenClaw Google plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/google/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/google","providerIds":["google","google-gemini-cli","google-vertex"],"speechProviderIds":["google"],"realtimeVoiceProviderIds":["google"],"mediaUnderstandingProviderIds":["google"],"imageGenerationProviderIds":["google"],"videoGenerationProviderIds":["google"],"musicGenerationProviderIds":["google"],"webSearchProviderIds":["gemini"],"memoryEmbeddingProviderIds":["gemini"]},{"id":"gradium","name":"@openclaw/gradium-speech","version":"2026.5.28","description":"OpenClaw Gradium speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/gradium/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/gradium","speechProviderIds":["gradium"]},{"id":"groq","name":"@openclaw/groq-provider","version":"2026.5.28","description":"OpenClaw Groq media-understanding provider","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/groq/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/groq","providerIds":["groq"],"mediaUnderstandingProviderIds":["groq"]},{"id":"huggingface","name":"@openclaw/huggingface-provider","version":"2026.5.28","description":"OpenClaw Hugging Face provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/huggingface/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/huggingface","providerIds":["huggingface"]},{"id":"imessage","name":"@openclaw/imessage","version":"2026.5.28","description":"OpenClaw iMessage channel plugin using imsg on a signed-in Mac","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/imessage/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/imessage","channelIds":["imessage"]},{"id":"inworld","name":"Inworld","version":"2026.5.28","description":"Inworld streaming text-to-speech (MP3, OGG_OPUS, PCM telephony).","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/inworld/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/inworld","speechProviderIds":["inworld"]},{"id":"irc","name":"@openclaw/irc","version":"2026.5.28","description":"OpenClaw IRC channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/irc/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/irc","channelIds":["irc"]},{"id":"kilocode","name":"@openclaw/kilocode-provider","version":"2026.5.28","description":"OpenClaw Kilo Gateway provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kilocode/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kilocode","providerIds":["kilocode"]},{"id":"kimi","name":"@openclaw/kimi-provider","version":"2026.5.28","description":"OpenClaw Kimi provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kimi-coding/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/kimi-coding","providerIds":["kimi","kimi-coding"]},{"id":"litellm","name":"@openclaw/litellm-provider","version":"2026.5.28","description":"OpenClaw LiteLLM provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/litellm/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/litellm","providerIds":["litellm"],"imageGenerationProviderIds":["litellm"]},{"id":"llm-task","name":"LLM Task","version":"2026.5.21","description":"Generic JSON-only LLM tool for structured tasks callable from workflows.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/llm-task/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/llm-task"},{"id":"lmstudio","name":"@openclaw/lmstudio-provider","version":"2026.5.28","description":"OpenClaw LM Studio provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/lmstudio/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/lmstudio","providerIds":["lmstudio"],"memoryEmbeddingProviderIds":["lmstudio"]},{"id":"mattermost","name":"@openclaw/mattermost","version":"2026.5.28","description":"OpenClaw Mattermost channel plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mattermost/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mattermost","channelIds":["mattermost"]},{"id":"memory-core","name":"Memory (Core)","version":"2026.5.28","description":"File-backed memory search tools and CLI","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"selected memory slot","status":"loaded","format":"openclaw","kind":"memory","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-core/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-core","toolNames":["memory_get","memory_search"],"memoryEmbeddingProviderIds":["local"]},{"id":"memory-wiki","name":"Memory Wiki","version":"2026.5.28","description":"Persistent wiki compiler and Obsidian-friendly knowledge vault for OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-wiki/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/memory-wiki"},{"id":"microsoft","name":"@openclaw/microsoft-speech","version":"2026.5.28","description":"OpenClaw Microsoft speech plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft","speechProviderIds":["microsoft"]},{"id":"microsoft-foundry","name":"@openclaw/microsoft-foundry","version":"2026.5.28","description":"OpenClaw Microsoft Foundry provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft-foundry/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/microsoft-foundry","providerIds":["microsoft-foundry"]},{"id":"migrate-claude","name":"Claude Migration","version":"2026.5.28","description":"Imports Claude Code and Claude Desktop instructions, MCP servers, skills, and safe configuration into OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-claude/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-claude"},{"id":"migrate-hermes","name":"Hermes Migration","version":"2026.5.28","description":"Imports Hermes configuration, memories, skills, and supported credentials into OpenClaw.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-hermes/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/migrate-hermes"},{"id":"minimax","name":"@openclaw/minimax-provider","version":"2026.5.28","description":"OpenClaw MiniMax provider and OAuth plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/minimax/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/minimax","providerIds":["minimax","minimax-portal"],"speechProviderIds":["minimax"],"mediaUnderstandingProviderIds":["minimax","minimax-portal"],"imageGenerationProviderIds":["minimax","minimax-portal"],"videoGenerationProviderIds":["minimax","minimax-portal"],"musicGenerationProviderIds":["minimax","minimax-portal"],"webSearchProviderIds":["minimax"]},{"id":"mistral","name":"@openclaw/mistral-provider","version":"2026.5.28","description":"OpenClaw Mistral provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mistral/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/mistral","providerIds":["mistral"],"realtimeTranscriptionProviderIds":["mistral"],"mediaUnderstandingProviderIds":["mistral"],"memoryEmbeddingProviderIds":["mistral"]},{"id":"moonshot","name":"@openclaw/moonshot-provider","version":"2026.5.28","description":"OpenClaw Moonshot provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/moonshot/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/moonshot","providerIds":["moonshot"],"mediaUnderstandingProviderIds":["moonshot"],"webSearchProviderIds":["kimi"]},{"id":"nvidia","name":"@openclaw/nvidia-provider","version":"2026.5.28","description":"OpenClaw NVIDIA provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/nvidia/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/nvidia","providerIds":["nvidia"]},{"id":"oc-path","name":"OC Path","version":"2026.5.28","description":"Adds the openclaw path CLI for oc:// workspace file addressing.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/oc-path/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/oc-path"},{"id":"ollama","name":"Ollama Provider","version":"2026.5.28","description":"Bundled Ollama provider plugin","origin":"bundled","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/ollama/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/ollama","providerIds":["ollama"],"mediaUnderstandingProviderIds":["ollama"],"webSearchProviderIds":["ollama"],"memoryEmbeddingProviderIds":["ollama"]},{"id":"open-prose","name":"OpenProse","version":"2026.5.28","description":"OpenProse VM skill pack with a /prose slash command.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/open-prose/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/open-prose"},{"id":"openai","name":"@openclaw/openai-provider","version":"2026.5.28","description":"OpenClaw OpenAI provider plugins","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openai/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openai","providerIds":["openai","openai-codex"],"speechProviderIds":["openai"],"realtimeTranscriptionProviderIds":["openai"],"realtimeVoiceProviderIds":["openai"],"mediaUnderstandingProviderIds":["openai","openai-codex"],"imageGenerationProviderIds":["openai"],"videoGenerationProviderIds":["openai"],"memoryEmbeddingProviderIds":["openai"]},{"id":"openclaw-weixin","name":"Weixin","version":"2.4.3","description":"Weixin channel (getUpdates long-poll + sendMessage)","origin":"global","enabled":true,"explicitlyEnabled":true,"activated":true,"activationSource":"explicit","activationReason":"enabled in config","status":"loaded","format":"openclaw","source":"/home/yangxuan/.openclaw/npm/node_modules/@tencent-weixin/openclaw-weixin/dist/index.js","rootDir":"/home/yangxuan/.openclaw/npm/node_modules/@tencent-weixin/openclaw-weixin","workspaceDir":"/home/yangxuan/.openclaw/workspace","channelIds":["openclaw-weixin"]},{"id":"opencode","name":"@openclaw/opencode-provider","version":"2026.5.28","description":"OpenClaw OpenCode Zen provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode","providerIds":["opencode"],"mediaUnderstandingProviderIds":["opencode"]},{"id":"opencode-go","name":"@openclaw/opencode-go-provider","version":"2026.5.28","description":"OpenClaw OpenCode Go provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode-go/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/opencode-go","providerIds":["opencode-go"],"mediaUnderstandingProviderIds":["opencode-go"]},{"id":"openrouter","name":"@openclaw/openrouter-provider","version":"2026.5.28","description":"OpenClaw OpenRouter provider plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openrouter/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/openrouter","providerIds":["openrouter"],"speechProviderIds":["openrouter"],"mediaUnderstandingProviderIds":["openrouter"],"imageGenerationProviderIds":["openrouter"],"videoGenerationProviderIds":["openrouter"],"musicGenerationProviderIds":["openrouter"]},{"id":"perplexity","name":"@openclaw/perplexity-plugin","version":"2026.5.28","description":"OpenClaw Perplexity plugin","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/perplexity/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/perplexity","webSearchProviderIds":["perplexity"]},{"id":"phone-control","name":"Phone Control","description":"Arm/disarm high-risk phone node commands (camera/screen/writes) with an optional auto-expiry.","origin":"bundled","enabled":false,"explicitlyEnabled":false,"activated":false,"activationSource":"disabled","activationReason":"not in allowlist","status":"disabled","error":"not in allowlist","format":"openclaw","source":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/phone-control/index.js","rootDir":"/home/yangxuan/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/dist/extensions/phone-control"},{"truncated":true,"reason":"trajectory-array-size-limit","originalLength":94,"limitItems":64}]},"skills":{"snapshotVersion":1780301597209,"entries":[{"id":"canvas","name":"canvas","description":"Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"clawhub","name":"clawhub","description":"Search, install, update, sync, or publish agent skills with the ClawHub CLI and registry.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"Code","name":"Code","description":"Coding workflow with planning, implementation, verification, and testing for clean software development.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/openclaw-code/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"database-admin","name":"database-admin","description":"Comprehensive database administration, schema management, data operations, and optimization. Use when Codex needs to: (1) Create or modify database tables with proper indexing, (2) Perform bulk data insertions with type safety and constraint handling, (3) Execute complex queries with JOINs, aggregations, and subqueries, (4) Optimize query performance through indexing and execution plan analysis, (5) Manage database backups, restores, and migrations, (6) Handle special data types (BIGINT, UUID, JSONB, enums), (7) Implement transactional safety with ACID compliance, or (8) Debug and resolve database errors including constraint violations, type mismatches, and foreign key issues","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/database-admin/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"database-schema-designer","name":"database-schema-designer","description":"Database Schema Designer","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/database-schema-designer/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"db-query","name":"db-query","description":"Query project databases with automatic SSH tunnel management. Use when you need to execute SQL queries against configured databases, especially those accessible only via SSH tunnels. Automatically manages SSH connection lifecycle (establishes tunnel before query, closes after). Supports multiple databases distinguished by description/name from config file.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/db-query/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-query","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-query","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/db-query/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"db-schema","name":"db-schema","description":"Generate database schemas, migrations, and ERD diagrams from plain English descriptions — supports PostgreSQL, MySQL, SQLite, and MongoDB with proper indexes and constraints.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/db-schema-gen/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"deep-research-pro","name":"deep-research-pro","description":"Multi-source deep research agent. Searches the web, synthesizes findings, and delivers cited reports. No API keys required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/deep-research-pro/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"diagram-maker","name":"diagram-maker","description":"Create SVG/HTML or Excalidraw diagrams for concepts, architecture, flows, and whiteboards.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"dingtalk-channel-rules","name":"dingtalk-channel-rules","description":"钉钉会话输出规则。在钉钉会话中始终生效。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"dingtalk-troubleshoot","name":"dingtalk-troubleshoot","description":"钉钉连接器问题排查。包含 dws CLI 常见错误处理、授权问题排查和连接故障诊断。\n当 dws 命令执行失败、授权异常、连接中断时自动激活。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"docker-essentials","name":"docker-essentials","description":"Essential Docker commands and workflows for container management, image operations, and debugging.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/docker-essentials/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"dws","name":"dws","description":"管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/开放平台文档/钉钉文档/钉钉云盘/AI听记/邮箱/在线电子表格/知识库等)。当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报(钉钉日志模版)、读写钉钉文档、上传下载云盘文件、查询听记纪要、收发邮件、读写在线电子表格(axls)、管理钉钉知识库时使用。","filePath":"~/.agents/skills/dws/SKILL.md","baseDir":"~/.agents/skills/dws","source":"agents-skills-personal","sourceInfo":{"baseDir":"~/.agents/skills/dws","origin":"top-level","path":"~/.agents/skills/dws/SKILL.md","scope":"project","source":"agents-skills-personal"},"disableModelInvocation":false,"available":true},{"id":"dws-cli","name":"dws-cli","description":"在钉钉会话中通过 dws CLI 管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/工作台等)。\n当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报时使用。","filePath":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli","source":"openclaw-extra","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli","origin":"top-level","path":"$OPENCLAW_STATE_DIR/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md","scope":"project","source":"openclaw-extra"},"disableModelInvocation":false,"available":true},{"id":"gh-issues","name":"gh-issues","description":"Fetch GitHub issues, select candidates, spawn background fix agents, open PRs, and optionally process PR review comments.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"github","name":"github","description":"GitHub CLI for issues, PRs, CI/check logs, comments, reviews, releases, repos, and gh api queries.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"healthcheck","name":"healthcheck","description":"Audit/harden OpenClaw hosts: SSH, firewall, updates, exposure, backups, disk encryption, gateway security.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"humanizer","name":"humanizer","description":"Remove signs of AI-generated writing from text. Use when editing or reviewing\ntext to make it sound more natural and human-written. Based on Wikipedia's\ncomprehensive \"Signs of AI writing\" guide. Detects and fixes patterns including:\ninflated symbolism, promotional language, superficial -ing analyses, vague\nattributions, em dash overuse, rule of three, AI vocabulary words, negative\nparallelisms, and excessive conjunctive phrases.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/humanizer/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"imap-smtp-email","name":"imap-smtp-email","description":"Read and send email via IMAP/SMTP. Check for new/unread messages, fetch content, search mailboxes, mark as read/unread, and send emails with attachments. Supports multiple accounts. Works with any IMAP/SMTP server including Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, and vip.188.com.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/imap-smtp-email/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"mcporter","name":"mcporter","description":"Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/mcporter/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"meme-maker","name":"meme-maker","description":"Search meme templates, suggest formats, and generate local or hosted image memes.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"multi-search-engine","name":"multi-search-engine","description":"Multi search engine integration with 17 engines (8 CN + 9 Global). Supports advanced search operators, time filters, site search, privacy engines, and WolframAlpha knowledge queries. No API keys required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/multi-search-engine/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"MySQL","name":"MySQL","description":"Write correct MySQL queries with proper character sets, indexing, transactions, and production patterns.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/MySQL/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"news-summary","name":"news-summary","description":"This skill should be used when the user asks for news updates, daily briefings, or what's happening in the world. Fetches news from trusted international RSS feeds and can create voice summaries.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/news-summary/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"node-connect","name":"node-connect","description":"Diagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"node-inspect-debugger","name":"node-inspect-debugger","description":"Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"obsidian-official-cli","name":"obsidian-official-cli","description":"Work with Obsidian vaults using the official Obsidian CLI (v1.12+). Open, search, create, move, and manage notes from the terminal. Use when working with Obsidian vaults for note management, file operations, searching content, managing tasks, properties, links, plugins, themes, sync operations, or any command-line interaction with Obsidian.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/obsidian-official-cli/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"opencode-controller","name":"opencode-controller","description":"Control and operate Opencode via slash commands. Use this skill to manage sessions, select models, switch agents (plan/build), and coordinate coding through Opencode.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/opencode-controller/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"openspec","name":"openspec","description":"Spec-driven development with OpenSpec CLI. Use when building features, migrations, refactors, or any structured development work. Manages proposal → specs → design → tasks → implementation workflows. Supports custom schemas (TDD, rapid, etc.). Trigger on requests involving feature planning, spec writing, change management, or when /opsx commands are mentioned.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/openspec/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openspec","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/openspec","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/openspec/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"python-debugpy","name":"python-debugpy","description":"Debug Python with pdb, breakpoint(), post-mortem inspection, and debugpy remote attach.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"qiushi-openclaw-skills","name":"qiushi-openclaw-skills","description":"求是 OpenClaw Skills 是基于毛泽东思想方法论的 AI Agent 技能集合,按照 OpenClaw 技能格式进行改造,旨在为 AI 提供系统化的思考和行动框架。","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/qiushi-openclaw-skill/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"rss-ai-reader","name":"rss-ai-reader","description":"📰 RSS AI 阅读器 — 自动抓取订阅、LLM生成摘要、多渠道推送!\n支持 Claude/OpenAI 生成中文摘要,推送到飞书/Telegram/Email。\n触发条件: 用户要求订阅RSS、监控博客、抓取新闻、生成摘要、设置定时抓取、\n\"帮我订阅\"、\"监控这个网站\"、\"每天推送新闻\"、RSS/Atom feed 相关。","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/rss-ai-reader/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"skill-creator","name":"skill-creator","description":"Create, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"spike","name":"spike","description":"Run throwaway prototypes to validate feasibility, compare approaches, and report a verdict.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"sql-toolkit","name":"sql-toolkit","description":"Query, design, migrate, and optimize SQL databases. Use when working with SQLite, PostgreSQL, or MySQL — schema design, writing queries, creating migrations, indexing, backup/restore, and debugging slow queries. No ORMs required.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/sql-toolkit/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"taskflow","name":"taskflow","description":"Coordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"taskflow-inbox-triage","name":"taskflow-inbox-triage","description":"Example TaskFlow pattern for inbox triage, intent routing, waiting on replies, and later summaries.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"tmux","name":"tmux","description":"Control tmux sessions/panes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","filePath":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md","baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux","source":"openclaw-bundled","sourceInfo":{"baseDir":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux","origin":"top-level","path":"~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md","scope":"project","source":"openclaw-bundled"},"disableModelInvocation":false,"available":true},{"id":"using-superpowers","name":"using-superpowers","description":"Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/using-superpowers/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"video-frames","name":"video-frames","description":"Extract frames or short clips from videos using ffmpeg.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/video-frames/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"weather","name":"weather","description":"Get current weather and forecasts (no API key required).","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/weather/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/weather","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/weather","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/weather/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true},{"id":"web-search","name":"web-search","description":"This skill should be used when users need to search the web for information, find current content, look up news articles, search for images, or find videos. It uses a self-hosted SearXNG instance to return results in clean, formatted output (text, markdown, or JSON). Use for research, fact-checking, finding recent information, or gathering web resources.","filePath":"$OPENCLAW_STATE_DIR/workspace/skills/web-search/SKILL.md","baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/web-search","source":"openclaw-workspace","sourceInfo":{"baseDir":"$OPENCLAW_STATE_DIR/workspace/skills/web-search","origin":"top-level","path":"$OPENCLAW_STATE_DIR/workspace/skills/web-search/SKILL.md","scope":"project","source":"openclaw-workspace"},"disableModelInvocation":false,"available":true}]},"prompting":{"skillsPrompt":"\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n<available_skills>\n <skill>\n <name>canvas</name>\n <description>Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/canvas/SKILL.md</location>\n </skill>\n <skill>\n <name>clawhub</name>\n <description>Search, install, update, sync, or publish agent skills with the ClawHub CLI and registry.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/clawhub/SKILL.md</location>\n </skill>\n <skill>\n <name>Code</name>\n <description>Coding workflow with planning, implementation, verification, and testing for clean software development.</description>\n <location>~/.openclaw/workspace/skills/openclaw-code/SKILL.md</location>\n </skill>\n <skill>\n <name>database-admin</name>\n <description>Comprehensive database administration, schema management, data operations, and optimization. Use when Codex needs to: (1) Create or modify database tables with proper indexing, (2) Perform bulk data insertions with type safety and constraint handling, (3) Execute complex queries with JOINs, aggregations, and subqueries, (4) Optimize query performance through indexing and execution plan analysis, (5) Manage database backups, restores, and migrations, (6) Handle special data types (BIGINT, UUID, JSONB, enums), (7) Implement transactional safety with ACID compliance, or (8) Debug and resolve database errors including constraint violations, type mismatches, and foreign key issues</description>\n <location>~/.openclaw/workspace/skills/database-admin/SKILL.md</location>\n </skill>\n <skill>\n <name>database-schema-designer</name>\n <description>Database Schema Designer</description>\n <location>~/.openclaw/workspace/skills/database-schema-designer/SKILL.md</location>\n </skill>\n <skill>\n <name>db-query</name>\n <description>Query project databases with automatic SSH tunnel management. Use when you need to execute SQL queries against configured databases, especially those accessible only via SSH tunnels. Automatically manages SSH connection lifecycle (establishes tunnel before query, closes after). Supports multiple databases distinguished by description/name from config file.</description>\n <location>~/.openclaw/workspace/skills/db-query/SKILL.md</location>\n </skill>\n <skill>\n <name>db-schema</name>\n <description>Generate database schemas, migrations, and ERD diagrams from plain English descriptions — supports PostgreSQL, MySQL, SQLite, and MongoDB with proper indexes and constraints.</description>\n <location>~/.openclaw/workspace/skills/db-schema-gen/SKILL.md</location>\n </skill>\n <skill>\n <name>deep-research-pro</name>\n <description>Multi-source deep research agent. Searches the web, synthesizes findings, and delivers cited reports. No API keys required.</description>\n <location>~/.openclaw/workspace/skills/deep-research-pro/SKILL.md</location>\n </skill>\n <skill>\n <name>diagram-maker</name>\n <description>Create SVG/HTML or Excalidraw diagrams for concepts, architecture, flows, and whiteboards.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/diagram-maker/SKILL.md</location>\n </skill>\n <skill>\n <name>dingtalk-channel-rules</name>\n <description>钉钉会话输出规则。在钉钉会话中始终生效。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-channel-rules/SKILL.md</location>\n </skill>\n <skill>\n <name>dingtalk-troubleshoot</name>\n <description>钉钉连接器问题排查。包含 dws CLI 常见错误处理、授权问题排查和连接故障诊断。\n当 dws 命令执行失败、授权异常、连接中断时自动激活。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dingtalk-troubleshoot/SKILL.md</location>\n </skill>\n <skill>\n <name>docker-essentials</name>\n <description>Essential Docker commands and workflows for container management, image operations, and debugging.</description>\n <location>~/.openclaw/workspace/skills/docker-essentials/SKILL.md</location>\n </skill>\n <skill>\n <name>dws</name>\n <description>管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/开放平台文档/钉钉文档/钉钉云盘/AI听记/邮箱/在线电子表格/知识库等)。当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报(钉钉日志模版)、读写钉钉文档、上传下载云盘文件、查询听记纪要、收发邮件、读写在线电子表格(axls)、管理钉钉知识库时使用。</description>\n <location>~/.agents/skills/dws/SKILL.md</location>\n </skill>\n <skill>\n <name>dws-cli</name>\n <description>在钉钉会话中通过 dws CLI 管理钉钉产品能力(AI表格/日历/通讯录/群聊与机器人/待办/审批/考勤/日志/DING消息/工作台等)。\n当用户需要操作表格数据、管理日程会议、查询通讯录、管理群聊、机器人发消息、创建待办、提交审批、查看考勤、提交日报周报时使用。</description>\n <location>~/.openclaw/npm/projects/dingtalk-real-ai-dingtalk-connector-aa54111b45/node_modules/@dingtalk-real-ai/dingtalk-connector/skills/dws-cli/SKILL.md</location>\n </skill>\n <skill>\n <name>gh-issues</name>\n <description>Fetch GitHub issues, select candidates, spawn background fix agents, open PRs, and optionally process PR review comments.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/gh-issues/SKILL.md</location>\n </skill>\n <skill>\n <name>github</name>\n <description>GitHub CLI for issues, PRs, CI/check logs, comments, reviews, releases, repos, and gh api queries.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/github/SKILL.md</location>\n </skill>\n <skill>\n <name>healthcheck</name>\n <description>Audit/harden OpenClaw hosts: SSH, firewall, updates, exposure, backups, disk encryption, gateway security.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/healthcheck/SKILL.md</location>\n </skill>\n <skill>\n <name>humanizer</name>\n <description>Remove signs of AI-generated writing from text. Use when editing or reviewing\ntext to make it sound more natural and human-written. Based on Wikipedia's\ncomprehensive "Signs of AI writing" guide. Detects and fixes patterns including:\ninflated symbolism, promotional language, superficial -ing analyses, vague\nattributions, em dash overuse, rule of three, AI vocabulary words, negative\nparallelisms, and excessive conjunctive phrases.</description>\n <location>~/.openclaw/workspace/skills/humanizer/SKILL.md</location>\n </skill>\n <skill>\n <name>imap-smtp-email</name>\n <description>Read and send email via IMAP/SMTP. Check for new/unread messages, fetch content, search mailboxes, mark as read/unread, and send emails with attachments. Supports multiple accounts. Works with any IMAP/SMTP server including Gmail, Outlook, 163.com, vip.163.com, 126.com, vip.126.com, 188.com, and vip.188.com.</description>\n <location>~/.openclaw/workspace/skills/imap-smtp-email/SKILL.md</location>\n </skill>\n <skill>\n <name>mcporter</name>\n <description>Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.</description>\n <location>~/.openclaw/workspace/skills/mcporter/SKILL.md</location>\n </skill>\n <skill>\n <name>meme-maker</name>\n <description>Search meme templates, suggest formats, and generate local or hosted image memes.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/meme-maker/SKILL.md</location>\n </skill>\n <skill>\n <name>multi-search-engine</name>\n <description>Multi search engine integration with 17 engines (8 CN + 9 Global). Supports advanced search operators, time filters, site search, privacy engines, and WolframAlpha knowledge queries. No API keys required.</description>\n <location>~/.openclaw/workspace/skills/multi-search-engine/SKILL.md</location>\n </skill>\n <skill>\n <name>MySQL</name>\n <description>Write correct MySQL queries with proper character sets, indexing, transactions, and production patterns.</description>\n <location>~/.openclaw/workspace/skills/MySQL/SKILL.md</location>\n </skill>\n <skill>\n <name>news-summary</name>\n <description>This skill should be used when the user asks for news updates, daily briefings, or what's happening in the world. Fetches news from trusted international RSS feeds and can create voice summaries.</description>\n <location>~/.openclaw/workspace/skills/news-summary/SKILL.md</location>\n </skill>\n <skill>\n <name>node-connect</name>\n <description>Diagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-connect/SKILL.md</location>\n </skill>\n <skill>\n <name>node-inspect-debugger</name>\n <description>Debug Node.js with node inspect, --inspect, breakpoints, CDP, heap, and CPU profiles.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/node-inspect-debugger/SKILL.md</location>\n </skill>\n <skill>\n <name>obsidian-official-cli</name>\n <description>Work with Obsidian vaults using the official Obsidian CLI (v1.12+). Open, search, create, move, and manage notes from the terminal. Use when working with Obsidian vaults for note management, file operations, searching content, managing tasks, properties, links, plugins, themes, sync operations, or any command-line interaction with Obsidian.</description>\n <location>~/.openclaw/workspace/skills/obsidian-official-cli/SKILL.md</location>\n </skill>\n <skill>\n <name>opencode-controller</name>\n <description>Control and operate Opencode via slash commands. Use this skill to manage sessions, select models, switch agents (plan/build), and coordinate coding through Opencode.</description>\n <location>~/.openclaw/workspace/skills/opencode-controller/SKILL.md</location>\n </skill>\n <skill>\n <name>openspec</name>\n <description>Spec-driven development with OpenSpec CLI. Use when building features, migrations, refactors, or any structured development work. Manages proposal → specs → design → tasks → implementation workflows. Supports custom schemas (TDD, rapid, etc.). Trigger on requests involving feature planning, spec writing, change management, or when /opsx commands are mentioned.</description>\n <location>~/.openclaw/workspace/skills/openspec/SKILL.md</location>\n </skill>\n <skill>\n <name>python-debugpy</name>\n <description>Debug Python with pdb, breakpoint(), post-mortem inspection, and debugpy remote attach.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/python-debugpy/SKILL.md</location>\n </skill>\n <skill>\n <name>qiushi-openclaw-skills</name>\n <description>求是 OpenClaw Skills 是基于毛泽东思想方法论的 AI Agent 技能集合,按照 OpenClaw 技能格式进行改造,旨在为 AI 提供系统化的思考和行动框架。</description>\n <location>~/.openclaw/workspace/skills/qiushi-openclaw-skill/SKILL.md</location>\n </skill>\n <skill>\n <name>rss-ai-reader</name>\n <description>📰 RSS AI 阅读器 — 自动抓取订阅、LLM生成摘要、多渠道推送!\n支持 Claude/OpenAI 生成中文摘要,推送到飞书/Telegram/Email。\n触发条件: 用户要求订阅RSS、监控博客、抓取新闻、生成摘要、设置定时抓取、\n"帮我订阅"、"监控这个网站"、"每天推送新闻"、RSS/Atom feed 相关。</description>\n <location>~/.openclaw/workspace/skills/rss-ai-reader/SKILL.md</location>\n </skill>\n <skill>\n <name>skill-creator</name>\n <description>Create, edit, audit, tidy, validate, or restructure AgentSkills and SKILL.md files.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/skill-creator/SKILL.md</location>\n </skill>\n <skill>\n <name>spike</name>\n <description>Run throwaway prototypes to validate feasibility, compare approaches, and report a verdict.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/spike/SKILL.md</location>\n </skill>\n <skill>\n <name>sql-toolkit</name>\n <description>Query, design, migrate, and optimize SQL databases. Use when working with SQLite, PostgreSQL, or MySQL — schema design, writing queries, creating migrations, indexing, backup/restore, and debugging slow queries. No ORMs required.</description>\n <location>~/.openclaw/workspace/skills/sql-toolkit/SKILL.md</location>\n </skill>\n <skill>\n <name>taskflow</name>\n <description>Coordinate multi-step detached tasks as one durable TaskFlow job with owner context, state, waits, and child tasks.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow/SKILL.md</location>\n </skill>\n <skill>\n <name>taskflow-inbox-triage</name>\n <description>Example TaskFlow pattern for inbox triage, intent routing, waiting on replies, and later summaries.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/taskflow-inbox-triage/SKILL.md</location>\n </skill>\n <skill>\n <name>tmux</name>\n <description>Control tmux sessions/panes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.</description>\n <location>~/.nvm/versions/node/v25.2.0/lib/node_modules/openclaw/skills/tmux/SKILL.md</location>\n </skill>\n <skill>\n <name>using-superpowers</name>\n <description>Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions</description>\n <location>~/.openclaw/workspace/skills/using-superpowers/SKILL.md</location>\n </skill>\n <skill>\n <name>video-frames</name>\n <description>Extract frames or short clips from videos using ffmpeg.</description>\n <location>~/.openclaw/workspace/skills/video-frames/SKILL.md</location>\n </skill>\n <skill>\n <name>weather</name>\n <description>Get current weather and forecasts (no API key required).</description>\n <location>~/.openclaw/workspace/skills/weather/SKILL.md</location>\n </skill>\n <skill>\n <name>web-search</name>\n <description>This skill should be used when users need to search the web for information, find current content, look up news articles, search for images, or find videos. It uses a self-hosted SearXNG instance to return results in clean, formatted output (text, markdown, or JSON). Use for research, fact-checking, finding recent information, or gathering web resources.</description>\n <location>~/.openclaw/workspace/skills/web-search/SKILL.md</location>\n </skill>\n</available_skills>","systemPromptReport":{"source":"run","generatedAt":1780301676196,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","provider":"deepseek","model":"deepseek-v4-flash","workspaceDir":"/home/yangxuan/.openclaw/workspace","bootstrapMaxChars":12000,"bootstrapTotalMaxChars":60000,"bootstrapTruncation":{"warningMode":"always","warningShown":false,"truncatedFiles":0,"nearLimitFiles":0,"totalNearLimit":false},"sandbox":{"mode":"off","sandboxed":false},"systemPrompt":{"chars":33596,"hash":"31a1bce1661ce2d34e5e7f875a5223f5d2c5ec4dbe7587c92890b8530f967398","projectContextChars":7760,"nonProjectContextChars":25836},"injectedWorkspaceFiles":[{"name":"AGENTS.md","path":"/home/yangxuan/.openclaw/workspace/AGENTS.md","missing":false,"rawChars":3727,"injectedChars":3727,"truncated":false},{"name":"SOUL.md","path":"/home/yangxuan/.openclaw/workspace/SOUL.md","missing":false,"rawChars":1193,"injectedChars":1193,"truncated":false},{"name":"TOOLS.md","path":"/home/yangxuan/.openclaw/workspace/TOOLS.md","missing":false,"rawChars":169,"injectedChars":169,"truncated":false},{"name":"IDENTITY.md","path":"/home/yangxuan/.openclaw/workspace/IDENTITY.md","missing":false,"rawChars":1129,"injectedChars":1129,"truncated":false},{"name":"USER.md","path":"/home/yangxuan/.openclaw/workspace/USER.md","missing":false,"rawChars":281,"injectedChars":281,"truncated":false},{"name":"HEARTBEAT.md","path":"/home/yangxuan/.openclaw/workspace/HEARTBEAT.md","missing":false,"rawChars":151,"injectedChars":151,"truncated":false},{"name":"MEMORY.md","path":"/home/yangxuan/.openclaw/workspace/MEMORY.md","missing":false,"rawChars":673,"injectedChars":673,"truncated":false}],"skills":{"promptChars":14755,"hash":"c80c28490f650af9463492f371112bcc1170605a1ed9fbd3a1a3751309190ba3","entries":[{"name":"canvas","blockChars":278},{"name":"clawhub","blockChars":268},{"name":"Code","blockChars":253},{"name":"database-admin","blockChars":844},{"name":"database-schema-designer","blockChars":204},{"name":"db-query","blockChars":506},{"name":"db-schema","blockChars":328},{"name":"deep-research-pro","blockChars":289},{"name":"diagram-maker","blockChars":281},{"name":"dingtalk-channel-rules","blockChars":296},{"name":"dingtalk-troubleshoot","blockChars":345},{"name":"docker-essentials","blockChars":264},{"name":"dws","blockChars":332},{"name":"dws-cli","blockChars":379},{"name":"gh-issues","blockChars":304},{"name":"github","blockChars":275},{"name":"healthcheck","blockChars":293},{"name":"humanizer","blockChars":598},{"name":"imap-smtp-email","blockChars":471},{"name":"mcporter","blockChars":312},{"name":"meme-maker","blockChars":266},{"name":"multi-search-engine","blockChars":374},{"name":"MySQL","blockChars":246},{"name":"news-summary","blockChars":356},{"name":"node-connect","blockChars":296},{"name":"node-inspect-debugger","blockChars":292},{"name":"obsidian-official-cli","blockChars":516},{"name":"opencode-controller","blockChars":336},{"name":"openspec","blockChars":510},{"name":"python-debugpy","blockChars":280},{"name":"qiushi-openclaw-skills","blockChars":263},{"name":"rss-ai-reader","blockChars":353},{"name":"skill-creator","blockChars":274},{"name":"spike","blockChars":266},{"name":"sql-toolkit","blockChars":383},{"name":"taskflow","blockChars":296},{"name":"taskflow-inbox-triage","blockChars":306},{"name":"tmux","blockChars":284},{"name":"using-superpowers","blockChars":325},{"name":"video-frames","blockChars":211},{"name":"weather","blockChars":202},{"name":"web-search","blockChars":508}]},"tools":{"listChars":0,"schemaChars":14296,"entries":[{"name":"read","summaryChars":298,"summaryHash":"f8a1d7cf1ecfe02b1b5865c93387e6a5891e5079117b4fe18614b6f912521727","schemaChars":304,"schemaHash":"134f19bcabe3e29d63c5cebb38f1d2556759fd08adad6bc90a4b4d3cd1fb8441","propertiesCount":3},{"name":"edit","summaryChars":326,"summaryHash":"c498a85576e187d069e8e8ea4f70f81bddd57829600d385ef61c4359fd634c9e","schemaChars":834,"schemaHash":"457e8bb9f800b21be76c4fd8c0e3078bf07ee9bf93ac82f39944c171bd8f6d84","propertiesCount":2},{"name":"write","summaryChars":127,"summaryHash":"cdb1c46027b22d1f1b923b47bfe297821d9fe589a9f9d92994961948060a4d89","schemaChars":225,"schemaHash":"e98a2484f667cf7c22d76ca103bf2022bf9113dc63fe38b899e71c328cb1e833","propertiesCount":2},{"name":"exec","summaryChars":539,"summaryHash":"4825198988fbfa8ebf5c2a8fbe3946da0be639b1e3b737ceaa4364195bba3f04","schemaChars":1187,"schemaHash":"0c03eeccccb7b7e97234d2c8245c6060e2b292588f02455eae20c60b61bb8bb8","propertiesCount":12},{"name":"process","summaryChars":456,"summaryHash":"55297e65d460e0e1e06e7fad4cedb75ffda8fac9fa8b10aa06d6cead3c5a76ea","schemaChars":1074,"schemaHash":"a2d30a25569f409d7e8539844c89a088044535388b24031d014577b96ed27c5c","propertiesCount":12},{"name":"cron","summaryChars":3610,"summaryHash":"262e6a7b421538d13ca6d79fc14616de3ea0c24fde8b050d6fa1652fe991e5c5","schemaChars":7299,"schemaHash":"1eaad399158d457d3bbd1d8f58723148c03500c5fc0f7af8e4adb118d3a928c0","propertiesCount":14},{"name":"update_plan","summaryChars":163,"summaryHash":"ea18cc44224e849c68cdf0a4839c295c1b20daf2699e2fc2be4c4e1552327455","schemaChars":489,"schemaHash":"50cb08b8a29e72637eb6720e6f5f3786783824537574f05ee9ae7a5f4ecacc4b","propertiesCount":2},{"name":"sessions_list","summaryChars":135,"summaryHash":"c7e411ae02e3adff5504aaee48f02d262a8abb9152558a3172aae289e3b05faf","schemaChars":435,"schemaHash":"c29c6b82c36a2d95a88c8944f129929b2621ee2af6d17b2ab101d4d7e9633d89","propertiesCount":9},{"name":"sessions_history","summaryChars":117,"summaryHash":"f5d45b76f11a8ac63cc45d456fb6f675f0b1a2e191feb9671924cb5830058f03","schemaChars":162,"schemaHash":"ac33b8af2252262afe479236046f5a04bc018f1fcf24d1a8bf32743f0e867598","propertiesCount":3},{"name":"sessions_send","summaryChars":224,"summaryHash":"56fd935fc97400f8c60b16ae58268660a2d84d8014a60abed515576c45a6f307","schemaChars":275,"schemaHash":"f1fbaa412fe6b6aee102234c87c5aa140f39c9086f9bae6e1e9691309a602ffb","propertiesCount":5},{"name":"sessions_spawn","summaryChars":332,"summaryHash":"5ced554d0c09b9c71fa003139eca7871bbfdc0917a323fc17af2a9faec46c5b7","schemaChars":1250,"schemaHash":"2d1670783c8e0c6cae4a1d0a2bdcc059520837661a88702e827905e742a194c9","propertiesCount":17},{"name":"sessions_yield","summaryChars":79,"summaryHash":"f3782fc41c1522657e1d3494f486a2df998fed38a6b89dcf7f6934fb41424320","schemaChars":60,"schemaHash":"b1c4c753820bc3096d85ef7a266a14c9fbe12450536db58076b75bb61d14dbbb","propertiesCount":1},{"name":"subagents","summaryChars":132,"summaryHash":"1c2ffd38549c0444b118d43736fc4b875ea1aaabc446bbf8bc1fc4ee9180cca4","schemaChars":122,"schemaHash":"c4a241d2c3d46ba7985abfce4d3fcd63298ce81f89d49183c8f3d584c48d0c33","propertiesCount":2},{"name":"session_status","summaryChars":278,"summaryHash":"71177e543dc6235bad4b1a26761995681dcec27ab58dcb4f4f8a7fc9a7b2b5aa","schemaChars":89,"schemaHash":"d2995f3d69d126e98ac93eec3c2a9fe5556925bd7979a8e4b6b5a2bf62d329dd","propertiesCount":2},{"name":"memory_search","summaryChars":605,"summaryHash":"0f918d28864d3682ae77731f149273997c84773592a466b18c7cd0121b599a05","schemaChars":250,"schemaHash":"088cd2a3d3a47b251429ff7c56844cdedd1c45c3af0fa8bfaf7aa795766976bf","propertiesCount":4},{"name":"memory_get","summaryChars":239,"summaryHash":"bff1141a3da31a345c550337417efc9ace4da2909004606c727c59ca1a294495","schemaChars":241,"schemaHash":"78f5d58460a82f9104deebad2f1873a8cde05d1ce7328b3ba4da6e994653e70a","propertiesCount":4}]}}},"redaction":{"config":{"mode":"redactConfigObject","secretsMasked":true},"payloads":{"mode":"sanitizeDiagnosticPayload","credentialsRemoved":true,"imageDataRedacted":true},"harness":{"mode":"diagnostic-support-redaction","programArgumentsRedacted":true,"localPathsRedacted":true}},"metadata":{"sessionKey":"agent:main:main","agentId":"main","messageProvider":"webchat"}}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"context.compiled","ts":"2026-06-01T08:14:36.213Z","seq":3,"sourceSeq":10,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"systemPrompt":{"truncated":true,"reason":"trajectory-field-size-limit","originalChars":33596,"limitChars":32768},"prompt":"[Mon 2026-06-01 16:14 GMT+8] 刚接手的老项目 优化需求\n\"【G5】【维云智造-机械行业】【威玛斯】【库存管理】物料转换\n新增/编辑页面:1.转换前的物料增加“单价”“金额”字段,取该批物料采购时的无税单价和无税金额;转换前的合计金额取此金额的合计值;2.转换后的物料自动带出默认工厂和仓库,数据取自主数据-物料信息中默认的仓库。\n详情:转换前的物料增加“单价”“金额”字段\n\"\n物料转换功能已存在","messages":[{"role":"user","content":"创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","timestamp":1780301586494,"idempotencyKey":"1a816b82-81df-4f52-973d-ad83c4bebf6c:user"},{"role":"assistant","content":[{"type":"text","text":"好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:"},{"type":"toolCall","id":"call00A0oxTlAMYgYWRnOviKk87034","name":"exec","arguments":{"command":"ls ~/.openclaw/workspace/skills/"},"partialArgs":"{\"command\": \"ls ~/.openclaw/workspace/skills/\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":18214,"output":89,"cacheRead":0,"cacheWrite":0,"totalTokens":18303,"cost":{"input":0.018213999999999998,"output":0.000178,"cacheRead":0,"cacheWrite":0,"total":0.018392}},"stopReason":"toolUse","timestamp":1780301587022,"responseId":"fd743bba-bb3a-4d01-a073-7b7720ee1c67"},{"role":"toolResult","toolCallId":"call00A0oxTlAMYgYWRnOviKk87034","toolName":"exec","content":[{"type":"text","text":"MySQL\nObsidian\nblogwatcher\nbrowser\ndatabase-admin\ndatabase-schema-designer\ndb-query\ndb-schema-gen\ndeep-research-pro\ndocker-essentials\nhumanizer\nimap-smtp-email\nmcporter\nmulti-search-engine\nnews-summary\nobsidian\nobsidian-official-cli\nopenclaw-code\nopencode-controller\nopenspec\nqiushi-openclaw-skill\nrss-ai-reader\nsql-toolkit\nusing-superpowers\nvideo-frames\nweather\nweb-search"}],"isError":false,"timestamp":1780301588868},{"role":"assistant","content":[{"type":"toolCall","id":"call007XMRwq7o85F0QJJE5CFU2056","name":"exec","arguments":{"command":"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst"},"partialArgs":"{\"command\": \"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":257,"output":59,"cacheRead":18176,"cacheWrite":0,"totalTokens":18492,"cost":{"input":0.000257,"output":0.000118,"cacheRead":0,"cacheWrite":0,"total":0.000375}},"stopReason":"toolUse","timestamp":1780301588871,"responseId":"1413735d-56f0-4dca-aef2-44293b4085b8"},{"role":"toolResult","toolCallId":"call007XMRwq7o85F0QJJE5CFU2056","toolName":"exec","content":[{"type":"text","text":"(no output)"}],"isError":false,"timestamp":1780301590043},{"role":"assistant","content":[{"type":"toolCall","id":"call00225ww3C6dPbensrhCCBn1085","name":"write","arguments":{"path":"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md","content":"# 通用需求分析 Agent\n\n## 描述\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\n\n## 触发条件\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\n- 用户提出了一个功能想法,需要拆解技术方案\n- 用户需要前后端分工的技术文档\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}\n```\n\n### 交互逻辑\n[事件处理、表单校验、加载状态等]\n\n### API 调用\n[请求参数、响应处理、错误处理]\n\n## 五、后端规范\n\n### 接口定义\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| [API路径] | GET/POST/PUT/DELETE | | | |\n\n### 业务规则\n[关键业务校验逻辑]\n\n### 异常处理\n[错误码或异常场景]\n\n## 六、代码框架\n\n### 前端组件骨架\n```vue\n<template>\n <!-- 模板代码 -->\n</template>\n\n<script>\nexport default {\n // 组件代码\n}\n</script>\n```\n\n### 后端 Service 骨架\n```java/python/go\n// Service 层代码框架\n```\n\n## 七、注意事项\n- [性能/安全/兼容性等方面的提醒]\n\n## 约束与原则\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\n- **离线性优先**:产出物应详细到无需联网即可编码实现\n- **结构化输出**:严格按模板输出,不可随意删减章节\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\n"},"partialArgs":"{\"path\": \"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md\", \"content\": \"# 通用需求分析 Agent\\n\\n## 描述\\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\\n\\n## 触发条件\\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\\n- 用户提出了一个功能想法,需要拆解技术方案\\n- 用户需要前后端分工的技术文档\\n\\n## 工作流程(必须按顺序执行)\\n\\n### 第一步:需求理解与澄清\\n- 识别需求中的【实体】、【动作】、【约束】\\n- 标记模糊点,提出待澄清问题(不超过5个)\\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\\n\\n### 第二步:数据模型设计\\n- 列出涉及的数据实体和字段\\n- 标注新增字段 vs 现有字段\\n- 定义字段类型、长度、必填、默认值、关联关系\\n\\n### 第三步:前端规范输出\\n- 页面/组件结构\\n- 状态管理(data/computed/watch)\\n- 交互逻辑(事件处理、表单校验、错误提示)\\n- API调用(请求参数、响应处理、加载状态)\\n\\n### 第四步:后端规范输出\\n- 接口定义(路径、方法、请求/响应结构)\\n- 数据库操作(SQL或ORM代码)\\n- 业务规则校验\\n- 边界条件与异常处理\\n\\n### 第五步:代码框架生成\\n- 前端:组件骨架代码(可直接复制)\\n- 后端:Service/Controller骨架代码\\n\\n## 输出模板(必须严格遵守)\\n\\n# [需求名称] - 技术规范文档\\n\\n## 一、需求摘要\\n[2-3句话总结核心需求]\\n\\n## 二、待澄清问题(如有)\\n- [ ] 问题1\\n- [ ] 问题2\\n\\n## 三、数据模型\\n\\n### 涉及实体\\n| 实体名 | 操作类型 | 说明 |\\n|--------|----------|------|\\n| [实体] | 新增/修改/查询 | |\\n\\n### 字段变更\\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\\n|------|------|------|------|------|------|\\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\\n\\n## 四、前端规范\\n\\n### 页面/组件结构\\n[组件树或目录结构]\\n\\n### 状态定义\\n```javascript\\ndata() {\\n return {\\n // 定义所有响应式数据\\n }\\n}\\n```\\n\\n### 交互逻辑\\n[事件处理、表单校验、加载状态等]\\n\\n### API 调用\\n[请求参数、响应处理、错误处理]\\n\\n## 五、后端规范\\n\\n### 接口定义\\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\\n|------|------|------|----------|----------|\\n| [API路径] | GET/POST/PUT/DELETE | | | |\\n\\n### 业务规则\\n[关键业务校验逻辑]\\n\\n### 异常处理\\n[错误码或异常场景]\\n\\n## 六、代码框架\\n\\n### 前端组件骨架\\n```vue\\n<template>\\n <!-- 模板代码 -->\\n</template>\\n\\n<script>\\nexport default {\\n // 组件代码\\n}\\n</script>\\n```\\n\\n### 后端 Service 骨架\\n```java/python/go\\n// Service 层代码框架\\n```\\n\\n## 七、注意事项\\n- [性能/安全/兼容性等方面的提醒]\\n\\n## 约束与原则\\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\\n- **离线性优先**:产出物应详细到无需联网即可编码实现\\n- **结构化输出**:严格按模板输出,不可随意删减章节\\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\\n\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":74,"output":962,"cacheRead":18432,"cacheWrite":0,"totalTokens":19468,"cost":{"input":0.000074,"output":0.001924,"cacheRead":0,"cacheWrite":0,"total":0.0019979999999999998}},"stopReason":"toolUse","timestamp":1780301590044,"responseId":"7bfec30a-df97-4fc4-80c9-cf89739f20a0"},{"role":"toolResult","toolCallId":"call00225ww3C6dPbensrhCCBn1085","toolName":"write","content":[{"type":"text","text":"Successfully wrote 1721 bytes to ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"}],"isError":false,"timestamp":1780301596658},{"role":"assistant","content":[{"type":"text","text":"已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"totalTokens":19773,"cost":{"input":0.000051,"output":0.000532,"cacheRead":0,"cacheWrite":0,"total":0.0005830000000000001}},"stopReason":"stop","timestamp":1780301596661,"responseId":"9a9b9dd9-65c3-4868-ac75-874a7aed115f"}],"tools":[{"name":"cron","description":"Manage Gateway cron jobs and wake events: reminders, check-back-later, delayed follow-ups, recurring work. Do not emulate scheduling with exec sleep/process polling.\n\nMain cron => system events for heartbeat. Isolated cron => background task in `openclaw tasks`.\n\nACTIONS:\n- status: scheduler status\n- list: jobs; includeDisabled true includes disabled; agentId filter auto-filled from session\n- get: one job; needs jobId\n- add: create job; needs job object\n- update: patch job; needs jobId + patch\n- remove: delete job; needs jobId\n- run: trigger now; needs jobId\n- runs: run history; needs jobId\n- wake: send wake event; needs text, optional mode\n\nJOB SCHEMA (for add action):\n{\n \"name\": \"string\",\n \"schedule\": { ... }, // required\n \"payload\": { ... }, // required\n \"delivery\": { ... }, // optional announce for isolated/current/session, webhook for any target\n \"sessionTarget\": \"main\" | \"isolated\" | \"current\" | \"session:<id>\",\n \"enabled\": true | false // default true\n}\n\nSESSION TARGET OPTIONS:\n- \"main\": main session; requires payload.kind=\"systemEvent\"\n- \"isolated\": ephemeral isolated session; requires payload.kind=\"agentTurn\"\n- \"current\": bind current session at creation\n- \"session:<id>\": persistent named session\n\nDEFAULTS:\n- payload.kind=\"systemEvent\" → defaults to \"main\"\n- payload.kind=\"agentTurn\" → defaults to \"isolated\"\nCurrent binding needs sessionTarget=\"current\".\n\nSCHEDULE TYPES (schedule.kind):\n- \"at\": one-shot absolute time\n { \"kind\": \"at\", \"at\": \"<ISO-8601 timestamp>\" }\n- \"every\": recurring interval\n { \"kind\": \"every\", \"everyMs\": <ms>, \"anchorMs\": <optional-ms> }\n- \"cron\": expr in supplied timezone, or Gateway host local timezone when tz omitted\n { \"kind\": \"cron\", \"expr\": \"<cron-expression>\", \"tz\": \"<optional-IANA-timezone>\" }\n Write expr in local wall-clock time; do not convert the requested local time to UTC first.\n tz omitted => Gateway host local timezone, not UTC.\n Example 6pm Shanghai daily: { \"kind\": \"cron\", \"expr\": \"0 18 * * *\", \"tz\": \"Asia/Shanghai\" }\n\nFor \"at\", ISO timestamps without timezone are UTC.\n\nPAYLOAD TYPES (payload.kind):\n- \"systemEvent\": inject text as system event\n { \"kind\": \"systemEvent\", \"text\": \"<message>\" }\n- \"agentTurn\": run agent with prompt; isolated/current/session only\n { \"kind\": \"agentTurn\", \"message\": \"<prompt>\", \"model\": \"<optional>\", \"thinking\": \"<optional>\", \"timeoutSeconds\": <optional, 0=no timeout> }\n\nDELIVERY (top-level):\n { \"mode\": \"none|announce|webhook\", \"channel\": \"<optional>\", \"to\": \"<optional>\", \"threadId\": \"<optional>\", \"bestEffort\": <optional-bool> }\n - isolated agentTurn default when omitted: \"announce\"\n - announce: send to chat channel; isolated/current/session only; optional channel/to\n - threadId: chat thread/topic id\n - webhook: POST finished-run event to delivery.to URL\n - Specific chat/recipient: set announce delivery.channel/to; do not call messaging tools inside run.\n\nCRITICAL CONSTRAINTS:\n- sessionTarget=\"main\" REQUIRES payload.kind=\"systemEvent\"\n- sessionTarget=\"isolated\" | \"current\" | \"session:xxx\" REQUIRES payload.kind=\"agentTurn\"\n- Webhook: delivery.mode=\"webhook\" and delivery.to URL.\nDefault: prefer isolated agentTurn jobs unless the user explicitly wants current-session binding.\n\nRESTRICTED CRON RUNS:\n- Some isolated cron runs get narrow self-cleanup grant: status/list self-only, get/runs current job only, mutation only remove current job.\n\nWAKE MODES (for wake action):\n- \"next-heartbeat\" default: wake next heartbeat\n- \"now\": wake immediately\n\nUse jobId canonical; id accepted compat. contextMessages (0-10) adds previous messages as job context.","parameters":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"gatewayUrl":{"type":"string"},"timeoutMs":{"type":"integer","minimum":1},"includeDisabled":{"type":"boolean"},"job":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"additionalProperties":true},"jobId":{"type":"string"},"id":{"type":"string"},"patch":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"additionalProperties":true},"text":{"type":"string"},"mode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"runMode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"contextMessages":{"type":"integer","minimum":0,"maximum":10},"agentId":{"type":"string","description":"List filter: agent id"}},"additionalProperties":true}},{"name":"edit","description":"Edit a single file using exact text replacement. Every edits[].oldText must match a unique, non-overlapping region of the original file. If two changes affect the same block or nearby lines, merge them into one edit instead of emitting overlapping edits. Do not include large unchanged regions just to connect distant changes.","parameters":{"type":"object","required":["path","edits"],"properties":{"path":{"type":"string","description":"Path to the file to edit (relative or absolute)"},"edits":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"One or more targeted replacements. Each edit is matched against the original file, not incrementally. Do not include overlapping or nested edits. If two changes touch the same block or nearby lines, merge them into one edit instead."}},"additionalProperties":false}},{"name":"exec","description":"Execute shell commands with background continuation for work that starts now. Use yieldMs/background to continue later via process tool. For long-running work started now, rely on automatic completion wake when it is enabled and the command emits output or fails; otherwise use process to confirm completion. Use process whenever you need logs, status, input, or intervention. Do not use exec sleep or delay loops for reminders or deferred follow-ups; use cron instead. Use pty=true for TTY-required commands (terminal UIs, coding agents).","parameters":{"type":"object","required":["command"],"properties":{"command":{"type":"string","description":"Shell command to execute"},"workdir":{"type":"string","description":"Working directory (defaults to cwd)"},"env":{"type":"object","patternProperties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"yieldMs":{"type":"number","description":"Milliseconds to wait before backgrounding (default 10000)"},"background":{"type":"boolean","description":"Run in background immediately"},"timeout":{"type":"number","description":"Timeout in seconds (optional, kills process on expiry)"},"pty":{"type":"boolean","description":"Run in a pseudo-terminal (PTY) when available (TTY-required CLIs, coding agents)"},"elevated":{"type":"boolean","description":"Run on the host with elevated permissions (if allowed)"},"host":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Exec host/target (auto|sandbox|gateway|node)."},"security":{"type":"string","description":"Ignored for normal calls; exec security is set by tools.exec.security and host approvals."},"ask":{"type":"string","description":"Exec ask mode (off|on-miss|always)."},"node":{"type":"string","description":"Node id/name for host=node."}}}},{"name":"memory_get","description":"Safe exact excerpt read from MEMORY.md or memory/*.md. Defaults to a bounded excerpt when lines are omitted, includes truncation/continuation info when more content exists, and `corpus=wiki` reads from registered compiled-wiki supplements.","parameters":{"type":"object","properties":{"path":{"type":"string"},"from":{"type":"integer","minimum":1},"lines":{"type":"integer","minimum":1},"corpus":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"required":["path"],"additionalProperties":false}},{"name":"memory_search","description":"Mandatory recall step: semantically search MEMORY.md + memory/*.md (and optional session transcripts) before answering questions about prior work, decisions, dates, people, preferences, or todos. Optional `corpus=wiki` or `corpus=all` also searches registered compiled-wiki supplements. `corpus=memory` restricts hits to indexed memory files (excludes session transcript chunks from ranking). `corpus=sessions` restricts hits to indexed session transcripts (same visibility rules as session history tools). If response has disabled=true, memory retrieval is unavailable and should be surfaced to the user.","parameters":{"type":"object","properties":{"query":{"type":"string"},"maxResults":{"type":"integer","minimum":1},"minScore":{"type":"number"},"corpus":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}},"required":["query"],"additionalProperties":false}},{"name":"process","description":"Manage running exec sessions for commands already started: list, poll, log, write, send-keys, submit, paste, kill. Use poll/log when you need status, logs, quiet-success confirmation, or completion confirmation when automatic completion wake is unavailable. Use poll/log also for input-wait hints. Use write/send-keys/submit/paste/kill for input or intervention. Do not use process polling to emulate timers or reminders; use cron for scheduled follow-ups.","parameters":{"type":"object","required":["action"],"properties":{"action":{"type":"string","description":"Process action (list|poll|log|write|send-keys|submit|paste|kill|clear|remove)"},"sessionId":{"type":"string","description":"Session id for actions other than list"},"data":{"type":"string","description":"Data to write for write"},"keys":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Key tokens to send for send-keys"},"hex":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Hex bytes to send for send-keys"},"literal":{"type":"string","description":"Literal string for send-keys"},"text":{"type":"string","description":"Text to paste for paste"},"bracketed":{"type":"boolean","description":"Wrap paste in bracketed mode"},"eof":{"type":"boolean","description":"Close stdin after write"},"offset":{"type":"number","description":"Log offset"},"limit":{"type":"number","description":"Log length"},"timeout":{"type":"number","description":"For poll: wait up to this many milliseconds before returning; max 30000 ms, higher values are clamped to 30000","minimum":0}}}},{"name":"read","description":"Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to 2000 lines or 50KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.","parameters":{"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Path to the file to read (relative or absolute)"},"offset":{"type":"number","description":"Line number to start reading from (1-indexed)"},"limit":{"type":"number","description":"Maximum number of lines to read"}}}},{"name":"session_status","description":"Show /status-like card for current/visible session: model, usage, time, cost, tasks. Use `sessionKey=\"current\"` for current session; UI labels like `openclaw-tui` are not keys. `model` sets session override; `model=default` resets. Use for active model/session config questions.","parameters":{"type":"object","properties":{"sessionKey":{"type":"string"},"model":{"type":"string"}}}},{"name":"sessions_history","description":"Fetch sanitized history for visible session. Use before replying, debugging, resuming; supports limits/tool messages.","parameters":{"type":"object","required":["sessionKey"],"properties":{"sessionKey":{"type":"string"},"limit":{"type":"integer","minimum":1},"includeTools":{"type":"boolean"}}}},{"name":"sessions_list","description":"List visible sessions; filter by kind, label, agentId, search, activity. Use before sessions_history or sessions_send target selection.","parameters":{"type":"object","properties":{"kinds":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"limit":{"type":"integer","minimum":1},"activeMinutes":{"type":"integer","minimum":1},"messageLimit":{"type":"integer","minimum":0},"label":{"type":"string","minLength":1},"agentId":{"type":"string","minLength":1,"maxLength":64},"search":{"type":"string","minLength":1},"includeDerivedTitles":{"type":"boolean"},"includeLastMessage":{"type":"boolean"}}}},{"name":"sessions_send","description":"Send message to visible session by sessionKey/label, or configured agent by agentId. Thread-scoped chats rejected; target parent channel session. Creates missing configured-agent main session; waits for reply when available.","parameters":{"type":"object","required":["message"],"properties":{"sessionKey":{"type":"string"},"label":{"type":"string","minLength":1,"maxLength":512},"agentId":{"type":"string","minLength":1,"maxLength":64},"message":{"type":"string"},"timeoutSeconds":{"type":"integer","minimum":0}}}},{"name":"sessions_spawn","description":"Spawn clean child session; default `runtime=\"subagent\"`. `mode=\"run\"` one-shot background work. Subagents inherit parent workspace. Native subagents get task in first visible `[Subagent Task]` message. Native only: `context=\"fork\"` only when child needs current transcript; else omit or `isolated`. Use for fresh child-session work.","parameters":{"type":"object","required":["task"],"properties":{"task":{"type":"string"},"taskName":{"type":"string","description":"Stable alias for later targeting; lowercase letters/digits/underscores/hyphens, starts letter."},"label":{"type":"string"},"runtime":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"agentId":{"type":"string"},"model":{"type":"string"},"thinking":{"type":"string"},"cwd":{"type":"string"},"runTimeoutSeconds":{"type":"integer","minimum":0},"timeoutSeconds":{"type":"integer","minimum":0},"mode":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"cleanup":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"sandbox":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"context":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"description":"Native context. Omit/\"isolated\" for clean child; \"fork\" only when child needs requester transcript."},"lightContext":{"type":"boolean","description":"Light bootstrap context; runtime=\"subagent\" only."},"attachments":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"maxItems":50},"attachAs":{"type":"object","properties":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}}}}},{"name":"sessions_yield","description":"End current turn. Use after spawning subagents; results arrive as next message.","parameters":{"type":"object","properties":{"message":{"type":"string"}}}},{"name":"subagents","description":"List active and recent subagents for the requester session. If sessions_yield exists, use it for completion; do not poll wait loops.","parameters":{"type":"object","properties":{"action":{"type":"string","enum":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6}},"recentMinutes":{"type":"integer","minimum":1}}}},{"name":"update_plan","description":"Update current run plan. Use for non-trivial multi-step work; keep plan current while executing. Short steps; max one `in_progress`; skip for simple one-step work.","parameters":{"type":"object","required":["plan"],"properties":{"explanation":{"type":"string","description":"Short note: what changed."},"plan":{"type":"array","items":{"truncated":true,"reason":"trajectory-depth-limit","limitDepth":6},"minItems":1,"description":"Ordered steps; max one in_progress."}}}},{"name":"write","description":"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.","parameters":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"Path to the file to write (relative or absolute)"},"content":{"type":"string","description":"Content to write to the file"}}}}],"imagesCount":0,"streamStrategy":"boundary-aware:openai-completions","transport":"auto","transcriptLeafId":"8d82e932"}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"prompt.submitted","ts":"2026-06-01T08:14:36.215Z","seq":4,"sourceSeq":11,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"prompt":"[Mon 2026-06-01 16:14 GMT+8] 刚接手的老项目 优化需求\n\"【G5】【维云智造-机械行业】【威玛斯】【库存管理】物料转换\n新增/编辑页面:1.转换前的物料增加“单价”“金额”字段,取该批物料采购时的无税单价和无税金额;转换前的合计金额取此金额的合计值;2.转换后的物料自动带出默认工厂和仓库,数据取自主数据-物料信息中默认的仓库。\n详情:转换前的物料增加“单价”“金额”字段\n\"\n物料转换功能已存在","systemPrompt":{"truncated":true,"reason":"trajectory-field-size-limit","originalChars":33596,"limitChars":32768},"messages":[{"role":"user","content":"创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","timestamp":1780301586494,"idempotencyKey":"1a816b82-81df-4f52-973d-ad83c4bebf6c:user"},{"role":"assistant","content":[{"type":"text","text":"好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:"},{"type":"toolCall","id":"call00A0oxTlAMYgYWRnOviKk87034","name":"exec","arguments":{"command":"ls ~/.openclaw/workspace/skills/"},"partialArgs":"{\"command\": \"ls ~/.openclaw/workspace/skills/\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":18214,"output":89,"cacheRead":0,"cacheWrite":0,"totalTokens":18303,"cost":{"input":0.018213999999999998,"output":0.000178,"cacheRead":0,"cacheWrite":0,"total":0.018392}},"stopReason":"toolUse","timestamp":1780301587022,"responseId":"fd743bba-bb3a-4d01-a073-7b7720ee1c67"},{"role":"toolResult","toolCallId":"call00A0oxTlAMYgYWRnOviKk87034","toolName":"exec","content":[{"type":"text","text":"MySQL\nObsidian\nblogwatcher\nbrowser\ndatabase-admin\ndatabase-schema-designer\ndb-query\ndb-schema-gen\ndeep-research-pro\ndocker-essentials\nhumanizer\nimap-smtp-email\nmcporter\nmulti-search-engine\nnews-summary\nobsidian\nobsidian-official-cli\nopenclaw-code\nopencode-controller\nopenspec\nqiushi-openclaw-skill\nrss-ai-reader\nsql-toolkit\nusing-superpowers\nvideo-frames\nweather\nweb-search"}],"isError":false,"timestamp":1780301588868},{"role":"assistant","content":[{"type":"toolCall","id":"call007XMRwq7o85F0QJJE5CFU2056","name":"exec","arguments":{"command":"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst"},"partialArgs":"{\"command\": \"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":257,"output":59,"cacheRead":18176,"cacheWrite":0,"totalTokens":18492,"cost":{"input":0.000257,"output":0.000118,"cacheRead":0,"cacheWrite":0,"total":0.000375}},"stopReason":"toolUse","timestamp":1780301588871,"responseId":"1413735d-56f0-4dca-aef2-44293b4085b8"},{"role":"toolResult","toolCallId":"call007XMRwq7o85F0QJJE5CFU2056","toolName":"exec","content":[{"type":"text","text":"(no output)"}],"isError":false,"timestamp":1780301590043},{"role":"assistant","content":[{"type":"toolCall","id":"call00225ww3C6dPbensrhCCBn1085","name":"write","arguments":{"path":"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md","content":"# 通用需求分析 Agent\n\n## 描述\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\n\n## 触发条件\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\n- 用户提出了一个功能想法,需要拆解技术方案\n- 用户需要前后端分工的技术文档\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}\n```\n\n### 交互逻辑\n[事件处理、表单校验、加载状态等]\n\n### API 调用\n[请求参数、响应处理、错误处理]\n\n## 五、后端规范\n\n### 接口定义\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| [API路径] | GET/POST/PUT/DELETE | | | |\n\n### 业务规则\n[关键业务校验逻辑]\n\n### 异常处理\n[错误码或异常场景]\n\n## 六、代码框架\n\n### 前端组件骨架\n```vue\n<template>\n <!-- 模板代码 -->\n</template>\n\n<script>\nexport default {\n // 组件代码\n}\n</script>\n```\n\n### 后端 Service 骨架\n```java/python/go\n// Service 层代码框架\n```\n\n## 七、注意事项\n- [性能/安全/兼容性等方面的提醒]\n\n## 约束与原则\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\n- **离线性优先**:产出物应详细到无需联网即可编码实现\n- **结构化输出**:严格按模板输出,不可随意删减章节\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\n"},"partialArgs":"{\"path\": \"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md\", \"content\": \"# 通用需求分析 Agent\\n\\n## 描述\\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\\n\\n## 触发条件\\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\\n- 用户提出了一个功能想法,需要拆解技术方案\\n- 用户需要前后端分工的技术文档\\n\\n## 工作流程(必须按顺序执行)\\n\\n### 第一步:需求理解与澄清\\n- 识别需求中的【实体】、【动作】、【约束】\\n- 标记模糊点,提出待澄清问题(不超过5个)\\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\\n\\n### 第二步:数据模型设计\\n- 列出涉及的数据实体和字段\\n- 标注新增字段 vs 现有字段\\n- 定义字段类型、长度、必填、默认值、关联关系\\n\\n### 第三步:前端规范输出\\n- 页面/组件结构\\n- 状态管理(data/computed/watch)\\n- 交互逻辑(事件处理、表单校验、错误提示)\\n- API调用(请求参数、响应处理、加载状态)\\n\\n### 第四步:后端规范输出\\n- 接口定义(路径、方法、请求/响应结构)\\n- 数据库操作(SQL或ORM代码)\\n- 业务规则校验\\n- 边界条件与异常处理\\n\\n### 第五步:代码框架生成\\n- 前端:组件骨架代码(可直接复制)\\n- 后端:Service/Controller骨架代码\\n\\n## 输出模板(必须严格遵守)\\n\\n# [需求名称] - 技术规范文档\\n\\n## 一、需求摘要\\n[2-3句话总结核心需求]\\n\\n## 二、待澄清问题(如有)\\n- [ ] 问题1\\n- [ ] 问题2\\n\\n## 三、数据模型\\n\\n### 涉及实体\\n| 实体名 | 操作类型 | 说明 |\\n|--------|----------|------|\\n| [实体] | 新增/修改/查询 | |\\n\\n### 字段变更\\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\\n|------|------|------|------|------|------|\\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\\n\\n## 四、前端规范\\n\\n### 页面/组件结构\\n[组件树或目录结构]\\n\\n### 状态定义\\n```javascript\\ndata() {\\n return {\\n // 定义所有响应式数据\\n }\\n}\\n```\\n\\n### 交互逻辑\\n[事件处理、表单校验、加载状态等]\\n\\n### API 调用\\n[请求参数、响应处理、错误处理]\\n\\n## 五、后端规范\\n\\n### 接口定义\\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\\n|------|------|------|----------|----------|\\n| [API路径] | GET/POST/PUT/DELETE | | | |\\n\\n### 业务规则\\n[关键业务校验逻辑]\\n\\n### 异常处理\\n[错误码或异常场景]\\n\\n## 六、代码框架\\n\\n### 前端组件骨架\\n```vue\\n<template>\\n <!-- 模板代码 -->\\n</template>\\n\\n<script>\\nexport default {\\n // 组件代码\\n}\\n</script>\\n```\\n\\n### 后端 Service 骨架\\n```java/python/go\\n// Service 层代码框架\\n```\\n\\n## 七、注意事项\\n- [性能/安全/兼容性等方面的提醒]\\n\\n## 约束与原则\\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\\n- **离线性优先**:产出物应详细到无需联网即可编码实现\\n- **结构化输出**:严格按模板输出,不可随意删减章节\\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\\n\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":74,"output":962,"cacheRead":18432,"cacheWrite":0,"totalTokens":19468,"cost":{"input":0.000074,"output":0.001924,"cacheRead":0,"cacheWrite":0,"total":0.0019979999999999998}},"stopReason":"toolUse","timestamp":1780301590044,"responseId":"7bfec30a-df97-4fc4-80c9-cf89739f20a0"},{"role":"toolResult","toolCallId":"call00225ww3C6dPbensrhCCBn1085","toolName":"write","content":[{"type":"text","text":"Successfully wrote 1721 bytes to ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"}],"isError":false,"timestamp":1780301596658},{"role":"assistant","content":[{"type":"text","text":"已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"totalTokens":19773,"cost":{"input":0.000051,"output":0.000532,"cacheRead":0,"cacheWrite":0,"total":0.0005830000000000001}},"stopReason":"stop","timestamp":1780301596661,"responseId":"9a9b9dd9-65c3-4868-ac75-874a7aed115f"}],"imagesCount":0}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"model.completed","ts":"2026-06-01T08:15:10.785Z","seq":5,"sourceSeq":12,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false,"promptErrorSource":null,"usage":{"input":9034,"output":4641,"cacheRead":31744,"total":45419},"promptCache":{"lastCallUsage":{"input":913,"output":4556,"cacheRead":19968,"cacheWrite":0,"total":25437},"lastCacheTouchAt":1780301677741},"compactionCount":0,"assistantTexts":["好的,按照通用需求分析 Agent 的工作流程来。\n\n让我先读一下当前技能文件确认模板,然后开始分析。","现在根据模板开始分析需求并输出完整技术规范。\n\n---\n\n# 物料转换(新增/编辑/详情) - 技术规范文档\n\n## 一、需求摘要\n物料转换功能已存在,现对新增/编辑/详情页面进行三处优化:① 转换前的物料表格增加\"单价\"和\"金额\"字段,数据取自该批物料采购时的无税单价和无税金额,合计行取金额合计;② 转换后的物料自动带出默认工厂和仓库,取自主数据-物料信息中的默认仓库;③ 详情页同步展示转换前的单价和金额。\n\n## 二、待澄清问题\n- [ ] **Q1:单价和金额的精度要求?** 无税单价一般为几位小数(2位/4位/6位)?无税金额取整还是保留小数?\n- [ ] **Q2:转换前物料**的单价和金额是**新增时从采购记录带出**,还是**展示时实时计算**?如果是实时计算,涉及多批采购时取哪一批?\n- [ ] **Q3:转换后物料**如果主数据-物料信息中未配置默认工厂/仓库时怎么处理?禁止保存 / 弹窗提醒 / 留空?\n- [ ] **Q4:详情页**是否允许修改转换前后的单价/金额/默认仓库,还是纯展示?\n- [ ] **Q5:合计行**是否仅展示金额合计,还是也需要展示加权平均单价?\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| MaterialConversionBill | 修改 | 物料转换单主表 |\n| MaterialConversionItem(转换前) | 新增字段 | 转换前物料明细表 |\n| MaterialConversionItem(转换后) | 修改逻辑 | 转换后物料明细表 |\n| Material(主数据-物料信息) | 查询 | 查询默认工厂/仓库 |\n\n### 字段变更\n\n#### MaterialConversionItem(转换前明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| unit_price | decimal(18,6) | 是 | 无税单价,取采购价的单价 | **新增** |\n| amount | decimal(18,2) | 是 | 无税金额 = unit_price × quantity | **新增** |\n\n#### MaterialConversionBill(主表)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| total_amount | decimal(18,2) | 否 | 转换前合计金额,所有转换前明细的amount之和 | **新增** |\n\n#### MaterialConversionItem(转换后明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| factory_id | bigint | 推荐 | 默认工厂,从Material默认仓库关联获取 | 现有(逻辑变更) |\n| warehouse_id | bigint | 推荐 | 默认仓库,从Material默认仓库获取 | 现有(逻辑变更) |\n\n## 四、前端规范\n\n### 页面/组件结构\n\n```\nMaterialConversionEdit.vue ← 新增/编辑页(复用)\n ├── ConversionBeforeTable.vue ← 转换前物料表格(改造)\n │ └── (每行新增单价、金额列)\n │ └── ElTableAppendRow ← 合计行\n └── ConversionAfterTable.vue ← 转换后物料表格(改造)\n └── (工厂、仓库自动填充)\n\nMaterialConversionDetail.vue ← 详情页(改造)\n └── ConversionBeforeTableReadonly.vue\n └── ConversionAfterTableReadonly.vue\n```\n\n### 状态定义\n\n```javascript\ndata() {\n return {\n // 转换前物料列表\n beforeItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n unitPrice: 0, // 新增:无税单价\n amount: 0, // 新增:无税金额\n }\n ],\n // 合计金额(计算属性)\n // 转换后物料列表\n afterItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n factoryId: null, // 自动填充\n factoryName: '', // 自动填充\n warehouseId: null, // 自动填充\n warehouseName: '', // 自动填充\n }\n ],\n totalAmount: 0, // 转换前合计金额(同步到主表提交)\n }\n},\n\ncomputed: {\n // 转换前合计金额(实时计算)\n beforeTotalAmount() {\n return this.beforeItems.reduce((sum, item) => sum + (item.amount || 0), 0)\n }\n},\n\nwatch: {\n // 单价或数量变化时自动重算金额\n 'beforeItems': {\n handler(items) {\n items.forEach(item => {\n if (item.unitPrice && item.quantity) {\n item.amount = this.$utils.mul(item.unitPrice, item.quantity)\n }\n })\n },\n deep: true\n },\n\n // 转换后物料选择变化时自动带出默认仓库\n 'afterItems': {\n handler(items) {\n items.forEach(item => {\n if (item.materialId) {\n this.fetchDefaultWarehouse(item)\n }\n })\n },\n deep: true\n }\n}\n```\n\n### 交互逻辑\n\n**新建/编辑页 - 转换前表格:**\n1. 新增物料行时,选择物料后自动调用接口查询该物料的采购无税单价\n2. 单价可手动编辑(支持采购价与手工录入并存)\n3. 数量变化或单价变化时,自动计算金额(`金额 = 单价 × 数量`)\n4. 表格底部显示合计行,展示 `总金额 = 所有行金额之和`\n\n**新建/编辑页 - 转换后表格:**\n1. 新增物料行并选择物料后,调用接口查询物料主数据的默认工厂和默认仓库\n2. 工厂和仓库自动填入,且用户可手动修改覆盖\n\n**详情页:**\n- 转换前表格新增「单价」「金额」列,只读展示\n- 底部合计行展示金额合计值\n\n### API 调用\n\n#### 新增/编辑页面\n\n```javascript\n// 1. 获取物料的采购无税单价\nasync fetchPurchasePrice(materialId) {\n this.loadingPrice = true\n try {\n const res = await getPurchasePrice({ materialId })\n // res.data = { unitPrice: 12.500000 }\n return res.data.unitPrice\n } catch (e) {\n this.$message.warning('未查到该物料采购价格,请手动输入')\n return null\n } finally {\n this.loadingPrice = false\n }\n}\n\n// 2. 获取物料默认仓库\nasync fetchDefaultWarehouse(materialId) {\n try {\n const res = await getMaterialDefaultWarehouse({ materialId })\n // res.data = { factoryId: 1, factoryName: '一厂', warehouseId: 10, warehouseName: '原料仓' }\n this.$set(item, 'factoryId', res.data.factoryId)\n this.$set(item, 'factoryName', res.data.factoryName)\n this.$set(item, 'warehouseId', res.data.warehouseId)\n this.$set(item, 'warehouseName', res.data.warehouseName)\n } catch (e) {\n // 无默认仓库时不阻塞,留空让用户手动选\n }\n}\n\n// 3. 保存时提交(核心)\nasync handleSave() {\n const payload = {\n ...this.form,\n beforeItems: this.beforeItems.map(item => ({\n ...item,\n amount: this.$utils.mul(item.unitPrice, item.quantity) // 精度保护\n })),\n afterItems: this.afterItems,\n totalAmount: this.beforeTotalAmount // 合计金额\n }\n // 调用新增/编辑接口\n await saveMaterialConversion(payload)\n}\n```\n\n## 五、后端规范\n\n### 接口定义\n\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| /api/v1/material/purchase-price | GET | 查询物料最新采购无税单价 | materialId (Long) | `{ code:0, data:{ unitPrice:12.5 } }` |\n| /api/v1/material/default-warehouse | GET | 查询物料默认工厂和仓库 | materialId (Long) | `{ code:0, data:{ factoryId:1, factoryName:'一厂', warehouseId:10, warehouseName:'原料仓' } }` |\n| /api/v1/material-conversion | POST | 新增物料转换单 | body (见下) | `{ code:0, data:{ id:123 } }` |\n| /api/v1/material-conversion | PUT | 编辑物料转换单 | body (见下) | `{ code:0 }` |\n| /api/v1/material-conversion/{id} | GET | 查询物料转换单详情(需返回单价金额) | id (Long) | `{ code:0, data:{ ... , totalAmount, beforeItems[...], afterItems[...] } }` |\n\n#### POST/PUT body 结构\n```json\n{\n \"billNo\": \"MC20260601001\",\n \"billDate\": \"2026-06-01\",\n \"totalAmount\": 12500.00,\n \"beforeItems\": [\n {\n \"materialId\": 1001,\n \"quantity\": 100,\n \"unitPrice\": 12.500000,\n \"amount\": 1250.00\n }\n ],\n \"afterItems\": [\n {\n \"materialId\": 2001,\n \"quantity\": 100,\n \"factoryId\": 1,\n \"warehouseId\": 10\n }\n ]\n}\n```\n\n### 业务规则\n\n**1. 单价/金额/合计逻辑**\n- 新增转换单时:`amount = unitPrice × quantity`,各明细 amount 之和写入主表 `total_amount`\n- 编辑转换单时:重新计算金额和合计\n- 详情查询时:必须返回 `unitPrice`、`amount`、`totalAmount` 给前端\n\n**2. 默认仓库填充**\n- 新增转换后物料行时,查询 `material` 主表的 `default_warehouse_id`,再关联 `warehouse` 表获取 `factory_id`\n- 如果物料未配置默认仓库,返回空字段,由前端人工选择,不做校验拦截\n\n**3. 金额精度**\n- 单价保留6位小数(decimal(18,6)),金额保留2位小数(decimal(18,2))\n- 计算时使用高精度运算,避免浮点误差\n\n### 异常处理\n\n| 场景 | 处理方式 |\n|------|----------|\n| 物料不存在 | 返回 `{ code: 1001, msg: \"物料不存在\" }` |\n| 转换前明细为空 | 不允许保存,返回 `{ code: 1002, msg: \"转换前物料不能为空\" }` |\n| 转换后明细为空 | 不允许保存,返回 `{ code: 1003, msg: \"转换后物料不能为空\" }` |\n| 单价/金额为负 | 前端校验拦截,后端二次校验返回 `code: 1004` |\n| 采购价格查询无数据 | 返回 `null` 而非报错,由前端提示手动输入 |\n\n## 六、代码框架\n\n### 前端组件骨架(核心改动片段)\n\n```vue\n<!-- MaterialConversionEdit.vue - 改造片段 -->\n<template>\n <div class=\"material-conversion-edit\">\n <!-- 转换前物料表格 -->\n <el-table :data=\"beforeItems\" border show-summary\n :summary-method=\"getBeforeSummaries\">\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"specification\" label=\"规格\" />\n <el-table-column prop=\"quantity\" label=\"数量\" width=\"120\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.quantity\"\n :min=\"0.01\" :precision=\"2\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:单价列 -->\n <el-table-column prop=\"unitPrice\" label=\"单价\" width=\"140\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.unitPrice\"\n :min=\"0\" :precision=\"6\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:金额列(只读) -->\n <el-table-column prop=\"amount\" label=\"金额\" width=\"130\">\n <template slot-scope=\"{ row }\">\n {{ $utils.fixAmount(row.amount) }}\n </template>\n </el-table-column>\n </el-table>\n\n <!-- 转换后物料表格 -->\n <el-table :data=\"afterItems\" border>\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"factoryName\" label=\"工厂\" />\n <el-table-column prop=\"warehouseName\" label=\"仓库\" />\n </el-table>\n </div>\n</template>\n\n<script>\nimport { getPurchasePrice, getMaterialDefaultWarehouse, saveMaterialConversion } from '@/api/material'\n\nexport default {\n data() {\n return {\n beforeItems: [],\n afterItems: [],\n id: this.$route.query.id, // 编辑时有 id\n }\n },\n computed: {\n beforeTotalAmount() {\n return this.beforeItems.reduce((s, r) => s + this.$utils.add(s, r.amount), 0)\n }\n },\n methods: {\n // 重算单行金额\n recalcRowAmount(row) {\n row.amount = this.$utils.mul(row.unitPrice, row.quantity)\n },\n // 合计行展示\n getBeforeSummaries({ columns, data }) {\n const sums = []\n columns.forEach((col, i) => {\n if (i === 0) { sums[i] = '合计'; return }\n if (col.property === 'amount') {\n sums[i] = this.$utils.fixAmount(this.beforeTotalAmount)\n } else {\n sums[i] = ''\n }\n })\n return sums\n },\n // 物料选择后获取单价\n async onBeforeMaterialSelect(row) {\n const price = await getPurchasePrice({ materialId: row.materialId })\n if (price !== null && price !== undefined) {\n this.$set(row, 'unitPrice', price)\n this.recalcRowAmount(row)\n } else {\n this.$message.warning('未查到采购单价,请手动输入')\n this.$set(row, 'unitPrice', 0)\n }\n },\n // 物料选择后获取默认仓库\n async onAfterMaterialSelect(row) {\n const wh = await getMaterialDefaultWarehouse({ materialId: row.materialId })\n if (wh) {\n this.$set(row, 'factoryId', wh.factoryId)\n this.$set(row, 'factoryName', wh.factoryName)\n this.$set(row, 'warehouseId', wh.warehouseId)\n this.$set(row, 'warehouseName', wh.warehouseName)\n }\n },\n // 保存\n async handleSave() {\n const payload = {\n id: this.id,\n beforeItems: this.beforeItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n unitPrice: r.unitPrice, amount: r.amount\n })),\n afterItems: this.afterItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n factoryId: r.factoryId, warehouseId: r.warehouseId\n })),\n totalAmount: this.beforeTotalAmount\n }\n await saveMaterialConversion(payload)\n this.$message.success('保存成功')\n this.$router.back()\n }\n },\n async mounted() {\n if (this.id) {\n const res = await getMaterialConversionDetail(this.id)\n this.beforeItems = res.data.beforeItems\n this.afterItems = res.data.afterItems\n // 已有单价/金额/合计无需额外处理\n }\n }\n}\n</script>\n```\n\n### 后端 Service 骨架(Java Spring Boot 示例)\n\n```java\n@Service\n@Slf4j\npublic class MaterialConversionService {\n\n @Autowired\n private MaterialConversionMapper billMapper;\n @Autowired\n private MaterialConversionItemMapper itemMapper;\n @Autowired\n private MaterialMapper materialMapper;\n\n @Transactional(rollbackFor = Exception.class)\n public Long create(MaterialConversionCreateReq req) {\n // 1. 校验\n if (CollectionUtils.isEmpty(req.getBeforeItems())) {\n throw new BizException(1002, \"转换前物料不能为空\");\n }\n if (CollectionUtils.isEmpty(req.getAfterItems())) {\n throw new BizException(1003, \"转换后物料不能为空\");\n }\n\n // 2. 计算金额(二次校验,防止前端篡改)\n BigDecimal calcTotal = BigDecimal.ZERO;\n for (BeforeItemDTO item : req.getBeforeItems()) {\n // amount = unitPrice × quantity(使用高精度乘法)\n BigDecimal amount = item.getUnitPrice()\n .multiply(item.getQuantity())\n .setScale(2, RoundingMode.HALF_UP);\n item.setAmount(amount);\n calcTotal = calcTotal.add(amount);\n }\n\n // 3. 插入主表\n MaterialConversionBill bill = new MaterialConversionBill();\n BeanUtils.copyProperties(req, bill);\n bill.setTotalAmount(calcTotal);\n billMapper.insert(bill);\n\n // 4. 插入转换前明细\n for (BeforeItemDTO item : req.getBeforeItems()) {\n MaterialConversionBeforeItem entity = new MaterialConversionBeforeItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertBefore(entity);\n }\n\n // 5. 插入转换后明细\n for (AfterItemDTO item : req.getAfterItems()) {\n MaterialConversionAfterItem entity = new MaterialConversionAfterItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertAfter(entity);\n }\n\n return bill.getId();\n }\n\n // 采购单价查询\n public BigDecimal getPurchasePrice(Long materialId) {\n // 从采购入库明细表中取该物料最新一条无税单价\n return billMapper.selectLatestPurchasePrice(materialId);\n }\n\n // 默认仓库查询\n public DefaultWarehouseVO getDefaultWarehouse(Long materialId) {\n Material material = materialMapper.selectById(materialId);\n if (material == null || material.getDefaultWarehouseId() == null) {\n return null;\n }\n Warehouse warehouse = warehouseMapper.selectById(material.getDefaultWarehouseId());\n if (warehouse == null) return null;\n DefaultWarehouseVO vo = new DefaultWarehouseVO();\n vo.setWarehouseId(warehouse.getId());\n vo.setWarehouseName(warehouse.getName());\n vo.setFactoryId(warehouse.getFactoryId());\n vo.setFactoryName(warehouse.getFactoryName());\n return vo;\n }\n}\n```\n\n## 七、注意事项\n- **老项目影响评估**:涉及修改现有表结构,务必确认 `material_conversion_bill` 和 `material_conversion_before_item`(或类似名称)两张表是否存在,确认当前库兼容 `decimal(18,6)` 精度\n- **兼容性**:已有数据查询详情时,`unitPrice` / `amount` / `totalAmount` 字段为 NULL,前端应显示 `-` 或 `0.00`,不可报错\n- **采购价来源**:如果物料存在多批次采购,建议取**最近一次**采购入库的无税单价(按入库时间倒序 LIMIT 1),需确认业务方是否接受\n- **合计行**:纯前端计算,后端 Save/Update 时重新计算覆盖,保证数据一致性,不信任前端传入的 `amount`\n- **无税 vs 含税**:需求明确写\"无税单价/无税金额\",注意和含税字段区分,不可混用\n\n---\n\n这是完整的分析输出。如果那些待澄清问题确认后,我可以进一步细化或有针对性地调整代码骨架。"],"finalPromptText":"[Mon 2026-06-01 16:14 GMT+8] 刚接手的老项目 优化需求\n\"【G5】【维云智造-机械行业】【威玛斯】【库存管理】物料转换\n新增/编辑页面:1.转换前的物料增加“单价”“金额”字段,取该批物料采购时的无税单价和无税金额;转换前的合计金额取此金额的合计值;2.转换后的物料自动带出默认工厂和仓库,数据取自主数据-物料信息中默认的仓库。\n详情:转换前的物料增加“单价”“金额”字段\n\"\n物料转换功能已存在","messagesSnapshot":[{"role":"user","content":"创建一个通用需求分析Agent 配置全中文\n# 角色定义\n你是一个通用需求分析Agent,擅长将产品需求转化为前后端可执行的技术规范。\n\n## 核心能力\n1. 前后端兼顾:不偏废任何一端\n2. 离线性优先:产出物应详细到无需联网即可编码实现\n3. 结构化输出:按固定模板输出,便于团队复用\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}","timestamp":1780301586494,"idempotencyKey":"1a816b82-81df-4f52-973d-ad83c4bebf6c:user"},{"role":"assistant","content":[{"type":"text","text":"好,我来为你创建这个通用需求分析 Agent。\n\n这个 Agent 直接用现有框架创建为 skill,后续随时可用。我会把它的配置写成一个 skill 规范文件:"},{"type":"toolCall","id":"call00A0oxTlAMYgYWRnOviKk87034","name":"exec","arguments":{"command":"ls ~/.openclaw/workspace/skills/"},"partialArgs":"{\"command\": \"ls ~/.openclaw/workspace/skills/\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":18214,"output":89,"cacheRead":0,"cacheWrite":0,"totalTokens":18303,"cost":{"input":0.018213999999999998,"output":0.000178,"cacheRead":0,"cacheWrite":0,"total":0.018392}},"stopReason":"toolUse","timestamp":1780301587022,"responseId":"fd743bba-bb3a-4d01-a073-7b7720ee1c67"},{"role":"toolResult","toolCallId":"call00A0oxTlAMYgYWRnOviKk87034","toolName":"exec","content":[{"type":"text","text":"MySQL\nObsidian\nblogwatcher\nbrowser\ndatabase-admin\ndatabase-schema-designer\ndb-query\ndb-schema-gen\ndeep-research-pro\ndocker-essentials\nhumanizer\nimap-smtp-email\nmcporter\nmulti-search-engine\nnews-summary\nobsidian\nobsidian-official-cli\nopenclaw-code\nopencode-controller\nopenspec\nqiushi-openclaw-skill\nrss-ai-reader\nsql-toolkit\nusing-superpowers\nvideo-frames\nweather\nweb-search"}],"isError":false,"timestamp":1780301588868},{"role":"assistant","content":[{"type":"toolCall","id":"call007XMRwq7o85F0QJJE5CFU2056","name":"exec","arguments":{"command":"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst"},"partialArgs":"{\"command\": \"mkdir -p ~/.openclaw/workspace/skills/requirements-analyst\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":257,"output":59,"cacheRead":18176,"cacheWrite":0,"totalTokens":18492,"cost":{"input":0.000257,"output":0.000118,"cacheRead":0,"cacheWrite":0,"total":0.000375}},"stopReason":"toolUse","timestamp":1780301588871,"responseId":"1413735d-56f0-4dca-aef2-44293b4085b8"},{"role":"toolResult","toolCallId":"call007XMRwq7o85F0QJJE5CFU2056","toolName":"exec","content":[{"type":"text","text":"(no output)"}],"isError":false,"timestamp":1780301590043},{"role":"assistant","content":[{"type":"toolCall","id":"call00225ww3C6dPbensrhCCBn1085","name":"write","arguments":{"path":"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md","content":"# 通用需求分析 Agent\n\n## 描述\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\n\n## 触发条件\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\n- 用户提出了一个功能想法,需要拆解技术方案\n- 用户需要前后端分工的技术文档\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}\n```\n\n### 交互逻辑\n[事件处理、表单校验、加载状态等]\n\n### API 调用\n[请求参数、响应处理、错误处理]\n\n## 五、后端规范\n\n### 接口定义\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| [API路径] | GET/POST/PUT/DELETE | | | |\n\n### 业务规则\n[关键业务校验逻辑]\n\n### 异常处理\n[错误码或异常场景]\n\n## 六、代码框架\n\n### 前端组件骨架\n```vue\n<template>\n <!-- 模板代码 -->\n</template>\n\n<script>\nexport default {\n // 组件代码\n}\n</script>\n```\n\n### 后端 Service 骨架\n```java/python/go\n// Service 层代码框架\n```\n\n## 七、注意事项\n- [性能/安全/兼容性等方面的提醒]\n\n## 约束与原则\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\n- **离线性优先**:产出物应详细到无需联网即可编码实现\n- **结构化输出**:严格按模板输出,不可随意删减章节\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\n"},"partialArgs":"{\"path\": \"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md\", \"content\": \"# 通用需求分析 Agent\\n\\n## 描述\\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\\n\\n## 触发条件\\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\\n- 用户提出了一个功能想法,需要拆解技术方案\\n- 用户需要前后端分工的技术文档\\n\\n## 工作流程(必须按顺序执行)\\n\\n### 第一步:需求理解与澄清\\n- 识别需求中的【实体】、【动作】、【约束】\\n- 标记模糊点,提出待澄清问题(不超过5个)\\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\\n\\n### 第二步:数据模型设计\\n- 列出涉及的数据实体和字段\\n- 标注新增字段 vs 现有字段\\n- 定义字段类型、长度、必填、默认值、关联关系\\n\\n### 第三步:前端规范输出\\n- 页面/组件结构\\n- 状态管理(data/computed/watch)\\n- 交互逻辑(事件处理、表单校验、错误提示)\\n- API调用(请求参数、响应处理、加载状态)\\n\\n### 第四步:后端规范输出\\n- 接口定义(路径、方法、请求/响应结构)\\n- 数据库操作(SQL或ORM代码)\\n- 业务规则校验\\n- 边界条件与异常处理\\n\\n### 第五步:代码框架生成\\n- 前端:组件骨架代码(可直接复制)\\n- 后端:Service/Controller骨架代码\\n\\n## 输出模板(必须严格遵守)\\n\\n# [需求名称] - 技术规范文档\\n\\n## 一、需求摘要\\n[2-3句话总结核心需求]\\n\\n## 二、待澄清问题(如有)\\n- [ ] 问题1\\n- [ ] 问题2\\n\\n## 三、数据模型\\n\\n### 涉及实体\\n| 实体名 | 操作类型 | 说明 |\\n|--------|----------|------|\\n| [实体] | 新增/修改/查询 | |\\n\\n### 字段变更\\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\\n|------|------|------|------|------|------|\\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\\n\\n## 四、前端规范\\n\\n### 页面/组件结构\\n[组件树或目录结构]\\n\\n### 状态定义\\n```javascript\\ndata() {\\n return {\\n // 定义所有响应式数据\\n }\\n}\\n```\\n\\n### 交互逻辑\\n[事件处理、表单校验、加载状态等]\\n\\n### API 调用\\n[请求参数、响应处理、错误处理]\\n\\n## 五、后端规范\\n\\n### 接口定义\\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\\n|------|------|------|----------|----------|\\n| [API路径] | GET/POST/PUT/DELETE | | | |\\n\\n### 业务规则\\n[关键业务校验逻辑]\\n\\n### 异常处理\\n[错误码或异常场景]\\n\\n## 六、代码框架\\n\\n### 前端组件骨架\\n```vue\\n<template>\\n <!-- 模板代码 -->\\n</template>\\n\\n<script>\\nexport default {\\n // 组件代码\\n}\\n</script>\\n```\\n\\n### 后端 Service 骨架\\n```java/python/go\\n// Service 层代码框架\\n```\\n\\n## 七、注意事项\\n- [性能/安全/兼容性等方面的提醒]\\n\\n## 约束与原则\\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\\n- **离线性优先**:产出物应详细到无需联网即可编码实现\\n- **结构化输出**:严格按模板输出,不可随意删减章节\\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\\n\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":74,"output":962,"cacheRead":18432,"cacheWrite":0,"totalTokens":19468,"cost":{"input":0.000074,"output":0.001924,"cacheRead":0,"cacheWrite":0,"total":0.0019979999999999998}},"stopReason":"toolUse","timestamp":1780301590044,"responseId":"7bfec30a-df97-4fc4-80c9-cf89739f20a0"},{"role":"toolResult","toolCallId":"call00225ww3C6dPbensrhCCBn1085","toolName":"write","content":[{"type":"text","text":"Successfully wrote 1721 bytes to ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"}],"isError":false,"timestamp":1780301596658},{"role":"assistant","content":[{"type":"text","text":"已创建成功,文件地址在:\n\n**`~/.openclaw/workspace/skills/requirements-analyst/SKILL.md`**\n\n包含以下完整内容:\n\n### 技能配置清单\n\n| 模块 | 内容 |\n|------|------|\n| **触发条件** | 分析需求、出技术方案、模糊想法拆解等 |\n| **工作流程** | 5 步顺序执行:需求理解→数据模型→前端规范→后端规范→代码框架 |\n| **输出模板** | 7 个固定章节,表格 + 代码片段 |\n| **输出模板覆盖** | 需求摘要、待澄清问题(≤5个)、数据实体/字段表、前端组件树+状态定义+API调用、后端接口定义+业务规则+异常处理、代码骨架(Vue + 后端 Service) |\n| **约束原则** | 前后端兼顾、离线性优先、不猜测需求、不删减章节 |\n\n### 使用方式\n\n直接把一篇需求文档或 idea 扔过来,加一句**\"分析这个需求\"**或者**\"出技术方案\"**,我会自动按这个流程输出完整的 `[需求名称] - 技术规范文档`。\n\n要不要现在测试一下?随便给个需求我试试效果。"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":51,"output":266,"cacheRead":19456,"cacheWrite":0,"totalTokens":19773,"cost":{"input":0.000051,"output":0.000532,"cacheRead":0,"cacheWrite":0,"total":0.0005830000000000001}},"stopReason":"stop","timestamp":1780301596661,"responseId":"9a9b9dd9-65c3-4868-ac75-874a7aed115f"},{"role":"user","content":[{"type":"text","text":"[Mon 2026-06-01 16:14 GMT+8] 刚接手的老项目 优化需求\n\"【G5】【维云智造-机械行业】【威玛斯】【库存管理】物料转换\n新增/编辑页面:1.转换前的物料增加“单价”“金额”字段,取该批物料采购时的无税单价和无税金额;转换前的合计金额取此金额的合计值;2.转换后的物料自动带出默认工厂和仓库,数据取自主数据-物料信息中默认的仓库。\n详情:转换前的物料增加“单价”“金额”字段\n\"\n物料转换功能已存在"}],"timestamp":1780301676215},{"role":"assistant","content":[{"type":"text","text":"好的,按照通用需求分析 Agent 的工作流程来。\n\n让我先读一下当前技能文件确认模板,然后开始分析。"},{"type":"toolCall","id":"call_00_8ozJNpll6fKGVe0ZuQyK4580","name":"read","arguments":{"path":"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"},"partialArgs":"{\"path\": \"~/.openclaw/workspace/skills/requirements-analyst/SKILL.md\"}"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":8121,"output":85,"cacheRead":11776,"cacheWrite":0,"totalTokens":19982,"cost":{"input":0.008121,"output":0.00016999999999999999,"cacheRead":0,"cacheWrite":0,"total":0.008291}},"stopReason":"toolUse","timestamp":1780301676218,"responseId":"b26a52e0-7a7a-4283-9abb-fdbb977befca"},{"role":"toolResult","toolCallId":"call_00_8ozJNpll6fKGVe0ZuQyK4580","toolName":"read","content":[{"type":"text","text":"# 通用需求分析 Agent\n\n## 描述\n通用需求分析技能。当用户提出**任何产品需求、功能描述、需求文档、PRD、Issue 或模糊想法**时,自动触发该技能。负责将产品需求转化为前后端可执行的技术规范,输出离线性优先的结构化文档,让开发人员无需联网即可直接编码实现。\n\n## 触发条件\n- 用户说:「分析这个需求」、「写规范」、「出技术方案」、「前端后端分别怎么写」、「实现这个功能」……\n- 用户粘贴了一段需求文本、PRD、产品描述、用户故事\n- 用户提出了一个功能想法,需要拆解技术方案\n- 用户需要前后端分工的技术文档\n\n## 工作流程(必须按顺序执行)\n\n### 第一步:需求理解与澄清\n- 识别需求中的【实体】、【动作】、【约束】\n- 标记模糊点,提出待澄清问题(不超过5个)\n- 判断需求类型:新增功能 / 修改功能 / 优化功能\n\n### 第二步:数据模型设计\n- 列出涉及的数据实体和字段\n- 标注新增字段 vs 现有字段\n- 定义字段类型、长度、必填、默认值、关联关系\n\n### 第三步:前端规范输出\n- 页面/组件结构\n- 状态管理(data/computed/watch)\n- 交互逻辑(事件处理、表单校验、错误提示)\n- API调用(请求参数、响应处理、加载状态)\n\n### 第四步:后端规范输出\n- 接口定义(路径、方法、请求/响应结构)\n- 数据库操作(SQL或ORM代码)\n- 业务规则校验\n- 边界条件与异常处理\n\n### 第五步:代码框架生成\n- 前端:组件骨架代码(可直接复制)\n- 后端:Service/Controller骨架代码\n\n## 输出模板(必须严格遵守)\n\n# [需求名称] - 技术规范文档\n\n## 一、需求摘要\n[2-3句话总结核心需求]\n\n## 二、待澄清问题(如有)\n- [ ] 问题1\n- [ ] 问题2\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| [实体] | 新增/修改/查询 | |\n\n### 字段变更\n| 实体 | 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|------|\n| [实体] | [字段] | string/number/date | 是/否 | | 新增/现有 |\n\n## 四、前端规范\n\n### 页面/组件结构\n[组件树或目录结构]\n\n### 状态定义\n```javascript\ndata() {\n return {\n // 定义所有响应式数据\n }\n}\n```\n\n### 交互逻辑\n[事件处理、表单校验、加载状态等]\n\n### API 调用\n[请求参数、响应处理、错误处理]\n\n## 五、后端规范\n\n### 接口定义\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| [API路径] | GET/POST/PUT/DELETE | | | |\n\n### 业务规则\n[关键业务校验逻辑]\n\n### 异常处理\n[错误码或异常场景]\n\n## 六、代码框架\n\n### 前端组件骨架\n```vue\n<template>\n <!-- 模板代码 -->\n</template>\n\n<script>\nexport default {\n // 组件代码\n}\n</script>\n```\n\n### 后端 Service 骨架\n```java/python/go\n// Service 层代码框架\n```\n\n## 七、注意事项\n- [性能/安全/兼容性等方面的提醒]\n\n## 约束与原则\n- **前后端兼顾**:不偏废任何一端,前端状态管理和后端接口定义必须完整\n- **离线性优先**:产出物应详细到无需联网即可编码实现\n- **结构化输出**:严格按模板输出,不可随意删减章节\n- **不猜测需求**:需求中未提及的部分不可自己脑补,标记为「待确认」或用「?」标注\n"}],"isError":false,"timestamp":1780301677739},{"role":"assistant","content":[{"type":"text","text":"现在根据模板开始分析需求并输出完整技术规范。\n\n---\n\n# 物料转换(新增/编辑/详情) - 技术规范文档\n\n## 一、需求摘要\n物料转换功能已存在,现对新增/编辑/详情页面进行三处优化:① 转换前的物料表格增加\"单价\"和\"金额\"字段,数据取自该批物料采购时的无税单价和无税金额,合计行取金额合计;② 转换后的物料自动带出默认工厂和仓库,取自主数据-物料信息中的默认仓库;③ 详情页同步展示转换前的单价和金额。\n\n## 二、待澄清问题\n- [ ] **Q1:单价和金额的精度要求?** 无税单价一般为几位小数(2位/4位/6位)?无税金额取整还是保留小数?\n- [ ] **Q2:转换前物料**的单价和金额是**新增时从采购记录带出**,还是**展示时实时计算**?如果是实时计算,涉及多批采购时取哪一批?\n- [ ] **Q3:转换后物料**如果主数据-物料信息中未配置默认工厂/仓库时怎么处理?禁止保存 / 弹窗提醒 / 留空?\n- [ ] **Q4:详情页**是否允许修改转换前后的单价/金额/默认仓库,还是纯展示?\n- [ ] **Q5:合计行**是否仅展示金额合计,还是也需要展示加权平均单价?\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| MaterialConversionBill | 修改 | 物料转换单主表 |\n| MaterialConversionItem(转换前) | 新增字段 | 转换前物料明细表 |\n| MaterialConversionItem(转换后) | 修改逻辑 | 转换后物料明细表 |\n| Material(主数据-物料信息) | 查询 | 查询默认工厂/仓库 |\n\n### 字段变更\n\n#### MaterialConversionItem(转换前明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| unit_price | decimal(18,6) | 是 | 无税单价,取采购价的单价 | **新增** |\n| amount | decimal(18,2) | 是 | 无税金额 = unit_price × quantity | **新增** |\n\n#### MaterialConversionBill(主表)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| total_amount | decimal(18,2) | 否 | 转换前合计金额,所有转换前明细的amount之和 | **新增** |\n\n#### MaterialConversionItem(转换后明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| factory_id | bigint | 推荐 | 默认工厂,从Material默认仓库关联获取 | 现有(逻辑变更) |\n| warehouse_id | bigint | 推荐 | 默认仓库,从Material默认仓库获取 | 现有(逻辑变更) |\n\n## 四、前端规范\n\n### 页面/组件结构\n\n```\nMaterialConversionEdit.vue ← 新增/编辑页(复用)\n ├── ConversionBeforeTable.vue ← 转换前物料表格(改造)\n │ └── (每行新增单价、金额列)\n │ └── ElTableAppendRow ← 合计行\n └── ConversionAfterTable.vue ← 转换后物料表格(改造)\n └── (工厂、仓库自动填充)\n\nMaterialConversionDetail.vue ← 详情页(改造)\n └── ConversionBeforeTableReadonly.vue\n └── ConversionAfterTableReadonly.vue\n```\n\n### 状态定义\n\n```javascript\ndata() {\n return {\n // 转换前物料列表\n beforeItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n unitPrice: 0, // 新增:无税单价\n amount: 0, // 新增:无税金额\n }\n ],\n // 合计金额(计算属性)\n // 转换后物料列表\n afterItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n factoryId: null, // 自动填充\n factoryName: '', // 自动填充\n warehouseId: null, // 自动填充\n warehouseName: '', // 自动填充\n }\n ],\n totalAmount: 0, // 转换前合计金额(同步到主表提交)\n }\n},\n\ncomputed: {\n // 转换前合计金额(实时计算)\n beforeTotalAmount() {\n return this.beforeItems.reduce((sum, item) => sum + (item.amount || 0), 0)\n }\n},\n\nwatch: {\n // 单价或数量变化时自动重算金额\n 'beforeItems': {\n handler(items) {\n items.forEach(item => {\n if (item.unitPrice && item.quantity) {\n item.amount = this.$utils.mul(item.unitPrice, item.quantity)\n }\n })\n },\n deep: true\n },\n\n // 转换后物料选择变化时自动带出默认仓库\n 'afterItems': {\n handler(items) {\n items.forEach(item => {\n if (item.materialId) {\n this.fetchDefaultWarehouse(item)\n }\n })\n },\n deep: true\n }\n}\n```\n\n### 交互逻辑\n\n**新建/编辑页 - 转换前表格:**\n1. 新增物料行时,选择物料后自动调用接口查询该物料的采购无税单价\n2. 单价可手动编辑(支持采购价与手工录入并存)\n3. 数量变化或单价变化时,自动计算金额(`金额 = 单价 × 数量`)\n4. 表格底部显示合计行,展示 `总金额 = 所有行金额之和`\n\n**新建/编辑页 - 转换后表格:**\n1. 新增物料行并选择物料后,调用接口查询物料主数据的默认工厂和默认仓库\n2. 工厂和仓库自动填入,且用户可手动修改覆盖\n\n**详情页:**\n- 转换前表格新增「单价」「金额」列,只读展示\n- 底部合计行展示金额合计值\n\n### API 调用\n\n#### 新增/编辑页面\n\n```javascript\n// 1. 获取物料的采购无税单价\nasync fetchPurchasePrice(materialId) {\n this.loadingPrice = true\n try {\n const res = await getPurchasePrice({ materialId })\n // res.data = { unitPrice: 12.500000 }\n return res.data.unitPrice\n } catch (e) {\n this.$message.warning('未查到该物料采购价格,请手动输入')\n return null\n } finally {\n this.loadingPrice = false\n }\n}\n\n// 2. 获取物料默认仓库\nasync fetchDefaultWarehouse(materialId) {\n try {\n const res = await getMaterialDefaultWarehouse({ materialId })\n // res.data = { factoryId: 1, factoryName: '一厂', warehouseId: 10, warehouseName: '原料仓' }\n this.$set(item, 'factoryId', res.data.factoryId)\n this.$set(item, 'factoryName', res.data.factoryName)\n this.$set(item, 'warehouseId', res.data.warehouseId)\n this.$set(item, 'warehouseName', res.data.warehouseName)\n } catch (e) {\n // 无默认仓库时不阻塞,留空让用户手动选\n }\n}\n\n// 3. 保存时提交(核心)\nasync handleSave() {\n const payload = {\n ...this.form,\n beforeItems: this.beforeItems.map(item => ({\n ...item,\n amount: this.$utils.mul(item.unitPrice, item.quantity) // 精度保护\n })),\n afterItems: this.afterItems,\n totalAmount: this.beforeTotalAmount // 合计金额\n }\n // 调用新增/编辑接口\n await saveMaterialConversion(payload)\n}\n```\n\n## 五、后端规范\n\n### 接口定义\n\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| /api/v1/material/purchase-price | GET | 查询物料最新采购无税单价 | materialId (Long) | `{ code:0, data:{ unitPrice:12.5 } }` |\n| /api/v1/material/default-warehouse | GET | 查询物料默认工厂和仓库 | materialId (Long) | `{ code:0, data:{ factoryId:1, factoryName:'一厂', warehouseId:10, warehouseName:'原料仓' } }` |\n| /api/v1/material-conversion | POST | 新增物料转换单 | body (见下) | `{ code:0, data:{ id:123 } }` |\n| /api/v1/material-conversion | PUT | 编辑物料转换单 | body (见下) | `{ code:0 }` |\n| /api/v1/material-conversion/{id} | GET | 查询物料转换单详情(需返回单价金额) | id (Long) | `{ code:0, data:{ ... , totalAmount, beforeItems[...], afterItems[...] } }` |\n\n#### POST/PUT body 结构\n```json\n{\n \"billNo\": \"MC20260601001\",\n \"billDate\": \"2026-06-01\",\n \"totalAmount\": 12500.00,\n \"beforeItems\": [\n {\n \"materialId\": 1001,\n \"quantity\": 100,\n \"unitPrice\": 12.500000,\n \"amount\": 1250.00\n }\n ],\n \"afterItems\": [\n {\n \"materialId\": 2001,\n \"quantity\": 100,\n \"factoryId\": 1,\n \"warehouseId\": 10\n }\n ]\n}\n```\n\n### 业务规则\n\n**1. 单价/金额/合计逻辑**\n- 新增转换单时:`amount = unitPrice × quantity`,各明细 amount 之和写入主表 `total_amount`\n- 编辑转换单时:重新计算金额和合计\n- 详情查询时:必须返回 `unitPrice`、`amount`、`totalAmount` 给前端\n\n**2. 默认仓库填充**\n- 新增转换后物料行时,查询 `material` 主表的 `default_warehouse_id`,再关联 `warehouse` 表获取 `factory_id`\n- 如果物料未配置默认仓库,返回空字段,由前端人工选择,不做校验拦截\n\n**3. 金额精度**\n- 单价保留6位小数(decimal(18,6)),金额保留2位小数(decimal(18,2))\n- 计算时使用高精度运算,避免浮点误差\n\n### 异常处理\n\n| 场景 | 处理方式 |\n|------|----------|\n| 物料不存在 | 返回 `{ code: 1001, msg: \"物料不存在\" }` |\n| 转换前明细为空 | 不允许保存,返回 `{ code: 1002, msg: \"转换前物料不能为空\" }` |\n| 转换后明细为空 | 不允许保存,返回 `{ code: 1003, msg: \"转换后物料不能为空\" }` |\n| 单价/金额为负 | 前端校验拦截,后端二次校验返回 `code: 1004` |\n| 采购价格查询无数据 | 返回 `null` 而非报错,由前端提示手动输入 |\n\n## 六、代码框架\n\n### 前端组件骨架(核心改动片段)\n\n```vue\n<!-- MaterialConversionEdit.vue - 改造片段 -->\n<template>\n <div class=\"material-conversion-edit\">\n <!-- 转换前物料表格 -->\n <el-table :data=\"beforeItems\" border show-summary\n :summary-method=\"getBeforeSummaries\">\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"specification\" label=\"规格\" />\n <el-table-column prop=\"quantity\" label=\"数量\" width=\"120\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.quantity\"\n :min=\"0.01\" :precision=\"2\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:单价列 -->\n <el-table-column prop=\"unitPrice\" label=\"单价\" width=\"140\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.unitPrice\"\n :min=\"0\" :precision=\"6\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:金额列(只读) -->\n <el-table-column prop=\"amount\" label=\"金额\" width=\"130\">\n <template slot-scope=\"{ row }\">\n {{ $utils.fixAmount(row.amount) }}\n </template>\n </el-table-column>\n </el-table>\n\n <!-- 转换后物料表格 -->\n <el-table :data=\"afterItems\" border>\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"factoryName\" label=\"工厂\" />\n <el-table-column prop=\"warehouseName\" label=\"仓库\" />\n </el-table>\n </div>\n</template>\n\n<script>\nimport { getPurchasePrice, getMaterialDefaultWarehouse, saveMaterialConversion } from '@/api/material'\n\nexport default {\n data() {\n return {\n beforeItems: [],\n afterItems: [],\n id: this.$route.query.id, // 编辑时有 id\n }\n },\n computed: {\n beforeTotalAmount() {\n return this.beforeItems.reduce((s, r) => s + this.$utils.add(s, r.amount), 0)\n }\n },\n methods: {\n // 重算单行金额\n recalcRowAmount(row) {\n row.amount = this.$utils.mul(row.unitPrice, row.quantity)\n },\n // 合计行展示\n getBeforeSummaries({ columns, data }) {\n const sums = []\n columns.forEach((col, i) => {\n if (i === 0) { sums[i] = '合计'; return }\n if (col.property === 'amount') {\n sums[i] = this.$utils.fixAmount(this.beforeTotalAmount)\n } else {\n sums[i] = ''\n }\n })\n return sums\n },\n // 物料选择后获取单价\n async onBeforeMaterialSelect(row) {\n const price = await getPurchasePrice({ materialId: row.materialId })\n if (price !== null && price !== undefined) {\n this.$set(row, 'unitPrice', price)\n this.recalcRowAmount(row)\n } else {\n this.$message.warning('未查到采购单价,请手动输入')\n this.$set(row, 'unitPrice', 0)\n }\n },\n // 物料选择后获取默认仓库\n async onAfterMaterialSelect(row) {\n const wh = await getMaterialDefaultWarehouse({ materialId: row.materialId })\n if (wh) {\n this.$set(row, 'factoryId', wh.factoryId)\n this.$set(row, 'factoryName', wh.factoryName)\n this.$set(row, 'warehouseId', wh.warehouseId)\n this.$set(row, 'warehouseName', wh.warehouseName)\n }\n },\n // 保存\n async handleSave() {\n const payload = {\n id: this.id,\n beforeItems: this.beforeItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n unitPrice: r.unitPrice, amount: r.amount\n })),\n afterItems: this.afterItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n factoryId: r.factoryId, warehouseId: r.warehouseId\n })),\n totalAmount: this.beforeTotalAmount\n }\n await saveMaterialConversion(payload)\n this.$message.success('保存成功')\n this.$router.back()\n }\n },\n async mounted() {\n if (this.id) {\n const res = await getMaterialConversionDetail(this.id)\n this.beforeItems = res.data.beforeItems\n this.afterItems = res.data.afterItems\n // 已有单价/金额/合计无需额外处理\n }\n }\n}\n</script>\n```\n\n### 后端 Service 骨架(Java Spring Boot 示例)\n\n```java\n@Service\n@Slf4j\npublic class MaterialConversionService {\n\n @Autowired\n private MaterialConversionMapper billMapper;\n @Autowired\n private MaterialConversionItemMapper itemMapper;\n @Autowired\n private MaterialMapper materialMapper;\n\n @Transactional(rollbackFor = Exception.class)\n public Long create(MaterialConversionCreateReq req) {\n // 1. 校验\n if (CollectionUtils.isEmpty(req.getBeforeItems())) {\n throw new BizException(1002, \"转换前物料不能为空\");\n }\n if (CollectionUtils.isEmpty(req.getAfterItems())) {\n throw new BizException(1003, \"转换后物料不能为空\");\n }\n\n // 2. 计算金额(二次校验,防止前端篡改)\n BigDecimal calcTotal = BigDecimal.ZERO;\n for (BeforeItemDTO item : req.getBeforeItems()) {\n // amount = unitPrice × quantity(使用高精度乘法)\n BigDecimal amount = item.getUnitPrice()\n .multiply(item.getQuantity())\n .setScale(2, RoundingMode.HALF_UP);\n item.setAmount(amount);\n calcTotal = calcTotal.add(amount);\n }\n\n // 3. 插入主表\n MaterialConversionBill bill = new MaterialConversionBill();\n BeanUtils.copyProperties(req, bill);\n bill.setTotalAmount(calcTotal);\n billMapper.insert(bill);\n\n // 4. 插入转换前明细\n for (BeforeItemDTO item : req.getBeforeItems()) {\n MaterialConversionBeforeItem entity = new MaterialConversionBeforeItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertBefore(entity);\n }\n\n // 5. 插入转换后明细\n for (AfterItemDTO item : req.getAfterItems()) {\n MaterialConversionAfterItem entity = new MaterialConversionAfterItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertAfter(entity);\n }\n\n return bill.getId();\n }\n\n // 采购单价查询\n public BigDecimal getPurchasePrice(Long materialId) {\n // 从采购入库明细表中取该物料最新一条无税单价\n return billMapper.selectLatestPurchasePrice(materialId);\n }\n\n // 默认仓库查询\n public DefaultWarehouseVO getDefaultWarehouse(Long materialId) {\n Material material = materialMapper.selectById(materialId);\n if (material == null || material.getDefaultWarehouseId() == null) {\n return null;\n }\n Warehouse warehouse = warehouseMapper.selectById(material.getDefaultWarehouseId());\n if (warehouse == null) return null;\n DefaultWarehouseVO vo = new DefaultWarehouseVO();\n vo.setWarehouseId(warehouse.getId());\n vo.setWarehouseName(warehouse.getName());\n vo.setFactoryId(warehouse.getFactoryId());\n vo.setFactoryName(warehouse.getFactoryName());\n return vo;\n }\n}\n```\n\n## 七、注意事项\n- **老项目影响评估**:涉及修改现有表结构,务必确认 `material_conversion_bill` 和 `material_conversion_before_item`(或类似名称)两张表是否存在,确认当前库兼容 `decimal(18,6)` 精度\n- **兼容性**:已有数据查询详情时,`unitPrice` / `amount` / `totalAmount` 字段为 NULL,前端应显示 `-` 或 `0.00`,不可报错\n- **采购价来源**:如果物料存在多批次采购,建议取**最近一次**采购入库的无税单价(按入库时间倒序 LIMIT 1),需确认业务方是否接受\n- **合计行**:纯前端计算,后端 Save/Update 时重新计算覆盖,保证数据一致性,不信任前端传入的 `amount`\n- **无税 vs 含税**:需求明确写\"无税单价/无税金额\",注意和含税字段区分,不可混用\n\n---\n\n这是完整的分析输出。如果那些待澄清问题确认后,我可以进一步细化或有针对性地调整代码骨架。"}],"api":"openai-completions","provider":"deepseek","model":"deepseek-v4-flash","usage":{"input":913,"output":4556,"cacheRead":19968,"cacheWrite":0,"totalTokens":25437,"cost":{"input":0.000913,"output":0.009112,"cacheRead":0,"cacheWrite":0,"total":0.010025000000000001}},"stopReason":"stop","timestamp":1780301677741,"responseId":"920c1fbc-537e-42ef-8e6c-a3ad31e59d12"}]}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"trace.artifacts","ts":"2026-06-01T08:15:10.786Z","seq":6,"sourceSeq":13,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"capturedAt":"2026-06-01T08:15:10.786Z","finalStatus":"success","aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false,"promptErrorSource":null,"usage":{"input":9034,"output":4641,"cacheRead":31744,"total":45419},"promptCache":{"lastCallUsage":{"input":913,"output":4556,"cacheRead":19968,"cacheWrite":0,"total":25437},"lastCacheTouchAt":1780301677741},"compactionCount":0,"assistantTexts":["好的,按照通用需求分析 Agent 的工作流程来。\n\n让我先读一下当前技能文件确认模板,然后开始分析。","现在根据模板开始分析需求并输出完整技术规范。\n\n---\n\n# 物料转换(新增/编辑/详情) - 技术规范文档\n\n## 一、需求摘要\n物料转换功能已存在,现对新增/编辑/详情页面进行三处优化:① 转换前的物料表格增加\"单价\"和\"金额\"字段,数据取自该批物料采购时的无税单价和无税金额,合计行取金额合计;② 转换后的物料自动带出默认工厂和仓库,取自主数据-物料信息中的默认仓库;③ 详情页同步展示转换前的单价和金额。\n\n## 二、待澄清问题\n- [ ] **Q1:单价和金额的精度要求?** 无税单价一般为几位小数(2位/4位/6位)?无税金额取整还是保留小数?\n- [ ] **Q2:转换前物料**的单价和金额是**新增时从采购记录带出**,还是**展示时实时计算**?如果是实时计算,涉及多批采购时取哪一批?\n- [ ] **Q3:转换后物料**如果主数据-物料信息中未配置默认工厂/仓库时怎么处理?禁止保存 / 弹窗提醒 / 留空?\n- [ ] **Q4:详情页**是否允许修改转换前后的单价/金额/默认仓库,还是纯展示?\n- [ ] **Q5:合计行**是否仅展示金额合计,还是也需要展示加权平均单价?\n\n## 三、数据模型\n\n### 涉及实体\n| 实体名 | 操作类型 | 说明 |\n|--------|----------|------|\n| MaterialConversionBill | 修改 | 物料转换单主表 |\n| MaterialConversionItem(转换前) | 新增字段 | 转换前物料明细表 |\n| MaterialConversionItem(转换后) | 修改逻辑 | 转换后物料明细表 |\n| Material(主数据-物料信息) | 查询 | 查询默认工厂/仓库 |\n\n### 字段变更\n\n#### MaterialConversionItem(转换前明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| unit_price | decimal(18,6) | 是 | 无税单价,取采购价的单价 | **新增** |\n| amount | decimal(18,2) | 是 | 无税金额 = unit_price × quantity | **新增** |\n\n#### MaterialConversionBill(主表)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| total_amount | decimal(18,2) | 否 | 转换前合计金额,所有转换前明细的amount之和 | **新增** |\n\n#### MaterialConversionItem(转换后明细)\n\n| 字段 | 类型 | 必填 | 说明 | 来源 |\n|------|------|------|------|------|\n| factory_id | bigint | 推荐 | 默认工厂,从Material默认仓库关联获取 | 现有(逻辑变更) |\n| warehouse_id | bigint | 推荐 | 默认仓库,从Material默认仓库获取 | 现有(逻辑变更) |\n\n## 四、前端规范\n\n### 页面/组件结构\n\n```\nMaterialConversionEdit.vue ← 新增/编辑页(复用)\n ├── ConversionBeforeTable.vue ← 转换前物料表格(改造)\n │ └── (每行新增单价、金额列)\n │ └── ElTableAppendRow ← 合计行\n └── ConversionAfterTable.vue ← 转换后物料表格(改造)\n └── (工厂、仓库自动填充)\n\nMaterialConversionDetail.vue ← 详情页(改造)\n └── ConversionBeforeTableReadonly.vue\n └── ConversionAfterTableReadonly.vue\n```\n\n### 状态定义\n\n```javascript\ndata() {\n return {\n // 转换前物料列表\n beforeItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n unitPrice: 0, // 新增:无税单价\n amount: 0, // 新增:无税金额\n }\n ],\n // 合计金额(计算属性)\n // 转换后物料列表\n afterItems: [\n {\n materialId: null,\n materialName: '',\n specification: '',\n quantity: 0,\n factoryId: null, // 自动填充\n factoryName: '', // 自动填充\n warehouseId: null, // 自动填充\n warehouseName: '', // 自动填充\n }\n ],\n totalAmount: 0, // 转换前合计金额(同步到主表提交)\n }\n},\n\ncomputed: {\n // 转换前合计金额(实时计算)\n beforeTotalAmount() {\n return this.beforeItems.reduce((sum, item) => sum + (item.amount || 0), 0)\n }\n},\n\nwatch: {\n // 单价或数量变化时自动重算金额\n 'beforeItems': {\n handler(items) {\n items.forEach(item => {\n if (item.unitPrice && item.quantity) {\n item.amount = this.$utils.mul(item.unitPrice, item.quantity)\n }\n })\n },\n deep: true\n },\n\n // 转换后物料选择变化时自动带出默认仓库\n 'afterItems': {\n handler(items) {\n items.forEach(item => {\n if (item.materialId) {\n this.fetchDefaultWarehouse(item)\n }\n })\n },\n deep: true\n }\n}\n```\n\n### 交互逻辑\n\n**新建/编辑页 - 转换前表格:**\n1. 新增物料行时,选择物料后自动调用接口查询该物料的采购无税单价\n2. 单价可手动编辑(支持采购价与手工录入并存)\n3. 数量变化或单价变化时,自动计算金额(`金额 = 单价 × 数量`)\n4. 表格底部显示合计行,展示 `总金额 = 所有行金额之和`\n\n**新建/编辑页 - 转换后表格:**\n1. 新增物料行并选择物料后,调用接口查询物料主数据的默认工厂和默认仓库\n2. 工厂和仓库自动填入,且用户可手动修改覆盖\n\n**详情页:**\n- 转换前表格新增「单价」「金额」列,只读展示\n- 底部合计行展示金额合计值\n\n### API 调用\n\n#### 新增/编辑页面\n\n```javascript\n// 1. 获取物料的采购无税单价\nasync fetchPurchasePrice(materialId) {\n this.loadingPrice = true\n try {\n const res = await getPurchasePrice({ materialId })\n // res.data = { unitPrice: 12.500000 }\n return res.data.unitPrice\n } catch (e) {\n this.$message.warning('未查到该物料采购价格,请手动输入')\n return null\n } finally {\n this.loadingPrice = false\n }\n}\n\n// 2. 获取物料默认仓库\nasync fetchDefaultWarehouse(materialId) {\n try {\n const res = await getMaterialDefaultWarehouse({ materialId })\n // res.data = { factoryId: 1, factoryName: '一厂', warehouseId: 10, warehouseName: '原料仓' }\n this.$set(item, 'factoryId', res.data.factoryId)\n this.$set(item, 'factoryName', res.data.factoryName)\n this.$set(item, 'warehouseId', res.data.warehouseId)\n this.$set(item, 'warehouseName', res.data.warehouseName)\n } catch (e) {\n // 无默认仓库时不阻塞,留空让用户手动选\n }\n}\n\n// 3. 保存时提交(核心)\nasync handleSave() {\n const payload = {\n ...this.form,\n beforeItems: this.beforeItems.map(item => ({\n ...item,\n amount: this.$utils.mul(item.unitPrice, item.quantity) // 精度保护\n })),\n afterItems: this.afterItems,\n totalAmount: this.beforeTotalAmount // 合计金额\n }\n // 调用新增/编辑接口\n await saveMaterialConversion(payload)\n}\n```\n\n## 五、后端规范\n\n### 接口定义\n\n| 路径 | 方法 | 说明 | 请求参数 | 响应结构 |\n|------|------|------|----------|----------|\n| /api/v1/material/purchase-price | GET | 查询物料最新采购无税单价 | materialId (Long) | `{ code:0, data:{ unitPrice:12.5 } }` |\n| /api/v1/material/default-warehouse | GET | 查询物料默认工厂和仓库 | materialId (Long) | `{ code:0, data:{ factoryId:1, factoryName:'一厂', warehouseId:10, warehouseName:'原料仓' } }` |\n| /api/v1/material-conversion | POST | 新增物料转换单 | body (见下) | `{ code:0, data:{ id:123 } }` |\n| /api/v1/material-conversion | PUT | 编辑物料转换单 | body (见下) | `{ code:0 }` |\n| /api/v1/material-conversion/{id} | GET | 查询物料转换单详情(需返回单价金额) | id (Long) | `{ code:0, data:{ ... , totalAmount, beforeItems[...], afterItems[...] } }` |\n\n#### POST/PUT body 结构\n```json\n{\n \"billNo\": \"MC20260601001\",\n \"billDate\": \"2026-06-01\",\n \"totalAmount\": 12500.00,\n \"beforeItems\": [\n {\n \"materialId\": 1001,\n \"quantity\": 100,\n \"unitPrice\": 12.500000,\n \"amount\": 1250.00\n }\n ],\n \"afterItems\": [\n {\n \"materialId\": 2001,\n \"quantity\": 100,\n \"factoryId\": 1,\n \"warehouseId\": 10\n }\n ]\n}\n```\n\n### 业务规则\n\n**1. 单价/金额/合计逻辑**\n- 新增转换单时:`amount = unitPrice × quantity`,各明细 amount 之和写入主表 `total_amount`\n- 编辑转换单时:重新计算金额和合计\n- 详情查询时:必须返回 `unitPrice`、`amount`、`totalAmount` 给前端\n\n**2. 默认仓库填充**\n- 新增转换后物料行时,查询 `material` 主表的 `default_warehouse_id`,再关联 `warehouse` 表获取 `factory_id`\n- 如果物料未配置默认仓库,返回空字段,由前端人工选择,不做校验拦截\n\n**3. 金额精度**\n- 单价保留6位小数(decimal(18,6)),金额保留2位小数(decimal(18,2))\n- 计算时使用高精度运算,避免浮点误差\n\n### 异常处理\n\n| 场景 | 处理方式 |\n|------|----------|\n| 物料不存在 | 返回 `{ code: 1001, msg: \"物料不存在\" }` |\n| 转换前明细为空 | 不允许保存,返回 `{ code: 1002, msg: \"转换前物料不能为空\" }` |\n| 转换后明细为空 | 不允许保存,返回 `{ code: 1003, msg: \"转换后物料不能为空\" }` |\n| 单价/金额为负 | 前端校验拦截,后端二次校验返回 `code: 1004` |\n| 采购价格查询无数据 | 返回 `null` 而非报错,由前端提示手动输入 |\n\n## 六、代码框架\n\n### 前端组件骨架(核心改动片段)\n\n```vue\n<!-- MaterialConversionEdit.vue - 改造片段 -->\n<template>\n <div class=\"material-conversion-edit\">\n <!-- 转换前物料表格 -->\n <el-table :data=\"beforeItems\" border show-summary\n :summary-method=\"getBeforeSummaries\">\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"specification\" label=\"规格\" />\n <el-table-column prop=\"quantity\" label=\"数量\" width=\"120\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.quantity\"\n :min=\"0.01\" :precision=\"2\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:单价列 -->\n <el-table-column prop=\"unitPrice\" label=\"单价\" width=\"140\">\n <template slot-scope=\"{ row, $index }\">\n <el-input-number v-model=\"row.unitPrice\"\n :min=\"0\" :precision=\"6\"\n @change=\"recalcRowAmount(row)\" />\n </template>\n </el-table-column>\n <!-- 新增:金额列(只读) -->\n <el-table-column prop=\"amount\" label=\"金额\" width=\"130\">\n <template slot-scope=\"{ row }\">\n {{ $utils.fixAmount(row.amount) }}\n </template>\n </el-table-column>\n </el-table>\n\n <!-- 转换后物料表格 -->\n <el-table :data=\"afterItems\" border>\n <el-table-column prop=\"materialName\" label=\"物料名称\" />\n <el-table-column prop=\"factoryName\" label=\"工厂\" />\n <el-table-column prop=\"warehouseName\" label=\"仓库\" />\n </el-table>\n </div>\n</template>\n\n<script>\nimport { getPurchasePrice, getMaterialDefaultWarehouse, saveMaterialConversion } from '@/api/material'\n\nexport default {\n data() {\n return {\n beforeItems: [],\n afterItems: [],\n id: this.$route.query.id, // 编辑时有 id\n }\n },\n computed: {\n beforeTotalAmount() {\n return this.beforeItems.reduce((s, r) => s + this.$utils.add(s, r.amount), 0)\n }\n },\n methods: {\n // 重算单行金额\n recalcRowAmount(row) {\n row.amount = this.$utils.mul(row.unitPrice, row.quantity)\n },\n // 合计行展示\n getBeforeSummaries({ columns, data }) {\n const sums = []\n columns.forEach((col, i) => {\n if (i === 0) { sums[i] = '合计'; return }\n if (col.property === 'amount') {\n sums[i] = this.$utils.fixAmount(this.beforeTotalAmount)\n } else {\n sums[i] = ''\n }\n })\n return sums\n },\n // 物料选择后获取单价\n async onBeforeMaterialSelect(row) {\n const price = await getPurchasePrice({ materialId: row.materialId })\n if (price !== null && price !== undefined) {\n this.$set(row, 'unitPrice', price)\n this.recalcRowAmount(row)\n } else {\n this.$message.warning('未查到采购单价,请手动输入')\n this.$set(row, 'unitPrice', 0)\n }\n },\n // 物料选择后获取默认仓库\n async onAfterMaterialSelect(row) {\n const wh = await getMaterialDefaultWarehouse({ materialId: row.materialId })\n if (wh) {\n this.$set(row, 'factoryId', wh.factoryId)\n this.$set(row, 'factoryName', wh.factoryName)\n this.$set(row, 'warehouseId', wh.warehouseId)\n this.$set(row, 'warehouseName', wh.warehouseName)\n }\n },\n // 保存\n async handleSave() {\n const payload = {\n id: this.id,\n beforeItems: this.beforeItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n unitPrice: r.unitPrice, amount: r.amount\n })),\n afterItems: this.afterItems.map(r => ({\n materialId: r.materialId, quantity: r.quantity,\n factoryId: r.factoryId, warehouseId: r.warehouseId\n })),\n totalAmount: this.beforeTotalAmount\n }\n await saveMaterialConversion(payload)\n this.$message.success('保存成功')\n this.$router.back()\n }\n },\n async mounted() {\n if (this.id) {\n const res = await getMaterialConversionDetail(this.id)\n this.beforeItems = res.data.beforeItems\n this.afterItems = res.data.afterItems\n // 已有单价/金额/合计无需额外处理\n }\n }\n}\n</script>\n```\n\n### 后端 Service 骨架(Java Spring Boot 示例)\n\n```java\n@Service\n@Slf4j\npublic class MaterialConversionService {\n\n @Autowired\n private MaterialConversionMapper billMapper;\n @Autowired\n private MaterialConversionItemMapper itemMapper;\n @Autowired\n private MaterialMapper materialMapper;\n\n @Transactional(rollbackFor = Exception.class)\n public Long create(MaterialConversionCreateReq req) {\n // 1. 校验\n if (CollectionUtils.isEmpty(req.getBeforeItems())) {\n throw new BizException(1002, \"转换前物料不能为空\");\n }\n if (CollectionUtils.isEmpty(req.getAfterItems())) {\n throw new BizException(1003, \"转换后物料不能为空\");\n }\n\n // 2. 计算金额(二次校验,防止前端篡改)\n BigDecimal calcTotal = BigDecimal.ZERO;\n for (BeforeItemDTO item : req.getBeforeItems()) {\n // amount = unitPrice × quantity(使用高精度乘法)\n BigDecimal amount = item.getUnitPrice()\n .multiply(item.getQuantity())\n .setScale(2, RoundingMode.HALF_UP);\n item.setAmount(amount);\n calcTotal = calcTotal.add(amount);\n }\n\n // 3. 插入主表\n MaterialConversionBill bill = new MaterialConversionBill();\n BeanUtils.copyProperties(req, bill);\n bill.setTotalAmount(calcTotal);\n billMapper.insert(bill);\n\n // 4. 插入转换前明细\n for (BeforeItemDTO item : req.getBeforeItems()) {\n MaterialConversionBeforeItem entity = new MaterialConversionBeforeItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertBefore(entity);\n }\n\n // 5. 插入转换后明细\n for (AfterItemDTO item : req.getAfterItems()) {\n MaterialConversionAfterItem entity = new MaterialConversionAfterItem();\n BeanUtils.copyProperties(item, entity);\n entity.setBillId(bill.getId());\n itemMapper.insertAfter(entity);\n }\n\n return bill.getId();\n }\n\n // 采购单价查询\n public BigDecimal getPurchasePrice(Long materialId) {\n // 从采购入库明细表中取该物料最新一条无税单价\n return billMapper.selectLatestPurchasePrice(materialId);\n }\n\n // 默认仓库查询\n public DefaultWarehouseVO getDefaultWarehouse(Long materialId) {\n Material material = materialMapper.selectById(materialId);\n if (material == null || material.getDefaultWarehouseId() == null) {\n return null;\n }\n Warehouse warehouse = warehouseMapper.selectById(material.getDefaultWarehouseId());\n if (warehouse == null) return null;\n DefaultWarehouseVO vo = new DefaultWarehouseVO();\n vo.setWarehouseId(warehouse.getId());\n vo.setWarehouseName(warehouse.getName());\n vo.setFactoryId(warehouse.getFactoryId());\n vo.setFactoryName(warehouse.getFactoryName());\n return vo;\n }\n}\n```\n\n## 七、注意事项\n- **老项目影响评估**:涉及修改现有表结构,务必确认 `material_conversion_bill` 和 `material_conversion_before_item`(或类似名称)两张表是否存在,确认当前库兼容 `decimal(18,6)` 精度\n- **兼容性**:已有数据查询详情时,`unitPrice` / `amount` / `totalAmount` 字段为 NULL,前端应显示 `-` 或 `0.00`,不可报错\n- **采购价来源**:如果物料存在多批次采购,建议取**最近一次**采购入库的无税单价(按入库时间倒序 LIMIT 1),需确认业务方是否接受\n- **合计行**:纯前端计算,后端 Save/Update 时重新计算覆盖,保证数据一致性,不信任前端传入的 `amount`\n- **无税 vs 含税**:需求明确写\"无税单价/无税金额\",注意和含税字段区分,不可混用\n\n---\n\n这是完整的分析输出。如果那些待澄清问题确认后,我可以进一步细化或有针对性地调整代码骨架。"],"finalPromptText":"[Mon 2026-06-01 16:14 GMT+8] 刚接手的老项目 优化需求\n\"【G5】【维云智造-机械行业】【威玛斯】【库存管理】物料转换\n新增/编辑页面:1.转换前的物料增加“单价”“金额”字段,取该批物料采购时的无税单价和无税金额;转换前的合计金额取此金额的合计值;2.转换后的物料自动带出默认工厂和仓库,数据取自主数据-物料信息中默认的仓库。\n详情:转换前的物料增加“单价”“金额”字段\n\"\n物料转换功能已存在","itemLifecycle":{"startedCount":1,"completedCount":1,"activeCount":0},"toolMetas":[{"toolName":"read","meta":"from ~/.openclaw/workspace/skills/requirements-analyst/SKILL.md"}],"didSendViaMessagingTool":false,"successfulCronAdds":0,"messagingToolSentTexts":[],"messagingToolSentMediaUrls":[],"messagingToolSentTargets":[]}}
|
||
{"traceSchema":"openclaw-trajectory","schemaVersion":1,"traceId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","source":"runtime","type":"session.ended","ts":"2026-06-01T08:15:10.787Z","seq":7,"sourceSeq":14,"sessionId":"5d6bffc4-27e2-45d0-b0a8-c0d01da0e83d","sessionKey":"agent:main:main","runId":"ab1681f4-4b26-42d8-9dc7-686b05588eb4","workspaceDir":"/home/yangxuan/.openclaw/workspace","provider":"deepseek","modelId":"deepseek-v4-flash","modelApi":"openai-completions","data":{"status":"success","aborted":false,"externalAbort":false,"timedOut":false,"idleTimedOut":false,"timedOutDuringCompaction":false,"timedOutDuringToolExecution":false}}
|