nextclaw 0.44.1 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/dist/cli/app/index.js +2 -2
  2. package/dist/cli/launcher/index.js +1 -1
  3. package/dist/{nextclaw-cli-app-scOxgGRP.js → nextclaw-cli-app-Bwa2L2Jv.js} +306 -22
  4. package/dist/nextclaw-cli-app-Bwa2L2Jv.js.map +1 -0
  5. package/dist/{nextclaw-distribution.utils-BneKclXo.js → nextclaw-distribution.utils-Bba2GRvc.js} +4 -2
  6. package/dist/nextclaw-distribution.utils-Bba2GRvc.js.map +1 -0
  7. package/package.json +15 -14
  8. package/resources/USAGE.md +36 -4
  9. package/resources/apps/nextclaw-personal-organizer/README.md +1 -1
  10. package/resources/apps/nextclaw-portable-runtime-lab/README.md +34 -0
  11. package/resources/apps/nextclaw-portable-runtime-lab/assets/icon.svg +12 -0
  12. package/resources/apps/nextclaw-portable-runtime-lab/manifest.json +74 -0
  13. package/resources/apps/nextclaw-portable-runtime-lab/marketplace.json +21 -0
  14. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/assets/app.js +92 -0
  15. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/assets/style.css +43 -0
  16. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/index.html +43 -0
  17. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/panel-app.json +10 -0
  18. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/assets/app.js +132 -0
  19. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/assets/style.css +39 -0
  20. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/index.html +40 -0
  21. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/panel-app.json +14 -0
  22. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/assets/app.js +117 -0
  23. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/assets/style.css +41 -0
  24. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/index.html +41 -0
  25. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/panel-app.json +12 -0
  26. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/assets/app.js +266 -0
  27. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/assets/style.css +87 -0
  28. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/index.html +154 -0
  29. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/panel-app.json +29 -0
  30. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/assets/app.js +143 -0
  31. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/assets/style.css +48 -0
  32. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/index.html +45 -0
  33. package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/panel-app.json +12 -0
  34. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-capabilities/service-app.json +20 -0
  35. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-capabilities/service.wasm +0 -0
  36. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-composition/service-app.json +30 -0
  37. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-composition/service.wasm +0 -0
  38. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-provider/service-app.json +30 -0
  39. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-provider/service.wasm +0 -0
  40. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-resident/service-app.json +31 -0
  41. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-resident/service.wasm +0 -0
  42. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-state/service-app.json +49 -0
  43. package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-state/service.wasm +0 -0
  44. package/ui-dist/assets/abnfDiagram-VRR7QNED-BcFJp_1X.js.gz +0 -0
  45. package/ui-dist/assets/aiden0z-pptx-renderer.es-Dp2ezlQn.js.gz +0 -0
  46. package/ui-dist/assets/{api-iMkU_o5P.js → api-m33O1Kb0.js} +6 -6
  47. package/ui-dist/assets/api-m33O1Kb0.js.gz +0 -0
  48. package/ui-dist/assets/{appearance-settings-page-CU5k4b-M.js → appearance-settings-page-x4Vjnfmz.js} +1 -1
  49. package/ui-dist/assets/appearance-settings-page-x4Vjnfmz.js.gz +0 -0
  50. package/ui-dist/assets/arc-CkgyPMyW.js.gz +0 -0
  51. package/ui-dist/assets/architectureDiagram-ZJ3FMSHR-CMd4cIjI.js.gz +0 -0
  52. package/ui-dist/assets/blockDiagram-677ZJIJ3-Bz3tbhet.js.gz +0 -0
  53. package/ui-dist/assets/{book-open-nD8gdMhA.js → book-open-BHiasMCg.js} +1 -1
  54. package/ui-dist/assets/c4Diagram-LMCZKHZV-D9hFNAGv.js.gz +0 -0
  55. package/ui-dist/assets/{channels-list-page-Drlt62kY.js → channels-list-page-DOxJZeXq.js} +2 -2
  56. package/ui-dist/assets/channels-list-page-DOxJZeXq.js.gz +0 -0
  57. package/ui-dist/assets/chunk-32BRIVSS-7NrjEITq.js.gz +0 -0
  58. package/ui-dist/assets/chunk-52WLFC77-viIcqj9q.js.gz +0 -0
  59. package/ui-dist/assets/chunk-5JV3BV7I-CuKgJQ4W.js.gz +0 -0
  60. package/ui-dist/assets/chunk-5TONJI2A-CYeiWZKb.js.gz +0 -0
  61. package/ui-dist/assets/chunk-7BUUIJ7U-BvydOcm3.js.gz +0 -0
  62. package/ui-dist/assets/chunk-C7G6YPKG-DAizzYwr.js.gz +0 -0
  63. package/ui-dist/assets/chunk-DseTPa7n.js.gz +0 -0
  64. package/ui-dist/assets/chunk-EX3LRPZG-BmlDFIRW.js.gz +0 -0
  65. package/ui-dist/assets/chunk-FWX5IMBZ-D0ksHZZ9.js.gz +0 -0
  66. package/ui-dist/assets/chunk-HOUHSVGY-DPkq8FCm.js.gz +0 -0
  67. package/ui-dist/assets/chunk-ICXQ74PX-FAatv5fC.js.gz +0 -0
  68. package/ui-dist/assets/chunk-JG7HCLWE-DLkIi4F7.js.gz +0 -0
  69. package/ui-dist/assets/chunk-KEIR6QF5-f9psyCXK.js.gz +0 -0
  70. package/ui-dist/assets/chunk-MOJQB5TN-Di52TorW.js.gz +0 -0
  71. package/ui-dist/assets/chunk-PUDLZKDR-f3IJh3sN.js.gz +0 -0
  72. package/ui-dist/assets/chunk-Q4XR5HBZ-DQFeUPxZ.js.gz +0 -0
  73. package/ui-dist/assets/chunk-R7FJI6CG-C3XpZ-2u.js.gz +0 -0
  74. package/ui-dist/assets/chunk-RYQCIY6F-CAqa5klQ.js.gz +0 -0
  75. package/ui-dist/assets/chunk-U6XO7XAA-D_WXezeD.js.gz +0 -0
  76. package/ui-dist/assets/chunk-V7JOEXUC-CZ70oOtp.js.gz +0 -0
  77. package/ui-dist/assets/chunk-WYO6CB5R-Dn9To_OI.js.gz +0 -0
  78. package/ui-dist/assets/chunk-ZGVPDNZ5-C6YtZDU0.js.gz +0 -0
  79. package/ui-dist/assets/chunk-ZIRB5QZD-DMuYtnHF.js.gz +0 -0
  80. package/ui-dist/assets/{config-split-page-BtJZp1E5.js → config-split-page-DBnMEP1o.js} +1 -1
  81. package/ui-dist/assets/config-split-page-DBnMEP1o.js.gz +0 -0
  82. package/ui-dist/assets/{confirm-dialog-k2-Jq_x3.js → confirm-dialog-f5NKLh5I.js} +2 -2
  83. package/ui-dist/assets/confirm-dialog-f5NKLh5I.js.gz +0 -0
  84. package/ui-dist/assets/cose-bilkent-JH36ORCC-Bc2Ex5Y3.js.gz +0 -0
  85. package/ui-dist/assets/{createLucideIcon-DxlwKLr-.js → createLucideIcon-CHALGA42.js} +1 -1
  86. package/ui-dist/assets/cynefinDiagram-TSTJHNR4-DVysQoGz.js.gz +0 -0
  87. package/ui-dist/assets/cytoscape.esm-0uDtdD0l.js.gz +0 -0
  88. package/ui-dist/assets/dagre-CMhQ1cAG.js.gz +0 -0
  89. package/ui-dist/assets/dagre-VKFMJZFB-RYyWpPJZ.js.gz +0 -0
  90. package/ui-dist/assets/defaultLocale-DSWXGgt0.js.gz +0 -0
  91. package/ui-dist/assets/desktop-capabilities-page-DixayAe6.js +1 -0
  92. package/ui-dist/assets/desktop-capabilities-page-DixayAe6.js.gz +0 -0
  93. package/ui-dist/assets/desktop-update-config-ChhfeOHj.js +1 -0
  94. package/ui-dist/assets/desktop-update-config-ChhfeOHj.js.gz +0 -0
  95. package/ui-dist/assets/diagram-FQU43EPY-BD6KONdF.js.gz +0 -0
  96. package/ui-dist/assets/diagram-G47NLZAW-CGB2ptRR.js.gz +0 -0
  97. package/ui-dist/assets/diagram-NH7WQ7WH-DnkOI6cU.js.gz +0 -0
  98. package/ui-dist/assets/diagram-OA4YK3LP-DF82RZ7P.js.gz +0 -0
  99. package/ui-dist/assets/diagram-WEI45ONY-Be2v7Ck9.js.gz +0 -0
  100. package/ui-dist/assets/dist--ta5rX12.js.gz +0 -0
  101. package/ui-dist/assets/{dist-Cy_e4kNb.js → dist-_UMsWSY0.js} +1 -1
  102. package/ui-dist/assets/dist-_UMsWSY0.js.gz +0 -0
  103. package/ui-dist/assets/{dist-m08DUswB.js → dist-sD6V4nHX.js} +1 -1
  104. package/ui-dist/assets/dist-sD6V4nHX.js.gz +0 -0
  105. package/ui-dist/assets/doc-browser-Bq7LJsQY.js +1 -0
  106. package/ui-dist/assets/doc-browser-Bq7LJsQY.js.gz +0 -0
  107. package/ui-dist/assets/doc-browser-BuDgpY2e.js +1 -0
  108. package/ui-dist/assets/{doc-browser-context-jiy-O4F8.js → doc-browser-context-Capim3og.js} +1 -1
  109. package/ui-dist/assets/doc-browser-context-Capim3og.js.gz +0 -0
  110. package/ui-dist/assets/docx-preview-BqwAjrj3.js.gz +0 -0
  111. package/ui-dist/assets/ebnfDiagram-CCIWWBDH-CP98OYk8.js.gz +0 -0
  112. package/ui-dist/assets/erDiagram-Q63AITRT-ZLlx8xfs.js.gz +0 -0
  113. package/ui-dist/assets/{extensions-CIb17__o.js → extensions-Bdclr3Wr.js} +1 -1
  114. package/ui-dist/assets/extensions-Bdclr3Wr.js.gz +0 -0
  115. package/ui-dist/assets/{form-actions-DGf5zUg_.js → form-actions-CH0kWhEt.js} +1 -1
  116. package/ui-dist/assets/ganttDiagram-NO4QXBWP-DXCDjHR2.js.gz +0 -0
  117. package/ui-dist/assets/gitGraphDiagram-IHSO6WYX-l2HWrTJp.js.gz +0 -0
  118. package/ui-dist/assets/graphlib-CQ6QV4yP.js.gz +0 -0
  119. package/ui-dist/assets/index-BjxnLYE3.js +109 -0
  120. package/ui-dist/assets/index-BjxnLYE3.js.gz +0 -0
  121. package/ui-dist/assets/index-CBmwJjwE.css +1 -0
  122. package/ui-dist/assets/index-CBmwJjwE.css.gz +0 -0
  123. package/ui-dist/assets/ishikawaDiagram-FXEZZL3T-y_Xy128F.js.gz +0 -0
  124. package/ui-dist/assets/journeyDiagram-5HDEW3XC-DJn5xYcQ.js.gz +0 -0
  125. package/ui-dist/assets/jszip.min-8hyJpgpx.js.gz +0 -0
  126. package/ui-dist/assets/kanban-definition-HUTT4EX6-DJVIOR21.js.gz +0 -0
  127. package/ui-dist/assets/katex-ARhY9PS1.js.gz +0 -0
  128. package/ui-dist/assets/linear-BtDLqtzF.js.gz +0 -0
  129. package/ui-dist/assets/loader-circle-CH_0iPLy.js +1 -0
  130. package/ui-dist/assets/map-BKnQyvd0.js.gz +0 -0
  131. package/ui-dist/assets/mcp-marketplace-page-BUsxLVB5.js +10 -0
  132. package/ui-dist/assets/mcp-marketplace-page-BUsxLVB5.js.gz +0 -0
  133. package/ui-dist/assets/mcp-marketplace-page-GPRV3fB0.js +1 -0
  134. package/ui-dist/assets/mermaid-parser.core-XUNZhr2W.js.gz +0 -0
  135. package/ui-dist/assets/mermaid.core-ySrvolIe.js.gz +0 -0
  136. package/ui-dist/assets/middleware-DXsbf9xI.js.gz +0 -0
  137. package/ui-dist/assets/mindmap-definition-LN4V7U3C-BypL9tei.js.gz +0 -0
  138. package/ui-dist/assets/model-config-page-CIevwqp4.js +1 -0
  139. package/ui-dist/assets/model-config-page-CIevwqp4.js.gz +0 -0
  140. package/ui-dist/assets/{navigation-link-DAfwFCj4.js → navigation-link-CAUiM3zS.js} +1 -1
  141. package/ui-dist/assets/navigation-link-CAUiM3zS.js.gz +0 -0
  142. package/ui-dist/assets/ordinal-CxxVWxYU.js.gz +0 -0
  143. package/ui-dist/assets/path-10BjdyLh.js.gz +0 -0
  144. package/ui-dist/assets/pegDiagram-2B236MQR-D-U2KBGv.js.gz +0 -0
  145. package/ui-dist/assets/pieDiagram-ENE6RG2P-CBi3GusJ.js.gz +0 -0
  146. package/ui-dist/assets/plus-B3obD55V.js +1 -0
  147. package/ui-dist/assets/preload-helper-D4M6sveU.js.gz +0 -0
  148. package/ui-dist/assets/privacy-settings-page-CNKfZsYH.js +1 -0
  149. package/ui-dist/assets/privacy-settings-page-CNKfZsYH.js.gz +0 -0
  150. package/ui-dist/assets/providers-config-page-DAah2NIS.js +1 -0
  151. package/ui-dist/assets/providers-config-page-DAah2NIS.js.gz +0 -0
  152. package/ui-dist/assets/quadrantDiagram-ABIIQ3AL-H0ZuvnZL.js.gz +0 -0
  153. package/ui-dist/assets/railroadDiagram-RFXS5EU6-D7Y2EqSd.js.gz +0 -0
  154. package/ui-dist/assets/react-Co6JiC1n.js +8 -0
  155. package/ui-dist/assets/react-Co6JiC1n.js.gz +0 -0
  156. package/ui-dist/assets/{refresh-cw-D_Eibznw.js → refresh-cw-BG_LX3SS.js} +1 -1
  157. package/ui-dist/assets/remote-DuscgfvR.js +1 -0
  158. package/ui-dist/assets/requirementDiagram-TGXJPOKE-BiXNX1NN.js.gz +0 -0
  159. package/ui-dist/assets/{rotate-cw-QQjmoWuq.js → rotate-cw-Cz7I_m7O.js} +1 -1
  160. package/ui-dist/assets/rough.esm-DxgC_14r.js.gz +0 -0
  161. package/ui-dist/assets/runtime-config-page-Cl1RpmSC.js +1 -0
  162. package/ui-dist/assets/runtime-config-page-Cl1RpmSC.js.gz +0 -0
  163. package/ui-dist/assets/sankeyDiagram-HTMAVEWB-qzDeLztW.js.gz +0 -0
  164. package/ui-dist/assets/{save-W2xthJJ2.js → save-BiHnb8ps.js} +1 -1
  165. package/ui-dist/assets/{search-Vih1R2BD.js → search-C47TyRg0.js} +1 -1
  166. package/ui-dist/assets/{search-config-page-CtBcL2uc.js → search-config-page-BAIzd6gN.js} +1 -1
  167. package/ui-dist/assets/search-config-page-BAIzd6gN.js.gz +0 -0
  168. package/ui-dist/assets/{secrets-config-page-Q6XfIj0h.js → secrets-config-page-Ddi-n43R.js} +2 -2
  169. package/ui-dist/assets/secrets-config-page-Ddi-n43R.js.gz +0 -0
  170. package/ui-dist/assets/security-config-C8MHnE1r.js +1 -0
  171. package/ui-dist/assets/{select-lNdozU4o.js → select-BzQKfW1e.js} +2 -2
  172. package/ui-dist/assets/select-BzQKfW1e.js.gz +0 -0
  173. package/ui-dist/assets/sequenceDiagram-DBY2YBRQ-BtRbPQtL.js.gz +0 -0
  174. package/ui-dist/assets/skeleton-BXFAE9SE.js +1 -0
  175. package/ui-dist/assets/src-Bw-mzbQb.js.gz +0 -0
  176. package/ui-dist/assets/stateDiagram-2N3HPSRC-BJ-mFeOz.js.gz +0 -0
  177. package/ui-dist/assets/swimlanes-5IMT3BWC-BsucVOO2.js.gz +0 -0
  178. package/ui-dist/assets/{tag-chip-gdaU9bE7.js → tag-chip-C3K814HZ.js} +1 -1
  179. package/ui-dist/assets/timeline-definition-FHXFAJF6-Bicewlzo.js.gz +0 -0
  180. package/ui-dist/assets/vennDiagram-L72KCM5P-BxOOnO9x.js.gz +0 -0
  181. package/ui-dist/assets/wardleyDiagram-EHGQE667-Cl7NltMv.js.gz +0 -0
  182. package/ui-dist/assets/x-C1r9IXet.js +1 -0
  183. package/ui-dist/assets/xlsx-DrDuDNAa.js.gz +0 -0
  184. package/ui-dist/assets/xychartDiagram-FW5EYKEG-DiMIxQ7N.js.gz +0 -0
  185. package/ui-dist/index.html +29 -21
  186. package/ui-dist/index.html.gz +0 -0
  187. package/ui-dist/logos/discord.svg.gz +0 -0
  188. package/ui-dist/logos/feishu.svg.gz +0 -0
  189. package/ui-dist/logos/gemini.svg.gz +0 -0
  190. package/ui-dist/logos/mimo.svg.gz +0 -0
  191. package/ui-dist/logos/openai.svg.gz +0 -0
  192. package/ui-dist/logos/slack.svg.gz +0 -0
  193. package/ui-dist/logos/vllm.svg.gz +0 -0
  194. package/ui-dist/logos/weixin.svg.gz +0 -0
  195. package/ui-dist/logos/whatsapp.svg.gz +0 -0
  196. package/ui-dist/logos/zhipu.svg.gz +0 -0
  197. package/ui-dist/offline.html.gz +0 -0
  198. package/ui-dist/runtime-icons/codex-openai.svg.gz +0 -0
  199. package/ui-dist/sw.js.gz +0 -0
  200. package/ui-dist/themes/island/island-atmosphere.webp +0 -0
  201. package/dist/nextclaw-cli-app-scOxgGRP.js.map +0 -1
  202. package/dist/nextclaw-distribution.utils-BneKclXo.js.map +0 -1
  203. package/ui-dist/assets/api-iMkU_o5P.js.gz +0 -0
  204. package/ui-dist/assets/appearance-settings-page-CU5k4b-M.js.gz +0 -0
  205. package/ui-dist/assets/channels-list-page-Drlt62kY.js.gz +0 -0
  206. package/ui-dist/assets/config-split-page-BtJZp1E5.js.gz +0 -0
  207. package/ui-dist/assets/confirm-dialog-k2-Jq_x3.js.gz +0 -0
  208. package/ui-dist/assets/desktop-update-config-BiZmy7FC.js +0 -1
  209. package/ui-dist/assets/desktop-update-config-BiZmy7FC.js.gz +0 -0
  210. package/ui-dist/assets/dist-Cy_e4kNb.js.gz +0 -0
  211. package/ui-dist/assets/dist-m08DUswB.js.gz +0 -0
  212. package/ui-dist/assets/doc-browser-CPsPHh12.js +0 -1
  213. package/ui-dist/assets/doc-browser-context-jiy-O4F8.js.gz +0 -0
  214. package/ui-dist/assets/doc-browser-npOvWtgf.js +0 -1
  215. package/ui-dist/assets/doc-browser-npOvWtgf.js.gz +0 -0
  216. package/ui-dist/assets/extensions-CIb17__o.js.gz +0 -0
  217. package/ui-dist/assets/index-C86hxgv5.css +0 -1
  218. package/ui-dist/assets/index-C86hxgv5.css.gz +0 -0
  219. package/ui-dist/assets/index-CYBXR7zN.js +0 -109
  220. package/ui-dist/assets/index-CYBXR7zN.js.gz +0 -0
  221. package/ui-dist/assets/loader-circle-BlLuRFVW.js +0 -1
  222. package/ui-dist/assets/mcp-marketplace-page-B12JNh7Q.js +0 -1
  223. package/ui-dist/assets/mcp-marketplace-page-kLWW6kzt.js +0 -9
  224. package/ui-dist/assets/mcp-marketplace-page-kLWW6kzt.js.gz +0 -0
  225. package/ui-dist/assets/model-config-page-DSeAjVT_.js +0 -1
  226. package/ui-dist/assets/model-config-page-DSeAjVT_.js.gz +0 -0
  227. package/ui-dist/assets/navigation-link-DAfwFCj4.js.gz +0 -0
  228. package/ui-dist/assets/plus-D4LtWtTk.js +0 -1
  229. package/ui-dist/assets/privacy-settings-page-tN0Mt15x.js +0 -1
  230. package/ui-dist/assets/privacy-settings-page-tN0Mt15x.js.gz +0 -0
  231. package/ui-dist/assets/providers-config-page-CgPrXR1u.js +0 -1
  232. package/ui-dist/assets/providers-config-page-CgPrXR1u.js.gz +0 -0
  233. package/ui-dist/assets/react-8iBFECZE.js +0 -8
  234. package/ui-dist/assets/react-8iBFECZE.js.gz +0 -0
  235. package/ui-dist/assets/remote-Derr_AQp.js +0 -1
  236. package/ui-dist/assets/runtime-config-page-Crq96Jjq.js +0 -1
  237. package/ui-dist/assets/runtime-config-page-Crq96Jjq.js.gz +0 -0
  238. package/ui-dist/assets/search-config-page-CtBcL2uc.js.gz +0 -0
  239. package/ui-dist/assets/secrets-config-page-Q6XfIj0h.js.gz +0 -0
  240. package/ui-dist/assets/security-config-CE9rkQvq.js +0 -1
  241. package/ui-dist/assets/select-lNdozU4o.js.gz +0 -0
  242. package/ui-dist/assets/skeleton-B__aTcly.js +0 -1
  243. package/ui-dist/assets/x-CWdWBu_U.js +0 -1
@@ -0,0 +1,266 @@
1
+ const actions = {
2
+ counterRead: "nextclaw-portable-runtime-lab-state.counter_read",
3
+ counterIncrement: "nextclaw-portable-runtime-lab-state.counter_increment",
4
+ recordsSeed: "nextclaw-portable-runtime-lab-state.records_seed",
5
+ recordsList: "nextclaw-portable-runtime-lab-state.records_list",
6
+ recordUpsert: "nextclaw-portable-runtime-lab-state.record_upsert",
7
+ recordDelete: "nextclaw-portable-runtime-lab-state.record_delete",
8
+ dataSnapshot: "nextclaw-portable-runtime-lab-state.data_snapshot",
9
+ stateRuntime: "nextclaw-portable-runtime-lab-state.runtime_info",
10
+ networkAllowed: "nextclaw-portable-runtime-lab-capabilities.network_allowed",
11
+ networkDenied: "nextclaw-portable-runtime-lab-capabilities.network_denied",
12
+ structuredFailure: "nextclaw-portable-runtime-lab-capabilities.structured_failure",
13
+ timeout: "nextclaw-portable-runtime-lab-capabilities.simulate_timeout",
14
+ capabilityRuntime: "nextclaw-portable-runtime-lab-capabilities.runtime_info",
15
+ residentStatus: "nextclaw-portable-runtime-lab-resident.resident_status",
16
+ residentEmitEvent: "nextclaw-portable-runtime-lab-resident.resident_emit_event",
17
+ residentReset: "nextclaw-portable-runtime-lab-resident.resident_reset",
18
+ providerStatus: "nextclaw-portable-runtime-lab-provider.provider_status",
19
+ composeContact: "nextclaw-portable-runtime-lab-composition.compose_contact",
20
+ providerDenied: "nextclaw-portable-runtime-lab-composition.provider_denied",
21
+ };
22
+
23
+ const scenarios = {
24
+ shared: document.querySelector('[data-scenario="shared"]'),
25
+ data: document.querySelector('[data-scenario="data"]'),
26
+ resident: document.querySelector('[data-scenario="resident"]'),
27
+ composition: document.querySelector('[data-scenario="composition"]'),
28
+ network: document.querySelector('[data-scenario="network"]'),
29
+ failure: document.querySelector('[data-scenario="failure"]'),
30
+ };
31
+
32
+ const residentElements = {
33
+ epoch: document.querySelector('[data-resident="epoch"]'),
34
+ memoryCount: document.querySelector('[data-resident="memory-count"]'),
35
+ eventCount: document.querySelector('[data-resident="event-count"]'),
36
+ lastEvent: document.querySelector('[data-resident="last-event"]'),
37
+ events: document.querySelector("[data-resident-events]"),
38
+ };
39
+
40
+ const compositionElements = {
41
+ name: document.querySelector('[data-field="contact-name"]'),
42
+ email: document.querySelector('[data-field="contact-email"]'),
43
+ tags: document.querySelector('[data-field="contact-tags"]'),
44
+ };
45
+
46
+ const dataElements = {
47
+ id: document.querySelector('[data-field="record-id"]'),
48
+ title: document.querySelector('[data-field="record-title"]'),
49
+ status: document.querySelector('[data-field="record-status"]'),
50
+ records: document.querySelector("[data-records]"),
51
+ };
52
+
53
+ function bridge() {
54
+ const serviceActions = window.nextclaw?.serviceActions;
55
+ if (!serviceActions) throw new Error("NextClaw Panel bridge 尚未就绪,请刷新后重试。");
56
+ return serviceActions;
57
+ }
58
+
59
+ async function invoke(actionId, input = {}) {
60
+ return await bridge().invoke(actionId, input);
61
+ }
62
+
63
+ function setState(scenario, state, value) {
64
+ const container = scenarios[scenario];
65
+ const result = container.querySelector(".result");
66
+ container.dataset.state = state;
67
+ result.textContent = typeof value === "string" ? value : JSON.stringify(value, null, 2);
68
+ for (const button of container.querySelectorAll("button")) {
69
+ button.disabled = state === "pending";
70
+ }
71
+ }
72
+
73
+ function errorValue(error) {
74
+ return {
75
+ code: error?.code ?? "ERROR",
76
+ message: error instanceof Error ? error.message : String(error),
77
+ };
78
+ }
79
+
80
+ async function run(scenario, operation) {
81
+ setState(scenario, "pending", "正在通过宿主执行…");
82
+ try {
83
+ const result = await operation();
84
+ setState(scenario, "success", result);
85
+ } catch (error) {
86
+ setState(scenario, "error", errorValue(error));
87
+ }
88
+ }
89
+
90
+ function renderRecords(data) {
91
+ const records = Array.isArray(data?.records) ? data.records : [];
92
+ dataElements.records.replaceChildren();
93
+ if (records.length === 0) {
94
+ const row = document.createElement("tr");
95
+ const cell = document.createElement("td");
96
+ cell.colSpan = 5;
97
+ cell.textContent = "当前没有记录";
98
+ row.append(cell);
99
+ dataElements.records.append(row);
100
+ return;
101
+ }
102
+ for (const record of records) {
103
+ const row = document.createElement("tr");
104
+ for (const value of [
105
+ record.id,
106
+ record.title,
107
+ record.status,
108
+ Array.isArray(record.tags) ? record.tags.join(", ") : "",
109
+ record.version,
110
+ ]) {
111
+ const cell = document.createElement("td");
112
+ cell.textContent = String(value ?? "");
113
+ row.append(cell);
114
+ }
115
+ dataElements.records.append(row);
116
+ }
117
+ }
118
+
119
+ async function refreshData() {
120
+ const data = await invoke(actions.recordsList);
121
+ renderRecords(data);
122
+ return {
123
+ revision: data.revision,
124
+ recordCount: data.recordCount,
125
+ contentHash: data.contentHash,
126
+ persistedBy: data.persistedBy,
127
+ };
128
+ }
129
+
130
+ function recordInput() {
131
+ return {
132
+ id: dataElements.id.value.trim(),
133
+ title: dataElements.title.value.trim(),
134
+ status: dataElements.status.value,
135
+ tags: ["panel", "verification"],
136
+ };
137
+ }
138
+
139
+ function renderResident(data) {
140
+ residentElements.epoch.textContent = String(data?.instanceEpoch ?? "—");
141
+ residentElements.memoryCount.textContent = String(data?.inMemoryEventCount ?? "—");
142
+ residentElements.eventCount.textContent = String(data?.eventCount ?? "—");
143
+ residentElements.lastEvent.textContent = data?.lastEventKind
144
+ ? `${data.lastEventKind} · ${data.lastEventId}`
145
+ : "—";
146
+ const events = Array.isArray(data?.recentEvents) ? [...data.recentEvents].reverse() : [];
147
+ residentElements.events.replaceChildren();
148
+ if (events.length === 0) {
149
+ const row = document.createElement("tr");
150
+ const cell = document.createElement("td");
151
+ cell.colSpan = 3;
152
+ cell.textContent = "当前没有事件";
153
+ row.append(cell);
154
+ residentElements.events.append(row);
155
+ return;
156
+ }
157
+ for (const event of events) {
158
+ const row = document.createElement("tr");
159
+ for (const value of [event.eventId, event.kind, event.triggeredAt]) {
160
+ const cell = document.createElement("td");
161
+ cell.textContent = String(value ?? "");
162
+ row.append(cell);
163
+ }
164
+ residentElements.events.append(row);
165
+ }
166
+ }
167
+
168
+ async function refreshResident() {
169
+ const data = await invoke(actions.residentStatus);
170
+ renderResident(data);
171
+ return {
172
+ started: data.started,
173
+ instanceEpoch: data.instanceEpoch,
174
+ inMemoryEventCount: data.inMemoryEventCount,
175
+ eventCount: data.eventCount,
176
+ lastEventId: data.lastEventId,
177
+ persistedBy: data.persistedBy,
178
+ };
179
+ }
180
+
181
+ const operations = {
182
+ shared: () => run("shared", async () => {
183
+ const state = await invoke(actions.stateRuntime);
184
+ const capability = await invoke(actions.capabilityRuntime);
185
+ return {
186
+ sameRunner: state.runnerPid === capability.runnerPid,
187
+ stateComponent: state,
188
+ capabilityComponent: capability,
189
+ };
190
+ }),
191
+ "data-refresh": () => run("data", refreshData),
192
+ "data-seed": () => run("data", async () => {
193
+ await invoke(actions.recordsSeed);
194
+ return await refreshData();
195
+ }),
196
+ "data-save": () => run("data", async () => {
197
+ await invoke(actions.recordUpsert, recordInput());
198
+ return await refreshData();
199
+ }),
200
+ "data-delete": () => run("data", async () => {
201
+ await invoke(actions.recordDelete, { id: dataElements.id.value.trim() });
202
+ return await refreshData();
203
+ }),
204
+ "resident-refresh": () => run("resident", refreshResident),
205
+ "resident-event": () => run("resident", async () => {
206
+ await invoke(actions.residentEmitEvent, {
207
+ eventId: `panel-${Date.now()}`,
208
+ kind: "panel-manual",
209
+ triggeredAt: new Date().toISOString(),
210
+ });
211
+ return await refreshResident();
212
+ }),
213
+ "resident-reset": () => run("resident", async () => {
214
+ await invoke(actions.residentReset);
215
+ return await refreshResident();
216
+ }),
217
+ "composition-run": () => run("composition", () => invoke(actions.composeContact, {
218
+ name: compositionElements.name.value,
219
+ email: compositionElements.email.value,
220
+ tags: compositionElements.tags.value.split(",").map((tag) => tag.trim()),
221
+ })),
222
+ "provider-status": () => run("composition", () => invoke(actions.providerStatus)),
223
+ "provider-denied": () => run("composition", () => invoke(actions.providerDenied)),
224
+ "network-allowed": () => run("network", () => invoke(actions.networkAllowed)),
225
+ "network-denied": () => run("network", () => invoke(actions.networkDenied)),
226
+ "structured-failure": () => run("failure", async () => {
227
+ try {
228
+ await invoke(actions.structuredFailure);
229
+ return { failedAsExpected: false };
230
+ } catch (error) {
231
+ return { failedAsExpected: true, error: errorValue(error) };
232
+ }
233
+ }),
234
+ "timeout-recovery": () => run("failure", async () => {
235
+ let timeout;
236
+ try {
237
+ await invoke(actions.timeout);
238
+ timeout = { timedOutAsExpected: false };
239
+ } catch (error) {
240
+ timeout = { timedOutAsExpected: error?.code === "SERVICE_APP_RUNTIME_FAILED", error: errorValue(error) };
241
+ }
242
+ const persistedState = await invoke(actions.dataSnapshot);
243
+ const recoveredRuntime = await invoke(actions.stateRuntime);
244
+ return { timeout, recovered: true, persistedState, recoveredRuntime };
245
+ }),
246
+ };
247
+
248
+ for (const button of document.querySelectorAll("[data-run]")) {
249
+ button.addEventListener("click", () => operations[button.dataset.run]?.());
250
+ }
251
+
252
+ void refreshResident().then((result) => {
253
+ setState("resident", "success", result);
254
+ }).catch((error) => {
255
+ setState("resident", "error", errorValue(error));
256
+ });
257
+
258
+ const residentPoll = setInterval(() => {
259
+ if (document.visibilityState !== "visible") return;
260
+ void refreshResident().then((result) => {
261
+ setState("resident", "success", result);
262
+ }).catch((error) => {
263
+ setState("resident", "error", errorValue(error));
264
+ });
265
+ }, 2000);
266
+ window.addEventListener("pagehide", () => clearInterval(residentPoll), { once: true });
@@ -0,0 +1,87 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
4
+ color: #dce9f8;
5
+ background: #07111f;
6
+ }
7
+
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; min-width: 300px; background: radial-gradient(circle at 85% -10%, #123763 0, transparent 36%), #07111f; }
10
+ button, pre { font: inherit; }
11
+ .shell { width: min(1020px, 100%); margin: 0 auto; padding: 34px 24px 48px; }
12
+ .hero { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; }
13
+ .eyebrow { margin: 0 0 10px; color: #5eead4; font-size: 11px; font-weight: 700; letter-spacing: .14em; }
14
+ h1 { margin: 0; font-size: clamp(28px, 5vw, 46px); letter-spacing: -.04em; line-height: 1.05; }
15
+ .lead { max-width: 660px; margin: 14px 0 0; color: #91a8c2; font-size: 15px; line-height: 1.7; }
16
+ .live-badge { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; border: 1px solid #214363; border-radius: 999px; padding: 7px 11px; color: #b8d2ec; font-size: 12px; }
17
+ .live-badge i { width: 7px; height: 7px; border-radius: 50%; background: #2dd4bf; box-shadow: 0 0 0 4px #2dd4bf1f; }
18
+ .topology { display: grid; grid-template-columns: 1fr auto 1.12fr auto 1fr; align-items: center; gap: 12px; margin: 34px 0; color: #4f7194; }
19
+ .node { min-width: 0; border: 1px solid #1c3550; border-radius: 14px; padding: 14px; text-align: center; color: #dce9f8; background: #0b1a2bba; font-weight: 650; }
20
+ .node small { display: block; margin-top: 5px; color: #6f8aa8; font-size: 11px; font-weight: 500; }
21
+ .node.host { border-color: #2563eb80; background: linear-gradient(135deg, #0f2945, #10213b); box-shadow: inset 0 0 24px #2563eb16; }
22
+ .scenario-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
23
+ .scenario { display: flex; min-height: 280px; flex-direction: column; gap: 18px; border: 1px solid #18314c; border-radius: 18px; padding: 20px; background: #0a1828dc; transition: border-color .2s, background .2s; }
24
+ .scenario[data-state="pending"] { border-color: #38bdf866; background: #0b1d31; }
25
+ .scenario[data-state="success"] { border-color: #2dd4bf66; }
26
+ .scenario[data-state="error"] { border-color: #fb718566; }
27
+ .scenario.benchmark-evidence { grid-column: 1 / -1; min-height: auto; }
28
+ .scenario.data-workbench { grid-column: 1 / -1; min-height: auto; }
29
+ .scenario.resident-workbench { grid-column: 1 / -1; min-height: auto; }
30
+ .scenario.composition-workbench { grid-column: 1 / -1; min-height: auto; }
31
+ .scenario-copy { display: flex; gap: 13px; }
32
+ .number { color: #5eead4; font-size: 12px; font-weight: 800; line-height: 25px; }
33
+ h2 { margin: 0; font-size: 17px; letter-spacing: -.015em; }
34
+ .scenario p { margin: 7px 0 0; color: #8099b5; font-size: 13px; line-height: 1.55; }
35
+ .button-row { display: flex; flex-wrap: wrap; gap: 9px; }
36
+ button { min-height: 36px; border: 1px solid #3b82f6; border-radius: 9px; padding: 8px 13px; color: white; background: #2563eb; font-size: 13px; font-weight: 650; cursor: pointer; transition: background .15s, border-color .15s, transform .15s; }
37
+ button:hover:not(:disabled) { background: #1d4ed8; }
38
+ button:active:not(:disabled) { transform: translateY(1px); }
39
+ button:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }
40
+ button.secondary { border-color: #2b4866; color: #bed0e3; background: #10243a; }
41
+ button.secondary:hover:not(:disabled) { background: #16304b; }
42
+ button.danger { border-color: #9f3b52; background: #7f1d36; }
43
+ button.danger:hover:not(:disabled) { background: #9f2444; }
44
+ button:disabled { cursor: wait; opacity: .55; }
45
+ .data-editor { display: grid; grid-template-columns: minmax(120px, .7fr) minmax(220px, 2fr) minmax(110px, .6fr); gap: 10px; }
46
+ .data-editor label { display: grid; gap: 6px; color: #7892ae; font-size: 11px; font-weight: 650; }
47
+ .data-editor input, .data-editor select { width: 100%; min-height: 38px; border: 1px solid #23425f; border-radius: 9px; padding: 8px 10px; color: #dce9f8; background: #071321; font: inherit; font-size: 13px; }
48
+ .data-editor input:focus, .data-editor select:focus { outline: 2px solid #3b82f6; outline-offset: 1px; }
49
+ .data-table-wrap { overflow-x: auto; border: 1px solid #142a40; border-radius: 11px; }
50
+ table { width: 100%; border-collapse: collapse; font-size: 12px; }
51
+ th, td { padding: 9px 11px; border-bottom: 1px solid #142a40; text-align: left; }
52
+ th { color: #7892ae; background: #071321; font-size: 10px; letter-spacing: .04em; text-transform: uppercase; }
53
+ td { color: #a8bfd7; }
54
+ tbody tr:last-child td { border-bottom: 0; }
55
+ .data-meta { flex: none; min-height: 58px; max-height: 110px; }
56
+ .composition-editor { grid-template-columns: 1fr 1.3fr 1fr; }
57
+ .composition-result { min-height: 130px; }
58
+ .resident-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 0; }
59
+ .resident-metrics div { min-width: 0; border: 1px solid #18314c; border-radius: 12px; padding: 12px; background: #071321; }
60
+ .resident-metrics dt { color: #7892ae; font-size: 10px; }
61
+ .resident-metrics dd { overflow: hidden; margin: 6px 0 0; color: #9be8dc; font-family: "SFMono-Regular", Consolas, monospace; font-size: 13px; text-overflow: ellipsis; white-space: nowrap; }
62
+ .result { flex: 1; min-height: 92px; max-height: 190px; overflow: auto; margin: auto 0 0; border: 1px solid #142a40; border-radius: 11px; padding: 12px; color: #8eabc8; background: #050d17; font-family: "SFMono-Regular", Consolas, monospace; font-size: 11px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }
63
+ .scenario[data-state="success"] .result { color: #9be8dc; }
64
+ .scenario[data-state="error"] .result { color: #fda4af; }
65
+ .metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 0; }
66
+ .metric-grid div { border: 1px solid #18314c; border-radius: 12px; padding: 13px; background: #071321; }
67
+ .metric-grid dt { min-height: 34px; color: #7892ae; font-size: 11px; line-height: 1.45; }
68
+ .metric-grid dd { margin: 7px 0 0; color: #9be8dc; font-family: "SFMono-Regular", Consolas, monospace; font-size: 18px; font-weight: 700; }
69
+ .metric-grid small { color: #6884a2; font-size: 10px; font-weight: 600; }
70
+ .benchmark-note { margin-top: 0 !important; }
71
+ footer { margin-top: 18px; border-left: 2px solid #2dd4bf; padding: 8px 0 8px 14px; color: #718aa5; font-size: 12px; line-height: 1.65; }
72
+ footer strong { color: #a8bfd7; }
73
+
74
+ @media (max-width: 720px) {
75
+ .shell { padding: 24px 15px 36px; }
76
+ .hero { flex-direction: column; }
77
+ .topology { grid-template-columns: 1fr; }
78
+ .topology > span { transform: rotate(90deg); text-align: center; }
79
+ .scenario-grid { grid-template-columns: 1fr; }
80
+ .data-editor { grid-template-columns: 1fr; }
81
+ .metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
82
+ .resident-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
83
+ }
84
+
85
+ @media (prefers-reduced-motion: reduce) {
86
+ * { scroll-behavior: auto !important; transition: none !important; }
87
+ }
@@ -0,0 +1,154 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>开发者验证台</title>
7
+ <link rel="stylesheet" href="assets/style.css" />
8
+ </head>
9
+ <body>
10
+ <main class="shell">
11
+ <header class="hero">
12
+ <div>
13
+ <p class="eyebrow">RUST · WASM COMPONENT · HOST CAPABILITIES</p>
14
+ <h1>开发者验证台</h1>
15
+ <p class="lead">这里是四个日常小应用背后的技术证据。普通体验请直接打开「今日清单」「灵感便签」「专注小钟」或「联系人整理」。</p>
16
+ </div>
17
+ <span class="live-badge"><i></i> 可交互 Demo</span>
18
+ </header>
19
+
20
+ <section class="topology" aria-label="运行拓扑">
21
+ <div class="node guest">Action Components<small>State + Capability</small></div>
22
+ <span aria-hidden="true">→</span>
23
+ <div class="node host">Shared Runner<small>Wasmtime + WIT</small></div>
24
+ <span aria-hidden="true">←</span>
25
+ <div class="node guest">Resident Component<small>Retained instance + events</small></div>
26
+ </section>
27
+
28
+ <section class="scenario-grid" aria-label="验证场景">
29
+ <article class="scenario" data-scenario="shared">
30
+ <div class="scenario-copy">
31
+ <span class="number">01</span>
32
+ <div><h2>共享宿主</h2><p>分别调用两个 Component,比较 runner PID 与已加载模块数。</p></div>
33
+ </div>
34
+ <button type="button" data-run="shared">验证同一进程</button>
35
+ <pre class="result" aria-live="polite">尚未执行</pre>
36
+ </article>
37
+
38
+ <article class="scenario data-workbench" data-scenario="data">
39
+ <div class="scenario-copy">
40
+ <span class="number">02</span>
41
+ <div><h2>结构化数据与持久化证据</h2><p>在 Rust/WASM 中执行 CRUD;Guest 只使用宿主 KV,数据位置与生命周期仍由 NextClaw 管理。</p></div>
42
+ </div>
43
+ <div class="data-editor">
44
+ <label>ID<input data-field="record-id" value="delta" maxlength="48" /></label>
45
+ <label>标题<input data-field="record-title" value="从 Agent 与 Panel 共用 Action" /></label>
46
+ <label>状态<select data-field="record-status"><option value="active">active</option><option value="pending">pending</option><option value="done">done</option></select></label>
47
+ </div>
48
+ <div class="button-row">
49
+ <button type="button" data-run="data-refresh" class="secondary">读取数据</button>
50
+ <button type="button" data-run="data-seed">生成 3 条基线</button>
51
+ <button type="button" data-run="data-save">创建或修改</button>
52
+ <button type="button" data-run="data-delete" class="danger">删除 ID</button>
53
+ </div>
54
+ <div class="data-table-wrap">
55
+ <table>
56
+ <thead><tr><th>ID</th><th>标题</th><th>状态</th><th>标签</th><th>版本</th></tr></thead>
57
+ <tbody data-records><tr><td colspan="5">尚未读取</td></tr></tbody>
58
+ </table>
59
+ </div>
60
+ <pre class="result data-meta" aria-live="polite">尚未执行</pre>
61
+ </article>
62
+
63
+ <article class="scenario resident-workbench" data-scenario="resident">
64
+ <div class="scenario-copy">
65
+ <span class="number">03</span>
66
+ <div><h2>Resident Service 与后台事件</h2><p>宿主保留同一个 WASM 实例,每秒投递真实 timer event;关闭 Panel 后仍继续。内存计数证明实例连续,durable cursor 证明跨重启恢复。</p></div>
67
+ </div>
68
+ <div class="button-row">
69
+ <button type="button" data-run="resident-refresh" class="secondary">读取当前状态</button>
70
+ <button type="button" data-run="resident-event">投递手动事件</button>
71
+ <button type="button" data-run="resident-reset" class="danger">重置事件证据</button>
72
+ </div>
73
+ <dl class="resident-metrics">
74
+ <div><dt>实例代次</dt><dd data-resident="epoch">—</dd></div>
75
+ <div><dt>内存事件数</dt><dd data-resident="memory-count">—</dd></div>
76
+ <div><dt>持久事件数</dt><dd data-resident="event-count">—</dd></div>
77
+ <div><dt>最后事件</dt><dd data-resident="last-event">—</dd></div>
78
+ </dl>
79
+ <div class="data-table-wrap">
80
+ <table>
81
+ <thead><tr><th>Event ID</th><th>类型</th><th>宿主投递时间</th></tr></thead>
82
+ <tbody data-resident-events><tr><td colspan="3">尚未读取</td></tr></tbody>
83
+ </table>
84
+ </div>
85
+ <pre class="result data-meta" aria-live="polite">尚未执行</pre>
86
+ </article>
87
+
88
+ <article class="scenario composition-workbench" data-scenario="composition">
89
+ <div class="scenario-copy">
90
+ <span class="number">04</span>
91
+ <div><h2>Component Provider 与跨模块组合</h2><p>Consumer 不包含联系人规范化逻辑,而是通过宿主调用 manifest 明确声明的独立 Provider;未声明的 Provider 会被宿主拒绝。</p></div>
92
+ </div>
93
+ <div class="data-editor composition-editor">
94
+ <label>姓名<input data-field="contact-name" value=" Ada Lovelace " /></label>
95
+ <label>邮箱<input data-field="contact-email" value=" ADA@EXAMPLE.COM " /></label>
96
+ <label>标签<input data-field="contact-tags" value="AI, ai, Math" /></label>
97
+ </div>
98
+ <div class="button-row">
99
+ <button type="button" data-run="composition-run">执行组合工作流</button>
100
+ <button type="button" data-run="provider-status" class="secondary">读取 Provider 状态</button>
101
+ <button type="button" data-run="provider-denied" class="danger">验证未声明拒绝</button>
102
+ </div>
103
+ <pre class="result composition-result" aria-live="polite">尚未执行</pre>
104
+ </article>
105
+
106
+ <article class="scenario" data-scenario="network">
107
+ <div class="scenario-copy">
108
+ <span class="number">05</span>
109
+ <div><h2>受控网络</h2><p>同一个 HTTP 原语:manifest 白名单内放行,白名单外明确拒绝。</p></div>
110
+ </div>
111
+ <div class="button-row">
112
+ <button type="button" data-run="network-allowed">允许的请求</button>
113
+ <button type="button" data-run="network-denied" class="secondary">拒绝的请求</button>
114
+ </div>
115
+ <pre class="result" aria-live="polite">尚未执行</pre>
116
+ </article>
117
+
118
+ <article class="scenario" data-scenario="failure">
119
+ <div class="scenario-copy">
120
+ <span class="number">06</span>
121
+ <div><h2>失败与恢复</h2><p>观察 Guest 错误与执行超时;超时后 runner 自动重建,并重新读取相同数据快照。</p></div>
122
+ </div>
123
+ <div class="button-row">
124
+ <button type="button" data-run="structured-failure" class="danger">结构化失败</button>
125
+ <button type="button" data-run="timeout-recovery" class="secondary">超时并恢复</button>
126
+ </div>
127
+ <pre class="result" aria-live="polite">尚未执行</pre>
128
+ </article>
129
+
130
+ <article class="scenario benchmark-evidence">
131
+ <div class="scenario-copy">
132
+ <span class="number">07</span>
133
+ <div><h2>内存密度基准</h2><p>Apple Silicon、Node 22.16 上重复三轮;每个 Component 使用独立 artifact 路径,每个 Node Service 使用独立进程。</p></div>
134
+ </div>
135
+ <dl class="metric-grid">
136
+ <div><dt>空 runner</dt><dd>7.70–7.73 <small>MiB</small></dd></div>
137
+ <div><dt>1 Component</dt><dd>34.17–36.77 <small>MiB</small></dd></div>
138
+ <div><dt>5 Components</dt><dd>43.86–44.72 <small>MiB</small></dd></div>
139
+ <div><dt>10 Components</dt><dd>50.84–53.17 <small>MiB</small></dd></div>
140
+ <div><dt>1 Node Service</dt><dd>39.88–39.91 <small>MiB</small></dd></div>
141
+ <div><dt>5 Node Services</dt><dd>199.61–199.70 <small>MiB</small></dd></div>
142
+ <div><dt>10 Node Services</dt><dd>399.25–399.47 <small>MiB</small></dd></div>
143
+ </dl>
144
+ <p class="benchmark-note">这是开发机上的密度证据,不是等价业务 workload 的最终结论;Resident 密度、CPU/延迟和跨平台仍待验证。</p>
145
+ </article>
146
+ </section>
147
+
148
+ <footer>
149
+ <strong>当前覆盖:</strong>Action、Agent Tool、真实数据、Resident、后台事件、Component Provider、跨组件组合、网络权限、故障恢复与共享宿主。
150
+ </footer>
151
+ </main>
152
+ <script src="assets/app.js"></script>
153
+ </body>
154
+ </html>
@@ -0,0 +1,29 @@
1
+ {
2
+ "id": "nextclaw-portable-runtime-lab-panel",
3
+ "title": "开发者验证台",
4
+ "description": "查看四个日常小应用背后的 Rust/WASM 运行链证据。",
5
+ "entry": "index.html",
6
+ "actions": [
7
+ "nextclaw-portable-runtime-lab-state.counter_read",
8
+ "nextclaw-portable-runtime-lab-state.counter_increment",
9
+ "nextclaw-portable-runtime-lab-state.records_seed",
10
+ "nextclaw-portable-runtime-lab-state.records_list",
11
+ "nextclaw-portable-runtime-lab-state.record_upsert",
12
+ "nextclaw-portable-runtime-lab-state.record_delete",
13
+ "nextclaw-portable-runtime-lab-state.data_snapshot",
14
+ "nextclaw-portable-runtime-lab-state.runtime_info",
15
+ "nextclaw-portable-runtime-lab-capabilities.network_allowed",
16
+ "nextclaw-portable-runtime-lab-capabilities.network_denied",
17
+ "nextclaw-portable-runtime-lab-capabilities.structured_failure",
18
+ "nextclaw-portable-runtime-lab-capabilities.simulate_timeout",
19
+ "nextclaw-portable-runtime-lab-capabilities.runtime_info",
20
+ "nextclaw-portable-runtime-lab-resident.resident_status",
21
+ "nextclaw-portable-runtime-lab-resident.resident_emit_event",
22
+ "nextclaw-portable-runtime-lab-resident.resident_reset",
23
+ "nextclaw-portable-runtime-lab-resident.runtime_info",
24
+ "nextclaw-portable-runtime-lab-provider.provider_status",
25
+ "nextclaw-portable-runtime-lab-composition.compose_contact",
26
+ "nextclaw-portable-runtime-lab-composition.provider_denied",
27
+ "nextclaw-portable-runtime-lab-composition.runtime_info"
28
+ ]
29
+ }