@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,583 @@
|
|
|
1
|
+
// Ramification — piano di progetto a rami per task a orizzonte lungo.
|
|
2
|
+
//
|
|
3
|
+
// Il modello: un team fondatore progetta un percorso lungo e lo divide in RAMI,
|
|
4
|
+
// uno per ingegnere. Ogni ramo e' una sequenza di NODI, e un nodo NON e' una
|
|
5
|
+
// tacca su una lista: e' una sessione intera di lavoro (un ingegnere piu' uno o
|
|
6
|
+
// piu' agenti che si parlano) che finisce consegnando una TRANSAZIONE — cosa ha
|
|
7
|
+
// prodotto, come lo ha provato, con quale commit. E' per questo che il piano
|
|
8
|
+
// regge su settimane: non vive in una finestra di contesto, vive qui, e una
|
|
9
|
+
// sessione nuova riparte dalla FRONTIERA dei nodi sbloccati.
|
|
10
|
+
//
|
|
11
|
+
// Il cancello, che e' la differenza fra una lista ordinata e una ramificazione:
|
|
12
|
+
// un nodo non si sblocca perche' il precedente e' "finito", ma perche' qualcuno
|
|
13
|
+
// ha giudicato la sua transazione rispetto alla VISIONE del ramo. Tre esiti:
|
|
14
|
+
// passa (sblocca i figli), torna indietro (con le ragioni), oppure il lavoro ha
|
|
15
|
+
// scoperto qualcosa che rende sbagliato il seguito e il FUTURO del ramo va
|
|
16
|
+
// riscritto — cosa che puo' fare solo il team fondatore.
|
|
17
|
+
//
|
|
18
|
+
// Il passato non si tocca. Un nodo consegnato e approvato e' immutabile: una
|
|
19
|
+
// mutazione puo' riscrivere solo cio' che non e' ancora stato consegnato. Senza
|
|
20
|
+
// questa regola un piano lungo si passa la vita a rimettere in discussione
|
|
21
|
+
// quello che aveva gia' verificato.
|
|
22
|
+
//
|
|
23
|
+
// Modulo PURO: ogni operazione ritorna un piano NUOVO, niente I/O, niente date
|
|
24
|
+
// implicite (l'istante si passa). La persistenza e la conversazione stanno
|
|
25
|
+
// altrove.
|
|
26
|
+
const MAX_LOG = 500;
|
|
27
|
+
function clean(value, max) {
|
|
28
|
+
// I caratteri di controllo si filtrano per CODICE, non con una classe di
|
|
29
|
+
// caratteri: metterli letterali nel sorgente li rende invisibili a chi legge
|
|
30
|
+
// e fragili a ogni passaggio di strumento.
|
|
31
|
+
let out = "";
|
|
32
|
+
for (const ch of String(value ?? "")) {
|
|
33
|
+
const code = ch.codePointAt(0) ?? 0;
|
|
34
|
+
out += code < 0x20 || code === 0x7f ? " " : ch;
|
|
35
|
+
}
|
|
36
|
+
return out.replace(/\s+/g, " ").trim().slice(0, max);
|
|
37
|
+
}
|
|
38
|
+
function list(value, max, each) {
|
|
39
|
+
return (value ?? []).map((item) => clean(item, each)).filter(Boolean).slice(0, max);
|
|
40
|
+
}
|
|
41
|
+
function note(roadmap, entry) {
|
|
42
|
+
const next = [...roadmap.log, entry];
|
|
43
|
+
return next.length > MAX_LOG ? next.slice(next.length - MAX_LOG) : next;
|
|
44
|
+
}
|
|
45
|
+
function refuse(roadmap, by, subject, reason, at) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
reason,
|
|
49
|
+
roadmap: {
|
|
50
|
+
...roadmap,
|
|
51
|
+
log: note(roadmap, { kind: "refused", by: clean(by, 80), subject: clean(subject, 80), detail: reason, at }),
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function createRoadmap(input) {
|
|
56
|
+
const goal = clean(input.goal, 600);
|
|
57
|
+
return {
|
|
58
|
+
goal,
|
|
59
|
+
acceptance: list(input.acceptance, 12, 200),
|
|
60
|
+
founders: list(input.founders, 8, 80),
|
|
61
|
+
branches: [],
|
|
62
|
+
nodes: {},
|
|
63
|
+
proposals: [],
|
|
64
|
+
crosstalk: [],
|
|
65
|
+
log: [{ kind: "roadmap.created", by: "team", subject: goal.slice(0, 80), detail: goal, at: input.at }],
|
|
66
|
+
revision: 1,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function addBranch(roadmap, input) {
|
|
70
|
+
const id = clean(input.id, 60).toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
71
|
+
if (!id)
|
|
72
|
+
return refuse(roadmap, input.owner, "", "il ramo ha bisogno di un id", input.at);
|
|
73
|
+
if (roadmap.branches.some((b) => b.id === id)) {
|
|
74
|
+
return refuse(roadmap, input.owner, id, `il ramo ${id} esiste gia'`, input.at);
|
|
75
|
+
}
|
|
76
|
+
const owner = clean(input.owner, 80);
|
|
77
|
+
const vision = clean(input.vision, 400);
|
|
78
|
+
if (!vision)
|
|
79
|
+
return refuse(roadmap, owner, id, "un ramo senza visione non ha un metro per giudicare i suoi nodi", input.at);
|
|
80
|
+
const branch = { id, owner, vision, nodes: [] };
|
|
81
|
+
return {
|
|
82
|
+
ok: true,
|
|
83
|
+
roadmap: {
|
|
84
|
+
...roadmap,
|
|
85
|
+
branches: [...roadmap.branches, branch],
|
|
86
|
+
log: note(roadmap, { kind: "branch.added", by: owner, subject: id, detail: vision, at: input.at }),
|
|
87
|
+
revision: roadmap.revision + 1,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Stato calcolato di un nodo non ancora preso: sbloccato solo se OGNI
|
|
92
|
+
// prerequisito e' approvato. E' la regola dell'albero delle abilita'.
|
|
93
|
+
function resolvedState(node, nodes) {
|
|
94
|
+
if (node.state === "running" || node.state === "review" || node.state === "committed")
|
|
95
|
+
return node.state;
|
|
96
|
+
const pending = node.after.filter((id) => nodes[id]?.state !== "committed");
|
|
97
|
+
if (pending.length)
|
|
98
|
+
return "locked";
|
|
99
|
+
return node.state === "returned" ? "returned" : "ready";
|
|
100
|
+
}
|
|
101
|
+
// Ricalcola gli sblocchi dopo ogni cambiamento. Deterministico e idempotente.
|
|
102
|
+
function relock(nodes) {
|
|
103
|
+
const out = {};
|
|
104
|
+
for (const [id, node] of Object.entries(nodes)) {
|
|
105
|
+
const state = resolvedState(node, nodes);
|
|
106
|
+
out[id] = state === node.state ? node : { ...node, state };
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
export function addNode(roadmap, input) {
|
|
111
|
+
const id = clean(input.id, 40);
|
|
112
|
+
const by = clean(input.by, 80);
|
|
113
|
+
if (!id)
|
|
114
|
+
return refuse(roadmap, by, "", "il nodo ha bisogno di un id", input.at);
|
|
115
|
+
if (roadmap.nodes[id])
|
|
116
|
+
return refuse(roadmap, by, id, `il nodo ${id} esiste gia'`, input.at);
|
|
117
|
+
const branch = roadmap.branches.find((b) => b.id === clean(input.branch, 60));
|
|
118
|
+
if (!branch)
|
|
119
|
+
return refuse(roadmap, by, id, `ramo sconosciuto: ${clean(input.branch, 60)}`, input.at);
|
|
120
|
+
const mandate = clean(input.mandate, 900);
|
|
121
|
+
if (!mandate)
|
|
122
|
+
return refuse(roadmap, by, id, "un nodo senza mandato non e' assegnabile a nessuno", input.at);
|
|
123
|
+
const after = list(input.after, 12, 40);
|
|
124
|
+
const ignoto = after.find((ref) => !roadmap.nodes[ref]);
|
|
125
|
+
if (ignoto)
|
|
126
|
+
return refuse(roadmap, by, id, `prerequisito inesistente: ${ignoto}`, input.at);
|
|
127
|
+
const node = {
|
|
128
|
+
id,
|
|
129
|
+
branch: branch.id,
|
|
130
|
+
title: clean(input.title, 160) || id,
|
|
131
|
+
mandate,
|
|
132
|
+
acceptance: list(input.acceptance, 10, 200),
|
|
133
|
+
after,
|
|
134
|
+
state: "ready",
|
|
135
|
+
returns: 0,
|
|
136
|
+
};
|
|
137
|
+
const nodes = relock({ ...roadmap.nodes, [id]: node });
|
|
138
|
+
return {
|
|
139
|
+
ok: true,
|
|
140
|
+
roadmap: {
|
|
141
|
+
...roadmap,
|
|
142
|
+
nodes,
|
|
143
|
+
branches: roadmap.branches.map((b) => (b.id === branch.id ? { ...b, nodes: [...b.nodes, id] } : b)),
|
|
144
|
+
log: note(roadmap, { kind: "node.added", by, subject: id, detail: node.title, at: input.at }),
|
|
145
|
+
revision: roadmap.revision + 1,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// I nodi che una sessione puo' prendere ADESSO. E' da qui che riparte una
|
|
150
|
+
// sessione nuova: non dal principio del piano, dalla frontiera.
|
|
151
|
+
export function frontier(roadmap) {
|
|
152
|
+
return Object.values(roadmap.nodes)
|
|
153
|
+
.filter((node) => node.state === "ready" || node.state === "returned")
|
|
154
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
155
|
+
}
|
|
156
|
+
export function startNode(roadmap, input) {
|
|
157
|
+
const id = clean(input.id, 40);
|
|
158
|
+
const by = clean(input.by, 80);
|
|
159
|
+
const node = roadmap.nodes[id];
|
|
160
|
+
if (!node)
|
|
161
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
162
|
+
if (node.state === "locked") {
|
|
163
|
+
const mancanti = node.after.filter((ref) => roadmap.nodes[ref]?.state !== "committed");
|
|
164
|
+
return refuse(roadmap, by, id, `nodo bloccato: prima serve ${mancanti.join(", ")}`, input.at);
|
|
165
|
+
}
|
|
166
|
+
if (node.state !== "ready" && node.state !== "returned") {
|
|
167
|
+
return refuse(roadmap, by, id, `nodo gia' ${node.state}`, input.at);
|
|
168
|
+
}
|
|
169
|
+
const sessionId = clean(input.sessionId, 120);
|
|
170
|
+
if (!sessionId)
|
|
171
|
+
return refuse(roadmap, by, id, "un nodo e' una sessione: serve l'id della sessione che lo esegue", input.at);
|
|
172
|
+
const nodes = { ...roadmap.nodes, [id]: { ...node, state: "running", sessionId } };
|
|
173
|
+
return {
|
|
174
|
+
ok: true,
|
|
175
|
+
roadmap: {
|
|
176
|
+
...roadmap,
|
|
177
|
+
nodes,
|
|
178
|
+
log: note(roadmap, { kind: "node.started", by, subject: id, detail: sessionId, at: input.at }),
|
|
179
|
+
revision: roadmap.revision + 1,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// Consegna. Senza artefatto e senza prove non e' una consegna: e' una
|
|
184
|
+
// dichiarazione, e su una dichiarazione non si puo' giudicare niente.
|
|
185
|
+
export function submitNode(roadmap, input) {
|
|
186
|
+
const id = clean(input.id, 40);
|
|
187
|
+
const by = clean(input.by, 80);
|
|
188
|
+
const node = roadmap.nodes[id];
|
|
189
|
+
if (!node)
|
|
190
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
191
|
+
if (node.state !== "running")
|
|
192
|
+
return refuse(roadmap, by, id, `il nodo non e' in esecuzione (${node.state})`, input.at);
|
|
193
|
+
const artifact = clean(input.transaction?.artifact, 400);
|
|
194
|
+
const evidence = list(input.transaction?.evidence, 20, 300);
|
|
195
|
+
if (!artifact)
|
|
196
|
+
return refuse(roadmap, by, id, "consegna senza artefatto", input.at);
|
|
197
|
+
if (!evidence.length)
|
|
198
|
+
return refuse(roadmap, by, id, "consegna senza prove: dichiara cosa hai verificato e come", input.at);
|
|
199
|
+
const transaction = {
|
|
200
|
+
artifact,
|
|
201
|
+
tests: list(input.transaction?.tests, 20, 300),
|
|
202
|
+
evidence,
|
|
203
|
+
commit: clean(input.transaction?.commit, 120),
|
|
204
|
+
at: input.at,
|
|
205
|
+
};
|
|
206
|
+
const nodes = { ...roadmap.nodes, [id]: { ...node, state: "review", transaction } };
|
|
207
|
+
return {
|
|
208
|
+
ok: true,
|
|
209
|
+
roadmap: {
|
|
210
|
+
...roadmap,
|
|
211
|
+
nodes,
|
|
212
|
+
log: note(roadmap, { kind: "node.submitted", by, subject: id, detail: artifact, at: input.at }),
|
|
213
|
+
revision: roadmap.revision + 1,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Prima di giudicare si CHIEDE. Nella realta' un capo ramo non decide da solo
|
|
218
|
+
// guardando un diff: sente chi ha fatto il lavoro, o chi conosce il pezzo che
|
|
219
|
+
// il lavoro tocca. Qui resta la traccia della domanda; la risposta arriva
|
|
220
|
+
// parlando, sul canale del team, e finisce nel verdetto come `consulted`.
|
|
221
|
+
export function consultOnNode(roadmap, input) {
|
|
222
|
+
const id = clean(input.id, 40);
|
|
223
|
+
const by = clean(input.by, 80);
|
|
224
|
+
const who = clean(input.who, 80);
|
|
225
|
+
const node = roadmap.nodes[id];
|
|
226
|
+
if (!node)
|
|
227
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
228
|
+
if (!who)
|
|
229
|
+
return refuse(roadmap, by, id, "a chi lo chiedi?", input.at);
|
|
230
|
+
const question = clean(input.question, 600);
|
|
231
|
+
if (!question)
|
|
232
|
+
return refuse(roadmap, by, id, "una consultazione senza domanda non serve a nessuno", input.at);
|
|
233
|
+
return {
|
|
234
|
+
ok: true,
|
|
235
|
+
roadmap: {
|
|
236
|
+
...roadmap,
|
|
237
|
+
log: note(roadmap, { kind: "node.consulted", by, subject: `${id}->${who}`, detail: question, at: input.at }),
|
|
238
|
+
revision: roadmap.revision + 1,
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Il cancello. Giudica CHI possiede il ramo (o un fondatore), rispetto alla
|
|
243
|
+
// visione del ramo e ai criteri del nodo.
|
|
244
|
+
export function judgeNode(roadmap, input) {
|
|
245
|
+
const id = clean(input.id, 40);
|
|
246
|
+
const by = clean(input.by, 80);
|
|
247
|
+
const node = roadmap.nodes[id];
|
|
248
|
+
if (!node)
|
|
249
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
250
|
+
if (node.state !== "review")
|
|
251
|
+
return refuse(roadmap, by, id, `niente da giudicare: il nodo e' ${node.state}`, input.at);
|
|
252
|
+
const branch = roadmap.branches.find((b) => b.id === node.branch);
|
|
253
|
+
const titolare = branch ? branch.owner : "";
|
|
254
|
+
if (by && titolare && by !== titolare && !roadmap.founders.includes(by)) {
|
|
255
|
+
return refuse(roadmap, by, id, `il ramo ${node.branch} lo giudica ${titolare}`, input.at);
|
|
256
|
+
}
|
|
257
|
+
const reason = clean(input.reason, 600);
|
|
258
|
+
if (input.decision !== "pass" && !reason) {
|
|
259
|
+
return refuse(roadmap, by, id, "rimandare indietro senza ragioni non e' un giudizio", input.at);
|
|
260
|
+
}
|
|
261
|
+
const consulted = list(input.consulted, 8, 80);
|
|
262
|
+
const verdict = {
|
|
263
|
+
decision: input.decision,
|
|
264
|
+
by,
|
|
265
|
+
reason,
|
|
266
|
+
...(consulted.length ? { consulted } : {}),
|
|
267
|
+
at: input.at,
|
|
268
|
+
};
|
|
269
|
+
if (input.decision === "pass") {
|
|
270
|
+
const nodes = relock({ ...roadmap.nodes, [id]: { ...node, state: "committed", verdict } });
|
|
271
|
+
return {
|
|
272
|
+
ok: true,
|
|
273
|
+
roadmap: {
|
|
274
|
+
...roadmap,
|
|
275
|
+
nodes,
|
|
276
|
+
log: note(roadmap, { kind: "node.committed", by, subject: id, detail: reason || node.title, at: input.at }),
|
|
277
|
+
revision: roadmap.revision + 1,
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
if (input.decision === "return") {
|
|
282
|
+
const nodes = relock({
|
|
283
|
+
...roadmap.nodes,
|
|
284
|
+
[id]: { ...node, state: "returned", verdict, returns: node.returns + 1 },
|
|
285
|
+
});
|
|
286
|
+
return {
|
|
287
|
+
ok: true,
|
|
288
|
+
roadmap: {
|
|
289
|
+
...roadmap,
|
|
290
|
+
nodes,
|
|
291
|
+
log: note(roadmap, { kind: "node.returned", by, subject: id, detail: reason, at: input.at }),
|
|
292
|
+
revision: roadmap.revision + 1,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
// replan: il nodo resta consegnato e in attesa. Non e' l'esecutore a
|
|
297
|
+
// riscrivere il seguito: il team fondatore applica la mutazione.
|
|
298
|
+
const nodes = { ...roadmap.nodes, [id]: { ...node, verdict } };
|
|
299
|
+
return {
|
|
300
|
+
ok: true,
|
|
301
|
+
roadmap: {
|
|
302
|
+
...roadmap,
|
|
303
|
+
nodes,
|
|
304
|
+
log: note(roadmap, { kind: "node.replan", by, subject: id, detail: reason, at: input.at }),
|
|
305
|
+
revision: roadmap.revision + 1,
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
// Chi esegue PROPONE. Parlando col capo ramo si accorge che il seguito assume
|
|
310
|
+
// qualcosa che non regge: mette la sua riscrittura sul tavolo, con il motivo.
|
|
311
|
+
// Non la applica: la propone, e resta in attesa di una decisione.
|
|
312
|
+
export function proposeMutation(roadmap, input) {
|
|
313
|
+
const by = clean(input.by, 80);
|
|
314
|
+
const id = clean(input.id, 60);
|
|
315
|
+
if (!id)
|
|
316
|
+
return refuse(roadmap, by, "", "la proposta ha bisogno di un id", input.at);
|
|
317
|
+
if (roadmap.proposals.some((p) => p.id === id)) {
|
|
318
|
+
return refuse(roadmap, by, id, `la proposta ${id} esiste gia'`, input.at);
|
|
319
|
+
}
|
|
320
|
+
const branch = clean(input.branch, 60);
|
|
321
|
+
if (branch && !roadmap.branches.some((b) => b.id === branch)) {
|
|
322
|
+
return refuse(roadmap, by, id, `ramo sconosciuto: ${branch}`, input.at);
|
|
323
|
+
}
|
|
324
|
+
const reason = clean(input.reason, 600);
|
|
325
|
+
if (!reason)
|
|
326
|
+
return refuse(roadmap, by, id, "una proposta senza il limite che l'ha causata non si puo' valutare", input.at);
|
|
327
|
+
// Si prova subito a vuoto: una proposta che non si potrebbe comunque
|
|
328
|
+
// applicare va rifiutata adesso, non dopo che qualcuno l'ha approvata.
|
|
329
|
+
const prova = mutateFuture(roadmap, { mutation: input.mutation, by: roadmap.founders[0] ?? by, reason, at: input.at });
|
|
330
|
+
if (!prova.ok)
|
|
331
|
+
return refuse(roadmap, by, id, `proposta non applicabile: ${prova.reason}`, input.at);
|
|
332
|
+
const proposal = { id, by, branch, reason, mutation: input.mutation, state: "pending", at: input.at };
|
|
333
|
+
return {
|
|
334
|
+
ok: true,
|
|
335
|
+
roadmap: {
|
|
336
|
+
...roadmap,
|
|
337
|
+
proposals: [...roadmap.proposals, proposal],
|
|
338
|
+
log: note(roadmap, { kind: "mutation.proposed", by, subject: id, detail: reason, at: input.at }),
|
|
339
|
+
revision: roadmap.revision + 1,
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
// Il team fondatore decide sulla proposta. Accettata, la mutazione viene
|
|
344
|
+
// applicata qui: e' l'unico punto in cui il futuro cambia davvero.
|
|
345
|
+
export function resolveProposal(roadmap, input) {
|
|
346
|
+
const by = clean(input.by, 80);
|
|
347
|
+
const id = clean(input.id, 60);
|
|
348
|
+
const proposal = roadmap.proposals.find((p) => p.id === id);
|
|
349
|
+
if (!proposal)
|
|
350
|
+
return refuse(roadmap, by, id, `proposta sconosciuta: ${id}`, input.at);
|
|
351
|
+
if (proposal.state !== "pending")
|
|
352
|
+
return refuse(roadmap, by, id, `proposta gia' ${proposal.state}`, input.at);
|
|
353
|
+
if (roadmap.founders.length && !roadmap.founders.includes(by)) {
|
|
354
|
+
return refuse(roadmap, by, id, "sulle proposte decide il team che ha aperto la ramificazione", input.at);
|
|
355
|
+
}
|
|
356
|
+
const reason = clean(input.reason, 600);
|
|
357
|
+
const segna = (state) => roadmap.proposals.map((p) => (p.id === id ? { ...p, state } : p));
|
|
358
|
+
if (!input.accept) {
|
|
359
|
+
if (!reason)
|
|
360
|
+
return refuse(roadmap, by, id, "rifiutare una proposta senza ragioni non e' una decisione", input.at);
|
|
361
|
+
return {
|
|
362
|
+
ok: true,
|
|
363
|
+
roadmap: {
|
|
364
|
+
...roadmap,
|
|
365
|
+
proposals: segna("rejected"),
|
|
366
|
+
log: note(roadmap, { kind: "mutation.rejected", by, subject: id, detail: reason, at: input.at }),
|
|
367
|
+
revision: roadmap.revision + 1,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
const esito = mutateFuture(roadmap, {
|
|
372
|
+
mutation: proposal.mutation,
|
|
373
|
+
by,
|
|
374
|
+
reason: reason || proposal.reason,
|
|
375
|
+
at: input.at,
|
|
376
|
+
});
|
|
377
|
+
if (!esito.ok)
|
|
378
|
+
return esito;
|
|
379
|
+
return {
|
|
380
|
+
ok: true,
|
|
381
|
+
roadmap: {
|
|
382
|
+
...esito.roadmap,
|
|
383
|
+
proposals: esito.roadmap.proposals.map((p) => (p.id === id ? { ...p, state: "accepted" } : p)),
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
// Riscrittura del FUTURO. Solo il team fondatore, e solo su cio' che non e'
|
|
388
|
+
// ancora stato approvato: il passato verificato non si rimette in discussione.
|
|
389
|
+
export function mutateFuture(roadmap, input) {
|
|
390
|
+
const by = clean(input.by, 80);
|
|
391
|
+
if (roadmap.founders.length && !roadmap.founders.includes(by)) {
|
|
392
|
+
return refuse(roadmap, by, "", "il futuro di un ramo lo riscrive il team che lo ha aperto", input.at);
|
|
393
|
+
}
|
|
394
|
+
const reason = clean(input.reason, 600);
|
|
395
|
+
if (!reason)
|
|
396
|
+
return refuse(roadmap, by, "", "una mutazione senza motivo non e' tracciabile", input.at);
|
|
397
|
+
let nodes = { ...roadmap.nodes };
|
|
398
|
+
let branches = roadmap.branches.map((b) => ({ ...b, nodes: [...b.nodes] }));
|
|
399
|
+
for (const id of list(input.mutation.drop, 40, 40)) {
|
|
400
|
+
const node = nodes[id];
|
|
401
|
+
if (!node)
|
|
402
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
403
|
+
if (node.state === "committed")
|
|
404
|
+
return refuse(roadmap, by, id, `${id} e' gia' approvato: il passato non si tocca`, input.at);
|
|
405
|
+
const dipendenti = Object.values(nodes).filter((other) => other.after.includes(id)).map((other) => other.id);
|
|
406
|
+
if (dipendenti.length)
|
|
407
|
+
return refuse(roadmap, by, id, `${id} sblocca ${dipendenti.join(", ")}: togli prima quelli`, input.at);
|
|
408
|
+
delete nodes[id];
|
|
409
|
+
branches = branches.map((b) => ({ ...b, nodes: b.nodes.filter((ref) => ref !== id) }));
|
|
410
|
+
}
|
|
411
|
+
for (const change of input.mutation.retarget ?? []) {
|
|
412
|
+
const id = clean(change.id, 40);
|
|
413
|
+
const node = nodes[id];
|
|
414
|
+
if (!node)
|
|
415
|
+
return refuse(roadmap, by, id, `nodo sconosciuto: ${id}`, input.at);
|
|
416
|
+
if (node.state === "committed")
|
|
417
|
+
return refuse(roadmap, by, id, `${id} e' gia' approvato: il passato non si tocca`, input.at);
|
|
418
|
+
const after = change.after ? list(change.after, 12, 40) : node.after;
|
|
419
|
+
const ignoto = after.find((ref) => ref !== id && !nodes[ref]);
|
|
420
|
+
if (ignoto)
|
|
421
|
+
return refuse(roadmap, by, id, `prerequisito inesistente: ${ignoto}`, input.at);
|
|
422
|
+
if (after.includes(id))
|
|
423
|
+
return refuse(roadmap, by, id, `${id} non puo' dipendere da se stesso`, input.at);
|
|
424
|
+
nodes[id] = {
|
|
425
|
+
...node,
|
|
426
|
+
...(change.mandate ? { mandate: clean(change.mandate, 900) } : {}),
|
|
427
|
+
...(change.acceptance ? { acceptance: list(change.acceptance, 10, 200) } : {}),
|
|
428
|
+
after,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
for (const nuovo of input.mutation.add ?? []) {
|
|
432
|
+
const id = clean(nuovo.id, 40);
|
|
433
|
+
if (!id)
|
|
434
|
+
return refuse(roadmap, by, "", "il nodo ha bisogno di un id", input.at);
|
|
435
|
+
if (nodes[id])
|
|
436
|
+
return refuse(roadmap, by, id, `il nodo ${id} esiste gia'`, input.at);
|
|
437
|
+
const branch = branches.find((b) => b.id === clean(nuovo.branch, 60));
|
|
438
|
+
if (!branch)
|
|
439
|
+
return refuse(roadmap, by, id, `ramo sconosciuto: ${clean(nuovo.branch, 60)}`, input.at);
|
|
440
|
+
const mandate = clean(nuovo.mandate, 900);
|
|
441
|
+
if (!mandate)
|
|
442
|
+
return refuse(roadmap, by, id, "un nodo senza mandato non e' assegnabile a nessuno", input.at);
|
|
443
|
+
const after = list(nuovo.after, 12, 40);
|
|
444
|
+
const ignoto = after.find((ref) => !nodes[ref]);
|
|
445
|
+
if (ignoto)
|
|
446
|
+
return refuse(roadmap, by, id, `prerequisito inesistente: ${ignoto}`, input.at);
|
|
447
|
+
nodes[id] = {
|
|
448
|
+
id,
|
|
449
|
+
branch: branch.id,
|
|
450
|
+
title: clean(nuovo.title, 160) || id,
|
|
451
|
+
mandate,
|
|
452
|
+
acceptance: list(nuovo.acceptance, 10, 200),
|
|
453
|
+
after,
|
|
454
|
+
state: "ready",
|
|
455
|
+
returns: 0,
|
|
456
|
+
};
|
|
457
|
+
branch.nodes.push(id);
|
|
458
|
+
}
|
|
459
|
+
const ciclo = trovaCiclo(nodes);
|
|
460
|
+
if (ciclo)
|
|
461
|
+
return refuse(roadmap, by, ciclo, `la mutazione chiude un anello: ${ciclo}`, input.at);
|
|
462
|
+
return {
|
|
463
|
+
ok: true,
|
|
464
|
+
roadmap: {
|
|
465
|
+
...roadmap,
|
|
466
|
+
nodes: relock(nodes),
|
|
467
|
+
branches,
|
|
468
|
+
log: note(roadmap, { kind: "future.mutated", by, subject: "", detail: reason, at: input.at }),
|
|
469
|
+
revision: roadmap.revision + 1,
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
// Un anello fra prerequisiti bloccherebbe il piano per sempre senza dirlo: si
|
|
474
|
+
// rifiuta la mutazione, non si scopre a esecuzione ferma.
|
|
475
|
+
function trovaCiclo(nodes) {
|
|
476
|
+
const stato = new Map();
|
|
477
|
+
const cammino = [];
|
|
478
|
+
const visita = (id) => {
|
|
479
|
+
const marchio = stato.get(id);
|
|
480
|
+
if (marchio === 2)
|
|
481
|
+
return "";
|
|
482
|
+
if (marchio === 1)
|
|
483
|
+
return [...cammino.slice(cammino.indexOf(id)), id].join(" -> ");
|
|
484
|
+
stato.set(id, 1);
|
|
485
|
+
cammino.push(id);
|
|
486
|
+
for (const ref of nodes[id]?.after ?? []) {
|
|
487
|
+
if (!nodes[ref])
|
|
488
|
+
continue;
|
|
489
|
+
const trovato = visita(ref);
|
|
490
|
+
if (trovato)
|
|
491
|
+
return trovato;
|
|
492
|
+
}
|
|
493
|
+
cammino.pop();
|
|
494
|
+
stato.set(id, 2);
|
|
495
|
+
return "";
|
|
496
|
+
};
|
|
497
|
+
for (const id of Object.keys(nodes)) {
|
|
498
|
+
const trovato = visita(id);
|
|
499
|
+
if (trovato)
|
|
500
|
+
return trovato;
|
|
501
|
+
}
|
|
502
|
+
return "";
|
|
503
|
+
}
|
|
504
|
+
// --- Il canale fra nodi -----------------------------------------------------
|
|
505
|
+
//
|
|
506
|
+
// Due ingegneri su rami diversi lavorano ognuno nella sua sessione. Quando uno
|
|
507
|
+
// scopre qualcosa che riguarda l'altro deve poterglielo dire, ma il messaggio
|
|
508
|
+
// non puo' arrivare come se venisse dalla stanza accanto: chi legge deve sapere
|
|
509
|
+
// che parla con un'ALTRA sessione, che ha un suo contesto e una sua storia.
|
|
510
|
+
// Per questo l'origine (nodo, ramo, sessione, chi) sta dentro il messaggio e
|
|
511
|
+
// non si puo' omettere.
|
|
512
|
+
const MAX_CROSSTALK = 300;
|
|
513
|
+
export function postAcrossNodes(roadmap, input) {
|
|
514
|
+
const fromNode = clean(input.fromNode, 40);
|
|
515
|
+
const who = clean(input.who, 80) || "sessione";
|
|
516
|
+
const mittente = roadmap.nodes[fromNode];
|
|
517
|
+
if (!mittente)
|
|
518
|
+
return refuse(roadmap, who, fromNode, `nodo sconosciuto: ${fromNode}`, input.at);
|
|
519
|
+
if (!mittente.sessionId) {
|
|
520
|
+
return refuse(roadmap, who, fromNode, `${fromNode} non e' stato preso da nessuna sessione: non ha una voce`, input.at);
|
|
521
|
+
}
|
|
522
|
+
const text = clean(input.text, 900);
|
|
523
|
+
if (!text)
|
|
524
|
+
return refuse(roadmap, who, fromNode, "messaggio vuoto", input.at);
|
|
525
|
+
const to = clean(input.to, 40);
|
|
526
|
+
if (to && !roadmap.nodes[to] && !roadmap.branches.some((b) => b.id === to)) {
|
|
527
|
+
return refuse(roadmap, who, fromNode, `destinatario sconosciuto: ${to} (serve un nodo o un ramo)`, input.at);
|
|
528
|
+
}
|
|
529
|
+
if (to === fromNode)
|
|
530
|
+
return refuse(roadmap, who, fromNode, "un nodo non scrive a se stesso", input.at);
|
|
531
|
+
const message = {
|
|
532
|
+
seq: (roadmap.crosstalk.at(-1)?.seq ?? 0) + 1,
|
|
533
|
+
from: { node: fromNode, branch: mittente.branch, session: mittente.sessionId, who },
|
|
534
|
+
to,
|
|
535
|
+
text,
|
|
536
|
+
at: input.at,
|
|
537
|
+
};
|
|
538
|
+
const crosstalk = [...roadmap.crosstalk, message];
|
|
539
|
+
return {
|
|
540
|
+
ok: true,
|
|
541
|
+
roadmap: {
|
|
542
|
+
...roadmap,
|
|
543
|
+
crosstalk: crosstalk.length > MAX_CROSSTALK ? crosstalk.slice(crosstalk.length - MAX_CROSSTALK) : crosstalk,
|
|
544
|
+
revision: roadmap.revision + 1,
|
|
545
|
+
},
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
// Cosa e' arrivato a un nodo dopo `since`. Non consuma niente: il cursore lo
|
|
549
|
+
// tiene chi legge, cosi' due letture della stessa sessione non si rubano i
|
|
550
|
+
// messaggi a vicenda.
|
|
551
|
+
export function crosstalkFor(roadmap, input) {
|
|
552
|
+
const node = roadmap.nodes[clean(input.node, 40)];
|
|
553
|
+
if (!node)
|
|
554
|
+
return [];
|
|
555
|
+
const since = Number(input.since) || 0;
|
|
556
|
+
return roadmap.crosstalk.filter((m) => m.seq > since
|
|
557
|
+
&& m.from.node !== node.id
|
|
558
|
+
&& (!m.to || m.to === node.id || m.to === node.branch));
|
|
559
|
+
}
|
|
560
|
+
// Come si legge un messaggio che arriva da un'altra sessione. La provenienza
|
|
561
|
+
// apre la riga: e' la prima cosa da sapere, non una nota in fondo.
|
|
562
|
+
export function renderCrosstalk(message) {
|
|
563
|
+
const rotta = message.to ? ` -> ${message.to}` : " -> tutti";
|
|
564
|
+
return `[altra sessione] ${message.from.who} · nodo ${message.from.node} · ramo ${message.from.branch}`
|
|
565
|
+
+ ` · sessione ${message.from.session}${rotta}: ${message.text}`;
|
|
566
|
+
}
|
|
567
|
+
// Quanto manca, per ramo. Serve a chi riprende dopo giorni: dove siamo, cosa e'
|
|
568
|
+
// approvato, cosa e' fermo e perche'.
|
|
569
|
+
export function progress(roadmap) {
|
|
570
|
+
return roadmap.branches.map((branch) => {
|
|
571
|
+
const nodi = branch.nodes.map((id) => roadmap.nodes[id]).filter(Boolean);
|
|
572
|
+
const corrente = nodi.find((n) => n.state === "running" || n.state === "review")
|
|
573
|
+
|| nodi.find((n) => n.state === "ready" || n.state === "returned");
|
|
574
|
+
return {
|
|
575
|
+
branch: branch.id,
|
|
576
|
+
owner: branch.owner,
|
|
577
|
+
committed: nodi.filter((n) => n.state === "committed").length,
|
|
578
|
+
total: nodi.length,
|
|
579
|
+
current: corrente ? corrente.id : "",
|
|
580
|
+
blocked: nodi.filter((n) => n.state === "locked").map((n) => n.id),
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MemoryDomain } from "./memory-store.js";
|
|
2
|
+
export interface RecallPlan {
|
|
3
|
+
readonly needed: boolean;
|
|
4
|
+
readonly domains: readonly MemoryDomain[];
|
|
5
|
+
readonly query: string;
|
|
6
|
+
readonly budgetTokens: number;
|
|
7
|
+
readonly minScore: number;
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PlanRecallInput {
|
|
11
|
+
readonly userText: string;
|
|
12
|
+
readonly recallBudget?: number;
|
|
13
|
+
readonly forceRecall?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function planRecall(input: PlanRecallInput): RecallPlan;
|
|
16
|
+
export declare function formatRecallPlan(plan: RecallPlan): string;
|
|
17
|
+
export declare const RECALL_FIRST_POLICY: string;
|