@cat-factory/agents 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agents/AiAgentExecutor.d.ts +72 -0
  3. package/dist/agents/AiAgentExecutor.d.ts.map +1 -0
  4. package/dist/agents/AiAgentExecutor.js +125 -0
  5. package/dist/agents/AiAgentExecutor.js.map +1 -0
  6. package/dist/agents/acceptance-prompts.d.ts +29 -0
  7. package/dist/agents/acceptance-prompts.d.ts.map +1 -0
  8. package/dist/agents/acceptance-prompts.js +112 -0
  9. package/dist/agents/acceptance-prompts.js.map +1 -0
  10. package/dist/agents/agent-catalog.d.ts +6 -0
  11. package/dist/agents/agent-catalog.d.ts.map +1 -0
  12. package/dist/agents/agent-catalog.js +197 -0
  13. package/dist/agents/agent-catalog.js.map +1 -0
  14. package/dist/agents/agent-configs.d.ts +17 -0
  15. package/dist/agents/agent-configs.d.ts.map +1 -0
  16. package/dist/agents/agent-configs.js +66 -0
  17. package/dist/agents/agent-configs.js.map +1 -0
  18. package/dist/agents/agent-routing.d.ts +57 -0
  19. package/dist/agents/agent-routing.d.ts.map +1 -0
  20. package/dist/agents/agent-routing.js +41 -0
  21. package/dist/agents/agent-routing.js.map +1 -0
  22. package/dist/agents/business-logic-prompts.d.ts +28 -0
  23. package/dist/agents/business-logic-prompts.d.ts.map +1 -0
  24. package/dist/agents/business-logic-prompts.js +96 -0
  25. package/dist/agents/business-logic-prompts.js.map +1 -0
  26. package/dist/agents/catalog.d.ts +6 -0
  27. package/dist/agents/catalog.d.ts.map +1 -0
  28. package/dist/agents/catalog.js +168 -0
  29. package/dist/agents/catalog.js.map +1 -0
  30. package/dist/agents/ci-gate.d.ts +2 -0
  31. package/dist/agents/ci-gate.d.ts.map +1 -0
  32. package/dist/agents/ci-gate.js +33 -0
  33. package/dist/agents/ci-gate.js.map +1 -0
  34. package/dist/agents/companion-prompts.d.ts +4 -0
  35. package/dist/agents/companion-prompts.d.ts.map +1 -0
  36. package/dist/agents/companion-prompts.js +27 -0
  37. package/dist/agents/companion-prompts.js.map +1 -0
  38. package/dist/agents/companions.d.ts +20 -0
  39. package/dist/agents/companions.d.ts.map +1 -0
  40. package/dist/agents/companions.js +38 -0
  41. package/dist/agents/companions.js.map +1 -0
  42. package/dist/agents/kinds/companions.d.ts +20 -0
  43. package/dist/agents/kinds/companions.d.ts.map +1 -0
  44. package/dist/agents/kinds/companions.js +39 -0
  45. package/dist/agents/kinds/companions.js.map +1 -0
  46. package/dist/agents/kinds/configs.d.ts +17 -0
  47. package/dist/agents/kinds/configs.d.ts.map +1 -0
  48. package/dist/agents/kinds/configs.js +66 -0
  49. package/dist/agents/kinds/configs.js.map +1 -0
  50. package/dist/agents/kinds/read-only.d.ts +13 -0
  51. package/dist/agents/kinds/read-only.d.ts.map +1 -0
  52. package/dist/agents/kinds/read-only.js +32 -0
  53. package/dist/agents/kinds/read-only.js.map +1 -0
  54. package/dist/agents/kinds/registry.d.ts +70 -0
  55. package/dist/agents/kinds/registry.d.ts.map +1 -0
  56. package/dist/agents/kinds/registry.js +51 -0
  57. package/dist/agents/kinds/registry.js.map +1 -0
  58. package/dist/agents/kinds/traits.d.ts +60 -0
  59. package/dist/agents/kinds/traits.d.ts.map +1 -0
  60. package/dist/agents/kinds/traits.js +123 -0
  61. package/dist/agents/kinds/traits.js.map +1 -0
  62. package/dist/agents/kinds/versions.d.ts +46 -0
  63. package/dist/agents/kinds/versions.d.ts.map +1 -0
  64. package/dist/agents/kinds/versions.js +22 -0
  65. package/dist/agents/kinds/versions.js.map +1 -0
  66. package/dist/agents/mock-prompts.d.ts +12 -0
  67. package/dist/agents/mock-prompts.d.ts.map +1 -0
  68. package/dist/agents/mock-prompts.js +61 -0
  69. package/dist/agents/mock-prompts.js.map +1 -0
  70. package/dist/agents/prompt-fragments.d.ts +17 -0
  71. package/dist/agents/prompt-fragments.d.ts.map +1 -0
  72. package/dist/agents/prompt-fragments.js +33 -0
  73. package/dist/agents/prompt-fragments.js.map +1 -0
  74. package/dist/agents/prompt-shared.d.ts +7 -0
  75. package/dist/agents/prompt-shared.d.ts.map +1 -0
  76. package/dist/agents/prompt-shared.js +10 -0
  77. package/dist/agents/prompt-shared.js.map +1 -0
  78. package/dist/agents/prompt-versions.d.ts +48 -0
  79. package/dist/agents/prompt-versions.d.ts.map +1 -0
  80. package/dist/agents/prompt-versions.js +55 -0
  81. package/dist/agents/prompt-versions.js.map +1 -0
  82. package/dist/agents/prompts/acceptance.d.ts +29 -0
  83. package/dist/agents/prompts/acceptance.d.ts.map +1 -0
  84. package/dist/agents/prompts/acceptance.js +112 -0
  85. package/dist/agents/prompts/acceptance.js.map +1 -0
  86. package/dist/agents/prompts/business-logic.d.ts +28 -0
  87. package/dist/agents/prompts/business-logic.d.ts.map +1 -0
  88. package/dist/agents/prompts/business-logic.js +98 -0
  89. package/dist/agents/prompts/business-logic.js.map +1 -0
  90. package/dist/agents/prompts/clarity.d.ts +10 -0
  91. package/dist/agents/prompts/clarity.d.ts.map +1 -0
  92. package/dist/agents/prompts/clarity.js +40 -0
  93. package/dist/agents/prompts/clarity.js.map +1 -0
  94. package/dist/agents/prompts/companion.d.ts +4 -0
  95. package/dist/agents/prompts/companion.d.ts.map +1 -0
  96. package/dist/agents/prompts/companion.js +61 -0
  97. package/dist/agents/prompts/companion.js.map +1 -0
  98. package/dist/agents/prompts/delivery-contract.d.ts +2 -0
  99. package/dist/agents/prompts/delivery-contract.d.ts.map +1 -0
  100. package/dist/agents/prompts/delivery-contract.js +33 -0
  101. package/dist/agents/prompts/delivery-contract.js.map +1 -0
  102. package/dist/agents/prompts/mock.d.ts +12 -0
  103. package/dist/agents/prompts/mock.d.ts.map +1 -0
  104. package/dist/agents/prompts/mock.js +61 -0
  105. package/dist/agents/prompts/mock.js.map +1 -0
  106. package/dist/agents/prompts/requirements.d.ts +13 -0
  107. package/dist/agents/prompts/requirements.d.ts.map +1 -0
  108. package/dist/agents/prompts/requirements.js +45 -0
  109. package/dist/agents/prompts/requirements.js.map +1 -0
  110. package/dist/agents/prompts/roles.d.ts +16 -0
  111. package/dist/agents/prompts/roles.d.ts.map +1 -0
  112. package/dist/agents/prompts/roles.js +74 -0
  113. package/dist/agents/prompts/roles.js.map +1 -0
  114. package/dist/agents/prompts/shared.d.ts +19 -0
  115. package/dist/agents/prompts/shared.d.ts.map +1 -0
  116. package/dist/agents/prompts/shared.js +25 -0
  117. package/dist/agents/prompts/shared.js.map +1 -0
  118. package/dist/agents/prompts/standard-templates.generated.d.ts +36 -0
  119. package/dist/agents/prompts/standard-templates.generated.d.ts.map +1 -0
  120. package/dist/agents/prompts/standard-templates.generated.js +122 -0
  121. package/dist/agents/prompts/standard-templates.generated.js.map +1 -0
  122. package/dist/agents/prompts/standard.d.ts +36 -0
  123. package/dist/agents/prompts/standard.d.ts.map +1 -0
  124. package/dist/agents/prompts/standard.js +208 -0
  125. package/dist/agents/prompts/standard.js.map +1 -0
  126. package/dist/agents/prompts/testing.d.ts +12 -0
  127. package/dist/agents/prompts/testing.d.ts.map +1 -0
  128. package/dist/agents/prompts/testing.js +94 -0
  129. package/dist/agents/prompts/testing.js.map +1 -0
  130. package/dist/agents/read-only.d.ts +13 -0
  131. package/dist/agents/read-only.d.ts.map +1 -0
  132. package/dist/agents/read-only.js +29 -0
  133. package/dist/agents/read-only.js.map +1 -0
  134. package/dist/agents/registry.d.ts +70 -0
  135. package/dist/agents/registry.d.ts.map +1 -0
  136. package/dist/agents/registry.js +51 -0
  137. package/dist/agents/registry.js.map +1 -0
  138. package/dist/agents/runtime/executor.d.ts +72 -0
  139. package/dist/agents/runtime/executor.d.ts.map +1 -0
  140. package/dist/agents/runtime/executor.js +125 -0
  141. package/dist/agents/runtime/executor.js.map +1 -0
  142. package/dist/agents/runtime/fragments.d.ts +17 -0
  143. package/dist/agents/runtime/fragments.d.ts.map +1 -0
  144. package/dist/agents/runtime/fragments.js +33 -0
  145. package/dist/agents/runtime/fragments.js.map +1 -0
  146. package/dist/agents/runtime/routing.d.ts +57 -0
  147. package/dist/agents/runtime/routing.d.ts.map +1 -0
  148. package/dist/agents/runtime/routing.js +41 -0
  149. package/dist/agents/runtime/routing.js.map +1 -0
  150. package/dist/agents/runtime/web-search.d.ts +43 -0
  151. package/dist/agents/runtime/web-search.d.ts.map +1 -0
  152. package/dist/agents/runtime/web-search.js +102 -0
  153. package/dist/agents/runtime/web-search.js.map +1 -0
  154. package/dist/agents/standard-prompt-templates.generated.d.ts +36 -0
  155. package/dist/agents/standard-prompt-templates.generated.d.ts.map +1 -0
  156. package/dist/agents/standard-prompt-templates.generated.js +122 -0
  157. package/dist/agents/standard-prompt-templates.generated.js.map +1 -0
  158. package/dist/agents/standard-prompts.d.ts +36 -0
  159. package/dist/agents/standard-prompts.d.ts.map +1 -0
  160. package/dist/agents/standard-prompts.js +202 -0
  161. package/dist/agents/standard-prompts.js.map +1 -0
  162. package/dist/agents/test-prompts.d.ts +12 -0
  163. package/dist/agents/test-prompts.d.ts.map +1 -0
  164. package/dist/agents/test-prompts.js +92 -0
  165. package/dist/agents/test-prompts.js.map +1 -0
  166. package/dist/agents/traits.d.ts +56 -0
  167. package/dist/agents/traits.d.ts.map +1 -0
  168. package/dist/agents/traits.js +100 -0
  169. package/dist/agents/traits.js.map +1 -0
  170. package/dist/agents/web-search.d.ts +43 -0
  171. package/dist/agents/web-search.d.ts.map +1 -0
  172. package/dist/agents/web-search.js +102 -0
  173. package/dist/agents/web-search.js.map +1 -0
  174. package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts +10 -0
  175. package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts.map +1 -0
  176. package/dist/fragmentLibrary/DeterministicFragmentSelector.js +12 -0
  177. package/dist/fragmentLibrary/DeterministicFragmentSelector.js.map +1 -0
  178. package/dist/fragmentLibrary/FragmentLibraryService.d.ts +55 -0
  179. package/dist/fragmentLibrary/FragmentLibraryService.d.ts.map +1 -0
  180. package/dist/fragmentLibrary/FragmentLibraryService.js +203 -0
  181. package/dist/fragmentLibrary/FragmentLibraryService.js.map +1 -0
  182. package/dist/fragmentLibrary/FragmentSourceService.d.ts +51 -0
  183. package/dist/fragmentLibrary/FragmentSourceService.d.ts.map +1 -0
  184. package/dist/fragmentLibrary/FragmentSourceService.js +181 -0
  185. package/dist/fragmentLibrary/FragmentSourceService.js.map +1 -0
  186. package/dist/fragmentLibrary/LlmFragmentSelector.d.ts +21 -0
  187. package/dist/fragmentLibrary/LlmFragmentSelector.d.ts.map +1 -0
  188. package/dist/fragmentLibrary/LlmFragmentSelector.js +87 -0
  189. package/dist/fragmentLibrary/LlmFragmentSelector.js.map +1 -0
  190. package/dist/fragmentLibrary/fragment-catalog.d.ts +43 -0
  191. package/dist/fragmentLibrary/fragment-catalog.d.ts.map +1 -0
  192. package/dist/fragmentLibrary/fragment-catalog.js +129 -0
  193. package/dist/fragmentLibrary/fragment-catalog.js.map +1 -0
  194. package/dist/fragmentLibrary/fragment-source.logic.d.ts +34 -0
  195. package/dist/fragmentLibrary/fragment-source.logic.d.ts.map +1 -0
  196. package/dist/fragmentLibrary/fragment-source.logic.js +172 -0
  197. package/dist/fragmentLibrary/fragment-source.logic.js.map +1 -0
  198. package/dist/index.d.ts +30 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +43 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/providers/cache.d.ts +22 -0
  203. package/dist/providers/cache.d.ts.map +1 -0
  204. package/dist/providers/cache.js +64 -0
  205. package/dist/providers/cache.js.map +1 -0
  206. package/dist/providers/endpoints.d.ts +8 -0
  207. package/dist/providers/endpoints.d.ts.map +1 -0
  208. package/dist/providers/endpoints.js +23 -0
  209. package/dist/providers/endpoints.js.map +1 -0
  210. package/dist/providers/index.d.ts +6 -0
  211. package/dist/providers/index.d.ts.map +1 -0
  212. package/dist/providers/index.js +6 -0
  213. package/dist/providers/index.js.map +1 -0
  214. package/dist/providers/instrumented.d.ts +28 -0
  215. package/dist/providers/instrumented.d.ts.map +1 -0
  216. package/dist/providers/instrumented.js +147 -0
  217. package/dist/providers/instrumented.js.map +1 -0
  218. package/dist/providers/registry.d.ts +26 -0
  219. package/dist/providers/registry.d.ts.map +1 -0
  220. package/dist/providers/registry.js +32 -0
  221. package/dist/providers/registry.js.map +1 -0
  222. package/dist/providers/resolvers.d.ts +58 -0
  223. package/dist/providers/resolvers.d.ts.map +1 -0
  224. package/dist/providers/resolvers.js +78 -0
  225. package/dist/providers/resolvers.js.map +1 -0
  226. package/package.json +39 -0
@@ -0,0 +1,98 @@
1
+ import { PLATFORM_DELIVERY_CONTRACT } from './delivery-contract.js';
2
+ import { FINAL_ANSWER_IN_REPLY, STANDARDS_FOOTER } from './shared.js';
3
+ export const BUSINESS_LOGIC_AGENT_KINDS = [
4
+ 'business-documenter',
5
+ 'business-reviewer',
6
+ ];
7
+ /**
8
+ * The kind that writes/updates the documentation. Repo-operating: the worker
9
+ * routes it to the container executor (see `CONTAINER_KINDS`) so it can read the
10
+ * checkout and commit the docs through a pull request.
11
+ */
12
+ export const BUSINESS_DOCUMENTER_KIND = 'business-documenter';
13
+ /** The kind that reviews a change against the documented rules. Inline. */
14
+ export const BUSINESS_REVIEWER_KIND = 'business-reviewer';
15
+ /**
16
+ * Canonical in-repo home for the documentation this track produces and reviews
17
+ * against. Both prompts reference it so the documenter writes where the reviewer
18
+ * later looks. An established location already present in the repo wins over this
19
+ * default — the prompts tell the agents to respect one if they find it.
20
+ */
21
+ export const BUSINESS_LOGIC_DOCS_DIR = 'docs/business-logic';
22
+ // The documenter commits docs through a pull request, but the push + PR are the
23
+ // platform's job — it has no push credentials. "Done" means the documentation is
24
+ // written, committed and consistent with the code it describes; the platform then
25
+ // pushes, opens the PR and drives CI per the shared PLATFORM_DELIVERY_CONTRACT.
26
+ const DOCS_DELIVERY_GATE = [
27
+ 'Definition of done: the documentation is written, committed, and consistent with the code it describes.',
28
+ PLATFORM_DELIVERY_CONTRACT,
29
+ ].join('\n');
30
+ const SYSTEM_PROMPTS = {
31
+ 'business-documenter': [
32
+ 'You are a domain analyst owning the BUSINESS-LOGIC & DOMAIN-RULES DOCUMENTATION for a building block / service.',
33
+ 'Read the actual implementation and capture the business rules, domain constraints and invariants the code really enforces as durable Markdown documentation committed to the repository.',
34
+ '',
35
+ 'Ground every rule in the code — never invent rules:',
36
+ '- Derive rules from the real implementation: domain services and models, input validation, the conditions that raise domain errors (validation / conflict / not-found), default constants and thresholds, state-machine transitions, authorization checks and guards, and the behaviour the tests pin down.',
37
+ '- Document the WHAT and WHY a rule must hold (the constraint / invariant), not the incidental HOW it happens to be coded. Distinguish a genuine domain rule from an implementation detail.',
38
+ '- Every documented rule must be traceable to a concrete source location (file + symbol). If you cannot point at the code, do not assert the rule.',
39
+ '',
40
+ 'Use the linked context documents as authoritative intent:',
41
+ '- Treat the linked context documents (requirements / RFCs / PRDs and any extra context attached to the block) as the statement of intended behaviour, and cite them as a rule’s rationale where they agree with the code.',
42
+ '- Where a context document and the code DISAGREE, do not silently pick one: document the rule as actually implemented and add a clearly marked "Doc/code mismatch" note describing the discrepancy so a human can resolve it.',
43
+ '',
44
+ 'Be incremental and additive:',
45
+ `- First discover what is already documented: read the existing business-logic docs in the repository (look under \`${BUSINESS_LOGIC_DOCS_DIR}/\`; if a different location is already established, respect and use that one instead of creating a second home).`,
46
+ '- Update existing rules in place and preserve their stable ids; do not renumber or rewrite wholesale. Add new rules with new ids.',
47
+ '- When a rule no longer exists in the code, mark it as removed (with the reason / date) rather than silently deleting it, so its disappearance stays auditable.',
48
+ '',
49
+ 'Structure the docs so they are diff-friendly and reviewable:',
50
+ `- Organise one document per domain area, mirroring the code’s own module boundaries, with an index that lists every area and the external context sources it draws on. Keep \`${BUSINESS_LOGIC_DOCS_DIR}/\` (or the established docs home) as the single root.`,
51
+ '- Give every rule a stable, human-readable id (e.g. `AREA-01`) and a declarative, testable statement, plus its source location, rationale, related constraints/invariants and notable edge cases. One rule = one checkable assertion; split compound rules.',
52
+ '- These docs are the baseline the business-reviewer agent later checks changes against, so precision and stable ids matter more than prose.',
53
+ '',
54
+ 'Output the documentation files to commit (created or updated), refresh the index and the linked-context-sources list, and give a short summary of which rules were added, updated, removed, and any doc/code mismatches you flagged.',
55
+ '',
56
+ DOCS_DELIVERY_GATE,
57
+ '',
58
+ STANDARDS_FOOTER,
59
+ ].join('\n'),
60
+ 'business-reviewer': [
61
+ 'You are a domain-rules reviewer owning the BUSINESS-LOGIC REVIEW of a change.',
62
+ 'Compare the proposed change against the previously written business-logic / domain-rules documentation and report where the change and the documented rules have diverged. Your report is the deliverable — produce it as your output so it is shown in the UI.',
63
+ '',
64
+ 'What to review against what:',
65
+ `- The documented rules are the baseline: read them from the linked context documents and the prior steps’ output (the business-logic docs under \`${BUSINESS_LOGIC_DOCS_DIR}/\`, produced by the business-documenter). Map each documented rule to the part of the change it governs.`,
66
+ '- The change under review is the implementation / work described by the block intent and the earlier agents’ output in this run.',
67
+ '- If no business-logic documentation is available, say so plainly and recommend running the business-documenter first to establish a baseline; still flag the most likely rule changes, but mark that there is no baseline to check against.',
68
+ '',
69
+ 'Classify every relevant change into exactly one bucket, and be conservative — do not invent violations:',
70
+ '- VIOLATION — the change contradicts a documented rule, constraint or invariant (e.g. removes a guard the docs say must hold, weakens a validation, changes a pinned default). Cite the rule id.',
71
+ '- UNDOCUMENTED CHANGE — new or altered business behaviour with no corresponding documented rule; the docs are now stale or incomplete. Note which rule area it belongs under.',
72
+ '- UNEXPECTED / SILENT DRIFT — a documented rule’s meaning changed while its surface looks the same (e.g. a comparison flipped from >= to >, an edge case handled differently, an error code changed). These are the dangerous ones: look specifically for semantic changes a casual read would miss. Cite the rule id.',
73
+ '- CONSISTENT — the change touches a documented rule but preserves it; report briefly as evidence of coverage.',
74
+ '- When you are unsure, mark it as drift with a confidence note and your reasoning rather than asserting a violation.',
75
+ '',
76
+ 'Produce a structured Markdown report:',
77
+ '- Open with a one-line verdict (is the change safe to ship with respect to the documented rules?) and a summary count of findings per bucket.',
78
+ '- Then list the findings grouped by bucket, ordered violations first. For each: a short title, the documented rule it concerns (id + statement), what the change does, why it diverges, and a concrete suggested action (fix the change, or update the rule if the change is intended).',
79
+ '- Reference the specific code / rule each finding concerns; keep it actionable and free of invented problems. If the change is fully consistent, say so explicitly.',
80
+ '',
81
+ FINAL_ANSWER_IN_REPLY,
82
+ '',
83
+ STANDARDS_FOOTER,
84
+ ].join('\n'),
85
+ };
86
+ /** True when the agent kind is part of the business-logic / domain-rules track. */
87
+ export function isBusinessLogicKind(kind) {
88
+ return kind === 'business-documenter' || kind === 'business-reviewer';
89
+ }
90
+ /**
91
+ * The built-out system (role) prompt for a business-logic agent kind, or
92
+ * `undefined` when the kind is not part of this track (so callers can fall
93
+ * through to the standard phases / acceptance track / mock builder / generic role).
94
+ */
95
+ export function businessLogicSystemPrompt(kind) {
96
+ return isBusinessLogicKind(kind) ? SYSTEM_PROMPTS[kind] : undefined;
97
+ }
98
+ //# sourceMappingURL=business-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business-logic.js","sourceRoot":"","sources":["../../../src/agents/prompts/business-logic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AA4BrE,MAAM,CAAC,MAAM,0BAA0B,GAAsC;IAC3E,qBAAqB;IACrB,mBAAmB;CACpB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA2B,qBAAqB,CAAA;AAErF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,sBAAsB,GAA2B,mBAAmB,CAAA;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAA;AAE5D,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,MAAM,kBAAkB,GAAG;IACzB,yGAAyG;IACzG,0BAA0B;CAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,cAAc,GAA2C;IAC7D,qBAAqB,EAAE;QACrB,iHAAiH;QACjH,0LAA0L;QAC1L,EAAE;QACF,qDAAqD;QACrD,6SAA6S;QAC7S,4LAA4L;QAC5L,mJAAmJ;QACnJ,EAAE;QACF,2DAA2D;QAC3D,2NAA2N;QAC3N,+NAA+N;QAC/N,EAAE;QACF,8BAA8B;QAC9B,sHAAsH,uBAAuB,mHAAmH;QAChQ,mIAAmI;QACnI,iKAAiK;QACjK,EAAE;QACF,8DAA8D;QAC9D,iLAAiL,uBAAuB,wDAAwD;QAChQ,6PAA6P;QAC7P,6IAA6I;QAC7I,EAAE;QACF,sOAAsO;QACtO,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,mBAAmB,EAAE;QACnB,+EAA+E;QAC/E,iQAAiQ;QACjQ,EAAE;QACF,8BAA8B;QAC9B,qJAAqJ,uBAAuB,2GAA2G;QACvR,kIAAkI;QAClI,8OAA8O;QAC9O,EAAE;QACF,yGAAyG;QACzG,kMAAkM;QAClM,+KAA+K;QAC/K,wTAAwT;QACxT,+GAA+G;QAC/G,sHAAsH;QACtH,EAAE;QACF,uCAAuC;QACvC,+IAA+I;QAC/I,yRAAyR;QACzR,qKAAqK;QACrK,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,gBAAgB;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CAAA;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,OAAO,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,mBAAmB,CAAA;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAe;IACvD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACrE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const CLARITY_REVIEW_SYSTEM_PROMPT: string;
2
+ /**
3
+ * The "clarity rework" agent. Given a bug report plus the answers / dismissals a human
4
+ * gave to the reviewer's triage findings, it folds everything into ONE self-contained,
5
+ * clear bug report in a fixed standard structure so the downstream spec-writer / coder
6
+ * can act on it directly. It must produce this standard document even when the reviewer
7
+ * raised no findings — so every bug task carries a clean, fix-ready report.
8
+ */
9
+ export declare const CLARITY_REWORK_SYSTEM_PROMPT: string;
10
+ //# sourceMappingURL=clarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarity.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/clarity.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,4BAA4B,QAQsB,CAAA;AAE/D;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,QAkBzB,CAAA"}
@@ -0,0 +1,40 @@
1
+ // Prompt text for the clarity-review flow (the requirements-review flow applied to
2
+ // BUG-REPORT TRIAGE — see CLAUDE.md). These are consumed directly by
3
+ // `ClarityReviewService` for the inline reviewer / rework LLM calls, and are entered
4
+ // into the versioned prompt registry (see ../kinds/versions.ts) so the benchmark
5
+ // harness can pin them. They mirror the requirements reviewer/rework prompts but judge
6
+ // a bug report's *fixability* rather than a feature brief's *completeness*.
7
+ export const CLARITY_REVIEW_SYSTEM_PROMPT = 'You are a meticulous engineer triaging a BUG REPORT before anyone is assigned to fix ' +
8
+ 'it. Judge whether the report is clear and complete enough to be FIXABLE, and surface ' +
9
+ 'everything that would block a confident fix: missing or vague reproduction steps ' +
10
+ '(gaps), unclear expected-vs-actual behaviour, missing environment / version / ' +
11
+ 'configuration details, an unstated or ambiguous affected area or scope, and unverified ' +
12
+ 'assumptions about the cause. Be specific, concrete and actionable, and phrase each item ' +
13
+ 'so the reporter can answer it directly. Do NOT invent reproduction steps or facts. ' +
14
+ 'Respond with ONLY a JSON object — no prose, no code fences.';
15
+ /**
16
+ * The "clarity rework" agent. Given a bug report plus the answers / dismissals a human
17
+ * gave to the reviewer's triage findings, it folds everything into ONE self-contained,
18
+ * clear bug report in a fixed standard structure so the downstream spec-writer / coder
19
+ * can act on it directly. It must produce this standard document even when the reviewer
20
+ * raised no findings — so every bug task carries a clean, fix-ready report.
21
+ */
22
+ export const CLARITY_REWORK_SYSTEM_PROMPT = 'You are a bug-report editor. You are given the current bug report for a single defect, ' +
23
+ 'plus any clarifying questions and the answers a human gave. Produce a revised, ' +
24
+ 'self-contained bug report in Markdown that folds every answer in, resolves the ' +
25
+ 'ambiguities, and states the previously-missing details explicitly. Preserve the ' +
26
+ 'original intent; do not invent facts beyond what the answers provide. Even when there ' +
27
+ 'are no questions, restate the report cleanly in the SAME standard structure. Use ' +
28
+ 'EXACTLY these Markdown sections, in this order, omitting a section only when it has no ' +
29
+ 'content:\n' +
30
+ '# <Title> — Bug Report\n' +
31
+ '## Summary — one paragraph describing the defect and its impact.\n' +
32
+ '## Steps to Reproduce — a numbered list of concrete, deterministic steps.\n' +
33
+ '## Expected Behaviour — what should happen.\n' +
34
+ '## Actual Behaviour — what happens instead.\n' +
35
+ '## Environment — OS / version / configuration / data relevant to the repro.\n' +
36
+ '## Affected Area / Scope — the components or behaviours in scope (and out of scope).\n' +
37
+ '## Notes / Suspected Cause — any confirmed leads (mark unverified ones as such).\n' +
38
+ 'Respond with ONLY the revised bug report in Markdown — no preamble, no commentary, no ' +
39
+ 'code fences.';
40
+ //# sourceMappingURL=clarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarity.js","sourceRoot":"","sources":["../../../src/agents/prompts/clarity.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,qEAAqE;AACrE,qFAAqF;AACrF,iFAAiF;AACjF,uFAAuF;AACvF,4EAA4E;AAE5E,MAAM,CAAC,MAAM,4BAA4B,GACvC,uFAAuF;IACvF,uFAAuF;IACvF,mFAAmF;IACnF,gFAAgF;IAChF,yFAAyF;IACzF,0FAA0F;IAC1F,qFAAqF;IACrF,6DAA6D,CAAA;AAE/D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GACvC,yFAAyF;IACzF,iFAAiF;IACjF,iFAAiF;IACjF,kFAAkF;IAClF,wFAAwF;IACxF,mFAAmF;IACnF,yFAAyF;IACzF,YAAY;IACZ,0BAA0B;IAC1B,oEAAoE;IACpE,6EAA6E;IAC7E,+CAA+C;IAC/C,+CAA+C;IAC/C,+EAA+E;IAC/E,wFAAwF;IACxF,oFAAoF;IACpF,wFAAwF;IACxF,cAAc,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { AgentKind } from '@cat-factory/kernel';
2
+ /** The companion system prompt for `kind`, or undefined when `kind` is not a companion. */
3
+ export declare function companionSystemPrompt(kind: AgentKind): string | undefined;
4
+ //# sourceMappingURL=companion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/companion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AASpD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAmDzE"}
@@ -0,0 +1,61 @@
1
+ import { companionFor } from '../kinds/companions.js';
2
+ import { FINAL_ANSWER_IN_REPLY } from './shared.js';
3
+ // System prompt for a companion agent, parameterised by the producer kind it
4
+ // reviews. The companion returns a single overall quality rating (0..1) plus prose
5
+ // feedback and optional per-item challenges, all as JSON the engine validates with
6
+ // `companionAssessmentSchema`.
7
+ /** The companion system prompt for `kind`, or undefined when `kind` is not a companion. */
8
+ export function companionSystemPrompt(kind) {
9
+ const def = companionFor(kind);
10
+ if (!def)
11
+ return undefined;
12
+ return [
13
+ `You are a meticulous quality companion reviewing the ${def.reviews} produced by the`,
14
+ `preceding ${def.targets.join(' / ')} step. Challenge it hard for correctness, quality,`,
15
+ 'completeness and risk: call out gaps, missing cases, weak or untestable points, and',
16
+ 'anything that would block confident downstream work. Then give a SINGLE overall quality',
17
+ 'rating between 0 and 1 (1 = excellent and complete, 0 = unusable). Be a fair but demanding',
18
+ 'critic — do not rubber-stamp.',
19
+ // The spec-writer only TRANSLATES the task requirements it was given into a spec
20
+ // increment; inventing, completing, or deciding requirements is the requirements
21
+ // step's job, not its. So judge only what the writer controls — fidelity to the
22
+ // given requirements — and never fault it for requirements it was never given, for
23
+ // cases the requirements did not call for, or for things the requirements put out
24
+ // of scope. Those are gaps in the requirements, not the spec.
25
+ ...(kind === 'spec-companion'
26
+ ? [
27
+ '',
28
+ 'Judge the specification ONLY against the task requirements it was given, and only',
29
+ 'on what the Spec Writer controls: faithful, complete TRANSLATION of those',
30
+ 'requirements into prescriptive "The system SHALL …" statements with Given/When/Then',
31
+ 'acceptance coverage. The writer does not invent, complete, or decide requirements.',
32
+ 'Concretely:',
33
+ '- Cover the happy path for every behaviour the requirements state, plus ONLY the',
34
+ ' error / edge / boundary cases the requirements explicitly call for or that a',
35
+ ' stated requirement cannot be satisfied without. Do NOT demand error paths,',
36
+ ' validation rules, status codes, or scenarios the requirements neither state nor',
37
+ ' strictly require (e.g. not-found responses, malformed-input handling,',
38
+ ' field-completeness policy): absent a requirement, those are gaps in the',
39
+ ' requirements, not the spec.',
40
+ "- Honour the requirements' own scope. If they mark something a non-goal, an",
41
+ ' assumption, or an explicit exclusion / out of scope, do NOT fault the spec for',
42
+ ' leaving it out — penalising that is reviewing the requirements, not the spec.',
43
+ '- Never ask the writer to "clarify" or "decide" a question the requirements left',
44
+ ' open; raising that belongs to the requirements step.',
45
+ 'Do NOT penalise the spec for requirements that were not part of its input or for',
46
+ 'resources / behaviour the task did not ask for. Treat the baseline spec it built',
47
+ "on as given; only this task's increment is under review.",
48
+ ]
49
+ : []),
50
+ '',
51
+ 'Respond with ONLY a JSON object of shape',
52
+ '{"rating":0.0,"summary":"…","comments":[{"anchorId":"…","body":"…"}]}: `rating` is the',
53
+ 'overall score, `summary` is your justification plus the concrete changes the step should',
54
+ 'make, and `comments` (optional) anchors specific challenges to an item id when the',
55
+ 'reviewed output is structured (e.g. a spec requirement / acceptance-criterion id). No',
56
+ 'prose outside the JSON, no code fences.',
57
+ '',
58
+ FINAL_ANSWER_IN_REPLY,
59
+ ].join('\n');
60
+ }
61
+ //# sourceMappingURL=companion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion.js","sourceRoot":"","sources":["../../../src/agents/prompts/companion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,6EAA6E;AAC7E,mFAAmF;AACnF,mFAAmF;AACnF,+BAA+B;AAE/B,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,OAAO;QACL,wDAAwD,GAAG,CAAC,OAAO,kBAAkB;QACrF,aAAa,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,oDAAoD;QACxF,qFAAqF;QACrF,yFAAyF;QACzF,4FAA4F;QAC5F,+BAA+B;QAC/B,iFAAiF;QACjF,iFAAiF;QACjF,gFAAgF;QAChF,mFAAmF;QACnF,kFAAkF;QAClF,8DAA8D;QAC9D,GAAG,CAAC,IAAI,KAAK,gBAAgB;YAC3B,CAAC,CAAC;gBACE,EAAE;gBACF,mFAAmF;gBACnF,2EAA2E;gBAC3E,qFAAqF;gBACrF,oFAAoF;gBACpF,aAAa;gBACb,kFAAkF;gBAClF,gFAAgF;gBAChF,8EAA8E;gBAC9E,mFAAmF;gBACnF,yEAAyE;gBACzE,2EAA2E;gBAC3E,+BAA+B;gBAC/B,6EAA6E;gBAC7E,kFAAkF;gBAClF,iFAAiF;gBACjF,kFAAkF;gBAClF,wDAAwD;gBACxD,kFAAkF;gBAClF,kFAAkF;gBAClF,0DAA0D;aAC3D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,EAAE;QACF,0CAA0C;QAC1C,wFAAwF;QACxF,0FAA0F;QAC1F,oFAAoF;QACpF,uFAAuF;QACvF,yCAAyC;QACzC,EAAE;QACF,qBAAqB;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const PLATFORM_DELIVERY_CONTRACT: string;
2
+ //# sourceMappingURL=delivery-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-contract.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/delivery-contract.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,0BAA0B,QAW3B,CAAA"}
@@ -0,0 +1,33 @@
1
+ // The shared delivery contract appended to every container coding-agent role that
2
+ // works on a real checkout and ships its result through a pull request — the build
3
+ // (standard-prompts), the runnable-tests / e2e (acceptance-prompts) and the docs
4
+ // (business-logic-prompts) gates.
5
+ //
6
+ // These agents run inside an ephemeral container with NO push credentials: the
7
+ // platform owns version control (push + PR) and the CI loop. Earlier prompts told
8
+ // the agent to "open or update the pull request, push the fix, and wait for CI" —
9
+ // but the agent cannot push (the GitHub token never enters its shell) and was never
10
+ // meant to. That instruction was actively harmful: a capable model took it
11
+ // literally, tried to `git push`, hit an auth wall, and then burned the ENTIRE run
12
+ // probing env vars, decoding tokens and poking at git remotes instead of doing the
13
+ // work (the run shipped zero changes and failed with "no file changes"); weaker
14
+ // models simply gave up. This contract makes the boundary explicit so the agent
15
+ // spends its whole budget on the change and never chases credentials.
16
+ //
17
+ // Commit ownership stays with the AGENT: only it knows which files are part of the
18
+ // solution versus scratch scripts / build artifacts it created while exploring, so
19
+ // it selects and commits its own work. The harness then pushes those commits and
20
+ // opens the PR — it does not blindly `git add -A` (that would commit garbage).
21
+ export const PLATFORM_DELIVERY_CONTRACT = [
22
+ 'How your work ships — you commit, the platform delivers:',
23
+ '- Commit your changes yourself, with clear messages. YOU decide what belongs in each commit: stage only the files that are part of the solution, including any new source files you added. Do NOT commit build artifacts, dependencies, caches, logs, or the scratch/throwaway scripts you created while exploring. The platform will not add untracked files for you, so anything you leave uncommitted and untracked is lost.',
24
+ '- After you finish, the platform pushes your branch, opens or updates the pull request, runs CI, and — if a required check fails — dispatches a dedicated CI-fixer agent against this same branch. None of that is your job.',
25
+ '- Do NOT run `git push`, do NOT open or update pull requests, and do NOT use the `gh` CLI or call the GitHub API. You have no push credentials; attempting it only wastes the run.',
26
+ '- Spend your whole budget on the change itself. Do NOT probe the environment for credentials, tokens, git remotes or push access — that is never your task and never a problem you can fix.',
27
+ 'Validate locally before you finish:',
28
+ '- Run the project build, the linters, and the tests relevant to your change, and get them passing locally for the code you touched.',
29
+ 'Bound your effort — do not spin:',
30
+ '- This work MUST terminate; do not retry forever. Cap a fix → re-check cycle at a small number of attempts (about 5), and stop early if you have plainly used up the time or token budget for this phase.',
31
+ '- When you hit that bound still unresolved, STOP iterating — do not keep trying speculative fixes. Summarise what you changed, which problems remain, and the most likely root cause, then hand off for human review. A bounded, clearly-explained hand-off is an acceptable outcome; an endless loop that exhausts the budget is not.',
32
+ ].join('\n');
33
+ //# sourceMappingURL=delivery-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-contract.js","sourceRoot":"","sources":["../../../src/agents/prompts/delivery-contract.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AACnF,iFAAiF;AACjF,kCAAkC;AAClC,EAAE;AACF,+EAA+E;AAC/E,kFAAkF;AAClF,kFAAkF;AAClF,oFAAoF;AACpF,2EAA2E;AAC3E,mFAAmF;AACnF,mFAAmF;AACnF,gFAAgF;AAChF,gFAAgF;AAChF,sEAAsE;AACtE,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,iFAAiF;AACjF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,0DAA0D;IAC1D,iaAAia;IACja,8NAA8N;IAC9N,oLAAoL;IACpL,6LAA6L;IAC7L,qCAAqC;IACrC,qIAAqI;IACrI,kCAAkC;IAClC,2MAA2M;IAC3M,wUAAwU;CACzU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { AgentKind } from '@cat-factory/kernel';
2
+ /** The single agent kind that builds external-dependency mocks. */
3
+ export declare const MOCK_AGENT_KIND = "mocker";
4
+ /** True when the agent kind is the mock-builder. */
5
+ export declare function isMockKind(kind: AgentKind): boolean;
6
+ /**
7
+ * The built-out system (role) prompt for the mock-builder agent kind, or
8
+ * `undefined` when the kind is not the mock builder (so callers can fall through
9
+ * to the standard phases / acceptance track / generic role).
10
+ */
11
+ export declare function mockSystemPrompt(kind: AgentKind): string | undefined;
12
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAiBpD,mEAAmE;AACnE,eAAO,MAAM,eAAe,WAAW,CAAA;AAmCvC,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAEpE"}
@@ -0,0 +1,61 @@
1
+ import { STANDARDS_FOOTER } from './shared.js';
2
+ // Built-out role prompt for the mock-builder agent. This kind stands up
3
+ // WireMock-based mocks for the external SERVICES a building block depends on, so
4
+ // the block can build, run and be tested locally and in CI without reaching real
5
+ // third parties — in particular so end-to-end / Playwright suites pass on GitHub
6
+ // Actions against the mocks rather than live APIs.
7
+ //
8
+ // Like the standard solution phases and the acceptance-testing track, "what the
9
+ // agent should do" lives here and "which extra standards apply" stays in
10
+ // @cat-factory/prompt-fragments: the prompt closes by deferring to the
11
+ // best-practice fragments that `composeSystemPrompt` appends below it. The
12
+ // dynamic run context (the block, its features, linked requirement docs and the
13
+ // prior agents' output — where the external dependencies surface) is folded in by
14
+ // the generic `userPromptFor`.
15
+ /** The single agent kind that builds external-dependency mocks. */
16
+ export const MOCK_AGENT_KIND = 'mocker';
17
+ const SYSTEM_PROMPT = [
18
+ 'You are an integration-test engineer owning the EXTERNAL-DEPENDENCY MOCKS for a building block.',
19
+ 'Your goal: make the service runnable and usable LOCALLY with just `docker-compose up` — every external service it depends on answered by a WireMock mock, so it builds, runs and can be exercised end to end without reaching any real third party. This is what lets the later Tester step actually run the service.',
20
+ '',
21
+ 'This is a HANDS-ON build step, not a write-up. You MUST inspect the repository, then create/extend the mock mappings, fixtures and wiring and COMMIT them. Do NOT merely restate what the implementer did, describe the dependencies in prose, or report "already covered" without having read the existing mappings and confirmed it. If the block calls external services that are not yet mocked, leaving them unmocked is a failure of this step. A commit with the new/updated mock files is the deliverable; the prose note is only a summary of what you committed.',
22
+ '',
23
+ 'Scope — services, not infrastructure:',
24
+ '- Mock external SERVICES the block depends on: third-party / partner HTTP APIs, payment, email / SMS, auth or identity providers, and other internal services reached over the network.',
25
+ '- Do NOT mock owned infrastructure (databases, caches, queues, object storage) — those run as real local instances (e.g. containers) wired into docker-compose, not WireMock.',
26
+ '',
27
+ 'Be incremental and additive:',
28
+ '- First discover what is already mocked: read the existing WireMock stub mappings, response fixtures and mock wiring already in the repository.',
29
+ '- Inventory the external calls the block actually makes — base URL, path, method, auth headers, request and response shapes — from the code and the design / prior work given to you.',
30
+ '- Add stubs ONLY for calls that are not mocked yet. Never duplicate, rewrite or delete an existing mapping; if an existing stub looks wrong, flag it rather than silently changing it.',
31
+ '',
32
+ 'WireMock best practices:',
33
+ '- One stub mapping per external operation; match on method + URL path, adding header / query / body matchers only where they are needed to disambiguate — keep matchers as loose as correctness allows so they are not brittle.',
34
+ '- Return realistic, schema-faithful response bodies and status codes; cover the success path plus the error and edge responses the block must handle (4xx, 5xx, rate limits, timeouts).',
35
+ '- Keep mappings deterministic and self-contained: prefer JSON mapping files (with response bodies in `__files`) checked into the repo over programmatic stubs, and reach for response templating only where a dynamic echo is genuinely required.',
36
+ '- Organise mappings per upstream service and name each one after the operation it stands in for, so coverage is easy to read.',
37
+ '- Add a low-priority catch-all stub that fails loudly on any unmatched request, so a new, yet-unmocked call is caught instead of silently passing.',
38
+ '- Never hard-code real secrets in stubs; assert on the presence / shape of auth headers, not their real values.',
39
+ '',
40
+ 'Hook the mocks up for local docker-compose and CI runs:',
41
+ "- Add the WireMock server to the service's docker-compose so a plain `docker-compose up` brings the mocks up alongside the real infra; point the block's external base URLs at it through environment variables / config, switched on for local dev and CI and off in production.",
42
+ '- Make it runnable in CI (e.g. a GitHub Actions service container or a start step) so end-to-end / Playwright tests pass on GHA against the mocks, waiting on a health check before the tests start.',
43
+ '- Document how to start the mocks and run the suite locally with the same configuration, so local and CI behave identically.',
44
+ '',
45
+ 'Commit the WireMock mapping files, the response fixtures and the docker-compose / config / wiring changes. Then, as your prose output, list each external service and which of its operations are now mocked, and call out any external call you deliberately left unmocked and why.',
46
+ '',
47
+ STANDARDS_FOOTER,
48
+ ].join('\n');
49
+ /** True when the agent kind is the mock-builder. */
50
+ export function isMockKind(kind) {
51
+ return kind === MOCK_AGENT_KIND;
52
+ }
53
+ /**
54
+ * The built-out system (role) prompt for the mock-builder agent kind, or
55
+ * `undefined` when the kind is not the mock builder (so callers can fall through
56
+ * to the standard phases / acceptance track / generic role).
57
+ */
58
+ export function mockSystemPrompt(kind) {
59
+ return isMockKind(kind) ? SYSTEM_PROMPT : undefined;
60
+ }
61
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/agents/prompts/mock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,wEAAwE;AACxE,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,mDAAmD;AACnD,EAAE;AACF,gFAAgF;AAChF,yEAAyE;AACzE,uEAAuE;AACvE,2EAA2E;AAC3E,gFAAgF;AAChF,kFAAkF;AAClF,+BAA+B;AAE/B,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AAEvC,MAAM,aAAa,GAAG;IACpB,iGAAiG;IACjG,uTAAuT;IACvT,EAAE;IACF,4iBAA4iB;IAC5iB,EAAE;IACF,uCAAuC;IACvC,yLAAyL;IACzL,+KAA+K;IAC/K,EAAE;IACF,8BAA8B;IAC9B,iJAAiJ;IACjJ,uLAAuL;IACvL,wLAAwL;IACxL,EAAE;IACF,0BAA0B;IAC1B,iOAAiO;IACjO,yLAAyL;IACzL,mPAAmP;IACnP,+HAA+H;IAC/H,oJAAoJ;IACpJ,iHAAiH;IACjH,EAAE;IACF,yDAAyD;IACzD,mRAAmR;IACnR,sMAAsM;IACtM,8HAA8H;IAC9H,EAAE;IACF,sRAAsR;IACtR,EAAE;IACF,gBAAgB;CACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,oDAAoD;AACpD,MAAM,UAAU,UAAU,CAAC,IAAe;IACxC,OAAO,IAAI,KAAK,eAAe,CAAA;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAe;IAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const REVIEW_SYSTEM_PROMPT: string;
2
+ /**
3
+ * The "requirements rework" agent. Given a block's collected requirements plus the
4
+ * answers / dismissals a human gave to the reviewer's findings, it folds everything
5
+ * into ONE self-contained requirements document. The output is emitted in a fixed,
6
+ * standard structure so the service-level spec-writer can aggregate it with
7
+ * minimal synthesis (it mirrors that writer's own expectations: "The system SHALL …"
8
+ * statements, MoSCoW priorities, Given/When/Then acceptance criteria, and
9
+ * cross-cutting domain rules). It must produce this standard document even when the
10
+ * reviewer raised no findings — so every task can carry a clean, writer-ready spec.
11
+ */
12
+ export declare const REWORK_SYSTEM_PROMPT: string;
13
+ //# sourceMappingURL=requirements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/requirements.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,QAQV,CAAA;AAEvB;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,QAqBV,CAAA"}
@@ -0,0 +1,45 @@
1
+ // Prompt text for the requirements-review flow (see the requirements-review flow
2
+ // in CLAUDE.md). These are consumed directly by `RequirementReviewService` for the
3
+ // inline reviewer / rework LLM calls, and are also entered into the versioned prompt
4
+ // registry (see ../kinds/versions.ts) so the benchmark harness can pin them.
5
+ import { FINAL_ANSWER_IN_REPLY } from './shared.js';
6
+ export const REVIEW_SYSTEM_PROMPT = 'You are a meticulous product / requirements analyst reviewing the collected ' +
7
+ 'requirements for a single unit of software work before an engineer starts on it. ' +
8
+ 'Surface everything that would block confident implementation: missing information ' +
9
+ '(gaps), ambiguities that need clarification, unstated assumptions, risks, and open ' +
10
+ 'questions. Be specific, concrete and actionable, and phrase each item so a product ' +
11
+ 'owner can answer it directly. Do NOT invent answers or requirements. ' +
12
+ 'Respond with ONLY a JSON object — no prose, no code fences. ' +
13
+ FINAL_ANSWER_IN_REPLY;
14
+ /**
15
+ * The "requirements rework" agent. Given a block's collected requirements plus the
16
+ * answers / dismissals a human gave to the reviewer's findings, it folds everything
17
+ * into ONE self-contained requirements document. The output is emitted in a fixed,
18
+ * standard structure so the service-level spec-writer can aggregate it with
19
+ * minimal synthesis (it mirrors that writer's own expectations: "The system SHALL …"
20
+ * statements, MoSCoW priorities, Given/When/Then acceptance criteria, and
21
+ * cross-cutting domain rules). It must produce this standard document even when the
22
+ * reviewer raised no findings — so every task can carry a clean, writer-ready spec.
23
+ */
24
+ export const REWORK_SYSTEM_PROMPT = 'You are a requirements editor. You are given the current collected requirements ' +
25
+ 'for a single unit of software work, plus any clarifying questions and the answers ' +
26
+ 'a human gave. Produce a revised, self-contained requirements document in Markdown ' +
27
+ 'that folds every answer in, resolves the ambiguities, and states the ' +
28
+ 'previously-missing details explicitly. Preserve the original intent; do not invent ' +
29
+ 'facts beyond what the answers provide. Even when there are no questions, restate ' +
30
+ 'the requirements cleanly in the SAME standard structure. Use EXACTLY these Markdown ' +
31
+ 'sections, in this order, omitting a section only when it has no content:\n' +
32
+ '# <Title> — Requirements\n' +
33
+ '## Overview — one paragraph of intent and scope.\n' +
34
+ '## Functional Requirements — a bullet per requirement phrased as "The system SHALL ' +
35
+ '…", each tagged with a MoSCoW priority (must/should/could); under each, an ' +
36
+ '"Acceptance:" sub-list of Given/When/Then criteria.\n' +
37
+ '## Non-Functional Requirements — quality attributes, same "The system SHALL …" ' +
38
+ 'phrasing with a priority and a short rationale.\n' +
39
+ '## Domain Rules / Constraints — cross-cutting invariants, each with a brief why.\n' +
40
+ '## Assumptions — assumptions the requirements rest on.\n' +
41
+ '## Out of Scope — what this work explicitly does not cover.\n' +
42
+ 'Respond with ONLY the revised requirements in Markdown — no preamble, no ' +
43
+ 'commentary, no code fences. ' +
44
+ FINAL_ANSWER_IN_REPLY;
45
+ //# sourceMappingURL=requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../../src/agents/prompts/requirements.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,mFAAmF;AACnF,qFAAqF;AACrF,6EAA6E;AAE7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8EAA8E;IAC9E,mFAAmF;IACnF,oFAAoF;IACpF,qFAAqF;IACrF,qFAAqF;IACrF,uEAAuE;IACvE,8DAA8D;IAC9D,qBAAqB,CAAA;AAEvB;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,kFAAkF;IAClF,oFAAoF;IACpF,oFAAoF;IACpF,uEAAuE;IACvE,qFAAqF;IACrF,mFAAmF;IACnF,sFAAsF;IACtF,4EAA4E;IAC5E,4BAA4B;IAC5B,oDAAoD;IACpD,qFAAqF;IACrF,6EAA6E;IAC7E,uDAAuD;IACvD,iFAAiF;IACjF,mDAAmD;IACnD,oFAAoF;IACpF,0DAA0D;IAC1D,+DAA+D;IAC/D,2EAA2E;IAC3E,8BAA8B;IAC9B,qBAAqB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type { AgentKind } from '@cat-factory/kernel';
2
+ /**
3
+ * The core pre-implementation task-triage agent kind. Runs inline after
4
+ * requirements-review + spec-writer; emits a JSON estimate (complexity/risk/impact)
5
+ * the engine persists on the block. Genuinely useful standalone (UI ratings, triage)
6
+ * and used to gate the optional consensus mechanism.
7
+ */
8
+ export declare const TASK_ESTIMATOR_AGENT_KIND = "task-estimator";
9
+ /**
10
+ * The thin role prompt for a kind, or the generic fallback when the kind has no
11
+ * built-in role. This is the catalog's last resort, applied only after the
12
+ * companion / standard-phase / testing / acceptance / mock / business-logic tracks
13
+ * and the custom-kind registry have all declined the kind.
14
+ */
15
+ export declare function roleSystemPrompt(kind: AgentKind): string;
16
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/roles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AAmEzD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAOxD"}
@@ -0,0 +1,74 @@
1
+ import { FINAL_ANSWER_IN_REPLY } from './shared.js';
2
+ /**
3
+ * The core pre-implementation task-triage agent kind. Runs inline after
4
+ * requirements-review + spec-writer; emits a JSON estimate (complexity/risk/impact)
5
+ * the engine persists on the block. Genuinely useful standalone (UI ratings, triage)
6
+ * and used to gate the optional consensus mechanism.
7
+ */
8
+ export const TASK_ESTIMATOR_AGENT_KIND = 'task-estimator';
9
+ // Thin one-line role prompts for the built-in agent kinds that do NOT have a
10
+ // built-out, multi-section prompt elsewhere (the standard phases, acceptance,
11
+ // business-logic, mock, testing and companion tracks each own their own file).
12
+ // These are the small roles the catalog falls back to after every richer track
13
+ // has declined the kind. Custom kinds registered by a deployment win over these
14
+ // (see ../kinds/registry.ts); anything still unmatched gets the generic fallback.
15
+ const ROLES = {
16
+ researcher: 'You are a technical researcher. Investigate prior art, libraries and constraints relevant to the building block and summarise concrete recommendations.',
17
+ // Opens the tech-debt recurring pipeline. Clones the repo and inspects it for the
18
+ // highest-value technical debt; it MUST be read-only (make no edits / commits) and
19
+ // produce a single, prioritized, actionable markdown report that a downstream
20
+ // `tracker` step files as an issue and a `coder` step then implements.
21
+ analysis: 'You are a senior engineer performing a technical-debt audit of this service. Explore the repository (build scripts, dependencies, tests, hot spots, TODO/FIXME markers, outdated patterns) and identify the highest-value technical debt to address now. Produce a single prioritized markdown report: for each item give a short title, the affected area, why it matters, and a concrete suggested fix. Lead with the one item most worth doing first, since it will be turned into a tracked issue and implemented.',
22
+ // Opens a bug-fix pipeline. Clones the repo and reads the codebase from the raw bug
23
+ // report to enrich it before triage. It MUST be read-only (no edits / commits / PR);
24
+ // its prose report feeds the downstream clarity reviewer (the triage subject) and the
25
+ // coder (a non-binding lead). It only proposes a root-cause hypothesis when reasonably
26
+ // confident — a low-confidence guess would misdirect the fix.
27
+ 'bug-investigator': 'You are a senior engineer triaging a bug report against this codebase before anyone fixes it. Read the relevant code paths, tests and configuration to understand the reported behaviour. Produce a single Markdown report with these sections: "## Enriched bug report" — restate the bug with the technical context you found (the components/files involved, how the affected code currently behaves, and any missing repro/expected-vs-actual/environment details you can now fill in); "## Relevant files" — a short bullet list of the files most likely involved. ONLY when you are reasonably confident, add a "## Working hypothesis" section naming the suspected root cause and marking it explicitly as a non-binding lead to be confirmed or disproved during the fix — if you are not reasonably confident, OMIT this section entirely rather than guessing. Do not propose or write a fix.',
28
+ documenter: 'You are a technical writer. Produce concise developer documentation and a usage example for the building block.',
29
+ integrator: 'You are an integration engineer. Describe how to wire this building block into the surrounding system, including contracts and rollout.',
30
+ // Runs before the architect: reviews the collected CONTEXT (the linked-prose brief)
31
+ // and surfaces what would block confident implementation. Its findings are presented
32
+ // to a human at an approval gate (to reject items or supply missing information)
33
+ // before the architect proceeds, so it must read as a clear, editable list.
34
+ 'requirements-review': 'You are a meticulous product / requirements analyst reviewing the collected requirements for a single building block before an engineer designs or builds it. Surface everything that would block confident implementation: missing information (gaps), ambiguities that need clarification, unstated assumptions, risks, and open questions. Be specific, concrete and actionable, and phrase each item so a product owner can answer it directly. Do NOT invent answers or requirements. Group your findings under clear headings and present a concise, readable markdown list — a human will review and edit it before the architect proceeds. Focus on business requirements and behaviours, not on technical questions that architect will answer later.',
35
+ // Runs in a container against the PR head branch when CI is red. It must make the
36
+ // failing build/tests pass with the smallest correct change and push to the same
37
+ // branch (no new branch / PR) so CI re-runs.
38
+ 'ci-fixer': 'You are a CI/build engineer. The pull request on this branch has failing CI. Reproduce the failure locally (run the project build / tests), diagnose the root cause, and make the minimal correct change to get every check passing. Do not disable or skip tests to make them pass. Commit your fix to the current branch.',
39
+ // Runs in a container against the PR head branch when the PR conflicts with its
40
+ // base. The harness has already merged the base in, leaving conflict markers; the
41
+ // agent resolves every one and the harness completes the merge commit + pushes to
42
+ // the same branch (no new branch / PR).
43
+ 'conflict-resolver': 'You are a software engineer resolving a merge conflict. The base branch has been merged into this pull-request branch, leaving Git conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) in one or more files. Find every conflicted file, understand both sides of each conflict, and edit the files to a correct, coherent result that preserves the intent of BOTH the PR changes and the base changes — never just discard one side. Remove all conflict markers and leave the project building. Do not open a new branch or PR; commit your resolution to the current branch.',
44
+ // Runs inline AFTER requirements are clarified and the spec is structured, BEFORE
45
+ // design/implementation. It triages the task up front (no repo, no diff — it reads
46
+ // the clarified requirements + spec context handed to it) and returns a JSON score
47
+ // object the engine persists on the block. Used to gate expensive consensus steps
48
+ // and to surface Complexity/Risk/Impact ratings in the UI. Mirror of `merger`'s
49
+ // JSON-only contract, but predictive (pre-implementation) rather than retrospective.
50
+ 'task-estimator': 'You are a delivery lead triaging a software task BEFORE any design or implementation has begun. From the clarified requirements and any specification context provided, predict three axes, each from 0 (trivial/safe/local) to 1 (severe/dangerous/system-wide): complexity (how intricate the work will be — scope, coupling, unknowns), risk (how likely the change is to break something or go wrong), and impact (the blast radius / how much and who it affects if it does). Be calibrated and conservative; do not anchor every axis to the middle. Respond with ONLY a JSON object {"complexity":0.0,"risk":0.0,"impact":0.0,"rationale":"…"} — no prose, no code fences. The rationale must briefly justify each score.',
51
+ // Runs in a container against the PR head branch as the final pipeline step. It
52
+ // ONLY assesses — it must not modify the repo — and returns a JSON score object.
53
+ merger: 'You are a release manager assessing a pull request before merge. Inspect the change against the base branch and judge three axes, each from 0 (trivial/safe) to 1 (severe): complexity, risk and impact. Be conservative. Make no commits. Respond with ONLY a JSON object {"complexity":0.0,"risk":0.0,"impact":0.0,"rationale":"…"} — no prose, no code fences.',
54
+ };
55
+ /**
56
+ * Role kinds whose deliverable is a side effect (a pushed branch / commit), not a
57
+ * final-text answer the platform reads. They legitimately end with little or no
58
+ * final reply, so the `FINAL_ANSWER_IN_REPLY` directive must NOT be appended to them.
59
+ */
60
+ const SIDE_EFFECT_ROLE_KINDS = new Set(['ci-fixer', 'conflict-resolver']);
61
+ /**
62
+ * The thin role prompt for a kind, or the generic fallback when the kind has no
63
+ * built-in role. This is the catalog's last resort, applied only after the
64
+ * companion / standard-phase / testing / acceptance / mock / business-logic tracks
65
+ * and the custom-kind registry have all declined the kind.
66
+ */
67
+ export function roleSystemPrompt(kind) {
68
+ const base = ROLES[kind] ??
69
+ `You are the "${kind}" agent. Do your part of the work for the given building block and report the result concisely.`;
70
+ // Every role here returns a report / document / JSON as its final reply, so it must
71
+ // land in the visible content — except the side-effect kinds, whose product is a push.
72
+ return SIDE_EFFECT_ROLE_KINDS.has(kind) ? base : `${base}\n\n${FINAL_ANSWER_IN_REPLY}`;
73
+ }
74
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../../../src/agents/prompts/roles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAA;AAEzD,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,kFAAkF;AAElF,MAAM,KAAK,GAAuC;IAChD,UAAU,EACR,yJAAyJ;IAC3J,kFAAkF;IAClF,mFAAmF;IACnF,8EAA8E;IAC9E,uEAAuE;IACvE,QAAQ,EACN,wfAAwf;IAC1f,oFAAoF;IACpF,qFAAqF;IACrF,sFAAsF;IACtF,uFAAuF;IACvF,8DAA8D;IAC9D,kBAAkB,EAChB,22BAA22B;IAC72B,UAAU,EACR,iHAAiH;IACnH,UAAU,EACR,yIAAyI;IAC3I,oFAAoF;IACpF,qFAAqF;IACrF,iFAAiF;IACjF,4EAA4E;IAC5E,qBAAqB,EACnB,guBAAguB;IACluB,kFAAkF;IAClF,iFAAiF;IACjF,6CAA6C;IAC7C,UAAU,EACR,6TAA6T;IAC/T,gFAAgF;IAChF,kFAAkF;IAClF,kFAAkF;IAClF,wCAAwC;IACxC,mBAAmB,EACjB,ijBAAijB;IACnjB,kFAAkF;IAClF,mFAAmF;IACnF,mFAAmF;IACnF,kFAAkF;IAClF,gFAAgF;IAChF,qFAAqF;IACrF,gBAAgB,EACd,ksBAAksB;IACpsB,gFAAgF;IAChF,iFAAiF;IACjF,MAAM,EACJ,mWAAmW;CACtW,CAAA;AAED;;;;GAIG;AACH,MAAM,sBAAsB,GAA2B,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAA;AAEjG;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAe;IAC9C,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,CAAC;QACX,gBAAgB,IAAI,iGAAiG,CAAA;IACvH,oFAAoF;IACpF,uFAAuF;IACvF,OAAO,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,qBAAqB,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Closing line every role prompt appends before `composeSystemPrompt` folds in
3
+ * the user's selected best-practice fragments — it tells the agent to treat those
4
+ * appended standards as hard requirements rather than optional suggestions.
5
+ */
6
+ export declare const STANDARDS_FOOTER = "Treat every best-practice standard appended below as a hard requirement, not a suggestion.";
7
+ /**
8
+ * Appended to every agent whose deliverable IS its final reply (a document, report,
9
+ * or JSON object the platform reads or parses) rather than a side effect like a
10
+ * pushed commit. Some reasoning models emit their whole answer into the private
11
+ * reasoning/thinking channel and leave the visible reply empty; the harness reads
12
+ * only the visible content, so that empty reply fails the run (see
13
+ * `unusableFinalAnswerCause`) even though the model "answered". This names the
14
+ * channel so the answer lands where the platform reads it. Do NOT append this to
15
+ * side-effect agents (the coder, ci-fixer, conflict-resolver, mocker): they
16
+ * legitimately end with no final text, and telling them otherwise is wrong.
17
+ */
18
+ export declare const FINAL_ANSWER_IN_REPLY: string;
19
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/agents/prompts/shared.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,+FACiE,CAAA;AAE9F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,QAIV,CAAA"}