@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,83 @@
|
|
|
1
|
+
// Esecuzione di UNA unita' di lavoro con un agente NUOVO.
|
|
2
|
+
//
|
|
3
|
+
// La proprieta' che rende possibile un run di giorni: il costo per unita' non
|
|
4
|
+
// cresce. Ogni item apre una sessione propria e riceve solo il suo brief, quindi
|
|
5
|
+
// la finestra parte pulita ogni volta. Cio' che DEVE accumularsi — la memoria
|
|
6
|
+
// delle stanze, il piano, il profilo — resta sullo store condiviso: si eredita la
|
|
7
|
+
// conoscenza, non la cronologia.
|
|
8
|
+
//
|
|
9
|
+
// L'esito non e' un'impressione: l'agente lo dichiara in chiusura con due righe
|
|
10
|
+
// convenute, e chi non le scrive risulta "esito non dichiarato" (quindi si
|
|
11
|
+
// ritenta). Il giudizio finale resta comunque del gate esterno.
|
|
12
|
+
import { runTurn } from "../core/agent.js";
|
|
13
|
+
import { Session } from "../core/session.js";
|
|
14
|
+
const OUTCOME_MARK = "ESITO:";
|
|
15
|
+
const EVIDENCE_MARK = "PROVE:";
|
|
16
|
+
// Istruzioni di chiusura appese al brief. Sono l'unico contratto fra il ciclo e
|
|
17
|
+
// l'agente: brevi, letterali, verificabili.
|
|
18
|
+
export function briefFor(item) {
|
|
19
|
+
return [
|
|
20
|
+
`UNITA DI LAVORO ${item.id}: ${item.title}`,
|
|
21
|
+
"",
|
|
22
|
+
item.brief,
|
|
23
|
+
...(item.reason ? ["", `TENTATIVO PRECEDENTE FALLITO: ${item.reason}`, "Non ripetere la stessa strada."] : []),
|
|
24
|
+
"",
|
|
25
|
+
"Lavori da solo su questa sola unita'. Nessuno leggera' la conversazione: cio' che",
|
|
26
|
+
"resta e' il codice, i file e le prove che dichiari.",
|
|
27
|
+
"Chiudi SEMPRE con due righe, in questo formato esatto:",
|
|
28
|
+
`${OUTCOME_MARK} ok (oppure: ${OUTCOME_MARK} fallito <motivo in una riga>)`,
|
|
29
|
+
`${EVIDENCE_MARK} <file toccati, comandi eseguiti, output osservato>`,
|
|
30
|
+
].join("\n");
|
|
31
|
+
}
|
|
32
|
+
// Legge le due righe convenute. PURA: si verifica senza agente.
|
|
33
|
+
export function parseOutcome(text) {
|
|
34
|
+
const lines = String(text || "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
35
|
+
const outcomeLine = [...lines].reverse().find((line) => line.toUpperCase().startsWith(OUTCOME_MARK));
|
|
36
|
+
const evidenceLine = [...lines].reverse().find((line) => line.toUpperCase().startsWith(EVIDENCE_MARK));
|
|
37
|
+
const evidence = evidenceLine
|
|
38
|
+
? evidenceLine.slice(EVIDENCE_MARK.length).split(/\s*[;|]\s*/).map((part) => part.trim()).filter(Boolean)
|
|
39
|
+
: [];
|
|
40
|
+
if (!outcomeLine) {
|
|
41
|
+
return { ok: false, reason: "esito non dichiarato: l'unita' non ha chiuso con la riga ESITO" };
|
|
42
|
+
}
|
|
43
|
+
const value = outcomeLine.slice(OUTCOME_MARK.length).trim();
|
|
44
|
+
if (/^ok\b/i.test(value)) {
|
|
45
|
+
return { ok: true, ...(evidence.length ? { evidence } : {}) };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
ok: false,
|
|
49
|
+
reason: value.replace(/^fallito\s*/i, "").trim() || "fallito senza motivo dichiarato",
|
|
50
|
+
...(evidence.length ? { evidence } : {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Costruisce la funzione che il ciclo chiamera' per ogni unita'. `base` e' il
|
|
54
|
+
// contesto dell'host (provider, tool, config): di quello si riusa tutto TRANNE
|
|
55
|
+
// la sessione.
|
|
56
|
+
export function createFreshAgentRunner(base, options = {}) {
|
|
57
|
+
return async (item, signal) => {
|
|
58
|
+
const session = Session.create(base.config.sessionDir, `work-${item.id}-${Date.now().toString(36)}`);
|
|
59
|
+
const deps = {
|
|
60
|
+
...base,
|
|
61
|
+
session,
|
|
62
|
+
config: {
|
|
63
|
+
...base.config,
|
|
64
|
+
...(options.memoryScopeId ? { roomStoreId: options.memoryScopeId } : {}),
|
|
65
|
+
...(options.planStoreId ? { planStoreId: options.planStoreId } : {}),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
let text = "";
|
|
69
|
+
let failure = "";
|
|
70
|
+
await runTurn(deps, briefFor(item), (event) => {
|
|
71
|
+
if (event.type === "text")
|
|
72
|
+
text += event.delta;
|
|
73
|
+
// Un errore del provider non e' un fallimento dell'unita': va detto come
|
|
74
|
+
// tale, perche' al tentativo dopo la strada da cambiare non e' la stessa.
|
|
75
|
+
if (event.type === "error" && !failure)
|
|
76
|
+
failure = event.message;
|
|
77
|
+
options.onEvent?.(item, event);
|
|
78
|
+
}, signal);
|
|
79
|
+
if (failure)
|
|
80
|
+
return { ok: false, reason: `interrotta dal provider: ${failure}` };
|
|
81
|
+
return parseOutcome(text);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type WorkItemState = "ready" | "leased" | "done" | "blocked";
|
|
2
|
+
export interface WorkItem {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly title: string;
|
|
5
|
+
readonly brief: string;
|
|
6
|
+
readonly state: WorkItemState;
|
|
7
|
+
readonly attempts: number;
|
|
8
|
+
readonly maxAttempts: number;
|
|
9
|
+
readonly createdAt: number;
|
|
10
|
+
readonly updatedAt: number;
|
|
11
|
+
readonly owner?: string;
|
|
12
|
+
readonly leaseUntil?: number;
|
|
13
|
+
readonly after?: readonly string[];
|
|
14
|
+
readonly source?: string;
|
|
15
|
+
readonly evidence?: readonly string[];
|
|
16
|
+
readonly reason?: string;
|
|
17
|
+
readonly log?: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
export interface QueueCounts {
|
|
20
|
+
readonly ready: number;
|
|
21
|
+
readonly leased: number;
|
|
22
|
+
readonly done: number;
|
|
23
|
+
readonly blocked: number;
|
|
24
|
+
readonly total: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const DEFAULT_MAX_ATTEMPTS = 3;
|
|
27
|
+
export declare const DEFAULT_LEASE_MS: number;
|
|
28
|
+
export interface NewWorkItem {
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly brief: string;
|
|
31
|
+
readonly after?: readonly string[];
|
|
32
|
+
readonly source?: string;
|
|
33
|
+
readonly maxAttempts?: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function makeItem(id: string, input: NewWorkItem, now: number): WorkItem;
|
|
36
|
+
export declare function counts(items: readonly WorkItem[]): QueueCounts;
|
|
37
|
+
export declare function claimable(items: readonly WorkItem[]): readonly WorkItem[];
|
|
38
|
+
export declare function expire(items: readonly WorkItem[], now: number): readonly WorkItem[];
|
|
39
|
+
export declare function claim(items: readonly WorkItem[], owner: string, now: number, leaseMs: number): {
|
|
40
|
+
readonly items: readonly WorkItem[];
|
|
41
|
+
readonly item: WorkItem | null;
|
|
42
|
+
};
|
|
43
|
+
export declare function heartbeat(items: readonly WorkItem[], id: string, owner: string, now: number, leaseMs: number): readonly WorkItem[];
|
|
44
|
+
export declare function complete(items: readonly WorkItem[], id: string, now: number, evidence?: readonly string[]): readonly WorkItem[];
|
|
45
|
+
export declare function fail(items: readonly WorkItem[], id: string, now: number, reason: string): readonly WorkItem[];
|
|
46
|
+
export declare function formatQueue(items: readonly WorkItem[]): string;
|
|
47
|
+
export declare class WorkQueue {
|
|
48
|
+
private readonly file;
|
|
49
|
+
private data;
|
|
50
|
+
private constructor();
|
|
51
|
+
static open(sessionDir: string, scope?: string): WorkQueue;
|
|
52
|
+
items(): readonly WorkItem[];
|
|
53
|
+
counts(): QueueCounts;
|
|
54
|
+
add(input: NewWorkItem, now?: number): WorkItem;
|
|
55
|
+
claim(owner: string, leaseMs?: number, now?: number): WorkItem | null;
|
|
56
|
+
sweep(now?: number): QueueCounts;
|
|
57
|
+
heartbeat(id: string, owner: string, leaseMs?: number, now?: number): void;
|
|
58
|
+
complete(id: string, evidence?: readonly string[], now?: number): void;
|
|
59
|
+
fail(id: string, reason: string, now?: number): void;
|
|
60
|
+
private read;
|
|
61
|
+
private write;
|
|
62
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
// Coda di lavoro durevole con LEASE: il pezzo che permette a un agente di
|
|
2
|
+
// lavorare per giorni invece che per una conversazione.
|
|
3
|
+
//
|
|
4
|
+
// Il lavoro non puo' vivere nel contesto del modello. Un run lungo muore per due
|
|
5
|
+
// motivi: la finestra si riempie, e qualunque interruzione (crash, riavvio,
|
|
6
|
+
// provider giu') cancella lo stato. La via d'uscita e' la stessa che usa il
|
|
7
|
+
// harness autonomo di oh-my-cli: gli item stanno FUORI, in una coda con una
|
|
8
|
+
// macchina a stati, e ogni unita' di lavoro viene RIVENDICATA con un lease a
|
|
9
|
+
// scadenza. Se chi la teneva non da' piu' segni di vita, il lease scade e l'item
|
|
10
|
+
// torna disponibile: un crash diventa un ritardo, non una perdita.
|
|
11
|
+
//
|
|
12
|
+
// ready --claim--> leased --complete--> done
|
|
13
|
+
// ^ |
|
|
14
|
+
// | +--fail / lease scaduto--> ready (tentativo in piu')
|
|
15
|
+
// +-----------------------------------------------+
|
|
16
|
+
// v
|
|
17
|
+
// blocked (tentativi esauriti, con motivo)
|
|
18
|
+
//
|
|
19
|
+
// Nucleo PURO: le transizioni sono funzioni su array immutabili, quindi si
|
|
20
|
+
// verificano senza disco e senza orologio. La classe in fondo aggiunge la
|
|
21
|
+
// persistenza atomica.
|
|
22
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
export const DEFAULT_MAX_ATTEMPTS = 3;
|
|
25
|
+
export const DEFAULT_LEASE_MS = 15 * 60_000;
|
|
26
|
+
const MAX_LOG = 12;
|
|
27
|
+
// --- nucleo puro --------------------------------------------------------------
|
|
28
|
+
export function makeItem(id, input, now) {
|
|
29
|
+
const max = Number.isFinite(input.maxAttempts) && Number(input.maxAttempts) > 0
|
|
30
|
+
? Math.trunc(Number(input.maxAttempts))
|
|
31
|
+
: DEFAULT_MAX_ATTEMPTS;
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
title: oneLine(input.title, 120) || id,
|
|
35
|
+
brief: String(input.brief || "").trim(),
|
|
36
|
+
state: "ready",
|
|
37
|
+
attempts: 0,
|
|
38
|
+
maxAttempts: max,
|
|
39
|
+
createdAt: now,
|
|
40
|
+
updatedAt: now,
|
|
41
|
+
...(input.after?.length ? { after: [...input.after] } : {}),
|
|
42
|
+
...(input.source ? { source: oneLine(input.source, 60) } : {}),
|
|
43
|
+
log: [`${stamp(now)} creato`],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function counts(items) {
|
|
47
|
+
const tally = { ready: 0, leased: 0, done: 0, blocked: 0 };
|
|
48
|
+
for (const item of items)
|
|
49
|
+
tally[item.state] += 1;
|
|
50
|
+
return { ...tally, total: items.length };
|
|
51
|
+
}
|
|
52
|
+
// Item pronti a partire: stato ready e dipendenze tutte concluse. Ordine di
|
|
53
|
+
// creazione, cosi' la coda e' prevedibile e riproducibile.
|
|
54
|
+
export function claimable(items) {
|
|
55
|
+
const done = new Set(items.filter((item) => item.state === "done").map((item) => item.id));
|
|
56
|
+
return items
|
|
57
|
+
.filter((item) => item.state === "ready" && (item.after ?? []).every((dep) => done.has(dep)))
|
|
58
|
+
.sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id));
|
|
59
|
+
}
|
|
60
|
+
// Lease scaduti: chi li teneva non ha dato segni di vita. Tornano disponibili
|
|
61
|
+
// con un tentativo in piu'; esauriti i tentativi diventano blocked col motivo.
|
|
62
|
+
// Il tentativo si conta alla RIVENDICAZIONE, non qui: un item che fa cadere il
|
|
63
|
+
// processo deve consumare i suoi tentativi, altrimenti il loop ci gira sopra
|
|
64
|
+
// per sempre.
|
|
65
|
+
export function expire(items, now) {
|
|
66
|
+
return items.map((item) => {
|
|
67
|
+
if (item.state !== "leased")
|
|
68
|
+
return item;
|
|
69
|
+
if (Number(item.leaseUntil ?? 0) > now)
|
|
70
|
+
return item;
|
|
71
|
+
const exhausted = item.attempts >= item.maxAttempts;
|
|
72
|
+
return trim({
|
|
73
|
+
...item,
|
|
74
|
+
state: exhausted ? "blocked" : "ready",
|
|
75
|
+
updatedAt: now,
|
|
76
|
+
...(exhausted ? { reason: `nessun segno di vita dopo ${item.attempts} tentativi` } : {}),
|
|
77
|
+
owner: undefined,
|
|
78
|
+
leaseUntil: undefined,
|
|
79
|
+
log: [...(item.log ?? []), `${stamp(now)} lease scaduto (${item.owner || "?"}) -> ${exhausted ? "blocked" : "ready"}`],
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function claim(items, owner, now, leaseMs) {
|
|
84
|
+
const next = claimable(items)[0];
|
|
85
|
+
if (!next)
|
|
86
|
+
return { items, item: null };
|
|
87
|
+
const claimed = trim({
|
|
88
|
+
...next,
|
|
89
|
+
state: "leased",
|
|
90
|
+
owner: String(owner || "agente"),
|
|
91
|
+
leaseUntil: now + Math.max(1_000, leaseMs),
|
|
92
|
+
attempts: next.attempts + 1,
|
|
93
|
+
updatedAt: now,
|
|
94
|
+
log: [...(next.log ?? []), `${stamp(now)} rivendicato da ${owner} (tentativo ${next.attempts + 1}/${next.maxAttempts})`],
|
|
95
|
+
});
|
|
96
|
+
return { items: replace(items, claimed), item: claimed };
|
|
97
|
+
}
|
|
98
|
+
export function heartbeat(items, id, owner, now, leaseMs) {
|
|
99
|
+
return items.map((item) => (item.id === id && item.state === "leased" && item.owner === owner
|
|
100
|
+
? { ...item, leaseUntil: now + Math.max(1_000, leaseMs), updatedAt: now }
|
|
101
|
+
: item));
|
|
102
|
+
}
|
|
103
|
+
export function complete(items, id, now, evidence = []) {
|
|
104
|
+
return items.map((item) => (item.id === id ? trim({
|
|
105
|
+
...item,
|
|
106
|
+
state: "done",
|
|
107
|
+
owner: undefined,
|
|
108
|
+
leaseUntil: undefined,
|
|
109
|
+
updatedAt: now,
|
|
110
|
+
...(evidence.length ? { evidence: evidence.map((line) => oneLine(line, 200)) } : {}),
|
|
111
|
+
log: [...(item.log ?? []), `${stamp(now)} concluso`],
|
|
112
|
+
}) : item));
|
|
113
|
+
}
|
|
114
|
+
// Esito negativo dichiarato (dall'agente o dal gate di verifica). Il motivo
|
|
115
|
+
// resta attaccato all'item: al tentativo dopo, chi lo riprende sa cosa e'
|
|
116
|
+
// andato storto invece di ripetere lo stesso errore.
|
|
117
|
+
export function fail(items, id, now, reason) {
|
|
118
|
+
return items.map((item) => {
|
|
119
|
+
if (item.id !== id)
|
|
120
|
+
return item;
|
|
121
|
+
const exhausted = item.attempts >= item.maxAttempts;
|
|
122
|
+
return trim({
|
|
123
|
+
...item,
|
|
124
|
+
state: exhausted ? "blocked" : "ready",
|
|
125
|
+
owner: undefined,
|
|
126
|
+
leaseUntil: undefined,
|
|
127
|
+
updatedAt: now,
|
|
128
|
+
reason: oneLine(reason, 400),
|
|
129
|
+
log: [...(item.log ?? []), `${stamp(now)} fallito: ${oneLine(reason, 120)} -> ${exhausted ? "blocked" : "ready"}`],
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
export function formatQueue(items) {
|
|
134
|
+
if (!items.length)
|
|
135
|
+
return "coda vuota";
|
|
136
|
+
const tally = counts(items);
|
|
137
|
+
const head = `${tally.total} item · ${tally.ready} pronti · ${tally.leased} in corso · ${tally.done} conclusi · ${tally.blocked} bloccati`;
|
|
138
|
+
const rows = items.map((item) => {
|
|
139
|
+
const extra = item.state === "leased" ? `:${item.owner}` : "";
|
|
140
|
+
// Il motivo si mostra anche su un item tornato pronto: e' cio' che chi lo
|
|
141
|
+
// riprende deve sapere prima di ripetere la stessa strada.
|
|
142
|
+
const why = item.state !== "done" && item.reason ? ` — ${oneLine(item.reason, 90)}` : "";
|
|
143
|
+
const deps = item.after?.length ? ` dopo ${item.after.join(",")}` : "";
|
|
144
|
+
return `${item.id} [${item.state}${extra}] ${item.title}${deps} · tentativi ${item.attempts}/${item.maxAttempts}${why}`;
|
|
145
|
+
});
|
|
146
|
+
return [head, ...rows].join("\n");
|
|
147
|
+
}
|
|
148
|
+
const EMPTY = { version: 1, nextSeq: 1, items: [] };
|
|
149
|
+
export class WorkQueue {
|
|
150
|
+
file;
|
|
151
|
+
data;
|
|
152
|
+
constructor(file) {
|
|
153
|
+
this.file = file;
|
|
154
|
+
this.data = this.read();
|
|
155
|
+
}
|
|
156
|
+
static open(sessionDir, scope = "default") {
|
|
157
|
+
const dir = join(sessionDir, "work-queue");
|
|
158
|
+
return new WorkQueue(join(dir, `${sanitize(scope)}.json`));
|
|
159
|
+
}
|
|
160
|
+
items() {
|
|
161
|
+
return this.data.items;
|
|
162
|
+
}
|
|
163
|
+
counts() {
|
|
164
|
+
return counts(this.data.items);
|
|
165
|
+
}
|
|
166
|
+
add(input, now = Date.now()) {
|
|
167
|
+
const id = `w${this.data.nextSeq}`;
|
|
168
|
+
const item = makeItem(id, input, now);
|
|
169
|
+
this.write({ version: 1, nextSeq: this.data.nextSeq + 1, items: [...this.data.items, item] });
|
|
170
|
+
return item;
|
|
171
|
+
}
|
|
172
|
+
// Ogni lettura per lavorare passa da qui: prima si recuperano i lease scaduti,
|
|
173
|
+
// poi si rivendica. Il watchdog non e' un processo a parte, e' un passo del
|
|
174
|
+
// ciclo — cosi' non esiste il caso "il watchdog era spento".
|
|
175
|
+
claim(owner, leaseMs = DEFAULT_LEASE_MS, now = Date.now()) {
|
|
176
|
+
const recovered = expire(this.data.items, now);
|
|
177
|
+
const outcome = claim(recovered, owner, now, leaseMs);
|
|
178
|
+
this.write({ ...this.data, items: outcome.items });
|
|
179
|
+
return outcome.item;
|
|
180
|
+
}
|
|
181
|
+
sweep(now = Date.now()) {
|
|
182
|
+
this.write({ ...this.data, items: expire(this.data.items, now) });
|
|
183
|
+
return this.counts();
|
|
184
|
+
}
|
|
185
|
+
heartbeat(id, owner, leaseMs = DEFAULT_LEASE_MS, now = Date.now()) {
|
|
186
|
+
this.write({ ...this.data, items: heartbeat(this.data.items, id, owner, now, leaseMs) });
|
|
187
|
+
}
|
|
188
|
+
complete(id, evidence = [], now = Date.now()) {
|
|
189
|
+
this.write({ ...this.data, items: complete(this.data.items, id, now, evidence) });
|
|
190
|
+
}
|
|
191
|
+
fail(id, reason, now = Date.now()) {
|
|
192
|
+
this.write({ ...this.data, items: fail(this.data.items, id, now, reason) });
|
|
193
|
+
}
|
|
194
|
+
read() {
|
|
195
|
+
try {
|
|
196
|
+
if (!existsSync(this.file))
|
|
197
|
+
return EMPTY;
|
|
198
|
+
const parsed = JSON.parse(readFileSync(this.file, "utf8"));
|
|
199
|
+
if (!parsed || !Array.isArray(parsed.items))
|
|
200
|
+
return EMPTY;
|
|
201
|
+
const seq = Number(parsed.nextSeq);
|
|
202
|
+
return {
|
|
203
|
+
version: 1,
|
|
204
|
+
nextSeq: Number.isFinite(seq) && seq > 0 ? Math.trunc(seq) : parsed.items.length + 1,
|
|
205
|
+
items: parsed.items,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Una coda illeggibile non deve diventare una coda cancellata: si riparte
|
|
210
|
+
// vuoti in memoria ma il file resta sul disco per l'ispezione.
|
|
211
|
+
return EMPTY;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Scrittura atomica: un'interruzione a meta' non deve lasciare una coda
|
|
215
|
+
// troncata, che e' esattamente lo stato in cui il recupero serve.
|
|
216
|
+
write(next) {
|
|
217
|
+
this.data = next;
|
|
218
|
+
try {
|
|
219
|
+
mkdirSync(join(this.file, ".."), { recursive: true });
|
|
220
|
+
const tmp = `${this.file}.tmp-${process.pid}`;
|
|
221
|
+
writeFileSync(tmp, JSON.stringify(next, null, 2), "utf8");
|
|
222
|
+
renameSync(tmp, this.file);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// La coda in memoria resta valida per questo giro: il chiamante lo scopre
|
|
226
|
+
// al riavvio, non a meta' di un'unita' di lavoro.
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// --- helper ------------------------------------------------------------------
|
|
231
|
+
function replace(items, item) {
|
|
232
|
+
return items.map((current) => (current.id === item.id ? item : current));
|
|
233
|
+
}
|
|
234
|
+
// I campi undefined non devono finire nel JSON (owner/leaseUntil di un item
|
|
235
|
+
// tornato ready): un lease "presente ma nullo" e' un lease che confonde.
|
|
236
|
+
function trim(item) {
|
|
237
|
+
const out = { ...item };
|
|
238
|
+
for (const key of ["owner", "leaseUntil", "reason", "evidence"]) {
|
|
239
|
+
if (out[key] === undefined)
|
|
240
|
+
delete out[key];
|
|
241
|
+
}
|
|
242
|
+
if (Array.isArray(out["log"]))
|
|
243
|
+
out["log"] = out["log"].slice(-MAX_LOG);
|
|
244
|
+
return out;
|
|
245
|
+
}
|
|
246
|
+
function oneLine(value, max) {
|
|
247
|
+
const clean = String(value ?? "").replace(/\s+/g, " ").trim();
|
|
248
|
+
return clean.length > max ? `${clean.slice(0, max - 1)}…` : clean;
|
|
249
|
+
}
|
|
250
|
+
function stamp(now) {
|
|
251
|
+
return new Date(now).toISOString().slice(0, 19).replace("T", " ");
|
|
252
|
+
}
|
|
253
|
+
function sanitize(value) {
|
|
254
|
+
return String(value || "default").replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 80);
|
|
255
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { WorkQueue, type QueueCounts, type WorkItem } from "./work-queue.js";
|
|
2
|
+
export interface ItemOutcome {
|
|
3
|
+
readonly ok: boolean;
|
|
4
|
+
readonly evidence?: readonly string[];
|
|
5
|
+
readonly reason?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface GateOutcome {
|
|
8
|
+
readonly ok: boolean;
|
|
9
|
+
readonly log: string;
|
|
10
|
+
}
|
|
11
|
+
export type LoopEvent = {
|
|
12
|
+
readonly type: "sweep";
|
|
13
|
+
readonly counts: QueueCounts;
|
|
14
|
+
} | {
|
|
15
|
+
readonly type: "claimed";
|
|
16
|
+
readonly item: WorkItem;
|
|
17
|
+
} | {
|
|
18
|
+
readonly type: "ran";
|
|
19
|
+
readonly item: WorkItem;
|
|
20
|
+
readonly outcome: ItemOutcome;
|
|
21
|
+
readonly ms: number;
|
|
22
|
+
} | {
|
|
23
|
+
readonly type: "gate";
|
|
24
|
+
readonly item: WorkItem;
|
|
25
|
+
readonly gate: GateOutcome;
|
|
26
|
+
} | {
|
|
27
|
+
readonly type: "settled";
|
|
28
|
+
readonly item: WorkItem;
|
|
29
|
+
readonly state: "done" | "retry" | "blocked";
|
|
30
|
+
} | {
|
|
31
|
+
readonly type: "idle";
|
|
32
|
+
readonly counts: QueueCounts;
|
|
33
|
+
} | {
|
|
34
|
+
readonly type: "stopped";
|
|
35
|
+
readonly why: StopReason;
|
|
36
|
+
readonly counts: QueueCounts;
|
|
37
|
+
};
|
|
38
|
+
export type StopReason = "coda-vuota" | "budget-item" | "scadenza" | "interrotto" | "errore-ripetuto";
|
|
39
|
+
export interface WorkLoopDeps {
|
|
40
|
+
readonly queue: WorkQueue;
|
|
41
|
+
readonly runItem: (item: WorkItem, signal: AbortSignal) => Promise<ItemOutcome>;
|
|
42
|
+
readonly verify?: (item: WorkItem, outcome: ItemOutcome) => Promise<GateOutcome>;
|
|
43
|
+
readonly owner?: string;
|
|
44
|
+
readonly now?: () => number;
|
|
45
|
+
readonly sleep?: (ms: number) => Promise<void>;
|
|
46
|
+
readonly onEvent?: (event: LoopEvent) => void;
|
|
47
|
+
}
|
|
48
|
+
export interface WorkLoopOptions {
|
|
49
|
+
readonly maxItems?: number;
|
|
50
|
+
readonly deadline?: number;
|
|
51
|
+
readonly leaseMs?: number;
|
|
52
|
+
readonly waitWhenEmptyMs?: number;
|
|
53
|
+
readonly idleRounds?: number;
|
|
54
|
+
readonly signal?: AbortSignal;
|
|
55
|
+
}
|
|
56
|
+
export interface LoopReport {
|
|
57
|
+
readonly why: StopReason;
|
|
58
|
+
readonly done: number;
|
|
59
|
+
readonly retried: number;
|
|
60
|
+
readonly blocked: number;
|
|
61
|
+
readonly ms: number;
|
|
62
|
+
readonly counts: QueueCounts;
|
|
63
|
+
}
|
|
64
|
+
export declare function runWorkLoop(deps: WorkLoopDeps, options?: WorkLoopOptions): Promise<LoopReport>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Il ciclo che sta FUORI dalla conversazione.
|
|
2
|
+
//
|
|
3
|
+
// Un agente che lavora per giorni non e' un turno lungo: e' una sequenza di
|
|
4
|
+
// unita' di lavoro brevi, ognuna eseguita da un agente NUOVO che riceve solo il
|
|
5
|
+
// suo brief. Cosi' il contesto non cresce (il costo per unita' resta costante) e
|
|
6
|
+
// un'interruzione perde un'unita', non il lavoro.
|
|
7
|
+
//
|
|
8
|
+
// sweep (recupera i lease scaduti)
|
|
9
|
+
// -> claim (rivendica un'unita')
|
|
10
|
+
// -> esegui con un agente nuovo, battendo il cuore mentre lavora
|
|
11
|
+
// -> VERIFICA ESTERNA (exit code, non opinione del modello)
|
|
12
|
+
// -> verde: done | rosso: fail (ritenta, o blocked)
|
|
13
|
+
// -> ripeti fino a coda vuota o budget esaurito
|
|
14
|
+
//
|
|
15
|
+
// La verifica e' un parametro: chi la fornisce decide cosa vuol dire "fatto".
|
|
16
|
+
// Senza di essa il ciclo si fida di chi ha scritto il codice, che e' il modo
|
|
17
|
+
// tipico in cui i run lunghi divergono in silenzio.
|
|
18
|
+
import { DEFAULT_LEASE_MS, WorkQueue, } from "./work-queue.js";
|
|
19
|
+
export async function runWorkLoop(deps, options = {}) {
|
|
20
|
+
const now = deps.now ?? (() => Date.now());
|
|
21
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
22
|
+
const owner = deps.owner || "runner";
|
|
23
|
+
const leaseMs = Math.max(1_000, options.leaseMs ?? DEFAULT_LEASE_MS);
|
|
24
|
+
const maxItems = Math.max(1, Math.trunc(options.maxItems ?? 25));
|
|
25
|
+
const idleRounds = Math.max(0, Math.trunc(options.idleRounds ?? 0));
|
|
26
|
+
const startedAt = now();
|
|
27
|
+
let done = 0;
|
|
28
|
+
let retried = 0;
|
|
29
|
+
let blocked = 0;
|
|
30
|
+
let idle = 0;
|
|
31
|
+
// Due esecuzioni di fila che esplodono nel RUNNER (non nell'unita') sono un
|
|
32
|
+
// guasto dell'impianto: continuare consumerebbe i tentativi di tutta la coda.
|
|
33
|
+
let crashes = 0;
|
|
34
|
+
const emit = (event) => {
|
|
35
|
+
try {
|
|
36
|
+
deps.onEvent?.(event);
|
|
37
|
+
}
|
|
38
|
+
catch { /* l'osservatore non governa il ciclo */ }
|
|
39
|
+
};
|
|
40
|
+
const stop = (why) => {
|
|
41
|
+
const counts = deps.queue.counts();
|
|
42
|
+
emit({ type: "stopped", why, counts });
|
|
43
|
+
return { why, done, retried, blocked, ms: now() - startedAt, counts };
|
|
44
|
+
};
|
|
45
|
+
while (done + retried + blocked < maxItems) {
|
|
46
|
+
if (options.signal?.aborted)
|
|
47
|
+
return stop("interrotto");
|
|
48
|
+
if (options.deadline && now() >= options.deadline)
|
|
49
|
+
return stop("scadenza");
|
|
50
|
+
emit({ type: "sweep", counts: deps.queue.sweep(now()) });
|
|
51
|
+
const item = deps.queue.claim(owner, leaseMs, now());
|
|
52
|
+
if (!item) {
|
|
53
|
+
const counts = deps.queue.counts();
|
|
54
|
+
emit({ type: "idle", counts });
|
|
55
|
+
if (idle >= idleRounds || !options.waitWhenEmptyMs)
|
|
56
|
+
return stop("coda-vuota");
|
|
57
|
+
idle += 1;
|
|
58
|
+
await sleep(options.waitWhenEmptyMs);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
idle = 0;
|
|
62
|
+
emit({ type: "claimed", item });
|
|
63
|
+
// Il battito tiene il lease vivo mentre l'unita' lavora: senza, un'unita'
|
|
64
|
+
// legittimamente lunga verrebbe rubata dal watchdog a meta'.
|
|
65
|
+
const beat = setInterval(() => {
|
|
66
|
+
try {
|
|
67
|
+
deps.queue.heartbeat(item.id, owner, leaseMs, now());
|
|
68
|
+
}
|
|
69
|
+
catch { /* riprovera' */ }
|
|
70
|
+
}, Math.max(1_000, Math.floor(leaseMs / 3)));
|
|
71
|
+
if (typeof beat.unref === "function")
|
|
72
|
+
beat.unref();
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
const onAbort = () => controller.abort();
|
|
75
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
76
|
+
const at = now();
|
|
77
|
+
let outcome;
|
|
78
|
+
try {
|
|
79
|
+
outcome = await deps.runItem(item, controller.signal);
|
|
80
|
+
crashes = 0;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
crashes += 1;
|
|
84
|
+
outcome = { ok: false, reason: `esecuzione interrotta: ${error?.message ?? String(error)}` };
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
clearInterval(beat);
|
|
88
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
89
|
+
}
|
|
90
|
+
emit({ type: "ran", item, outcome, ms: now() - at });
|
|
91
|
+
// Il gate gira SOLO se l'unita' si dichiara riuscita: verificare un
|
|
92
|
+
// fallimento dichiarato costa e non cambia l'esito.
|
|
93
|
+
let gate = null;
|
|
94
|
+
if (outcome.ok && deps.verify) {
|
|
95
|
+
try {
|
|
96
|
+
gate = await deps.verify(item, outcome);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
gate = { ok: false, log: `verifica non eseguibile: ${error?.message ?? String(error)}` };
|
|
100
|
+
}
|
|
101
|
+
emit({ type: "gate", item, gate });
|
|
102
|
+
}
|
|
103
|
+
const passed = outcome.ok && (gate ? gate.ok : true);
|
|
104
|
+
if (passed) {
|
|
105
|
+
const evidence = [...(outcome.evidence ?? []), ...(gate ? [`verifica: ${firstLines(gate.log, 2)}`] : [])];
|
|
106
|
+
deps.queue.complete(item.id, evidence, now());
|
|
107
|
+
done += 1;
|
|
108
|
+
emit({ type: "settled", item, state: "done" });
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const reason = gate && !gate.ok
|
|
112
|
+
? `verifica fallita: ${firstLines(gate.log, 6)}`
|
|
113
|
+
: (outcome.reason || "esito negativo senza motivo dichiarato");
|
|
114
|
+
deps.queue.fail(item.id, reason, now());
|
|
115
|
+
const after = deps.queue.items().find((current) => current.id === item.id);
|
|
116
|
+
if (after?.state === "blocked") {
|
|
117
|
+
blocked += 1;
|
|
118
|
+
emit({ type: "settled", item, state: "blocked" });
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
retried += 1;
|
|
122
|
+
emit({ type: "settled", item, state: "retry" });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (crashes >= 2)
|
|
126
|
+
return stop("errore-ripetuto");
|
|
127
|
+
}
|
|
128
|
+
return stop("budget-item");
|
|
129
|
+
}
|
|
130
|
+
function firstLines(text, lines) {
|
|
131
|
+
return String(text || "")
|
|
132
|
+
.split(/\r?\n/)
|
|
133
|
+
.filter((line) => line.trim())
|
|
134
|
+
.slice(0, lines)
|
|
135
|
+
.join(" | ")
|
|
136
|
+
.slice(0, 400);
|
|
137
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface GitResult {
|
|
2
|
+
readonly code: number;
|
|
3
|
+
readonly stdout: string;
|
|
4
|
+
readonly stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CommitAllResult {
|
|
7
|
+
readonly ok: boolean;
|
|
8
|
+
readonly committed: boolean;
|
|
9
|
+
readonly clean: boolean;
|
|
10
|
+
readonly note: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BaseBranchCheck {
|
|
13
|
+
readonly ok: boolean;
|
|
14
|
+
readonly current: string | null;
|
|
15
|
+
readonly note: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function runGit(cwd: string, args: readonly string[], signal?: AbortSignal): Promise<GitResult>;
|
|
18
|
+
export declare function worktreeMode(env: NodeJS.ProcessEnv): boolean;
|
|
19
|
+
export declare function isGitRepo(cwd: string): Promise<boolean>;
|
|
20
|
+
export declare function repoRoot(cwd: string): Promise<string | null>;
|
|
21
|
+
export declare function currentBranch(cwd: string, signal?: AbortSignal): Promise<string | null>;
|
|
22
|
+
export declare function resolveBaseBranch(cwd: string, env: NodeJS.ProcessEnv, explicit?: string): Promise<string | null>;
|
|
23
|
+
export declare function verifyBaseBranch(root: string, base: string, signal?: AbortSignal): Promise<BaseBranchCheck>;
|
|
24
|
+
export declare function sanitizeRef(s: string): string;
|
|
25
|
+
export declare function vassalBranchName(kingdomId: string, slug: string): string;
|
|
26
|
+
export declare function worktreeDir(kingdomId: string, slug: string): string;
|
|
27
|
+
export declare function addWorktree(root: string, dir: string, branch: string, base: string, signal?: AbortSignal): Promise<GitResult>;
|
|
28
|
+
export declare function commitAll(dir: string, message: string, signal?: AbortSignal): Promise<CommitAllResult>;
|
|
29
|
+
export interface MergeResult {
|
|
30
|
+
readonly ok: boolean;
|
|
31
|
+
readonly conflict: boolean;
|
|
32
|
+
readonly note: string;
|
|
33
|
+
readonly integrated?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function mergeBack(root: string, base: string, branch: string, message: string, signal?: AbortSignal): Promise<MergeResult>;
|
|
36
|
+
export declare function removeWorktree(root: string, dir: string, signal?: AbortSignal): Promise<GitResult>;
|
|
37
|
+
export declare function deleteBranch(root: string, branch: string, signal?: AbortSignal): Promise<GitResult>;
|
|
38
|
+
export declare function revParse(cwd: string, ref: string, signal?: AbortSignal): Promise<string | null>;
|