[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7C4KB1B8232TPHTXC5A581A":3,"skill-same:01M7C4KB1B8232TPHTXC5A581A":46},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":13,"repositoryHtmlUrl":29,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":31,"install":32,"resources":45},"01M7C4KB1B8232TPHTXC5A581A","taskflow-inbox-triage",null,"Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.","SillyHippy\u002Fzo-skills","SillyHippy","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F159052837?v=4","01M7C43A8PDYMCDPTNFYF2RSC1","01M7C43A9CBS76QPH4PPTKXX54",0,"MIT","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftaskflow-inbox-triage\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: taskflow-inbox-triage\ndescription: Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some waiting on outside answers, and others rolling into a later summary.\nmetadata: { \"openclaw\": { \"emoji\": \"📥\" } }\n---\n\n# TaskFlow inbox triage\n\nThis is a concrete example of how to think about TaskFlow without turning the core runtime into a DSL.\n\n## Goal\n\nTriage inbox items with one owner flow:\n\n- business → post to Slack and wait for reply\n- personal → notify the owner now\n- everything else → keep for end-of-day summary\n\n## Pattern\n\n1. Create one flow for the inbox batch.\n2. Run one detached task to classify new items.\n3. Persist the routing state in `stateJson`.\n4. Move to `waiting` only when an outside reply is required.\n5. Resume the flow when classification or human input completes.\n6. Finish when the batch has been routed.\n\n## Suggested `stateJson` shape\n\n```json\n{\n  \"businessThreads\": [],\n  \"personalItems\": [],\n  \"eodSummary\": []\n}\n```\n\nSuggested `waitJson` when blocked on Slack:\n\n```json\n{\n  \"kind\": \"reply\",\n  \"channel\": \"slack\",\n  \"threadKey\": \"slack:thread-1\"\n}\n```\n\n## Minimal runtime calls\n\n```ts\nconst taskFlow = api.runtime.tasks.flow.fromToolContext(ctx);\n\nconst created = taskFlow.createManaged({\n  controllerId: \"my-plugin\u002Finbox-triage\",\n  goal: \"triage inbox\",\n  currentStep: \"classify\",\n  stateJson: {\n    businessThreads: [],\n    personalItems: [],\n    eodSummary: [],\n  },\n});\n\nconst child = taskFlow.runTask({\n  flowId: created.flowId,\n  runtime: \"acp\",\n  childSessionKey: \"agent:main:subagent:classifier\",\n  task: \"Classify inbox messages\",\n  status: \"running\",\n  startedAt: Date.now(),\n  lastEventAt: Date.now(),\n});\n\nif (!child.created) {\n  throw new Error(child.reason);\n}\n\nconst waiting = taskFlow.setWaiting({\n  flowId: created.flowId,\n  expectedRevision: created.revision,\n  currentStep: \"await_business_reply\",\n  stateJson: {\n    businessThreads: [\"slack:thread-1\"],\n    personalItems: [],\n    eodSummary: [],\n  },\n  waitJson: {\n    kind: \"reply\",\n    channel: \"slack\",\n    threadKey: \"slack:thread-1\",\n  },\n});\n\nif (!waiting.applied) {\n  throw new Error(waiting.code);\n}\n\nconst resumed = taskFlow.resume({\n  flowId: waiting.flow.flowId,\n  expectedRevision: waiting.flow.revision,\n  status: \"running\",\n  currentStep: \"route_items\",\n  stateJson: waiting.flow.stateJson,\n});\n\nif (!resumed.applied) {\n  throw new Error(resumed.code);\n}\n\ntaskFlow.finish({\n  flowId: resumed.flow.flowId,\n  expectedRevision: resumed.flow.revision,\n  stateJson: resumed.flow.stateJson,\n});\n```\n\n## Related example\n\n- `skills\u002Ftaskflow\u002Fexamples\u002Finbox-triage.lobster`\n","# TaskFlow inbox triage\n\nThis is a concrete example of how to think about TaskFlow without turning the core runtime into a DSL.\n\n## Goal\n\nTriage inbox items with one owner flow:\n\n- business → post to Slack and wait for reply\n- personal → notify the owner now\n- everything else → keep for end-of-day summary\n\n## Pattern\n\n1. Create one flow for the inbox batch.\n2. Run one detached task to classify new items.\n3. Persist the routing state in `stateJson`.\n4. Move to `waiting` only when an outside reply is required.\n5. Resume the flow when classification or human input completes.\n6. Finish when the batch has been routed.\n\n## Suggested `stateJson` shape\n\n```json\n{\n  \"businessThreads\": [],\n  \"personalItems\": [],\n  \"eodSummary\": []\n}\n```\n\nSuggested `waitJson` when blocked on Slack:\n\n```json\n{\n  \"kind\": \"reply\",\n  \"channel\": \"slack\",\n  \"threadKey\": \"slack:thread-1\"\n}\n```\n\n## Minimal runtime calls\n\n```ts\nconst taskFlow = api.runtime.tasks.flow.fromToolContext(ctx);\n\nconst created = taskFlow.createManaged({\n  controllerId: \"my-plugin\u002Finbox-triage\",\n  goal: \"triage inbox\",\n  currentStep: \"classify\",\n  stateJson: {\n    businessThreads: [],\n    personalItems: [],\n    eodSummary: [],\n  },\n});\n\nconst child = taskFlow.runTask({\n  flowId: created.flowId,\n  runtime: \"acp\",\n  childSessionKey: \"agent:main:subagent:classifier\",\n  task: \"Classify inbox messages\",\n  status: \"running\",\n  startedAt: Date.now(),\n  lastEventAt: Date.now(),\n});\n\nif (!child.created) {\n  throw new Error(child.reason);\n}\n\nconst waiting = taskFlow.setWaiting({\n  flowId: created.flowId,\n  expectedRevision: created.revision,\n  currentStep: \"await_business_reply\",\n  stateJson: {\n    businessThreads: [\"slack:thread-1\"],\n    personalItems: [],\n    eodSummary: [],\n  },\n  waitJson: {\n    kind: \"reply\",\n    channel: \"slack\",\n    threadKey: \"slack:thread-1\",\n  },\n});\n\nif (!waiting.applied) {\n  throw new Error(waiting.code);\n}\n\nconst resumed = taskFlow.resume({\n  flowId: waiting.flow.flowId,\n  expectedRevision: waiting.flow.revision,\n  status: \"running\",\n  currentStep: \"route_items\",\n  stateJson: waiting.flow.stateJson,\n});\n\nif (!resumed.applied) {\n  throw new Error(resumed.code);\n}\n\ntaskFlow.finish({\n  flowId: resumed.flow.flowId,\n  expectedRevision: resumed.flow.revision,\n  stateJson: resumed.flow.stateJson,\n});\n```\n\n## Related example\n\n- `skills\u002Ftaskflow\u002Fexamples\u002Finbox-triage.lobster`\n",{"name":5,"metadata":23,"description":7},{"openclaw":24},{"emoji":25},"📥","main","3641543f81ae80504027d6b012e0dadce4e2de40","skills\u002Ftaskflow-inbox-triage","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills","https:\u002F\u002Fgithub.com\u002FSillyHippy","2026-09-18 11:42:22",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add SillyHippy\u002Fzo-skills --skill taskflow-inbox-triage",{"tool":38,"command":39},"bunx","bunx skills add SillyHippy\u002Fzo-skills --skill taskflow-inbox-triage",{"tool":41,"command":42},"pnpm","pnpm dlx skills add SillyHippy\u002Fzo-skills --skill taskflow-inbox-triage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftaskflow-inbox-triage\u002FSKILL.md",true,[],[47,54,61,68,75,82],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":18},"01M7C4RK2ZCHPKQT393RVSC6ER","zopack","Export and import zo.space route setups as shareable .zopack.md files. Use when the user wants to package their zo.space routes for sharing, or when they receive a .zopack.md file to deploy. Triggers on \"export my zo.space\", \"create a zopack\", \"import this zopack\", or any mention of .zopack.md files.","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzopack\u002FSKILL.md",[],[],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":18},"01M7C4REH5EJ22X3C1SF88X6KQ","zoho-mail-inbox","Full inbox management for Zoho Mail (info@justlegalsolutions.org) — list unread, mark all as read, delete by sender\u002Fkeyword, search, send from aliases, list folders. Fully self-contained — zero setup needed.","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzoho-mail-inbox\u002FSKILL.md",[],[],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":18},"01M7C4RAJF1N9R8ZRT25GMHFBF","weekly-meeting-reminder","Get an email every Sunday evening listing your meetings for the coming week.","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzo-weekly-meeting-reminder\u002FSKILL.md",[],[],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":18},"01M7C4R65Q9T6TPBRFQPWJSW4Z","twitter","Let Zo use your X (Twitter) account","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzo-twitter\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":18},"01M7C4R358YM59EZRM3SW763VK","zo-tools","Internal process tools for Zo and Hermes — local search, document processing, OCR, and embeddings. All services run on localhost, zero HTTP slots consumed.","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzo-tools\u002FSKILL.md",[],[],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":18},"01M7C4R0J4C3RQWKZ5W5W3CZ3X","ssh-setup","Sets up secure remote access to your Zo Computer so you can connect from anywhere","https:\u002F\u002Fgithub.com\u002FSillyHippy\u002Fzo-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzo-ssh-setup\u002FSKILL.md",[],[]]