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,198 @@
1
+ /**
2
+ * Shared types for data collectors.
3
+ *
4
+ * These interfaces are the "wire format" between collectors and skills: once
5
+ * a collector returns one of these, downstream code (skills, DB layer) can
6
+ * rely on shape stability. Platform-specific response shapes (App Store
7
+ * Connect JSON:API, Google Play Developer API, etc.) stay encapsulated
8
+ * inside the respective collector.
9
+ *
10
+ * ## Wire shape deltas from growth-agent (M2 porting notes)
11
+ *
12
+ * adaria-ai collectors intentionally diverge from growth-agent's JS wire
13
+ * format in three ways. Skills ported in M4+ must read the new names:
14
+ *
15
+ * 1. **camelCase everywhere.** growth-agent returned `{review_id, created_at}`;
16
+ * adaria-ai returns `{reviewId, createdAt}`. The DB layer (M3) owns the
17
+ * camelCase → snake_case mapping at insert time so that SQLite column
18
+ * names stay conventional.
19
+ * 2. **Flattened `AppStoreLocalization`.** growth-agent returned the raw
20
+ * App Store Connect JSON:API object (`{id, attributes: {name, ...}}`);
21
+ * adaria-ai flattens it so consumers read `loc.name` directly. M4 ASO
22
+ * prompt builders should not do `loc.attributes.name`.
23
+ * 3. **`RateLimitError.retryAfterSeconds`.** growth-agent's field was
24
+ * `retryAfter`; renamed for clarity and moved from
25
+ * `src/collectors/errors.js` to `src/utils/errors.ts`.
26
+ */
27
+ /**
28
+ * Unified customer review shape across App Store and Google Play.
29
+ *
30
+ * Note the camelCase field names — see file header for rationale.
31
+ */
32
+ export interface StoreReview {
33
+ reviewId: string;
34
+ rating: number;
35
+ body: string;
36
+ /** ISO-8601 timestamp, or null when the upstream API omits it. */
37
+ createdAt: string | null;
38
+ }
39
+ /**
40
+ * App Store Connect localized app metadata (title/subtitle/keywords/description).
41
+ * Used for ASO analysis and (approval-gated) metadata updates.
42
+ *
43
+ * This is a **flattened** view of the underlying JSON:API `appInfoLocalization`
44
+ * resource. See the wire shape delta note in the file header.
45
+ */
46
+ export interface AppStoreLocalization {
47
+ id: string;
48
+ locale: string;
49
+ name: string;
50
+ subtitle: string;
51
+ keywords: string;
52
+ description: string;
53
+ }
54
+ /**
55
+ * Arguments for an App Store Connect metadata update. All fields optional —
56
+ * only provided fields are patched.
57
+ */
58
+ export interface AppStoreLocalizationUpdate {
59
+ name?: string;
60
+ subtitle?: string;
61
+ keywords?: string;
62
+ description?: string;
63
+ }
64
+ /**
65
+ * Daily/weekly/monthly aggregate row from the Eodin SDK analytics API.
66
+ *
67
+ * Wire field names are upstream-native snake_case (the Eodin API returns
68
+ * `core_actions`, `paywall_views`) — see file header for the camelCase
69
+ * rule. We keep the snake_case here because these map 1:1 to column names
70
+ * in the `sdk_events` table that M3 will provision; consumers pay the cost
71
+ * of one inconsistency at the upstream boundary instead of a translation
72
+ * layer per skill.
73
+ */
74
+ export interface EodinSummaryRow {
75
+ date: string;
76
+ installs: number;
77
+ dau: number;
78
+ sessions: number;
79
+ core_actions: number;
80
+ paywall_views: number;
81
+ subscriptions: number;
82
+ revenue: number;
83
+ }
84
+ export interface EodinFunnelStep {
85
+ step: string;
86
+ count: number;
87
+ rate: number;
88
+ drop_rate: number;
89
+ }
90
+ export interface EodinFunnelData {
91
+ funnel: EodinFunnelStep[];
92
+ overall_conversion: number;
93
+ }
94
+ export interface EodinCohort {
95
+ cohort_date: string;
96
+ cohort_size: number;
97
+ /** Always normalized to fractions in [0, 1]. */
98
+ retention: number[];
99
+ }
100
+ export interface AsoKeywordRanking {
101
+ keyword: string;
102
+ /** Current rank (1 = best), or null if unranked in the top N. */
103
+ rank: number | null;
104
+ searchVolume: number;
105
+ /** 0–100 scale competition score, or null if unknown. */
106
+ competition: number | null;
107
+ }
108
+ export interface AsoKeywordSuggestion {
109
+ keyword: string;
110
+ searchVolume: number;
111
+ competition: number | null;
112
+ }
113
+ export type BlogCategory = "Philosophy" | "Product" | "Technology" | "Insights" | "Ethics" | "Design";
114
+ export type BlogStatus = "DRAFT" | "PUBLISHED" | "ARCHIVED";
115
+ export interface BlogPostDraft {
116
+ slug: string;
117
+ title: string;
118
+ description: string;
119
+ category: BlogCategory;
120
+ content: string;
121
+ thumbnail?: string;
122
+ readTime?: string;
123
+ }
124
+ export interface BlogPostUpdate {
125
+ title?: string;
126
+ description?: string;
127
+ category?: BlogCategory;
128
+ content?: string;
129
+ thumbnail?: string;
130
+ readTime?: string;
131
+ status?: BlogStatus;
132
+ }
133
+ export interface BlogListOptions {
134
+ status?: BlogStatus;
135
+ category?: BlogCategory;
136
+ page?: number;
137
+ limit?: number;
138
+ }
139
+ export interface BlogListResponse {
140
+ data: {
141
+ slug: string;
142
+ title?: string;
143
+ status?: BlogStatus;
144
+ }[];
145
+ pagination?: {
146
+ page: number;
147
+ limit: number;
148
+ total?: number;
149
+ };
150
+ }
151
+ export type FridgifyPeriod = "week" | "month" | "quarter" | "year";
152
+ export type FridgifyPopularMetric = "likes" | "comments" | "combined";
153
+ /**
154
+ * Minimal shape for a Fridgify popular recipe. The upstream API returns a
155
+ * richer object (ingredients, instructions, `aiDescription`, `tasteProfile`,
156
+ * `imageUrl`, `stats`, `periodScore`, `cuisineTagsData`); we keep the type
157
+ * loose with an index signature so consumers can access fields that the
158
+ * M3 DB schema doesn't persist.
159
+ *
160
+ * Note that `aiDescription` is upstream-generated text that an M4 `SeoBlogSkill`
161
+ * will fold into Claude prompts — the same prompt-guard requirement as
162
+ * `AsoCompetitorInfo.description` applies there.
163
+ */
164
+ export interface FridgifyRecipe {
165
+ id: string;
166
+ name?: string;
167
+ periodScore?: number;
168
+ [key: string]: unknown;
169
+ }
170
+ export interface FridgifyCascadeResult {
171
+ period: FridgifyPeriod;
172
+ rows: FridgifyRecipe[];
173
+ /** True only if `rows.length >= minResults` for the chosen window. */
174
+ satisfied: boolean;
175
+ }
176
+ export interface YouTubeVideoStats {
177
+ videoId: string;
178
+ title: string;
179
+ publishedAt: string | null;
180
+ views: number;
181
+ likes: number;
182
+ comments: number;
183
+ /** ISO 8601 duration (`PT30S`, `PT1M10S`, …), or null if missing. */
184
+ duration: string | null;
185
+ }
186
+ export interface AsoCompetitorInfo {
187
+ title: string;
188
+ subtitle: string;
189
+ /**
190
+ * Attacker-controllable: sourced from a third-party App Store / Google Play
191
+ * listing. Skills in M4+ that forward this field into a Claude prompt MUST
192
+ * route it through `src/security/prompt-guard.ts` first — indirect prompt
193
+ * injection via competitor metadata is a realistic attack path.
194
+ */
195
+ description: string;
196
+ keywords: string[];
197
+ }
198
+ //# sourceMappingURL=collectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../src/types/collectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared types for data collectors.
3
+ *
4
+ * These interfaces are the "wire format" between collectors and skills: once
5
+ * a collector returns one of these, downstream code (skills, DB layer) can
6
+ * rely on shape stability. Platform-specific response shapes (App Store
7
+ * Connect JSON:API, Google Play Developer API, etc.) stay encapsulated
8
+ * inside the respective collector.
9
+ *
10
+ * ## Wire shape deltas from growth-agent (M2 porting notes)
11
+ *
12
+ * adaria-ai collectors intentionally diverge from growth-agent's JS wire
13
+ * format in three ways. Skills ported in M4+ must read the new names:
14
+ *
15
+ * 1. **camelCase everywhere.** growth-agent returned `{review_id, created_at}`;
16
+ * adaria-ai returns `{reviewId, createdAt}`. The DB layer (M3) owns the
17
+ * camelCase → snake_case mapping at insert time so that SQLite column
18
+ * names stay conventional.
19
+ * 2. **Flattened `AppStoreLocalization`.** growth-agent returned the raw
20
+ * App Store Connect JSON:API object (`{id, attributes: {name, ...}}`);
21
+ * adaria-ai flattens it so consumers read `loc.name` directly. M4 ASO
22
+ * prompt builders should not do `loc.attributes.name`.
23
+ * 3. **`RateLimitError.retryAfterSeconds`.** growth-agent's field was
24
+ * `retryAfter`; renamed for clarity and moved from
25
+ * `src/collectors/errors.js` to `src/utils/errors.ts`.
26
+ */
27
+ export {};
28
+ //# sourceMappingURL=collectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../src/types/collectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Skill system types.
3
+ *
4
+ * Every Mode A command dispatches through a `Skill`. Skills are heavy,
5
+ * may invoke collectors + Claude CLI + DB writes, and may produce
6
+ * approval-gated actions. They are NOT exposed as MCP tools.
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ import type { AppConfig } from "../config/apps-schema.js";
10
+ import type { AdariaConfig } from "../config/schema.js";
11
+ /**
12
+ * Shared context threaded into every skill dispatch. Constructed once
13
+ * by `AgentCore` and reused across commands within the same daemon
14
+ * lifecycle.
15
+ */
16
+ export interface SkillContext {
17
+ /** Initialized SQLite database handle. */
18
+ db: Database.Database;
19
+ /** Loaded apps from `apps.yaml`. */
20
+ apps: AppConfig[];
21
+ /** Full resolved adaria-ai config. */
22
+ config: AdariaConfig;
23
+ /**
24
+ * Invoke Claude CLI with a prompt string. Returns the response text.
25
+ * Skills call this for analysis generation (metadata proposal,
26
+ * screenshot suggestions, etc.) rather than spawning Claude directly.
27
+ */
28
+ runClaude: (prompt: string) => Promise<string>;
29
+ }
30
+ /** Alert raised by a skill — surfaced in the weekly briefing. */
31
+ export interface SkillAlert {
32
+ severity: "critical" | "high" | "medium" | "low";
33
+ message: string;
34
+ }
35
+ /** Approval item that requires human confirmation before execution. */
36
+ export interface ApprovalItem {
37
+ id: string;
38
+ description: string;
39
+ agent: string;
40
+ payload?: unknown;
41
+ }
42
+ /**
43
+ * Unified result returned by every skill dispatch.
44
+ */
45
+ export interface SkillResult {
46
+ /** Slack-formatted summary text (mrkdwn). */
47
+ summary: string;
48
+ /** Alerts for the weekly briefing / monitor threshold checks. */
49
+ alerts: SkillAlert[];
50
+ /** Approval items requiring human confirmation. */
51
+ approvals: ApprovalItem[];
52
+ }
53
+ /**
54
+ * Skills with approval-gated write paths implement this interface.
55
+ * `core.ts` calls `executePost` when an approval button is clicked.
56
+ */
57
+ export interface ExecutableSkill {
58
+ executePost(ctx: SkillContext, payload: unknown): Promise<void>;
59
+ }
60
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,oCAAoC;IACpC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,sCAAsC;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,mDAAmD;IACnD,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Skill system types.
3
+ *
4
+ * Every Mode A command dispatches through a `Skill`. Skills are heavy,
5
+ * may invoke collectors + Claude CLI + DB writes, and may produce
6
+ * approval-gated actions. They are NOT exposed as MCP tools.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,26 @@
1
+ export type CircuitState = "CLOSED" | "OPEN" | "HALF_OPEN";
2
+ export interface CircuitBreakerOptions {
3
+ /** Number of failures before opening the circuit (default: 5) */
4
+ failureThreshold?: number;
5
+ /** Time in ms to wait before transitioning from OPEN to HALF_OPEN (default: 60000) */
6
+ resetTimeout?: number;
7
+ /** Number of successful calls in HALF_OPEN to close the circuit (default: 1) */
8
+ halfOpenSuccessThreshold?: number;
9
+ }
10
+ export declare class CircuitBreaker {
11
+ private state;
12
+ private failureCount;
13
+ private successCount;
14
+ private lastFailureTime;
15
+ private readonly failureThreshold;
16
+ private readonly resetTimeout;
17
+ private readonly halfOpenSuccessThreshold;
18
+ constructor(options?: CircuitBreakerOptions);
19
+ getState(): CircuitState;
20
+ execute<T>(fn: () => Promise<T>): Promise<T>;
21
+ private onSuccess;
22
+ private onFailure;
23
+ /** Reset the circuit breaker to CLOSED state */
24
+ reset(): void;
25
+ }
26
+ //# sourceMappingURL=circuit-breaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/utils/circuit-breaker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;gBAEtC,OAAO,CAAC,EAAE,qBAAqB;IAM3C,QAAQ,IAAI,YAAY;IAWlB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBlD,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAYjB,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,67 @@
1
+ export class CircuitBreaker {
2
+ state = "CLOSED";
3
+ failureCount = 0;
4
+ successCount = 0;
5
+ lastFailureTime = 0;
6
+ failureThreshold;
7
+ resetTimeout;
8
+ halfOpenSuccessThreshold;
9
+ constructor(options) {
10
+ this.failureThreshold = options?.failureThreshold ?? 5;
11
+ this.resetTimeout = options?.resetTimeout ?? 60_000;
12
+ this.halfOpenSuccessThreshold = options?.halfOpenSuccessThreshold ?? 1;
13
+ }
14
+ getState() {
15
+ if (this.state === "OPEN" &&
16
+ Date.now() - this.lastFailureTime >= this.resetTimeout) {
17
+ this.state = "HALF_OPEN";
18
+ this.successCount = 0;
19
+ }
20
+ return this.state;
21
+ }
22
+ async execute(fn) {
23
+ const currentState = this.getState();
24
+ if (currentState === "OPEN") {
25
+ throw new Error("Circuit breaker is OPEN — request blocked");
26
+ }
27
+ try {
28
+ const result = await fn();
29
+ this.onSuccess();
30
+ return result;
31
+ }
32
+ catch (error) {
33
+ this.onFailure();
34
+ throw error;
35
+ }
36
+ }
37
+ onSuccess() {
38
+ if (this.state === "HALF_OPEN") {
39
+ this.successCount++;
40
+ if (this.successCount >= this.halfOpenSuccessThreshold) {
41
+ this.state = "CLOSED";
42
+ this.failureCount = 0;
43
+ this.successCount = 0;
44
+ }
45
+ }
46
+ else {
47
+ this.failureCount = 0;
48
+ }
49
+ }
50
+ onFailure() {
51
+ this.failureCount++;
52
+ this.lastFailureTime = Date.now();
53
+ if (this.state === "HALF_OPEN" ||
54
+ this.failureCount >= this.failureThreshold) {
55
+ this.state = "OPEN";
56
+ this.successCount = 0;
57
+ }
58
+ }
59
+ /** Reset the circuit breaker to CLOSED state */
60
+ reset() {
61
+ this.state = "CLOSED";
62
+ this.failureCount = 0;
63
+ this.successCount = 0;
64
+ this.lastFailureTime = 0;
65
+ }
66
+ }
67
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/utils/circuit-breaker.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,cAAc;IACjB,KAAK,GAAiB,QAAQ,CAAC;IAC/B,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,GAAG,CAAC,CAAC;IACjB,eAAe,GAAG,CAAC,CAAC;IACX,gBAAgB,CAAS;IACzB,YAAY,CAAS;IACrB,wBAAwB,CAAS;IAElD,YAAY,OAA+B;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,MAAM,CAAC;QACpD,IAAI,CAAC,wBAAwB,GAAG,OAAO,EAAE,wBAAwB,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,QAAQ;QACN,IACE,IAAI,CAAC,KAAK,KAAK,MAAM;YACrB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,EACtD,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAErC,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBACvD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IACE,IAAI,CAAC,KAAK,KAAK,WAAW;YAC1B,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAC1C,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Unified error hierarchy for adaria-ai.
3
+ * Each error carries a machine-readable code and a user-friendly message.
4
+ */
5
+ interface ErrorCtorOptions {
6
+ code?: string;
7
+ userMessage?: string;
8
+ cause?: unknown;
9
+ }
10
+ export declare class AdariaError extends Error {
11
+ readonly code: string;
12
+ readonly userMessage: string;
13
+ constructor(message: string, options?: ErrorCtorOptions);
14
+ }
15
+ export declare class AuthError extends AdariaError {
16
+ constructor(message: string, options?: ErrorCtorOptions);
17
+ }
18
+ export declare class ToolError extends AdariaError {
19
+ constructor(message: string, options?: ErrorCtorOptions);
20
+ }
21
+ export declare class ConfigError extends AdariaError {
22
+ constructor(message: string, options?: ErrorCtorOptions);
23
+ }
24
+ export interface ExternalApiErrorOptions extends ErrorCtorOptions {
25
+ statusCode?: number;
26
+ }
27
+ export declare class ExternalApiError extends AdariaError {
28
+ readonly statusCode: number | undefined;
29
+ constructor(message: string, options?: ExternalApiErrorOptions);
30
+ }
31
+ export interface RateLimitErrorOptions extends ErrorCtorOptions {
32
+ retryAfterSeconds?: number;
33
+ }
34
+ export declare class RateLimitError extends AdariaError {
35
+ readonly retryAfterSeconds: number;
36
+ constructor(message: string, options?: RateLimitErrorOptions);
37
+ }
38
+ export declare class TimeoutError extends AdariaError {
39
+ constructor(message: string, options?: ErrorCtorOptions);
40
+ }
41
+ /** Returns a user-friendly message for any error. */
42
+ export declare function getUserMessage(error: unknown): string;
43
+ export {};
44
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAMD,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAMxD;AAcD,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAWxD;AAED,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAWxD;AAED,qBAAa,WAAY,SAAQ,WAAW;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAWxD;AAED,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB;CAY/D;AAED,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;CAY7D;AAED,qBAAa,YAAa,SAAQ,WAAW;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;CAWxD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Unified error hierarchy for adaria-ai.
3
+ * Each error carries a machine-readable code and a user-friendly message.
4
+ */
5
+ function buildErrorOptions(cause) {
6
+ return cause !== undefined ? { cause } : {};
7
+ }
8
+ export class AdariaError extends Error {
9
+ code;
10
+ userMessage;
11
+ constructor(message, options) {
12
+ super(message, buildErrorOptions(options?.cause));
13
+ this.name = "AdariaError";
14
+ this.code = options?.code ?? "ADARIA_ERROR";
15
+ this.userMessage = options?.userMessage ?? message;
16
+ }
17
+ }
18
+ function withDefaults(options, defaultCode, defaultUserMessage) {
19
+ return {
20
+ code: options?.code ?? defaultCode,
21
+ userMessage: options?.userMessage ?? defaultUserMessage,
22
+ ...(options?.cause !== undefined ? { cause: options.cause } : {}),
23
+ };
24
+ }
25
+ export class AuthError extends AdariaError {
26
+ constructor(message, options) {
27
+ super(message, withDefaults(options, "AUTH_ERROR", "Authentication failed. Please check your credentials."));
28
+ this.name = "AuthError";
29
+ }
30
+ }
31
+ export class ToolError extends AdariaError {
32
+ constructor(message, options) {
33
+ super(message, withDefaults(options, "TOOL_ERROR", "A tool operation failed. Please try again."));
34
+ this.name = "ToolError";
35
+ }
36
+ }
37
+ export class ConfigError extends AdariaError {
38
+ constructor(message, options) {
39
+ super(message, withDefaults(options, "CONFIG_ERROR", 'Configuration error. Run "adaria-ai init" to fix.'));
40
+ this.name = "ConfigError";
41
+ }
42
+ }
43
+ export class ExternalApiError extends AdariaError {
44
+ statusCode;
45
+ constructor(message, options) {
46
+ super(message, withDefaults(options, "EXTERNAL_API_ERROR", "An external service is temporarily unavailable."));
47
+ this.name = "ExternalApiError";
48
+ this.statusCode = options?.statusCode;
49
+ }
50
+ }
51
+ export class RateLimitError extends AdariaError {
52
+ retryAfterSeconds;
53
+ constructor(message, options) {
54
+ super(message, withDefaults(options, "RATE_LIMIT_ERROR", "Upstream service rate limited us. Retrying shortly."));
55
+ this.name = "RateLimitError";
56
+ this.retryAfterSeconds = options?.retryAfterSeconds ?? 60;
57
+ }
58
+ }
59
+ export class TimeoutError extends AdariaError {
60
+ constructor(message, options) {
61
+ super(message, withDefaults(options, "TIMEOUT_ERROR", "The operation timed out. Please try again."));
62
+ this.name = "TimeoutError";
63
+ }
64
+ }
65
+ /** Returns a user-friendly message for any error. */
66
+ export function getUserMessage(error) {
67
+ if (error instanceof AdariaError) {
68
+ return error.userMessage;
69
+ }
70
+ if (error instanceof Error) {
71
+ return error.message;
72
+ }
73
+ return String(error);
74
+ }
75
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Escapes a string for use inside AppleScript double-quoted strings.
3
+ * Handles: backslash, double quotes, backticks, and $() subshell expressions.
4
+ */
5
+ export declare function escapeAppleScript(str: string): string;
6
+ /**
7
+ * Escapes a string for use as a POSIX shell argument.
8
+ * Wraps in single quotes and handles embedded single quotes.
9
+ */
10
+ export declare function escapeShellArg(str: string): string;
11
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/utils/escape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Escapes a string for use inside AppleScript double-quoted strings.
3
+ * Handles: backslash, double quotes, backticks, and $() subshell expressions.
4
+ */
5
+ export function escapeAppleScript(str) {
6
+ return str
7
+ .replace(/\\/g, "\\\\")
8
+ .replace(/"/g, '\\"')
9
+ .replace(/`/g, "\\`")
10
+ .replace(/\$/g, "\\$");
11
+ }
12
+ /**
13
+ * Escapes a string for use as a POSIX shell argument.
14
+ * Wraps in single quotes and handles embedded single quotes.
15
+ */
16
+ export function escapeShellArg(str) {
17
+ return `'${str.replace(/'/g, "'\\''")}'`;
18
+ }
19
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/utils/escape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ export declare function setLogLevel(level: LogLevel): void;
3
+ export declare function setCorrelationId(id: string | undefined): void;
4
+ export declare function generateCorrelationId(): string;
5
+ export declare function getCorrelationId(): string | undefined;
6
+ export declare function log(level: LogLevel, message: string, extra?: Record<string, unknown>): void;
7
+ export declare function debug(message: string, extra?: Record<string, unknown>): void;
8
+ export declare function info(message: string, extra?: Record<string, unknown>): void;
9
+ export declare function warn(message: string, extra?: Record<string, unknown>): void;
10
+ export declare function error(message: string, extra?: Record<string, unknown>): void;
11
+ export declare function recordRequest(): void;
12
+ export declare function recordError(): void;
13
+ export declare function recordResponseTime(ms: number): void;
14
+ export declare function getMetrics(): {
15
+ requestCount: number;
16
+ errorCount: number;
17
+ avgResponseTimeMs: number;
18
+ };
19
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA0B3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAwBD,wBAAgB,GAAG,CACjB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAQN;AAED,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAEN;AAED,wBAAgB,IAAI,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAEN;AAED,wBAAgB,IAAI,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAEN;AAED,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAEN;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CASA"}