@renseiai/agentfactory 0.8.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/src/config/index.d.ts +3 -0
  4. package/dist/src/config/index.d.ts.map +1 -0
  5. package/dist/src/config/index.js +1 -0
  6. package/dist/src/config/repository-config.d.ts +44 -0
  7. package/dist/src/config/repository-config.d.ts.map +1 -0
  8. package/dist/src/config/repository-config.js +88 -0
  9. package/dist/src/config/repository-config.test.d.ts +2 -0
  10. package/dist/src/config/repository-config.test.d.ts.map +1 -0
  11. package/dist/src/config/repository-config.test.js +249 -0
  12. package/dist/src/deployment/deployment-checker.d.ts +110 -0
  13. package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
  14. package/dist/src/deployment/deployment-checker.js +242 -0
  15. package/dist/src/deployment/index.d.ts +3 -0
  16. package/dist/src/deployment/index.d.ts.map +1 -0
  17. package/dist/src/deployment/index.js +2 -0
  18. package/dist/src/frontend/index.d.ts +2 -0
  19. package/dist/src/frontend/index.d.ts.map +1 -0
  20. package/dist/src/frontend/index.js +1 -0
  21. package/dist/src/frontend/types.d.ts +106 -0
  22. package/dist/src/frontend/types.d.ts.map +1 -0
  23. package/dist/src/frontend/types.js +11 -0
  24. package/dist/src/governor/decision-engine.d.ts +52 -0
  25. package/dist/src/governor/decision-engine.d.ts.map +1 -0
  26. package/dist/src/governor/decision-engine.js +220 -0
  27. package/dist/src/governor/decision-engine.test.d.ts +2 -0
  28. package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
  29. package/dist/src/governor/decision-engine.test.js +629 -0
  30. package/dist/src/governor/event-bus.d.ts +43 -0
  31. package/dist/src/governor/event-bus.d.ts.map +1 -0
  32. package/dist/src/governor/event-bus.js +8 -0
  33. package/dist/src/governor/event-deduplicator.d.ts +43 -0
  34. package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
  35. package/dist/src/governor/event-deduplicator.js +53 -0
  36. package/dist/src/governor/event-driven-governor.d.ts +131 -0
  37. package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
  38. package/dist/src/governor/event-driven-governor.js +379 -0
  39. package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
  40. package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
  41. package/dist/src/governor/event-driven-governor.test.js +673 -0
  42. package/dist/src/governor/event-types.d.ts +78 -0
  43. package/dist/src/governor/event-types.d.ts.map +1 -0
  44. package/dist/src/governor/event-types.js +32 -0
  45. package/dist/src/governor/governor-types.d.ts +82 -0
  46. package/dist/src/governor/governor-types.d.ts.map +1 -0
  47. package/dist/src/governor/governor-types.js +21 -0
  48. package/dist/src/governor/governor.d.ts +100 -0
  49. package/dist/src/governor/governor.d.ts.map +1 -0
  50. package/dist/src/governor/governor.js +262 -0
  51. package/dist/src/governor/governor.test.d.ts +2 -0
  52. package/dist/src/governor/governor.test.d.ts.map +1 -0
  53. package/dist/src/governor/governor.test.js +514 -0
  54. package/dist/src/governor/human-touchpoints.d.ts +131 -0
  55. package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
  56. package/dist/src/governor/human-touchpoints.js +251 -0
  57. package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
  58. package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
  59. package/dist/src/governor/human-touchpoints.test.js +366 -0
  60. package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
  61. package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
  62. package/dist/src/governor/in-memory-event-bus.js +79 -0
  63. package/dist/src/governor/index.d.ts +14 -0
  64. package/dist/src/governor/index.d.ts.map +1 -0
  65. package/dist/src/governor/index.js +13 -0
  66. package/dist/src/governor/override-parser.d.ts +60 -0
  67. package/dist/src/governor/override-parser.d.ts.map +1 -0
  68. package/dist/src/governor/override-parser.js +98 -0
  69. package/dist/src/governor/override-parser.test.d.ts +2 -0
  70. package/dist/src/governor/override-parser.test.d.ts.map +1 -0
  71. package/dist/src/governor/override-parser.test.js +312 -0
  72. package/dist/src/governor/platform-adapter.d.ts +69 -0
  73. package/dist/src/governor/platform-adapter.d.ts.map +1 -0
  74. package/dist/src/governor/platform-adapter.js +11 -0
  75. package/dist/src/governor/processing-state.d.ts +66 -0
  76. package/dist/src/governor/processing-state.d.ts.map +1 -0
  77. package/dist/src/governor/processing-state.js +43 -0
  78. package/dist/src/governor/processing-state.test.d.ts +2 -0
  79. package/dist/src/governor/processing-state.test.d.ts.map +1 -0
  80. package/dist/src/governor/processing-state.test.js +96 -0
  81. package/dist/src/governor/top-of-funnel.d.ts +118 -0
  82. package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
  83. package/dist/src/governor/top-of-funnel.js +168 -0
  84. package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
  85. package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
  86. package/dist/src/governor/top-of-funnel.test.js +331 -0
  87. package/dist/src/index.d.ts +11 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +10 -0
  90. package/dist/src/linear-cli.d.ts +38 -0
  91. package/dist/src/linear-cli.d.ts.map +1 -0
  92. package/dist/src/linear-cli.js +674 -0
  93. package/dist/src/logger.d.ts +117 -0
  94. package/dist/src/logger.d.ts.map +1 -0
  95. package/dist/src/logger.js +430 -0
  96. package/dist/src/manifest/generate.d.ts +20 -0
  97. package/dist/src/manifest/generate.d.ts.map +1 -0
  98. package/dist/src/manifest/generate.js +65 -0
  99. package/dist/src/manifest/index.d.ts +4 -0
  100. package/dist/src/manifest/index.d.ts.map +1 -0
  101. package/dist/src/manifest/index.js +2 -0
  102. package/dist/src/manifest/route-manifest.d.ts +34 -0
  103. package/dist/src/manifest/route-manifest.d.ts.map +1 -0
  104. package/dist/src/manifest/route-manifest.js +148 -0
  105. package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
  106. package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
  107. package/dist/src/orchestrator/activity-emitter.js +306 -0
  108. package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
  109. package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
  110. package/dist/src/orchestrator/api-activity-emitter.js +417 -0
  111. package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
  112. package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
  113. package/dist/src/orchestrator/heartbeat-writer.js +137 -0
  114. package/dist/src/orchestrator/index.d.ts +20 -0
  115. package/dist/src/orchestrator/index.d.ts.map +1 -0
  116. package/dist/src/orchestrator/index.js +22 -0
  117. package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
  118. package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
  119. package/dist/src/orchestrator/log-analyzer.js +572 -0
  120. package/dist/src/orchestrator/log-config.d.ts +39 -0
  121. package/dist/src/orchestrator/log-config.d.ts.map +1 -0
  122. package/dist/src/orchestrator/log-config.js +45 -0
  123. package/dist/src/orchestrator/orchestrator.d.ts +316 -0
  124. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
  125. package/dist/src/orchestrator/orchestrator.js +3290 -0
  126. package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
  127. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
  128. package/dist/src/orchestrator/parse-work-result.js +135 -0
  129. package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
  130. package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
  131. package/dist/src/orchestrator/parse-work-result.test.js +234 -0
  132. package/dist/src/orchestrator/progress-logger.d.ts +72 -0
  133. package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
  134. package/dist/src/orchestrator/progress-logger.js +135 -0
  135. package/dist/src/orchestrator/session-logger.d.ts +159 -0
  136. package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
  137. package/dist/src/orchestrator/session-logger.js +275 -0
  138. package/dist/src/orchestrator/state-recovery.d.ts +96 -0
  139. package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
  140. package/dist/src/orchestrator/state-recovery.js +302 -0
  141. package/dist/src/orchestrator/state-types.d.ts +165 -0
  142. package/dist/src/orchestrator/state-types.d.ts.map +1 -0
  143. package/dist/src/orchestrator/state-types.js +7 -0
  144. package/dist/src/orchestrator/stream-parser.d.ts +151 -0
  145. package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
  146. package/dist/src/orchestrator/stream-parser.js +137 -0
  147. package/dist/src/orchestrator/types.d.ts +232 -0
  148. package/dist/src/orchestrator/types.d.ts.map +1 -0
  149. package/dist/src/orchestrator/types.js +4 -0
  150. package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
  151. package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
  152. package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
  153. package/dist/src/providers/a2a-auth.d.ts +81 -0
  154. package/dist/src/providers/a2a-auth.d.ts.map +1 -0
  155. package/dist/src/providers/a2a-auth.js +188 -0
  156. package/dist/src/providers/a2a-auth.test.d.ts +2 -0
  157. package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
  158. package/dist/src/providers/a2a-auth.test.js +232 -0
  159. package/dist/src/providers/a2a-provider.d.ts +254 -0
  160. package/dist/src/providers/a2a-provider.d.ts.map +1 -0
  161. package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
  162. package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
  163. package/dist/src/providers/a2a-provider.integration.test.js +665 -0
  164. package/dist/src/providers/a2a-provider.js +811 -0
  165. package/dist/src/providers/a2a-provider.test.d.ts +2 -0
  166. package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
  167. package/dist/src/providers/a2a-provider.test.js +681 -0
  168. package/dist/src/providers/amp-provider.d.ts +20 -0
  169. package/dist/src/providers/amp-provider.d.ts.map +1 -0
  170. package/dist/src/providers/amp-provider.js +24 -0
  171. package/dist/src/providers/claude-provider.d.ts +18 -0
  172. package/dist/src/providers/claude-provider.d.ts.map +1 -0
  173. package/dist/src/providers/claude-provider.js +437 -0
  174. package/dist/src/providers/codex-provider.d.ts +133 -0
  175. package/dist/src/providers/codex-provider.d.ts.map +1 -0
  176. package/dist/src/providers/codex-provider.js +381 -0
  177. package/dist/src/providers/codex-provider.test.d.ts +2 -0
  178. package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
  179. package/dist/src/providers/codex-provider.test.js +387 -0
  180. package/dist/src/providers/index.d.ts +44 -0
  181. package/dist/src/providers/index.d.ts.map +1 -0
  182. package/dist/src/providers/index.js +85 -0
  183. package/dist/src/providers/spring-ai-provider.d.ts +90 -0
  184. package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
  185. package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
  186. package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
  187. package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
  188. package/dist/src/providers/spring-ai-provider.js +317 -0
  189. package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
  190. package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
  191. package/dist/src/providers/spring-ai-provider.test.js +200 -0
  192. package/dist/src/providers/types.d.ts +165 -0
  193. package/dist/src/providers/types.d.ts.map +1 -0
  194. package/dist/src/providers/types.js +13 -0
  195. package/dist/src/templates/adapters.d.ts +51 -0
  196. package/dist/src/templates/adapters.d.ts.map +1 -0
  197. package/dist/src/templates/adapters.js +104 -0
  198. package/dist/src/templates/adapters.test.d.ts +2 -0
  199. package/dist/src/templates/adapters.test.d.ts.map +1 -0
  200. package/dist/src/templates/adapters.test.js +165 -0
  201. package/dist/src/templates/agent-definition.d.ts +85 -0
  202. package/dist/src/templates/agent-definition.d.ts.map +1 -0
  203. package/dist/src/templates/agent-definition.js +97 -0
  204. package/dist/src/templates/agent-definition.test.d.ts +2 -0
  205. package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
  206. package/dist/src/templates/agent-definition.test.js +209 -0
  207. package/dist/src/templates/index.d.ts +14 -0
  208. package/dist/src/templates/index.d.ts.map +1 -0
  209. package/dist/src/templates/index.js +11 -0
  210. package/dist/src/templates/loader.d.ts +41 -0
  211. package/dist/src/templates/loader.d.ts.map +1 -0
  212. package/dist/src/templates/loader.js +114 -0
  213. package/dist/src/templates/registry.d.ts +80 -0
  214. package/dist/src/templates/registry.d.ts.map +1 -0
  215. package/dist/src/templates/registry.js +177 -0
  216. package/dist/src/templates/registry.test.d.ts +2 -0
  217. package/dist/src/templates/registry.test.d.ts.map +1 -0
  218. package/dist/src/templates/registry.test.js +198 -0
  219. package/dist/src/templates/renderer.d.ts +29 -0
  220. package/dist/src/templates/renderer.d.ts.map +1 -0
  221. package/dist/src/templates/renderer.js +35 -0
  222. package/dist/src/templates/strategy-templates.test.d.ts +2 -0
  223. package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
  224. package/dist/src/templates/strategy-templates.test.js +619 -0
  225. package/dist/src/templates/types.d.ts +233 -0
  226. package/dist/src/templates/types.d.ts.map +1 -0
  227. package/dist/src/templates/types.js +127 -0
  228. package/dist/src/templates/types.test.d.ts +2 -0
  229. package/dist/src/templates/types.test.d.ts.map +1 -0
  230. package/dist/src/templates/types.test.js +232 -0
  231. package/dist/src/tools/index.d.ts +6 -0
  232. package/dist/src/tools/index.d.ts.map +1 -0
  233. package/dist/src/tools/index.js +3 -0
  234. package/dist/src/tools/linear-runner.d.ts +34 -0
  235. package/dist/src/tools/linear-runner.d.ts.map +1 -0
  236. package/dist/src/tools/linear-runner.js +700 -0
  237. package/dist/src/tools/plugins/linear.d.ts +9 -0
  238. package/dist/src/tools/plugins/linear.d.ts.map +1 -0
  239. package/dist/src/tools/plugins/linear.js +138 -0
  240. package/dist/src/tools/registry.d.ts +9 -0
  241. package/dist/src/tools/registry.d.ts.map +1 -0
  242. package/dist/src/tools/registry.js +18 -0
  243. package/dist/src/tools/types.d.ts +18 -0
  244. package/dist/src/tools/types.d.ts.map +1 -0
  245. package/dist/src/tools/types.js +1 -0
  246. package/package.json +78 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Logger utility for worker and orchestrator output
3
+ *
4
+ * Provides colorized, structured logging with worker/agent context.
5
+ * Uses ANSI escape codes directly to avoid external dependencies.
6
+ */
7
+ declare const colors: {
8
+ readonly reset: "\u001B[0m";
9
+ readonly bold: "\u001B[1m";
10
+ readonly dim: "\u001B[2m";
11
+ readonly black: "\u001B[30m";
12
+ readonly red: "\u001B[31m";
13
+ readonly green: "\u001B[32m";
14
+ readonly yellow: "\u001B[33m";
15
+ readonly blue: "\u001B[34m";
16
+ readonly magenta: "\u001B[35m";
17
+ readonly cyan: "\u001B[36m";
18
+ readonly white: "\u001B[37m";
19
+ readonly brightBlack: "\u001B[90m";
20
+ readonly brightRed: "\u001B[91m";
21
+ readonly brightGreen: "\u001B[92m";
22
+ readonly brightYellow: "\u001B[93m";
23
+ readonly brightBlue: "\u001B[94m";
24
+ readonly brightMagenta: "\u001B[95m";
25
+ readonly brightCyan: "\u001B[96m";
26
+ readonly brightWhite: "\u001B[97m";
27
+ readonly bgBlack: "\u001B[40m";
28
+ readonly bgRed: "\u001B[41m";
29
+ readonly bgGreen: "\u001B[42m";
30
+ readonly bgYellow: "\u001B[43m";
31
+ readonly bgBlue: "\u001B[44m";
32
+ readonly bgMagenta: "\u001B[45m";
33
+ readonly bgCyan: "\u001B[46m";
34
+ readonly bgWhite: "\u001B[47m";
35
+ };
36
+ type ColorName = keyof typeof colors;
37
+ declare const LEVEL_STYLES: Record<string, {
38
+ color: ColorName;
39
+ label: string;
40
+ }>;
41
+ export type LogLevel = keyof typeof LEVEL_STYLES;
42
+ export interface LoggerContext {
43
+ workerId?: string;
44
+ workerShortId?: string;
45
+ issueIdentifier?: string;
46
+ sessionId?: string;
47
+ }
48
+ export interface LoggerOptions {
49
+ showTimestamp?: boolean;
50
+ showLevel?: boolean;
51
+ colorEnabled?: boolean;
52
+ minLevel?: LogLevel;
53
+ }
54
+ export declare class Logger {
55
+ private context;
56
+ private options;
57
+ constructor(context?: LoggerContext, options?: LoggerOptions);
58
+ /**
59
+ * Create a child logger with additional context
60
+ */
61
+ child(additionalContext: LoggerContext): Logger;
62
+ /**
63
+ * Format the context prefix (worker ID, issue identifier)
64
+ */
65
+ private formatPrefix;
66
+ /**
67
+ * Format a log line
68
+ */
69
+ private formatLine;
70
+ /**
71
+ * Format data object for display
72
+ */
73
+ private formatData;
74
+ /**
75
+ * Check if a log level should be output
76
+ */
77
+ private shouldLog;
78
+ /**
79
+ * Core log method
80
+ */
81
+ private log;
82
+ debug(message: string, data?: Record<string, unknown>): void;
83
+ info(message: string, data?: Record<string, unknown>): void;
84
+ success(message: string, data?: Record<string, unknown>): void;
85
+ warn(message: string, data?: Record<string, unknown>): void;
86
+ error(message: string, data?: Record<string, unknown>): void;
87
+ /**
88
+ * Log an activity (thought, action, response) with appropriate styling
89
+ */
90
+ activity(type: string, content: string, maxLength?: number): void;
91
+ /**
92
+ * Log a section header/divider
93
+ */
94
+ section(title: string): void;
95
+ /**
96
+ * Log a status change with visual indicator
97
+ */
98
+ status(status: string, details?: string): void;
99
+ /**
100
+ * Log a tool call with formatted input
101
+ */
102
+ toolCall(toolName: string, input?: Record<string, unknown>): void;
103
+ /**
104
+ * Format tool input for display (show relevant params based on tool type)
105
+ */
106
+ private formatToolInput;
107
+ }
108
+ /**
109
+ * Create a logger instance
110
+ */
111
+ export declare function createLogger(context?: LoggerContext, options?: LoggerOptions): Logger;
112
+ /**
113
+ * Default logger for quick use
114
+ */
115
+ export declare const logger: Logger;
116
+ export {};
117
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCF,CAAA;AAEV,KAAK,SAAS,GAAG,MAAM,OAAO,MAAM,CAAA;AAepC,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMrE,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,YAAY,CAAA;AAEhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAwCD,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB;IAUpE;;OAEG;IACH,KAAK,CAAC,iBAAiB,EAAE,aAAa,GAAG,MAAM;IAO/C;;OAEG;IACH,OAAO,CAAC,YAAY;IA2BpB;;OAEG;IACH,OAAO,CAAC,UAAU;IA6ClB;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,GAAG;IAcX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI3D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI5D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,IAAI;IAqC7D;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa5B;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAoD9C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAkDjE;;OAEG;IACH,OAAO,CAAC,eAAe;CA0BxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAErF;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAiB,CAAA"}
@@ -0,0 +1,430 @@
1
+ /**
2
+ * Logger utility for worker and orchestrator output
3
+ *
4
+ * Provides colorized, structured logging with worker/agent context.
5
+ * Uses ANSI escape codes directly to avoid external dependencies.
6
+ */
7
+ // ANSI color codes
8
+ const colors = {
9
+ reset: '\x1b[0m',
10
+ bold: '\x1b[1m',
11
+ dim: '\x1b[2m',
12
+ // Foreground colors
13
+ black: '\x1b[30m',
14
+ red: '\x1b[31m',
15
+ green: '\x1b[32m',
16
+ yellow: '\x1b[33m',
17
+ blue: '\x1b[34m',
18
+ magenta: '\x1b[35m',
19
+ cyan: '\x1b[36m',
20
+ white: '\x1b[37m',
21
+ // Bright foreground colors
22
+ brightBlack: '\x1b[90m',
23
+ brightRed: '\x1b[91m',
24
+ brightGreen: '\x1b[92m',
25
+ brightYellow: '\x1b[93m',
26
+ brightBlue: '\x1b[94m',
27
+ brightMagenta: '\x1b[95m',
28
+ brightCyan: '\x1b[96m',
29
+ brightWhite: '\x1b[97m',
30
+ // Background colors
31
+ bgBlack: '\x1b[40m',
32
+ bgRed: '\x1b[41m',
33
+ bgGreen: '\x1b[42m',
34
+ bgYellow: '\x1b[43m',
35
+ bgBlue: '\x1b[44m',
36
+ bgMagenta: '\x1b[45m',
37
+ bgCyan: '\x1b[46m',
38
+ bgWhite: '\x1b[47m',
39
+ };
40
+ // Color palette for worker/agent identification (easy to distinguish)
41
+ const WORKER_COLORS = ['cyan', 'magenta', 'yellow', 'green', 'blue', 'brightCyan', 'brightMagenta', 'brightYellow'];
42
+ // Activity type colors
43
+ const ACTIVITY_COLORS = {
44
+ thought: 'brightBlack',
45
+ action: 'blue',
46
+ response: 'green',
47
+ tool_use: 'cyan',
48
+ tool_result: 'brightBlack',
49
+ };
50
+ // Log level styling
51
+ const LEVEL_STYLES = {
52
+ debug: { color: 'brightBlack', label: 'DBG' },
53
+ info: { color: 'brightBlue', label: 'INF' },
54
+ success: { color: 'green', label: 'OK ' },
55
+ warn: { color: 'yellow', label: 'WRN' },
56
+ error: { color: 'red', label: 'ERR' },
57
+ };
58
+ const LOG_LEVEL_PRIORITY = {
59
+ debug: 0,
60
+ info: 1,
61
+ success: 2,
62
+ warn: 3,
63
+ error: 4,
64
+ };
65
+ // Map to track assigned colors for worker/agent IDs
66
+ const colorAssignments = new Map();
67
+ let colorIndex = 0;
68
+ function getColorForId(id) {
69
+ if (!colorAssignments.has(id)) {
70
+ colorAssignments.set(id, WORKER_COLORS[colorIndex % WORKER_COLORS.length]);
71
+ colorIndex++;
72
+ }
73
+ return colorAssignments.get(id);
74
+ }
75
+ function colorize(text, ...colorNames) {
76
+ const colorCodes = colorNames.map((c) => colors[c]).join('');
77
+ return `${colorCodes}${text}${colors.reset}`;
78
+ }
79
+ function formatTimestamp() {
80
+ const now = new Date();
81
+ const hours = now.getHours().toString().padStart(2, '0');
82
+ const minutes = now.getMinutes().toString().padStart(2, '0');
83
+ const seconds = now.getSeconds().toString().padStart(2, '0');
84
+ return `${hours}:${minutes}:${seconds}`;
85
+ }
86
+ function truncate(text, maxLength) {
87
+ if (text.length <= maxLength)
88
+ return text;
89
+ return text.substring(0, maxLength - 3) + '...';
90
+ }
91
+ export class Logger {
92
+ context;
93
+ options;
94
+ constructor(context = {}, options = {}) {
95
+ this.context = context;
96
+ this.options = {
97
+ showTimestamp: options.showTimestamp ?? true,
98
+ showLevel: options.showLevel ?? true,
99
+ colorEnabled: options.colorEnabled ?? process.stdout.isTTY !== false,
100
+ minLevel: options.minLevel ?? 'info',
101
+ };
102
+ }
103
+ /**
104
+ * Create a child logger with additional context
105
+ */
106
+ child(additionalContext) {
107
+ return new Logger({ ...this.context, ...additionalContext }, this.options);
108
+ }
109
+ /**
110
+ * Format the context prefix (worker ID, issue identifier)
111
+ */
112
+ formatPrefix() {
113
+ const parts = [];
114
+ // Worker ID with color
115
+ if (this.context.workerShortId || this.context.workerId) {
116
+ const id = this.context.workerShortId || this.context.workerId.substring(0, 8);
117
+ const color = getColorForId(this.context.workerId || id);
118
+ if (this.options.colorEnabled) {
119
+ parts.push(colorize(`[${id}]`, color, 'bold'));
120
+ }
121
+ else {
122
+ parts.push(`[${id}]`);
123
+ }
124
+ }
125
+ // Issue identifier with rotating color for visual distinction
126
+ if (this.context.issueIdentifier) {
127
+ if (this.options.colorEnabled) {
128
+ const color = getColorForId(this.context.issueIdentifier);
129
+ parts.push(colorize(`[${this.context.issueIdentifier}]`, color, 'bold'));
130
+ }
131
+ else {
132
+ parts.push(`[${this.context.issueIdentifier}]`);
133
+ }
134
+ }
135
+ return parts.join(' ');
136
+ }
137
+ /**
138
+ * Format a log line
139
+ */
140
+ formatLine(level, message, data) {
141
+ const parts = [];
142
+ // Timestamp
143
+ if (this.options.showTimestamp) {
144
+ const ts = formatTimestamp();
145
+ if (this.options.colorEnabled) {
146
+ parts.push(colorize(ts, 'dim'));
147
+ }
148
+ else {
149
+ parts.push(ts);
150
+ }
151
+ }
152
+ // Level indicator
153
+ if (this.options.showLevel) {
154
+ const style = LEVEL_STYLES[level];
155
+ if (this.options.colorEnabled) {
156
+ parts.push(colorize(style.label, style.color));
157
+ }
158
+ else {
159
+ parts.push(style.label);
160
+ }
161
+ }
162
+ // Context prefix (worker/issue)
163
+ const prefix = this.formatPrefix();
164
+ if (prefix) {
165
+ parts.push(prefix);
166
+ }
167
+ // Message
168
+ parts.push(message);
169
+ // Data (if any)
170
+ if (data && Object.keys(data).length > 0) {
171
+ const dataStr = this.formatData(data);
172
+ if (this.options.colorEnabled) {
173
+ parts.push(colorize(dataStr, 'dim'));
174
+ }
175
+ else {
176
+ parts.push(dataStr);
177
+ }
178
+ }
179
+ return parts.join(' ');
180
+ }
181
+ /**
182
+ * Format data object for display
183
+ */
184
+ formatData(data) {
185
+ const pairs = [];
186
+ for (const [key, value] of Object.entries(data)) {
187
+ if (value === undefined)
188
+ continue;
189
+ let valueStr;
190
+ if (typeof value === 'string') {
191
+ valueStr = truncate(value, 50);
192
+ }
193
+ else if (typeof value === 'number' || typeof value === 'boolean') {
194
+ valueStr = String(value);
195
+ }
196
+ else {
197
+ valueStr = truncate(JSON.stringify(value), 50);
198
+ }
199
+ pairs.push(`${key}=${valueStr}`);
200
+ }
201
+ return pairs.length > 0 ? `{ ${pairs.join(', ')} }` : '';
202
+ }
203
+ /**
204
+ * Check if a log level should be output
205
+ */
206
+ shouldLog(level) {
207
+ return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[this.options.minLevel];
208
+ }
209
+ /**
210
+ * Core log method
211
+ */
212
+ log(level, message, data) {
213
+ if (!this.shouldLog(level))
214
+ return;
215
+ const line = this.formatLine(level, message, data);
216
+ if (level === 'error') {
217
+ console.error(line);
218
+ }
219
+ else if (level === 'warn') {
220
+ console.warn(line);
221
+ }
222
+ else {
223
+ console.log(line);
224
+ }
225
+ }
226
+ // Convenience methods
227
+ debug(message, data) {
228
+ this.log('debug', message, data);
229
+ }
230
+ info(message, data) {
231
+ this.log('info', message, data);
232
+ }
233
+ success(message, data) {
234
+ this.log('success', message, data);
235
+ }
236
+ warn(message, data) {
237
+ this.log('warn', message, data);
238
+ }
239
+ error(message, data) {
240
+ this.log('error', message, data);
241
+ }
242
+ /**
243
+ * Log an activity (thought, action, response) with appropriate styling
244
+ */
245
+ activity(type, content, maxLength = 80) {
246
+ if (!this.shouldLog('info'))
247
+ return;
248
+ const parts = [];
249
+ // Timestamp
250
+ if (this.options.showTimestamp) {
251
+ const ts = formatTimestamp();
252
+ if (this.options.colorEnabled) {
253
+ parts.push(colorize(ts, 'dim'));
254
+ }
255
+ else {
256
+ parts.push(ts);
257
+ }
258
+ }
259
+ // Activity type indicator
260
+ const activityColor = ACTIVITY_COLORS[type] || 'white';
261
+ const typeLabel = type.substring(0, 3).toUpperCase();
262
+ if (this.options.colorEnabled) {
263
+ parts.push(colorize(typeLabel, activityColor));
264
+ }
265
+ else {
266
+ parts.push(typeLabel);
267
+ }
268
+ // Context prefix
269
+ const prefix = this.formatPrefix();
270
+ if (prefix) {
271
+ parts.push(prefix);
272
+ }
273
+ // Content (truncated)
274
+ const truncatedContent = truncate(content.replace(/\n/g, ' '), maxLength);
275
+ parts.push(truncatedContent);
276
+ console.log(parts.join(' '));
277
+ }
278
+ /**
279
+ * Log a section header/divider
280
+ */
281
+ section(title) {
282
+ const divider = '─'.repeat(60);
283
+ if (this.options.colorEnabled) {
284
+ console.log(colorize(`\n${divider}`, 'dim'));
285
+ console.log(colorize(` ${title}`, 'bold', 'brightWhite'));
286
+ console.log(colorize(`${divider}`, 'dim'));
287
+ }
288
+ else {
289
+ console.log(`\n${divider}`);
290
+ console.log(` ${title}`);
291
+ console.log(divider);
292
+ }
293
+ }
294
+ /**
295
+ * Log a status change with visual indicator
296
+ */
297
+ status(status, details) {
298
+ const statusColors = {
299
+ starting: 'yellow',
300
+ running: 'blue',
301
+ completed: 'green',
302
+ stopped: 'yellow',
303
+ failed: 'red',
304
+ claimed: 'cyan',
305
+ registered: 'green',
306
+ };
307
+ const color = statusColors[status.toLowerCase()] || 'white';
308
+ const parts = [];
309
+ // Timestamp
310
+ if (this.options.showTimestamp) {
311
+ const ts = formatTimestamp();
312
+ if (this.options.colorEnabled) {
313
+ parts.push(colorize(ts, 'dim'));
314
+ }
315
+ else {
316
+ parts.push(ts);
317
+ }
318
+ }
319
+ // Status indicator
320
+ if (this.options.colorEnabled) {
321
+ parts.push(colorize('●', color));
322
+ }
323
+ else {
324
+ parts.push('*');
325
+ }
326
+ // Context prefix
327
+ const prefix = this.formatPrefix();
328
+ if (prefix) {
329
+ parts.push(prefix);
330
+ }
331
+ // Status text
332
+ if (this.options.colorEnabled) {
333
+ parts.push(colorize(status.toUpperCase(), color, 'bold'));
334
+ }
335
+ else {
336
+ parts.push(status.toUpperCase());
337
+ }
338
+ // Details
339
+ if (details) {
340
+ parts.push(details);
341
+ }
342
+ console.log(parts.join(' '));
343
+ }
344
+ /**
345
+ * Log a tool call with formatted input
346
+ */
347
+ toolCall(toolName, input) {
348
+ if (!this.shouldLog('info'))
349
+ return;
350
+ const parts = [];
351
+ // Timestamp
352
+ if (this.options.showTimestamp) {
353
+ const ts = formatTimestamp();
354
+ if (this.options.colorEnabled) {
355
+ parts.push(colorize(ts, 'dim'));
356
+ }
357
+ else {
358
+ parts.push(ts);
359
+ }
360
+ }
361
+ // Tool indicator
362
+ if (this.options.colorEnabled) {
363
+ parts.push(colorize('→', 'cyan'));
364
+ }
365
+ else {
366
+ parts.push('→');
367
+ }
368
+ // Context prefix
369
+ const prefix = this.formatPrefix();
370
+ if (prefix) {
371
+ parts.push(prefix);
372
+ }
373
+ // Tool name
374
+ if (this.options.colorEnabled) {
375
+ parts.push(colorize(toolName, 'cyan', 'bold'));
376
+ }
377
+ else {
378
+ parts.push(toolName);
379
+ }
380
+ // Formatted input (key parameters)
381
+ if (input) {
382
+ const summary = this.formatToolInput(toolName, input);
383
+ if (summary) {
384
+ if (this.options.colorEnabled) {
385
+ parts.push(colorize(summary, 'dim'));
386
+ }
387
+ else {
388
+ parts.push(summary);
389
+ }
390
+ }
391
+ }
392
+ console.log(parts.join(' '));
393
+ }
394
+ /**
395
+ * Format tool input for display (show relevant params based on tool type)
396
+ */
397
+ formatToolInput(toolName, input) {
398
+ // Show most relevant parameter based on tool type
399
+ const toolParams = {
400
+ Read: ['file_path'],
401
+ Write: ['file_path'],
402
+ Edit: ['file_path', 'old_string'],
403
+ Grep: ['pattern', 'path'],
404
+ Glob: ['pattern'],
405
+ Bash: ['command'],
406
+ Task: ['subagent_type', 'description'],
407
+ WebFetch: ['url'],
408
+ WebSearch: ['query'],
409
+ };
410
+ const relevantParams = toolParams[toolName] || Object.keys(input).slice(0, 2);
411
+ const values = [];
412
+ for (const param of relevantParams) {
413
+ if (input[param] !== undefined) {
414
+ const value = String(input[param]);
415
+ values.push(truncate(value, 40));
416
+ }
417
+ }
418
+ return values.length > 0 ? values.join(' ') : '';
419
+ }
420
+ }
421
+ /**
422
+ * Create a logger instance
423
+ */
424
+ export function createLogger(context, options) {
425
+ return new Logger(context, options);
426
+ }
427
+ /**
428
+ * Default logger for quick use
429
+ */
430
+ export const logger = createLogger();
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Content generators for route and page files.
3
+ *
4
+ * Produces output identical to the create-app templates so that
5
+ * af-sync-routes can fill in missing files without drift.
6
+ */
7
+ import type { RouteEntry, PageEntry } from './route-manifest.js';
8
+ /**
9
+ * Generate the content for a route.ts re-export file.
10
+ *
11
+ * Output matches the `routeReexport()` helper in create-app templates.
12
+ */
13
+ export declare function generateRouteContent(entry: RouteEntry): string;
14
+ /**
15
+ * Generate the content for a dashboard page.tsx file.
16
+ *
17
+ * Output matches the dashboard page helpers in create-app templates.
18
+ */
19
+ export declare function generatePageContent(entry: PageEntry): string;
20
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/manifest/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEhE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAO9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CA2C5D"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Content generators for route and page files.
3
+ *
4
+ * Produces output identical to the create-app templates so that
5
+ * af-sync-routes can fill in missing files without drift.
6
+ */
7
+ /**
8
+ * Generate the content for a route.ts re-export file.
9
+ *
10
+ * Output matches the `routeReexport()` helper in create-app templates.
11
+ */
12
+ export function generateRouteContent(entry) {
13
+ const lines = [`import { routes } from '@/lib/config'`];
14
+ // Maintain consistent ordering: POST, GET, DELETE
15
+ if (entry.methods.POST)
16
+ lines.push(`export const POST = ${entry.methods.POST}`);
17
+ if (entry.methods.GET)
18
+ lines.push(`export const GET = ${entry.methods.GET}`);
19
+ if (entry.methods.DELETE)
20
+ lines.push(`export const DELETE = ${entry.methods.DELETE}`);
21
+ return lines.join('\n') + '\n';
22
+ }
23
+ /**
24
+ * Generate the content for a dashboard page.tsx file.
25
+ *
26
+ * Output matches the dashboard page helpers in create-app templates.
27
+ */
28
+ export function generatePageContent(entry) {
29
+ const hasParams = entry.params && entry.params.length > 0;
30
+ // Build import statement
31
+ const importName = entry.importAlias ?? entry.component;
32
+ const imports = [`import { DashboardShell, ${importName} } from '@renseiai/agentfactory-dashboard'`];
33
+ imports.push(`import { usePathname${hasParams ? ', useParams' : ''} } from 'next/navigation'`);
34
+ // Build component body
35
+ const bodyLines = [];
36
+ bodyLines.push(` const pathname = usePathname()`);
37
+ if (hasParams) {
38
+ const paramType = entry.params.map((p) => `${p}: string`).join('; ');
39
+ bodyLines.push(` const params = useParams<{ ${paramType} }>()`);
40
+ }
41
+ // Build the inner component JSX
42
+ const componentName = entry.importAlias
43
+ ? entry.importAlias.split(' as ')[1].trim()
44
+ : entry.component;
45
+ let propsStr = '';
46
+ if (hasParams && entry.propMapping) {
47
+ const props = Object.entries(entry.propMapping)
48
+ .map(([param, prop]) => `${prop}={params.${param}}`)
49
+ .join(' ');
50
+ propsStr = ` ${props}`;
51
+ }
52
+ return `'use client'
53
+
54
+ ${imports.join('\n')}
55
+
56
+ export default function ${entry.exportName}() {
57
+ ${bodyLines.join('\n')}
58
+ return (
59
+ <DashboardShell currentPath={pathname}>
60
+ <${componentName}${propsStr} />
61
+ </DashboardShell>
62
+ )
63
+ }
64
+ `;
65
+ }
@@ -0,0 +1,4 @@
1
+ export { ROUTE_MANIFEST } from './route-manifest.js';
2
+ export type { RouteManifest, RouteEntry, PageEntry, HttpMethod } from './route-manifest.js';
3
+ export { generateRouteContent, generatePageContent } from './generate.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/manifest/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { ROUTE_MANIFEST } from './route-manifest.js';
2
+ export { generateRouteContent, generatePageContent } from './generate.js';
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Route Manifest — Single source of truth for all AgentFactory route and page files.
3
+ *
4
+ * Used by `af-sync-routes` to generate missing route files in consumer projects,
5
+ * and by parity tests to verify create-app templates stay aligned.
6
+ */
7
+ export type HttpMethod = 'GET' | 'POST' | 'DELETE';
8
+ export interface RouteEntry {
9
+ /** Relative file path, e.g. "src/app/api/workers/register/route.ts" */
10
+ path: string;
11
+ /** Map of HTTP method → routes accessor, e.g. { POST: 'routes.workers.register.POST' } */
12
+ methods: Partial<Record<HttpMethod, string>>;
13
+ }
14
+ export interface PageEntry {
15
+ /** Relative file path, e.g. "src/app/pipeline/page.tsx" */
16
+ path: string;
17
+ /** Dashboard component name, e.g. "PipelinePage" */
18
+ component: string;
19
+ /** Default export function name, e.g. "Pipeline" */
20
+ exportName: string;
21
+ /** Import alias if different from component, e.g. "DashboardPage as FleetPage" */
22
+ importAlias?: string;
23
+ /** Dynamic route params, e.g. ["id"] for [id] segments */
24
+ params?: string[];
25
+ /** Map of param name → component prop name, e.g. { id: "sessionId" } */
26
+ propMapping?: Record<string, string>;
27
+ }
28
+ export interface RouteManifest {
29
+ version: number;
30
+ routes: RouteEntry[];
31
+ pages: PageEntry[];
32
+ }
33
+ export declare const ROUTE_MANIFEST: RouteManifest;
34
+ //# sourceMappingURL=route-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-manifest.d.ts","sourceRoot":"","sources":["../../../src/manifest/route-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,0FAA0F;IAC1F,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,aAmJ5B,CAAA"}