@telora/daemon 0.16.33 → 0.16.42

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 (313) hide show
  1. package/build-info.json +2 -2
  2. package/dist/assembly-resolvers.d.ts +13 -65
  3. package/dist/assembly-resolvers.d.ts.map +1 -1
  4. package/dist/assembly-resolvers.js +15 -1915
  5. package/dist/assembly-resolvers.js.map +1 -1
  6. package/dist/audit-phase.d.ts +2 -2
  7. package/dist/audit-phase.d.ts.map +1 -1
  8. package/dist/audit-phase.js +1 -1
  9. package/dist/audit-phase.js.map +1 -1
  10. package/dist/{completion-handler.d.ts → completion/agent-completion.d.ts} +3 -3
  11. package/dist/completion/agent-completion.d.ts.map +1 -0
  12. package/dist/{completion-handler.js → completion/agent-completion.js} +7 -7
  13. package/dist/completion/agent-completion.js.map +1 -0
  14. package/dist/{completion-detector.d.ts → completion/detector.d.ts} +1 -1
  15. package/dist/completion/detector.d.ts.map +1 -0
  16. package/dist/{completion-detector.js → completion/detector.js} +1 -1
  17. package/dist/completion/detector.js.map +1 -0
  18. package/dist/{focus-completion-event.d.ts → completion/event.d.ts} +21 -3
  19. package/dist/completion/event.d.ts.map +1 -0
  20. package/dist/{focus-completion-event.js → completion/event.js} +55 -9
  21. package/dist/completion/event.js.map +1 -0
  22. package/dist/completion/index.d.ts +24 -0
  23. package/dist/completion/index.d.ts.map +1 -0
  24. package/dist/completion/index.js +25 -0
  25. package/dist/completion/index.js.map +1 -0
  26. package/dist/{focus-completion.d.ts → completion/team-completion.d.ts} +11 -11
  27. package/dist/completion/team-completion.d.ts.map +1 -0
  28. package/dist/{focus-completion.js → completion/team-completion.js} +37 -26
  29. package/dist/completion/team-completion.js.map +1 -0
  30. package/dist/{focus-team-lifecycle.d.ts → completion/team-lifecycle.d.ts} +2 -2
  31. package/dist/completion/team-lifecycle.d.ts.map +1 -0
  32. package/dist/{focus-team-lifecycle.js → completion/team-lifecycle.js} +12 -12
  33. package/dist/completion/team-lifecycle.js.map +1 -0
  34. package/dist/directive-executor.d.ts +30 -0
  35. package/dist/directive-executor.d.ts.map +1 -1
  36. package/dist/directive-executor.js +46 -0
  37. package/dist/directive-executor.js.map +1 -1
  38. package/dist/focus-engine.d.ts.map +1 -1
  39. package/dist/focus-engine.js +1 -2
  40. package/dist/focus-engine.js.map +1 -1
  41. package/dist/focus-executor.d.ts +4 -4
  42. package/dist/focus-executor.d.ts.map +1 -1
  43. package/dist/focus-executor.js +5 -5
  44. package/dist/focus-executor.js.map +1 -1
  45. package/dist/focus-merge.js +1 -1
  46. package/dist/focus-merge.js.map +1 -1
  47. package/dist/focus-prompt-builder.d.ts.map +1 -1
  48. package/dist/focus-prompt-builder.js +5 -39
  49. package/dist/focus-prompt-builder.js.map +1 -1
  50. package/dist/listener.js +1 -1
  51. package/dist/listener.js.map +1 -1
  52. package/dist/output-monitor.d.ts +1 -1
  53. package/dist/output-monitor.d.ts.map +1 -1
  54. package/dist/output-monitor.js +1 -1
  55. package/dist/output-monitor.js.map +1 -1
  56. package/dist/prompt-listing.d.ts +26 -0
  57. package/dist/prompt-listing.d.ts.map +1 -0
  58. package/dist/prompt-listing.js +55 -0
  59. package/dist/prompt-listing.js.map +1 -0
  60. package/dist/queries/index.d.ts +13 -0
  61. package/dist/queries/index.d.ts.map +1 -1
  62. package/dist/queries/index.js +9 -0
  63. package/dist/queries/index.js.map +1 -1
  64. package/dist/resolvers/agent-escalations.d.ts +2 -0
  65. package/dist/resolvers/agent-escalations.d.ts.map +1 -0
  66. package/dist/resolvers/agent-escalations.js +33 -0
  67. package/dist/resolvers/agent-escalations.js.map +1 -0
  68. package/dist/resolvers/agent-session-summaries.d.ts +2 -0
  69. package/dist/resolvers/agent-session-summaries.d.ts.map +1 -0
  70. package/dist/resolvers/agent-session-summaries.js +28 -0
  71. package/dist/resolvers/agent-session-summaries.js.map +1 -0
  72. package/dist/resolvers/delivery-acceptance-criteria.d.ts +2 -0
  73. package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -0
  74. package/dist/resolvers/delivery-acceptance-criteria.js +19 -0
  75. package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -0
  76. package/dist/resolvers/delivery-description.d.ts +2 -0
  77. package/dist/resolvers/delivery-description.d.ts.map +1 -0
  78. package/dist/resolvers/delivery-description.js +19 -0
  79. package/dist/resolvers/delivery-description.js.map +1 -0
  80. package/dist/resolvers/delivery-issues.d.ts +2 -0
  81. package/dist/resolvers/delivery-issues.d.ts.map +1 -0
  82. package/dist/resolvers/delivery-issues.js +58 -0
  83. package/dist/resolvers/delivery-issues.js.map +1 -0
  84. package/dist/resolvers/delivery-listing.d.ts +2 -0
  85. package/dist/resolvers/delivery-listing.d.ts.map +1 -0
  86. package/dist/resolvers/delivery-listing.js +54 -0
  87. package/dist/resolvers/delivery-listing.js.map +1 -0
  88. package/dist/resolvers/delivery-tech-context.d.ts +2 -0
  89. package/dist/resolvers/delivery-tech-context.d.ts.map +1 -0
  90. package/dist/resolvers/delivery-tech-context.js +19 -0
  91. package/dist/resolvers/delivery-tech-context.js.map +1 -0
  92. package/dist/resolvers/deployment-profile.d.ts +2 -0
  93. package/dist/resolvers/deployment-profile.d.ts.map +1 -0
  94. package/dist/resolvers/deployment-profile.js +28 -0
  95. package/dist/resolvers/deployment-profile.js.map +1 -0
  96. package/dist/resolvers/focus-anchoring-injections.d.ts +2 -0
  97. package/dist/resolvers/focus-anchoring-injections.d.ts.map +1 -0
  98. package/dist/resolvers/focus-anchoring-injections.js +123 -0
  99. package/dist/resolvers/focus-anchoring-injections.js.map +1 -0
  100. package/dist/resolvers/focus-context.d.ts +2 -0
  101. package/dist/resolvers/focus-context.d.ts.map +1 -0
  102. package/dist/resolvers/focus-context.js +47 -0
  103. package/dist/resolvers/focus-context.js.map +1 -0
  104. package/dist/resolvers/focus-injections.d.ts +2 -0
  105. package/dist/resolvers/focus-injections.d.ts.map +1 -0
  106. package/dist/resolvers/focus-injections.js +75 -0
  107. package/dist/resolvers/focus-injections.js.map +1 -0
  108. package/dist/resolvers/focus-last-review-report.d.ts +2 -0
  109. package/dist/resolvers/focus-last-review-report.d.ts.map +1 -0
  110. package/dist/resolvers/focus-last-review-report.js +46 -0
  111. package/dist/resolvers/focus-last-review-report.js.map +1 -0
  112. package/dist/resolvers/focus-reality-tree.d.ts +2 -0
  113. package/dist/resolvers/focus-reality-tree.d.ts.map +1 -0
  114. package/dist/resolvers/focus-reality-tree.js +50 -0
  115. package/dist/resolvers/focus-reality-tree.js.map +1 -0
  116. package/dist/resolvers/git-diff-against-base.d.ts +2 -0
  117. package/dist/resolvers/git-diff-against-base.d.ts.map +1 -0
  118. package/dist/resolvers/git-diff-against-base.js +39 -0
  119. package/dist/resolvers/git-diff-against-base.js.map +1 -0
  120. package/dist/resolvers/guards-evaluation-results.d.ts +2 -0
  121. package/dist/resolvers/guards-evaluation-results.d.ts.map +1 -0
  122. package/dist/resolvers/guards-evaluation-results.js +31 -0
  123. package/dist/resolvers/guards-evaluation-results.js.map +1 -0
  124. package/dist/resolvers/index.d.ts +50 -0
  125. package/dist/resolvers/index.d.ts.map +1 -0
  126. package/dist/resolvers/index.js +51 -0
  127. package/dist/resolvers/index.js.map +1 -0
  128. package/dist/resolvers/loop-context.d.ts +2 -0
  129. package/dist/resolvers/loop-context.d.ts.map +1 -0
  130. package/dist/resolvers/loop-context.js +113 -0
  131. package/dist/resolvers/loop-context.js.map +1 -0
  132. package/dist/resolvers/loop-delivery-index.d.ts +2 -0
  133. package/dist/resolvers/loop-delivery-index.d.ts.map +1 -0
  134. package/dist/resolvers/loop-delivery-index.js +69 -0
  135. package/dist/resolvers/loop-delivery-index.js.map +1 -0
  136. package/dist/resolvers/loop-documents.d.ts +2 -0
  137. package/dist/resolvers/loop-documents.d.ts.map +1 -0
  138. package/dist/resolvers/loop-documents.js +30 -0
  139. package/dist/resolvers/loop-documents.js.map +1 -0
  140. package/dist/resolvers/loop-expected-effects.d.ts +2 -0
  141. package/dist/resolvers/loop-expected-effects.d.ts.map +1 -0
  142. package/dist/resolvers/loop-expected-effects.js +68 -0
  143. package/dist/resolvers/loop-expected-effects.js.map +1 -0
  144. package/dist/resolvers/loop-frt-statement.d.ts +2 -0
  145. package/dist/resolvers/loop-frt-statement.d.ts.map +1 -0
  146. package/dist/resolvers/loop-frt-statement.js +39 -0
  147. package/dist/resolvers/loop-frt-statement.js.map +1 -0
  148. package/dist/resolvers/loop-injection.d.ts +2 -0
  149. package/dist/resolvers/loop-injection.d.ts.map +1 -0
  150. package/dist/resolvers/loop-injection.js +48 -0
  151. package/dist/resolvers/loop-injection.js.map +1 -0
  152. package/dist/resolvers/loop-persona.d.ts +2 -0
  153. package/dist/resolvers/loop-persona.d.ts.map +1 -0
  154. package/dist/resolvers/loop-persona.js +40 -0
  155. package/dist/resolvers/loop-persona.js.map +1 -0
  156. package/dist/resolvers/loop-questions.d.ts +2 -0
  157. package/dist/resolvers/loop-questions.d.ts.map +1 -0
  158. package/dist/resolvers/loop-questions.js +49 -0
  159. package/dist/resolvers/loop-questions.js.map +1 -0
  160. package/dist/resolvers/loop-upstream-udes.d.ts +2 -0
  161. package/dist/resolvers/loop-upstream-udes.d.ts.map +1 -0
  162. package/dist/resolvers/loop-upstream-udes.js +88 -0
  163. package/dist/resolvers/loop-upstream-udes.js.map +1 -0
  164. package/dist/resolvers/reality-metrics.d.ts +2 -0
  165. package/dist/resolvers/reality-metrics.d.ts.map +1 -0
  166. package/dist/resolvers/reality-metrics.js +86 -0
  167. package/dist/resolvers/reality-metrics.js.map +1 -0
  168. package/dist/resolvers/reality-projections.d.ts +2 -0
  169. package/dist/resolvers/reality-projections.d.ts.map +1 -0
  170. package/dist/resolvers/reality-projections.js +44 -0
  171. package/dist/resolvers/reality-projections.js.map +1 -0
  172. package/dist/resolvers/reality-tree-snapshot.d.ts +2 -0
  173. package/dist/resolvers/reality-tree-snapshot.d.ts.map +1 -0
  174. package/dist/resolvers/reality-tree-snapshot.js +45 -0
  175. package/dist/resolvers/reality-tree-snapshot.js.map +1 -0
  176. package/dist/resolvers/retired-injections.d.ts +2 -0
  177. package/dist/resolvers/retired-injections.d.ts.map +1 -0
  178. package/dist/resolvers/retired-injections.js +83 -0
  179. package/dist/resolvers/retired-injections.js.map +1 -0
  180. package/dist/resolvers/review-outcomes.d.ts +2 -0
  181. package/dist/resolvers/review-outcomes.d.ts.map +1 -0
  182. package/dist/resolvers/review-outcomes.js +38 -0
  183. package/dist/resolvers/review-outcomes.js.map +1 -0
  184. package/dist/resolvers/security-advisory.d.ts +2 -0
  185. package/dist/resolvers/security-advisory.d.ts.map +1 -0
  186. package/dist/resolvers/security-advisory.js +97 -0
  187. package/dist/resolvers/security-advisory.js.map +1 -0
  188. package/dist/resolvers/shared/audit.d.ts +19 -0
  189. package/dist/resolvers/shared/audit.d.ts.map +1 -0
  190. package/dist/resolvers/shared/audit.js +28 -0
  191. package/dist/resolvers/shared/audit.js.map +1 -0
  192. package/dist/resolvers/shared/format.d.ts +6 -0
  193. package/dist/resolvers/shared/format.d.ts.map +1 -0
  194. package/dist/resolvers/shared/format.js +17 -0
  195. package/dist/resolvers/shared/format.js.map +1 -0
  196. package/dist/resolvers/shared/git-diff.d.ts +14 -0
  197. package/dist/resolvers/shared/git-diff.d.ts.map +1 -0
  198. package/dist/resolvers/shared/git-diff.js +30 -0
  199. package/dist/resolvers/shared/git-diff.js.map +1 -0
  200. package/dist/resolvers/shared/loop-items.d.ts +30 -0
  201. package/dist/resolvers/shared/loop-items.d.ts.map +1 -0
  202. package/dist/resolvers/shared/loop-items.js +7 -0
  203. package/dist/resolvers/shared/loop-items.js.map +1 -0
  204. package/dist/resolvers/shared/loop.d.ts +48 -0
  205. package/dist/resolvers/shared/loop.d.ts.map +1 -0
  206. package/dist/resolvers/shared/loop.js +38 -0
  207. package/dist/resolvers/shared/loop.js.map +1 -0
  208. package/dist/resolvers/shared/reality-metrics.d.ts +63 -0
  209. package/dist/resolvers/shared/reality-metrics.d.ts.map +1 -0
  210. package/dist/resolvers/shared/reality-metrics.js +6 -0
  211. package/dist/resolvers/shared/reality-metrics.js.map +1 -0
  212. package/dist/resolvers/shared/reality-tree.d.ts +51 -0
  213. package/dist/resolvers/shared/reality-tree.d.ts.map +1 -0
  214. package/dist/resolvers/shared/reality-tree.js +125 -0
  215. package/dist/resolvers/shared/reality-tree.js.map +1 -0
  216. package/dist/resolvers/shared/wiki.d.ts +60 -0
  217. package/dist/resolvers/shared/wiki.d.ts.map +1 -0
  218. package/dist/resolvers/shared/wiki.js +122 -0
  219. package/dist/resolvers/shared/wiki.js.map +1 -0
  220. package/dist/resolvers/wiki-search.d.ts +2 -0
  221. package/dist/resolvers/wiki-search.d.ts.map +1 -0
  222. package/dist/resolvers/wiki-search.js +23 -0
  223. package/dist/resolvers/wiki-search.js.map +1 -0
  224. package/dist/resolvers/wiki-topic.d.ts +2 -0
  225. package/dist/resolvers/wiki-topic.d.ts.map +1 -0
  226. package/dist/resolvers/wiki-topic.js +29 -0
  227. package/dist/resolvers/wiki-topic.js.map +1 -0
  228. package/dist/resolvers/workflow-stages.d.ts +2 -0
  229. package/dist/resolvers/workflow-stages.d.ts.map +1 -0
  230. package/dist/resolvers/workflow-stages.js +26 -0
  231. package/dist/resolvers/workflow-stages.js.map +1 -0
  232. package/dist/session-lifecycle.d.ts +2 -2
  233. package/dist/session-lifecycle.d.ts.map +1 -1
  234. package/dist/session-lifecycle.js +3 -3
  235. package/dist/session-lifecycle.js.map +1 -1
  236. package/dist/{pending-spawn-guard.d.ts → spawner/guards.d.ts} +1 -1
  237. package/dist/spawner/guards.d.ts.map +1 -0
  238. package/dist/{pending-spawn-guard.js → spawner/guards.js} +2 -2
  239. package/dist/spawner/guards.js.map +1 -0
  240. package/dist/{focus-spawn-helpers.d.ts → spawner/helpers.d.ts} +6 -6
  241. package/dist/spawner/helpers.d.ts.map +1 -0
  242. package/dist/{focus-spawn-helpers.js → spawner/helpers.js} +8 -8
  243. package/dist/spawner/helpers.js.map +1 -0
  244. package/dist/spawner/index.d.ts +30 -0
  245. package/dist/spawner/index.d.ts.map +1 -0
  246. package/dist/spawner/index.js +32 -0
  247. package/dist/spawner/index.js.map +1 -0
  248. package/dist/{spawner-lifecycle.d.ts → spawner/lifecycle.d.ts} +3 -3
  249. package/dist/spawner/lifecycle.d.ts.map +1 -0
  250. package/dist/{spawner-lifecycle.js → spawner/lifecycle.js} +6 -6
  251. package/dist/spawner/lifecycle.js.map +1 -0
  252. package/dist/{spawner-liveness.d.ts → spawner/liveness.d.ts} +2 -2
  253. package/dist/spawner/liveness.d.ts.map +1 -0
  254. package/dist/{spawner-liveness.js → spawner/liveness.js} +4 -4
  255. package/dist/spawner/liveness.js.map +1 -0
  256. package/dist/{spawner-resolution.d.ts → spawner/resolution.d.ts} +2 -2
  257. package/dist/spawner/resolution.d.ts.map +1 -0
  258. package/dist/{spawner-resolution.js → spawner/resolution.js} +2 -2
  259. package/dist/spawner/resolution.js.map +1 -0
  260. package/dist/{team-spawner.d.ts → spawner/spawn-team.d.ts} +4 -4
  261. package/dist/spawner/spawn-team.d.ts.map +1 -0
  262. package/dist/{team-spawner.js → spawner/spawn-team.js} +19 -19
  263. package/dist/spawner/spawn-team.js.map +1 -0
  264. package/dist/{spawner.d.ts → spawner/state.d.ts} +8 -8
  265. package/dist/spawner/state.d.ts.map +1 -0
  266. package/dist/{spawner.js → spawner/state.js} +8 -8
  267. package/dist/spawner/state.js.map +1 -0
  268. package/dist/{spawner-stream-handlers.d.ts → spawner/stream-handlers.d.ts} +4 -4
  269. package/dist/spawner/stream-handlers.d.ts.map +1 -0
  270. package/dist/{spawner-stream-handlers.js → spawner/stream-handlers.js} +7 -7
  271. package/dist/spawner/stream-handlers.js.map +1 -0
  272. package/dist/{spawner-timeout.d.ts → spawner/timeout.d.ts} +2 -2
  273. package/dist/spawner/timeout.d.ts.map +1 -0
  274. package/dist/{spawner-timeout.js → spawner/timeout.js} +1 -1
  275. package/dist/spawner/timeout.js.map +1 -0
  276. package/dist/team-prompt-base.d.ts.map +1 -1
  277. package/dist/team-prompt-base.js +4 -27
  278. package/dist/team-prompt-base.js.map +1 -1
  279. package/dist/types/focus.d.ts +1 -1
  280. package/dist/types/focus.d.ts.map +1 -1
  281. package/package.json +1 -1
  282. package/dist/completion-detector.d.ts.map +0 -1
  283. package/dist/completion-detector.js.map +0 -1
  284. package/dist/completion-handler.d.ts.map +0 -1
  285. package/dist/completion-handler.js.map +0 -1
  286. package/dist/focus-completion-event.d.ts.map +0 -1
  287. package/dist/focus-completion-event.js.map +0 -1
  288. package/dist/focus-completion.d.ts.map +0 -1
  289. package/dist/focus-completion.js.map +0 -1
  290. package/dist/focus-spawn-helpers.d.ts.map +0 -1
  291. package/dist/focus-spawn-helpers.js.map +0 -1
  292. package/dist/focus-team-lifecycle.d.ts.map +0 -1
  293. package/dist/focus-team-lifecycle.js.map +0 -1
  294. package/dist/pending-spawn-guard.d.ts.map +0 -1
  295. package/dist/pending-spawn-guard.js.map +0 -1
  296. package/dist/prompt-builder.d.ts +0 -14
  297. package/dist/prompt-builder.d.ts.map +0 -1
  298. package/dist/prompt-builder.js +0 -174
  299. package/dist/prompt-builder.js.map +0 -1
  300. package/dist/spawner-lifecycle.d.ts.map +0 -1
  301. package/dist/spawner-lifecycle.js.map +0 -1
  302. package/dist/spawner-liveness.d.ts.map +0 -1
  303. package/dist/spawner-liveness.js.map +0 -1
  304. package/dist/spawner-resolution.d.ts.map +0 -1
  305. package/dist/spawner-resolution.js.map +0 -1
  306. package/dist/spawner-stream-handlers.d.ts.map +0 -1
  307. package/dist/spawner-stream-handlers.js.map +0 -1
  308. package/dist/spawner-timeout.d.ts.map +0 -1
  309. package/dist/spawner-timeout.js.map +0 -1
  310. package/dist/spawner.d.ts.map +0 -1
  311. package/dist/spawner.js.map +0 -1
  312. package/dist/team-spawner.d.ts.map +0 -1
  313. package/dist/team-spawner.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-delivery-index.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-delivery-index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { getDeliveryInjectionPairs, fetchInjectionBundles } from './shared/loop.js';
3
+ /**
4
+ * loop.delivery_index
5
+ *
6
+ * The lead's per-delivery INDEX: one line per in-focus delivery with a linked
7
+ * injection, of the form
8
+ * - <delivery> -> injection #<seq> -> Now: <ude> -> Target: <frt> -> pull: <call>
9
+ * where the pull handle names telora_reality_tree_injection_context(seq=<seq>),
10
+ * the on-demand call that returns the delivery's full differential.
11
+ *
12
+ * This REPLACES the bulk per-delivery push (loop.injection / loop.expected_effects /
13
+ * loop.upstream_udes, each of which renders a full section per delivery-injection
14
+ * pair) so the lead's context is flat in focus size -- one line per delivery, not
15
+ * N full differentials. It is also the structural guarantee for the worker handoff:
16
+ * the lead is always staring at each delivery's slice handle.
17
+ */
18
+ registerSourceResolver('loop.delivery_index', async (context) => {
19
+ try {
20
+ const pairs = await getDeliveryInjectionPairs(context);
21
+ if (pairs.length === 0)
22
+ return '';
23
+ const bundles = await fetchInjectionBundles(pairs.map((p) => p.injectionId));
24
+ if (bundles.size === 0)
25
+ return '';
26
+ const lines = [];
27
+ for (const { deliveryName, injectionId } of pairs) {
28
+ const bundle = bundles.get(injectionId);
29
+ if (!bundle)
30
+ continue;
31
+ const seq = bundle.injection.seq;
32
+ const nowTargets = bundle.nowTargets ?? [];
33
+ let nowTarget;
34
+ if (nowTargets.length > 0) {
35
+ const first = nowTargets[0];
36
+ const target = first.target && first.target.trim().length > 0
37
+ ? first.target
38
+ : '(no FRT overlay yet)';
39
+ nowTarget = `Now: ${first.now} -> Target: ${target}`;
40
+ if (nowTargets.length > 1)
41
+ nowTarget += ` (+${nowTargets.length - 1} more)`;
42
+ }
43
+ else {
44
+ nowTarget = `(injection: ${bundle.injection.statement})`;
45
+ }
46
+ lines.push(`- ${deliveryName} -> injection #${seq} -> ${nowTarget} ` +
47
+ `-> pull: telora_reality_tree_injection_context(seq=${seq})`);
48
+ }
49
+ if (lines.length === 0)
50
+ return '';
51
+ const header = [
52
+ '## Per-Delivery Index',
53
+ '',
54
+ 'One line per delivery: the injection it materializes, its Now->Target, and the',
55
+ 'pull handle that returns the full differential on demand. This is your handoff',
56
+ 'surface: when you spawn a worker for a delivery, call its pull handle',
57
+ '(telora_reality_tree_injection_context with the injection seq) and embed the',
58
+ "returned Now->Target in the worker's task prompt so the worker begins holding",
59
+ "its delivery's start->end context.",
60
+ '',
61
+ ];
62
+ return header.concat(lines).join('\n');
63
+ }
64
+ catch (err) {
65
+ console.warn(`[assembly] loop.delivery_index failed: ${err.message}`);
66
+ return '';
67
+ }
68
+ });
69
+ //# sourceMappingURL=loop-delivery-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-delivery-index.js","sourceRoot":"","sources":["../../src/resolvers/loop-delivery-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEpF;;;;;;;;;;;;;;GAcG;AACH,sBAAsB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAwB,EAAmB,EAAE;IAChG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YACjC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAE3C,IAAI,SAAiB,CAAC;YACtB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAC3D,CAAC,CAAC,KAAK,CAAC,MAAM;oBACd,CAAC,CAAC,sBAAsB,CAAC;gBAC3B,SAAS,GAAG,QAAQ,KAAK,CAAC,GAAG,eAAe,MAAM,EAAE,CAAC;gBACrD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,SAAS,IAAI,MAAM,UAAU,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,eAAe,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC;YAC3D,CAAC;YAED,KAAK,CAAC,IAAI,CACR,KAAK,YAAY,kBAAkB,GAAG,OAAO,SAAS,GAAG;gBACzD,sDAAsD,GAAG,GAAG,CAC7D,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,MAAM,GAAG;YACb,uBAAuB;YACvB,EAAE;YACF,gFAAgF;YAChF,gFAAgF;YAChF,uEAAuE;YACvE,8EAA8E;YAC9E,+EAA+E;YAC/E,oCAAoC;YACpC,EAAE;SACH,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,0CAA2C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-documents.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-documents.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ /**
4
+ * loop.documents
5
+ *
6
+ * Fetches force-ranked loop documents for the focus's entity layer.
7
+ * Returns formatted markdown with ranked documents.
8
+ * Optional param: count (limit to top N).
9
+ */
10
+ registerSourceResolver('loop.documents', async (context, params) => {
11
+ try {
12
+ const limit = params.count ? parseInt(params.count, 10) : 50;
13
+ const result = await callApi('loop_document_list', {
14
+ entityType: 'focus',
15
+ entityId: context.focusId,
16
+ detail: 'full',
17
+ limit,
18
+ });
19
+ const docs = result.items;
20
+ if (!docs || docs.length === 0)
21
+ return '';
22
+ const sections = docs.map((doc, i) => `### ${i + 1}. ${doc.title}\n\n${doc.content}`);
23
+ return `## Loop Documents\n\n${sections.join('\n\n')}`;
24
+ }
25
+ catch (err) {
26
+ console.warn(`[assembly-engine] loop.documents: failed: ${err.message}`);
27
+ return '';
28
+ }
29
+ });
30
+ //# sourceMappingURL=loop-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-documents.js","sourceRoot":"","sources":["../../src/resolvers/loop-documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C;;;;;;GAMG;AACH,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAwB,EAAE,MAA8B,EAAmB,EAAE;IAC3H,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAgC,oBAAoB,EAAE;YAChF,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,MAAM,EAAE,MAAM;YACd,KAAK;SACN,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAqB,EAAE,CAAS,EAAE,EAAE,CAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,CAC/C,CAAC;QAEF,OAAO,wBAAwB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6CAA8C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-expected-effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-expected-effects.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-expected-effects.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ import { getDeliveryInjectionPairs, fetchInjectionBundles } from './shared/loop.js';
4
+ /**
5
+ * loop.expected_effects
6
+ *
7
+ * For each delivery with a linked injection, walk the 'targets' edges
8
+ * from injection -> targeted UDE/obstacle nodes; for each target with an
9
+ * FRT overlay (frt_statement and/or frt_node_type), render its current
10
+ * statement and what it becomes in the FRT. Targets lacking overlays are
11
+ * skipped (no expected effect to advertise).
12
+ */
13
+ registerSourceResolver('loop.expected_effects', async (context) => {
14
+ try {
15
+ const pairs = await getDeliveryInjectionPairs(context);
16
+ if (pairs.length === 0)
17
+ return '';
18
+ const bundles = await fetchInjectionBundles(pairs.map((p) => p.injectionId));
19
+ if (bundles.size === 0)
20
+ return '';
21
+ const sections = [];
22
+ for (const { deliveryName, injectionId } of pairs) {
23
+ const bundle = bundles.get(injectionId);
24
+ if (!bundle)
25
+ continue;
26
+ // Fetch nodes + edges for this injection's tree so we can walk
27
+ // targets edges and inspect the targeted nodes' overlays.
28
+ const treeId = bundle.injection.realityTreeId;
29
+ const [nodesResp, edgesResp] = await Promise.all([
30
+ callApi('reality_tree_node_list', { treeId, status: 'active' }),
31
+ callApi('reality_tree_edge_list', { treeId }),
32
+ ]);
33
+ const nodes = nodesResp.items ?? [];
34
+ const edges = edgesResp.items ?? [];
35
+ const nodeById = new Map();
36
+ for (const n of nodes)
37
+ nodeById.set(n.id, n);
38
+ const targetIds = edges
39
+ .filter((e) => e.edgeType === 'targets' && e.fromNodeId === injectionId)
40
+ .map((e) => e.toNodeId);
41
+ const targetLines = [];
42
+ for (const targetId of targetIds) {
43
+ const node = nodeById.get(targetId);
44
+ if (!node)
45
+ continue;
46
+ const hasOverlay = (node.frtStatement && node.frtStatement.trim().length > 0)
47
+ || (node.frtNodeType && node.frtNodeType.trim().length > 0);
48
+ if (!hasOverlay)
49
+ continue;
50
+ const currentType = node.nodeType;
51
+ const frtType = node.frtNodeType ?? currentType;
52
+ const frtStatement = node.frtStatement ?? node.statement;
53
+ targetLines.push(`- #${node.seq} **Current (${currentType}):** ${node.statement}\n **FRT (${frtType}):** ${frtStatement}`);
54
+ }
55
+ if (targetLines.length === 0)
56
+ continue;
57
+ sections.push(`### ${deliveryName}\n\n${targetLines.join('\n')}`);
58
+ }
59
+ if (sections.length === 0)
60
+ return '';
61
+ return `## Expected Effects (per delivery)\n\n${sections.join('\n\n')}`;
62
+ }
63
+ catch (err) {
64
+ console.warn(`[assembly] loop.expected_effects failed: ${err.message}`);
65
+ return '';
66
+ }
67
+ });
68
+ //# sourceMappingURL=loop-expected-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-expected-effects.js","sourceRoot":"","sources":["../../src/resolvers/loop-expected-effects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-frt-statement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-frt-statement.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-frt-statement.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { getDeliveryInjectionPairs, fetchInjectionBundles } from './shared/loop.js';
3
+ /**
4
+ * loop.frt_statement
5
+ *
6
+ * Returns the linked injection's frt_statement field as plain text
7
+ * (no markdown headers). When multiple deliveries are in scope, the
8
+ * statements are joined with blank lines so the agent sees each
9
+ * delivery's target state. Empty string when no delivery has an
10
+ * injection link or no injection has an FRT statement set.
11
+ */
12
+ registerSourceResolver('loop.frt_statement', async (context) => {
13
+ try {
14
+ const pairs = await getDeliveryInjectionPairs(context);
15
+ if (pairs.length === 0)
16
+ return '';
17
+ const bundles = await fetchInjectionBundles(pairs.map((p) => p.injectionId));
18
+ if (bundles.size === 0)
19
+ return '';
20
+ const lines = [];
21
+ for (const { injectionId } of pairs) {
22
+ const bundle = bundles.get(injectionId);
23
+ if (!bundle)
24
+ continue;
25
+ const frt = bundle.injection.frtStatement;
26
+ if (typeof frt !== 'string' || frt.trim().length === 0)
27
+ continue;
28
+ lines.push(frt.trim());
29
+ }
30
+ if (lines.length === 0)
31
+ return '';
32
+ return lines.join('\n\n');
33
+ }
34
+ catch (err) {
35
+ console.warn(`[assembly] loop.frt_statement failed: ${err.message}`);
36
+ return '';
37
+ }
38
+ });
39
+ //# sourceMappingURL=loop-frt-statement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-frt-statement.js","sourceRoot":"","sources":["../../src/resolvers/loop-frt-statement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEpF;;;;;;;;GAQG;AACH,sBAAsB,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAwB,EAAmB,EAAE;IAC/F,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC;YAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,yCAA0C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-injection.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-injection.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { getDeliveryInjectionPairs, fetchInjectionBundles } from './shared/loop.js';
3
+ /**
4
+ * loop.injection
5
+ *
6
+ * For each delivery in context.deliveryIds with a linked injection, render
7
+ * the injection node: statement, lifecycle status, what obstacle it
8
+ * dissolves. Plain markdown; no upstream/downstream walk (that lives in
9
+ * loop.upstream_udes / loop.expected_effects).
10
+ */
11
+ registerSourceResolver('loop.injection', async (context) => {
12
+ try {
13
+ const pairs = await getDeliveryInjectionPairs(context);
14
+ if (pairs.length === 0)
15
+ return '';
16
+ const bundles = await fetchInjectionBundles(pairs.map((p) => p.injectionId));
17
+ if (bundles.size === 0)
18
+ return '';
19
+ const sections = [];
20
+ for (const { deliveryName, injectionId } of pairs) {
21
+ const bundle = bundles.get(injectionId);
22
+ if (!bundle)
23
+ continue;
24
+ const inj = bundle.injection;
25
+ const statusTag = inj.injectionStatus ? ` [${inj.injectionStatus}]` : '';
26
+ const dissolvesLine = inj.dissolvesObstacle
27
+ ? `- **Dissolves obstacle:** ${inj.dissolvesObstacle}`
28
+ : null;
29
+ const lines = [
30
+ `### ${deliveryName}`,
31
+ '',
32
+ `- **Injection:** ${inj.statement}${statusTag}`,
33
+ `- **Injection status:** ${inj.injectionStatus ?? '_not set_'}`,
34
+ ];
35
+ if (dissolvesLine)
36
+ lines.push(dissolvesLine);
37
+ sections.push(lines.join('\n'));
38
+ }
39
+ if (sections.length === 0)
40
+ return '';
41
+ return `## Loop Injection (per delivery)\n\n${sections.join('\n\n')}`;
42
+ }
43
+ catch (err) {
44
+ console.warn(`[assembly] loop.injection failed: ${err.message}`);
45
+ return '';
46
+ }
47
+ });
48
+ //# sourceMappingURL=loop-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-injection.js","sourceRoot":"","sources":["../../src/resolvers/loop-injection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEpF;;;;;;;GAOG;AACH,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAwB,EAAmB,EAAE;IAC3F,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,aAAa,GAAG,GAAG,CAAC,iBAAiB;gBACzC,CAAC,CAAC,6BAA6B,GAAG,CAAC,iBAAiB,EAAE;gBACtD,CAAC,CAAC,IAAI,CAAC;YAET,MAAM,KAAK,GAAa;gBACtB,OAAO,YAAY,EAAE;gBACrB,EAAE;gBACF,oBAAoB,GAAG,CAAC,SAAS,GAAG,SAAS,EAAE;gBAC/C,2BAA2B,GAAG,CAAC,eAAe,IAAI,WAAW,EAAE;aAChE,CAAC;YACF,IAAI,aAAa;gBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,OAAO,uCAAuC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qCAAsC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-persona.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-persona.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ import { buildCloseLoopBookkeeperPersona } from '../team-prompt-base.js';
4
+ /**
5
+ * loop.persona
6
+ *
7
+ * Fetches the active persona for the entity's loop layer.
8
+ * Returns the raw "You are..." prompt text, or empty string if none set.
9
+ *
10
+ * Stage variants:
11
+ * - `loop.persona(variant=close_loop)` -- returns the close-loop bookkeeper
12
+ * persona (from team-prompt-base.buildCloseLoopBookkeeperPersona). This
13
+ * is a built-in variant; the stored persona on the focus is ignored so
14
+ * close_loop stage spawns always carry the asymmetric, no-third-option
15
+ * bookkeeper framing regardless of what the human persona on the focus
16
+ * looks like. The close_loop stage dispatcher composes its assembly
17
+ * recipe with `loop.persona(variant=close_loop)` so the team lead
18
+ * receives this exact text.
19
+ *
20
+ * No-variant call returns the human-authored persona stored on the focus.
21
+ */
22
+ registerSourceResolver('loop.persona', async (context, params) => {
23
+ if (params.variant === 'close_loop') {
24
+ return buildCloseLoopBookkeeperPersona();
25
+ }
26
+ try {
27
+ const result = await callApi('loop_persona_get', {
28
+ entityType: 'focus',
29
+ entityId: context.focusId,
30
+ });
31
+ if (!result.persona || !result.persona.content)
32
+ return '';
33
+ return result.persona.content;
34
+ }
35
+ catch (err) {
36
+ console.warn(`[assembly-engine] loop.persona: failed: ${err.message}`);
37
+ return '';
38
+ }
39
+ });
40
+ //# sourceMappingURL=loop-persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-persona.js","sourceRoot":"","sources":["../../src/resolvers/loop-persona.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAGzE;;;;;;;;;;;;;;;;;GAiBG;AACH,sBAAsB,CAAC,cAAc,EAAE,KAAK,EAAE,OAAwB,EAAE,MAA8B,EAAmB,EAAE;IACzH,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QACpC,OAAO,+BAA+B,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAoB,kBAAkB,EAAE;YAClE,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,OAAO;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,2CAA4C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-questions.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-questions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ /**
4
+ * loop.questions
5
+ *
6
+ * Fetches fixed + generated questions with current answers for the entity layer.
7
+ * Returns formatted markdown: fixed questions first, then generated in rank order.
8
+ */
9
+ registerSourceResolver('loop.questions', async (context) => {
10
+ try {
11
+ const result = await callApi('loop_question_list', {
12
+ entityType: 'focus',
13
+ entityId: context.focusId,
14
+ detail: 'full',
15
+ });
16
+ const questions = result.items;
17
+ if (!questions || questions.length === 0)
18
+ return '';
19
+ const fixed = questions.filter((q) => q.questionType === 'fixed');
20
+ const generated = questions.filter((q) => q.questionType === 'generated');
21
+ const formatQuestion = async (q) => {
22
+ try {
23
+ const answerResult = await callApi('loop_answer_get', {
24
+ questionId: q.id,
25
+ });
26
+ const answer = answerResult.answer?.content || '_No answer yet._';
27
+ return `**Q:** ${q.text}\n**A:** ${answer}`;
28
+ }
29
+ catch {
30
+ return `**Q:** ${q.text}\n**A:** _No answer yet._`;
31
+ }
32
+ };
33
+ const parts = [];
34
+ if (fixed.length > 0) {
35
+ const fixedLines = await Promise.all(fixed.map(formatQuestion));
36
+ parts.push(`### Fixed Questions\n\n${fixedLines.join('\n\n')}`);
37
+ }
38
+ if (generated.length > 0) {
39
+ const generatedLines = await Promise.all(generated.map(formatQuestion));
40
+ parts.push(`### Generated Questions\n\n${generatedLines.join('\n\n')}`);
41
+ }
42
+ return `## Loop Questions\n\n${parts.join('\n\n')}`;
43
+ }
44
+ catch (err) {
45
+ console.warn(`[assembly-engine] loop.questions: failed: ${err.message}`);
46
+ return '';
47
+ }
48
+ });
49
+ //# sourceMappingURL=loop-questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-questions.js","sourceRoot":"","sources":["../../src/resolvers/loop-questions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C;;;;;GAKG;AACH,sBAAsB,CAAC,gBAAgB,EAAE,KAAK,EAAE,OAAwB,EAAmB,EAAE;IAC3F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAgC,oBAAoB,EAAE;YAChF,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC;QAE5F,MAAM,cAAc,GAAG,KAAK,EAAE,CAAmB,EAAmB,EAAE;YACpE,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,OAAO,CAAmB,iBAAiB,EAAE;oBACtE,UAAU,EAAE,CAAC,CAAC,EAAE;iBACjB,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,kBAAkB,CAAC;gBAClE,OAAO,UAAU,CAAC,CAAC,IAAI,YAAY,MAAM,EAAE,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,UAAU,CAAC,CAAC,IAAI,2BAA2B,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,0BAA0B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,8BAA8B,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,wBAAwB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6CAA8C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loop-upstream-udes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-upstream-udes.d.ts","sourceRoot":"","sources":["../../src/resolvers/loop-upstream-udes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ import { getDeliveryInjectionPairs, fetchInjectionBundles, MAX_UPSTREAM_DEPTH } from './shared/loop.js';
4
+ /**
5
+ * loop.upstream_udes
6
+ *
7
+ * For each delivery's injection, find the nodes that the injection
8
+ * targets (via 'targets' edges), then BFS upstream from those targets
9
+ * along causal edges ('sufficient' and 'and' edge kinds) up to
10
+ * MAX_UPSTREAM_DEPTH hops. Returns a markdown list of upstream UDE/
11
+ * entity nodes the injection is indirectly meant to address. Cycle-safe.
12
+ */
13
+ registerSourceResolver('loop.upstream_udes', async (context) => {
14
+ try {
15
+ const pairs = await getDeliveryInjectionPairs(context);
16
+ if (pairs.length === 0)
17
+ return '';
18
+ const bundles = await fetchInjectionBundles(pairs.map((p) => p.injectionId));
19
+ if (bundles.size === 0)
20
+ return '';
21
+ const sections = [];
22
+ for (const { deliveryName, injectionId } of pairs) {
23
+ const bundle = bundles.get(injectionId);
24
+ if (!bundle)
25
+ continue;
26
+ const treeId = bundle.injection.realityTreeId;
27
+ const [nodesResp, edgesResp] = await Promise.all([
28
+ callApi('reality_tree_node_list', { treeId, status: 'active' }),
29
+ callApi('reality_tree_edge_list', { treeId }),
30
+ ]);
31
+ const nodes = nodesResp.items ?? [];
32
+ const edges = edgesResp.items ?? [];
33
+ const nodeById = new Map();
34
+ for (const n of nodes)
35
+ nodeById.set(n.id, n);
36
+ // Seed: the nodes the injection targets directly.
37
+ const seeds = edges
38
+ .filter((e) => e.edgeType === 'targets' && e.fromNodeId === injectionId)
39
+ .map((e) => e.toNodeId);
40
+ if (seeds.length === 0)
41
+ continue;
42
+ // BFS upstream along causal edges: walk edges where to_node_id is
43
+ // in the current frontier; the from_node_id of those edges is the
44
+ // upstream node. Bounded by MAX_UPSTREAM_DEPTH and cycle-safe via
45
+ // visited set. Seeds themselves are excluded from output (we want
46
+ // their upstream, not the seeds).
47
+ const visited = new Set(seeds);
48
+ const collected = [];
49
+ let frontier = new Set(seeds);
50
+ for (let depth = 0; depth < MAX_UPSTREAM_DEPTH; depth++) {
51
+ if (frontier.size === 0)
52
+ break;
53
+ const next = new Set();
54
+ for (const edge of edges) {
55
+ if (edge.edgeType !== 'sufficient' && edge.edgeType !== 'and')
56
+ continue;
57
+ if (!frontier.has(edge.toNodeId))
58
+ continue;
59
+ const upId = edge.fromNodeId;
60
+ if (visited.has(upId))
61
+ continue;
62
+ visited.add(upId);
63
+ next.add(upId);
64
+ const upNode = nodeById.get(upId);
65
+ if (upNode)
66
+ collected.push(upNode);
67
+ }
68
+ frontier = next;
69
+ }
70
+ if (collected.length === 0)
71
+ continue;
72
+ collected.sort((a, b) => a.seq - b.seq);
73
+ const lines = collected.map((n) => {
74
+ const typeTag = n.nodeType !== 'entity' ? ` [${n.nodeType}]` : '';
75
+ return `- #${n.seq} ${n.statement}${typeTag}`;
76
+ });
77
+ sections.push(`### ${deliveryName}\n\n${lines.join('\n')}`);
78
+ }
79
+ if (sections.length === 0)
80
+ return '';
81
+ return `## Upstream UDEs (per delivery, max depth ${MAX_UPSTREAM_DEPTH})\n\n${sections.join('\n\n')}`;
82
+ }
83
+ catch (err) {
84
+ console.warn(`[assembly] loop.upstream_udes failed: ${err.message}`);
85
+ return '';
86
+ }
87
+ });
88
+ //# sourceMappingURL=loop-upstream-udes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-upstream-udes.js","sourceRoot":"","sources":["../../src/resolvers/loop-upstream-udes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reality-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reality-metrics.d.ts","sourceRoot":"","sources":["../../src/resolvers/reality-metrics.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { registerSourceResolver } from '../assembly-engine.js';
2
+ import { callApi } from '../queries/shared.js';
3
+ /**
4
+ * reality.metrics
5
+ *
6
+ * Fetches focus reality metrics + trajectory projections from the edge function.
7
+ * Formats as markdown for agent consumption (Wire B of the differential pair).
8
+ */
9
+ registerSourceResolver('reality.metrics', async (context) => {
10
+ try {
11
+ const result = await callApi('reality_metrics_focus', {
12
+ focusId: context.focusId,
13
+ });
14
+ const m = result.metrics;
15
+ if (!m)
16
+ return '';
17
+ const parts = ['## Execution Reality\n'];
18
+ // Delivery status breakdown
19
+ parts.push('### Delivery Status');
20
+ parts.push(`- Planning: ${m.deliveries_planning} | Queued: ${m.deliveries_queued} | Coding: ${m.deliveries_coding} | Verify: ${m.deliveries_verify} | Done: ${m.deliveries_done} (${m.total_deliveries} total)`);
21
+ // Issue throughput
22
+ parts.push('\n### Issue Throughput');
23
+ parts.push(`- Total: ${m.total_issues} | To Do: ${m.issues_todo} | In Progress: ${m.issues_in_progress} | Done: ${m.issues_done} | Blocked: ${m.issues_blocked}`);
24
+ parts.push(`- Completed: ${m.issues_done_7d} (7d) | ${m.issues_done_14d} (14d) | ${m.issues_done_30d} (30d)`);
25
+ if (m.avg_cycle_time_days !== null) {
26
+ parts.push(`- Avg cycle time: ${m.avg_cycle_time_days} days`);
27
+ }
28
+ if (m.blocked_count > 0) {
29
+ parts.push(`- Blocked: ${m.blocked_count} issues${m.avg_blocked_duration_days !== null ? `, avg duration ${m.avg_blocked_duration_days} days` : ''}`);
30
+ }
31
+ // Agent cost
32
+ parts.push('\n### Agent Activity');
33
+ parts.push(`- Sessions: ${m.session_count} | Cost: $${m.total_agent_cost.toFixed(2)} | Escalations: ${m.escalation_count}`);
34
+ if (m.last_session_at) {
35
+ parts.push(`- Last session: ${m.last_session_at}`);
36
+ }
37
+ // Git merge metrics
38
+ if (m.merge_count !== undefined) {
39
+ parts.push('\n### Git Activity');
40
+ parts.push(`- Total merges: ${m.merge_count} | Last 7d: ${m.merges_7d ?? 0} | Last 30d: ${m.merges_30d ?? 0}`);
41
+ if (m.last_merge_at) {
42
+ parts.push(`- Last merge: ${m.last_merge_at}`);
43
+ }
44
+ }
45
+ // Trajectory projections
46
+ const comp = result.projections?.completion;
47
+ const cost = result.projections?.cost;
48
+ if (comp || cost) {
49
+ parts.push('\n## Trajectory Projections\n');
50
+ }
51
+ if (comp) {
52
+ parts.push('### Completion Forecast');
53
+ if (comp.status === 'complete') {
54
+ parts.push('- Status: **complete** (all issues done)');
55
+ }
56
+ else if (comp.status === 'stalled') {
57
+ parts.push(`- Status: **stalled** -- ${comp.stalledReason || 'no recent throughput'}`);
58
+ parts.push(`- Remaining issues: ${comp.remainingIssues}`);
59
+ }
60
+ else {
61
+ parts.push(`- Projected completion: ${comp.projectedCompletionDate ? new Date(comp.projectedCompletionDate).toISOString().split('T')[0] : 'unknown'}`);
62
+ parts.push(`- Days remaining: ${comp.daysRemaining}`);
63
+ parts.push(`- Velocity: ${comp.velocity} issues/day (${comp.windowDays}d window, ${comp.completedInWindow} completed)`);
64
+ parts.push(`- Confidence: ${comp.confidence}`);
65
+ parts.push(`- Remaining issues: ${comp.remainingIssues}`);
66
+ }
67
+ }
68
+ if (cost) {
69
+ parts.push('\n### Cost Forecast');
70
+ parts.push(`- Cost to date: $${cost.costToDate.toFixed(2)}`);
71
+ parts.push(`- Burn rate: $${cost.burnRatePerDay.toFixed(2)}/day`);
72
+ if (cost.avgCostPerIssue !== null) {
73
+ parts.push(`- Avg cost per issue: $${cost.avgCostPerIssue.toFixed(2)}`);
74
+ }
75
+ if (cost.projectedTotalCost !== null) {
76
+ parts.push(`- Projected total: $${cost.projectedTotalCost.toFixed(2)} ($${cost.projectedRemainingCost?.toFixed(2)} remaining)`);
77
+ }
78
+ }
79
+ return parts.join('\n');
80
+ }
81
+ catch (err) {
82
+ console.warn(`[assembly-engine] reality.metrics: failed: ${err.message}`);
83
+ return '';
84
+ }
85
+ });
86
+ //# sourceMappingURL=reality-metrics.js.map