@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
package/dist/brain.js ADDED
@@ -0,0 +1,83 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve as resolvePath } from 'node:path';
3
+ function normalizeNewlines(text) {
4
+ return text.replace(/\r\n?/g, '\n');
5
+ }
6
+ function normalizeSectionName(name) {
7
+ return name.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
8
+ }
9
+ function parseFrontmatter(block) {
10
+ const metadata = {};
11
+ for (const line of block.split('\n')) {
12
+ const trimmed = line.trim();
13
+ if (!trimmed || trimmed.startsWith('#'))
14
+ continue;
15
+ const idx = trimmed.indexOf(':');
16
+ if (idx === -1)
17
+ continue;
18
+ const key = trimmed.slice(0, idx).trim();
19
+ const value = trimmed.slice(idx + 1).trim();
20
+ if (!key)
21
+ continue;
22
+ metadata[key] = value;
23
+ }
24
+ return metadata;
25
+ }
26
+ export function parseBrainMarkdown(markdown, sourcePath) {
27
+ const normalized = normalizeNewlines(markdown).trim();
28
+ let body = normalized;
29
+ let metadata = {};
30
+ const frontmatterMatch = body.match(/^---\n([\s\S]*?)\n---\n?/);
31
+ if (frontmatterMatch) {
32
+ metadata = parseFrontmatter(frontmatterMatch[1]);
33
+ body = body.slice(frontmatterMatch[0].length);
34
+ }
35
+ const sections = {};
36
+ const headingPattern = /^##\s+(.+)$/gm;
37
+ const matches = [...body.matchAll(headingPattern)];
38
+ for (let i = 0; i < matches.length; i += 1) {
39
+ const current = matches[i];
40
+ const next = matches[i + 1];
41
+ const title = normalizeSectionName(current[1]);
42
+ const start = current.index + current[0].length;
43
+ const end = next ? next.index : body.length;
44
+ const content = body.slice(start, end).trim();
45
+ if (content) {
46
+ sections[title] = content;
47
+ }
48
+ }
49
+ return {
50
+ source: 'loaded',
51
+ markdown: normalized,
52
+ metadata,
53
+ sections,
54
+ sourcePath,
55
+ };
56
+ }
57
+ export function loadBrainFile(path) {
58
+ const sourcePath = resolvePath(path);
59
+ const markdown = readFileSync(sourcePath, 'utf8');
60
+ return parseBrainMarkdown(markdown, sourcePath);
61
+ }
62
+ export function resolvePersonaBrain(brain) {
63
+ if (!brain)
64
+ return undefined;
65
+ if (brain.source === 'loaded')
66
+ return brain;
67
+ if (brain.source === 'file')
68
+ return loadBrainFile(brain.path);
69
+ return parseBrainMarkdown(brain.markdown, brain.path);
70
+ }
71
+ export function getBrainSection(brain, sectionName) {
72
+ const resolved = resolvePersonaBrain(brain);
73
+ return resolved?.sections[normalizeSectionName(sectionName)];
74
+ }
75
+ export function resolvePersonaConfigBrain(config) {
76
+ const brain = resolvePersonaBrain(config.brain);
77
+ if (!brain)
78
+ return config;
79
+ if (config.brain?.source === 'loaded')
80
+ return config;
81
+ return { ...config, brain };
82
+ }
83
+ //# sourceMappingURL=brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain.js","sourceRoot":"","sources":["../src/brain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { ActionDefinition } from '../types.js';
2
+ export { returnToSessionAction } from '../core/focus-mode-actions.js';
3
+ export declare const readFileAction: ActionDefinition;
4
+ export declare const writeFileAction: ActionDefinition;
5
+ export declare const applyPatchAction: ActionDefinition;
6
+ export declare const editFileAction: ActionDefinition;
7
+ export declare const deleteFileAction: ActionDefinition;
8
+ export declare const listFilesAction: ActionDefinition;
9
+ export declare const searchInFilesAction: ActionDefinition;
10
+ export declare const runInstallAction: ActionDefinition;
11
+ export declare const runBuildAction: ActionDefinition;
12
+ export declare const runTestsAction: ActionDefinition;
13
+ export declare const runLintAction: ActionDefinition;
14
+ export declare const runStartAction: ActionDefinition;
15
+ export declare const runCommandAction: ActionDefinition;
16
+ export declare const browserOpenAction: ActionDefinition;
17
+ export declare const browserScreenshotAction: ActionDefinition;
18
+ export declare const browserClickAction: ActionDefinition;
19
+ export declare const browserTypeAction: ActionDefinition;
20
+ export declare const browserKeyAction: ActionDefinition;
21
+ export declare const browserConsoleAction: ActionDefinition;
22
+ export declare const finishAttemptAction: ActionDefinition;
23
+ /**
24
+ * Default coder-persona action contracts, keyed by name. Pick the subset
25
+ * your persona needs via object spread:
26
+ *
27
+ * actions: {
28
+ * ...({ readFile: coderActions.readFile,
29
+ * writeFile: coderActions.writeFile,
30
+ * applyPatch: coderActions.applyPatch,
31
+ * runCommand: coderActions.runCommand }),
32
+ * }
33
+ *
34
+ * Legacy editFile/deleteFile action definitions remain exported by name for
35
+ * trace replay and explicit compatibility. `writeFile` remains first-class:
36
+ * whole-file writes and targeted patches are different expert moves.
37
+ */
38
+ export declare const coderActions: {
39
+ readonly readFile: ActionDefinition;
40
+ readonly writeFile: ActionDefinition;
41
+ readonly applyPatch: ActionDefinition;
42
+ readonly listFiles: ActionDefinition;
43
+ readonly searchInFiles: ActionDefinition;
44
+ readonly runInstall: ActionDefinition;
45
+ readonly runBuild: ActionDefinition;
46
+ readonly runTests: ActionDefinition;
47
+ readonly runLint: ActionDefinition;
48
+ readonly runStart: ActionDefinition;
49
+ readonly runCommand: ActionDefinition;
50
+ readonly browserOpen: ActionDefinition;
51
+ readonly browserScreenshot: ActionDefinition;
52
+ readonly browserClick: ActionDefinition;
53
+ readonly browserType: ActionDefinition;
54
+ readonly browserKey: ActionDefinition;
55
+ readonly browserConsole: ActionDefinition;
56
+ readonly returnToSession: ActionDefinition;
57
+ readonly finishAttempt: ActionDefinition;
58
+ };
59
+ export type CoderActionName = keyof typeof coderActions;
60
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/builder/actions.ts"],"names":[],"mappings":"AAuDA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAMrE,eAAO,MAAM,cAAc,EAAE,gBAO5B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,gBAS7B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAW9B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,gBAiB5B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAO9B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,gBAQ7B,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,gBASjC,CAAA;AAID,eAAO,MAAM,gBAAgB,EAAE,gBAK9B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,gBAI5B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,gBAK5B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,gBAK3B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,gBAK5B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAQ9B,CAAA;AAID,eAAO,MAAM,iBAAiB,EAAE,gBAQ/B,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,gBAOrC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAShC,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,gBAS/B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAS9B,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,gBAIlC,CAAA;AAID,eAAO,MAAM,mBAAmB,EAAE,gBAOjC,CAAA;AAID;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;CAoB4B,CAAA;AAErD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,YAAY,CAAA"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Coder-persona action primitives.
3
+ *
4
+ * Standard action contracts (name + description + schema + confidence)
5
+ * for building coder-style agents on top of archetype. These are the
6
+ * actions the LLM sees; implementations live alongside a concrete
7
+ * `Sandbox` + `BrowserHarness` (see archetype/builder/sandbox.ts and
8
+ * archetype/builder/browser.ts — both coming in the next promotion
9
+ * steps).
10
+ *
11
+ * Consumers pick which actions to compose into their persona. A Python
12
+ * builder might use {readFile, writeFile, applyPatch, runCommand}; a
13
+ * browser-game builder might use all of these. Object spread is the
14
+ * composition primitive.
15
+ *
16
+ * ──────────────────────────────────────────────────────────────────
17
+ * Design choices worth naming:
18
+ *
19
+ * 1. `rationale` is optional on every action. The model never writes
20
+ * anything useful there today — it repeats the `message` field.
21
+ * Kept for backward-compat; likely removable in a future pass.
22
+ *
23
+ * 2. `writeFile` and `applyPatch` are complementary file mutation
24
+ * primitives. `writeFile` is for creating or replacing a whole file when
25
+ * the model knows the desired complete content. `applyPatch` is for
26
+ * targeted edits to existing files whose exact current context is known.
27
+ * If exact current file content is not already in the prompt, `readFile`
28
+ * is the context-loading primitive. Both return compact factual outcomes;
29
+ * raw file bodies belong in audit, not future prompt history.
30
+ *
31
+ * 3. `applyPatch` accepts one git-style unified diff patch and applies it
32
+ * atomically. One `applyPatch` call is one transaction; multiple
33
+ * `applyPatch` actions in the same turn are sequential durable steps,
34
+ * not one hidden transaction.
35
+ *
36
+ * 4. `runCommand` is the generic argv execution primitive (pi's
37
+ * `bash` equivalent). It exists so consumers don't need to add
38
+ * special-cased run* tools for every build system / test runner.
39
+ * For recurring shapes (npm ci, static build, node --test, etc.)
40
+ * consumers can layer their own thin wrappers.
41
+ *
42
+ * 5. `browserClick` takes EITHER `text` OR `selector`. Text-match is
43
+ * primary because models think about UIs in human terms; selectors
44
+ * are the escape hatch when text is ambiguous. Implementations try
45
+ * text first and fall through to selector only if text is missing
46
+ * or fails — both paths must be truthful about which mode matched.
47
+ *
48
+ * 6. `browserType` is for literal-text input; `browserKey` is for
49
+ * named-key presses (ArrowUp, Enter, Escape, a-z, etc). Split
50
+ * because mixing them led to hallucination — a model asked for
51
+ * "keyboardType 'ArrowUp'" when it meant "press ArrowUp." The two
52
+ * verbs are mechanically different (type = key-by-key characters,
53
+ * key = one keydown+keyup).
54
+ */
55
+ import { z } from 'zod';
56
+ import { returnToSessionAction } from '../core/focus-mode-actions.js';
57
+ export { returnToSessionAction } from '../core/focus-mode-actions.js';
58
+ const rationale = z.string().optional();
59
+ // ─── File I/O ─────────────────────────────────────────────────────
60
+ export const readFileAction = {
61
+ description: 'Read file contents. Use paths exactly as shown in FILES. In mounted workspaces, paths include their visible mount prefix, such as input/brief.md or artifact/index.html. FILES shows whether each mount is writable or read-only.',
62
+ confidence: 'low',
63
+ schema: z.object({
64
+ path: z.string().min(1),
65
+ rationale,
66
+ }),
67
+ };
68
+ export const writeFileAction = {
69
+ description: 'Create or overwrite a whole file when you know the desired complete content. The result confirms the path and size; exact file content is not carried into future history.',
70
+ confidence: 'low',
71
+ schema: z.object({
72
+ path: z.string().min(1),
73
+ content: z.string(),
74
+ rationale,
75
+ }),
76
+ };
77
+ export const applyPatchAction = {
78
+ description: 'Apply one git-style unified diff patch inside the workspace write surface shown in FILES. Use this for targeted edits when the exact current file context is already in your prompt. If you need to change existing text and the exact current file content is not in your prompt, consider readFile first; its result is added to your next prompt. Otherwise you are guessing context and the patch may fail next turn. One applyPatch call is one atomic file transaction: if any file/hunk in that patch cannot apply, no files from that patch are changed and the outcome explains the failed contract. You may use multiple applyPatch actions in one turn for independent durable steps; an earlier successful applyPatch remains applied if a later applyPatch fails. Put edits that must stay consistent in the same patch. Split edits into separate applyPatch actions when earlier work should remain useful even if a later independent edit fails. Use paths exactly as shown in FILES; in mounted workspaces, include the visible mount prefix such as artifact/index.html. Paths outside the write surface return a factual failure outcome.',
79
+ confidence: 'low',
80
+ schema: z.object({
81
+ patch: z.string().min(1).describe('Git-style unified diff patch. The patch may create, edit, or delete files. Old context lines must match current file contents.'),
82
+ rationale,
83
+ }).strict(),
84
+ exampleParams: {
85
+ patch: 'diff --git a/<path> b/<path>\n--- a/<path>\n+++ b/<path>\n@@ -1 +1 @@\n-old\n+new\n',
86
+ },
87
+ };
88
+ export const editFileAction = {
89
+ description: 'Replace exact current file text. oldText must match the current file contents exactly. If the exact text you want to replace is not in your prompt, consider readFile first; its result is added to your next prompt. Otherwise you are guessing context and the edit may fail next turn. Supports one or many edits in a single atomic call: if any edit misses, no edits are applied. If oldText appears more than once, set occurrence to the 1-based match to replace.',
90
+ confidence: 'low',
91
+ schema: z.object({
92
+ path: z.string().min(1),
93
+ edits: z
94
+ .array(z.object({
95
+ oldText: z.string().min(1),
96
+ newText: z.string(),
97
+ occurrence: z.number().int().positive().optional(),
98
+ }))
99
+ .min(1),
100
+ rationale,
101
+ }),
102
+ };
103
+ export const deleteFileAction = {
104
+ description: 'Delete a file.',
105
+ confidence: 'low',
106
+ schema: z.object({
107
+ path: z.string().min(1),
108
+ rationale,
109
+ }),
110
+ };
111
+ export const listFilesAction = {
112
+ description: 'List workspace file paths and sizes under a directory (defaults to the workspace root).',
113
+ confidence: 'low',
114
+ schema: z.object({
115
+ path: z.string().optional(),
116
+ rationale,
117
+ }),
118
+ };
119
+ export const searchInFilesAction = {
120
+ description: 'Regex-search across workspace files. Returns file:line:text for each match.',
121
+ confidence: 'low',
122
+ schema: z.object({
123
+ pattern: z.string().min(1),
124
+ pathGlob: z.string().optional(),
125
+ rationale,
126
+ }),
127
+ };
128
+ // ─── Sandbox execution ────────────────────────────────────────────
129
+ export const runInstallAction = {
130
+ description: "Runs `npm ci` against package-lock.json inside the workspace. Skipped if no package-lock.json exists — plain HTML/CSS/JS artifacts don't need it.",
131
+ confidence: 'low',
132
+ schema: z.object({ rationale }),
133
+ };
134
+ export const runBuildAction = {
135
+ description: "Produce the shippable artifact in dist/ using the host's build preset.",
136
+ confidence: 'low',
137
+ schema: z.object({ rationale }),
138
+ };
139
+ export const runTestsAction = {
140
+ description: "Runs Node's built-in test runner (`node --test`) on standard workspace test files, including test.js, test/**/*.js, tests/**/*.js, *.test.js, and *.spec.js variants for js/mjs/cjs. When the workspace has no package.json, the harness creates a temporary package boundary and infers module vs CommonJS from the discovered test files. Tests execute in a Node.js process — browser APIs (document, window, localStorage, fetch) are undefined there. Node tests can only inspect game/app state that the artifact exports, imports, or explicitly attaches to globalThis/window; top-level browser-script locals are not test-visible by magic. In ES module tests, static imports execute before test-file setup, so install globals before loading browser code by using dynamic `await import(...)` when module-load code reads document/window/localStorage. To exercise browser behavior, runStart and then use whichever browser actions this persona exposes.",
141
+ confidence: 'low',
142
+ schema: z.object({ rationale }),
143
+ };
144
+ export const runLintAction = {
145
+ description: "Runs ESLint with the host's fixed ruleset on workspace *.js / *.mjs files. Project ESLint config files do not change this action. Flags syntactic issues; does not verify runtime behavior.",
146
+ confidence: 'low',
147
+ schema: z.object({ rationale }),
148
+ };
149
+ export const runStartAction = {
150
+ description: 'Starts a local static HTTP server rooted at the workspace. Returns the URL to pass into browserOpen. Treat the workspace directory as the live document root.',
151
+ confidence: 'low',
152
+ schema: z.object({ rationale }),
153
+ };
154
+ export const runCommandAction = {
155
+ description: "Executes an arbitrary argv array inside the same canonical workspace path world shown in FILES. In mounted workspaces, cwd contains visible mount directories such as input/, spec/, and artifact/; use those exact paths in shell commands too. Same confinement as runBuild/runTests: workspace-only fs, no network, 120s timeout. Returns stdout, stderr, exit code, and a compact changed-file summary when the command mutates workspace files. The argv first entry `node` maps to the trusted Node binary. Use this when the fixed runBuild/runTests semantics don't fit — e.g. you wrote your own test harness with a DOM shim and want to run it.",
156
+ confidence: 'low',
157
+ schema: z.object({
158
+ command: z.array(z.string()).min(1),
159
+ rationale,
160
+ }),
161
+ };
162
+ // ─── Browser interaction ──────────────────────────────────────────
163
+ export const browserOpenAction = {
164
+ description: 'Open or reload the local app in the browser. `path` may be a served URL path such as `/` or `/src/index.html`, or a visible file path from FILES when that file is in the live document root. After file changes, call browserOpen again before checking the updated page.',
165
+ confidence: 'low',
166
+ schema: z.object({
167
+ path: z.string().optional(),
168
+ rationale,
169
+ }),
170
+ };
171
+ export const browserScreenshotAction = {
172
+ description: 'Capture a browser screenshot.',
173
+ confidence: 'low',
174
+ schema: z.object({
175
+ label: z.string().optional(),
176
+ rationale,
177
+ }),
178
+ };
179
+ export const browserClickAction = {
180
+ description: 'Click an element in the live browser. Pass `text` to match by visible text (primary), or `selector` for a CSS selector fallback.',
181
+ confidence: 'low',
182
+ schema: z.object({
183
+ text: z.string().optional(),
184
+ selector: z.string().optional(),
185
+ rationale,
186
+ }),
187
+ };
188
+ export const browserTypeAction = {
189
+ description: 'Type literal text into the currently focused element (or a selector you pass). Sends key-by-key via playwright keyboard.type so game/form handlers fire. Use for text input fields, not for named keys (see browserKey).',
190
+ confidence: 'low',
191
+ schema: z.object({
192
+ text: z.string().min(1),
193
+ selector: z.string().optional(),
194
+ rationale,
195
+ }),
196
+ };
197
+ export const browserKeyAction = {
198
+ description: 'Press a single named key (ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Enter, Escape, Tab, Space, a-z, 0-9, etc). Sends keydown+keyup once via playwright keyboard.press, so a game keyboard handler listening for "keydown" fires once.',
199
+ confidence: 'low',
200
+ schema: z.object({
201
+ key: z.string().min(1),
202
+ selector: z.string().optional(),
203
+ rationale,
204
+ }),
205
+ };
206
+ export const browserConsoleAction = {
207
+ description: 'Read browser console output.',
208
+ confidence: 'low',
209
+ schema: z.object({ rationale }),
210
+ };
211
+ // ─── Completion ───────────────────────────────────────────────────
212
+ export const finishAttemptAction = {
213
+ description: 'Record this persona\'s status for the active work item/session as complete, blocked, or failed with an honest summary. When finishing, include your own expert self-review against the active request, source context, and produced work; if that review says the work is not yet good enough, continue working instead of calling this. This is the persona\'s own handoff/status claim; the runtime records it and returns control to the normal turn flow.',
214
+ confidence: 'low',
215
+ schema: z.object({
216
+ outcome: z.enum(['success', 'blocked', 'failed']),
217
+ summary: z.string().min(1),
218
+ }),
219
+ };
220
+ // ─── Grouped export for ergonomic consumption ─────────────────────
221
+ /**
222
+ * Default coder-persona action contracts, keyed by name. Pick the subset
223
+ * your persona needs via object spread:
224
+ *
225
+ * actions: {
226
+ * ...({ readFile: coderActions.readFile,
227
+ * writeFile: coderActions.writeFile,
228
+ * applyPatch: coderActions.applyPatch,
229
+ * runCommand: coderActions.runCommand }),
230
+ * }
231
+ *
232
+ * Legacy editFile/deleteFile action definitions remain exported by name for
233
+ * trace replay and explicit compatibility. `writeFile` remains first-class:
234
+ * whole-file writes and targeted patches are different expert moves.
235
+ */
236
+ export const coderActions = {
237
+ readFile: readFileAction,
238
+ writeFile: writeFileAction,
239
+ applyPatch: applyPatchAction,
240
+ listFiles: listFilesAction,
241
+ searchInFiles: searchInFilesAction,
242
+ runInstall: runInstallAction,
243
+ runBuild: runBuildAction,
244
+ runTests: runTestsAction,
245
+ runLint: runLintAction,
246
+ runStart: runStartAction,
247
+ runCommand: runCommandAction,
248
+ browserOpen: browserOpenAction,
249
+ browserScreenshot: browserScreenshotAction,
250
+ browserClick: browserClickAction,
251
+ browserType: browserTypeAction,
252
+ browserKey: browserKeyAction,
253
+ browserConsole: browserConsoleAction,
254
+ returnToSession: returnToSessionAction,
255
+ finishAttempt: finishAttemptAction,
256
+ };
257
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/builder/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * BrowserHarness — live-browser primitive for coder personas that
3
+ * build browser-rendered artifacts (games, forms, dashboards). Lets the
4
+ * model actually see the page and interact with it instead of inferring
5
+ * behavior from code alone.
6
+ *
7
+ * Contract:
8
+ * — `open` navigate to a path under the allowed origin
9
+ * — `click` click by visible text (primary) or CSS selector (fallback)
10
+ * — `type` type literal text into the focused element
11
+ * — `key` press one named key (ArrowUp, Enter, etc) once
12
+ * — `screenshot` capture a PNG (bytes + base64)
13
+ * — `getConsoleEntries` read captured console output
14
+ * — `close` terminate the browser + clean up the profile dir
15
+ *
16
+ * What belongs here (archetype layer):
17
+ * — `BrowserHarness` interface + all result types
18
+ * — `PlaywrightBrowser` default impl using playwright chromium
19
+ * — Origin-allowlist enforcement (route blocker + navigation check)
20
+ * — Ephemeral profile directory lifecycle
21
+ *
22
+ * What does NOT belong here:
23
+ * — Evidence-file persistence. `screenshot()` returns bytes and base64;
24
+ * the host app decides whether to write a PNG file, upload, attach
25
+ * the bytes to the next prompt turn, etc.
26
+ * — Tool-action wiring (archetype/builder/actions.ts owns the action
27
+ * contracts; the executor dispatch maps them to BrowserHarness calls).
28
+ *
29
+ * Node-only. Playwright is a runtime dep of the *host app* (not
30
+ * archetype) — we dynamically import `playwright` inside the default
31
+ * impl, so archetype ships without pulling chromium binaries.
32
+ */
33
+ export interface BrowserOpenResult {
34
+ ok: boolean;
35
+ url: string;
36
+ title: string;
37
+ }
38
+ export interface BrowserScreenshotResult {
39
+ ok: boolean;
40
+ /** Raw PNG bytes. Use these when you want to persist the file yourself. */
41
+ bytes: Buffer;
42
+ /** Base64-encoded PNG. Pass as `ChatAttachment.data` for multimodal prompts. */
43
+ base64: string;
44
+ }
45
+ export interface BrowserClickResult {
46
+ ok: boolean;
47
+ matched: 'text' | 'selector' | 'none';
48
+ detail: string;
49
+ }
50
+ export interface BrowserTypeResult {
51
+ ok: boolean;
52
+ detail: string;
53
+ }
54
+ export interface BrowserKeyResult {
55
+ ok: boolean;
56
+ detail: string;
57
+ }
58
+ export interface BrowserConsoleEntry {
59
+ type: string;
60
+ text: string;
61
+ location: {
62
+ url?: string;
63
+ lineNumber?: number;
64
+ columnNumber?: number;
65
+ };
66
+ }
67
+ export interface BrowserHarness {
68
+ open(relativePath?: string): Promise<BrowserOpenResult>;
69
+ screenshot(label?: string): Promise<BrowserScreenshotResult>;
70
+ click(input: {
71
+ text?: string;
72
+ selector?: string;
73
+ }): Promise<BrowserClickResult>;
74
+ type(input: {
75
+ text: string;
76
+ selector?: string;
77
+ }): Promise<BrowserTypeResult>;
78
+ key(input: {
79
+ key: string;
80
+ selector?: string;
81
+ }): Promise<BrowserKeyResult>;
82
+ getConsoleEntries(): BrowserConsoleEntry[];
83
+ close(): Promise<void>;
84
+ }
85
+ export interface PlaywrightBrowserOptions {
86
+ /** Origin the browser is restricted to (e.g. `http://127.0.0.1:4317`). */
87
+ allowedOrigin: string;
88
+ /** Viewport width in pixels. Default 1440. */
89
+ viewportWidth?: number;
90
+ /** Viewport height in pixels. Default 960. */
91
+ viewportHeight?: number;
92
+ /**
93
+ * User-data / profile directory. If omitted, a temp directory is
94
+ * created and cleaned up on `close()`.
95
+ */
96
+ profileDir?: string;
97
+ }
98
+ export declare class PlaywrightBrowser implements BrowserHarness {
99
+ private readonly allowedOrigin;
100
+ private readonly profileDir;
101
+ private readonly ownsProfileDir;
102
+ private readonly viewport;
103
+ private context;
104
+ private page;
105
+ private readonly consoleEntries;
106
+ constructor(options: PlaywrightBrowserOptions);
107
+ open(relativePath?: string): Promise<BrowserOpenResult>;
108
+ screenshot(_label?: string): Promise<BrowserScreenshotResult>;
109
+ /**
110
+ * Type literal text into the focused element (or a specified selector).
111
+ * Mirrors playwright's `keyboard.type` — sends key-by-key so form/game
112
+ * handlers fire. If `selector` is given, focus it first.
113
+ */
114
+ type(input: {
115
+ text: string;
116
+ selector?: string;
117
+ }): Promise<BrowserTypeResult>;
118
+ /**
119
+ * Press a single named key (ArrowUp, Enter, Escape, Tab, Space, a-z,
120
+ * 0-9, etc). Mirrors playwright's `keyboard.press` — one keydown +
121
+ * keyup so game handlers fire once.
122
+ */
123
+ key(input: {
124
+ key: string;
125
+ selector?: string;
126
+ }): Promise<BrowserKeyResult>;
127
+ /**
128
+ * Click an element. Primary: visible text match (matches how the model
129
+ * thinks about UI). Fallback: CSS selector. Returns the match mode
130
+ * + detail so the executor can render a truthful outcome note.
131
+ */
132
+ click(input: {
133
+ text?: string;
134
+ selector?: string;
135
+ }): Promise<BrowserClickResult>;
136
+ getConsoleEntries(): BrowserConsoleEntry[];
137
+ close(): Promise<void>;
138
+ private ensurePage;
139
+ }
140
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/builder/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAQH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,OAAO,CAAA;IACX,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAA;IACrC,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACvD,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAC5D,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAC/E,IAAI,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5E,GAAG,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACzE,iBAAiB,IAAI,mBAAmB,EAAE,CAAA;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AA0DD,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAA;IACrB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,OAAO,EAAE,wBAAwB;IAgBvC,IAAI,CAAC,YAAY,GAAE,MAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiB5D,UAAU,CAAC,MAAM,GAAE,MAAe,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAM3E;;;;OAIG;IACG,IAAI,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiBlF;;;;OAIG;IACG,GAAG,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiB/E;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBrF,iBAAiB,IAAI,mBAAmB,EAAE;IAIpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASd,UAAU;CA2BzB"}