@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,349 @@
|
|
|
1
|
+
// Ricerca full-text nelle sessioni PASSATE.
|
|
2
|
+
//
|
|
3
|
+
// La memoria curata (stanze, note, decisioni) risponde a "cosa ho deciso".
|
|
4
|
+
// Non risponde a "l'ho gia' visto, questo errore?" — perche' il corpus grezzo
|
|
5
|
+
// delle conversazioni non era indicizzato da nessuna parte: restava su disco,
|
|
6
|
+
// leggibile solo da un umano che sapeva quale file aprire.
|
|
7
|
+
//
|
|
8
|
+
// Niente database: un indice incrementale su file accanto alle sessioni. Per
|
|
9
|
+
// ogni .jsonl si tiene mtime/size e i termini piu' frequenti dei messaggi
|
|
10
|
+
// UTENTE e ASSISTENTE; i tool result restano fuori (sono rumore, e sono loro a
|
|
11
|
+
// pesare megabyte). La ricerca ordina sull'indice e apre soltanto i file dei
|
|
12
|
+
// primi risultati per ritagliare gli estratti.
|
|
13
|
+
import { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
const INDEX_FILE = "session-index.json";
|
|
16
|
+
const INDEX_VERSION = 2;
|
|
17
|
+
// Una riga piu' lunga di questo e' un tool result con immagini o output
|
|
18
|
+
// enormi: si salta senza nemmeno parsarla, cosi' indicizzare una sessione da
|
|
19
|
+
// 5 MB resta questione di millisecondi.
|
|
20
|
+
const MAX_LINE_CHARS = 120_000;
|
|
21
|
+
const MAX_FILE_BYTES = 24 * 1024 * 1024;
|
|
22
|
+
const MAX_SESSIONS_INDEXED = 400;
|
|
23
|
+
const MAX_TERMS_PER_SESSION = 160;
|
|
24
|
+
const MAX_TEXT_PER_SESSION = 240_000;
|
|
25
|
+
const STOPWORDS = new Set([
|
|
26
|
+
"the", "and", "for", "with", "that", "this", "from", "have", "has", "not", "you", "your",
|
|
27
|
+
"che", "con", "per", "una", "uno", "del", "della", "delle", "dei", "degli", "nel", "nella",
|
|
28
|
+
"sono", "come", "piu", "non", "gli", "alla", "allo", "agli", "sul", "sulla", "cosa", "quando",
|
|
29
|
+
"poi", "anche", "solo", "fare", "fatto", "essere", "ecco", "ora", "adesso", "quindi", "perche",
|
|
30
|
+
]);
|
|
31
|
+
export function normalizeTerms(text) {
|
|
32
|
+
return String(text || "")
|
|
33
|
+
.normalize("NFKD")
|
|
34
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
35
|
+
.toLowerCase()
|
|
36
|
+
.replace(/[^a-z0-9_]+/g, " ")
|
|
37
|
+
.split(/\s+/)
|
|
38
|
+
.filter((term) => term.length >= 3 && term.length <= 40 && !STOPWORDS.has(term) && !/^\d+$/.test(term));
|
|
39
|
+
}
|
|
40
|
+
// Testo leggibile di una riga di sessione: solo i blocchi di testo dei messaggi
|
|
41
|
+
// utente/assistente. I tool result non entrano nell'indice.
|
|
42
|
+
function lineText(line) {
|
|
43
|
+
if (!line || line.length > MAX_LINE_CHARS)
|
|
44
|
+
return null;
|
|
45
|
+
if (!line.includes("\"message\""))
|
|
46
|
+
return null;
|
|
47
|
+
let row;
|
|
48
|
+
try {
|
|
49
|
+
row = JSON.parse(line);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const message = row["message"];
|
|
55
|
+
if (!message)
|
|
56
|
+
return null;
|
|
57
|
+
const role = String(message.role ?? "");
|
|
58
|
+
if (role !== "user" && role !== "assistant")
|
|
59
|
+
return null;
|
|
60
|
+
const blocks = Array.isArray(message.content) ? message.content : [];
|
|
61
|
+
const parts = [];
|
|
62
|
+
for (const block of blocks) {
|
|
63
|
+
const item = block;
|
|
64
|
+
if (String(item.type ?? "") === "text" && typeof item.text === "string")
|
|
65
|
+
parts.push(item.text);
|
|
66
|
+
}
|
|
67
|
+
if (typeof message.content === "string")
|
|
68
|
+
parts.push(message.content);
|
|
69
|
+
const text = parts.join(" ").replace(/\s+/g, " ").trim();
|
|
70
|
+
if (!text)
|
|
71
|
+
return null;
|
|
72
|
+
return { role, text, ts: Number(row["ts"]) || 0 };
|
|
73
|
+
}
|
|
74
|
+
// Il primo messaggio utente spesso NON e' il compito: e' il brief del vassallo
|
|
75
|
+
// o il checkpoint del regno. Stesso inganno del titolo delle stanze: senza
|
|
76
|
+
// questo filtro ogni sessione si presentava come "INDICE 1 = ruolo".
|
|
77
|
+
// `[VASSALLO` resta per le sessioni SALVATE prima del rinominio: il filtro
|
|
78
|
+
// deve riconoscere il boilerplate vecchio quanto quello nuovo, altrimenti
|
|
79
|
+
// le conversazioni di ieri tornano a inquinare la ricerca.
|
|
80
|
+
const BOILERPLATE = /^\s*(?:\[COLLABORATORE|\[VASSALLO|\[VASCEND_GOAL\]|INDICE\s+\d\s*=|<!--\s*vascend:|@regno|@stato\[)/i;
|
|
81
|
+
const OBJECTIVE_MARKER = /(?:OBIETTIVO_ATTIVITA|OBIETTIVO_CASTELLO|OBIETTIVO|GOAL)\s*[:=]\s*(.{4,})/i;
|
|
82
|
+
export function pickObjective(userTexts) {
|
|
83
|
+
const cut = (text) => text.split(/\s(?:MODE|CHECKPOINT_PRECEDENTE|CHECKPOINT|INDICE|OUTPUT)\s*[:=]/)[0].trim().slice(0, 200);
|
|
84
|
+
const plain = userTexts.find((text) => !BOILERPLATE.test(text));
|
|
85
|
+
if (plain)
|
|
86
|
+
return cut(plain);
|
|
87
|
+
for (const text of userTexts.slice(0, 6)) {
|
|
88
|
+
const marker = OBJECTIVE_MARKER.exec(text);
|
|
89
|
+
if (marker && marker[1])
|
|
90
|
+
return cut(marker[1]);
|
|
91
|
+
}
|
|
92
|
+
return cut(userTexts[0] ?? "");
|
|
93
|
+
}
|
|
94
|
+
function readSession(file) {
|
|
95
|
+
let raw = "";
|
|
96
|
+
try {
|
|
97
|
+
raw = readFileSync(file, "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
raw = "";
|
|
101
|
+
}
|
|
102
|
+
let turns = 0;
|
|
103
|
+
const userTexts = [];
|
|
104
|
+
let startedAt = 0;
|
|
105
|
+
let endedAt = 0;
|
|
106
|
+
const chunks = [];
|
|
107
|
+
let size = 0;
|
|
108
|
+
for (const line of raw.split("\n")) {
|
|
109
|
+
const parsed = lineText(line);
|
|
110
|
+
if (!parsed)
|
|
111
|
+
continue;
|
|
112
|
+
turns += 1;
|
|
113
|
+
if (parsed.ts) {
|
|
114
|
+
if (!startedAt)
|
|
115
|
+
startedAt = parsed.ts;
|
|
116
|
+
endedAt = parsed.ts;
|
|
117
|
+
}
|
|
118
|
+
if (parsed.role === "user" && userTexts.length < 6)
|
|
119
|
+
userTexts.push(parsed.text);
|
|
120
|
+
if (size < MAX_TEXT_PER_SESSION) {
|
|
121
|
+
chunks.push(parsed.text);
|
|
122
|
+
size += parsed.text.length;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { turns, text: chunks.join("\n"), objective: pickObjective(userTexts), startedAt, endedAt };
|
|
126
|
+
}
|
|
127
|
+
function topTerms(text) {
|
|
128
|
+
const counts = new Map();
|
|
129
|
+
for (const term of normalizeTerms(text))
|
|
130
|
+
counts.set(term, (counts.get(term) ?? 0) + 1);
|
|
131
|
+
return Object.fromEntries([...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, MAX_TERMS_PER_SESSION));
|
|
132
|
+
}
|
|
133
|
+
function loadIndex(sessionDir) {
|
|
134
|
+
const file = join(sessionDir, INDEX_FILE);
|
|
135
|
+
if (!existsSync(file))
|
|
136
|
+
return { version: INDEX_VERSION, entries: [] };
|
|
137
|
+
try {
|
|
138
|
+
const parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
139
|
+
if (!parsed || parsed.version !== INDEX_VERSION || !Array.isArray(parsed.entries)) {
|
|
140
|
+
return { version: INDEX_VERSION, entries: [] };
|
|
141
|
+
}
|
|
142
|
+
return parsed;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return { version: INDEX_VERSION, entries: [] };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function saveIndex(sessionDir, index) {
|
|
149
|
+
try {
|
|
150
|
+
writeFileSync(join(sessionDir, INDEX_FILE), JSON.stringify(index), "utf8");
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// L'indice e' una cache: se non si scrive, la ricerca continua a funzionare
|
|
154
|
+
// (ricostruira' al giro dopo).
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Aggiorna l'indice: rilegge soltanto le sessioni nuove o cambiate (mtime+size).
|
|
159
|
+
* `skipId` esclude la sessione corrente, che e' gia' nel contesto.
|
|
160
|
+
*/
|
|
161
|
+
export function refreshSessionIndex(sessionDir, opts = {}) {
|
|
162
|
+
if (!sessionDir || !existsSync(sessionDir))
|
|
163
|
+
return { version: INDEX_VERSION, entries: [] };
|
|
164
|
+
const previous = new Map(loadIndex(sessionDir).entries.map((entry) => [entry.file, entry]));
|
|
165
|
+
let files = [];
|
|
166
|
+
try {
|
|
167
|
+
files = readdirSync(sessionDir).filter((name) => name.endsWith(".jsonl") && !name.includes(".memory.events") && !name.includes(".rooms"));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
files = [];
|
|
171
|
+
}
|
|
172
|
+
const entries = [];
|
|
173
|
+
for (const name of files.slice(0, MAX_SESSIONS_INDEXED)) {
|
|
174
|
+
const id = name.replace(/\.jsonl$/i, "");
|
|
175
|
+
if (opts.skipId && id === opts.skipId)
|
|
176
|
+
continue;
|
|
177
|
+
const file = join(sessionDir, name);
|
|
178
|
+
let stat;
|
|
179
|
+
try {
|
|
180
|
+
stat = statSync(file);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (!stat.isFile() || stat.size > MAX_FILE_BYTES)
|
|
186
|
+
continue;
|
|
187
|
+
const known = previous.get(name);
|
|
188
|
+
if (known && known.mtimeMs === stat.mtimeMs && known.size === stat.size) {
|
|
189
|
+
entries.push(known);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const read = readSession(file);
|
|
193
|
+
if (!read.turns)
|
|
194
|
+
continue;
|
|
195
|
+
entries.push({
|
|
196
|
+
id,
|
|
197
|
+
file: name,
|
|
198
|
+
mtimeMs: stat.mtimeMs,
|
|
199
|
+
size: stat.size,
|
|
200
|
+
startedAt: read.startedAt || stat.mtimeMs,
|
|
201
|
+
endedAt: read.endedAt || stat.mtimeMs,
|
|
202
|
+
turns: read.turns,
|
|
203
|
+
objective: read.objective,
|
|
204
|
+
name: "",
|
|
205
|
+
terms: topTerms(read.text),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const index = { version: INDEX_VERSION, entries };
|
|
209
|
+
saveIndex(sessionDir, index);
|
|
210
|
+
return index;
|
|
211
|
+
}
|
|
212
|
+
function snippetsFor(sessionDir, entry, terms, max = 2) {
|
|
213
|
+
// entry.file e' relativo alla sua cartella, oppure gia' assoluto quando la
|
|
214
|
+
// ricerca ha unito piu' run.
|
|
215
|
+
const file = /^(?:[A-Za-z]:|[\\/])/.test(entry.file) ? entry.file : join(sessionDir, entry.file);
|
|
216
|
+
let raw = "";
|
|
217
|
+
try {
|
|
218
|
+
raw = readFileSync(file, "utf8");
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return [];
|
|
222
|
+
}
|
|
223
|
+
const out = [];
|
|
224
|
+
for (const line of raw.split("\n")) {
|
|
225
|
+
if (out.length >= max)
|
|
226
|
+
break;
|
|
227
|
+
const parsed = lineText(line);
|
|
228
|
+
if (!parsed)
|
|
229
|
+
continue;
|
|
230
|
+
const haystack = normalizeTerms(parsed.text);
|
|
231
|
+
const found = terms.find((term) => haystack.includes(term));
|
|
232
|
+
if (!found)
|
|
233
|
+
continue;
|
|
234
|
+
const position = parsed.text.toLowerCase().indexOf(found);
|
|
235
|
+
const start = Math.max(0, position - 90);
|
|
236
|
+
const cut = parsed.text.slice(start, start + 260).trim();
|
|
237
|
+
out.push(`${parsed.role === "user" ? "utente" : "agente"}: ${start > 0 ? "…" : ""}${cut}${start + 260 < parsed.text.length ? "…" : ""}`);
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Cartelle in cui cercare. Un host puo' dare a ogni run il suo workspace
|
|
243
|
+
* effimero (Horizon: `.../run-<id>/.talos/sessions`): in quel caso la cartella
|
|
244
|
+
* corrente contiene UNA sola conversazione e cercare solo la' non troverebbe
|
|
245
|
+
* mai niente. Si includono allora le cartelle sorelle degli altri run.
|
|
246
|
+
*/
|
|
247
|
+
export function sessionDirsFor(sessionDir, limit = 60) {
|
|
248
|
+
const dirs = [sessionDir];
|
|
249
|
+
const match = /^(.*)[\\/]([^\\/]+)[\\/]\.talos[\\/]sessions[\\/]?$/.exec(sessionDir);
|
|
250
|
+
const parent = match?.[1];
|
|
251
|
+
const own = match?.[2];
|
|
252
|
+
if (!parent || !own || !/^run-/.test(own))
|
|
253
|
+
return dirs;
|
|
254
|
+
let siblings = [];
|
|
255
|
+
try {
|
|
256
|
+
siblings = readdirSync(parent)
|
|
257
|
+
.filter((name) => /^run-/.test(name) && name !== own)
|
|
258
|
+
.map((name) => join(parent, name, ".talos", "sessions"))
|
|
259
|
+
.filter((dir) => existsSync(dir));
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
siblings = [];
|
|
263
|
+
}
|
|
264
|
+
// Le piu' recenti prima: un run vecchio di mesi conta meno di quello di ieri.
|
|
265
|
+
siblings.sort((a, b) => {
|
|
266
|
+
const at = (() => { try {
|
|
267
|
+
return statSync(a).mtimeMs;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return 0;
|
|
271
|
+
} })();
|
|
272
|
+
const bt = (() => { try {
|
|
273
|
+
return statSync(b).mtimeMs;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return 0;
|
|
277
|
+
} })();
|
|
278
|
+
return bt - at;
|
|
279
|
+
});
|
|
280
|
+
return [...dirs, ...siblings.slice(0, limit)];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Cerca nelle sessioni passate. Il punteggio pesa quanti termini della query
|
|
284
|
+
* compaiono e con che frequenza; a pari merito vince la sessione piu' recente.
|
|
285
|
+
*/
|
|
286
|
+
export function searchSessions(sessionDir, query, opts = {}) {
|
|
287
|
+
const terms = [...new Set(normalizeTerms(query))];
|
|
288
|
+
if (!terms.length)
|
|
289
|
+
return [];
|
|
290
|
+
const dirs = sessionDirsFor(sessionDir);
|
|
291
|
+
const index = dirs.length === 1
|
|
292
|
+
? refreshSessionIndex(sessionDir, { skipId: opts.skipId })
|
|
293
|
+
: {
|
|
294
|
+
version: INDEX_VERSION,
|
|
295
|
+
entries: dirs.flatMap((dir) => refreshSessionIndex(dir, { skipId: opts.skipId }).entries
|
|
296
|
+
.map((entry) => ({ ...entry, file: join(dir, entry.file) }))),
|
|
297
|
+
};
|
|
298
|
+
const limit = Math.max(1, Math.min(20, opts.limit ?? 5));
|
|
299
|
+
const scored = index.entries
|
|
300
|
+
.map((entry) => {
|
|
301
|
+
let score = 0;
|
|
302
|
+
let matched = 0;
|
|
303
|
+
for (const term of terms) {
|
|
304
|
+
const count = entry.terms[term] ?? 0;
|
|
305
|
+
if (count > 0) {
|
|
306
|
+
matched += 1;
|
|
307
|
+
score += 1 + Math.log1p(count);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Tutti i termini presenti vale piu' della somma delle frequenze: e' il
|
|
311
|
+
// segnale che la sessione parlava DAVVERO di quello.
|
|
312
|
+
if (matched === terms.length && terms.length > 1)
|
|
313
|
+
score *= 1.6;
|
|
314
|
+
return { entry, score, matched };
|
|
315
|
+
})
|
|
316
|
+
.filter((row) => row.matched > 0)
|
|
317
|
+
.sort((a, b) => b.score - a.score || b.entry.endedAt - a.entry.endedAt)
|
|
318
|
+
.slice(0, limit);
|
|
319
|
+
return scored.map((row) => ({
|
|
320
|
+
id: row.entry.id,
|
|
321
|
+
objective: row.entry.objective,
|
|
322
|
+
name: row.entry.name,
|
|
323
|
+
endedAt: row.entry.endedAt,
|
|
324
|
+
turns: row.entry.turns,
|
|
325
|
+
score: Number(row.score.toFixed(2)),
|
|
326
|
+
snippets: opts.withSnippets === false ? [] : snippetsFor(sessionDir, row.entry, terms),
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
export function describeWhen(ts, now = Date.now()) {
|
|
330
|
+
const ms = Math.max(0, now - ts);
|
|
331
|
+
const minutes = Math.round(ms / 60_000);
|
|
332
|
+
if (minutes < 60)
|
|
333
|
+
return `${minutes} min fa`;
|
|
334
|
+
const hours = Math.round(minutes / 60);
|
|
335
|
+
if (hours < 24)
|
|
336
|
+
return `${hours} h fa`;
|
|
337
|
+
const days = Math.round(hours / 24);
|
|
338
|
+
return days <= 1 ? "ieri" : `${days} giorni fa`;
|
|
339
|
+
}
|
|
340
|
+
export function formatSessionHits(hits, now = Date.now()) {
|
|
341
|
+
if (!hits.length)
|
|
342
|
+
return "";
|
|
343
|
+
const blocks = hits.map((hit) => {
|
|
344
|
+
const head = `[sessione ${hit.id} · ${describeWhen(hit.endedAt, now)} · ${hit.turns} turni]`
|
|
345
|
+
+ (hit.objective ? ` obiettivo: ${hit.objective}` : "");
|
|
346
|
+
return [head, ...hit.snippets.map((line) => ` ${line}`)].join("\n");
|
|
347
|
+
});
|
|
348
|
+
return ["SESSIONI PRECEDENTI (conversazioni archiviate, non memoria curata)", ...blocks].join("\n");
|
|
349
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ContextCandidate } from "./context-candidate.js";
|
|
2
|
+
export interface SupersessionEdge {
|
|
3
|
+
readonly older: string;
|
|
4
|
+
readonly newer: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SupersessionGraph {
|
|
7
|
+
readonly edges: readonly SupersessionEdge[];
|
|
8
|
+
readonly supersededBy: ReadonlyMap<string, string>;
|
|
9
|
+
readonly superseded: ReadonlySet<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildSupersessionGraph(candidates: readonly ContextCandidate[]): SupersessionGraph;
|
|
12
|
+
export declare function activeCandidates(candidates: readonly ContextCandidate[]): readonly ContextCandidate[];
|
|
13
|
+
export declare function markSuperseded(candidate: ContextCandidate, newerId: string): ContextCandidate;
|
|
14
|
+
export declare function latestOf(graph: SupersessionGraph, id: string): string;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Supersession Graph (metodo Danilov, Memory OS).
|
|
2
|
+
//
|
|
3
|
+
// Sapere cosa e' vero non basta: serve sapere cosa NON e' piu' vero. Una
|
|
4
|
+
// decisione o un asset puo' essere SUPERATO da uno piu' recente. Questo modulo
|
|
5
|
+
// costruisce il grafo di supersessione dai candidati (campi supersedes /
|
|
6
|
+
// supersededBy / status) e ricava il set di candidati ATTIVI, escludendo gli
|
|
7
|
+
// obsoleti dal contesto.
|
|
8
|
+
//
|
|
9
|
+
// Modulo PURO e deterministico: nessun side-effect, opera su array di
|
|
10
|
+
// ContextCandidate gia' raccolti.
|
|
11
|
+
// Costruisce il grafo dai candidati. Considera due sorgenti di archi:
|
|
12
|
+
// 1) il campo esplicito supersededBy del candidato;
|
|
13
|
+
// 2) il campo payload "supersedes" propagato in terms/summary non e' usato:
|
|
14
|
+
// la fonte e' supersededBy (esplicito) per restare deterministici.
|
|
15
|
+
// In caso di catene (A->B->C) il set superseded contiene tutti i nodi non
|
|
16
|
+
// terminali raggiungibili.
|
|
17
|
+
export function buildSupersessionGraph(candidates) {
|
|
18
|
+
const byId = new Map(candidates.map((c) => [c.id, c]));
|
|
19
|
+
const edges = [];
|
|
20
|
+
const supersededBy = new Map();
|
|
21
|
+
const superseded = new Set();
|
|
22
|
+
for (const c of candidates) {
|
|
23
|
+
// Marcatura esplicita di stato.
|
|
24
|
+
if (c.status === "superseded")
|
|
25
|
+
superseded.add(c.id);
|
|
26
|
+
// Arco da supersededBy: c e' superato da c.supersededBy.
|
|
27
|
+
if (c.supersededBy) {
|
|
28
|
+
edges.push({ older: c.id, newer: c.supersededBy });
|
|
29
|
+
// Tieni il "newer" piu' recente se piu' candidati lo dichiarano.
|
|
30
|
+
const prev = supersededBy.get(c.id);
|
|
31
|
+
if (!prev || newerThan(byId.get(c.supersededBy), byId.get(prev))) {
|
|
32
|
+
supersededBy.set(c.id, c.supersededBy);
|
|
33
|
+
}
|
|
34
|
+
superseded.add(c.id);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { edges, supersededBy, superseded };
|
|
38
|
+
}
|
|
39
|
+
// Filtra i candidati lasciando solo gli ATTIVI: esclude i superseded e gli
|
|
40
|
+
// archived. Deterministico, preserva l'ordine.
|
|
41
|
+
export function activeCandidates(candidates) {
|
|
42
|
+
const graph = buildSupersessionGraph(candidates);
|
|
43
|
+
return candidates.filter((c) => c.status === "active" && !graph.superseded.has(c.id));
|
|
44
|
+
}
|
|
45
|
+
// Applica al volo un aggiornamento di supersessione a un candidato: imposta
|
|
46
|
+
// status e supersededBy senza mutare l'originale.
|
|
47
|
+
export function markSuperseded(candidate, newerId) {
|
|
48
|
+
return { ...candidate, status: "superseded", supersededBy: newerId };
|
|
49
|
+
}
|
|
50
|
+
// Ritorna, per un id, l'id della versione PIU' RECENTE seguendo la catena di
|
|
51
|
+
// supersessione (A->B->C => latestOf(A)=C). Evita cicli.
|
|
52
|
+
export function latestOf(graph, id) {
|
|
53
|
+
let current = id;
|
|
54
|
+
const seen = new Set([id]);
|
|
55
|
+
while (graph.supersededBy.has(current)) {
|
|
56
|
+
const next = graph.supersededBy.get(current);
|
|
57
|
+
if (seen.has(next))
|
|
58
|
+
break; // ciclo: stop
|
|
59
|
+
seen.add(next);
|
|
60
|
+
current = next;
|
|
61
|
+
}
|
|
62
|
+
return current;
|
|
63
|
+
}
|
|
64
|
+
function newerThan(a, b) {
|
|
65
|
+
if (!a)
|
|
66
|
+
return false;
|
|
67
|
+
if (!b)
|
|
68
|
+
return true;
|
|
69
|
+
return a.createdAt > b.createdAt;
|
|
70
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
function areaKey(value, cwd) {
|
|
3
|
+
return resolve(cwd, value.trim().replaceAll("\\", "/")).replaceAll("\\", "/").replace(/\/+$/, "").toLowerCase();
|
|
4
|
+
}
|
|
5
|
+
function overlaps(a, b) {
|
|
6
|
+
return !a || !b || a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
|
|
7
|
+
}
|
|
8
|
+
// Declared paths coordinate ownership; they are not a filesystem sandbox.
|
|
9
|
+
export function disjointAreas(members, cwd = process.cwd()) {
|
|
10
|
+
if (members.length < 2)
|
|
11
|
+
return { disjoint: true, detail: "un solo collaboratore" };
|
|
12
|
+
const missing = members.filter((member) => !member.area?.length).map((member) => member.slug);
|
|
13
|
+
if (missing.length)
|
|
14
|
+
return { disjoint: false, detail: `senza area dichiarata: ${missing.join(", ")}` };
|
|
15
|
+
const owned = [];
|
|
16
|
+
for (const member of members) {
|
|
17
|
+
for (const raw of member.area ?? []) {
|
|
18
|
+
if (!raw.trim() || /[*?\[\]{}]/.test(raw))
|
|
19
|
+
return { disjoint: false, detail: `area non concreta in ${member.slug}` };
|
|
20
|
+
const path = areaKey(raw, cwd);
|
|
21
|
+
const clash = owned.find((other) => other.slug !== member.slug && overlaps(other.path, path));
|
|
22
|
+
if (clash)
|
|
23
|
+
return { disjoint: false, detail: `${member.slug} e ${clash.slug} si contendono ${clash.display}` };
|
|
24
|
+
owned.push({ slug: member.slug, path, display: raw });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { disjoint: true, detail: owned.map((owner) => `${owner.slug}:${owner.path}`).join(" ") };
|
|
28
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TeamMember } from "./team-session.js";
|
|
2
|
+
import type { ToolResultPart } from "../core/types.js";
|
|
3
|
+
export interface ArtifactReference {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly scope: string;
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly sha256: string;
|
|
8
|
+
readonly chars: number;
|
|
9
|
+
}
|
|
10
|
+
export interface TeamHandoff {
|
|
11
|
+
readonly version: 1;
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly sessionId: string;
|
|
14
|
+
readonly revision: number;
|
|
15
|
+
readonly updatedAt: number;
|
|
16
|
+
readonly members: readonly TeamMember[];
|
|
17
|
+
readonly done: boolean;
|
|
18
|
+
readonly failed: boolean;
|
|
19
|
+
readonly report: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function artifactReference(result: ToolResultPart): ArtifactReference | null;
|
|
22
|
+
/** Durable latest handoff per owner; a checkpoint never implies that a worker is still alive. */
|
|
23
|
+
export declare function saveTeamHandoff(directory: string, team: Omit<TeamHandoff, "version" | "revision" | "updatedAt">): TeamHandoff;
|
|
24
|
+
export declare function readTeamHandoff(directory: string, sessionId: string, teamId?: string): TeamHandoff | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { withLockSync } from "./file-lock.js";
|
|
5
|
+
export function artifactReference(result) {
|
|
6
|
+
const ref = result._meta?.["talosArtifact"];
|
|
7
|
+
return ref && /^tr\d+$/.test(ref.id ?? "") && typeof ref.scope === "string" && ref.scope.length > 0
|
|
8
|
+
&& /^[a-f0-9]{64}$/.test(ref.sha256 ?? "") && typeof ref.chars === "number"
|
|
9
|
+
? { id: ref.id, scope: ref.scope, name: ref.name ?? "risultato", sha256: ref.sha256, chars: ref.chars } : null;
|
|
10
|
+
}
|
|
11
|
+
/** Durable latest handoff per owner; a checkpoint never implies that a worker is still alive. */
|
|
12
|
+
export function saveTeamHandoff(directory, team) {
|
|
13
|
+
const path = handoffPath(directory, team.sessionId);
|
|
14
|
+
return withLockSync(path, () => {
|
|
15
|
+
const previous = readTeamHandoff(directory, team.sessionId);
|
|
16
|
+
const result = { ...team, version: 1, revision: (previous?.revision ?? 0) + 1, updatedAt: Date.now() };
|
|
17
|
+
for (const target of [handoffPath(directory, team.sessionId, team.id), path]) {
|
|
18
|
+
const temp = target + "." + randomUUID() + ".tmp";
|
|
19
|
+
writeFileSync(temp, JSON.stringify(result), "utf8");
|
|
20
|
+
renameSync(temp, target);
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function readTeamHandoff(directory, sessionId, teamId) {
|
|
26
|
+
try {
|
|
27
|
+
const value = JSON.parse(readFileSync(handoffPath(directory, sessionId, teamId), "utf8"));
|
|
28
|
+
return value.version === 1 && value.sessionId === sessionId && typeof value.id === "string"
|
|
29
|
+
&& (!teamId || value.id === teamId) && Array.isArray(value.members) && Number.isInteger(value.revision) ? value : null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function handoffPath(directory, owner, teamId) {
|
|
36
|
+
return join(directory, "team-handoffs", createHash("sha256").update(teamId ? owner + "\0" + teamId : owner).digest("hex") + ".json");
|
|
37
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SpawnAgentSpec } from "../core/types.js";
|
|
2
|
+
export declare function validateTeamGraph(members: readonly SpawnAgentSpec[]): void;
|
|
3
|
+
export declare function scheduleTeam<T extends {
|
|
4
|
+
readonly ok: boolean;
|
|
5
|
+
}>(options: {
|
|
6
|
+
readonly members: readonly SpawnAgentSpec[];
|
|
7
|
+
readonly concurrency: number;
|
|
8
|
+
readonly signal: AbortSignal;
|
|
9
|
+
readonly compatible: (left: SpawnAgentSpec, right: SpawnAgentSpec) => boolean;
|
|
10
|
+
readonly run: (member: SpawnAgentSpec, index: number) => Promise<T>;
|
|
11
|
+
readonly failure: (member: SpawnAgentSpec, reason: string) => T;
|
|
12
|
+
readonly settled?: (member: SpawnAgentSpec, result: T) => void;
|
|
13
|
+
}): Promise<T[]>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export function validateTeamGraph(members) {
|
|
2
|
+
if (!members.length)
|
|
3
|
+
throw new Error("nessun collaboratore indicato");
|
|
4
|
+
const bySlug = new Map(members.map((member) => [member.slug, member]));
|
|
5
|
+
if (bySlug.size !== members.length)
|
|
6
|
+
throw new Error("slug duplicati nel team");
|
|
7
|
+
const visiting = new Set();
|
|
8
|
+
const visited = new Set();
|
|
9
|
+
const visit = (slug) => {
|
|
10
|
+
if (visiting.has(slug))
|
|
11
|
+
throw new Error(`dipendenza ciclica: ${slug}`);
|
|
12
|
+
if (visited.has(slug))
|
|
13
|
+
return;
|
|
14
|
+
const member = bySlug.get(slug);
|
|
15
|
+
if (!member)
|
|
16
|
+
throw new Error(`dipendenza sconosciuta: ${slug}`);
|
|
17
|
+
visiting.add(slug);
|
|
18
|
+
for (const dependency of member.after ?? [])
|
|
19
|
+
visit(dependency);
|
|
20
|
+
visiting.delete(slug);
|
|
21
|
+
visited.add(slug);
|
|
22
|
+
};
|
|
23
|
+
for (const member of members) {
|
|
24
|
+
if (!member.slug.trim())
|
|
25
|
+
throw new Error("slug vuoto");
|
|
26
|
+
visit(member.slug);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Dependency-ready work starts as soon as a slot becomes free. A slow peer
|
|
30
|
+
// does not impose a batch barrier on unrelated work or completed dependencies.
|
|
31
|
+
export async function scheduleTeam(options) {
|
|
32
|
+
const { members, signal } = options;
|
|
33
|
+
validateTeamGraph(members);
|
|
34
|
+
const limit = Number.isFinite(options.concurrency) ? Math.max(1, Math.trunc(options.concurrency)) : 1;
|
|
35
|
+
const indices = new Map(members.map((member, index) => [member.slug, index]));
|
|
36
|
+
const pending = new Set(members.map((_, index) => index));
|
|
37
|
+
const running = new Map();
|
|
38
|
+
const results = new Array(members.length);
|
|
39
|
+
const finish = (index, result) => {
|
|
40
|
+
results[index] = result;
|
|
41
|
+
options.settled?.(members[index], result);
|
|
42
|
+
};
|
|
43
|
+
while (pending.size || running.size) {
|
|
44
|
+
for (const index of pending) {
|
|
45
|
+
const member = members[index];
|
|
46
|
+
const failed = (member.after ?? []).filter((slug) => results[indices.get(slug)]?.ok === false);
|
|
47
|
+
if (signal.aborted || failed.length) {
|
|
48
|
+
pending.delete(index);
|
|
49
|
+
finish(index, options.failure(member, signal.aborted ? "arrestato prima dell'avvio" : `prerequisiti falliti: ${failed.join(", ")}`));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (running.size >= limit || !(member.after ?? []).every((slug) => results[indices.get(slug)]?.ok))
|
|
53
|
+
continue;
|
|
54
|
+
if ([...running.keys()].some((active) => !options.compatible(member, members[active])))
|
|
55
|
+
continue;
|
|
56
|
+
pending.delete(index);
|
|
57
|
+
const work = Promise.resolve().then(() => options.run(member, index))
|
|
58
|
+
.catch((error) => options.failure(member, error instanceof Error ? error.message : String(error)))
|
|
59
|
+
.then((result) => { finish(index, result); })
|
|
60
|
+
.finally(() => { running.delete(index); });
|
|
61
|
+
running.set(index, work);
|
|
62
|
+
}
|
|
63
|
+
if (running.size)
|
|
64
|
+
await Promise.race(running.values());
|
|
65
|
+
else if (pending.size) {
|
|
66
|
+
// A failed dependency may have been visited after its dependent above.
|
|
67
|
+
// The next pass propagates failure without launching that dependent.
|
|
68
|
+
const canProgress = [...pending].some((index) => (members[index].after ?? []).some((slug) => results[indices.get(slug)]?.ok === false));
|
|
69
|
+
if (!canProgress)
|
|
70
|
+
throw new Error("team senza task eseguibili: controlla dipendenze e aree");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ArtifactReference } from "./team-handoff.js";
|
|
2
|
+
export interface TeamMember {
|
|
3
|
+
readonly slug: string;
|
|
4
|
+
readonly role: string;
|
|
5
|
+
readonly mandate: string;
|
|
6
|
+
readonly status?: "queued" | "running" | "completed" | "failed";
|
|
7
|
+
readonly summary?: string;
|
|
8
|
+
readonly error?: string;
|
|
9
|
+
readonly after?: readonly string[];
|
|
10
|
+
readonly area?: readonly string[];
|
|
11
|
+
readonly castle?: string;
|
|
12
|
+
readonly tasks?: readonly string[];
|
|
13
|
+
readonly artifacts?: readonly ArtifactReference[];
|
|
14
|
+
}
|
|
15
|
+
export interface LiveTeam {
|
|
16
|
+
readonly revision?: number;
|
|
17
|
+
readonly persistenceError?: string;
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly sessionId: string;
|
|
20
|
+
readonly members: readonly TeamMember[];
|
|
21
|
+
readonly startedAt: number;
|
|
22
|
+
readonly work: Promise<string>;
|
|
23
|
+
readonly done: boolean;
|
|
24
|
+
readonly report: string;
|
|
25
|
+
readonly failed: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function registerTeam(input: {
|
|
28
|
+
readonly sessionDir?: string;
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly sessionId: string;
|
|
31
|
+
readonly members: readonly TeamMember[];
|
|
32
|
+
readonly work: Promise<string>;
|
|
33
|
+
readonly at: number;
|
|
34
|
+
}): LiveTeam;
|
|
35
|
+
export declare function teamForSession(sessionId: string): LiveTeam | null;
|
|
36
|
+
export declare function teamById(sessionId: string, teamId: string): LiveTeam | null;
|
|
37
|
+
export declare function pendingMembers(team: LiveTeam): readonly string[];
|
|
38
|
+
export declare function teamByKingdom(teamId: string): LiveTeam | null;
|
|
39
|
+
export declare function updateTeamMember(teamId: string, slug: string, patch: Pick<TeamMember, "status" | "summary" | "error" | "artifacts">): void;
|
|
40
|
+
export declare function waitForTeamChange(team: LiveTeam, signal: AbortSignal, interrupted: () => boolean): Promise<void>;
|
|
41
|
+
export declare function forgetTeam(sessionId: string, teamId: string): void;
|
|
42
|
+
export declare function __resetTeams(): void;
|