adaria-ai 0.1.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 (337) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/apps.example.yaml +65 -0
  4. package/dist/agent/audit.d.ts +16 -0
  5. package/dist/agent/audit.d.ts.map +1 -0
  6. package/dist/agent/audit.js +42 -0
  7. package/dist/agent/audit.js.map +1 -0
  8. package/dist/agent/claude.d.ts +62 -0
  9. package/dist/agent/claude.d.ts.map +1 -0
  10. package/dist/agent/claude.js +297 -0
  11. package/dist/agent/claude.js.map +1 -0
  12. package/dist/agent/conversation-summary.d.ts +29 -0
  13. package/dist/agent/conversation-summary.d.ts.map +1 -0
  14. package/dist/agent/conversation-summary.js +221 -0
  15. package/dist/agent/conversation-summary.js.map +1 -0
  16. package/dist/agent/core.d.ts +81 -0
  17. package/dist/agent/core.d.ts.map +1 -0
  18. package/dist/agent/core.js +527 -0
  19. package/dist/agent/core.js.map +1 -0
  20. package/dist/agent/mcp-launcher.d.ts +42 -0
  21. package/dist/agent/mcp-launcher.d.ts.map +1 -0
  22. package/dist/agent/mcp-launcher.js +38 -0
  23. package/dist/agent/mcp-launcher.js.map +1 -0
  24. package/dist/agent/mcp-manager.d.ts +81 -0
  25. package/dist/agent/mcp-manager.d.ts.map +1 -0
  26. package/dist/agent/mcp-manager.js +136 -0
  27. package/dist/agent/mcp-manager.js.map +1 -0
  28. package/dist/agent/memory.d.ts +10 -0
  29. package/dist/agent/memory.d.ts.map +1 -0
  30. package/dist/agent/memory.js +95 -0
  31. package/dist/agent/memory.js.map +1 -0
  32. package/dist/agent/safety.d.ts +45 -0
  33. package/dist/agent/safety.d.ts.map +1 -0
  34. package/dist/agent/safety.js +71 -0
  35. package/dist/agent/safety.js.map +1 -0
  36. package/dist/agent/session.d.ts +27 -0
  37. package/dist/agent/session.d.ts.map +1 -0
  38. package/dist/agent/session.js +124 -0
  39. package/dist/agent/session.js.map +1 -0
  40. package/dist/agent/tool-descriptions.d.ts +8 -0
  41. package/dist/agent/tool-descriptions.d.ts.map +1 -0
  42. package/dist/agent/tool-descriptions.js +26 -0
  43. package/dist/agent/tool-descriptions.js.map +1 -0
  44. package/dist/cli/analyze.d.ts +8 -0
  45. package/dist/cli/analyze.d.ts.map +1 -0
  46. package/dist/cli/analyze.js +114 -0
  47. package/dist/cli/analyze.js.map +1 -0
  48. package/dist/cli/daemon.d.ts +2 -0
  49. package/dist/cli/daemon.d.ts.map +1 -0
  50. package/dist/cli/daemon.js +91 -0
  51. package/dist/cli/daemon.js.map +1 -0
  52. package/dist/cli/doctor.d.ts +2 -0
  53. package/dist/cli/doctor.d.ts.map +1 -0
  54. package/dist/cli/doctor.js +198 -0
  55. package/dist/cli/doctor.js.map +1 -0
  56. package/dist/cli/init.d.ts +3 -0
  57. package/dist/cli/init.d.ts.map +1 -0
  58. package/dist/cli/init.js +459 -0
  59. package/dist/cli/init.js.map +1 -0
  60. package/dist/cli/logs.d.ts +4 -0
  61. package/dist/cli/logs.d.ts.map +1 -0
  62. package/dist/cli/logs.js +50 -0
  63. package/dist/cli/logs.js.map +1 -0
  64. package/dist/cli/monitor-cmd.d.ts +11 -0
  65. package/dist/cli/monitor-cmd.d.ts.map +1 -0
  66. package/dist/cli/monitor-cmd.js +59 -0
  67. package/dist/cli/monitor-cmd.js.map +1 -0
  68. package/dist/cli/start.d.ts +11 -0
  69. package/dist/cli/start.d.ts.map +1 -0
  70. package/dist/cli/start.js +103 -0
  71. package/dist/cli/start.js.map +1 -0
  72. package/dist/cli/status.d.ts +9 -0
  73. package/dist/cli/status.d.ts.map +1 -0
  74. package/dist/cli/status.js +49 -0
  75. package/dist/cli/status.js.map +1 -0
  76. package/dist/cli/stop.d.ts +2 -0
  77. package/dist/cli/stop.d.ts.map +1 -0
  78. package/dist/cli/stop.js +34 -0
  79. package/dist/cli/stop.js.map +1 -0
  80. package/dist/collectors/appstore.d.ts +51 -0
  81. package/dist/collectors/appstore.d.ts.map +1 -0
  82. package/dist/collectors/appstore.js +166 -0
  83. package/dist/collectors/appstore.js.map +1 -0
  84. package/dist/collectors/arden-tts.d.ts +60 -0
  85. package/dist/collectors/arden-tts.d.ts.map +1 -0
  86. package/dist/collectors/arden-tts.js +83 -0
  87. package/dist/collectors/arden-tts.js.map +1 -0
  88. package/dist/collectors/asomobile.d.ts +37 -0
  89. package/dist/collectors/asomobile.d.ts.map +1 -0
  90. package/dist/collectors/asomobile.js +88 -0
  91. package/dist/collectors/asomobile.js.map +1 -0
  92. package/dist/collectors/eodin-blog.d.ts +90 -0
  93. package/dist/collectors/eodin-blog.d.ts.map +1 -0
  94. package/dist/collectors/eodin-blog.js +238 -0
  95. package/dist/collectors/eodin-blog.js.map +1 -0
  96. package/dist/collectors/eodin-sdk.d.ts +60 -0
  97. package/dist/collectors/eodin-sdk.d.ts.map +1 -0
  98. package/dist/collectors/eodin-sdk.js +112 -0
  99. package/dist/collectors/eodin-sdk.js.map +1 -0
  100. package/dist/collectors/fridgify-recipes.d.ts +65 -0
  101. package/dist/collectors/fridgify-recipes.d.ts.map +1 -0
  102. package/dist/collectors/fridgify-recipes.js +111 -0
  103. package/dist/collectors/fridgify-recipes.js.map +1 -0
  104. package/dist/collectors/playstore.d.ts +46 -0
  105. package/dist/collectors/playstore.d.ts.map +1 -0
  106. package/dist/collectors/playstore.js +140 -0
  107. package/dist/collectors/playstore.js.map +1 -0
  108. package/dist/collectors/youtube.d.ts +44 -0
  109. package/dist/collectors/youtube.d.ts.map +1 -0
  110. package/dist/collectors/youtube.js +107 -0
  111. package/dist/collectors/youtube.js.map +1 -0
  112. package/dist/config/apps-schema.d.ts +94 -0
  113. package/dist/config/apps-schema.d.ts.map +1 -0
  114. package/dist/config/apps-schema.js +66 -0
  115. package/dist/config/apps-schema.js.map +1 -0
  116. package/dist/config/keychain.d.ts +14 -0
  117. package/dist/config/keychain.d.ts.map +1 -0
  118. package/dist/config/keychain.js +89 -0
  119. package/dist/config/keychain.js.map +1 -0
  120. package/dist/config/load-apps.d.ts +16 -0
  121. package/dist/config/load-apps.d.ts.map +1 -0
  122. package/dist/config/load-apps.js +38 -0
  123. package/dist/config/load-apps.js.map +1 -0
  124. package/dist/config/schema.d.ts +306 -0
  125. package/dist/config/schema.d.ts.map +1 -0
  126. package/dist/config/schema.js +220 -0
  127. package/dist/config/schema.js.map +1 -0
  128. package/dist/config/store.d.ts +38 -0
  129. package/dist/config/store.d.ts.map +1 -0
  130. package/dist/config/store.js +180 -0
  131. package/dist/config/store.js.map +1 -0
  132. package/dist/db/queries.d.ts +304 -0
  133. package/dist/db/queries.d.ts.map +1 -0
  134. package/dist/db/queries.js +327 -0
  135. package/dist/db/queries.js.map +1 -0
  136. package/dist/db/schema.d.ts +15 -0
  137. package/dist/db/schema.d.ts.map +1 -0
  138. package/dist/db/schema.js +252 -0
  139. package/dist/db/schema.js.map +1 -0
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +86 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/messenger/adapter.d.ts +63 -0
  145. package/dist/messenger/adapter.d.ts.map +1 -0
  146. package/dist/messenger/adapter.js +7 -0
  147. package/dist/messenger/adapter.js.map +1 -0
  148. package/dist/messenger/factory.d.ts +12 -0
  149. package/dist/messenger/factory.d.ts.map +1 -0
  150. package/dist/messenger/factory.js +9 -0
  151. package/dist/messenger/factory.js.map +1 -0
  152. package/dist/messenger/slack.d.ts +30 -0
  153. package/dist/messenger/slack.d.ts.map +1 -0
  154. package/dist/messenger/slack.js +309 -0
  155. package/dist/messenger/slack.js.map +1 -0
  156. package/dist/messenger/split.d.ts +17 -0
  157. package/dist/messenger/split.d.ts.map +1 -0
  158. package/dist/messenger/split.js +56 -0
  159. package/dist/messenger/split.js.map +1 -0
  160. package/dist/orchestrator/dashboard.d.ts +67 -0
  161. package/dist/orchestrator/dashboard.d.ts.map +1 -0
  162. package/dist/orchestrator/dashboard.js +113 -0
  163. package/dist/orchestrator/dashboard.js.map +1 -0
  164. package/dist/orchestrator/monitor.d.ts +37 -0
  165. package/dist/orchestrator/monitor.d.ts.map +1 -0
  166. package/dist/orchestrator/monitor.js +236 -0
  167. package/dist/orchestrator/monitor.js.map +1 -0
  168. package/dist/orchestrator/types.d.ts +82 -0
  169. package/dist/orchestrator/types.d.ts.map +1 -0
  170. package/dist/orchestrator/types.js +12 -0
  171. package/dist/orchestrator/types.js.map +1 -0
  172. package/dist/orchestrator/weekly.d.ts +66 -0
  173. package/dist/orchestrator/weekly.d.ts.map +1 -0
  174. package/dist/orchestrator/weekly.js +376 -0
  175. package/dist/orchestrator/weekly.js.map +1 -0
  176. package/dist/prompts/loader.d.ts +18 -0
  177. package/dist/prompts/loader.d.ts.map +1 -0
  178. package/dist/prompts/loader.js +28 -0
  179. package/dist/prompts/loader.js.map +1 -0
  180. package/dist/security/auth.d.ts +14 -0
  181. package/dist/security/auth.d.ts.map +1 -0
  182. package/dist/security/auth.js +14 -0
  183. package/dist/security/auth.js.map +1 -0
  184. package/dist/security/prompt-guard.d.ts +21 -0
  185. package/dist/security/prompt-guard.d.ts.map +1 -0
  186. package/dist/security/prompt-guard.js +54 -0
  187. package/dist/security/prompt-guard.js.map +1 -0
  188. package/dist/skills/aso.d.ts +60 -0
  189. package/dist/skills/aso.d.ts.map +1 -0
  190. package/dist/skills/aso.js +322 -0
  191. package/dist/skills/aso.js.map +1 -0
  192. package/dist/skills/content.d.ts +25 -0
  193. package/dist/skills/content.d.ts.map +1 -0
  194. package/dist/skills/content.js +90 -0
  195. package/dist/skills/content.js.map +1 -0
  196. package/dist/skills/index.d.ts +65 -0
  197. package/dist/skills/index.d.ts.map +1 -0
  198. package/dist/skills/index.js +90 -0
  199. package/dist/skills/index.js.map +1 -0
  200. package/dist/skills/onboarding.d.ts +58 -0
  201. package/dist/skills/onboarding.d.ts.map +1 -0
  202. package/dist/skills/onboarding.js +274 -0
  203. package/dist/skills/onboarding.js.map +1 -0
  204. package/dist/skills/registry.d.ts +24 -0
  205. package/dist/skills/registry.d.ts.map +1 -0
  206. package/dist/skills/registry.js +66 -0
  207. package/dist/skills/registry.js.map +1 -0
  208. package/dist/skills/review.d.ts +33 -0
  209. package/dist/skills/review.d.ts.map +1 -0
  210. package/dist/skills/review.js +236 -0
  211. package/dist/skills/review.js.map +1 -0
  212. package/dist/skills/sdk-request.d.ts +30 -0
  213. package/dist/skills/sdk-request.d.ts.map +1 -0
  214. package/dist/skills/sdk-request.js +72 -0
  215. package/dist/skills/sdk-request.js.map +1 -0
  216. package/dist/skills/seo-blog.d.ts +64 -0
  217. package/dist/skills/seo-blog.d.ts.map +1 -0
  218. package/dist/skills/seo-blog.js +268 -0
  219. package/dist/skills/seo-blog.js.map +1 -0
  220. package/dist/skills/short-form.d.ts +28 -0
  221. package/dist/skills/short-form.d.ts.map +1 -0
  222. package/dist/skills/short-form.js +121 -0
  223. package/dist/skills/short-form.js.map +1 -0
  224. package/dist/skills/social-publish.d.ts +32 -0
  225. package/dist/skills/social-publish.d.ts.map +1 -0
  226. package/dist/skills/social-publish.js +133 -0
  227. package/dist/skills/social-publish.js.map +1 -0
  228. package/dist/social/base.d.ts +47 -0
  229. package/dist/social/base.d.ts.map +1 -0
  230. package/dist/social/base.js +26 -0
  231. package/dist/social/base.js.map +1 -0
  232. package/dist/social/facebook.d.ts +27 -0
  233. package/dist/social/facebook.d.ts.map +1 -0
  234. package/dist/social/facebook.js +166 -0
  235. package/dist/social/facebook.js.map +1 -0
  236. package/dist/social/factory.d.ts +26 -0
  237. package/dist/social/factory.d.ts.map +1 -0
  238. package/dist/social/factory.js +32 -0
  239. package/dist/social/factory.js.map +1 -0
  240. package/dist/social/linkedin.d.ts +26 -0
  241. package/dist/social/linkedin.d.ts.map +1 -0
  242. package/dist/social/linkedin.js +190 -0
  243. package/dist/social/linkedin.js.map +1 -0
  244. package/dist/social/threads.d.ts +21 -0
  245. package/dist/social/threads.d.ts.map +1 -0
  246. package/dist/social/threads.js +122 -0
  247. package/dist/social/threads.js.map +1 -0
  248. package/dist/social/tiktok.d.ts +23 -0
  249. package/dist/social/tiktok.d.ts.map +1 -0
  250. package/dist/social/tiktok.js +110 -0
  251. package/dist/social/tiktok.js.map +1 -0
  252. package/dist/social/twitter.d.ts +30 -0
  253. package/dist/social/twitter.d.ts.map +1 -0
  254. package/dist/social/twitter.js +189 -0
  255. package/dist/social/twitter.js.map +1 -0
  256. package/dist/social/youtube.d.ts +21 -0
  257. package/dist/social/youtube.d.ts.map +1 -0
  258. package/dist/social/youtube.js +108 -0
  259. package/dist/social/youtube.js.map +1 -0
  260. package/dist/tools/app-info.d.ts +7 -0
  261. package/dist/tools/app-info.d.ts.map +1 -0
  262. package/dist/tools/app-info.js +53 -0
  263. package/dist/tools/app-info.js.map +1 -0
  264. package/dist/tools/collector-fetch.d.ts +11 -0
  265. package/dist/tools/collector-fetch.d.ts.map +1 -0
  266. package/dist/tools/collector-fetch.js +101 -0
  267. package/dist/tools/collector-fetch.js.map +1 -0
  268. package/dist/tools/db-query.d.ts +29 -0
  269. package/dist/tools/db-query.d.ts.map +1 -0
  270. package/dist/tools/db-query.js +159 -0
  271. package/dist/tools/db-query.js.map +1 -0
  272. package/dist/tools/skill-result.d.ts +8 -0
  273. package/dist/tools/skill-result.d.ts.map +1 -0
  274. package/dist/tools/skill-result.js +63 -0
  275. package/dist/tools/skill-result.js.map +1 -0
  276. package/dist/tools/tool-host.d.ts +12 -0
  277. package/dist/tools/tool-host.d.ts.map +1 -0
  278. package/dist/tools/tool-host.js +124 -0
  279. package/dist/tools/tool-host.js.map +1 -0
  280. package/dist/types/collectors.d.ts +198 -0
  281. package/dist/types/collectors.d.ts.map +1 -0
  282. package/dist/types/collectors.js +28 -0
  283. package/dist/types/collectors.js.map +1 -0
  284. package/dist/types/skill.d.ts +60 -0
  285. package/dist/types/skill.d.ts.map +1 -0
  286. package/dist/types/skill.js +9 -0
  287. package/dist/types/skill.js.map +1 -0
  288. package/dist/utils/circuit-breaker.d.ts +26 -0
  289. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  290. package/dist/utils/circuit-breaker.js +67 -0
  291. package/dist/utils/circuit-breaker.js.map +1 -0
  292. package/dist/utils/errors.d.ts +44 -0
  293. package/dist/utils/errors.d.ts.map +1 -0
  294. package/dist/utils/errors.js +75 -0
  295. package/dist/utils/errors.js.map +1 -0
  296. package/dist/utils/escape.d.ts +11 -0
  297. package/dist/utils/escape.d.ts.map +1 -0
  298. package/dist/utils/escape.js +19 -0
  299. package/dist/utils/escape.js.map +1 -0
  300. package/dist/utils/logger.d.ts +19 -0
  301. package/dist/utils/logger.d.ts.map +1 -0
  302. package/dist/utils/logger.js +93 -0
  303. package/dist/utils/logger.js.map +1 -0
  304. package/dist/utils/parse-json.d.ts +13 -0
  305. package/dist/utils/parse-json.d.ts.map +1 -0
  306. package/dist/utils/parse-json.js +61 -0
  307. package/dist/utils/parse-json.js.map +1 -0
  308. package/dist/utils/paths.d.ts +14 -0
  309. package/dist/utils/paths.d.ts.map +1 -0
  310. package/dist/utils/paths.js +19 -0
  311. package/dist/utils/paths.js.map +1 -0
  312. package/dist/utils/rate-limiter.d.ts +20 -0
  313. package/dist/utils/rate-limiter.d.ts.map +1 -0
  314. package/dist/utils/rate-limiter.js +47 -0
  315. package/dist/utils/rate-limiter.js.map +1 -0
  316. package/dist/utils/retry.d.ts +26 -0
  317. package/dist/utils/retry.d.ts.map +1 -0
  318. package/dist/utils/retry.js +61 -0
  319. package/dist/utils/retry.js.map +1 -0
  320. package/launchd/.gitkeep +0 -0
  321. package/launchd/com.adaria-ai.daemon.plist.template +62 -0
  322. package/launchd/com.adaria-ai.monitor.plist.template +41 -0
  323. package/launchd/com.adaria-ai.weekly.plist.template +43 -0
  324. package/package.json +72 -0
  325. package/prompts/aso-description.md +44 -0
  326. package/prompts/aso-inapp-events.md +20 -0
  327. package/prompts/aso-metadata.md +34 -0
  328. package/prompts/aso-screenshots.md +20 -0
  329. package/prompts/onboarding-hypotheses.md +38 -0
  330. package/prompts/onboarding-review-timing.md +24 -0
  331. package/prompts/review-clustering.md +19 -0
  332. package/prompts/review-replies.md +18 -0
  333. package/prompts/review-sentiment.md +16 -0
  334. package/prompts/seo-blog-fridgify-recipe.md +116 -0
  335. package/prompts/seo-blog.md +69 -0
  336. package/prompts/short-form-ideas.md +50 -0
  337. package/prompts/social-publish.md +46 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Skill registry.
3
+ *
4
+ * A "skill" is a code-defined, domain-specific handler that reacts to
5
+ * explicit Slack commands (Mode A). Skills are heavy, may gate write paths
6
+ * through `ApprovalManager`, and are NOT exposed as MCP tools.
7
+ *
8
+ * M4 upgraded the Skill interface from `dispatch(text)` → `dispatch(ctx, text)`
9
+ * with a `SkillResult` return type. PlaceholderSkill still exists for
10
+ * skills not yet ported (M5 will remove it).
11
+ */
12
+ export class SkillRegistry {
13
+ skills = [];
14
+ register(skill) {
15
+ for (const cmd of skill.commands) {
16
+ if (this.findSkillByCommand(cmd)) {
17
+ throw new Error(`SkillRegistry: command "${cmd}" is already registered to another skill`);
18
+ }
19
+ }
20
+ this.skills.push(skill);
21
+ }
22
+ /**
23
+ * Returns the skill whose `commands` match the first token of `text`,
24
+ * or `null` if no skill matches. Matching is case-insensitive.
25
+ */
26
+ findSkill(text) {
27
+ const firstToken = text.trim().toLowerCase().split(/\s+/)[0];
28
+ if (!firstToken)
29
+ return null;
30
+ return this.findSkillByCommand(firstToken);
31
+ }
32
+ findSkillByCommand(cmd) {
33
+ const lower = cmd.toLowerCase();
34
+ return (this.skills.find((s) => s.commands.some((c) => c.toLowerCase() === lower)) ?? null);
35
+ }
36
+ getSkills() {
37
+ return this.skills;
38
+ }
39
+ getSkillCount() {
40
+ return this.skills.length;
41
+ }
42
+ }
43
+ /**
44
+ * Placeholder skill for commands not yet ported. Returns a clear
45
+ * "not implemented" message so the operator can verify Mode A plumbing.
46
+ * M5 removes this once all skills are real.
47
+ */
48
+ export class PlaceholderSkill {
49
+ name;
50
+ commands;
51
+ constructor(name, commands) {
52
+ this.name = name;
53
+ this.commands = commands;
54
+ }
55
+ dispatch(_ctx, _text) {
56
+ return Promise.resolve({
57
+ summary: `(skill not implemented: ${this.name})`,
58
+ alerts: [],
59
+ approvals: [],
60
+ });
61
+ }
62
+ }
63
+ /**
64
+ * Builds an M1 placeholder registry. Every command word that M4–M6 will
65
+ * eventually recognize is mapped to a no-op skill that returns a clear
66
+ * "not implemented" message, so the operator can verify Mode A plumbing
67
+ * (reactions, status evolution, audit log) before any real skill lands.
68
+ */
69
+ export function createM1PlaceholderRegistry() {
70
+ const registry = new SkillRegistry();
71
+ registry.register(new PlaceholderSkill("aso", ["aso"]));
72
+ registry.register(new PlaceholderSkill("review", ["review", "reviews"]));
73
+ registry.register(new PlaceholderSkill("onboarding", ["onboarding"]));
74
+ registry.register(new PlaceholderSkill("seo-blog", ["blog"]));
75
+ registry.register(new PlaceholderSkill("short-form", ["shortform", "short-form"]));
76
+ registry.register(new PlaceholderSkill("sdk-request", ["sdkrequest", "sdk-request"]));
77
+ registry.register(new PlaceholderSkill("content", ["content"]));
78
+ return registry;
79
+ }
80
+ /**
81
+ * Parse the app name from the second token of a command string.
82
+ * Returns `undefined` if no second token is present.
83
+ *
84
+ * Example: `"aso fridgify"` → `"fridgify"`
85
+ */
86
+ export function parseAppNameFromCommand(text) {
87
+ const tokens = text.trim().split(/\s+/);
88
+ return tokens[1]?.toLowerCase();
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Onboarding Skill — analyzes SDK funnel data, cohort retention,
3
+ * generates hypotheses, and suggests review request timing.
4
+ *
5
+ * Ported from growth-agent `src/agents/onboarding-agent.js`.
6
+ */
7
+ import type { Skill } from "./index.js";
8
+ import type { SkillContext, SkillResult } from "../types/skill.js";
9
+ import type { AppConfig } from "../config/apps-schema.js";
10
+ interface FunnelStep {
11
+ step: string;
12
+ count: number;
13
+ rate?: number;
14
+ drop_rate?: number;
15
+ }
16
+ interface CohortEntry {
17
+ cohort_size?: number;
18
+ retention?: number[];
19
+ }
20
+ export interface OnboardingSkillDeps {
21
+ sdkCollector: {
22
+ getSummary: (appId: string, startDate: string, endDate: string) => Promise<Array<{
23
+ date: string;
24
+ installs?: number;
25
+ core_actions?: number;
26
+ subscriptions?: number;
27
+ }>>;
28
+ getFunnel: (appId: string, startDate: string, endDate: string) => Promise<{
29
+ funnel: FunnelStep[];
30
+ overall_conversion: number;
31
+ }>;
32
+ getCohort: (appId: string, startDate: string, endDate: string, opts: {
33
+ granularity: string;
34
+ }) => Promise<CohortEntry[]>;
35
+ };
36
+ }
37
+ export declare class OnboardingSkill implements Skill {
38
+ readonly name = "onboarding";
39
+ readonly commands: readonly ["onboarding"];
40
+ private readonly deps;
41
+ constructor(deps: OnboardingSkillDeps);
42
+ dispatch(ctx: SkillContext, text: string): Promise<SkillResult>;
43
+ analyzeOnboarding(ctx: SkillContext, app: AppConfig, startDate: string, endDate: string): Promise<SkillResult>;
44
+ private collectSummary;
45
+ private fetchFunnel;
46
+ private simplifyFunnel;
47
+ private deriveConversionRates;
48
+ private findWorstDropoff;
49
+ private analyzeCohortRetention;
50
+ private formatRate;
51
+ private formatCohortRetention;
52
+ private formatFunnelTable;
53
+ private generateHypotheses;
54
+ private suggestReviewRequestTiming;
55
+ private buildSummary;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/skills/onboarding.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAa1D,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE;QACZ,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;QACtK,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;YAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAAC,kBAAkB,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChI,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;KACzH,CAAC;CACH;AAED,qBAAa,eAAgB,YAAW,KAAK;IAC3C,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,QAAQ,0BAA2B;IAE5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;gBAE/B,IAAI,EAAE,mBAAmB;IAI/B,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoB/D,iBAAiB,CACrB,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;YAuDT,cAAc;YA0Bd,WAAW;IAczB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,gBAAgB;YAQV,sBAAsB;IAkCpC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,iBAAiB;YAOX,kBAAkB;YA+BlB,0BAA0B;IAqBxC,OAAO,CAAC,YAAY;CAsDrB"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Onboarding Skill — analyzes SDK funnel data, cohort retention,
3
+ * generates hypotheses, and suggests review request timing.
4
+ *
5
+ * Ported from growth-agent `src/agents/onboarding-agent.js`.
6
+ */
7
+ import { parseAppNameFromCommand } from "./index.js";
8
+ import { upsertSdkEvent } from "../db/queries.js";
9
+ import { preparePrompt } from "../prompts/loader.js";
10
+ import { warn as logWarn } from "../utils/logger.js";
11
+ const DEFAULT_DROPOFF_THRESHOLD = 0.5;
12
+ const RETENTION_PERIODS = [
13
+ { period: 7, index: 1 },
14
+ { period: 14, index: 2 },
15
+ { period: 28, index: 4 },
16
+ ];
17
+ export class OnboardingSkill {
18
+ name = "onboarding";
19
+ commands = ["onboarding"];
20
+ deps;
21
+ constructor(deps) {
22
+ this.deps = deps;
23
+ }
24
+ async dispatch(ctx, text) {
25
+ const appName = parseAppNameFromCommand(text);
26
+ const app = appName
27
+ ? ctx.apps.find((a) => a.id.toLowerCase() === appName)
28
+ : ctx.apps[0];
29
+ if (!app) {
30
+ return {
31
+ summary: appName ? `❌ App "${appName}" not found.` : "❌ No apps configured.",
32
+ alerts: [],
33
+ approvals: [],
34
+ };
35
+ }
36
+ const now = new Date();
37
+ const endDate = now.toISOString().slice(0, 10);
38
+ const startDate = new Date(now.getTime() - 7 * 86_400_000).toISOString().slice(0, 10);
39
+ return this.analyzeOnboarding(ctx, app, startDate, endDate);
40
+ }
41
+ async analyzeOnboarding(ctx, app, startDate, endDate) {
42
+ const alerts = [];
43
+ // 1. Collect summary → persist to DB
44
+ await this.collectSummary(ctx, app, startDate, endDate);
45
+ // 2. Funnel analysis
46
+ const funnelData = await this.fetchFunnel(app, startDate, endDate);
47
+ const funnel = this.simplifyFunnel(funnelData.funnel);
48
+ const conversionRates = this.deriveConversionRates(funnelData.funnel);
49
+ // 3. Dropoff alert
50
+ const worst = this.findWorstDropoff(funnelData.funnel);
51
+ if (worst && (worst.drop_rate ?? 0) > DEFAULT_DROPOFF_THRESHOLD) {
52
+ alerts.push({
53
+ severity: "high",
54
+ message: `High dropoff at "${worst.step}": ${((worst.drop_rate ?? 0) * 100).toFixed(1)}%`,
55
+ });
56
+ }
57
+ // 4. Cohort retention
58
+ const cohortRetention = await this.analyzeCohortRetention(app, startDate, endDate);
59
+ // 5. Hypotheses + SDK requests via Claude
60
+ let hypotheses = [];
61
+ let sdkRequests = [];
62
+ if (funnelData.funnel.length > 0) {
63
+ const analysis = await this.generateHypotheses(ctx, app, funnelData, conversionRates, cohortRetention);
64
+ hypotheses = analysis.hypotheses;
65
+ sdkRequests = analysis.sdkRequests;
66
+ }
67
+ // 6. Review request timing
68
+ const reviewTiming = await this.suggestReviewRequestTiming(ctx, app, conversionRates, cohortRetention);
69
+ // 7. SDK request approvals for the orchestrator pipeline
70
+ const approvals = [];
71
+ for (const req of sdkRequests) {
72
+ approvals.push({
73
+ id: `sdk-${app.id}-${req.event_name}`,
74
+ description: `Add \`${req.event_name}\` event (${req.purpose ?? ""})`,
75
+ agent: "sdk-request",
76
+ payload: req,
77
+ });
78
+ }
79
+ // 8. Summary
80
+ const summary = this.buildSummary(app, alerts, funnel, conversionRates, funnelData.overall_conversion, cohortRetention, hypotheses, reviewTiming);
81
+ return { summary, alerts, approvals };
82
+ }
83
+ async collectSummary(ctx, app, startDate, endDate) {
84
+ try {
85
+ const appId = app.eodinSdkAppId ?? app.id;
86
+ const rows = await this.deps.sdkCollector.getSummary(appId, startDate, endDate);
87
+ for (const row of rows) {
88
+ if (!row.date)
89
+ continue;
90
+ if (typeof row.installs === "number") {
91
+ upsertSdkEvent(ctx.db, { app_id: app.id, event_name: "install", count: row.installs, date: row.date });
92
+ }
93
+ if (typeof row.core_actions === "number") {
94
+ upsertSdkEvent(ctx.db, { app_id: app.id, event_name: "signup", count: row.core_actions, date: row.date });
95
+ }
96
+ if (typeof row.subscriptions === "number") {
97
+ upsertSdkEvent(ctx.db, { app_id: app.id, event_name: "subscription", count: row.subscriptions, date: row.date });
98
+ }
99
+ }
100
+ }
101
+ catch (err) {
102
+ logWarn(`[onboarding] Summary fetch failed: ${err instanceof Error ? err.message : String(err)}`);
103
+ }
104
+ }
105
+ async fetchFunnel(app, startDate, endDate) {
106
+ try {
107
+ const appId = app.eodinSdkAppId ?? app.id;
108
+ return await this.deps.sdkCollector.getFunnel(appId, startDate, endDate);
109
+ }
110
+ catch (err) {
111
+ logWarn(`[onboarding] Funnel fetch failed: ${err instanceof Error ? err.message : String(err)}`);
112
+ return { funnel: [], overall_conversion: 0 };
113
+ }
114
+ }
115
+ simplifyFunnel(steps) {
116
+ if (!steps.length)
117
+ return { install: 0, signup: 0, subscription: 0 };
118
+ const stepCount = (...names) => {
119
+ for (const name of names) {
120
+ const match = steps.find((s) => s.step === name);
121
+ if (match)
122
+ return match.count;
123
+ }
124
+ return 0;
125
+ };
126
+ return {
127
+ install: stepCount("app_install", "install"),
128
+ signup: stepCount("core_action", "app_open"),
129
+ subscription: stepCount("subscribe_start", "subscription"),
130
+ };
131
+ }
132
+ deriveConversionRates(steps) {
133
+ if (!steps.length)
134
+ return { installToSignup: null, signupToSubscription: null };
135
+ const stepCount = (...names) => {
136
+ for (const name of names) {
137
+ const match = steps.find((s) => s.step === name);
138
+ if (match)
139
+ return match.count;
140
+ }
141
+ return 0;
142
+ };
143
+ const install = stepCount("app_install", "install");
144
+ const activation = stepCount("core_action", "app_open");
145
+ const subscription = stepCount("subscribe_start", "subscription");
146
+ return {
147
+ installToSignup: install > 0 ? activation / install : null,
148
+ signupToSubscription: activation > 0 ? subscription / activation : null,
149
+ };
150
+ }
151
+ findWorstDropoff(steps) {
152
+ if (steps.length <= 1)
153
+ return null;
154
+ return steps.slice(1).reduce((worst, s) => (!worst || (s.drop_rate ?? 0) > (worst.drop_rate ?? 0) ? s : worst), null);
155
+ }
156
+ async analyzeCohortRetention(app, startDate, endDate) {
157
+ try {
158
+ const appId = app.eodinSdkAppId ?? app.id;
159
+ const cohorts = await this.deps.sdkCollector.getCohort(appId, startDate, endDate, { granularity: "weekly" });
160
+ if (!cohorts?.length)
161
+ return null;
162
+ return RETENTION_PERIODS
163
+ .map(({ period, index }) => {
164
+ const valid = cohorts.filter((c) => Array.isArray(c.retention) && c.retention[index] != null);
165
+ if (!valid.length)
166
+ return null;
167
+ const totalSize = valid.reduce((sum, c) => sum + (c.cohort_size ?? 0), 0);
168
+ if (totalSize <= 0)
169
+ return null;
170
+ const weightedRetained = valid.reduce((sum, c) => sum + (c.cohort_size ?? 0) * (c.retention[index]), 0);
171
+ return { period, cohortSize: totalSize, retained: Math.round(weightedRetained), rate: weightedRetained / totalSize };
172
+ })
173
+ .filter((c) => c !== null);
174
+ }
175
+ catch (err) {
176
+ logWarn(`[onboarding] Cohort analysis failed: ${err instanceof Error ? err.message : String(err)}`);
177
+ return null;
178
+ }
179
+ }
180
+ formatRate(rate) {
181
+ return rate != null ? (rate * 100).toFixed(1) + "%" : "N/A";
182
+ }
183
+ formatCohortRetention(cohort) {
184
+ if (!cohort?.length)
185
+ return "No data";
186
+ return cohort
187
+ .map((c) => `- D${String(c.period)}: ${(c.rate * 100).toFixed(1)}% (${String(c.retained)}/${String(c.cohortSize)})`)
188
+ .join("\n");
189
+ }
190
+ formatFunnelTable(steps) {
191
+ if (!steps.length)
192
+ return "No data";
193
+ return steps
194
+ .map((s) => `- ${s.step}: ${String(s.count)} (rate ${((s.rate ?? 0) * 100).toFixed(1)}%, drop ${((s.drop_rate ?? 0) * 100).toFixed(1)}%)`)
195
+ .join("\n");
196
+ }
197
+ async generateHypotheses(ctx, app, funnelData, conversionRates, cohortRetention) {
198
+ const prompt = preparePrompt("onboarding-hypotheses", {
199
+ appName: app.name,
200
+ funnelTable: this.formatFunnelTable(funnelData.funnel),
201
+ overallConversion: this.formatRate(funnelData.overall_conversion),
202
+ installToSignup: this.formatRate(conversionRates.installToSignup),
203
+ signupToSubscription: this.formatRate(conversionRates.signupToSubscription),
204
+ cohortRetention: this.formatCohortRetention(cohortRetention),
205
+ });
206
+ try {
207
+ const raw = await ctx.runClaude(prompt);
208
+ const result = JSON.parse(raw);
209
+ return {
210
+ hypotheses: result.hypotheses ?? [],
211
+ sdkRequests: (result.sdkRequests ?? []).map((r) => ({ ...r, source: "onboarding" })),
212
+ };
213
+ }
214
+ catch {
215
+ return { hypotheses: [], sdkRequests: [] };
216
+ }
217
+ }
218
+ async suggestReviewRequestTiming(ctx, app, conversionRates, cohortRetention) {
219
+ const prompt = preparePrompt("onboarding-review-timing", {
220
+ appName: app.name,
221
+ installToSignup: this.formatRate(conversionRates.installToSignup),
222
+ signupToSubscription: this.formatRate(conversionRates.signupToSubscription),
223
+ cohortRetention: this.formatCohortRetention(cohortRetention),
224
+ });
225
+ try {
226
+ const raw = await ctx.runClaude(prompt);
227
+ return JSON.parse(raw);
228
+ }
229
+ catch {
230
+ return null;
231
+ }
232
+ }
233
+ buildSummary(app, alerts, funnel, conversionRates, overallConversion, cohortRetention, hypotheses, reviewTiming) {
234
+ const header = alerts.length > 0
235
+ ? `*🟡 [Action] Onboarding — ${app.name}*`
236
+ : `*🟢 Onboarding — ${app.name}*`;
237
+ const cr = conversionRates;
238
+ const metricLines = [];
239
+ if (cr.installToSignup !== null) {
240
+ if (cr.installToSignup > 1) {
241
+ metricLines.push(`• install ${String(funnel.install)} → activation ${String(funnel.signup)} (includes returning users)`);
242
+ }
243
+ else {
244
+ metricLines.push(`• install → activation: \`${this.formatRate(cr.installToSignup)}\``);
245
+ }
246
+ }
247
+ if (cr.signupToSubscription !== null) {
248
+ if (cr.signupToSubscription > 1) {
249
+ metricLines.push(`• activation ${String(funnel.signup)} → subscription ${String(funnel.subscription)}`);
250
+ }
251
+ else {
252
+ metricLines.push(`• activation → subscription: \`${this.formatRate(cr.signupToSubscription)}\``);
253
+ }
254
+ }
255
+ metricLines.push(`• overall conversion: \`${this.formatRate(overallConversion)}\``);
256
+ if (cohortRetention?.length) {
257
+ const d7 = cohortRetention.find((c) => c.period === 7);
258
+ if (d7)
259
+ metricLines.push(`• D7 retention: \`${(d7.rate * 100).toFixed(1)}%\``);
260
+ }
261
+ const blocks = [header];
262
+ if (metricLines.length > 0)
263
+ blocks.push(metricLines.join("\n"));
264
+ if (hypotheses.length > 0) {
265
+ const h = hypotheses[0];
266
+ blocks.push(`*Likely cause:* ${h.cause}\n*→ Suggestion:* ${h.suggestion}`);
267
+ }
268
+ if (reviewTiming?.optimalTrigger) {
269
+ blocks.push(`*Best review-request moment:* ${reviewTiming.optimalTrigger}`);
270
+ }
271
+ return blocks.join("\n\n");
272
+ }
273
+ }
274
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/skills/onboarding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Production skill registry.
3
+ *
4
+ * Creates a SkillRegistry with all 8 skills wired up. Skills that
5
+ * require collector dependencies receive empty/optional deps — they
6
+ * skip gracefully when the required collector is not configured.
7
+ *
8
+ * M7 prerequisite: replaces the M1 placeholder registry in the daemon.
9
+ */
10
+ import { SkillRegistry } from "./index.js";
11
+ import type { AdariaConfig } from "../config/schema.js";
12
+ /**
13
+ * Build the production skill registry with all skills registered.
14
+ *
15
+ * Skills that require external collectors (ASO, Review, Onboarding)
16
+ * are constructed with empty/optional deps. They throw at dispatch
17
+ * time if the required collector is missing, which the orchestrator's
18
+ * `timedRun` handles as a graceful skip.
19
+ *
20
+ * Skills that work without external deps (Content, SdkRequest) are
21
+ * always functional.
22
+ */
23
+ export declare function createProductionRegistry(config: AdariaConfig): SkillRegistry;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,GACnB,aAAa,CAsDf"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Production skill registry.
3
+ *
4
+ * Creates a SkillRegistry with all 8 skills wired up. Skills that
5
+ * require collector dependencies receive empty/optional deps — they
6
+ * skip gracefully when the required collector is not configured.
7
+ *
8
+ * M7 prerequisite: replaces the M1 placeholder registry in the daemon.
9
+ */
10
+ import { SkillRegistry } from "./index.js";
11
+ import { AsoSkill } from "./aso.js";
12
+ import { ReviewSkill } from "./review.js";
13
+ import { OnboardingSkill } from "./onboarding.js";
14
+ import { SeoBlogSkill } from "./seo-blog.js";
15
+ import { ShortFormSkill } from "./short-form.js";
16
+ import { SdkRequestSkill } from "./sdk-request.js";
17
+ import { ContentSkill } from "./content.js";
18
+ import { SocialPublishSkill } from "./social-publish.js";
19
+ /**
20
+ * Build the production skill registry with all skills registered.
21
+ *
22
+ * Skills that require external collectors (ASO, Review, Onboarding)
23
+ * are constructed with empty/optional deps. They throw at dispatch
24
+ * time if the required collector is missing, which the orchestrator's
25
+ * `timedRun` handles as a graceful skip.
26
+ *
27
+ * Skills that work without external deps (Content, SdkRequest) are
28
+ * always functional.
29
+ */
30
+ export function createProductionRegistry(config) {
31
+ const registry = new SkillRegistry();
32
+ // Skills with optional/empty deps — skip if collectors not configured
33
+ registry.register(new AsoSkill({
34
+ asoMobile: {
35
+ getKeywordRankings: () => Promise.reject(new Error("ASO collector not configured")),
36
+ getKeywordSuggestions: () => Promise.reject(new Error("ASO collector not configured")),
37
+ getCompetitorInfo: () => Promise.reject(new Error("ASO collector not configured")),
38
+ },
39
+ }));
40
+ registry.register(new ReviewSkill({}));
41
+ registry.register(new OnboardingSkill({
42
+ sdkCollector: {
43
+ getSummary: () => Promise.reject(new Error("SDK collector not configured")),
44
+ getFunnel: () => Promise.reject(new Error("SDK collector not configured")),
45
+ getCohort: () => Promise.reject(new Error("SDK collector not configured")),
46
+ },
47
+ }));
48
+ registry.register(new SeoBlogSkill({}));
49
+ registry.register(new ShortFormSkill({}));
50
+ // Skills without external deps
51
+ registry.register(new SdkRequestSkill());
52
+ registry.register(new ContentSkill());
53
+ // Social publish skill
54
+ registry.register(new SocialPublishSkill({
55
+ socialConfigs: {
56
+ twitter: config.social.twitter,
57
+ facebook: config.social.facebook,
58
+ threads: config.social.threads,
59
+ tiktok: config.social.tiktok,
60
+ youtube: config.social.youtube,
61
+ linkedin: config.social.linkedin,
62
+ },
63
+ }));
64
+ return registry;
65
+ }
66
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CACf,IAAI,QAAQ,CAAC;QACX,SAAS,EAAE;YACT,kBAAkB,EAAE,GAAG,EAAE,CACvB,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC3D,qBAAqB,EAAE,GAAG,EAAE,CAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC3D,iBAAiB,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAC5D;KACF,CAAC,CACH,CAAC;IAEF,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvC,QAAQ,CAAC,QAAQ,CACf,IAAI,eAAe,CAAC;QAClB,YAAY,EAAE;YACZ,UAAU,EAAE,GAAG,EAAE,CACf,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC3D,SAAS,EAAE,GAAG,EAAE,CACd,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC3D,SAAS,EAAE,GAAG,EAAE,CACd,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAC5D;KACF,CAAC,CACH,CAAC;IAEF,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IAEtC,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,CACf,IAAI,kBAAkB,CAAC;QACrB,aAAa,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;YAChC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;YAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;SACjC;KACF,CAAC,CACH,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Review Skill — collects reviews, analyzes sentiment, clusters
3
+ * complaints, and generates reply drafts.
4
+ *
5
+ * Ported from growth-agent `src/agents/review-agent.js`.
6
+ */
7
+ import type { Skill } from "./index.js";
8
+ import type { SkillContext, SkillResult } from "../types/skill.js";
9
+ import type { AppConfig } from "../config/apps-schema.js";
10
+ import type { StoreReview } from "../types/collectors.js";
11
+ export interface ReviewSkillDeps {
12
+ appStore?: {
13
+ getReviews: (appId: string) => Promise<StoreReview[]>;
14
+ };
15
+ playStore?: {
16
+ getReviews: (packageName: string) => Promise<StoreReview[]>;
17
+ };
18
+ }
19
+ export declare class ReviewSkill implements Skill {
20
+ readonly name = "review";
21
+ readonly commands: readonly ["review", "reviews"];
22
+ private readonly deps;
23
+ constructor(deps: ReviewSkillDeps);
24
+ dispatch(ctx: SkillContext, text: string): Promise<SkillResult>;
25
+ analyzeReviews(ctx: SkillContext, app: AppConfig): Promise<SkillResult>;
26
+ private collectReviews;
27
+ private analyzeSentiment;
28
+ private getSentimentStats;
29
+ private clusterReviews;
30
+ private generateReplyDrafts;
31
+ private buildSummary;
32
+ }
33
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/skills/review.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AA4B1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE;QAAE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;KAAE,CAAC;IACrE,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;KAAE,CAAC;CAC7E;AAED,qBAAa,WAAY,YAAW,KAAK;IACvC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,QAAQ,iCAAkC;IAEnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;gBAE3B,IAAI,EAAE,eAAe;IAI3B,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmB/D,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;YA0D/D,cAAc;YA6Cd,gBAAgB;IAiC9B,OAAO,CAAC,iBAAiB;YAeX,cAAc;YA0Bd,mBAAmB;IAkCjC,OAAO,CAAC,YAAY;CA2BrB"}