octo-vec 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 (319) hide show
  1. package/README.md +646 -0
  2. package/core/prompts/architect.md +124 -0
  3. package/core/prompts/ba.md +117 -0
  4. package/core/prompts/backend.md +154 -0
  5. package/core/prompts/compliance.md +127 -0
  6. package/core/prompts/dataanalyst.md +126 -0
  7. package/core/prompts/dataengineer.md +155 -0
  8. package/core/prompts/dba.md +155 -0
  9. package/core/prompts/designer.md +145 -0
  10. package/core/prompts/dev.md +148 -0
  11. package/core/prompts/devops.md +127 -0
  12. package/core/prompts/frontend.md +151 -0
  13. package/core/prompts/mlengineer.md +156 -0
  14. package/core/prompts/mobile.md +155 -0
  15. package/core/prompts/pm.md +182 -0
  16. package/core/prompts/productowner.md +122 -0
  17. package/core/prompts/qa.md +135 -0
  18. package/core/prompts/releasemanager.md +138 -0
  19. package/core/prompts/researcher.md +122 -0
  20. package/core/prompts/scrummaster.md +125 -0
  21. package/core/prompts/security.md +127 -0
  22. package/core/prompts/sre.md +141 -0
  23. package/core/prompts/support.md +138 -0
  24. package/core/prompts/techwriter.md +123 -0
  25. package/core/roster.json +1161 -0
  26. package/dashboard/dist/assets/index--L-aFRgh.css +1 -0
  27. package/dashboard/dist/assets/index-BoOVmAFf.js +523 -0
  28. package/dashboard/dist/icons/integrations/gitleaks.svg +6 -0
  29. package/dashboard/dist/icons/integrations/searxng.svg +5 -0
  30. package/dashboard/dist/icons/integrations/semgrep.svg +4 -0
  31. package/dashboard/dist/icons/integrations/slack.svg +6 -0
  32. package/dashboard/dist/icons/integrations/sonarqube.svg +5 -0
  33. package/dashboard/dist/icons/integrations/telegram.svg +4 -0
  34. package/dashboard/dist/icons/integrations/trivy.svg +5 -0
  35. package/dashboard/dist/icons/providers/anthropic.svg +1 -0
  36. package/dashboard/dist/icons/providers/antigravity.svg +1 -0
  37. package/dashboard/dist/icons/providers/azure.svg +1 -0
  38. package/dashboard/dist/icons/providers/bedrock.svg +1 -0
  39. package/dashboard/dist/icons/providers/cerebras.svg +1 -0
  40. package/dashboard/dist/icons/providers/chatglm.svg +1 -0
  41. package/dashboard/dist/icons/providers/codex.svg +1 -0
  42. package/dashboard/dist/icons/providers/gemini.svg +1 -0
  43. package/dashboard/dist/icons/providers/githubcopilot.svg +1 -0
  44. package/dashboard/dist/icons/providers/googlecloud.svg +1 -0
  45. package/dashboard/dist/icons/providers/groq.svg +1 -0
  46. package/dashboard/dist/icons/providers/huggingface.svg +1 -0
  47. package/dashboard/dist/icons/providers/kimi.svg +1 -0
  48. package/dashboard/dist/icons/providers/minimax.svg +1 -0
  49. package/dashboard/dist/icons/providers/mistral.svg +1 -0
  50. package/dashboard/dist/icons/providers/openai.svg +1 -0
  51. package/dashboard/dist/icons/providers/openrouter.svg +1 -0
  52. package/dashboard/dist/icons/providers/vercel.svg +1 -0
  53. package/dashboard/dist/icons/providers/xai.svg +1 -0
  54. package/dashboard/dist/index.html +17 -0
  55. package/dist/agents/pmAgent.d.ts +40 -0
  56. package/dist/agents/pmAgent.d.ts.map +1 -0
  57. package/dist/agents/pmAgent.js +181 -0
  58. package/dist/agents/pmAgent.js.map +1 -0
  59. package/dist/ar/baseSpecialist.d.ts +36 -0
  60. package/dist/ar/baseSpecialist.d.ts.map +1 -0
  61. package/dist/ar/baseSpecialist.js +292 -0
  62. package/dist/ar/baseSpecialist.js.map +1 -0
  63. package/dist/ar/promptLoader.d.ts +10 -0
  64. package/dist/ar/promptLoader.d.ts.map +1 -0
  65. package/dist/ar/promptLoader.js +22 -0
  66. package/dist/ar/promptLoader.js.map +1 -0
  67. package/dist/ar/registry.d.ts +12 -0
  68. package/dist/ar/registry.d.ts.map +1 -0
  69. package/dist/ar/registry.js +22 -0
  70. package/dist/ar/registry.js.map +1 -0
  71. package/dist/ar/roster.d.ts +104 -0
  72. package/dist/ar/roster.d.ts.map +1 -0
  73. package/dist/ar/roster.js +245 -0
  74. package/dist/ar/roster.js.map +1 -0
  75. package/dist/ar/toolProfiles.d.ts +18 -0
  76. package/dist/ar/toolProfiles.d.ts.map +1 -0
  77. package/dist/ar/toolProfiles.js +89 -0
  78. package/dist/ar/toolProfiles.js.map +1 -0
  79. package/dist/atp/agentGroups.d.ts +39 -0
  80. package/dist/atp/agentGroups.d.ts.map +1 -0
  81. package/dist/atp/agentGroups.js +109 -0
  82. package/dist/atp/agentGroups.js.map +1 -0
  83. package/dist/atp/agentInterrupt.d.ts +31 -0
  84. package/dist/atp/agentInterrupt.d.ts.map +1 -0
  85. package/dist/atp/agentInterrupt.js +51 -0
  86. package/dist/atp/agentInterrupt.js.map +1 -0
  87. package/dist/atp/agentMessageQueue.d.ts +74 -0
  88. package/dist/atp/agentMessageQueue.d.ts.map +1 -0
  89. package/dist/atp/agentMessageQueue.js +218 -0
  90. package/dist/atp/agentMessageQueue.js.map +1 -0
  91. package/dist/atp/agentRuntime.d.ts +67 -0
  92. package/dist/atp/agentRuntime.d.ts.map +1 -0
  93. package/dist/atp/agentRuntime.js +279 -0
  94. package/dist/atp/agentRuntime.js.map +1 -0
  95. package/dist/atp/agentStreamBus.d.ts +35 -0
  96. package/dist/atp/agentStreamBus.d.ts.map +1 -0
  97. package/dist/atp/agentStreamBus.js +159 -0
  98. package/dist/atp/agentStreamBus.js.map +1 -0
  99. package/dist/atp/agentToolConfig.d.ts +38 -0
  100. package/dist/atp/agentToolConfig.d.ts.map +1 -0
  101. package/dist/atp/agentToolConfig.js +225 -0
  102. package/dist/atp/agentToolConfig.js.map +1 -0
  103. package/dist/atp/chatLog.d.ts +34 -0
  104. package/dist/atp/chatLog.d.ts.map +1 -0
  105. package/dist/atp/chatLog.js +59 -0
  106. package/dist/atp/chatLog.js.map +1 -0
  107. package/dist/atp/codexAuth.d.ts +6 -0
  108. package/dist/atp/codexAuth.d.ts.map +1 -0
  109. package/dist/atp/codexAuth.js +44 -0
  110. package/dist/atp/codexAuth.js.map +1 -0
  111. package/dist/atp/database.d.ts +54 -0
  112. package/dist/atp/database.d.ts.map +1 -0
  113. package/dist/atp/database.js +323 -0
  114. package/dist/atp/database.js.map +1 -0
  115. package/dist/atp/eventLog.d.ts +12 -0
  116. package/dist/atp/eventLog.d.ts.map +1 -0
  117. package/dist/atp/eventLog.js +60 -0
  118. package/dist/atp/eventLog.js.map +1 -0
  119. package/dist/atp/inboxLoop.d.ts +72 -0
  120. package/dist/atp/inboxLoop.d.ts.map +1 -0
  121. package/dist/atp/inboxLoop.js +482 -0
  122. package/dist/atp/inboxLoop.js.map +1 -0
  123. package/dist/atp/llmDebug.d.ts +18 -0
  124. package/dist/atp/llmDebug.d.ts.map +1 -0
  125. package/dist/atp/llmDebug.js +97 -0
  126. package/dist/atp/llmDebug.js.map +1 -0
  127. package/dist/atp/messageDebouncer.d.ts +34 -0
  128. package/dist/atp/messageDebouncer.d.ts.map +1 -0
  129. package/dist/atp/messageDebouncer.js +60 -0
  130. package/dist/atp/messageDebouncer.js.map +1 -0
  131. package/dist/atp/messageQueue.d.ts +17 -0
  132. package/dist/atp/messageQueue.d.ts.map +1 -0
  133. package/dist/atp/messageQueue.js +69 -0
  134. package/dist/atp/messageQueue.js.map +1 -0
  135. package/dist/atp/modelConfig.d.ts +46 -0
  136. package/dist/atp/modelConfig.d.ts.map +1 -0
  137. package/dist/atp/modelConfig.js +232 -0
  138. package/dist/atp/modelConfig.js.map +1 -0
  139. package/dist/atp/models.d.ts +87 -0
  140. package/dist/atp/models.d.ts.map +1 -0
  141. package/dist/atp/models.js +45 -0
  142. package/dist/atp/models.js.map +1 -0
  143. package/dist/atp/postTaskHooks.d.ts +21 -0
  144. package/dist/atp/postTaskHooks.d.ts.map +1 -0
  145. package/dist/atp/postTaskHooks.js +89 -0
  146. package/dist/atp/postTaskHooks.js.map +1 -0
  147. package/dist/atp/tokenTracker.d.ts +46 -0
  148. package/dist/atp/tokenTracker.d.ts.map +1 -0
  149. package/dist/atp/tokenTracker.js +120 -0
  150. package/dist/atp/tokenTracker.js.map +1 -0
  151. package/dist/channels/activeChannel.d.ts +14 -0
  152. package/dist/channels/activeChannel.d.ts.map +1 -0
  153. package/dist/channels/activeChannel.js +18 -0
  154. package/dist/channels/activeChannel.js.map +1 -0
  155. package/dist/channels/channelConfig.d.ts +61 -0
  156. package/dist/channels/channelConfig.d.ts.map +1 -0
  157. package/dist/channels/channelConfig.js +130 -0
  158. package/dist/channels/channelConfig.js.map +1 -0
  159. package/dist/channels/channelManager.d.ts +22 -0
  160. package/dist/channels/channelManager.d.ts.map +1 -0
  161. package/dist/channels/channelManager.js +77 -0
  162. package/dist/channels/channelManager.js.map +1 -0
  163. package/dist/channels/discord.d.ts +24 -0
  164. package/dist/channels/discord.d.ts.map +1 -0
  165. package/dist/channels/discord.js +276 -0
  166. package/dist/channels/discord.js.map +1 -0
  167. package/dist/channels/slack.d.ts +25 -0
  168. package/dist/channels/slack.d.ts.map +1 -0
  169. package/dist/channels/slack.js +313 -0
  170. package/dist/channels/slack.js.map +1 -0
  171. package/dist/channels/telegram.d.ts +20 -0
  172. package/dist/channels/telegram.d.ts.map +1 -0
  173. package/dist/channels/telegram.js +273 -0
  174. package/dist/channels/telegram.js.map +1 -0
  175. package/dist/channels/types.d.ts +12 -0
  176. package/dist/channels/types.d.ts.map +1 -0
  177. package/dist/channels/types.js +5 -0
  178. package/dist/channels/types.js.map +1 -0
  179. package/dist/config.d.ts +82 -0
  180. package/dist/config.d.ts.map +1 -0
  181. package/dist/config.js +144 -0
  182. package/dist/config.js.map +1 -0
  183. package/dist/dashboard/security.d.ts +68 -0
  184. package/dist/dashboard/security.d.ts.map +1 -0
  185. package/dist/dashboard/security.js +178 -0
  186. package/dist/dashboard/security.js.map +1 -0
  187. package/dist/dashboard/securityHelpers.d.ts +10 -0
  188. package/dist/dashboard/securityHelpers.d.ts.map +1 -0
  189. package/dist/dashboard/securityHelpers.js +22 -0
  190. package/dist/dashboard/securityHelpers.js.map +1 -0
  191. package/dist/dashboard/server.d.ts +18 -0
  192. package/dist/dashboard/server.d.ts.map +1 -0
  193. package/dist/dashboard/server.js +3207 -0
  194. package/dist/dashboard/server.js.map +1 -0
  195. package/dist/flows/codeScanFlow.d.ts +14 -0
  196. package/dist/flows/codeScanFlow.d.ts.map +1 -0
  197. package/dist/flows/codeScanFlow.js +204 -0
  198. package/dist/flows/codeScanFlow.js.map +1 -0
  199. package/dist/flows/gitleaksScanFlow.d.ts +12 -0
  200. package/dist/flows/gitleaksScanFlow.d.ts.map +1 -0
  201. package/dist/flows/gitleaksScanFlow.js +205 -0
  202. package/dist/flows/gitleaksScanFlow.js.map +1 -0
  203. package/dist/flows/index.d.ts +30 -0
  204. package/dist/flows/index.d.ts.map +1 -0
  205. package/dist/flows/index.js +43 -0
  206. package/dist/flows/index.js.map +1 -0
  207. package/dist/flows/semgrepScanFlow.d.ts +13 -0
  208. package/dist/flows/semgrepScanFlow.d.ts.map +1 -0
  209. package/dist/flows/semgrepScanFlow.js +211 -0
  210. package/dist/flows/semgrepScanFlow.js.map +1 -0
  211. package/dist/flows/trivyScanFlow.d.ts +13 -0
  212. package/dist/flows/trivyScanFlow.d.ts.map +1 -0
  213. package/dist/flows/trivyScanFlow.js +198 -0
  214. package/dist/flows/trivyScanFlow.js.map +1 -0
  215. package/dist/identity.d.ts +22 -0
  216. package/dist/identity.d.ts.map +1 -0
  217. package/dist/identity.js +34 -0
  218. package/dist/identity.js.map +1 -0
  219. package/dist/init.d.ts +8 -0
  220. package/dist/init.d.ts.map +1 -0
  221. package/dist/init.js +27 -0
  222. package/dist/init.js.map +1 -0
  223. package/dist/integrations/integrationConfig.d.ts +80 -0
  224. package/dist/integrations/integrationConfig.d.ts.map +1 -0
  225. package/dist/integrations/integrationConfig.js +146 -0
  226. package/dist/integrations/integrationConfig.js.map +1 -0
  227. package/dist/mcp/mcpBridge.d.ts +36 -0
  228. package/dist/mcp/mcpBridge.d.ts.map +1 -0
  229. package/dist/mcp/mcpBridge.js +157 -0
  230. package/dist/mcp/mcpBridge.js.map +1 -0
  231. package/dist/memory/agentMemory.d.ts +32 -0
  232. package/dist/memory/agentMemory.d.ts.map +1 -0
  233. package/dist/memory/agentMemory.js +116 -0
  234. package/dist/memory/agentMemory.js.map +1 -0
  235. package/dist/memory/autoCompaction.d.ts +46 -0
  236. package/dist/memory/autoCompaction.d.ts.map +1 -0
  237. package/dist/memory/autoCompaction.js +220 -0
  238. package/dist/memory/autoCompaction.js.map +1 -0
  239. package/dist/memory/compaction.d.ts +17 -0
  240. package/dist/memory/compaction.d.ts.map +1 -0
  241. package/dist/memory/compaction.js +27 -0
  242. package/dist/memory/compaction.js.map +1 -0
  243. package/dist/memory/messageHistory.d.ts +28 -0
  244. package/dist/memory/messageHistory.d.ts.map +1 -0
  245. package/dist/memory/messageHistory.js +60 -0
  246. package/dist/memory/messageHistory.js.map +1 -0
  247. package/dist/memory/sessionLifecycle.d.ts +30 -0
  248. package/dist/memory/sessionLifecycle.d.ts.map +1 -0
  249. package/dist/memory/sessionLifecycle.js +63 -0
  250. package/dist/memory/sessionLifecycle.js.map +1 -0
  251. package/dist/migrate.d.ts +8 -0
  252. package/dist/migrate.d.ts.map +1 -0
  253. package/dist/migrate.js +83 -0
  254. package/dist/migrate.js.map +1 -0
  255. package/dist/onboarding.d.ts +8 -0
  256. package/dist/onboarding.d.ts.map +1 -0
  257. package/dist/onboarding.js +188 -0
  258. package/dist/onboarding.js.map +1 -0
  259. package/dist/tools/domain/baFileTools.d.ts +7 -0
  260. package/dist/tools/domain/baFileTools.d.ts.map +1 -0
  261. package/dist/tools/domain/baFileTools.js +46 -0
  262. package/dist/tools/domain/baFileTools.js.map +1 -0
  263. package/dist/tools/domain/baTools.d.ts +6 -0
  264. package/dist/tools/domain/baTools.d.ts.map +1 -0
  265. package/dist/tools/domain/baTools.js +160 -0
  266. package/dist/tools/domain/baTools.js.map +1 -0
  267. package/dist/tools/domain/baseSpecialistTools.d.ts +22 -0
  268. package/dist/tools/domain/baseSpecialistTools.d.ts.map +1 -0
  269. package/dist/tools/domain/baseSpecialistTools.js +183 -0
  270. package/dist/tools/domain/baseSpecialistTools.js.map +1 -0
  271. package/dist/tools/domain/devTools.d.ts +6 -0
  272. package/dist/tools/domain/devTools.d.ts.map +1 -0
  273. package/dist/tools/domain/devTools.js +191 -0
  274. package/dist/tools/domain/devTools.js.map +1 -0
  275. package/dist/tools/domain/gitTools.d.ts +36 -0
  276. package/dist/tools/domain/gitTools.d.ts.map +1 -0
  277. package/dist/tools/domain/gitTools.js +279 -0
  278. package/dist/tools/domain/gitTools.js.map +1 -0
  279. package/dist/tools/domain/qaTools.d.ts +6 -0
  280. package/dist/tools/domain/qaTools.d.ts.map +1 -0
  281. package/dist/tools/domain/qaTools.js +275 -0
  282. package/dist/tools/domain/qaTools.js.map +1 -0
  283. package/dist/tools/domain/securityFlowTools.d.ts +6 -0
  284. package/dist/tools/domain/securityFlowTools.d.ts.map +1 -0
  285. package/dist/tools/domain/securityFlowTools.js +156 -0
  286. package/dist/tools/domain/securityFlowTools.js.map +1 -0
  287. package/dist/tools/pm/employeeTools.d.ts +15 -0
  288. package/dist/tools/pm/employeeTools.d.ts.map +1 -0
  289. package/dist/tools/pm/employeeTools.js +117 -0
  290. package/dist/tools/pm/employeeTools.js.map +1 -0
  291. package/dist/tools/pm/taskTools.d.ts +31 -0
  292. package/dist/tools/pm/taskTools.d.ts.map +1 -0
  293. package/dist/tools/pm/taskTools.js +534 -0
  294. package/dist/tools/pm/taskTools.js.map +1 -0
  295. package/dist/tools/shared/dateTools.d.ts +7 -0
  296. package/dist/tools/shared/dateTools.d.ts.map +1 -0
  297. package/dist/tools/shared/dateTools.js +35 -0
  298. package/dist/tools/shared/dateTools.js.map +1 -0
  299. package/dist/tools/shared/fileTools.d.ts +33 -0
  300. package/dist/tools/shared/fileTools.d.ts.map +1 -0
  301. package/dist/tools/shared/fileTools.js +312 -0
  302. package/dist/tools/shared/fileTools.js.map +1 -0
  303. package/dist/tools/shared/memoryTools.d.ts +18 -0
  304. package/dist/tools/shared/memoryTools.d.ts.map +1 -0
  305. package/dist/tools/shared/memoryTools.js +275 -0
  306. package/dist/tools/shared/memoryTools.js.map +1 -0
  307. package/dist/tools/shared/messagingTools.d.ts +14 -0
  308. package/dist/tools/shared/messagingTools.d.ts.map +1 -0
  309. package/dist/tools/shared/messagingTools.js +95 -0
  310. package/dist/tools/shared/messagingTools.js.map +1 -0
  311. package/dist/tools/shared/webTools.d.ts +12 -0
  312. package/dist/tools/shared/webTools.d.ts.map +1 -0
  313. package/dist/tools/shared/webTools.js +140 -0
  314. package/dist/tools/shared/webTools.js.map +1 -0
  315. package/dist/tower.d.ts +8 -0
  316. package/dist/tower.d.ts.map +1 -0
  317. package/dist/tower.js +774 -0
  318. package/dist/tower.js.map +1 -0
  319. package/package.json +71 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * OCTO-FLOWS — named automated pipelines that agents can trigger as tools.
3
+ *
4
+ * Each flow is a TypeScript module that exports an executor function.
5
+ * The registry maps flow name → executor. To add a new flow:
6
+ * 1. Create src/flows/myFlow.ts exporting an async (ctx) => FlowResult
7
+ * 2. Register it in FLOW_REGISTRY below
8
+ * 3. It becomes available via the run_flow tool automatically
9
+ */
10
+ import { codeScanFlow } from "./codeScanFlow.js";
11
+ import { semgrepScanFlow } from "./semgrepScanFlow.js";
12
+ import { gitleaksScanFlow } from "./gitleaksScanFlow.js";
13
+ import { trivyScanFlow } from "./trivyScanFlow.js";
14
+ // ── Registry ───────────────────────────────────────────────────────────────────
15
+ const FLOW_REGISTRY = {
16
+ "code-scan": codeScanFlow,
17
+ "sast-scan": semgrepScanFlow,
18
+ "secret-scan": gitleaksScanFlow,
19
+ "sca-scan": trivyScanFlow,
20
+ };
21
+ /** All registered flow names — exposed for tool descriptions. */
22
+ export const FLOW_NAMES = Object.keys(FLOW_REGISTRY);
23
+ // ── Dispatcher ─────────────────────────────────────────────────────────────────
24
+ export async function runFlow(name, ctx) {
25
+ const executor = FLOW_REGISTRY[name];
26
+ if (!executor) {
27
+ return {
28
+ success: false,
29
+ summary: `Unknown flow: '${name}'. Available flows: ${FLOW_NAMES.join(", ")}`,
30
+ };
31
+ }
32
+ try {
33
+ return await executor(ctx);
34
+ }
35
+ catch (err) {
36
+ return {
37
+ success: false,
38
+ summary: `Flow '${name}' threw an error: ${String(err)}`,
39
+ details: String(err),
40
+ };
41
+ }
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flows/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAyBnD,kFAAkF;AAElF,MAAM,aAAa,GAAiC;IAClD,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,gBAAgB;IAC/B,UAAU,EAAE,aAAa;CAC1B,CAAC;AAEF,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAErD,kFAAkF;AAElF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,GAAgB;IAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,SAAS,IAAI,qBAAqB,MAAM,CAAC,GAAG,CAAC,EAAE;YACxD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * OCTO-FLOW: SAST Scan — runs Semgrep static analysis via Docker.
3
+ *
4
+ * Prerequisites:
5
+ * - Docker available in PATH
6
+ * - Internet access (Semgrep downloads rules on first run)
7
+ *
8
+ * The scanner runs as a Docker container (no local install needed).
9
+ * Uses `--config=auto` for the recommended ruleset (OWASP Top 10, injection, crypto, etc.).
10
+ */
11
+ import type { FlowContext, FlowResult } from "./index.js";
12
+ export declare function semgrepScanFlow(ctx: FlowContext): Promise<FlowResult>;
13
+ //# sourceMappingURL=semgrepScanFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrepScanFlow.d.ts","sourceRoot":"","sources":["../../src/flows/semgrepScanFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAY1D,wBAAsB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkI3E"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * OCTO-FLOW: SAST Scan — runs Semgrep static analysis via Docker.
3
+ *
4
+ * Prerequisites:
5
+ * - Docker available in PATH
6
+ * - Internet access (Semgrep downloads rules on first run)
7
+ *
8
+ * The scanner runs as a Docker container (no local install needed).
9
+ * Uses `--config=auto` for the recommended ruleset (OWASP Top 10, injection, crypto, etc.).
10
+ */
11
+ import { execSync } from "child_process";
12
+ import { mkdirSync, writeFileSync } from "fs";
13
+ import path from "path";
14
+ import { config, sharedWorkspace } from "../config.js";
15
+ /** Severity levels in descending order of importance. */
16
+ const SEVERITY_ORDER = ["ERROR", "WARNING", "INFO"];
17
+ /** Map Semgrep severity → human-readable label. */
18
+ const SEVERITY_LABEL = {
19
+ ERROR: "CRITICAL/HIGH",
20
+ WARNING: "MEDIUM",
21
+ INFO: "LOW",
22
+ };
23
+ export async function semgrepScanFlow(ctx) {
24
+ const { taskId, targetPath, options } = ctx;
25
+ // ── 1. Resolve absolute target path ──────────────────────────────────────
26
+ const absTarget = path.isAbsolute(targetPath)
27
+ ? targetPath
28
+ : path.resolve(config.workspace, targetPath);
29
+ // Safety: ensure the target is inside the workspace
30
+ const normalizedTarget = path.resolve(absTarget);
31
+ const normalizedWorkspace = path.resolve(config.workspace);
32
+ if (normalizedTarget !== normalizedWorkspace && !normalizedTarget.startsWith(normalizedWorkspace + path.sep)) {
33
+ return {
34
+ success: false,
35
+ summary: `Scan target "${targetPath}" resolves outside the workspace. Only workspace paths are allowed.`,
36
+ };
37
+ }
38
+ // ── 2. Severity threshold for pass/fail ────────────────────────────────
39
+ const failSeverity = (options?.fail_severity ?? "ERROR").toUpperCase();
40
+ // ── 3. Run Semgrep via Docker ──────────────────────────────────────────
41
+ const dockerMountPath = absTarget.replace(/\\/g, "/");
42
+ const semgrepCmd = [
43
+ "docker run --rm",
44
+ `-v "${dockerMountPath}:/src"`,
45
+ "semgrep/semgrep",
46
+ "semgrep scan",
47
+ "--config=auto",
48
+ "--json",
49
+ "--quiet",
50
+ "--no-git-ignore",
51
+ "/src",
52
+ ].join(" ");
53
+ let rawOutput = "";
54
+ let scanFailed = false;
55
+ try {
56
+ rawOutput = execSync(semgrepCmd, {
57
+ encoding: "utf-8",
58
+ timeout: 300_000, // 5 min for large projects
59
+ maxBuffer: 50 * 1024 * 1024, // 50MB — Semgrep JSON can be large
60
+ env: { ...process.env, MSYS_NO_PATHCONV: "1" }, // prevent Git Bash mangling /src on Windows
61
+ });
62
+ }
63
+ catch (err) {
64
+ // Semgrep exits non-zero when findings exist — check if we still got JSON
65
+ if (err?.stdout) {
66
+ rawOutput = err.stdout;
67
+ }
68
+ else {
69
+ scanFailed = true;
70
+ rawOutput = String(err?.stderr ?? err?.message ?? err);
71
+ }
72
+ }
73
+ // ── 4. Parse JSON results ──────────────────────────────────────────────
74
+ let findings = [];
75
+ let parseError = "";
76
+ if (!scanFailed) {
77
+ try {
78
+ const parsed = JSON.parse(rawOutput);
79
+ findings = (parsed.results ?? []).map((r) => ({
80
+ ruleId: r.check_id ?? "unknown",
81
+ severity: r.extra?.severity ?? "INFO",
82
+ message: r.extra?.message ?? r.message ?? "No message",
83
+ file: r.path ?? "unknown",
84
+ line: r.start?.line ?? 0,
85
+ endLine: r.end?.line ?? 0,
86
+ metadata: r.extra?.metadata ?? {},
87
+ }));
88
+ }
89
+ catch {
90
+ parseError = "Failed to parse Semgrep JSON output.";
91
+ scanFailed = true;
92
+ }
93
+ }
94
+ // ── 5. Build markdown report ───────────────────────────────────────────
95
+ const report = buildMarkdownReport({
96
+ taskId,
97
+ targetPath: absTarget,
98
+ scanFailed,
99
+ parseError,
100
+ rawOutput: scanFailed ? rawOutput : "",
101
+ findings,
102
+ });
103
+ // ── 6. Write report ───────────────────────────────────────────────────
104
+ const reportsDir = path.join(sharedWorkspace, "reports");
105
+ mkdirSync(reportsDir, { recursive: true });
106
+ const reportFileName = `sast-scan-${taskId.toLowerCase()}-${Date.now()}.md`;
107
+ const reportPath = path.join(reportsDir, reportFileName);
108
+ writeFileSync(reportPath, report, "utf-8");
109
+ const relativeReportPath = `shared/reports/${reportFileName}`;
110
+ // ── 7. Determine pass/fail based on severity threshold ─────────────────
111
+ const failSeverities = SEVERITY_ORDER.slice(0, SEVERITY_ORDER.indexOf(failSeverity) + 1);
112
+ const criticalFindings = findings.filter((f) => failSeverities.includes(f.severity));
113
+ const hasCritical = criticalFindings.length > 0;
114
+ // Build summary counts
115
+ const counts = { ERROR: 0, WARNING: 0, INFO: 0 };
116
+ for (const f of findings) {
117
+ if (f.severity in counts)
118
+ counts[f.severity]++;
119
+ }
120
+ const countStr = `${counts.ERROR} critical/high, ${counts.WARNING} medium, ${counts.INFO} low`;
121
+ if (scanFailed) {
122
+ return {
123
+ success: false,
124
+ summary: `SAST scan encountered errors. Partial report saved to ${relativeReportPath}.`,
125
+ reportPath: relativeReportPath,
126
+ details: (parseError || rawOutput).substring(0, 500),
127
+ };
128
+ }
129
+ return {
130
+ success: !hasCritical,
131
+ summary: hasCritical
132
+ ? `SAST scan FAILED — ${findings.length} findings (${countStr}). Report: ${relativeReportPath}`
133
+ : `SAST scan PASSED — ${findings.length} findings (${countStr}). Report: ${relativeReportPath}`,
134
+ reportPath: relativeReportPath,
135
+ };
136
+ }
137
+ function buildMarkdownReport(opts) {
138
+ const { taskId, targetPath, scanFailed, parseError, rawOutput, findings } = opts;
139
+ const now = new Date().toISOString();
140
+ const lines = [
141
+ `# SAST Scan Report — ${taskId}`,
142
+ ``,
143
+ `**Generated:** ${now}`,
144
+ `**Scanner:** Semgrep (config=auto)`,
145
+ `**Scanned Path:** \`${targetPath}\``,
146
+ `**Total Findings:** ${findings.length}`,
147
+ ``,
148
+ ];
149
+ if (scanFailed) {
150
+ lines.push(`> **WARNING:** Scanner encountered errors. Results below may be partial.`);
151
+ if (parseError)
152
+ lines.push(`> ${parseError}`);
153
+ if (rawOutput) {
154
+ lines.push(``, "```", rawOutput.substring(0, 1000), "```", ``);
155
+ }
156
+ lines.push(``);
157
+ }
158
+ // ── Summary table ───────────────────────────────────────────────────────
159
+ const counts = { ERROR: 0, WARNING: 0, INFO: 0 };
160
+ for (const f of findings) {
161
+ if (f.severity in counts)
162
+ counts[f.severity]++;
163
+ }
164
+ lines.push(`## Summary`);
165
+ lines.push(``);
166
+ lines.push(`| Severity | Count |`);
167
+ lines.push(`|----------|-------|`);
168
+ lines.push(`| Critical/High (ERROR) | ${counts.ERROR} |`);
169
+ lines.push(`| Medium (WARNING) | ${counts.WARNING} |`);
170
+ lines.push(`| Low (INFO) | ${counts.INFO} |`);
171
+ lines.push(``);
172
+ // ── Findings by severity ────────────────────────────────────────────────
173
+ if (!findings.length) {
174
+ lines.push(`## Findings`);
175
+ lines.push(``);
176
+ lines.push(`_No security findings detected. Code looks clean._`);
177
+ lines.push(``);
178
+ }
179
+ else {
180
+ lines.push(`## Findings`);
181
+ lines.push(``);
182
+ for (const sev of SEVERITY_ORDER) {
183
+ const group = findings.filter((f) => f.severity === sev);
184
+ if (!group.length)
185
+ continue;
186
+ const label = SEVERITY_LABEL[sev] ?? sev;
187
+ lines.push(`### ${label} (${group.length})`);
188
+ lines.push(``);
189
+ for (const f of group) {
190
+ // Strip /src/ prefix from Docker paths for readability
191
+ const cleanFile = f.file.replace(/^\/src\//, "");
192
+ const lineRef = f.line ? `:${f.line}` : "";
193
+ lines.push(`- **\`${cleanFile}${lineRef}\`** — ${f.message}`);
194
+ lines.push(` - Rule: \`${f.ruleId}\``);
195
+ if (f.metadata?.cwe) {
196
+ const cwes = Array.isArray(f.metadata.cwe) ? f.metadata.cwe.join(", ") : f.metadata.cwe;
197
+ lines.push(` - CWE: ${cwes}`);
198
+ }
199
+ if (f.metadata?.owasp) {
200
+ const owasp = Array.isArray(f.metadata.owasp) ? f.metadata.owasp.join(", ") : f.metadata.owasp;
201
+ lines.push(` - OWASP: ${owasp}`);
202
+ }
203
+ }
204
+ lines.push(``);
205
+ }
206
+ }
207
+ lines.push(`---`);
208
+ lines.push(`_Generated by OCTO-FLOWS SAST Scan (Semgrep) | VEC-ATP_`);
209
+ return lines.join("\n");
210
+ }
211
+ //# sourceMappingURL=semgrepScanFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semgrepScanFlow.js","sourceRoot":"","sources":["../../src/flows/semgrepScanFlow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * OCTO-FLOW: SCA Scan — runs Trivy via Docker to detect dependency vulnerabilities.
3
+ *
4
+ * Prerequisites:
5
+ * - Docker available in PATH
6
+ *
7
+ * Scans a project's filesystem (package-lock.json, yarn.lock, etc.) for known
8
+ * CVEs in dependencies using the Trivy vulnerability database.
9
+ * Also detects secrets and misconfigurations as a bonus.
10
+ */
11
+ import type { FlowContext, FlowResult } from "./index.js";
12
+ export declare function trivyScanFlow(ctx: FlowContext): Promise<FlowResult>;
13
+ //# sourceMappingURL=trivyScanFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trivyScanFlow.d.ts","sourceRoot":"","sources":["../../src/flows/trivyScanFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK1D,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA6HzE"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * OCTO-FLOW: SCA Scan — runs Trivy via Docker to detect dependency vulnerabilities.
3
+ *
4
+ * Prerequisites:
5
+ * - Docker available in PATH
6
+ *
7
+ * Scans a project's filesystem (package-lock.json, yarn.lock, etc.) for known
8
+ * CVEs in dependencies using the Trivy vulnerability database.
9
+ * Also detects secrets and misconfigurations as a bonus.
10
+ */
11
+ import { execSync } from "child_process";
12
+ import { mkdirSync, writeFileSync } from "fs";
13
+ import path from "path";
14
+ import { config, sharedWorkspace } from "../config.js";
15
+ /** Trivy severity levels in descending order. */
16
+ const SEVERITY_ORDER = ["CRITICAL", "HIGH", "MEDIUM", "LOW", "UNKNOWN"];
17
+ export async function trivyScanFlow(ctx) {
18
+ const { taskId, targetPath, options } = ctx;
19
+ // ── 1. Resolve absolute target path ──────────────────────────────────────
20
+ const absTarget = path.isAbsolute(targetPath)
21
+ ? targetPath
22
+ : path.resolve(config.workspace, targetPath);
23
+ const normalizedTarget = path.resolve(absTarget);
24
+ const normalizedWorkspace = path.resolve(config.workspace);
25
+ if (normalizedTarget !== normalizedWorkspace && !normalizedTarget.startsWith(normalizedWorkspace + path.sep)) {
26
+ return {
27
+ success: false,
28
+ summary: `Scan target "${targetPath}" resolves outside the workspace. Only workspace paths are allowed.`,
29
+ };
30
+ }
31
+ // ── 2. Severity threshold for pass/fail ────────────────────────────────
32
+ const failSeverity = (options?.fail_severity ?? "HIGH").toUpperCase();
33
+ // ── 3. Run Trivy via Docker ────────────────────────────────────────────
34
+ const dockerMountPath = absTarget.replace(/\\/g, "/");
35
+ // Trivy fs mode: scans filesystem for vulnerable dependencies + secrets
36
+ const trivyCmd = [
37
+ "docker run --rm",
38
+ `-v "${dockerMountPath}:/src"`,
39
+ "aquasec/trivy:latest",
40
+ "fs",
41
+ "--format=json",
42
+ "--scanners=vuln,secret",
43
+ "--skip-dirs=node_modules/.cache",
44
+ "/src",
45
+ ].join(" ");
46
+ let rawOutput = "";
47
+ let scanFailed = false;
48
+ try {
49
+ rawOutput = execSync(trivyCmd, {
50
+ encoding: "utf-8",
51
+ timeout: 300_000, // 5 min
52
+ maxBuffer: 50 * 1024 * 1024,
53
+ env: { ...process.env, MSYS_NO_PATHCONV: "1" },
54
+ });
55
+ }
56
+ catch (err) {
57
+ if (err?.stdout) {
58
+ rawOutput = err.stdout;
59
+ }
60
+ else {
61
+ scanFailed = true;
62
+ rawOutput = String(err?.stderr ?? err?.message ?? err);
63
+ }
64
+ }
65
+ // ── 4. Parse JSON results ──────────────────────────────────────────────
66
+ let findings = [];
67
+ let parseError = "";
68
+ if (!scanFailed) {
69
+ try {
70
+ const parsed = JSON.parse(rawOutput);
71
+ const results = parsed.Results ?? [];
72
+ for (const result of results) {
73
+ const vulns = result.Vulnerabilities ?? [];
74
+ for (const v of vulns) {
75
+ findings.push({
76
+ target: result.Target ?? "unknown",
77
+ pkgName: v.PkgName ?? "unknown",
78
+ installedVersion: v.InstalledVersion ?? "",
79
+ fixedVersion: v.FixedVersion ?? "",
80
+ severity: v.Severity ?? "UNKNOWN",
81
+ vulnId: v.VulnerabilityID ?? "",
82
+ title: v.Title ?? v.Description ?? "No description",
83
+ primaryUrl: v.PrimaryURL ?? "",
84
+ });
85
+ }
86
+ }
87
+ }
88
+ catch {
89
+ parseError = "Failed to parse Trivy JSON output.";
90
+ scanFailed = true;
91
+ }
92
+ }
93
+ // ── 5. Build markdown report ───────────────────────────────────────────
94
+ const report = buildMarkdownReport({ taskId, targetPath: absTarget, scanFailed, parseError, rawOutput: scanFailed ? rawOutput : "", findings });
95
+ // ── 6. Write report ───────────────────────────────────────────────────
96
+ const reportsDir = path.join(sharedWorkspace, "reports");
97
+ mkdirSync(reportsDir, { recursive: true });
98
+ const reportFileName = `sca-scan-${taskId.toLowerCase()}-${Date.now()}.md`;
99
+ const reportPath = path.join(reportsDir, reportFileName);
100
+ writeFileSync(reportPath, report, "utf-8");
101
+ const relativeReportPath = `shared/reports/${reportFileName}`;
102
+ // ── 7. Determine pass/fail based on severity threshold ─────────────────
103
+ const failIdx = SEVERITY_ORDER.indexOf(failSeverity);
104
+ const failSeverities = failIdx >= 0 ? SEVERITY_ORDER.slice(0, failIdx + 1) : ["CRITICAL", "HIGH"];
105
+ const criticalFindings = findings.filter((f) => failSeverities.includes(f.severity));
106
+ const hasCritical = criticalFindings.length > 0;
107
+ // Build summary counts
108
+ const counts = {};
109
+ for (const sev of SEVERITY_ORDER)
110
+ counts[sev] = 0;
111
+ for (const f of findings)
112
+ counts[f.severity] = (counts[f.severity] ?? 0) + 1;
113
+ const countStr = `${counts.CRITICAL} critical, ${counts.HIGH} high, ${counts.MEDIUM} medium, ${counts.LOW} low`;
114
+ if (scanFailed) {
115
+ return {
116
+ success: false,
117
+ summary: `SCA scan encountered errors. Partial report saved to ${relativeReportPath}.`,
118
+ reportPath: relativeReportPath,
119
+ details: (parseError || rawOutput).substring(0, 500),
120
+ };
121
+ }
122
+ return {
123
+ success: !hasCritical,
124
+ summary: hasCritical
125
+ ? `SCA scan FAILED — ${findings.length} vulnerable dependencies (${countStr}). Report: ${relativeReportPath}`
126
+ : `SCA scan PASSED — ${findings.length} findings (${countStr}). Report: ${relativeReportPath}`,
127
+ reportPath: relativeReportPath,
128
+ };
129
+ }
130
+ function buildMarkdownReport(opts) {
131
+ const { taskId, targetPath, scanFailed, parseError, rawOutput, findings } = opts;
132
+ const now = new Date().toISOString();
133
+ const lines = [
134
+ `# SCA Scan Report — ${taskId}`,
135
+ ``,
136
+ `**Generated:** ${now}`,
137
+ `**Scanner:** Trivy (filesystem mode — vuln + secret scanners)`,
138
+ `**Scanned Path:** \`${targetPath}\``,
139
+ `**Total Vulnerabilities:** ${findings.length}`,
140
+ ``,
141
+ ];
142
+ if (scanFailed) {
143
+ lines.push(`> **WARNING:** Scanner encountered errors. Results below may be partial.`);
144
+ if (parseError)
145
+ lines.push(`> ${parseError}`);
146
+ if (rawOutput) {
147
+ lines.push(``, "```", rawOutput.substring(0, 1000), "```", ``);
148
+ }
149
+ lines.push(``);
150
+ }
151
+ // ── Summary table ───────────────────────────────────────────────────────
152
+ const counts = {};
153
+ for (const sev of SEVERITY_ORDER)
154
+ counts[sev] = 0;
155
+ for (const f of findings)
156
+ counts[f.severity] = (counts[f.severity] ?? 0) + 1;
157
+ lines.push(`## Summary`);
158
+ lines.push(``);
159
+ lines.push(`| Severity | Count |`);
160
+ lines.push(`|----------|-------|`);
161
+ for (const sev of SEVERITY_ORDER) {
162
+ if (counts[sev] > 0 || sev === "CRITICAL" || sev === "HIGH") {
163
+ lines.push(`| ${sev} | ${counts[sev]} |`);
164
+ }
165
+ }
166
+ lines.push(``);
167
+ // ── Findings by severity ────────────────────────────────────────────────
168
+ if (!findings.length) {
169
+ lines.push(`## Vulnerabilities`);
170
+ lines.push(``);
171
+ lines.push(`_No known vulnerabilities found in dependencies._`);
172
+ lines.push(``);
173
+ }
174
+ else {
175
+ lines.push(`## Vulnerabilities`);
176
+ lines.push(``);
177
+ for (const sev of SEVERITY_ORDER) {
178
+ const group = findings.filter((f) => f.severity === sev);
179
+ if (!group.length)
180
+ continue;
181
+ lines.push(`### ${sev} (${group.length})`);
182
+ lines.push(``);
183
+ lines.push(`| Package | Installed | Fixed | CVE | Description |`);
184
+ lines.push(`|---------|-----------|-------|-----|-------------|`);
185
+ for (const f of group) {
186
+ const fixed = f.fixedVersion || "_no fix yet_";
187
+ const cve = f.primaryUrl ? `[${f.vulnId}](${f.primaryUrl})` : f.vulnId;
188
+ const title = f.title.length > 80 ? f.title.substring(0, 77) + "..." : f.title;
189
+ lines.push(`| ${f.pkgName} | ${f.installedVersion} | ${fixed} | ${cve} | ${title} |`);
190
+ }
191
+ lines.push(``);
192
+ }
193
+ }
194
+ lines.push(`---`);
195
+ lines.push(`_Generated by OCTO-FLOWS SCA Scan (Trivy) | VEC-ATP_`);
196
+ return lines.join("\n");
197
+ }
198
+ //# sourceMappingURL=trivyScanFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trivyScanFlow.js","sourceRoot":"","sources":["../../src/flows/trivyScanFlow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGvD,iDAAiD;AACjD,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB;IAClD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAE5C,4EAA4E;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,gBAAgB,KAAK,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7G,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,gBAAgB,UAAU,qEAAqE;SACzG,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAEtE,0EAA0E;IAC1E,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEtD,wEAAwE;IACxE,MAAM,QAAQ,GAAG;QACf,iBAAiB;QACjB,OAAO,eAAe,QAAQ;QAC9B,sBAAsB;QACtB,IAAI;QACJ,eAAe;QACf,wBAAwB;QACxB,iCAAiC;QACjC,MAAM;KACP,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,SAAS,GAAG,QAAQ,CAAC,QAAQ,EAAE;YAC7B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,OAAO,EAAE,QAAQ;YAC1B,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;YAChB,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,QAAQ,GAAgB,EAAE,CAAC;IAC/B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACrC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;gBAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,QAAQ,CAAC,IAAI,CAAC;wBACZ,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;wBAClC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;wBAC/B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,EAAE;wBAC1C,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;wBAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;wBACjC,MAAM,EAAE,CAAC,CAAC,eAAe,IAAI,EAAE;wBAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,IAAI,gBAAgB;wBACnD,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;qBAC/B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,GAAG,oCAAoC,CAAC;YAClD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEhJ,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACzD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,cAAc,GAAG,YAAY,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACzD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE3C,MAAM,kBAAkB,GAAG,kBAAkB,cAAc,EAAE,CAAC;IAE9D,0EAA0E;IAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,YAAmB,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClG,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7C,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAe,CAAC,CAC3C,CAAC;IACF,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhD,uBAAuB;IACvB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,GAAG,MAAM,CAAC;IAEhH,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,wDAAwD,kBAAkB,GAAG;YACtF,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,WAAW;QACrB,OAAO,EAAE,WAAW;YAClB,CAAC,CAAC,qBAAqB,QAAQ,CAAC,MAAM,6BAA6B,QAAQ,cAAc,kBAAkB,EAAE;YAC7G,CAAC,CAAC,qBAAqB,QAAQ,CAAC,MAAM,cAAc,QAAQ,cAAc,kBAAkB,EAAE;QAChG,UAAU,EAAE,kBAAkB;KAC/B,CAAC;AACJ,CAAC;AA0BD,SAAS,mBAAmB,CAAC,IAAmB;IAC9C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACjF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,KAAK,GAAa;QACtB,uBAAuB,MAAM,EAAE;QAC/B,EAAE;QACF,kBAAkB,GAAG,EAAE;QACvB,+DAA+D;QAC/D,uBAAuB,UAAU,IAAI;QACrC,8BAA8B,QAAQ,CAAC,MAAM,EAAE;QAC/C,EAAE;KACH,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACvF,IAAI,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;QAC9C,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,2EAA2E;IAC3E,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,cAAc;QAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAE7E,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,2EAA2E;IAC3E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,SAAS;YAE5B,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAElE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,IAAI,cAAc,CAAC;gBAC/C,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACvE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,gBAAgB,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC;YACxF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAEnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Founder identity — loaded once from ITS_ME.md at startup.
3
+ * Use `founder.name`, `founder.agentKey`, etc. everywhere instead of hardcoding.
4
+ */
5
+ export interface FounderProfile {
6
+ /** Display name of the founder (e.g. "Akhil"). */
7
+ name: string;
8
+ /** Their role (e.g. "Founder & CEO"). */
9
+ role: string;
10
+ /**
11
+ * System agent key — always "user".
12
+ * This is a routing constant in ATP and should not change.
13
+ */
14
+ agentKey: "user";
15
+ /** Formatted display name for message headers (e.g. "Akhil (Founder)"). */
16
+ displayName: string;
17
+ /** Full raw content of ITS_ME.md — injected into agent prompts for context. */
18
+ raw: string;
19
+ }
20
+ /** Singleton — loaded synchronously once when this module is first imported. */
21
+ export declare const founder: FounderProfile;
22
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAC;CACb;AA6BD,gFAAgF;AAChF,eAAO,MAAM,OAAO,gBAAS,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Founder identity — loaded once from ITS_ME.md at startup.
3
+ * Use `founder.name`, `founder.agentKey`, etc. everywhere instead of hardcoding.
4
+ */
5
+ import fs from "fs";
6
+ import path from "path";
7
+ import { USER_DATA_DIR } from "./config.js";
8
+ function parseField(text, field) {
9
+ const m = new RegExp(`\\*\\*${field}:\\*\\*\\s*(.+)`).exec(text);
10
+ return m?.[1]?.trim() ?? "";
11
+ }
12
+ function load() {
13
+ const filePath = path.join(USER_DATA_DIR, "ITS_ME.md");
14
+ let raw = "";
15
+ try {
16
+ raw = fs.readFileSync(filePath, "utf-8");
17
+ }
18
+ catch {
19
+ // ITS_ME.md missing — fall back to bare minimum so the system still boots
20
+ raw = "**Name:** User\n**Role:** Founder & CEO";
21
+ }
22
+ const name = parseField(raw, "Name") || "User";
23
+ const role = parseField(raw, "Role") || "Founder & CEO";
24
+ return {
25
+ name,
26
+ role,
27
+ agentKey: "user",
28
+ displayName: `${name} (Founder)`,
29
+ raw,
30
+ };
31
+ }
32
+ /** Singleton — loaded synchronously once when this module is first imported. */
33
+ export const founder = load();
34
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkB5C,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,IAAI;IACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,GAAG,GAAG,yCAAyC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC;IAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,eAAe,CAAC;IAExD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,GAAG,IAAI,YAAY;QAChC,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * First-run bootstrapper — ensures USER_DATA_DIR exists and seeds
3
+ * required files (roster.json) from the package's core/ assets.
4
+ *
5
+ * Called once at the top of tower.ts main() before anything else.
6
+ */
7
+ export declare function initUserDataDir(): void;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wBAAgB,eAAe,IAAI,IAAI,CAiBtC"}
package/dist/init.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * First-run bootstrapper — ensures USER_DATA_DIR exists and seeds
3
+ * required files (roster.json) from the package's core/ assets.
4
+ *
5
+ * Called once at the top of tower.ts main() before anything else.
6
+ */
7
+ import { existsSync, mkdirSync, copyFileSync } from "fs";
8
+ import { join } from "path";
9
+ import { USER_DATA_DIR, DEFAULT_ROSTER_PATH } from "./config.js";
10
+ export function initUserDataDir() {
11
+ // Create the user data directory tree
12
+ const dirs = [
13
+ USER_DATA_DIR,
14
+ join(USER_DATA_DIR, "memory"),
15
+ join(USER_DATA_DIR, "agent-history"),
16
+ ];
17
+ for (const dir of dirs) {
18
+ mkdirSync(dir, { recursive: true });
19
+ }
20
+ // Seed roster.json from core/ if missing (first run)
21
+ const userRosterPath = join(USER_DATA_DIR, "roster.json");
22
+ if (!existsSync(userRosterPath)) {
23
+ copyFileSync(DEFAULT_ROSTER_PATH, userRosterPath);
24
+ console.log(` [init] Created ${userRosterPath} from default template.`);
25
+ }
26
+ }
27
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,UAAU,eAAe;IAC7B,sCAAsC;IACtC,MAAM,IAAI,GAAG;QACX,aAAa;QACb,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;QAC7B,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC;KACrC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,qDAAqD;IACrD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,YAAY,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,cAAc,yBAAyB,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC"}