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,527 @@
1
+ /**
2
+ * Agent core — message dispatch and Claude orchestration.
3
+ *
4
+ * Ports pilot-ai's `src/agent/core.ts` with the major trim called for in
5
+ * the milestone checklist:
6
+ *
7
+ * Drop: project resolver, md-based skills loader, project-scoped memory,
8
+ * Google/GitHub auth checks, OAuth token refresher, macOS
9
+ * permission watcher, preference detector, project analyzer,
10
+ * MCP install migrator, memory-command intercept, Anthropic API
11
+ * fallback path.
12
+ *
13
+ * Keep: auth check, audit log, thinking reactions, status message
14
+ * evolution, session continuity, error differentiation,
15
+ * msg_too_long fallback, MCP context builder, tool-descriptions
16
+ * injection, MCP server health check.
17
+ *
18
+ * Added for adaria-ai:
19
+ *
20
+ * - Mode A / Mode B split. A `SkillRegistry` is checked first; if a
21
+ * skill matches the first token of the message, it handles the
22
+ * dispatch directly and Claude is not invoked. Otherwise we fall
23
+ * through to Mode B, which is an MCP-tool-aware Claude CLI call
24
+ * (empty MCP tool set in M1, 4 marketing tools in M5.5).
25
+ * - `mcpManager` and `skillRegistry` are constructor-injectable so
26
+ * tests can pass mocks and M4/M5 can swap the M1 placeholder
27
+ * registry for real skills without touching core.ts.
28
+ * - `AdariaError` (not `PilotError`) for the error-differentiation path.
29
+ */
30
+ import crypto from "node:crypto";
31
+ import { isAuthorizedUser } from "../security/auth.js";
32
+ import { wrapToolOutput } from "../security/prompt-guard.js";
33
+ import { writeAuditLog } from "./audit.js";
34
+ import { invokeClaudeCli } from "./claude.js";
35
+ import { ApprovalManager } from "./safety.js";
36
+ import { buildMemoryContext } from "./memory.js";
37
+ import { buildToolDescriptions } from "./tool-descriptions.js";
38
+ import { McpManager } from "./mcp-manager.js";
39
+ import { cleanupSessions, createSession, deleteSession, getRemainingTurns, getSession, touchSession, } from "./session.js";
40
+ import { cleanupExpiredSummaries, getConversationSummaryText, updateConversationSummary, } from "./conversation-summary.js";
41
+ import { AdariaError } from "../utils/errors.js";
42
+ import { CircuitBreaker } from "../utils/circuit-breaker.js";
43
+ import { error as logError, info as logInfo, warn as logWarn, } from "../utils/logger.js";
44
+ import { createM1PlaceholderRegistry } from "../skills/index.js";
45
+ import { createDbQueryTool } from "../tools/db-query.js";
46
+ import { createCollectorFetchTool } from "../tools/collector-fetch.js";
47
+ import { createSkillResultTool } from "../tools/skill-result.js";
48
+ import { createAppInfoTool } from "../tools/app-info.js";
49
+ /**
50
+ * Default Mode B system prompt. M5.5 will extend this to describe the
51
+ * 4 marketing MCP tools; M1 keeps it minimal so plumbing verification
52
+ * doesn't depend on tool-specific behavior.
53
+ */
54
+ const DEFAULT_SYSTEM_PROMPT = "You are adaria-ai, a marketing operations assistant for a small team. Answer the user's question concisely. You have NO write access in conversation mode — do not promise to publish posts, change app metadata, or reply to user reviews. If the user asks for those, tell them to run the corresponding skill command.";
55
+ const THINKING_THROTTLE_MS = 5_000;
56
+ const MODE_B_MAX_TURNS = 25;
57
+ function isExecutableSkill(skill) {
58
+ return (typeof skill === "object" &&
59
+ skill !== null &&
60
+ "executePost" in skill &&
61
+ typeof skill.executePost === "function");
62
+ }
63
+ export class AgentCore {
64
+ messenger;
65
+ config;
66
+ approvalManager;
67
+ mcpManager;
68
+ skillRegistry;
69
+ db;
70
+ apps;
71
+ skillClaudeBreaker;
72
+ approvalPayloads = new Map();
73
+ constructor(messenger, config, options = {}) {
74
+ this.messenger = messenger;
75
+ this.config = config;
76
+ this.approvalManager = new ApprovalManager();
77
+ this.mcpManager = options.mcpManager ?? new McpManager();
78
+ this.skillRegistry =
79
+ options.skillRegistry ?? createM1PlaceholderRegistry();
80
+ this.db = options.db;
81
+ this.apps = options.apps ?? [];
82
+ this.skillClaudeBreaker = new CircuitBreaker({
83
+ failureThreshold: 3,
84
+ resetTimeout: 120_000,
85
+ });
86
+ // Register MCP tools when DB is available (M5.5+). Without DB,
87
+ // Mode B still works but has no tools (M1 placeholder behavior).
88
+ if (this.db) {
89
+ this.mcpManager.registerTool(createDbQueryTool(this.db));
90
+ this.mcpManager.registerTool(createCollectorFetchTool(this.db));
91
+ this.mcpManager.registerTool(createSkillResultTool(this.db));
92
+ this.mcpManager.registerTool(createAppInfoTool(this.apps));
93
+ }
94
+ this.setupHandlers();
95
+ }
96
+ setupHandlers() {
97
+ this.messenger.onMessage((msg) => this.handleMessage(msg));
98
+ this.messenger.onApproval((taskId, approved) => {
99
+ const handled = this.approvalManager.handleResponse(taskId, approved);
100
+ if (handled) {
101
+ writeAuditLog({
102
+ type: "result",
103
+ userId: "approver",
104
+ platform: "slack",
105
+ content: `[approval-response] taskId=${taskId} approved=${String(approved)}`,
106
+ }).catch(() => { });
107
+ }
108
+ });
109
+ }
110
+ async start() {
111
+ logInfo("Connecting to messenger...");
112
+ await this.messenger.start();
113
+ logInfo("Messenger connected. Waiting for messages...");
114
+ // MCP health summary. M1 returns an empty array; M5.5 actually probes
115
+ // the bundled tool host.
116
+ const mcpStatuses = await this.mcpManager.checkMcpServerHealth();
117
+ if (mcpStatuses.length > 0) {
118
+ const summary = mcpStatuses
119
+ .map((s) => `${s.serverId}(${s.status})`)
120
+ .join(", ");
121
+ logInfo(`MCP servers: ${summary}`);
122
+ }
123
+ }
124
+ async stop() {
125
+ this.approvalManager.shutdown();
126
+ logInfo("Stopping messenger...");
127
+ await this.messenger.stop();
128
+ }
129
+ /** Exposed for M1 wiring tests and for the CLI daemon to seed skills. */
130
+ getSkillRegistry() {
131
+ return this.skillRegistry;
132
+ }
133
+ async handleMessage(msg) {
134
+ try {
135
+ logInfo(`Message from ${msg.platform}:${msg.userId} in ${msg.channelId}: "${msg.text.slice(0, 120)}"`);
136
+ // 1. Auth check. Non-allowlisted users get silently ignored to avoid
137
+ // leaking the bot's existence.
138
+ if (!isAuthorizedUser(msg, this.config)) {
139
+ logInfo(`BLOCKED: user ${msg.userId} is not in allowedUsers`);
140
+ await writeAuditLog({
141
+ type: "command",
142
+ userId: msg.userId,
143
+ platform: msg.platform,
144
+ content: `[BLOCKED] ${msg.text}`,
145
+ });
146
+ return;
147
+ }
148
+ // 2. Audit the incoming command.
149
+ await writeAuditLog({
150
+ type: "command",
151
+ userId: msg.userId,
152
+ platform: msg.platform,
153
+ content: msg.text,
154
+ });
155
+ // 3. Status message + thinking reaction.
156
+ // Reactions *only* attach to the originating event's ts — not
157
+ // the thread root. Falling back to `threadId` (pilot-ai's original
158
+ // behavior) would attach the 🤔/⚙️/✅ sequence to someone else's
159
+ // message in the thread (e.g. a prior briefing). We accept the
160
+ // no-reaction degradation when `eventTs` is missing — synthetic
161
+ // messages (approval button callbacks, cron) won't show reactions
162
+ // at all, which is correct (M1 core review HIGH #2).
163
+ const eventTs = msg.eventTs;
164
+ if (eventTs) {
165
+ await this.messenger.addReaction?.(msg.channelId, eventTs, "thinking_face");
166
+ }
167
+ const statusMsgId = await this.messenger.sendText(msg.channelId, "🤔 Thinking...", msg.threadId);
168
+ try {
169
+ if (eventTs) {
170
+ await this.messenger.removeReaction?.(msg.channelId, eventTs, "thinking_face");
171
+ await this.messenger.addReaction?.(msg.channelId, eventTs, "gear");
172
+ }
173
+ // 4. Mode A: skill registry dispatch.
174
+ // Mode B: fall through to Claude CLI.
175
+ const skill = this.skillRegistry.findSkill(msg.text);
176
+ let response;
177
+ if (skill) {
178
+ logInfo(`Mode A: dispatching to skill "${skill.name}"`);
179
+ const skillCtx = this.buildSkillContext();
180
+ // When db is not available (M1 placeholder path), pass a
181
+ // minimal stub context so placeholder skills can still return
182
+ // their "not implemented" message.
183
+ const stubCtx = skillCtx ?? {
184
+ db: undefined,
185
+ apps: [],
186
+ config: this.config,
187
+ runClaude: () => Promise.resolve(""),
188
+ };
189
+ const result = await skill.dispatch(stubCtx, msg.text);
190
+ response = result.summary;
191
+ // Send approval buttons and register pending approvals.
192
+ for (const item of result.approvals) {
193
+ const approvalText = `*[${item.agent}]* ${item.description}`;
194
+ await this.messenger.sendApproval(msg.channelId, approvalText, item.id, msg.threadId);
195
+ // Store payload for execution on approval
196
+ this.approvalPayloads.set(item.id, {
197
+ agent: item.agent,
198
+ payload: item.payload,
199
+ });
200
+ // Register with ApprovalManager (30 min timeout)
201
+ const timeoutMs = (this.config.safety.approvalTimeoutMinutes ?? 30) * 60_000;
202
+ this.approvalManager
203
+ .requestApproval(item.id, item.description, timeoutMs)
204
+ .then((approved) => this.onApprovalResolved(item.id, approved))
205
+ .catch((err) => {
206
+ logWarn(`Approval registration failed for ${item.id}: ${err instanceof Error ? err.message : String(err)}`);
207
+ });
208
+ await writeAuditLog({
209
+ type: "command",
210
+ userId: msg.userId,
211
+ platform: msg.platform,
212
+ content: `[approval-request] ${item.agent}: ${item.description}`,
213
+ });
214
+ }
215
+ }
216
+ else {
217
+ logInfo("Mode B: falling through to Claude CLI");
218
+ response = await this.invokeClaudeWithContext(msg, async (status) => {
219
+ try {
220
+ await this.messenger.updateText(msg.channelId, statusMsgId, status, msg.threadId);
221
+ }
222
+ catch {
223
+ // Ignore update failures — message may have been deleted.
224
+ }
225
+ });
226
+ }
227
+ if (eventTs) {
228
+ await this.messenger.removeReaction?.(msg.channelId, eventTs, "gear");
229
+ await this.messenger.addReaction?.(msg.channelId, eventTs, "white_check_mark");
230
+ }
231
+ await this.messenger.updateText(msg.channelId, statusMsgId, response, msg.threadId);
232
+ await writeAuditLog({
233
+ type: "result",
234
+ userId: msg.userId,
235
+ platform: msg.platform,
236
+ content: response,
237
+ });
238
+ }
239
+ catch (err) {
240
+ await this.handleDispatchError(msg, statusMsgId, eventTs, err);
241
+ }
242
+ }
243
+ catch (err) {
244
+ logError(`FATAL error in handleMessage: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`);
245
+ }
246
+ }
247
+ async handleDispatchError(msg, statusMsgId, eventTs, err) {
248
+ const errorMsg = err instanceof Error ? err.message : String(err);
249
+ logError(`Dispatch error: ${errorMsg}`);
250
+ if (eventTs) {
251
+ await this.messenger.removeReaction?.(msg.channelId, eventTs, "gear");
252
+ await this.messenger.addReaction?.(msg.channelId, eventTs, "x");
253
+ }
254
+ let displayMsg;
255
+ if (errorMsg.includes("msg_too_long")) {
256
+ // The fallback inside invokeClaudeWithContext already tried. If we
257
+ // still end up here, the retry also failed — nuke the session as a
258
+ // last resort so the next message starts fresh.
259
+ const threadId = msg.threadId ?? `dm-${String(Date.now())}`;
260
+ await deleteSession(msg.platform, msg.channelId, threadId);
261
+ displayMsg =
262
+ "❌ Conversation too long. Session has been reset — please send your message again.";
263
+ }
264
+ else if (err instanceof AdariaError) {
265
+ displayMsg = `❌ ${err.userMessage}`;
266
+ }
267
+ else {
268
+ displayMsg = `❌ Error: ${errorMsg}`;
269
+ }
270
+ try {
271
+ await this.messenger.updateText(msg.channelId, statusMsgId, displayMsg, msg.threadId);
272
+ }
273
+ catch {
274
+ // Best-effort — if the status message is gone, there's nowhere to
275
+ // post the error. The audit log still captures it below.
276
+ }
277
+ await writeAuditLog({
278
+ type: "error",
279
+ userId: msg.userId,
280
+ platform: msg.platform,
281
+ content: errorMsg,
282
+ });
283
+ }
284
+ /**
285
+ * Mode B path: build system prompt, manage session continuity, call
286
+ * Claude CLI, handle msg_too_long fallback, persist conversation summary.
287
+ */
288
+ async invokeClaudeWithContext(msg, onStatus) {
289
+ const baseSystemPrompt = await this.buildBaseSystemPrompt();
290
+ await onStatus?.("⚙️ Processing...");
291
+ // Session continuity.
292
+ const threadId = msg.threadId ?? `dm-${String(Date.now())}`;
293
+ const existingSession = await getSession(msg.platform, msg.channelId, threadId);
294
+ let sessionId;
295
+ let resumeSessionId;
296
+ if (existingSession) {
297
+ resumeSessionId = existingSession.sessionId;
298
+ await touchSession(msg.platform, msg.channelId, threadId);
299
+ logInfo(`Resuming session ${resumeSessionId} (turn ${String(existingSession.turnCount + 1)})`);
300
+ }
301
+ else {
302
+ const session = await createSession(msg.platform, msg.channelId, threadId);
303
+ sessionId = session.sessionId;
304
+ logInfo(`New session ${sessionId}`);
305
+ }
306
+ // Conversation summary for msg_too_long fallback + new-session injection.
307
+ const conversationSummaryText = await getConversationSummaryText(msg.platform, msg.channelId, threadId);
308
+ // Near-limit session warning gets appended to the system prompt.
309
+ const systemParts = [baseSystemPrompt];
310
+ if (existingSession) {
311
+ const remaining = getRemainingTurns(existingSession);
312
+ if (remaining <= 3) {
313
+ systemParts.push(`⚠️ Session context is running low (${String(remaining)} turns remaining). Be extra concise. Summarize outputs instead of showing full content.`);
314
+ }
315
+ }
316
+ const systemPrompt = systemParts.join("\n\n");
317
+ // For new sessions with prior conversation, inject summary. Wrap in
318
+ // prompt-guard tags: Mode B lets untrusted text from Slack users (and,
319
+ // once M5.5 lands, from external review content) back into Claude's
320
+ // context, so the history must arrive clearly marked as data rather
321
+ // than instructions (M1 core review MED #4).
322
+ const fullSystemPrompt = !resumeSessionId && conversationSummaryText
323
+ ? `${systemPrompt}\n\n${wrapToolOutput(conversationSummaryText, "conversation-history")}`
324
+ : systemPrompt;
325
+ // Non-blocking housekeeping. Failures are logged at warn but not
326
+ // re-thrown; they must never block a message round-trip.
327
+ cleanupSessions().catch((err) => {
328
+ logWarn(`cleanupSessions failed: ${err instanceof Error ? err.message : String(err)}`);
329
+ });
330
+ cleanupExpiredSummaries().catch((err) => {
331
+ logWarn(`cleanupExpiredSummaries failed: ${err instanceof Error ? err.message : String(err)}`);
332
+ });
333
+ // MCP config is null when no tools are registered (M1), which is the
334
+ // signal to skip --mcp-config entirely.
335
+ const mcpConfigPath = (await this.mcpManager.writeMcpConfig()) ?? undefined;
336
+ logInfo(`MCP config: ${mcpConfigPath ?? "none"}`);
337
+ const thinking = this.createThinkingHandler(onStatus);
338
+ const onToolUseForwarder = (status) => {
339
+ onStatus?.(status).catch(() => {
340
+ /* ignore */
341
+ });
342
+ };
343
+ try {
344
+ const primaryCall = {
345
+ prompt: msg.text,
346
+ cliBinary: this.config.claude.cliBinary,
347
+ timeoutMs: this.config.claude.timeoutMs,
348
+ onToolUse: onToolUseForwarder,
349
+ maxTurns: MODE_B_MAX_TURNS,
350
+ };
351
+ if (!resumeSessionId)
352
+ primaryCall.systemPrompt = fullSystemPrompt;
353
+ if (mcpConfigPath)
354
+ primaryCall.mcpConfigPath = mcpConfigPath;
355
+ if (thinking.handler)
356
+ primaryCall.onThinking = thinking.handler;
357
+ if (sessionId)
358
+ primaryCall.sessionId = sessionId;
359
+ if (resumeSessionId)
360
+ primaryCall.resumeSessionId = resumeSessionId;
361
+ const result = await invokeClaudeCli(primaryCall);
362
+ // Persist rolling summary (non-blocking).
363
+ updateConversationSummary(msg.platform, msg.channelId, threadId, msg.text, result.result).catch((err) => {
364
+ logWarn(`updateConversationSummary failed: ${err instanceof Error ? err.message : String(err)}`);
365
+ });
366
+ return result.result;
367
+ }
368
+ catch (err) {
369
+ const errorMsg = err instanceof Error ? err.message : String(err);
370
+ if (!errorMsg.includes("msg_too_long"))
371
+ throw err;
372
+ // msg_too_long fallback: fresh session with injected summary.
373
+ logInfo(`msg_too_long: fresh session for ${threadId} (summary: ${conversationSummaryText ? "yes" : "no"})`);
374
+ await deleteSession(msg.platform, msg.channelId, threadId);
375
+ const fallbackSystemPrompt = conversationSummaryText
376
+ ? `${systemPrompt}\n\n${wrapToolOutput(conversationSummaryText, "conversation-history")}`
377
+ : systemPrompt;
378
+ thinking.reset();
379
+ // Pre-generate the retry session UUID so Claude and our session
380
+ // store stay in lock-step. The old pilot-ai pattern let Claude
381
+ // invent its own UUID here, then stored an unrelated one in
382
+ // `createSession()`, which made the next message `--resume` a
383
+ // UUID Claude had never seen (M1 core review HIGH #1).
384
+ const retrySessionId = crypto.randomUUID();
385
+ const retryCall = {
386
+ prompt: msg.text,
387
+ systemPrompt: fallbackSystemPrompt,
388
+ cliBinary: this.config.claude.cliBinary,
389
+ timeoutMs: this.config.claude.timeoutMs,
390
+ onToolUse: onToolUseForwarder,
391
+ sessionId: retrySessionId,
392
+ maxTurns: MODE_B_MAX_TURNS,
393
+ };
394
+ if (mcpConfigPath)
395
+ retryCall.mcpConfigPath = mcpConfigPath;
396
+ if (thinking.handler)
397
+ retryCall.onThinking = thinking.handler;
398
+ const retryResult = await invokeClaudeCli(retryCall);
399
+ // Fresh session for subsequent messages — explicit UUID matches
400
+ // the one Claude just used above.
401
+ await createSession(msg.platform, msg.channelId, threadId, retrySessionId);
402
+ updateConversationSummary(msg.platform, msg.channelId, threadId, msg.text, retryResult.result).catch((err) => {
403
+ logWarn(`updateConversationSummary (retry) failed: ${err instanceof Error ? err.message : String(err)}`);
404
+ });
405
+ return retryResult.result;
406
+ }
407
+ }
408
+ async buildBaseSystemPrompt() {
409
+ const parts = [DEFAULT_SYSTEM_PROMPT];
410
+ const mcpContext = this.mcpManager.buildMcpContext();
411
+ if (mcpContext)
412
+ parts.push(mcpContext);
413
+ const memoryContext = await buildMemoryContext();
414
+ if (memoryContext)
415
+ parts.push(memoryContext.slice(0, 2000));
416
+ const toolDescriptions = buildToolDescriptions();
417
+ if (toolDescriptions)
418
+ parts.push(toolDescriptions);
419
+ return parts.join("\n\n");
420
+ }
421
+ /**
422
+ * Build the SkillContext for Mode A dispatch. Returns `null` if the
423
+ * database is not initialized (M1 placeholder path — skills still
424
+ * receive a minimal context with a stub `runClaude`).
425
+ */
426
+ buildSkillContext() {
427
+ if (!this.db)
428
+ return null;
429
+ return {
430
+ db: this.db,
431
+ apps: this.apps,
432
+ config: this.config,
433
+ runClaude: async (prompt) => {
434
+ return this.skillClaudeBreaker.execute(async () => {
435
+ await writeAuditLog({
436
+ type: "command",
437
+ userId: "skill",
438
+ platform: "internal",
439
+ content: `[skill-claude] ${prompt.slice(0, 200)}`,
440
+ });
441
+ const result = await invokeClaudeCli({
442
+ prompt,
443
+ cliBinary: this.config.claude.cliBinary,
444
+ timeoutMs: this.config.claude.timeoutMs,
445
+ });
446
+ await writeAuditLog({
447
+ type: "result",
448
+ userId: "skill",
449
+ platform: "internal",
450
+ content: `[skill-claude] ${result.result.slice(0, 500)}`,
451
+ });
452
+ return result.result;
453
+ });
454
+ },
455
+ };
456
+ }
457
+ /**
458
+ * Called when an approval request is resolved (approved or timed out).
459
+ * Executes the associated action if approved.
460
+ */
461
+ onApprovalResolved(taskId, approved) {
462
+ const entry = this.approvalPayloads.get(taskId);
463
+ this.approvalPayloads.delete(taskId);
464
+ if (!approved || !entry)
465
+ return;
466
+ const ctx = this.buildSkillContext();
467
+ if (!ctx) {
468
+ logWarn(`Cannot execute approval ${taskId}: DB not available`);
469
+ return;
470
+ }
471
+ // Defense-in-depth: block all write actions during M7 parallel run.
472
+ // Individual platform clients also check isDryRun(), but future skills
473
+ // (blog_publish, metadata_change) may not — gate it here.
474
+ if (process.env["ADARIA_DRY_RUN"] === "1") {
475
+ logInfo(`[dry-run] Skipping approval execution for ${taskId} (agent=${entry.agent})`);
476
+ return;
477
+ }
478
+ // Dispatch to the appropriate skill's execution handler.
479
+ const skill = this.skillRegistry
480
+ .getSkills()
481
+ .find((s) => s.name === entry.agent);
482
+ if (!skill || !isExecutableSkill(skill)) {
483
+ logWarn(`No executePost handler for agent "${entry.agent}"`);
484
+ return;
485
+ }
486
+ skill
487
+ .executePost(ctx, entry.payload)
488
+ .then(() => writeAuditLog({
489
+ type: "result",
490
+ userId: "system",
491
+ platform: "internal",
492
+ content: `[approval-executed] ${taskId} agent=${entry.agent}`,
493
+ }))
494
+ .catch((err) => {
495
+ logError(`Approval execution failed for ${taskId}: ${err instanceof Error ? err.message : String(err)}`);
496
+ });
497
+ // Other agents (blog_publish, review_reply, metadata_change) can use
498
+ // the same pattern — just add `executePost` to their skill class.
499
+ }
500
+ createThinkingHandler(onStatus) {
501
+ if (this.config.agent.showThinking === false) {
502
+ return { handler: undefined, reset: () => undefined };
503
+ }
504
+ let lastReport = 0;
505
+ let buffer = "";
506
+ const handler = (text) => {
507
+ buffer += text;
508
+ const now = Date.now();
509
+ if (now - lastReport > THINKING_THROTTLE_MS && buffer.length > 0) {
510
+ const snippet = buffer.length > 200 ? buffer.slice(-200) + "..." : buffer;
511
+ onStatus?.(`💭 ${snippet}`).catch(() => {
512
+ /* ignore */
513
+ });
514
+ buffer = "";
515
+ lastReport = now;
516
+ }
517
+ };
518
+ return {
519
+ handler,
520
+ reset: () => {
521
+ buffer = "";
522
+ lastReport = 0;
523
+ },
524
+ };
525
+ }
526
+ }
527
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/agent/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * MCP launcher — minimal M1 skeleton.
3
+ *
4
+ * adaria-ai's Mode B tools are in-process code bundled with the package,
5
+ * not external npm servers the user installs. That removes the main thing
6
+ * pilot-ai's mcp-launcher handles: generating bash wrapper scripts that
7
+ * resolve npx, pull Keychain secrets, and exec a third-party MCP server.
8
+ *
9
+ * What M1 actually needs is just a builder that, given the path to
10
+ * adaria-ai's bundled tool-host entry point, produces the
11
+ * `{ command, args, env? }` triple that `mcp-manager` drops into the
12
+ * `mcpServers.adaria` slot of `mcp-config.json`. M5.5 will plug the real
13
+ * tool-host script path in; until then this module exposes the type
14
+ * contract plus a single helper.
15
+ */
16
+ export interface McpServerConfig {
17
+ command: string;
18
+ args: string[];
19
+ env?: Record<string, string>;
20
+ }
21
+ export interface ToolHostLaunchSpec {
22
+ /** Absolute path to the Node entry point that runs the MCP tool server. */
23
+ entryPoint: string;
24
+ /** Extra args appended after the entry point. Usually empty for M1. */
25
+ extraArgs?: string[];
26
+ /** Non-secret env vars forwarded to the subprocess. */
27
+ env?: Record<string, string>;
28
+ }
29
+ /**
30
+ * Builds the `mcpServers.<id>` value that mcp-manager writes into the
31
+ * config file consumed by `claude --mcp-config`.
32
+ *
33
+ * We launch the tool host with `process.execPath` rather than `npx`
34
+ * because:
35
+ * 1. launchd inherits a near-empty PATH, so `npx` may not resolve.
36
+ * 2. `process.execPath` is always an absolute path to the currently
37
+ * running Node binary — no lookup, no reinstall.
38
+ * 3. Global-install via npm + nvm multi-version stays consistent:
39
+ * whichever Node launched the daemon also launches the tool host.
40
+ */
41
+ export declare function buildToolHostServerConfig(spec: ToolHostLaunchSpec): McpServerConfig;
42
+ //# sourceMappingURL=mcp-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-launcher.d.ts","sourceRoot":"","sources":["../../src/agent/mcp-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,kBAAkB,GACvB,eAAe,CASjB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * MCP launcher — minimal M1 skeleton.
3
+ *
4
+ * adaria-ai's Mode B tools are in-process code bundled with the package,
5
+ * not external npm servers the user installs. That removes the main thing
6
+ * pilot-ai's mcp-launcher handles: generating bash wrapper scripts that
7
+ * resolve npx, pull Keychain secrets, and exec a third-party MCP server.
8
+ *
9
+ * What M1 actually needs is just a builder that, given the path to
10
+ * adaria-ai's bundled tool-host entry point, produces the
11
+ * `{ command, args, env? }` triple that `mcp-manager` drops into the
12
+ * `mcpServers.adaria` slot of `mcp-config.json`. M5.5 will plug the real
13
+ * tool-host script path in; until then this module exposes the type
14
+ * contract plus a single helper.
15
+ */
16
+ /**
17
+ * Builds the `mcpServers.<id>` value that mcp-manager writes into the
18
+ * config file consumed by `claude --mcp-config`.
19
+ *
20
+ * We launch the tool host with `process.execPath` rather than `npx`
21
+ * because:
22
+ * 1. launchd inherits a near-empty PATH, so `npx` may not resolve.
23
+ * 2. `process.execPath` is always an absolute path to the currently
24
+ * running Node binary — no lookup, no reinstall.
25
+ * 3. Global-install via npm + nvm multi-version stays consistent:
26
+ * whichever Node launched the daemon also launches the tool host.
27
+ */
28
+ export function buildToolHostServerConfig(spec) {
29
+ const config = {
30
+ command: process.execPath,
31
+ args: [spec.entryPoint, ...(spec.extraArgs ?? [])],
32
+ };
33
+ if (spec.env && Object.keys(spec.env).length > 0) {
34
+ config.env = { ...spec.env };
35
+ }
36
+ return config;
37
+ }
38
+ //# sourceMappingURL=mcp-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-launcher.js","sourceRoot":"","sources":["../../src/agent/mcp-launcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAwB;IAExB,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,OAAO,CAAC,QAAQ;QACzB,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;KACnD,CAAC;IACF,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}