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
|
@@ -11,12 +11,23 @@
|
|
|
11
11
|
* emitted by its old Settings writer. All unrelated configuration is left
|
|
12
12
|
* byte-for-byte intact. Repairs keep a backup; file writes are atomic,
|
|
13
13
|
* preserve the original mode, and are idempotent.
|
|
14
|
+
*
|
|
15
|
+
* The managed keys: SYNABUN_TOOLS = "all" (every SynaBun tool; a Codex
|
|
16
|
+
* runtime's own list is only its focus) and SYNABUN_TOOL_CATALOG_MODE =
|
|
17
|
+
* "deferred". SYNABUN_PROFILE, the key a tool list replaced, is never written.
|
|
18
|
+
* Its old managed value "full" is left where it is: a Neural Interface from
|
|
19
|
+
* before tool lists (until it restarts, or another install sharing this file)
|
|
20
|
+
* repairs any config without it, and the MCP child reads SYNABUN_TOOLS first,
|
|
21
|
+
* so the line is inert and the two never undo each other's repair. Any other
|
|
22
|
+
* SYNABUN_PROFILE value is removed.
|
|
14
23
|
*/
|
|
15
24
|
import {
|
|
16
25
|
chmodSync,
|
|
17
26
|
copyFileSync,
|
|
18
27
|
existsSync,
|
|
28
|
+
lstatSync,
|
|
19
29
|
readFileSync,
|
|
30
|
+
realpathSync,
|
|
20
31
|
renameSync,
|
|
21
32
|
statSync,
|
|
22
33
|
unlinkSync,
|
|
@@ -28,15 +39,19 @@ const ENV_SECTION = `${BASE_SECTION}.env`;
|
|
|
28
39
|
const TOOL_SECTION_PREFIX = `${BASE_SECTION}.tools.`;
|
|
29
40
|
const SECTION_HEADER_RE = /^\[([^\]]+)\]\s*$/m;
|
|
30
41
|
const INLINE_ENV_LINE_RE = /^env\s*=\s*\{([^}]*)\}\s*\r?\n?/m;
|
|
31
|
-
const
|
|
32
|
-
const
|
|
42
|
+
const MANAGED_TOOLS_KEY = 'SYNABUN_TOOLS';
|
|
43
|
+
const CODEX_TOOLS = 'all';
|
|
44
|
+
const LEGACY_PROFILE_KEY = 'SYNABUN_PROFILE';
|
|
45
|
+
/** The value a Neural Interface from before tool lists writes and repairs: left alone (see the header). */
|
|
46
|
+
const LEGACY_CODEX_PROFILE = 'full';
|
|
33
47
|
const TOOL_CATALOG_MODE_KEY = 'SYNABUN_TOOL_CATALOG_MODE';
|
|
34
48
|
const CODEX_TOOL_CATALOG_MODE = 'deferred';
|
|
35
49
|
|
|
36
50
|
export type CodexConfigIssue =
|
|
37
51
|
| 'duplicate_env'
|
|
38
52
|
| 'legacy_inline_env'
|
|
39
|
-
| '
|
|
53
|
+
| 'managed_tools_override'
|
|
54
|
+
| 'legacy_profile_key'
|
|
40
55
|
| 'missing_deferred_catalog'
|
|
41
56
|
| 'missing_transport'
|
|
42
57
|
| 'orphan_env'
|
|
@@ -60,8 +75,9 @@ export type HealReason =
|
|
|
60
75
|
| 'removed_ignored_settings'
|
|
61
76
|
| 'removed_duplicate_inline_env'
|
|
62
77
|
| 'normalized_inline_env'
|
|
63
|
-
| '
|
|
64
|
-
| '
|
|
78
|
+
| 'migrated_profile_key'
|
|
79
|
+
| 'set_all_tools'
|
|
80
|
+
| 'removed_legacy_profile_key'
|
|
65
81
|
| 'enabled_deferred_catalog'
|
|
66
82
|
| 'removed_orphan_sections';
|
|
67
83
|
|
|
@@ -182,8 +198,9 @@ function upsertTomlKey(body: string, key: string, serializedValue: string): stri
|
|
|
182
198
|
const keyRe = new RegExp(`^${escapeRegExp(key)}\\s*=.*$`, 'm');
|
|
183
199
|
if (keyRe.test(body)) return body.replace(keyRe, `${key} = ${serializedValue}`);
|
|
184
200
|
const newline = body.includes('\r\n') ? '\r\n' : '\n';
|
|
185
|
-
|
|
186
|
-
|
|
201
|
+
// The new key goes first; the rest of the body keeps its own lines, the blank one before the next table included.
|
|
202
|
+
const rest = body.replace(/^\r?\n/, '');
|
|
203
|
+
return `${newline}${key} = ${serializedValue}${newline}${rest}`;
|
|
187
204
|
}
|
|
188
205
|
|
|
189
206
|
function removeTomlKey(body: string, key: string): string {
|
|
@@ -196,10 +213,11 @@ function renderEnvSection(env: Record<string, string>, newline: string): string
|
|
|
196
213
|
return `[${ENV_SECTION}]${newline}${lines.join(newline)}${newline}`;
|
|
197
214
|
}
|
|
198
215
|
|
|
199
|
-
function upsertEnvSection(content: string, env: Record<string, string
|
|
216
|
+
function upsertEnvSection(content: string, env: Record<string, string>, { remove = [] }: { remove?: readonly string[] } = {}): string {
|
|
200
217
|
const newline = content.includes('\r\n') ? '\r\n' : '\n';
|
|
201
218
|
const sanitized = { ...env };
|
|
202
|
-
sanitized[
|
|
219
|
+
for (const key of remove) delete sanitized[key];
|
|
220
|
+
sanitized[MANAGED_TOOLS_KEY] = CODEX_TOOLS;
|
|
203
221
|
sanitized[TOOL_CATALOG_MODE_KEY] = CODEX_TOOL_CATALOG_MODE;
|
|
204
222
|
|
|
205
223
|
if (!hasSection(content, ENV_SECTION)) {
|
|
@@ -208,12 +226,17 @@ function upsertEnvSection(content: string, env: Record<string, string>): string
|
|
|
208
226
|
}
|
|
209
227
|
|
|
210
228
|
let body = sectionBody(content, ENV_SECTION);
|
|
229
|
+
for (const key of remove) body = removeTomlKey(body, key);
|
|
211
230
|
for (const [key, value] of Object.entries(sanitized)) {
|
|
212
231
|
body = upsertTomlKey(body, key, quote(value));
|
|
213
232
|
}
|
|
214
233
|
return replaceSectionBody(content, ENV_SECTION, body);
|
|
215
234
|
}
|
|
216
235
|
|
|
236
|
+
function hasKey(env: Record<string, string>, key: string): boolean {
|
|
237
|
+
return Object.prototype.hasOwnProperty.call(env, key);
|
|
238
|
+
}
|
|
239
|
+
|
|
217
240
|
function baseInlineEnv(content: string): Record<string, string> {
|
|
218
241
|
const body = sectionBody(content, BASE_SECTION);
|
|
219
242
|
const match = INLINE_ENV_LINE_RE.exec(body);
|
|
@@ -242,13 +265,16 @@ export function inspectCodexConfigContent(content: string): CodexConfigInspectio
|
|
|
242
265
|
|
|
243
266
|
if (inlineEnv && hasEnv) issues.push('duplicate_env');
|
|
244
267
|
else if (inlineEnv) issues.push('legacy_inline_env');
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
issues.push('
|
|
268
|
+
if (hasBase && hasTransport(content)) {
|
|
269
|
+
const tools = tableEnv[MANAGED_TOOLS_KEY] || inlineValues[MANAGED_TOOLS_KEY];
|
|
270
|
+
const hasProfile = hasKey(tableEnv, LEGACY_PROFILE_KEY) || hasKey(inlineValues, LEGACY_PROFILE_KEY);
|
|
271
|
+
const profile = tableEnv[LEGACY_PROFILE_KEY] ?? inlineValues[LEGACY_PROFILE_KEY];
|
|
272
|
+
// A config from before tool lists names only SYNABUN_PROFILE: migrating it is one issue, not two.
|
|
273
|
+
if (tools !== CODEX_TOOLS) issues.push(!tools && hasProfile ? 'legacy_profile_key' : 'managed_tools_override');
|
|
274
|
+
if (hasProfile && profile !== LEGACY_CODEX_PROFILE && !issues.includes('legacy_profile_key')) issues.push('legacy_profile_key');
|
|
275
|
+
if ((tableEnv[TOOL_CATALOG_MODE_KEY] || inlineValues[TOOL_CATALOG_MODE_KEY]) !== CODEX_TOOL_CATALOG_MODE) {
|
|
276
|
+
issues.push('missing_deferred_catalog');
|
|
277
|
+
}
|
|
252
278
|
}
|
|
253
279
|
if (hasBase && !hasTransport(content)) issues.push('missing_transport');
|
|
254
280
|
if (!hasBase && hasEnv) issues.push('orphan_env');
|
|
@@ -286,23 +312,33 @@ export function repairCodexConfigContent(content: string): { content: string; re
|
|
|
286
312
|
const tableEnv = parseEnvTable(next);
|
|
287
313
|
const hadInline = INLINE_ENV_LINE_RE.test(sectionBody(next, BASE_SECTION));
|
|
288
314
|
const hadTable = hasSection(next, ENV_SECTION);
|
|
289
|
-
const
|
|
315
|
+
const configuredTools = tableEnv[MANAGED_TOOLS_KEY] || inlineEnv[MANAGED_TOOLS_KEY];
|
|
316
|
+
const hadAllTools = configuredTools === CODEX_TOOLS;
|
|
317
|
+
const hasProfile = hasKey(tableEnv, LEGACY_PROFILE_KEY) || hasKey(inlineEnv, LEGACY_PROFILE_KEY);
|
|
318
|
+
// "full" stays: an older Neural Interface writes it back into a config without it (through an account's link to
|
|
319
|
+
// this file, its write replaces the link), and next to SYNABUN_TOOLS it decides nothing.
|
|
320
|
+
const keepProfile = (tableEnv[LEGACY_PROFILE_KEY] ?? inlineEnv[LEGACY_PROFILE_KEY]) === LEGACY_CODEX_PROFILE;
|
|
290
321
|
const hadDeferredCatalog = (tableEnv[TOOL_CATALOG_MODE_KEY] || inlineEnv[TOOL_CATALOG_MODE_KEY]) === CODEX_TOOL_CATALOG_MODE;
|
|
291
322
|
const mergedEnv = { ...inlineEnv, ...tableEnv };
|
|
292
|
-
|
|
293
|
-
mergedEnv[TOOL_CATALOG_MODE_KEY] = CODEX_TOOL_CATALOG_MODE;
|
|
323
|
+
const remove = hasProfile && !keepProfile ? [LEGACY_PROFILE_KEY] : [];
|
|
294
324
|
|
|
295
325
|
if (hadInline) next = stripInlineEnv(next);
|
|
296
|
-
next = upsertEnvSection(next, mergedEnv);
|
|
326
|
+
next = upsertEnvSection(next, mergedEnv, { remove });
|
|
297
327
|
|
|
298
328
|
if (next === content) return { content, reason: null };
|
|
299
329
|
if (hadInline && hadTable) return { content: next, reason: 'removed_duplicate_inline_env' };
|
|
300
330
|
if (hadInline) return { content: next, reason: 'normalized_inline_env' };
|
|
301
|
-
if (!
|
|
331
|
+
if (!configuredTools && hasProfile) return { content: next, reason: 'migrated_profile_key' };
|
|
332
|
+
if (!hadAllTools) return { content: next, reason: 'set_all_tools' };
|
|
333
|
+
if (remove.length) return { content: next, reason: 'removed_legacy_profile_key' };
|
|
302
334
|
if (!hadDeferredCatalog) return { content: next, reason: 'enabled_deferred_catalog' };
|
|
303
335
|
return { content: next, reason: null };
|
|
304
336
|
}
|
|
305
337
|
|
|
338
|
+
/**
|
|
339
|
+
* Register SynaBun with this definition. SYNABUN_PROFILE is never written from a definition; one already there is
|
|
340
|
+
* kept only as "full", like the heal keeps it.
|
|
341
|
+
*/
|
|
306
342
|
export function upsertCodexMcpContent(content: string, definition: CodexMcpDefinition): string {
|
|
307
343
|
let next = repairCodexConfigContent(content).content;
|
|
308
344
|
const newline = next.includes('\r\n') ? '\r\n' : '\n';
|
|
@@ -319,7 +355,10 @@ export function upsertCodexMcpContent(content: string, definition: CodexMcpDefin
|
|
|
319
355
|
}
|
|
320
356
|
|
|
321
357
|
const existingEnv = parseEnvTable(next);
|
|
322
|
-
|
|
358
|
+
const env: Record<string, string> = { ...existingEnv, ...definition.env };
|
|
359
|
+
delete env[LEGACY_PROFILE_KEY];
|
|
360
|
+
const remove = hasKey(existingEnv, LEGACY_PROFILE_KEY) && existingEnv[LEGACY_PROFILE_KEY] !== LEGACY_CODEX_PROFILE ? [LEGACY_PROFILE_KEY] : [];
|
|
361
|
+
next = upsertEnvSection(next, env, { remove });
|
|
323
362
|
return next.endsWith(newline) ? next : `${next}${newline}`;
|
|
324
363
|
}
|
|
325
364
|
|
|
@@ -331,16 +370,28 @@ export function removeCodexMcpContent(content: string): string {
|
|
|
331
370
|
]);
|
|
332
371
|
}
|
|
333
372
|
|
|
373
|
+
/**
|
|
374
|
+
* The file a path writes to. A Codex account's CODEX_HOME links config.toml to the canonical one: a write goes to
|
|
375
|
+
* the file the link names, so the link (and the sharing it gives every account) stays.
|
|
376
|
+
*/
|
|
377
|
+
function writeTarget(configPath: string): string {
|
|
378
|
+
try {
|
|
379
|
+
if (lstatSync(configPath).isSymbolicLink()) return realpathSync(configPath);
|
|
380
|
+
} catch { /* a new file, or a link to nothing: written in place */ }
|
|
381
|
+
return configPath;
|
|
382
|
+
}
|
|
383
|
+
|
|
334
384
|
function atomicWrite(configPath: string, content: string): void {
|
|
335
|
-
const
|
|
336
|
-
const
|
|
385
|
+
const target = writeTarget(configPath);
|
|
386
|
+
const mode = existsSync(target) ? statSync(target).mode : null;
|
|
387
|
+
const tmpPath = `${target}.synabun-${process.pid}.tmp`;
|
|
337
388
|
writeFileSync(tmpPath, content, 'utf-8');
|
|
338
389
|
if (mode !== null) chmodSync(tmpPath, mode);
|
|
339
390
|
try {
|
|
340
|
-
renameSync(tmpPath,
|
|
391
|
+
renameSync(tmpPath, target);
|
|
341
392
|
} catch (renameErr) {
|
|
342
|
-
try { copyFileSync(tmpPath,
|
|
343
|
-
if (existsSync(
|
|
393
|
+
try { copyFileSync(tmpPath, target); } catch { /* preserve original when possible */ }
|
|
394
|
+
if (existsSync(target) && readFileSync(target, 'utf-8') === content) {
|
|
344
395
|
try { unlinkSync(tmpPath); } catch { /* best effort */ }
|
|
345
396
|
return;
|
|
346
397
|
}
|
|
@@ -377,8 +428,8 @@ export function healCodexConfig(configPath: string): HealResult {
|
|
|
377
428
|
}
|
|
378
429
|
|
|
379
430
|
try {
|
|
380
|
-
// Keep the exact original, including unrelated tables and its permissions.
|
|
381
|
-
const backup = `${configPath}.synabun-backup-${Date.now()}-${process.pid}`;
|
|
431
|
+
// Keep the exact original, including unrelated tables and its permissions, next to the file it came from.
|
|
432
|
+
const backup = `${writeTarget(configPath)}.synabun-backup-${Date.now()}-${process.pid}`;
|
|
382
433
|
copyFileSync(configPath, backup);
|
|
383
434
|
atomicWrite(configPath, repaired.content);
|
|
384
435
|
} catch (err) {
|
|
@@ -192,7 +192,7 @@ export function runWithBrainCredential<T>(credential: string | null, fn: () => T
|
|
|
192
192
|
/**
|
|
193
193
|
* The WhatsApp brain credential of the current caller (whatsapp_send_file sends it on its one request
|
|
194
194
|
* and nowhere else): the request's own header over HTTP (X-Synabun-Brain-Token, the Claude brain),
|
|
195
|
-
* SYNABUN_BRAIN_TOKEN for stdio children (the Codex and
|
|
195
|
+
* SYNABUN_BRAIN_TOKEN for stdio children (the Codex, OpenCode and Antigravity brains). Never the host process's
|
|
196
196
|
* env for an HTTP caller.
|
|
197
197
|
*/
|
|
198
198
|
export function callerBrainCredential(): string | null {
|
|
@@ -203,7 +203,7 @@ export function callerBrainCredential(): string | null {
|
|
|
203
203
|
/**
|
|
204
204
|
* Role of the current caller: the ALS identity's role over HTTP (derived from
|
|
205
205
|
* X-Synabun-Role on every request), or SYNABUN_ROLE for stdio children —
|
|
206
|
-
* Codex/OpenCode assistant brains pass the role to their MCP child via env.
|
|
206
|
+
* Codex/OpenCode/Antigravity assistant brains pass the role to their MCP child via env.
|
|
207
207
|
* In HTTP mode a missing ALS store is a propagation bug, so the host
|
|
208
208
|
* process's own env must never grant a role to an unidentified caller.
|
|
209
209
|
*/
|
|
@@ -303,13 +303,19 @@ let timer: ReturnType<typeof setInterval> | null = null;
|
|
|
303
303
|
/** Forget in-memory pacing state (start/resume, and tests). Persisted counters are untouched. */
|
|
304
304
|
export function resetJudgeBackfillRunner(): void { consecutiveFailures = 0; nextTickAt = 0; }
|
|
305
305
|
|
|
306
|
+
/**
|
|
307
|
+
* Persist the counters gathered since the last flush. `force` flushes now instead of at the next due point; with
|
|
308
|
+
* nothing gathered nothing is written, forced or not: a server that stops (stopJudgeBackfill) commits nothing to
|
|
309
|
+
* memory.db then, so a pre-update snapshot taken before its stop still stands for the database
|
|
310
|
+
* (checkUpgradeSnapshotFreshness in neural-interface/lib/backup-service.js).
|
|
311
|
+
*/
|
|
306
312
|
function flushProgress(force = false): void {
|
|
307
313
|
const due = force || jobsSinceFlush >= FLUSH_EVERY_JOBS || Date.now() - lastFlushAt >= FLUSH_EVERY_MS;
|
|
308
314
|
if (!due) return;
|
|
309
315
|
const pending = delta;
|
|
310
316
|
const hasChanges = pending.judged || pending.skipped || pending.failures || pending.lastError;
|
|
311
317
|
delta = emptyDelta(); jobsSinceFlush = 0; lastFlushAt = Date.now();
|
|
312
|
-
if (!hasChanges
|
|
318
|
+
if (!hasChanges) return;
|
|
313
319
|
try {
|
|
314
320
|
mutateTypeSafeConfig(current => {
|
|
315
321
|
const b = current.backfill;
|
|
@@ -2,7 +2,7 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { getDb } from './sqlite.js';
|
|
3
3
|
|
|
4
4
|
export interface MemoryEvent {
|
|
5
|
-
host: 'claude-code'|'codex'|'opencode'; session_id: string; source_id: string;
|
|
5
|
+
host: 'claude-code'|'codex'|'opencode'|'antigravity'; session_id: string; source_id: string;
|
|
6
6
|
project: string; timestamp: string; role: 'user'|'assistant'|'tool'; text: string;
|
|
7
7
|
cwd?: string; tools?: string[]; files?: string[];
|
|
8
8
|
}
|
|
@@ -18,6 +18,15 @@ function visibleText(content: any): string {
|
|
|
18
18
|
function clean(text: string) {
|
|
19
19
|
return text.replace(/<(system-reminder|environment_context|permissions|INSTRUCTIONS)>[\s\S]*?<\/\1>/g,'').trim();
|
|
20
20
|
}
|
|
21
|
+
// SynaBun's greeting note in an Antigravity prompt (neural-interface/public/shared/agy/agy-greeting.js, same markers).
|
|
22
|
+
const AGY_GREETING_NOTE = /\[SYNABUN_GREETING_START\][\s\S]*?\[SYNABUN_GREETING_END\][ \t]*(?:\r?\n)*/g;
|
|
23
|
+
const AGY_META_BLOCKS = /<(ADDITIONAL_METADATA|USER_SETTINGS_CHANGE|EPHEMERAL_MESSAGE|SYSTEM_MESSAGE)>[\s\S]*?<\/\1>/g;
|
|
24
|
+
/** What a person typed, out of Antigravity's USER_INPUT step (agy wraps it in <USER_REQUEST> with blocks of its own). */
|
|
25
|
+
function antigravityUserWords(content: unknown) {
|
|
26
|
+
const text = String(content ?? '');
|
|
27
|
+
const request = /<USER_REQUEST>\r?\n?([\s\S]*?)\r?\n?<\/USER_REQUEST>/.exec(text);
|
|
28
|
+
return (request ? request[1] : text.replace(AGY_META_BLOCKS, '')).replace(AGY_GREETING_NOTE, '').trim();
|
|
29
|
+
}
|
|
21
30
|
/** Normalize only visible provider records, never reasoning or system text. */
|
|
22
31
|
export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[], context: {session_id:string;project:string;cwd?:string}): MemoryEvent[] {
|
|
23
32
|
const events: MemoryEvent[] = [];
|
|
@@ -25,6 +34,7 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
|
|
|
25
34
|
let role: MemoryEvent['role']|undefined;
|
|
26
35
|
let text = '';
|
|
27
36
|
let tools: string[] = [];
|
|
37
|
+
let sourceId: string|undefined;
|
|
28
38
|
if (host === 'claude-code') {
|
|
29
39
|
if (record.isMeta || record.isSidechain) continue;
|
|
30
40
|
if (record.type === 'user' && !record.toolUseResult && !record.sourceToolAssistantUUID) role='user';
|
|
@@ -38,6 +48,17 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
|
|
|
38
48
|
if (p?.type === 'agentMessage') { role='assistant'; text=String(p.text || ''); }
|
|
39
49
|
if (p?.type === 'commandExecution') { role='tool'; text=String(p.aggregatedOutput || ''); tools=['commandExecution']; }
|
|
40
50
|
if (p?.type === 'function_call_output') {role='tool';text=String(p.output || '');}
|
|
51
|
+
} else if (host === 'antigravity') {
|
|
52
|
+
// agy's transcript.jsonl (brain/<id>/.system_generated/logs): one line per step, keyed by its index (a
|
|
53
|
+
// re-read of the file, from any offset, gives every step the same source id). The person's words and the
|
|
54
|
+
// model's answers only: never its `thinking`, agy's own system messages, or tool output.
|
|
55
|
+
if (Number.isInteger(record.step_index)) sourceId = `step:${record.step_index}`;
|
|
56
|
+
if (record.type === 'USER_INPUT' && record.source === 'USER_EXPLICIT') { role='user'; text=antigravityUserWords(record.content); }
|
|
57
|
+
if (record.type === 'PLANNER_RESPONSE' && record.source === 'MODEL') {
|
|
58
|
+
role='assistant';
|
|
59
|
+
text=typeof record.content === 'string' ? record.content : '';
|
|
60
|
+
tools=(Array.isArray(record.tool_calls) ? record.tool_calls : []).map((c:any)=>String(c?.name || '')).filter(Boolean);
|
|
61
|
+
}
|
|
41
62
|
} else {
|
|
42
63
|
const info = record.info || record;
|
|
43
64
|
if (['user','assistant'].includes(info.role)) role=info.role;
|
|
@@ -46,8 +67,8 @@ export function normalizeMemoryEvents(host: MemoryEvent['host'], records: any[],
|
|
|
46
67
|
}
|
|
47
68
|
text=clean(text);
|
|
48
69
|
if (!role || !text || text.startsWith('# AGENTS.md')) continue;
|
|
49
|
-
const timestamp = record.timestamp || record.info?.time?.created || record.createdAt;
|
|
50
|
-
events.push({...context,host,source_id:String(record.uuid || record.id || record.info?.id || `${index}`),role,text,tools,
|
|
70
|
+
const timestamp = record.timestamp || record.info?.time?.created || record.createdAt || record.created_at;
|
|
71
|
+
events.push({...context,host,source_id:sourceId ?? String(record.uuid || record.id || record.info?.id || `${index}`),role,text,tools,
|
|
51
72
|
timestamp: timestamp && Number.isFinite(new Date(timestamp).getTime()) ? new Date(timestamp).toISOString() : '1970-01-01T00:00:00.000Z'});
|
|
52
73
|
}
|
|
53
74
|
return events;
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
getIdentity,
|
|
13
13
|
effectivePins,
|
|
14
14
|
terminalIdFor,
|
|
15
|
+
callerBrainCredential,
|
|
15
16
|
callerRole,
|
|
16
17
|
setReleaseHook,
|
|
17
18
|
peekStdioIdentity,
|
|
@@ -163,11 +164,18 @@ async function requestOnce(
|
|
|
163
164
|
// orchestrator apart from a worker run (workers must never dispatch).
|
|
164
165
|
const role = callerRole();
|
|
165
166
|
if (role) headers['X-Synabun-Role'] = role;
|
|
167
|
+
// A brain whose pin no session resolves (the Codex brain's MCP child, codex-sp-<uuid>) is known to
|
|
168
|
+
// /api/assistant/* by its launch credential: the role header alone names nobody there. Sent with the
|
|
169
|
+
// assistant role on those routes only; a worker has no role and no credential (its environment is stripped).
|
|
170
|
+
if (role === 'assistant' && path.startsWith('/api/assistant/')) {
|
|
171
|
+
const credential = callerBrainCredential();
|
|
172
|
+
if (credential) headers['X-Synabun-Brain-Token'] = credential;
|
|
173
|
+
}
|
|
166
174
|
headers['X-Synabun-Request-Id'] = requestId;
|
|
167
175
|
headers['X-Synabun-Deadline'] = String(deadline);
|
|
168
176
|
// Lets the server refuse advisory payloads and auto-heal for a batch step on its own authority.
|
|
169
177
|
if (batchContext.getStore()) headers['X-Synabun-Batch'] = '1';
|
|
170
|
-
// One request's own headers (whatsappSendFile's brain credential):
|
|
178
|
+
// One request's own headers (whatsappSendFile's brain credential, the skills requests'): sent on that request only.
|
|
171
179
|
for (const [name, value] of Object.entries(extraHeaders)) if (value) headers[name] = value;
|
|
172
180
|
const opts: RequestInit = {
|
|
173
181
|
method,
|
|
@@ -278,37 +286,74 @@ async function request(
|
|
|
278
286
|
}
|
|
279
287
|
|
|
280
288
|
/**
|
|
281
|
-
* Best-effort reconciliation for an MCP
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
289
|
+
* Best-effort reconciliation for an MCP runtime that changed its own tools
|
|
290
|
+
* (tool_groups). Only runtimes SynaBun launched carry a terminal pin (the
|
|
291
|
+
* stdio child's SYNABUN_TERMINAL_SESSION, an HTTP session's X-Synabun-Terminal);
|
|
292
|
+
* any other runtime stays local without contacting the Neural Interface, which
|
|
293
|
+
* derives the owning runtime from that pin and never from the body.
|
|
285
294
|
*/
|
|
286
|
-
export type
|
|
295
|
+
export type RuntimeToolsReport = {
|
|
287
296
|
reported: boolean;
|
|
288
297
|
hostRefresh: 'scheduled' | 'notification' | 'not-needed' | 'unavailable';
|
|
289
|
-
runtimeKind?: 'opencode' | 'codex' | 'loop';
|
|
298
|
+
runtimeKind?: 'opencode' | 'codex' | 'loop' | 'channel';
|
|
290
299
|
correlationId?: string;
|
|
300
|
+
/** The route that took it: runtime-profile is a Neural Interface from before tool lists. */
|
|
301
|
+
route?: 'runtime-tools' | 'runtime-profile';
|
|
291
302
|
error?: string;
|
|
292
303
|
};
|
|
293
304
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
): Promise<
|
|
298
|
-
|
|
305
|
+
const RUNTIME_REPORT_TIMEOUT = 2_000;
|
|
306
|
+
|
|
307
|
+
/** One report: its status and its JSON body, or null for a body that is not JSON (a route the server does not have). */
|
|
308
|
+
async function postRuntimeReport(path: string, body: Record<string, unknown>): Promise<{ status: number; json: NiResponse | null; error?: string }> {
|
|
309
|
+
const controller = new AbortController();
|
|
310
|
+
const timer = setTimeout(() => controller.abort(), RUNTIME_REPORT_TIMEOUT);
|
|
311
|
+
try {
|
|
312
|
+
const headers: Record<string, string> = { 'Content-Type': 'application/json', 'X-Synabun-Terminal': terminalIdFor(getIdentity()) };
|
|
313
|
+
const role = callerRole();
|
|
314
|
+
if (role) headers['X-Synabun-Role'] = role;
|
|
315
|
+
const res = await fetch(`${BASE_URL}${path}`, { method: 'POST', headers, body: JSON.stringify(body), signal: controller.signal });
|
|
316
|
+
const text = await res.text();
|
|
317
|
+
let json: NiResponse | null = null;
|
|
318
|
+
try {
|
|
319
|
+
const parsed = JSON.parse(text);
|
|
320
|
+
json = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed as NiResponse : null;
|
|
321
|
+
} catch { /* not JSON */ }
|
|
322
|
+
return { status: res.status, json };
|
|
323
|
+
} catch (err) {
|
|
324
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
325
|
+
return { status: 0, json: null, error: controller.signal.aborted ? `Runtime tools report timed out after ${RUNTIME_REPORT_TIMEOUT}ms` : `Neural Interface unreachable: ${msg}` };
|
|
326
|
+
} finally {
|
|
327
|
+
clearTimeout(timer);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export async function reportRuntimeTools(
|
|
332
|
+
groups: readonly string[],
|
|
333
|
+
options: { mode: 'strict' | 'focus'; legacyProfile: string; refresh?: 'in-band' },
|
|
334
|
+
): Promise<RuntimeToolsReport> {
|
|
335
|
+
if (!effectivePins(getIdentity()).terminalSessionId) {
|
|
299
336
|
return { reported: false, hostRefresh: 'notification' };
|
|
300
337
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
if (
|
|
338
|
+
let route: 'runtime-tools' | 'runtime-profile' = 'runtime-tools';
|
|
339
|
+
let answer = await postRuntimeReport('/api/mcp/runtime-tools', { tools: [...groups], mode: options.mode, ...(options.refresh ? { refresh: options.refresh } : {}) });
|
|
340
|
+
// A Neural Interface from before tool lists has no such route (its 404 is not JSON); its own route takes the
|
|
341
|
+
// old shape. Its runtime-profile 404 for a runtime that is gone is JSON, so it is never retried.
|
|
342
|
+
if (answer.status === 404 && !answer.json) {
|
|
343
|
+
route = 'runtime-profile';
|
|
344
|
+
answer = await postRuntimeReport('/api/mcp/runtime-profile', {
|
|
345
|
+
profile: options.legacyProfile,
|
|
346
|
+
catalogMode: options.mode === 'focus' ? 'deferred' : 'profiled',
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
const result = answer.json;
|
|
350
|
+
if (result?.ok && answer.status >= 200 && answer.status < 300) {
|
|
306
351
|
const hostRefresh = result.hostRefresh === 'scheduled'
|
|
307
352
|
|| result.hostRefresh === 'notification'
|
|
308
353
|
|| result.hostRefresh === 'not-needed'
|
|
309
354
|
? result.hostRefresh
|
|
310
355
|
: 'unavailable';
|
|
311
|
-
const runtimeKind = result.runtimeKind === 'opencode' || result.runtimeKind === 'codex' || result.runtimeKind === 'loop'
|
|
356
|
+
const runtimeKind = result.runtimeKind === 'opencode' || result.runtimeKind === 'codex' || result.runtimeKind === 'loop' || result.runtimeKind === 'channel'
|
|
312
357
|
? result.runtimeKind
|
|
313
358
|
: undefined;
|
|
314
359
|
return {
|
|
@@ -316,12 +361,14 @@ export async function reportRuntimeMcpProfile(
|
|
|
316
361
|
hostRefresh,
|
|
317
362
|
runtimeKind,
|
|
318
363
|
correlationId: typeof result.correlationId === 'string' ? result.correlationId : undefined,
|
|
364
|
+
route,
|
|
319
365
|
};
|
|
320
366
|
}
|
|
321
367
|
return {
|
|
322
368
|
reported: false,
|
|
323
369
|
hostRefresh: 'unavailable',
|
|
324
|
-
|
|
370
|
+
route,
|
|
371
|
+
error: typeof result?.error === 'string' ? result.error : (answer.error || `Runtime tools report failed (HTTP ${answer.status})`),
|
|
325
372
|
};
|
|
326
373
|
}
|
|
327
374
|
|
|
@@ -1342,12 +1389,25 @@ export async function moreloginUseDefault(envId: string | null): Promise<NiRespo
|
|
|
1342
1389
|
return request('POST', '/api/morelogin/use-default', envId ? { envId } : { clear: true });
|
|
1343
1390
|
}
|
|
1344
1391
|
|
|
1392
|
+
// ── Skills (the role-gated `skills` tool group) ──
|
|
1393
|
+
// One thin call over /api/skills-studio/v2 (neural-interface/lib/skills/api-v2.js, creation-api.js), which owns every
|
|
1394
|
+
// rule: an agent reads, drafts, checks and submits for review; installing and approving are the owner's, from the
|
|
1395
|
+
// app's own page, and the routes refuse them to a request that carries the agent headers requestOnce sends. The
|
|
1396
|
+
// caller's brain credential (identity.ts callerBrainCredential: its own request's over HTTP, SYNABUN_BRAIN_TOKEN for a
|
|
1397
|
+
// stdio child) rides along: the server knows the Assistant by it (AI drafting needs it), never by X-Synabun-Role.
|
|
1398
|
+
|
|
1399
|
+
export async function skillsV2(method: 'GET' | 'POST' | 'PATCH', path: string, body?: Record<string, unknown>, timeout = LONG_TIMEOUT): Promise<NiResponse> {
|
|
1400
|
+
const credential = callerBrainCredential();
|
|
1401
|
+
return requestOnce(method, `/api/skills-studio/v2${path}`, body, timeout, credential ? { 'X-Synabun-Brain-Token': credential } : {});
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1345
1404
|
// ── SynaBun assistant orchestration (role-gated `agents` tool group) ──
|
|
1346
1405
|
// Thin proxies over /api/assistant/* (neural-interface/lib/assistant-api.js),
|
|
1347
1406
|
// which owns dispatch state, rails and authorization. requestOnce already
|
|
1348
1407
|
// sends X-Synabun-Terminal (the assistant pin) and X-Synabun-Role.
|
|
1349
1408
|
|
|
1350
|
-
|
|
1409
|
+
/** A worker provider (each one can be the Assistant's brain too; 'antigravity' runs both over ACP). */
|
|
1410
|
+
export type AssistantProvider = 'claude-code' | 'codex' | 'opencode' | 'antigravity';
|
|
1351
1411
|
|
|
1352
1412
|
export type AssistantDispatchBody = {
|
|
1353
1413
|
/** Optional when routeId names an approved route (the server applies it). */
|
|
@@ -1357,7 +1417,7 @@ export type AssistantDispatchBody = {
|
|
|
1357
1417
|
assistantSessionId: string;
|
|
1358
1418
|
model?: string;
|
|
1359
1419
|
effort?: string;
|
|
1360
|
-
|
|
1420
|
+
tools?: string[];
|
|
1361
1421
|
routeId?: string;
|
|
1362
1422
|
taskClass?: string;
|
|
1363
1423
|
confidence?: number;
|