synabun 2.0.10 → 2.1.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/CHANGELOG.md +86 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +2 -2
- package/hooks/claude-code/pre-websearch.mjs +12 -1
- package/hooks/claude-code/shared.mjs +5 -0
- package/hooks/claude-code/stop.mjs +1 -1
- package/lib/claude-hooks.js +172 -18
- package/lib/client-config-repair.js +17 -8
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +1 -1
- package/lib/first-launch-protection.js +57 -12
- package/lib/mcp-dist.js +176 -0
- package/lib/release-npm-ci.mjs +138 -0
- package/lib/release-publish.mjs +91 -0
- package/lib/release-scan.mjs +50 -0
- package/lib/server-crash-record.js +123 -0
- package/lib/server-exit.js +318 -0
- package/lib/server-supervisor.js +508 -0
- package/lib/start-launcher.js +37 -4
- package/lib/tools-cli.js +45 -0
- package/lib/update-snapshot.js +228 -0
- package/lib/virustotal.mjs +192 -0
- package/lib/windows-crash-event.js +269 -0
- package/mcp-server/dist/http.d.ts +20 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +59 -12
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts +33 -27
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +128 -143
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/preload.js +1 -1
- package/mcp-server/dist/preload.js.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +81 -28
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +16 -10
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +67 -11
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/server-instructions.d.ts +7 -2
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
- package/mcp-server/dist/services/server-instructions.js +20 -62
- package/mcp-server/dist/services/server-instructions.js.map +1 -1
- package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
- package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-catalog.js +339 -0
- package/mcp-server/dist/services/tool-catalog.js.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
- package/mcp-server/dist/services/tool-list.d.ts +108 -0
- package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list.js +334 -0
- package/mcp-server/dist/services/tool-list.js.map +1 -0
- package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
- package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-runtime.js +400 -0
- package/mcp-server/dist/services/tool-runtime.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -10
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +22 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
- package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill-tools.js +639 -0
- package/mcp-server/dist/tools/skill-tools.js.map +1 -0
- package/mcp-server/dist/tools/skill.d.ts +7 -0
- package/mcp-server/dist/tools/skill.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill.js +11 -0
- package/mcp-server/dist/tools/skill.js.map +1 -0
- package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
- package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/tool-groups.js +147 -0
- package/mcp-server/dist/tools/tool-groups.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-format.js +7 -4
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/mcp-server/src/http.ts +75 -12
- package/mcp-server/src/index.ts +147 -154
- package/mcp-server/src/preload.ts +12 -12
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/neural-interface.ts +79 -20
- package/mcp-server/src/services/server-instructions.ts +27 -63
- package/mcp-server/src/services/tool-catalog.ts +403 -0
- package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
- package/mcp-server/src/services/tool-list.ts +410 -0
- package/mcp-server/src/services/tool-runtime.ts +457 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +22 -14
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/skill-tools.ts +589 -0
- package/mcp-server/src/tools/skill.ts +13 -0
- package/mcp-server/src/tools/tool-groups.ts +164 -0
- package/mcp-server/src/tools/whiteboard-format.ts +9 -3
- package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
- package/neural-interface/i18n/en.json +3463 -200
- package/neural-interface/i18n/pt-BR.json +3411 -151
- package/neural-interface/lib/assistant-api.js +127 -28
- package/neural-interface/lib/assistant-brains/claude.js +4 -3
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
- package/neural-interface/lib/assistant-brains/codex.js +9 -5
- package/neural-interface/lib/assistant-brains/opencode.js +120 -54
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
- package/neural-interface/lib/assistant-catalog.js +6 -7
- package/neural-interface/lib/assistant-dispatch.js +871 -156
- package/neural-interface/lib/assistant-envelope.js +3 -1
- package/neural-interface/lib/assistant-persona.js +80 -11
- package/neural-interface/lib/assistant-plan-permissions.js +10 -9
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
- package/neural-interface/lib/assistant-route-gate.js +6 -4
- package/neural-interface/lib/assistant-router.js +13 -8
- package/neural-interface/lib/assistant-runtime.js +56 -18
- package/neural-interface/lib/assistant-task-prompt.js +78 -14
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/backup-service.js +620 -3
- package/neural-interface/lib/backup-zip-reader.js +10 -5
- package/neural-interface/lib/backup-zip-writer.js +257 -0
- package/neural-interface/lib/browser-execution.js +10 -2
- package/neural-interface/lib/browser-guard-cdp.js +83 -0
- package/neural-interface/lib/browser-network-guard.js +284 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +186 -31
- package/neural-interface/lib/claude-agent-bridge.js +4 -2
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install.js +18 -138
- package/neural-interface/lib/cli-resolver.js +4 -1
- package/neural-interface/lib/cli-update-planner.js +32 -31
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-worker-app-server.js +172 -0
- package/neural-interface/lib/confined-fs.js +30 -3
- package/neural-interface/lib/crash-notice-api.js +98 -0
- package/neural-interface/lib/editor-completion-opencode.js +68 -68
- package/neural-interface/lib/exec-loop-command.js +4 -8
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/mcp-agent-servers.js +67 -0
- package/neural-interface/lib/mcp-client-config.js +0 -29
- package/neural-interface/lib/mcp-external-servers.js +323 -0
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/morelogin.js +30 -0
- package/neural-interface/lib/native-loop-providers.js +547 -47
- package/neural-interface/lib/native-loop-runtime.js +268 -41
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +17 -34
- package/neural-interface/lib/opencode-history.js +48 -218
- package/neural-interface/lib/opencode-mcp-ready.js +108 -0
- package/neural-interface/lib/opencode-native-boundary.js +44 -0
- package/neural-interface/lib/opencode-protocol.js +249 -112
- package/neural-interface/lib/opencode-runtime-config.js +32 -22
- package/neural-interface/lib/opencode-serve-records.js +39 -21
- package/neural-interface/lib/opencode-v2-client.js +48 -153
- package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +73 -37
- package/neural-interface/lib/opencode2-proxy.js +23 -63
- package/neural-interface/lib/opencode2-translate.js +51 -2
- package/neural-interface/lib/owner-authority.js +249 -0
- package/neural-interface/lib/page-session.js +275 -0
- package/neural-interface/lib/peer-identity.js +763 -0
- package/neural-interface/lib/request-gate.js +17 -2
- package/neural-interface/lib/rulesets/api.js +1 -1
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +92 -27
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +17 -30
- package/neural-interface/lib/session-title-generator.js +58 -36
- package/neural-interface/lib/skills/api-v2.js +495 -0
- package/neural-interface/lib/skills/bundle.js +418 -0
- package/neural-interface/lib/skills/catalog.js +294 -0
- package/neural-interface/lib/skills/creation-api.js +191 -0
- package/neural-interface/lib/skills/creation-brief.js +247 -0
- package/neural-interface/lib/skills/creation-sources.js +267 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +564 -0
- package/neural-interface/lib/skills/digest.js +119 -0
- package/neural-interface/lib/skills/discover.js +111 -0
- package/neural-interface/lib/skills/draft-confinement.js +214 -0
- package/neural-interface/lib/skills/eval-confinement.js +397 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +119 -0
- package/neural-interface/lib/skills/evals-api.js +212 -0
- package/neural-interface/lib/skills/evals.js +1573 -0
- package/neural-interface/lib/skills/export.js +200 -0
- package/neural-interface/lib/skills/frontmatter.js +64 -0
- package/neural-interface/lib/skills/health.js +75 -0
- package/neural-interface/lib/skills/json-edit.js +165 -0
- package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
- package/neural-interface/lib/skills/known-bridges.js +96 -0
- package/neural-interface/lib/skills/library.js +823 -0
- package/neural-interface/lib/skills/local-store.js +21 -0
- package/neural-interface/lib/skills/migration.js +433 -0
- package/neural-interface/lib/skills/operations.js +45 -0
- package/neural-interface/lib/skills/ownership.js +427 -0
- package/neural-interface/lib/skills/packages.js +88 -0
- package/neural-interface/lib/skills/reviews.js +212 -0
- package/neural-interface/lib/skills/revision.js +80 -0
- package/neural-interface/lib/skills/roots.js +262 -0
- package/neural-interface/lib/skills/runtime-checks.js +355 -0
- package/neural-interface/lib/skills/scan-assets.js +252 -0
- package/neural-interface/lib/skills/scan-context.js +26 -0
- package/neural-interface/lib/skills/scan-shell.js +324 -0
- package/neural-interface/lib/skills/scan.js +364 -0
- package/neural-interface/lib/skills/scanners.js +54 -0
- package/neural-interface/lib/skills/service.js +522 -0
- package/neural-interface/lib/skills/telemetry.js +113 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/worker-confinement.js +1192 -0
- package/neural-interface/lib/worker-guard-setting.js +56 -0
- package/neural-interface/lib/worker-mcp-channel.js +175 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +229 -0
- package/neural-interface/lib/worker-sandbox.js +299 -0
- package/neural-interface/package-lock.json +18 -12
- package/neural-interface/package.json +2 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +2 -2
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +35 -19
- package/neural-interface/public/shared/api.js +1527 -1336
- package/neural-interface/public/shared/app-frame.js +192 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +33 -2
- package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
- package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
- package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +49 -35
- package/neural-interface/public/shared/assistant/asst-control.js +157 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
- package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
- package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
- package/neural-interface/public/shared/assistant/asst-panel.js +106 -11
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +401 -77
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-scenes.js +2 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
- package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
- package/neural-interface/public/shared/assistant/asst-state.js +11 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +59 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +156 -16
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +89 -19
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
- package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
- package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
- package/neural-interface/public/shared/cdx/cdx-panel.js +45 -149
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +47 -29
- package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +11 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +52 -39
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-view.js +4 -8
- package/neural-interface/public/shared/cli-status.js +2 -2
- package/neural-interface/public/shared/constants.js +2 -2
- package/neural-interface/public/shared/context-menu-areas.js +34 -0
- package/neural-interface/public/shared/context-menu-logic.js +243 -0
- package/neural-interface/public/shared/context-menu-model.js +366 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-update-view.js +20 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/html-shell.js +9 -11
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +47 -252
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +6 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +0 -21
- package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +14 -47
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/registry.js +5 -3
- package/neural-interface/public/shared/retired-2d.js +3 -0
- package/neural-interface/public/shared/schedules-view.js +195 -61
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +3 -1
- package/neural-interface/public/shared/settings/settings-ia.js +6 -6
- package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
- package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
- package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
- package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +219 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
- package/neural-interface/public/shared/skills/ss-doc.js +173 -0
- package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
- package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
- package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
- package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
- package/neural-interface/public/shared/skills/ss-evals.js +417 -0
- package/neural-interface/public/shared/skills/ss-form.js +159 -0
- package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
- package/neural-interface/public/shared/skills/ss-ids.js +32 -0
- package/neural-interface/public/shared/skills/ss-lint.js +141 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
- package/neural-interface/public/shared/skills/ss-resources.js +165 -0
- package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
- package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
- package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
- package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
- package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
- package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
- package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
- package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
- package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
- package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
- package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
- package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
- package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
- package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
- package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
- package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
- package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
- package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
- package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
- package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
- package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
- package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
- package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
- package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
- package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
- package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
- package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
- package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
- package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
- package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
- package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1525 -1779
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/tool-list-picker.js +55 -0
- package/neural-interface/public/shared/tool-list-storage.js +24 -0
- package/neural-interface/public/shared/tool-list-view.js +112 -0
- package/neural-interface/public/shared/tour/tour-actor.js +268 -0
- package/neural-interface/public/shared/tour/tour-beats.js +336 -0
- package/neural-interface/public/shared/tour/tour-engine.js +884 -0
- package/neural-interface/public/shared/tour/tour-ink.js +390 -0
- package/neural-interface/public/shared/tour/tour-stage.js +440 -0
- package/neural-interface/public/shared/tour/tour-state.js +40 -0
- package/neural-interface/public/shared/tour/tour-tips.js +99 -0
- package/neural-interface/public/shared/tour/tour.css +144 -0
- package/neural-interface/public/shared/ui-automation-studio.js +91 -128
- package/neural-interface/public/shared/ui-claude-panel.js +77 -5
- package/neural-interface/public/shared/ui-command-runner.js +6 -3
- package/neural-interface/public/shared/ui-context-menu.js +295 -0
- package/neural-interface/public/shared/ui-cost-widget.js +57 -59
- package/neural-interface/public/shared/ui-crash-notice.js +187 -0
- package/neural-interface/public/shared/ui-detail.js +15 -3
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-menubar.js +8 -18
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +7 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +507 -423
- package/neural-interface/public/shared/ui-sessions.js +5 -3
- package/neural-interface/public/shared/ui-settings.js +594 -462
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +1 -1
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- package/neural-interface/public/shared/ui-skills.js +33 -2830
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +15 -5
- package/neural-interface/public/shared/ui-terminal.js +124 -180
- package/neural-interface/public/shared/ui-tool-updates.js +3 -1
- package/neural-interface/public/shared/ui-tooltip.js +10 -5
- package/neural-interface/public/shared/ui-trash.js +6 -4
- package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
- package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -509
- package/neural-interface/public/shared/ui-update.js +38 -2
- package/neural-interface/public/shared/ui-whiteboard.js +311 -58
- package/neural-interface/public/shared/ui-worker-end.js +4 -0
- package/neural-interface/public/shared/ui-workspaces.js +3 -2
- package/neural-interface/public/shared/view-variant.js +66 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
- package/neural-interface/public/shared/whiteboard-list.js +172 -0
- package/neural-interface/public/shared/worker-end.js +10 -3
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +1 -1
- package/neural-interface/public/variant/2d/background.js +2 -1
- package/neural-interface/public/variant/2d/context-menu.js +8 -2
- package/neural-interface/public/variant/2d/graph.js +42 -20
- package/neural-interface/public/variant/2d/hulls.js +14 -9
- package/neural-interface/public/variant/2d/lasso.js +11 -7
- package/neural-interface/public/variant/2d/main.js +32 -1
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +69 -6
- package/neural-interface/public/variant/3d/map-controls.js +24 -9
- package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat.css +17 -0
- package/neural-interface/public/vendor/caveat/manifest.json +12 -0
- package/neural-interface/public/vendor/yaml/LICENSE +13 -0
- package/neural-interface/public/vendor/yaml/manifest.json +4 -0
- package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
- package/neural-interface/scripts/build-vendor.mjs +32 -0
- package/neural-interface/server.js +3934 -2454
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +18 -12
- package/package.json +16 -3
- package/postinstall.js +9 -4
- package/preuninstall.js +1 -1
- package/setup.js +97 -322
- package/skills/skill-forge/SKILL.md +177 -0
- package/skills/skill-forge/evals/evals.json +54 -0
- package/skills/skill-forge/references/package.md +105 -0
- package/skills/skill-forge/references/review-and-recovery.md +63 -0
- package/skills/skill-forge/references/runtime-profiles.md +20 -0
- package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
- package/skills/synabun/SKILL.md +10 -7
- package/skills/synabun/modules/audit.md +1 -5
- package/skills/synabun/modules/changelog.md +1 -5
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/memorize.md +6 -9
- package/skills/synabun/modules/schedule.md +4 -4
- package/mcp-server/dist/services/profiles.d.ts +0 -120
- package/mcp-server/dist/services/profiles.d.ts.map +0 -1
- package/mcp-server/dist/services/profiles.js +0 -387
- package/mcp-server/dist/services/profiles.js.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
- package/mcp-server/dist/tools/leonardo.d.ts +0 -13
- package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo.js +0 -21
- package/mcp-server/dist/tools/leonardo.js.map +0 -1
- package/mcp-server/dist/tools/profile.d.ts +0 -17
- package/mcp-server/dist/tools/profile.d.ts.map +0 -1
- package/mcp-server/dist/tools/profile.js +0 -114
- package/mcp-server/dist/tools/profile.js.map +0 -1
- package/mcp-server/src/services/profiles.ts +0 -428
- package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
- package/mcp-server/src/tools/leonardo.ts +0 -30
- package/mcp-server/src/tools/profile.ts +0 -122
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
- package/neural-interface/lib/mcp-profile-servers.js +0 -120
- package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
- package/skills/leonardo/SKILL.md +0 -168
- package/skills/leonardo/icon.svg +0 -1
- package/skills/leonardo/modules/browser-guide.md +0 -378
- package/skills/leonardo/modules/image-prompter.md +0 -283
- package/skills/leonardo/modules/model-advisor.md +0 -100
- package/skills/leonardo/modules/prompt-library.md +0 -110
- package/skills/leonardo/modules/style-guide.md +0 -186
- package/skills/leonardo/modules/video-prompter.md +0 -317
|
@@ -1,47 +1,19 @@
|
|
|
1
1
|
// OpenCode history maintenance.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
-
//
|
|
3
|
+
// OpenCode 2 keeps its sessions in its own database (opencode.db: session_v2,
|
|
4
|
+
// session_message, its event log, its instruction and inbox tables). SynaBun
|
|
5
|
+
// reads how many there are, read-only, and clears them through OpenCode's own
|
|
6
|
+
// API (DELETE /api/session/:id, which takes a session's child sessions and its
|
|
7
|
+
// rows with it); it never writes OpenCode's database or deletes its folders.
|
|
8
|
+
// Provider credentials, account state, projects, configuration and user files
|
|
9
|
+
// are never touched.
|
|
10
10
|
|
|
11
11
|
import { DatabaseSync } from 'node:sqlite';
|
|
12
|
-
import { existsSync,
|
|
13
|
-
import { basename, dirname, parse, resolve
|
|
14
|
-
import { isMainThread, parentPort, Worker, workerData } from 'node:worker_threads';
|
|
12
|
+
import { existsSync, statSync } from 'node:fs';
|
|
13
|
+
import { basename, dirname, parse, resolve } from 'node:path';
|
|
15
14
|
|
|
16
15
|
export const OPENCODE_HISTORY_CONFIRMATION = 'DELETE OPENCODE HISTORY';
|
|
17
16
|
|
|
18
|
-
// OpenCode 2 keeps its sessions in other tables of the same file (session_v2,
|
|
19
|
-
// session_message, its event log): the OpenCode 1 list below would delete its
|
|
20
|
-
// messages and events and leave its sessions, which breaks that database. So an
|
|
21
|
-
// OpenCode 2 database is never cleared here.
|
|
22
|
-
export const OPENCODE2_HISTORY_REFUSAL = 'This OpenCode data belongs to OpenCode 2, whose history SynaBun does not clear. Delete OpenCode 2 sessions from OpenCode itself.';
|
|
23
|
-
const isOpencode2Database = (tables) => tables.has('session_v2');
|
|
24
|
-
|
|
25
|
-
const HISTORY_TABLES_CHILD_FIRST = [
|
|
26
|
-
'part',
|
|
27
|
-
'message',
|
|
28
|
-
'todo',
|
|
29
|
-
'session_share',
|
|
30
|
-
'session_input',
|
|
31
|
-
'session_message',
|
|
32
|
-
'session_context_epoch',
|
|
33
|
-
'event',
|
|
34
|
-
'event_sequence',
|
|
35
|
-
'session',
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
const HISTORY_ARTIFACT_PATHS = [
|
|
39
|
-
['snapshot'],
|
|
40
|
-
['repos'],
|
|
41
|
-
['storage', 'session_diff'],
|
|
42
|
-
['tool-output'],
|
|
43
|
-
];
|
|
44
|
-
|
|
45
17
|
function fileBytes(path) {
|
|
46
18
|
try {
|
|
47
19
|
return statSync(path).size || 0;
|
|
@@ -54,25 +26,12 @@ function databaseBytes(dbPath) {
|
|
|
54
26
|
return fileBytes(dbPath) + fileBytes(`${dbPath}-wal`) + fileBytes(`${dbPath}-shm`);
|
|
55
27
|
}
|
|
56
28
|
|
|
57
|
-
function entryBytes(path) {
|
|
58
|
-
let stat;
|
|
59
|
-
try {
|
|
60
|
-
stat = lstatSync(path);
|
|
61
|
-
} catch {
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
if (!stat.isDirectory() || stat.isSymbolicLink()) return stat.size || 0;
|
|
65
|
-
let total = 0;
|
|
66
|
-
for (const name of readdirSync(path)) total += entryBytes(resolve(path, name));
|
|
67
|
-
return total;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
29
|
function assertSafePaths(dbPath, dataRoot) {
|
|
71
30
|
const root = resolve(dataRoot);
|
|
72
31
|
const database = resolve(dbPath);
|
|
73
|
-
if (root === parse(root).root) throw new Error('Refusing to
|
|
32
|
+
if (root === parse(root).root) throw new Error('Refusing to read an unsafe OpenCode data root');
|
|
74
33
|
if (basename(root).toLowerCase() !== 'opencode') {
|
|
75
|
-
throw new Error('Refusing to
|
|
34
|
+
throw new Error('Refusing to read a data root that is not the OpenCode directory');
|
|
76
35
|
}
|
|
77
36
|
if (database !== resolve(root, 'opencode.db')) {
|
|
78
37
|
throw new Error('OpenCode database must be the opencode.db file inside its data root');
|
|
@@ -80,51 +39,19 @@ function assertSafePaths(dbPath, dataRoot) {
|
|
|
80
39
|
return { database, root };
|
|
81
40
|
}
|
|
82
41
|
|
|
83
|
-
|
|
84
|
-
return new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all()
|
|
85
|
-
.map((row) => String(row?.name || '')));
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function countRows(db, table, tables) {
|
|
89
|
-
if (!tables.has(table)) return 0;
|
|
90
|
-
const row = db.prepare(`SELECT COUNT(*) AS count FROM "${table}"`).get();
|
|
91
|
-
return Number(row?.count || 0);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function artifactStats(dataRoot) {
|
|
95
|
-
let bytes = 0;
|
|
96
|
-
let entries = 0;
|
|
97
|
-
for (const segments of HISTORY_ARTIFACT_PATHS) {
|
|
98
|
-
const path = resolve(dataRoot, ...segments);
|
|
99
|
-
if (!existsSync(path)) continue;
|
|
100
|
-
bytes += entryBytes(path);
|
|
101
|
-
entries += 1;
|
|
102
|
-
}
|
|
103
|
-
return { bytes, entries };
|
|
104
|
-
}
|
|
105
|
-
|
|
42
|
+
/** `{ sessions, databaseBytes }`: OpenCode's sessions (session_v2 rows, child sessions included) and its database's size. */
|
|
106
43
|
export function getOpenCodeHistoryStats({ dbPath, dataRoot = dirname(dbPath) }) {
|
|
107
|
-
const { database
|
|
108
|
-
const
|
|
109
|
-
const stats = {
|
|
110
|
-
sessions: 0,
|
|
111
|
-
databaseBytes: databaseBytes(database),
|
|
112
|
-
artifactBytes: artifacts.bytes,
|
|
113
|
-
};
|
|
44
|
+
const { database } = assertSafePaths(dbPath, dataRoot);
|
|
45
|
+
const stats = { sessions: 0, databaseBytes: databaseBytes(database) };
|
|
114
46
|
if (!existsSync(database)) return stats;
|
|
115
|
-
|
|
116
47
|
let db;
|
|
117
48
|
try {
|
|
118
49
|
db = new DatabaseSync(database, { readOnly: true });
|
|
119
50
|
db.exec('PRAGMA busy_timeout = 2000');
|
|
120
|
-
const tables =
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
stats.
|
|
124
|
-
stats.clearable = false;
|
|
125
|
-
stats.reason = OPENCODE2_HISTORY_REFUSAL;
|
|
126
|
-
} else {
|
|
127
|
-
stats.sessions = countRows(db, 'session', tables);
|
|
51
|
+
const tables = new Set(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all().map((row) => String(row?.name || '')));
|
|
52
|
+
if (tables.has('session_v2')) {
|
|
53
|
+
const row = db.prepare('SELECT COUNT(*) AS count FROM "session_v2"').get();
|
|
54
|
+
stats.sessions = Number(row?.count || 0);
|
|
128
55
|
}
|
|
129
56
|
} finally {
|
|
130
57
|
try { db?.close(); } catch {}
|
|
@@ -132,137 +59,40 @@ export function getOpenCodeHistoryStats({ dbPath, dataRoot = dirname(dbPath) })
|
|
|
132
59
|
return stats;
|
|
133
60
|
}
|
|
134
61
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
bytes += entryBytes(target);
|
|
163
|
-
rmSync(target, { recursive: true, force: true });
|
|
164
|
-
files += 1;
|
|
165
|
-
}
|
|
166
|
-
return { files, bytes };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export function clearOpenCodeHistory({ dbPath, dataRoot = dirname(dbPath), vacuum = true }) {
|
|
170
|
-
const { database, root } = assertSafePaths(dbPath, dataRoot);
|
|
171
|
-
const warnings = [];
|
|
172
|
-
const result = {
|
|
173
|
-
sessionsDeleted: 0,
|
|
174
|
-
messagesDeleted: 0,
|
|
175
|
-
partsDeleted: 0,
|
|
176
|
-
databaseBytesBefore: databaseBytes(database),
|
|
177
|
-
databaseBytesAfter: 0,
|
|
178
|
-
artifactEntriesDeleted: 0,
|
|
179
|
-
artifactBytesDeleted: 0,
|
|
180
|
-
vacuumed: false,
|
|
181
|
-
warnings,
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
if (existsSync(database)) {
|
|
185
|
-
let db;
|
|
186
|
-
try {
|
|
187
|
-
db = new DatabaseSync(database);
|
|
188
|
-
db.exec('PRAGMA foreign_keys = ON');
|
|
189
|
-
db.exec('PRAGMA busy_timeout = 10000');
|
|
190
|
-
const tables = tableNames(db);
|
|
191
|
-
if (isOpencode2Database(tables)) throw new Error(OPENCODE2_HISTORY_REFUSAL);
|
|
192
|
-
result.sessionsDeleted = countRows(db, 'session', tables);
|
|
193
|
-
result.messagesDeleted = countRows(db, 'message', tables);
|
|
194
|
-
result.partsDeleted = countRows(db, 'part', tables);
|
|
195
|
-
|
|
196
|
-
db.exec('BEGIN IMMEDIATE');
|
|
197
|
-
try {
|
|
198
|
-
for (const table of HISTORY_TABLES_CHILD_FIRST) {
|
|
199
|
-
if (tables.has(table)) db.exec(`DELETE FROM "${table}"`);
|
|
200
|
-
}
|
|
201
|
-
db.exec('COMMIT');
|
|
202
|
-
} catch (error) {
|
|
203
|
-
try { db.exec('ROLLBACK'); } catch {}
|
|
204
|
-
throw error;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (vacuum) {
|
|
208
|
-
try {
|
|
209
|
-
try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch {}
|
|
210
|
-
db.exec('VACUUM');
|
|
211
|
-
try { db.exec('PRAGMA wal_checkpoint(TRUNCATE)'); } catch {}
|
|
212
|
-
result.vacuumed = true;
|
|
213
|
-
} catch (error) {
|
|
214
|
-
warnings.push(`History was deleted, but database compaction failed: ${error.message}`);
|
|
62
|
+
const errorText = (error) => (typeof error === 'string' ? error : error?.message || error?.data?.message || error?._tag || 'unknown error');
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Delete every OpenCode session through `client` (lib/opencode2-client.js: `session.list` and `session.delete`,
|
|
66
|
+
* answering `{ data, error, response }`): a page of root sessions at a time, newest first, live ones and then
|
|
67
|
+
* archived ones; a root takes its child sessions with it. A session already gone (404) counts as deleted. Stops on
|
|
68
|
+
* a page where nothing could be deleted; what failed is in `failed`. Resolves
|
|
69
|
+
* `{ sessionsDeleted, failed: [{ id, error }], warnings }`; throws when the list itself cannot be read.
|
|
70
|
+
*/
|
|
71
|
+
export async function clearOpenCodeHistory(client, { pageSize = 100, maxPages = 1000 } = {}) {
|
|
72
|
+
const result = { sessionsDeleted: 0, failed: [], warnings: [] };
|
|
73
|
+
const failedIds = new Set();
|
|
74
|
+
for (const archived of [false, true]) {
|
|
75
|
+
for (let page = 0; page < maxPages; page++) {
|
|
76
|
+
const listed = await client.session.list({ roots: true, limit: pageSize, ...(archived ? { archived: true } : {}) });
|
|
77
|
+
if (listed?.error) throw new Error(`OpenCode did not list its sessions: ${errorText(listed.error)}`);
|
|
78
|
+
const ids = (Array.isArray(listed?.data) ? listed.data : []).map((session) => session?.id).filter((id) => id && !failedIds.has(id));
|
|
79
|
+
if (!ids.length) break;
|
|
80
|
+
let deleted = 0;
|
|
81
|
+
for (const id of ids) {
|
|
82
|
+
const removed = await client.session.delete({ sessionID: id });
|
|
83
|
+
if (removed?.error && Number(removed.response?.status) !== 404) {
|
|
84
|
+
failedIds.add(id);
|
|
85
|
+
result.failed.push({ id, error: errorText(removed.error) });
|
|
86
|
+
} else {
|
|
87
|
+
result.sessionsDeleted += 1;
|
|
88
|
+
deleted += 1;
|
|
215
89
|
}
|
|
216
90
|
}
|
|
217
|
-
|
|
218
|
-
try { db?.close(); } catch {}
|
|
91
|
+
if (!deleted) break;
|
|
219
92
|
}
|
|
220
93
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const artifactPath = resolve(root, ...segments);
|
|
224
|
-
if (artifactPath !== root && !artifactPath.startsWith(`${root}${sep}`)) {
|
|
225
|
-
throw new Error(`Refusing to clear unsafe artifact path: ${artifactPath}`);
|
|
226
|
-
}
|
|
227
|
-
try {
|
|
228
|
-
const cleared = clearArtifactDirectory(artifactPath, warnings);
|
|
229
|
-
result.artifactEntriesDeleted += cleared.files;
|
|
230
|
-
result.artifactBytesDeleted += cleared.bytes;
|
|
231
|
-
} catch (error) {
|
|
232
|
-
warnings.push(`Could not clear ${artifactPath}: ${error.message}`);
|
|
233
|
-
}
|
|
94
|
+
if (result.failed.length) {
|
|
95
|
+
result.warnings.push(`${result.failed.length} OpenCode session(s) could not be deleted (${result.failed[0].error}).`);
|
|
234
96
|
}
|
|
235
|
-
|
|
236
|
-
result.databaseBytesAfter = databaseBytes(database);
|
|
237
97
|
return result;
|
|
238
98
|
}
|
|
239
|
-
|
|
240
|
-
export function clearOpenCodeHistoryInWorker(options) {
|
|
241
|
-
return new Promise((resolvePromise, rejectPromise) => {
|
|
242
|
-
const worker = new Worker(new URL(import.meta.url), {
|
|
243
|
-
workerData: { operation: 'clear-opencode-history', options },
|
|
244
|
-
});
|
|
245
|
-
let settled = false;
|
|
246
|
-
worker.once('message', (message) => {
|
|
247
|
-
settled = true;
|
|
248
|
-
if (message?.ok) resolvePromise(message.result);
|
|
249
|
-
else rejectPromise(new Error(message?.error || 'OpenCode history worker failed'));
|
|
250
|
-
});
|
|
251
|
-
worker.once('error', (error) => {
|
|
252
|
-
settled = true;
|
|
253
|
-
rejectPromise(error);
|
|
254
|
-
});
|
|
255
|
-
worker.once('exit', (code) => {
|
|
256
|
-
if (!settled && code !== 0) rejectPromise(new Error(`OpenCode history worker exited with code ${code}`));
|
|
257
|
-
else if (!settled) rejectPromise(new Error('OpenCode history worker exited before returning a result'));
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (!isMainThread && workerData?.operation === 'clear-opencode-history') {
|
|
263
|
-
try {
|
|
264
|
-
parentPort?.postMessage({ ok: true, result: clearOpenCodeHistory(workerData.options) });
|
|
265
|
-
} catch (error) {
|
|
266
|
-
parentPort?.postMessage({ ok: false, error: error?.message || String(error) });
|
|
267
|
-
}
|
|
268
|
-
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// OpenCode connects MCP in the background, then debounces tool registration by 100 ms.
|
|
2
|
+
// A connected status alone is too early for either direct tools or the Code Mode catalog.
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import { mcpServersOf, opencodeConfigFilePath, readOpencodeConfigDocument } from './opencode-config.js';
|
|
5
|
+
import { mcpStatusRouteAvailability } from './assistant-route-gate.js';
|
|
6
|
+
|
|
7
|
+
export const OPENCODE_MCP_READY_TIMEOUT_MS = 35_000;
|
|
8
|
+
export const OPENCODE_MCP_SETTLE_MS = 750;
|
|
9
|
+
export const OPENCODE_MCP_LIST_GRACE_MS = 3_000;
|
|
10
|
+
const states = new WeakMap();
|
|
11
|
+
const knob = (value, fallback) => Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
12
|
+
|
|
13
|
+
export function synabunMcpState(servers) {
|
|
14
|
+
const verdict = mcpStatusRouteAvailability(servers);
|
|
15
|
+
if (verdict?.available) return 'connected';
|
|
16
|
+
if (verdict) return 'down';
|
|
17
|
+
const names = Array.isArray(servers) ? servers.map((server) => server?.name) : Object.keys(servers || {});
|
|
18
|
+
return names.some((name) => String(name || '').toLowerCase() === 'synabun') ? 'starting' : 'missing';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function synabunConfigured(xdgRoot) {
|
|
22
|
+
try {
|
|
23
|
+
const doc = readOpencodeConfigDocument(opencodeConfigFilePath(resolve(xdgRoot, 'opencode')));
|
|
24
|
+
if (!doc.exists || doc.error) return false;
|
|
25
|
+
const entry = Object.entries(mcpServersOf(doc.config)).find(([name]) => name.toLowerCase() === 'synabun')?.[1];
|
|
26
|
+
return !!entry && entry.disabled !== true;
|
|
27
|
+
} catch { return false; }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function stateFor(client, directory) {
|
|
31
|
+
let directories = states.get(client);
|
|
32
|
+
if (!directories) { directories = new Map(); states.set(client, directories); }
|
|
33
|
+
const key = directory || '';
|
|
34
|
+
if (!directories.has(key)) directories.set(key, { readyAt: Date.now(), seenAt: null, gaveUp: false });
|
|
35
|
+
return directories.get(key);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Reconnects invalidate only this client's directory; the reconnect and next prompt share the same settle. */
|
|
39
|
+
export function invalidateSynabunTools(client, directory) {
|
|
40
|
+
Object.assign(stateFor(client, directory), { readyAt: Date.now(), seenAt: null, gaveUp: false });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Bound even a hung status request; an AbortSignal wakes both a request and a settle immediately.
|
|
44
|
+
async function interruptible(promise, ms, signal) {
|
|
45
|
+
let timer, abort;
|
|
46
|
+
try {
|
|
47
|
+
return await Promise.race([
|
|
48
|
+
Promise.resolve(promise).then((value) => ({ value }), () => ({ failed: true })),
|
|
49
|
+
new Promise((done) => {
|
|
50
|
+
timer = setTimeout(() => done({ timedOut: true }), Math.max(0, ms));
|
|
51
|
+
abort = () => done({ aborted: true });
|
|
52
|
+
if (signal?.aborted) abort();
|
|
53
|
+
else signal?.addEventListener('abort', abort, { once: true });
|
|
54
|
+
}),
|
|
55
|
+
]);
|
|
56
|
+
} finally { clearTimeout(timer); signal?.removeEventListener('abort', abort); }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** false means Stop/dispose: the caller must send no prompt. Cached per serve client + directory. */
|
|
60
|
+
export async function waitForSynabunTools(client, {
|
|
61
|
+
directory, expected = true, signal, stopped = () => false, onStatus = null, onTimeout = () => {},
|
|
62
|
+
readyTimeoutMs, settleMs, listGraceMs, pollMs,
|
|
63
|
+
} = {}) {
|
|
64
|
+
const cancelled = () => signal?.aborted || stopped();
|
|
65
|
+
if (cancelled()) return false;
|
|
66
|
+
if (!expected && !onStatus) return !cancelled();
|
|
67
|
+
if (typeof client?.mcp?.status !== 'function') return !cancelled();
|
|
68
|
+
const state = stateFor(client, directory);
|
|
69
|
+
const cap = knob(readyTimeoutMs, OPENCODE_MCP_READY_TIMEOUT_MS);
|
|
70
|
+
const settle = knob(settleMs, OPENCODE_MCP_SETTLE_MS);
|
|
71
|
+
const grace = knob(listGraceMs, OPENCODE_MCP_LIST_GRACE_MS);
|
|
72
|
+
const poll = Math.max(1, knob(pollMs, 100));
|
|
73
|
+
const deadline = Date.now() + cap;
|
|
74
|
+
const expired = () => {
|
|
75
|
+
if (!state.gaveUp) { state.gaveUp = true; onTimeout(cap); }
|
|
76
|
+
return !cancelled();
|
|
77
|
+
};
|
|
78
|
+
for (;;) {
|
|
79
|
+
const statusBudget = state.gaveUp || !expected ? poll : Math.max(1, deadline - Date.now());
|
|
80
|
+
const response = await interruptible(Promise.resolve().then(() => client.mcp.status({ directory })), statusBudget, signal);
|
|
81
|
+
if (cancelled() || response.aborted) return false;
|
|
82
|
+
if (response.timedOut) return expected ? expired() : true;
|
|
83
|
+
if (response.failed || response.value?.error || Number(response.value?.status) >= 400) return true;
|
|
84
|
+
const servers = response.value?.data || response.value || [];
|
|
85
|
+
if (!expected) { onStatus?.(servers); return !cancelled(); }
|
|
86
|
+
const status = synabunMcpState(servers);
|
|
87
|
+
const now = Date.now();
|
|
88
|
+
let pause = poll;
|
|
89
|
+
if (status === 'connected') {
|
|
90
|
+
state.seenAt ??= now;
|
|
91
|
+
const left = state.seenAt + settle - now;
|
|
92
|
+
if (left <= 0) { state.gaveUp = false; onStatus?.(servers); return !cancelled(); }
|
|
93
|
+
// Recovering after a previous cap still settles once; it never repeats the startup bound.
|
|
94
|
+
pause = Math.min(poll, left);
|
|
95
|
+
} else {
|
|
96
|
+
state.seenAt = null;
|
|
97
|
+
if (status === 'down' || (status === 'missing' && now - state.readyAt >= grace)) { onStatus?.(servers); return !cancelled(); }
|
|
98
|
+
if (state.gaveUp) { onStatus?.(servers); return true; }
|
|
99
|
+
}
|
|
100
|
+
if (now >= deadline) { onStatus?.(servers); return expired(); }
|
|
101
|
+
await interruptible(new Promise(() => {}), Math.min(pause, deadline - now), signal);
|
|
102
|
+
if (cancelled()) return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function synabunToolsTimeoutText(ms, surface = 'session') {
|
|
107
|
+
return `SynaBun's tools are not ready in this OpenCode ${surface}: its SynaBun MCP server has not connected after ${Math.round(ms / 1000)} s, so this turn goes out without them${surface === 'brain' ? ' (no routing or memory)' : ''}. Check Settings → OpenCode or recreate this ${surface}.`;
|
|
108
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Native page WebSockets are safe only behind a server boundary established at
|
|
2
|
+
// listen time. This is a capability allowlist, not a generic OpenCode version
|
|
3
|
+
// check: 2.1.4's HTTP/upgrade authentication and stdout password path were
|
|
4
|
+
// inspected and tested. Unknown binaries/command wrappers keep the old guard.
|
|
5
|
+
export function nativeServeCapability({ version, commandLine = false, passwordFrom } = {}) {
|
|
6
|
+
return !commandLine && passwordFrom === 'stdout' && /^(?:opencode\s+)?v?2\.1\.4$/.test(String(version || '').trim());
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createNativeServeBoundary() {
|
|
10
|
+
const processes = new Map();
|
|
11
|
+
const contexts = new Map();
|
|
12
|
+
const error = () => new Error('Native browser WebSockets require authenticated OpenCode 2.1.4 serves with private stdout credentials; wait for startup, stop unverified serves or use the verified executable path.');
|
|
13
|
+
return {
|
|
14
|
+
assertLaunch(safe) { if (!safe && contexts.size) throw error(); },
|
|
15
|
+
track(proc, { port, safe = false }) {
|
|
16
|
+
if (!proc || proc.exitCode != null || proc.signalCode != null) return;
|
|
17
|
+
processes.set(proc, { port: Number(port), safe, ready: false });
|
|
18
|
+
const release = () => processes.delete(proc);
|
|
19
|
+
proc.once('exit', release);
|
|
20
|
+
proc.once('error', () => { if (!proc.pid) release(); });
|
|
21
|
+
},
|
|
22
|
+
ready(proc) { const entry = processes.get(proc); if (entry) entry.ready = true; },
|
|
23
|
+
protect(context, { ports, unverifiedRecords = [] }) {
|
|
24
|
+
if (contexts.has(context)) return contexts.get(context);
|
|
25
|
+
const verified = new Set();
|
|
26
|
+
for (const { port, safe, ready } of processes.values()) {
|
|
27
|
+
if (!safe || !ready) throw error();
|
|
28
|
+
verified.add(port);
|
|
29
|
+
}
|
|
30
|
+
if ([...ports].some(port => !verified.has(Number(port))) || unverifiedRecords.length) throw error();
|
|
31
|
+
const browser = context.browser();
|
|
32
|
+
const release = () => {
|
|
33
|
+
if (contexts.get(context) !== release) return;
|
|
34
|
+
contexts.delete(context);
|
|
35
|
+
context.removeListener('close', release);
|
|
36
|
+
browser.removeListener('disconnected', release);
|
|
37
|
+
};
|
|
38
|
+
contexts.set(context, release);
|
|
39
|
+
context.once('close', release);
|
|
40
|
+
browser.once('disconnected', release);
|
|
41
|
+
return release;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|