@vascend/talos 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +202 -0
- package/dist/backend/asset-events.d.ts +31 -0
- package/dist/backend/asset-events.js +149 -0
- package/dist/backend/assets.d.ts +31 -0
- package/dist/backend/assets.js +210 -0
- package/dist/backend/auth.d.ts +18 -0
- package/dist/backend/auth.js +59 -0
- package/dist/backend/config.d.ts +14 -0
- package/dist/backend/config.js +41 -0
- package/dist/backend/conversations.d.ts +21 -0
- package/dist/backend/conversations.js +141 -0
- package/dist/backend/crypto.d.ts +9 -0
- package/dist/backend/crypto.js +68 -0
- package/dist/backend/engine.d.ts +13 -0
- package/dist/backend/engine.js +78 -0
- package/dist/backend/http.d.ts +25 -0
- package/dist/backend/http.js +112 -0
- package/dist/backend/index.d.ts +1 -0
- package/dist/backend/index.js +24 -0
- package/dist/backend/routes.d.ts +14 -0
- package/dist/backend/routes.js +169 -0
- package/dist/backend/sdk.d.ts +12 -0
- package/dist/backend/sdk.js +11 -0
- package/dist/backend/server.d.ts +12 -0
- package/dist/backend/server.js +91 -0
- package/dist/backend/temp-image-store.d.ts +46 -0
- package/dist/backend/temp-image-store.js +197 -0
- package/dist/backend/types.d.ts +103 -0
- package/dist/backend/types.js +29 -0
- package/dist/backend/users.d.ts +13 -0
- package/dist/backend/users.js +76 -0
- package/dist/backend/ws-handler.d.ts +14 -0
- package/dist/backend/ws-handler.js +72 -0
- package/dist/backend/ws.d.ts +19 -0
- package/dist/backend/ws.js +146 -0
- package/dist/core/agent.d.ts +56 -0
- package/dist/core/agent.js +1783 -0
- package/dist/core/background.d.ts +45 -0
- package/dist/core/background.js +140 -0
- package/dist/core/bootstrap.d.ts +45 -0
- package/dist/core/bootstrap.js +294 -0
- package/dist/core/cli-args.d.ts +41 -0
- package/dist/core/cli-args.js +282 -0
- package/dist/core/collapsible-output.d.ts +38 -0
- package/dist/core/collapsible-output.js +143 -0
- package/dist/core/compaction-checkpoint.d.ts +9 -0
- package/dist/core/compaction-checkpoint.js +58 -0
- package/dist/core/compaction.d.ts +42 -0
- package/dist/core/compaction.js +270 -0
- package/dist/core/config.d.ts +49 -0
- package/dist/core/config.js +417 -0
- package/dist/core/context-ledger.d.ts +99 -0
- package/dist/core/context-ledger.js +222 -0
- package/dist/core/context-policy.d.ts +17 -0
- package/dist/core/context-policy.js +81 -0
- package/dist/core/continuation-review.d.ts +23 -0
- package/dist/core/continuation-review.js +64 -0
- package/dist/core/crash-report.d.ts +3 -0
- package/dist/core/crash-report.js +27 -0
- package/dist/core/credentials.d.ts +11 -0
- package/dist/core/credentials.js +183 -0
- package/dist/core/doctor.d.ts +24 -0
- package/dist/core/doctor.js +125 -0
- package/dist/core/effort.d.ts +5 -0
- package/dist/core/effort.js +42 -0
- package/dist/core/env-paths.d.ts +3 -0
- package/dist/core/env-paths.js +38 -0
- package/dist/core/execution-guidance.d.ts +9 -0
- package/dist/core/execution-guidance.js +73 -0
- package/dist/core/execution-target.d.ts +41 -0
- package/dist/core/execution-target.js +69 -0
- package/dist/core/file-coordination.d.ts +66 -0
- package/dist/core/file-coordination.js +176 -0
- package/dist/core/file-lease-store.d.ts +14 -0
- package/dist/core/file-lease-store.js +89 -0
- package/dist/core/image-limits.d.ts +26 -0
- package/dist/core/image-limits.js +205 -0
- package/dist/core/interruptible-completion.d.ts +3 -0
- package/dist/core/interruptible-completion.js +42 -0
- package/dist/core/kingdoms-mode-state.d.ts +24 -0
- package/dist/core/kingdoms-mode-state.js +139 -0
- package/dist/core/licenza.d.ts +38 -0
- package/dist/core/licenza.js +125 -0
- package/dist/core/model-limits.d.ts +2 -0
- package/dist/core/model-limits.js +36 -0
- package/dist/core/output-lifecycle.d.ts +44 -0
- package/dist/core/output-lifecycle.js +190 -0
- package/dist/core/package-update.d.ts +15 -0
- package/dist/core/package-update.js +121 -0
- package/dist/core/permission-queue.d.ts +2 -0
- package/dist/core/permission-queue.js +20 -0
- package/dist/core/prompt-attachment.d.ts +21 -0
- package/dist/core/prompt-attachment.js +123 -0
- package/dist/core/request-plan.d.ts +16 -0
- package/dist/core/request-plan.js +36 -0
- package/dist/core/run-timing.d.ts +17 -0
- package/dist/core/run-timing.js +123 -0
- package/dist/core/self-update.d.ts +17 -0
- package/dist/core/self-update.js +54 -0
- package/dist/core/session-refs.d.ts +27 -0
- package/dist/core/session-refs.js +126 -0
- package/dist/core/session-storage.d.ts +4 -0
- package/dist/core/session-storage.js +48 -0
- package/dist/core/session-title.d.ts +1 -0
- package/dist/core/session-title.js +21 -0
- package/dist/core/session-usage.d.ts +17 -0
- package/dist/core/session-usage.js +74 -0
- package/dist/core/session.d.ts +58 -0
- package/dist/core/session.js +296 -0
- package/dist/core/settings.d.ts +17 -0
- package/dist/core/settings.js +107 -0
- package/dist/core/storage-retention.d.ts +21 -0
- package/dist/core/storage-retention.js +227 -0
- package/dist/core/text-sanitize.d.ts +1 -0
- package/dist/core/text-sanitize.js +35 -0
- package/dist/core/tool-artifacts.d.ts +6 -0
- package/dist/core/tool-artifacts.js +51 -0
- package/dist/core/tool-compress.d.ts +8 -0
- package/dist/core/tool-compress.js +111 -0
- package/dist/core/tool-executor.d.ts +16 -0
- package/dist/core/tool-executor.js +97 -0
- package/dist/core/tool-result-index.d.ts +52 -0
- package/dist/core/tool-result-index.js +327 -0
- package/dist/core/tool-result-store.d.ts +38 -0
- package/dist/core/tool-result-store.js +190 -0
- package/dist/core/tool-scheduler.d.ts +16 -0
- package/dist/core/tool-scheduler.js +35 -0
- package/dist/core/trust.d.ts +21 -0
- package/dist/core/trust.js +95 -0
- package/dist/core/types.d.ts +402 -0
- package/dist/core/types.js +1 -0
- package/dist/core/update-check.d.ts +26 -0
- package/dist/core/update-check.js +89 -0
- package/dist/core/update-process.d.ts +10 -0
- package/dist/core/update-process.js +31 -0
- package/dist/core/user-inbox.d.ts +23 -0
- package/dist/core/user-inbox.js +56 -0
- package/dist/core/user-input.d.ts +10 -0
- package/dist/core/user-input.js +35 -0
- package/dist/core/version.d.ts +1 -0
- package/dist/core/version.js +10 -0
- package/dist/core/vibe-modes.d.ts +38 -0
- package/dist/core/vibe-modes.js +383 -0
- package/dist/core/workspace-roots.d.ts +13 -0
- package/dist/core/workspace-roots.js +91 -0
- package/dist/core/workspace-sessions.d.ts +51 -0
- package/dist/core/workspace-sessions.js +243 -0
- package/dist/cowork/client.d.ts +29 -0
- package/dist/cowork/client.js +49 -0
- package/dist/cowork/engine-bridge.d.ts +22 -0
- package/dist/cowork/engine-bridge.js +98 -0
- package/dist/cowork/index.d.ts +11 -0
- package/dist/cowork/index.js +16 -0
- package/dist/cowork/ipc.d.ts +97 -0
- package/dist/cowork/ipc.js +96 -0
- package/dist/cowork/manager.d.ts +66 -0
- package/dist/cowork/manager.js +325 -0
- package/dist/cowork/store.d.ts +23 -0
- package/dist/cowork/store.js +182 -0
- package/dist/cowork/sync.d.ts +20 -0
- package/dist/cowork/sync.js +164 -0
- package/dist/cowork/types.d.ts +78 -0
- package/dist/cowork/types.js +21 -0
- package/dist/extensions/ext-tools.d.ts +3 -0
- package/dist/extensions/ext-tools.js +73 -0
- package/dist/extensions/loader.d.ts +91 -0
- package/dist/extensions/loader.js +474 -0
- package/dist/extensions/settings.d.ts +20 -0
- package/dist/extensions/settings.js +86 -0
- package/dist/extensions/types.d.ts +219 -0
- package/dist/extensions/types.js +1 -0
- package/dist/horizon/async-queue.d.ts +9 -0
- package/dist/horizon/async-queue.js +46 -0
- package/dist/horizon/engine.d.ts +85 -0
- package/dist/horizon/engine.js +603 -0
- package/dist/horizon/index.d.ts +4 -0
- package/dist/horizon/index.js +2 -0
- package/dist/horizon/main-team.d.ts +163 -0
- package/dist/horizon/main-team.js +774 -0
- package/dist/horizon/types.d.ts +233 -0
- package/dist/horizon/types.js +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +233 -0
- package/dist/mcp/protocol.d.ts +81 -0
- package/dist/mcp/protocol.js +122 -0
- package/dist/package.json +1 -0
- package/dist/packages/packages.d.ts +12 -0
- package/dist/packages/packages.js +323 -0
- package/dist/prompts/templates.d.ts +13 -0
- package/dist/prompts/templates.js +139 -0
- package/dist/providers/anthropic-oauth.d.ts +13 -0
- package/dist/providers/anthropic-oauth.js +124 -0
- package/dist/providers/anthropic.d.ts +27 -0
- package/dist/providers/anthropic.js +526 -0
- package/dist/providers/catalog.d.ts +15 -0
- package/dist/providers/catalog.js +166 -0
- package/dist/providers/effort.d.ts +12 -0
- package/dist/providers/effort.js +102 -0
- package/dist/providers/model-catalog.d.ts +43 -0
- package/dist/providers/model-catalog.js +70 -0
- package/dist/providers/model-effort.d.ts +5 -0
- package/dist/providers/model-effort.js +43 -0
- package/dist/providers/model-registry.d.ts +39 -0
- package/dist/providers/model-registry.js +142 -0
- package/dist/providers/models-dev.d.ts +9 -0
- package/dist/providers/models-dev.js +97 -0
- package/dist/providers/oauth-callback-server.d.ts +28 -0
- package/dist/providers/oauth-callback-server.js +184 -0
- package/dist/providers/oauth-orchestrator.d.ts +58 -0
- package/dist/providers/oauth-orchestrator.js +159 -0
- package/dist/providers/oauth-store.d.ts +12 -0
- package/dist/providers/oauth-store.js +139 -0
- package/dist/providers/open-browser.d.ts +20 -0
- package/dist/providers/open-browser.js +92 -0
- package/dist/providers/openai-compat.d.ts +14 -0
- package/dist/providers/openai-compat.js +523 -0
- package/dist/providers/openai-oauth.d.ts +15 -0
- package/dist/providers/openai-oauth.js +382 -0
- package/dist/providers/openrouter-auth.d.ts +73 -0
- package/dist/providers/openrouter-auth.js +321 -0
- package/dist/providers/openrouter-manual-fallback.d.ts +25 -0
- package/dist/providers/openrouter-manual-fallback.js +161 -0
- package/dist/providers/openrouter.d.ts +15 -0
- package/dist/providers/openrouter.js +107 -0
- package/dist/providers/plan-limits.d.ts +6 -0
- package/dist/providers/plan-limits.js +175 -0
- package/dist/providers/provider-reset.d.ts +4 -0
- package/dist/providers/provider-reset.js +83 -0
- package/dist/providers/quota-limits.d.ts +4 -0
- package/dist/providers/quota-limits.js +33 -0
- package/dist/providers/registry.d.ts +33 -0
- package/dist/providers/registry.js +213 -0
- package/dist/providers/retry.d.ts +37 -0
- package/dist/providers/retry.js +347 -0
- package/dist/rpc/server.d.ts +23 -0
- package/dist/rpc/server.js +222 -0
- package/dist/sdk.d.ts +67 -0
- package/dist/sdk.js +64 -0
- package/dist/skills/skills.d.ts +17 -0
- package/dist/skills/skills.js +155 -0
- package/dist/text-sanitize.js +28 -0
- package/dist/tools/ask-user.d.ts +2 -0
- package/dist/tools/ask-user.js +60 -0
- package/dist/tools/builtin.d.ts +48 -0
- package/dist/tools/builtin.js +2494 -0
- package/dist/tools/capabilities.d.ts +5 -0
- package/dist/tools/capabilities.js +55 -0
- package/dist/tools/computer-capture.d.ts +2 -0
- package/dist/tools/computer-capture.js +91 -0
- package/dist/tools/computer-posix.d.ts +5 -0
- package/dist/tools/computer-posix.js +136 -0
- package/dist/tools/computer-use.d.ts +14 -0
- package/dist/tools/computer-use.js +108 -0
- package/dist/tools/discovery.d.ts +12 -0
- package/dist/tools/discovery.js +205 -0
- package/dist/tools/execute.d.ts +2 -0
- package/dist/tools/execute.js +73 -0
- package/dist/tools/normalize-input.d.ts +17 -0
- package/dist/tools/normalize-input.js +174 -0
- package/dist/tools/output-artifact.d.ts +3 -0
- package/dist/tools/output-artifact.js +80 -0
- package/dist/tools/pagination.d.ts +15 -0
- package/dist/tools/pagination.js +93 -0
- package/dist/tools/plan-status.d.ts +2 -0
- package/dist/tools/plan-status.js +109 -0
- package/dist/tools/program-input.d.ts +3 -0
- package/dist/tools/program-input.js +19 -0
- package/dist/tools/program.d.ts +3 -0
- package/dist/tools/program.js +567 -0
- package/dist/tools/protocol-catalog.d.ts +12 -0
- package/dist/tools/protocol-catalog.js +46 -0
- package/dist/tools/ramification-tools.d.ts +12 -0
- package/dist/tools/ramification-tools.js +528 -0
- package/dist/tools/regex-compat.d.ts +9 -0
- package/dist/tools/regex-compat.js +96 -0
- package/dist/tools/registry.d.ts +51 -0
- package/dist/tools/registry.js +185 -0
- package/dist/tools/resolve.d.ts +2 -0
- package/dist/tools/resolve.js +107 -0
- package/dist/tools/shell-env.d.ts +2 -0
- package/dist/tools/shell-env.js +7 -0
- package/dist/tools/team-input.d.ts +3 -0
- package/dist/tools/team-input.js +129 -0
- package/dist/tools/team-tools.d.ts +7 -0
- package/dist/tools/team-tools.js +348 -0
- package/dist/tools/workspace-sessions.d.ts +2 -0
- package/dist/tools/workspace-sessions.js +35 -0
- package/dist/tui/account-entry.d.ts +1 -0
- package/dist/tui/account-entry.js +93 -0
- package/dist/tui/attachment-highlight.d.ts +1 -0
- package/dist/tui/attachment-highlight.js +24 -0
- package/dist/tui/attachment-refs.d.ts +2 -0
- package/dist/tui/attachment-refs.js +3 -0
- package/dist/tui/bottom-input.d.ts +219 -0
- package/dist/tui/bottom-input.js +1958 -0
- package/dist/tui/branding.d.ts +107 -0
- package/dist/tui/branding.js +750 -0
- package/dist/tui/clipboard-image.d.ts +10 -0
- package/dist/tui/clipboard-image.js +163 -0
- package/dist/tui/clipboard-text.d.ts +9 -0
- package/dist/tui/clipboard-text.js +51 -0
- package/dist/tui/clipboard-windows.d.ts +8 -0
- package/dist/tui/clipboard-windows.js +84 -0
- package/dist/tui/collapsible-command.d.ts +15 -0
- package/dist/tui/collapsible-command.js +48 -0
- package/dist/tui/command-feedback.d.ts +10 -0
- package/dist/tui/command-feedback.js +46 -0
- package/dist/tui/command-output-registry.d.ts +28 -0
- package/dist/tui/command-output-registry.js +103 -0
- package/dist/tui/command-transcript.d.ts +12 -0
- package/dist/tui/command-transcript.js +90 -0
- package/dist/tui/commands.d.ts +20 -0
- package/dist/tui/commands.js +131 -0
- package/dist/tui/context-bar.d.ts +4 -0
- package/dist/tui/context-bar.js +74 -0
- package/dist/tui/context-meter.d.ts +25 -0
- package/dist/tui/context-meter.js +81 -0
- package/dist/tui/cost-binding.d.ts +8 -0
- package/dist/tui/cost-binding.js +43 -0
- package/dist/tui/cost-tracker.d.ts +49 -0
- package/dist/tui/cost-tracker.js +122 -0
- package/dist/tui/diff.d.ts +9 -0
- package/dist/tui/diff.js +119 -0
- package/dist/tui/i18n-catalog.d.ts +5 -0
- package/dist/tui/i18n-catalog.js +184 -0
- package/dist/tui/i18n.d.ts +6 -0
- package/dist/tui/i18n.js +10 -0
- package/dist/tui/image-attachments.d.ts +46 -0
- package/dist/tui/image-attachments.js +167 -0
- package/dist/tui/images.d.ts +12 -0
- package/dist/tui/images.js +87 -0
- package/dist/tui/intro.d.ts +13 -0
- package/dist/tui/intro.js +109 -0
- package/dist/tui/language-preference.d.ts +6 -0
- package/dist/tui/language-preference.js +24 -0
- package/dist/tui/live-output.d.ts +2 -0
- package/dist/tui/live-output.js +18 -0
- package/dist/tui/locales.d.ts +19 -0
- package/dist/tui/locales.js +22 -0
- package/dist/tui/login-menu.d.ts +17 -0
- package/dist/tui/login-menu.js +58 -0
- package/dist/tui/logo.d.ts +8 -0
- package/dist/tui/logo.js +305 -0
- package/dist/tui/markdown-inline.d.ts +3 -0
- package/dist/tui/markdown-inline.js +99 -0
- package/dist/tui/markdown-table.d.ts +4 -0
- package/dist/tui/markdown-table.js +63 -0
- package/dist/tui/markdown.d.ts +11 -0
- package/dist/tui/markdown.js +257 -0
- package/dist/tui/mcp-transcript.d.ts +7 -0
- package/dist/tui/mcp-transcript.js +40 -0
- package/dist/tui/model-details.d.ts +2 -0
- package/dist/tui/model-details.js +21 -0
- package/dist/tui/model-selection.d.ts +7 -0
- package/dist/tui/model-selection.js +41 -0
- package/dist/tui/native-scrollback.d.ts +27 -0
- package/dist/tui/native-scrollback.js +134 -0
- package/dist/tui/onboarding.d.ts +72 -0
- package/dist/tui/onboarding.js +207 -0
- package/dist/tui/paste-collapse.d.ts +39 -0
- package/dist/tui/paste-collapse.js +117 -0
- package/dist/tui/perm-mode.d.ts +8 -0
- package/dist/tui/perm-mode.js +41 -0
- package/dist/tui/prompt-queue-store.d.ts +26 -0
- package/dist/tui/prompt-queue-store.js +87 -0
- package/dist/tui/prompt-queue.d.ts +47 -0
- package/dist/tui/prompt-queue.js +187 -0
- package/dist/tui/provider-menu.d.ts +33 -0
- package/dist/tui/provider-menu.js +175 -0
- package/dist/tui/question.d.ts +24 -0
- package/dist/tui/question.js +32 -0
- package/dist/tui/queue-screen.d.ts +25 -0
- package/dist/tui/queue-screen.js +152 -0
- package/dist/tui/queue-team.d.ts +3 -0
- package/dist/tui/queue-team.js +28 -0
- package/dist/tui/queued-questions.d.ts +20 -0
- package/dist/tui/queued-questions.js +163 -0
- package/dist/tui/quick-help.d.ts +1 -0
- package/dist/tui/quick-help.js +53 -0
- package/dist/tui/repl.d.ts +78 -0
- package/dist/tui/repl.js +4130 -0
- package/dist/tui/restore-queued-input.d.ts +3 -0
- package/dist/tui/restore-queued-input.js +20 -0
- package/dist/tui/review-detail.d.ts +6 -0
- package/dist/tui/review-detail.js +56 -0
- package/dist/tui/review-files.d.ts +3 -0
- package/dist/tui/review-files.js +22 -0
- package/dist/tui/review-render.d.ts +22 -0
- package/dist/tui/review-render.js +98 -0
- package/dist/tui/review-screen.d.ts +38 -0
- package/dist/tui/review-screen.js +358 -0
- package/dist/tui/review-store.d.ts +60 -0
- package/dist/tui/review-store.js +270 -0
- package/dist/tui/review-team.d.ts +2 -0
- package/dist/tui/review-team.js +27 -0
- package/dist/tui/selector-mouse.d.ts +26 -0
- package/dist/tui/selector-mouse.js +65 -0
- package/dist/tui/selector.d.ts +51 -0
- package/dist/tui/selector.js +299 -0
- package/dist/tui/session-replay.d.ts +10 -0
- package/dist/tui/session-replay.js +78 -0
- package/dist/tui/session-usage.d.ts +22 -0
- package/dist/tui/session-usage.js +55 -0
- package/dist/tui/skill-transcript.d.ts +5 -0
- package/dist/tui/skill-transcript.js +31 -0
- package/dist/tui/startup.d.ts +5 -0
- package/dist/tui/startup.js +61 -0
- package/dist/tui/status-line-loader.d.ts +8 -0
- package/dist/tui/status-line-loader.js +33 -0
- package/dist/tui/status-line.d.ts +38 -0
- package/dist/tui/status-line.js +213 -0
- package/dist/tui/system-language.d.ts +8 -0
- package/dist/tui/system-language.js +41 -0
- package/dist/tui/task-labels.d.ts +2 -0
- package/dist/tui/task-labels.js +7 -0
- package/dist/tui/term-bg.d.ts +4 -0
- package/dist/tui/term-bg.js +67 -0
- package/dist/tui/terminal-screen.d.ts +12 -0
- package/dist/tui/terminal-screen.js +1 -0
- package/dist/tui/terminal-text.d.ts +7 -0
- package/dist/tui/terminal-text.js +123 -0
- package/dist/tui/theme.d.ts +25 -0
- package/dist/tui/theme.js +383 -0
- package/dist/tui/tool-style.d.ts +7 -0
- package/dist/tui/tool-style.js +119 -0
- package/dist/tui/update-prompt.d.ts +14 -0
- package/dist/tui/update-prompt.js +104 -0
- package/dist/tui/usage-footer.d.ts +9 -0
- package/dist/tui/usage-footer.js +123 -0
- package/dist/tui/vascend-login.d.ts +68 -0
- package/dist/tui/vascend-login.js +355 -0
- package/dist/tui/web-login.d.ts +28 -0
- package/dist/tui/web-login.js +115 -0
- package/dist/vascend/activity-status.d.ts +12 -0
- package/dist/vascend/activity-status.js +68 -0
- package/dist/vascend/architecture-map.d.ts +73 -0
- package/dist/vascend/architecture-map.js +424 -0
- package/dist/vascend/attention-layout.d.ts +19 -0
- package/dist/vascend/attention-layout.js +141 -0
- package/dist/vascend/budget-allocator.d.ts +31 -0
- package/dist/vascend/budget-allocator.js +79 -0
- package/dist/vascend/candidate-collector.d.ts +20 -0
- package/dist/vascend/candidate-collector.js +220 -0
- package/dist/vascend/code-events.d.ts +24 -0
- package/dist/vascend/code-events.js +304 -0
- package/dist/vascend/code-graph-memory.d.ts +38 -0
- package/dist/vascend/code-graph-memory.js +334 -0
- package/dist/vascend/code-graph-runtime.d.ts +19 -0
- package/dist/vascend/code-graph-runtime.js +190 -0
- package/dist/vascend/code-graph-types.d.ts +58 -0
- package/dist/vascend/code-graph-types.js +50 -0
- package/dist/vascend/code-parser.d.ts +4 -0
- package/dist/vascend/code-parser.js +257 -0
- package/dist/vascend/competitor-knowledge.d.ts +53 -0
- package/dist/vascend/competitor-knowledge.js +262 -0
- package/dist/vascend/completeness.d.ts +16 -0
- package/dist/vascend/completeness.js +90 -0
- package/dist/vascend/context-autotuner.d.ts +45 -0
- package/dist/vascend/context-autotuner.js +231 -0
- package/dist/vascend/context-candidate.d.ts +45 -0
- package/dist/vascend/context-candidate.js +150 -0
- package/dist/vascend/context-capsule.d.ts +51 -0
- package/dist/vascend/context-capsule.js +133 -0
- package/dist/vascend/context-fabric.d.ts +108 -0
- package/dist/vascend/context-fabric.js +480 -0
- package/dist/vascend/context-feedback-loop.d.ts +56 -0
- package/dist/vascend/context-feedback-loop.js +204 -0
- package/dist/vascend/context-learning-identity.d.ts +4 -0
- package/dist/vascend/context-learning-identity.js +8 -0
- package/dist/vascend/context-links.d.ts +14 -0
- package/dist/vascend/context-links.js +83 -0
- package/dist/vascend/context-lint.d.ts +22 -0
- package/dist/vascend/context-lint.js +91 -0
- package/dist/vascend/context-market-selection.d.ts +17 -0
- package/dist/vascend/context-market-selection.js +50 -0
- package/dist/vascend/context-metrics.d.ts +25 -0
- package/dist/vascend/context-metrics.js +57 -0
- package/dist/vascend/context-pack-render.d.ts +16 -0
- package/dist/vascend/context-pack-render.js +52 -0
- package/dist/vascend/context-pareto.d.ts +33 -0
- package/dist/vascend/context-pareto.js +165 -0
- package/dist/vascend/context-pattern-explorer.d.ts +41 -0
- package/dist/vascend/context-pattern-explorer.js +276 -0
- package/dist/vascend/context-regret.d.ts +32 -0
- package/dist/vascend/context-regret.js +93 -0
- package/dist/vascend/context-retriever.d.ts +22 -0
- package/dist/vascend/context-retriever.js +243 -0
- package/dist/vascend/context-scope-index.d.ts +5 -0
- package/dist/vascend/context-scope-index.js +96 -0
- package/dist/vascend/context-scorer.d.ts +35 -0
- package/dist/vascend/context-scorer.js +162 -0
- package/dist/vascend/context-search-index.d.ts +12 -0
- package/dist/vascend/context-search-index.js +25 -0
- package/dist/vascend/context-snapshot.d.ts +22 -0
- package/dist/vascend/context-snapshot.js +135 -0
- package/dist/vascend/context-window-compiler.d.ts +42 -0
- package/dist/vascend/context-window-compiler.js +237 -0
- package/dist/vascend/contract-memory.d.ts +61 -0
- package/dist/vascend/contract-memory.js +435 -0
- package/dist/vascend/council.d.ts +58 -0
- package/dist/vascend/council.js +337 -0
- package/dist/vascend/decision-promotion.d.ts +48 -0
- package/dist/vascend/decision-promotion.js +410 -0
- package/dist/vascend/delta-context.d.ts +12 -0
- package/dist/vascend/delta-context.js +36 -0
- package/dist/vascend/dev-context-compiler.d.ts +27 -0
- package/dist/vascend/dev-context-compiler.js +133 -0
- package/dist/vascend/dev-context-layout.d.ts +30 -0
- package/dist/vascend/dev-context-layout.js +262 -0
- package/dist/vascend/evidence-slots.d.ts +14 -0
- package/dist/vascend/evidence-slots.js +55 -0
- package/dist/vascend/expansion-levels.d.ts +15 -0
- package/dist/vascend/expansion-levels.js +178 -0
- package/dist/vascend/file-lock.d.ts +7 -0
- package/dist/vascend/file-lock.js +95 -0
- package/dist/vascend/granular-kingdom.d.ts +25 -0
- package/dist/vascend/granular-kingdom.js +259 -0
- package/dist/vascend/granular-launcher.d.ts +48 -0
- package/dist/vascend/granular-launcher.js +202 -0
- package/dist/vascend/kingdom-bus.d.ts +25 -0
- package/dist/vascend/kingdom-bus.js +54 -0
- package/dist/vascend/kingdom-channel.d.ts +22 -0
- package/dist/vascend/kingdom-channel.js +180 -0
- package/dist/vascend/kingdom-kpi.d.ts +48 -0
- package/dist/vascend/kingdom-kpi.js +172 -0
- package/dist/vascend/kingdom-live.d.ts +28 -0
- package/dist/vascend/kingdom-live.js +61 -0
- package/dist/vascend/kingdom-run.d.ts +18 -0
- package/dist/vascend/kingdom-run.js +506 -0
- package/dist/vascend/kingdom-scribe.d.ts +20 -0
- package/dist/vascend/kingdom-scribe.js +52 -0
- package/dist/vascend/kingdom.d.ts +79 -0
- package/dist/vascend/kingdom.js +870 -0
- package/dist/vascend/lexical-index.d.ts +10 -0
- package/dist/vascend/lexical-index.js +99 -0
- package/dist/vascend/lexical-search.d.ts +29 -0
- package/dist/vascend/lexical-search.js +262 -0
- package/dist/vascend/long-term-context.d.ts +51 -0
- package/dist/vascend/long-term-context.js +194 -0
- package/dist/vascend/mandate.d.ts +33 -0
- package/dist/vascend/mandate.js +107 -0
- package/dist/vascend/memory-packet.d.ts +13 -0
- package/dist/vascend/memory-packet.js +155 -0
- package/dist/vascend/memory-status.d.ts +22 -0
- package/dist/vascend/memory-status.js +73 -0
- package/dist/vascend/memory-store.d.ts +62 -0
- package/dist/vascend/memory-store.js +273 -0
- package/dist/vascend/objective-revision.d.ts +69 -0
- package/dist/vascend/objective-revision.js +319 -0
- package/dist/vascend/patch-plan-store.d.ts +33 -0
- package/dist/vascend/patch-plan-store.js +240 -0
- package/dist/vascend/patch-plan.d.ts +97 -0
- package/dist/vascend/patch-plan.js +345 -0
- package/dist/vascend/plan-progress.d.ts +11 -0
- package/dist/vascend/plan-progress.js +68 -0
- package/dist/vascend/plan-store.d.ts +64 -0
- package/dist/vascend/plan-store.js +460 -0
- package/dist/vascend/proof-chains.d.ts +19 -0
- package/dist/vascend/proof-chains.js +120 -0
- package/dist/vascend/ramification-store.d.ts +25 -0
- package/dist/vascend/ramification-store.js +94 -0
- package/dist/vascend/ramification.d.ts +193 -0
- package/dist/vascend/ramification.js +583 -0
- package/dist/vascend/recall-planner.d.ts +17 -0
- package/dist/vascend/recall-planner.js +109 -0
- package/dist/vascend/requirements.d.ts +31 -0
- package/dist/vascend/requirements.js +151 -0
- package/dist/vascend/reviewer.d.ts +9 -0
- package/dist/vascend/reviewer.js +93 -0
- package/dist/vascend/room-graph.d.ts +29 -0
- package/dist/vascend/room-graph.js +242 -0
- package/dist/vascend/room-memory.d.ts +57 -0
- package/dist/vascend/room-memory.js +631 -0
- package/dist/vascend/runtime.d.ts +84 -0
- package/dist/vascend/runtime.js +286 -0
- package/dist/vascend/self-improve.d.ts +104 -0
- package/dist/vascend/self-improve.js +396 -0
- package/dist/vascend/session-search.d.ts +52 -0
- package/dist/vascend/session-search.js +349 -0
- package/dist/vascend/supersession-graph.d.ts +14 -0
- package/dist/vascend/supersession-graph.js +70 -0
- package/dist/vascend/team-areas.d.ts +9 -0
- package/dist/vascend/team-areas.js +28 -0
- package/dist/vascend/team-handoff.d.ts +24 -0
- package/dist/vascend/team-handoff.js +37 -0
- package/dist/vascend/team-scheduler.d.ts +13 -0
- package/dist/vascend/team-scheduler.js +74 -0
- package/dist/vascend/team-session.d.ts +42 -0
- package/dist/vascend/team-session.js +142 -0
- package/dist/vascend/test-failure-memory.d.ts +76 -0
- package/dist/vascend/test-failure-memory.js +354 -0
- package/dist/vascend/token-market.d.ts +42 -0
- package/dist/vascend/token-market.js +144 -0
- package/dist/vascend/tuner-baseline-store.d.ts +52 -0
- package/dist/vascend/tuner-baseline-store.js +446 -0
- package/dist/vascend/user-profile.d.ts +44 -0
- package/dist/vascend/user-profile.js +131 -0
- package/dist/vascend/vision.d.ts +94 -0
- package/dist/vascend/vision.js +375 -0
- package/dist/vascend/work-agent.d.ts +12 -0
- package/dist/vascend/work-agent.js +83 -0
- package/dist/vascend/work-queue.d.ts +62 -0
- package/dist/vascend/work-queue.js +255 -0
- package/dist/vascend/work-runner.d.ts +64 -0
- package/dist/vascend/work-runner.js +137 -0
- package/dist/vascend/worktree.d.ts +38 -0
- package/dist/vascend/worktree.js +206 -0
- package/dist/vendor/computer-use/README.md +7 -0
- package/dist/vendor/computer-use/computer-desktop.js +211 -0
- package/dist/vendor/computer-use/computer-observe.js +315 -0
- package/dist/vendor/computer-use/computer-scripts.js +1230 -0
- package/dist/vendor/computer-use/computer-tools.js +2136 -0
- package/dist/vendor/computer-use/package.json +1 -0
- package/dist/vendor/computer-use/rac/atomic-input.js +91 -0
- package/dist/vendor/computer-use/rac/grammatica.js +101 -0
- package/dist/vendor/computer-use/rac/parser.js +185 -0
- package/dist/vendor/computer-use/rac/protocol.js +136 -0
- package/install.ps1 +30 -0
- package/install.sh +50 -0
- package/package.json +56 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// Context Feedback Loop (metodo Danilov, Memory OS) -- L3: l'auto-miglioramento.
|
|
2
|
+
//
|
|
3
|
+
// Questo e' "l'auto-miglioramento che PER DAVVERO funziona": non un suggerimento
|
|
4
|
+
// testuale, ma un ANELLO CHIUSO e deterministico che migliora misurabilmente la
|
|
5
|
+
// qualita' del contesto compilato regolando da solo lo scorer.
|
|
6
|
+
//
|
|
7
|
+
// config0 -> compile -> metrics -> qualityScore
|
|
8
|
+
// | |
|
|
9
|
+
// v v
|
|
10
|
+
// autotuneStep <----- diagnose(metrics)
|
|
11
|
+
// |
|
|
12
|
+
// v
|
|
13
|
+
// config1 -> compile -> metrics -> qualityScore (>= precedente) ... finche' converge
|
|
14
|
+
//
|
|
15
|
+
// Garanzie:
|
|
16
|
+
// - DETERMINISMO: a parita' di compile() e config iniziale, stesso esito.
|
|
17
|
+
// - MONOTONIA: l'anello tiene la MIGLIORE config vista; non regredisce mai.
|
|
18
|
+
// - CONVERGENZA: si ferma quando nessuna correzione e' proposta o il guadagno
|
|
19
|
+
// scende sotto minGain, oppure dopo maxRounds (anti-loop).
|
|
20
|
+
//
|
|
21
|
+
// Modulo PURO: nessun side-effect proprio. Il side-effect (compilare con gli
|
|
22
|
+
// store reali) e' iniettato come funzione `compile`. Per i test si passa una
|
|
23
|
+
// compile finta; per il runtime si usa runContextFeedbackLoop con compileContext.
|
|
24
|
+
import { autotuneStep, qualityScore, hasConverged, formatAdjustments, DEFAULT_CONFIG, DEFAULT_TARGETS, } from "./context-autotuner.js";
|
|
25
|
+
import { compileContext } from "./context-window-compiler.js";
|
|
26
|
+
import { loadContextStoreSnapshot } from "./context-snapshot.js";
|
|
27
|
+
import { TunerBaselineStore, DEFAULT_BASELINE_SCOPE, } from "./tuner-baseline-store.js";
|
|
28
|
+
import { exploreContextPatterns, } from "./context-pattern-explorer.js";
|
|
29
|
+
// Esegue l'anello su una compile iniettata. CUORE del modulo: puro rispetto a
|
|
30
|
+
// `compile` (che incapsula ogni side-effect). Ritorna la config migliore.
|
|
31
|
+
export function runFeedbackLoop(compile, opts = {}) {
|
|
32
|
+
const targets = opts.targets ?? DEFAULT_TARGETS;
|
|
33
|
+
const maxRounds = opts.maxRounds && opts.maxRounds > 0 ? opts.maxRounds : 8;
|
|
34
|
+
const minGain = typeof opts.minGain === "number" ? opts.minGain : 1;
|
|
35
|
+
let config = opts.config ?? DEFAULT_CONFIG;
|
|
36
|
+
const trajectory = [];
|
|
37
|
+
// Misura di partenza.
|
|
38
|
+
let metrics = compile(config);
|
|
39
|
+
let score = qualityScore(metrics, targets);
|
|
40
|
+
const initialScore = score;
|
|
41
|
+
let bestConfig = config;
|
|
42
|
+
let bestScore = score;
|
|
43
|
+
let converged = false;
|
|
44
|
+
let round = 0;
|
|
45
|
+
for (; round < maxRounds; round++) {
|
|
46
|
+
// Diagnosi della config corrente -> proposta di nuova config.
|
|
47
|
+
const step = autotuneStep(config, metrics, targets);
|
|
48
|
+
trajectory.push({ round, config, metrics, score, adjustments: step.adjustments });
|
|
49
|
+
// Nessuna correzione proposta = convergenza strutturale.
|
|
50
|
+
if (step.adjustments.length === 0) {
|
|
51
|
+
converged = true;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
// Prova la nuova config.
|
|
55
|
+
const nextMetrics = compile(step.config);
|
|
56
|
+
const nextScore = qualityScore(nextMetrics, targets);
|
|
57
|
+
const gain = nextScore - score;
|
|
58
|
+
// MONOTONIA: tieni sempre la config migliore vista, mai regredire.
|
|
59
|
+
if (nextScore > bestScore) {
|
|
60
|
+
bestScore = nextScore;
|
|
61
|
+
bestConfig = step.config;
|
|
62
|
+
}
|
|
63
|
+
// CONVERGENZA: guadagno sotto soglia -> ci fermiamo.
|
|
64
|
+
if (hasConverged(step.adjustments, gain, minGain)) {
|
|
65
|
+
converged = true;
|
|
66
|
+
// Registra l'ultimo stato provato per trasparenza.
|
|
67
|
+
trajectory.push({ round: round + 1, config: step.config, metrics: nextMetrics, score: nextScore, adjustments: [] });
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
// Avanza l'anello.
|
|
71
|
+
config = step.config;
|
|
72
|
+
metrics = nextMetrics;
|
|
73
|
+
score = nextScore;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
bestConfig,
|
|
77
|
+
bestScore,
|
|
78
|
+
initialScore,
|
|
79
|
+
improved: bestScore > initialScore,
|
|
80
|
+
converged,
|
|
81
|
+
rounds: trajectory.length,
|
|
82
|
+
trajectory,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// --- wiring sul compiler reale ----------------------------------------------
|
|
86
|
+
// Esegue l'anello compilando DAVVERO il contesto dagli store: per ogni config
|
|
87
|
+
// chiama compileContext e ne estrae le metriche. Ritorna sia l'esito dell'anello
|
|
88
|
+
// sia il contesto compilato FINALE con la config migliore (pronto da usare).
|
|
89
|
+
export function runContextFeedbackLoop(input, opts = {}) {
|
|
90
|
+
// now fisso per determinismo dell'intero anello (freshness stabile fra round).
|
|
91
|
+
const now = input.now ?? Date.now();
|
|
92
|
+
// Lo snapshot degli store e' condiviso da TUTTE le compile dell'anello: fra i
|
|
93
|
+
// round cambiano solo pesi e soglie dello scorer, mentre pool di candidati,
|
|
94
|
+
// Memory Packet e ranking lessicale sono per costruzione identici. Senza
|
|
95
|
+
// questo, ogni round rileggeva l'intero Memory OS da disco.
|
|
96
|
+
const base = { ...input, now, snapshot: snapshotFor(input) };
|
|
97
|
+
const compile = (config) => compileContext({ ...base, weights: config.weights, thresholds: config.thresholds }).metrics;
|
|
98
|
+
const loop = runFeedbackLoop(compile, opts);
|
|
99
|
+
// Compila una volta in piu' con la config migliore per restituire il pack.
|
|
100
|
+
const compiled = compileContext({
|
|
101
|
+
...base,
|
|
102
|
+
weights: loop.bestConfig.weights,
|
|
103
|
+
thresholds: loop.bestConfig.thresholds,
|
|
104
|
+
});
|
|
105
|
+
return { loop, compiled };
|
|
106
|
+
}
|
|
107
|
+
// Snapshot degli store per un input di compilazione: rispetta quello passato
|
|
108
|
+
// dal chiamante (un turno che compila piu' volte lo condivide) e altrimenti lo
|
|
109
|
+
// materializza una volta per l'intero anello.
|
|
110
|
+
function snapshotFor(input) {
|
|
111
|
+
return input.snapshot ?? loadContextStoreSnapshot({
|
|
112
|
+
sessionDir: input.sessionDir,
|
|
113
|
+
scopeId: input.scopeId,
|
|
114
|
+
...(input.projectKey ? { projectKey: input.projectKey } : {}),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// L'auto-miglioramento che RICORDA: invece di ripartire dai default, carica la
|
|
118
|
+
// baseline appresa come config iniziale, esegue l'anello, e SE migliora salva la
|
|
119
|
+
// bestConfig fondendola nella baseline via EMA. Cosi' ogni turno/sessione parte
|
|
120
|
+
// dall'architettura gia' ottimizzata e l'apprendimento e' CUMULATIVO.
|
|
121
|
+
//
|
|
122
|
+
// baseline.startConfig -> runContextFeedbackLoop -> baseline.observe(best)
|
|
123
|
+
//
|
|
124
|
+
// Ritorna l'esito dell'anello, il contesto compilato finale e la baseline
|
|
125
|
+
// aggiornata (quella nuova se ha osservato, quella corrente in dry-run).
|
|
126
|
+
export function runLearningFeedbackLoop(input, opts) {
|
|
127
|
+
const scope = (opts.scope || DEFAULT_BASELINE_SCOPE).trim() || DEFAULT_BASELINE_SCOPE;
|
|
128
|
+
const store = TunerBaselineStore.open(opts.dir, opts.storeId);
|
|
129
|
+
// Punto di partenza = config appresa (o default se mai osservato).
|
|
130
|
+
const startConfig = store.startConfig(scope);
|
|
131
|
+
// Esegue l'anello partendo dalla baseline appresa.
|
|
132
|
+
const { loop, compiled } = runContextFeedbackLoop(input, { ...opts, config: startConfig });
|
|
133
|
+
// Incorpora l'osservazione nella baseline (monotonia morbida via EMA):
|
|
134
|
+
// una bestConfig migliore attira la baseline; una peggiore non la sposta.
|
|
135
|
+
let baseline = store.get(scope);
|
|
136
|
+
if (opts.persist !== false) {
|
|
137
|
+
baseline = store.observe(scope, {
|
|
138
|
+
config: loop.bestConfig,
|
|
139
|
+
score: loop.bestScore,
|
|
140
|
+
initialScore: loop.initialScore,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return { loop, compiled, baseline };
|
|
144
|
+
}
|
|
145
|
+
// L'AUTO-MIGLIORAMENTO DEEP: non solo il KPI vincente, ma la mappa completa.
|
|
146
|
+
// Esplora in profondita' lo spazio di config compilando DAVVERO dagli store, in
|
|
147
|
+
// parallelo su tutti i pattern (preset + perturbazioni + greedy + restart),
|
|
148
|
+
// classifica le migliorie, adotta la best e la fonde nella baseline appresa (cosi'
|
|
149
|
+
// il prossimo turno parte gia' dall'architettura migliorata). Ritorna la classifica
|
|
150
|
+
// completa, il pack compilato con la best, e la baseline aggiornata.
|
|
151
|
+
//
|
|
152
|
+
// baseline.startConfig -> exploreContextPatterns(parallelo) -> ranking
|
|
153
|
+
// best -> compile(pack) + baseline.observe(best)
|
|
154
|
+
export async function runDeepSelfImprove(input, opts) {
|
|
155
|
+
const now = input.now ?? Date.now();
|
|
156
|
+
const scope = (opts.scope || DEFAULT_BASELINE_SCOPE).trim() || DEFAULT_BASELINE_SCOPE;
|
|
157
|
+
const store = TunerBaselineStore.open(opts.dir, opts.storeId);
|
|
158
|
+
// Parti dalla config gia' appresa: l'esplorazione deep scava ATTORNO e LONTANO
|
|
159
|
+
// da essa, cosi' l'apprendimento cumulativo si combina con la ricerca larga.
|
|
160
|
+
const startConfig = store.startConfig(scope);
|
|
161
|
+
// Compile reale (sincrona): data una config, compila e ritorna le metriche.
|
|
162
|
+
// Usata sia per i punti greedy/restart sia per la valutazione dei pattern.
|
|
163
|
+
// Snapshot condiviso: l'esplorazione compila decine di volte, e leggere gli
|
|
164
|
+
// store una volta per pattern moltiplicava l'I/O per il numero di pattern.
|
|
165
|
+
const base = { ...input, now, snapshot: snapshotFor(input) };
|
|
166
|
+
const compileMetrics = (config) => compileContext({ ...base, weights: config.weights, thresholds: config.thresholds }).metrics;
|
|
167
|
+
// ESPLORAZIONE DEEP IN PARALLELO. La compile e' sincrona qui: la passiamo sia
|
|
168
|
+
// come compile principale sia come compileSyncForGreedy.
|
|
169
|
+
const ranking = await exploreContextPatterns(compileMetrics, {
|
|
170
|
+
...opts,
|
|
171
|
+
baseConfig: startConfig,
|
|
172
|
+
compileSyncForGreedy: compileMetrics,
|
|
173
|
+
});
|
|
174
|
+
// Adotta la BEST della classifica e compila il pack finale con essa.
|
|
175
|
+
const best = ranking.best.config;
|
|
176
|
+
const compiled = compileContext({ ...base, weights: best.weights, thresholds: best.thresholds });
|
|
177
|
+
// Fonde la best nella baseline appresa (EMA): il prossimo turno parte da qui.
|
|
178
|
+
let baseline = store.get(scope);
|
|
179
|
+
if (opts.persist !== false) {
|
|
180
|
+
baseline = store.observe(scope, {
|
|
181
|
+
config: best,
|
|
182
|
+
score: ranking.best.score,
|
|
183
|
+
initialScore: ranking.baselineScore,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return { ranking, compiled, baseline };
|
|
187
|
+
}
|
|
188
|
+
// --- diagnostica -------------------------------------------------------------
|
|
189
|
+
// Formatta l'esito dell'anello come blocco Danilov per log/TUI.
|
|
190
|
+
export function formatLoopResult(result) {
|
|
191
|
+
const lines = [
|
|
192
|
+
"[CONTEXT_FEEDBACK_LOOP]",
|
|
193
|
+
`@anello: round=${result.rounds}, converged=${result.converged}`,
|
|
194
|
+
`@qualita: iniziale=${result.initialScore} -> migliore=${result.bestScore} (${result.improved ? "MIGLIORATO" : "stabile"})`,
|
|
195
|
+
];
|
|
196
|
+
for (const step of result.trajectory) {
|
|
197
|
+
lines.push(`@step[${step.round}]: score=${step.score}, utility=${step.metrics.contextUtility}, stale=${step.metrics.staleMemoryRate}, coverage=${step.metrics.evidenceCoverage}`);
|
|
198
|
+
const adj = formatAdjustments(step.adjustments);
|
|
199
|
+
if (step.adjustments.length)
|
|
200
|
+
lines.push(" " + adj.split("\n").join("\n "));
|
|
201
|
+
}
|
|
202
|
+
lines.push("OUTPUT: usa bestConfig come pesi/soglie dello scorer per i prossimi turni.");
|
|
203
|
+
return lines.join("\n");
|
|
204
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { contextProjectKey } from "./context-fabric.js";
|
|
3
|
+
export function contextLearningIdentity(cwd, env = process.env) {
|
|
4
|
+
return {
|
|
5
|
+
storeId: "project-" + contextProjectKey(cwd),
|
|
6
|
+
scope: env["TALOS_CTX_LEARN_SCOPE"]?.trim() || basename(cwd) || "memory-os",
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ContextCandidate } from "./context-candidate.js";
|
|
2
|
+
export interface CandidateNeighbor {
|
|
3
|
+
readonly candidate: ContextCandidate;
|
|
4
|
+
readonly weight: number;
|
|
5
|
+
}
|
|
6
|
+
/** Explicit and textual references are indexed once, not found by scanning every node per hop. */
|
|
7
|
+
export declare class CandidateLinks {
|
|
8
|
+
private readonly byId;
|
|
9
|
+
private readonly edges;
|
|
10
|
+
private readonly castles;
|
|
11
|
+
constructor(candidates: readonly ContextCandidate[]);
|
|
12
|
+
neighbors(id: string): readonly CandidateNeighbor[];
|
|
13
|
+
private link;
|
|
14
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Explicit and textual references are indexed once, not found by scanning every node per hop. */
|
|
2
|
+
export class CandidateLinks {
|
|
3
|
+
byId;
|
|
4
|
+
edges = new Map();
|
|
5
|
+
castles = new Map();
|
|
6
|
+
constructor(candidates) {
|
|
7
|
+
this.byId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
|
|
8
|
+
const nodes = [{ next: new Map(), fail: 0, ids: [] }];
|
|
9
|
+
for (const candidate of candidates) {
|
|
10
|
+
let state = 0;
|
|
11
|
+
const key = candidate.id.toLowerCase();
|
|
12
|
+
for (let i = 0; i < key.length; i++) {
|
|
13
|
+
const ch = key[i];
|
|
14
|
+
let next = nodes[state].next.get(ch);
|
|
15
|
+
if (next === undefined) {
|
|
16
|
+
next = nodes.length;
|
|
17
|
+
nodes[state].next.set(ch, next);
|
|
18
|
+
nodes.push({ next: new Map(), fail: 0, ids: [] });
|
|
19
|
+
}
|
|
20
|
+
state = next;
|
|
21
|
+
}
|
|
22
|
+
if (candidate.id)
|
|
23
|
+
nodes[state].ids.push(candidate.id);
|
|
24
|
+
const castle = prefix(candidate.id);
|
|
25
|
+
if (castle) {
|
|
26
|
+
const group = this.castles.get(castle) ?? [];
|
|
27
|
+
group.push(candidate.id);
|
|
28
|
+
this.castles.set(castle, group);
|
|
29
|
+
}
|
|
30
|
+
for (const id of candidate.links)
|
|
31
|
+
this.link(candidate.id, id, 0.68);
|
|
32
|
+
}
|
|
33
|
+
const queue = [...nodes[0].next.values()];
|
|
34
|
+
for (let i = 0; i < queue.length; i++) {
|
|
35
|
+
const state = queue[i];
|
|
36
|
+
for (const [ch, next] of nodes[state].next) {
|
|
37
|
+
let fail = nodes[state].fail;
|
|
38
|
+
while (fail && !nodes[fail].next.has(ch))
|
|
39
|
+
fail = nodes[fail].fail;
|
|
40
|
+
nodes[next].fail = nodes[fail].next.get(ch) ?? 0;
|
|
41
|
+
nodes[next].ids.push(...nodes[nodes[next].fail].ids);
|
|
42
|
+
queue.push(next);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const candidate of candidates) {
|
|
46
|
+
const text = (candidate.summary + " " + candidate.body + " " + candidate.terms.join(" ")).toLowerCase();
|
|
47
|
+
let state = 0;
|
|
48
|
+
for (let i = 0; i < text.length; i++) {
|
|
49
|
+
const ch = text[i];
|
|
50
|
+
while (state && !nodes[state].next.has(ch))
|
|
51
|
+
state = nodes[state].fail;
|
|
52
|
+
state = nodes[state].next.get(ch) ?? 0;
|
|
53
|
+
for (const id of nodes[state].ids) {
|
|
54
|
+
const start = i - id.length + 1;
|
|
55
|
+
if (!/[a-z0-9_]/i.test(text[start - 1] ?? "") && !/[a-z0-9_]/i.test(text[i + 1] ?? "")) {
|
|
56
|
+
this.link(candidate.id, id, 0.52);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
neighbors(id) {
|
|
63
|
+
const weights = new Map(this.edges.get(id));
|
|
64
|
+
for (const neighbor of this.castles.get(prefix(id)) ?? []) {
|
|
65
|
+
if (neighbor !== id && !weights.has(neighbor))
|
|
66
|
+
weights.set(neighbor, 0.18);
|
|
67
|
+
}
|
|
68
|
+
return [...weights].flatMap(([key, weight]) => {
|
|
69
|
+
const candidate = this.byId.get(key);
|
|
70
|
+
return candidate ? [{ candidate, weight }] : [];
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
link(a, b, weight) {
|
|
74
|
+
if (a === b || !this.byId.has(a) || !this.byId.has(b))
|
|
75
|
+
return;
|
|
76
|
+
for (const [from, to] of [[a, b], [b, a]]) {
|
|
77
|
+
const edges = this.edges.get(from) ?? new Map();
|
|
78
|
+
edges.set(to, Math.max(edges.get(to) ?? 0, weight));
|
|
79
|
+
this.edges.set(from, edges);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function prefix(id) { return id.includes("/") ? id.slice(0, id.indexOf("/")) : ""; }
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ContextCandidate } from "./context-candidate.js";
|
|
2
|
+
export type LintSeverity = "info" | "warn" | "error";
|
|
3
|
+
export interface LintFinding {
|
|
4
|
+
readonly code: "duplicate" | "stale" | "missing_decision" | "missing_vision" | "budget_exceeded" | "conflict";
|
|
5
|
+
readonly severity: LintSeverity;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly ids?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface LintInput {
|
|
10
|
+
readonly selected: readonly ContextCandidate[];
|
|
11
|
+
readonly tokenBudget?: number;
|
|
12
|
+
readonly renderedTokens?: number;
|
|
13
|
+
readonly hasVision?: boolean;
|
|
14
|
+
readonly hasActiveDecisions?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface LintReport {
|
|
17
|
+
readonly findings: readonly LintFinding[];
|
|
18
|
+
readonly cleaned: readonly ContextCandidate[];
|
|
19
|
+
readonly ok: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function lintContext(input: LintInput): LintReport;
|
|
22
|
+
export declare function formatLintReport(report: LintReport): string;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Context Lint (metodo Danilov, Memory OS).
|
|
2
|
+
//
|
|
3
|
+
// Controllo qualita' del Prompt Pack PRIMA della chiamata al provider. Combatte
|
|
4
|
+
// il context rot rilevando: duplicati, memorie stale/superseded, decisioni
|
|
5
|
+
// attive mancanti, Vision assente, budget superato e contraddizioni. Puo'
|
|
6
|
+
// CORREGGERE in automatico (dedup, drop stale) e segnalare il resto.
|
|
7
|
+
//
|
|
8
|
+
// Modulo PURO e deterministico: opera su candidati gia' selezionati + segnali
|
|
9
|
+
// di stato, ritorna un report + il set ripulito.
|
|
10
|
+
import { buildSupersessionGraph } from "./supersession-graph.js";
|
|
11
|
+
import { estimateCandidateTokens } from "./context-candidate.js";
|
|
12
|
+
// Esegue il lint e la pulizia automatica. Deterministico.
|
|
13
|
+
export function lintContext(input) {
|
|
14
|
+
const findings = [];
|
|
15
|
+
const selected = input.selected;
|
|
16
|
+
// 1) STALE prima della deduplica: una vecchia copia con lo stesso summary
|
|
17
|
+
// non deve eliminare quella attiva prima di essere scartata a sua volta.
|
|
18
|
+
const graph = buildSupersessionGraph(selected);
|
|
19
|
+
const staleIds = [];
|
|
20
|
+
const active = selected.filter((candidate) => {
|
|
21
|
+
const stale = candidate.status !== "active" || graph.superseded.has(candidate.id);
|
|
22
|
+
if (stale)
|
|
23
|
+
staleIds.push(candidate.id);
|
|
24
|
+
return !stale;
|
|
25
|
+
});
|
|
26
|
+
if (staleIds.length) {
|
|
27
|
+
findings.push({ code: "stale", severity: "warn", message: `rimosse ${staleIds.length} memorie obsolete/superseded`, ids: staleIds });
|
|
28
|
+
}
|
|
29
|
+
// 2) DEDUP: stessa fonte/tipo e stesso contenuto. Summary uguali possono
|
|
30
|
+
// contenere prove diverse nel body; il codice preserva anche il case.
|
|
31
|
+
const seenId = new Set();
|
|
32
|
+
const seenContent = new Set();
|
|
33
|
+
const dedupDropped = [];
|
|
34
|
+
const cleaned = [];
|
|
35
|
+
for (const c of active) {
|
|
36
|
+
const contentKey = c.subject || c.summary || c.body
|
|
37
|
+
? JSON.stringify([c.kind, c.domain, c.subject, c.summary, c.body]) : "";
|
|
38
|
+
if (seenId.has(c.id) || (contentKey && seenContent.has(contentKey))) {
|
|
39
|
+
dedupDropped.push(c.id);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
seenId.add(c.id);
|
|
43
|
+
if (contentKey)
|
|
44
|
+
seenContent.add(contentKey);
|
|
45
|
+
cleaned.push(c);
|
|
46
|
+
}
|
|
47
|
+
if (dedupDropped.length) {
|
|
48
|
+
findings.push({ code: "duplicate", severity: "info", message: `rimossi ${dedupDropped.length} duplicati`, ids: dedupDropped });
|
|
49
|
+
}
|
|
50
|
+
// 3) CONFLICT: candidati che dichiarano supersededBy verso un id ancora
|
|
51
|
+
// presente -> contraddizione residua (non risolta dal drop).
|
|
52
|
+
const presentIds = new Set(cleaned.map((c) => c.id));
|
|
53
|
+
const conflicts = cleaned.filter((c) => c.supersededBy && presentIds.has(c.supersededBy)).map((c) => c.id);
|
|
54
|
+
if (conflicts.length) {
|
|
55
|
+
findings.push({ code: "conflict", severity: "warn", message: `contraddizioni residue (supersededBy presente)`, ids: conflicts });
|
|
56
|
+
}
|
|
57
|
+
// 4) MISSING VISION.
|
|
58
|
+
if (input.hasVision === false) {
|
|
59
|
+
findings.push({ code: "missing_vision", severity: "warn", message: "Vision assente: rischio drift dalla stella polare" });
|
|
60
|
+
}
|
|
61
|
+
// 5) MISSING DECISIONS.
|
|
62
|
+
if (input.hasActiveDecisions && !cleaned.some((c) => c.kind === "decision")) {
|
|
63
|
+
findings.push({ code: "missing_decision", severity: "warn", message: "decisioni attive non incluse nel contesto" });
|
|
64
|
+
}
|
|
65
|
+
// 6) BUDGET.
|
|
66
|
+
if (input.tokenBudget !== undefined && input.tokenBudget >= 0) {
|
|
67
|
+
const used = input.renderedTokens ?? cleaned.reduce((sum, c) => sum + estimateCandidateTokens(c, "body"), 0);
|
|
68
|
+
if (used > input.tokenBudget) {
|
|
69
|
+
findings.push({
|
|
70
|
+
code: "budget_exceeded",
|
|
71
|
+
severity: "error",
|
|
72
|
+
message: `budget superato: ${used} > ${input.tokenBudget} token`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const ok = !findings.some((f) => f.severity === "error");
|
|
77
|
+
return { findings, cleaned, ok };
|
|
78
|
+
}
|
|
79
|
+
// Formatta il report del lint come blocco diagnostico (per log/debug, non per
|
|
80
|
+
// il prompt). Deterministico.
|
|
81
|
+
export function formatLintReport(report) {
|
|
82
|
+
if (!report.findings.length)
|
|
83
|
+
return "[CONTEXT_LINT] ok: nessun problema";
|
|
84
|
+
const lines = ["[CONTEXT_LINT]"];
|
|
85
|
+
for (const f of report.findings) {
|
|
86
|
+
const ids = f.ids?.length ? ` [${f.ids.join(", ")}]` : "";
|
|
87
|
+
lines.push(`@${f.code}[${f.severity}]: ${f.message}${ids}`);
|
|
88
|
+
}
|
|
89
|
+
lines.push(`OUTPUT: ${report.ok ? "pack approvato" : "pack DA CORREGGERE (errori presenti)"}`);
|
|
90
|
+
return lines.join("\n");
|
|
91
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ContextScore } from "./context-candidate.js";
|
|
2
|
+
import { type ContextCapsule } from "./context-capsule.js";
|
|
3
|
+
import { type MarketResult } from "./token-market.js";
|
|
4
|
+
export interface MarketSelectionInput {
|
|
5
|
+
readonly scored: readonly ContextScore[];
|
|
6
|
+
readonly retrievalScores?: ReadonlyMap<string, number>;
|
|
7
|
+
readonly lexScores?: ReadonlyMap<string, number>;
|
|
8
|
+
readonly evidenceBudget: number;
|
|
9
|
+
readonly memoryBudget: number;
|
|
10
|
+
readonly now: number;
|
|
11
|
+
}
|
|
12
|
+
export interface MarketSelection {
|
|
13
|
+
readonly evidence: readonly ContextCapsule[];
|
|
14
|
+
readonly memory: readonly ContextCapsule[];
|
|
15
|
+
readonly market: MarketResult;
|
|
16
|
+
}
|
|
17
|
+
export declare function selectWithMarket(input: MarketSelectionInput): MarketSelection;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { capsuleFromCandidate, withExpansion } from "./context-capsule.js";
|
|
2
|
+
import { renderCapsules, tokensAtLevel } from "./expansion-levels.js";
|
|
3
|
+
import { estimateTokens } from "./budget-allocator.js";
|
|
4
|
+
import { runTokenMarket } from "./token-market.js";
|
|
5
|
+
export function selectWithMarket(input) {
|
|
6
|
+
const eligible = input.scored.filter((score) => score.tier !== "low");
|
|
7
|
+
const maxScore = eligible.reduce((max, score) => Math.max(max, score.score), 0);
|
|
8
|
+
const novelty = new Map(eligible.map((score) => [score.candidate.id, score.factors.novelty]));
|
|
9
|
+
const capsules = eligible.map((score) => capsuleFromCandidate(score.candidate, {
|
|
10
|
+
now: input.now,
|
|
11
|
+
...(maxScore > 0 ? { utility: Math.max(0, score.score) / maxScore } : {}),
|
|
12
|
+
}));
|
|
13
|
+
const proposed = runTokenMarket(capsules, {
|
|
14
|
+
tokenBudget: Math.max(0, input.evidenceBudget) + Math.max(0, input.memoryBudget),
|
|
15
|
+
...((input.retrievalScores?.size || input.lexScores?.size)
|
|
16
|
+
? { relevance: input.retrievalScores ?? input.lexScores } : {}),
|
|
17
|
+
novelty,
|
|
18
|
+
});
|
|
19
|
+
const evidence = [];
|
|
20
|
+
const memory = [];
|
|
21
|
+
const admitted = [];
|
|
22
|
+
const dropped = [...proposed.dropped];
|
|
23
|
+
for (const allocation of proposed.admitted) {
|
|
24
|
+
if (allocation.level === "drop")
|
|
25
|
+
continue;
|
|
26
|
+
let placed = false;
|
|
27
|
+
for (let level = allocation.level; level >= 0; level -= 1) {
|
|
28
|
+
const expansion = level;
|
|
29
|
+
const capsule = withExpansion(allocation.capsule, expansion);
|
|
30
|
+
const zone = level >= 3 ? evidence : memory;
|
|
31
|
+
const budget = level >= 3 ? input.evidenceBudget : input.memoryBudget;
|
|
32
|
+
if (estimateTokens(renderCapsules([...zone, capsule])) > budget)
|
|
33
|
+
continue;
|
|
34
|
+
zone.push(capsule);
|
|
35
|
+
admitted.push({ ...allocation, capsule, level: expansion, tokensUsed: tokensAtLevel(capsule, expansion) });
|
|
36
|
+
placed = true;
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
if (!placed)
|
|
40
|
+
dropped.push({ ...allocation, level: "drop", tokensUsed: 0 });
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
evidence,
|
|
44
|
+
memory,
|
|
45
|
+
market: {
|
|
46
|
+
admitted, dropped, tokenBudget: proposed.tokenBudget,
|
|
47
|
+
tokensUsed: estimateTokens(renderCapsules(evidence)) + estimateTokens(renderCapsules(memory)),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ContextScore } from "./context-candidate.js";
|
|
2
|
+
import type { LintReport } from "./context-lint.js";
|
|
3
|
+
export interface ContextMetrics {
|
|
4
|
+
readonly contextUtility: number;
|
|
5
|
+
readonly staleMemoryRate: number;
|
|
6
|
+
readonly evidenceCoverage: number;
|
|
7
|
+
readonly decisionConsistency: boolean;
|
|
8
|
+
readonly counts: {
|
|
9
|
+
readonly total: number;
|
|
10
|
+
readonly high: number;
|
|
11
|
+
readonly mid: number;
|
|
12
|
+
readonly low: number;
|
|
13
|
+
readonly stale: number;
|
|
14
|
+
readonly packTokens: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface MetricsInput {
|
|
18
|
+
readonly scored: readonly ContextScore[];
|
|
19
|
+
readonly pack: string;
|
|
20
|
+
readonly report: LintReport;
|
|
21
|
+
readonly includedIds?: ReadonlySet<string>;
|
|
22
|
+
readonly evidenceIds?: ReadonlySet<string>;
|
|
23
|
+
}
|
|
24
|
+
export declare function computeContextMetrics(input: MetricsInput): ContextMetrics;
|
|
25
|
+
export declare function formatContextMetrics(m: ContextMetrics): string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Context Metrics (metodo Danilov, Memory OS).
|
|
2
|
+
//
|
|
3
|
+
// "Non basta dire che e' migliore: bisogna misurarlo." Questo modulo calcola le
|
|
4
|
+
// metriche chiave del documento talos-context su un contesto compilato, per
|
|
5
|
+
// benchmark interni e diagnostica del Context Window Compiler.
|
|
6
|
+
//
|
|
7
|
+
// context_utility = informazioni utili (tier high/mid) per 1k token
|
|
8
|
+
// stale_memory_rate = quota di candidati obsoleti/superseded entrati
|
|
9
|
+
// evidence_coverage = quota di risposte sul passato coperte da evidenze
|
|
10
|
+
// decision_consistency = nessun superseded incluso tra le decisioni
|
|
11
|
+
//
|
|
12
|
+
// Modulo PURO e deterministico: opera su ContextScore + report di lint.
|
|
13
|
+
import { estimateTokens } from "./budget-allocator.js";
|
|
14
|
+
// Calcola le metriche del contesto compilato. Deterministico.
|
|
15
|
+
export function computeContextMetrics(input) {
|
|
16
|
+
const scored = input.scored;
|
|
17
|
+
const total = scored.length;
|
|
18
|
+
const admitted = input.includedIds
|
|
19
|
+
? scored.filter((score) => input.includedIds?.has(score.candidate.id))
|
|
20
|
+
: scored.filter((score) => score.tier !== "low");
|
|
21
|
+
const high = admitted.filter((s) => s.tier === "high").length;
|
|
22
|
+
const mid = admitted.filter((s) => s.tier === "mid").length;
|
|
23
|
+
const low = Math.max(0, total - high - mid);
|
|
24
|
+
const useful = high + mid;
|
|
25
|
+
const packTokens = estimateTokens(input.pack);
|
|
26
|
+
const contextUtility = packTokens ? round((useful / packTokens) * 1000) : 0;
|
|
27
|
+
// Stale: candidati inclusi (non low) che risultano non-active.
|
|
28
|
+
const included = admitted;
|
|
29
|
+
const stale = included.filter((s) => s.candidate.status !== "active" || s.candidate.supersededBy).length;
|
|
30
|
+
const staleMemoryRate = included.length ? round(stale / included.length) : 0;
|
|
31
|
+
const evidenceCount = input.evidenceIds
|
|
32
|
+
? admitted.filter((score) => input.evidenceIds?.has(score.candidate.id)).length
|
|
33
|
+
: high;
|
|
34
|
+
const evidenceCoverage = admitted.length ? round(evidenceCount / admitted.length) : 0;
|
|
35
|
+
const decisionConsistency = !included.some((s) => s.candidate.kind === "decision" && (s.candidate.status !== "active" || s.candidate.supersededBy));
|
|
36
|
+
return {
|
|
37
|
+
contextUtility,
|
|
38
|
+
staleMemoryRate,
|
|
39
|
+
evidenceCoverage,
|
|
40
|
+
decisionConsistency,
|
|
41
|
+
counts: { total, high, mid, low, stale, packTokens },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Formatta le metriche come blocco Danilov (diagnostica/log).
|
|
45
|
+
export function formatContextMetrics(m) {
|
|
46
|
+
return [
|
|
47
|
+
"[CONTEXT_METRICS]",
|
|
48
|
+
`@metrica[context_utility]: ${m.contextUtility} utili/1k_token`,
|
|
49
|
+
`@metrica[stale_memory_rate]: ${m.staleMemoryRate}`,
|
|
50
|
+
`@metrica[evidence_coverage]: ${m.evidenceCoverage}`,
|
|
51
|
+
`@metrica[decision_consistency]: ${m.decisionConsistency}`,
|
|
52
|
+
`@counts: total=${m.counts.total}, high=${m.counts.high}, mid=${m.counts.mid}, low=${m.counts.low}, stale=${m.counts.stale}, pack_tokens=${m.counts.packTokens}`,
|
|
53
|
+
].join("\n");
|
|
54
|
+
}
|
|
55
|
+
function round(v) {
|
|
56
|
+
return Math.round(v * 1000) / 1000;
|
|
57
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ContextCandidate } from "./context-candidate.js";
|
|
2
|
+
export interface RenderedSelection<T> {
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly included: readonly T[];
|
|
5
|
+
readonly excluded: readonly T[];
|
|
6
|
+
}
|
|
7
|
+
export declare function packRendered<T>(items: readonly T[], render: (item: T) => string, maxTokens: number, envelope?: {
|
|
8
|
+
readonly before?: string;
|
|
9
|
+
readonly after?: string;
|
|
10
|
+
}): RenderedSelection<T>;
|
|
11
|
+
export declare function remainingTokens(budget: number, prefix: string): number;
|
|
12
|
+
export declare function renderControlLane(candidates: readonly ContextCandidate[], tokenBudget: number): RenderedSelection<ContextCandidate>;
|
|
13
|
+
export declare function renderHandle(candidate: ContextCandidate): string;
|
|
14
|
+
export declare const HANDLE_GUIDE = "HANDLES (usa recall <id> per espandere quando serve il dettaglio):";
|
|
15
|
+
export declare function renderEvidence(candidate: ContextCandidate): string;
|
|
16
|
+
export declare function joinBlocks(...blocks: readonly string[]): string;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { estimateTokens } from "./budget-allocator.js";
|
|
2
|
+
export function packRendered(items, render, maxTokens, envelope = {}) {
|
|
3
|
+
const included = [];
|
|
4
|
+
const excluded = [];
|
|
5
|
+
const blocks = [];
|
|
6
|
+
let text = "";
|
|
7
|
+
for (const item of items) {
|
|
8
|
+
const block = render(item).trim();
|
|
9
|
+
const next = joinBlocks(envelope.before ?? "", ...blocks, block, envelope.after ?? "");
|
|
10
|
+
if (block && estimateTokens(next) <= maxTokens) {
|
|
11
|
+
blocks.push(block);
|
|
12
|
+
included.push(item);
|
|
13
|
+
text = next;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
excluded.push(item);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { text, included, excluded };
|
|
20
|
+
}
|
|
21
|
+
export function remainingTokens(budget, prefix) {
|
|
22
|
+
return Math.max(0, budget - (prefix ? estimateTokens(`${prefix}\n\n`) : 0));
|
|
23
|
+
}
|
|
24
|
+
export function renderControlLane(candidates, tokenBudget) {
|
|
25
|
+
return packRendered(candidates, (candidate) => `@control[${candidate.id}/${candidate.kind}]: ${oneLine(candidate.summary || candidate.subject, 180)}`, tokenBudget, {
|
|
26
|
+
before: "[CONTROL_LANE]\nFonte autoritativa: non dichiarare completati task aperti e non contraddire decisioni attive.",
|
|
27
|
+
after: "[/CONTROL_LANE]",
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export function renderHandle(candidate) {
|
|
31
|
+
return `@handle[${candidate.id}]: kind=${candidate.kind}, "${oneLine(candidate.summary, 90)}"`;
|
|
32
|
+
}
|
|
33
|
+
export const HANDLE_GUIDE = "HANDLES (usa recall <id> per espandere quando serve il dettaglio):";
|
|
34
|
+
export function renderEvidence(candidate) {
|
|
35
|
+
return [
|
|
36
|
+
`[EVIDENCE:${candidate.id}]`,
|
|
37
|
+
`domain=${candidate.domain}`,
|
|
38
|
+
`kind=${candidate.kind}`,
|
|
39
|
+
`subject=${oneLine(candidate.subject, 100)}`,
|
|
40
|
+
`summary="${oneLine(candidate.summary, 160)}"`,
|
|
41
|
+
`confidence=${candidate.trust}`,
|
|
42
|
+
`supersededBy=${candidate.supersededBy ?? "null"}`,
|
|
43
|
+
candidate.body ? `body="${oneLine(candidate.body, 400)}"` : "",
|
|
44
|
+
].filter(Boolean).join("\n");
|
|
45
|
+
}
|
|
46
|
+
function oneLine(value, max) {
|
|
47
|
+
const text = value.replace(/\s+/g, " ").trim().replace(/"/g, "'");
|
|
48
|
+
return text.length > max ? text.slice(0, max - 1).trimEnd() + "…" : text;
|
|
49
|
+
}
|
|
50
|
+
export function joinBlocks(...blocks) {
|
|
51
|
+
return blocks.map((block) => block.trim()).filter(Boolean).join("\n\n");
|
|
52
|
+
}
|