@telora/daemon 0.17.78 → 0.17.82

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 (48) hide show
  1. package/README.md +9 -5
  2. package/build-info.json +4 -3
  3. package/dist/auto-update.d.ts +8 -4
  4. package/dist/auto-update.d.ts.map +1 -1
  5. package/dist/auto-update.js +9 -5
  6. package/dist/auto-update.js.map +1 -1
  7. package/dist/cli/backfill-frt-prose.d.ts +34 -0
  8. package/dist/cli/backfill-frt-prose.d.ts.map +1 -1
  9. package/dist/cli/backfill-frt-prose.js +53 -4
  10. package/dist/cli/backfill-frt-prose.js.map +1 -1
  11. package/dist/cli/connect.d.ts +25 -15
  12. package/dist/cli/connect.d.ts.map +1 -1
  13. package/dist/cli/connect.js +76 -20
  14. package/dist/cli/connect.js.map +1 -1
  15. package/dist/index.js +14 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/loop-engine.d.ts.map +1 -1
  18. package/dist/loop-engine.js +12 -3
  19. package/dist/loop-engine.js.map +1 -1
  20. package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
  21. package/dist/prompt-sections/execution-sections.js +19 -1
  22. package/dist/prompt-sections/execution-sections.js.map +1 -1
  23. package/dist/prompts/starter-prompt.d.ts +1 -1
  24. package/dist/prompts/starter-prompt.d.ts.map +1 -1
  25. package/dist/prompts/starter-prompt.js +1 -1
  26. package/dist/queries/focuses.d.ts +39 -0
  27. package/dist/queries/focuses.d.ts.map +1 -1
  28. package/dist/queries/focuses.js +87 -0
  29. package/dist/queries/focuses.js.map +1 -1
  30. package/dist/queries/index.d.ts +2 -2
  31. package/dist/queries/index.d.ts.map +1 -1
  32. package/dist/queries/index.js +1 -1
  33. package/dist/queries/index.js.map +1 -1
  34. package/dist/retire-aware-restatement.d.ts +26 -0
  35. package/dist/retire-aware-restatement.d.ts.map +1 -1
  36. package/dist/retire-aware-restatement.js +98 -17
  37. package/dist/retire-aware-restatement.js.map +1 -1
  38. package/dist/self-update.d.ts +21 -0
  39. package/dist/self-update.d.ts.map +1 -1
  40. package/dist/self-update.js +56 -4
  41. package/dist/self-update.js.map +1 -1
  42. package/dist/unified-init.d.ts.map +1 -1
  43. package/dist/unified-init.js +40 -1
  44. package/dist/unified-init.js.map +1 -1
  45. package/dist/unified-shell.d.ts.map +1 -1
  46. package/dist/unified-shell.js +11 -1
  47. package/dist/unified-shell.js.map +1 -1
  48. package/package.json +3 -3
package/README.md CHANGED
@@ -21,7 +21,7 @@ For long-running daemon hosts, install globally so `telora-daemon update` and th
21
21
  npm install -g @telora/daemon
22
22
  ```
23
23
 
24
- `npx`-based runs are supported for one-shot setup and short-lived experiments, but the npx cache makes the running binary effectively immutable: `npm install -g` writes to the global prefix while the process keeps loading the cached copy. In npx mode, auto-update is disabled, and `telora-daemon update` clears the cache and asks you to re-launch.
24
+ `npx` is supported only for one-shot bootstrap commands (`init`, `connect`, `check-update`). The long-running daemon (`run`/`start`) **refuses** to run from an npx cache and exits with the global-install instruction: the cache makes the running binary effectively immutable -- `npm install -g` writes to the global prefix while the process keeps loading the cached copy, so a daemon launched via npx could never self-update. Install on disk (`npm install -g @telora/daemon`) and start `telora-daemon run`. (The refusal is overridable for false positives via `TELORA_ALLOW_NPX_RUN=1`, but a non-updating daemon is not recommended.)
25
25
 
26
26
  > **Note:** The `.mcp.json` file for Claude Code integration is auto-generated by `telora-daemon init`.
27
27
 
@@ -77,11 +77,15 @@ telora-daemon run
77
77
  ### Option 3: One-shot via npx
78
78
 
79
79
  ```bash
80
- npx -p @telora/daemon telora-daemon init # interactive setup
81
- npx -p @telora/daemon telora-daemon run # start the daemon
80
+ npx -p @telora/daemon telora-daemon init # interactive setup (one-shot)
81
+ npm install -g @telora/daemon # then install on disk
82
+ telora-daemon run # start the daemon
82
83
  ```
83
84
 
84
- This is fine for trying things out, but use `npm install -g @telora/daemon` for any host you expect to leave running -- otherwise the daemon won't be able to update itself.
85
+ npx is fine for the one-shot `init`, but the long-running daemon refuses to run
86
+ from an npx cache -- it can't update itself there. Install globally with
87
+ `npm install -g @telora/daemon` and start `telora-daemon run` for any host you
88
+ expect to leave running.
85
89
 
86
90
  ## Updating
87
91
 
@@ -92,7 +96,7 @@ telora-daemon update # stop, install latest, apply migrations, restart
92
96
 
93
97
  When installed globally or from a git checkout, the daemon also self-updates on a periodic timer (configurable via `autoUpdate.intervalMs` in `.telora/daemon.json`, or disable with `--no-auto-update`).
94
98
 
95
- In `npx`-cache mode, `telora-daemon update` clears the cache and prints the command to re-launch from a fresh fetch -- automatic restart isn't possible because the running process is loading from a directory that no longer exists.
99
+ The long-running daemon refuses to run from an npx cache, so there is no auto-updating npx mode. If you reach an npx-cache daemon via the `TELORA_ALLOW_NPX_RUN` override, `telora-daemon update` cannot restart it in place (the running process loads from a cache it just cleared); install on disk instead -- `npm install -g @telora/daemon`, then `telora-daemon run`.
96
100
 
97
101
  ## Configuration
98
102
 
package/build-info.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "275b69ee",
3
- "builtAt": "2026-06-15T12:12:30.859Z",
2
+ "commitSha": "512919ac",
3
+ "builtAt": "2026-06-15T16:15:31.546Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -633,6 +633,7 @@
633
633
  "20260614222838_product_focuses_answer_rearm.sql",
634
634
  "20260614231203_product_requests_reopen_audit.sql",
635
635
  "20260615103408_add_frt_statement_drafted.sql",
636
- "20260615105344_add_verify_classification.sql"
636
+ "20260615105344_add_verify_classification.sql",
637
+ "20260615132122_add_work_facing_to_org_nodes.sql"
637
638
  ]
638
639
  }
@@ -96,11 +96,15 @@ export declare function createUpdateController(deps: AutoUpdateDeps): UpdateCont
96
96
  /**
97
97
  * Start the safe-seam auto-update loop.
98
98
  *
99
- * Disabled entirely when running from an ephemeral npx cache: `npm install -g`
100
- * writes to the global prefix, but the running process keeps loading from
101
- * `~/.npm/_npx/<hash>/`, so a "successful" install would not take effect.
102
- *
103
99
  * Returns a cleanup function that stops the timer.
100
+ *
101
+ * NOTE: the npx-cache branch below is now a DEAD PATH for the normal run/start
102
+ * flow. The runtime refusal guard (`isNpxRunMode` in unified-shell.ts /
103
+ * index.ts) exits the process before any engine -- or this loop -- starts, so a
104
+ * daemon that reaches `startAutoUpdateLoop` is already on a stable on-disk
105
+ * install. The check is retained as cheap defense-in-depth (e.g. if the guard
106
+ * is overridden via TELORA_ALLOW_NPX_RUN, auto-update still correctly disables
107
+ * itself rather than spinning an install that can never take effect).
104
108
  */
105
109
  export declare function startAutoUpdateLoop(opts: AutoUpdateOptions): () => void;
106
110
  //# sourceMappingURL=auto-update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1B;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CA4G7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CA4BvE"}
1
+ {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1B;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CA4G7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CA4BvE"}
@@ -147,16 +147,20 @@ export function createUpdateController(deps) {
147
147
  /**
148
148
  * Start the safe-seam auto-update loop.
149
149
  *
150
- * Disabled entirely when running from an ephemeral npx cache: `npm install -g`
151
- * writes to the global prefix, but the running process keeps loading from
152
- * `~/.npm/_npx/<hash>/`, so a "successful" install would not take effect.
153
- *
154
150
  * Returns a cleanup function that stops the timer.
151
+ *
152
+ * NOTE: the npx-cache branch below is now a DEAD PATH for the normal run/start
153
+ * flow. The runtime refusal guard (`isNpxRunMode` in unified-shell.ts /
154
+ * index.ts) exits the process before any engine -- or this loop -- starts, so a
155
+ * daemon that reaches `startAutoUpdateLoop` is already on a stable on-disk
156
+ * install. The check is retained as cheap defense-in-depth (e.g. if the guard
157
+ * is overridden via TELORA_ALLOW_NPX_RUN, auto-update still correctly disables
158
+ * itself rather than spinning an install that can never take effect).
155
159
  */
156
160
  export function startAutoUpdateLoop(opts) {
157
161
  const { intervalMs = DEFAULT_SAMPLE_INTERVAL_MS } = opts;
158
162
  if (detectInstallMode() === 'npx') {
159
- console.log('[auto-update] Disabled: running from npx cache. Re-run via `npx -p @telora/daemon@latest telora-daemon` or install globally with `npm install -g @telora/daemon` to enable auto-update.');
163
+ console.log('[auto-update] Disabled: running from npx cache. Install globally with `npm install -g @telora/daemon` and start `telora-daemon run` to enable auto-update.');
160
164
  return () => { };
161
165
  }
162
166
  let stopped = false;
@@ -1 +1 @@
1
- {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,19 @@
28
28
  * injection's flipped UDEs from durable `reality_tree_node_history` (the
29
29
  * `targets` edges are deleted at verify) and authors any missing `frt_statement`.
30
30
  *
31
+ * PROVENANCE-FREE HISTORICAL TAIL. Some flipped DEs pre-date instrumentation:
32
+ * they have NEITHER a `reality_tree_node_history` row NOR surviving `targets`
33
+ * edges, so the precise per-node history path above finds no provenance and
34
+ * drops them -- their `frt_statement` stays blank forever (present-tense UDE
35
+ * text in the Ship Log / FRT canvas). This command enables the helper's opt-in
36
+ * PROVENANCE-FREE FALLBACK (`includeProvenanceFreeFallback: true`) on BOTH the
37
+ * dry-run and write paths so those blank flipped DEs are also authored,
38
+ * conditioned on the TREE's verified/retired injection statements (the same
39
+ * list for every fallback node on the tree). The fallback is OFF by default
40
+ * everywhere else (the active eager loop + departed-focus catch-up never set
41
+ * it), so it can never interfere with going-forward per-injection authoring;
42
+ * the precise per-node history path still wins whenever provenance exists.
43
+ *
31
44
  * Idempotent: the helper authors only nodes whose `frt_statement` is still blank
32
45
  * and whose base statement is still the raw pre-flip UDE text. Re-runs are safe
33
46
  * and converge to a no-op.
@@ -61,6 +74,27 @@
61
74
  * that its node was in the resolved cascade (flipped or `resolved===true`) for
62
75
  * that tree -- surviving UDEs are intentionally left untouched.
63
76
  *
77
+ * PROVENANCE-FREE TAIL -- POST-DEPLOY OPERATOR VERIFICATION (NOT an automated
78
+ * check; the test suite cannot reach prod data). After this change deploys,
79
+ * an OPERATOR performs the following against PROD by hand:
80
+ *
81
+ * 1. Run `telora-daemon backfill-frt-prose --dry-run` against the prod config.
82
+ * With the provenance-free fallback now enabled, the dry-run should
83
+ * enumerate the historical-tail flipped DEs that the per-node history path
84
+ * previously skipped -- expect the count of blank cascade DEs across
85
+ * completed focuses (~66 at time of writing) to be the bulk of what is
86
+ * now reported as `[would author]`, trending toward 0 once authored.
87
+ * 2. Once the preview looks right, run the real write:
88
+ * `telora-daemon backfill-frt-prose`.
89
+ * 3. Spot-check ONE repaired completed focus: open its Ship Log AND its FRT
90
+ * canvas and confirm the previously present-tense flipped UDE entries now
91
+ * read as future-state desired-effect prose. Re-run `--dry-run` to confirm
92
+ * it converges to ~0 remaining candidates (idempotent no-op on re-run).
93
+ *
94
+ * This is a one-time post-deploy operator observation step, deliberately NOT
95
+ * wired into CI -- it depends on live prod completed-focus data that the local
96
+ * DB does not carry.
97
+ *
64
98
  * @module cli/backfill-frt-prose
65
99
  */
66
100
  import { loadConfig } from '../config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"backfill-frt-prose.d.ts","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAA6B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,kCAAkC,IAAI,yCAAyC,EAC/E,yCAAyC,IAAI,gDAAgD,EAC9F,MAAM,gCAAgC,CAAC;AAgBxC,MAAM,WAAW,0BAA0B;IACzC,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,6FAA6F;IAC7F,kCAAkC,CAAC,EAAE,OAAO,yCAAyC,CAAC;IACtF,iGAAiG;IACjG,yCAAyC,CAAC,EAAE,OAAO,gDAAgD,CAAC;IACpG,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IAC/B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,gBAAgB,EAAE,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,EAChC,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,uBAAuB,CAAC,CAqIlC"}
1
+ {"version":3,"file":"backfill-frt-prose.d.ts","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AAEH,OAAO,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAA6B,MAAM,sBAAsB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,kCAAkC,IAAI,yCAAyC,EAC/E,yCAAyC,IAAI,gDAAgD,EAC9F,MAAM,gCAAgC,CAAC;AAYxC,MAAM,WAAW,0BAA0B;IACzC,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,sEAAsE;IACtE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,6FAA6F;IAC7F,kCAAkC,CAAC,EAAE,OAAO,yCAAyC,CAAC;IACtF,iGAAiG;IACjG,yCAAyC,CAAC,EAAE,OAAO,gDAAgD,CAAC;IACpG,iFAAiF;IACjF,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IAC/B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IACnC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,gBAAgB,EAAE,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAqBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,EAChC,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,uBAAuB,CAAC,CAqJlC"}
@@ -28,6 +28,19 @@
28
28
  * injection's flipped UDEs from durable `reality_tree_node_history` (the
29
29
  * `targets` edges are deleted at verify) and authors any missing `frt_statement`.
30
30
  *
31
+ * PROVENANCE-FREE HISTORICAL TAIL. Some flipped DEs pre-date instrumentation:
32
+ * they have NEITHER a `reality_tree_node_history` row NOR surviving `targets`
33
+ * edges, so the precise per-node history path above finds no provenance and
34
+ * drops them -- their `frt_statement` stays blank forever (present-tense UDE
35
+ * text in the Ship Log / FRT canvas). This command enables the helper's opt-in
36
+ * PROVENANCE-FREE FALLBACK (`includeProvenanceFreeFallback: true`) on BOTH the
37
+ * dry-run and write paths so those blank flipped DEs are also authored,
38
+ * conditioned on the TREE's verified/retired injection statements (the same
39
+ * list for every fallback node on the tree). The fallback is OFF by default
40
+ * everywhere else (the active eager loop + departed-focus catch-up never set
41
+ * it), so it can never interfere with going-forward per-injection authoring;
42
+ * the precise per-node history path still wins whenever provenance exists.
43
+ *
31
44
  * Idempotent: the helper authors only nodes whose `frt_statement` is still blank
32
45
  * and whose base statement is still the raw pre-flip UDE text. Re-runs are safe
33
46
  * and converge to a no-op.
@@ -61,10 +74,32 @@
61
74
  * that its node was in the resolved cascade (flipped or `resolved===true`) for
62
75
  * that tree -- surviving UDEs are intentionally left untouched.
63
76
  *
77
+ * PROVENANCE-FREE TAIL -- POST-DEPLOY OPERATOR VERIFICATION (NOT an automated
78
+ * check; the test suite cannot reach prod data). After this change deploys,
79
+ * an OPERATOR performs the following against PROD by hand:
80
+ *
81
+ * 1. Run `telora-daemon backfill-frt-prose --dry-run` against the prod config.
82
+ * With the provenance-free fallback now enabled, the dry-run should
83
+ * enumerate the historical-tail flipped DEs that the per-node history path
84
+ * previously skipped -- expect the count of blank cascade DEs across
85
+ * completed focuses (~66 at time of writing) to be the bulk of what is
86
+ * now reported as `[would author]`, trending toward 0 once authored.
87
+ * 2. Once the preview looks right, run the real write:
88
+ * `telora-daemon backfill-frt-prose`.
89
+ * 3. Spot-check ONE repaired completed focus: open its Ship Log AND its FRT
90
+ * canvas and confirm the previously present-tense flipped UDE entries now
91
+ * read as future-state desired-effect prose. Re-run `--dry-run` to confirm
92
+ * it converges to ~0 remaining candidates (idempotent no-op on re-run).
93
+ *
94
+ * This is a one-time post-deploy operator observation step, deliberately NOT
95
+ * wired into CI -- it depends on live prod completed-focus data that the local
96
+ * DB does not carry.
97
+ *
64
98
  * @module cli/backfill-frt-prose
65
99
  */
66
100
  import { loadConfig, configForProduct } from '../config.js';
67
101
  import { initSupabase, callApi as defaultCallApi } from '../queries/shared.js';
102
+ import { scanAllFocuses } from '../queries/focuses.js';
68
103
  import { authorRetiredInjectionRestatements as defaultAuthorRetiredInjectionRestatements, findRetiredInjectionRestatementCandidates as defaultFindRetiredInjectionRestatementCandidates, } from '../retire-aware-restatement.js';
69
104
  /**
70
105
  * Resolve the set of products to scan: the single `--product` when given (must
@@ -126,11 +161,19 @@ export async function runBackfillFrtProse(opts, deps = {}) {
126
161
  initApi(pc);
127
162
  let focuses;
128
163
  try {
129
- const resp = await callApi('focus_list', {
164
+ // Page through ALL completed focuses -- a single unpaged call truncates at
165
+ // the focus_list default limit (50), which is the defect this backfill
166
+ // fixes (most verified-injection trees live past the first page).
167
+ const scan = await scanAllFocuses({
130
168
  productId: product.id,
131
169
  status: 'complete',
170
+ callApi,
132
171
  });
133
- focuses = resp.focuses ?? [];
172
+ focuses = scan.focuses;
173
+ if (scan.hasMore) {
174
+ out(` [warn] focus_list scan for product ${product.id} hit the page cap ` +
175
+ `(${focuses.length} of ${scan.total}); some completed focuses may be unscanned.\n`);
176
+ }
134
177
  }
135
178
  catch (err) {
136
179
  out(` [skip] focus_list failed for product ${product.id}: ${err.message}\n`);
@@ -158,7 +201,10 @@ export async function runBackfillFrtProse(opts, deps = {}) {
158
201
  // writes.
159
202
  let candidates;
160
203
  try {
161
- candidates = await findCandidates(tree.id, { callApi });
204
+ candidates = await findCandidates(tree.id, {
205
+ callApi,
206
+ includeProvenanceFreeFallback: true,
207
+ });
162
208
  }
163
209
  catch (err) {
164
210
  out(` [skip] candidate scan failed for tree ${tree.id}: ${err.message}\n`);
@@ -182,7 +228,10 @@ export async function runBackfillFrtProse(opts, deps = {}) {
182
228
  }
183
229
  // WRITE: idempotent, best-effort per node inside the retire-aware helper.
184
230
  try {
185
- const res = await authorRetired(tree.id, { callApi });
231
+ const res = await authorRetired(tree.id, {
232
+ callApi,
233
+ includeProvenanceFreeFallback: true,
234
+ });
186
235
  if (res.authored.length + res.skipped.length > 0)
187
236
  summary.treesWithCandidates += 1;
188
237
  summary.authored += res.authored.length;
@@ -1 +1 @@
1
- {"version":3,"file":"backfill-frt-prose.js","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backfill-frt-prose.js","sourceRoot":"","sources":["../../src/cli/backfill-frt-prose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EACL,kCAAkC,IAAI,yCAAyC,EAC/E,yCAAyC,IAAI,gDAAgD,GAC9F,MAAM,gCAAgC,CAAC;AAmDxC;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAoB,EAAE,SAA6B;IAC1E,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,aAAa,SAAS,wCAAwC,MAAM,CAAC,QAAQ;iBAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChB,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAC3B,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAgC,EAChC,OAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,aAAa,GACjB,IAAI,CAAC,kCAAkC,IAAI,yCAAyC,CAAC;IACvF,MAAM,cAAc,GAClB,IAAI,CAAC,yCAAyC;QAC9C,gDAAgD,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;IACtB,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,OAAO,GAA4B;QACvC,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,mBAAmB,EAAE,CAAC;QACtB,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,GAAG,CACD,uBAAuB,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,YAAY,SAAS,QAAQ,CAAC,MAAM,eAAe,CAC5G,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;QAC7B,4EAA4E;QAC5E,0EAA0E;QAC1E,2BAA2B;QAC3B,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,OAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,2EAA2E;YAC3E,uEAAuE;YACvE,kEAAkE;YAClE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAgB;gBAC/C,SAAS,EAAE,OAAO,CAAC,EAAE;gBACrB,MAAM,EAAE,UAAU;gBAClB,OAAO;aACR,CAAC,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,GAAG,CACD,wCAAwC,OAAO,CAAC,EAAE,oBAAoB;oBACpE,IAAI,OAAO,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,+CAA+C,CACrF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CACD,0CAA0C,OAAO,CAAC,EAAE,KAAM,GAAa,CAAC,OAAO,IAAI,CACpF,CAAC;YACF,SAAS;QACX,CAAC;QAED,GAAG,CAAC,aAAa,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAC;QAExE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;YAE5B,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAA0B,mBAAmB,EAAE;oBACvE,OAAO,EAAE,KAAK,CAAC,EAAE;iBAClB,CAAC,CAAC;gBACH,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAClE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CACD,iDAAiD,KAAK,CAAC,EAAE,KAAM,GAAa,CAAC,OAAO,IAAI,CACzF,CAAC;gBACF,SAAS;YACX,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;gBAE1B,IAAI,MAAM,EAAE,CAAC;oBACX,0EAA0E;oBAC1E,0EAA0E;oBAC1E,UAAU;oBACV,IAAI,UAAU,CAAC;oBACf,IAAI,CAAC;wBACH,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE;4BACzC,OAAO;4BACP,6BAA6B,EAAE,IAAI;yBACpC,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,GAAG,CACD,6CAA6C,IAAI,CAAC,EAAE,KAAM,GAAa,CAAC,OAAO,IAAI,CACpF,CAAC;wBACF,SAAS;oBACX,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;wBAAE,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC;oBAC5D,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;wBAC3B,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;4BAC5B,OAAO,EAAE,KAAK,CAAC,EAAE;4BACjB,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,SAAS,EAAE,CAAC,CAAC,SAAS;yBACvB,CAAC,CAAC;wBACH,GAAG,CACD,4BAA4B,KAAK,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,SAAS,IAAI,CAC5F,CAAC;oBACJ,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC5B,GAAG,CAAC,yBAAyB,IAAI,CAAC,EAAE,4CAA4C,CAAC,CAAC;oBACpF,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,0EAA0E;gBAC1E,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE;wBACvC,OAAO;wBACP,6BAA6B,EAAE,IAAI;qBACpC,CAAC,CAAC;oBACH,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;wBAAE,OAAO,CAAC,mBAAmB,IAAI,CAAC,CAAC;oBACnF,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACxC,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;oBACtC,GAAG,CACD,wBAAwB,KAAK,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,aAAa,GAAG,CAAC,QAAQ,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CACnH,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CACD,iEAAiE,IAAI,CAAC,EAAE,KAAM,GAAa,CAAC,OAAO,IAAI,CACxG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CACD,gDAAgD,OAAO,CAAC,eAAe,YAAY,OAAO,CAAC,cAAc,wBAAwB,OAAO,CAAC,mBAAmB,gBAAgB,OAAO,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAChN,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,GAAG,CACD,wCAAwC,OAAO,CAAC,eAAe,YAAY,OAAO,CAAC,cAAc,wBAAwB,OAAO,CAAC,mBAAmB,aAAa,OAAO,CAAC,QAAQ,YAAY,OAAO,CAAC,OAAO,IAAI,CACjN,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -2,12 +2,14 @@
2
2
  * `telora-daemon connect <token>` subcommand.
3
3
  *
4
4
  * Redeems a Telora connect token, writes the daemon config + a committable
5
- * `.mcp.json`, then starts the daemon in the background via `npx -p
6
- * @telora/daemon@latest telora-daemon run`. Designed to be invoked at the
7
- * tail end of the bash bootstrap (`scripts/connect.sh`) so the user lands
8
- * in `claude` with everything wired -- and importantly leaves no node-side
9
- * footprint (no package.json, no node_modules, no dev dependency) in the
10
- * user's repo. Rust/Python/Go/empty repos stay untouched.
5
+ * `.mcp.json`, then starts the daemon in the background from a stable on-disk
6
+ * install (a global `telora-daemon`, installed best-effort if absent). It does
7
+ * NOT route the long-running daemon through `npx` -- an npx-cache daemon cannot
8
+ * self-update. Designed to be invoked at the tail end of the bash bootstrap
9
+ * (`scripts/connect.sh`) so the user lands in `claude` with everything wired.
10
+ * A global install leaves no node-side footprint (no package.json, no
11
+ * node_modules, no dev dependency) in the user's repo, so Rust/Python/Go/empty
12
+ * repos stay untouched.
11
13
  */
12
14
  import { type AgentsMdConnectionInvariant } from '../templates/agents-md.js';
13
15
  import { type CodexLocalCoords } from './codex-provision.js';
@@ -160,20 +162,28 @@ export declare function writeStarterPromptArtifacts(repoPath: string, io: Connec
160
162
  */
161
163
  export declare function ensureGitignoreEntries(repoPath: string, io: ConnectIO): void;
162
164
  /**
163
- * Spawn the daemon as a detached background process via `npx`.
165
+ * Start the daemon as a detached background process from a stable on-disk
166
+ * install -- never from an ephemeral npx cache (which cannot self-update).
164
167
  *
165
- * Deliberately uses `npx -p @telora/daemon@latest telora-daemon run` (and
166
- * NOT a node_modules path) so the connect flow does not require a
167
- * `package.json` or `node_modules/` in the user's repo. This keeps the
168
- * connect flow language-agnostic: a Rust/Python/Go/empty repo never gets
169
- * a Node footprint.
168
+ * Resolution order:
169
+ * 1. Use an existing on-disk binary (global install on PATH, or a repo-local
170
+ * `node_modules/.bin/telora-daemon` dev dependency).
171
+ * 2. If none exists, run `npm install -g @telora/daemon` best-effort. Global
172
+ * install keeps the connect flow language-agnostic -- it leaves no
173
+ * `package.json`/`node_modules`/dev-dependency footprint in the user's
174
+ * repo (Rust/Python/Go/empty repos stay untouched).
175
+ * 3. Spawn the resolved on-disk `telora-daemon run`.
176
+ *
177
+ * On install failure this throws (the caller surfaces the manual
178
+ * `npm install -g @telora/daemon` instruction and skips auto-start); it does
179
+ * NOT fall back to npx, because an npx-run daemon is exactly what this focus
180
+ * retires.
170
181
  *
171
182
  * Bin name is explicit (`telora-daemon`) because the package's bins are
172
183
  * `telora-daemon` and `telora-daemon-wrapper`; neither matches the unscoped
173
- * package name `daemon`, so `npx @telora/daemon` cannot resolve a bin and
174
- * aborts with a misleading error (lesson from commit 0368f4b6).
184
+ * package name `daemon`.
175
185
  */
176
- export declare function startDaemonViaNpx(repoPath: string): number;
186
+ export declare function startDaemonOnDisk(repoPath: string): number;
177
187
  /**
178
188
  * Look up an existing product entry in `~/.telora/daemon.json` whose
179
189
  * repoPath matches the given path. Returns the product id when found,
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/cli/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/cli/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAyBH,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,4DAA4D;IAC5D,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAS9E;AAED,MAAM,WAAW,SAAS;IACxB,wDAAwD;IACxD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,wDAAwD;IACxD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,2DAA2D;IAC3D,KAAK,EAAE,OAAO,KAAK,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjD,eAAO,MAAM,wBAAwB,EAAE,eAA0B,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,gDAAgD;IAChD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yEAAyE;IACzE,iBAAiB,EAAE,OAAO,CAAC;IAC3B;kEAC8D;IAC9D,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAuB/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAUD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CA4CT;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,GACZ,MAAM,GAAG,IAAI,CAsBf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAiB5E;AAiCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+B1D;AAiCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,EAAE,EAAE,SAAS,GACZ,IAAI,CAiDN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,SAAS,GACZ,IAAI,CA0CN;AAQD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAaT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,SAAS,EACb,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,IAAI,CA8DN;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CA0BhF;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAQ9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,SAAS,CAAC;CACf,GAAG,OAAO,CA0BV;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,SAAS,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAwET;AAWD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAY1E;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAmO7E"}
@@ -2,15 +2,17 @@
2
2
  * `telora-daemon connect <token>` subcommand.
3
3
  *
4
4
  * Redeems a Telora connect token, writes the daemon config + a committable
5
- * `.mcp.json`, then starts the daemon in the background via `npx -p
6
- * @telora/daemon@latest telora-daemon run`. Designed to be invoked at the
7
- * tail end of the bash bootstrap (`scripts/connect.sh`) so the user lands
8
- * in `claude` with everything wired -- and importantly leaves no node-side
9
- * footprint (no package.json, no node_modules, no dev dependency) in the
10
- * user's repo. Rust/Python/Go/empty repos stay untouched.
5
+ * `.mcp.json`, then starts the daemon in the background from a stable on-disk
6
+ * install (a global `telora-daemon`, installed best-effort if absent). It does
7
+ * NOT route the long-running daemon through `npx` -- an npx-cache daemon cannot
8
+ * self-update. Designed to be invoked at the tail end of the bash bootstrap
9
+ * (`scripts/connect.sh`) so the user lands in `claude` with everything wired.
10
+ * A global install leaves no node-side footprint (no package.json, no
11
+ * node_modules, no dev dependency) in the user's repo, so Rust/Python/Go/empty
12
+ * repos stay untouched.
11
13
  */
12
14
  import { closeSync, existsSync, mkdirSync, openSync, readFileSync, writeFileSync, } from 'node:fs';
13
- import { spawn, spawnSync } from 'node:child_process';
15
+ import { spawn, spawnSync, execFileSync } from 'node:child_process';
14
16
  import { resolve, delimiter } from 'node:path';
15
17
  import { homedir } from 'node:os';
16
18
  import { isLegacyMcpConfigShape, resolveMcpServerPath, writeMcpConfigFile, } from '../mcp-resolution.js';
@@ -192,25 +194,76 @@ export function ensureGitignoreEntries(repoPath, io) {
192
194
  io.out(`Created ${gitignorePath}.\n`);
193
195
  }
194
196
  /**
195
- * Spawn the daemon as a detached background process via `npx`.
197
+ * Resolve an existing on-disk `telora-daemon` binary.
196
198
  *
197
- * Deliberately uses `npx -p @telora/daemon@latest telora-daemon run` (and
198
- * NOT a node_modules path) so the connect flow does not require a
199
- * `package.json` or `node_modules/` in the user's repo. This keeps the
200
- * connect flow language-agnostic: a Rust/Python/Go/empty repo never gets
201
- * a Node footprint.
199
+ * Checks, in order:
200
+ * 1. A global install on PATH (`which telora-daemon`) -- the canonical
201
+ * long-running install.
202
+ * 2. A repo-local `node_modules/.bin/telora-daemon` dev dependency.
203
+ *
204
+ * Returns the absolute path to the binary, or null when none is on disk.
205
+ * Deliberately does NOT resolve an npx-cache binary: a daemon launched from
206
+ * `~/.npm/_npx/<hash>/` cannot self-update (the running process keeps loading
207
+ * from the cache while `npm install -g` writes the global prefix), so the
208
+ * long-running daemon must run from a stable on-disk install.
209
+ */
210
+ function resolveOnDiskDaemonBinary(repoPath) {
211
+ try {
212
+ const resolved = execFileSync('which', ['telora-daemon'], {
213
+ encoding: 'utf-8',
214
+ timeout: 5_000,
215
+ }).trim();
216
+ if (resolved && existsSync(resolved))
217
+ return resolved;
218
+ }
219
+ catch {
220
+ // Not on PATH -- fall through to the repo-local dev dependency.
221
+ }
222
+ const localBin = resolve(repoPath, 'node_modules', '.bin', 'telora-daemon');
223
+ if (existsSync(localBin))
224
+ return localBin;
225
+ return null;
226
+ }
227
+ /**
228
+ * Start the daemon as a detached background process from a stable on-disk
229
+ * install -- never from an ephemeral npx cache (which cannot self-update).
230
+ *
231
+ * Resolution order:
232
+ * 1. Use an existing on-disk binary (global install on PATH, or a repo-local
233
+ * `node_modules/.bin/telora-daemon` dev dependency).
234
+ * 2. If none exists, run `npm install -g @telora/daemon` best-effort. Global
235
+ * install keeps the connect flow language-agnostic -- it leaves no
236
+ * `package.json`/`node_modules`/dev-dependency footprint in the user's
237
+ * repo (Rust/Python/Go/empty repos stay untouched).
238
+ * 3. Spawn the resolved on-disk `telora-daemon run`.
239
+ *
240
+ * On install failure this throws (the caller surfaces the manual
241
+ * `npm install -g @telora/daemon` instruction and skips auto-start); it does
242
+ * NOT fall back to npx, because an npx-run daemon is exactly what this focus
243
+ * retires.
202
244
  *
203
245
  * Bin name is explicit (`telora-daemon`) because the package's bins are
204
246
  * `telora-daemon` and `telora-daemon-wrapper`; neither matches the unscoped
205
- * package name `daemon`, so `npx @telora/daemon` cannot resolve a bin and
206
- * aborts with a misleading error (lesson from commit 0368f4b6).
247
+ * package name `daemon`.
207
248
  */
208
- export function startDaemonViaNpx(repoPath) {
249
+ export function startDaemonOnDisk(repoPath) {
250
+ let binary = resolveOnDiskDaemonBinary(repoPath);
251
+ if (!binary) {
252
+ // No on-disk install -- install globally (no repo footprint), best-effort.
253
+ execFileSync('npm', ['install', '-g', '@telora/daemon'], {
254
+ stdio: 'inherit',
255
+ timeout: 120_000,
256
+ });
257
+ binary = resolveOnDiskDaemonBinary(repoPath);
258
+ if (!binary) {
259
+ throw new Error('telora-daemon is not on disk after `npm install -g @telora/daemon`.');
260
+ }
261
+ }
209
262
  ensureGlobalStateDir();
210
263
  const logPath = resolveDaemonLogPath();
211
264
  const logFd = openSync(logPath, 'a', 0o600);
212
265
  try {
213
- const child = spawn('npx', ['--yes', '-p', '@telora/daemon@latest', 'telora-daemon', 'run'], {
266
+ const child = spawn(binary, ['run'], {
214
267
  detached: true,
215
268
  stdio: ['ignore', logFd, logFd],
216
269
  cwd: repoPath,
@@ -838,16 +891,19 @@ export async function runConnect(opts) {
838
891
  ` telora-ai config tracker_id ${trackerId}\n` +
839
892
  ` telora-ai setup-hooks\n`);
840
893
  }
841
- // -- Start daemon in background via npx ----------------------------------
894
+ // -- Start daemon in background from a stable on-disk install -------------
842
895
  let daemonPid = null;
843
896
  if (!opts.skipDaemonStart) {
844
897
  try {
845
- daemonPid = startDaemonViaNpx(repoPath);
898
+ daemonPid = startDaemonOnDisk(repoPath);
846
899
  io.out(`Daemon started (PID ${daemonPid}). Logs: telora-daemon logs --follow\n`);
847
900
  }
848
901
  catch (err) {
902
+ // On-disk install/start failed. Do NOT fall back to npx (an npx-run
903
+ // daemon cannot self-update). Connect still completes; the user starts
904
+ // the daemon manually after a global install.
849
905
  io.err(`Warning: could not start daemon in background: ${err instanceof Error ? err.message : String(err)}\n`);
850
- io.err('Run `npx -p @telora/daemon@latest telora-daemon run` manually.\n');
906
+ io.err('Run `telora-daemon run` manually (install with `npm install -g @telora/daemon` if needed).\n');
851
907
  }
852
908
  }
853
909
  // -- Security-hardening pointer (least-privilege service user) ----------