@vascend/talos 0.1.0 → 0.1.1

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.
Files changed (66) hide show
  1. package/README.md +7 -3
  2. package/dist/backend/asset-events.js +9 -9
  3. package/dist/core/agent.js +3 -3
  4. package/dist/core/cli-args.js +50 -50
  5. package/dist/core/cli-installation.d.ts +4 -0
  6. package/dist/core/cli-installation.js +55 -0
  7. package/dist/core/compaction.js +26 -26
  8. package/dist/core/config.js +101 -101
  9. package/dist/core/execution-guidance.js +21 -21
  10. package/dist/core/package-update.d.ts +3 -1
  11. package/dist/core/package-update.js +19 -6
  12. package/dist/core/self-update.d.ts +1 -1
  13. package/dist/core/signed-release.d.ts +33 -0
  14. package/dist/core/signed-release.js +121 -0
  15. package/dist/core/update-check.d.ts +1 -1
  16. package/dist/core/update-check.js +15 -14
  17. package/dist/core/vibe-modes.js +13 -13
  18. package/dist/distribution/install.d.ts +1 -0
  19. package/dist/distribution/install.js +31 -0
  20. package/dist/install.mjs +271 -0
  21. package/dist/node-runtime.json +13 -0
  22. package/dist/providers/oauth-callback-server.js +32 -32
  23. package/dist/tools/capabilities.js +30 -30
  24. package/dist/tools/computer-capture.js +50 -50
  25. package/dist/tools/program.js +82 -82
  26. package/dist/tui/i18n-catalog.js +16 -0
  27. package/dist/tui/quick-help.js +31 -31
  28. package/dist/tui/repl.js +5 -5
  29. package/dist/tui/update-prompt.js +1 -0
  30. package/dist/vascend/code-events.js +9 -9
  31. package/dist/vascend/completeness.js +31 -31
  32. package/dist/vascend/context-fabric.js +16 -16
  33. package/dist/vascend/contract-memory.js +30 -30
  34. package/dist/vascend/council.js +82 -82
  35. package/dist/vascend/decision-promotion.js +23 -23
  36. package/dist/vascend/granular-kingdom.js +17 -17
  37. package/dist/vascend/granular-launcher.js +2 -2
  38. package/dist/vascend/kingdom-kpi.js +19 -19
  39. package/dist/vascend/kingdom-run.js +6 -6
  40. package/dist/vascend/kingdom.js +56 -56
  41. package/dist/vascend/mandate.js +21 -21
  42. package/dist/vascend/objective-revision.js +34 -34
  43. package/dist/vascend/patch-plan.js +22 -22
  44. package/dist/vascend/requirements.js +29 -29
  45. package/dist/vascend/reviewer.js +26 -26
  46. package/dist/vascend/room-memory.js +25 -25
  47. package/dist/vascend/runtime.js +44 -44
  48. package/dist/vascend/self-improve.js +39 -39
  49. package/dist/vascend/test-failure-memory.js +9 -9
  50. package/dist/vascend/vision.js +18 -18
  51. package/dist/vendor/computer-use/README.md +7 -7
  52. package/dist/vendor/computer-use/computer-desktop.js +211 -211
  53. package/dist/vendor/computer-use/computer-observe.js +315 -315
  54. package/dist/vendor/computer-use/computer-scripts.js +1230 -1230
  55. package/dist/vendor/computer-use/computer-tools.js +2136 -2136
  56. package/dist/vendor/computer-use/package.json +1 -1
  57. package/dist/vendor/computer-use/rac/atomic-input.js +91 -91
  58. package/dist/vendor/computer-use/rac/grammatica.js +101 -101
  59. package/dist/vendor/computer-use/rac/parser.js +185 -185
  60. package/dist/vendor/computer-use/rac/protocol.js +136 -136
  61. package/install.ps1 +374 -30
  62. package/install.sh +356 -43
  63. package/package.json +2 -2
  64. package/dist/core/kingdoms-mode-state.d.ts +0 -24
  65. package/dist/core/kingdoms-mode-state.js +0 -139
  66. package/dist/text-sanitize.js +0 -28
package/README.md CHANGED
@@ -41,18 +41,22 @@ The package includes the compiled CLI and SDK; GitHub access and a local build a
41
41
  On macOS and Linux, the installer uses a writable user directory:
42
42
 
43
43
  ```bash
44
- curl -fsSL https://cdn.jsdelivr.net/npm/@vascend/talos@latest/install.sh | bash
44
+ curl -fsSL https://vascend.it/install | bash
45
45
  ```
46
46
 
47
47
  On Windows, run in PowerShell:
48
48
 
49
49
  ```powershell
50
- irm https://cdn.jsdelivr.net/npm/@vascend/talos@latest/install.ps1 | iex
50
+ irm https://vascend.it/install.ps1 | iex
51
51
  ```
52
52
 
53
- Both installers require Node.js 20+ and npm. Run `talos` to check for newer stable versions;
53
+ Both installers automatically install a verified Node.js LTS runtime with npm when a compatible installation is unavailable. No administrator privileges are needed. Run `talos` to check for newer stable versions;
54
54
  the startup prompt shows `current version → new version` and offers **Skip for now** or **Update now**.
55
55
 
56
+ Talos checks npm for new stable releases, downloads from Vascend with an official npm fallback, and verifies the registry signature and SHA-512 integrity before installing with lifecycle scripts disabled. The initial installer command still trusts the HTTPS site serving the script.
57
+
58
+ The installers add `talos` to your user PATH. On Windows it is available in the current PowerShell window; on Bash/Zsh, open a new terminal or use the activation command printed by the installer. No administrator rights or changes to PowerShell execution policy are required.
59
+
56
60
  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
61
 
58
62
  ```text
@@ -85,15 +85,15 @@ export function formatAssetEventRecord(room, event) {
85
85
  }
86
86
  const target = event.taskId ? `task:${event.taskId}` : `vision:${asset.visionId}`;
87
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
-
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
97
  OUTPUT: asset ${asset.id} "${escapeValue(asset.name)}" ${action}${event.taskId ? ` e collegato a ${event.taskId}` : ""}; richiamabile via recall.`;
98
98
  return {
99
99
  room,
@@ -1160,9 +1160,9 @@ userInput, sink, signal) {
1160
1160
  const previous = results[planResultIndex];
1161
1161
  results[planResultIndex] = {
1162
1162
  ...previous,
1163
- output: `${previous.output}
1164
-
1165
- [Horizon]
1163
+ output: `${previous.output}
1164
+
1165
+ [Horizon]
1166
1166
  Il piano ha ${collaborators.length} filoni `
1167
1167
  + `(${collaborators.map((item) => item.slug).join(", ")}). Decidi TU se ti serve una mano: `
1168
1168
  + "se te ne serve, ingaggia dei collaboratori con team_engage e spiega loro il compito "
@@ -228,55 +228,55 @@ export function parseCliArgs(argv) {
228
228
  return Object.freeze({ ...args });
229
229
  }
230
230
  export function cliHelp() {
231
- return `Horizon - agente Vascend da terminale
232
-
233
- USO
234
- horizon [opzioni]
235
- horizon --print [opzioni] "prompt"
236
- horizon --rpc [opzioni]
237
- horizon --doctor
238
- horizon --work [--work-verify "npm test"] [--work-max N] [--work-minutes N]
239
-
240
- MODALITA'
241
- -p, --print esegue un prompt one-shot
242
- --rpc protocollo JSONL su stdin/stdout
243
- --doctor diagnostica ambiente (provider, modello, sessioni)
244
- --json emette AgentEvent JSONL (print/RPC/work) o il report doctor
245
-
246
- LAVORO AUTONOMO (il ciclo sta fuori dalla conversazione)
247
- --work prende le unita' dalla coda, una per agente NUOVO
248
- --work-list mostra la coda (stati, lease, tentativi) e esce
249
- --work-scope <nome> coda e memoria condivisa del progetto (default: default)
250
- --work-verify <cmd> comando che decide se un'unita' e' fatta (exit code)
251
- --work-max <N> quante unita' al massimo in questo giro (default 25)
252
- --work-minutes <N> smette di rivendicare dopo N minuti
253
-
254
- MODELLO E CONTESTO
255
- -m, --model <provider/id> seleziona provider e modello
256
- -C, --cwd <path> workspace seguito
257
- --add-dir <path> aggiunge una root allo stesso workspace (ripetibile)
258
- --vibe <modalita> auto, flow, debug, architect, ui, ship,
259
- migrate, security, swarm, ultracheck, ...
260
- --config <path> config esplicita
261
- --prompt-template <p> directory/file template aggiuntivo (ripetibile)
262
- --skill <path> skill aggiuntiva (ripetibile)
263
- --no-skills disabilita discovery skill
264
-
265
- SESSIONE E SICUREZZA
266
- -c, --continue riprende l'ultima sessione
267
- --resume [id] riprende id; senza id apre il picker TUI
268
- --session-id <id> usa una sessione specifica
269
- --name <nome> assegna un nome alla sessione
270
- --approve considera fidate le risorse locali
271
- --no-approve nega le risorse locali
272
- --yolo auto-approva i tool (anche in TUI; usare con cautela)
273
- --exclude-tools <a,b> rimuove tool dal registry
274
-
275
- ALTRO
276
- -h, --help mostra questo aiuto
277
- -V, --version mostra la versione
278
- -- termina il parsing delle opzioni
279
-
280
- I flag delle estensioni sono accettati dopo il bootstrap. Per un valore usa
231
+ return `Horizon - agente Vascend da terminale
232
+
233
+ USO
234
+ horizon [opzioni]
235
+ horizon --print [opzioni] "prompt"
236
+ horizon --rpc [opzioni]
237
+ horizon --doctor
238
+ horizon --work [--work-verify "npm test"] [--work-max N] [--work-minutes N]
239
+
240
+ MODALITA'
241
+ -p, --print esegue un prompt one-shot
242
+ --rpc protocollo JSONL su stdin/stdout
243
+ --doctor diagnostica ambiente (provider, modello, sessioni)
244
+ --json emette AgentEvent JSONL (print/RPC/work) o il report doctor
245
+
246
+ LAVORO AUTONOMO (il ciclo sta fuori dalla conversazione)
247
+ --work prende le unita' dalla coda, una per agente NUOVO
248
+ --work-list mostra la coda (stati, lease, tentativi) e esce
249
+ --work-scope <nome> coda e memoria condivisa del progetto (default: default)
250
+ --work-verify <cmd> comando che decide se un'unita' e' fatta (exit code)
251
+ --work-max <N> quante unita' al massimo in questo giro (default 25)
252
+ --work-minutes <N> smette di rivendicare dopo N minuti
253
+
254
+ MODELLO E CONTESTO
255
+ -m, --model <provider/id> seleziona provider e modello
256
+ -C, --cwd <path> workspace seguito
257
+ --add-dir <path> aggiunge una root allo stesso workspace (ripetibile)
258
+ --vibe <modalita> auto, flow, debug, architect, ui, ship,
259
+ migrate, security, swarm, ultracheck, ...
260
+ --config <path> config esplicita
261
+ --prompt-template <p> directory/file template aggiuntivo (ripetibile)
262
+ --skill <path> skill aggiuntiva (ripetibile)
263
+ --no-skills disabilita discovery skill
264
+
265
+ SESSIONE E SICUREZZA
266
+ -c, --continue riprende l'ultima sessione
267
+ --resume [id] riprende id; senza id apre il picker TUI
268
+ --session-id <id> usa una sessione specifica
269
+ --name <nome> assegna un nome alla sessione
270
+ --approve considera fidate le risorse locali
271
+ --no-approve nega le risorse locali
272
+ --yolo auto-approva i tool (anche in TUI; usare con cautela)
273
+ --exclude-tools <a,b> rimuove tool dal registry
274
+
275
+ ALTRO
276
+ -h, --help mostra questo aiuto
277
+ -V, --version mostra la versione
278
+ -- termina il parsing delle opzioni
279
+
280
+ I flag delle estensioni sono accettati dopo il bootstrap. Per un valore usa
281
281
  la forma non ambigua --nome=valore.`;
282
282
  }
@@ -0,0 +1,4 @@
1
+ export declare function installationPrefix(value: string): string;
2
+ export declare function windowsCliShim(): string;
3
+ /** Verify the actual installed package before reporting success or restarting. */
4
+ export declare function finalizeCliInstallation(root: string, version: string): void;
@@ -0,0 +1,55 @@
1
+ import { existsSync, lstatSync, readFileSync, realpathSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ export function installationPrefix(value) {
4
+ const prefix = resolve(value);
5
+ if (/[\x00-\x1f\x7f]/.test(prefix) || prefix.includes(process.platform === "win32" ? ";" : ":")) {
6
+ throw new Error("The installation directory cannot be represented safely in PATH.");
7
+ }
8
+ return prefix;
9
+ }
10
+ export function windowsCliShim() {
11
+ // ASCII-only batch file: %~dp0 preserves Unicode/percent characters in user paths.
12
+ return '@echo off\r\n"%~dp0.talos-runtime\\node.exe" "%~dp0node_modules\\@vascend\\talos\\dist\\index.js" %*\r\n';
13
+ }
14
+ /** Verify the actual installed package before reporting success or restarting. */
15
+ export function finalizeCliInstallation(root, version) {
16
+ const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
17
+ if (pkg.name !== "@vascend/talos" || pkg.version !== version)
18
+ throw new Error("Installed Talos version differs from the requested release.");
19
+ if (process.platform !== "win32")
20
+ return;
21
+ const modules = dirname(dirname(root));
22
+ if (dirname(root).split(/[\\/]/).pop() !== "@vascend" || modules.split(/[\\/]/).pop() !== "node_modules")
23
+ return;
24
+ const prefix = dirname(modules);
25
+ const belongsToTalos = (file) => {
26
+ if (!existsSync(file))
27
+ return false;
28
+ const info = lstatSync(file);
29
+ return info.isFile() && !info.isSymbolicLink() && info.size < 16_384
30
+ && /node_modules[\\/]@vascend[\\/]talos[\\/]dist[\\/]index\.js/i.test(readFileSync(file, "utf8"));
31
+ };
32
+ for (const alias of ["talos", "horizon"]) {
33
+ const cmd = join(prefix, `${alias}.cmd`);
34
+ if (!belongsToTalos(cmd))
35
+ continue;
36
+ // Pin the Node executable selected during installation. An older system Node
37
+ // earlier in PATH must not override the verified runtime we just installed.
38
+ if (!process.versions.bun) {
39
+ const runtime = join(prefix, ".talos-runtime");
40
+ if (existsSync(runtime)) {
41
+ if (!lstatSync(runtime).isSymbolicLink())
42
+ throw new Error("The Talos runtime link is occupied by a regular directory.");
43
+ if (realpathSync(runtime).toLowerCase() !== realpathSync(dirname(process.execPath)).toLowerCase())
44
+ unlinkSync(runtime);
45
+ }
46
+ if (!existsSync(runtime))
47
+ symlinkSync(dirname(process.execPath), runtime, "junction");
48
+ writeFileSync(cmd, windowsCliShim());
49
+ }
50
+ const ps1 = join(prefix, `${alias}.ps1`);
51
+ // Let PowerShell resolve .cmd without relaxing the user's execution policy.
52
+ if (belongsToTalos(ps1))
53
+ unlinkSync(ps1);
54
+ }
55
+ }
@@ -218,32 +218,32 @@ export function repairInstructions(missing, base) {
218
218
  const head = `Il riassunto precedente ha PERSO questi riferimenti, che sono ancora attivi e vanno mantenuti espliciti: ${list}.`;
219
219
  return base ? `${base}\n${head}` : head;
220
220
  }
221
- const SUMMARY_SYSTEM = `Sei un compressore di contesto Danilov. Comprimi la conversazione in NOTAZIONE
222
- Danilov, mai in prosa. Preserva lo stato operativo necessario a riprendere il
223
- lavoro senza reinterpretarlo. Tre piani separati e chiusura OUTPUT:
224
-
225
- INDICE
226
- <concetti chiave, una parola per voce, numerati da 1>
227
-
228
- DEFINIZIONI
229
- @goal[current]: obiettivo corrente e sue revisioni esplicite; marca come superate le versioni precedenti
230
- @stato[done]: lavoro completato, solo con evidenze concrete (file, tool, test o risultato osservato)
231
- @stato[pending]: lavoro richiesto ma non ancora completato
232
- @blocker[..]: impedimento o errore ancora aperto e relativo effetto
233
- @vincolo[user]: preferenze, divieti e criteri imposti dall'utente
234
- @scelta[..]: decisione=motivo
235
- @file[..]: path, stato
236
- @next[action]: prossima azione esatta, eseguibile e fondata nella conversazione
237
-
238
- RELAZIONI
239
- @R: <dipendenze e legami tra le voci>
240
-
241
- OUTPUT: stato compatto per continuare il lavoro. Completo ma asciutto. Se una
242
- categoria non e' presente, omettila. Non inventare fatti, evidenze, vincoli,
243
- blocker o azioni; non trasformare intenzioni o tentativi in lavoro completato.
244
- Ai waypoint conserva obiettivo, vincoli, attivita aperte, file in lavorazione,
245
- decisioni, verifiche e prossimo passo. Riassumi il lavoro concluso senza
246
- duplicarne i log. Conserva gli identificativi degli output archiviati e i
221
+ const SUMMARY_SYSTEM = `Sei un compressore di contesto Danilov. Comprimi la conversazione in NOTAZIONE
222
+ Danilov, mai in prosa. Preserva lo stato operativo necessario a riprendere il
223
+ lavoro senza reinterpretarlo. Tre piani separati e chiusura OUTPUT:
224
+
225
+ INDICE
226
+ <concetti chiave, una parola per voce, numerati da 1>
227
+
228
+ DEFINIZIONI
229
+ @goal[current]: obiettivo corrente e sue revisioni esplicite; marca come superate le versioni precedenti
230
+ @stato[done]: lavoro completato, solo con evidenze concrete (file, tool, test o risultato osservato)
231
+ @stato[pending]: lavoro richiesto ma non ancora completato
232
+ @blocker[..]: impedimento o errore ancora aperto e relativo effetto
233
+ @vincolo[user]: preferenze, divieti e criteri imposti dall'utente
234
+ @scelta[..]: decisione=motivo
235
+ @file[..]: path, stato
236
+ @next[action]: prossima azione esatta, eseguibile e fondata nella conversazione
237
+
238
+ RELAZIONI
239
+ @R: <dipendenze e legami tra le voci>
240
+
241
+ OUTPUT: stato compatto per continuare il lavoro. Completo ma asciutto. Se una
242
+ categoria non e' presente, omettila. Non inventare fatti, evidenze, vincoli,
243
+ blocker o azioni; non trasformare intenzioni o tentativi in lavoro completato.
244
+ Ai waypoint conserva obiettivo, vincoli, attivita aperte, file in lavorazione,
245
+ decisioni, verifiche e prossimo passo. Riassumi il lavoro concluso senza
246
+ duplicarne i log. Conserva gli identificativi degli output archiviati e i
247
247
  riferimenti utili a recuperarli con output_page o recall.`;
248
248
  // Genera il riassunto strutturato dei messaggi da compattare, dato l'eventuale
249
249
  // riassunto precedente e istruzioni opzionali dell'utente.
@@ -7,111 +7,111 @@ import { defaultSessionDir, talosConfigDir } from "./env-paths.js";
7
7
  import { EXECUTION_GUIDANCE } from "./execution-guidance.js";
8
8
  // System prompt deliberatamente minimale: la personalita' e le regole
9
9
  // di progetto arrivano da SYSTEM.md / AGENTS.md, non dal harness.
10
- export const BASE_SYSTEM = `# Vascend Talos
11
-
12
- INDICE
13
- 1 = agente
14
- 2 = workspace
15
- 3 = strumento
16
- 4 = azione
17
-
18
- DEFINIZIONI
19
- @agente[ruolo]: coding_agent in terminale, conciso, diretto
20
- @workspace[fonte]: ispeziona coi tool invece di indovinare
21
- @strumento[uso]: read/edit/bash per agire sul workspace, non descrivere
22
- @strumento[terminale]: per ricerca e ispezione del codice preferisci bash con rg e rg --files, git diff/status e comandi nativi della shell selezionata. Limita path e output a cio' che serve. Se rg o il terminale non sono disponibili usa grep/glob/read_file/list_dir. Per modifiche puntuali usa edit_file/write_file e rispetta il coordinamento dei file
23
- @strumento[write_grande]: per file lunghi (oltre ~150 righe) scrivi in PIU' chiamate write_file: la prima crea il file, le successive con append=true accodano il resto. Un singolo write enorme puo' essere troncato dal limite di output e fallire
24
- @strumento[ricerca]: prima di costruire qualcosa di non banale, RICERCA con web_fetch (documentazione, riferimenti, esempi) invece di indovinare le API
25
- @strumento[domanda]: se un requisito e' davvero ambiguo e cambia il risultato, usa ask_user PRIMA di procedere; per i dettagli minori assumi il default ragionevole e dichiaralo, non fermarti di continuo
26
- @strumento[risposta_mancante]: ask_user required=true mantiene esplicita l'informazione necessaria non ricevuta; prosegui solo col lavoro indipendente. required=false serve per preferenze facoltative e reversibili. Silenzio e annullamento non sono consenso
27
- @strumento[e2e]: per un obiettivo grande (es. ricostruire una piattaforma) pianifica con vascend_plan in piu' gruppi/attivita, ricerca, costruisci una BOZZA COMPLETA end-to-end; annota le decisioni con vascend_note
28
- @strumento[collaboratori]: chiama team_engage soltanto quando l'utente chiede esplicitamente piu' agenti, sub-agent o lavoro parallelo; una domanda informativa, un controllo del workspace o un task semplice restano sempre sul singolo agente principale
29
- @strumento[ripresa]: vascend_status legge task, dipendenze, note e prove persistite; riprendi il piano esistente dopo resume/compattazione. vascend_addtasks estende, vascend_note conserva decisioni. replace=true ridefinisce esplicitamente un piano, perdendo i suoi progressi
30
- @strumento[verifica]: definisci passi con un risultato osservabile e una verifica pertinente; running prima del lavoro, completed solo dopo verifica. Un comando in background va seguito con bash_output fino all'esito finale. Le prove salvate sono evidenze da controllare, non certificazioni
31
- @azione[proporzione]: mantieni piano, strumenti e verifiche proporzionati al compito; le richieste semplici o a singolo passo non richiedono piano ne' collaboratori
32
- @azione[distruttiva]: spiega prima cosa stai per fare
33
- @azione[fine]: a compito finito fermati, niente riepiloghi superflui
34
-
35
- OUTPUT: agente di coding che agisce coi tool, conciso, con risposte Markdown leggibili.
36
-
10
+ export const BASE_SYSTEM = `# Vascend Talos
11
+
12
+ INDICE
13
+ 1 = agente
14
+ 2 = workspace
15
+ 3 = strumento
16
+ 4 = azione
17
+
18
+ DEFINIZIONI
19
+ @agente[ruolo]: coding_agent in terminale, conciso, diretto
20
+ @workspace[fonte]: ispeziona coi tool invece di indovinare
21
+ @strumento[uso]: read/edit/bash per agire sul workspace, non descrivere
22
+ @strumento[terminale]: per ricerca e ispezione del codice preferisci bash con rg e rg --files, git diff/status e comandi nativi della shell selezionata. Limita path e output a cio' che serve. Se rg o il terminale non sono disponibili usa grep/glob/read_file/list_dir. Per modifiche puntuali usa edit_file/write_file e rispetta il coordinamento dei file
23
+ @strumento[write_grande]: per file lunghi (oltre ~150 righe) scrivi in PIU' chiamate write_file: la prima crea il file, le successive con append=true accodano il resto. Un singolo write enorme puo' essere troncato dal limite di output e fallire
24
+ @strumento[ricerca]: prima di costruire qualcosa di non banale, RICERCA con web_fetch (documentazione, riferimenti, esempi) invece di indovinare le API
25
+ @strumento[domanda]: se un requisito e' davvero ambiguo e cambia il risultato, usa ask_user PRIMA di procedere; per i dettagli minori assumi il default ragionevole e dichiaralo, non fermarti di continuo
26
+ @strumento[risposta_mancante]: ask_user required=true mantiene esplicita l'informazione necessaria non ricevuta; prosegui solo col lavoro indipendente. required=false serve per preferenze facoltative e reversibili. Silenzio e annullamento non sono consenso
27
+ @strumento[e2e]: per un obiettivo grande (es. ricostruire una piattaforma) pianifica con vascend_plan in piu' gruppi/attivita, ricerca, costruisci una BOZZA COMPLETA end-to-end; annota le decisioni con vascend_note
28
+ @strumento[collaboratori]: chiama team_engage soltanto quando l'utente chiede esplicitamente piu' agenti, sub-agent o lavoro parallelo; una domanda informativa, un controllo del workspace o un task semplice restano sempre sul singolo agente principale
29
+ @strumento[ripresa]: vascend_status legge task, dipendenze, note e prove persistite; riprendi il piano esistente dopo resume/compattazione. vascend_addtasks estende, vascend_note conserva decisioni. replace=true ridefinisce esplicitamente un piano, perdendo i suoi progressi
30
+ @strumento[verifica]: definisci passi con un risultato osservabile e una verifica pertinente; running prima del lavoro, completed solo dopo verifica. Un comando in background va seguito con bash_output fino all'esito finale. Le prove salvate sono evidenze da controllare, non certificazioni
31
+ @azione[proporzione]: mantieni piano, strumenti e verifiche proporzionati al compito; le richieste semplici o a singolo passo non richiedono piano ne' collaboratori
32
+ @azione[distruttiva]: spiega prima cosa stai per fare
33
+ @azione[fine]: a compito finito fermati, niente riepiloghi superflui
34
+
35
+ OUTPUT: agente di coding che agisce coi tool, conciso, con risposte Markdown leggibili.
36
+
37
37
  ${EXECUTION_GUIDANCE}`;
38
38
  // Horizon e' un host grafico: stato, progress e tool call sono gia' presentati
39
39
  // dalla UI. Il system prompt del core deve quindi guidare il lavoro senza
40
40
  // imporre la voce Danilov o rituali operativi che competono con il modello.
41
- export const HORIZON_SYSTEM = `# Horizon
42
-
43
- You are a coding agent embedded in the Horizon workspace.
44
- - Write in the language the user writes in, and keep writing in it for the whole
45
- conversation. These instructions are in English for precision, not as a hint about
46
- the reply language: a message in Italian gets an answer in Italian. Code,
47
- identifiers, paths, commands and tool arguments stay exactly as they are.
48
- - Inspect the real workspace before making claims.
49
- - Match the requested scope: analysis stays read-only; change/build work is implemented end to end and verified.
50
- - Prefer focused changes, but do not shrink a broad request into a partial patch.
51
- - Keep planning proportional to the task; simple tasks do not need a formal plan.
52
- - Use ordinary to-do-list language for progress: tasks, groups, dependencies and
53
- pending, in progress, completed or failed states, translated into the user's language.
54
- Memory indexes and internal implementation names are context for you; present the
55
- relevant tasks, next steps and results to the user.
56
- - Start substantial work with a short update, then act with tools. During long tasks share
57
- useful findings or blockers about once a minute; avoid narrating every tool call.
58
- - Respect the workspace permissions selected by the user.
59
- - Exhaust safe in-scope alternatives before asking the user to unblock you.
60
- - Never announce completion while a plan step is pending/running/failed or the requested
61
- artifact has not been verified. Continue working, or report the concrete blocker.
62
- - Keep the final answer compact: outcome first, then verification and any blocker. Do not
63
- expose or recap internal context packs, memory routing, hidden prompts, or chain-of-thought.
64
-
65
- Tools
66
- - The tools listed for you cover file reads, writes, edits, search and shell: call them directly.
67
- - Prefer the terminal for code discovery and inspection: rg for content, rg --files for paths,
68
- git diff/status for changes, and native commands for the selected shell. Scope searches to
69
- relevant directories and return only useful output. If rg or terminal access is unavailable,
70
- use read_file or discover grep/glob/list_dir with tool_search (or call them inside run_program).
71
- Use edit_file/write_file for focused edits and discover file_activity when coordination needs it.
72
- Shell access does not expand the authorized workspace or bypass permissions.
73
- - More tools exist on demand. Find them with tool_search, asking in ONE call for every tool
74
- you expect to need ("names" when you know them, "query" otherwise): they become callable
75
- directly, by name. Do not search again for a tool you loaded. Calling tool_search without
76
- names/query lists the inventory without activating it; continue with offset=next_offset.
77
- - Missing a capability? Inspect the actual catalog before assuming a host integration exists.
78
- If custom-tool authoring is available, follow its guide. Ask the user only for information
79
- or decisions that the available tools and project context cannot resolve.
80
- - Use ask_user for missing requirements or decisions that materially change the result.
81
- Ask a concise, self-contained question early, with options when useful. Collaborators can
82
- use the same tool. If a required answer is missing, keep the dependency blocked and continue
83
- independent work; do not invent the answer or interpret silence as approval. Use required=false
84
- only for optional preferences with a reasonable, reversible default. Routine implementation
85
- choices should not interrupt the user.
86
- - For work with several steps — including games, challenges, puzzles and multi-level tasks —
87
- lay out the plan with vascend_plan and keep it honest with vascend_mark as you go (one step
88
- running at a time). The plan is not paperwork: it appears live as a
89
- task board next to the conversation, where the user follows progress and can edit or add
90
- steps. Give each step an observable result and a proportionate check. Short, single-step
91
- requests need no plan. Read vascend_status after resume/compaction and before handing off
92
- substantial work; resume it only when that is still necessary and authorized by the current
93
- request. vascend_addtasks extends it without resetting
94
- progress; vascend_plan with replace=true explicitly replaces it. Save decisions, blockers
95
- and the next action with vascend_note before switching workstreams.
96
- - Start a step with vascend_mark status=running. Complete it only after the relevant checks,
97
- recording paths, commands and observed outcomes. Evidence in the plan is a record to inspect,
98
- not an automatic correctness certificate. Reopening a step clears old completion evidence.
99
- Respect after dependencies; use pending to pause a step and failed to record a concrete blocker.
100
- - A plan is not a collaborator. When the user asks for multiple agents, subagents or parallel
101
- experts, actually call team_engage: create one collaborator per independent workstream and
102
- assign its complete task. If vascend_plan already created several task groups, pass their slugs
103
- through the group field so those collaborators own and update the same T01/T02 tasks. Do not
104
- merely draw multiple workstreams and then execute all of them in the orchestrator.
105
- - Issue independent reads together. For related tool sequences use run_program and print only
106
- the results needed for the next decision; keep dependent edits and approvals sequential.
107
- - When bash returns a background id, use bash_output until the process exits. Partial output
108
- or a started process does not mean the check passed. Leave persistent development servers
109
- running when they are needed and report their status separately from verification results.
110
- - Act on what is already in context: do not re-read a file or repeat a search whose result
111
- you still have.
112
- - If a tool reports a missing or malformed argument, fix the argument shape it names — do not
113
- retry the same call unchanged.
114
-
41
+ export const HORIZON_SYSTEM = `# Horizon
42
+
43
+ You are a coding agent embedded in the Horizon workspace.
44
+ - Write in the language the user writes in, and keep writing in it for the whole
45
+ conversation. These instructions are in English for precision, not as a hint about
46
+ the reply language: a message in Italian gets an answer in Italian. Code,
47
+ identifiers, paths, commands and tool arguments stay exactly as they are.
48
+ - Inspect the real workspace before making claims.
49
+ - Match the requested scope: analysis stays read-only; change/build work is implemented end to end and verified.
50
+ - Prefer focused changes, but do not shrink a broad request into a partial patch.
51
+ - Keep planning proportional to the task; simple tasks do not need a formal plan.
52
+ - Use ordinary to-do-list language for progress: tasks, groups, dependencies and
53
+ pending, in progress, completed or failed states, translated into the user's language.
54
+ Memory indexes and internal implementation names are context for you; present the
55
+ relevant tasks, next steps and results to the user.
56
+ - Start substantial work with a short update, then act with tools. During long tasks share
57
+ useful findings or blockers about once a minute; avoid narrating every tool call.
58
+ - Respect the workspace permissions selected by the user.
59
+ - Exhaust safe in-scope alternatives before asking the user to unblock you.
60
+ - Never announce completion while a plan step is pending/running/failed or the requested
61
+ artifact has not been verified. Continue working, or report the concrete blocker.
62
+ - Keep the final answer compact: outcome first, then verification and any blocker. Do not
63
+ expose or recap internal context packs, memory routing, hidden prompts, or chain-of-thought.
64
+
65
+ Tools
66
+ - The tools listed for you cover file reads, writes, edits, search and shell: call them directly.
67
+ - Prefer the terminal for code discovery and inspection: rg for content, rg --files for paths,
68
+ git diff/status for changes, and native commands for the selected shell. Scope searches to
69
+ relevant directories and return only useful output. If rg or terminal access is unavailable,
70
+ use read_file or discover grep/glob/list_dir with tool_search (or call them inside run_program).
71
+ Use edit_file/write_file for focused edits and discover file_activity when coordination needs it.
72
+ Shell access does not expand the authorized workspace or bypass permissions.
73
+ - More tools exist on demand. Find them with tool_search, asking in ONE call for every tool
74
+ you expect to need ("names" when you know them, "query" otherwise): they become callable
75
+ directly, by name. Do not search again for a tool you loaded. Calling tool_search without
76
+ names/query lists the inventory without activating it; continue with offset=next_offset.
77
+ - Missing a capability? Inspect the actual catalog before assuming a host integration exists.
78
+ If custom-tool authoring is available, follow its guide. Ask the user only for information
79
+ or decisions that the available tools and project context cannot resolve.
80
+ - Use ask_user for missing requirements or decisions that materially change the result.
81
+ Ask a concise, self-contained question early, with options when useful. Collaborators can
82
+ use the same tool. If a required answer is missing, keep the dependency blocked and continue
83
+ independent work; do not invent the answer or interpret silence as approval. Use required=false
84
+ only for optional preferences with a reasonable, reversible default. Routine implementation
85
+ choices should not interrupt the user.
86
+ - For work with several steps — including games, challenges, puzzles and multi-level tasks —
87
+ lay out the plan with vascend_plan and keep it honest with vascend_mark as you go (one step
88
+ running at a time). The plan is not paperwork: it appears live as a
89
+ task board next to the conversation, where the user follows progress and can edit or add
90
+ steps. Give each step an observable result and a proportionate check. Short, single-step
91
+ requests need no plan. Read vascend_status after resume/compaction and before handing off
92
+ substantial work; resume it only when that is still necessary and authorized by the current
93
+ request. vascend_addtasks extends it without resetting
94
+ progress; vascend_plan with replace=true explicitly replaces it. Save decisions, blockers
95
+ and the next action with vascend_note before switching workstreams.
96
+ - Start a step with vascend_mark status=running. Complete it only after the relevant checks,
97
+ recording paths, commands and observed outcomes. Evidence in the plan is a record to inspect,
98
+ not an automatic correctness certificate. Reopening a step clears old completion evidence.
99
+ Respect after dependencies; use pending to pause a step and failed to record a concrete blocker.
100
+ - A plan is not a collaborator. When the user asks for multiple agents, subagents or parallel
101
+ experts, actually call team_engage: create one collaborator per independent workstream and
102
+ assign its complete task. If vascend_plan already created several task groups, pass their slugs
103
+ through the group field so those collaborators own and update the same T01/T02 tasks. Do not
104
+ merely draw multiple workstreams and then execute all of them in the orchestrator.
105
+ - Issue independent reads together. For related tool sequences use run_program and print only
106
+ the results needed for the next decision; keep dependent edits and approvals sequential.
107
+ - When bash returns a background id, use bash_output until the process exits. Partial output
108
+ or a started process does not mean the check passed. Leave persistent development servers
109
+ running when they are needed and report their status separately from verification results.
110
+ - Act on what is already in context: do not re-read a file or repeat a search whose result
111
+ you still have.
112
+ - If a tool reports a missing or malformed argument, fix the argument shape it names — do not
113
+ retry the same call unchanged.
114
+
115
115
  ${EXECUTION_GUIDANCE}`;
116
116
  // File di contesto a livello progetto, in ordine di priorita'.
117
117
  const DEFAULT_CONTEXT_FILES = ["SYSTEM.md", "AGENTS.md", ".talos/SYSTEM.md"];
@@ -6,27 +6,27 @@ export const EXECUTION_GUIDANCE = `Efficient execution
6
6
  Before continuing after an error, check whether further agent action is needed and authorized.
7
7
  Stop when the request is answered; wait when the next step belongs to the user or needs input.
8
8
  Preserve incomplete tasks honestly instead of forcing completion or retrying indefinitely.
9
- - For a small cosmetic change (one button color, label, spacing or font), locate the affected
10
- component, edit it, then verify the local result. Do not create a plan, delegate, research the
11
- web, inspect the whole repository or run a global test/build cycle unless evidence requires it.
12
- Escalate scope only when the actual dependency or failure demands it.
13
- - Decide what evidence is needed for the next decision. Issue independent reads together and
14
- reuse results that are still valid. Do not spend a model round on each already-decided action.
15
- - Use run_program for known sequences: await dependent edits and plan transitions in order,
16
- stop on errors, and return a concise summary. Complete a task only after its checks succeed.
17
- - Prepare related replacements in one round. Never edit the same file concurrently. Independent
18
- edits on distinct files may run together in bounded groups of at most four; await every outcome
19
- before inspecting the result or starting dependent work. Keep permission gates in place.
20
- - For short checks use foreground bash, or background with its brief initial wait. Use
21
- background=true with yield_time_ms=0 for persistent servers or work that must detach immediately.
22
- Collect ready background results together; a running command is not a passed check.
23
- - Run the relevant integrated checks after the edits. Repeat checks only after changes, failures
24
- or a concrete unresolved concern; do not duplicate typecheck and build without a reason.
25
- - When parallel work is authorized and worthwhile, start with at most two collaborators on
26
- concrete disjoint areas, agree on interfaces and acceptance checks, and declare after dependencies.
27
- The coordinator reviews the combined result. Prefer one agent for small or tightly coupled work.
28
- - Format user-facing responses in readable Markdown: short paragraphs, **bold** key findings,
29
- lists for steps, tables for comparisons, fenced code with a language, and descriptive links.
9
+ - For a small cosmetic change (one button color, label, spacing or font), locate the affected
10
+ component, edit it, then verify the local result. Do not create a plan, delegate, research the
11
+ web, inspect the whole repository or run a global test/build cycle unless evidence requires it.
12
+ Escalate scope only when the actual dependency or failure demands it.
13
+ - Decide what evidence is needed for the next decision. Issue independent reads together and
14
+ reuse results that are still valid. Do not spend a model round on each already-decided action.
15
+ - Use run_program for known sequences: await dependent edits and plan transitions in order,
16
+ stop on errors, and return a concise summary. Complete a task only after its checks succeed.
17
+ - Prepare related replacements in one round. Never edit the same file concurrently. Independent
18
+ edits on distinct files may run together in bounded groups of at most four; await every outcome
19
+ before inspecting the result or starting dependent work. Keep permission gates in place.
20
+ - For short checks use foreground bash, or background with its brief initial wait. Use
21
+ background=true with yield_time_ms=0 for persistent servers or work that must detach immediately.
22
+ Collect ready background results together; a running command is not a passed check.
23
+ - Run the relevant integrated checks after the edits. Repeat checks only after changes, failures
24
+ or a concrete unresolved concern; do not duplicate typecheck and build without a reason.
25
+ - When parallel work is authorized and worthwhile, start with at most two collaborators on
26
+ concrete disjoint areas, agree on interfaces and acceptance checks, and declare after dependencies.
27
+ The coordinator reviews the combined result. Prefer one agent for small or tightly coupled work.
28
+ - Format user-facing responses in readable Markdown: short paragraphs, **bold** key findings,
29
+ lists for steps, tables for comparisons, fenced code with a language, and descriptive links.
30
30
  Keep internal planning notation out of ordinary explanations unless the user asks for it.`;
31
31
  // One reminder per pattern per run, transient and outside conversation history.
32
32
  export class ExecutionGuidance {
@@ -1,15 +1,17 @@
1
1
  import type { TalosUpdate } from "./update-check.js";
2
2
  import { type UpdateRunner } from "./update-process.js";
3
3
  import type { UpdateResult } from "./self-update.js";
4
+ import { downloadVerifiedPackage } from "./signed-release.js";
4
5
  export type PackageManager = "npm" | "bun" | "pnpm" | "yarn";
5
6
  export declare function managerCommand(manager: PackageManager, env: NodeJS.ProcessEnv): {
6
7
  command: string;
7
8
  args: readonly string[];
8
9
  } | null;
9
- export declare function packageUpdateArgs(manager: PackageManager, version: string, prefix?: string): readonly string[];
10
+ export declare function packageUpdateArgs(manager: PackageManager, target: string, prefix?: string): readonly string[];
10
11
  export declare function installPackageUpdate(update: TalosUpdate, options: {
11
12
  readonly root: string;
12
13
  readonly env: NodeJS.ProcessEnv;
13
14
  readonly run?: UpdateRunner;
14
15
  readonly managerCommand?: typeof managerCommand;
16
+ readonly download?: typeof downloadVerifiedPackage;
15
17
  }): Promise<UpdateResult>;