@jiggai/kitchen 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +1 -1
- package/.next/server/app/channels.segments/_full.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.html +1 -1
- package/.next/server/app/cron-jobs.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +1 -1
- package/.next/server/app/goals/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +1 -1
- package/.next/server/app/goals.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tickets.html +1 -1
- package/.next/server/app/tickets.rsc +2 -2
- package/.next/server/app/tickets.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tickets.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/_index.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/tickets/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/tickets.segment.rsc +1 -1
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js +1 -1
- package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1ce21af6dfb18ee3.js +1 -0
- package/package.json +2 -1
- package/src/app/api/recipes/clone/route.ts +2 -2
- package/src/app/api/settings/cron-installation/route.ts +34 -20
- package/src/app/settings/settings-client.tsx +4 -2
- package/.next/static/chunks/1faff0d40127675e.js +0 -1
- /package/.next/static/{uZkSG3UgZ81MwaAQa74zD → 2hgbnJUmLMe9COlc5rJd3}/_buildManifest.js +0 -0
- /package/.next/static/{uZkSG3UgZ81MwaAQa74zD → 2hgbnJUmLMe9COlc5rJd3}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{uZkSG3UgZ81MwaAQa74zD → 2hgbnJUmLMe9COlc5rJd3}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
2:I[57915,["/_next/static/chunks/40f7fde35327d214.js","/_next/static/chunks/de9e30e86ef31e72.js"],"TicketsBoardClient"]
|
|
3
3
|
5:I[97367,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"OutletBoundary"]
|
|
4
4
|
6:"$Sreact.suspense"
|
|
5
|
-
0:{"buildId":"uZkSG3UgZ81MwaAQa74zD","rsc":["$","$1","c",{"children":[["$","$L2",null,{"tickets":[{"number":0,"id":"0000-example-ticket.testing-verified","title":"verification — 0000-example-ticket","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0000-example-ticket.testing-verified.md","updatedAt":"2026-02-11T14:04:42.617Z","ageHours":255.0081160205078},{"number":1,"id":"0001-claw-kitchen-ui-update-design-to-match-mission-control-style","title":"Claw Kitchen UI Update Design To Match Mission Control Style","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0001-claw-kitchen-ui-update-design-to-match-mission-control-style.md","updatedAt":"2026-02-12T22:03:10.186Z","ageHours":223.0337916201443},{"number":1,"id":"0001-completion-report","title":"0001 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0001-completion-report.md","updatedAt":"2026-02-10T17:32:43.000Z","ageHours":275.5413433333333},{"number":2,"id":"0002-p1-push-clawcipes-repo-tags-to-github-and-publish-latest-ver","title":"P1 Push Clawcipes Repo Tags To Github And Publish Latest Ver","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0002-p1-push-clawcipes-repo-tags-to-github-and-publish-latest-ver.md","updatedAt":"2026-02-10T17:37:50.000Z","ageHours":275.45606555555554},{"number":3,"id":"0003-completion-report","title":"— completion report (docs consistency)","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0003-completion-report.md","updatedAt":"2026-02-11T12:09:35.808Z","ageHours":256.9266743059625},{"number":3,"id":"0003-p1-docs-consistency-pass-ensure-docs-reflect-testing-stage-d","title":"P1 Docs Consistency Pass Ensure Docs Reflect Testing Stage D","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0003-p1-docs-consistency-pass-ensure-docs-reflect-testing-stage-d.md","updatedAt":"2026-02-11T12:09:21.480Z","ageHours":256.930654559394},{"number":4,"id":"0004-completion-report","title":"0004 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0004-completion-report.md","updatedAt":"2026-02-11T00:41:13.000Z","ageHours":268.39967666666666},{"number":4,"id":"0004-p1-scaffold-sanity-verify-generated-team-md-and-tickets-md-m","title":"P1 Scaffold Sanity Verify Generated Team MD And Tickets MD M","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0004-p1-scaffold-sanity-verify-generated-team-md-and-tickets-md-m.md","updatedAt":"2026-02-11T01:07:17.000Z","ageHours":267.9652322222222},{"number":5,"id":"0005-p2-add-handoff-command-move-ticket-to-testing-assign-to-test","title":"P2 Add Handoff Command Move Ticket To Testing Assign To Test","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0005-p2-add-handoff-command-move-ticket-to-testing-assign-to-test.md","updatedAt":"2026-02-11T12:37:19.211Z","ageHours":256.4646184495714},{"number":6,"id":"0006-p2-add-automated-tests-for-recipes-plugin-core-behaviors-age","title":"P2 Add Automated Tests For Recipes Plugin Core Behaviors Age","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0006-p2-add-automated-tests-for-recipes-plugin-core-behaviors-age.md","updatedAt":"2026-02-11T13:09:39.453Z","ageHours":255.925662193061},{"number":7,"id":"0007-p2-hardening-better-errors-ensure-work-testing-is-created-mi","title":"P2 Hardening Better Errors Ensure Work Testing Is Created Mi","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0007-p2-hardening-better-errors-ensure-work-testing-is-created-mi.md","updatedAt":"2026-02-11T13:41:04.958Z","ageHours":255.4019109442817},{"number":8,"id":"0008-completion-report","title":"— completion report (QA checklist + verification workflow)","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0008-completion-report.md","updatedAt":"2026-02-11T14:04:00.364Z","ageHours":255.01985372517905},{"number":8,"id":"0008-p1-qa-checklist-template-for-tester-define-verification-step","title":"P1 Qa Checklist Template For Tester Define Verification Step","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0008-p1-qa-checklist-template-for-tester-define-verification-step.md","updatedAt":"2026-02-11T14:03:46.156Z","ageHours":255.02380036722818},{"number":9,"id":"0009-completion-report","title":"0009 — Completion Report (Option A: recipe-defined cron jobs)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-completion-report.md","updatedAt":"2026-02-10T20:26:16.000Z","ageHours":272.6488436111111},{"number":9,"id":"0009-implement-recipe-defined-cron-jobs-option-a-requirements-rec","title":"Implement Recipe Defined Cron Jobs Option A Requirements Rec","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-implement-recipe-defined-cron-jobs-option-a-requirements-rec.md","updatedAt":"2026-02-10T19:48:28.000Z","ageHours":273.2788436111111},{"number":9,"id":"0009-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-pr-body.md","updatedAt":"2026-02-10T19:10:48.000Z","ageHours":273.9066216666667},{"number":10,"id":"0010-implement-shared-context-best-practices-across-team-agents-w","title":"Implement Shared Context Best Practices Across Team Agents W","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-implement-shared-context-best-practices-across-team-agents-w.md","updatedAt":"2026-02-11T00:35:17.000Z","ageHours":268.49856611111113},{"number":10,"id":"0010-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-pr-body.md","updatedAt":"2026-02-11T01:31:44.000Z","ageHours":267.5577327777778},{"number":10,"id":"0010-testing-verified","title":"Implement Shared Context Best Practices Across Team Agents W","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-testing-verified.md","updatedAt":"2026-02-11T01:07:17.000Z","ageHours":267.96523277777777},{"number":11,"id":"0011-add-cron-jobs-management-to-kitchen-ui-context-we-re-adding-","title":"Add Cron Jobs Management To Kitchen UI Context We Re Adding","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-add-cron-jobs-management-to-kitchen-ui-context-we-re-adding-.md","updatedAt":"2026-02-11T02:41:27.000Z","ageHours":266.3957883333333},{"number":11,"id":"0011-completion-report","title":"#0011 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-completion-report.md","updatedAt":"2026-02-11T02:41:34.000Z","ageHours":266.3938438888889},{"number":11,"id":"0011-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-pr-body.md","updatedAt":"2026-02-11T02:38:19.000Z","ageHours":266.4480105555556},{"number":12,"id":"0012-add-lightweight-automated-scaffold-output-regression-test-fo","title":"Add Lightweight Automated Scaffold Output Regression Test Fo","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0012-add-lightweight-automated-scaffold-output-regression-test-fo.md","updatedAt":"2026-02-11T12:06:05.022Z","ageHours":256.9852267245144},{"number":12,"id":"0012-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0012-pr-body.md","updatedAt":"2026-02-11T12:05:26.648Z","ageHours":256.99588610317653},{"number":13,"id":"0013-add-proper-test-harness-vitest-jest-for-clawcipes-recipes-co","title":"Add Proper Test Harness Vitest Jest For Clawcipes Recipes Co","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0013-add-proper-test-harness-vitest-jest-for-clawcipes-recipes-co.md","updatedAt":"2026-02-11T14:37:41.152Z","ageHours":254.4585238337538},{"number":14,"id":"0014-completion-report","title":"0014 — Completion Report (P0)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0014-completion-report.md","updatedAt":"2026-02-11T04:05:04.000Z","ageHours":265.0021772222222},{"number":14,"id":"0014-fix-kitchen-settings-and-plugin-schema","title":"— Fix Kitchen Settings Page + Plugin Schema","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0014-fix-kitchen-settings-and-plugin-schema.md","updatedAt":"2026-02-11T04:05:14.000Z","ageHours":264.99939944444446},{"number":15,"id":"0015-add-automatic-cleanup-for-scaffold-test-workspaces-we-accumu","title":"Add Automatic Cleanup For Scaffold Test Workspaces We Accumu","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0015-add-automatic-cleanup-for-scaffold-test-workspaces-we-accumu.md","updatedAt":"2026-02-11T17:44:51.366Z","ageHours":251.33902014709471},{"number":16,"id":"0016-add-tasks-to-update-the-other-builtin-team-recipes-product-t","title":"Add Tasks To Update The Other Builtin Team Recipes Product T","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0016-add-tasks-to-update-the-other-builtin-team-recipes-product-t.md","updatedAt":"2026-02-11T18:31:30.386Z","ageHours":250.56151461771648},{"number":16,"id":"0016-completion-report","title":"— completion report (breakdown + inventory)","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0016-completion-report.md","updatedAt":"2026-02-11T18:06:05.741Z","ageHours":250.98502722391765},{"number":17,"id":"0017-p2-parity-baseline-add-cronjobs-frontmatter-to-built-in-team-recipes","title":"P2 Parity Baseline Add Cronjobs Frontmatter To Built In Team Recipes","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0017-p2-parity-baseline-add-cronjobs-frontmatter-to-built-in-team-recipes.md","updatedAt":"2026-02-11T22:07:53.117Z","ageHours":246.95520044406467},{"number":18,"id":"0018-p2-update-product-team-recipe-parity-status-cron-role-templates","title":"P2 Update Product Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0018-p2-update-product-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T22:31:50.629Z","ageHours":246.5558915311686},{"number":19,"id":"0019-p2-update-research-team-recipe-parity-status-cron-role-templates","title":"P2 Update Research Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0019-p2-update-research-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T22:32:53.164Z","ageHours":246.53852080315485},{"number":20,"id":"0020-p2-update-writing-team-recipe-parity-status-cron-role-templates","title":"P2 Update Writing Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0020-p2-update-writing-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T23:02:15.923Z","ageHours":246.04886552564832},{"number":21,"id":"0021-p2-update-social-team-recipe-parity-status-cron-role-templates","title":"P2 Update Social Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0021-p2-update-social-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T23:32:35.506Z","ageHours":245.5434258397081},{"number":22,"id":"0022-p2-update-customer-support-team-recipe-parity-status-cron-role-templates","title":"P2 Update Customer Support Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0022-p2-update-customer-support-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-12T00:05:15.352Z","ageHours":244.99902414964464},{"number":23,"id":"0023-move-g-009-into-backlog-build-clawcipes-public-website-marke","title":"Move G 009 Into Backlog Build Clawcipes Public Website Marke","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0023-move-g-009-into-backlog-build-clawcipes-public-website-marke.md","updatedAt":"2026-02-13T03:37:22.043Z","ageHours":217.46383234334309},{"number":24,"id":"0024-clawkitchen-ui-update-layout-to-resemble-mission-control-top","title":"Clawkitchen UI Update Layout To Resemble Mission Control Top","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0024-clawkitchen-ui-update-layout-to-resemble-mission-control-top.md","updatedAt":"2026-02-12T22:37:39.721Z","ageHours":222.45892168436686},{"number":26,"id":"0026-add-openclaw-recipes-remove-team-uninstall-cleanup","title":"Add Openclaw Recipes Remove Team Uninstall Cleanup","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0026-add-openclaw-recipes-remove-team-uninstall-cleanup.md","updatedAt":"2026-02-13T03:41:13.146Z","ageHours":217.39963689927842},{"number":27,"id":"0027-build-clawcipes-marketplace-backend-registry-search-install","title":"Build Clawcipes Marketplace Backend Registry Search Install","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0027-build-clawcipes-marketplace-backend-registry-search-install.md","updatedAt":"2026-02-13T01:04:35.458Z","ageHours":220.01010619418673},{"number":28,"id":"0028-kitchen-board-move-test","title":"Kitchen Board Move Test","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0028-kitchen-board-move-test.md","updatedAt":"2026-02-13T01:34:04.270Z","ageHours":219.5187693758138},{"number":29,"id":"0029-update-documentation-ui-copy-to-replace-clawcipes-branding-w","title":"Update Documentation UI Copy To Replace Clawcipes Branding W","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0029-update-documentation-ui-copy-to-replace-clawcipes-branding-w.md","updatedAt":"2026-02-13T04:34:21.431Z","ageHours":216.51400245557997},{"number":30,"id":"0030-clawkitchen-v2-requirements-1-home-page-remove-middle-pill-m","title":"Clawkitchen V2 Requirements 1 Home Page Remove Middle Pill M","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0030-clawkitchen-v2-requirements-1-home-page-remove-middle-pill-m.md","updatedAt":"2026-02-14T04:38:30.630Z","ageHours":192.44478069044325},{"number":31,"id":"0031-release-push-ship-remove-team-clawrecipes-rebrand-steps-merg","title":"Release Push Ship Remove Team Clawrecipes Rebrand Steps Merg","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0031-release-push-ship-remove-team-clawrecipes-rebrand-steps-merg.md","updatedAt":"2026-02-13T12:39:32.240Z","ageHours":208.427666687283},{"number":32,"id":"0032-fix-recipes-clawrecipes-plugin-to-avoid-openclaw-dangerous-c","title":"Fix Recipes Clawrecipes Plugin To Avoid Openclaw Dangerous C","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0032-fix-recipes-clawrecipes-plugin-to-avoid-openclaw-dangerous-c.md","updatedAt":"2026-02-13T19:34:27.517Z","ageHours":201.51231205674912},{"number":33,"id":"0033-publish-no-warning-package-name-jiggai-recipes-for-clawrecip","title":"Publish No Warning Package Name Jiggai Recipes For Clawrecip","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0033-publish-no-warning-package-name-jiggai-recipes-for-clawrecip.md","updatedAt":"2026-02-14T04:43:41.501Z","ageHours":192.35842757914224},{"number":34,"id":"0034-fix-openclaw-install-warning-plugin-recipes-has-suspicious-c","title":"Fix Openclaw Install Warning Plugin Recipes Has Suspicious C","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0034-fix-openclaw-install-warning-plugin-recipes-has-suspicious-c.md","updatedAt":"2026-02-14T04:49:43.975Z","ageHours":192.25774038397896},{"number":35,"id":"0035-finish-g-008-clawrecipes-close-remaining-gaps-ensure-missing","title":"Finish G 008 Clawrecipes Close Remaining Gaps Ensure Missing","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0035-finish-g-008-clawrecipes-close-remaining-gaps-ensure-missing.md","updatedAt":"2026-02-14T04:05:56.098Z","ageHours":192.98770617940266},{"number":36,"id":"0036-clawkitchen-team-editor-save-semantics-bugs-clarify-and-fix-","title":"Clawkitchen Team Editor Save Semantics Bugs Clarify And Fix","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0036-clawkitchen-team-editor-save-semantics-bugs-clarify-and-fix-.md","updatedAt":"2026-02-14T12:08:12.549Z","ageHours":184.94980300008137},{"number":37,"id":"0037-clawkitchen-lock-builtin-source-team-recipes-in-team-editor-","title":"Clawkitchen Lock Builtin Source Team Recipes In Team Editor","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0037-clawkitchen-lock-builtin-source-team-recipes-in-team-editor-.md","updatedAt":"2026-02-14T14:33:51.475Z","ageHours":182.52232367723252},{"number":38,"id":"0038-clawkitchen-files-tab-too-many-missing-files-shown-for-some-","title":"Clawkitchen Files Tab Too Many Missing Files Shown For Some","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0038-clawkitchen-files-tab-too-many-missing-files-shown-for-some-.md","updatedAt":"2026-02-14T13:03:58.817Z","ageHours":184.02028447557237},{"number":39,"id":"0039-completion-report","title":"Completion Report","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0039-completion-report.md","updatedAt":"2026-02-14T12:35:11.929Z","ageHours":184.49997552137586},{"number":40,"id":"0040-clawkitchen-ui-polish-show-team-agent-display-names-identity","title":"Clawkitchen UI Polish Show Team Agent Display Names Identity","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0040-clawkitchen-ui-polish-show-team-agent-display-names-identity.md","updatedAt":"2026-02-14T15:02:41.805Z","ageHours":182.0416765798611},{"number":41,"id":"0041-clawkitchen-ui-align-team-recipe-agent-editing-home-page-beh","title":"Clawkitchen UI Align Team Recipe Agent Editing Home Page Beh","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0041-clawkitchen-ui-align-team-recipe-agent-editing-home-page-beh.md","updatedAt":"2026-02-14T18:03:27.193Z","ageHours":179.02906899902345},{"number":42,"id":"0042-clawkitchen-persist-team-provenance-parent-recipe-and-lock-i","title":"Clawkitchen Persist Team Provenance Parent Recipe And Lock I","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0042-clawkitchen-persist-team-provenance-parent-recipe-and-lock-i.md","updatedAt":"2026-02-14T20:35:41.025Z","ageHours":176.49189364624024},{"number":43,"id":"0043-root-cause-fix-scaffold-team-must-persist-team-provenance-pa","title":"Root Cause Fix Scaffold Team Must Persist Team Provenance Pa","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0043-root-cause-fix-scaffold-team-must-persist-team-provenance-pa.md","updatedAt":"2026-02-14T20:03:08.642Z","ageHours":177.03422212917752},{"number":44,"id":"0044-implement-new-scaffold-team-behavior-create-workspace-recipe","title":"Implement New Scaffold Team Behavior Create Workspace Recipe","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0044-implement-new-scaffold-team-behavior-create-workspace-recipe.md","updatedAt":"2026-02-15T02:05:28.542Z","ageHours":170.99536102783202},{"number":45,"id":"0045-clawmarket-get-started-page-add-real-screenshots-of-user-pro","title":"Clawmarket Get Started Page Add Real Screenshots Of User Pro","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0045-clawmarket-get-started-page-add-real-screenshots-of-user-pro.md","updatedAt":"2026-02-15T20:33:07.943Z","ageHours":152.53441652567545},{"number":46,"id":"0046-extend-recipes-scaffold-single-agent-to-also-create-a-worksp","title":"Extend Recipes Scaffold Single Agent To Also Create A Worksp","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0046-extend-recipes-scaffold-single-agent-to-also-create-a-worksp.md","updatedAt":"2026-02-15T20:04:33.329Z","ageHours":153.01069818006727},{"number":47,"id":"0047-overnight-propose-15-20-specialty-agents-business-focused-us","title":"Overnight Propose 15 20 Specialty Agents Business Focused Us","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0047-overnight-propose-15-20-specialty-agents-business-focused-us.md","updatedAt":"2026-02-15T21:11:10.265Z","ageHours":151.9004381878662},{"number":48,"id":"0048-expand-specialty-agent-catalog-beyond-generic-business-creat","title":"Expand Specialty Agent Catalog Beyond Generic Business Creat","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0048-expand-specialty-agent-catalog-beyond-generic-business-creat.md","updatedAt":"2026-02-15T22:34:15.032Z","ageHours":150.51578067782933},{"number":49,"id":"0049-marketplace-add-login-auth-to-clawkitchen-ai-marketplace-cla","title":"Marketplace Add Login Auth To Clawkitchen Ai Marketplace Cla","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0049-marketplace-add-login-auth-to-clawkitchen-ai-marketplace-cla.md","updatedAt":"2026-02-17T22:21:54.459Z","ageHours":102.72149525743272},{"number":50,"id":"0050-marketplace-add-recipe-submissions-ugc-flow-to-clawkitchen-a","title":"Marketplace Add Recipe Submissions Ugc Flow To Clawkitchen A","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0050-marketplace-add-recipe-submissions-ugc-flow-to-clawkitchen-a.md","updatedAt":"2026-02-19T03:06:49.980Z","ageHours":73.97273941636827},{"number":51,"id":"0051-clawkitchen-add-goals-feature-scope-ui-page-route-for-goals-","title":"Clawkitchen Add Goals Feature Scope UI Page Route For Goals","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0051-clawkitchen-add-goals-feature-scope-ui-page-route-for-goals-.md","updatedAt":"2026-02-17T02:09:16.383Z","ageHours":122.93207194240993},{"number":52,"id":"0052-create-a-new-bundled-team-recipe-marketing-team-add-5-roles-","title":"Create A New Bundled Team Recipe Marketing Team Add 5 Roles","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0052-create-a-new-bundled-team-recipe-marketing-team-add-5-roles-.md","updatedAt":"2026-02-16T23:30:56.819Z","ageHours":125.57084008273654},{"number":53,"id":"0053-expand-social-marketing-team-recipe-add-roles-for-1-social-m","title":"Expand Social Marketing Team Recipe Add Roles For 1 Social M","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0053-expand-social-marketing-team-recipe-add-roles-for-1-social-m.md","updatedAt":"2026-02-16T23:36:50.412Z","ageHours":125.47261964124891},{"number":54,"id":"0054-implement-team-recipe-template-standardization-across-bundle","title":"Implement Team Recipe Template Standardization Across Bundle","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0054-implement-team-recipe-template-standardization-across-bundle.md","updatedAt":"2026-02-16T23:36:50.418Z","ageHours":125.47261797458225},{"number":55,"id":"0055-ship-reliable-lead-wake-up-after-dispatch-enable-triage-auto","title":"Ship Reliable Lead Wake Up After Dispatch Enable Triage Auto","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0055-ship-reliable-lead-wake-up-after-dispatch-enable-triage-auto.md","updatedAt":"2026-02-17T02:09:18.105Z","ageHours":122.93159389071994},{"number":56,"id":"0056-publish-or-sync-the-jiggai-recipes-extension-so-openclaw-rec","title":"Publish Or Sync The Jiggai Recipes Extension So Openclaw Rec","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0056-publish-or-sync-the-jiggai-recipes-extension-so-openclaw-rec.md","updatedAt":"2026-02-16T23:36:50.423Z","ageHours":125.47261658569336},{"number":57,"id":"0057-publish-jiggai-recipes-bump-version-and-revert-local-link","title":"Publish Jiggai Recipes Bump Version And Revert Local Link","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0057-publish-jiggai-recipes-bump-version-and-revert-local-link.md","updatedAt":"2026-02-17T10:05:22.639Z","ageHours":114.99700113762749},{"number":58,"id":"0058-clawkitchen-add-channels-section-for-channel-bindings-crud","title":"Clawkitchen Add Channels Section For Channel Bindings Crud","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0058-clawkitchen-add-channels-section-for-channel-bindings-crud.md","updatedAt":"2026-02-17T06:07:01.696Z","ageHours":118.96948535698785},{"number":63,"id":"0063-clawkitchen-clone-should-scaffold-or-copy-workspace-files","title":"Clawkitchen Clone Should Scaffold Or Copy Workspace Files","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0063-clawkitchen-clone-should-scaffold-or-copy-workspace-files.md","updatedAt":"2026-02-20T00:32:58.746Z","ageHours":52.53697141567654},{"number":64,"id":"0064-clawmarket-recipe-detail-page-defaults-ugc","title":"Clawmarket Recipe Detail Page Defaults Ugc","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0064-clawmarket-recipe-detail-page-defaults-ugc.md","updatedAt":"2026-02-19T23:27:43.645Z","ageHours":53.62449949883355},{"number":65,"id":"0065-working-ticket-deep-review-clawrecipes-pr-35-after-fixes-rol","title":"Working Ticket Deep Review Clawrecipes PR 35 After Fixes Rol","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0065-working-ticket-deep-review-clawrecipes-pr-35-after-fixes-rol.md","updatedAt":"2026-02-18T00:06:07.038Z","ageHours":100.98466804233126},{"number":66,"id":"0066-clawmarket-replace-login-logout-button-with-profile-photo-dr","title":"Clawmarket Replace Login Logout Button With Profile Photo Dr","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0066-clawmarket-replace-login-logout-button-with-profile-photo-dr.md","updatedAt":"2026-02-19T23:40:53.761Z","ageHours":53.40502269422743},{"number":67,"id":"0067-rj-update-2026-02-18-1-mailgun-url-env-added-2-captcha-site-","title":"Rj Update 2026 02 18 1 Mailgun Url Env Added 2 Captcha Site","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0067-rj-update-2026-02-18-1-mailgun-url-env-added-2-captcha-site-.md","updatedAt":"2026-02-18T21:58:03.930Z","ageHours":79.11886467753092},{"number":68,"id":"0068-epic-update-builtin-development-team-team-recipe-to-match-cu","title":"Epic Update Builtin Development Team Team Recipe To Match Cu","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0068-epic-update-builtin-development-team-team-recipe-to-match-cu.md","updatedAt":"2026-02-19T23:39:43.547Z","ageHours":53.42452703016493},{"number":69,"id":"0069-split-from-0068-sync-builtin-development-team-role-templates","title":"Split From 0068 Sync Builtin Development Team Role Templates","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0069-split-from-0068-sync-builtin-development-team-role-templates.md","updatedAt":"2026-02-19T00:02:43.833Z","ageHours":77.04111406243219},{"number":70,"id":"0070-split-from-0068-cron-job-pack-inventory-product-decision-for","title":"Split From 0068 Cron Job Pack Inventory Product Decision For","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0070-split-from-0068-cron-job-pack-inventory-product-decision-for.md","updatedAt":"2026-02-18T22:32:14.886Z","ageHours":78.54915503485786},{"number":71,"id":"0071-split-from-0068-implement-cron-job-installation-for-builtin-","title":"Split From 0068 Implement Cron Job Installation For Builtin","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0071-split-from-0068-implement-cron-job-installation-for-builtin-.md","updatedAt":"2026-02-19T02:33:33.833Z","ageHours":74.52722527723525},{"number":72,"id":"0072-publish-a-new-jiggai-recipes-extension-release-that-includes","title":"Publish A New Jiggai Recipes Extension Release That Includes","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0072-publish-a-new-jiggai-recipes-extension-release-that-includes.md","updatedAt":"2026-02-19T23:39:29.457Z","ageHours":53.428440897216795},{"number":73,"id":"0073-clawmarket-recipe-detail-source-panel-white-bg-and-button-sizing","title":"Clawmarket Recipe Detail Source Panel White Bg And Button Sizing","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0073-clawmarket-recipe-detail-source-panel-white-bg-and-button-sizing.md","updatedAt":"2026-02-20T03:05:09.250Z","ageHours":50.0007204755995},{"number":74,"id":"0074-clawmarket-admin-users-section-list-users","title":"Clawmarket Admin Users Section List Users","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0074-clawmarket-admin-users-section-list-users.md","updatedAt":"2026-02-20T03:05:10.951Z","ageHours":50.00024797837999},{"number":75,"id":"0075-clawkitchen-ux-overhaul-for-recipe-team-agent-flows-release-","title":"Clawkitchen UX Overhaul For Recipe Team Agent Flows Release","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0075-clawkitchen-ux-overhaul-for-recipe-team-agent-flows-release-.md","updatedAt":"2026-02-20T21:33:24.777Z","ageHours":31.529740873548718},{"number":76,"id":"0076-fix-recipes-tickets-cli-config-workspace-default","title":"Fix Recipes Tickets CLI Config Workspace Default","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0076-fix-recipes-tickets-cli-config-workspace-default.md","updatedAt":"2026-02-20T22:38:13.327Z","ageHours":30.449588108859594}]}],["$L3"],"$L4"]}],"loading":null,"isPartial":false}
|
|
5
|
+
0:{"buildId":"2hgbnJUmLMe9COlc5rJd3","rsc":["$","$1","c",{"children":[["$","$L2",null,{"tickets":[{"number":0,"id":"0000-example-ticket.testing-verified","title":"verification — 0000-example-ticket","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0000-example-ticket.testing-verified.md","updatedAt":"2026-02-11T14:04:42.617Z","ageHours":294.53064213161895},{"number":1,"id":"0001-claw-kitchen-ui-update-design-to-match-mission-control-style","title":"Claw Kitchen UI Update Design To Match Mission Control Style","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0001-claw-kitchen-ui-update-design-to-match-mission-control-style.md","updatedAt":"2026-02-12T22:03:10.186Z","ageHours":262.5563174534777},{"number":1,"id":"0001-completion-report","title":"0001 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0001-completion-report.md","updatedAt":"2026-02-10T17:32:43.000Z","ageHours":315.0638691666667},{"number":2,"id":"0002-p1-push-clawcipes-repo-tags-to-github-and-publish-latest-ver","title":"P1 Push Clawcipes Repo Tags To Github And Publish Latest Ver","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0002-p1-push-clawcipes-repo-tags-to-github-and-publish-latest-ver.md","updatedAt":"2026-02-10T17:37:50.000Z","ageHours":314.9785913888889},{"number":3,"id":"0003-completion-report","title":"— completion report (docs consistency)","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0003-completion-report.md","updatedAt":"2026-02-11T12:09:35.808Z","ageHours":296.4492001392958},{"number":3,"id":"0003-p1-docs-consistency-pass-ensure-docs-reflect-testing-stage-d","title":"P1 Docs Consistency Pass Ensure Docs Reflect Testing Stage D","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0003-p1-docs-consistency-pass-ensure-docs-reflect-testing-stage-d.md","updatedAt":"2026-02-11T12:09:21.480Z","ageHours":296.45318039272735},{"number":4,"id":"0004-completion-report","title":"0004 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0004-completion-report.md","updatedAt":"2026-02-11T00:41:13.000Z","ageHours":307.9222025},{"number":4,"id":"0004-p1-scaffold-sanity-verify-generated-team-md-and-tickets-md-m","title":"P1 Scaffold Sanity Verify Generated Team MD And Tickets MD M","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0004-p1-scaffold-sanity-verify-generated-team-md-and-tickets-md-m.md","updatedAt":"2026-02-11T01:07:17.000Z","ageHours":307.48775805555556},{"number":5,"id":"0005-p2-add-handoff-command-move-ticket-to-testing-assign-to-test","title":"P2 Add Handoff Command Move Ticket To Testing Assign To Test","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0005-p2-add-handoff-command-move-ticket-to-testing-assign-to-test.md","updatedAt":"2026-02-11T12:37:19.211Z","ageHours":295.98714428290475},{"number":6,"id":"0006-p2-add-automated-tests-for-recipes-plugin-core-behaviors-age","title":"P2 Add Automated Tests For Recipes Plugin Core Behaviors Age","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0006-p2-add-automated-tests-for-recipes-plugin-core-behaviors-age.md","updatedAt":"2026-02-11T13:09:39.453Z","ageHours":295.4481880263943},{"number":7,"id":"0007-p2-hardening-better-errors-ensure-work-testing-is-created-mi","title":"P2 Hardening Better Errors Ensure Work Testing Is Created Mi","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0007-p2-hardening-better-errors-ensure-work-testing-is-created-mi.md","updatedAt":"2026-02-11T13:41:04.958Z","ageHours":294.924436777615},{"number":8,"id":"0008-completion-report","title":"— completion report (QA checklist + verification workflow)","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0008-completion-report.md","updatedAt":"2026-02-11T14:04:00.364Z","ageHours":294.5423795585124},{"number":8,"id":"0008-p1-qa-checklist-template-for-tester-define-verification-step","title":"P1 Qa Checklist Template For Tester Define Verification Step","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0008-p1-qa-checklist-template-for-tester-define-verification-step.md","updatedAt":"2026-02-11T14:03:46.156Z","ageHours":294.5463262005615},{"number":9,"id":"0009-completion-report","title":"0009 — Completion Report (Option A: recipe-defined cron jobs)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-completion-report.md","updatedAt":"2026-02-10T20:26:16.000Z","ageHours":312.17136944444445},{"number":9,"id":"0009-implement-recipe-defined-cron-jobs-option-a-requirements-rec","title":"Implement Recipe Defined Cron Jobs Option A Requirements Rec","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-implement-recipe-defined-cron-jobs-option-a-requirements-rec.md","updatedAt":"2026-02-10T19:48:28.000Z","ageHours":312.80136944444445},{"number":9,"id":"0009-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0009-pr-body.md","updatedAt":"2026-02-10T19:10:48.000Z","ageHours":313.42914722222224},{"number":10,"id":"0010-implement-shared-context-best-practices-across-team-agents-w","title":"Implement Shared Context Best Practices Across Team Agents W","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-implement-shared-context-best-practices-across-team-agents-w.md","updatedAt":"2026-02-11T00:35:17.000Z","ageHours":308.0210916666667},{"number":10,"id":"0010-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-pr-body.md","updatedAt":"2026-02-11T01:31:44.000Z","ageHours":307.08025833333335},{"number":10,"id":"0010-testing-verified","title":"Implement Shared Context Best Practices Across Team Agents W","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0010-testing-verified.md","updatedAt":"2026-02-11T01:07:17.000Z","ageHours":307.48775861111113},{"number":11,"id":"0011-add-cron-jobs-management-to-kitchen-ui-context-we-re-adding-","title":"Add Cron Jobs Management To Kitchen UI Context We Re Adding","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-add-cron-jobs-management-to-kitchen-ui-context-we-re-adding-.md","updatedAt":"2026-02-11T02:41:27.000Z","ageHours":305.9183141666667},{"number":11,"id":"0011-completion-report","title":"#0011 — Completion Report","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-completion-report.md","updatedAt":"2026-02-11T02:41:34.000Z","ageHours":305.9163697222222},{"number":11,"id":"0011-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0011-pr-body.md","updatedAt":"2026-02-11T02:38:19.000Z","ageHours":305.9705363888889},{"number":12,"id":"0012-add-lightweight-automated-scaffold-output-regression-test-fo","title":"Add Lightweight Automated Scaffold Output Regression Test Fo","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0012-add-lightweight-automated-scaffold-output-regression-test-fo.md","updatedAt":"2026-02-11T12:06:05.022Z","ageHours":296.50775255784777},{"number":12,"id":"0012-pr-body","title":"(untitled)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0012-pr-body.md","updatedAt":"2026-02-11T12:05:26.648Z","ageHours":296.5184119365099},{"number":13,"id":"0013-add-proper-test-harness-vitest-jest-for-clawcipes-recipes-co","title":"Add Proper Test Harness Vitest Jest For Clawcipes Recipes Co","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0013-add-proper-test-harness-vitest-jest-for-clawcipes-recipes-co.md","updatedAt":"2026-02-11T14:37:41.152Z","ageHours":293.9810496670871},{"number":14,"id":"0014-completion-report","title":"0014 — Completion Report (P0)","owner":null,"stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0014-completion-report.md","updatedAt":"2026-02-11T04:05:04.000Z","ageHours":304.52470305555556},{"number":14,"id":"0014-fix-kitchen-settings-and-plugin-schema","title":"— Fix Kitchen Settings Page + Plugin Schema","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0014-fix-kitchen-settings-and-plugin-schema.md","updatedAt":"2026-02-11T04:05:14.000Z","ageHours":304.52192527777777},{"number":15,"id":"0015-add-automatic-cleanup-for-scaffold-test-workspaces-we-accumu","title":"Add Automatic Cleanup For Scaffold Test Workspaces We Accumu","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0015-add-automatic-cleanup-for-scaffold-test-workspaces-we-accumu.md","updatedAt":"2026-02-11T17:44:51.366Z","ageHours":290.8615457026503},{"number":16,"id":"0016-add-tasks-to-update-the-other-builtin-team-recipes-product-t","title":"Add Tasks To Update The Other Builtin Team Recipes Product T","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0016-add-tasks-to-update-the-other-builtin-team-recipes-product-t.md","updatedAt":"2026-02-11T18:31:30.386Z","ageHours":290.084040173272},{"number":16,"id":"0016-completion-report","title":"— completion report (breakdown + inventory)","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0016-completion-report.md","updatedAt":"2026-02-11T18:06:05.741Z","ageHours":290.50755305725096},{"number":17,"id":"0017-p2-parity-baseline-add-cronjobs-frontmatter-to-built-in-team-recipes","title":"P2 Parity Baseline Add Cronjobs Frontmatter To Built In Team Recipes","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0017-p2-parity-baseline-add-cronjobs-frontmatter-to-built-in-team-recipes.md","updatedAt":"2026-02-11T22:07:53.117Z","ageHours":286.477726277398},{"number":18,"id":"0018-p2-update-product-team-recipe-parity-status-cron-role-templates","title":"P2 Update Product Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0018-p2-update-product-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T22:31:50.629Z","ageHours":286.07841736450195},{"number":19,"id":"0019-p2-update-research-team-recipe-parity-status-cron-role-templates","title":"P2 Update Research Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0019-p2-update-research-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T22:32:53.164Z","ageHours":286.0610466364882},{"number":20,"id":"0020-p2-update-writing-team-recipe-parity-status-cron-role-templates","title":"P2 Update Writing Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0020-p2-update-writing-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T23:02:15.923Z","ageHours":285.57139135898166},{"number":21,"id":"0021-p2-update-social-team-recipe-parity-status-cron-role-templates","title":"P2 Update Social Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0021-p2-update-social-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-11T23:32:35.506Z","ageHours":285.06595167304147},{"number":22,"id":"0022-p2-update-customer-support-team-recipe-parity-status-cron-role-templates","title":"P2 Update Customer Support Team Recipe Parity Status Cron Role Templates","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0022-p2-update-customer-support-team-recipe-parity-status-cron-role-templates.md","updatedAt":"2026-02-12T00:05:15.352Z","ageHours":284.521549982978},{"number":23,"id":"0023-move-g-009-into-backlog-build-clawcipes-public-website-marke","title":"Move G 009 Into Backlog Build Clawcipes Public Website Marke","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0023-move-g-009-into-backlog-build-clawcipes-public-website-marke.md","updatedAt":"2026-02-13T03:37:22.043Z","ageHours":256.9863584544542},{"number":24,"id":"0024-clawkitchen-ui-update-layout-to-resemble-mission-control-top","title":"Clawkitchen UI Update Layout To Resemble Mission Control Top","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0024-clawkitchen-ui-update-layout-to-resemble-mission-control-top.md","updatedAt":"2026-02-12T22:37:39.721Z","ageHours":261.98144779547795},{"number":26,"id":"0026-add-openclaw-recipes-remove-team-uninstall-cleanup","title":"Add Openclaw Recipes Remove Team Uninstall Cleanup","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0026-add-openclaw-recipes-remove-team-uninstall-cleanup.md","updatedAt":"2026-02-13T03:41:13.146Z","ageHours":256.92216301038957},{"number":27,"id":"0027-build-clawcipes-marketplace-backend-registry-search-install","title":"Build Clawcipes Marketplace Backend Registry Search Install","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0027-build-clawcipes-marketplace-backend-registry-search-install.md","updatedAt":"2026-02-13T01:04:35.458Z","ageHours":259.5326320275201},{"number":28,"id":"0028-kitchen-board-move-test","title":"Kitchen Board Move Test","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0028-kitchen-board-move-test.md","updatedAt":"2026-02-13T01:34:04.270Z","ageHours":259.0412952091471},{"number":29,"id":"0029-update-documentation-ui-copy-to-replace-clawcipes-branding-w","title":"Update Documentation UI Copy To Replace Clawcipes Branding W","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0029-update-documentation-ui-copy-to-replace-clawcipes-branding-w.md","updatedAt":"2026-02-13T04:34:21.431Z","ageHours":256.0365282889133},{"number":30,"id":"0030-clawkitchen-v2-requirements-1-home-page-remove-middle-pill-m","title":"Clawkitchen V2 Requirements 1 Home Page Remove Middle Pill M","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0030-clawkitchen-v2-requirements-1-home-page-remove-middle-pill-m.md","updatedAt":"2026-02-14T04:38:30.630Z","ageHours":231.96730652377659},{"number":31,"id":"0031-release-push-ship-remove-team-clawrecipes-rebrand-steps-merg","title":"Release Push Ship Remove Team Clawrecipes Rebrand Steps Merg","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0031-release-push-ship-remove-team-clawrecipes-rebrand-steps-merg.md","updatedAt":"2026-02-13T12:39:32.240Z","ageHours":247.95019252061633},{"number":32,"id":"0032-fix-recipes-clawrecipes-plugin-to-avoid-openclaw-dangerous-c","title":"Fix Recipes Clawrecipes Plugin To Avoid Openclaw Dangerous C","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0032-fix-recipes-clawrecipes-plugin-to-avoid-openclaw-dangerous-c.md","updatedAt":"2026-02-13T19:34:27.517Z","ageHours":241.03483789008246},{"number":33,"id":"0033-publish-no-warning-package-name-jiggai-recipes-for-clawrecip","title":"Publish No Warning Package Name Jiggai Recipes For Clawrecip","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0033-publish-no-warning-package-name-jiggai-recipes-for-clawrecip.md","updatedAt":"2026-02-14T04:43:41.501Z","ageHours":231.88095341247558},{"number":34,"id":"0034-fix-openclaw-install-warning-plugin-recipes-has-suspicious-c","title":"Fix Openclaw Install Warning Plugin Recipes Has Suspicious C","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0034-fix-openclaw-install-warning-plugin-recipes-has-suspicious-c.md","updatedAt":"2026-02-14T04:49:43.975Z","ageHours":231.7802662173123},{"number":35,"id":"0035-finish-g-008-clawrecipes-close-remaining-gaps-ensure-missing","title":"Finish G 008 Clawrecipes Close Remaining Gaps Ensure Missing","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0035-finish-g-008-clawrecipes-close-remaining-gaps-ensure-missing.md","updatedAt":"2026-02-14T04:05:56.098Z","ageHours":232.51023229051378},{"number":36,"id":"0036-clawkitchen-team-editor-save-semantics-bugs-clarify-and-fix-","title":"Clawkitchen Team Editor Save Semantics Bugs Clarify And Fix","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0036-clawkitchen-team-editor-save-semantics-bugs-clarify-and-fix-.md","updatedAt":"2026-02-14T12:08:12.549Z","ageHours":224.4723291111925},{"number":37,"id":"0037-clawkitchen-lock-builtin-source-team-recipes-in-team-editor-","title":"Clawkitchen Lock Builtin Source Team Recipes In Team Editor","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0037-clawkitchen-lock-builtin-source-team-recipes-in-team-editor-.md","updatedAt":"2026-02-14T14:33:51.475Z","ageHours":222.04484978834364},{"number":38,"id":"0038-clawkitchen-files-tab-too-many-missing-files-shown-for-some-","title":"Clawkitchen Files Tab Too Many Missing Files Shown For Some","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0038-clawkitchen-files-tab-too-many-missing-files-shown-for-some-.md","updatedAt":"2026-02-14T13:03:58.817Z","ageHours":223.5428103089057},{"number":39,"id":"0039-completion-report","title":"Completion Report","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0039-completion-report.md","updatedAt":"2026-02-14T12:35:11.929Z","ageHours":224.0225013547092},{"number":40,"id":"0040-clawkitchen-ui-polish-show-team-agent-display-names-identity","title":"Clawkitchen UI Polish Show Team Agent Display Names Identity","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0040-clawkitchen-ui-polish-show-team-agent-display-names-identity.md","updatedAt":"2026-02-14T15:02:41.805Z","ageHours":221.56420241319444},{"number":41,"id":"0041-clawkitchen-ui-align-team-recipe-agent-editing-home-page-beh","title":"Clawkitchen UI Align Team Recipe Agent Editing Home Page Beh","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0041-clawkitchen-ui-align-team-recipe-agent-editing-home-page-beh.md","updatedAt":"2026-02-14T18:03:27.193Z","ageHours":218.55159483235678},{"number":42,"id":"0042-clawkitchen-persist-team-provenance-parent-recipe-and-lock-i","title":"Clawkitchen Persist Team Provenance Parent Recipe And Lock I","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0042-clawkitchen-persist-team-provenance-parent-recipe-and-lock-i.md","updatedAt":"2026-02-14T20:35:41.025Z","ageHours":216.0144192017958},{"number":43,"id":"0043-root-cause-fix-scaffold-team-must-persist-team-provenance-pa","title":"Root Cause Fix Scaffold Team Must Persist Team Provenance Pa","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0043-root-cause-fix-scaffold-team-must-persist-team-provenance-pa.md","updatedAt":"2026-02-14T20:03:08.642Z","ageHours":216.55674768473307},{"number":44,"id":"0044-implement-new-scaffold-team-behavior-create-workspace-recipe","title":"Implement New Scaffold Team Behavior Create Workspace Recipe","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0044-implement-new-scaffold-team-behavior-create-workspace-recipe.md","updatedAt":"2026-02-15T02:05:28.542Z","ageHours":210.5178865833876},{"number":45,"id":"0045-clawmarket-get-started-page-add-real-screenshots-of-user-pro","title":"Clawmarket Get Started Page Add Real Screenshots Of User Pro","owner":"devops","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0045-clawmarket-get-started-page-add-real-screenshots-of-user-pro.md","updatedAt":"2026-02-15T20:33:07.943Z","ageHours":192.056942081231},{"number":46,"id":"0046-extend-recipes-scaffold-single-agent-to-also-create-a-worksp","title":"Extend Recipes Scaffold Single Agent To Also Create A Worksp","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0046-extend-recipes-scaffold-single-agent-to-also-create-a-worksp.md","updatedAt":"2026-02-15T20:04:33.329Z","ageHours":192.53322373562284},{"number":47,"id":"0047-overnight-propose-15-20-specialty-agents-business-focused-us","title":"Overnight Propose 15 20 Specialty Agents Business Focused Us","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0047-overnight-propose-15-20-specialty-agents-business-focused-us.md","updatedAt":"2026-02-15T21:11:10.265Z","ageHours":191.42296374342178},{"number":48,"id":"0048-expand-specialty-agent-catalog-beyond-generic-business-creat","title":"Expand Specialty Agent Catalog Beyond Generic Business Creat","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0048-expand-specialty-agent-catalog-beyond-generic-business-creat.md","updatedAt":"2026-02-15T22:34:15.032Z","ageHours":190.03830651116266},{"number":49,"id":"0049-marketplace-add-login-auth-to-clawkitchen-ai-marketplace-cla","title":"Marketplace Add Login Auth To Clawkitchen Ai Marketplace Cla","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0049-marketplace-add-login-auth-to-clawkitchen-ai-marketplace-cla.md","updatedAt":"2026-02-17T22:21:54.459Z","ageHours":142.24402109076607},{"number":50,"id":"0050-marketplace-add-recipe-submissions-ugc-flow-to-clawkitchen-a","title":"Marketplace Add Recipe Submissions Ugc Flow To Clawkitchen A","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0050-marketplace-add-recipe-submissions-ugc-flow-to-clawkitchen-a.md","updatedAt":"2026-02-23T00:42:42.790Z","ageHours":19.897262508680555},{"number":51,"id":"0051-clawkitchen-add-goals-feature-scope-ui-page-route-for-goals-","title":"Clawkitchen Add Goals Feature Scope UI Page Route For Goals","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0051-clawkitchen-add-goals-feature-scope-ui-page-route-for-goals-.md","updatedAt":"2026-02-17T02:09:16.383Z","ageHours":162.45459777574328},{"number":52,"id":"0052-create-a-new-bundled-team-recipe-marketing-team-add-5-roles-","title":"Create A New Bundled Team Recipe Marketing Team Add 5 Roles","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0052-create-a-new-bundled-team-recipe-marketing-team-add-5-roles-.md","updatedAt":"2026-02-16T23:30:56.819Z","ageHours":165.0933656382921},{"number":53,"id":"0053-expand-social-marketing-team-recipe-add-roles-for-1-social-m","title":"Expand Social Marketing Team Recipe Add Roles For 1 Social M","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0053-expand-social-marketing-team-recipe-add-roles-for-1-social-m.md","updatedAt":"2026-02-16T23:36:50.412Z","ageHours":164.99514519680446},{"number":54,"id":"0054-implement-team-recipe-template-standardization-across-bundle","title":"Implement Team Recipe Template Standardization Across Bundle","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0054-implement-team-recipe-template-standardization-across-bundle.md","updatedAt":"2026-02-16T23:36:50.418Z","ageHours":164.9951435301378},{"number":55,"id":"0055-ship-reliable-lead-wake-up-after-dispatch-enable-triage-auto","title":"Ship Reliable Lead Wake Up After Dispatch Enable Triage Auto","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0055-ship-reliable-lead-wake-up-after-dispatch-enable-triage-auto.md","updatedAt":"2026-02-17T02:09:18.105Z","ageHours":162.4541194462755},{"number":56,"id":"0056-publish-or-sync-the-jiggai-recipes-extension-so-openclaw-rec","title":"Publish Or Sync The Jiggai Recipes Extension So Openclaw Rec","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0056-publish-or-sync-the-jiggai-recipes-extension-so-openclaw-rec.md","updatedAt":"2026-02-16T23:36:50.423Z","ageHours":164.99514214124892},{"number":57,"id":"0057-publish-jiggai-recipes-bump-version-and-revert-local-link","title":"Publish Jiggai Recipes Bump Version And Revert Local Link","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0057-publish-jiggai-recipes-bump-version-and-revert-local-link.md","updatedAt":"2026-02-17T10:05:22.639Z","ageHours":154.51952669318305},{"number":58,"id":"0058-clawkitchen-add-channels-section-for-channel-bindings-crud","title":"Clawkitchen Add Channels Section For Channel Bindings Crud","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0058-clawkitchen-add-channels-section-for-channel-bindings-crud.md","updatedAt":"2026-02-17T06:07:01.696Z","ageHours":158.4920109125434},{"number":63,"id":"0063-clawkitchen-clone-should-scaffold-or-copy-workspace-files","title":"Clawkitchen Clone Should Scaffold Or Copy Workspace Files","owner":"test","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0063-clawkitchen-clone-should-scaffold-or-copy-workspace-files.md","updatedAt":"2026-02-23T05:34:13.905Z","ageHours":15.038619379136827},{"number":64,"id":"0064-clawmarket-recipe-detail-page-defaults-ugc","title":"Clawmarket Recipe Detail Page Defaults Ugc","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0064-clawmarket-recipe-detail-page-defaults-ugc.md","updatedAt":"2026-02-23T00:43:00.621Z","ageHours":19.892309764065214},{"number":65,"id":"0065-working-ticket-deep-review-clawrecipes-pr-35-after-fixes-rol","title":"Working Ticket Deep Review Clawrecipes PR 35 After Fixes Rol","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0065-working-ticket-deep-review-clawrecipes-pr-35-after-fixes-rol.md","updatedAt":"2026-02-23T06:32:10.609Z","ageHours":14.07286874098036},{"number":66,"id":"0066-marketplace-ugc-submissions-ui-moderation-followup","title":"Marketplace Ugc Submissions UI Moderation Followup","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0066-marketplace-ugc-submissions-ui-moderation-followup.md","updatedAt":"2026-02-23T16:49:26.479Z","ageHours":3.7851270166015625},{"number":67,"id":"0067-rj-update-2026-02-18-1-mailgun-url-env-added-2-captcha-site-","title":"Rj Update 2026 02 18 1 Mailgun Url Env Added 2 Captcha Site","owner":"lead","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0067-rj-update-2026-02-18-1-mailgun-url-env-added-2-captcha-site-.md","updatedAt":"2026-02-23T06:04:04.301Z","ageHours":14.541287561102973},{"number":77,"id":"0077-archive-assignment-stubs-on-ticket-completion","title":"Archive Assignment Stubs On Ticket Completion","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0077-archive-assignment-stubs-on-ticket-completion.md","updatedAt":"2026-02-23T00:08:45.774Z","ageHours":20.463100671454537},{"number":78,"id":"0078-assignment-archive-smoke","title":"Assignment Archive Smoke","owner":"dev","stage":"done","file":"/home/control/.openclaw/workspace-development-team/work/done/0078-assignment-archive-smoke.md","updatedAt":"2026-02-23T00:13:09.415Z","ageHours":20.38986704820421},{"number":79,"id":"0079-add-two-new-top-level-menu-items-in-clawkitchen-ui-clawkitch","title":"Add Two New Top Level Menu Items In Clawkitchen UI Clawkitch","owner":"lead","stage":"in-progress","file":"/home/control/.openclaw/workspace-development-team/work/in-progress/0079-add-two-new-top-level-menu-items-in-clawkitchen-ui-clawkitch.md","updatedAt":"2026-02-23T20:32:16.794Z","ageHours":0.07114826775444878},{"number":80,"id":"0080-enhance-clawmarket-recipe-detail-pages-marketplace-recipes-s","title":"Enhance Clawmarket Recipe Detail Pages Marketplace Recipes S","owner":"lead","stage":"backlog","file":"/home/control/.openclaw/workspace-development-team/work/backlog/0080-enhance-clawmarket-recipe-detail-pages-marketplace-recipes-s.md","updatedAt":"2026-02-23T19:48:28.355Z","ageHours":0.8012698964436848}]}],["$L3"],"$L4"]}],"loading":null,"isPartial":false}
|
|
6
6
|
3:["$","script","script-0",{"src":"/_next/static/chunks/de9e30e86ef31e72.js","async":true}]
|
|
7
7
|
4:["$","$L5",null,{"children":["$","$6",null,{"name":"Next.MetadataOutlet","children":"$@7"}]}]
|
|
8
8
|
7:null
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[39756,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
|
|
3
3
|
3:I[37457,["/_next/static/chunks/ff1a16fafef87110.js","/_next/static/chunks/d2be314c3ece3fbe.js"],"default"]
|
|
4
|
-
0:{"buildId":"
|
|
4
|
+
0:{"buildId":"2hgbnJUmLMe9COlc5rJd3","rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"loading":null,"isPartial":false}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module.exports=[59494,e=>{"use strict";function t(){let e=globalThis.__clawkitchen_api;if(!e)throw Error("ClawKitchen: OpenClaw plugin API not available. (This should only happen if Kitchen is started outside the gateway process.)");return e}e.s(["getKitchenApi",()=>t])},5003,e=>{"use strict";var t=e.i(59494);async function r(e){let r=(0,t.getKitchenApi)();try{let t=await r.runtime.system.runCommandWithTimeout(["openclaw",...e],{timeoutMs:12e4}),n=String(t.stdout??""),a=String(t.stderr??""),i="number"==typeof t.exitCode?t.exitCode:"number"==typeof t.code?t.code:"number"==typeof t.status?t.status:0;if(0!==i)return{ok:!1,exitCode:i,stdout:n,stderr:a};return{ok:!0,exitCode:0,stdout:n,stderr:a}}catch(t){let e="number"==typeof t.code?t.code:1;return{ok:!1,exitCode:e,stdout:"string"==typeof t.stdout?t.stdout:"",stderr:"string"==typeof t.stderr?t.stderr:"string"==typeof t.message?t.message:String(t)}}}e.s(["runOpenClaw",()=>r])},70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},12714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},7367,e=>{"use strict";var t=e.i(12714),r=e.i(60526),n=e.i(50227);async function a(){let e=n.default.join(r.default.homedir(),".openclaw","openclaw.json");return JSON.parse(await t.default.readFile(e,"utf8"))}async function i(){let e=await a(),t=e.agents?.defaults?.workspace;if(!t)throw Error("agents.defaults.workspace is not set in ~/.openclaw/openclaw.json");return t}async function o(){let e=await i();return n.default.join(e,"recipes")}async function s(){let e=await i();return n.default.join(e,"notes","goals")}async function l(e){let t=r.default.homedir();if(!t)throw Error("Could not resolve home directory");return n.default.join(t,".openclaw",`workspace-${e}`)}async function d(){let e=await a(),t=e.plugins?.installs?.recipes?.installPath||e.plugins?.installs?.recipes?.sourcePath||e.plugins?.load?.paths?.[0];if(!t)throw Error("Could not determine recipes plugin install path from ~/.openclaw/openclaw.json");return n.default.join(t,"recipes","default")}e.s(["getBuiltinRecipesDir",()=>d,"getTeamWorkspaceDir",()=>l,"getWorkspaceDir",()=>i,"getWorkspaceGoalsDir",()=>s,"getWorkspaceRecipesDir",()=>o,"readOpenClawConfig",()=>a])},5365,(e,t,r)=>{t.exports=e.x("process",()=>require("process"))},874,(e,t,r)=>{t.exports=e.x("buffer",()=>require("buffer"))},72420,e=>{"use strict";var t=e.i(47909),r=e.i(74017),n=e.i(96250),a=e.i(59756),i=e.i(61916),o=e.i(74677),s=e.i(69741),l=e.i(16795),d=e.i(87718),u=e.i(95169),p=e.i(47587),c=e.i(66012),f=e.i(70101),h=e.i(26937),m=e.i(10372),x=e.i(93695);e.i(52474);var g=e.i(220),w=e.i(12714),R=e.i(50227),v=e.i(23008),y=e.i(89171),C=e.i(7367),E=e.i(5003);async function k(e){let t=await e.json(),r=String(t.fromId??"").trim(),n=String(t.toId??"").trim(),a="string"==typeof t.toName?t.toName:void 0,i=!!t.overwrite,o=!!t.scaffold;if(!r)return y.NextResponse.json({ok:!1,error:"Missing fromId"},{status:400});if(!n)return y.NextResponse.json({ok:!1,error:"Missing toId"},{status:400});let s=await (0,E.runOpenClaw)(["recipes","show",r]);if(!s.ok)return y.NextResponse.json({ok:!1,error:s.stderr.trim()||`openclaw recipes show ${r} failed (exit=${s.exitCode}). Is the recipes plugin enabled?`},{status:400});let l=String(s.stdout??"");if(!l.startsWith("---\n"))throw Error("Recipe markdown must start with YAML frontmatter (---)");let d=l.indexOf("\n---\n",4);if(-1===d)throw Error("Recipe frontmatter not terminated (---)");let u=l.slice(4,d+1),p=v.default.parse(u)??{},c=String(p.kind??"").trim().toLowerCase(),f={...p,id:n,...a?{name:a}:{},..."team"===c?{team:{..."object"==typeof p.team&&p.team?p.team:{},teamId:n}}:{}},h=v.default.stringify(f).trimEnd(),m=`---
|
|
2
2
|
${h}
|
|
3
3
|
---
|
|
4
|
-
${l.slice(d+5)}`;function x(e){let t=String(e||"recipe").trim();return[`custom-${t}`,`my-${t}`,`${t}-2`,`${t}-alt`]}let g=await (0,C.getWorkspaceRecipesDir)(),k=R.default.join(g,`${n}.md`);try{if(await w.default.stat(k),!i)return y.NextResponse.json({ok:!1,error:`Recipe id already exists: ${n}. Choose a different id (e.g. ${x(n).join(", ")}).`,code:"RECIPE_ID_TAKEN",recipeId:n,suggestions:x(n),filePath:k},{status:409})}catch{}await w.default.mkdir(R.default.dirname(k),{recursive:!0}),await w.default.writeFile(k,m,"utf8");let b=null;if(o){let e="team"===c?["recipes","scaffold-team",n,"--team-id",n,"--overwrite"]:"agent"===c?["recipes","scaffold",n,"--agent-id",n,"--overwrite"]:null;if(e){let t=await (0,E.runOpenClaw)(e);b=t.ok?{ok:!0,stdout:String(t.stdout??""),stderr:String(t.stderr??""),exitCode:t.exitCode}:{ok:!1,error:t.stderr.trim()||`openclaw ${e.join(" ")} failed (exit=${t.exitCode})`,stdout:String(t.stdout??""),stderr:String(t.stderr??""),exitCode:t.exitCode}}else b={ok:!1,error:`Unsupported recipe kind for scaffold: ${c||"(missing kind)"}`,stdout:"",stderr:"",exitCode:null}}return y.NextResponse.json({ok:!0,filePath:k,recipeId:n,content:m,scaffold:b})}e.s(["POST",()=>k],78983);var b=e.i(78983);let j=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/recipes/clone/route",pathname:"/api/recipes/clone",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/recipes/clone/route.ts",nextConfigOutput:"standalone",userland:b}),{workAsyncStorage:A,workUnitAsyncStorage:S,serverHooks:N}=j;function T(){return(0,n.patchFetch)({workAsyncStorage:A,workUnitAsyncStorage:S})}async function O(e,t,n){j.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/recipes/clone/route";w=w.replace(/\/index$/,"")||"/";let R=await j.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!R)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:v,params:y,nextConfig:C,parsedUrl:E,isDraftMode:k,prerenderManifest:b,routerServerContext:A,isOnDemandRevalidate:S,revalidateOnlyGenerated:N,resolvedPathname:T,clientReferenceManifest:O,serverActionsManifest:P}=R,I=(0,s.normalizeAppPath)(w),q=!!(b.dynamicRoutes[I]||b.routes[T]),_=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,E,!1):t.end("This page could not be found"),null);if(q&&!k){let e=!!b.routes[T],t=b.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(C.experimental.adapterPath)return await _();throw new x.NoFallbackError}}let $=null;!q||j.isDev||k||($="/index"===($=T)?"/":$);let D=!0===j.isDev||!q,H=q&&!D;P&&O&&(0,o.setManifestsSingleton)({page:w,clientReferenceManifest:O,serverActionsManifest:P});let U=e.method||"GET",M=(0,i.getTracer)(),K=M.getActiveScopeSpan(),F={params:y,prerenderManifest:b,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts},cacheComponents:!!C.cacheComponents,supportsDynamicResponse:D,incrementalCache:(0,a.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:C.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,a)=>j.onRequestError(e,t,n,a,A)},sharedContext:{buildId:v}},W=new l.NodeNextRequest(e),L=new l.NodeNextResponse(t),B=d.NextRequestAdapter.fromNodeNextRequest(W,(0,d.signalFromNodeResponse)(t));try{let o=async e=>j.handle(B,F).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=M.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${U} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t)}else e.updateName(`${U} ${w}`)}),s=!!(0,a.getRequestMeta)(e,"minimalMode"),l=async a=>{var i,l;let d=async({previousCacheEntry:r})=>{try{if(!s&&S&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let i=await o(a);e.fetchMetrics=F.renderOpts.fetchMetrics;let l=F.renderOpts.pendingWaitUntil;l&&n.waitUntil&&(n.waitUntil(l),l=void 0);let d=F.renderOpts.collectedTags;if(!q)return await (0,c.sendResponse)(W,L,i,F.renderOpts.pendingWaitUntil),null;{let e=await i.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(i.headers);d&&(t[m.NEXT_CACHE_TAGS_HEADER]=d),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==F.renderOpts.collectedRevalidate&&!(F.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&F.renderOpts.collectedRevalidate,n=void 0===F.renderOpts.collectedExpire||F.renderOpts.collectedExpire>=m.INFINITE_CACHE?void 0:F.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:i.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await j.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:S})},!1,A),t}},u=await j.handleResponse({req:e,nextConfig:C,cacheKey:$,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:N,responseGenerator:d,waitUntil:n.waitUntil,isMinimalMode:s});if(!q)return null;if((null==u||null==(i=u.value)?void 0:i.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(l=u.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});s||t.setHeader("x-nextjs-cache",S?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),k&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let x=(0,f.fromNodeOutgoingHttpHeaders)(u.value.headers);return s&&q||x.delete(m.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||x.get("Cache-Control")||x.set("Cache-Control",(0,h.getCacheControlHeader)(u.cacheControl)),await (0,c.sendResponse)(W,L,new Response(u.value.body,{headers:x,status:u.value.status||200})),null};K?await l(K):await M.withPropagatedContext(e.headers,()=>M.trace(u.BaseServerSpan.handleRequest,{spanName:`${U} ${w}`,kind:i.SpanKind.SERVER,attributes:{"http.method":U,"http.target":e.url}},l))}catch(t){if(t instanceof x.NoFallbackError||await j.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:S})},!1,A),q)throw t;return await (0,c.sendResponse)(W,L,new Response(null,{status:500})),null}}e.s(["handler",()=>O,"patchFetch",()=>T,"routeModule",()=>j,"serverHooks",()=>N,"workAsyncStorage",()=>A,"workUnitAsyncStorage",()=>S],72420)}];
|
|
4
|
+
${l.slice(d+5)}`;function x(e){let t=String(e||"recipe").trim();return[`custom-${t}`,`my-${t}`,`${t}-2`,`${t}-alt`]}let g=await (0,C.getWorkspaceRecipesDir)(),k=R.default.join(g,`${n}.md`);try{if(await w.default.stat(k),!i)return y.NextResponse.json({ok:!1,error:`Recipe id already exists: ${n}. Choose a different id (e.g. ${x(n).join(", ")}).`,code:"RECIPE_ID_TAKEN",recipeId:n,suggestions:x(n),filePath:k},{status:409})}catch{}await w.default.mkdir(R.default.dirname(k),{recursive:!0}),await w.default.writeFile(k,m,"utf8");let b=null;if(o){let e="team"===c?["recipes","scaffold-team",n,"--team-id",n,"--overwrite","--overwrite-recipe"]:"agent"===c?["recipes","scaffold",n,"--agent-id",n,"--overwrite","--overwrite-recipe"]:null;if(e){let t=await (0,E.runOpenClaw)(e);b=t.ok?{ok:!0,stdout:String(t.stdout??""),stderr:String(t.stderr??""),exitCode:t.exitCode}:{ok:!1,error:t.stderr.trim()||`openclaw ${e.join(" ")} failed (exit=${t.exitCode})`,stdout:String(t.stdout??""),stderr:String(t.stderr??""),exitCode:t.exitCode}}else b={ok:!1,error:`Unsupported recipe kind for scaffold: ${c||"(missing kind)"}`,stdout:"",stderr:"",exitCode:null}}return y.NextResponse.json({ok:!0,filePath:k,recipeId:n,content:m,scaffold:b})}e.s(["POST",()=>k],78983);var b=e.i(78983);let j=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/recipes/clone/route",pathname:"/api/recipes/clone",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/recipes/clone/route.ts",nextConfigOutput:"standalone",userland:b}),{workAsyncStorage:A,workUnitAsyncStorage:S,serverHooks:N}=j;function T(){return(0,n.patchFetch)({workAsyncStorage:A,workUnitAsyncStorage:S})}async function O(e,t,n){j.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/recipes/clone/route";w=w.replace(/\/index$/,"")||"/";let R=await j.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!R)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:v,params:y,nextConfig:C,parsedUrl:E,isDraftMode:k,prerenderManifest:b,routerServerContext:A,isOnDemandRevalidate:S,revalidateOnlyGenerated:N,resolvedPathname:T,clientReferenceManifest:O,serverActionsManifest:P}=R,I=(0,s.normalizeAppPath)(w),q=!!(b.dynamicRoutes[I]||b.routes[T]),_=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,E,!1):t.end("This page could not be found"),null);if(q&&!k){let e=!!b.routes[T],t=b.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(C.experimental.adapterPath)return await _();throw new x.NoFallbackError}}let $=null;!q||j.isDev||k||($="/index"===($=T)?"/":$);let D=!0===j.isDev||!q,H=q&&!D;P&&O&&(0,o.setManifestsSingleton)({page:w,clientReferenceManifest:O,serverActionsManifest:P});let U=e.method||"GET",M=(0,i.getTracer)(),K=M.getActiveScopeSpan(),F={params:y,prerenderManifest:b,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts},cacheComponents:!!C.cacheComponents,supportsDynamicResponse:D,incrementalCache:(0,a.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:C.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,a)=>j.onRequestError(e,t,n,a,A)},sharedContext:{buildId:v}},W=new l.NodeNextRequest(e),L=new l.NodeNextResponse(t),B=d.NextRequestAdapter.fromNodeNextRequest(W,(0,d.signalFromNodeResponse)(t));try{let o=async e=>j.handle(B,F).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=M.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==u.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${U} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t)}else e.updateName(`${U} ${w}`)}),s=!!(0,a.getRequestMeta)(e,"minimalMode"),l=async a=>{var i,l;let d=async({previousCacheEntry:r})=>{try{if(!s&&S&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let i=await o(a);e.fetchMetrics=F.renderOpts.fetchMetrics;let l=F.renderOpts.pendingWaitUntil;l&&n.waitUntil&&(n.waitUntil(l),l=void 0);let d=F.renderOpts.collectedTags;if(!q)return await (0,c.sendResponse)(W,L,i,F.renderOpts.pendingWaitUntil),null;{let e=await i.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(i.headers);d&&(t[m.NEXT_CACHE_TAGS_HEADER]=d),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==F.renderOpts.collectedRevalidate&&!(F.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&F.renderOpts.collectedRevalidate,n=void 0===F.renderOpts.collectedExpire||F.renderOpts.collectedExpire>=m.INFINITE_CACHE?void 0:F.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:i.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await j.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:S})},!1,A),t}},u=await j.handleResponse({req:e,nextConfig:C,cacheKey:$,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:N,responseGenerator:d,waitUntil:n.waitUntil,isMinimalMode:s});if(!q)return null;if((null==u||null==(i=u.value)?void 0:i.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(l=u.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});s||t.setHeader("x-nextjs-cache",S?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),k&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let x=(0,f.fromNodeOutgoingHttpHeaders)(u.value.headers);return s&&q||x.delete(m.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||x.get("Cache-Control")||x.set("Cache-Control",(0,h.getCacheControlHeader)(u.cacheControl)),await (0,c.sendResponse)(W,L,new Response(u.value.body,{headers:x,status:u.value.status||200})),null};K?await l(K):await M.withPropagatedContext(e.headers,()=>M.trace(u.BaseServerSpan.handleRequest,{spanName:`${U} ${w}`,kind:i.SpanKind.SERVER,attributes:{"http.method":U,"http.target":e.url}},l))}catch(t){if(t instanceof x.NoFallbackError||await j.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:H,isOnDemandRevalidate:S})},!1,A),q)throw t;return await (0,c.sendResponse)(W,L,new Response(null,{status:500})),null}}e.s(["handler",()=>O,"patchFetch",()=>T,"routeModule",()=>j,"serverHooks",()=>N,"workAsyncStorage",()=>A,"workUnitAsyncStorage",()=>S],72420)}];
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=%5Broot-of-the-server%5D__2588560d._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/kitchen-api.ts","../../../src/lib/openclaw.ts","../../../src/lib/paths.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../src/app/api/recipes/clone/route.ts"],"sourcesContent":["// NOTE: This file is compiled by Next.js.\n// Do not import `openclaw/plugin-sdk` here (it is provided by the gateway runtime, not as an npm dep).\n\ntype KitchenApi = {\n config: unknown;\n runtime: {\n system: { runCommandWithTimeout: (argv: string[], opts: { timeoutMs: number }) => Promise<{ stdout?: string; stderr?: string }> };\n };\n};\n\nexport function getKitchenApi(): KitchenApi {\n const api = (globalThis as unknown as { __clawkitchen_api?: KitchenApi }).__clawkitchen_api;\n if (!api) {\n throw new Error(\n \"ClawKitchen: OpenClaw plugin API not available. (This should only happen if Kitchen is started outside the gateway process.)\",\n );\n }\n return api;\n}\n","import { getKitchenApi } from \"@/lib/kitchen-api\";\n\nexport type OpenClawExecResult = {\n ok: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport async function runOpenClaw(args: string[]): Promise<OpenClawExecResult> {\n // Avoid child_process usage in plugin code (triggers OpenClaw install-time safety warnings).\n // Delegate to the OpenClaw runtime helper instead.\n const api = getKitchenApi();\n\n try {\n const res = (await api.runtime.system.runCommandWithTimeout([\"openclaw\", ...args], { timeoutMs: 120000 })) as {\n stdout?: unknown;\n stderr?: unknown;\n exitCode?: unknown;\n code?: unknown;\n status?: unknown;\n };\n\n const stdout = String(res.stdout ?? \"\");\n const stderr = String(res.stderr ?? \"\");\n const exitCode =\n typeof res.exitCode === \"number\"\n ? res.exitCode\n : typeof res.code === \"number\"\n ? res.code\n : typeof res.status === \"number\"\n ? res.status\n : 0;\n\n if (exitCode !== 0) return { ok: false, exitCode, stdout, stderr };\n return { ok: true, exitCode: 0, stdout, stderr };\n } catch (e: unknown) {\n const err = e as { code?: unknown; stdout?: unknown; stderr?: unknown; message?: unknown };\n const exitCode = typeof err.code === \"number\" ? err.code : 1;\n const stdout = typeof err.stdout === \"string\" ? err.stdout : \"\";\n const stderr = typeof err.stderr === \"string\" ? err.stderr : typeof err.message === \"string\" ? err.message : String(e);\n return { ok: false, exitCode, stdout, stderr };\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ntype OpenClawConfig = {\n agents?: { defaults?: { workspace?: string } };\n gateway?: { port?: number; auth?: { token?: string } };\n tools?: {\n agentToAgent?: {\n enabled?: boolean;\n allow?: string[];\n };\n };\n plugins?: {\n installs?: { recipes?: { installPath?: string; sourcePath?: string } };\n load?: { paths?: string[] };\n };\n};\n\nexport async function readOpenClawConfig(): Promise<OpenClawConfig> {\n const p = path.join(os.homedir(), \".openclaw\", \"openclaw.json\");\n const text = await fs.readFile(p, \"utf8\");\n return JSON.parse(text) as OpenClawConfig;\n}\n\nexport async function getWorkspaceDir() {\n const cfg = await readOpenClawConfig();\n const ws = cfg.agents?.defaults?.workspace;\n if (!ws) throw new Error(\"agents.defaults.workspace is not set in ~/.openclaw/openclaw.json\");\n return ws;\n}\n\nexport async function getWorkspaceRecipesDir() {\n const ws = await getWorkspaceDir();\n return path.join(ws, \"recipes\");\n}\n\nexport async function getWorkspaceGoalsDir() {\n const ws = await getWorkspaceDir();\n return path.join(ws, \"notes\", \"goals\");\n}\n\nexport async function getTeamWorkspaceDir(teamId: string) {\n const home = os.homedir();\n if (!home) throw new Error(\"Could not resolve home directory\");\n return path.join(home, \".openclaw\", `workspace-${teamId}`);\n}\n\nexport async function getBuiltinRecipesDir() {\n const cfg = await readOpenClawConfig();\n const p =\n cfg.plugins?.installs?.recipes?.installPath ||\n cfg.plugins?.installs?.recipes?.sourcePath ||\n cfg.plugins?.load?.paths?.[0];\n if (!p) throw new Error(\"Could not determine recipes plugin install path from ~/.openclaw/openclaw.json\");\n return path.join(p, \"recipes\", \"default\");\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/recipes/clone/route\",\n pathname: \"/api/recipes/clone\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/recipes/clone/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/recipes/clone/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { NextResponse } from \"next/server\";\nimport { getWorkspaceRecipesDir } from \"@/lib/paths\";\nimport { runOpenClaw } from \"@/lib/openclaw\";\n\nexport async function POST(req: Request) {\n const body = (await req.json()) as {\n fromId?: string;\n toId?: string;\n toName?: string;\n overwrite?: boolean;\n scaffold?: boolean;\n };\n\n const fromId = String(body.fromId ?? \"\").trim();\n const toId = String(body.toId ?? \"\").trim();\n const toName = typeof body.toName === \"string\" ? body.toName : undefined;\n const overwrite = Boolean(body.overwrite);\n const scaffold = Boolean(body.scaffold);\n\n if (!fromId) return NextResponse.json({ ok: false, error: \"Missing fromId\" }, { status: 400 });\n if (!toId) return NextResponse.json({ ok: false, error: \"Missing toId\" }, { status: 400 });\n\n // Allow any workspace recipe id (no required prefix).\n // Load source markdown from OpenClaw CLI (no HTTP self-call; avoids dev-server deadlocks/timeouts).\n const shown = await runOpenClaw([\"recipes\", \"show\", fromId]);\n if (!shown.ok) {\n return NextResponse.json(\n {\n ok: false,\n error:\n shown.stderr.trim() ||\n `openclaw recipes show ${fromId} failed (exit=${shown.exitCode}). Is the recipes plugin enabled?`,\n },\n { status: 400 },\n );\n }\n\n const original = String(shown.stdout ?? \"\");\n\n // Patch the frontmatter for the new recipe id/name.\n // For team recipes, also patch team.teamId so downstream scaffold targets the new team workspace.\n // (Agent ids for team members are derived from teamId + role by scaffold-team.)\n if (!original.startsWith(\"---\\n\")) throw new Error(\"Recipe markdown must start with YAML frontmatter (---)\");\n const end = original.indexOf(\"\\n---\\n\", 4);\n if (end === -1) throw new Error(\"Recipe frontmatter not terminated (---)\");\n const yamlText = original.slice(4, end + 1);\n const fm = (YAML.parse(yamlText) ?? {}) as Record<string, unknown>;\n const kind = String(fm.kind ?? \"\").trim().toLowerCase();\n\n const patched: Record<string, unknown> = {\n ...fm,\n id: toId,\n ...(toName ? { name: toName } : {}),\n ...(kind === \"team\"\n ? {\n team: {\n ...(typeof fm.team === \"object\" && fm.team ? (fm.team as Record<string, unknown>) : {}),\n teamId: toId,\n },\n }\n : {}),\n };\n\n const nextYaml = YAML.stringify(patched).trimEnd();\n const next = `---\\n${nextYaml}\\n---\\n${original.slice(end + 5)}`;\n\n function suggestIds(baseId: string) {\n const b = String(baseId || \"recipe\").trim();\n // Keep it simple/predictable: no timestamps, just common prefixes + auto-increment style.\n return [`custom-${b}`, `my-${b}`, `${b}-2`, `${b}-alt`];\n }\n\n const dir = await getWorkspaceRecipesDir();\n const filePath = path.join(dir, `${toId}.md`);\n\n try {\n await fs.stat(filePath);\n if (!overwrite) {\n return NextResponse.json(\n {\n ok: false,\n error: `Recipe id already exists: ${toId}. Choose a different id (e.g. ${suggestIds(toId).join(\", \")}).`,\n code: \"RECIPE_ID_TAKEN\",\n recipeId: toId,\n suggestions: suggestIds(toId),\n filePath,\n },\n { status: 409 },\n );\n }\n } catch {\n // doesn't exist\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, next, \"utf8\");\n\n // Optional: scaffold workspace files immediately so \"clone\" yields a functional team/agent.\n // IMPORTANT: scaffold failures should not delete/undo the cloned recipe markdown.\n let scaffoldResult:\n | { ok: true; stdout: string; stderr: string; exitCode: number }\n | { ok: false; error: string; stdout: string; stderr: string; exitCode: number | null }\n | null = null;\n\n if (scaffold) {\n const cmd =\n kind === \"team\"\n ? [\"recipes\", \"scaffold-team\", toId, \"--team-id\", toId, \"--overwrite\"]\n : kind === \"agent\"\n ? [\"recipes\", \"scaffold\", toId, \"--agent-id\", toId, \"--overwrite\"]\n : null;\n\n if (!cmd) {\n scaffoldResult = {\n ok: false,\n error: `Unsupported recipe kind for scaffold: ${kind || \"(missing kind)\"}`,\n stdout: \"\",\n stderr: \"\",\n exitCode: null,\n };\n } else {\n const r = await runOpenClaw(cmd);\n if (r.ok) {\n scaffoldResult = { ok: true, stdout: String(r.stdout ?? \"\"), stderr: String(r.stderr ?? \"\"), exitCode: r.exitCode };\n } else {\n scaffoldResult = {\n ok: false,\n error: r.stderr.trim() || `openclaw ${cmd.join(\" \")} failed (exit=${r.exitCode})`,\n stdout: String(r.stdout ?? \"\"),\n stderr: String(r.stderr ?? \"\"),\n exitCode: r.exitCode,\n };\n }\n }\n }\n\n return NextResponse.json({ ok: true, filePath, recipeId: toId, content: next, scaffold: scaffoldResult });\n}\n"],"names":[],"mappings":"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","ignoreList":[3]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/kitchen-api.ts","../../../src/lib/openclaw.ts","../../../src/lib/paths.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../src/app/api/recipes/clone/route.ts"],"sourcesContent":["// NOTE: This file is compiled by Next.js.\n// Do not import `openclaw/plugin-sdk` here (it is provided by the gateway runtime, not as an npm dep).\n\ntype KitchenApi = {\n config: unknown;\n runtime: {\n system: { runCommandWithTimeout: (argv: string[], opts: { timeoutMs: number }) => Promise<{ stdout?: string; stderr?: string }> };\n };\n};\n\nexport function getKitchenApi(): KitchenApi {\n const api = (globalThis as unknown as { __clawkitchen_api?: KitchenApi }).__clawkitchen_api;\n if (!api) {\n throw new Error(\n \"ClawKitchen: OpenClaw plugin API not available. (This should only happen if Kitchen is started outside the gateway process.)\",\n );\n }\n return api;\n}\n","import { getKitchenApi } from \"@/lib/kitchen-api\";\n\nexport type OpenClawExecResult = {\n ok: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport async function runOpenClaw(args: string[]): Promise<OpenClawExecResult> {\n // Avoid child_process usage in plugin code (triggers OpenClaw install-time safety warnings).\n // Delegate to the OpenClaw runtime helper instead.\n const api = getKitchenApi();\n\n try {\n const res = (await api.runtime.system.runCommandWithTimeout([\"openclaw\", ...args], { timeoutMs: 120000 })) as {\n stdout?: unknown;\n stderr?: unknown;\n exitCode?: unknown;\n code?: unknown;\n status?: unknown;\n };\n\n const stdout = String(res.stdout ?? \"\");\n const stderr = String(res.stderr ?? \"\");\n const exitCode =\n typeof res.exitCode === \"number\"\n ? res.exitCode\n : typeof res.code === \"number\"\n ? res.code\n : typeof res.status === \"number\"\n ? res.status\n : 0;\n\n if (exitCode !== 0) return { ok: false, exitCode, stdout, stderr };\n return { ok: true, exitCode: 0, stdout, stderr };\n } catch (e: unknown) {\n const err = e as { code?: unknown; stdout?: unknown; stderr?: unknown; message?: unknown };\n const exitCode = typeof err.code === \"number\" ? err.code : 1;\n const stdout = typeof err.stdout === \"string\" ? err.stdout : \"\";\n const stderr = typeof err.stderr === \"string\" ? err.stderr : typeof err.message === \"string\" ? err.message : String(e);\n return { ok: false, exitCode, stdout, stderr };\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ntype OpenClawConfig = {\n agents?: { defaults?: { workspace?: string } };\n gateway?: { port?: number; auth?: { token?: string } };\n tools?: {\n agentToAgent?: {\n enabled?: boolean;\n allow?: string[];\n };\n };\n plugins?: {\n installs?: { recipes?: { installPath?: string; sourcePath?: string } };\n load?: { paths?: string[] };\n };\n};\n\nexport async function readOpenClawConfig(): Promise<OpenClawConfig> {\n const p = path.join(os.homedir(), \".openclaw\", \"openclaw.json\");\n const text = await fs.readFile(p, \"utf8\");\n return JSON.parse(text) as OpenClawConfig;\n}\n\nexport async function getWorkspaceDir() {\n const cfg = await readOpenClawConfig();\n const ws = cfg.agents?.defaults?.workspace;\n if (!ws) throw new Error(\"agents.defaults.workspace is not set in ~/.openclaw/openclaw.json\");\n return ws;\n}\n\nexport async function getWorkspaceRecipesDir() {\n const ws = await getWorkspaceDir();\n return path.join(ws, \"recipes\");\n}\n\nexport async function getWorkspaceGoalsDir() {\n const ws = await getWorkspaceDir();\n return path.join(ws, \"notes\", \"goals\");\n}\n\nexport async function getTeamWorkspaceDir(teamId: string) {\n const home = os.homedir();\n if (!home) throw new Error(\"Could not resolve home directory\");\n return path.join(home, \".openclaw\", `workspace-${teamId}`);\n}\n\nexport async function getBuiltinRecipesDir() {\n const cfg = await readOpenClawConfig();\n const p =\n cfg.plugins?.installs?.recipes?.installPath ||\n cfg.plugins?.installs?.recipes?.sourcePath ||\n cfg.plugins?.load?.paths?.[0];\n if (!p) throw new Error(\"Could not determine recipes plugin install path from ~/.openclaw/openclaw.json\");\n return path.join(p, \"recipes\", \"default\");\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/recipes/clone/route\",\n pathname: \"/api/recipes/clone\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/src/app/api/recipes/clone/route.ts\",\n nextConfigOutput,\n userland\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/recipes/clone/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.experimental.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const context = {\n params,\n prerenderManifest,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache: getRequestMeta(req, 'incrementalCache'),\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const isMinimalMode = Boolean(process.env.MINIMAL_MODE || getRequestMeta(req, 'minimalMode'));\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (activeSpan) {\n await handleResponse(activeSpan);\n } else {\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse));\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { NextResponse } from \"next/server\";\nimport { getWorkspaceRecipesDir } from \"@/lib/paths\";\nimport { runOpenClaw } from \"@/lib/openclaw\";\n\nexport async function POST(req: Request) {\n const body = (await req.json()) as {\n fromId?: string;\n toId?: string;\n toName?: string;\n overwrite?: boolean;\n scaffold?: boolean;\n };\n\n const fromId = String(body.fromId ?? \"\").trim();\n const toId = String(body.toId ?? \"\").trim();\n const toName = typeof body.toName === \"string\" ? body.toName : undefined;\n const overwrite = Boolean(body.overwrite);\n const scaffold = Boolean(body.scaffold);\n\n if (!fromId) return NextResponse.json({ ok: false, error: \"Missing fromId\" }, { status: 400 });\n if (!toId) return NextResponse.json({ ok: false, error: \"Missing toId\" }, { status: 400 });\n\n // Allow any workspace recipe id (no required prefix).\n // Load source markdown from OpenClaw CLI (no HTTP self-call; avoids dev-server deadlocks/timeouts).\n const shown = await runOpenClaw([\"recipes\", \"show\", fromId]);\n if (!shown.ok) {\n return NextResponse.json(\n {\n ok: false,\n error:\n shown.stderr.trim() ||\n `openclaw recipes show ${fromId} failed (exit=${shown.exitCode}). Is the recipes plugin enabled?`,\n },\n { status: 400 },\n );\n }\n\n const original = String(shown.stdout ?? \"\");\n\n // Patch the frontmatter for the new recipe id/name.\n // For team recipes, also patch team.teamId so downstream scaffold targets the new team workspace.\n // (Agent ids for team members are derived from teamId + role by scaffold-team.)\n if (!original.startsWith(\"---\\n\")) throw new Error(\"Recipe markdown must start with YAML frontmatter (---)\");\n const end = original.indexOf(\"\\n---\\n\", 4);\n if (end === -1) throw new Error(\"Recipe frontmatter not terminated (---)\");\n const yamlText = original.slice(4, end + 1);\n const fm = (YAML.parse(yamlText) ?? {}) as Record<string, unknown>;\n const kind = String(fm.kind ?? \"\").trim().toLowerCase();\n\n const patched: Record<string, unknown> = {\n ...fm,\n id: toId,\n ...(toName ? { name: toName } : {}),\n ...(kind === \"team\"\n ? {\n team: {\n ...(typeof fm.team === \"object\" && fm.team ? (fm.team as Record<string, unknown>) : {}),\n teamId: toId,\n },\n }\n : {}),\n };\n\n const nextYaml = YAML.stringify(patched).trimEnd();\n const next = `---\\n${nextYaml}\\n---\\n${original.slice(end + 5)}`;\n\n function suggestIds(baseId: string) {\n const b = String(baseId || \"recipe\").trim();\n // Keep it simple/predictable: no timestamps, just common prefixes + auto-increment style.\n return [`custom-${b}`, `my-${b}`, `${b}-2`, `${b}-alt`];\n }\n\n const dir = await getWorkspaceRecipesDir();\n const filePath = path.join(dir, `${toId}.md`);\n\n try {\n await fs.stat(filePath);\n if (!overwrite) {\n return NextResponse.json(\n {\n ok: false,\n error: `Recipe id already exists: ${toId}. Choose a different id (e.g. ${suggestIds(toId).join(\", \")}).`,\n code: \"RECIPE_ID_TAKEN\",\n recipeId: toId,\n suggestions: suggestIds(toId),\n filePath,\n },\n { status: 409 },\n );\n }\n } catch {\n // doesn't exist\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, next, \"utf8\");\n\n // Optional: scaffold workspace files immediately so \"clone\" yields a functional team/agent.\n // IMPORTANT: scaffold failures should not delete/undo the cloned recipe markdown.\n let scaffoldResult:\n | { ok: true; stdout: string; stderr: string; exitCode: number }\n | { ok: false; error: string; stdout: string; stderr: string; exitCode: number | null }\n | null = null;\n\n if (scaffold) {\n const cmd =\n kind === \"team\"\n ? [\"recipes\", \"scaffold-team\", toId, \"--team-id\", toId, \"--overwrite\", \"--overwrite-recipe\"]\n : kind === \"agent\"\n ? [\"recipes\", \"scaffold\", toId, \"--agent-id\", toId, \"--overwrite\", \"--overwrite-recipe\"]\n : null;\n\n if (!cmd) {\n scaffoldResult = {\n ok: false,\n error: `Unsupported recipe kind for scaffold: ${kind || \"(missing kind)\"}`,\n stdout: \"\",\n stderr: \"\",\n exitCode: null,\n };\n } else {\n const r = await runOpenClaw(cmd);\n if (r.ok) {\n scaffoldResult = { ok: true, stdout: String(r.stdout ?? \"\"), stderr: String(r.stderr ?? \"\"), exitCode: r.exitCode };\n } else {\n scaffoldResult = {\n ok: false,\n error: r.stderr.trim() || `openclaw ${cmd.join(\" \")} failed (exit=${r.exitCode})`,\n stdout: String(r.stdout ?? \"\"),\n stderr: String(r.stderr ?? \"\"),\n exitCode: r.exitCode,\n };\n }\n }\n }\n\n return NextResponse.json({ ok: true, filePath, recipeId: toId, content: next, scaffold: scaffoldResult });\n}\n"],"names":[],"mappings":"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","ignoreList":[3]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},12714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},7367,e=>{"use strict";var t=e.i(12714),r=e.i(60526),a=e.i(50227);async function n(){let e=a.default.join(r.default.homedir(),".openclaw","openclaw.json");return JSON.parse(await t.default.readFile(e,"utf8"))}async function o(){let e=await n(),t=e.agents?.defaults?.workspace;if(!t)throw Error("agents.defaults.workspace is not set in ~/.openclaw/openclaw.json");return t}async function i(){let e=await o();return a.default.join(e,"recipes")}async function s(){let e=await o();return a.default.join(e,"notes","goals")}async function l(e){let t=r.default.homedir();if(!t)throw Error("Could not resolve home directory");return a.default.join(t,".openclaw",`workspace-${e}`)}async function u(){let e=await n(),t=e.plugins?.installs?.recipes?.installPath||e.plugins?.installs?.recipes?.sourcePath||e.plugins?.load?.paths?.[0];if(!t)throw Error("Could not determine recipes plugin install path from ~/.openclaw/openclaw.json");return a.default.join(t,"recipes","default")}e.s(["getBuiltinRecipesDir",()=>u,"getTeamWorkspaceDir",()=>l,"getWorkspaceDir",()=>o,"getWorkspaceGoalsDir",()=>s,"getWorkspaceRecipesDir",()=>i,"readOpenClawConfig",()=>n])},76509,e=>{"use strict";var t=e.i(7367);async function r(){let e=await (0,t.readOpenClawConfig)(),r=e.gateway?.port??18789,a=e.gateway?.auth?.token;if(!a)throw Error("Missing gateway token (gateway.auth.token in ~/.openclaw/openclaw.json)");return{baseUrl:`http://127.0.0.1:${r}`,token:a}}async function a(e){let{baseUrl:t,token:a}=await r(),n=await fetch(`${t}/tools/invoke`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${a}`},body:JSON.stringify(e)}),o=await n.json();if(!n.ok||!o.ok)throw Error("object"==typeof o.error&&o.error?.message||("string"==typeof o.error?o.error:null)||`tools/invoke failed (${n.status})`);return o.result}async function n(){let e=await a({tool:"gateway",args:{action:"config.get",raw:"{}"}}),t=e?.content?.find(e=>"text"===e.type)?.text;if(!t)throw Error("gateway config.get: missing text payload");let r=JSON.parse(t),n=String(r?.result?.raw??""),o=String(r?.result?.hash??"");if(!n)throw Error("gateway config.get: missing result.raw");if(!o)throw Error("gateway config.get: missing result.hash");return{raw:n,hash:o}}async function o(e,t){let{hash:r}=await n();return a({tool:"gateway",args:{action:"config.patch",raw:JSON.stringify(e,null,2),baseHash:r,note:t??"ClawKitchen settings update",restartDelayMs:1e3}})}e.s(["gatewayConfigGet",()=>n,"gatewayConfigPatch",()=>o,"toolsInvoke",()=>a])},53704,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),o=e.i(61916),i=e.i(74677),s=e.i(69741),l=e.i(16795),u=e.i(87718),p=e.i(95169),c=e.i(47587),d=e.i(66012),g=e.i(70101),f=e.i(26937),h=e.i(10372),w=e.i(93695);e.i(52474);var x=e.i(220),y=e.i(89171),v=e.i(76509);let R="plugins.entries.recipes.config.cronInstallation";async function m(){var e;let{raw:t}=await (0,v.gatewayConfigGet)(),r=String((e=JSON.parse(t),R.split(".").reduce((e,t)=>{if(e&&"object"==typeof e)return e[t]},e)??"")).trim();return y.NextResponse.json({ok:!0,path:R,value:r})}async function E(e){let t=String((await e.json()).value??"").trim();return t&&["off","prompt","on"].includes(t)?(await (0,v.gatewayConfigPatch)({plugins:{entries:{recipes:{config:{cronInstallation:t}}}}},`ClawKitchen: set ${R}=${t}`),y.NextResponse.json({ok:!0,path:R,value:t,note:"Gateway will restart to apply config."})):y.NextResponse.json({ok:!1,error:"value must be one of: off|prompt|on"},{status:400})}e.s(["GET",()=>m,"PUT",()=>E],48e3);var C=e.i(48e3);let k=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/settings/cron-installation/route",pathname:"/api/settings/cron-installation",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/settings/cron-installation/route.ts",nextConfigOutput:"standalone",userland:C}),{workAsyncStorage:j,workUnitAsyncStorage:b,serverHooks:N}=k;function A(){return(0,a.patchFetch)({workAsyncStorage:j,workUnitAsyncStorage:b})}async function O(e,t,a){k.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/settings/cron-installation/route";y=y.replace(/\/index$/,"")||"/";let v=await k.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!v)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:R,params:m,nextConfig:E,parsedUrl:C,isDraftMode:j,prerenderManifest:b,routerServerContext:N,isOnDemandRevalidate:A,revalidateOnlyGenerated:O,resolvedPathname:P,clientReferenceManifest:S,serverActionsManifest:T}=v,q=(0,s.normalizeAppPath)(y),_=!!(b.dynamicRoutes[q]||b.routes[P]),D=async()=>((null==N?void 0:N.render404)?await N.render404(e,t,C,!1):t.end("This page could not be found"),null);if(_&&!j){let e=!!b.routes[P],t=b.dynamicRoutes[q];if(t&&!1===t.fallback&&!e){if(E.experimental.adapterPath)return await D();throw new w.NoFallbackError}}let H=null;!_||k.isDev||j||(H="/index"===(H=P)?"/":H);let I=!0===k.isDev||!_,U=_&&!I;T&&S&&(0,i.setManifestsSingleton)({page:y,clientReferenceManifest:S,serverActionsManifest:T});let $=e.method||"GET",M=(0,o.getTracer)(),K=M.getActiveScopeSpan(),F={params:m,prerenderManifest:b,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:I,incrementalCache:(0,n.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>k.onRequestError(e,t,a,n,N)},sharedContext:{buildId:R}},G=new l.NodeNextRequest(e),B=new l.NodeNextResponse(t),W=u.NextRequestAdapter.fromNodeNextRequest(G,(0,u.signalFromNodeResponse)(t));try{let i=async e=>k.handle(W,F).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=M.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==p.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${$} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t)}else e.updateName(`${$} ${y}`)}),s=!!(0,n.getRequestMeta)(e,"minimalMode"),l=async n=>{var o,l;let u=async({previousCacheEntry:r})=>{try{if(!s&&A&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await i(n);e.fetchMetrics=F.renderOpts.fetchMetrics;let l=F.renderOpts.pendingWaitUntil;l&&a.waitUntil&&(a.waitUntil(l),l=void 0);let u=F.renderOpts.collectedTags;if(!_)return await (0,d.sendResponse)(G,B,o,F.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,g.toNodeOutgoingHttpHeaders)(o.headers);u&&(t[h.NEXT_CACHE_TAGS_HEADER]=u),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==F.renderOpts.collectedRevalidate&&!(F.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&F.renderOpts.collectedRevalidate,a=void 0===F.renderOpts.collectedExpire||F.renderOpts.collectedExpire>=h.INFINITE_CACHE?void 0:F.renderOpts.collectedExpire;return{value:{kind:x.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await k.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:A})},!1,N),t}},p=await k.handleResponse({req:e,nextConfig:E,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:A,revalidateOnlyGenerated:O,responseGenerator:u,waitUntil:a.waitUntil,isMinimalMode:s});if(!_)return null;if((null==p||null==(o=p.value)?void 0:o.kind)!==x.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==p||null==(l=p.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});s||t.setHeader("x-nextjs-cache",A?"REVALIDATED":p.isMiss?"MISS":p.isStale?"STALE":"HIT"),j&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let w=(0,g.fromNodeOutgoingHttpHeaders)(p.value.headers);return s&&_||w.delete(h.NEXT_CACHE_TAGS_HEADER),!p.cacheControl||t.getHeader("Cache-Control")||w.get("Cache-Control")||w.set("Cache-Control",(0,f.getCacheControlHeader)(p.cacheControl)),await (0,d.sendResponse)(G,B,new Response(p.value.body,{headers:w,status:p.value.status||200})),null};K?await l(K):await M.withPropagatedContext(e.headers,()=>M.trace(p.BaseServerSpan.handleRequest,{spanName:`${$} ${y}`,kind:o.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},l))}catch(t){if(t instanceof w.NoFallbackError||await k.onRequestError(e,t,{routerKind:"App Router",routePath:q,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:A})},!1,N),_)throw t;return await (0,d.sendResponse)(G,B,new Response(null,{status:500})),null}}e.s(["handler",()=>O,"patchFetch",()=>A,"routeModule",()=>k,"serverHooks",()=>N,"workAsyncStorage",()=>j,"workUnitAsyncStorage",()=>b],53704)}];
|
|
1
|
+
module.exports=[70406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},18622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},56704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},32319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},24725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},93695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},50227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},12714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},60526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},7367,e=>{"use strict";var t=e.i(12714),r=e.i(60526),a=e.i(50227);async function n(){let e=a.default.join(r.default.homedir(),".openclaw","openclaw.json");return JSON.parse(await t.default.readFile(e,"utf8"))}async function o(){let e=await n(),t=e.agents?.defaults?.workspace;if(!t)throw Error("agents.defaults.workspace is not set in ~/.openclaw/openclaw.json");return t}async function s(){let e=await o();return a.default.join(e,"recipes")}async function i(){let e=await o();return a.default.join(e,"notes","goals")}async function l(e){let t=r.default.homedir();if(!t)throw Error("Could not resolve home directory");return a.default.join(t,".openclaw",`workspace-${e}`)}async function u(){let e=await n(),t=e.plugins?.installs?.recipes?.installPath||e.plugins?.installs?.recipes?.sourcePath||e.plugins?.load?.paths?.[0];if(!t)throw Error("Could not determine recipes plugin install path from ~/.openclaw/openclaw.json");return a.default.join(t,"recipes","default")}e.s(["getBuiltinRecipesDir",()=>u,"getTeamWorkspaceDir",()=>l,"getWorkspaceDir",()=>o,"getWorkspaceGoalsDir",()=>i,"getWorkspaceRecipesDir",()=>s,"readOpenClawConfig",()=>n])},76509,e=>{"use strict";var t=e.i(7367);async function r(){let e=await (0,t.readOpenClawConfig)(),r=e.gateway?.port??18789,a=e.gateway?.auth?.token;if(!a)throw Error("Missing gateway token (gateway.auth.token in ~/.openclaw/openclaw.json)");return{baseUrl:`http://127.0.0.1:${r}`,token:a}}async function a(e){let{baseUrl:t,token:a}=await r(),n=await fetch(`${t}/tools/invoke`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${a}`},body:JSON.stringify(e)}),o=await n.json();if(!n.ok||!o.ok)throw Error("object"==typeof o.error&&o.error?.message||("string"==typeof o.error?o.error:null)||`tools/invoke failed (${n.status})`);return o.result}async function n(){let e=await a({tool:"gateway",args:{action:"config.get",raw:"{}"}}),t=e?.content?.find(e=>"text"===e.type)?.text;if(!t)throw Error("gateway config.get: missing text payload");let r=JSON.parse(t),n=String(r?.result?.raw??""),o=String(r?.result?.hash??"");if(!n)throw Error("gateway config.get: missing result.raw");if(!o)throw Error("gateway config.get: missing result.hash");return{raw:n,hash:o}}async function o(e,t){let{hash:r}=await n();return a({tool:"gateway",args:{action:"config.patch",raw:JSON.stringify(e,null,2),baseHash:r,note:t??"ClawKitchen settings update",restartDelayMs:1e3}})}e.s(["gatewayConfigGet",()=>n,"gatewayConfigPatch",()=>o,"toolsInvoke",()=>a])},53704,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),o=e.i(61916),s=e.i(74677),i=e.i(69741),l=e.i(16795),u=e.i(87718),p=e.i(95169),c=e.i(47587),d=e.i(66012),g=e.i(70101),f=e.i(26937),h=e.i(10372),w=e.i(93695);e.i(52474);var x=e.i(220),y=e.i(89171),R=e.i(76509);let m="plugins.entries.recipes.config.cronInstallation";async function v(){try{let{raw:e}=await (0,R.gatewayConfigGet)(),t=JSON.parse(e),r=String(m.split(".").reduce((e,t)=>{if(e&&"object"==typeof e)return e[t]},t)??"").trim();return y.NextResponse.json({ok:!0,path:m,value:r})}catch(e){return y.NextResponse.json({ok:!1,error:e instanceof Error?e.message:String(e)},{status:500})}}async function E(e){try{let t=await e.json(),r=String(t.value??"").trim();if(!r||!["off","prompt","on"].includes(r))return y.NextResponse.json({ok:!1,error:"value must be one of: off|prompt|on"},{status:400});return await (0,R.gatewayConfigPatch)({plugins:{entries:{recipes:{config:{cronInstallation:r}}}}},`ClawKitchen: set ${m}=${r}`),y.NextResponse.json({ok:!0,path:m,value:r,note:"Gateway will restart to apply config."})}catch(e){return y.NextResponse.json({ok:!1,error:e instanceof Error?e.message:String(e)},{status:500})}}e.s(["GET",()=>v,"PUT",()=>E],48e3);var C=e.i(48e3);let k=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/settings/cron-installation/route",pathname:"/api/settings/cron-installation",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/settings/cron-installation/route.ts",nextConfigOutput:"standalone",userland:C}),{workAsyncStorage:j,workUnitAsyncStorage:b,serverHooks:N}=k;function S(){return(0,a.patchFetch)({workAsyncStorage:j,workUnitAsyncStorage:b})}async function A(e,t,a){k.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/settings/cron-installation/route";y=y.replace(/\/index$/,"")||"/";let R=await k.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!R)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:m,params:v,nextConfig:E,parsedUrl:C,isDraftMode:j,prerenderManifest:b,routerServerContext:N,isOnDemandRevalidate:S,revalidateOnlyGenerated:A,resolvedPathname:O,clientReferenceManifest:P,serverActionsManifest:T}=R,q=(0,i.normalizeAppPath)(y),_=!!(b.dynamicRoutes[q]||b.routes[O]),D=async()=>((null==N?void 0:N.render404)?await N.render404(e,t,C,!1):t.end("This page could not be found"),null);if(_&&!j){let e=!!b.routes[O],t=b.dynamicRoutes[q];if(t&&!1===t.fallback&&!e){if(E.experimental.adapterPath)return await D();throw new w.NoFallbackError}}let H=null;!_||k.isDev||j||(H="/index"===(H=O)?"/":H);let I=!0===k.isDev||!_,U=_&&!I;T&&P&&(0,s.setManifestsSingleton)({page:y,clientReferenceManifest:P,serverActionsManifest:T});let $=e.method||"GET",M=(0,o.getTracer)(),K=M.getActiveScopeSpan(),F={params:v,prerenderManifest:b,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:I,incrementalCache:(0,n.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>k.onRequestError(e,t,a,n,N)},sharedContext:{buildId:m}},G=new l.NodeNextRequest(e),B=new l.NodeNextResponse(t),W=u.NextRequestAdapter.fromNodeNextRequest(G,(0,u.signalFromNodeResponse)(t));try{let s=async e=>k.handle(W,F).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=M.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==p.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${$} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t)}else e.updateName(`${$} ${y}`)}),i=!!(0,n.getRequestMeta)(e,"minimalMode"),l=async n=>{var o,l;let u=async({previousCacheEntry:r})=>{try{if(!i&&S&&A&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await s(n);e.fetchMetrics=F.renderOpts.fetchMetrics;let l=F.renderOpts.pendingWaitUntil;l&&a.waitUntil&&(a.waitUntil(l),l=void 0);let u=F.renderOpts.collectedTags;if(!_)return await (0,d.sendResponse)(G,B,o,F.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,g.toNodeOutgoingHttpHeaders)(o.headers);u&&(t[h.NEXT_CACHE_TAGS_HEADER]=u),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==F.renderOpts.collectedRevalidate&&!(F.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&F.renderOpts.collectedRevalidate,a=void 0===F.renderOpts.collectedExpire||F.renderOpts.collectedExpire>=h.INFINITE_CACHE?void 0:F.renderOpts.collectedExpire;return{value:{kind:x.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await k.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:S})},!1,N),t}},p=await k.handleResponse({req:e,nextConfig:E,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:b,isRoutePPREnabled:!1,isOnDemandRevalidate:S,revalidateOnlyGenerated:A,responseGenerator:u,waitUntil:a.waitUntil,isMinimalMode:i});if(!_)return null;if((null==p||null==(o=p.value)?void 0:o.kind)!==x.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==p||null==(l=p.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});i||t.setHeader("x-nextjs-cache",S?"REVALIDATED":p.isMiss?"MISS":p.isStale?"STALE":"HIT"),j&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let w=(0,g.fromNodeOutgoingHttpHeaders)(p.value.headers);return i&&_||w.delete(h.NEXT_CACHE_TAGS_HEADER),!p.cacheControl||t.getHeader("Cache-Control")||w.get("Cache-Control")||w.set("Cache-Control",(0,f.getCacheControlHeader)(p.cacheControl)),await (0,d.sendResponse)(G,B,new Response(p.value.body,{headers:w,status:p.value.status||200})),null};K?await l(K):await M.withPropagatedContext(e.headers,()=>M.trace(p.BaseServerSpan.handleRequest,{spanName:`${$} ${y}`,kind:o.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},l))}catch(t){if(t instanceof w.NoFallbackError||await k.onRequestError(e,t,{routerKind:"App Router",routePath:q,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:S})},!1,N),_)throw t;return await (0,d.sendResponse)(G,B,new Response(null,{status:500})),null}}e.s(["handler",()=>A,"patchFetch",()=>S,"routeModule",()=>k,"serverHooks",()=>N,"workAsyncStorage",()=>j,"workUnitAsyncStorage",()=>b],53704)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=%5Broot-of-the-server%5D__ff940674._.js.map
|