synabun 2.0.9 → 2.0.10
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/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/THIRD-PARTY-LICENSES.md +46 -4
- package/launcher.mjs +9 -3
- package/lib/start-launcher.js +6 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/neural-interface/i18n/en.json +218 -7
- package/neural-interface/i18n/pt-BR.json +220 -9
- package/neural-interface/lib/account-usage.js +5 -3
- package/neural-interface/lib/app-controls-api.js +161 -0
- package/neural-interface/lib/assistant-api.js +21 -7
- package/neural-interface/lib/assistant-brains/opencode.js +13 -1
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +44 -0
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +57 -0
- package/neural-interface/lib/assistant-catalog.js +17 -2
- package/neural-interface/lib/assistant-dispatch.js +3 -0
- package/neural-interface/lib/assistant-envelope.js +19 -1
- package/neural-interface/lib/assistant-runtime.js +127 -8
- package/neural-interface/lib/claude-model-catalog.js +64 -14
- package/neural-interface/lib/codex-settings-schema.js +109 -47
- package/neural-interface/lib/editor-completion-opencode.js +132 -35
- package/neural-interface/lib/exec-loop-command.js +8 -1
- package/neural-interface/lib/launch-cache.js +293 -0
- package/neural-interface/lib/login-start.js +524 -0
- package/neural-interface/lib/native-loop-providers.js +18 -3
- package/neural-interface/lib/native-loop-runtime.js +19 -0
- package/neural-interface/lib/opencode-db-schema.js +75 -0
- package/neural-interface/lib/opencode-history.js +16 -1
- package/neural-interface/lib/opencode-protocol.js +173 -0
- package/neural-interface/lib/opencode-provider-view.js +81 -0
- package/neural-interface/lib/opencode-runtime-config.js +10 -3
- package/neural-interface/lib/opencode-serve-records.js +606 -0
- package/neural-interface/lib/opencode-v2-client.js +33 -6
- package/neural-interface/lib/opencode-v2-ws-requests.js +19 -5
- package/neural-interface/lib/opencode-worker-activity.js +229 -0
- package/neural-interface/lib/opencode2-client.js +760 -0
- package/neural-interface/lib/opencode2-proxy.js +116 -0
- package/neural-interface/lib/opencode2-translate.js +1008 -0
- package/neural-interface/lib/process-identity.js +361 -0
- package/neural-interface/lib/session-cache-builder.js +26 -5
- package/neural-interface/lib/session-title-generator.js +18 -0
- package/neural-interface/lib/style-guide/api.js +4 -3
- package/neural-interface/lib/untrusted-file-headers.js +27 -0
- package/neural-interface/package-lock.json +1343 -45
- package/neural-interface/package.json +5 -1
- package/neural-interface/public/index.html +2 -2
- package/neural-interface/public/shared/agent-runtime-options.js +55 -11
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +172 -17
- package/neural-interface/public/shared/assistant/asst-api.js +11 -3
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +195 -80
- package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
- package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
- package/neural-interface/public/shared/assistant/asst-menu.js +77 -6
- package/neural-interface/public/shared/assistant/asst-panel.js +197 -33
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +28 -10
- package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
- package/neural-interface/public/shared/assistant/asst-render.js +382 -36
- package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
- package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
- package/neural-interface/public/shared/assistant/asst-scenes.js +528 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
- package/neural-interface/public/shared/assistant/asst-state.js +14 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +43 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +13 -1
- package/neural-interface/public/shared/cc-dropdown.js +480 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +13 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-styles.js +4 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +149 -35
- package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
- package/neural-interface/public/shared/data-cache.js +223 -0
- package/neural-interface/public/shared/desktop-bridge.js +11 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
- package/neural-interface/public/shared/desktop-titlebar.js +214 -28
- package/neural-interface/public/shared/desktop-update-view.js +15 -5
- package/neural-interface/public/shared/file-links.js +73 -8
- package/neural-interface/public/shared/html-shell.js +74 -80
- package/neural-interface/public/shared/launch-prefetch.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +7 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +93 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +16 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +60 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -19
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +195 -19
- package/neural-interface/public/shared/opencode-providers.js +39 -0
- package/neural-interface/public/shared/schedules-view.js +318 -0
- package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
- package/neural-interface/public/shared/settings/settings-app.js +243 -0
- package/neural-interface/public/shared/settings/settings-data.js +88 -0
- package/neural-interface/public/shared/settings/settings-ia.js +17 -0
- package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
- package/neural-interface/public/shared/styles.css +540 -371
- package/neural-interface/public/shared/ui-assistant.js +27 -5
- package/neural-interface/public/shared/ui-automation-studio.js +67 -27
- package/neural-interface/public/shared/ui-bookmarks.js +2 -1
- package/neural-interface/public/shared/ui-claude-panel.js +76 -8
- package/neural-interface/public/shared/ui-codex-panel.js +1 -0
- package/neural-interface/public/shared/ui-detail.js +6 -6
- package/neural-interface/public/shared/ui-file-links.js +1 -0
- package/neural-interface/public/shared/ui-image-gallery.js +6 -5
- package/neural-interface/public/shared/ui-invite.js +18 -2
- package/neural-interface/public/shared/ui-link.js +9 -9
- package/neural-interface/public/shared/ui-menubar.js +232 -33
- package/neural-interface/public/shared/ui-native-loop-router.js +2 -0
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +2099 -869
- package/neural-interface/public/shared/ui-sessions.js +15 -4
- package/neural-interface/public/shared/ui-settings.js +87 -36
- package/neural-interface/public/shared/ui-sidebar.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +55 -4
- package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
- package/neural-interface/public/shared/ui-skills.js +70 -12
- package/neural-interface/public/shared/ui-sync.js +7 -0
- package/neural-interface/public/shared/ui-terminal.js +36 -20
- package/neural-interface/public/shared/ui-trash.js +8 -1
- package/neural-interface/public/shared/ui-tutorial-steps.js +7 -3
- package/neural-interface/public/shared/ui-tutorial.js +15 -5
- package/neural-interface/public/shared/ui-update.js +83 -14
- package/neural-interface/public/shared/ui-whiteboard.js +2 -1
- package/neural-interface/public/variant/2d/main.js +4 -1
- package/neural-interface/public/variant/3d/main.js +3 -0
- package/neural-interface/public/vendor/highlight/LICENSE +29 -0
- package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
- package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
- package/neural-interface/public/vendor/highlight/manifest.json +5 -0
- package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
- package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
- package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
- package/neural-interface/public/vendor/marked/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
- package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
- package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
- package/neural-interface/scripts/build-vendor.mjs +84 -3
- package/neural-interface/server.js +1099 -286
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/skills/synabun/modules/schedule.md +1 -1
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"graph": "Grafo",
|
|
50
50
|
"skills": "Skills",
|
|
51
51
|
"automations": "Automações",
|
|
52
|
+
"schedules": "Agendamentos",
|
|
52
53
|
"games": "Jogos",
|
|
53
54
|
"apps": "Aplicativos",
|
|
54
55
|
"bookmarks": "Favoritos",
|
|
@@ -96,6 +97,7 @@
|
|
|
96
97
|
"openCode": "OpenCode",
|
|
97
98
|
"shell": "Terminal shell",
|
|
98
99
|
"browser": "Navegador",
|
|
100
|
+
"browserApps": "Apps do navegador",
|
|
99
101
|
"youtube": "YouTube",
|
|
100
102
|
"showTerminal": "Mostrar terminal"
|
|
101
103
|
}
|
|
@@ -1357,6 +1359,10 @@
|
|
|
1357
1359
|
"about": {
|
|
1358
1360
|
"label": "Sobre",
|
|
1359
1361
|
"help": "Versão, links e licenças"
|
|
1362
|
+
},
|
|
1363
|
+
"app": {
|
|
1364
|
+
"label": "App",
|
|
1365
|
+
"help": "Atualizações, inicialização e janela"
|
|
1360
1366
|
}
|
|
1361
1367
|
},
|
|
1362
1368
|
"page": {
|
|
@@ -1411,6 +1417,10 @@
|
|
|
1411
1417
|
"about": {
|
|
1412
1418
|
"title": "Sobre",
|
|
1413
1419
|
"purpose": "A versão que você usa, onde ela roda e o software de código aberto com que o SynaBun é feito."
|
|
1420
|
+
},
|
|
1421
|
+
"app": {
|
|
1422
|
+
"title": "App",
|
|
1423
|
+
"purpose": "Como o SynaBun se atualiza, inicia e funciona neste computador."
|
|
1414
1424
|
}
|
|
1415
1425
|
},
|
|
1416
1426
|
"section": {
|
|
@@ -1751,6 +1761,24 @@
|
|
|
1751
1761
|
"title": "Dependências",
|
|
1752
1762
|
"purpose": "Cada pacote que acompanha o SynaBun, a versão instalada aqui e a licença dele."
|
|
1753
1763
|
}
|
|
1764
|
+
},
|
|
1765
|
+
"app": {
|
|
1766
|
+
"updates": {
|
|
1767
|
+
"title": "Atualizações",
|
|
1768
|
+
"purpose": "A versão que você usa e como o SynaBun recebe as novas."
|
|
1769
|
+
},
|
|
1770
|
+
"startup": {
|
|
1771
|
+
"title": "Inicialização",
|
|
1772
|
+
"purpose": "Se o SynaBun inicia quando você entra na sua conta."
|
|
1773
|
+
},
|
|
1774
|
+
"window": {
|
|
1775
|
+
"title": "Janela",
|
|
1776
|
+
"purpose": "O que a janela do app SynaBun faz."
|
|
1777
|
+
},
|
|
1778
|
+
"maintenance": {
|
|
1779
|
+
"title": "Manutenção",
|
|
1780
|
+
"purpose": "As pastas do SynaBun e um reinício quando algo precisar."
|
|
1781
|
+
}
|
|
1754
1782
|
}
|
|
1755
1783
|
},
|
|
1756
1784
|
"common": {
|
|
@@ -3411,6 +3439,50 @@
|
|
|
3411
3439
|
"abt003": {
|
|
3412
3440
|
"label": "Filtrar dependências",
|
|
3413
3441
|
"help": "Mostra só os pacotes cujo nome contém o que você digitar."
|
|
3442
|
+
},
|
|
3443
|
+
"sys001": {
|
|
3444
|
+
"label": "Procurar atualizações",
|
|
3445
|
+
"help": "Procura agora uma versão mais nova do SynaBun."
|
|
3446
|
+
},
|
|
3447
|
+
"sys002": {
|
|
3448
|
+
"label": "Atualizações automáticas",
|
|
3449
|
+
"help": "Procura novas versões sozinho. No app para desktop, também as instala quando o SynaBun está ocioso."
|
|
3450
|
+
},
|
|
3451
|
+
"sys003": {
|
|
3452
|
+
"label": "Instalar atualização",
|
|
3453
|
+
"help": "Abre a atualização com as notas da versão e, se você quiser, um backup antes."
|
|
3454
|
+
},
|
|
3455
|
+
"sys004": {
|
|
3456
|
+
"label": "Iniciar ao entrar",
|
|
3457
|
+
"help": "Inicia o SynaBun quando você entra na sua conta neste computador."
|
|
3458
|
+
},
|
|
3459
|
+
"sys005": {
|
|
3460
|
+
"label": "Iniciar em segundo plano",
|
|
3461
|
+
"help": "Ao entrar, o SynaBun inicia sem abrir a janela. Abra o SynaBun para mostrá-la."
|
|
3462
|
+
},
|
|
3463
|
+
"sys006": {
|
|
3464
|
+
"label": "Continuar em execução ao fechar a janela",
|
|
3465
|
+
"help": "Fechar a janela deixa o SynaBun na bandeja, e suas ferramentas de IA mantêm a memória. Desligado: fechar a janela encerra o SynaBun."
|
|
3466
|
+
},
|
|
3467
|
+
"sys007": {
|
|
3468
|
+
"label": "Aceleração de hardware",
|
|
3469
|
+
"help": "Desenha a janela com a placa de vídeo. Desligue se a janela piscar ou ficar em branco. Vale depois de reiniciar."
|
|
3470
|
+
},
|
|
3471
|
+
"sys008": {
|
|
3472
|
+
"label": "Reiniciar agora",
|
|
3473
|
+
"help": "Fecha o SynaBun e o abre de novo."
|
|
3474
|
+
},
|
|
3475
|
+
"sys009": {
|
|
3476
|
+
"label": "Abrir pasta de dados",
|
|
3477
|
+
"help": "Mostra a pasta com suas memórias, configurações e backups."
|
|
3478
|
+
},
|
|
3479
|
+
"sys010": {
|
|
3480
|
+
"label": "Abrir pasta de logs",
|
|
3481
|
+
"help": "Mostra a pasta com os logs do SynaBun, para relatar um problema."
|
|
3482
|
+
},
|
|
3483
|
+
"sys011": {
|
|
3484
|
+
"label": "Reiniciar o SynaBun",
|
|
3485
|
+
"help": "Reinicia o servidor do SynaBun: o mesmo que Restart Server no menu Apps."
|
|
3414
3486
|
}
|
|
3415
3487
|
},
|
|
3416
3488
|
"pane": {
|
|
@@ -5661,7 +5733,8 @@
|
|
|
5661
5733
|
"notifications": "alertas, som, volume, banner, toast, silenciar, notificação do sistema",
|
|
5662
5734
|
"appearance": "tema, modo escuro, dark mode, skin, cor, fonte, tamanho do texto, idioma, ícones, zoom, visual",
|
|
5663
5735
|
"code_editor": "editor, código, fonte, tamanho do texto, quebra de linha, minimapa, espaços em branco, indentação, tabulações, autocompletar, completar, sugestões, copilot, texto fantasma, inline, ia, modelo, ollama, arquivo",
|
|
5664
|
-
"about": "versão, GitHub, licença, dependências, Node, Electron, Chromium, sistema, atualização, créditos, copyright, notas de versão, changelog"
|
|
5736
|
+
"about": "versão, GitHub, licença, dependências, Node, Electron, Chromium, sistema, atualização, créditos, copyright, notas de versão, changelog",
|
|
5737
|
+
"app": "atualizações, atualização automática, inicialização, iniciar ao entrar, iniciar com o sistema, itens de início, boot, autostart, segundo plano, bandeja, barra de menus, fechar janela, sair, aceleração de hardware, GPU, pasta de dados, logs, reiniciar, versão"
|
|
5665
5738
|
},
|
|
5666
5739
|
"section": {
|
|
5667
5740
|
"ai_connections": {
|
|
@@ -5767,6 +5840,12 @@
|
|
|
5767
5840
|
"links": "GitHub, repositório, versões publicadas, changelog, problema, relatar bug, site, documentação, npm, licença, Discord, comunidade",
|
|
5768
5841
|
"system": "versão, Node, Node.js, Electron, Chromium, SQLite, sistema operacional, SO, macOS, Windows, Linux, arquitetura, pasta de dados, porta, instalação, diagnóstico",
|
|
5769
5842
|
"dependencies": "pacotes, bibliotecas, npm, licenças, código aberto, terceiros, versões, node_modules"
|
|
5843
|
+
},
|
|
5844
|
+
"app": {
|
|
5845
|
+
"updates": "atualizar, atualização automática, automático, procurar, versão, upgrade, lançamento, baixar, instalar, selo",
|
|
5846
|
+
"startup": "iniciar ao entrar, inicialização, boot, itens de início, autostart, abrir, segundo plano, oculto, bandeja, minimizado, LaunchAgent, systemd",
|
|
5847
|
+
"window": "fechar, bandeja, barra de menus, sair, continuar em execução, aceleração de hardware, GPU, gráficos, piscar, janela em branco",
|
|
5848
|
+
"maintenance": "pasta de dados, logs, arquivos de log, reiniciar, solução de problemas, diagnóstico, pasta, Finder, Explorer"
|
|
5770
5849
|
}
|
|
5771
5850
|
},
|
|
5772
5851
|
"control": {
|
|
@@ -5953,6 +6032,70 @@
|
|
|
5953
6032
|
"builtWith": "Feito com software de código aberto"
|
|
5954
6033
|
},
|
|
5955
6034
|
"afterRestart": "Aparece depois que o SynaBun reiniciar."
|
|
6035
|
+
},
|
|
6036
|
+
"app": {
|
|
6037
|
+
"version": "SynaBun {version}",
|
|
6038
|
+
"update": {
|
|
6039
|
+
"checking": "Procurando atualizações…",
|
|
6040
|
+
"upToDate": "Atualizado",
|
|
6041
|
+
"available": "A versão {version} está disponível",
|
|
6042
|
+
"downloading": "Baixando a versão {version} ({percent}%)",
|
|
6043
|
+
"ready": "A versão {version} está pronta para instalar",
|
|
6044
|
+
"installing": "Instalando a versão {version}",
|
|
6045
|
+
"failed": "A última verificação falhou",
|
|
6046
|
+
"notChecked": "Ainda não verificado",
|
|
6047
|
+
"unsupported": "Esta cópia não se atualiza sozinha",
|
|
6048
|
+
"checkedAt": "verificado às {time}",
|
|
6049
|
+
"autoHelpDesktop": "Baixa as novas versões e as instala quando o SynaBun está ocioso, depois de um aviso de um minuto. Desligado: o SynaBun continua verificando e avisa, e você instala com um clique.",
|
|
6050
|
+
"autoHelpServer": "Procura novas versões quando o SynaBun inicia e a cada meia hora, e mostra o selo de atualização. Desligado: só procura quando você pedir. A instalação sempre pergunta antes."
|
|
6051
|
+
},
|
|
6052
|
+
"startup": {
|
|
6053
|
+
"helpDesktop": "Abre o SynaBun quando você entra na sua conta, para que o servidor esteja pronto para suas ferramentas de IA.",
|
|
6054
|
+
"helpServer": "Inicia o servidor do SynaBun em segundo plano quando você entra na sua conta, sem janela nem terminal.",
|
|
6055
|
+
"hiddenNeedsLogin": "Vale quando o SynaBun inicia ao entrar.",
|
|
6056
|
+
"requiresApproval": "O macOS espera que você permita o SynaBun em Ajustes do Sistema > Geral > Itens de Início.",
|
|
6057
|
+
"disabledInSystem": {
|
|
6058
|
+
"darwin": "Desligado em Ajustes do Sistema > Geral > Itens de Início.",
|
|
6059
|
+
"win32": "Desligado em Configurações do Windows > Aplicativos > Inicialização.",
|
|
6060
|
+
"linux": "Desligado nos aplicativos de inicialização do seu ambiente."
|
|
6061
|
+
},
|
|
6062
|
+
"openSettings": {
|
|
6063
|
+
"darwin": "Abrir Itens de Início",
|
|
6064
|
+
"win32": "Abrir Inicialização"
|
|
6065
|
+
},
|
|
6066
|
+
"reason": {
|
|
6067
|
+
"unpackaged": "Só uma cópia instalada do SynaBun pode iniciar ao entrar.",
|
|
6068
|
+
"move-to-applications": "Mova o SynaBun para a pasta Aplicativos antes.",
|
|
6069
|
+
"no-appimage": "Inicie o SynaBun pelo arquivo AppImage para usar isto.",
|
|
6070
|
+
"not-here": "Indisponível em uma execução de teste ou em uma pasta de dados temporária.",
|
|
6071
|
+
"unsupported": "Indisponível neste sistema.",
|
|
6072
|
+
"desktop": "O app SynaBun cuida disto. Atualize o app para mudar aqui."
|
|
6073
|
+
},
|
|
6074
|
+
"owner": "O app SynaBun abre ao entrar com esta pasta de dados. Desligue no app antes.",
|
|
6075
|
+
"replaced": "A instalação npm não inicia mais ao entrar: agora quem inicia é este app.",
|
|
6076
|
+
"error": {
|
|
6077
|
+
"refused": "O sistema não aceitou a mudança.",
|
|
6078
|
+
"write-failed": "O SynaBun não conseguiu gravar a entrada de inicialização.",
|
|
6079
|
+
"no-wscript": "O Windows Script Host (wscript.exe) não está disponível, então o SynaBun não consegue iniciar sem janela.",
|
|
6080
|
+
"bad-path": "O SynaBun não consegue iniciar ao entrar a partir de uma pasta cujo nome tem %.",
|
|
6081
|
+
"desktop-app": "O app SynaBun abre ao entrar com esta pasta de dados. Desligue no app antes.",
|
|
6082
|
+
"npm-entry": "Não foi possível remover a inicialização da instalação npm. Desligue lá e tente de novo.",
|
|
6083
|
+
"save-failed": "O SynaBun não conseguiu salvar esta configuração.",
|
|
6084
|
+
"network": "O SynaBun não respondeu. Tente de novo."
|
|
6085
|
+
}
|
|
6086
|
+
},
|
|
6087
|
+
"window": {
|
|
6088
|
+
"desktopOnly": "Só no app SynaBun para desktop.",
|
|
6089
|
+
"macDock": "No macOS, o SynaBun fica no Dock quando a janela fecha. Saia pelo menu.",
|
|
6090
|
+
"noTray": "Este ambiente não mostra o ícone na bandeja: abra o SynaBun de novo para mostrar a janela.",
|
|
6091
|
+
"restartNeeded": "Vale depois que o SynaBun reiniciar."
|
|
6092
|
+
},
|
|
6093
|
+
"maintenance": {
|
|
6094
|
+
"openFailed": "Não foi possível abrir a pasta."
|
|
6095
|
+
},
|
|
6096
|
+
"remote": "Abra o SynaBun no computador em que ele roda para mudar isto.",
|
|
6097
|
+
"serverOld": "Estes controles chegam com um reinício do servidor do SynaBun.",
|
|
6098
|
+
"saveFailed": "Não foi possível salvar a configuração."
|
|
5956
6099
|
}
|
|
5957
6100
|
}
|
|
5958
6101
|
},
|
|
@@ -6444,7 +6587,14 @@
|
|
|
6444
6587
|
"sessions": {
|
|
6445
6588
|
"empty": "Nenhuma outra sessão",
|
|
6446
6589
|
"recent": "Recentes",
|
|
6447
|
-
"filter": "Filtrar sessões…"
|
|
6590
|
+
"filter": "Filtrar sessões…",
|
|
6591
|
+
"remove": "Remover sessão",
|
|
6592
|
+
"removeNamed": "Remover “{title}”",
|
|
6593
|
+
"removeAsk": "Remover “{title}” de vez?",
|
|
6594
|
+
"removeStopsTurn": "O turno em andamento será interrompido.",
|
|
6595
|
+
"removeStopsAgents": "Os agentes em execução serão interrompidos ({count}).",
|
|
6596
|
+
"removeConfirm": "Remover",
|
|
6597
|
+
"removeFailed": "Não foi possível remover “{title}”: {error}"
|
|
6448
6598
|
},
|
|
6449
6599
|
"work": {
|
|
6450
6600
|
"agents": "{count} agentes",
|
|
@@ -7097,6 +7247,7 @@
|
|
|
7097
7247
|
"awaitingRoute": "aguardando sua escolha de modelo",
|
|
7098
7248
|
"needsApproval": "precisa de aprovação",
|
|
7099
7249
|
"needsInput": "precisa de informações",
|
|
7250
|
+
"waitingInput": "aguardando sua resposta",
|
|
7100
7251
|
"queued": "na fila",
|
|
7101
7252
|
"strongerModel": "um modelo mais capaz",
|
|
7102
7253
|
"escalateTo": "Transferir para {label}",
|
|
@@ -7130,12 +7281,65 @@
|
|
|
7130
7281
|
"showAll": "Mostrar tudo",
|
|
7131
7282
|
"stopAll": "Parar tudo",
|
|
7132
7283
|
"empty": "Ainda não há agentes despachados. Experimente /dispatch codex \"…\"",
|
|
7133
|
-
"running":
|
|
7134
|
-
|
|
7135
|
-
|
|
7284
|
+
"running": {
|
|
7285
|
+
"one": "{count} em execução",
|
|
7286
|
+
"other": "{count} em execução"
|
|
7287
|
+
},
|
|
7288
|
+
"needsApproval": {
|
|
7289
|
+
"one": "{count} precisa de aprovação",
|
|
7290
|
+
"other": "{count} precisam de aprovação"
|
|
7291
|
+
},
|
|
7292
|
+
"needsAnswer": {
|
|
7293
|
+
"one": "{count} aguardando sua resposta",
|
|
7294
|
+
"other": "{count} aguardando sua resposta"
|
|
7295
|
+
},
|
|
7296
|
+
"done": {
|
|
7297
|
+
"one": "{count} concluído",
|
|
7298
|
+
"other": "{count} concluídos"
|
|
7299
|
+
},
|
|
7136
7300
|
"emptyShort": "Ainda não há agentes despachados.",
|
|
7137
7301
|
"clearFinished": "Limpar concluídos",
|
|
7138
|
-
"idle":
|
|
7302
|
+
"idle": {
|
|
7303
|
+
"one": "{count} ocioso",
|
|
7304
|
+
"other": "{count} ociosos"
|
|
7305
|
+
},
|
|
7306
|
+
"reveal": "{label}. Mostrar na conversa",
|
|
7307
|
+
"working": "Agentes trabalhando",
|
|
7308
|
+
"more": {
|
|
7309
|
+
"one": "Mais {count} agente trabalhando: mostrar a lista",
|
|
7310
|
+
"other": "Mais {count} agentes trabalhando: mostrar a lista"
|
|
7311
|
+
}
|
|
7312
|
+
},
|
|
7313
|
+
"stage": {
|
|
7314
|
+
"scene": {
|
|
7315
|
+
"quick": "Ajuste rápido",
|
|
7316
|
+
"code": "Programando",
|
|
7317
|
+
"complex": "Tarefa complexa",
|
|
7318
|
+
"review": "Revisando",
|
|
7319
|
+
"research": "Pesquisando",
|
|
7320
|
+
"browser": "Navegando",
|
|
7321
|
+
"computer": "Usando o computador",
|
|
7322
|
+
"automation": "Automatizando",
|
|
7323
|
+
"design": "Criando o design",
|
|
7324
|
+
"image_gen": "Gerando uma imagem",
|
|
7325
|
+
"video_gen": "Gerando um vídeo",
|
|
7326
|
+
"generic": "Trabalhando"
|
|
7327
|
+
},
|
|
7328
|
+
"doing": "{scene}…",
|
|
7329
|
+
"queued": "Na fila",
|
|
7330
|
+
"queuedAt": "Na fila · posição {n}",
|
|
7331
|
+
"starting": "Iniciando…",
|
|
7332
|
+
"waitingApproval": "Aguardando sua aprovação",
|
|
7333
|
+
"waitingInput": "Aguardando sua resposta",
|
|
7334
|
+
"waitingRoute": "Aguardando sua escolha de modelo",
|
|
7335
|
+
"done": "Concluído",
|
|
7336
|
+
"failed": "Falhou",
|
|
7337
|
+
"stopped": "Parado",
|
|
7338
|
+
"underMinute": "menos de um minuto",
|
|
7339
|
+
"minutes": {
|
|
7340
|
+
"one": "{count} min",
|
|
7341
|
+
"other": "{count} min"
|
|
7342
|
+
}
|
|
7139
7343
|
},
|
|
7140
7344
|
"composer": {
|
|
7141
7345
|
"aria": "Enviar mensagem ao assistente",
|
|
@@ -8485,7 +8689,7 @@
|
|
|
8485
8689
|
"selectionMissing": "Escolha primeiro uma CLI e um projeto: Voltar leva você até eles.",
|
|
8486
8690
|
"names": {
|
|
8487
8691
|
"explorer": "Memory Explorer",
|
|
8488
|
-
"schedules": "
|
|
8692
|
+
"schedules": "Agendamentos",
|
|
8489
8693
|
"keybinds": "Keybinds"
|
|
8490
8694
|
},
|
|
8491
8695
|
"chapters": {
|
|
@@ -8531,7 +8735,7 @@
|
|
|
8531
8735
|
},
|
|
8532
8736
|
"explain-graph": {
|
|
8533
8737
|
"title": "Veja sua memória como um mapa",
|
|
8534
|
-
"body": "Cada memória é um ponto no mapa, e as categorias formam ilhas. O
|
|
8738
|
+
"body": "Cada memória é um ponto no mapa, e as categorias formam ilhas. O submenu {menu} de {apps} enquadra o mapa, mostra os vizinhos de uma memória e reconstrói o layout.",
|
|
8535
8739
|
"body2d": "Cada memória é um nó, com vínculos para as memórias relacionadas. O menu {menu} escolhe quais vínculos aparecem e quantas memórias carregam, e redefine o layout."
|
|
8536
8740
|
},
|
|
8537
8741
|
"explain-focus": {
|
|
@@ -8561,7 +8765,7 @@
|
|
|
8561
8765
|
},
|
|
8562
8766
|
"explain-schedules": {
|
|
8563
8767
|
"title": "Rode o trabalho na hora certa",
|
|
8564
|
-
"body": "{schedules}
|
|
8768
|
+
"body": "Em {schedules}, suas automações rodam com um timer ou uma agenda cron. Cada execução abre sua própria sessão de agente."
|
|
8565
8769
|
},
|
|
8566
8770
|
"assistant-start": {
|
|
8567
8771
|
"title": "Conheça o Assistente SynaBun",
|
|
@@ -8758,6 +8962,7 @@
|
|
|
8758
8962
|
"tooltip": "Atualização do SynaBun disponível: v{current} → v{latest}",
|
|
8759
8963
|
"tooltipDownloading": "Baixando o SynaBun v{latest}",
|
|
8760
8964
|
"tooltipReady": "O SynaBun v{latest} está pronto: ele é instalado quando o SynaBun estiver ocioso",
|
|
8965
|
+
"tooltipReadyOff": "O SynaBun v{latest} está pronto para instalar",
|
|
8761
8966
|
"titleAvailable": "Atualização disponível",
|
|
8762
8967
|
"titleDownloading": "Baixando a atualização",
|
|
8763
8968
|
"titleDownloaded": "Atualização pronta",
|
|
@@ -8780,6 +8985,8 @@
|
|
|
8780
8985
|
"hide": "Ocultar",
|
|
8781
8986
|
"hideHint": "O download continua com esta janela oculta. O SynaBun instala a atualização sozinho quando nada estiver em execução.",
|
|
8782
8987
|
"readyBody": "O SynaBun v{version} foi baixado. Ele é instalado sozinho quando nada estiver em execução: o SynaBun mostra um aviso de um minuto e reinicia já atualizado. Ele também é instalado quando você sai do SynaBun.",
|
|
8988
|
+
"offBody": "As atualizações automáticas estão desligadas. Instalar agora baixa a versão e reinicia o SynaBun nela assim que nada estiver em execução.",
|
|
8989
|
+
"readyBodyOff": "O SynaBun v{version} foi baixado. As atualizações automáticas estão desligadas: ele é instalado quando você escolher Instalar agora.",
|
|
8783
8990
|
"waitingBody": "Aguardando: {list}.",
|
|
8784
8991
|
"countdownBody": "O SynaBun reinicia na v{version} em {seconds} s.",
|
|
8785
8992
|
"postponedBody": "Adiado até {time}. Ele também é instalado quando você sai do SynaBun.",
|
|
@@ -8796,12 +9003,14 @@
|
|
|
8796
9003
|
"errorFallback": "O SynaBun não conseguiu procurar atualizações. Verifique a conexão e tente novamente.",
|
|
8797
9004
|
"errorNext": "O SynaBun mantém a versão em execução e tenta de novo na próxima verificação. Você pode tentar agora ou baixar a nova versão manualmente.",
|
|
8798
9005
|
"manualLink": "Baixar manualmente",
|
|
9006
|
+
"settingsLink": "Configurações de atualização",
|
|
8799
9007
|
"close": "Fechar",
|
|
8800
9008
|
"retry": "Tentar novamente",
|
|
8801
9009
|
"testFeed": "feed de teste",
|
|
8802
9010
|
"metaAvailable": "Pelo app do SynaBun",
|
|
8803
9011
|
"metaDownloading": "Baixando: {percent}%",
|
|
8804
9012
|
"metaDownloaded": "Pronta: é instalada quando o SynaBun estiver ocioso",
|
|
9013
|
+
"metaReadyOff": "Pronta para instalar",
|
|
8805
9014
|
"metaCountdown": "Reiniciando para instalá-la",
|
|
8806
9015
|
"metaPostponed": "Adiada: é instalada ao sair ou mais tarde"
|
|
8807
9016
|
},
|
|
@@ -8848,6 +9057,8 @@
|
|
|
8848
9057
|
"updateAvailableManualDetail": "Esta cópia não consegue se substituir onde está. Baixe a nova imagem de disco e instale-a do jeito que você instalou o SynaBun.",
|
|
8849
9058
|
"updateDownloading": "O SynaBun v{version} está sendo baixado",
|
|
8850
9059
|
"updateAutoDetail": "O SynaBun a instala sozinho assim que nada estiver em execução, depois de um aviso de um minuto que você pode adiar. Ela também é instalada quando você sai do SynaBun.",
|
|
9060
|
+
"updateAvailableOffDetail": "As atualizações automáticas estão desligadas. Instalar agora baixa a versão e reinicia o SynaBun nela assim que nada estiver em execução.",
|
|
9061
|
+
"updateReadyOffDetail": "As atualizações automáticas estão desligadas: ela é instalada quando você escolher Instalar agora.",
|
|
8851
9062
|
"installNow": "Instalar agora",
|
|
8852
9063
|
"downloadYourself": "Baixar manualmente",
|
|
8853
9064
|
"countdownTitle": "Atualizando o SynaBun para a v{version}",
|
|
@@ -91,11 +91,13 @@ export function createAccountUsage({ accounts = {}, readCodex = null, fetchImpl
|
|
|
91
91
|
combined.fetchedAt = new Date(Math.max(...fresh.map(w => w.at), value.windows.length ? Date.parse(value.fetchedAt) : 0)).toISOString();
|
|
92
92
|
return combined;
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
// `stale`: a reading older than ttlMs still counts (a display that refreshes in the background); the
|
|
95
|
+
// account's own state must still match it, and a window past its reset is still unknown.
|
|
96
|
+
function peek(provider, id, { stale = false } = {}) {
|
|
95
97
|
const row = rowOf(provider, id);
|
|
96
98
|
if (row?.mode === 'apiKey' || row?.mode === 'api') return unknown('not_applicable', now());
|
|
97
99
|
const item = cache.get(keyOf(provider, id));
|
|
98
|
-
const value = item?.signature === signature(row) && now() - item.at < ttlMs ? summarize(item.value.windows, item.value.source, Date.parse(item.value.fetchedAt), item.value.limited && !item.value.windows.some(w => w.usedPercent >= 100)) : unknown('unknown', now());
|
|
100
|
+
const value = item?.signature === signature(row) && (stale || now() - item.at < ttlMs) ? summarize(item.value.windows, item.value.source, Date.parse(item.value.fetchedAt), item.value.limited && !item.value.windows.some(w => w.usedPercent >= 100)) : unknown('unknown', now());
|
|
99
101
|
// Do not keep a limited window alive after its reset.
|
|
100
102
|
if (value.windows.some(w => w.resetsAt && Date.parse(w.resetsAt) <= now())) return overlay(provider, id, unknown('unknown', now()));
|
|
101
103
|
return overlay(provider, id, value);
|
|
@@ -137,7 +139,7 @@ export function createAccountUsage({ accounts = {}, readCodex = null, fetchImpl
|
|
|
137
139
|
await Promise.all(Object.entries(accounts).filter(([p]) => !provider || p === provider).flatMap(([p, service]) => service.list().map(row => read(p, row.id))));
|
|
138
140
|
return list();
|
|
139
141
|
}
|
|
140
|
-
function list() { return Object.fromEntries(Object.entries(accounts).map(([p, service]) => [p, service.listForClient().map(row => ({ ...row, usage: peek(p, row.id) }))])); }
|
|
142
|
+
function list({ stale = false } = {}) { return Object.fromEntries(Object.entries(accounts).map(([p, service]) => [p, service.listForClient().map(row => ({ ...row, usage: peek(p, row.id, { stale }) }))])); }
|
|
141
143
|
function invalidate(p, id) { const key = keyOf(p, id); generations.set(key, (generations.get(key) || 0) + 1); cache.delete(key); overlays.delete(key); }
|
|
142
144
|
return { read, peek, note, refresh, list, invalidate };
|
|
143
145
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — /api/system/app: Settings > App for an npm or Git install
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// GET /api/system/app { ok, install, desktop, updates: { auto }, startup: { … } }
|
|
6
|
+
// PUT /api/system/app/updates { auto: boolean } the automatic update check and its badge
|
|
7
|
+
// PUT /api/system/app/startup { enabled: boolean } start the server at login (lib/login-start.js)
|
|
8
|
+
// POST /api/system/app/open-folder { which: 'data' | 'logs' }
|
|
9
|
+
//
|
|
10
|
+
// Automatic updates here are the check: on (the default), the server looks for
|
|
11
|
+
// a newer version when it starts and the page shows the update badge and asks
|
|
12
|
+
// again every half hour; off, it looks only when the user asks (Check for
|
|
13
|
+
// updates). Installing always goes through the update dialog and its backup
|
|
14
|
+
// step; nothing installs unattended. The setting is DATA_HOME/data/app-settings.json.
|
|
15
|
+
//
|
|
16
|
+
// In the desktop app (`desktop: true`) the app's own settings are the
|
|
17
|
+
// window's (packaging/desktop/src/app-prefs.mjs, through the preload bridge):
|
|
18
|
+
// this answers what it is and changes nothing.
|
|
19
|
+
//
|
|
20
|
+
// These are the owner's acts on this computer (a login entry, a folder opened
|
|
21
|
+
// on its screen), so the routes take the guards of /api/cli/install
|
|
22
|
+
// (lib/http-guards.js): a loopback socket and no proxy header, a localhost
|
|
23
|
+
// Host, no invite guest; a write also its own Origin, a JSON body,
|
|
24
|
+
// X-SynaBun-UI: 1 and no agent header. (`/api/system` is admin-only in
|
|
25
|
+
// lib/request-gate.js too.) A request names a switch, never a path or a command.
|
|
26
|
+
|
|
27
|
+
import { Router } from 'express';
|
|
28
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
29
|
+
import { dirname } from 'node:path';
|
|
30
|
+
import { guestForbidden, noStore, requireLocal, requireLocalHost, requireSameOriginJson, sendGuardError, uiOnly } from './http-guards.js';
|
|
31
|
+
import { runProgram } from './file-explorer-system.js';
|
|
32
|
+
|
|
33
|
+
export const APP_SETTINGS_DEFAULTS = Object.freeze({ autoUpdateCheck: true });
|
|
34
|
+
|
|
35
|
+
export function normalizeAppSettings(raw) {
|
|
36
|
+
const source = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
37
|
+
const out = {};
|
|
38
|
+
for (const [key, value] of Object.entries(APP_SETTINGS_DEFAULTS)) out[key] = typeof source[key] === typeof value ? source[key] : value;
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** DATA_HOME/data/app-settings.json, read once and written through (this server is its only writer). */
|
|
43
|
+
export function createAppSettingsStore({ path, fs = { mkdirSync, readFileSync, renameSync, writeFileSync } } = {}) {
|
|
44
|
+
let current = null;
|
|
45
|
+
const load = () => {
|
|
46
|
+
if (current) return current;
|
|
47
|
+
try { current = normalizeAppSettings(JSON.parse(fs.readFileSync(path, 'utf8'))); } catch { current = normalizeAppSettings(null); }
|
|
48
|
+
return current;
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
get: () => ({ ...load() }),
|
|
52
|
+
set(patch) {
|
|
53
|
+
const next = normalizeAppSettings({ ...load(), ...patch });
|
|
54
|
+
fs.mkdirSync(dirname(path), { recursive: true });
|
|
55
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
56
|
+
fs.writeFileSync(temp, JSON.stringify(next, null, 2) + '\n');
|
|
57
|
+
fs.renameSync(temp, path);
|
|
58
|
+
current = next;
|
|
59
|
+
return { ...next };
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** The program that shows a folder in the system's file manager (no shell; the path is an argument of its own). */
|
|
65
|
+
export function openFolderCommand(platform, path, { env = process.env } = {}) {
|
|
66
|
+
if (platform === 'darwin') return { file: 'open', args: [path] };
|
|
67
|
+
// explorer.exe answers 1 even when it opened the folder.
|
|
68
|
+
if (platform === 'win32') return { file: 'explorer.exe', args: [path], anyExit: true };
|
|
69
|
+
if (!env.DISPLAY && !env.WAYLAND_DISPLAY) return null;
|
|
70
|
+
return { file: 'xdg-open', args: [path] };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Open a folder on this computer's screen; resolves true when the file manager took it. */
|
|
74
|
+
export async function openFolderOnScreen(path, { platform = process.platform, env = process.env, run = runProgram, mkdir = mkdirSync } = {}) {
|
|
75
|
+
const command = openFolderCommand(platform, path, { env });
|
|
76
|
+
if (!command) return false;
|
|
77
|
+
try { mkdir(path, { recursive: true }); } catch {}
|
|
78
|
+
try {
|
|
79
|
+
await run(command.file, command.args);
|
|
80
|
+
return true;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
return !!command.anyExit && error?.code !== 'ENOENT';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function localRouter({ isGuestRequest, port }) {
|
|
87
|
+
const router = Router();
|
|
88
|
+
const portOf = () => Number(typeof port === 'function' ? port() : port);
|
|
89
|
+
const built = new Map();
|
|
90
|
+
const perPort = (name, factory) => (req, res, next) => {
|
|
91
|
+
const key = `${name}:${portOf()}`;
|
|
92
|
+
let guard = built.get(key);
|
|
93
|
+
if (!guard) {
|
|
94
|
+
try { guard = factory(portOf()); } catch { return sendGuardError(res, 500, 'BAD_PORT', 'The app settings have no valid port.'); }
|
|
95
|
+
built.set(key, guard);
|
|
96
|
+
}
|
|
97
|
+
return guard(req, res, next);
|
|
98
|
+
};
|
|
99
|
+
router.use(noStore, guestForbidden(isGuestRequest), requireLocal, perPort('host', requireLocalHost));
|
|
100
|
+
return { router, mutating: [perPort('origin', requireSameOriginJson), uiOnly] };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {object} deps
|
|
105
|
+
* @param {ReturnType<typeof createAppSettingsStore>} deps.store
|
|
106
|
+
* @param {ReturnType<import('./login-start.js').createLoginStart>} deps.loginStart
|
|
107
|
+
* @param {{ data: string, logs: string }} deps.folders
|
|
108
|
+
* @param {string} deps.install 'npm' | 'git' | 'app' | 'desktop'
|
|
109
|
+
* @param {(auto: boolean) => void} [deps.onAutoUpdateChange]
|
|
110
|
+
* @param {(path: string) => Promise<boolean>} [deps.openFolder]
|
|
111
|
+
*/
|
|
112
|
+
export function createAppControlsApi({
|
|
113
|
+
store, loginStart, folders, install = 'npm', onAutoUpdateChange = () => {}, openFolder = (path) => openFolderOnScreen(path),
|
|
114
|
+
isGuestRequest = () => false, port = 3344, log = () => {},
|
|
115
|
+
} = {}) {
|
|
116
|
+
if (!store || !loginStart || !folders) throw new Error('createAppControlsApi needs the settings store, the login start and the folders');
|
|
117
|
+
const { router, mutating } = localRouter({ isGuestRequest, port });
|
|
118
|
+
const desktop = install === 'desktop';
|
|
119
|
+
|
|
120
|
+
const body = () => {
|
|
121
|
+
let startup;
|
|
122
|
+
try { startup = loginStart.status(); } catch (error) { startup = { supported: false, reason: 'unsupported', enabled: false, state: 'off', owner: null, error: String(error?.message || error) }; }
|
|
123
|
+
return { ok: true, install, desktop, updates: { auto: store.get().autoUpdateCheck !== false }, startup };
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
router.get('/', (req, res) => { res.json(body()); });
|
|
127
|
+
|
|
128
|
+
router.put('/updates', ...mutating, (req, res) => {
|
|
129
|
+
const auto = req.body?.auto;
|
|
130
|
+
if (typeof auto !== 'boolean') return res.status(400).json({ ok: false, code: 'BAD_REQUEST', error: 'Send { auto: true | false }.' });
|
|
131
|
+
if (desktop) return res.status(409).json({ ok: false, code: 'DESKTOP_MANAGED', error: 'The SynaBun app keeps this setting itself.' });
|
|
132
|
+
try { store.set({ autoUpdateCheck: auto }); } catch (error) {
|
|
133
|
+
return res.status(500).json({ ok: false, code: 'SAVE_FAILED', error: String(error?.message || error) });
|
|
134
|
+
}
|
|
135
|
+
try { onAutoUpdateChange(auto); } catch {}
|
|
136
|
+
res.json(body());
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
router.put('/startup', ...mutating, async (req, res) => {
|
|
140
|
+
const enabled = req.body?.enabled;
|
|
141
|
+
if (typeof enabled !== 'boolean') return res.status(400).json({ ok: false, code: 'BAD_REQUEST', error: 'Send { enabled: true | false }.' });
|
|
142
|
+
try {
|
|
143
|
+
await loginStart.set(enabled);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
const code = String(error?.code || 'refused');
|
|
146
|
+
log(`[app] start at login could not be turned ${enabled ? 'on' : 'off'}: ${error?.message || error}`);
|
|
147
|
+
return res.status(409).json({ ...body(), ok: false, code, error: String(error?.message || error).slice(0, 300) });
|
|
148
|
+
}
|
|
149
|
+
res.json(body());
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
router.post('/open-folder', ...mutating, async (req, res) => {
|
|
153
|
+
const which = req.body?.which;
|
|
154
|
+
if (which !== 'data' && which !== 'logs') return res.status(400).json({ ok: false, code: 'BAD_REQUEST', error: "Send { which: 'data' | 'logs' }." });
|
|
155
|
+
const opened = await openFolder(folders[which]).catch(() => false);
|
|
156
|
+
if (!opened) return res.status(422).json({ ok: false, code: 'NO_FILE_MANAGER', error: 'No file manager opened the folder.' });
|
|
157
|
+
res.json({ ok: true });
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return router;
|
|
161
|
+
}
|
|
@@ -17,6 +17,7 @@ import { tooLargeMessage } from './assistant-attachments.js';
|
|
|
17
17
|
import { getSessionPolicy, requiresHumanApproval } from './remote-policy.js';
|
|
18
18
|
import { clampPlanDispatch, PLAN_DISPATCH_NOTE, runCanChangeCode } from './assistant-plan-permissions.js';
|
|
19
19
|
import { noStore, requireJson, requireLocal, requireLocalHost, sendGuardError } from './http-guards.js';
|
|
20
|
+
import { setUntrustedFileHeaders } from './untrusted-file-headers.js';
|
|
20
21
|
|
|
21
22
|
/** The header whatsapp_send_file's caller proves it is the WhatsApp conversation's own brain with (assistant-runtime.js BRAIN_CREDENTIAL_RE). */
|
|
22
23
|
export const BRAIN_CREDENTIAL_HEADER = 'x-synabun-brain-token';
|
|
@@ -301,7 +302,10 @@ export function createAssistantApi({
|
|
|
301
302
|
// ── catalog ────────────────────────────────────────────────────────────────
|
|
302
303
|
router.get('/catalog', async (req, res) => {
|
|
303
304
|
try {
|
|
304
|
-
|
|
305
|
+
// Quotas are shown as last read and read again in the background (the probe can take seconds; the
|
|
306
|
+
// dispatcher and the router read them fresh before they choose an account).
|
|
307
|
+
accountUsage?.refresh()?.catch?.(() => {});
|
|
308
|
+
const usage = () => accountUsage?.list({ stale: true });
|
|
305
309
|
// refresh=1 rebuilds from the providers' endpoints; deep=1 also makes them ask the CLI / app-server again.
|
|
306
310
|
const deep = req.query.deep === '1';
|
|
307
311
|
const force = req.query.refresh === '1' || deep;
|
|
@@ -320,8 +324,8 @@ export function createAssistantApi({
|
|
|
320
324
|
// names none.
|
|
321
325
|
const accounts = {
|
|
322
326
|
...(brief.accounts || {}),
|
|
323
|
-
...(claudeAccounts ? { 'claude-code':
|
|
324
|
-
...(codexAccounts ? { codex:
|
|
327
|
+
...(claudeAccounts ? { 'claude-code': usage()?.['claude-code'] || claudeAccounts.listForClient() } : {}),
|
|
328
|
+
...(codexAccounts ? { codex: usage()?.codex || codexAccounts.listForClient() } : {}),
|
|
325
329
|
};
|
|
326
330
|
return res.json({ ok: true, generatedAt: new Date(now()).toISOString(), ...brief, accounts, claudeWorkerAccount: claudeWorkerAccountId(), codexWorkerAccount: codexWorkerAccountId(), limits: dispatcher.limits, runs: dispatcher.list({ activeOnly: true }), totals: dispatcher.totals() });
|
|
327
331
|
}
|
|
@@ -329,7 +333,7 @@ export function createAssistantApi({
|
|
|
329
333
|
// within seconds), so it is asked every time: this answer is reused only while it hands back the
|
|
330
334
|
// build the answer was made from (a rebuild or invalidate() gives another one).
|
|
331
335
|
const base = typeof buildCatalog === 'function' ? await buildCatalog({ force, deep }) : NO_CATALOG;
|
|
332
|
-
if (!force && catalogCache && catalogCache.base === base && now() - catalogCache.at < 30_000) return res.json(accountUsage ? { ...catalogCache.value, accounts: { ...catalogCache.value.accounts, ...
|
|
336
|
+
if (!force && catalogCache && catalogCache.base === base && now() - catalogCache.at < 30_000) return res.json(accountUsage ? { ...catalogCache.value, accounts: { ...catalogCache.value.accounts, ...usage() } } : catalogCache.value);
|
|
333
337
|
// Hidden rows stay server-side (view=manage lists them); the lists themselves ship.
|
|
334
338
|
const { hiddenRows: _hiddenRows, ...visible } = base || {};
|
|
335
339
|
const value = {
|
|
@@ -338,8 +342,8 @@ export function createAssistantApi({
|
|
|
338
342
|
...visible,
|
|
339
343
|
accounts: {
|
|
340
344
|
...(base.accounts || {}),
|
|
341
|
-
'claude-code':
|
|
342
|
-
codex:
|
|
345
|
+
'claude-code': usage()?.['claude-code'] || (claudeAccounts ? claudeAccounts.listForClient() : (base.accounts?.['claude-code'] || [])),
|
|
346
|
+
codex: usage()?.codex || (codexAccounts ? codexAccounts.listForClient() : (base.accounts?.codex || [])),
|
|
343
347
|
},
|
|
344
348
|
claudeWorkerAccount: claudeWorkerAccountId(),
|
|
345
349
|
codexWorkerAccount: codexWorkerAccountId(),
|
|
@@ -836,6 +840,8 @@ export function createAssistantApi({
|
|
|
836
840
|
'Accept-Ranges': 'bytes', 'X-Content-Type-Options': 'nosniff', 'Cache-Control': 'private, max-age=3600',
|
|
837
841
|
});
|
|
838
842
|
if (range) res.set('Content-Range', `bytes ${start}-${end}/${size}`);
|
|
843
|
+
// A run's media is what a worker made: opened by its address it runs nothing, and an SVG is a download.
|
|
844
|
+
setUntrustedFileHeaders(res, file.path, file.mime);
|
|
839
845
|
if (req.method === 'HEAD' || !size) { await handle.close().catch(() => {}); return res.end(); }
|
|
840
846
|
const stream = handle.createReadStream({ start, end });
|
|
841
847
|
stream.on('error', () => res.destroy());
|
|
@@ -996,9 +1002,17 @@ export function createAssistantApi({
|
|
|
996
1002
|
if (!requireRuntime(res)) return;
|
|
997
1003
|
try { res.json({ ok: true, session: await runtime.closeSession(req.params.id) }); } catch (error) { sendError(res, error); }
|
|
998
1004
|
});
|
|
1005
|
+
// Remove (the Sessions menu): the record, its transcript and its usage journal go for good, after its
|
|
1006
|
+
// running turn and the workers it dispatched are stopped. Memories made from it stay.
|
|
999
1007
|
router.delete('/sessions/:id', async (req, res) => {
|
|
1000
1008
|
if (!requireRuntime(res)) return;
|
|
1001
|
-
try {
|
|
1009
|
+
try {
|
|
1010
|
+
if (runtime.removeSession) {
|
|
1011
|
+
const { removed, stoppedRuns } = await runtime.removeSession(req.params.id);
|
|
1012
|
+
return res.json({ ok: true, removed, stoppedRuns });
|
|
1013
|
+
}
|
|
1014
|
+
res.json({ ok: true, removed: await runtime.destroySession(req.params.id) });
|
|
1015
|
+
} catch (error) { sendError(res, error); }
|
|
1002
1016
|
});
|
|
1003
1017
|
|
|
1004
1018
|
// ── attachments ────────────────────────────────────────────────────────────
|