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.
- package/dist/cli/app/index.js +2 -2
- package/dist/cli/launcher/index.js +1 -1
- package/dist/{nextclaw-cli-app-scOxgGRP.js → nextclaw-cli-app-Bwa2L2Jv.js} +306 -22
- package/dist/nextclaw-cli-app-Bwa2L2Jv.js.map +1 -0
- package/dist/{nextclaw-distribution.utils-BneKclXo.js → nextclaw-distribution.utils-Bba2GRvc.js} +4 -2
- package/dist/nextclaw-distribution.utils-Bba2GRvc.js.map +1 -0
- package/package.json +15 -14
- package/resources/USAGE.md +36 -4
- package/resources/apps/nextclaw-personal-organizer/README.md +1 -1
- package/resources/apps/nextclaw-portable-runtime-lab/README.md +34 -0
- package/resources/apps/nextclaw-portable-runtime-lab/assets/icon.svg +12 -0
- package/resources/apps/nextclaw-portable-runtime-lab/manifest.json +74 -0
- package/resources/apps/nextclaw-portable-runtime-lab/marketplace.json +21 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/assets/app.js +92 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/assets/style.css +43 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/index.html +43 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-contacts.panel/panel-app.json +10 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/assets/app.js +132 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/assets/style.css +39 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/index.html +40 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-focus.panel/panel-app.json +14 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/assets/app.js +117 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/assets/style.css +41 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/index.html +41 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-notes.panel/panel-app.json +12 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/assets/app.js +266 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/assets/style.css +87 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/index.html +154 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-panel.panel/panel-app.json +29 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/assets/app.js +143 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/assets/style.css +48 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/index.html +45 -0
- package/resources/apps/nextclaw-portable-runtime-lab/panels/nextclaw-portable-runtime-lab-todos.panel/panel-app.json +12 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-capabilities/service-app.json +20 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-capabilities/service.wasm +0 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-composition/service-app.json +30 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-composition/service.wasm +0 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-provider/service-app.json +30 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-provider/service.wasm +0 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-resident/service-app.json +31 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-resident/service.wasm +0 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-state/service-app.json +49 -0
- package/resources/apps/nextclaw-portable-runtime-lab/service-components/nextclaw-portable-runtime-lab-state/service.wasm +0 -0
- package/ui-dist/assets/abnfDiagram-VRR7QNED-BcFJp_1X.js.gz +0 -0
- package/ui-dist/assets/aiden0z-pptx-renderer.es-Dp2ezlQn.js.gz +0 -0
- package/ui-dist/assets/{api-iMkU_o5P.js → api-m33O1Kb0.js} +6 -6
- package/ui-dist/assets/api-m33O1Kb0.js.gz +0 -0
- package/ui-dist/assets/{appearance-settings-page-CU5k4b-M.js → appearance-settings-page-x4Vjnfmz.js} +1 -1
- package/ui-dist/assets/appearance-settings-page-x4Vjnfmz.js.gz +0 -0
- package/ui-dist/assets/arc-CkgyPMyW.js.gz +0 -0
- package/ui-dist/assets/architectureDiagram-ZJ3FMSHR-CMd4cIjI.js.gz +0 -0
- package/ui-dist/assets/blockDiagram-677ZJIJ3-Bz3tbhet.js.gz +0 -0
- package/ui-dist/assets/{book-open-nD8gdMhA.js → book-open-BHiasMCg.js} +1 -1
- package/ui-dist/assets/c4Diagram-LMCZKHZV-D9hFNAGv.js.gz +0 -0
- package/ui-dist/assets/{channels-list-page-Drlt62kY.js → channels-list-page-DOxJZeXq.js} +2 -2
- package/ui-dist/assets/channels-list-page-DOxJZeXq.js.gz +0 -0
- package/ui-dist/assets/chunk-32BRIVSS-7NrjEITq.js.gz +0 -0
- package/ui-dist/assets/chunk-52WLFC77-viIcqj9q.js.gz +0 -0
- package/ui-dist/assets/chunk-5JV3BV7I-CuKgJQ4W.js.gz +0 -0
- package/ui-dist/assets/chunk-5TONJI2A-CYeiWZKb.js.gz +0 -0
- package/ui-dist/assets/chunk-7BUUIJ7U-BvydOcm3.js.gz +0 -0
- package/ui-dist/assets/chunk-C7G6YPKG-DAizzYwr.js.gz +0 -0
- package/ui-dist/assets/chunk-DseTPa7n.js.gz +0 -0
- package/ui-dist/assets/chunk-EX3LRPZG-BmlDFIRW.js.gz +0 -0
- package/ui-dist/assets/chunk-FWX5IMBZ-D0ksHZZ9.js.gz +0 -0
- package/ui-dist/assets/chunk-HOUHSVGY-DPkq8FCm.js.gz +0 -0
- package/ui-dist/assets/chunk-ICXQ74PX-FAatv5fC.js.gz +0 -0
- package/ui-dist/assets/chunk-JG7HCLWE-DLkIi4F7.js.gz +0 -0
- package/ui-dist/assets/chunk-KEIR6QF5-f9psyCXK.js.gz +0 -0
- package/ui-dist/assets/chunk-MOJQB5TN-Di52TorW.js.gz +0 -0
- package/ui-dist/assets/chunk-PUDLZKDR-f3IJh3sN.js.gz +0 -0
- package/ui-dist/assets/chunk-Q4XR5HBZ-DQFeUPxZ.js.gz +0 -0
- package/ui-dist/assets/chunk-R7FJI6CG-C3XpZ-2u.js.gz +0 -0
- package/ui-dist/assets/chunk-RYQCIY6F-CAqa5klQ.js.gz +0 -0
- package/ui-dist/assets/chunk-U6XO7XAA-D_WXezeD.js.gz +0 -0
- package/ui-dist/assets/chunk-V7JOEXUC-CZ70oOtp.js.gz +0 -0
- package/ui-dist/assets/chunk-WYO6CB5R-Dn9To_OI.js.gz +0 -0
- package/ui-dist/assets/chunk-ZGVPDNZ5-C6YtZDU0.js.gz +0 -0
- package/ui-dist/assets/chunk-ZIRB5QZD-DMuYtnHF.js.gz +0 -0
- package/ui-dist/assets/{config-split-page-BtJZp1E5.js → config-split-page-DBnMEP1o.js} +1 -1
- package/ui-dist/assets/config-split-page-DBnMEP1o.js.gz +0 -0
- package/ui-dist/assets/{confirm-dialog-k2-Jq_x3.js → confirm-dialog-f5NKLh5I.js} +2 -2
- package/ui-dist/assets/confirm-dialog-f5NKLh5I.js.gz +0 -0
- package/ui-dist/assets/cose-bilkent-JH36ORCC-Bc2Ex5Y3.js.gz +0 -0
- package/ui-dist/assets/{createLucideIcon-DxlwKLr-.js → createLucideIcon-CHALGA42.js} +1 -1
- package/ui-dist/assets/cynefinDiagram-TSTJHNR4-DVysQoGz.js.gz +0 -0
- package/ui-dist/assets/cytoscape.esm-0uDtdD0l.js.gz +0 -0
- package/ui-dist/assets/dagre-CMhQ1cAG.js.gz +0 -0
- package/ui-dist/assets/dagre-VKFMJZFB-RYyWpPJZ.js.gz +0 -0
- package/ui-dist/assets/defaultLocale-DSWXGgt0.js.gz +0 -0
- package/ui-dist/assets/desktop-capabilities-page-DixayAe6.js +1 -0
- package/ui-dist/assets/desktop-capabilities-page-DixayAe6.js.gz +0 -0
- package/ui-dist/assets/desktop-update-config-ChhfeOHj.js +1 -0
- package/ui-dist/assets/desktop-update-config-ChhfeOHj.js.gz +0 -0
- package/ui-dist/assets/diagram-FQU43EPY-BD6KONdF.js.gz +0 -0
- package/ui-dist/assets/diagram-G47NLZAW-CGB2ptRR.js.gz +0 -0
- package/ui-dist/assets/diagram-NH7WQ7WH-DnkOI6cU.js.gz +0 -0
- package/ui-dist/assets/diagram-OA4YK3LP-DF82RZ7P.js.gz +0 -0
- package/ui-dist/assets/diagram-WEI45ONY-Be2v7Ck9.js.gz +0 -0
- package/ui-dist/assets/dist--ta5rX12.js.gz +0 -0
- package/ui-dist/assets/{dist-Cy_e4kNb.js → dist-_UMsWSY0.js} +1 -1
- package/ui-dist/assets/dist-_UMsWSY0.js.gz +0 -0
- package/ui-dist/assets/{dist-m08DUswB.js → dist-sD6V4nHX.js} +1 -1
- package/ui-dist/assets/dist-sD6V4nHX.js.gz +0 -0
- package/ui-dist/assets/doc-browser-Bq7LJsQY.js +1 -0
- package/ui-dist/assets/doc-browser-Bq7LJsQY.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BuDgpY2e.js +1 -0
- package/ui-dist/assets/{doc-browser-context-jiy-O4F8.js → doc-browser-context-Capim3og.js} +1 -1
- package/ui-dist/assets/doc-browser-context-Capim3og.js.gz +0 -0
- package/ui-dist/assets/docx-preview-BqwAjrj3.js.gz +0 -0
- package/ui-dist/assets/ebnfDiagram-CCIWWBDH-CP98OYk8.js.gz +0 -0
- package/ui-dist/assets/erDiagram-Q63AITRT-ZLlx8xfs.js.gz +0 -0
- package/ui-dist/assets/{extensions-CIb17__o.js → extensions-Bdclr3Wr.js} +1 -1
- package/ui-dist/assets/extensions-Bdclr3Wr.js.gz +0 -0
- package/ui-dist/assets/{form-actions-DGf5zUg_.js → form-actions-CH0kWhEt.js} +1 -1
- package/ui-dist/assets/ganttDiagram-NO4QXBWP-DXCDjHR2.js.gz +0 -0
- package/ui-dist/assets/gitGraphDiagram-IHSO6WYX-l2HWrTJp.js.gz +0 -0
- package/ui-dist/assets/graphlib-CQ6QV4yP.js.gz +0 -0
- package/ui-dist/assets/index-BjxnLYE3.js +109 -0
- package/ui-dist/assets/index-BjxnLYE3.js.gz +0 -0
- package/ui-dist/assets/index-CBmwJjwE.css +1 -0
- package/ui-dist/assets/index-CBmwJjwE.css.gz +0 -0
- package/ui-dist/assets/ishikawaDiagram-FXEZZL3T-y_Xy128F.js.gz +0 -0
- package/ui-dist/assets/journeyDiagram-5HDEW3XC-DJn5xYcQ.js.gz +0 -0
- package/ui-dist/assets/jszip.min-8hyJpgpx.js.gz +0 -0
- package/ui-dist/assets/kanban-definition-HUTT4EX6-DJVIOR21.js.gz +0 -0
- package/ui-dist/assets/katex-ARhY9PS1.js.gz +0 -0
- package/ui-dist/assets/linear-BtDLqtzF.js.gz +0 -0
- package/ui-dist/assets/loader-circle-CH_0iPLy.js +1 -0
- package/ui-dist/assets/map-BKnQyvd0.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-BUsxLVB5.js +10 -0
- package/ui-dist/assets/mcp-marketplace-page-BUsxLVB5.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-GPRV3fB0.js +1 -0
- package/ui-dist/assets/mermaid-parser.core-XUNZhr2W.js.gz +0 -0
- package/ui-dist/assets/mermaid.core-ySrvolIe.js.gz +0 -0
- package/ui-dist/assets/middleware-DXsbf9xI.js.gz +0 -0
- package/ui-dist/assets/mindmap-definition-LN4V7U3C-BypL9tei.js.gz +0 -0
- package/ui-dist/assets/model-config-page-CIevwqp4.js +1 -0
- package/ui-dist/assets/model-config-page-CIevwqp4.js.gz +0 -0
- package/ui-dist/assets/{navigation-link-DAfwFCj4.js → navigation-link-CAUiM3zS.js} +1 -1
- package/ui-dist/assets/navigation-link-CAUiM3zS.js.gz +0 -0
- package/ui-dist/assets/ordinal-CxxVWxYU.js.gz +0 -0
- package/ui-dist/assets/path-10BjdyLh.js.gz +0 -0
- package/ui-dist/assets/pegDiagram-2B236MQR-D-U2KBGv.js.gz +0 -0
- package/ui-dist/assets/pieDiagram-ENE6RG2P-CBi3GusJ.js.gz +0 -0
- package/ui-dist/assets/plus-B3obD55V.js +1 -0
- package/ui-dist/assets/preload-helper-D4M6sveU.js.gz +0 -0
- package/ui-dist/assets/privacy-settings-page-CNKfZsYH.js +1 -0
- package/ui-dist/assets/privacy-settings-page-CNKfZsYH.js.gz +0 -0
- package/ui-dist/assets/providers-config-page-DAah2NIS.js +1 -0
- package/ui-dist/assets/providers-config-page-DAah2NIS.js.gz +0 -0
- package/ui-dist/assets/quadrantDiagram-ABIIQ3AL-H0ZuvnZL.js.gz +0 -0
- package/ui-dist/assets/railroadDiagram-RFXS5EU6-D7Y2EqSd.js.gz +0 -0
- package/ui-dist/assets/react-Co6JiC1n.js +8 -0
- package/ui-dist/assets/react-Co6JiC1n.js.gz +0 -0
- package/ui-dist/assets/{refresh-cw-D_Eibznw.js → refresh-cw-BG_LX3SS.js} +1 -1
- package/ui-dist/assets/remote-DuscgfvR.js +1 -0
- package/ui-dist/assets/requirementDiagram-TGXJPOKE-BiXNX1NN.js.gz +0 -0
- package/ui-dist/assets/{rotate-cw-QQjmoWuq.js → rotate-cw-Cz7I_m7O.js} +1 -1
- package/ui-dist/assets/rough.esm-DxgC_14r.js.gz +0 -0
- package/ui-dist/assets/runtime-config-page-Cl1RpmSC.js +1 -0
- package/ui-dist/assets/runtime-config-page-Cl1RpmSC.js.gz +0 -0
- package/ui-dist/assets/sankeyDiagram-HTMAVEWB-qzDeLztW.js.gz +0 -0
- package/ui-dist/assets/{save-W2xthJJ2.js → save-BiHnb8ps.js} +1 -1
- package/ui-dist/assets/{search-Vih1R2BD.js → search-C47TyRg0.js} +1 -1
- package/ui-dist/assets/{search-config-page-CtBcL2uc.js → search-config-page-BAIzd6gN.js} +1 -1
- package/ui-dist/assets/search-config-page-BAIzd6gN.js.gz +0 -0
- package/ui-dist/assets/{secrets-config-page-Q6XfIj0h.js → secrets-config-page-Ddi-n43R.js} +2 -2
- package/ui-dist/assets/secrets-config-page-Ddi-n43R.js.gz +0 -0
- package/ui-dist/assets/security-config-C8MHnE1r.js +1 -0
- package/ui-dist/assets/{select-lNdozU4o.js → select-BzQKfW1e.js} +2 -2
- package/ui-dist/assets/select-BzQKfW1e.js.gz +0 -0
- package/ui-dist/assets/sequenceDiagram-DBY2YBRQ-BtRbPQtL.js.gz +0 -0
- package/ui-dist/assets/skeleton-BXFAE9SE.js +1 -0
- package/ui-dist/assets/src-Bw-mzbQb.js.gz +0 -0
- package/ui-dist/assets/stateDiagram-2N3HPSRC-BJ-mFeOz.js.gz +0 -0
- package/ui-dist/assets/swimlanes-5IMT3BWC-BsucVOO2.js.gz +0 -0
- package/ui-dist/assets/{tag-chip-gdaU9bE7.js → tag-chip-C3K814HZ.js} +1 -1
- package/ui-dist/assets/timeline-definition-FHXFAJF6-Bicewlzo.js.gz +0 -0
- package/ui-dist/assets/vennDiagram-L72KCM5P-BxOOnO9x.js.gz +0 -0
- package/ui-dist/assets/wardleyDiagram-EHGQE667-Cl7NltMv.js.gz +0 -0
- package/ui-dist/assets/x-C1r9IXet.js +1 -0
- package/ui-dist/assets/xlsx-DrDuDNAa.js.gz +0 -0
- package/ui-dist/assets/xychartDiagram-FW5EYKEG-DiMIxQ7N.js.gz +0 -0
- package/ui-dist/index.html +29 -21
- package/ui-dist/index.html.gz +0 -0
- package/ui-dist/logos/discord.svg.gz +0 -0
- package/ui-dist/logos/feishu.svg.gz +0 -0
- package/ui-dist/logos/gemini.svg.gz +0 -0
- package/ui-dist/logos/mimo.svg.gz +0 -0
- package/ui-dist/logos/openai.svg.gz +0 -0
- package/ui-dist/logos/slack.svg.gz +0 -0
- package/ui-dist/logos/vllm.svg.gz +0 -0
- package/ui-dist/logos/weixin.svg.gz +0 -0
- package/ui-dist/logos/whatsapp.svg.gz +0 -0
- package/ui-dist/logos/zhipu.svg.gz +0 -0
- package/ui-dist/offline.html.gz +0 -0
- package/ui-dist/runtime-icons/codex-openai.svg.gz +0 -0
- package/ui-dist/sw.js.gz +0 -0
- package/ui-dist/themes/island/island-atmosphere.webp +0 -0
- package/dist/nextclaw-cli-app-scOxgGRP.js.map +0 -1
- package/dist/nextclaw-distribution.utils-BneKclXo.js.map +0 -1
- package/ui-dist/assets/api-iMkU_o5P.js.gz +0 -0
- package/ui-dist/assets/appearance-settings-page-CU5k4b-M.js.gz +0 -0
- package/ui-dist/assets/channels-list-page-Drlt62kY.js.gz +0 -0
- package/ui-dist/assets/config-split-page-BtJZp1E5.js.gz +0 -0
- package/ui-dist/assets/confirm-dialog-k2-Jq_x3.js.gz +0 -0
- package/ui-dist/assets/desktop-update-config-BiZmy7FC.js +0 -1
- package/ui-dist/assets/desktop-update-config-BiZmy7FC.js.gz +0 -0
- package/ui-dist/assets/dist-Cy_e4kNb.js.gz +0 -0
- package/ui-dist/assets/dist-m08DUswB.js.gz +0 -0
- package/ui-dist/assets/doc-browser-CPsPHh12.js +0 -1
- package/ui-dist/assets/doc-browser-context-jiy-O4F8.js.gz +0 -0
- package/ui-dist/assets/doc-browser-npOvWtgf.js +0 -1
- package/ui-dist/assets/doc-browser-npOvWtgf.js.gz +0 -0
- package/ui-dist/assets/extensions-CIb17__o.js.gz +0 -0
- package/ui-dist/assets/index-C86hxgv5.css +0 -1
- package/ui-dist/assets/index-C86hxgv5.css.gz +0 -0
- package/ui-dist/assets/index-CYBXR7zN.js +0 -109
- package/ui-dist/assets/index-CYBXR7zN.js.gz +0 -0
- package/ui-dist/assets/loader-circle-BlLuRFVW.js +0 -1
- package/ui-dist/assets/mcp-marketplace-page-B12JNh7Q.js +0 -1
- package/ui-dist/assets/mcp-marketplace-page-kLWW6kzt.js +0 -9
- package/ui-dist/assets/mcp-marketplace-page-kLWW6kzt.js.gz +0 -0
- package/ui-dist/assets/model-config-page-DSeAjVT_.js +0 -1
- package/ui-dist/assets/model-config-page-DSeAjVT_.js.gz +0 -0
- package/ui-dist/assets/navigation-link-DAfwFCj4.js.gz +0 -0
- package/ui-dist/assets/plus-D4LtWtTk.js +0 -1
- package/ui-dist/assets/privacy-settings-page-tN0Mt15x.js +0 -1
- package/ui-dist/assets/privacy-settings-page-tN0Mt15x.js.gz +0 -0
- package/ui-dist/assets/providers-config-page-CgPrXR1u.js +0 -1
- package/ui-dist/assets/providers-config-page-CgPrXR1u.js.gz +0 -0
- package/ui-dist/assets/react-8iBFECZE.js +0 -8
- package/ui-dist/assets/react-8iBFECZE.js.gz +0 -0
- package/ui-dist/assets/remote-Derr_AQp.js +0 -1
- package/ui-dist/assets/runtime-config-page-Crq96Jjq.js +0 -1
- package/ui-dist/assets/runtime-config-page-Crq96Jjq.js.gz +0 -0
- package/ui-dist/assets/search-config-page-CtBcL2uc.js.gz +0 -0
- package/ui-dist/assets/secrets-config-page-Q6XfIj0h.js.gz +0 -0
- package/ui-dist/assets/security-config-CE9rkQvq.js +0 -1
- package/ui-dist/assets/select-lNdozU4o.js.gz +0 -0
- package/ui-dist/assets/skeleton-B__aTcly.js +0 -1
- package/ui-dist/assets/x-CWdWBu_U.js +0 -1
package/dist/{nextclaw-distribution.utils-BneKclXo.js → nextclaw-distribution.utils-Bba2GRvc.js}
RENAMED
|
@@ -6,6 +6,7 @@ function createNextclawDistribution(importMetaUrl) {
|
|
|
6
6
|
const entrypoint = fileURLToPath(importMetaUrl);
|
|
7
7
|
const packageRoot = resolve(dirname(entrypoint), "../../..");
|
|
8
8
|
const { version } = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf-8"));
|
|
9
|
+
const portableRunnerExecutable = process.platform === "win32" ? "nextclaw-wasmtime-runner.exe" : "nextclaw-wasmtime-runner";
|
|
9
10
|
return {
|
|
10
11
|
version: typeof version === "string" ? version : "0.0.0",
|
|
11
12
|
appEntrypoint: resolve(packageRoot, "dist/cli/app/index.js"),
|
|
@@ -15,10 +16,11 @@ function createNextclawDistribution(importMetaUrl) {
|
|
|
15
16
|
templatesDir: resolve(packageRoot, "templates"),
|
|
16
17
|
uiDistDir: resolve(packageRoot, "ui-dist"),
|
|
17
18
|
runtimeUpdatePublicKeyPath: resolve(packageRoot, "resources/update-bundle-public.pem"),
|
|
18
|
-
builtInAppsDirectory: resolve(packageRoot, "resources/apps")
|
|
19
|
+
builtInAppsDirectory: resolve(packageRoot, "resources/apps"),
|
|
20
|
+
portableServiceRunnerPath: resolve(packageRoot, "resources/native", `${process.platform}-${process.arch}`, portableRunnerExecutable)
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
//#endregion
|
|
22
24
|
export { createNextclawDistribution as t };
|
|
23
25
|
|
|
24
|
-
//# sourceMappingURL=nextclaw-distribution.utils-
|
|
26
|
+
//# sourceMappingURL=nextclaw-distribution.utils-Bba2GRvc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextclaw-distribution.utils-Bba2GRvc.js","names":[],"sources":["../src/cli/shared/lib/distribution/nextclaw-distribution.utils.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { NextclawDistribution } from \"@nextclaw/service\";\n\nexport function createNextclawDistribution(importMetaUrl: string): NextclawDistribution {\n const entrypoint = fileURLToPath(importMetaUrl);\n const packageRoot = resolve(dirname(entrypoint), \"../../..\");\n const { version } = JSON.parse(readFileSync(resolve(packageRoot, \"package.json\"), \"utf-8\")) as { version?: string };\n const portableRunnerExecutable = process.platform === \"win32\"\n ? \"nextclaw-wasmtime-runner.exe\"\n : \"nextclaw-wasmtime-runner\";\n return {\n version: typeof version === \"string\" ? version : \"0.0.0\",\n appEntrypoint: resolve(packageRoot, \"dist/cli/app/index.js\"),\n launcherVersion: typeof version === \"string\" ? version : \"0.0.0\",\n launcherEntrypoint: resolve(dirname(entrypoint), \"../launcher\", basename(entrypoint)),\n launchedByLauncher: false,\n templatesDir: resolve(packageRoot, \"templates\"),\n uiDistDir: resolve(packageRoot, \"ui-dist\"),\n runtimeUpdatePublicKeyPath: resolve(packageRoot, \"resources/update-bundle-public.pem\"),\n builtInAppsDirectory: resolve(packageRoot, \"resources/apps\"),\n portableServiceRunnerPath: resolve(\n packageRoot,\n \"resources/native\",\n `${process.platform}-${process.arch}`,\n portableRunnerExecutable,\n )\n };\n}\n"],"mappings":";;;;AAKA,SAAgB,2BAA2B,eAA6C;CACtF,MAAM,aAAa,cAAc,cAAc;CAC/C,MAAM,cAAc,QAAQ,QAAQ,WAAW,EAAE,WAAW;CAC5D,MAAM,EAAE,YAAY,KAAK,MAAM,aAAa,QAAQ,aAAa,eAAe,EAAE,QAAQ,CAAC;CAC3F,MAAM,2BAA2B,QAAQ,aAAa,UAClD,iCACA;AACJ,QAAO;EACL,SAAS,OAAO,YAAY,WAAW,UAAU;EACjD,eAAe,QAAQ,aAAa,wBAAwB;EAC5D,iBAAiB,OAAO,YAAY,WAAW,UAAU;EACzD,oBAAoB,QAAQ,QAAQ,WAAW,EAAE,eAAe,SAAS,WAAW,CAAC;EACrF,oBAAoB;EACpB,cAAc,QAAQ,aAAa,YAAY;EAC/C,WAAW,QAAQ,aAAa,UAAU;EAC1C,4BAA4B,QAAQ,aAAa,qCAAqC;EACtF,sBAAsB,QAAQ,aAAa,iBAAiB;EAC5D,2BAA2B,QACzB,aACA,oBACA,GAAG,QAAQ,SAAS,GAAG,QAAQ,QAC/B,yBACD;EACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nextclaw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"description": "Powerful AI assistant for coordinating agents, skills, CLI tools, automations, and messaging apps.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -41,21 +41,22 @@
|
|
|
41
41
|
"commander": "^12.1.0",
|
|
42
42
|
"jszip": "^3.10.1",
|
|
43
43
|
"yaml": "^2.8.1",
|
|
44
|
-
"@nextclaw/
|
|
45
|
-
"@nextclaw/
|
|
46
|
-
"@nextclaw/
|
|
47
|
-
"@nextclaw/core": "0.17.10",
|
|
48
|
-
"@nextclaw/nextclaw-hermes-acp-bridge": "0.3.21",
|
|
49
|
-
"@nextclaw/ncp-toolkit": "0.6.23",
|
|
44
|
+
"@nextclaw/core": "0.17.11",
|
|
45
|
+
"@nextclaw/app-runtime": "0.14.0",
|
|
46
|
+
"@nextclaw/kernel": "0.12.0",
|
|
50
47
|
"@nextclaw/ncp": "0.10.0",
|
|
51
48
|
"@nextclaw/ncp-agent-runtime": "0.4.21",
|
|
52
|
-
"@nextclaw/
|
|
53
|
-
"@nextclaw/
|
|
49
|
+
"@nextclaw/mcp": "0.3.38",
|
|
50
|
+
"@nextclaw/ncp-mcp": "0.2.38",
|
|
51
|
+
"@nextclaw/ncp-toolkit": "0.6.23",
|
|
54
52
|
"@nextclaw/nextclaw-ncp-runtime-http-client": "0.3.22",
|
|
55
|
-
"@nextclaw/
|
|
56
|
-
"@nextclaw/
|
|
57
|
-
"@nextclaw/
|
|
58
|
-
"@nextclaw/
|
|
53
|
+
"@nextclaw/nextclaw-ncp-runtime-stdio-client": "0.3.38",
|
|
54
|
+
"@nextclaw/nextclaw-hermes-acp-bridge": "0.3.21",
|
|
55
|
+
"@nextclaw/runtime": "0.4.37",
|
|
56
|
+
"@nextclaw/service": "0.4.0",
|
|
57
|
+
"@nextclaw/remote": "0.3.47",
|
|
58
|
+
"@nextclaw/shared": "0.4.29",
|
|
59
|
+
"@nextclaw/server": "0.20.0"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@types/node": "^20.17.6",
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
"tsx": "^4.19.2",
|
|
64
65
|
"typescript": "^5.6.3",
|
|
65
66
|
"vitest": "^4.1.2",
|
|
66
|
-
"@nextclaw/ui": "0.
|
|
67
|
+
"@nextclaw/ui": "0.22.0"
|
|
67
68
|
},
|
|
68
69
|
"scripts": {
|
|
69
70
|
"dev": "tsx watch --tsconfig ../../scripts/dev/dev-runtime.tsconfig.json src/cli/app/index.ts",
|
package/resources/USAGE.md
CHANGED
|
@@ -20,6 +20,7 @@ When NextClaw AI needs to operate the product itself (version/status/doctor/serv
|
|
|
20
20
|
8. **Desktop-installed AI uses the same command names**. When NextClaw Desktop launches the runtime, it exposes a managed `nextclaw` command surface to AI command tools, so self-management commands keep using `nextclaw ...` without requiring a global NPM install.
|
|
21
21
|
9. **Restart live Service App runtimes before live retest**: after modifying a running Service App, use `nextclaw app restart <app-id> --json` before validating through the product UI or panel-to-service action calls.
|
|
22
22
|
10. **Manage App data through the product contract**: list data with `nextclaw app data list --json`; delete only a `retained` entry with the returned data id and an exact `--confirm <app-id>`. Never replace this flow with a recursive filesystem deletion.
|
|
23
|
+
11. **Manage Mini Apps through the product contract**: use `nextclaw app install <app-id|local-dir|bundle.napp>`, `list`, `operations`, `enable`, `disable`, `update`, `rollback`, and `uninstall`. Do not use or recommend another App runtime command.
|
|
23
24
|
|
|
24
25
|
---
|
|
25
26
|
|
|
@@ -35,6 +36,7 @@ When NextClaw AI needs to operate the product itself (version/status/doctor/serv
|
|
|
35
36
|
- [Session management (UI)](#session-management-ui)
|
|
36
37
|
- [Workspace](#workspace)
|
|
37
38
|
- [Publishing Mini Apps](#publishing-mini-apps)
|
|
39
|
+
- [Managing Mini Apps](#managing-mini-apps)
|
|
38
40
|
- [App data and uninstall](#app-data-and-uninstall)
|
|
39
41
|
- [Commands](#commands)
|
|
40
42
|
- [Channels](#channels)
|
|
@@ -463,6 +465,9 @@ nextclaw projects create knowledge --path ~/Projects/knowledge --template knowle
|
|
|
463
465
|
nextclaw sessions rename <session-id> "Research session" --json
|
|
464
466
|
nextclaw sessions set-project <session-id> ~/Projects/research --json
|
|
465
467
|
nextclaw sessions clear-project <session-id> --json
|
|
468
|
+
|
|
469
|
+
# Permanently delete a session (the confirmation must match the session ID)
|
|
470
|
+
nextclaw sessions delete <session-id> --confirm <session-id> --json
|
|
466
471
|
```
|
|
467
472
|
|
|
468
473
|
The UI, CLI, and built-in AI tools all use the same kernel-owned operations. AI exposes them through `projects_list`, `projects_create`, and `sessions_update`. Project creation never overwrites a non-empty directory. Binding an existing directory registers it as a project; binding the default workspace clears the explicit project binding instead.
|
|
@@ -473,7 +478,7 @@ This is useful when running multi-agent routing and channel operations long term
|
|
|
473
478
|
|
|
474
479
|
NextClaw UI includes a first-class **Chat** tab so you can talk to your agent directly from browser:
|
|
475
480
|
|
|
476
|
-
- create
|
|
481
|
+
- create, switch, rename, pin, or delete sessions from the left panel; press Enter to confirm a deletion or Escape to cancel
|
|
477
482
|
- filter session list by channel in the left panel
|
|
478
483
|
- inspect complete session history in the thread panel
|
|
479
484
|
- choose target agent before sending message
|
|
@@ -574,6 +579,22 @@ After validation succeeds, submit the package for review:
|
|
|
574
579
|
nextclaw app publish <mini-app-dir> --json
|
|
575
580
|
```
|
|
576
581
|
|
|
582
|
+
## Managing Mini Apps
|
|
583
|
+
|
|
584
|
+
Use the same NextClaw command surface for Marketplace Apps, local App directories, and local `.napp` bundles. The Marketplace keeps an App identifier and registry location; its displayed installation command is derived by NextClaw, not stored per App.
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
nextclaw app marketplace search --query notes --json
|
|
588
|
+
nextclaw app marketplace info nextclaw.personal-organizer --json
|
|
589
|
+
nextclaw app install nextclaw.personal-organizer --json
|
|
590
|
+
nextclaw app install ./my-local-app --json
|
|
591
|
+
nextclaw app install ./release/my-local-app.napp --json
|
|
592
|
+
nextclaw app operations --json
|
|
593
|
+
nextclaw app enable nextclaw.personal-organizer --json
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
Install, update, rollback, and uninstall return a background operation receipt. Check `nextclaw app operations --json` or the Apps page for progress. Schema v2 Apps remain disabled after installation until explicitly enabled.
|
|
597
|
+
|
|
577
598
|
Personal submissions return `publishStatus: pending` and appear in the public App Marketplace only after approval with `catalogVisibility: listed`. Community Panel-only Apps follow normal review. Schema v2 Service components currently launch host processes with the user's permissions, so their root manifest must declare `runtime.profile: native-process` and enter high-privilege manual review; an administrator may approve them as `listed` or `unlisted`. Installed schema v2 Apps remain disabled until the user explicitly enables them. Schema v2 WASI Service components are not supported yet—changing only the profile does not create a sandbox. Pending or rejected submissions can be corrected and submitted again. Updating an already published personal app is intentionally blocked until version-level review is available, so the current public version remains online.
|
|
578
599
|
|
|
579
600
|
Use `https://platform.nextclaw.io/apps` to review submission status. The built-in `nextclaw-app-publisher` skill lets NextClaw AI assemble a package from existing Panel/Service directories, run the checks, guide login, and submit it with the same native commands.
|
|
@@ -623,11 +644,11 @@ nextclaw app data list --json
|
|
|
623
644
|
|
|
624
645
|
The second list verifies that the retained entry is gone. Do not build a data id manually and do not remove managed directories with `rm -rf`.
|
|
625
646
|
|
|
626
|
-
|
|
647
|
+
Uninstall keeps data unless `--purge-data` is present:
|
|
627
648
|
|
|
628
649
|
```bash
|
|
629
|
-
|
|
630
|
-
|
|
650
|
+
nextclaw app uninstall <app-id>
|
|
651
|
+
nextclaw app uninstall <app-id> --purge-data --confirm <app-id>
|
|
631
652
|
```
|
|
632
653
|
|
|
633
654
|
Service App development gets a separate, deterministic development instance. Resetting it is destructive and therefore requires both the reset flag and an exact manifest id confirmation:
|
|
@@ -655,6 +676,17 @@ nextclaw app dev <service-app-dir> --reset-data --confirm <app-id> --json
|
|
|
655
676
|
| `nextclaw app validate-publish <mini-app-dir>` | Validate a schema v2 Mini App package before Marketplace submission |
|
|
656
677
|
| `nextclaw app publish <mini-app-dir>` | Submit a validated Mini App to the App Marketplace for review |
|
|
657
678
|
| `nextclaw app restart <app-id>` | Restart a live Service App runtime in the running UI before live retest |
|
|
679
|
+
| `nextclaw app marketplace search` | Search Apps available from the official App Marketplace |
|
|
680
|
+
| `nextclaw app marketplace info <app-id>` | Show a Marketplace App and its derived installation command |
|
|
681
|
+
| `nextclaw app list` | List Apps installed in the running NextClaw host |
|
|
682
|
+
| `nextclaw app info <app-id>` | Show the installed App state and versions |
|
|
683
|
+
| `nextclaw app operations` | List durable App lifecycle operations |
|
|
684
|
+
| `nextclaw app install <app-id\|local-dir\|bundle.napp>` | Install an App through the running host |
|
|
685
|
+
| `nextclaw app enable <app-id>` | Enable an installed App |
|
|
686
|
+
| `nextclaw app disable <app-id>` | Disable an installed App |
|
|
687
|
+
| `nextclaw app update <app-id>` | Start a background App update |
|
|
688
|
+
| `nextclaw app rollback <app-id> --version <version>` | Roll back to an installed version |
|
|
689
|
+
| `nextclaw app uninstall <app-id>` | Start a background uninstall; require exact confirmation to purge data |
|
|
658
690
|
| `nextclaw service install-systemd --user` | Install a user-level Linux `systemd` service for NextClaw |
|
|
659
691
|
| `sudo nextclaw service install-systemd --system` | Install a system-wide Linux `systemd` service for NextClaw |
|
|
660
692
|
| `nextclaw service uninstall-systemd --user` | Remove a user-level Linux `systemd` service |
|
|
@@ -18,7 +18,7 @@ Data is stored locally under NextClaw's app data directory. Each panel only decl
|
|
|
18
18
|
Personal Space is built into supported NextClaw releases. It can also be installed from the official Apps Registry:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
|
|
21
|
+
nextclaw app install nextclaw.personal-organizer
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
After installation, open **Apps** in NextClaw and enable Personal Space. You can then launch Todos, Notes, Favorites, or Calendar independently.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 日常小工具箱
|
|
2
|
+
|
|
3
|
+
这是 Portable Runtime MVP 的产品化体验包。它不要求体验者理解 WASM、Action 或 Provider,而是先提供四个普通人能直接使用的小应用;每个应用背后对应一条必须验证的运行时主链。
|
|
4
|
+
|
|
5
|
+
## 先体验产品
|
|
6
|
+
|
|
7
|
+
| 小应用 | 能做什么 | 背后验证的机制 |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| 今日清单 | 添加、完成、恢复和删除今天的任务 | Rust/WASM 数据 Action、Host KV 持久化、Panel 与 Agent 共用数据 |
|
|
10
|
+
| 灵感便签 | 随手保存、搜索和删除便签 | 两个独立 Panel 复用同一个数据 Component |
|
|
11
|
+
| 专注小钟 | 开始一轮专注、记录完成点,关掉页面后仍计时 | Resident Component、宿主事件投递、持久恢复 |
|
|
12
|
+
| 联系人整理 | 清理姓名空格、邮箱大小写和重复标签 | Consumer 经宿主调用独立 Provider Component |
|
|
13
|
+
|
|
14
|
+
应用列表还保留一个「开发者验证台」。它不是普通用户的主入口,只用于查看共享 runner、受控网络、越权拒绝、超时恢复和运行时指标等底层证据。
|
|
15
|
+
|
|
16
|
+
## Agent 也能使用
|
|
17
|
+
|
|
18
|
+
「今日清单」和「灵感便签」使用的 Service Action 可以显式授权给 Agent。授权后,Panel 与 Agent 操作的是同一份结构化数据,权限、持久化和错误处理也走同一条主链,没有 Demo 专用旁路。
|
|
19
|
+
|
|
20
|
+
## 真实调用链
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
日常小应用 / Agent
|
|
24
|
+
→ Service Action 授权
|
|
25
|
+
→ ServiceAppManager
|
|
26
|
+
→ wasi-component runtime
|
|
27
|
+
→ 共享 Rust/Wasmtime runner
|
|
28
|
+
→ Host capability / component-call
|
|
29
|
+
→ Rust/WASM Component
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 当前边界
|
|
33
|
+
|
|
34
|
+
这是单平台技术 MVP:官方 Guest 只覆盖 Rust,不承诺 Python/FastAPI 等现有框架直接编译,也不代表跨平台 runner 分发、签名、升级和生产级资源治理已经完成。
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="g" x1="8" y1="8" x2="56" y2="56" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#2dd4bf"/>
|
|
5
|
+
<stop offset="1" stop-color="#2563eb"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="64" height="64" rx="16" fill="#07111f"/>
|
|
9
|
+
<path d="M17 18h30v20a9 9 0 0 1-9 9H26a9 9 0 0 1-9-9V18Z" fill="none" stroke="url(#g)" stroke-width="4"/>
|
|
10
|
+
<path d="M24 27h16M24 35h10" stroke="#e6fffb" stroke-width="3" stroke-linecap="round"/>
|
|
11
|
+
<circle cx="46" cy="46" r="7" fill="#60a5fa" stroke="#07111f" stroke-width="3"/>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"id": "nextclaw.portable-runtime-lab",
|
|
4
|
+
"name": "日常小工具箱",
|
|
5
|
+
"version": "0.5.2",
|
|
6
|
+
"description": "清单、便签、专注计时和联系人整理,四个能直接使用的日常小应用。",
|
|
7
|
+
"icon": "assets/icon.svg",
|
|
8
|
+
"engines": {
|
|
9
|
+
"nextclaw": ">=0.43.0"
|
|
10
|
+
},
|
|
11
|
+
"presentation": {
|
|
12
|
+
"primaryPanel": "nextclaw-portable-runtime-lab-todos"
|
|
13
|
+
},
|
|
14
|
+
"runtime": {
|
|
15
|
+
"profile": "wasi"
|
|
16
|
+
},
|
|
17
|
+
"distribution": {
|
|
18
|
+
"mode": "universal"
|
|
19
|
+
},
|
|
20
|
+
"storage": {
|
|
21
|
+
"scope": "global",
|
|
22
|
+
"schemaVersion": 1
|
|
23
|
+
},
|
|
24
|
+
"permissions": {
|
|
25
|
+
"storage": {
|
|
26
|
+
"namespace": "portable-runtime-lab"
|
|
27
|
+
},
|
|
28
|
+
"allowedDomains": [
|
|
29
|
+
"httpbin.org"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"components": [
|
|
33
|
+
{
|
|
34
|
+
"kind": "panel",
|
|
35
|
+
"path": "panels/nextclaw-portable-runtime-lab-todos.panel"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"kind": "panel",
|
|
39
|
+
"path": "panels/nextclaw-portable-runtime-lab-notes.panel"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"kind": "panel",
|
|
43
|
+
"path": "panels/nextclaw-portable-runtime-lab-focus.panel"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"kind": "panel",
|
|
47
|
+
"path": "panels/nextclaw-portable-runtime-lab-contacts.panel"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"kind": "panel",
|
|
51
|
+
"path": "panels/nextclaw-portable-runtime-lab-panel.panel"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"kind": "service",
|
|
55
|
+
"path": "service-components/nextclaw-portable-runtime-lab-state"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"kind": "service",
|
|
59
|
+
"path": "service-components/nextclaw-portable-runtime-lab-capabilities"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"kind": "service",
|
|
63
|
+
"path": "service-components/nextclaw-portable-runtime-lab-resident"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"kind": "service",
|
|
67
|
+
"path": "service-components/nextclaw-portable-runtime-lab-provider"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"kind": "service",
|
|
71
|
+
"path": "service-components/nextclaw-portable-runtime-lab-composition"
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "portable-runtime-lab",
|
|
3
|
+
"summary": "Four everyday mini apps powered by portable Rust/WASM services.",
|
|
4
|
+
"summaryI18n": {
|
|
5
|
+
"zh-CN": "用清单、便签、专注计时和联系人整理,体验可移植 Service App。",
|
|
6
|
+
"en-US": "Use todos, notes, a focus timer, and contact cleanup powered by portable Service Apps."
|
|
7
|
+
},
|
|
8
|
+
"description": "Product-first demos for persistent data, shared capabilities, resident background work, component composition, and Agent access.",
|
|
9
|
+
"descriptionI18n": {
|
|
10
|
+
"zh-CN": "四个普通人能直接使用的小应用,背后覆盖持久数据、能力复用、后台常驻、组件组合与 Agent 调用。",
|
|
11
|
+
"en-US": "Four approachable mini apps backed by persistence, capability reuse, resident work, component composition, and Agent access."
|
|
12
|
+
},
|
|
13
|
+
"author": "NextClaw",
|
|
14
|
+
"tags": ["productivity", "todo", "notes", "wasm", "experimental"],
|
|
15
|
+
"sourceRepo": "https://github.com/Peiiii/nextclaw",
|
|
16
|
+
"homepage": "https://nextclaw.io",
|
|
17
|
+
"featured": false,
|
|
18
|
+
"visuals": {
|
|
19
|
+
"accentColor": "#7C5CFC"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const actionIds = {
|
|
2
|
+
compose: "nextclaw-portable-runtime-lab-composition.compose_contact",
|
|
3
|
+
providerStatus: "nextclaw-portable-runtime-lab-provider.provider_status",
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
const elements = {
|
|
7
|
+
form: document.querySelector("[data-contact-form]"),
|
|
8
|
+
name: document.querySelector("[data-name]"),
|
|
9
|
+
email: document.querySelector("[data-email]"),
|
|
10
|
+
tags: document.querySelector("[data-tags]"),
|
|
11
|
+
card: document.querySelector("[data-contact-card]"),
|
|
12
|
+
placeholder: document.querySelector("[data-placeholder]"),
|
|
13
|
+
avatar: document.querySelector("[data-avatar]"),
|
|
14
|
+
displayName: document.querySelector("[data-display-name]"),
|
|
15
|
+
displayEmail: document.querySelector("[data-display-email]"),
|
|
16
|
+
displayTags: document.querySelector("[data-display-tags]"),
|
|
17
|
+
copy: document.querySelector("[data-copy]"),
|
|
18
|
+
notice: document.querySelector("[data-notice]"),
|
|
19
|
+
count: document.querySelector("[data-proof-count]"),
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let latestContact = null;
|
|
23
|
+
|
|
24
|
+
function serviceActions() {
|
|
25
|
+
const bridge = window.nextclaw?.serviceActions;
|
|
26
|
+
if (!bridge) throw new Error("应用还没有连接到 NextClaw,请刷新后重试。");
|
|
27
|
+
return bridge;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function invoke(actionId, input = {}) {
|
|
31
|
+
return await serviceActions().invoke(actionId, input);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function initials(name) {
|
|
35
|
+
const parts = name.split(/\s+/).filter(Boolean);
|
|
36
|
+
return parts.slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("") || "?";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function render(result) {
|
|
40
|
+
const provider = result.provider ?? {};
|
|
41
|
+
latestContact = {
|
|
42
|
+
name: provider.normalizedName ?? "",
|
|
43
|
+
email: provider.normalizedEmail ?? "",
|
|
44
|
+
tags: Array.isArray(provider.normalizedTags) ? provider.normalizedTags : [],
|
|
45
|
+
};
|
|
46
|
+
elements.placeholder.hidden = true;
|
|
47
|
+
elements.card.hidden = false;
|
|
48
|
+
elements.avatar.textContent = initials(latestContact.name);
|
|
49
|
+
elements.displayName.textContent = latestContact.name;
|
|
50
|
+
elements.displayEmail.textContent = latestContact.email;
|
|
51
|
+
elements.displayEmail.href = `mailto:${latestContact.email}`;
|
|
52
|
+
elements.displayTags.replaceChildren();
|
|
53
|
+
for (const tag of latestContact.tags) {
|
|
54
|
+
const chip = document.createElement("span");
|
|
55
|
+
chip.textContent = tag;
|
|
56
|
+
elements.displayTags.append(chip);
|
|
57
|
+
}
|
|
58
|
+
elements.count.textContent = `${provider.providerCallCount ?? "—"} 次`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
elements.form.addEventListener("submit", (event) => {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
elements.notice.textContent = "正在整理…";
|
|
64
|
+
elements.notice.dataset.tone = "";
|
|
65
|
+
void invoke(actionIds.compose, {
|
|
66
|
+
name: elements.name.value,
|
|
67
|
+
email: elements.email.value,
|
|
68
|
+
tags: elements.tags.value.split(",").map((tag) => tag.trim()).filter(Boolean),
|
|
69
|
+
}).then((result) => {
|
|
70
|
+
render(result);
|
|
71
|
+
elements.notice.textContent = "姓名空格、邮箱大小写和重复标签都已整理";
|
|
72
|
+
elements.notice.dataset.tone = "success";
|
|
73
|
+
}).catch((error) => {
|
|
74
|
+
elements.notice.textContent = error instanceof Error ? error.message : String(error);
|
|
75
|
+
elements.notice.dataset.tone = "error";
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
elements.copy.addEventListener("click", () => {
|
|
80
|
+
if (!latestContact) return;
|
|
81
|
+
const text = `${latestContact.name} <${latestContact.email}>${latestContact.tags.length ? ` · ${latestContact.tags.join(", ")}` : ""}`;
|
|
82
|
+
void navigator.clipboard.writeText(text).then(() => {
|
|
83
|
+
elements.notice.textContent = "联系人已复制";
|
|
84
|
+
elements.notice.dataset.tone = "success";
|
|
85
|
+
}).catch(() => {
|
|
86
|
+
elements.notice.textContent = text;
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
void invoke(actionIds.providerStatus).then((status) => {
|
|
91
|
+
elements.count.textContent = `${status.providerCallCount ?? 0} 次`;
|
|
92
|
+
}).catch(() => undefined);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
:root { color-scheme: light; font-family: Inter, "PingFang SC", "Microsoft YaHei", sans-serif; color: #282b45; background: #eef1fb; }
|
|
2
|
+
* { box-sizing: border-box; }
|
|
3
|
+
body { margin: 0; min-width: 320px; background: radial-gradient(circle at 85% 10%, #e8dcff 0, transparent 35%), linear-gradient(135deg, #f9faff, #eef2fb); }
|
|
4
|
+
button, input { font: inherit; }
|
|
5
|
+
button { cursor: pointer; }
|
|
6
|
+
.app-shell { width: min(940px, calc(100% - 32px)); margin: 0 auto; padding: 38px 0 52px; }
|
|
7
|
+
.hero { margin-bottom: 26px; }
|
|
8
|
+
.eyebrow { margin: 0 0 8px; color: #725cc7; font-size: 12px; font-weight: 800; letter-spacing: .18em; }
|
|
9
|
+
h1 { margin: 0; font-family: Georgia, "Noto Serif SC", serif; font-size: clamp(36px, 7vw, 58px); letter-spacing: -.04em; }
|
|
10
|
+
.hero > p:last-child { margin: 8px 0 0; color: #74758a; }
|
|
11
|
+
.workspace { display: grid; grid-template-columns: minmax(260px, .9fr) minmax(300px, 1.1fr); gap: 18px; min-height: 370px; }
|
|
12
|
+
.contact-form { display: grid; align-content: start; gap: 16px; padding: 22px; border: 1px solid #dee2f1; border-radius: 22px; background: rgba(255,255,255,.82); box-shadow: 0 20px 60px rgba(58,62,102,.09); }
|
|
13
|
+
.contact-form label { display: grid; gap: 7px; color: #65677c; font-size: 13px; font-weight: 650; }
|
|
14
|
+
.contact-form input { width: 100%; border: 1px solid #d9ddec; border-radius: 11px; outline: 0; padding: 11px 12px; color: #2f314b; background: #fafbff; font-weight: 450; }
|
|
15
|
+
.contact-form input:focus { border-color: #8976d2; box-shadow: 0 0 0 3px rgba(137,118,210,.12); }
|
|
16
|
+
.contact-form button { margin-top: 4px; border: 0; border-radius: 12px; padding: 12px 18px; color: #fff; background: #6650b8; font-weight: 750; }
|
|
17
|
+
.contact-card, .placeholder { border: 1px solid #dcdff0; border-radius: 24px; background: linear-gradient(145deg, rgba(255,255,255,.92), rgba(245,244,255,.9)); box-shadow: 0 24px 70px rgba(59,58,105,.12); }
|
|
18
|
+
.contact-card { position: relative; display: flex; align-items: center; gap: 18px; padding: 32px; overflow: hidden; }
|
|
19
|
+
.contact-card::after { position: absolute; right: -55px; bottom: -75px; width: 190px; height: 190px; border-radius: 50%; background: rgba(150,125,224,.12); content: ""; }
|
|
20
|
+
.contact-card[hidden] { display: none; }
|
|
21
|
+
.avatar { display: grid; flex: 0 0 auto; width: 78px; height: 78px; place-items: center; border-radius: 24px; color: #fff; background: linear-gradient(145deg, #8973d4, #5d4aaf); box-shadow: 0 10px 25px rgba(88,66,173,.25); font-size: 25px; font-weight: 800; }
|
|
22
|
+
.card-copy { min-width: 0; flex: 1; z-index: 1; }
|
|
23
|
+
.card-copy > p { margin: 0 0 5px; color: #77738f; font-size: 12px; }
|
|
24
|
+
.card-copy h2 { margin: 0; overflow-wrap: anywhere; font-size: 24px; }
|
|
25
|
+
.card-copy a { display: inline-block; margin-top: 5px; color: #6653ad; overflow-wrap: anywhere; text-decoration: none; }
|
|
26
|
+
.tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 16px; }
|
|
27
|
+
.tags span { padding: 6px 9px; border-radius: 999px; color: #5c4e91; background: #e8e2fb; font-size: 12px; }
|
|
28
|
+
.copy-button { z-index: 1; align-self: flex-start; border: 1px solid #d6d1e8; border-radius: 10px; padding: 8px 11px; color: #615a78; background: rgba(255,255,255,.8); font-size: 12px; }
|
|
29
|
+
.placeholder { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; padding: 32px; color: #8a8b9e; text-align: center; }
|
|
30
|
+
.placeholder[hidden] { display: none; }
|
|
31
|
+
.placeholder span { color: #8369dc; font-size: 34px; }
|
|
32
|
+
.placeholder p { max-width: 280px; margin: 0; line-height: 1.6; }
|
|
33
|
+
.notice { min-height: 22px; margin: 14px 2px; color: #74758a; font-size: 14px; }
|
|
34
|
+
.notice[data-tone="success"] { color: #42775b; }
|
|
35
|
+
.notice[data-tone="error"] { color: #ad5047; }
|
|
36
|
+
.behind-scenes { margin-top: 26px; padding: 16px 18px; border: 1px solid #dfe2ef; border-radius: 16px; color: #737488; background: rgba(255,255,255,.55); font-size: 13px; }
|
|
37
|
+
.behind-scenes summary { color: #505268; cursor: pointer; font-weight: 700; }
|
|
38
|
+
.behind-scenes p { line-height: 1.65; }
|
|
39
|
+
.behind-scenes dl { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin: 12px 0 0; }
|
|
40
|
+
.behind-scenes dl div { padding: 10px; border-radius: 10px; background: #fff; }
|
|
41
|
+
.behind-scenes dt { color: #9697a9; font-size: 11px; }
|
|
42
|
+
.behind-scenes dd { margin: 3px 0 0; color: #505268; overflow-wrap: anywhere; }
|
|
43
|
+
@media (max-width: 680px) { .app-shell { width: calc(100% - 22px); padding-top: 24px; } .workspace { grid-template-columns: 1fr; } .contact-card { min-height: 260px; flex-wrap: wrap; } .copy-button { margin-left: auto; } .behind-scenes dl { grid-template-columns: 1fr; } }
|
|
@@ -0,0 +1,43 @@
|
|
|
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="app-shell">
|
|
11
|
+
<header class="hero">
|
|
12
|
+
<p class="eyebrow">CONTACT CLEANUP</p>
|
|
13
|
+
<h1>联系人整理</h1>
|
|
14
|
+
<p>复制来的信息乱七八糟?交给它变成一张干净的联系人卡片。</p>
|
|
15
|
+
</header>
|
|
16
|
+
|
|
17
|
+
<section class="workspace">
|
|
18
|
+
<form class="contact-form" data-contact-form>
|
|
19
|
+
<label>姓名<input data-name value=" Ada Lovelace " autocomplete="name" /></label>
|
|
20
|
+
<label>邮箱<input data-email value=" ADA@EXAMPLE.COM " autocomplete="email" /></label>
|
|
21
|
+
<label>标签<input data-tags value="AI, ai, Math" placeholder="用逗号分隔" /></label>
|
|
22
|
+
<button type="submit">整理联系人</button>
|
|
23
|
+
</form>
|
|
24
|
+
|
|
25
|
+
<article class="contact-card" data-contact-card hidden>
|
|
26
|
+
<div class="avatar" data-avatar>AL</div>
|
|
27
|
+
<div class="card-copy"><p>整理完成</p><h2 data-display-name>—</h2><a data-display-email>—</a><div class="tags" data-display-tags></div></div>
|
|
28
|
+
<button type="button" class="copy-button" data-copy>复制</button>
|
|
29
|
+
</article>
|
|
30
|
+
<div class="placeholder" data-placeholder><span>✦</span><p>填写左边的信息,整理后的联系人会出现在这里。</p></div>
|
|
31
|
+
</section>
|
|
32
|
+
|
|
33
|
+
<p class="notice" data-notice></p>
|
|
34
|
+
|
|
35
|
+
<details class="behind-scenes">
|
|
36
|
+
<summary>这和普通表单有什么不同?</summary>
|
|
37
|
+
<p>这个 Panel 只负责收集和展示。真正的规范化逻辑由独立 Provider Component 提供,Consumer 通过宿主受控调用进行组合。以后替换联系人规则,页面不用复制一份实现。</p>
|
|
38
|
+
<dl><div><dt>组合方式</dt><dd>Host mediated component call</dd></div><div><dt>Provider 已处理</dt><dd data-proof-count>等待执行</dd></div></dl>
|
|
39
|
+
</details>
|
|
40
|
+
</main>
|
|
41
|
+
<script src="assets/app.js"></script>
|
|
42
|
+
</body>
|
|
43
|
+
</html>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "nextclaw-portable-runtime-lab-contacts",
|
|
3
|
+
"title": "联系人整理",
|
|
4
|
+
"description": "把乱格式的姓名、邮箱和标签整理成干净联系人卡片。",
|
|
5
|
+
"entry": "index.html",
|
|
6
|
+
"actions": [
|
|
7
|
+
"nextclaw-portable-runtime-lab-composition.compose_contact",
|
|
8
|
+
"nextclaw-portable-runtime-lab-provider.provider_status"
|
|
9
|
+
]
|
|
10
|
+
}
|