synabun 2.0.0 → 2.0.7
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 +97 -0
- package/NOTICE +5 -0
- package/README.md +2 -1
- package/THIRD-PARTY-LICENSES.md +59 -0
- package/benchmarks/fixtures/browser/README.md +1 -1
- package/benchmarks/fixtures/desktop/README.md +1 -1
- package/docs/whatsapp.md +153 -18
- package/hooks/claude-code/pre-compact.mjs +11 -0
- package/hooks/claude-code/prompt-submit.mjs +60 -184
- package/hooks/claude-code/session-start.mjs +73 -16
- package/hooks/claude-code/shared.mjs +26 -3
- package/hooks/claude-code/stop.mjs +5 -5
- package/lib/child-path.js +303 -0
- package/lib/claude-hooks.js +2 -1
- package/lib/data-home-migration.js +2 -0
- package/lib/desktop-app.js +265 -0
- package/lib/external-tools.js +7 -3
- package/lib/log-redact.js +102 -0
- package/lib/packaged-runtime.js +138 -11
- package/lib/start-launcher.js +88 -1
- package/mcp-server/dist/http.d.ts +3 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +15 -4
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +9 -6
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/budget-judgments.js +153 -0
- package/mcp-server/dist/services/budget-judgments.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +41 -4
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/identity.d.ts +11 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -1
- package/mcp-server/dist/services/identity.js +24 -0
- package/mcp-server/dist/services/identity.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +13 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +34 -2
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
- package/mcp-server/dist/services/typesafe-config.js +4 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -7
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +34 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
- package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
- package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
- package/mcp-server/dist/tui.js +2 -1
- package/mcp-server/dist/tui.js.map +1 -1
- package/mcp-server/dist/version.d.ts +5 -0
- package/mcp-server/dist/version.d.ts.map +1 -0
- package/mcp-server/dist/version.js +21 -0
- package/mcp-server/dist/version.js.map +1 -0
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -3
- package/mcp-server/run.mjs +15 -9
- package/mcp-server/src/http.ts +18 -3
- package/mcp-server/src/index.ts +9 -6
- package/mcp-server/src/services/budget-judgments.ts +183 -0
- package/mcp-server/src/services/codex-config-heal.ts +35 -4
- package/mcp-server/src/services/identity.ts +27 -0
- package/mcp-server/src/services/neural-interface.ts +34 -2
- package/mcp-server/src/services/typesafe-config.ts +4 -1
- package/mcp-server/src/tools/agents.ts +33 -14
- package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
- package/mcp-server/src/tui.ts +2 -1
- package/mcp-server/src/version.ts +22 -0
- package/neural-interface/i18n/en.json +2126 -209
- package/neural-interface/i18n/pt-BR.json +2123 -207
- package/neural-interface/lib/account-usage.js +163 -0
- package/neural-interface/lib/assistant-api.js +316 -57
- package/neural-interface/lib/assistant-brains/claude.js +19 -2
- package/neural-interface/lib/assistant-brains/codex.js +3 -0
- package/neural-interface/lib/assistant-brains/opencode.js +17 -4
- package/neural-interface/lib/assistant-budget-planner.js +390 -0
- package/neural-interface/lib/assistant-budget-split.js +408 -0
- package/neural-interface/lib/assistant-budget.js +94 -95
- package/neural-interface/lib/assistant-catalog.js +179 -27
- package/neural-interface/lib/assistant-config.js +91 -14
- package/neural-interface/lib/assistant-dispatch.js +494 -138
- package/neural-interface/lib/assistant-hidden-models.js +393 -66
- package/neural-interface/lib/assistant-jev.js +26 -3
- package/neural-interface/lib/assistant-memory.js +24 -10
- package/neural-interface/lib/assistant-persona.js +73 -12
- package/neural-interface/lib/assistant-plan-permissions.js +8 -1
- package/neural-interface/lib/assistant-pricing.js +21 -6
- package/neural-interface/lib/assistant-route-accounts.js +14 -0
- package/neural-interface/lib/assistant-route-gate.js +19 -3
- package/neural-interface/lib/assistant-router.js +373 -42
- package/neural-interface/lib/assistant-runtime.js +488 -59
- package/neural-interface/lib/assistant-task-prompt.js +13 -3
- package/neural-interface/lib/assistant-test-density.js +142 -0
- package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
- package/neural-interface/lib/assistant-user-context.js +908 -0
- package/neural-interface/lib/assistant-user-knowledge.js +328 -0
- package/neural-interface/lib/assistant-user-learn.js +404 -0
- package/neural-interface/lib/assistant-user-threads.js +226 -0
- package/neural-interface/lib/assistant-user-writer.js +183 -0
- package/neural-interface/lib/augmented-path.js +317 -53
- package/neural-interface/lib/browser-background-tab.js +134 -0
- package/neural-interface/lib/browser-screenshot.js +678 -61
- package/neural-interface/lib/claude-accounts.js +342 -31
- package/neural-interface/lib/claude-agent-bridge.js +123 -9
- package/neural-interface/lib/claude-executable.js +6 -1
- package/neural-interface/lib/claude-model-catalog.js +33 -5
- package/neural-interface/lib/claude-panel-auth.js +221 -0
- package/neural-interface/lib/claude-profile-api-key.js +62 -0
- package/neural-interface/lib/claude-temporary.js +46 -7
- package/neural-interface/lib/cli-install-api.js +137 -0
- package/neural-interface/lib/cli-install.js +797 -0
- package/neural-interface/lib/cli-path.js +130 -0
- package/neural-interface/lib/cli-resolver.js +744 -0
- package/neural-interface/lib/cli-update-planner.js +143 -7
- package/neural-interface/lib/cloudflared/install.js +533 -0
- package/neural-interface/lib/cloudflared/manager.js +545 -0
- package/neural-interface/lib/cloudflared/pins.js +115 -0
- package/neural-interface/lib/cloudflared/pins.json +63 -0
- package/neural-interface/lib/cloudflared/tunnel.js +265 -0
- package/neural-interface/lib/codex-account-auth.js +178 -0
- package/neural-interface/lib/codex-accounts.js +489 -0
- package/neural-interface/lib/codex-capabilities.js +2 -1
- package/neural-interface/lib/codex-compat-rpc.js +8 -2
- package/neural-interface/lib/codex-mcp-approvals.js +5 -1
- package/neural-interface/lib/codex-panel-auth.js +62 -0
- package/neural-interface/lib/codex-session-settings.js +1 -1
- package/neural-interface/lib/codex-settings-schema.js +120 -0
- package/neural-interface/lib/desktop/config.js +3 -0
- package/neural-interface/lib/editor-completion-endpoint.js +264 -0
- package/neural-interface/lib/editor-completion-opencode.js +436 -0
- package/neural-interface/lib/editor-completion.js +714 -0
- package/neural-interface/lib/editor-config.js +149 -0
- package/neural-interface/lib/editor-files-api.js +268 -0
- package/neural-interface/lib/editor-git-api.js +134 -0
- package/neural-interface/lib/file-explorer-api.js +1039 -0
- package/neural-interface/lib/file-explorer-system.js +355 -0
- package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
- package/neural-interface/lib/file-explorer-watch.js +239 -0
- package/neural-interface/lib/git-bash/bzip2.js +339 -0
- package/neural-interface/lib/git-bash/claude-settings.js +73 -0
- package/neural-interface/lib/git-bash/extract-worker.js +34 -0
- package/neural-interface/lib/git-bash/install.js +529 -0
- package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
- package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
- package/neural-interface/lib/git-bash/manager.js +268 -0
- package/neural-interface/lib/git-bash/pins.js +206 -0
- package/neural-interface/lib/git-bash/pins.json +34 -0
- package/neural-interface/lib/git-bash/resolver.js +194 -0
- package/neural-interface/lib/git-diff-api.js +103 -0
- package/neural-interface/lib/git-read.js +234 -0
- package/neural-interface/lib/greeting/api.js +89 -0
- package/neural-interface/lib/greeting/budgets.js +90 -0
- package/neural-interface/lib/greeting/engine.js +461 -0
- package/neural-interface/lib/greeting/facts.js +320 -0
- package/neural-interface/lib/greeting/sources.js +252 -0
- package/neural-interface/lib/greeting/writer.js +139 -0
- package/neural-interface/lib/http-guards.js +189 -13
- package/neural-interface/lib/install-details.js +145 -0
- package/neural-interface/lib/machine-names.js +88 -0
- package/neural-interface/lib/mcp-installer.js +14 -2
- package/neural-interface/lib/memory-api.js +31 -7
- package/neural-interface/lib/native-loop-providers.js +26 -8
- package/neural-interface/lib/native-loop-runtime.js +9 -4
- package/neural-interface/lib/os-path.js +319 -0
- package/neural-interface/lib/plugin-installer.js +4 -2
- package/neural-interface/lib/project-storage.js +5 -7
- package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
- package/neural-interface/lib/provider-panel-terminal-auth.js +95 -0
- package/neural-interface/lib/pty-host/core.js +2 -1
- package/neural-interface/lib/pty-host/manager.js +27 -2
- package/neural-interface/lib/remote-policy.js +20 -11
- package/neural-interface/lib/request-gate.js +589 -0
- package/neural-interface/lib/session-title-generator.js +4 -3
- package/neural-interface/lib/system-about.js +340 -0
- package/neural-interface/lib/system-activity.js +66 -0
- package/neural-interface/lib/terminal-env.js +11 -3
- package/neural-interface/lib/terminal-path.js +55 -0
- package/neural-interface/lib/ui-blob-api.js +108 -0
- package/neural-interface/lib/ui-blob-store.js +68 -0
- package/neural-interface/lib/virtual-socket.js +12 -1
- package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
- package/neural-interface/lib/whatsapp/bridge.js +78 -34
- package/neural-interface/lib/whatsapp/commands.js +13 -14
- package/neural-interface/lib/whatsapp/config.js +134 -20
- package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
- package/neural-interface/lib/whatsapp/host-core.js +168 -35
- package/neural-interface/lib/whatsapp/inbound.js +5 -3
- package/neural-interface/lib/whatsapp/local-file.js +524 -0
- package/neural-interface/lib/whatsapp/manager.js +92 -32
- package/neural-interface/lib/whatsapp/paths.js +11 -1
- package/neural-interface/lib/whatsapp/protocol.js +65 -5
- package/neural-interface/lib/whatsapp/redact.js +63 -0
- package/neural-interface/lib/whatsapp/service.js +343 -91
- package/neural-interface/lib/whatsapp/transcription.js +463 -0
- package/neural-interface/package-lock.json +701 -2
- package/neural-interface/package.json +13 -2
- package/neural-interface/public/index.html +2 -0
- package/neural-interface/public/index2d.html +2 -0
- package/neural-interface/public/install-app.html +9 -6
- package/neural-interface/public/offline.html +19 -3
- package/neural-interface/public/onboarding.html +107 -2
- package/neural-interface/public/shared/account-i18n.js +7 -0
- package/neural-interface/public/shared/account-menu.js +539 -0
- package/neural-interface/public/shared/account-usage.js +19 -0
- package/neural-interface/public/shared/account-view.js +335 -0
- package/neural-interface/public/shared/agent-runtime-options.js +50 -14
- package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
- package/neural-interface/public/shared/assistant/asst-api.js +32 -2
- package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +430 -81
- package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
- package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
- package/neural-interface/public/shared/assistant/asst-mascot.js +140 -61
- package/neural-interface/public/shared/assistant/asst-menu.js +27 -11
- package/neural-interface/public/shared/assistant/asst-panel.js +198 -42
- package/neural-interface/public/shared/assistant/asst-render.js +197 -23
- package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
- package/neural-interface/public/shared/assistant/asst-route.js +95 -343
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +534 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
- package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
- package/neural-interface/public/shared/assistant/asst-state.js +186 -2
- package/neural-interface/public/shared/assistant/asst-styles.js +247 -11
- package/neural-interface/public/shared/blob-store.js +111 -22
- package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
- package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
- package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +80 -118
- package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
- package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +164 -107
- package/neural-interface/public/shared/cdx/cdx-tabs.js +348 -668
- package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
- package/neural-interface/public/shared/claude-account-view.js +3 -0
- package/neural-interface/public/shared/cli-install-view.js +392 -0
- package/neural-interface/public/shared/cli-status.js +282 -22
- package/neural-interface/public/shared/constants.js +6 -1
- package/neural-interface/public/shared/cp/cp-events.js +2 -1
- package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
- package/neural-interface/public/shared/cp/cp-styles.js +61 -0
- package/neural-interface/public/shared/desktop-bridge.js +39 -0
- package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
- package/neural-interface/public/shared/desktop-titlebar.js +153 -0
- package/neural-interface/public/shared/desktop-update-view.js +462 -0
- package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
- package/neural-interface/public/shared/editor/editor-ai.js +619 -0
- package/neural-interface/public/shared/editor/editor-commands.js +212 -0
- package/neural-interface/public/shared/editor/editor-compare.js +103 -0
- package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
- package/neural-interface/public/shared/editor/editor-doc.js +257 -0
- package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
- package/neural-interface/public/shared/editor/editor-git.js +95 -0
- package/neural-interface/public/shared/editor/editor-languages.js +156 -0
- package/neural-interface/public/shared/editor/editor-lint.js +229 -0
- package/neural-interface/public/shared/editor/editor-loader.js +51 -0
- package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
- package/neural-interface/public/shared/editor/editor-menu.js +233 -0
- package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
- package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
- package/neural-interface/public/shared/editor/editor-palette.js +125 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
- package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
- package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
- package/neural-interface/public/shared/editor/editor-safety.js +500 -0
- package/neural-interface/public/shared/editor/editor-search.js +352 -0
- package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
- package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
- package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
- package/neural-interface/public/shared/editor/editor-theme.js +244 -0
- package/neural-interface/public/shared/editor/editor-view.js +332 -0
- package/neural-interface/public/shared/explorer/fx-api.js +216 -0
- package/neural-interface/public/shared/explorer/fx-links.js +204 -0
- package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
- package/neural-interface/public/shared/explorer/fx-main.js +865 -0
- package/neural-interface/public/shared/explorer/fx-names.js +87 -0
- package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
- package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
- package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
- package/neural-interface/public/shared/file-links.js +339 -0
- package/neural-interface/public/shared/git-bash-view.js +145 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
- package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
- package/neural-interface/public/shared/html-shell.js +161 -165
- package/neural-interface/public/shared/i18n.js +19 -1
- package/neural-interface/public/shared/install-details-view.js +86 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +131 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +22 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +158 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
- package/neural-interface/public/shared/pwa-install-page.js +32 -2
- package/neural-interface/public/shared/pwa-install.css +3 -3
- package/neural-interface/public/shared/pwa-install.js +100 -1
- package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
- package/neural-interface/public/shared/settings/settings-about.js +254 -0
- package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
- package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
- package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
- package/neural-interface/public/shared/settings/settings-ia.js +33 -4
- package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
- package/neural-interface/public/shared/showcase-privacy.js +489 -0
- package/neural-interface/public/shared/start-bridge.js +238 -19
- package/neural-interface/public/shared/storage.js +30 -3
- package/neural-interface/public/shared/styles.css +1710 -770
- package/neural-interface/public/shared/synabun-mascot.js +68 -58
- package/neural-interface/public/shared/tunnel-view.js +167 -0
- package/neural-interface/public/shared/ui-claude-panel.js +369 -229
- package/neural-interface/public/shared/ui-cli-banner.js +355 -0
- package/neural-interface/public/shared/ui-detail.js +15 -0
- package/neural-interface/public/shared/ui-explorer.js +22 -0
- package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
- package/neural-interface/public/shared/ui-file-links.js +103 -0
- package/neural-interface/public/shared/ui-git-bash.js +124 -0
- package/neural-interface/public/shared/ui-help.js +26 -0
- package/neural-interface/public/shared/ui-invite.js +126 -116
- package/neural-interface/public/shared/ui-judgments.js +10 -1
- package/neural-interface/public/shared/ui-keybinds.js +4 -0
- package/neural-interface/public/shared/ui-loading.js +187 -19
- package/neural-interface/public/shared/ui-menubar.js +25 -33
- package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
- package/neural-interface/public/shared/ui-navbar.js +48 -22
- package/neural-interface/public/shared/ui-provider-auth.js +104 -0
- package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
- package/neural-interface/public/shared/ui-sessions.js +9 -3
- package/neural-interface/public/shared/ui-settings.js +509 -490
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
- package/neural-interface/public/shared/ui-sync.js +22 -0
- package/neural-interface/public/shared/ui-terminal.js +40 -5
- package/neural-interface/public/shared/ui-tool-updates.js +5 -0
- package/neural-interface/public/shared/ui-tunnel.js +130 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
- package/neural-interface/public/shared/ui-update.js +594 -5
- package/neural-interface/public/shared/ui-whatsapp.js +21 -6
- package/neural-interface/public/shared/ui-whiteboard.js +12 -0
- package/neural-interface/public/shared/ui-worker-end.js +245 -0
- package/neural-interface/public/shared/ui-workspaces.js +41 -27
- package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
- package/neural-interface/public/shared/worker-end.js +253 -0
- package/neural-interface/public/sw.js +2 -2
- package/neural-interface/public/variant/2d/main.js +10 -1
- package/neural-interface/public/variant/3d/main.js +10 -1
- package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
- package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
- package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
- package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
- package/neural-interface/scripts/build-vendor.mjs +78 -2
- package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
- package/neural-interface/server.js +2085 -1629
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/package.json +5 -8
- package/setup.js +53 -15
- package/benchmarks/browser-live-results.json +0 -79
- package/benchmarks/browser-v2-results.json +0 -258
- package/neural-interface/lib/codex-capabilities.d.ts +0 -41
- package/neural-interface/public/category-logos/claude.svg +0 -1
- package/neural-interface/public/category-logos/gemini-color.svg +0 -1
- package/neural-interface/public/category-logos/openai.svg +0 -1
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +0 -1
- package/neural-interface/public/gallery.svg +0 -6
- package/neural-interface/public/leonardoai.svg +0 -1
- package/neural-interface/public/mcp.svg +0 -4
- package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
- package/neural-interface/public/pin-svgrepo-com.svg +0 -25
- package/neural-interface/public/sessionicon.svg +0 -8
- package/neural-interface/public/toolbar-album.svg +0 -8
- package/neural-interface/public/toolbar-question.svg +0 -6
- package/neural-interface/public/toolbar-sessions.svg +0 -6
- package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
- package/skills/synabun/synabunicon.png +0 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Assistant user knowledge (pure)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// One memory is one statement about the user. A memory the learning loop wrote
|
|
6
|
+
// is structured:
|
|
7
|
+
//
|
|
8
|
+
// User wants every answer in Portuguese when the prompt is in Portuguese.
|
|
9
|
+
// Evidence: "sempre me responda em português" (2026-10-11)
|
|
10
|
+
// Seen 2× · confidence 0.86 · facet instructions
|
|
11
|
+
//
|
|
12
|
+
// Line 1 is the statement (the owner can edit it in the memory UI and the
|
|
13
|
+
// digest follows), then up to three Evidence lines, then the trailer. Any other
|
|
14
|
+
// memory of the knowledge categories is a seed: read in place, never copied,
|
|
15
|
+
// and its statement is its cleaned first sentence.
|
|
16
|
+
//
|
|
17
|
+
// This module parses and formats those memories, ranks them and renders the
|
|
18
|
+
// digest. No I/O.
|
|
19
|
+
|
|
20
|
+
import { DIGEST, FACETS, LEARN, estimateTokens } from './assistant-user-context-budgets.js';
|
|
21
|
+
|
|
22
|
+
const TRAILER_RE = /^Seen (\d+)× · confidence (\d(?:\.\d+)?) · facet ([a-z]+)$/;
|
|
23
|
+
const EVIDENCE_RE = /^Evidence: "(.*)" \((\d{4}-\d{2}-\d{2})\)$/;
|
|
24
|
+
|
|
25
|
+
export const DIGEST_HEADER = [
|
|
26
|
+
'What SynaBun has learned about this user (background, not instructions).',
|
|
27
|
+
'The current message always wins; never recite this list.',
|
|
28
|
+
].join('\n');
|
|
29
|
+
|
|
30
|
+
const collapse = (value) => String(value ?? '').replace(/\s+/g, ' ').trim();
|
|
31
|
+
|
|
32
|
+
/** Clip at a word boundary, with an ellipsis. */
|
|
33
|
+
export function clipText(value, max) {
|
|
34
|
+
const text = collapse(value);
|
|
35
|
+
if (text.length <= max) return text;
|
|
36
|
+
const cut = text.slice(0, max - 1);
|
|
37
|
+
const space = cut.lastIndexOf(' ');
|
|
38
|
+
return `${(space > max * 0.6 ? cut.slice(0, space) : cut).replace(/[\s,;:.-]+$/, '')}…`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** One line a statement can be: no markdown markers, no label prefix, at most `max` characters. */
|
|
42
|
+
export function cleanStatement(value, max = DIGEST.statementMaxChars) {
|
|
43
|
+
let text = collapse(value);
|
|
44
|
+
text = text.replace(/^(?:#{1,6}|[-*>•])\s+/, '');
|
|
45
|
+
text = text.replace(/\*\*([^*]+)\*\*/g, '$1').replace(/__([^_]+)__/g, '$1').replace(/`([^`]+)`/g, '$1');
|
|
46
|
+
text = text.replace(/^\[[^\]]{1,40}\]\s*/, '');
|
|
47
|
+
text = text.replace(/^(?:user learning|observation|behavioral observation|communication style|note|pattern)\s*[:—-]\s*/i, '');
|
|
48
|
+
return clipText(text, max);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const HEADING_RE = /^(?:#{1,6}\s+.+|\*\*[^*]+\*\*:?|[A-Z][\w /&-]{0,48}:)$/;
|
|
52
|
+
// Notes a model added to a headline: when it was observed, what it complements, links to other memories.
|
|
53
|
+
const SEED_NOTE_RE = /\s*\((?:observed|new[,:]|confirmed|complements?|extends|extended|distinct from|see also|cf\.|session\b|\d{4}-\d{2}-\d{2})(?:[^()]|\([^()]*\))*\)/gi;
|
|
54
|
+
const MEMORY_LINK_RE = /\s*\[\[[^\]]*\]\]/g;
|
|
55
|
+
// An upper-case label in front of an ordinary sentence ("DECISION APPETITE — takes full scope…").
|
|
56
|
+
const SEED_LABEL_RE = /^[\p{Lu}\p{N}][\p{Lu}\p{N} ,+&/'"“”().-]{5,90}?\s*[:—–]\s+(?=\p{Ll}|\p{Lu}\p{Ll}|\p{Lu}\s+\p{Ll})/u;
|
|
57
|
+
// A full stop after one of these does not end a sentence.
|
|
58
|
+
const ABBREVIATION_RE = /(?:^|[\s(])(?:e\.g|i\.e|vs|etc|cf|approx|ex|p\.ex|no|nr|v)\.$/i;
|
|
59
|
+
|
|
60
|
+
/** Where the first sentence of `text` ends (the index after its full stop), or -1: never inside a parenthesis or after an abbreviation. */
|
|
61
|
+
function firstSentenceEnd(text) {
|
|
62
|
+
for (const match of text.matchAll(/[.!?](?=\s+[\p{Lu}"'“(\[])/gu)) {
|
|
63
|
+
const head = text.slice(0, match.index + 1);
|
|
64
|
+
if (match.index < 12 || ABBREVIATION_RE.test(head)) continue;
|
|
65
|
+
if ((head.match(/\(/g) || []).length !== (head.match(/\)/g) || []).length) continue;
|
|
66
|
+
return match.index + 1;
|
|
67
|
+
}
|
|
68
|
+
return -1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function upperShare(text) {
|
|
72
|
+
const letters = String(text).match(/\p{L}/gu) || [];
|
|
73
|
+
if (letters.length < 8) return 0;
|
|
74
|
+
return letters.filter((ch) => ch !== ch.toLowerCase()).length / letters.length;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Short words written in capitals for emphasis, not acronyms.
|
|
78
|
+
const CAPS_WORDS = new Set('A AN AND ANY ALL ARE AS AT BE BUT BY DO FOR GO HE HER HIS HOW IF IN IS IT ME MY NEW NO NOT NOW OF OLD ON ONE ONLY OR OUR OUT SHE SO THE TO TWO UP WAS WE WHO WHY WITH YES YOU COM DE DO EM NAO NÃO OU POR QUE SEM SIM UM UMA'.split(' '));
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Words to keep as written when a shouted headline is lower-cased: names, CamelCase and acronyms
|
|
82
|
+
* the memory uses in its ordinary sentences (a part written in capitals teaches nothing).
|
|
83
|
+
*/
|
|
84
|
+
function properWords(content) {
|
|
85
|
+
const keep = new Map();
|
|
86
|
+
const add = (word) => { const key = word.toLowerCase(); if (!keep.has(key)) keep.set(key, word); };
|
|
87
|
+
for (const part of String(content ?? '').split(/[.!?;:()"“”\n—–]+/)) {
|
|
88
|
+
if (upperShare(part) >= 0.5) continue;
|
|
89
|
+
const plainWords = (part.match(/(?<![\p{L}\p{N}])\p{Ll}{3,}(?![\p{L}\p{N}])/gu) || []).length;
|
|
90
|
+
for (const [word] of part.matchAll(/[\p{L}\p{N}]+/gu)) {
|
|
91
|
+
if (/^\p{Lu}{2,4}$/u.test(word)) { if (plainWords >= 3 && !CAPS_WORDS.has(word)) add(word); } // an acronym among ordinary words
|
|
92
|
+
else if (/\p{Ll}/u.test(word) && /\p{Lu}/u.test(word.slice(1))) add(word); // inner capitals
|
|
93
|
+
}
|
|
94
|
+
for (const [, word] of part.matchAll(/[\p{Ll},] (\p{Lu}\p{Ll}+)/gu)) add(word); // a capital in mid-sentence
|
|
95
|
+
}
|
|
96
|
+
return keep;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** A shouted sentence in sentence case, names and acronyms restored. */
|
|
100
|
+
function sentenceCase(text, keep) {
|
|
101
|
+
const lowered = text.toLowerCase().replace(/[\p{L}\p{N}]+/gu, (word) => keep.get(word) || (word === 'i' ? 'I' : word));
|
|
102
|
+
return lowered.replace(/^([^\p{L}]*)(\p{L})/u, (_, lead, ch) => lead + ch.toUpperCase());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* A seed's statement: its cleaned first sentence. A bare heading line is skipped when text follows
|
|
107
|
+
* it; "(observed …)" notes and [[links]] go; an upper-case label in front of an ordinary sentence
|
|
108
|
+
* goes; a sentence written in capitals is put in sentence case. The memory itself is never edited.
|
|
109
|
+
*/
|
|
110
|
+
export function seedStatement(content, max = DIGEST.statementMaxChars) {
|
|
111
|
+
const lines = String(content ?? '').split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
112
|
+
if (!lines.length) return '';
|
|
113
|
+
let first = lines[0];
|
|
114
|
+
if (lines.length > 1 && HEADING_RE.test(first) && first.split(/\s+/).length <= 8) first = lines[1];
|
|
115
|
+
first = cleanStatement(first.replace(MEMORY_LINK_RE, '').replace(SEED_NOTE_RE, ''), 2000).replace(SEED_LABEL_RE, '');
|
|
116
|
+
// The first sentence: up to a full stop, question or exclamation mark followed by a space and a capital.
|
|
117
|
+
const end = firstSentenceEnd(first);
|
|
118
|
+
let sentence = (end > 0 ? first.slice(0, end) : first).trim();
|
|
119
|
+
// A parenthesis that never closes on this line (its note runs on): the words before it are the statement.
|
|
120
|
+
const open = sentence.lastIndexOf('(');
|
|
121
|
+
if (open > 12 && sentence.indexOf(')', open) < 0) sentence = sentence.slice(0, open).replace(/[\s,;:—–-]+$/, '');
|
|
122
|
+
if (upperShare(sentence) >= 0.7) sentence = sentenceCase(sentence, properWords(content));
|
|
123
|
+
else sentence = sentence.replace(/^(\p{Ll})/u, (ch) => ch.toUpperCase());
|
|
124
|
+
return clipText(sentence, max);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Lexical facet guess for seeds, which carry none. Order matters: the first rule that matches wins.
|
|
128
|
+
const FACET_RULES = [
|
|
129
|
+
['corrections', /\b(?:correct(?:s|ed|ion)?|frustrat\w*|complain\w*|push(?:es|ed)? back|annoy\w*|stop(?:s|ped)? (?:doing|adding)|corrig\w*|reclam\w*)\b/i],
|
|
130
|
+
['rules', /\b(?:always|never|must(?: not)?|do not|don't|forbidden|rule|required|mandatory|sempre|nunca|jamais|regra|obrigat\w+|proibid\w+)\b/i],
|
|
131
|
+
['decisions', /\b(?:decid\w*|chose|chosen|picks?|picked|settled|approved|agreed|opt(?:s|ed) for|decis\w*|escolh\w*|aprov\w*)\b/i],
|
|
132
|
+
['expertise', /\b(?:expert\w*|senior|experienced|knows|familiar|background|fluent|proficient|engineer|developer|conhece|experiente|especialista)\b/i],
|
|
133
|
+
['goals', /\b(?:goal|aims?|wants to (?:build|ship|grow|launch)|roadmap|vision|objective|objetivo|meta|pretende)\b/i],
|
|
134
|
+
['instructions', /\b(?:instruct\w*|asks?|requests?|tells?|multi-part|step by step|format|language|respond\w*|answer\w*|pede|instru\w*|responda)\b/i],
|
|
135
|
+
['expectations', /\b(?:expects?|prefers?|likes?|wants?|values?|appreciat\w*|dislikes?|hates?|espera|prefere|gosta|quer)\b/i],
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
/** The facet a statement most likely belongs to ('expectations' when nothing says otherwise). */
|
|
139
|
+
export function guessFacet(text) {
|
|
140
|
+
const value = String(text ?? '');
|
|
141
|
+
for (const [facet, re] of FACET_RULES) if (re.test(value)) return facet;
|
|
142
|
+
return 'expectations';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const day = (value) => {
|
|
146
|
+
const ms = Date.parse(value ?? '');
|
|
147
|
+
return Number.isFinite(ms) ? new Date(ms).toISOString().slice(0, 10) : null;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/** A quote fit for an Evidence line: one line, no double quotes, bounded. */
|
|
151
|
+
export function cleanQuote(value, max = LEARN.quoteMax) {
|
|
152
|
+
return clipText(collapse(value).replace(/"/g, "'"), max);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function parseIds(value) {
|
|
156
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
157
|
+
if (typeof value !== 'string' || !value.trim()) return [];
|
|
158
|
+
try { const parsed = JSON.parse(value); return Array.isArray(parsed) ? parsed.map(String).filter(Boolean) : []; } catch { return []; }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A memory row of a knowledge category → what the engine works with.
|
|
163
|
+
* row: { id, content, category, subcategory, project, importance, kind, created_at, updated_at,
|
|
164
|
+
* related_memory_ids, revision, source_ref }
|
|
165
|
+
* → { id, revision, structured, statement, evidence:[{ quote, date }], seen, confidence, facet,
|
|
166
|
+
* kind, project, category, createdAt, updatedAt, links, sourceRef } (statement '' = unusable)
|
|
167
|
+
*/
|
|
168
|
+
export function parseKnowledge(row = {}) {
|
|
169
|
+
const content = String(row.content ?? '');
|
|
170
|
+
const lines = content.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
171
|
+
const trailer = lines.length > 1 ? TRAILER_RE.exec(lines[lines.length - 1]) : null;
|
|
172
|
+
const base = {
|
|
173
|
+
id: row.id ? String(row.id) : null,
|
|
174
|
+
revision: Number(row.revision) || 0,
|
|
175
|
+
kind: row.kind ? String(row.kind) : 'note',
|
|
176
|
+
project: row.project ? String(row.project) : 'global',
|
|
177
|
+
category: row.category ? String(row.category) : null,
|
|
178
|
+
createdAt: row.created_at || null,
|
|
179
|
+
updatedAt: row.updated_at || row.created_at || null,
|
|
180
|
+
links: parseIds(row.related_memory_ids),
|
|
181
|
+
sourceRef: row.source_ref ? String(row.source_ref) : null,
|
|
182
|
+
};
|
|
183
|
+
if (trailer) {
|
|
184
|
+
const evidence = [];
|
|
185
|
+
for (const line of lines.slice(1, -1)) {
|
|
186
|
+
const match = EVIDENCE_RE.exec(line);
|
|
187
|
+
if (match) evidence.push({ quote: match[1], date: match[2] });
|
|
188
|
+
}
|
|
189
|
+
const facet = FACETS.includes(trailer[3]) ? trailer[3] : (FACETS.includes(row.subcategory) ? row.subcategory : 'expectations');
|
|
190
|
+
return {
|
|
191
|
+
...base, structured: true,
|
|
192
|
+
statement: cleanStatement(lines[0]),
|
|
193
|
+
evidence: evidence.slice(-LEARN.evidenceMax),
|
|
194
|
+
seen: Math.max(1, Number(trailer[1]) || 1),
|
|
195
|
+
confidence: Math.max(0, Math.min(1, Number(trailer[2]) || 0)),
|
|
196
|
+
facet,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// A seed whose first sentence is only a title ("Two patterns.") says nothing in one line: it is not used.
|
|
200
|
+
const sentence = seedStatement(content);
|
|
201
|
+
const statement = sentence.split(/\s+/).filter((word) => /[\p{L}\p{N}]/u.test(word)).length >= 4 ? sentence : '';
|
|
202
|
+
const importance = Number(row.importance);
|
|
203
|
+
return {
|
|
204
|
+
...base, structured: false,
|
|
205
|
+
statement,
|
|
206
|
+
evidence: [],
|
|
207
|
+
seen: 1,
|
|
208
|
+
// A seed was written by a model asked to observe, not judged from the user's words.
|
|
209
|
+
confidence: Math.max(0.4, Math.min(0.9, 0.4 + (Number.isFinite(importance) ? importance : 5) * 0.05)),
|
|
210
|
+
facet: FACETS.includes(row.subcategory) ? row.subcategory : guessFacet(statement),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** The content of a structured knowledge memory. */
|
|
215
|
+
export function formatKnowledge({ statement, evidence = [], seen = 1, confidence = 0.8, facet = 'expectations' } = {}) {
|
|
216
|
+
const lines = [cleanStatement(statement)];
|
|
217
|
+
for (const item of evidence.slice(-LEARN.evidenceMax)) {
|
|
218
|
+
const date = day(item?.date) || day(Date.now());
|
|
219
|
+
const quote = cleanQuote(item?.quote);
|
|
220
|
+
if (quote) lines.push(`Evidence: "${quote}" (${date})`);
|
|
221
|
+
}
|
|
222
|
+
const value = Math.max(0, Math.min(0.99, Number(confidence) || 0));
|
|
223
|
+
lines.push(`Seen ${Math.max(1, Math.round(Number(seen) || 1))}× · confidence ${value.toFixed(2)} · facet ${FACETS.includes(facet) ? facet : 'expectations'}`);
|
|
224
|
+
return lines.join('\n');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Evidence with one more quote: the same quote is not listed twice, the newest `max` stay. */
|
|
228
|
+
export function addEvidence(evidence = [], item, max = LEARN.evidenceMax) {
|
|
229
|
+
const quote = cleanQuote(item?.quote);
|
|
230
|
+
if (!quote) return evidence.slice(-max);
|
|
231
|
+
const next = evidence.filter((entry) => cleanQuote(entry?.quote).toLowerCase() !== quote.toLowerCase());
|
|
232
|
+
next.push({ quote, date: day(item?.date) || day(Date.now()) });
|
|
233
|
+
return next.slice(-max);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Confidence after the statement was seen again with probability `p`: it only rises, and never reaches 1. */
|
|
237
|
+
export function raiseConfidence(previous, p = 0.8) {
|
|
238
|
+
const prev = Math.max(0, Math.min(0.99, Number(previous) || 0));
|
|
239
|
+
const gain = (1 - prev) * 0.3 * Math.max(0, Math.min(1, Number(p) || 0));
|
|
240
|
+
return Math.min(0.99, Number((prev + gain).toFixed(2)));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const normalizeText = (value) => collapse(value).toLowerCase().replace(/[^\p{L}\p{N} ]+/gu, '');
|
|
244
|
+
|
|
245
|
+
/** confidence × evidence × recency. */
|
|
246
|
+
export function knowledgeScore(item, now = Date.now()) {
|
|
247
|
+
const seen = Math.max(1, Number(item?.seen) || 1);
|
|
248
|
+
const evidence = Math.min(2, 1 + Math.log2(seen) * 0.25);
|
|
249
|
+
const at = Date.parse(item?.updatedAt || item?.createdAt || '');
|
|
250
|
+
const ageDays = Number.isFinite(at) ? Math.max(0, (now - at) / 86_400_000) : 365;
|
|
251
|
+
const recency = 0.5 + 0.5 * Math.exp(-ageDays / 90);
|
|
252
|
+
return (Number(item?.confidence) || 0) * evidence * recency;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** The statements a session of `project` may be told: global ones and its own project's, usable, seeds a structured memory replaced left out. */
|
|
256
|
+
export function usableKnowledge(items = [], { project = 'global' } = {}) {
|
|
257
|
+
const wanted = String(project || 'global').toLowerCase();
|
|
258
|
+
const replaced = new Set();
|
|
259
|
+
for (const item of items) if (item?.structured) for (const id of item.links || []) replaced.add(id);
|
|
260
|
+
const seen = new Set();
|
|
261
|
+
const out = [];
|
|
262
|
+
for (const item of items) {
|
|
263
|
+
if (!item?.id || !item.statement || item.statement.length < 8) continue;
|
|
264
|
+
const scope = String(item.project || 'global').toLowerCase();
|
|
265
|
+
if (scope !== 'global' && scope !== wanted) continue;
|
|
266
|
+
if (!item.structured && replaced.has(item.id)) continue;
|
|
267
|
+
const key = normalizeText(item.statement);
|
|
268
|
+
if (!key || seen.has(key)) continue;
|
|
269
|
+
seen.add(key);
|
|
270
|
+
out.push(item);
|
|
271
|
+
}
|
|
272
|
+
return out;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/** Highest score first; a structured statement before a seed on a tie, then the newest, then the id. */
|
|
276
|
+
export function rankKnowledge(items = [], now = Date.now()) {
|
|
277
|
+
return items
|
|
278
|
+
.map((item) => ({ item, score: knowledgeScore(item, now) }))
|
|
279
|
+
.sort((a, b) => b.score - a.score
|
|
280
|
+
|| Number(b.item.structured) - Number(a.item.structured)
|
|
281
|
+
|| String(b.item.updatedAt || '').localeCompare(String(a.item.updatedAt || ''))
|
|
282
|
+
|| String(a.item.id).localeCompare(String(b.item.id)));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* The digest: the header, then `- statement` lines, ranked, at most `perFacet` per facet, inside
|
|
287
|
+
* `maxTokens`. Deterministic for the same rows and the same `now`.
|
|
288
|
+
* → { text, tokens, rows:[{ id, revision, statement, facet, seed, tokens }], omitted, candidates }
|
|
289
|
+
* (text '' and no rows when nothing is usable: no header on its own)
|
|
290
|
+
*/
|
|
291
|
+
export function renderDigest(items = [], { project = 'global', now = Date.now(), maxTokens = DIGEST.maxTokens, perFacet = DIGEST.perFacet } = {}) {
|
|
292
|
+
const ranked = rankKnowledge(usableKnowledge(items, { project }), now);
|
|
293
|
+
const perFacetCount = new Map();
|
|
294
|
+
const rows = [];
|
|
295
|
+
let text = DIGEST_HEADER;
|
|
296
|
+
let omitted = 0;
|
|
297
|
+
for (const { item } of ranked) {
|
|
298
|
+
const count = perFacetCount.get(item.facet) || 0;
|
|
299
|
+
if (count >= perFacet) { omitted += 1; continue; }
|
|
300
|
+
const line = `- ${item.statement}`;
|
|
301
|
+
const next = `${text}\n${line}`;
|
|
302
|
+
if (estimateTokens(next) > maxTokens) { omitted += 1; continue; }
|
|
303
|
+
text = next;
|
|
304
|
+
perFacetCount.set(item.facet, count + 1);
|
|
305
|
+
rows.push({ id: item.id, revision: item.revision, statement: item.statement, facet: item.facet, seed: !item.structured, tokens: estimateTokens(line) });
|
|
306
|
+
}
|
|
307
|
+
if (!rows.length) return { text: '', tokens: 0, rows: [], omitted, candidates: ranked.length };
|
|
308
|
+
return { text, tokens: estimateTokens(text), rows, omitted, candidates: ranked.length };
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** Cosine similarity of two equal-length vectors (0 when either is empty or zero). */
|
|
312
|
+
export function cosine(a, b) {
|
|
313
|
+
if (!a || !b || a.length !== b.length || !a.length) return 0;
|
|
314
|
+
let dot = 0;
|
|
315
|
+
let na = 0;
|
|
316
|
+
let nb = 0;
|
|
317
|
+
for (let i = 0; i < a.length; i += 1) { dot += a[i] * b[i]; na += a[i] * a[i]; nb += b[i] * b[i]; }
|
|
318
|
+
return na && nb ? dot / Math.sqrt(na * nb) : 0;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** The `k` rows nearest to `vector` ({ id, vector } rows), best first, with their similarity. */
|
|
322
|
+
export function nearest(vector, rows = [], k = LEARN.knownStatements, floor = 0.25) {
|
|
323
|
+
return rows
|
|
324
|
+
.map((row) => ({ id: row.id, similarity: cosine(vector, row.vector) }))
|
|
325
|
+
.filter((row) => row.similarity >= floor)
|
|
326
|
+
.sort((a, b) => b.similarity - a.similarity || String(a.id).localeCompare(String(b.id)))
|
|
327
|
+
.slice(0, k);
|
|
328
|
+
}
|