synabun 2.0.10 → 2.2.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 +207 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +13 -13
- 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 +30 -17
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +7 -6
- 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 +302 -0
- package/lib/virustotal.mjs +203 -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/budget-judgments.d.ts +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
- package/mcp-server/dist/services/budget-judgments.js +5 -3
- package/mcp-server/dist/services/budget-judgments.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/identity.d.ts +2 -2
- package/mcp-server/dist/services/identity.js +2 -2
- 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/memory-sessions.d.ts +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-sessions.js +28 -2
- package/mcp-server/dist/services/memory-sessions.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +18 -11
- 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 +22 -63
- 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/typesafe-config.js +1 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- 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 +14 -14
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +29 -19
- 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/choice.d.ts +6 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -1
- package/mcp-server/dist/tools/choice.js +18 -13
- package/mcp-server/dist/tools/choice.js.map +1 -1
- package/mcp-server/dist/tools/git-tools.js +2 -2
- package/mcp-server/dist/tools/git-tools.js.map +1 -1
- 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/morelogin.d.ts.map +1 -1
- package/mcp-server/dist/tools/morelogin.js +9 -6
- package/mcp-server/dist/tools/morelogin.js.map +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 +642 -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/budget-judgments.ts +5 -3
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/identity.ts +2 -2
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/memory-sessions.ts +24 -3
- package/mcp-server/src/services/neural-interface.ts +81 -21
- package/mcp-server/src/services/server-instructions.ts +29 -64
- 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/typesafe-config.ts +1 -1
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +29 -20
- package/mcp-server/src/tools/choice.ts +17 -12
- package/mcp-server/src/tools/git-tools.ts +2 -2
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/morelogin.ts +6 -4
- package/mcp-server/src/tools/skill-tools.ts +592 -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 +3953 -228
- package/neural-interface/i18n/pt-BR.json +3901 -179
- package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
- package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
- package/neural-interface/lib/antigravity/acp-connection.js +299 -0
- package/neural-interface/lib/antigravity/bypass.js +100 -0
- package/neural-interface/lib/antigravity/catalog.js +273 -0
- package/neural-interface/lib/antigravity/home.js +260 -0
- package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
- package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
- package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
- package/neural-interface/lib/antigravity/policy.js +74 -0
- package/neural-interface/lib/antigravity/tool-call.js +178 -0
- package/neural-interface/lib/antigravity/transcripts.js +252 -0
- package/neural-interface/lib/antigravity/usage.js +43 -0
- package/neural-interface/lib/assistant-api.js +128 -28
- package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
- 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-budget-planner.js +7 -3
- package/neural-interface/lib/assistant-budget-split.js +42 -15
- package/neural-interface/lib/assistant-catalog.js +81 -15
- package/neural-interface/lib/assistant-config.js +6 -3
- package/neural-interface/lib/assistant-dispatch.js +1073 -200
- package/neural-interface/lib/assistant-envelope.js +156 -2
- package/neural-interface/lib/assistant-evidence.js +80 -0
- package/neural-interface/lib/assistant-hidden-models.js +7 -5
- package/neural-interface/lib/assistant-persona.js +93 -19
- package/neural-interface/lib/assistant-plan-permissions.js +25 -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 +245 -38
- package/neural-interface/lib/assistant-runtime.js +214 -30
- package/neural-interface/lib/assistant-task-prompt.js +87 -21
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/assistant-usage.js +29 -0
- package/neural-interface/lib/backup-service.js +626 -4
- 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 +84 -0
- package/neural-interface/lib/browser-network-guard.js +476 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +198 -38
- package/neural-interface/lib/claude-agent-bridge.js +11 -2
- package/neural-interface/lib/claude-history-cache.js +210 -0
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +5 -1
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install-api.js +1 -1
- package/neural-interface/lib/cli-install.js +163 -154
- package/neural-interface/lib/cli-resolver.js +13 -3
- package/neural-interface/lib/cli-update-planner.js +52 -41
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-rollout-reader.js +52 -0
- package/neural-interface/lib/codex-worker-app-server.js +191 -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/editor-git-api.js +3 -20
- package/neural-interface/lib/exec-loop-command.js +13 -10
- package/neural-interface/lib/file-explorer-api.js +74 -40
- package/neural-interface/lib/file-explorer-watch.js +9 -3
- package/neural-interface/lib/git-bash/install.js +52 -6
- package/neural-interface/lib/git-bash/manager.js +59 -17
- package/neural-interface/lib/git-bash/pins.js +12 -0
- package/neural-interface/lib/git-read.js +2 -2
- package/neural-interface/lib/git-status-runner.js +390 -0
- package/neural-interface/lib/git-status-watchdog.js +40 -0
- package/neural-interface/lib/greeting/budgets.js +1 -0
- package/neural-interface/lib/greeting/engine.js +2 -2
- package/neural-interface/lib/greeting/sources.js +10 -12
- package/neural-interface/lib/greeting/writer.js +1 -1
- 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 +35 -33
- package/neural-interface/lib/mcp-external-servers.js +332 -0
- package/neural-interface/lib/mcp-installer.js +2 -1
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/memory-session-capture.js +17 -3
- package/neural-interface/lib/morelogin.js +177 -25
- package/neural-interface/lib/native-loop-providers.js +965 -66
- package/neural-interface/lib/native-loop-runtime.js +290 -42
- 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 +53 -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/path-confine.js +12 -9
- package/neural-interface/lib/peer-identity.js +793 -0
- package/neural-interface/lib/pty-host/core.js +28 -1
- package/neural-interface/lib/pty-host/lifetime.js +12 -0
- package/neural-interface/lib/pty-host/manager.js +12 -1
- package/neural-interface/lib/remote-policy.js +1 -1
- package/neural-interface/lib/request-gate.js +20 -2
- package/neural-interface/lib/rulesets/api.js +7 -6
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +180 -36
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/rulesets/render.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +81 -31
- 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 +298 -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 +285 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +569 -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 +216 -0
- package/neural-interface/lib/skills/eval-confinement.js +399 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +135 -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 +203 -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 +441 -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 +269 -0
- package/neural-interface/lib/skills/runtime-checks.js +358 -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 +530 -0
- package/neural-interface/lib/skills/telemetry.js +119 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/synabun-version.js +1 -1
- package/neural-interface/lib/system-activity.js +1 -1
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/brain.js +7 -3
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/whatsapp/cards.js +22 -9
- package/neural-interface/lib/whatsapp/config.js +1 -1
- package/neural-interface/lib/worker-confinement.js +1268 -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-question.js +74 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +238 -0
- package/neural-interface/lib/worker-sandbox.js +329 -0
- package/neural-interface/package-lock.json +34 -12
- package/neural-interface/package.json +3 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +3 -3
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +125 -31
- package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
- package/neural-interface/public/shared/agy/agy-client.js +266 -0
- package/neural-interface/public/shared/agy/agy-commands.js +120 -0
- package/neural-interface/public/shared/agy/agy-copy.js +326 -0
- package/neural-interface/public/shared/agy/agy-diff.js +161 -0
- package/neural-interface/public/shared/agy/agy-events.js +469 -0
- package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
- package/neural-interface/public/shared/agy/agy-options.js +232 -0
- package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
- package/neural-interface/public/shared/agy/agy-render.js +392 -0
- package/neural-interface/public/shared/agy/agy-setup.js +149 -0
- package/neural-interface/public/shared/agy/agy-styles.js +604 -0
- package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
- 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 +36 -6
- package/neural-interface/public/shared/assistant/asst-api.js +1 -1
- 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 +105 -44
- package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
- package/neural-interface/public/shared/assistant/asst-control.js +205 -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-hosts.js +16 -7
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -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 +151 -19
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +445 -82
- package/neural-interface/public/shared/assistant/asst-route.js +304 -53
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
- package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
- package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
- package/neural-interface/public/shared/assistant/asst-state.js +87 -24
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
- package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
- 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 +34 -10
- package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
- package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
- package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
- package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-controller.js +218 -0
- package/neural-interface/public/shared/cli-install-view.js +11 -12
- package/neural-interface/public/shared/cli-status.js +11 -10
- package/neural-interface/public/shared/constants.js +5 -4
- 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 +367 -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/cp/cp-restore.js +162 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-bridge.js +17 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
- package/neural-interface/public/shared/desktop-titlebar.js +13 -4
- package/neural-interface/public/shared/desktop-update-view.js +21 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/explorer/fx-api.js +4 -4
- package/neural-interface/public/shared/explorer/fx-links.js +3 -3
- package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
- package/neural-interface/public/shared/explorer/fx-main.js +48 -16
- package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
- package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
- package/neural-interface/public/shared/html-shell.js +30 -15
- 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 +74 -259
- 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-rehydrate.js +13 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
- 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 +17 -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 +60 -50
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/provider-icons.js +4 -2
- 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-rules.js +2 -2
- 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/showcase-privacy.js +6 -1
- package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +222 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +133 -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 +149 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +513 -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 +237 -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 +230 -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-fixes-view.js +359 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -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 +282 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +690 -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 +249 -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 +426 -0
- package/neural-interface/public/shared/state.js +1 -1
- package/neural-interface/public/shared/streaming-markdown.js +58 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1822 -1756
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/text-cache.js +29 -0
- 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/topright-overflow-logic.js +54 -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-antigravity-panel.js +19 -0
- package/neural-interface/public/shared/ui-assistant.js +2 -0
- package/neural-interface/public/shared/ui-automation-studio.js +111 -140
- package/neural-interface/public/shared/ui-claude-panel.js +376 -82
- package/neural-interface/public/shared/ui-cli-banner.js +23 -167
- 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-file-explorer.js +48 -6
- package/neural-interface/public/shared/ui-file-links.js +2 -2
- package/neural-interface/public/shared/ui-games.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-judgments.js +1 -1
- package/neural-interface/public/shared/ui-keybinds.js +33 -2
- package/neural-interface/public/shared/ui-link.js +3 -3
- package/neural-interface/public/shared/ui-menubar.js +10 -20
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
- package/neural-interface/public/shared/ui-navbar.js +49 -24
- package/neural-interface/public/shared/ui-notifications.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-resume.js +9 -7
- package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
- package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
- package/neural-interface/public/shared/ui-sessions.js +27 -15
- package/neural-interface/public/shared/ui-settings.js +683 -526
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
- package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
- 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 +270 -190
- package/neural-interface/public/shared/ui-tool-updates.js +6 -4
- package/neural-interface/public/shared/ui-tooltip.js +81 -51
- package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
- 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 +312 -59
- package/neural-interface/public/shared/ui-worker-end.js +5 -1
- 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 +3 -3
- 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-questions.js +34 -0
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +2 -2
- 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 +4553 -2855
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +34 -12
- package/package.json +17 -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 +6 -6
- 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
- /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — /api/system/crash-notice: the notice after an automatic restart
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// GET /api/system/crash-notice { ok, notice } null, or the crash the supervisor recovered from
|
|
6
|
+
// POST /api/system/crash-notice/dismiss { id } { ok, notice }: what is left (a newer crash's, or null)
|
|
7
|
+
//
|
|
8
|
+
// When the server crashes after it was up, its supervisor (lib/server-supervisor.js at the package root) starts
|
|
9
|
+
// it again and leaves DATA_HOME/data/server-crash.json (lib/server-crash-record.js) for it. The owner's pages ask
|
|
10
|
+
// for it when they load and every time their sync socket connects (a page that was open through the crash
|
|
11
|
+
// reconnects, it is not reloaded: public/shared/ui-crash-notice.js), and show it until the owner dismisses it. A
|
|
12
|
+
// dismissal removes the record, and every open tab and window drops the notice at once (`crash-notice:changed`
|
|
13
|
+
// on the sync socket); none shows it again after a reload. The next crash writes a new record, with a new id,
|
|
14
|
+
// which shows again. A record that cannot be removed (a read-only data folder) is kept dismissed in memory for
|
|
15
|
+
// the life of this server.
|
|
16
|
+
//
|
|
17
|
+
// The owner's only: /api/system is admin-only (lib/request-gate.js), and every route takes the owner's guard by
|
|
18
|
+
// itself (lib/http-guards.js ownerRouteGuard: this server's Host, its Origin on the write, no guest, no cross-site
|
|
19
|
+
// write) and refuses an agent's request (uiOnly: X-SynaBun-Terminal, -Role, -Assistant, -Desktop-Grant, as
|
|
20
|
+
// /api/system/app does). The dismissal is the owner's write from SynaBun's own page: X-SynaBun-UI: 1, a JSON body,
|
|
21
|
+
// and this boot's page secret (lib/page-session.js, as Skills Studio's owner writes), which a local process that
|
|
22
|
+
// merely leaves the agent headers out lacks; a tab that stayed open through the restart carries the previous boot's
|
|
23
|
+
// cookie, and the page's own recovery (public/shared/page-session.js) gets this boot's and sends the dismissal once
|
|
24
|
+
// more. A request names an id, never a path.
|
|
25
|
+
|
|
26
|
+
import { Router } from 'express';
|
|
27
|
+
import { clearCrashRecord, readCrashRecord } from '../../lib/server-crash-record.js';
|
|
28
|
+
import { sendGuardError, uiOnly } from './http-guards.js';
|
|
29
|
+
|
|
30
|
+
const ID = /^[0-9a-f]{16}$/;
|
|
31
|
+
|
|
32
|
+
/** What a page is shown of a record (already checked field by field when it was read), or null. */
|
|
33
|
+
export function crashNoticeOf(record) {
|
|
34
|
+
if (!record || typeof record !== 'object') return null;
|
|
35
|
+
const { v, ...notice } = record;
|
|
36
|
+
return notice;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {object} deps
|
|
41
|
+
* @param {string} deps.dataHome
|
|
42
|
+
* @param {import('express').RequestHandler} deps.guard the owner's guard (lib/http-guards.js ownerRouteGuard)
|
|
43
|
+
* @param {{ verify(req): boolean, require: import('express').RequestHandler }} [deps.pageSession] lib/page-session.js:
|
|
44
|
+
* the page secret a dismissal carries (server.js hands it in; without one, as in a unit test, none is asked)
|
|
45
|
+
* @param {(message: object) => void} [deps.broadcast] the owner's open pages (server.js broadcastSync keeps
|
|
46
|
+
* `crash-notice:` from invite guests)
|
|
47
|
+
* @param {() => Promise<{ tunnel?: 'unknown' }>} [deps.leftovers] what the crashed server may have left running that
|
|
48
|
+
* this one could not end (server.js: its cloudflared, sweepLeftoverTunnels): added to the notice
|
|
49
|
+
*/
|
|
50
|
+
export function createCrashNoticeApi({
|
|
51
|
+
dataHome, guard, pageSession = null, broadcast = () => {}, log = () => {}, read = readCrashRecord, clear = clearCrashRecord,
|
|
52
|
+
leftovers = async () => ({}),
|
|
53
|
+
} = {}) {
|
|
54
|
+
if (!dataHome || typeof guard !== 'function') throw new Error('createCrashNoticeApi needs the data home and the owner\'s guard');
|
|
55
|
+
const router = Router();
|
|
56
|
+
// Dismissed while the record could not be removed: never shown again by this server.
|
|
57
|
+
const dismissed = new Set();
|
|
58
|
+
const current = () => {
|
|
59
|
+
const notice = crashNoticeOf(read(dataHome));
|
|
60
|
+
return notice && !dismissed.has(notice.id) ? notice : null;
|
|
61
|
+
};
|
|
62
|
+
// The notice as a page is shown it: the record, and what the crashed server may have left open.
|
|
63
|
+
const shown = async (notice) => {
|
|
64
|
+
if (!notice) return null;
|
|
65
|
+
let left = {};
|
|
66
|
+
try { left = await leftovers(); } catch { left = {}; }
|
|
67
|
+
return { ...notice, ...(left?.tunnel === 'unknown' ? { tunnel: 'unknown' } : {}) };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
router.use(guard, uiOnly, (req, res, next) => { res.set('Cache-Control', 'no-store'); next(); });
|
|
71
|
+
|
|
72
|
+
router.get('/', async (req, res) => { res.json({ ok: true, notice: await shown(current()) }); });
|
|
73
|
+
|
|
74
|
+
router.post('/dismiss', (req, res, next) => {
|
|
75
|
+
if (req.get('x-synabun-ui') !== '1') return sendGuardError(res, 403, 'UI_HEADER_REQUIRED', 'A notice is dismissed from SynaBun\'s own page.');
|
|
76
|
+
// The page secret: what a local process that merely sends the page's headers lacks.
|
|
77
|
+
if (pageSession && !pageSession.verify(req)) return pageSession.require(req, res, next);
|
|
78
|
+
next();
|
|
79
|
+
}, async (req, res) => {
|
|
80
|
+
if (!req.is('application/json')) return res.status(415).json({ ok: false, code: 'JSON_REQUIRED', error: 'Send JSON.' });
|
|
81
|
+
const id = req.body?.id;
|
|
82
|
+
if (typeof id !== 'string' || !ID.test(id)) return res.status(400).json({ ok: false, code: 'BAD_REQUEST', error: 'Send { id } of the notice.' });
|
|
83
|
+
if (!clear(dataHome, { id })) {
|
|
84
|
+
const still = crashNoticeOf(read(dataHome));
|
|
85
|
+
if (still?.id === id) {
|
|
86
|
+
dismissed.add(id);
|
|
87
|
+
log(`[crash-notice] the record could not be removed; ${id} stays dismissed until the server restarts`);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
log(`[crash-notice] dismissed ${id}`);
|
|
91
|
+
}
|
|
92
|
+
const notice = await shown(current());
|
|
93
|
+
try { broadcast({ type: 'crash-notice:changed', notice }); } catch {}
|
|
94
|
+
res.json({ ok: true, notice });
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
return router;
|
|
98
|
+
}
|
|
@@ -4,20 +4,18 @@
|
|
|
4
4
|
// input tokens before a line of code, and every request would show up as a
|
|
5
5
|
// session in the OpenCode panel. So completions get a serve of their own:
|
|
6
6
|
//
|
|
7
|
-
// - its own XDG_CONFIG_HOME (DATA_HOME/data/editor-complete/) whose
|
|
8
|
-
// holds what makes the user's models reachable (their
|
|
9
|
-
// the provider allow / deny
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
7
|
+
// - its own XDG_CONFIG_HOME (DATA_HOME/data/editor-complete/) whose
|
|
8
|
+
// opencode.json holds what makes the user's models reachable (their
|
|
9
|
+
// provider blocks and the provider allow / deny rules, as the user wrote
|
|
10
|
+
// them) and one agent, `synabun-complete`: the completion instruction as
|
|
11
|
+
// its system prompt, every tool denied. No MCP servers, no instruction
|
|
12
|
+
// files, no plugins. A provider block that names a file by a path relative
|
|
13
|
+
// to the user's configuration ({file:./key}) is written with that path
|
|
14
|
+
// made whole: here it would be looked for in this folder;
|
|
14
15
|
// - OPENCODE_DISABLE_CLAUDE_CODE and OPENCODE_DISABLE_PROJECT_CONFIG, so no
|
|
15
16
|
// CLAUDE.md, AGENTS.md or opencode.json of a folder above is read either;
|
|
16
17
|
// - the user's own data home, so stored provider credentials keep working.
|
|
17
18
|
//
|
|
18
|
-
// Measured on OpenCode 1.18.34 (2026-10-12): about 200 input tokens of overhead
|
|
19
|
-
// per request against 5,500 with the tools left on, and 810 with an AGENTS.md
|
|
20
|
-
// one folder up and project configuration left on.
|
|
21
19
|
//
|
|
22
20
|
// Started on the first request, stopped after ten idle minutes and at server
|
|
23
21
|
// shutdown. One request is one session in an empty working folder: create,
|
|
@@ -35,13 +33,12 @@
|
|
|
35
33
|
|
|
36
34
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
37
35
|
import { isAbsolute, join, resolve, sep } from 'node:path';
|
|
38
|
-
import { checkOpencodeServer, newServePassword } from './opencode-protocol.js';
|
|
36
|
+
import { checkOpencodeServer, newServePassword, servePasswordReader } from './opencode-protocol.js';
|
|
37
|
+
import { OPENCODE_CONFIG_FILE, OPENCODE_CONFIG_SCHEMA } from './opencode-config.js';
|
|
39
38
|
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
// 1 file below, which OpenCode 2 reads (agent → agents, prompt → system,
|
|
44
|
-
// temperature → request body).
|
|
39
|
+
// The serve gets a password of its own, is healthy only when OpenCode 2's /api
|
|
40
|
+
// answers JSON (lib/opencode-protocol.js), and is spoken to through
|
|
41
|
+
// lib/opencode2-client.js; its configuration is OpenCode 2's opencode.json.
|
|
45
42
|
|
|
46
43
|
export const COMPLETION_AGENT = 'synabun-complete';
|
|
47
44
|
/** Every session of this serve carries this title: no title is generated, and leftovers of a crash are recognisable. */
|
|
@@ -53,8 +50,10 @@ export const SWEEP_TIMEOUT_MS = 5000;
|
|
|
53
50
|
/** How many ports a start tries when another server takes the one it was given. */
|
|
54
51
|
export const START_ATTEMPTS = 3;
|
|
55
52
|
|
|
56
|
-
// What of the user's OpenCode configuration decides which models can be reached
|
|
57
|
-
|
|
53
|
+
// What of the user's OpenCode configuration decides which models can be reached: the provider blocks and the
|
|
54
|
+
// provider allow / deny rules, in either shape the user wrote them (OpenCode 2 reads both).
|
|
55
|
+
const PROVIDER_KEYS = ['providers', 'provider'];
|
|
56
|
+
const CARRIED_LISTS = ['policies', 'disabled_providers', 'enabled_providers'];
|
|
58
57
|
// Reasoning settings a model may offer, the lightest first: a completion wants the least.
|
|
59
58
|
const LIGHT_VARIANTS = ['none', 'minimal', 'low'];
|
|
60
59
|
|
|
@@ -87,18 +86,21 @@ function rebaseFileReferences(value, dir, seen) {
|
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
/**
|
|
90
|
-
* The configuration of the dedicated serve.
|
|
91
|
-
* @param {object | null} userConfig the user's own OpenCode configuration (
|
|
89
|
+
* The configuration of the dedicated serve (its opencode.json).
|
|
90
|
+
* @param {object | null} userConfig the user's own OpenCode configuration (opencode.json, then opencode.jsonc over it)
|
|
92
91
|
* @param {{ system: string, configDir?: string | null, log?: (tag: string, message: string) => void }} o `system`:
|
|
93
92
|
* the completion instruction, the agent's whole prompt; `configDir`: the folder the user's configuration is in,
|
|
94
93
|
* which a relative {file:…} reference of a provider is resolved against. Without it, a provider that holds such
|
|
95
94
|
* a reference is left out (and logged): from the serve's own folder it would name another file, or none.
|
|
96
95
|
*/
|
|
97
96
|
export function buildCompletionServeConfig(userConfig, { system, configDir = null, log = () => {} }) {
|
|
98
|
-
const config = { $schema:
|
|
99
|
-
for (const key of
|
|
97
|
+
const config = { $schema: OPENCODE_CONFIG_SCHEMA, update: 'disable', share: 'disabled', snapshots: false };
|
|
98
|
+
for (const key of CARRIED_LISTS) {
|
|
99
|
+
const value = isObject(userConfig) ? userConfig[key] : undefined;
|
|
100
|
+
if (Array.isArray(value)) config[key] = structuredClone(value);
|
|
101
|
+
}
|
|
102
|
+
for (const key of PROVIDER_KEYS) {
|
|
100
103
|
const value = isObject(userConfig) ? userConfig[key] : undefined;
|
|
101
|
-
if (key !== 'provider') { if (Array.isArray(value)) config[key] = structuredClone(value); continue; }
|
|
102
104
|
if (!isObject(value)) continue;
|
|
103
105
|
const providers = {};
|
|
104
106
|
for (const [id, definition] of Object.entries(value)) {
|
|
@@ -110,15 +112,15 @@ export function buildCompletionServeConfig(userConfig, { system, configDir = nul
|
|
|
110
112
|
}
|
|
111
113
|
providers[id] = carried;
|
|
112
114
|
}
|
|
113
|
-
if (Object.keys(providers).length || !Object.keys(value).length) config
|
|
115
|
+
if (Object.keys(providers).length || !Object.keys(value).length) config[key] = providers;
|
|
114
116
|
}
|
|
115
|
-
config.
|
|
117
|
+
config.agents = {
|
|
116
118
|
[COMPLETION_AGENT]: {
|
|
117
119
|
description: 'SynaBun code editor autocomplete',
|
|
118
120
|
mode: 'primary',
|
|
119
|
-
|
|
120
|
-
temperature: 0.1,
|
|
121
|
-
|
|
121
|
+
system,
|
|
122
|
+
request: { body: { temperature: 0.1 } },
|
|
123
|
+
permissions: [{ action: '*', resource: '*', effect: 'deny' }],
|
|
122
124
|
},
|
|
123
125
|
};
|
|
124
126
|
return config;
|
|
@@ -128,7 +130,7 @@ export function buildCompletionServeConfig(userConfig, { system, configDir = nul
|
|
|
128
130
|
* The environment of the dedicated serve: the server's own, pointed at the lean configuration and told to read
|
|
129
131
|
* nothing else.
|
|
130
132
|
* @param {object} base the environment to start from (process.env)
|
|
131
|
-
* @param {{ configHome: string }} o the XDG_CONFIG_HOME that holds opencode/
|
|
133
|
+
* @param {{ configHome: string }} o the XDG_CONFIG_HOME that holds opencode/opencode.json
|
|
132
134
|
*/
|
|
133
135
|
export function completionServeEnvironment(base, { configHome }) {
|
|
134
136
|
const env = { ...base };
|
|
@@ -160,7 +162,7 @@ export function splitModelId(id) {
|
|
|
160
162
|
return { providerID: text.slice(0, slash), modelID: text.slice(slash + 1) };
|
|
161
163
|
}
|
|
162
164
|
|
|
163
|
-
/** Each connected model's variant names, from the serve's
|
|
165
|
+
/** Each connected model's variant names, from the serve's provider list: Map("provider/model" → string[]). */
|
|
164
166
|
export function variantsByModel(providers) {
|
|
165
167
|
const out = new Map();
|
|
166
168
|
const body = isObject(providers?.data) && (providers.data.all || providers.data.connected) ? providers.data : providers;
|
|
@@ -176,7 +178,7 @@ export function variantsByModel(providers) {
|
|
|
176
178
|
}
|
|
177
179
|
|
|
178
180
|
/**
|
|
179
|
-
* The text and the token counts of a prompt's answer (`
|
|
181
|
+
* The text and the token counts of a prompt's answer (the client's `session.prompt`).
|
|
180
182
|
* @returns {{ text: string, tokens: { input: number, output: number }, error: string | null }} `input` counts the
|
|
181
183
|
* tokens read from and written to the provider's cache too; `output` counts reasoning
|
|
182
184
|
*/
|
|
@@ -202,23 +204,24 @@ function abortError() {
|
|
|
202
204
|
|
|
203
205
|
/**
|
|
204
206
|
* @param {object} deps
|
|
205
|
-
* @param {string} deps.dataDir DATA_HOME/data/editor-complete: holds opencode/
|
|
207
|
+
* @param {string} deps.dataDir DATA_HOME/data/editor-complete: holds opencode/opencode.json and the empty work folder
|
|
206
208
|
* @param {string} deps.system the completion instruction (the agent's prompt)
|
|
207
209
|
* @param {() => object | null} deps.readUserConfig the user's OpenCode configuration, read at each start
|
|
208
210
|
* @param {() => string | null} [deps.userConfigDir] the folder that configuration is in (relative {file:…}
|
|
209
211
|
* references of its providers are resolved against it)
|
|
210
212
|
* @param {() => number | null | Promise<number | null>} deps.allocPort a free port (server.js: what an earlier
|
|
211
213
|
* SynaBun left running goes first, then allocOpencodeIsoPort)
|
|
212
|
-
* @param {(o: { port: number, env: object, cwd: string,
|
|
213
|
-
* deps.spawnServe starts `opencode serve` on the port
|
|
214
|
+
* @param {(o: { port: number, env: object, cwd: string, password: string }) => object}
|
|
215
|
+
* deps.spawnServe starts `opencode serve` on the port with that password and returns its process
|
|
214
216
|
* (`on('exit')`, `kill()`)
|
|
215
217
|
* @param {(proc: object, signal?: string) => void} [deps.killServe] stops that process: SIGTERM, or SIGKILL for a
|
|
216
218
|
* failed start's process that did not end (default: proc.kill(signal))
|
|
217
|
-
* @param {(o: { port: number,
|
|
219
|
+
* @param {(o: { port: number, password?: string | null, version?: string }) => object}
|
|
218
220
|
* deps.createClient lib/opencode-v2-client.js createClientInstance
|
|
219
|
-
* @param {() => Promise<
|
|
220
|
-
* [deps.
|
|
221
|
-
*
|
|
221
|
+
* @param {() => Promise<{ major?: number | null, supported?: boolean, reason?: string } | null>}
|
|
222
|
+
* [deps.detectOpencode] which OpenCode the serve will be (server.js detectOpencode): one SynaBun does not drive
|
|
223
|
+
* never starts
|
|
224
|
+
* @param {(run: () => Promise<any>) => Promise<any>} [deps.startOneAtATime] runs a start
|
|
222
225
|
* in its turn among every serve SynaBun starts (server.js oneOpencodeStartAtATime); by itself when not given
|
|
223
226
|
* @param {number} [deps.exitWaitMs] how long a failed start waits for its process to exit after SIGTERM, and again
|
|
224
227
|
* after SIGKILL, before its turn ends
|
|
@@ -238,8 +241,9 @@ export function createOpencodeCompletionEngine({
|
|
|
238
241
|
killServe = (proc, signal = 'SIGTERM') => { try { proc.kill(signal); } catch { /* gone */ } },
|
|
239
242
|
createClient, fetchImpl = (...args) => fetch(...args), env = process.env, now = Date.now,
|
|
240
243
|
idleMs = IDLE_STOP_MS, startTimeoutMs = START_TIMEOUT_MS, sweepTimeoutMs = SWEEP_TIMEOUT_MS, healthPollMs = 100, log = () => {},
|
|
241
|
-
|
|
242
|
-
|
|
244
|
+
detectOpencode = async () => null, newPassword = newServePassword,
|
|
245
|
+
passwordFrom = 'env', checkServer = checkOpencodeServer,
|
|
246
|
+
startOneAtATime = (run) => run(), exitWaitMs = 3000, trackServe = () => {},
|
|
243
247
|
} = {}) {
|
|
244
248
|
if (!dataDir || !system) throw new Error('createOpencodeCompletionEngine requires dataDir and system');
|
|
245
249
|
if (typeof allocPort !== 'function' || typeof spawnServe !== 'function' || typeof createClient !== 'function') {
|
|
@@ -256,7 +260,6 @@ export function createOpencodeCompletionEngine({
|
|
|
256
260
|
const deleting = new Set(); // session deletions on their way: a stop waits for them (drain)
|
|
257
261
|
|
|
258
262
|
const sleep = (ms) => new Promise((done) => setTimeout(done, ms));
|
|
259
|
-
const serveUrl = (port, path) => `http://127.0.0.1:${port}${path}${path.includes('?') ? '&' : '?'}directory=${encodeURIComponent(workDir)}`;
|
|
260
263
|
|
|
261
264
|
function touch() {
|
|
262
265
|
lastUsed = now();
|
|
@@ -301,22 +304,22 @@ export function createOpencodeCompletionEngine({
|
|
|
301
304
|
try { userConfig = readUserConfig(); } catch (error) { log('editor-complete:serve', `could not read the OpenCode configuration: ${error?.message || error}`); }
|
|
302
305
|
let configDir = null;
|
|
303
306
|
try { configDir = userConfigDir() || null; } catch { configDir = null; }
|
|
304
|
-
writeFileSync(join(dataDir, 'opencode',
|
|
307
|
+
writeFileSync(join(dataDir, 'opencode', OPENCODE_CONFIG_FILE), `${JSON.stringify(buildCompletionServeConfig(userConfig, { system, configDir, log }), null, 2)}\n`, 'utf8');
|
|
305
308
|
|
|
306
|
-
//
|
|
307
|
-
|
|
308
|
-
const
|
|
309
|
+
// An OpenCode SynaBun does not drive (OpenCode 1, an OpenCode 2 older than the minimum) never starts; a version
|
|
310
|
+
// not known here (a command line in Settings) is told by what answers.
|
|
311
|
+
const detected = await detectOpencode();
|
|
309
312
|
if (detected && typeof detected === 'object' && detected.supported === false && detected.major != null) {
|
|
310
313
|
throw new Error(detected.reason || `OpenCode ${detected.major} is not supported`);
|
|
311
314
|
}
|
|
312
315
|
if (mine !== epoch) throw new Error('The completion server was stopped while it was starting');
|
|
313
|
-
const password =
|
|
316
|
+
const password = passwordFrom === 'stdout' ? null : newPassword();
|
|
314
317
|
|
|
315
318
|
// Another server that takes the port while the serve boots is a start collision: it is left running, this start's
|
|
316
319
|
// own process is ended, and the start tries another port (START_ATTEMPTS ports at most).
|
|
317
320
|
for (let attempt = 1; ; attempt++) {
|
|
318
321
|
try {
|
|
319
|
-
return await startOn(port, { mine,
|
|
322
|
+
return await startOn(port, { mine, password });
|
|
320
323
|
} catch (error) {
|
|
321
324
|
if (!error?.portTaken || attempt >= START_ATTEMPTS || mine !== epoch) throw error;
|
|
322
325
|
log('editor-complete:serve', `another server answers on port ${port}: it is left running, and the completion server tries another port`);
|
|
@@ -343,8 +346,8 @@ export function createOpencodeCompletionEngine({
|
|
|
343
346
|
return false;
|
|
344
347
|
}
|
|
345
348
|
|
|
346
|
-
async function startOn(port, { mine,
|
|
347
|
-
const started = { port, proc: null, client: null, variants: new Map(), providers: null, providersAt: 0, exited: false, killed: false, halt: null,
|
|
349
|
+
async function startOn(port, { mine, password }) {
|
|
350
|
+
const started = { port, proc: null, client: null, variants: new Map(), providers: null, providersAt: 0, exited: false, killed: false, halt: null, password };
|
|
348
351
|
// What a stop wakes: a start that waits (for the serve to answer, for the next look) goes on at once.
|
|
349
352
|
const halted = new Promise((done) => { started.halt = done; });
|
|
350
353
|
// Both are checked before and after each wait: a stop may have been asked for, or the process may be gone.
|
|
@@ -357,9 +360,13 @@ export function createOpencodeCompletionEngine({
|
|
|
357
360
|
// One start at a time with every other serve SynaBun starts (OpenCode 2 cannot open its database while
|
|
358
361
|
// another serve is opening it): from the spawn until this serve answers, or until a failed start's process
|
|
359
362
|
// is gone.
|
|
360
|
-
const check = await startOneAtATime(
|
|
363
|
+
const check = await startOneAtATime(async () => {
|
|
361
364
|
stillWanted();
|
|
362
|
-
started.proc = spawnServe({ port, env: completionServeEnvironment(env, { configHome: dataDir }), cwd: workDir,
|
|
365
|
+
started.proc = spawnServe({ port, env: completionServeEnvironment(env, { configHome: dataDir }), cwd: workDir, password, passwordFrom });
|
|
366
|
+
if (passwordFrom === 'stdout') {
|
|
367
|
+
const readPassword = servePasswordReader();
|
|
368
|
+
started.proc?.stdout?.on('data', chunk => { started.password = readPassword(chunk); });
|
|
369
|
+
}
|
|
363
370
|
starts++;
|
|
364
371
|
spawned = started;
|
|
365
372
|
started.proc?.on?.('exit', () => {
|
|
@@ -371,8 +378,9 @@ export function createOpencodeCompletionEngine({
|
|
|
371
378
|
const deadline = now() + startTimeoutMs;
|
|
372
379
|
for (;;) {
|
|
373
380
|
stillWanted();
|
|
374
|
-
//
|
|
375
|
-
const answer =
|
|
381
|
+
// OpenCode 2's API answering JSON, never a web page (lib/opencode-protocol.js).
|
|
382
|
+
const answer = passwordFrom === 'stdout' && !started.password ? null
|
|
383
|
+
: await Promise.race([checkServer({ port, password: started.password, fetchImpl, timeoutMs: 2000 }), halted]);
|
|
376
384
|
if (answer?.ok) {
|
|
377
385
|
// Only this start's own process counts: another server that took the port answers for itself.
|
|
378
386
|
let verdict = null;
|
|
@@ -395,8 +403,7 @@ export function createOpencodeCompletionEngine({
|
|
|
395
403
|
});
|
|
396
404
|
stillWanted();
|
|
397
405
|
|
|
398
|
-
started.
|
|
399
|
-
started.client = createClient({ port, protocol: started.protocol, password, version: check.version || '' });
|
|
406
|
+
started.client = createClient({ port, password: started.password, version: check.version || '' });
|
|
400
407
|
// It answers, and takes no request yet. First the sessions a crash left behind go: a sweep that ran beside the
|
|
401
408
|
// first requests would find their sessions in its listing and delete them under the model call. Meanwhile,
|
|
402
409
|
// which lighter reasoning setting each model offers; worth a short wait, as without it the first completions
|
|
@@ -423,18 +430,11 @@ export function createOpencodeCompletionEngine({
|
|
|
423
430
|
|
|
424
431
|
async function loadProviders(serve, { signal } = {}) {
|
|
425
432
|
if (serve.providers && now() - serve.providersAt < 60_000) return serve.providers;
|
|
426
|
-
if (
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
serve.providersAt = now();
|
|
432
|
-
serve.variants = variantsByModel(serve.providers);
|
|
433
|
-
return serve.providers;
|
|
434
|
-
}
|
|
435
|
-
const res = await fetchImpl(serveUrl(serve.port, '/provider'), { signal: signal || AbortSignal.timeout(8000) });
|
|
436
|
-
if (!res.ok) throw new Error(`The completion server answered ${res.status} for its model list`);
|
|
437
|
-
serve.providers = await res.json();
|
|
433
|
+
if (signal?.aborted) throw abortError();
|
|
434
|
+
// The client answers with the provider list SynaBun reads ({ all, default, connected }).
|
|
435
|
+
const listed = await serve.client.getClient().provider.list({ directory: workDir });
|
|
436
|
+
if (listed?.error) throw new Error(`The completion server answered ${listed.response?.status || 'an error'} for its model list`);
|
|
437
|
+
serve.providers = listed.data;
|
|
438
438
|
serve.providersAt = now();
|
|
439
439
|
serve.variants = variantsByModel(serve.providers);
|
|
440
440
|
return serve.providers;
|
|
@@ -517,7 +517,7 @@ export function createOpencodeCompletionEngine({
|
|
|
517
517
|
return {
|
|
518
518
|
complete,
|
|
519
519
|
/**
|
|
520
|
-
* The serve's
|
|
520
|
+
* The serve's provider list (every known provider, and which are connected), or null while the serve is
|
|
521
521
|
* not running and `start` is not set.
|
|
522
522
|
*/
|
|
523
523
|
async providers({ start: startIt = false, signal } = {}) {
|
|
@@ -18,13 +18,12 @@
|
|
|
18
18
|
// not an error. Dependencies are injected: the router is tested without server.js.
|
|
19
19
|
|
|
20
20
|
import { Router } from 'express';
|
|
21
|
-
import { execFile } from 'node:child_process';
|
|
22
21
|
import { statSync } from 'node:fs';
|
|
23
22
|
import { dirname, isAbsolute, relative, sep } from 'node:path';
|
|
24
23
|
import { PathConfineError } from './path-confine.js';
|
|
25
24
|
import { MAX_FILE_BYTES, canonicalInside } from './confined-fs.js';
|
|
26
25
|
import { useFileRoot } from './editor-files-api.js';
|
|
27
|
-
import {
|
|
26
|
+
import { gitStatusRunner } from './git-status-runner.js';
|
|
28
27
|
|
|
29
28
|
/** What this route adds to the editor (GET /api/editor/capabilities). */
|
|
30
29
|
export const EDITOR_GIT_CAPABILITIES = Object.freeze(['git-head']);
|
|
@@ -32,9 +31,6 @@ export const GIT_TIMEOUT_MS = 5000;
|
|
|
32
31
|
|
|
33
32
|
const UTF8_BOM = [0xEF, 0xBB, 0xBF];
|
|
34
33
|
const BINARY_PROBE_BYTES = 8192;
|
|
35
|
-
// Variables that would point git at another repository than the one the file is in.
|
|
36
|
-
const REDIRECTING = ['GIT_DIR', 'GIT_WORK_TREE', 'GIT_INDEX_FILE', 'GIT_NAMESPACE', 'GIT_COMMON_DIR', 'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES', 'GIT_CEILING_DIRECTORIES'];
|
|
37
|
-
|
|
38
34
|
/**
|
|
39
35
|
* Run git for a read and collect what it prints. Never throws. The arguments are the command's own: what keeps a
|
|
40
36
|
* read from starting a program of the repository's is added here (lib/git-read.js).
|
|
@@ -42,21 +38,8 @@ const REDIRECTING = ['GIT_DIR', 'GIT_WORK_TREE', 'GIT_INDEX_FILE', 'GIT_NAMESPAC
|
|
|
42
38
|
* @param {{ cwd: string, maxBuffer: number, timeoutMs?: number, binary?: string, env?: object }} o
|
|
43
39
|
* @returns {Promise<{ ok: boolean, stdout: Buffer, tooLarge: boolean }>} `tooLarge`: it printed more than `maxBuffer` bytes
|
|
44
40
|
*/
|
|
45
|
-
export function runGit(args,
|
|
46
|
-
|
|
47
|
-
for (const name of REDIRECTING) delete clean[name];
|
|
48
|
-
const failed = { ok: false, stdout: Buffer.alloc(0), tooLarge: false };
|
|
49
|
-
return gitRead(cwd, args, { binary, env: clean }).then((read) => new Promise((done) => {
|
|
50
|
-
try {
|
|
51
|
-
execFile(binary, read.args, { cwd, maxBuffer, timeout: timeoutMs, encoding: 'buffer', windowsHide: true, env: read.env, shell: false }, (error, stdout) => {
|
|
52
|
-
const out = Buffer.isBuffer(stdout) ? stdout : Buffer.alloc(0);
|
|
53
|
-
if (!error) done({ ok: true, stdout: out, tooLarge: false });
|
|
54
|
-
else done({ ok: false, stdout: out, tooLarge: error.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER' });
|
|
55
|
-
});
|
|
56
|
-
} catch {
|
|
57
|
-
done(failed);
|
|
58
|
-
}
|
|
59
|
-
})).catch(() => failed);
|
|
41
|
+
export function runGit(args, options = {}) {
|
|
42
|
+
return gitStatusRunner.run(args, { timeoutMs: GIT_TIMEOUT_MS, ...options });
|
|
60
43
|
}
|
|
61
44
|
|
|
62
45
|
/**
|
|
@@ -13,9 +13,12 @@ function codexConfigString(value) {
|
|
|
13
13
|
return JSON.stringify(String(value));
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
/** The reasoning levels `agy --effort` accepts (agy --help). */
|
|
17
|
+
const ANTIGRAVITY_EFFORTS = new Set(['low', 'medium', 'high', 'xhigh', 'max']);
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* Split the configurable CLI command into an executable and fixed arguments.
|
|
18
|
-
* Settings intentionally supports prefixes such as `wsl -d Ubuntu
|
|
21
|
+
* Settings intentionally supports prefixes such as `wsl -d Ubuntu agy`.
|
|
19
22
|
* An existing path wins before tokenization so unquoted executable paths with
|
|
20
23
|
* spaces keep working; quoted paths are handled by the tokenizer.
|
|
21
24
|
*/
|
|
@@ -84,8 +87,6 @@ export function buildExecInvocation({
|
|
|
84
87
|
mcpEnvOverrides = [],
|
|
85
88
|
// Codex: launch overrides as `-c` words (the Windows sandbox of the Admin sandbox setting).
|
|
86
89
|
codexConfigArgs = [],
|
|
87
|
-
// OpenCode: the major of the CLI (lib/opencode-protocol.js); 2 has other `run` flags.
|
|
88
|
-
opencodeMajor = 1,
|
|
89
90
|
platform = process.platform,
|
|
90
91
|
commandExists = existsSync,
|
|
91
92
|
} = {}) {
|
|
@@ -109,16 +110,18 @@ export function buildExecInvocation({
|
|
|
109
110
|
args.push('-');
|
|
110
111
|
break;
|
|
111
112
|
}
|
|
112
|
-
case '
|
|
113
|
+
case 'antigravity':
|
|
114
|
+
// Print mode with the task on stdin (the wrapper redirects it), unattended like every exec loop: Antigravity
|
|
115
|
+
// asks before edits and commands, and there is nobody to answer in a terminal that runs a loop.
|
|
116
|
+
args.push('--output-format', 'text', '--dangerously-skip-permissions');
|
|
113
117
|
if (model) args.push('--model', String(model));
|
|
118
|
+
if (effort && ANTIGRAVITY_EFFORTS.has(String(effort))) args.push('--effort', String(effort));
|
|
114
119
|
break;
|
|
115
120
|
case 'opencode':
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
// configuration) and `--auto` (approve what is not denied)
|
|
119
|
-
|
|
120
|
-
if (Number(opencodeMajor) >= 2) args.push('run', '--standalone', '--auto');
|
|
121
|
-
else args.push('run', '--dangerously-skip-permissions');
|
|
121
|
+
// A private server for this run (`--standalone`; without it the CLI uses
|
|
122
|
+
// the machine's background service, which has none of the loop's
|
|
123
|
+
// configuration) and `--auto` (approve what is not denied).
|
|
124
|
+
args.push('run', '--standalone', '--auto');
|
|
122
125
|
if (model) args.push('--model', String(model));
|
|
123
126
|
args.push('--format', 'default');
|
|
124
127
|
break;
|