@itaila/archetype 0.3.30

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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +475 -0
  3. package/dist/audit/audit-persona.d.ts +163 -0
  4. package/dist/audit/audit-persona.d.ts.map +1 -0
  5. package/dist/audit/audit-persona.js +415 -0
  6. package/dist/audit/audit-persona.js.map +1 -0
  7. package/dist/audit/brain-reflection.d.ts +33 -0
  8. package/dist/audit/brain-reflection.d.ts.map +1 -0
  9. package/dist/audit/brain-reflection.js +148 -0
  10. package/dist/audit/brain-reflection.js.map +1 -0
  11. package/dist/audit/conversation-audit.d.ts +12 -0
  12. package/dist/audit/conversation-audit.d.ts.map +1 -0
  13. package/dist/audit/conversation-audit.js +76 -0
  14. package/dist/audit/conversation-audit.js.map +1 -0
  15. package/dist/audit/prompt-audit.d.ts +10 -0
  16. package/dist/audit/prompt-audit.d.ts.map +1 -0
  17. package/dist/audit/prompt-audit.js +153 -0
  18. package/dist/audit/prompt-audit.js.map +1 -0
  19. package/dist/audit/prompt-dump.d.ts +137 -0
  20. package/dist/audit/prompt-dump.d.ts.map +1 -0
  21. package/dist/audit/prompt-dump.js +269 -0
  22. package/dist/audit/prompt-dump.js.map +1 -0
  23. package/dist/audit/trace-integrity.d.ts +33 -0
  24. package/dist/audit/trace-integrity.d.ts.map +1 -0
  25. package/dist/audit/trace-integrity.js +109 -0
  26. package/dist/audit/trace-integrity.js.map +1 -0
  27. package/dist/audit/types.d.ts +92 -0
  28. package/dist/audit/types.d.ts.map +1 -0
  29. package/dist/audit/types.js +2 -0
  30. package/dist/audit/types.js.map +1 -0
  31. package/dist/audit/version.d.ts +14 -0
  32. package/dist/audit/version.d.ts.map +1 -0
  33. package/dist/audit/version.js +65 -0
  34. package/dist/audit/version.js.map +1 -0
  35. package/dist/brain.d.ts +7 -0
  36. package/dist/brain.d.ts.map +1 -0
  37. package/dist/brain.js +83 -0
  38. package/dist/brain.js.map +1 -0
  39. package/dist/builder/actions.d.ts +60 -0
  40. package/dist/builder/actions.d.ts.map +1 -0
  41. package/dist/builder/actions.js +257 -0
  42. package/dist/builder/actions.js.map +1 -0
  43. package/dist/builder/browser.d.ts +140 -0
  44. package/dist/builder/browser.d.ts.map +1 -0
  45. package/dist/builder/browser.js +232 -0
  46. package/dist/builder/browser.js.map +1 -0
  47. package/dist/builder/executor.d.ts +228 -0
  48. package/dist/builder/executor.d.ts.map +1 -0
  49. package/dist/builder/executor.js +1548 -0
  50. package/dist/builder/executor.js.map +1 -0
  51. package/dist/builder/index.d.ts +24 -0
  52. package/dist/builder/index.d.ts.map +1 -0
  53. package/dist/builder/index.js +24 -0
  54. package/dist/builder/index.js.map +1 -0
  55. package/dist/builder/node-test-discovery.d.ts +13 -0
  56. package/dist/builder/node-test-discovery.d.ts.map +1 -0
  57. package/dist/builder/node-test-discovery.js +45 -0
  58. package/dist/builder/node-test-discovery.js.map +1 -0
  59. package/dist/builder/sandbox.d.ts +172 -0
  60. package/dist/builder/sandbox.d.ts.map +1 -0
  61. package/dist/builder/sandbox.js +294 -0
  62. package/dist/builder/sandbox.js.map +1 -0
  63. package/dist/builder/workspace-files.d.ts +63 -0
  64. package/dist/builder/workspace-files.d.ts.map +1 -0
  65. package/dist/builder/workspace-files.js +190 -0
  66. package/dist/builder/workspace-files.js.map +1 -0
  67. package/dist/core/actions.d.ts +55 -0
  68. package/dist/core/actions.d.ts.map +1 -0
  69. package/dist/core/actions.js +311 -0
  70. package/dist/core/actions.js.map +1 -0
  71. package/dist/core/attachment-notes.d.ts +7 -0
  72. package/dist/core/attachment-notes.d.ts.map +1 -0
  73. package/dist/core/attachment-notes.js +38 -0
  74. package/dist/core/attachment-notes.js.map +1 -0
  75. package/dist/core/context.d.ts +10 -0
  76. package/dist/core/context.d.ts.map +1 -0
  77. package/dist/core/context.js +108 -0
  78. package/dist/core/context.js.map +1 -0
  79. package/dist/core/crud-prompt.d.ts +16 -0
  80. package/dist/core/crud-prompt.d.ts.map +1 -0
  81. package/dist/core/crud-prompt.js +268 -0
  82. package/dist/core/crud-prompt.js.map +1 -0
  83. package/dist/core/crud-schema.d.ts +12 -0
  84. package/dist/core/crud-schema.d.ts.map +1 -0
  85. package/dist/core/crud-schema.js +42 -0
  86. package/dist/core/crud-schema.js.map +1 -0
  87. package/dist/core/effective-config.d.ts +13 -0
  88. package/dist/core/effective-config.d.ts.map +1 -0
  89. package/dist/core/effective-config.js +33 -0
  90. package/dist/core/effective-config.js.map +1 -0
  91. package/dist/core/entities.d.ts +82 -0
  92. package/dist/core/entities.d.ts.map +1 -0
  93. package/dist/core/entities.js +116 -0
  94. package/dist/core/entities.js.map +1 -0
  95. package/dist/core/entity-helpers.d.ts +47 -0
  96. package/dist/core/entity-helpers.d.ts.map +1 -0
  97. package/dist/core/entity-helpers.js +122 -0
  98. package/dist/core/entity-helpers.js.map +1 -0
  99. package/dist/core/entity-registry.d.ts +47 -0
  100. package/dist/core/entity-registry.d.ts.map +1 -0
  101. package/dist/core/entity-registry.js +54 -0
  102. package/dist/core/entity-registry.js.map +1 -0
  103. package/dist/core/eq.d.ts +13 -0
  104. package/dist/core/eq.d.ts.map +1 -0
  105. package/dist/core/eq.js +41 -0
  106. package/dist/core/eq.js.map +1 -0
  107. package/dist/core/focus-context.d.ts +19 -0
  108. package/dist/core/focus-context.d.ts.map +1 -0
  109. package/dist/core/focus-context.js +46 -0
  110. package/dist/core/focus-context.js.map +1 -0
  111. package/dist/core/focus-mode-actions.d.ts +23 -0
  112. package/dist/core/focus-mode-actions.d.ts.map +1 -0
  113. package/dist/core/focus-mode-actions.js +74 -0
  114. package/dist/core/focus-mode-actions.js.map +1 -0
  115. package/dist/core/greeting.d.ts +10 -0
  116. package/dist/core/greeting.d.ts.map +1 -0
  117. package/dist/core/greeting.js +41 -0
  118. package/dist/core/greeting.js.map +1 -0
  119. package/dist/core/identity.d.ts +13 -0
  120. package/dist/core/identity.d.ts.map +1 -0
  121. package/dist/core/identity.js +54 -0
  122. package/dist/core/identity.js.map +1 -0
  123. package/dist/core/knowledge.d.ts +10 -0
  124. package/dist/core/knowledge.d.ts.map +1 -0
  125. package/dist/core/knowledge.js +40 -0
  126. package/dist/core/knowledge.js.map +1 -0
  127. package/dist/core/memory-actions.d.ts +38 -0
  128. package/dist/core/memory-actions.d.ts.map +1 -0
  129. package/dist/core/memory-actions.js +181 -0
  130. package/dist/core/memory-actions.js.map +1 -0
  131. package/dist/core/memory.d.ts +35 -0
  132. package/dist/core/memory.d.ts.map +1 -0
  133. package/dist/core/memory.js +168 -0
  134. package/dist/core/memory.js.map +1 -0
  135. package/dist/core/peer-actions.d.ts +15 -0
  136. package/dist/core/peer-actions.d.ts.map +1 -0
  137. package/dist/core/peer-actions.js +33 -0
  138. package/dist/core/peer-actions.js.map +1 -0
  139. package/dist/core/prompt-builder.d.ts +46 -0
  140. package/dist/core/prompt-builder.d.ts.map +1 -0
  141. package/dist/core/prompt-builder.js +543 -0
  142. package/dist/core/prompt-builder.js.map +1 -0
  143. package/dist/core/prompt-mode.d.ts +3 -0
  144. package/dist/core/prompt-mode.d.ts.map +1 -0
  145. package/dist/core/prompt-mode.js +6 -0
  146. package/dist/core/prompt-mode.js.map +1 -0
  147. package/dist/core/prompted-turn.d.ts +6 -0
  148. package/dist/core/prompted-turn.d.ts.map +1 -0
  149. package/dist/core/prompted-turn.js +48 -0
  150. package/dist/core/prompted-turn.js.map +1 -0
  151. package/dist/core/request-builder.d.ts +14 -0
  152. package/dist/core/request-builder.d.ts.map +1 -0
  153. package/dist/core/request-builder.js +64 -0
  154. package/dist/core/request-builder.js.map +1 -0
  155. package/dist/core/session-routing.d.ts +23 -0
  156. package/dist/core/session-routing.d.ts.map +1 -0
  157. package/dist/core/session-routing.js +59 -0
  158. package/dist/core/session-routing.js.map +1 -0
  159. package/dist/core/voice.d.ts +6 -0
  160. package/dist/core/voice.d.ts.map +1 -0
  161. package/dist/core/voice.js +30 -0
  162. package/dist/core/voice.js.map +1 -0
  163. package/dist/engine/chat.d.ts +45 -0
  164. package/dist/engine/chat.d.ts.map +1 -0
  165. package/dist/engine/chat.js +308 -0
  166. package/dist/engine/chat.js.map +1 -0
  167. package/dist/engine/continuity.d.ts +107 -0
  168. package/dist/engine/continuity.d.ts.map +1 -0
  169. package/dist/engine/continuity.js +320 -0
  170. package/dist/engine/continuity.js.map +1 -0
  171. package/dist/engine/crud.d.ts +62 -0
  172. package/dist/engine/crud.d.ts.map +1 -0
  173. package/dist/engine/crud.js +260 -0
  174. package/dist/engine/crud.js.map +1 -0
  175. package/dist/engine/side-effects.d.ts +93 -0
  176. package/dist/engine/side-effects.d.ts.map +1 -0
  177. package/dist/engine/side-effects.js +271 -0
  178. package/dist/engine/side-effects.js.map +1 -0
  179. package/dist/engine/staging.d.ts +29 -0
  180. package/dist/engine/staging.d.ts.map +1 -0
  181. package/dist/engine/staging.js +159 -0
  182. package/dist/engine/staging.js.map +1 -0
  183. package/dist/engine/working-set.d.ts +18 -0
  184. package/dist/engine/working-set.d.ts.map +1 -0
  185. package/dist/engine/working-set.js +246 -0
  186. package/dist/engine/working-set.js.map +1 -0
  187. package/dist/evals/action-contracts.d.ts +40 -0
  188. package/dist/evals/action-contracts.d.ts.map +1 -0
  189. package/dist/evals/action-contracts.js +208 -0
  190. package/dist/evals/action-contracts.js.map +1 -0
  191. package/dist/evals/brain-bloat.d.ts +39 -0
  192. package/dist/evals/brain-bloat.d.ts.map +1 -0
  193. package/dist/evals/brain-bloat.js +167 -0
  194. package/dist/evals/brain-bloat.js.map +1 -0
  195. package/dist/evals/brain-prescriptions.d.ts +30 -0
  196. package/dist/evals/brain-prescriptions.d.ts.map +1 -0
  197. package/dist/evals/brain-prescriptions.js +148 -0
  198. package/dist/evals/brain-prescriptions.js.map +1 -0
  199. package/dist/evals/cross-layer-duplicates.d.ts +49 -0
  200. package/dist/evals/cross-layer-duplicates.d.ts.map +1 -0
  201. package/dist/evals/cross-layer-duplicates.js +289 -0
  202. package/dist/evals/cross-layer-duplicates.js.map +1 -0
  203. package/dist/evals/entity-visibility.d.ts +28 -0
  204. package/dist/evals/entity-visibility.d.ts.map +1 -0
  205. package/dist/evals/entity-visibility.js +216 -0
  206. package/dist/evals/entity-visibility.js.map +1 -0
  207. package/dist/evals/index.d.ts +19 -0
  208. package/dist/evals/index.d.ts.map +1 -0
  209. package/dist/evals/index.js +11 -0
  210. package/dist/evals/index.js.map +1 -0
  211. package/dist/evals/judge.d.ts +22 -0
  212. package/dist/evals/judge.d.ts.map +1 -0
  213. package/dist/evals/judge.js +337 -0
  214. package/dist/evals/judge.js.map +1 -0
  215. package/dist/evals/operational-contract.d.ts +40 -0
  216. package/dist/evals/operational-contract.d.ts.map +1 -0
  217. package/dist/evals/operational-contract.js +115 -0
  218. package/dist/evals/operational-contract.js.map +1 -0
  219. package/dist/evals/prompt-content.d.ts +14 -0
  220. package/dist/evals/prompt-content.d.ts.map +1 -0
  221. package/dist/evals/prompt-content.js +104 -0
  222. package/dist/evals/prompt-content.js.map +1 -0
  223. package/dist/evals/runtime.d.ts +4 -0
  224. package/dist/evals/runtime.d.ts.map +1 -0
  225. package/dist/evals/runtime.js +197 -0
  226. package/dist/evals/runtime.js.map +1 -0
  227. package/dist/evals/sample-projects.d.ts +143 -0
  228. package/dist/evals/sample-projects.d.ts.map +1 -0
  229. package/dist/evals/sample-projects.js +644 -0
  230. package/dist/evals/sample-projects.js.map +1 -0
  231. package/dist/evals/types.d.ts +88 -0
  232. package/dist/evals/types.d.ts.map +1 -0
  233. package/dist/evals/types.js +2 -0
  234. package/dist/evals/types.js.map +1 -0
  235. package/dist/foundation/index.d.ts +158 -0
  236. package/dist/foundation/index.d.ts.map +1 -0
  237. package/dist/foundation/index.js +256 -0
  238. package/dist/foundation/index.js.map +1 -0
  239. package/dist/index.d.ts +223 -0
  240. package/dist/index.d.ts.map +1 -0
  241. package/dist/index.js +998 -0
  242. package/dist/index.js.map +1 -0
  243. package/dist/managed/autonomous-loop.d.ts +199 -0
  244. package/dist/managed/autonomous-loop.d.ts.map +1 -0
  245. package/dist/managed/autonomous-loop.js +451 -0
  246. package/dist/managed/autonomous-loop.js.map +1 -0
  247. package/dist/managed/conversation.d.ts +20 -0
  248. package/dist/managed/conversation.d.ts.map +1 -0
  249. package/dist/managed/conversation.js +40 -0
  250. package/dist/managed/conversation.js.map +1 -0
  251. package/dist/managed/knowledge.d.ts +7 -0
  252. package/dist/managed/knowledge.d.ts.map +1 -0
  253. package/dist/managed/knowledge.js +174 -0
  254. package/dist/managed/knowledge.js.map +1 -0
  255. package/dist/managed/memory-manager.d.ts +7 -0
  256. package/dist/managed/memory-manager.d.ts.map +1 -0
  257. package/dist/managed/memory-manager.js +18 -0
  258. package/dist/managed/memory-manager.js.map +1 -0
  259. package/dist/managed/memory-review.d.ts +45 -0
  260. package/dist/managed/memory-review.d.ts.map +1 -0
  261. package/dist/managed/memory-review.js +130 -0
  262. package/dist/managed/memory-review.js.map +1 -0
  263. package/dist/managed/storage.d.ts +2 -0
  264. package/dist/managed/storage.d.ts.map +1 -0
  265. package/dist/managed/storage.js +2 -0
  266. package/dist/managed/storage.js.map +1 -0
  267. package/dist/managed/work-history.d.ts +23 -0
  268. package/dist/managed/work-history.d.ts.map +1 -0
  269. package/dist/managed/work-history.js +31 -0
  270. package/dist/managed/work-history.js.map +1 -0
  271. package/dist/observability/index.d.ts +15 -0
  272. package/dist/observability/index.d.ts.map +1 -0
  273. package/dist/observability/index.js +15 -0
  274. package/dist/observability/index.js.map +1 -0
  275. package/dist/observability/render-run-markdown.d.ts +90 -0
  276. package/dist/observability/render-run-markdown.d.ts.map +1 -0
  277. package/dist/observability/render-run-markdown.js +231 -0
  278. package/dist/observability/render-run-markdown.js.map +1 -0
  279. package/dist/observability/turn-reporter.d.ts +20 -0
  280. package/dist/observability/turn-reporter.d.ts.map +1 -0
  281. package/dist/observability/turn-reporter.js +106 -0
  282. package/dist/observability/turn-reporter.js.map +1 -0
  283. package/dist/persona.d.ts +49 -0
  284. package/dist/persona.d.ts.map +1 -0
  285. package/dist/persona.js +287 -0
  286. package/dist/persona.js.map +1 -0
  287. package/dist/playbook/defaults.d.ts +25 -0
  288. package/dist/playbook/defaults.d.ts.map +1 -0
  289. package/dist/playbook/defaults.js +108 -0
  290. package/dist/playbook/defaults.js.map +1 -0
  291. package/dist/playbook/invariants.d.ts +244 -0
  292. package/dist/playbook/invariants.d.ts.map +1 -0
  293. package/dist/playbook/invariants.js +259 -0
  294. package/dist/playbook/invariants.js.map +1 -0
  295. package/dist/playbook/templates.d.ts +7 -0
  296. package/dist/playbook/templates.d.ts.map +1 -0
  297. package/dist/playbook/templates.js +437 -0
  298. package/dist/playbook/templates.js.map +1 -0
  299. package/dist/providers/gemini.d.ts +73 -0
  300. package/dist/providers/gemini.d.ts.map +1 -0
  301. package/dist/providers/gemini.js +536 -0
  302. package/dist/providers/gemini.js.map +1 -0
  303. package/dist/providers/types.d.ts +2 -0
  304. package/dist/providers/types.d.ts.map +1 -0
  305. package/dist/providers/types.js +2 -0
  306. package/dist/providers/types.js.map +1 -0
  307. package/dist/providers/zod-to-gemini.d.ts +8 -0
  308. package/dist/providers/zod-to-gemini.d.ts.map +1 -0
  309. package/dist/providers/zod-to-gemini.js +148 -0
  310. package/dist/providers/zod-to-gemini.js.map +1 -0
  311. package/dist/samples/pm-spec-agent.d.ts +22 -0
  312. package/dist/samples/pm-spec-agent.d.ts.map +1 -0
  313. package/dist/samples/pm-spec-agent.js +53 -0
  314. package/dist/samples/pm-spec-agent.js.map +1 -0
  315. package/dist/types.d.ts +920 -0
  316. package/dist/types.d.ts.map +1 -0
  317. package/dist/types.js +2 -0
  318. package/dist/types.js.map +1 -0
  319. package/package.json +68 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Render a benchmark run as a single turn-by-turn TURNS.md-style report.
3
+ *
4
+ * Purpose: the bug is almost always in the prompt the model received.
5
+ * Reading turn-by-turn should take ≤30 seconds and surface:
6
+ * - the system prompt (deduped — appears once if constant across turns)
7
+ * - per-turn input (as the model saw it)
8
+ * - per-turn assistant emission (message verbatim + action summary)
9
+ * - any errors (unknown action, schema fail) flagged inline
10
+ * - a fingerprint header (turn count, action mix, errors)
11
+ *
12
+ * This module is pure: it takes structured data and returns a string.
13
+ * Path discovery (where traces live, where errors.jsonl sits, how to
14
+ * read a score) belongs to the host CLI — archetype/observability ships
15
+ * a renderer, not a file-system reader. See `parseTracePacket` if you
16
+ * want a quick way to hydrate traces from JSON files.
17
+ *
18
+ * Works in browsers and Node (no fs use here).
19
+ */
20
+ /**
21
+ * Render the final markdown. Returns the full TURNS.md body as a string.
22
+ * Host writes it wherever it wants.
23
+ */
24
+ export function renderRunMarkdown(input) {
25
+ const traces = input.traces;
26
+ if (traces.length === 0) {
27
+ return `# Turn review — ${input.runId}\n\n(no turn traces)\n`;
28
+ }
29
+ const inputCharBudget = input.inputCharBudget ?? 1200;
30
+ const errors = input.errors ?? [];
31
+ const score = input.score ?? null;
32
+ // System prompt dedup — if identical across all turns, show once.
33
+ const systemPrompts = new Set(traces.map((t) => t.systemPrompt ?? ''));
34
+ const systemPromptConstant = systemPrompts.size === 1;
35
+ // Action fingerprint from the last trace's history (has the most data).
36
+ const lastHistory = traces[traces.length - 1].history ?? [];
37
+ const fingerprint = computeFingerprint(lastHistory);
38
+ const out = [];
39
+ out.push(`# Turn review — ${input.runId}`);
40
+ out.push('');
41
+ out.push(`- benchmark: ${input.metadata?.benchmarkId ?? '?'}`);
42
+ out.push(`- artifactName: ${input.metadata?.artifactName ?? '?'}`);
43
+ out.push(`- status: ${input.metadata?.status ?? '?'}`);
44
+ out.push(`- turn traces: ${traces.length}`);
45
+ out.push(`- assistant turns (from history): ${fingerprint.assistantTurns}`);
46
+ out.push(`- single-action turns: ${fingerprint.singleActionTurns}`);
47
+ out.push(`- multi-action turns: ${fingerprint.multiActionTurns}`);
48
+ out.push(`- zero-action turns: ${fingerprint.zeroActionTurns}`);
49
+ out.push(`- editFile shape: single=${fingerprint.singleEditCalls}, multi=${fingerprint.multiEditCalls}`);
50
+ out.push(`- action mix: ${JSON.stringify(fingerprint.actionCounts)}`);
51
+ if (score) {
52
+ out.push(`- customer score: **${score.score ?? '?'}** (${score.verdict ?? '?'}, ${score.ship ?? '?'})`);
53
+ }
54
+ const errorNotes = errors
55
+ .filter((e) => !!e)
56
+ .map((e) => `turn ${e.turn ?? '?'}: ${e.reason ?? ''}`);
57
+ if (errorNotes.length > 0) {
58
+ out.push('');
59
+ out.push(`## ⚠️ Errors (${errorNotes.length})`);
60
+ for (const n of errorNotes)
61
+ out.push(`- ${n}`);
62
+ }
63
+ out.push('');
64
+ if (systemPromptConstant) {
65
+ out.push('## System prompt (constant across turns)');
66
+ }
67
+ else {
68
+ out.push(`## System prompt — changed ${systemPrompts.size} times across turns (first shown below; see prompt-traces/ for each variant)`);
69
+ }
70
+ out.push('');
71
+ out.push('```');
72
+ out.push(traces[0].systemPrompt ?? '(empty)');
73
+ out.push('```');
74
+ out.push('');
75
+ // Per-turn — walk the latest trace's history (contains the full run).
76
+ out.push('## Turn-by-turn');
77
+ out.push('');
78
+ let turnNum = 0;
79
+ for (const h of lastHistory) {
80
+ const content = typeof h.content === 'string' ? h.content : JSON.stringify(h.content);
81
+ if (h.role === 'user') {
82
+ turnNum += 1;
83
+ out.push(`### Turn ${turnNum} input`);
84
+ out.push('');
85
+ out.push('```');
86
+ out.push(clip(content, inputCharBudget));
87
+ out.push('```');
88
+ out.push('');
89
+ }
90
+ else if (h.role === 'assistant') {
91
+ renderAssistantTurn(out, turnNum, content);
92
+ }
93
+ }
94
+ // Capture the latest trace's `message` as the next turn's input (not
95
+ // yet in history) — gives visibility into whatever the loop is about
96
+ // to send when it stopped.
97
+ const latestInput = traces[traces.length - 1].message;
98
+ if (latestInput) {
99
+ turnNum += 1;
100
+ out.push(`### Turn ${turnNum} input (latest — model may have responded after this was captured)`);
101
+ out.push('');
102
+ out.push('```');
103
+ out.push(clip(latestInput, inputCharBudget));
104
+ out.push('```');
105
+ out.push('');
106
+ }
107
+ return out.join('\n');
108
+ }
109
+ function computeFingerprint(history) {
110
+ const actionCounts = {};
111
+ let assistantTurns = 0;
112
+ let multiActionTurns = 0;
113
+ let zeroActionTurns = 0;
114
+ let multiEditCalls = 0;
115
+ let singleEditCalls = 0;
116
+ for (const h of history) {
117
+ if (h.role !== 'assistant')
118
+ continue;
119
+ const payload = tryParseAssistantPayload(typeof h.content === 'string' ? h.content : '');
120
+ if (!payload)
121
+ continue;
122
+ assistantTurns += 1;
123
+ const actions = payload.actions ?? [];
124
+ if (actions.length === 0)
125
+ zeroActionTurns += 1;
126
+ else if (actions.length > 1)
127
+ multiActionTurns += 1;
128
+ for (const a of actions) {
129
+ const nm = a.name ?? '?';
130
+ actionCounts[nm] = (actionCounts[nm] ?? 0) + 1;
131
+ if (nm === 'editFile') {
132
+ const edits = (a.params ?? {}).edits;
133
+ if (Array.isArray(edits)) {
134
+ if (edits.length > 1)
135
+ multiEditCalls += 1;
136
+ else
137
+ singleEditCalls += 1;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ const singleActionTurns = assistantTurns - multiActionTurns - zeroActionTurns;
143
+ return {
144
+ assistantTurns,
145
+ singleActionTurns,
146
+ multiActionTurns,
147
+ zeroActionTurns,
148
+ multiEditCalls,
149
+ singleEditCalls,
150
+ actionCounts,
151
+ };
152
+ }
153
+ function renderAssistantTurn(out, turnNum, content) {
154
+ const payload = tryParseAssistantPayload(content);
155
+ if (payload) {
156
+ out.push(`**Turn ${turnNum} assistant** — ${(payload.actions ?? []).length} action(s)`);
157
+ if (payload.message && payload.message.trim()) {
158
+ out.push('');
159
+ out.push('> ' + payload.message.replace(/\n/g, '\n> '));
160
+ }
161
+ if (payload.actions && payload.actions.length > 0) {
162
+ out.push('');
163
+ for (const a of payload.actions) {
164
+ out.push(`- \`${summarizeAction(a)}\``);
165
+ }
166
+ }
167
+ if (payload.diagnostics && payload.diagnostics.length > 0) {
168
+ out.push('');
169
+ out.push('_diagnostics:_');
170
+ for (const d of payload.diagnostics)
171
+ out.push(`- ⚠️ ${d}`);
172
+ }
173
+ out.push('');
174
+ }
175
+ else {
176
+ out.push(`**Turn ${turnNum} assistant** — (unparseable)`);
177
+ out.push('```');
178
+ out.push(content.slice(0, 600));
179
+ out.push('```');
180
+ out.push('');
181
+ }
182
+ }
183
+ /**
184
+ * Extract an AssistantPayload from a raw assistant-message string.
185
+ * Handles the common case of prose before a JSON object — everything
186
+ * before the first `{` is ignored.
187
+ */
188
+ export function tryParseAssistantPayload(content) {
189
+ if (typeof content !== 'string')
190
+ return null;
191
+ const i = content.indexOf('{');
192
+ if (i < 0)
193
+ return null;
194
+ try {
195
+ return JSON.parse(content.slice(i));
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ /**
202
+ * Compact one-line summary of an action: keeps reference keys (path,
203
+ * pattern, id, name, outcome, …) visible, drops bodies (content, stdout,
204
+ * image payloads). Used in the per-turn action list for fast scanning.
205
+ */
206
+ export function summarizeAction(a) {
207
+ const name = a.name ?? '?';
208
+ const params = a.params ?? {};
209
+ const keep = {};
210
+ for (const refKey of ['path', 'pattern', 'pathGlob', 'id', 'entity', 'name', 'outcome', 'summary', 'label']) {
211
+ if (refKey in params && params[refKey] !== undefined)
212
+ keep[refKey] = params[refKey];
213
+ }
214
+ if (name === 'editFile') {
215
+ const edits = params.edits;
216
+ keep.editCount = Array.isArray(edits) ? edits.length : (params.oldText !== undefined ? 1 : 0);
217
+ }
218
+ if (name === 'writeFile') {
219
+ const content = params.content;
220
+ if (typeof content === 'string')
221
+ keep.bytes = Buffer.byteLength(content, 'utf8');
222
+ }
223
+ const kvs = Object.entries(keep)
224
+ .map(([k, v]) => `${k}=${JSON.stringify(v).slice(0, 80)}`)
225
+ .join(', ');
226
+ return kvs ? `${name} {${kvs}}` : name;
227
+ }
228
+ function clip(s, limit) {
229
+ return s.length > limit ? s.slice(0, limit) + `\n… [+${s.length - limit} chars]` : s;
230
+ }
231
+ //# sourceMappingURL=render-run-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-run-markdown.js","sourceRoot":"","sources":["../../src/observability/render-run-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { LoopTurnRecord } from '../managed/autonomous-loop.js';
2
+ export interface TurnReporterOptions {
3
+ /** Directory to write errors.jsonl + diagnostics.md into. */
4
+ runRoot: string;
5
+ /**
6
+ * Whether to print stderr callouts alongside file writes. Default true.
7
+ * Set false for batch jobs where stderr is not human-watched.
8
+ */
9
+ emitStderr?: boolean;
10
+ }
11
+ export interface TurnReporterHook {
12
+ /** Wire this into `runAutonomousLoop({ hooks: { onTurn } })`. */
13
+ onTurn: (record: LoopTurnRecord) => void;
14
+ }
15
+ /**
16
+ * Build an onTurn reporter hook. One instance per benchmark run; safe
17
+ * to share across peers/delegates (writes append).
18
+ */
19
+ export declare function createTurnReporter(options: TurnReporterOptions): TurnReporterHook;
20
+ //# sourceMappingURL=turn-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-reporter.d.ts","sourceRoot":"","sources":["../../src/observability/turn-reporter.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnE,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;CACzC;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CAejF"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Turn reporter — persists per-turn errors + builder diagnostics so
3
+ * every autonomous-loop consumer gets the same observability pattern
4
+ * without inlining the hook logic.
5
+ *
6
+ * What it writes (per turn, when there's something to report):
7
+ * runRoot/errors.jsonl one JSON-per-line entry for each
8
+ * validation error or provider error
9
+ * runRoot/diagnostics.md one markdown line per diagnostic the
10
+ * builder emitted through its
11
+ * `diagnostics[]` response field
12
+ *
13
+ * What it prints (stderr, one line per event, with ANSI prefix):
14
+ * [ARCHETYPE ERROR] turn N: unknown_action "doesNotExist" — ...
15
+ * [BUILDER DIAGNOSTIC] turn N: <diagnostic>
16
+ *
17
+ * The "fail loudly" policy lives here: silent failures mask broken
18
+ * prompt/contract/context bugs. Every call-site error surfaces in both
19
+ * the durable jsonl + a visible stderr callout. Retries continue
20
+ * regardless — this module is telemetry, not flow control.
21
+ *
22
+ * Node-only (writes to local filesystem).
23
+ */
24
+ import fs from 'node:fs';
25
+ import path from 'node:path';
26
+ /**
27
+ * Build an onTurn reporter hook. One instance per benchmark run; safe
28
+ * to share across peers/delegates (writes append).
29
+ */
30
+ export function createTurnReporter(options) {
31
+ const { runRoot } = options;
32
+ const emitStderr = options.emitStderr ?? true;
33
+ const errFile = path.join(runRoot, 'errors.jsonl');
34
+ const diagFile = path.join(runRoot, 'diagnostics.md');
35
+ fs.mkdirSync(runRoot, { recursive: true });
36
+ return {
37
+ onTurn: (record) => {
38
+ persistErrors(record, errFile, emitStderr);
39
+ persistDiagnostics(record, diagFile, emitStderr);
40
+ },
41
+ };
42
+ }
43
+ function persistErrors(record, errFile, emitStderr) {
44
+ const lines = [];
45
+ for (const ve of record.validationErrors ?? []) {
46
+ lines.push({
47
+ turn: record.turn,
48
+ kind: ve.status,
49
+ action: ve.name,
50
+ reason: ve.error ?? `action "${ve.name}" rejected by contract (${ve.status})`,
51
+ });
52
+ }
53
+ if (record.providerError) {
54
+ lines.push({
55
+ turn: record.turn,
56
+ kind: 'provider_error',
57
+ action: null,
58
+ reason: record.providerError,
59
+ });
60
+ }
61
+ if (lines.length === 0)
62
+ return;
63
+ try {
64
+ fs.appendFileSync(errFile, lines.map(l => JSON.stringify(l)).join('\n') + '\n');
65
+ }
66
+ catch (err) {
67
+ console.error(`[errors.jsonl] write failed: ${err instanceof Error ? err.message : String(err)}`);
68
+ }
69
+ if (emitStderr) {
70
+ for (const rec of lines) {
71
+ const actionSuffix = rec.action ? ` "${rec.action}"` : '';
72
+ console.error(`\x1b[31m[ARCHETYPE ERROR]\x1b[0m turn ${rec.turn}: ${rec.kind}${actionSuffix} — ${rec.reason}`);
73
+ }
74
+ }
75
+ }
76
+ function persistDiagnostics(record, diagFile, emitStderr) {
77
+ if (!record.rawAssistantResponse)
78
+ return;
79
+ const i = record.rawAssistantResponse.indexOf('{');
80
+ if (i < 0)
81
+ return;
82
+ let parsed = null;
83
+ try {
84
+ parsed = JSON.parse(record.rawAssistantResponse.slice(i));
85
+ }
86
+ catch {
87
+ return; // diagnostics are optional — parse failures are not errors
88
+ }
89
+ const raw = Array.isArray(parsed?.diagnostics) ? parsed.diagnostics : [];
90
+ const diags = raw.filter((d) => typeof d === 'string' && d.trim().length > 0);
91
+ if (diags.length === 0)
92
+ return;
93
+ try {
94
+ const entries = diags.map((d) => `- turn ${record.turn}: ${d}`).join('\n') + '\n';
95
+ fs.appendFileSync(diagFile, entries);
96
+ }
97
+ catch (err) {
98
+ console.error(`[diagnostics.md] write failed: ${err instanceof Error ? err.message : String(err)}`);
99
+ }
100
+ if (emitStderr) {
101
+ for (const d of diags) {
102
+ console.error(`\x1b[33m[BUILDER DIAGNOSTIC]\x1b[0m turn ${record.turn}: ${d}`);
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=turn-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-reporter.js","sourceRoot":"","sources":["../../src/observability/turn-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { PersonaConfig, ChatInput, ChatResult, GreetingInput, PromptedTurnInput, RetrospectInput, RetrospectResult } from './types.js';
2
+ import type { AuditInput, AuditResult } from './audit/types.js';
3
+ /**
4
+ * PersonaEngine — the main SDK entry point.
5
+ * Wraps a PersonaConfig and provides the chat interface.
6
+ */
7
+ export declare class PersonaEngine {
8
+ readonly config: PersonaConfig;
9
+ constructor(config: PersonaConfig);
10
+ /**
11
+ * Stateless chat — app manages history + persistence.
12
+ * Build prompt → call LLM → parse response.
13
+ */
14
+ chat(input: ChatInput): Promise<ChatResult>;
15
+ /**
16
+ * Stateless app-initiated turn — delegates to chat() with the intent
17
+ * framed as a system section, not a user message.
18
+ * The message slot gets a neutral directive so the AI understands
19
+ * this is system-initiated, not user-initiated.
20
+ */
21
+ promptedTurn(input: PromptedTurnInput): Promise<ChatResult>;
22
+ /**
23
+ * Stateless retrospective memory pass — infer durable memory updates silently.
24
+ * Returns memory CRUD actions only; no user-facing message.
25
+ */
26
+ retrospect(input: RetrospectInput): Promise<RetrospectResult>;
27
+ /**
28
+ * Stateless greeting — build greeting prompt, call LLM, return plain text.
29
+ * No response schema, no actions — just a warm check-in message.
30
+ */
31
+ greet(input: GreetingInput): Promise<{
32
+ greeting: string;
33
+ }>;
34
+ /**
35
+ * Check if a greeting is appropriate given the last message time.
36
+ */
37
+ shouldGreet(lastMessageAt: Date | null | undefined, timezone?: string): boolean;
38
+ /** The persona's display name */
39
+ get name(): string;
40
+ /** The LLM provider name */
41
+ get providerName(): string;
42
+ /**
43
+ * Audit the persona for keystone principle violations.
44
+ * Reviews the assembled prompt and optionally the conversation history.
45
+ * Returns explicit, actionable failure lists for developers/coding agents.
46
+ */
47
+ audit(input: AuditInput): Promise<AuditResult>;
48
+ }
49
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../src/persona.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAc,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAA;AAUrK,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAoJ/D;;;GAGG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;gBAElB,MAAM,EAAE,aAAa;IAIjC;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAIjD;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC;IAyCjE;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqCnE;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBhE;;OAEG;IACH,WAAW,CAAC,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAI/E,iCAAiC;IACjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4BAA4B;IAC5B,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;CAsBrD"}