talos-code 0.0.1 → 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/LICENSE +661 -0
- package/README.md +111 -3
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/archive/zip.js +73 -0
- package/dist/args.js +97 -0
- package/dist/automations/history-store.js +34 -0
- package/dist/automations/policy-store.js +43 -0
- package/dist/automations/runner.js +107 -0
- package/dist/automations/schedule.js +85 -0
- package/dist/automations/windows-task.js +53 -0
- package/dist/commands/advanced-cli.js +233 -0
- package/dist/commands/checkpoint-cli.js +45 -0
- package/dist/commands/config-cli.js +107 -0
- package/dist/commands/context.js +17 -0
- package/dist/commands/extensions-cli.js +207 -0
- package/dist/commands/project-cli.js +74 -0
- package/dist/commands/project-commands.js +143 -0
- package/dist/commands/provider-cli.js +185 -0
- package/dist/commands/services-cli.js +248 -0
- package/dist/commands/session-cli.js +171 -0
- package/dist/commands/system-cli.js +405 -0
- package/dist/config/commands.js +60 -0
- package/dist/config/load.js +382 -0
- package/dist/config/migrations.js +48 -0
- package/dist/config/types.js +11 -0
- package/dist/diagnostics/development-log.js +154 -0
- package/dist/diagnostics/doctor.js +104 -0
- package/dist/diagnostics/redact.js +80 -0
- package/dist/diagnostics/zip.js +52 -0
- package/dist/errors.js +156 -0
- package/dist/events/bridge.js +130 -0
- package/dist/extensions/installer.js +178 -0
- package/dist/extensions/package-schema.js +24 -0
- package/dist/headless/result.js +84 -0
- package/dist/headless/run.js +230 -0
- package/dist/i18n/en/approval.js +43 -0
- package/dist/i18n/en/common.js +9 -0
- package/dist/i18n/en/credentials.js +82 -0
- package/dist/i18n/en/errors.js +246 -0
- package/dist/i18n/en/firstrun.js +89 -0
- package/dist/i18n/en/providers.js +37 -0
- package/dist/i18n/en/screen.js +736 -0
- package/dist/i18n/en/tools.js +127 -0
- package/dist/i18n/en.js +14 -0
- package/dist/i18n/error-view.js +307 -0
- package/dist/i18n/index.js +19 -0
- package/dist/i18n/kernel-map.js +139 -0
- package/dist/io.js +45 -0
- package/dist/main.js +330 -0
- package/dist/paths.js +41 -0
- package/dist/protocol/v2/codec.js +9 -0
- package/dist/protocol/v2/events.js +555 -0
- package/dist/protocol/v2/index.js +4 -0
- package/dist/protocol/v2/replay.js +28 -0
- package/dist/protocol/v2/types.js +1 -0
- package/dist/provider/control-plane.js +135 -0
- package/dist/provider/environment-keys.js +275 -0
- package/dist/provider/health.js +110 -0
- package/dist/provider/missing-key.js +48 -0
- package/dist/provider/model-catalog.js +168 -0
- package/dist/provider/provider-text.js +13 -0
- package/dist/provider/store.js +95 -0
- package/dist/provider/system-keyring.js +214 -0
- package/dist/runtime/active-run.js +63 -0
- package/dist/runtime/agent-tree.js +74 -0
- package/dist/runtime/attachments.js +84 -0
- package/dist/runtime/brokered-executor.js +395 -0
- package/dist/runtime/context-status.js +76 -0
- package/dist/runtime/create-runtime.js +111 -0
- package/dist/runtime/model-profile.js +361 -0
- package/dist/runtime/output-store.js +137 -0
- package/dist/runtime/provider-attempts.js +185 -0
- package/dist/runtime/replay-buffer.js +153 -0
- package/dist/runtime/repo.js +95 -0
- package/dist/runtime/session-facade.js +135 -0
- package/dist/runtime/session-summary.js +125 -0
- package/dist/runtime/supervisor.js +262 -0
- package/dist/runtime/talos-composition.js +1006 -0
- package/dist/runtime/types.js +5 -0
- package/dist/runtime/usage-snapshot.js +82 -0
- package/dist/security/auto-classifier.js +38 -0
- package/dist/security/credential-free-environment.js +54 -0
- package/dist/security/evaluate.js +243 -0
- package/dist/security/execution-backends.js +236 -0
- package/dist/security/execution-broker.js +102 -0
- package/dist/security/forge-scan.js +74 -0
- package/dist/security/from-approval.js +39 -0
- package/dist/security/mxc-execution-backend.js +281 -0
- package/dist/security/permission-engine.js +138 -0
- package/dist/security/permission-explanation.js +54 -0
- package/dist/security/persist.js +179 -0
- package/dist/security/plugin-guard.js +230 -0
- package/dist/security/process-tree-evidence-store.js +74 -0
- package/dist/security/process-tree-probe.js +554 -0
- package/dist/security/project-resource-inventory.js +186 -0
- package/dist/security/project-trust-gate.js +38 -0
- package/dist/security/project-trust.js +367 -0
- package/dist/security/rule-parser.js +201 -0
- package/dist/security/shell-segmentation.js +68 -0
- package/dist/security/trust-authority.js +324 -0
- package/dist/security/types.js +1 -0
- package/dist/security/workspace-identity.js +102 -0
- package/dist/services/automation-facade.js +59 -0
- package/dist/services/forge-facade.js +77 -0
- package/dist/services/hook-facade.js +240 -0
- package/dist/services/index.js +16 -0
- package/dist/services/library-facade.js +174 -0
- package/dist/services/mcp-facade.js +348 -0
- package/dist/services/memory-facade.js +126 -0
- package/dist/services/notes-facade.js +157 -0
- package/dist/services/plugin-facade.js +308 -0
- package/dist/services/research-facade.js +110 -0
- package/dist/services/task-board-facade.js +236 -0
- package/dist/services/workflow-catalog.js +246 -0
- package/dist/sessions/export-format.js +98 -0
- package/dist/sessions/metadata-store.js +160 -0
- package/dist/sessions/share.js +122 -0
- package/dist/sessions/transfer.js +16 -0
- package/dist/subcommands.js +62 -0
- package/dist/tui/agent-roster.js +36 -0
- package/dist/tui/app.js +3761 -0
- package/dist/tui/approval.js +36 -0
- package/dist/tui/boot/boot-sequence.js +76 -0
- package/dist/tui/boot/cinematic.js +243 -0
- package/dist/tui/boot/desktop-logo.js +82 -0
- package/dist/tui/boot.js +3 -0
- package/dist/tui/busy-input.js +58 -0
- package/dist/tui/catalog-service.js +559 -0
- package/dist/tui/components/assistant-stream.js +1 -0
- package/dist/tui/components/command-menu.js +68 -0
- package/dist/tui/components/composer.js +219 -0
- package/dist/tui/components/diff.js +35 -0
- package/dist/tui/components/footer.js +48 -0
- package/dist/tui/components/header.js +6 -0
- package/dist/tui/components/markdown.js +305 -0
- package/dist/tui/components/status-indicator.js +32 -0
- package/dist/tui/components/terminal-shell.js +205 -0
- package/dist/tui/components/thinking-row.js +19 -0
- package/dist/tui/components/tool-row.js +97 -0
- package/dist/tui/components/transcript-virtualizer.js +165 -0
- package/dist/tui/components/transcript.js +43 -0
- package/dist/tui/diff-model.js +77 -0
- package/dist/tui/editor-history.js +21 -0
- package/dist/tui/editor.js +210 -0
- package/dist/tui/event-adapter.js +436 -0
- package/dist/tui/exit-output.js +58 -0
- package/dist/tui/external-editor.js +53 -0
- package/dist/tui/file-completion.js +89 -0
- package/dist/tui/focus-manager.js +5 -0
- package/dist/tui/highlight.js +30 -0
- package/dist/tui/input-router.js +18 -0
- package/dist/tui/interrupt.js +99 -0
- package/dist/tui/keybindings.js +194 -0
- package/dist/tui/keymap-resolver.js +91 -0
- package/dist/tui/launch-state.js +139 -0
- package/dist/tui/line-diff.js +57 -0
- package/dist/tui/live-activity.js +45 -0
- package/dist/tui/metrics.js +123 -0
- package/dist/tui/onboarding.js +36 -0
- package/dist/tui/overlays/agent-tree.js +39 -0
- package/dist/tui/overlays/approval-dialog.js +640 -0
- package/dist/tui/overlays/automation-center.js +51 -0
- package/dist/tui/overlays/checkpoint-picker.js +47 -0
- package/dist/tui/overlays/context-inspector.js +36 -0
- package/dist/tui/overlays/effort-line.js +110 -0
- package/dist/tui/overlays/forge-center.js +46 -0
- package/dist/tui/overlays/help-dialog.js +16 -0
- package/dist/tui/overlays/history-picker.js +37 -0
- package/dist/tui/overlays/hook-center.js +70 -0
- package/dist/tui/overlays/library-center.js +55 -0
- package/dist/tui/overlays/mcp-center.js +60 -0
- package/dist/tui/overlays/memory-center.js +63 -0
- package/dist/tui/overlays/model-picker.js +72 -0
- package/dist/tui/overlays/notes-center.js +53 -0
- package/dist/tui/overlays/overlay-host.js +8 -0
- package/dist/tui/overlays/plugin-center.js +76 -0
- package/dist/tui/overlays/provider-picker.js +145 -0
- package/dist/tui/overlays/queue-editor.js +32 -0
- package/dist/tui/overlays/research-center.js +59 -0
- package/dist/tui/overlays/scroll-window.js +234 -0
- package/dist/tui/overlays/session-picker.js +115 -0
- package/dist/tui/overlays/tasks-center.js +83 -0
- package/dist/tui/overlays/theme-picker.js +21 -0
- package/dist/tui/overlays/transcript-search.js +58 -0
- package/dist/tui/overlays/trust-center.js +29 -0
- package/dist/tui/overlays/workflow-center.js +46 -0
- package/dist/tui/project-file-index.js +214 -0
- package/dist/tui/project-references.js +85 -0
- package/dist/tui/project-trust-prompt.js +287 -0
- package/dist/tui/prompt-history-store.js +116 -0
- package/dist/tui/queue-store.js +110 -0
- package/dist/tui/regions/budget.js +59 -0
- package/dist/tui/regions/views.js +96 -0
- package/dist/tui/render-coordinator.js +148 -0
- package/dist/tui/render-scheduler.js +4 -0
- package/dist/tui/run.js +69 -0
- package/dist/tui/selection-list.js +29 -0
- package/dist/tui/session-controller.js +778 -0
- package/dist/tui/session-export.js +54 -0
- package/dist/tui/shell-input.js +35 -0
- package/dist/tui/shell-layout.js +48 -0
- package/dist/tui/shell-model.js +98 -0
- package/dist/tui/slash-commands.js +80 -0
- package/dist/tui/state.js +151 -0
- package/dist/tui/status-bar.js +125 -0
- package/dist/tui/status-view.js +40 -0
- package/dist/tui/terminal-capabilities.js +9 -0
- package/dist/tui/terminal-session.js +11 -0
- package/dist/tui/text-width.js +66 -0
- package/dist/tui/theme-catalog.js +25 -0
- package/dist/tui/theme-store.js +23 -0
- package/dist/tui/theme.js +23 -0
- package/dist/tui/tool-display.js +135 -0
- package/dist/tui/tool-facts.js +1 -0
- package/dist/tui/tools/bash-renderer.js +32 -0
- package/dist/tui/tools/change.js +61 -0
- package/dist/tui/tools/edit-renderer.js +17 -0
- package/dist/tui/tools/generic-renderer.js +13 -0
- package/dist/tui/tools/list-renderer.js +14 -0
- package/dist/tui/tools/read-renderer.js +13 -0
- package/dist/tui/tools/registry.js +20 -0
- package/dist/tui/tools/row-format.js +187 -0
- package/dist/tui/tools/search-renderer.js +38 -0
- package/dist/tui/tools/shared.js +97 -0
- package/dist/tui/tools/write-renderer.js +15 -0
- package/dist/tui/transcript-model.js +441 -0
- package/dist/tui/ui-preferences.js +79 -0
- package/dist/tui/usage-view.js +77 -0
- package/dist/tui/vim-mode.js +99 -0
- package/dist/update/check.js +15 -0
- package/dist/update/npm.js +51 -0
- package/dist/update/run.js +129 -0
- package/dist/version.js +2 -0
- package/dist/workspace/checkpoint-store.js +210 -0
- package/dist/workspace/checkpoint.js +413 -0
- package/dist/workspace/restore.js +232 -0
- package/package.json +63 -5
- package/vendor/context-engine/package.json +11 -0
- package/vendor/context-engine/src/compaction-planner.mjs +57 -0
- package/vendor/context-engine/src/contracts.mjs +48 -0
- package/vendor/context-engine/src/engine.mjs +445 -0
- package/vendor/context-engine/src/node/context-export.mjs +164 -0
- package/vendor/context-engine/src/node/legacy-import.mjs +92 -0
- package/vendor/context-engine/src/node/migrations/001-context.sql +126 -0
- package/vendor/context-engine/src/node/sqlite-store.mjs +85 -0
- package/vendor/context-engine/src/node/sqlite-worker.mjs +559 -0
- package/vendor/context-engine/src/profiles.mjs +10 -0
- package/vendor/context-engine/src/retrieval.mjs +104 -0
- package/vendor/context-engine/src/summary.mjs +97 -0
- package/vendor/context-engine/src/usage.mjs +34 -0
- package/vendor/harness-ui/package.json +38 -0
- package/vendor/harness-ui/src/acp-agent.mjs +350 -0
- package/vendor/harness-ui/src/agent-service.mjs +2188 -0
- package/vendor/harness-ui/src/agui-events.mjs +452 -0
- package/vendor/harness-ui/src/ambiente-solo-server.mjs +121 -0
- package/vendor/harness-ui/src/artifact-store.mjs +39 -0
- package/vendor/harness-ui/src/assistenza.mjs +123 -0
- package/vendor/harness-ui/src/automation-scheduler.mjs +69 -0
- package/vendor/harness-ui/src/automation-store.mjs +145 -0
- package/vendor/harness-ui/src/browser-annota.mjs +639 -0
- package/vendor/harness-ui/src/browser-frame.mjs +211 -0
- package/vendor/harness-ui/src/browser-proxy-universale.mjs +519 -0
- package/vendor/harness-ui/src/browser-proxy.mjs +87 -0
- package/vendor/harness-ui/src/browser-sessione-viva.mjs +329 -0
- package/vendor/harness-ui/src/browser-stream.mjs +445 -0
- package/vendor/harness-ui/src/browser-vivo.mjs +694 -0
- package/vendor/harness-ui/src/chat-image-attachments.mjs +72 -0
- package/vendor/harness-ui/src/config.mjs +697 -0
- package/vendor/harness-ui/src/contesto-del-progetto.mjs +385 -0
- package/vendor/harness-ui/src/context-asset-adapter.mjs +72 -0
- package/vendor/harness-ui/src/context-desktop-service.mjs +253 -0
- package/vendor/harness-ui/src/context-embedding-runtime.mjs +252 -0
- package/vendor/harness-ui/src/context-inference-scheduler.mjs +81 -0
- package/vendor/harness-ui/src/context-native-compaction.mjs +75 -0
- package/vendor/harness-ui/src/context-provider-adapter.mjs +141 -0
- package/vendor/harness-ui/src/context-runtime.mjs +118 -0
- package/vendor/harness-ui/src/context-token-counters.mjs +184 -0
- package/vendor/harness-ui/src/context-tool-catalog.mjs +86 -0
- package/vendor/harness-ui/src/context-tool-output.mjs +72 -0
- package/vendor/harness-ui/src/costo-elenco.mjs +252 -0
- package/vendor/harness-ui/src/custom-task.mjs +171 -0
- package/vendor/harness-ui/src/doctor.mjs +142 -0
- package/vendor/harness-ui/src/document-filename.mjs +97 -0
- package/vendor/harness-ui/src/document-generator.mjs +493 -0
- package/vendor/harness-ui/src/document-report.mjs +331 -0
- package/vendor/harness-ui/src/duckduckgo-search.mjs +155 -0
- package/vendor/harness-ui/src/elenco-profondo.mjs +337 -0
- package/vendor/harness-ui/src/favicon-proxy.mjs +113 -0
- package/vendor/harness-ui/src/forge-contract.mjs +221 -0
- package/vendor/harness-ui/src/frequent-dirs.mjs +134 -0
- package/vendor/harness-ui/src/generated-image-store.mjs +147 -0
- package/vendor/harness-ui/src/generation-idle.mjs +332 -0
- package/vendor/harness-ui/src/gguf-header.mjs +207 -0
- package/vendor/harness-ui/src/git-service.mjs +626 -0
- package/vendor/harness-ui/src/gitignore-elenco.mjs +604 -0
- package/vendor/harness-ui/src/harness-receipt-keypair.mjs +207 -0
- package/vendor/harness-ui/src/hf-direct-transfer.mjs +170 -0
- package/vendor/harness-ui/src/hf-hub-client.mjs +106 -0
- package/vendor/harness-ui/src/hf-image-proxy.mjs +105 -0
- package/vendor/harness-ui/src/hf-model-transfer.mjs +245 -0
- package/vendor/harness-ui/src/hook-registry.mjs +186 -0
- package/vendor/harness-ui/src/http-app.mjs +6259 -0
- package/vendor/harness-ui/src/http-lifecycle.mjs +132 -0
- package/vendor/harness-ui/src/id-archivio.mjs +27 -0
- package/vendor/harness-ui/src/image-generator.mjs +143 -0
- package/vendor/harness-ui/src/istruzioni-di-progetto.mjs +234 -0
- package/vendor/harness-ui/src/kernel/dist/kernelPerIlBanco.js +518 -0
- package/vendor/harness-ui/src/kernel/talosHarness.mjs +10437 -0
- package/vendor/harness-ui/src/library-policy-store.mjs +175 -0
- package/vendor/harness-ui/src/library-store.mjs +652 -0
- package/vendor/harness-ui/src/llama-server-supervisor.mjs +629 -0
- package/vendor/harness-ui/src/local-model-store.mjs +339 -0
- package/vendor/harness-ui/src/local-runtime-contract.mjs +66 -0
- package/vendor/harness-ui/src/local-runtime-events.mjs +44 -0
- package/vendor/harness-ui/src/local-runtime-llama-server.mjs +244 -0
- package/vendor/harness-ui/src/local-runtime-probe.mjs +401 -0
- package/vendor/harness-ui/src/machine-capacity.mjs +66 -0
- package/vendor/harness-ui/src/mappa-cartelle.mjs +491 -0
- package/vendor/harness-ui/src/mcp-client.mjs +98 -0
- package/vendor/harness-ui/src/mcp-registry.mjs +157 -0
- package/vendor/harness-ui/src/mcp-session.mjs +177 -0
- package/vendor/harness-ui/src/memory-store.mjs +227 -0
- package/vendor/harness-ui/src/model-catalog-models-dev.mjs +276 -0
- package/vendor/harness-ui/src/model-catalog.mjs +129 -0
- package/vendor/harness-ui/src/model-destination.mjs +189 -0
- package/vendor/harness-ui/src/modifica-ancorata.mjs +177 -0
- package/vendor/harness-ui/src/native-provider-adapter.mjs +205 -0
- package/vendor/harness-ui/src/notes-store.mjs +250 -0
- package/vendor/harness-ui/src/openai-compatible-runtime.mjs +428 -0
- package/vendor/harness-ui/src/openrouter-oauth.mjs +339 -0
- package/vendor/harness-ui/src/path-policy.mjs +442 -0
- package/vendor/harness-ui/src/plugin-registry.mjs +780 -0
- package/vendor/harness-ui/src/plugin-session.mjs +180 -0
- package/vendor/harness-ui/src/process-policy.mjs +345 -0
- package/vendor/harness-ui/src/prompt-enhancer-provider.mjs +94 -0
- package/vendor/harness-ui/src/provider-auth-cloud.mjs +95 -0
- package/vendor/harness-ui/src/provider-credential-store.mjs +541 -0
- package/vendor/harness-ui/src/provider-probe.mjs +582 -0
- package/vendor/harness-ui/src/provider-registry.mjs +1633 -0
- package/vendor/harness-ui/src/pty-terminal.mjs +312 -0
- package/vendor/harness-ui/src/public-problem.mjs +109 -0
- package/vendor/harness-ui/src/research/card.mjs +235 -0
- package/vendor/harness-ui/src/research/citations.mjs +142 -0
- package/vendor/harness-ui/src/research/collector.mjs +275 -0
- package/vendor/harness-ui/src/research/deposito-a-pezzi.mjs +139 -0
- package/vendor/harness-ui/src/research/dossier.mjs +114 -0
- package/vendor/harness-ui/src/research/esportazioni.mjs +560 -0
- package/vendor/harness-ui/src/research/fetch-cache.mjs +465 -0
- package/vendor/harness-ui/src/research/fidelity.mjs +122 -0
- package/vendor/harness-ui/src/research/independence.mjs +159 -0
- package/vendor/harness-ui/src/research/ledger.mjs +166 -0
- package/vendor/harness-ui/src/research/markdown-server.mjs +565 -0
- package/vendor/harness-ui/src/research/narration.mjs +181 -0
- package/vendor/harness-ui/src/research/open-cards.mjs +131 -0
- package/vendor/harness-ui/src/research/opposing.mjs +305 -0
- package/vendor/harness-ui/src/research/outline.mjs +111 -0
- package/vendor/harness-ui/src/research/page-budget.mjs +209 -0
- package/vendor/harness-ui/src/research/pdf.mjs +291 -0
- package/vendor/harness-ui/src/research/plan.mjs +301 -0
- package/vendor/harness-ui/src/research/raccolta-viva.mjs +452 -0
- package/vendor/harness-ui/src/research/recheck-document.mjs +69 -0
- package/vendor/harness-ui/src/research/recheck-history.mjs +192 -0
- package/vendor/harness-ui/src/research/recheck.mjs +194 -0
- package/vendor/harness-ui/src/research/report.mjs +203 -0
- package/vendor/harness-ui/src/research/run.mjs +527 -0
- package/vendor/harness-ui/src/research/synthesis.mjs +318 -0
- package/vendor/harness-ui/src/research/verification.mjs +572 -0
- package/vendor/harness-ui/src/research-orchestrator.mjs +2679 -0
- package/vendor/harness-ui/src/research-store.mjs +1133 -0
- package/vendor/harness-ui/src/runtime-build-manifest.mjs +26 -0
- package/vendor/harness-ui/src/runtime-contract.mjs +59 -0
- package/vendor/harness-ui/src/runtime-owner-adapter.mjs +1348 -0
- package/vendor/harness-ui/src/runtime-owner-contract.mjs +32 -0
- package/vendor/harness-ui/src/scheda-di-lavoro.mjs +249 -0
- package/vendor/harness-ui/src/search-source-store.mjs +172 -0
- package/vendor/harness-ui/src/session-registry.mjs +6095 -0
- package/vendor/harness-ui/src/session-store.mjs +220 -0
- package/vendor/harness-ui/src/sessione-pronta.mjs +73 -0
- package/vendor/harness-ui/src/setup-stato.mjs +31 -0
- package/vendor/harness-ui/src/sezioni-istruzioni.mjs +204 -0
- package/vendor/harness-ui/src/skill-registry.mjs +120 -0
- package/vendor/harness-ui/src/sse-replay-coalescente.mjs +0 -0
- package/vendor/harness-ui/src/static-files.mjs +96 -0
- package/vendor/harness-ui/src/stream-partition.mjs +123 -0
- package/vendor/harness-ui/src/subagent-orchestrator.mjs +453 -0
- package/vendor/harness-ui/src/task-catalog.mjs +65 -0
- package/vendor/harness-ui/src/tasks-store.mjs +220 -0
- package/vendor/harness-ui/src/terminal-registry.mjs +312 -0
- package/vendor/harness-ui/src/terminal-ws.mjs +170 -0
- package/vendor/harness-ui/src/tool-forge-store.mjs +299 -0
- package/vendor/harness-ui/src/tool-schema-normalize.mjs +100 -0
- package/vendor/harness-ui/src/usage-cache.mjs +315 -0
- package/vendor/harness-ui/src/workspace-browser.mjs +213 -0
- package/vendor/harness-ui/src/workspace-context.mjs +124 -0
- package/vendor/harness-ui/src/workspace-disk.mjs +62 -0
- package/vendor/harness-ui/src/workspace-files.mjs +589 -0
- package/vendor/harness-ui/src/workspace-info.mjs +189 -0
- package/vendor/harness-ui/src/workspace-launch-store.mjs +150 -0
- package/vendor/harness-ui/src/workspace-tree.mjs +67 -0
- package/vendor/harness-ui/src/workspace-watcher.mjs +161 -0
- package/vendor/manifest.json +170 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* browser-frame.mjs — K-I (06/09). Dice se una pagina PUÒ essere mostrata dentro
|
|
3
|
+
* TALOS in una cornice (`<iframe>`), prima di provarci: il browser non espone al
|
|
4
|
+
* codice della pagina il motivo per cui una cornice resta vuota, quindi la
|
|
5
|
+
* risposta la dà il server leggendo le intestazioni della pagina.
|
|
6
|
+
*
|
|
7
|
+
* Fonti (lette il 06/09/2026): MDN «X-Frame-Options» — `DENY` e `SAMEORIGIN`
|
|
8
|
+
* vietano la cornice da un'altra origine, `ALLOW-FROM` è deprecato e i browser
|
|
9
|
+
* lo ignorano; MDN «CSP frame-ancestors» — se presente PREVALE su X-Frame-Options,
|
|
10
|
+
* e una lista che non contiene la nostra origine (né `*`) vieta la cornice.
|
|
11
|
+
* Una webview Electron eviterebbe il problema; qui il guscio è un
|
|
12
|
+
* browser, e la regola dei siti si rispetta, non si aggira.
|
|
13
|
+
*
|
|
14
|
+
* ⛔ Solo `http:`/`https:`, mai credenziali nell'URL, un tempo massimo, e il corpo
|
|
15
|
+
* della risposta si butta: servono le intestazioni, non la pagina.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const MILLISECONDI_MASSIMI = 6_000;
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* ⛔⛔⛔ 16/09/2026, P0 corsia B punto 4 — IL MOTIVO DEL GUASTO SI CLASSIFICA, non si schiaccia.
|
|
22
|
+
*
|
|
23
|
+
* Prima di oggi qui c'erano DUE frasi per tutti i guasti del mondo: «Nessuna risposta entro 6
|
|
24
|
+
* secondi» per l'abort e «La pagina non risponde» per qualunque altra cosa. Il danno non era la
|
|
25
|
+
* genericità: era che `components/browser.js` sceglie il RIMEDIO leggendo questo motivo
|
|
26
|
+
* (`rimedioPerIlMotivo`, quattro espressioni regolari) e nessuna delle due frasi ne incrociava
|
|
27
|
+
* una ⇒ per un indirizzo scritto male usciva «chiedi all'agente di leggerla», che è un consiglio
|
|
28
|
+
* falso: un nome che non esiste non lo risolve nemmeno l'agente.
|
|
29
|
+
*
|
|
30
|
+
* Ricerca 16/09/2026:
|
|
31
|
+
* · nodejs/undici #1603 e #2362 — con `fetch` di Node il guasto vero NON sta in `errore.message`
|
|
32
|
+
* ('fetch failed' per tutti) ma in `errore.cause.code`: ENOTFOUND/EAI_AGAIN (nome), ECONNREFUSED
|
|
33
|
+
* (porta chiusa), UND_ERR_CONNECT_TIMEOUT/ETIMEDOUT (scadenza), ECONNRESET (caduta);
|
|
34
|
+
* · MDN «AbortSignal» — `AbortError` (annullato da noi) e `TimeoutError` sono due fatti distinti;
|
|
35
|
+
* · AWS Architecture Blog «Exponential Backoff And Jitter» — si ritenta ciò che è TRANSITORIO.
|
|
36
|
+
*
|
|
37
|
+
* ⛔ Le frasi qui sotto sono scritte per INCROCIARE i rimedi del client: cambiarle senza guardare
|
|
38
|
+
* `rimedioPerIlMotivo` rimette il difetto. La prova le tiene ferme da tutt'e due i lati.
|
|
39
|
+
*/
|
|
40
|
+
const CODICI = [
|
|
41
|
+
[/^(ENOTFOUND|EAI_AGAIN|ERR_NAME_NOT_RESOLVED)$/i, 'dns', 'Questo indirizzo non esiste'],
|
|
42
|
+
[/^(ECONNREFUSED)$/i, 'rifiuto', 'Nessuno risponde a questo indirizzo'],
|
|
43
|
+
[/^(UND_ERR_CONNECT_TIMEOUT|UND_ERR_HEADERS_TIMEOUT|UND_ERR_BODY_TIMEOUT|ETIMEDOUT)$/i, 'timeout', null],
|
|
44
|
+
[/CERT|SELF_SIGNED|TLS|SSL|ERR_SSL/i, 'certificato', 'Il sito ha un certificato non valido'],
|
|
45
|
+
[/^(ECONNRESET|EPIPE|EHOSTUNREACH|ENETUNREACH|EPROTO|UND_ERR_SOCKET)$/i, 'rete', 'Non sono riuscito a raggiungere il sito'],
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* ⛔⛔⛔ 16/09/2026, GIRO DI RIPARAZIONE — LA FRASE NON È IL DATO: IL DATO È `genere` + `dettagli`.
|
|
50
|
+
*
|
|
51
|
+
* Bocciatura del controllore, con la prova in mano: le foto consegnate mostravano il pannello
|
|
52
|
+
* dello stato con il titolo in INGLESE («I could not open this page») sopra il motivo in ITALIANO
|
|
53
|
+
* («Il sito non ha risposto in tempo (6 secondi)»). Il commit dichiarava quel difetto riparato, e
|
|
54
|
+
* le foto lo smentivano.
|
|
55
|
+
*
|
|
56
|
+
* La causa NON era una riga dimenticata nel dizionario: era qui. Questa funzione componeva la
|
|
57
|
+
* frase interpolando un NUMERO, e il client la passava a `t()`, che è un dizionario a chiavi
|
|
58
|
+
* fisse. Una chiave che contiene «6» non ci sarà mai — e nemmeno quella con «11», e nemmeno
|
|
59
|
+
* nessun'altra: il difetto era strutturale e nessuna traduzione lo avrebbe chiuso.
|
|
60
|
+
*
|
|
61
|
+
* Ricerca 16/09/2026 — api-craft «Shall REST API error messages be internationalized?»:
|
|
62
|
+
* «locale-neutral errors with well-defined error values… allows the consumer to localize the
|
|
63
|
+
* message and reduces the pain of trying to match up strings between systems». ⇒ Il server manda
|
|
64
|
+
* ciò che SA (il genere del guasto e i suoi parametri); la frase per chi guarda la compone chi
|
|
65
|
+
* disegna, nella lingua di chi guarda.
|
|
66
|
+
*
|
|
67
|
+
* ⛔ `motivo` resta, e resta in italiano: è la DIAGNOSTICA (log, rotta, taccuino) e la rete di
|
|
68
|
+
* sicurezza per un client vecchio. Non è più ciò che finisce a schermo — quello lo decide
|
|
69
|
+
* `frasePerGenere` in `components/browser.js`, e una prova lo tiene fermo dai due lati.
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Dice CHE COSA è andato storto: un genere stabile, i suoi parametri, e una frase di diagnostica.
|
|
74
|
+
* @param {unknown} errore l'errore di `fetch` (il codice vero sta in `errore.cause.code`)
|
|
75
|
+
* @param {{millisecondi?:number}} [opzioni]
|
|
76
|
+
* @returns {{genere:'timeout'|'dns'|'rifiuto'|'certificato'|'rete', motivo:string, dettagli:object}}
|
|
77
|
+
*/
|
|
78
|
+
export function classificaGuasto(errore, { millisecondi = MILLISECONDI_MASSIMI } = {}) {
|
|
79
|
+
const secondi = Math.round(millisecondi / 1000);
|
|
80
|
+
const scaduto = { genere: 'timeout', motivo: `Il sito non ha risposto in tempo (${secondi} secondi)`, dettagli: { secondi } };
|
|
81
|
+
const nome = String(errore?.name || '');
|
|
82
|
+
if (nome === 'AbortError' || nome === 'TimeoutError') return scaduto;
|
|
83
|
+
const codice = String(errore?.cause?.code || errore?.code || '');
|
|
84
|
+
for (const [prova, genere, motivo] of CODICI) {
|
|
85
|
+
if (prova.test(codice)) return genere === 'timeout' ? scaduto : { genere, motivo, dettagli: {} };
|
|
86
|
+
}
|
|
87
|
+
return { genere: 'rete', motivo: 'Non sono riuscito a raggiungere il sito', dettagli: {} };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* ⛔⛔⛔ 16/09/2026, GIRO DI RIPARAZIONE — «C'È UN GENERE» NON VUOL DIRE «NON CI SONO ARRIVATO».
|
|
92
|
+
*
|
|
93
|
+
* Trovato rileggendo la cura, non da un rosso. Dando un `genere` anche ai RIFIUTI (che serviva per
|
|
94
|
+
* poterli dire in due lingue), le due righe del client che decidono lo stato diventavano sbagliate:
|
|
95
|
+
* dicevano `esito?.genere ? 'irraggiungibile' : …`, cioè leggevano la PRESENZA di un genere come
|
|
96
|
+
* «non ci sono arrivato». Un sito che risponde benissimo e dice soltanto «non mi far vedere dentro
|
|
97
|
+
* una cornice» sarebbe diventato «non sono riuscito ad aprire questa pagina», con «Riprova» acceso
|
|
98
|
+
* su una cosa che riprovare non cambia — invece di ripiegare sul testo dell'agente, che è la cosa
|
|
99
|
+
* giusta e non è un guasto.
|
|
100
|
+
*
|
|
101
|
+
* ⇒ La distinzione si NOMINA qui, una volta sola, accanto a chi assegna i generi. Chi aggiunge un
|
|
102
|
+
* genere nuovo deve passare da questo elenco, e la prova gliene chiede conto dai due lati.
|
|
103
|
+
*/
|
|
104
|
+
const GUASTI = new Set(['timeout', 'dns', 'rifiuto', 'certificato', 'rete', 'indirizzo']);
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Vero se il genere dice «non ci sono arrivato» (guasto), falso se dice «il sito ha risposto e ha
|
|
108
|
+
* detto di no» (rifiuto della cornice) o se non c'è nessun genere.
|
|
109
|
+
* @param {string|null|undefined} genere
|
|
110
|
+
*/
|
|
111
|
+
export function eUnGuasto(genere) { return GUASTI.has(String(genere || '')); }
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Un guasto TRANSITORIO si ritenta; un nome che non esiste o un certificato scaduto no — riprovare
|
|
115
|
+
* non li cambia, e un ritentativo inutile è tempo tolto a chi guarda lo schermo.
|
|
116
|
+
* @param {string|null} genere
|
|
117
|
+
*/
|
|
118
|
+
export function siRitenta(genere) {
|
|
119
|
+
return genere === 'timeout' || genere === 'rete' || genere === 'rifiuto';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @param {URL} url
|
|
124
|
+
* @returns {{ok:true}|{ok:false, motivo:string}}
|
|
125
|
+
*/
|
|
126
|
+
export function urlAmmesso(url) {
|
|
127
|
+
if (!(url instanceof URL)) return { ok: false, motivo: 'URL non valido' };
|
|
128
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') return { ok: false, motivo: 'Solo http e https' };
|
|
129
|
+
if (url.username || url.password) return { ok: false, motivo: 'Niente credenziali nell\'indirizzo' };
|
|
130
|
+
return { ok: true };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Valuta le intestazioni di una risposta per un'origine che vuole incorniciarla.
|
|
135
|
+
*
|
|
136
|
+
* ⛔ 16/09, giro di riparazione — anche un RIFIUTO porta il suo `genere`. Prima il genere esisteva
|
|
137
|
+
* solo per i guasti di rete, e il client, per un rifiuto, non aveva altro che la frase italiana
|
|
138
|
+
* del server: la mostrava così com'era anche a chi guarda in inglese. Un rifiuto è un esito
|
|
139
|
+
* nominabile quanto un timeout, e nominarlo è ciò che permette di dirlo in due lingue.
|
|
140
|
+
* @param {{get(nome:string):string|null}} headers
|
|
141
|
+
* @param {string} origineNostra es. `http://127.0.0.1:4174`
|
|
142
|
+
* @returns {{incorniciabile:boolean, motivo:string|null, genere:string|null}}
|
|
143
|
+
*/
|
|
144
|
+
export function valutaIntestazioni(headers, origineNostra) {
|
|
145
|
+
const csp = String(headers.get('content-security-policy') || '');
|
|
146
|
+
const direttiva = csp.split(';').map((d) => d.trim()).find((d) => /^frame-ancestors\b/i.test(d));
|
|
147
|
+
if (direttiva) {
|
|
148
|
+
const sorgenti = direttiva.replace(/^frame-ancestors\s*/i, '').split(/\s+/).filter(Boolean).map((s) => s.replace(/^'|'$/g, '').toLowerCase());
|
|
149
|
+
if (sorgenti.includes('*')) return { incorniciabile: true, motivo: null, genere: null };
|
|
150
|
+
const nostra = (() => { try { return new URL(origineNostra); } catch { return null; } })();
|
|
151
|
+
const ammessa = sorgenti.some((s) => {
|
|
152
|
+
if (s === 'none') return false;
|
|
153
|
+
if (s === 'self') return false; // «self» è l'origine della pagina, non la nostra
|
|
154
|
+
if (!nostra) return false;
|
|
155
|
+
if (s === nostra.origin.toLowerCase()) return true;
|
|
156
|
+
if (s === `${nostra.protocol}` || s === `${nostra.protocol}//*`) return true;
|
|
157
|
+
return s.startsWith('*.') && nostra.hostname.toLowerCase().endsWith(s.slice(1));
|
|
158
|
+
});
|
|
159
|
+
return ammessa
|
|
160
|
+
? { incorniciabile: true, motivo: null, genere: null }
|
|
161
|
+
: { incorniciabile: false, motivo: 'La pagina dichiara «frame-ancestors» e non include TALOS', genere: 'frame-ancestors' };
|
|
162
|
+
}
|
|
163
|
+
const xfo = String(headers.get('x-frame-options') || '').trim().toUpperCase();
|
|
164
|
+
if (xfo === 'DENY') return { incorniciabile: false, motivo: 'La pagina vieta ogni cornice (X-Frame-Options: DENY)', genere: 'xfo-deny' };
|
|
165
|
+
if (xfo === 'SAMEORIGIN') return { incorniciabile: false, motivo: 'La pagina si mostra solo dentro il suo stesso sito (X-Frame-Options: SAMEORIGIN)', genere: 'xfo-sameorigin' };
|
|
166
|
+
return { incorniciabile: true, motivo: null, genere: null };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* @param {string} indirizzo
|
|
171
|
+
* @param {{fetchFn?:typeof fetch, origineNostra:string, millisecondi?:number}} deps
|
|
172
|
+
* @returns {Promise<{url:string, incorniciabile:boolean, motivo:string|null, stato:number|null, titolo:string|null, genere:string|null, dettagli:object}>}
|
|
173
|
+
*/
|
|
174
|
+
export async function verificaIncorniciabile(indirizzo, { fetchFn = globalThis.fetch, origineNostra, millisecondi = MILLISECONDI_MASSIMI } = {}) {
|
|
175
|
+
let url;
|
|
176
|
+
// ⛔ 16/09 — `genere: 'indirizzo'`: non è un guasto di rete, non si ritenta, e il rimedio è guardare ciò che si è scritto.
|
|
177
|
+
try { url = new URL(String(indirizzo)); } catch { return { url: String(indirizzo), incorniciabile: false, motivo: 'URL non valido', stato: null, titolo: null, genere: 'indirizzo', dettagli: {} }; }
|
|
178
|
+
const ammesso = urlAmmesso(url);
|
|
179
|
+
if (!ammesso.ok) return { url: url.href, incorniciabile: false, motivo: ammesso.motivo, stato: null, titolo: null, genere: 'indirizzo', dettagli: {} };
|
|
180
|
+
const controller = new AbortController();
|
|
181
|
+
const timer = setTimeout(() => controller.abort(), millisecondi);
|
|
182
|
+
try {
|
|
183
|
+
const risposta = await fetchFn(url.href, { method: 'GET', redirect: 'follow', signal: controller.signal, headers: { accept: 'text/html,*/*;q=0.5', 'user-agent': 'TALOS-Harness-Desktop/0.1 (anteprima)' } });
|
|
184
|
+
const esito = valutaIntestazioni(risposta.headers, origineNostra);
|
|
185
|
+
let titolo = null;
|
|
186
|
+
if (esito.incorniciabile && /text\/html/i.test(String(risposta.headers.get('content-type') || ''))) {
|
|
187
|
+
/* il titolo per la scheda: si legge solo l'inizio del documento, mai la pagina intera */
|
|
188
|
+
try {
|
|
189
|
+
const lettore = risposta.body?.getReader?.();
|
|
190
|
+
if (lettore) {
|
|
191
|
+
let testo = ''; const decoder = new TextDecoder();
|
|
192
|
+
while (testo.length < 16_000) { const { value, done } = await lettore.read(); if (done) break; testo += decoder.decode(value, { stream: true }); if (/<\/title>/i.test(testo)) break; }
|
|
193
|
+
await lettore.cancel().catch(() => {});
|
|
194
|
+
const m = /<title[^>]*>([^<]{1,200})<\/title>/i.exec(testo);
|
|
195
|
+
if (m) titolo = m[1].replace(/\s+/g, ' ').trim() || null;
|
|
196
|
+
}
|
|
197
|
+
} catch { /* il titolo è un di più */ }
|
|
198
|
+
} else {
|
|
199
|
+
try { await risposta.body?.cancel?.(); } catch { /* niente da liberare */ }
|
|
200
|
+
}
|
|
201
|
+
return { url: risposta.url || url.href, incorniciabile: esito.incorniciabile, motivo: esito.motivo, stato: risposta.status, titolo, genere: esito.genere ?? null, dettagli: {} };
|
|
202
|
+
} catch (errore) {
|
|
203
|
+
// ⛔ 16/09 — il guasto si NOMINA (vedi `classificaGuasto` in testa al file): timeout, nome
|
|
204
|
+
// inesistente, porta chiusa e certificato portano rimedi diversi, e ritentarli ha senso solo
|
|
205
|
+
// per due di loro. Prima uscivano tutti con la stessa frase, che non incrociava nessun rimedio.
|
|
206
|
+
const { genere, motivo, dettagli } = classificaGuasto(errore, { millisecondi });
|
|
207
|
+
return { url: url.href, incorniciabile: false, motivo, stato: null, titolo: null, genere, dettagli };
|
|
208
|
+
} finally {
|
|
209
|
+
clearTimeout(timer);
|
|
210
|
+
}
|
|
211
|
+
}
|