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,181 @@
|
|
|
1
|
+
import {
|
|
2
|
+
talosResearchIsResting,
|
|
3
|
+
talosResearchIsTerminal,
|
|
4
|
+
talosResearchWorkLeft,
|
|
5
|
+
} from './run.mjs'
|
|
6
|
+
import { talosResearchReportRefOf } from './card.mjs'
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* PORTO FEDELE di AVM/mobile/src/lib/research/researchNarration.ts (150 righe, 11/09/2026).
|
|
10
|
+
*
|
|
11
|
+
* ⛔ `run.mjs` è il porto di `researchRun.ts` e lo cura un'altra sessione, in
|
|
12
|
+
* parallelo: qui se ne importa solo il nome concordato.
|
|
13
|
+
*
|
|
14
|
+
* Che cosa sta facendo la ricerca, detto in una frase.
|
|
15
|
+
*
|
|
16
|
+
* Owner 2026-08-03, sulla pagina com'era: «non c'è un progresso di quello che
|
|
17
|
+
* si sta facendo … dei termini molto tecnici». Aveva ragione, e la diagnosi è
|
|
18
|
+
* precisa: la pagina diceva QUANTO (`0/2`, `3 s`, `RACCOLGO`) e mai CHE COSA.
|
|
19
|
+
* Un contatore ha significato solo per chi già sa che cosa si sta contando; chi
|
|
20
|
+
* guarda vuole l'altra metà.
|
|
21
|
+
*
|
|
22
|
+
* Il materiale per la frase c'era già e non veniva usato. Il piano è stato
|
|
23
|
+
* approvato prima che si spendesse un centesimo, quindi ogni ramo porta la
|
|
24
|
+
* domanda a cui è andato a rispondere — il che vuol dire che «sto cercando le
|
|
25
|
+
* fonti su «chi la brevettò»» non è una parafrasi gentile dello stato, È lo
|
|
26
|
+
* stato, letto ad alta voce.
|
|
27
|
+
*
|
|
28
|
+
* Tutto qui dentro è aritmetica sulla corsa: niente disco, niente rete, nessun
|
|
29
|
+
* orologio proprio. La riga si può quindi disegnare nello stesso fotogramma del
|
|
30
|
+
* tocco.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @import { TalosResearchRun, TalosResearchStep } from './run.mjs'
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @typedef {object} TalosResearchLine
|
|
39
|
+
* @property {string} key Una chiave i18n. Le parole vivono nelle traduzioni, mai qui.
|
|
40
|
+
* @property {Readonly<Record<string, string>>} params
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/** @type {Readonly<Record<string, string>>} */
|
|
44
|
+
const NO_PARAMS = Object.freeze({})
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @param {string} key
|
|
48
|
+
* @param {Readonly<Record<string, string>>} [params]
|
|
49
|
+
* @returns {TalosResearchLine}
|
|
50
|
+
*/
|
|
51
|
+
function line(key, params = NO_PARAMS) {
|
|
52
|
+
return { key, params }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* La domanda a cui un ramo è andato a rispondere — l'unico nome umano che un passo ha.
|
|
57
|
+
* @param {TalosResearchRun} run
|
|
58
|
+
* @param {string} branchId
|
|
59
|
+
* @returns {string | null}
|
|
60
|
+
*/
|
|
61
|
+
function branchQuestion(run, branchId) {
|
|
62
|
+
return run.plan.find((branch) => branch.id === branchId)?.question ?? null
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Una frase per tutta la corsa.
|
|
67
|
+
*
|
|
68
|
+
* `driving` viene dal registro e non dal giornale, e i due sono davvero in
|
|
69
|
+
* disaccordo: una corsa uccisa insieme all'app legge ancora `collecting`, e
|
|
70
|
+
* dire «sto cercando» di una corsa che nessuno sta guidando è una bugia che la
|
|
71
|
+
* persona può stare a guardare per un'ora. Fermo è una frase sua, con il punto
|
|
72
|
+
* da cui ripartirebbe.
|
|
73
|
+
*
|
|
74
|
+
* @param {TalosResearchRun} run
|
|
75
|
+
* @param {boolean} driving
|
|
76
|
+
* @returns {TalosResearchLine}
|
|
77
|
+
*/
|
|
78
|
+
export function talosResearchNarration(run, driving) {
|
|
79
|
+
if (talosResearchIsTerminal(run.status)) {
|
|
80
|
+
if (run.status === 'cancelled') return line('research.cancelledHere')
|
|
81
|
+
if (run.status === 'failed') return line('research.say.failed')
|
|
82
|
+
/*
|
|
83
|
+
* «Conclusa» e «conclusa senza rapporto» sono lo stesso stato e due
|
|
84
|
+
* situazioni completamente diverse, e dire alla persona la prima quando
|
|
85
|
+
* era la seconda è costato ore il 2026-08-03: la corsa era finita, la
|
|
86
|
+
* pagina lo diceva, e nessuno ha pensato di chiedersi perché non ci
|
|
87
|
+
* fosse niente da leggere.
|
|
88
|
+
*/
|
|
89
|
+
return talosResearchReportRefOf(run) ? line('research.say.done') : line('research.doneNoReport')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Da dove ripartirebbe. Le corse terminali non devono niente, ed è per
|
|
93
|
+
// questo che si legge solo dopo il ramo terminale qui sopra.
|
|
94
|
+
const next = talosResearchWorkLeft(run)[0]?.question ?? null
|
|
95
|
+
|
|
96
|
+
/*
|
|
97
|
+
* Aver chiesto di fermarsi non è essersi fermati. Una pausa durante un
|
|
98
|
+
* passo già pagato lo lascia finire e depositare prima — «drain then
|
|
99
|
+
* checkpoint» — e lo scarto fra i due può essere un minuto in cui una
|
|
100
|
+
* persona guarda un pulsante che ha già premuto. Dire «in pausa» lì
|
|
101
|
+
* sarebbe la parola della pagina contro quella della rotella.
|
|
102
|
+
*/
|
|
103
|
+
if (run.status === 'pause_requested') return line('research.say.pausing')
|
|
104
|
+
if (talosResearchIsResting(run.status)) {
|
|
105
|
+
return next ? line('research.say.pausedAt', { question: next }) : line('research.say.paused')
|
|
106
|
+
}
|
|
107
|
+
if (!driving) {
|
|
108
|
+
return next ? line('research.say.stoppedAt', { question: next }) : line('research.say.stopped')
|
|
109
|
+
}
|
|
110
|
+
if (run.plan.length === 0) return line('research.say.planning')
|
|
111
|
+
|
|
112
|
+
const running = run.steps.find((step) => step.state === 'running')
|
|
113
|
+
if (running) {
|
|
114
|
+
if (running.kind === 'synthesise') return line('research.say.writing')
|
|
115
|
+
if (running.kind === 'verify') return line('research.say.verifying')
|
|
116
|
+
const question = branchQuestion(run, running.branchId)
|
|
117
|
+
if (!question) return line('research.say.collecting')
|
|
118
|
+
return line(running.kind === 'read' ? 'research.say.reading' : 'research.say.searching', { question })
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Fra due passi il motore ha già deciso che cosa viene dopo, e lo scarto è
|
|
122
|
+
// di millisecondi. Dire che cosa sta per fare batte il tacere proprio nel
|
|
123
|
+
// fotogramma in cui è più probabile che una persona stia guardando.
|
|
124
|
+
return next ? line('research.say.searching', { question: next }) : line('research.say.writing')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @typedef {object} TalosResearchDoneNotice
|
|
129
|
+
* @property {string} title Le parole della persona, non tradotte — è la sua domanda.
|
|
130
|
+
* @property {TalosResearchLine} text
|
|
131
|
+
* @property {string} route La pagina di QUESTA ricerca. Una notifica che atterra
|
|
132
|
+
* altrove ha speso l'attenzione dell'utente senza restituire niente.
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Che cosa annunciare quando una ricerca finisce, oppure niente.
|
|
137
|
+
*
|
|
138
|
+
* Una ricerca dura minuti: la persona la avvia, blocca il telefono, e fino a
|
|
139
|
+
* oggi niente le diceva che era finita. Doveva stare lì a guardarla — il che
|
|
140
|
+
* rende il lavoro in sottofondo senza valore.
|
|
141
|
+
*
|
|
142
|
+
* `cancelled` tace apposta. L'hanno fermata loro pochi secondi fa; dirgli che
|
|
143
|
+
* si è fermata è l'app che gli ripete la loro stessa azione, e ogni notifica
|
|
144
|
+
* così rende più facile scartare la prossima senza leggerla.
|
|
145
|
+
*
|
|
146
|
+
* @param {TalosResearchRun} run
|
|
147
|
+
* @returns {TalosResearchDoneNotice | null}
|
|
148
|
+
*/
|
|
149
|
+
export function talosResearchDoneNotice(run) {
|
|
150
|
+
if (!talosResearchIsTerminal(run.status)) return null
|
|
151
|
+
if (run.status === 'cancelled') return null
|
|
152
|
+
return {
|
|
153
|
+
title: run.title ?? run.question,
|
|
154
|
+
// Non guidata, e terminale: la stessa frase che mostra la pagina, che è
|
|
155
|
+
// il modo in cui la notifica e la pagina non possono finire in disaccordo.
|
|
156
|
+
text: talosResearchNarration(run, false),
|
|
157
|
+
route: `/research/${run.id}`,
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Il nome di un passo, per il registro in fondo alla pagina.
|
|
163
|
+
*
|
|
164
|
+
* Il registro stampava `b1:search` e `synthesis`, che sono gli identificativi
|
|
165
|
+
* del motore — utili a esattamente un lettore, e li ha scritti lui. I nomi qui
|
|
166
|
+
* dicono a che cosa SERVIVA il passo, e la domanda del ramo rende ogni ricerca
|
|
167
|
+
* distinguibile dalla successiva senza un numero di serie.
|
|
168
|
+
*
|
|
169
|
+
* @param {TalosResearchRun} run
|
|
170
|
+
* @param {TalosResearchStep} step
|
|
171
|
+
* @returns {TalosResearchLine}
|
|
172
|
+
*/
|
|
173
|
+
export function talosResearchStepTitle(run, step) {
|
|
174
|
+
if (step.kind === 'synthesise') return line('research.stepTitle.write')
|
|
175
|
+
if (step.kind === 'verify') return line('research.stepTitle.verify')
|
|
176
|
+
const question = branchQuestion(run, step.branchId)
|
|
177
|
+
if (step.kind === 'read') {
|
|
178
|
+
return question ? line('research.stepTitle.read', { question }) : line('research.stepTitle.readPlain')
|
|
179
|
+
}
|
|
180
|
+
return question ? line('research.stepTitle.search', { question }) : line('research.stepTitle.searchPlain')
|
|
181
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PORTO FEDELE di AVM/mobile/src/lib/research/researchOpenCards.ts (112 righe, 11/09/2026).
|
|
3
|
+
*
|
|
4
|
+
* Le due schede che il rapporto tiene APERTE, e il pezzo da evidenziare.
|
|
5
|
+
*
|
|
6
|
+
* ## Perché aperte, e non dietro un tocco
|
|
7
|
+
*
|
|
8
|
+
* Il dissenso fra le fonti e l'affermazione che dice più di quanto la sua
|
|
9
|
+
* pagina sostenga sono le due cose che nessun concorrente mostra. Finiscono
|
|
10
|
+
* dietro un tocco solo se si dà per scontato che la persona vada a cercarle —
|
|
11
|
+
* ma chi legge un rapporto all'86% non ha motivo di aprire proprio quella riga,
|
|
12
|
+
* ed è esattamente quella che gli serve.
|
|
13
|
+
*
|
|
14
|
+
* ⇒ Il rapporto porta in superficie UNA contesa e UNA che eccede. Non tutte:
|
|
15
|
+
* una scheda ciascuna, come esempio leggibile, e l'elenco completo resta nella
|
|
16
|
+
* scheda «Affermazioni». Il mockup approvato disegna esattamente questo.
|
|
17
|
+
*
|
|
18
|
+
* ## Perché una scheda si può RIFIUTARE di mostrare
|
|
19
|
+
*
|
|
20
|
+
* Una contesa senza i passaggi contrari disegnerebbe due colonne di cui una
|
|
21
|
+
* vuota; una parziale senza il motivo direbbe «sostenuta solo in parte» e
|
|
22
|
+
* nient'altro — cioè quello che la riga dell'elenco già dice. In entrambi i
|
|
23
|
+
* casi la scheda occupa lo schermo e non aggiunge niente, e allora non si
|
|
24
|
+
* mostra. `null` è un esito, non un guasto.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {import('./verification.mjs').TalosResearchChecks} TalosResearchChecks
|
|
29
|
+
* @typedef {import('./verification.mjs').TalosResearchSpan} TalosResearchSpan
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Un passaggio spezzato in tre, per evidenziare il pezzo che il giudice ha
|
|
34
|
+
* riconosciuto. `quote` vuota vuol dire «non si evidenzia niente»: il testo
|
|
35
|
+
* intero è in `before` e si stampa così com'è.
|
|
36
|
+
*
|
|
37
|
+
* @typedef {object} TalosResearchMarkedPassage
|
|
38
|
+
* @property {string} before
|
|
39
|
+
* @property {string} quote
|
|
40
|
+
* @property {string} after
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* ⛔ Lo span è stato calcolato quando la pagina è stata letta, e il passaggio
|
|
45
|
+
* viene dal disco: sono due dati che possono essersi disallineati. Un indice
|
|
46
|
+
* fuori misura NON evidenzia il pezzo sbagliato — non evidenzia niente, e il
|
|
47
|
+
* passaggio si legge intero. Evidenziare a caso è peggio che non evidenziare,
|
|
48
|
+
* perché sposta la fiducia su una parola che nessuno ha giudicato.
|
|
49
|
+
*
|
|
50
|
+
* @param {string | null | undefined} passage
|
|
51
|
+
* @param {TalosResearchSpan | null | undefined} span
|
|
52
|
+
* @returns {TalosResearchMarkedPassage}
|
|
53
|
+
*/
|
|
54
|
+
export function talosResearchMarkedPassage(passage, span) {
|
|
55
|
+
const testo = passage ?? '';
|
|
56
|
+
const intero = { before: testo, quote: '', after: '' };
|
|
57
|
+
if (!span) return intero;
|
|
58
|
+
|
|
59
|
+
const { from, to } = span;
|
|
60
|
+
if (!Number.isInteger(from) || !Number.isInteger(to)) return intero;
|
|
61
|
+
if (from < 0 || to > testo.length || from >= to) return intero;
|
|
62
|
+
|
|
63
|
+
return { before: testo.slice(0, from), quote: testo.slice(from, to), after: testo.slice(to) };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Il minimo che serve per scegliere: il resto della scheda non lo decide questo file.
|
|
68
|
+
*
|
|
69
|
+
* @typedef {object} TalosResearchOpenClaim
|
|
70
|
+
* @property {string} text
|
|
71
|
+
* @property {string} passage
|
|
72
|
+
* @property {TalosResearchChecks} checks
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* L'affermazione scelta e il suo posto nell'elenco, perché la scheda ci porti.
|
|
77
|
+
*
|
|
78
|
+
* @template T
|
|
79
|
+
* @typedef {object} TalosResearchOpenCard
|
|
80
|
+
* @property {T} claim
|
|
81
|
+
* @property {number} index
|
|
82
|
+
*/
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @template {TalosResearchOpenClaim} T
|
|
86
|
+
* @param {readonly T[] | null | undefined} claims
|
|
87
|
+
* @param {(claim: T) => boolean} vale
|
|
88
|
+
* @returns {TalosResearchOpenCard<T> | null}
|
|
89
|
+
*/
|
|
90
|
+
function scegli(claims, vale) {
|
|
91
|
+
if (!claims) return null;
|
|
92
|
+
for (let index = 0; index < claims.length; index += 1) {
|
|
93
|
+
const claim = claims[index];
|
|
94
|
+
if (claim && vale(claim)) return { claim, index };
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* La prima contesa CHE HA I PASSAGGI CONTRARI.
|
|
101
|
+
*
|
|
102
|
+
* ⛔ `opposing` assente non vuol dire «non ce ne sono»: vuol dire «una verifica
|
|
103
|
+
* vecchia non li ha guardati». In entrambi i casi non c'è niente da affiancare,
|
|
104
|
+
* e la scheda non si apre.
|
|
105
|
+
*
|
|
106
|
+
* @template {TalosResearchOpenClaim} T
|
|
107
|
+
* @param {readonly T[] | null | undefined} claims
|
|
108
|
+
* @returns {TalosResearchOpenCard<T> | null}
|
|
109
|
+
*/
|
|
110
|
+
export function talosResearchContestedCard(claims) {
|
|
111
|
+
return scegli(claims, (claim) =>
|
|
112
|
+
claim.checks.claimSupported === 'contested'
|
|
113
|
+
&& (claim.checks.opposing ?? []).some((contro) => Boolean(contro.passage?.trim())));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* La prima che eccede la sua fonte, col motivo per cui la eccede.
|
|
118
|
+
*
|
|
119
|
+
* Senza motivo la scheda ripeterebbe la riga dell'elenco; il valore è la frase
|
|
120
|
+
* che dice DOVE l'affermazione va oltre, non il verdetto.
|
|
121
|
+
*
|
|
122
|
+
* @template {TalosResearchOpenClaim} T
|
|
123
|
+
* @param {readonly T[] | null | undefined} claims
|
|
124
|
+
* @returns {TalosResearchOpenCard<T> | null}
|
|
125
|
+
*/
|
|
126
|
+
export function talosResearchOverreachingCard(claims) {
|
|
127
|
+
return scegli(claims, (claim) =>
|
|
128
|
+
claim.checks.claimSupported === 'partial'
|
|
129
|
+
&& Boolean(claim.checks.supportReason?.trim())
|
|
130
|
+
&& Boolean(claim.passage?.trim()));
|
|
131
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PORTO FEDELE di AVM/mobile/src/lib/research/researchOpposing.ts (279 righe, 11/09/2026).
|
|
3
|
+
*
|
|
4
|
+
* ⛔⛔ CONTESA-02 — cercare chi dice il CONTRARIO.
|
|
5
|
+
*
|
|
6
|
+
* ## Il difetto misurato sul Pad il 2026-08-20
|
|
7
|
+
*
|
|
8
|
+
* Il rapporto su GGUF scriveva, in chiaro, «le fonti… non specificano però
|
|
9
|
+
* formalmente un maintainer unico»: una divergenza, in prosa. La barra sopra
|
|
10
|
+
* diceva **7 su 7 sostenute · 0 contese**. `talosResearchContestedVerdict`
|
|
11
|
+
* esisteva coi suoi test, e **non lo chiamava nessuno**: la contesa non poteva
|
|
12
|
+
* entrare nei dati, quindi né la barra né la scheda potevano mostrarla mai.
|
|
13
|
+
*
|
|
14
|
+
* ## Perché serve un secondo giro, e perché costa poco
|
|
15
|
+
*
|
|
16
|
+
* Il giudice risponde su UNA coppia (affermazione, passaggio). Per sapere se
|
|
17
|
+
* qualcun altro dice il contrario bisogna dargli l'altro passaggio: è una
|
|
18
|
+
* domanda in più, non c'è scorciatoia. Il costo si tiene basso scegliendo
|
|
19
|
+
* **un solo candidato** per affermazione, e solo quando ne esiste uno che
|
|
20
|
+
* parla davvero dello stesso argomento.
|
|
21
|
+
*
|
|
22
|
+
* ⛔ E si chiede solo sulle affermazioni già SOSTENUTE (o in parte): la contesa
|
|
23
|
+
* è disaccordo, e il disaccordo esiste solo se prima c'era un accordo. Su una
|
|
24
|
+
* già smentita una fonte contraria non è un conflitto, è la stessa cosa detta
|
|
25
|
+
* due volte.
|
|
26
|
+
*
|
|
27
|
+
* ## Perché la scelta è lessicale e non semantica
|
|
28
|
+
*
|
|
29
|
+
* Un modello che sceglie il candidato è un secondo giudizio pagato per
|
|
30
|
+
* decidere cosa far giudicare, e sposta il risultato prima ancora di
|
|
31
|
+
* misurarlo. La sovrapposizione di parole è cieca, gratis e ripetibile: non
|
|
32
|
+
* decide chi ha ragione, decide soltanto **di cosa si sta parlando**. Il
|
|
33
|
+
* verdetto resta al giudice.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/** @typedef {import('./collector.mjs').TalosResearchSource} TalosResearchSource */
|
|
37
|
+
|
|
38
|
+
/** Le parole che portano significato: le corte le ha ogni frase. */
|
|
39
|
+
const CORTA = 4;
|
|
40
|
+
/** Sotto due parole in comune non si sta parlando della stessa cosa. */
|
|
41
|
+
const SOGLIA = 2;
|
|
42
|
+
/**
|
|
43
|
+
* ⛔⛔ Sopra questa soglia i due passaggi sono LA STESSA FRASE.
|
|
44
|
+
*
|
|
45
|
+
* MISURATO sul Pad il 2026-08-20, prima contesa vera trovata dal giudice:
|
|
46
|
+
* «Dice di sì» e «Dice di no» portavano il testo IDENTICO, parola per
|
|
47
|
+
* parola, da due siti che si ricopiano. Il giudice aveva risposto «sì,
|
|
48
|
+
* contraddice» a una frase uguale a quella che aveva appena approvato.
|
|
49
|
+
*
|
|
50
|
+
* ⇒ Due siti che riportano la stessa frase sono un'ECO, non un disaccordo —
|
|
51
|
+
* ed è la stessa distinzione che il rapporto fa già sulle fonti
|
|
52
|
+
* indipendenti. Una contesa inventata è peggio di una contesa non trovata:
|
|
53
|
+
* toglie forza a quelle vere.
|
|
54
|
+
*/
|
|
55
|
+
const ECO = 0.9;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* ⛔ Sotto questo numero di parole di contenuto il rapporto non dice niente:
|
|
59
|
+
* due frasi corte con due parole in comune non sono la stessa frase.
|
|
60
|
+
*/
|
|
61
|
+
const PAVIMENTO = 4;
|
|
62
|
+
|
|
63
|
+
/** Un passaggio più lungo di così non è una citazione, è una pagina. */
|
|
64
|
+
const MASSIMO = 400;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* ⛔⛔ Una TABELLA SROTOLATA non è una frase, e non si manda al giudice.
|
|
68
|
+
*
|
|
69
|
+
* FOTOGRAFATO sul Pad il 2026-08-20: come passaggio contrario è arrivato
|
|
70
|
+
* l'infobox di una pagina, estratto senza spazi fra le celle —
|
|
71
|
+
* «…0x46Developed byGeorgi Gerganov and communityInitial releaseAugust 22,
|
|
72
|
+
* 2023…». Il giudice ha risposto «sì, contraddice» a un blocco che in realtà
|
|
73
|
+
* CONFERMAVA la data: gli era stata data spazzatura, e ha risposto lo stesso.
|
|
74
|
+
*
|
|
75
|
+
* Il segno è preciso: una minuscola attaccata a una maiuscola è il punto in
|
|
76
|
+
* cui due celle si sono toccate. La prosa non lo fa quasi mai — una volta
|
|
77
|
+
* capita («iPhone», un nome proprio); tre volte in una frase sola è una
|
|
78
|
+
* tabella.
|
|
79
|
+
*
|
|
80
|
+
* ⛔ E si scarta PRIMA di pagare il giudice: una risposta comprata su un
|
|
81
|
+
* testo illeggibile costa uguale e vale meno di niente, perché entra nel
|
|
82
|
+
* rapporto come se fosse una verifica.
|
|
83
|
+
*/
|
|
84
|
+
const INCOLLATE = /\p{Ll}\p{Lu}/gu;
|
|
85
|
+
const MAX_INCOLLATE = 3;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {string} frase
|
|
89
|
+
* @returns {boolean}
|
|
90
|
+
*/
|
|
91
|
+
function tabellaSrotolata(frase) {
|
|
92
|
+
return (frase.match(INCOLLATE)?.length ?? 0) >= MAX_INCOLLATE;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Quanto questa frase è la stessa cosa del passaggio già approvato.
|
|
97
|
+
*
|
|
98
|
+
* ⛔⛔ Il confronto è nel VERSO PIÙ CORTO, e la prima versione lo faceva in uno
|
|
99
|
+
* solo — quello comodo.
|
|
100
|
+
*
|
|
101
|
+
* FOTOGRAFATO sul Pad il 2026-08-20, seconda contesa: «Dice di sì» portava
|
|
102
|
+
* «Sviluppato da Georgi Gerganov e dal team del progetto llama.cpp come
|
|
103
|
+
* evoluzione del precedente GGML», e «Dice di no» portava LA STESSA FRASE più
|
|
104
|
+
* un paragrafo di contorno. Guardando solo quanta parte della frase contraria
|
|
105
|
+
* è nel passaggio a favore, il contorno abbassava il rapporto e l'eco passava.
|
|
106
|
+
*
|
|
107
|
+
* ⇒ Si divide per il PIÙ CORTO dei due: se uno contiene l'altro, sono la
|
|
108
|
+
* stessa affermazione con più cornice, in qualunque verso stia la cornice. Il
|
|
109
|
+
* pavimento a quattro parole evita che due frasi brevissime con due parole in
|
|
110
|
+
* comune si dichiarino identiche.
|
|
111
|
+
*
|
|
112
|
+
* @param {string} frase
|
|
113
|
+
* @param {Set<string>} sostiene
|
|
114
|
+
* @returns {boolean}
|
|
115
|
+
*/
|
|
116
|
+
function eco(frase, sostiene) {
|
|
117
|
+
if (sostiene.size === 0) return false;
|
|
118
|
+
const sue = contenuto(frase);
|
|
119
|
+
if (sue.size === 0) return false;
|
|
120
|
+
let comuni = 0;
|
|
121
|
+
for (const parola of sue) if (sostiene.has(parola)) comuni += 1;
|
|
122
|
+
const piuCorto = Math.max(PAVIMENTO, Math.min(sue.size, sostiene.size));
|
|
123
|
+
return comuni / piuCorto >= ECO;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @param {string} testo
|
|
128
|
+
* @returns {Set<string>}
|
|
129
|
+
*/
|
|
130
|
+
function contenuto(testo) {
|
|
131
|
+
const parole = testo
|
|
132
|
+
.toLowerCase()
|
|
133
|
+
.replace(/[^\p{L}\p{N}\s]/gu, ' ')
|
|
134
|
+
.split(/\s+/)
|
|
135
|
+
.filter((parola) => parola.length >= CORTA);
|
|
136
|
+
return new Set(parole);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Le frasi di un testo, tagliate anche dove la punteggiatura non arriva.
|
|
141
|
+
*
|
|
142
|
+
* ⛔ Un muro di testo senza punti diventerebbe UNA frase lunga quanto la
|
|
143
|
+
* pagina, e mandarla al giudice sarebbe mandargli la pagina intera: la domanda
|
|
144
|
+
* diventerebbe «questa fonte dice il contrario», che non è verificabile.
|
|
145
|
+
*
|
|
146
|
+
* @param {string} testo
|
|
147
|
+
* @returns {string[]}
|
|
148
|
+
*/
|
|
149
|
+
function frasi(testo) {
|
|
150
|
+
/** @type {string[]} */
|
|
151
|
+
const out = [];
|
|
152
|
+
for (const pezzo of testo.split(/(?<=[.!?])\s+/)) {
|
|
153
|
+
const pulito = pezzo.trim();
|
|
154
|
+
if (!pulito) continue;
|
|
155
|
+
if (pulito.length <= MASSIMO) { out.push(pulito); continue; }
|
|
156
|
+
|
|
157
|
+
// ⛔ Il taglio cade sull'ULTIMO SPAZIO, non al carattere esatto.
|
|
158
|
+
// FOTOGRAFATO sul Pad il 2026-08-20: un passaggio finiva con
|
|
159
|
+
// «distributing quantized large lang» — mezza parola. Al giudice
|
|
160
|
+
// arrivava una frase mutilata, e alla persona pure.
|
|
161
|
+
let da = 0;
|
|
162
|
+
while (da < pulito.length) {
|
|
163
|
+
let a = Math.min(da + MASSIMO, pulito.length);
|
|
164
|
+
if (a < pulito.length) {
|
|
165
|
+
const spazio = pulito.lastIndexOf(String.fromCharCode(32), a);
|
|
166
|
+
if (spazio > da) a = spazio;
|
|
167
|
+
}
|
|
168
|
+
const fetta = pulito.slice(da, a).trim();
|
|
169
|
+
if (fetta) out.push(fetta);
|
|
170
|
+
da = a;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Una fonte diversa da quella citata, e la sua frase più pertinente.
|
|
178
|
+
*
|
|
179
|
+
* @typedef {object} TalosResearchOpposingCandidate
|
|
180
|
+
* @property {number} sourceIndex L'indice nella lista delle fonti raccolte, contando da zero.
|
|
181
|
+
* @property {string} url
|
|
182
|
+
* @property {string} title
|
|
183
|
+
* @property {string} passage
|
|
184
|
+
* @property {{from:number, to:number}} span
|
|
185
|
+
* @property {number} overlap Quante parole di contenuto ha in comune con l'affermazione.
|
|
186
|
+
*/
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* La frase, in un'altra fonte, che parla più da vicino di questa affermazione.
|
|
190
|
+
*
|
|
191
|
+
* ⛔ `null` quando nessuna arriva alla soglia: chiedere al giudice di
|
|
192
|
+
* confrontare l'affermazione con un paragrafo che non c'entra produce un «no,
|
|
193
|
+
* non lo contraddice» che sembra una verifica e non lo è — e costa comunque.
|
|
194
|
+
*
|
|
195
|
+
* ⛔ E la fonte già citata è esclusa: il giudice l'ha appena letta. Riproporgli
|
|
196
|
+
* la stessa pagina significherebbe farsi contraddire da chi ha appena detto di
|
|
197
|
+
* sì, e chiamare «contesa» un disaccordo con sé stesso.
|
|
198
|
+
*
|
|
199
|
+
* @param {string} claimText
|
|
200
|
+
* @param {number} citedIndex
|
|
201
|
+
* @param {readonly TalosResearchSource[]} sources
|
|
202
|
+
* @param {string} [citedPassage=''] Il passaggio che sostiene l'affermazione: chi lo ripete non lo nega.
|
|
203
|
+
* @returns {TalosResearchOpposingCandidate | null}
|
|
204
|
+
*/
|
|
205
|
+
export function talosResearchOpposingCandidate(claimText, citedIndex, sources, citedPassage = '') {
|
|
206
|
+
const parole = contenuto(claimText);
|
|
207
|
+
if (parole.size === 0) return null;
|
|
208
|
+
const sostiene = contenuto(citedPassage);
|
|
209
|
+
|
|
210
|
+
/** @type {TalosResearchOpposingCandidate | null} */
|
|
211
|
+
let migliore = null;
|
|
212
|
+
|
|
213
|
+
for (let indice = 0; indice < sources.length; indice += 1) {
|
|
214
|
+
if (indice === citedIndex) continue;
|
|
215
|
+
const fonte = sources[indice];
|
|
216
|
+
if (!fonte?.text) continue;
|
|
217
|
+
|
|
218
|
+
let scorso = 0;
|
|
219
|
+
for (const frase of frasi(fonte.text)) {
|
|
220
|
+
// La posizione si cerca a partire da dove siamo arrivati: la stessa
|
|
221
|
+
// frase può comparire due volte, e la seconda non sta dove sta la
|
|
222
|
+
// prima.
|
|
223
|
+
const da = fonte.text.indexOf(frase, scorso);
|
|
224
|
+
if (da >= 0) scorso = da + frase.length;
|
|
225
|
+
|
|
226
|
+
let overlap = 0;
|
|
227
|
+
for (const parola of contenuto(frase)) if (parole.has(parola)) overlap += 1;
|
|
228
|
+
if (overlap < SOGLIA) continue;
|
|
229
|
+
if (migliore && overlap <= migliore.overlap) continue;
|
|
230
|
+
// ⛔ Prima ancora dell'eco: se non è prosa, non è un passaggio.
|
|
231
|
+
if (tabellaSrotolata(frase)) continue;
|
|
232
|
+
// ⛔ L'eco si scarta QUI, prima di pagare il giudice: chiedergli se
|
|
233
|
+
// una frase contraddice sé stessa è comprare una risposta a una
|
|
234
|
+
// domanda senza senso.
|
|
235
|
+
if (eco(frase, sostiene)) continue;
|
|
236
|
+
|
|
237
|
+
migliore = {
|
|
238
|
+
sourceIndex: indice,
|
|
239
|
+
url: fonte.url,
|
|
240
|
+
title: fonte.title,
|
|
241
|
+
passage: frase,
|
|
242
|
+
span: da >= 0 ? { from: da, to: da + frase.length } : { from: 0, to: 0 },
|
|
243
|
+
overlap,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return migliore;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* La domanda al giudice, e non è la stessa di prima.
|
|
253
|
+
*
|
|
254
|
+
* ⛔ Non «sostiene l'affermazione?» ma «la CONTRADDICE?». Sembra la stessa
|
|
255
|
+
* domanda al negativo e non lo è: un passaggio che non sostiene un'affermazione
|
|
256
|
+
* quasi sempre non dice niente al riguardo, e leggere quel silenzio come una
|
|
257
|
+
* smentita farebbe apparire contese ovunque. La contesa deve essere DETTA dalla
|
|
258
|
+
* fonte.
|
|
259
|
+
*
|
|
260
|
+
* @param {string} claim
|
|
261
|
+
* @param {string} passage
|
|
262
|
+
* @returns {string}
|
|
263
|
+
*/
|
|
264
|
+
export function talosResearchOpposingPrompt(claim, passage) {
|
|
265
|
+
return [
|
|
266
|
+
'Passaggio, copiato da UN’ALTRA fonte:',
|
|
267
|
+
'"""',
|
|
268
|
+
passage,
|
|
269
|
+
'"""',
|
|
270
|
+
'',
|
|
271
|
+
'Affermazione:',
|
|
272
|
+
claim,
|
|
273
|
+
'',
|
|
274
|
+
'Questo passaggio CONTRADDICE l’affermazione?',
|
|
275
|
+
'Contraddire vuol dire dire il contrario, non tacere: se il passaggio',
|
|
276
|
+
'semplicemente non parla dell’affermazione, la risposta è NO.',
|
|
277
|
+
'Non usare altro: né quello che sai, né quello che ti sembra probabile.',
|
|
278
|
+
'',
|
|
279
|
+
// ⛔ Nessun menu con le barre: un modello lo ricopia invece di
|
|
280
|
+
// sceglierne una voce. Vedi la nota sulla domanda del primo giro.
|
|
281
|
+
'Rispondi con UNA riga sola. Comincia con SI oppure con NO,',
|
|
282
|
+
'poi un trattino e il motivo, massimo quindici parole.',
|
|
283
|
+
'',
|
|
284
|
+
'Esempio di risposta: NO — il passaggio non parla di questo.',
|
|
285
|
+
].join('\n');
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Legge la riga del giudice: contraddice, sì o no.
|
|
290
|
+
*
|
|
291
|
+
* ⛔ Nel dubbio è NO. Una risposta illeggibile letta come «sì» marcherebbe
|
|
292
|
+
* contesa un'affermazione che nessuno ha smentito, e una contesa inventata è
|
|
293
|
+
* peggio di una contesa non trovata: toglie forza a quelle vere.
|
|
294
|
+
*
|
|
295
|
+
* @param {string} risposta
|
|
296
|
+
* @returns {boolean}
|
|
297
|
+
*/
|
|
298
|
+
export function talosResearchParseOpposingVerdict(risposta) {
|
|
299
|
+
const riga = risposta.trim().toLowerCase();
|
|
300
|
+
if (!riga) return false;
|
|
301
|
+
// Si guarda solo la PRIMA parola: un motivo che contiene «no» dentro una
|
|
302
|
+
// frase («non c'è dubbio che sia il contrario») non deve ribaltare l'esito.
|
|
303
|
+
const prima = riga.split(/[^\p{L}]+/u).filter(Boolean)[0];
|
|
304
|
+
return prima === 'si' || prima === 'sì' || prima === 'yes';
|
|
305
|
+
}
|