@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
package/README.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/branding/talos-hero.png" alt="Vascend Talos" width="880">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">Vascend Talos</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center"><strong>Your models. Your tools. Your coding workflow.</strong><br>
|
|
8
|
+
An extensible coding agent runtime for the terminal and the applications you build.</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="package.json"><img src="https://img.shields.io/badge/version-0.1.0-c5a55a?style=flat-square" alt="v0.1.0"></a>
|
|
12
|
+
<a href="https://bun.sh"><img src="https://img.shields.io/badge/runtime-Bun-171717?style=flat-square&logo=bun&logoColor=white" alt="Bun"></a>
|
|
13
|
+
<a href="src/sdk.ts"><img src="https://img.shields.io/badge/TypeScript-CLI_%2B_SDK-3178c6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript CLI + SDK"></a>
|
|
14
|
+
<img src="https://img.shields.io/badge/Windows_%7C_macOS_%7C_Linux-555555?style=flat-square" alt="Windows, macOS, Linux">
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center"><strong>English</strong> · <a href="readme/README.it.md">Italiano</a> · <a href="readme/README.es.md">Español</a> · <a href="readme/README.de.md">Deutsch</a></p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="#quick-start">Quick start</a> · <a href="#why-talos">Features</a> · <a href="#cli--sdk">CLI & SDK</a> · <a href="docs/README.md">Documentation</a> · <a href="https://github.com/VascendTechnologies/vascend-talos/issues">Issues</a>
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
**Talos brings the agent loop, tools and session context into one runtime.** Work in your terminal, automate a task from a script, or embed the same engine in an application. Choose your provider, resume a conversation and extend the workflow with skills and MCP tools.
|
|
26
|
+
|
|
27
|
+
Talos also powers **Vascend Horizon**. The standalone CLI runs independently of the desktop application.
|
|
28
|
+
|
|
29
|
+
## Quick start
|
|
30
|
+
|
|
31
|
+
Install [Node.js 20 or newer](https://nodejs.org), then run:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install -g @vascend/talos
|
|
35
|
+
talos
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
You can also use `bun add -g @vascend/talos`, `pnpm add -g @vascend/talos`, or `yarn global add @vascend/talos` (Yarn Classic).
|
|
39
|
+
The package includes the compiled CLI and SDK; GitHub access and a local build are not required.
|
|
40
|
+
|
|
41
|
+
On macOS and Linux, the installer uses a writable user directory:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
curl -fsSL https://cdn.jsdelivr.net/npm/@vascend/talos@latest/install.sh | bash
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
On Windows, run in PowerShell:
|
|
48
|
+
|
|
49
|
+
```powershell
|
|
50
|
+
irm https://cdn.jsdelivr.net/npm/@vascend/talos@latest/install.ps1 | iex
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Both installers require Node.js 20+ and npm. Run `talos` to check for newer stable versions;
|
|
54
|
+
the startup prompt shows `current version → new version` and offers **Skip for now** or **Update now**.
|
|
55
|
+
|
|
56
|
+
On first launch, follow the Vascend account sign-in flow. Use `/login` to configure provider access and `/models` to choose a model. Then give Talos a task:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
Explain this repository, identify its entry points, and suggest where to add tests.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
<details>
|
|
63
|
+
<summary><strong>Run from source or update your installation</strong></summary>
|
|
64
|
+
|
|
65
|
+
For a source checkout, install [Git](https://git-scm.com/downloads) and [Bun](https://bun.sh), then use a GitHub account with repository access:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git clone https://github.com/VascendTechnologies/vascend-talos.git
|
|
69
|
+
cd vascend-talos
|
|
70
|
+
bun install --frozen-lockfile
|
|
71
|
+
bun run install:cli
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
For development, run `bun run dev` from the repository. For a single task:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
bun run src/index.ts -p "Summarize this repository"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
To update a clean checkout and rebuild the global commands:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
git pull --ff-only
|
|
84
|
+
bun install --frozen-lockfile
|
|
85
|
+
bun run install:cli
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Full configuration and API key examples: [CLI reference](docs/CLI-REFERENCE.it.md#avvio-dal-sorgente) (Italian).
|
|
89
|
+
|
|
90
|
+
</details>
|
|
91
|
+
|
|
92
|
+
## Why Talos
|
|
93
|
+
|
|
94
|
+
| Capability | What it gives you |
|
|
95
|
+
| --- | --- |
|
|
96
|
+
| **One engine, multiple interfaces** | Interactive CLI, one-shot tasks, JSONL RPC, a TypeScript SDK and Horizon Engine. |
|
|
97
|
+
| **Provider choice** | Anthropic, OpenAI-compatible providers and local Ollama models, with a model picker inside the session. |
|
|
98
|
+
| **Resumable work** | Saved conversations, session branches, context inspection and project memory. |
|
|
99
|
+
| **Extensible tools** | File and shell tools, MCP connections, skills, hooks and project instructions. |
|
|
100
|
+
| **A readable terminal** | Compact operation previews, full details on demand and questions that leave your draft intact. |
|
|
101
|
+
| **Explicit control** | Configurable permissions, separate desktop consent and teams started on request. |
|
|
102
|
+
|
|
103
|
+
## Keep your place in the conversation
|
|
104
|
+
|
|
105
|
+
**Keep writing while the agent asks a question.** Questions wait above the prompt. Open one when you are ready, choose an option or select **Other** to write your own answer. Your main prompt and answer drafts remain separate.
|
|
106
|
+
|
|
107
|
+
| Action | Shortcut |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| Open a pending question | **Shift+←** |
|
|
110
|
+
| Submit an answer | **Enter** |
|
|
111
|
+
| Return to the main prompt and keep the answer draft | **Alt+↓** or **Esc** |
|
|
112
|
+
| Skip the current question | **Ctrl+]** |
|
|
113
|
+
| Read complete tool output | **Ctrl+R** |
|
|
114
|
+
| Manage queued messages | **Alt+Q** or `/queue` |
|
|
115
|
+
|
|
116
|
+
Loaded skills have a compact activity entry; the full content stays in the operation details:
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
• Explored
|
|
120
|
+
└ Read SKILL.md (vascend-ops skill)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Use `/language` to choose **English, Italian, Spanish or German**. The choice is saved between launches. `/language system` restores automatic detection; `TALOS_LANGUAGE` provides a process-level override.
|
|
124
|
+
|
|
125
|
+
## CLI & SDK
|
|
126
|
+
|
|
127
|
+
| Entry point | Example | Use |
|
|
128
|
+
| --- | --- | --- |
|
|
129
|
+
| Interactive terminal | `talos` | Work alongside the agent. |
|
|
130
|
+
| One-shot execution | `talos -p "Explain this project"` | Scripts, pipes and individual tasks; add `--json` for events. |
|
|
131
|
+
| RPC | `talos --rpc` | Connect a host over stdin/stdout using JSONL. |
|
|
132
|
+
| TypeScript SDK | `import { bootstrap, runTurn } from "@vascend/talos"` | Embed the agent loop in a process. |
|
|
133
|
+
| Horizon Engine | `HorizonEngine.create(...)` | Integrate the headless engine with an application. |
|
|
134
|
+
|
|
135
|
+
The SDK import is the package entry point after building and linking or installing the repository. See the [SDK exports](src/sdk.ts) and [architecture](docs/ARCHITECTURE.md).
|
|
136
|
+
|
|
137
|
+
### Everyday commands
|
|
138
|
+
|
|
139
|
+
| Command | Purpose |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| `/help` | Browse available commands. |
|
|
142
|
+
| `/login` · `/models` | Configure provider access and select a model. |
|
|
143
|
+
| `/new` · `/resume` | Start a conversation or reopen a saved one. |
|
|
144
|
+
| `/context` · `/usage` | Inspect context and provider usage. |
|
|
145
|
+
| `/todo` · `/collaboratori` | Inspect the plan or explicitly start collaborators. |
|
|
146
|
+
| `/queue` · `/language` | Manage pending messages and the interface language. |
|
|
147
|
+
|
|
148
|
+
## Providers and extensions
|
|
149
|
+
|
|
150
|
+
Use **Anthropic, OpenAI, OpenRouter, Mistral, DeepSeek, xAI, Together, MiniMax or Ollama**, or configure a compatible endpoint. Available models and authentication methods depend on the provider and your account. See the [provider catalog](src/providers/catalog.ts).
|
|
151
|
+
|
|
152
|
+
- **Project instructions:** define working rules in `AGENTS.md` and `SYSTEM.md`.
|
|
153
|
+
- **Skills:** load reusable instructions from `SKILL.md`, including `/skill:name` invocations.
|
|
154
|
+
- **MCP:** connect external tools through the shared tool protocol.
|
|
155
|
+
- **Extensions:** add tools, commands, hooks and templates to the runtime.
|
|
156
|
+
|
|
157
|
+
The package declares no production npm dependencies. Optional integrations and desktop control can require additional system programs.
|
|
158
|
+
|
|
159
|
+
## Platforms
|
|
160
|
+
|
|
161
|
+
| Platform | CLI | Desktop control |
|
|
162
|
+
| --- | --- | --- |
|
|
163
|
+
| Windows | Supported | Standalone backend included. |
|
|
164
|
+
| macOS | Supported | Requires `cliclick` and Accessibility / Screen Recording permissions. |
|
|
165
|
+
| Linux | Supported | X11 requires `xdotool` and ImageMagick. Global Wayland control is not supported. |
|
|
166
|
+
|
|
167
|
+
Desktop control requires separate consent, including when automatic tool approvals are enabled. See [Computer Use](docs/COMPUTER-USE.md) for setup and limitations.
|
|
168
|
+
|
|
169
|
+
## Documentation
|
|
170
|
+
|
|
171
|
+
| Guide | Contents |
|
|
172
|
+
| --- | --- |
|
|
173
|
+
| [Documentation index](docs/README.md) | Find the right guide. |
|
|
174
|
+
| [CLI reference](docs/CLI-REFERENCE.it.md) | Installation, commands, configuration, queues and providers. |
|
|
175
|
+
| [Architecture](docs/ARCHITECTURE.md) | Runtime modules and integration boundaries. |
|
|
176
|
+
| [Computer Use](docs/COMPUTER-USE.md) | Desktop backends, permissions and setup. |
|
|
177
|
+
| [Context Fabric](docs/CONTEXT-FABRIC.md) | Context management and retrieval. |
|
|
178
|
+
| [Tool protocol](docs/TOOL-PROTOCOL.md) | Tool discovery and execution. |
|
|
179
|
+
| [Benchmarks](bench/README.md) | Evaluation suites and how to run them. |
|
|
180
|
+
|
|
181
|
+
This README is available in four languages. The extended technical guides are currently primarily in Italian.
|
|
182
|
+
|
|
183
|
+
## Development
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
bun run typecheck
|
|
187
|
+
bun run typecheck:bench
|
|
188
|
+
bun run test:unit
|
|
189
|
+
bun run build
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Unit test files run in separate processes. For one suite: `bun run test:unit -- test/queued-questions.test.ts`. See the [E2E documentation](test/e2e/README.md) for integration test setup.
|
|
193
|
+
|
|
194
|
+
Report bugs in [Issues](https://github.com/VascendTechnologies/vascend-talos/issues) with your platform, Bun version, reproduction steps and relevant logs, with credentials removed.
|
|
195
|
+
|
|
196
|
+
## Project and license
|
|
197
|
+
|
|
198
|
+
Built by [Vascend Technologies](https://vascend.it). Inspired by the extensible agent philosophy of [Pi](https://pi.dev).
|
|
199
|
+
|
|
200
|
+
The package is marked **`UNLICENSED`**. This repository does not grant an open-source license; use and distribution require permission from Vascend Technologies.
|
|
201
|
+
|
|
202
|
+
<p align="center"><strong>English</strong> · <a href="readme/README.it.md">Italiano</a> · <a href="readme/README.es.md">Español</a> · <a href="readme/README.de.md">Deutsch</a> · <a href="docs/README.md">Documentation</a></p>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type RoomRecord } from "../vascend/room-memory.js";
|
|
2
|
+
import type { Asset } from "./types.js";
|
|
3
|
+
export type AssetEventType = "asset.uploaded" | "asset.linked" | "asset.analyzed" | "asset.versioned";
|
|
4
|
+
export interface AssetEvent {
|
|
5
|
+
readonly type: AssetEventType;
|
|
6
|
+
readonly asset: Asset;
|
|
7
|
+
readonly taskId?: string;
|
|
8
|
+
readonly relation?: string;
|
|
9
|
+
readonly analysis?: string;
|
|
10
|
+
readonly version?: string;
|
|
11
|
+
readonly note?: string;
|
|
12
|
+
readonly at: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AssetEventSink {
|
|
15
|
+
emit(event: AssetEvent): void;
|
|
16
|
+
}
|
|
17
|
+
export declare function formatAssetEventRecord(room: string, event: AssetEvent): RoomRecord;
|
|
18
|
+
export declare class RoomMemoryAssetSink implements AssetEventSink {
|
|
19
|
+
private readonly sessionDir;
|
|
20
|
+
private readonly storeId;
|
|
21
|
+
private readonly namespace;
|
|
22
|
+
private constructor();
|
|
23
|
+
static open(sessionDir: string, storeId: string, namespace?: string): RoomMemoryAssetSink;
|
|
24
|
+
emit(event: AssetEvent): void;
|
|
25
|
+
}
|
|
26
|
+
export declare class InMemoryAssetSink implements AssetEventSink {
|
|
27
|
+
private readonly events;
|
|
28
|
+
emit(event: AssetEvent): void;
|
|
29
|
+
all(): readonly AssetEvent[];
|
|
30
|
+
ofType(type: AssetEventType): readonly AssetEvent[];
|
|
31
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Dominio EVENTI ASSET: collega l'AssetStore alla memoria delle stanze
|
|
2
|
+
// (RoomMemory, metodo Danilov) generando eventi di memoria per ogni file,
|
|
3
|
+
// immagine, documento o allegato. Ogni operazione produce un evento del
|
|
4
|
+
// dominio "assets.*":
|
|
5
|
+
//
|
|
6
|
+
// asset.uploaded — un asset e' stato caricato (create)
|
|
7
|
+
// asset.linked — un asset e' stato collegato a un task/entita'
|
|
8
|
+
// asset.analyzed — un asset e' stato analizzato (estrazione/OCR/sintesi)
|
|
9
|
+
// asset.versioned — una nuova versione di un asset e' stata registrata
|
|
10
|
+
//
|
|
11
|
+
// Ogni evento viene INDICIZZATO come stanza (RoomRecord livello 0) cosi' da
|
|
12
|
+
// essere richiamabile via il tool `recall` (ricerca per termini o per id).
|
|
13
|
+
// Filosofia del progetto: zero dipendenze a runtime, immutabilita', il sink e'
|
|
14
|
+
// una primitiva iniettabile (non una feature hardcoded nello store).
|
|
15
|
+
import { RoomMemory } from "../vascend/room-memory.js";
|
|
16
|
+
// Etichetta umana breve del tipo evento (per titolo/azione Danilov).
|
|
17
|
+
function actionLabel(type) {
|
|
18
|
+
switch (type) {
|
|
19
|
+
case "asset.uploaded": return "caricato";
|
|
20
|
+
case "asset.linked": return "collegato";
|
|
21
|
+
case "asset.analyzed": return "analizzato";
|
|
22
|
+
case "asset.versioned": return "versionato";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Tokenizza un valore in termini utili all'indice (>=2 char, no rumore base).
|
|
26
|
+
// Indicizza sia il token "intero" (es. "bilancio-2024.csv") sia le sue
|
|
27
|
+
// sotto-parole separate da -, ., _, / (es. "bilancio", "2024", "csv") cosi'
|
|
28
|
+
// l'asset e' richiamabile via recall anche cercando una sola parola del nome.
|
|
29
|
+
function terms(...values) {
|
|
30
|
+
const out = new Set();
|
|
31
|
+
const add = (raw) => {
|
|
32
|
+
const t = raw.replace(/^[^a-z0-9]+|[^a-z0-9]+$/g, "");
|
|
33
|
+
if (t.length >= 2)
|
|
34
|
+
out.add(t);
|
|
35
|
+
};
|
|
36
|
+
for (const v of values) {
|
|
37
|
+
if (!v)
|
|
38
|
+
continue;
|
|
39
|
+
for (const whole of v.toLowerCase().match(/[a-z0-9_./-]{2,}/g) ?? []) {
|
|
40
|
+
add(whole);
|
|
41
|
+
for (const part of whole.split(/[-._/]+/))
|
|
42
|
+
add(part);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return [...out].filter((t) => t.length >= 2);
|
|
46
|
+
}
|
|
47
|
+
function escapeValue(value) {
|
|
48
|
+
return value.replace(/\s+/g, " ").trim().replace(/"/g, "'");
|
|
49
|
+
}
|
|
50
|
+
// Costruisce il RoomRecord Danilov di un evento asset (stanza livello 0).
|
|
51
|
+
// `room` e' l'id assegnato dallo store (namespaced, es. "asset-R1"). Il body
|
|
52
|
+
// e' un blocco INDICE/DEFINIZIONI/RELAZIONI/OUTPUT, coerente col resto della
|
|
53
|
+
// memoria, cosi' la ricerca BM25 di RoomMemory lo trova per termini.
|
|
54
|
+
export function formatAssetEventRecord(room, event) {
|
|
55
|
+
const { type, asset } = event;
|
|
56
|
+
const action = actionLabel(type);
|
|
57
|
+
const title = `${type}: ${asset.name} (${asset.kind})`;
|
|
58
|
+
const indexTerms = [
|
|
59
|
+
...terms(asset.name, asset.kind, asset.mime, type.replace("asset.", "")),
|
|
60
|
+
...terms(asset.visionId, event.taskId, event.relation, event.version),
|
|
61
|
+
...terms(asset.description, event.analysis, event.note),
|
|
62
|
+
"asset",
|
|
63
|
+
action,
|
|
64
|
+
];
|
|
65
|
+
const uniqTerms = [...new Set(indexTerms)].filter(Boolean).slice(0, 24);
|
|
66
|
+
const def = [
|
|
67
|
+
`@evento[${room}]: type=${type}, action=${action}, at=${event.at}`,
|
|
68
|
+
`@asset[${asset.id}]: name="${escapeValue(asset.name)}", kind=${asset.kind}, mime=${asset.mime}, size=${asset.size}`,
|
|
69
|
+
`@vision[${asset.visionId}]: proprietario_logico`,
|
|
70
|
+
];
|
|
71
|
+
if (event.taskId) {
|
|
72
|
+
def.push(`@task[${event.taskId}]: relazione=${event.relation ?? "appartiene"}`);
|
|
73
|
+
}
|
|
74
|
+
if (event.analysis) {
|
|
75
|
+
def.push(`@analisi[${room}]: "${escapeValue(event.analysis).slice(0, 600)}"`);
|
|
76
|
+
}
|
|
77
|
+
if (event.version) {
|
|
78
|
+
def.push(`@versione[${room}]: ${escapeValue(event.version)}`);
|
|
79
|
+
}
|
|
80
|
+
if (asset.description) {
|
|
81
|
+
def.push(`@descrizione[${asset.id}]: "${escapeValue(asset.description).slice(0, 400)}"`);
|
|
82
|
+
}
|
|
83
|
+
if (event.note) {
|
|
84
|
+
def.push(`@nota[${room}]: "${escapeValue(event.note).slice(0, 400)}"`);
|
|
85
|
+
}
|
|
86
|
+
const target = event.taskId ? `task:${event.taskId}` : `vision:${asset.visionId}`;
|
|
87
|
+
const rel = `@R: ${room} -> ${type} -> asset:${asset.id} -> ${target} [ ${action} ]`;
|
|
88
|
+
const body = `INDICE
|
|
89
|
+
${uniqTerms.map((t, i) => `${i + 1} = ${t}`).join("\n")}
|
|
90
|
+
|
|
91
|
+
DEFINIZIONI
|
|
92
|
+
${def.join("\n")}
|
|
93
|
+
|
|
94
|
+
RELAZIONI
|
|
95
|
+
${rel}
|
|
96
|
+
|
|
97
|
+
OUTPUT: asset ${asset.id} "${escapeValue(asset.name)}" ${action}${event.taskId ? ` e collegato a ${event.taskId}` : ""}; richiamabile via recall.`;
|
|
98
|
+
return {
|
|
99
|
+
room,
|
|
100
|
+
level: 0,
|
|
101
|
+
title: escapeValue(title).slice(0, 160),
|
|
102
|
+
terms: uniqTerms,
|
|
103
|
+
body,
|
|
104
|
+
children: [],
|
|
105
|
+
parent: null,
|
|
106
|
+
createdAt: event.at,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Sink concreto su RoomMemory: indicizza ogni evento come stanza richiamabile
|
|
110
|
+
// via recall. Usa il namespace "asset" per gli id (asset-R1, asset-R2, ...)
|
|
111
|
+
// cosi' gli eventi asset non collidono con le stanze conversazionali e sono
|
|
112
|
+
// filtrabili. Non lancia mai: in caso d'errore inghiotte (best-effort).
|
|
113
|
+
export class RoomMemoryAssetSink {
|
|
114
|
+
sessionDir;
|
|
115
|
+
storeId;
|
|
116
|
+
namespace;
|
|
117
|
+
constructor(sessionDir, storeId, namespace) {
|
|
118
|
+
this.sessionDir = sessionDir;
|
|
119
|
+
this.storeId = storeId;
|
|
120
|
+
this.namespace = namespace;
|
|
121
|
+
}
|
|
122
|
+
// `storeId` e' l'id dello store stanze (sessionId o id regno in Kingdoms).
|
|
123
|
+
static open(sessionDir, storeId, namespace = "asset") {
|
|
124
|
+
return new RoomMemoryAssetSink(sessionDir, storeId, namespace);
|
|
125
|
+
}
|
|
126
|
+
emit(event) {
|
|
127
|
+
try {
|
|
128
|
+
const mem = RoomMemory.open(this.sessionDir, this.storeId);
|
|
129
|
+
const room = mem.nextRoomId(this.namespace);
|
|
130
|
+
mem.append(formatAssetEventRecord(room, event));
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// L'indicizzazione e' best-effort: non deve rompere l'operazione asset.
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Sink in-memory per i test/uso programmatico: tiene gli eventi e li espone.
|
|
138
|
+
export class InMemoryAssetSink {
|
|
139
|
+
events = [];
|
|
140
|
+
emit(event) {
|
|
141
|
+
this.events.push(event);
|
|
142
|
+
}
|
|
143
|
+
all() {
|
|
144
|
+
return this.events;
|
|
145
|
+
}
|
|
146
|
+
ofType(type) {
|
|
147
|
+
return this.events.filter((e) => e.type === type);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type Asset, type AssetKind } from "./types.js";
|
|
2
|
+
import type { AssetEventSink } from "./asset-events.js";
|
|
3
|
+
export interface CreateAssetInput {
|
|
4
|
+
readonly kind: AssetKind;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly mime?: string;
|
|
7
|
+
readonly data?: Buffer;
|
|
8
|
+
readonly snippet?: string;
|
|
9
|
+
readonly description?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class AssetStore {
|
|
12
|
+
private readonly file;
|
|
13
|
+
private readonly blobDir;
|
|
14
|
+
private readonly sink?;
|
|
15
|
+
private readonly byId;
|
|
16
|
+
private readonly versions;
|
|
17
|
+
private constructor();
|
|
18
|
+
static open(dataDir: string, sink?: AssetEventSink): AssetStore;
|
|
19
|
+
create(visionId: string, userId: string, input: CreateAssetInput, taskId?: string): Asset;
|
|
20
|
+
linkToTask(id: string, userId: string, taskId: string, relation?: string): Asset;
|
|
21
|
+
recordAnalysis(id: string, userId: string, analysis: string, taskId?: string): Asset;
|
|
22
|
+
addVersion(id: string, userId: string, version: string, note?: string): Asset;
|
|
23
|
+
versionsOf(id: string, userId: string): readonly string[];
|
|
24
|
+
listFor(visionId: string, userId: string): Asset[];
|
|
25
|
+
require(id: string, userId: string): Asset;
|
|
26
|
+
readBlob(id: string, userId: string): Buffer;
|
|
27
|
+
delete(id: string, userId: string): void;
|
|
28
|
+
private blobPath;
|
|
29
|
+
private persist;
|
|
30
|
+
private emit;
|
|
31
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Store degli asset di esempio associati a una Vision: i METADATI vivono su un
|
|
2
|
+
// file JSONL append-only (assets.jsonl), mentre il CONTENUTO binario degli
|
|
3
|
+
// asset image/file vive in blob separati su filesystem (assets/blobs/<id>).
|
|
4
|
+
// Gli asset di tipo "snippet" hanno il contenuto inline nei metadati e nessun
|
|
5
|
+
// blob. Stesso stile di ConversationStore. Zero dipendenze a runtime.
|
|
6
|
+
import { appendFileSync, mkdirSync, readFileSync, writeFileSync, existsSync, rmSync, } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { newId } from "./crypto.js";
|
|
9
|
+
import { HttpError } from "./types.js";
|
|
10
|
+
function isDelete(e) {
|
|
11
|
+
return e.op === "delete";
|
|
12
|
+
}
|
|
13
|
+
// Limite di dimensione per un singolo blob (10 MB): sono asset DI ESEMPIO.
|
|
14
|
+
const MAX_BLOB_BYTES = 10 * 1024 * 1024;
|
|
15
|
+
// Limite per il contenuto inline di uno snippet (256 KB).
|
|
16
|
+
const MAX_SNIPPET_BYTES = 256 * 1024;
|
|
17
|
+
export class AssetStore {
|
|
18
|
+
file;
|
|
19
|
+
blobDir;
|
|
20
|
+
sink;
|
|
21
|
+
byId = new Map();
|
|
22
|
+
// Versioni registrate per asset (asset.versioned): id -> elenco versioni.
|
|
23
|
+
versions = new Map();
|
|
24
|
+
constructor(file, blobDir,
|
|
25
|
+
// Sink opzionale degli eventi di memoria (asset.*). Iniettabile: lo store
|
|
26
|
+
// resta una primitiva e non dipende da RoomMemory. Se assente, nessun
|
|
27
|
+
// evento viene emesso (retro-compatibile).
|
|
28
|
+
sink) {
|
|
29
|
+
this.file = file;
|
|
30
|
+
this.blobDir = blobDir;
|
|
31
|
+
this.sink = sink;
|
|
32
|
+
}
|
|
33
|
+
// `sink` opzionale: se passato, ogni operazione emette un evento di memoria
|
|
34
|
+
// (asset.uploaded/linked/analyzed/versioned) indicizzato e richiamabile via
|
|
35
|
+
// recall. Tipicamente RoomMemoryAssetSink.open(sessionDir, sessionId).
|
|
36
|
+
static open(dataDir, sink) {
|
|
37
|
+
const assetsDir = join(dataDir, "assets");
|
|
38
|
+
const blobDir = join(assetsDir, "blobs");
|
|
39
|
+
mkdirSync(blobDir, { recursive: true });
|
|
40
|
+
const store = new AssetStore(join(assetsDir, "assets.jsonl"), blobDir, sink);
|
|
41
|
+
if (existsSync(store.file)) {
|
|
42
|
+
const raw = readFileSync(store.file, "utf8");
|
|
43
|
+
for (const line of raw.split("\n")) {
|
|
44
|
+
if (!line.trim())
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
const e = JSON.parse(line);
|
|
48
|
+
if (isDelete(e))
|
|
49
|
+
store.byId.delete(e.id);
|
|
50
|
+
else
|
|
51
|
+
store.byId.set(e.id, stripOp(e));
|
|
52
|
+
}
|
|
53
|
+
catch { /* riga corrotta: ignora */ }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return store;
|
|
57
|
+
}
|
|
58
|
+
// Crea un asset per una Vision. Per image/file salva il blob su disco; per
|
|
59
|
+
// snippet salva il contenuto inline. Ritorna i metadati persistiti. Emette
|
|
60
|
+
// l'evento di memoria asset.uploaded (e, se `taskId`, lo collega al task).
|
|
61
|
+
create(visionId, userId, input, taskId) {
|
|
62
|
+
const name = input.name.trim();
|
|
63
|
+
if (!name)
|
|
64
|
+
throw new HttpError(400, "nome asset mancante", "invalid_field");
|
|
65
|
+
if (!visionId.trim())
|
|
66
|
+
throw new HttpError(400, "visionId mancante", "invalid_field");
|
|
67
|
+
const id = newId("asset");
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
if (input.kind === "snippet") {
|
|
70
|
+
const snippet = input.snippet ?? "";
|
|
71
|
+
if (Buffer.byteLength(snippet, "utf8") > MAX_SNIPPET_BYTES) {
|
|
72
|
+
throw new HttpError(413, "snippet troppo grande", "payload_too_large");
|
|
73
|
+
}
|
|
74
|
+
const asset = {
|
|
75
|
+
id,
|
|
76
|
+
visionId,
|
|
77
|
+
userId,
|
|
78
|
+
kind: "snippet",
|
|
79
|
+
name: name.slice(0, 200),
|
|
80
|
+
mime: input.mime ?? "text/plain",
|
|
81
|
+
size: Buffer.byteLength(snippet, "utf8"),
|
|
82
|
+
snippet,
|
|
83
|
+
...(input.description ? { description: input.description.slice(0, 1000) } : {}),
|
|
84
|
+
createdAt: now,
|
|
85
|
+
};
|
|
86
|
+
this.persist(asset);
|
|
87
|
+
this.emit("asset.uploaded", asset, now, taskId ? { taskId, relation: "appartiene" } : {});
|
|
88
|
+
return asset;
|
|
89
|
+
}
|
|
90
|
+
const data = input.data ?? Buffer.alloc(0);
|
|
91
|
+
if (data.length > MAX_BLOB_BYTES) {
|
|
92
|
+
throw new HttpError(413, "asset troppo grande", "payload_too_large");
|
|
93
|
+
}
|
|
94
|
+
writeFileSync(this.blobPath(id), data);
|
|
95
|
+
const asset = {
|
|
96
|
+
id,
|
|
97
|
+
visionId,
|
|
98
|
+
userId,
|
|
99
|
+
kind: input.kind,
|
|
100
|
+
name: name.slice(0, 200),
|
|
101
|
+
mime: input.mime ?? "application/octet-stream",
|
|
102
|
+
size: data.length,
|
|
103
|
+
...(input.description ? { description: input.description.slice(0, 1000) } : {}),
|
|
104
|
+
createdAt: now,
|
|
105
|
+
};
|
|
106
|
+
this.persist(asset);
|
|
107
|
+
this.emit("asset.uploaded", asset, now, taskId ? { taskId, relation: "appartiene" } : {});
|
|
108
|
+
return asset;
|
|
109
|
+
}
|
|
110
|
+
// Collega un asset a un task (o entita'). Emette asset.linked: l'asset
|
|
111
|
+
// diventa richiamabile via recall in relazione al task di appartenenza.
|
|
112
|
+
linkToTask(id, userId, taskId, relation = "allegato") {
|
|
113
|
+
const asset = this.require(id, userId);
|
|
114
|
+
if (!taskId.trim())
|
|
115
|
+
throw new HttpError(400, "taskId mancante", "invalid_field");
|
|
116
|
+
this.emit("asset.linked", asset, Date.now(), { taskId, relation });
|
|
117
|
+
return asset;
|
|
118
|
+
}
|
|
119
|
+
// Registra l'esito di un'analisi su un asset (OCR, estrazione, sintesi, ...).
|
|
120
|
+
// Emette asset.analyzed con il testo dell'analisi indicizzato per recall.
|
|
121
|
+
recordAnalysis(id, userId, analysis, taskId) {
|
|
122
|
+
const asset = this.require(id, userId);
|
|
123
|
+
const text = analysis.trim();
|
|
124
|
+
if (!text)
|
|
125
|
+
throw new HttpError(400, "analisi vuota", "invalid_field");
|
|
126
|
+
this.emit("asset.analyzed", asset, Date.now(), {
|
|
127
|
+
analysis: text,
|
|
128
|
+
...(taskId ? { taskId } : {}),
|
|
129
|
+
});
|
|
130
|
+
return asset;
|
|
131
|
+
}
|
|
132
|
+
// Registra una nuova versione di un asset (es. "v2", o un hash). Tiene la
|
|
133
|
+
// cronologia versioni in memoria ed emette asset.versioned.
|
|
134
|
+
addVersion(id, userId, version, note) {
|
|
135
|
+
const asset = this.require(id, userId);
|
|
136
|
+
const v = version.trim();
|
|
137
|
+
if (!v)
|
|
138
|
+
throw new HttpError(400, "versione mancante", "invalid_field");
|
|
139
|
+
const list = this.versions.get(id) ?? [];
|
|
140
|
+
this.versions.set(id, [...list, v]);
|
|
141
|
+
this.emit("asset.versioned", asset, Date.now(), { version: v, ...(note ? { note } : {}) });
|
|
142
|
+
return asset;
|
|
143
|
+
}
|
|
144
|
+
// Versioni registrate per un asset (in ordine di registrazione).
|
|
145
|
+
versionsOf(id, userId) {
|
|
146
|
+
this.require(id, userId);
|
|
147
|
+
return this.versions.get(id) ?? [];
|
|
148
|
+
}
|
|
149
|
+
// Asset di una Vision (verificando la proprieta'), dal piu' recente.
|
|
150
|
+
listFor(visionId, userId) {
|
|
151
|
+
return [...this.byId.values()]
|
|
152
|
+
.filter((a) => a.visionId === visionId && a.userId === userId)
|
|
153
|
+
// Dal piu' recente; a parita' di timestamp ordine deterministico per id.
|
|
154
|
+
.sort((a, b) => b.createdAt - a.createdAt || (a.id < b.id ? 1 : a.id > b.id ? -1 : 0));
|
|
155
|
+
}
|
|
156
|
+
// Recupera i metadati assicurando che l'asset appartenga all'utente.
|
|
157
|
+
require(id, userId) {
|
|
158
|
+
const asset = this.byId.get(id);
|
|
159
|
+
if (!asset)
|
|
160
|
+
throw new HttpError(404, "asset non trovato", "not_found");
|
|
161
|
+
if (asset.userId !== userId)
|
|
162
|
+
throw new HttpError(403, "accesso negato", "forbidden");
|
|
163
|
+
return asset;
|
|
164
|
+
}
|
|
165
|
+
// Legge il blob binario di un asset image/file. Errore per gli snippet.
|
|
166
|
+
readBlob(id, userId) {
|
|
167
|
+
const asset = this.require(id, userId);
|
|
168
|
+
if (asset.kind === "snippet") {
|
|
169
|
+
throw new HttpError(400, "lo snippet non ha un blob: usa i metadati", "no_blob");
|
|
170
|
+
}
|
|
171
|
+
const path = this.blobPath(id);
|
|
172
|
+
if (!existsSync(path))
|
|
173
|
+
throw new HttpError(404, "blob non trovato", "not_found");
|
|
174
|
+
return readFileSync(path);
|
|
175
|
+
}
|
|
176
|
+
delete(id, userId) {
|
|
177
|
+
const asset = this.require(id, userId);
|
|
178
|
+
this.byId.delete(id);
|
|
179
|
+
if (asset.kind !== "snippet") {
|
|
180
|
+
const path = this.blobPath(id);
|
|
181
|
+
if (existsSync(path))
|
|
182
|
+
rmSync(path, { force: true });
|
|
183
|
+
}
|
|
184
|
+
appendFileSync(this.file, JSON.stringify({ op: "delete", id }) + "\n", "utf8");
|
|
185
|
+
}
|
|
186
|
+
blobPath(id) {
|
|
187
|
+
return join(this.blobDir, id);
|
|
188
|
+
}
|
|
189
|
+
persist(asset) {
|
|
190
|
+
this.byId.set(asset.id, asset);
|
|
191
|
+
appendFileSync(this.file, JSON.stringify({ ...asset, op: "upsert" }) + "\n", "utf8");
|
|
192
|
+
}
|
|
193
|
+
// Emette un evento di memoria sul sink, se presente. NON bloccante e non
|
|
194
|
+
// lancia: l'indicizzazione e' best-effort e non deve rompere l'operazione.
|
|
195
|
+
emit(type, asset, at, extra) {
|
|
196
|
+
if (!this.sink)
|
|
197
|
+
return;
|
|
198
|
+
try {
|
|
199
|
+
this.sink.emit({ type, asset, at, ...extra });
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// best-effort: ignora gli errori del sink
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function stripOp(e) {
|
|
207
|
+
const { op, ...asset } = e;
|
|
208
|
+
void op;
|
|
209
|
+
return asset;
|
|
210
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import type { UserStore } from "./users.js";
|
|
3
|
+
import { type AuthResult, type AuthTokenPayload, type User } from "./types.js";
|
|
4
|
+
import type { BackendConfig } from "./config.js";
|
|
5
|
+
export declare class AuthService {
|
|
6
|
+
private readonly users;
|
|
7
|
+
private readonly config;
|
|
8
|
+
constructor(users: UserStore, config: BackendConfig);
|
|
9
|
+
register(email: string, password: string, displayName?: string): AuthResult;
|
|
10
|
+
login(email: string, password: string): AuthResult;
|
|
11
|
+
private issue;
|
|
12
|
+
resolve(token: string | undefined | null): {
|
|
13
|
+
payload: AuthTokenPayload;
|
|
14
|
+
user: User;
|
|
15
|
+
} | null;
|
|
16
|
+
static extractToken(req: IncomingMessage): string | null;
|
|
17
|
+
requireUser(req: IncomingMessage): User;
|
|
18
|
+
}
|