myaiforone 1.0.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 (315) hide show
  1. package/README.md +113 -0
  2. package/agents/_template/CLAUDE.md +18 -0
  3. package/agents/_template/agent.json +7 -0
  4. package/agents/platform/agentcreator/CLAUDE.md +300 -0
  5. package/agents/platform/appcreator/CLAUDE.md +158 -0
  6. package/agents/platform/gym/CLAUDE.md +486 -0
  7. package/agents/platform/gym/agent.json +40 -0
  8. package/agents/platform/gym/programs/agent-building/program.json +160 -0
  9. package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
  10. package/agents/platform/gym/programs/getting-started/program.json +124 -0
  11. package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
  12. package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
  13. package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
  14. package/agents/platform/gym/souls/alex.md +12 -0
  15. package/agents/platform/gym/souls/jordan.md +12 -0
  16. package/agents/platform/gym/souls/morgan.md +12 -0
  17. package/agents/platform/gym/souls/riley.md +12 -0
  18. package/agents/platform/gym/souls/sam.md +12 -0
  19. package/agents/platform/hub/CLAUDE.md +372 -0
  20. package/agents/platform/promptcreator/CLAUDE.md +130 -0
  21. package/agents/platform/skillcreator/CLAUDE.md +163 -0
  22. package/bin/cli.js +566 -0
  23. package/config.example.json +310 -0
  24. package/dist/agent-registry.d.ts +32 -0
  25. package/dist/agent-registry.d.ts.map +1 -0
  26. package/dist/agent-registry.js +144 -0
  27. package/dist/agent-registry.js.map +1 -0
  28. package/dist/channels/discord.d.ts +17 -0
  29. package/dist/channels/discord.d.ts.map +1 -0
  30. package/dist/channels/discord.js +114 -0
  31. package/dist/channels/discord.js.map +1 -0
  32. package/dist/channels/imessage.d.ts +23 -0
  33. package/dist/channels/imessage.d.ts.map +1 -0
  34. package/dist/channels/imessage.js +214 -0
  35. package/dist/channels/imessage.js.map +1 -0
  36. package/dist/channels/slack.d.ts +19 -0
  37. package/dist/channels/slack.d.ts.map +1 -0
  38. package/dist/channels/slack.js +167 -0
  39. package/dist/channels/slack.js.map +1 -0
  40. package/dist/channels/telegram.d.ts +19 -0
  41. package/dist/channels/telegram.d.ts.map +1 -0
  42. package/dist/channels/telegram.js +274 -0
  43. package/dist/channels/telegram.js.map +1 -0
  44. package/dist/channels/types.d.ts +44 -0
  45. package/dist/channels/types.d.ts.map +1 -0
  46. package/dist/channels/types.js +18 -0
  47. package/dist/channels/types.js.map +1 -0
  48. package/dist/channels/whatsapp.d.ts +23 -0
  49. package/dist/channels/whatsapp.d.ts.map +1 -0
  50. package/dist/channels/whatsapp.js +189 -0
  51. package/dist/channels/whatsapp.js.map +1 -0
  52. package/dist/config.d.ts +134 -0
  53. package/dist/config.d.ts.map +1 -0
  54. package/dist/config.js +127 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/cron.d.ts +8 -0
  57. package/dist/cron.d.ts.map +1 -0
  58. package/dist/cron.js +35 -0
  59. package/dist/cron.js.map +1 -0
  60. package/dist/decrypt-keys.d.ts +7 -0
  61. package/dist/decrypt-keys.d.ts.map +1 -0
  62. package/dist/decrypt-keys.js +53 -0
  63. package/dist/decrypt-keys.js.map +1 -0
  64. package/dist/encrypt-keys.d.ts +8 -0
  65. package/dist/encrypt-keys.d.ts.map +1 -0
  66. package/dist/encrypt-keys.js +62 -0
  67. package/dist/encrypt-keys.js.map +1 -0
  68. package/dist/executor.d.ts +31 -0
  69. package/dist/executor.d.ts.map +1 -0
  70. package/dist/executor.js +2009 -0
  71. package/dist/executor.js.map +1 -0
  72. package/dist/gemini-executor.d.ts +27 -0
  73. package/dist/gemini-executor.d.ts.map +1 -0
  74. package/dist/gemini-executor.js +160 -0
  75. package/dist/gemini-executor.js.map +1 -0
  76. package/dist/goals.d.ts +24 -0
  77. package/dist/goals.d.ts.map +1 -0
  78. package/dist/goals.js +189 -0
  79. package/dist/goals.js.map +1 -0
  80. package/dist/gym/activity-digest.d.ts +30 -0
  81. package/dist/gym/activity-digest.d.ts.map +1 -0
  82. package/dist/gym/activity-digest.js +506 -0
  83. package/dist/gym/activity-digest.js.map +1 -0
  84. package/dist/gym/dimension-scorer.d.ts +76 -0
  85. package/dist/gym/dimension-scorer.d.ts.map +1 -0
  86. package/dist/gym/dimension-scorer.js +236 -0
  87. package/dist/gym/dimension-scorer.js.map +1 -0
  88. package/dist/gym/gym-router.d.ts +7 -0
  89. package/dist/gym/gym-router.d.ts.map +1 -0
  90. package/dist/gym/gym-router.js +718 -0
  91. package/dist/gym/gym-router.js.map +1 -0
  92. package/dist/gym/index.d.ts +11 -0
  93. package/dist/gym/index.d.ts.map +1 -0
  94. package/dist/gym/index.js +11 -0
  95. package/dist/gym/index.js.map +1 -0
  96. package/dist/heartbeat.d.ts +21 -0
  97. package/dist/heartbeat.d.ts.map +1 -0
  98. package/dist/heartbeat.js +163 -0
  99. package/dist/heartbeat.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +254 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/keystore.d.ts +22 -0
  105. package/dist/keystore.d.ts.map +1 -0
  106. package/dist/keystore.js +178 -0
  107. package/dist/keystore.js.map +1 -0
  108. package/dist/logger.d.ts +9 -0
  109. package/dist/logger.d.ts.map +1 -0
  110. package/dist/logger.js +45 -0
  111. package/dist/logger.js.map +1 -0
  112. package/dist/memory/daily.d.ts +22 -0
  113. package/dist/memory/daily.d.ts.map +1 -0
  114. package/dist/memory/daily.js +82 -0
  115. package/dist/memory/daily.js.map +1 -0
  116. package/dist/memory/embeddings.d.ts +15 -0
  117. package/dist/memory/embeddings.d.ts.map +1 -0
  118. package/dist/memory/embeddings.js +154 -0
  119. package/dist/memory/embeddings.js.map +1 -0
  120. package/dist/memory/index.d.ts +32 -0
  121. package/dist/memory/index.d.ts.map +1 -0
  122. package/dist/memory/index.js +159 -0
  123. package/dist/memory/index.js.map +1 -0
  124. package/dist/memory/search.d.ts +21 -0
  125. package/dist/memory/search.d.ts.map +1 -0
  126. package/dist/memory/search.js +77 -0
  127. package/dist/memory/search.js.map +1 -0
  128. package/dist/memory/store.d.ts +23 -0
  129. package/dist/memory/store.d.ts.map +1 -0
  130. package/dist/memory/store.js +144 -0
  131. package/dist/memory/store.js.map +1 -0
  132. package/dist/ollama-executor.d.ts +17 -0
  133. package/dist/ollama-executor.d.ts.map +1 -0
  134. package/dist/ollama-executor.js +112 -0
  135. package/dist/ollama-executor.js.map +1 -0
  136. package/dist/openai-executor.d.ts +38 -0
  137. package/dist/openai-executor.d.ts.map +1 -0
  138. package/dist/openai-executor.js +197 -0
  139. package/dist/openai-executor.js.map +1 -0
  140. package/dist/router.d.ts +11 -0
  141. package/dist/router.d.ts.map +1 -0
  142. package/dist/router.js +185 -0
  143. package/dist/router.js.map +1 -0
  144. package/dist/test-message.d.ts +2 -0
  145. package/dist/test-message.d.ts.map +1 -0
  146. package/dist/test-message.js +60 -0
  147. package/dist/test-message.js.map +1 -0
  148. package/dist/utils/imsg-db-reader.d.ts +24 -0
  149. package/dist/utils/imsg-db-reader.d.ts.map +1 -0
  150. package/dist/utils/imsg-db-reader.js +92 -0
  151. package/dist/utils/imsg-db-reader.js.map +1 -0
  152. package/dist/utils/imsg-rpc.d.ts +25 -0
  153. package/dist/utils/imsg-rpc.d.ts.map +1 -0
  154. package/dist/utils/imsg-rpc.js +149 -0
  155. package/dist/utils/imsg-rpc.js.map +1 -0
  156. package/dist/utils/message-formatter.d.ts +3 -0
  157. package/dist/utils/message-formatter.d.ts.map +1 -0
  158. package/dist/utils/message-formatter.js +69 -0
  159. package/dist/utils/message-formatter.js.map +1 -0
  160. package/dist/web-ui.d.ts +12 -0
  161. package/dist/web-ui.d.ts.map +1 -0
  162. package/dist/web-ui.js +5784 -0
  163. package/dist/web-ui.js.map +1 -0
  164. package/dist/whatsapp-chats.d.ts +2 -0
  165. package/dist/whatsapp-chats.d.ts.map +1 -0
  166. package/dist/whatsapp-chats.js +76 -0
  167. package/dist/whatsapp-chats.js.map +1 -0
  168. package/dist/whatsapp-login.d.ts +2 -0
  169. package/dist/whatsapp-login.d.ts.map +1 -0
  170. package/dist/whatsapp-login.js +90 -0
  171. package/dist/whatsapp-login.js.map +1 -0
  172. package/dist/wiki-sync.d.ts +21 -0
  173. package/dist/wiki-sync.d.ts.map +1 -0
  174. package/dist/wiki-sync.js +147 -0
  175. package/dist/wiki-sync.js.map +1 -0
  176. package/docs/AddNewAgentGuide.md +100 -0
  177. package/docs/AddNewMcpGuide.md +72 -0
  178. package/docs/Architecture.md +795 -0
  179. package/docs/CLAUDE-AI-SETUP.md +166 -0
  180. package/docs/Setup.md +297 -0
  181. package/docs/ai-gym-architecture.md +1040 -0
  182. package/docs/ai-gym-build-plan.md +343 -0
  183. package/docs/ai-gym-onboarding.md +122 -0
  184. package/docs/appcreator_plan.md +348 -0
  185. package/docs/platform-mcp-audit.md +320 -0
  186. package/docs/server-deployment-plan.md +503 -0
  187. package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
  188. package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
  189. package/docs/user-guide.md +2016 -0
  190. package/mcp-catalog.json +628 -0
  191. package/package.json +63 -0
  192. package/public/MyAIforOne-logomark-512.svg +16 -0
  193. package/public/MyAIforOne-logomark-transparent.svg +15 -0
  194. package/public/activity.html +314 -0
  195. package/public/admin.html +1674 -0
  196. package/public/agent-dashboard.html +670 -0
  197. package/public/api-docs.html +1106 -0
  198. package/public/automations.html +722 -0
  199. package/public/canvas.css +223 -0
  200. package/public/canvas.js +588 -0
  201. package/public/changelog.html +231 -0
  202. package/public/gym.html +2766 -0
  203. package/public/home.html +1930 -0
  204. package/public/index.html +2809 -0
  205. package/public/lab.html +1643 -0
  206. package/public/library.html +1442 -0
  207. package/public/marketplace.html +1101 -0
  208. package/public/mcp-docs.html +441 -0
  209. package/public/mini.html +390 -0
  210. package/public/monitor.html +584 -0
  211. package/public/org.html +4304 -0
  212. package/public/projects.html +734 -0
  213. package/public/settings.html +645 -0
  214. package/public/tasks.html +932 -0
  215. package/public/trainers/alex.svg +12 -0
  216. package/public/trainers/jordan.svg +12 -0
  217. package/public/trainers/morgan.svg +12 -0
  218. package/public/trainers/riley.svg +12 -0
  219. package/public/trainers/sam.svg +12 -0
  220. package/public/user-guide.html +218 -0
  221. package/registry/agents.json +3 -0
  222. package/registry/apps.json +20 -0
  223. package/registry/installed-drafts.json +3 -0
  224. package/registry/mcps.json +1084 -0
  225. package/registry/prompts/personal/mcp-test-prompt.md +6 -0
  226. package/registry/prompts/personal/memory-recall.md +6 -0
  227. package/registry/prompts/platform/brainstorm.md +15 -0
  228. package/registry/prompts/platform/code-review.md +16 -0
  229. package/registry/prompts/platform/explain.md +16 -0
  230. package/registry/prompts.json +58 -0
  231. package/registry/skills/external/brainstorming.md +5 -0
  232. package/registry/skills/external/code-review.md +40 -0
  233. package/registry/skills/external/frontend-patterns.md +642 -0
  234. package/registry/skills/external/frontend-slides.md +184 -0
  235. package/registry/skills/external/systematic-debugging.md +5 -0
  236. package/registry/skills/external/tdd.md +328 -0
  237. package/registry/skills/external/verification-before-completion.md +5 -0
  238. package/registry/skills/external/writing-plans.md +5 -0
  239. package/registry/skills/platform/ai41_app_build.md +930 -0
  240. package/registry/skills/platform/ai41_app_deploy.md +168 -0
  241. package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
  242. package/registry/skills/platform/ai41_app_patterns.md +359 -0
  243. package/registry/skills/platform/ai41_app_register.md +85 -0
  244. package/registry/skills/platform/ai41_app_scaffold.md +421 -0
  245. package/registry/skills/platform/ai41_app_verify.md +107 -0
  246. package/registry/skills/platform/opProjectCreate.md +239 -0
  247. package/registry/skills/platform/op_devbrowser.md +136 -0
  248. package/registry/skills/platform/sop_brandguidelines.md +103 -0
  249. package/registry/skills/platform/sop_docx.md +117 -0
  250. package/registry/skills/platform/sop_frontenddesign.md +44 -0
  251. package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
  252. package/registry/skills/platform/sop_mcpbuilder.md +133 -0
  253. package/registry/skills/platform/sop_pdf.md +172 -0
  254. package/registry/skills/platform/sop_pptx.md +133 -0
  255. package/registry/skills/platform/sop_skillcreator.md +104 -0
  256. package/registry/skills/platform/sop_themefactory.md +128 -0
  257. package/registry/skills/platform/sop_webapptesting.md +75 -0
  258. package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
  259. package/registry/skills/platform/sop_xlsx.md +134 -0
  260. package/registry/skills.json +1055 -0
  261. package/scripts/discover-chats.sh +11 -0
  262. package/scripts/install-service-windows.ps1 +87 -0
  263. package/scripts/install-service.sh +52 -0
  264. package/scripts/seed-registry.ts +195 -0
  265. package/scripts/test-send.sh +5 -0
  266. package/scripts/tray-indicator.ps1 +35 -0
  267. package/scripts/uninstall-service-windows.ps1 +23 -0
  268. package/scripts/uninstall-service.sh +15 -0
  269. package/scripts/xbar-myagent.5s.sh +32 -0
  270. package/server/mcp-server/dist/index.d.ts +11 -0
  271. package/server/mcp-server/dist/index.js +1332 -0
  272. package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
  273. package/server/mcp-server/dist/lib/api-client.js +241 -0
  274. package/server/mcp-server/index.ts +1545 -0
  275. package/server/mcp-server/lib/api-client.ts +366 -0
  276. package/server/mcp-server/tsconfig.json +14 -0
  277. package/src/agent-registry.ts +180 -0
  278. package/src/channels/discord.ts +129 -0
  279. package/src/channels/imessage.ts +261 -0
  280. package/src/channels/slack.ts +208 -0
  281. package/src/channels/telegram.ts +307 -0
  282. package/src/channels/types.ts +62 -0
  283. package/src/channels/whatsapp.ts +227 -0
  284. package/src/config.ts +281 -0
  285. package/src/cron.ts +43 -0
  286. package/src/decrypt-keys.ts +60 -0
  287. package/src/encrypt-keys.ts +70 -0
  288. package/src/executor.ts +2190 -0
  289. package/src/gemini-executor.ts +212 -0
  290. package/src/goals.ts +240 -0
  291. package/src/gym/activity-digest.ts +546 -0
  292. package/src/gym/dimension-scorer.ts +297 -0
  293. package/src/gym/gym-router.ts +801 -0
  294. package/src/gym/index.ts +19 -0
  295. package/src/heartbeat.ts +220 -0
  296. package/src/index.ts +275 -0
  297. package/src/keystore.ts +190 -0
  298. package/src/logger.ts +51 -0
  299. package/src/memory/daily.ts +101 -0
  300. package/src/memory/embeddings.ts +185 -0
  301. package/src/memory/index.ts +218 -0
  302. package/src/memory/search.ts +124 -0
  303. package/src/memory/store.ts +189 -0
  304. package/src/ollama-executor.ts +126 -0
  305. package/src/openai-executor.ts +259 -0
  306. package/src/router.ts +230 -0
  307. package/src/test-message.ts +72 -0
  308. package/src/utils/imsg-db-reader.ts +109 -0
  309. package/src/utils/imsg-rpc.ts +178 -0
  310. package/src/utils/message-formatter.ts +90 -0
  311. package/src/web-ui.ts +5778 -0
  312. package/src/whatsapp-chats.ts +91 -0
  313. package/src/whatsapp-login.ts +110 -0
  314. package/src/wiki-sync.ts +199 -0
  315. package/tsconfig.json +19 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * AI Gym — Activity Digest
3
+ *
4
+ * Scheduled daily cron (6am) that:
5
+ * 1. Reads all agent activity summaries via local HTTP API
6
+ * 2. Scores dimensions using dimension-scorer
7
+ * 3. Snapshots dimension history weekly
8
+ * 4. Writes digest to daily journal
9
+ * 5. Updates learner profile
10
+ * 6. Generates gym cards with insights
11
+ *
12
+ * Runs only when gymEnabled: true.
13
+ */
14
+ interface DigestConfig {
15
+ baseDir: string;
16
+ port: number;
17
+ memoryDir?: string;
18
+ }
19
+ /**
20
+ * Run the activity digest. Called by cron or manually.
21
+ */
22
+ export declare function runActivityDigest(config: DigestConfig): Promise<void>;
23
+ /**
24
+ * Start the activity digest cron job.
25
+ * Runs daily at 6am when gymEnabled is true.
26
+ */
27
+ export declare function startActivityDigest(config: DigestConfig): void;
28
+ export declare function stopActivityDigest(): void;
29
+ export {};
30
+ //# sourceMappingURL=activity-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-digest.d.ts","sourceRoot":"","sources":["../../src/gym/activity-digest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6b3E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAW9D;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAMzC"}
@@ -0,0 +1,506 @@
1
+ /**
2
+ * AI Gym — Activity Digest
3
+ *
4
+ * Scheduled daily cron (6am) that:
5
+ * 1. Reads all agent activity summaries via local HTTP API
6
+ * 2. Scores dimensions using dimension-scorer
7
+ * 3. Snapshots dimension history weekly
8
+ * 4. Writes digest to daily journal
9
+ * 5. Updates learner profile
10
+ * 6. Generates gym cards with insights
11
+ *
12
+ * Runs only when gymEnabled: true.
13
+ */
14
+ import cron from "node-cron";
15
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { scoreAllDimensions, computeTrends, } from "./dimension-scorer.js";
18
+ import { log } from "../logger.js";
19
+ const API_BASE = "http://localhost";
20
+ let scheduledTask = null;
21
+ async function apiGet(port, path) {
22
+ const res = await fetch(`${API_BASE}:${port}${path}`);
23
+ if (!res.ok)
24
+ throw new Error(`API ${path} returned ${res.status}`);
25
+ return res.json();
26
+ }
27
+ async function apiPost(port, path, body) {
28
+ const res = await fetch(`${API_BASE}:${port}${path}`, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json" },
31
+ body: JSON.stringify(body),
32
+ });
33
+ if (!res.ok)
34
+ throw new Error(`API POST ${path} returned ${res.status}`);
35
+ return res.json();
36
+ }
37
+ async function apiPut(port, path, body) {
38
+ const res = await fetch(`${API_BASE}:${port}${path}`, {
39
+ method: "PUT",
40
+ headers: { "Content-Type": "application/json" },
41
+ body: JSON.stringify(body),
42
+ });
43
+ if (!res.ok)
44
+ throw new Error(`API PUT ${path} returned ${res.status}`);
45
+ return res.json();
46
+ }
47
+ function readJson(path, fallback = {}) {
48
+ try {
49
+ if (!existsSync(path))
50
+ return fallback;
51
+ const raw = readFileSync(path, "utf-8").trim();
52
+ if (!raw)
53
+ return fallback;
54
+ return JSON.parse(raw);
55
+ }
56
+ catch {
57
+ return fallback;
58
+ }
59
+ }
60
+ /**
61
+ * Run the activity digest. Called by cron or manually.
62
+ */
63
+ export async function runActivityDigest(config) {
64
+ const { baseDir, port } = config;
65
+ const memoryDir = config.memoryDir || join(baseDir, "agents", "platform", "gym", "memory");
66
+ const dailyDir = join(memoryDir, "daily");
67
+ log.info("[Gym Digest] Starting activity digest...");
68
+ try {
69
+ // ── Step 1: Get agent roster from config.json ──
70
+ const agentsDir = join(baseDir, "agents");
71
+ const agentDirs = [];
72
+ // Primary source: config.json (contains all agents including those without agent.json)
73
+ const configPath = join(baseDir, "config.json");
74
+ if (existsSync(configPath)) {
75
+ try {
76
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
77
+ const agentsMap = config.agents || {};
78
+ for (const id of Object.keys(agentsMap)) {
79
+ agentDirs.push(id);
80
+ }
81
+ }
82
+ catch { /* fall back to directory scan */ }
83
+ }
84
+ // Fallback: scan agent directories if config.json didn't yield results
85
+ if (agentDirs.length === 0 && existsSync(agentsDir)) {
86
+ for (const entry of readdirSync(agentsDir, { withFileTypes: true })) {
87
+ if (!entry.isDirectory() || entry.name.startsWith("_"))
88
+ continue;
89
+ const ajPath = join(agentsDir, entry.name, "agent.json");
90
+ if (existsSync(ajPath)) {
91
+ agentDirs.push(entry.name);
92
+ }
93
+ if (entry.name === "platform") {
94
+ const platformDir = join(agentsDir, "platform");
95
+ for (const sub of readdirSync(platformDir, { withFileTypes: true })) {
96
+ if (!sub.isDirectory())
97
+ continue;
98
+ const subAjPath = join(platformDir, sub.name, "agent.json");
99
+ if (existsSync(subAjPath)) {
100
+ agentDirs.push(`platform/${sub.name}`);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ // ── Step 2: Get activity summaries for each agent ──
107
+ const summaries = [];
108
+ const agentInfos = [];
109
+ // Read config.json for agent metadata (most agents are defined here)
110
+ let configAgents = {};
111
+ const configPath2 = join(baseDir, "config.json");
112
+ try {
113
+ if (existsSync(configPath2)) {
114
+ const config = JSON.parse(readFileSync(configPath2, "utf-8"));
115
+ configAgents = config.agents || {};
116
+ }
117
+ }
118
+ catch { /* ignore */ }
119
+ for (const agentPath of agentDirs) {
120
+ const agentId = agentPath.includes("/") ? agentPath.split("/").pop() : agentPath;
121
+ try {
122
+ const summary = await apiGet(port, `/api/agents/${agentId}/activity-summary`);
123
+ summaries.push(summary);
124
+ }
125
+ catch {
126
+ // Agent may not have logs — skip
127
+ }
128
+ // Read agent config from agent.json or config.json
129
+ let aj = null;
130
+ const ajPath = join(agentsDir, agentPath, "agent.json");
131
+ if (existsSync(ajPath)) {
132
+ try {
133
+ aj = JSON.parse(readFileSync(ajPath, "utf-8"));
134
+ }
135
+ catch { /* skip */ }
136
+ }
137
+ // Fall back to config.json entry
138
+ if (!aj && configAgents[agentId]) {
139
+ aj = { id: agentId, ...configAgents[agentId] };
140
+ }
141
+ if (aj) {
142
+ try {
143
+ const claudeMdPath = aj.claudeMd
144
+ ? aj.claudeMd.replace(/^~/, process.env.HOME || "~")
145
+ : join(agentsDir, agentPath, "CLAUDE.md");
146
+ let promptLength = 0;
147
+ if (existsSync(claudeMdPath)) {
148
+ promptLength = readFileSync(claudeMdPath, "utf-8").length;
149
+ }
150
+ agentInfos.push({
151
+ id: aj.id || agentId,
152
+ name: aj.name || agentId,
153
+ description: aj.description,
154
+ agentClass: aj.agentClass,
155
+ workspace: aj.workspace,
156
+ allowedTools: aj.allowedTools,
157
+ mcps: aj.mcps,
158
+ goals: aj.goals,
159
+ cron: aj.cron,
160
+ systemPromptLength: promptLength,
161
+ });
162
+ }
163
+ catch { /* skip */ }
164
+ }
165
+ }
166
+ log.info(`[Gym Digest] Analyzed ${summaries.length} agents, ${agentInfos.length} agent configs`);
167
+ // ── Step 3: Read learner profile ──
168
+ const profilePath = join(memoryDir, "learner-profile.json");
169
+ const profile = readJson(profilePath, {});
170
+ const programsCompleted = profile.programs?.completed || [];
171
+ // Count total programs
172
+ const programsDir = join(baseDir, "agents", "platform", "gym", "programs");
173
+ let totalPrograms = 0;
174
+ if (existsSync(programsDir)) {
175
+ totalPrograms = readdirSync(programsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).length;
176
+ }
177
+ // ── Step 4: Score dimensions ──
178
+ const scores = scoreAllDimensions(summaries, agentInfos, programsCompleted, totalPrograms);
179
+ // Read previous scores for trends
180
+ const prevDimensions = profile.dimensions || {};
181
+ const previousScores = prevDimensions.application
182
+ ? {
183
+ application: prevDimensions.application?.score || 0,
184
+ communication: prevDimensions.communication?.score || 0,
185
+ knowledge: prevDimensions.knowledge?.score || 0,
186
+ orchestration: prevDimensions.orchestration?.score || 0,
187
+ craft: prevDimensions.craft?.score || 0,
188
+ }
189
+ : null;
190
+ const trends = computeTrends(scores, previousScores);
191
+ const today = new Date().toISOString().slice(0, 10);
192
+ const scoreLabels = {
193
+ 0: "Not assessed",
194
+ 1: "Beginner",
195
+ 2: "Developing",
196
+ 3: "Proficient",
197
+ 4: "Advanced",
198
+ 5: "Expert",
199
+ };
200
+ // Build dimensions object for profile
201
+ const dimensions = {};
202
+ for (const [key, score] of Object.entries(scores)) {
203
+ dimensions[key] = {
204
+ score,
205
+ label: scoreLabels[score] || "Unknown",
206
+ trend: trends[key],
207
+ lastUpdated: today,
208
+ };
209
+ }
210
+ // ── Step 5: Update streak ──
211
+ const lastActiveDate = profile.streak?.lastActiveDate;
212
+ let streakCurrent = profile.streak?.current || 0;
213
+ const streakLongest = profile.streak?.longest || 0;
214
+ // Check if user was active today (any agent had activity)
215
+ const wasActiveToday = summaries.some((s) => {
216
+ if (!s.lastActive)
217
+ return false;
218
+ return s.lastActive.slice(0, 10) === today;
219
+ });
220
+ if (wasActiveToday) {
221
+ if (lastActiveDate === today) {
222
+ // Already counted today
223
+ }
224
+ else {
225
+ const yesterday = new Date();
226
+ yesterday.setDate(yesterday.getDate() - 1);
227
+ const yesterdayStr = yesterday.toISOString().slice(0, 10);
228
+ if (lastActiveDate === yesterdayStr) {
229
+ streakCurrent += 1;
230
+ }
231
+ else {
232
+ streakCurrent = 1; // Reset streak
233
+ }
234
+ }
235
+ }
236
+ // ── Step 6: Compute active agent stats ──
237
+ const activeAgents = summaries
238
+ .filter((s) => s.messageCount > 0 && !["hub", "gym", "agentcreator"].includes(s.agentId))
239
+ .map((s) => s.agentId);
240
+ const dormantAgents = summaries
241
+ .filter((s) => {
242
+ if (["hub", "gym", "agentcreator"].includes(s.agentId))
243
+ return false;
244
+ if (s.messageCount === 0)
245
+ return true;
246
+ if (!s.lastActive)
247
+ return true;
248
+ const daysSinceActive = (Date.now() - new Date(s.lastActive).getTime()) / (1000 * 60 * 60 * 24);
249
+ return daysSinceActive > 14;
250
+ })
251
+ .map((s) => s.agentId);
252
+ const totalMessages = summaries.reduce((sum, s) => sum + s.messageCount, 0);
253
+ const messagesThisWeek = summaries.reduce((sum, s) => {
254
+ const weekAgo = new Date();
255
+ weekAgo.setDate(weekAgo.getDate() - 7);
256
+ const recentDates = s.uniqueDates.filter((d) => new Date(d) >= weekAgo);
257
+ // Rough approximation: distribute messages evenly across dates
258
+ const avgPerDay = s.messageCount / Math.max(s.activeDays, 1);
259
+ return sum + Math.round(avgPerDay * recentDates.length);
260
+ }, 0);
261
+ // Compute features used across all agents
262
+ const featuresUsed = new Set();
263
+ for (const s of summaries) {
264
+ if (s.messageCount > 0)
265
+ featuresUsed.add("chat");
266
+ for (const tool of Object.keys(s.toolUseCounts)) {
267
+ if (tool === "Read" || tool === "Write" || tool === "Edit")
268
+ featuresUsed.add("file-ops");
269
+ if (tool === "Bash")
270
+ featuresUsed.add("bash");
271
+ if (tool === "WebFetch" || tool === "WebSearch")
272
+ featuresUsed.add("web");
273
+ }
274
+ }
275
+ for (const a of agentInfos) {
276
+ if (a.mcps && a.mcps.length > 0)
277
+ featuresUsed.add("mcps");
278
+ if (a.goals && a.goals.length > 0)
279
+ featuresUsed.add("goals");
280
+ if (a.cron && a.cron.length > 0)
281
+ featuresUsed.add("cron");
282
+ }
283
+ const allFeatures = ["chat", "file-ops", "bash", "web", "mcps", "goals", "cron", "delegation", "webhooks", "multi-model"];
284
+ const neverUsed = allFeatures.filter((f) => !featuresUsed.has(f));
285
+ // ── Step 5: Snapshot dimensions weekly ──
286
+ const historyPath = join(memoryDir, "dimension-history.json");
287
+ const history = readJson(historyPath, []);
288
+ const lastSnapshot = history.length > 0 ? history[history.length - 1].date : null;
289
+ const daysSinceSnapshot = lastSnapshot
290
+ ? (Date.now() - new Date(lastSnapshot).getTime()) / (1000 * 60 * 60 * 24)
291
+ : 999;
292
+ if (daysSinceSnapshot >= 7) {
293
+ try {
294
+ await apiPost(port, "/api/gym/dimensions/snapshot", {
295
+ date: today,
296
+ dimensions: scores,
297
+ });
298
+ log.info("[Gym Digest] Weekly dimension snapshot saved");
299
+ }
300
+ catch (err) {
301
+ log.warn(`[Gym Digest] Failed to snapshot dimensions: ${err}`);
302
+ }
303
+ }
304
+ // ── Step 6: Write daily digest journal ──
305
+ mkdirSync(dailyDir, { recursive: true });
306
+ const digestPath = join(dailyDir, `${today}.md`);
307
+ const digestLines = [
308
+ `# Activity Digest — ${today}`,
309
+ "",
310
+ `## Dimensions`,
311
+ ...Object.entries(dimensions).map(([k, v]) => `- **${k}**: ${v.score}/5 (${v.label}, ${v.trend})`),
312
+ "",
313
+ `## Activity`,
314
+ `- Active agents: ${activeAgents.join(", ") || "none"}`,
315
+ `- Dormant agents: ${dormantAgents.join(", ") || "none"}`,
316
+ `- Total messages: ${totalMessages}`,
317
+ `- Messages this week: ~${messagesThisWeek}`,
318
+ `- Streak: ${streakCurrent} days`,
319
+ "",
320
+ `## Features`,
321
+ `- Used: ${Array.from(featuresUsed).join(", ") || "none"}`,
322
+ `- Never used: ${neverUsed.join(", ") || "all used!"}`,
323
+ "",
324
+ ];
325
+ writeFileSync(digestPath, digestLines.join("\n"), "utf-8");
326
+ log.info(`[Gym Digest] Daily digest written to ${digestPath}`);
327
+ // ── Step 7: Update learner profile ──
328
+ const profileUpdate = {
329
+ dimensions,
330
+ activity: {
331
+ activeAgents,
332
+ dormantAgents,
333
+ totalMessages,
334
+ messagesThisWeek,
335
+ lastActivity: new Date().toISOString(),
336
+ },
337
+ features: {
338
+ used: Array.from(featuresUsed),
339
+ neverUsed,
340
+ },
341
+ streak: {
342
+ current: streakCurrent,
343
+ longest: Math.max(streakCurrent, streakLongest),
344
+ lastActiveDate: wasActiveToday ? today : lastActiveDate || today,
345
+ },
346
+ };
347
+ try {
348
+ await apiPut(port, "/api/gym/learner-profile", profileUpdate);
349
+ log.info("[Gym Digest] Learner profile updated");
350
+ }
351
+ catch (err) {
352
+ log.warn(`[Gym Digest] Failed to update profile: ${err}`);
353
+ }
354
+ // ── Step 8: Struggle Detection (saved to profile for deep evaluation rubric) ──
355
+ const struggles = [];
356
+ for (const s of summaries) {
357
+ if (s.messageCount < 5)
358
+ continue;
359
+ const agentId = s.agentId;
360
+ if (["hub", "gym", "agentcreator"].includes(agentId))
361
+ continue;
362
+ try {
363
+ const logsRes = await apiGet(port, `/api/agents/${agentId}/logs?limit=50`);
364
+ const entries = logsRes.entries || [];
365
+ const gaveUpPatterns = /never\s*mind|forget\s*it|i('|')ll\s+do\s+it\s+(myself|manually)|this\s+isn('|')t\s+working|let('|')s\s+stop/i;
366
+ const gaveUpCount = entries.filter((e) => e.role === "user" && gaveUpPatterns.test(e.content || "")).length;
367
+ if (gaveUpCount >= 2) {
368
+ struggles.push({ agentId, pattern: "gave-up", detail: `User gave up ${gaveUpCount} times with @${agentId}` });
369
+ }
370
+ let corrections = 0;
371
+ for (let i = 1; i < entries.length - 1; i++) {
372
+ const prev = entries[i - 1];
373
+ const curr = entries[i];
374
+ if (prev?.role === "assistant" && curr?.role === "user") {
375
+ const msg = (curr.content || "").toLowerCase();
376
+ if (msg.startsWith("no") || msg.startsWith("that's not") || msg.startsWith("wrong") || msg.startsWith("try again") || /not what i/i.test(msg)) {
377
+ corrections++;
378
+ }
379
+ }
380
+ }
381
+ if (corrections >= 4) {
382
+ struggles.push({ agentId, pattern: "high-correction", detail: `High correction rate (${corrections}x) with @${agentId}` });
383
+ }
384
+ }
385
+ catch { /* skip */ }
386
+ }
387
+ if (struggles.length > 0) {
388
+ profileUpdate.patterns = {
389
+ ...profileUpdate.patterns,
390
+ struggles: struggles.map((s) => ({ ...s, detectedAt: today })),
391
+ };
392
+ try {
393
+ await apiPut(port, "/api/gym/learner-profile", profileUpdate);
394
+ log.info("[Gym Digest] Learner profile updated with struggle patterns");
395
+ }
396
+ catch (err) {
397
+ log.warn(`[Gym Digest] Failed to update profile with struggles: ${err}`);
398
+ }
399
+ }
400
+ // ── Step 9: Generate insights for "You tell me" mode ──
401
+ const insights = [];
402
+ // Insight from weakest dimension
403
+ const weakest = Object.entries(scores).sort((a, b) => a[1] - b[1])[0];
404
+ if (weakest && weakest[1] < 3) {
405
+ const dimTips = {
406
+ application: "You're not yet using agents for real work tasks regularly. Bringing a real task to an agent — even a small one — builds the strongest intuition.",
407
+ communication: "Your prompts could be more detailed. Try giving agents more context upfront: what you want, why, and what good looks like.",
408
+ knowledge: "You haven't explored the learning programs yet. Structured programs are the fastest way to level up.",
409
+ orchestration: "You're doing everything manually. Goals, cron jobs, and delegation can automate the repetitive parts.",
410
+ craft: "Your agents are still generic. Specialized agents with focused system prompts and curated tools outperform generalists.",
411
+ };
412
+ insights.push({
413
+ category: "dimension",
414
+ text: dimTips[weakest[0]] || `Your ${weakest[0]} score is ${weakest[1]}/5 — room to grow.`,
415
+ priority: 5 - weakest[1],
416
+ });
417
+ }
418
+ // Insight from struggles
419
+ if (struggles.length > 0) {
420
+ const s = struggles[0];
421
+ insights.push({
422
+ category: "struggle",
423
+ text: s.pattern === "gave-up"
424
+ ? `You've been hitting walls with @${s.agentId}. This usually means the prompt needs restructuring — not that the agent can't do it.`
425
+ : `Lots of corrections with @${s.agentId}. Front-loading context in your initial prompt can cut the back-and-forth in half.`,
426
+ priority: 4,
427
+ });
428
+ }
429
+ // Insight from dormant agents
430
+ if (dormantAgents.length > 0) {
431
+ insights.push({
432
+ category: "dormant",
433
+ text: `You have ${dormantAgents.length} dormant agent${dormantAgents.length > 1 ? "s" : ""} (${dormantAgents.slice(0, 3).map(a => "@" + a).join(", ")}). Worth reviewing — maybe reconfigure or retire them.`,
434
+ priority: 2,
435
+ });
436
+ }
437
+ // Insight from unused high-value feature
438
+ const featureValue = {
439
+ "goals": { value: 5, reason: "Automate recurring tasks — your agents can work while you sleep." },
440
+ "mcps": { value: 5, reason: "Connect to external services (Slack, GitHub, APIs) for powerful workflows." },
441
+ "projects": { value: 4, reason: "Organize multi-agent initiatives with tasks and tracking." },
442
+ "cron": { value: 4, reason: "Schedule regular agent check-ins, reports, or maintenance." },
443
+ "wiki": { value: 3, reason: "Let agents learn and remember facts across sessions." },
444
+ "advanced-memory": { value: 3, reason: "Semantic search across past conversations for deeper context." },
445
+ "multi-model": { value: 2, reason: "Use different AI models for different tasks." },
446
+ "delegation": { value: 2, reason: "Let agents hand off work to each other for complex workflows." },
447
+ };
448
+ const topGap = neverUsed
449
+ .filter((f) => featureValue[f])
450
+ .sort((a, b) => (featureValue[b]?.value || 0) - (featureValue[a]?.value || 0))[0];
451
+ if (topGap) {
452
+ insights.push({
453
+ category: "feature-gap",
454
+ text: `You haven't tried ${topGap} yet. ${featureValue[topGap].reason}`,
455
+ priority: featureValue[topGap].value >= 4 ? 3 : 1,
456
+ });
457
+ }
458
+ // Sort by priority and pick top recommendation
459
+ insights.sort((a, b) => b.priority - a.priority);
460
+ const topRec = insights[0];
461
+ // Build summary
462
+ const summaryParts = [];
463
+ const overallLevel = Math.round(Object.values(scores).reduce((a, b) => a + b, 0) / 5);
464
+ summaryParts.push(`Overall level: ${scoreLabels[overallLevel] || "Developing"} (avg ${(Object.values(scores).reduce((a, b) => a + b, 0) / 5).toFixed(1)}/5).`);
465
+ summaryParts.push(`${activeAgents.length} active agent${activeAgents.length !== 1 ? "s" : ""}, ~${messagesThisWeek} messages this week, ${streakCurrent}-day streak.`);
466
+ if (weakest && weakest[1] < 3)
467
+ summaryParts.push(`Weakest area: ${weakest[0]} (${weakest[1]}/5).`);
468
+ try {
469
+ await apiPost(port, "/api/gym/insights", {
470
+ insights: insights.map(({ category, text }) => ({ category, text })),
471
+ topRecommendation: topRec ? topRec.text : null,
472
+ summary: summaryParts.join(" "),
473
+ });
474
+ log.info(`[Gym Digest] Insights updated (${insights.length} insights, top: ${topRec?.category || "none"})`);
475
+ }
476
+ catch (err) {
477
+ log.warn(`[Gym Digest] Failed to update insights: ${err}`);
478
+ }
479
+ log.info("[Gym Digest] Complete.");
480
+ }
481
+ catch (err) {
482
+ log.error(`[Gym Digest] Failed: ${err}`);
483
+ }
484
+ }
485
+ /**
486
+ * Start the activity digest cron job.
487
+ * Runs daily at 6am when gymEnabled is true.
488
+ */
489
+ export function startActivityDigest(config) {
490
+ if (scheduledTask) {
491
+ scheduledTask.stop();
492
+ scheduledTask = null;
493
+ }
494
+ scheduledTask = cron.schedule("0 6 * * *", async () => {
495
+ await runActivityDigest(config);
496
+ });
497
+ log.info("[Gym Digest] Scheduled: daily at 6am");
498
+ }
499
+ export function stopActivityDigest() {
500
+ if (scheduledTask) {
501
+ scheduledTask.stop();
502
+ scheduledTask = null;
503
+ log.info("[Gym Digest] Stopped");
504
+ }
505
+ }
506
+ //# sourceMappingURL=activity-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-digest.js","sourceRoot":"","sources":["../../src/gym/activity-digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * AI Gym — Dimension Scorer
3
+ *
4
+ * Scores learners across 5 AI skill dimensions based on observable
5
+ * platform activity. Each dimension is scored 0–5.
6
+ *
7
+ * Scoring is heuristic — it works with whatever data is available
8
+ * and errs on the side of encouragement (never penalizes absence,
9
+ * only rewards observed activity).
10
+ */
11
+ export interface ActivitySummary {
12
+ agentId: string;
13
+ messageCount: number;
14
+ activeDays: number;
15
+ uniqueDates: string[];
16
+ topics: string[];
17
+ toolUseCounts: Record<string, number>;
18
+ lastActive: string | null;
19
+ }
20
+ export interface AgentInfo {
21
+ id: string;
22
+ name: string;
23
+ description?: string;
24
+ agentClass?: string;
25
+ workspace?: string;
26
+ allowedTools?: string[];
27
+ mcps?: string[];
28
+ goals?: any[];
29
+ cron?: any[];
30
+ claudeMd?: string;
31
+ systemPromptLength?: number;
32
+ }
33
+ export interface DimensionScores {
34
+ application: number;
35
+ communication: number;
36
+ knowledge: number;
37
+ orchestration: number;
38
+ craft: number;
39
+ }
40
+ /**
41
+ * Application — How deeply is AI integrated into actual work?
42
+ * Measures: usage frequency, breadth of agents used, session depth.
43
+ */
44
+ export declare function scoreApplication(summaries: ActivitySummary[]): number;
45
+ /**
46
+ * Communication — How effectively do you talk to AI?
47
+ * Measures: prompt patterns, correction frequency, tool use diversity.
48
+ * Note: Without full log analysis, this is a rough proxy.
49
+ */
50
+ export declare function scoreCommunication(summaries: ActivitySummary[]): number;
51
+ /**
52
+ * Knowledge — How much do you understand about AI concepts?
53
+ * Measures: program completions, breadth of engagement.
54
+ * This dimension is hard to measure from activity alone —
55
+ * the coach supplements with direct assessment during sessions.
56
+ */
57
+ export declare function scoreKnowledge(programsCompleted: string[], totalPrograms: number, agentsUsed: number): number;
58
+ /**
59
+ * Orchestration — Can you design multi-agent, automated workflows?
60
+ * Measures: goals/cron usage, multi-agent patterns, delegation.
61
+ */
62
+ export declare function scoreOrchestration(agents: AgentInfo[]): number;
63
+ /**
64
+ * Craft — Can you build, configure, and tune AI systems?
65
+ * Measures: agents created, system prompt quality, MCP configs, tool selection.
66
+ */
67
+ export declare function scoreCraft(agents: AgentInfo[]): number;
68
+ /**
69
+ * Score all dimensions from available data.
70
+ */
71
+ export declare function scoreAllDimensions(summaries: ActivitySummary[], agents: AgentInfo[], programsCompleted: string[], totalPrograms: number): DimensionScores;
72
+ /**
73
+ * Determine trend from comparing current scores to previous scores.
74
+ */
75
+ export declare function computeTrends(current: DimensionScores, previous: DimensionScores | null): Record<keyof DimensionScores, "up" | "down" | "stable">;
76
+ //# sourceMappingURL=dimension-scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimension-scorer.d.ts","sourceRoot":"","sources":["../../src/gym/dimension-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CAiCrE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CA2CvE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,MAAM,CAmBR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CA+B9D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CA2CtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,eAAe,EAAE,EAC5B,MAAM,EAAE,SAAS,EAAE,EACnB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,EAAE,MAAM,GACpB,eAAe,CAYjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,eAAe,GAAG,IAAI,GAC/B,MAAM,CAAC,MAAM,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC,CAezD"}