@aitne/daemon 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 (1386) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/composite-dashboard-stream.d.ts +42 -0
  3. package/dist/adapters/composite-dashboard-stream.d.ts.map +1 -0
  4. package/dist/adapters/composite-dashboard-stream.js +49 -0
  5. package/dist/adapters/composite-dashboard-stream.js.map +1 -0
  6. package/dist/adapters/dashboard-adapter.d.ts +104 -0
  7. package/dist/adapters/dashboard-adapter.d.ts.map +1 -0
  8. package/dist/adapters/dashboard-adapter.js +216 -0
  9. package/dist/adapters/dashboard-adapter.js.map +1 -0
  10. package/dist/adapters/discord.d.ts +77 -0
  11. package/dist/adapters/discord.d.ts.map +1 -0
  12. package/dist/adapters/discord.js +339 -0
  13. package/dist/adapters/discord.js.map +1 -0
  14. package/dist/adapters/docs-qa-adapter.d.ts +123 -0
  15. package/dist/adapters/docs-qa-adapter.d.ts.map +1 -0
  16. package/dist/adapters/docs-qa-adapter.js +218 -0
  17. package/dist/adapters/docs-qa-adapter.js.map +1 -0
  18. package/dist/adapters/message-hub.d.ts +70 -0
  19. package/dist/adapters/message-hub.d.ts.map +1 -0
  20. package/dist/adapters/message-hub.js +359 -0
  21. package/dist/adapters/message-hub.js.map +1 -0
  22. package/dist/adapters/notification-manager.d.ts +99 -0
  23. package/dist/adapters/notification-manager.d.ts.map +1 -0
  24. package/dist/adapters/notification-manager.js +498 -0
  25. package/dist/adapters/notification-manager.js.map +1 -0
  26. package/dist/adapters/outbound-text.d.ts +28 -0
  27. package/dist/adapters/outbound-text.d.ts.map +1 -0
  28. package/dist/adapters/outbound-text.js +58 -0
  29. package/dist/adapters/outbound-text.js.map +1 -0
  30. package/dist/adapters/slack-adapter.d.ts +82 -0
  31. package/dist/adapters/slack-adapter.d.ts.map +1 -0
  32. package/dist/adapters/slack-adapter.js +359 -0
  33. package/dist/adapters/slack-adapter.js.map +1 -0
  34. package/dist/adapters/telegram-adapter.d.ts +107 -0
  35. package/dist/adapters/telegram-adapter.d.ts.map +1 -0
  36. package/dist/adapters/telegram-adapter.js +477 -0
  37. package/dist/adapters/telegram-adapter.js.map +1 -0
  38. package/dist/adapters/types.d.ts +92 -0
  39. package/dist/adapters/types.d.ts.map +1 -0
  40. package/dist/adapters/types.js +2 -0
  41. package/dist/adapters/types.js.map +1 -0
  42. package/dist/adapters/whatsapp-adapter.d.ts +213 -0
  43. package/dist/adapters/whatsapp-adapter.d.ts.map +1 -0
  44. package/dist/adapters/whatsapp-adapter.js +1216 -0
  45. package/dist/adapters/whatsapp-adapter.js.map +1 -0
  46. package/dist/api/chat-binding-query.d.ts +36 -0
  47. package/dist/api/chat-binding-query.d.ts.map +1 -0
  48. package/dist/api/chat-binding-query.js +63 -0
  49. package/dist/api/chat-binding-query.js.map +1 -0
  50. package/dist/api/chat-session-resume.d.ts +12 -0
  51. package/dist/api/chat-session-resume.d.ts.map +1 -0
  52. package/dist/api/chat-session-resume.js +21 -0
  53. package/dist/api/chat-session-resume.js.map +1 -0
  54. package/dist/api/delegated-proxy-helper.d.ts +33 -0
  55. package/dist/api/delegated-proxy-helper.d.ts.map +1 -0
  56. package/dist/api/delegated-proxy-helper.js +54 -0
  57. package/dist/api/delegated-proxy-helper.js.map +1 -0
  58. package/dist/api/directory-picker.d.ts +38 -0
  59. package/dist/api/directory-picker.d.ts.map +1 -0
  60. package/dist/api/directory-picker.js +278 -0
  61. package/dist/api/directory-picker.js.map +1 -0
  62. package/dist/api/env-writer.d.ts +25 -0
  63. package/dist/api/env-writer.d.ts.map +1 -0
  64. package/dist/api/env-writer.js +421 -0
  65. package/dist/api/env-writer.js.map +1 -0
  66. package/dist/api/integration-route-gate.d.ts +60 -0
  67. package/dist/api/integration-route-gate.d.ts.map +1 -0
  68. package/dist/api/integration-route-gate.js +83 -0
  69. package/dist/api/integration-route-gate.js.map +1 -0
  70. package/dist/api/json-body.d.ts +29 -0
  71. package/dist/api/json-body.d.ts.map +1 -0
  72. package/dist/api/json-body.js +87 -0
  73. package/dist/api/json-body.js.map +1 -0
  74. package/dist/api/routes/activity-sources.d.ts +20 -0
  75. package/dist/api/routes/activity-sources.d.ts.map +1 -0
  76. package/dist/api/routes/activity-sources.js +18 -0
  77. package/dist/api/routes/activity-sources.js.map +1 -0
  78. package/dist/api/routes/agent.d.ts +4 -0
  79. package/dist/api/routes/agent.d.ts.map +1 -0
  80. package/dist/api/routes/agent.js +619 -0
  81. package/dist/api/routes/agent.js.map +1 -0
  82. package/dist/api/routes/apple-calendar.d.ts +31 -0
  83. package/dist/api/routes/apple-calendar.d.ts.map +1 -0
  84. package/dist/api/routes/apple-calendar.js +310 -0
  85. package/dist/api/routes/apple-calendar.js.map +1 -0
  86. package/dist/api/routes/attachments.d.ts +36 -0
  87. package/dist/api/routes/attachments.d.ts.map +1 -0
  88. package/dist/api/routes/attachments.js +305 -0
  89. package/dist/api/routes/attachments.js.map +1 -0
  90. package/dist/api/routes/backends.d.ts +4 -0
  91. package/dist/api/routes/backends.d.ts.map +1 -0
  92. package/dist/api/routes/backends.js +1132 -0
  93. package/dist/api/routes/backends.js.map +1 -0
  94. package/dist/api/routes/books.d.ts +63 -0
  95. package/dist/api/routes/books.d.ts.map +1 -0
  96. package/dist/api/routes/books.js +467 -0
  97. package/dist/api/routes/books.js.map +1 -0
  98. package/dist/api/routes/calendar.d.ts +36 -0
  99. package/dist/api/routes/calendar.d.ts.map +1 -0
  100. package/dist/api/routes/calendar.js +351 -0
  101. package/dist/api/routes/calendar.js.map +1 -0
  102. package/dist/api/routes/commands.d.ts +4 -0
  103. package/dist/api/routes/commands.d.ts.map +1 -0
  104. package/dist/api/routes/commands.js +251 -0
  105. package/dist/api/routes/commands.js.map +1 -0
  106. package/dist/api/routes/context.d.ts +57 -0
  107. package/dist/api/routes/context.d.ts.map +1 -0
  108. package/dist/api/routes/context.js +1765 -0
  109. package/dist/api/routes/context.js.map +1 -0
  110. package/dist/api/routes/dashboard.d.ts +29 -0
  111. package/dist/api/routes/dashboard.d.ts.map +1 -0
  112. package/dist/api/routes/dashboard.js +2062 -0
  113. package/dist/api/routes/dashboard.js.map +1 -0
  114. package/dist/api/routes/delegated-sync.d.ts +4 -0
  115. package/dist/api/routes/delegated-sync.d.ts.map +1 -0
  116. package/dist/api/routes/delegated-sync.js +192 -0
  117. package/dist/api/routes/delegated-sync.js.map +1 -0
  118. package/dist/api/routes/delegated.d.ts +42 -0
  119. package/dist/api/routes/delegated.d.ts.map +1 -0
  120. package/dist/api/routes/delegated.js +250 -0
  121. package/dist/api/routes/delegated.js.map +1 -0
  122. package/dist/api/routes/docs.d.ts +34 -0
  123. package/dist/api/routes/docs.d.ts.map +1 -0
  124. package/dist/api/routes/docs.js +580 -0
  125. package/dist/api/routes/docs.js.map +1 -0
  126. package/dist/api/routes/entities.d.ts +9 -0
  127. package/dist/api/routes/entities.d.ts.map +1 -0
  128. package/dist/api/routes/entities.js +176 -0
  129. package/dist/api/routes/entities.js.map +1 -0
  130. package/dist/api/routes/git-accounts.d.ts +23 -0
  131. package/dist/api/routes/git-accounts.d.ts.map +1 -0
  132. package/dist/api/routes/git-accounts.js +227 -0
  133. package/dist/api/routes/git-accounts.js.map +1 -0
  134. package/dist/api/routes/git-templates.d.ts +50 -0
  135. package/dist/api/routes/git-templates.d.ts.map +1 -0
  136. package/dist/api/routes/git-templates.js +276 -0
  137. package/dist/api/routes/git-templates.js.map +1 -0
  138. package/dist/api/routes/git.d.ts +34 -0
  139. package/dist/api/routes/git.d.ts.map +1 -0
  140. package/dist/api/routes/git.js +126 -0
  141. package/dist/api/routes/git.js.map +1 -0
  142. package/dist/api/routes/github.d.ts +34 -0
  143. package/dist/api/routes/github.d.ts.map +1 -0
  144. package/dist/api/routes/github.js +465 -0
  145. package/dist/api/routes/github.js.map +1 -0
  146. package/dist/api/routes/health.d.ts +4 -0
  147. package/dist/api/routes/health.d.ts.map +1 -0
  148. package/dist/api/routes/health.js +257 -0
  149. package/dist/api/routes/health.js.map +1 -0
  150. package/dist/api/routes/integrations-reconcile.d.ts +33 -0
  151. package/dist/api/routes/integrations-reconcile.d.ts.map +1 -0
  152. package/dist/api/routes/integrations-reconcile.js +463 -0
  153. package/dist/api/routes/integrations-reconcile.js.map +1 -0
  154. package/dist/api/routes/integrations.d.ts +19 -0
  155. package/dist/api/routes/integrations.d.ts.map +1 -0
  156. package/dist/api/routes/integrations.js +1384 -0
  157. package/dist/api/routes/integrations.js.map +1 -0
  158. package/dist/api/routes/knowledge.d.ts +4 -0
  159. package/dist/api/routes/knowledge.d.ts.map +1 -0
  160. package/dist/api/routes/knowledge.js +224 -0
  161. package/dist/api/routes/knowledge.js.map +1 -0
  162. package/dist/api/routes/mail.d.ts +39 -0
  163. package/dist/api/routes/mail.d.ts.map +1 -0
  164. package/dist/api/routes/mail.js +1406 -0
  165. package/dist/api/routes/mail.js.map +1 -0
  166. package/dist/api/routes/managed-tasks.d.ts +48 -0
  167. package/dist/api/routes/managed-tasks.d.ts.map +1 -0
  168. package/dist/api/routes/managed-tasks.js +844 -0
  169. package/dist/api/routes/managed-tasks.js.map +1 -0
  170. package/dist/api/routes/mcp.d.ts +50 -0
  171. package/dist/api/routes/mcp.d.ts.map +1 -0
  172. package/dist/api/routes/mcp.js +470 -0
  173. package/dist/api/routes/mcp.js.map +1 -0
  174. package/dist/api/routes/metrics.d.ts +13 -0
  175. package/dist/api/routes/metrics.d.ts.map +1 -0
  176. package/dist/api/routes/metrics.js +117 -0
  177. package/dist/api/routes/metrics.js.map +1 -0
  178. package/dist/api/routes/notion.d.ts +35 -0
  179. package/dist/api/routes/notion.d.ts.map +1 -0
  180. package/dist/api/routes/notion.js +442 -0
  181. package/dist/api/routes/notion.js.map +1 -0
  182. package/dist/api/routes/observations.d.ts +4 -0
  183. package/dist/api/routes/observations.d.ts.map +1 -0
  184. package/dist/api/routes/observations.js +177 -0
  185. package/dist/api/routes/observations.js.map +1 -0
  186. package/dist/api/routes/obsidian.d.ts +16 -0
  187. package/dist/api/routes/obsidian.d.ts.map +1 -0
  188. package/dist/api/routes/obsidian.js +321 -0
  189. package/dist/api/routes/obsidian.js.map +1 -0
  190. package/dist/api/routes/profile-questions.d.ts +17 -0
  191. package/dist/api/routes/profile-questions.d.ts.map +1 -0
  192. package/dist/api/routes/profile-questions.js +115 -0
  193. package/dist/api/routes/profile-questions.js.map +1 -0
  194. package/dist/api/routes/receipts.d.ts +4 -0
  195. package/dist/api/routes/receipts.d.ts.map +1 -0
  196. package/dist/api/routes/receipts.js +155 -0
  197. package/dist/api/routes/receipts.js.map +1 -0
  198. package/dist/api/routes/recurring-schedules.d.ts +4 -0
  199. package/dist/api/routes/recurring-schedules.d.ts.map +1 -0
  200. package/dist/api/routes/recurring-schedules.js +137 -0
  201. package/dist/api/routes/recurring-schedules.js.map +1 -0
  202. package/dist/api/routes/repositories.d.ts +40 -0
  203. package/dist/api/routes/repositories.d.ts.map +1 -0
  204. package/dist/api/routes/repositories.js +857 -0
  205. package/dist/api/routes/repositories.js.map +1 -0
  206. package/dist/api/routes/setup-migrate.d.ts +74 -0
  207. package/dist/api/routes/setup-migrate.d.ts.map +1 -0
  208. package/dist/api/routes/setup-migrate.js +944 -0
  209. package/dist/api/routes/setup-migrate.js.map +1 -0
  210. package/dist/api/routes/setup.d.ts +4 -0
  211. package/dist/api/routes/setup.d.ts.map +1 -0
  212. package/dist/api/routes/setup.js +443 -0
  213. package/dist/api/routes/setup.js.map +1 -0
  214. package/dist/api/routes/skill-curation.d.ts +5 -0
  215. package/dist/api/routes/skill-curation.d.ts.map +1 -0
  216. package/dist/api/routes/skill-curation.js +728 -0
  217. package/dist/api/routes/skill-curation.js.map +1 -0
  218. package/dist/api/routes/skills.d.ts +52 -0
  219. package/dist/api/routes/skills.d.ts.map +1 -0
  220. package/dist/api/routes/skills.js +429 -0
  221. package/dist/api/routes/skills.js.map +1 -0
  222. package/dist/api/routes/sot-bindings.d.ts +20 -0
  223. package/dist/api/routes/sot-bindings.d.ts.map +1 -0
  224. package/dist/api/routes/sot-bindings.js +163 -0
  225. package/dist/api/routes/sot-bindings.js.map +1 -0
  226. package/dist/api/routes/sse.d.ts +86 -0
  227. package/dist/api/routes/sse.d.ts.map +1 -0
  228. package/dist/api/routes/sse.js +378 -0
  229. package/dist/api/routes/sse.js.map +1 -0
  230. package/dist/api/routes/system.d.ts +4 -0
  231. package/dist/api/routes/system.d.ts.map +1 -0
  232. package/dist/api/routes/system.js +207 -0
  233. package/dist/api/routes/system.js.map +1 -0
  234. package/dist/api/routes/task-flows.d.ts +30 -0
  235. package/dist/api/routes/task-flows.d.ts.map +1 -0
  236. package/dist/api/routes/task-flows.js +155 -0
  237. package/dist/api/routes/task-flows.js.map +1 -0
  238. package/dist/api/routes/travel-bookings.d.ts +4 -0
  239. package/dist/api/routes/travel-bookings.d.ts.map +1 -0
  240. package/dist/api/routes/travel-bookings.js +142 -0
  241. package/dist/api/routes/travel-bookings.js.map +1 -0
  242. package/dist/api/routes/travel-time.d.ts +8 -0
  243. package/dist/api/routes/travel-time.d.ts.map +1 -0
  244. package/dist/api/routes/travel-time.js +87 -0
  245. package/dist/api/routes/travel-time.js.map +1 -0
  246. package/dist/api/routes/triggers.d.ts +4 -0
  247. package/dist/api/routes/triggers.d.ts.map +1 -0
  248. package/dist/api/routes/triggers.js +101 -0
  249. package/dist/api/routes/triggers.js.map +1 -0
  250. package/dist/api/routes/voice.d.ts +48 -0
  251. package/dist/api/routes/voice.d.ts.map +1 -0
  252. package/dist/api/routes/voice.js +232 -0
  253. package/dist/api/routes/voice.js.map +1 -0
  254. package/dist/api/server.d.ts +428 -0
  255. package/dist/api/server.d.ts.map +1 -0
  256. package/dist/api/server.js +558 -0
  257. package/dist/api/server.js.map +1 -0
  258. package/dist/config.d.ts +136 -0
  259. package/dist/config.d.ts.map +1 -0
  260. package/dist/config.js +699 -0
  261. package/dist/config.js.map +1 -0
  262. package/dist/core/agent-core.d.ts +517 -0
  263. package/dist/core/agent-core.d.ts.map +1 -0
  264. package/dist/core/agent-core.js +102 -0
  265. package/dist/core/agent-core.js.map +1 -0
  266. package/dist/core/alerts.d.ts +86 -0
  267. package/dist/core/alerts.d.ts.map +1 -0
  268. package/dist/core/alerts.js +304 -0
  269. package/dist/core/alerts.js.map +1 -0
  270. package/dist/core/atomic-write.d.ts +51 -0
  271. package/dist/core/atomic-write.d.ts.map +1 -0
  272. package/dist/core/atomic-write.js +135 -0
  273. package/dist/core/atomic-write.js.map +1 -0
  274. package/dist/core/backends/api-key-probe.d.ts +40 -0
  275. package/dist/core/backends/api-key-probe.d.ts.map +1 -0
  276. package/dist/core/backends/api-key-probe.js +116 -0
  277. package/dist/core/backends/api-key-probe.js.map +1 -0
  278. package/dist/core/backends/auth-health-monitor.d.ts +373 -0
  279. package/dist/core/backends/auth-health-monitor.d.ts.map +1 -0
  280. package/dist/core/backends/auth-health-monitor.js +950 -0
  281. package/dist/core/backends/auth-health-monitor.js.map +1 -0
  282. package/dist/core/backends/auth-recovery.d.ts +263 -0
  283. package/dist/core/backends/auth-recovery.d.ts.map +1 -0
  284. package/dist/core/backends/auth-recovery.js +1086 -0
  285. package/dist/core/backends/auth-recovery.js.map +1 -0
  286. package/dist/core/backends/auth-telemetry.d.ts +81 -0
  287. package/dist/core/backends/auth-telemetry.d.ts.map +1 -0
  288. package/dist/core/backends/auth-telemetry.js +108 -0
  289. package/dist/core/backends/auth-telemetry.js.map +1 -0
  290. package/dist/core/backends/backend-router.d.ts +272 -0
  291. package/dist/core/backends/backend-router.d.ts.map +1 -0
  292. package/dist/core/backends/backend-router.js +759 -0
  293. package/dist/core/backends/backend-router.js.map +1 -0
  294. package/dist/core/backends/claude-code-core.d.ts +299 -0
  295. package/dist/core/backends/claude-code-core.d.ts.map +1 -0
  296. package/dist/core/backends/claude-code-core.js +2541 -0
  297. package/dist/core/backends/claude-code-core.js.map +1 -0
  298. package/dist/core/backends/claude-credentials-store.d.ts +83 -0
  299. package/dist/core/backends/claude-credentials-store.d.ts.map +1 -0
  300. package/dist/core/backends/claude-credentials-store.js +243 -0
  301. package/dist/core/backends/claude-credentials-store.js.map +1 -0
  302. package/dist/core/backends/cli-utils.d.ts +95 -0
  303. package/dist/core/backends/cli-utils.d.ts.map +1 -0
  304. package/dist/core/backends/cli-utils.js +464 -0
  305. package/dist/core/backends/cli-utils.js.map +1 -0
  306. package/dist/core/backends/codex-core.d.ts +127 -0
  307. package/dist/core/backends/codex-core.d.ts.map +1 -0
  308. package/dist/core/backends/codex-core.js +1693 -0
  309. package/dist/core/backends/codex-core.js.map +1 -0
  310. package/dist/core/backends/gemini-cli-core.d.ts +367 -0
  311. package/dist/core/backends/gemini-cli-core.d.ts.map +1 -0
  312. package/dist/core/backends/gemini-cli-core.js +2331 -0
  313. package/dist/core/backends/gemini-cli-core.js.map +1 -0
  314. package/dist/core/backends/idle-watchdog.d.ts +77 -0
  315. package/dist/core/backends/idle-watchdog.d.ts.map +1 -0
  316. package/dist/core/backends/idle-watchdog.js +94 -0
  317. package/dist/core/backends/idle-watchdog.js.map +1 -0
  318. package/dist/core/backends/install-methods.d.ts +93 -0
  319. package/dist/core/backends/install-methods.d.ts.map +1 -0
  320. package/dist/core/backends/install-methods.js +267 -0
  321. package/dist/core/backends/install-methods.js.map +1 -0
  322. package/dist/core/backends/model-registry.d.ts +58 -0
  323. package/dist/core/backends/model-registry.d.ts.map +1 -0
  324. package/dist/core/backends/model-registry.js +539 -0
  325. package/dist/core/backends/model-registry.js.map +1 -0
  326. package/dist/core/backends/plan-presets.d.ts +123 -0
  327. package/dist/core/backends/plan-presets.d.ts.map +1 -0
  328. package/dist/core/backends/plan-presets.js +235 -0
  329. package/dist/core/backends/plan-presets.js.map +1 -0
  330. package/dist/core/backends/price-fetcher.d.ts +48 -0
  331. package/dist/core/backends/price-fetcher.d.ts.map +1 -0
  332. package/dist/core/backends/price-fetcher.js +248 -0
  333. package/dist/core/backends/price-fetcher.js.map +1 -0
  334. package/dist/core/backends/process-config-cascade.d.ts +68 -0
  335. package/dist/core/backends/process-config-cascade.d.ts.map +1 -0
  336. package/dist/core/backends/process-config-cascade.js +173 -0
  337. package/dist/core/backends/process-config-cascade.js.map +1 -0
  338. package/dist/core/backends/prompt-utils.d.ts +6 -0
  339. package/dist/core/backends/prompt-utils.d.ts.map +1 -0
  340. package/dist/core/backends/prompt-utils.js +80 -0
  341. package/dist/core/backends/prompt-utils.js.map +1 -0
  342. package/dist/core/backends/proxy-model-registry.d.ts +110 -0
  343. package/dist/core/backends/proxy-model-registry.d.ts.map +1 -0
  344. package/dist/core/backends/proxy-model-registry.js +195 -0
  345. package/dist/core/backends/proxy-model-registry.js.map +1 -0
  346. package/dist/core/backends/silent-api-error-detector.d.ts +31 -0
  347. package/dist/core/backends/silent-api-error-detector.d.ts.map +1 -0
  348. package/dist/core/backends/silent-api-error-detector.js +44 -0
  349. package/dist/core/backends/silent-api-error-detector.js.map +1 -0
  350. package/dist/core/bang-commands/commands-cost.d.ts +13 -0
  351. package/dist/core/bang-commands/commands-cost.d.ts.map +1 -0
  352. package/dist/core/bang-commands/commands-cost.js +91 -0
  353. package/dist/core/bang-commands/commands-cost.js.map +1 -0
  354. package/dist/core/bang-commands/commands-report.d.ts +18 -0
  355. package/dist/core/bang-commands/commands-report.d.ts.map +1 -0
  356. package/dist/core/bang-commands/commands-report.js +105 -0
  357. package/dist/core/bang-commands/commands-report.js.map +1 -0
  358. package/dist/core/bang-commands/commands-stop-start.d.ts +4 -0
  359. package/dist/core/bang-commands/commands-stop-start.d.ts.map +1 -0
  360. package/dist/core/bang-commands/commands-stop-start.js +88 -0
  361. package/dist/core/bang-commands/commands-stop-start.js.map +1 -0
  362. package/dist/core/bang-commands/format-utils.d.ts +34 -0
  363. package/dist/core/bang-commands/format-utils.d.ts.map +1 -0
  364. package/dist/core/bang-commands/format-utils.js +118 -0
  365. package/dist/core/bang-commands/format-utils.js.map +1 -0
  366. package/dist/core/bang-commands/index.d.ts +20 -0
  367. package/dist/core/bang-commands/index.d.ts.map +1 -0
  368. package/dist/core/bang-commands/index.js +31 -0
  369. package/dist/core/bang-commands/index.js.map +1 -0
  370. package/dist/core/bang-commands/registry.d.ts +72 -0
  371. package/dist/core/bang-commands/registry.d.ts.map +1 -0
  372. package/dist/core/bang-commands/registry.js +174 -0
  373. package/dist/core/bang-commands/registry.js.map +1 -0
  374. package/dist/core/bang-commands/user-commands.d.ts +86 -0
  375. package/dist/core/bang-commands/user-commands.d.ts.map +1 -0
  376. package/dist/core/bang-commands/user-commands.js +212 -0
  377. package/dist/core/bang-commands/user-commands.js.map +1 -0
  378. package/dist/core/channel-timeline.d.ts +28 -0
  379. package/dist/core/channel-timeline.d.ts.map +1 -0
  380. package/dist/core/channel-timeline.js +117 -0
  381. package/dist/core/channel-timeline.js.map +1 -0
  382. package/dist/core/character-block.d.ts +37 -0
  383. package/dist/core/character-block.d.ts.map +1 -0
  384. package/dist/core/character-block.js +162 -0
  385. package/dist/core/character-block.js.map +1 -0
  386. package/dist/core/context/activity-sources.d.ts +37 -0
  387. package/dist/core/context/activity-sources.d.ts.map +1 -0
  388. package/dist/core/context/activity-sources.js +69 -0
  389. package/dist/core/context/activity-sources.js.map +1 -0
  390. package/dist/core/context/activity-view-reconciler.d.ts +110 -0
  391. package/dist/core/context/activity-view-reconciler.d.ts.map +1 -0
  392. package/dist/core/context/activity-view-reconciler.js +252 -0
  393. package/dist/core/context/activity-view-reconciler.js.map +1 -0
  394. package/dist/core/context/activity-view-runner.d.ts +38 -0
  395. package/dist/core/context/activity-view-runner.d.ts.map +1 -0
  396. package/dist/core/context/activity-view-runner.js +402 -0
  397. package/dist/core/context/activity-view-runner.js.map +1 -0
  398. package/dist/core/context/default-schedules-reconciler.d.ts +85 -0
  399. package/dist/core/context/default-schedules-reconciler.d.ts.map +1 -0
  400. package/dist/core/context/default-schedules-reconciler.js +153 -0
  401. package/dist/core/context/default-schedules-reconciler.js.map +1 -0
  402. package/dist/core/context/default-schedules-runner.d.ts +40 -0
  403. package/dist/core/context/default-schedules-runner.d.ts.map +1 -0
  404. package/dist/core/context/default-schedules-runner.js +233 -0
  405. package/dist/core/context/default-schedules-runner.js.map +1 -0
  406. package/dist/core/context/domain-index-reconciler.d.ts +81 -0
  407. package/dist/core/context/domain-index-reconciler.d.ts.map +1 -0
  408. package/dist/core/context/domain-index-reconciler.js +199 -0
  409. package/dist/core/context/domain-index-reconciler.js.map +1 -0
  410. package/dist/core/context/domain-index-runner.d.ts +35 -0
  411. package/dist/core/context/domain-index-runner.d.ts.map +1 -0
  412. package/dist/core/context/domain-index-runner.js +223 -0
  413. package/dist/core/context/domain-index-runner.js.map +1 -0
  414. package/dist/core/context/entity-mirror.d.ts +227 -0
  415. package/dist/core/context/entity-mirror.d.ts.map +1 -0
  416. package/dist/core/context/entity-mirror.js +629 -0
  417. package/dist/core/context/entity-mirror.js.map +1 -0
  418. package/dist/core/context/entity-source-rename.d.ts +61 -0
  419. package/dist/core/context/entity-source-rename.d.ts.map +1 -0
  420. package/dist/core/context/entity-source-rename.js +237 -0
  421. package/dist/core/context/entity-source-rename.js.map +1 -0
  422. package/dist/core/context/index-reconciler.d.ts +61 -0
  423. package/dist/core/context/index-reconciler.d.ts.map +1 -0
  424. package/dist/core/context/index-reconciler.js +329 -0
  425. package/dist/core/context/index-reconciler.js.map +1 -0
  426. package/dist/core/context/policy-index-reconciler.d.ts +102 -0
  427. package/dist/core/context/policy-index-reconciler.d.ts.map +1 -0
  428. package/dist/core/context/policy-index-reconciler.js +202 -0
  429. package/dist/core/context/policy-index-reconciler.js.map +1 -0
  430. package/dist/core/context/policy-index-runner.d.ts +66 -0
  431. package/dist/core/context/policy-index-runner.d.ts.map +1 -0
  432. package/dist/core/context/policy-index-runner.js +406 -0
  433. package/dist/core/context/policy-index-runner.js.map +1 -0
  434. package/dist/core/context/reconciler-runner.d.ts +44 -0
  435. package/dist/core/context/reconciler-runner.d.ts.map +1 -0
  436. package/dist/core/context/reconciler-runner.js +273 -0
  437. package/dist/core/context/reconciler-runner.js.map +1 -0
  438. package/dist/core/context-builder.d.ts +115 -0
  439. package/dist/core/context-builder.d.ts.map +1 -0
  440. package/dist/core/context-builder.js +1148 -0
  441. package/dist/core/context-builder.js.map +1 -0
  442. package/dist/core/context-frontmatter-backfill.d.ts +33 -0
  443. package/dist/core/context-frontmatter-backfill.d.ts.map +1 -0
  444. package/dist/core/context-frontmatter-backfill.js +111 -0
  445. package/dist/core/context-frontmatter-backfill.js.map +1 -0
  446. package/dist/core/context-frontmatter.d.ts +13 -0
  447. package/dist/core/context-frontmatter.d.ts.map +1 -0
  448. package/dist/core/context-frontmatter.js +325 -0
  449. package/dist/core/context-frontmatter.js.map +1 -0
  450. package/dist/core/context-health.d.ts +51 -0
  451. package/dist/core/context-health.d.ts.map +1 -0
  452. package/dist/core/context-health.js +304 -0
  453. package/dist/core/context-health.js.map +1 -0
  454. package/dist/core/context-paths.d.ts +183 -0
  455. package/dist/core/context-paths.d.ts.map +1 -0
  456. package/dist/core/context-paths.js +241 -0
  457. package/dist/core/context-paths.js.map +1 -0
  458. package/dist/core/context-staleness.d.ts +45 -0
  459. package/dist/core/context-staleness.d.ts.map +1 -0
  460. package/dist/core/context-staleness.js +88 -0
  461. package/dist/core/context-staleness.js.map +1 -0
  462. package/dist/core/custom-routine-scheduler.d.ts +151 -0
  463. package/dist/core/custom-routine-scheduler.d.ts.map +1 -0
  464. package/dist/core/custom-routine-scheduler.js +335 -0
  465. package/dist/core/custom-routine-scheduler.js.map +1 -0
  466. package/dist/core/daemon-api-cli.d.ts +33 -0
  467. package/dist/core/daemon-api-cli.d.ts.map +1 -0
  468. package/dist/core/daemon-api-cli.js +614 -0
  469. package/dist/core/daemon-api-cli.js.map +1 -0
  470. package/dist/core/dashboard-session-cleanup.d.ts +39 -0
  471. package/dist/core/dashboard-session-cleanup.d.ts.map +1 -0
  472. package/dist/core/dashboard-session-cleanup.js +108 -0
  473. package/dist/core/dashboard-session-cleanup.js.map +1 -0
  474. package/dist/core/dashboard-session-controls.d.ts +41 -0
  475. package/dist/core/dashboard-session-controls.d.ts.map +1 -0
  476. package/dist/core/dashboard-session-controls.js +154 -0
  477. package/dist/core/dashboard-session-controls.js.map +1 -0
  478. package/dist/core/delegated-connector-health.d.ts +63 -0
  479. package/dist/core/delegated-connector-health.d.ts.map +1 -0
  480. package/dist/core/delegated-connector-health.js +157 -0
  481. package/dist/core/delegated-connector-health.js.map +1 -0
  482. package/dist/core/dispatcher.d.ts +999 -0
  483. package/dist/core/dispatcher.d.ts.map +1 -0
  484. package/dist/core/dispatcher.js +4378 -0
  485. package/dist/core/dispatcher.js.map +1 -0
  486. package/dist/core/dm-freshness-metrics.d.ts +73 -0
  487. package/dist/core/dm-freshness-metrics.d.ts.map +1 -0
  488. package/dist/core/dm-freshness-metrics.js +138 -0
  489. package/dist/core/dm-freshness-metrics.js.map +1 -0
  490. package/dist/core/docs/citation-validator.d.ts +73 -0
  491. package/dist/core/docs/citation-validator.d.ts.map +1 -0
  492. package/dist/core/docs/citation-validator.js +195 -0
  493. package/dist/core/docs/citation-validator.js.map +1 -0
  494. package/dist/core/docs/extract-terms.d.ts +78 -0
  495. package/dist/core/docs/extract-terms.d.ts.map +1 -0
  496. package/dist/core/docs/extract-terms.js +147 -0
  497. package/dist/core/docs/extract-terms.js.map +1 -0
  498. package/dist/core/docs/indexer.d.ts +104 -0
  499. package/dist/core/docs/indexer.d.ts.map +1 -0
  500. package/dist/core/docs/indexer.js +340 -0
  501. package/dist/core/docs/indexer.js.map +1 -0
  502. package/dist/core/drift-effects.d.ts +30 -0
  503. package/dist/core/drift-effects.d.ts.map +1 -0
  504. package/dist/core/drift-effects.js +384 -0
  505. package/dist/core/drift-effects.js.map +1 -0
  506. package/dist/core/event-bus.d.ts +56 -0
  507. package/dist/core/event-bus.d.ts.map +1 -0
  508. package/dist/core/event-bus.js +135 -0
  509. package/dist/core/event-bus.js.map +1 -0
  510. package/dist/core/git-project-docs.d.ts +77 -0
  511. package/dist/core/git-project-docs.d.ts.map +1 -0
  512. package/dist/core/git-project-docs.js +439 -0
  513. package/dist/core/git-project-docs.js.map +1 -0
  514. package/dist/core/health-monitor.d.ts +57 -0
  515. package/dist/core/health-monitor.d.ts.map +1 -0
  516. package/dist/core/health-monitor.js +137 -0
  517. package/dist/core/health-monitor.js.map +1 -0
  518. package/dist/core/heartbeat.d.ts +26 -0
  519. package/dist/core/heartbeat.d.ts.map +1 -0
  520. package/dist/core/heartbeat.js +48 -0
  521. package/dist/core/heartbeat.js.map +1 -0
  522. package/dist/core/integration-health.d.ts +49 -0
  523. package/dist/core/integration-health.d.ts.map +1 -0
  524. package/dist/core/integration-health.js +89 -0
  525. package/dist/core/integration-health.js.map +1 -0
  526. package/dist/core/integration-lifecycle.d.ts +79 -0
  527. package/dist/core/integration-lifecycle.d.ts.map +1 -0
  528. package/dist/core/integration-lifecycle.js +153 -0
  529. package/dist/core/integration-lifecycle.js.map +1 -0
  530. package/dist/core/integration-main-backend.d.ts +36 -0
  531. package/dist/core/integration-main-backend.d.ts.map +1 -0
  532. package/dist/core/integration-main-backend.js +59 -0
  533. package/dist/core/integration-main-backend.js.map +1 -0
  534. package/dist/core/integration-probe.d.ts +98 -0
  535. package/dist/core/integration-probe.d.ts.map +1 -0
  536. package/dist/core/integration-probe.js +152 -0
  537. package/dist/core/integration-probe.js.map +1 -0
  538. package/dist/core/management-md-write-lock.d.ts +68 -0
  539. package/dist/core/management-md-write-lock.d.ts.map +1 -0
  540. package/dist/core/management-md-write-lock.js +93 -0
  541. package/dist/core/management-md-write-lock.js.map +1 -0
  542. package/dist/core/management-md.d.ts +186 -0
  543. package/dist/core/management-md.d.ts.map +1 -0
  544. package/dist/core/management-md.js +652 -0
  545. package/dist/core/management-md.js.map +1 -0
  546. package/dist/core/management-registry.d.ts +245 -0
  547. package/dist/core/management-registry.d.ts.map +1 -0
  548. package/dist/core/management-registry.js +906 -0
  549. package/dist/core/management-registry.js.map +1 -0
  550. package/dist/core/management-telemetry.d.ts +100 -0
  551. package/dist/core/management-telemetry.d.ts.map +1 -0
  552. package/dist/core/management-telemetry.js +156 -0
  553. package/dist/core/management-telemetry.js.map +1 -0
  554. package/dist/core/message-recorder.d.ts +38 -0
  555. package/dist/core/message-recorder.d.ts.map +1 -0
  556. package/dist/core/message-recorder.js +88 -0
  557. package/dist/core/message-recorder.js.map +1 -0
  558. package/dist/core/metrics.d.ts +338 -0
  559. package/dist/core/metrics.d.ts.map +1 -0
  560. package/dist/core/metrics.js +747 -0
  561. package/dist/core/metrics.js.map +1 -0
  562. package/dist/core/migration-backup.d.ts +218 -0
  563. package/dist/core/migration-backup.d.ts.map +1 -0
  564. package/dist/core/migration-backup.js +934 -0
  565. package/dist/core/migration-backup.js.map +1 -0
  566. package/dist/core/overview-write-lock.d.ts +48 -0
  567. package/dist/core/overview-write-lock.d.ts.map +1 -0
  568. package/dist/core/overview-write-lock.js +56 -0
  569. package/dist/core/overview-write-lock.js.map +1 -0
  570. package/dist/core/path-compat.d.ts +22 -0
  571. package/dist/core/path-compat.d.ts.map +1 -0
  572. package/dist/core/path-compat.js +67 -0
  573. package/dist/core/path-compat.js.map +1 -0
  574. package/dist/core/path-rewrite.d.ts +58 -0
  575. package/dist/core/path-rewrite.d.ts.map +1 -0
  576. package/dist/core/path-rewrite.js +141 -0
  577. package/dist/core/path-rewrite.js.map +1 -0
  578. package/dist/core/policy-files.d.ts +108 -0
  579. package/dist/core/policy-files.d.ts.map +1 -0
  580. package/dist/core/policy-files.js +198 -0
  581. package/dist/core/policy-files.js.map +1 -0
  582. package/dist/core/profile-questions/seed.d.ts +44 -0
  583. package/dist/core/profile-questions/seed.d.ts.map +1 -0
  584. package/dist/core/profile-questions/seed.js +173 -0
  585. package/dist/core/profile-questions/seed.js.map +1 -0
  586. package/dist/core/profile-questions/slot-filled.d.ts +51 -0
  587. package/dist/core/profile-questions/slot-filled.d.ts.map +1 -0
  588. package/dist/core/profile-questions/slot-filled.js +118 -0
  589. package/dist/core/profile-questions/slot-filled.js.map +1 -0
  590. package/dist/core/prompts.d.ts +111 -0
  591. package/dist/core/prompts.d.ts.map +1 -0
  592. package/dist/core/prompts.js +267 -0
  593. package/dist/core/prompts.js.map +1 -0
  594. package/dist/core/quiet-hours-sync.d.ts +15 -0
  595. package/dist/core/quiet-hours-sync.d.ts.map +1 -0
  596. package/dist/core/quiet-hours-sync.js +51 -0
  597. package/dist/core/quiet-hours-sync.js.map +1 -0
  598. package/dist/core/read-sensitive-token-manager.d.ts +19 -0
  599. package/dist/core/read-sensitive-token-manager.d.ts.map +1 -0
  600. package/dist/core/read-sensitive-token-manager.js +29 -0
  601. package/dist/core/read-sensitive-token-manager.js.map +1 -0
  602. package/dist/core/recurrence.d.ts +24 -0
  603. package/dist/core/recurrence.d.ts.map +1 -0
  604. package/dist/core/recurrence.js +162 -0
  605. package/dist/core/recurrence.js.map +1 -0
  606. package/dist/core/reinstall.d.ts +107 -0
  607. package/dist/core/reinstall.d.ts.map +1 -0
  608. package/dist/core/reinstall.js +163 -0
  609. package/dist/core/reinstall.js.map +1 -0
  610. package/dist/core/release-assets.d.ts +106 -0
  611. package/dist/core/release-assets.d.ts.map +1 -0
  612. package/dist/core/release-assets.js +434 -0
  613. package/dist/core/release-assets.js.map +1 -0
  614. package/dist/core/repository-management-docs.d.ts +216 -0
  615. package/dist/core/repository-management-docs.d.ts.map +1 -0
  616. package/dist/core/repository-management-docs.js +855 -0
  617. package/dist/core/repository-management-docs.js.map +1 -0
  618. package/dist/core/retention.d.ts +164 -0
  619. package/dist/core/retention.d.ts.map +1 -0
  620. package/dist/core/retention.js +1008 -0
  621. package/dist/core/retention.js.map +1 -0
  622. package/dist/core/review-context.d.ts +48 -0
  623. package/dist/core/review-context.d.ts.map +1 -0
  624. package/dist/core/review-context.js +282 -0
  625. package/dist/core/review-context.js.map +1 -0
  626. package/dist/core/roadmap-horizon.d.ts +48 -0
  627. package/dist/core/roadmap-horizon.d.ts.map +1 -0
  628. package/dist/core/roadmap-horizon.js +213 -0
  629. package/dist/core/roadmap-horizon.js.map +1 -0
  630. package/dist/core/roadmap-ids.d.ts +57 -0
  631. package/dist/core/roadmap-ids.d.ts.map +1 -0
  632. package/dist/core/roadmap-ids.js +118 -0
  633. package/dist/core/roadmap-ids.js.map +1 -0
  634. package/dist/core/roadmap-merge.d.ts +7 -0
  635. package/dist/core/roadmap-merge.d.ts.map +1 -0
  636. package/dist/core/roadmap-merge.js +187 -0
  637. package/dist/core/roadmap-merge.js.map +1 -0
  638. package/dist/core/roadmap-refresh-triggers.d.ts +32 -0
  639. package/dist/core/roadmap-refresh-triggers.d.ts.map +1 -0
  640. package/dist/core/roadmap-refresh-triggers.js +51 -0
  641. package/dist/core/roadmap-refresh-triggers.js.map +1 -0
  642. package/dist/core/roadmap-truncate.d.ts +49 -0
  643. package/dist/core/roadmap-truncate.d.ts.map +1 -0
  644. package/dist/core/roadmap-truncate.js +152 -0
  645. package/dist/core/roadmap-truncate.js.map +1 -0
  646. package/dist/core/roadmap-validate.d.ts +31 -0
  647. package/dist/core/roadmap-validate.d.ts.map +1 -0
  648. package/dist/core/roadmap-validate.js +403 -0
  649. package/dist/core/roadmap-validate.js.map +1 -0
  650. package/dist/core/roadmap-write-lock.d.ts +53 -0
  651. package/dist/core/roadmap-write-lock.d.ts.map +1 -0
  652. package/dist/core/roadmap-write-lock.js +59 -0
  653. package/dist/core/roadmap-write-lock.js.map +1 -0
  654. package/dist/core/schedule-insert-helper.d.ts +46 -0
  655. package/dist/core/schedule-insert-helper.d.ts.map +1 -0
  656. package/dist/core/schedule-insert-helper.js +52 -0
  657. package/dist/core/schedule-insert-helper.js.map +1 -0
  658. package/dist/core/schedule-maintenance.d.ts +22 -0
  659. package/dist/core/schedule-maintenance.d.ts.map +1 -0
  660. package/dist/core/schedule-maintenance.js +57 -0
  661. package/dist/core/schedule-maintenance.js.map +1 -0
  662. package/dist/core/scheduler.d.ts +208 -0
  663. package/dist/core/scheduler.d.ts.map +1 -0
  664. package/dist/core/scheduler.js +896 -0
  665. package/dist/core/scheduler.js.map +1 -0
  666. package/dist/core/semaphore.d.ts +13 -0
  667. package/dist/core/semaphore.d.ts.map +1 -0
  668. package/dist/core/semaphore.js +31 -0
  669. package/dist/core/semaphore.js.map +1 -0
  670. package/dist/core/session-gate.d.ts +37 -0
  671. package/dist/core/session-gate.d.ts.map +1 -0
  672. package/dist/core/session-gate.js +69 -0
  673. package/dist/core/session-gate.js.map +1 -0
  674. package/dist/core/session-manager.d.ts +252 -0
  675. package/dist/core/session-manager.d.ts.map +1 -0
  676. package/dist/core/session-manager.js +716 -0
  677. package/dist/core/session-manager.js.map +1 -0
  678. package/dist/core/signal-detector.d.ts +97 -0
  679. package/dist/core/signal-detector.d.ts.map +1 -0
  680. package/dist/core/signal-detector.js +215 -0
  681. package/dist/core/signal-detector.js.map +1 -0
  682. package/dist/core/skeleton.d.ts +83 -0
  683. package/dist/core/skeleton.d.ts.map +1 -0
  684. package/dist/core/skeleton.js +255 -0
  685. package/dist/core/skeleton.js.map +1 -0
  686. package/dist/core/skill-curation/apply-proposal.d.ts +71 -0
  687. package/dist/core/skill-curation/apply-proposal.d.ts.map +1 -0
  688. package/dist/core/skill-curation/apply-proposal.js +175 -0
  689. package/dist/core/skill-curation/apply-proposal.js.map +1 -0
  690. package/dist/core/skill-curation/auto-revert.d.ts +43 -0
  691. package/dist/core/skill-curation/auto-revert.d.ts.map +1 -0
  692. package/dist/core/skill-curation/auto-revert.js +155 -0
  693. package/dist/core/skill-curation/auto-revert.js.map +1 -0
  694. package/dist/core/skill-curation/classify-diff.d.ts +27 -0
  695. package/dist/core/skill-curation/classify-diff.d.ts.map +1 -0
  696. package/dist/core/skill-curation/classify-diff.js +0 -0
  697. package/dist/core/skill-curation/classify-diff.js.map +1 -0
  698. package/dist/core/skill-curation/declarations.d.ts +32 -0
  699. package/dist/core/skill-curation/declarations.d.ts.map +1 -0
  700. package/dist/core/skill-curation/declarations.js +171 -0
  701. package/dist/core/skill-curation/declarations.js.map +1 -0
  702. package/dist/core/skill-curation/knowledge-map.d.ts +26 -0
  703. package/dist/core/skill-curation/knowledge-map.d.ts.map +1 -0
  704. package/dist/core/skill-curation/knowledge-map.js +154 -0
  705. package/dist/core/skill-curation/knowledge-map.js.map +1 -0
  706. package/dist/core/skill-curation/orphan-overlay.d.ts +35 -0
  707. package/dist/core/skill-curation/orphan-overlay.d.ts.map +1 -0
  708. package/dist/core/skill-curation/orphan-overlay.js +167 -0
  709. package/dist/core/skill-curation/orphan-overlay.js.map +1 -0
  710. package/dist/core/skill-curation/overlay-store.d.ts +41 -0
  711. package/dist/core/skill-curation/overlay-store.d.ts.map +1 -0
  712. package/dist/core/skill-curation/overlay-store.js +143 -0
  713. package/dist/core/skill-curation/overlay-store.js.map +1 -0
  714. package/dist/core/skill-curation/render/convention-notes.d.ts +4 -0
  715. package/dist/core/skill-curation/render/convention-notes.d.ts.map +1 -0
  716. package/dist/core/skill-curation/render/convention-notes.js +13 -0
  717. package/dist/core/skill-curation/render/convention-notes.js.map +1 -0
  718. package/dist/core/skill-curation/render/cross-references.d.ts +4 -0
  719. package/dist/core/skill-curation/render/cross-references.d.ts.map +1 -0
  720. package/dist/core/skill-curation/render/cross-references.js +10 -0
  721. package/dist/core/skill-curation/render/cross-references.js.map +1 -0
  722. package/dist/core/skill-curation/render/frontmatter-schema.d.ts +4 -0
  723. package/dist/core/skill-curation/render/frontmatter-schema.d.ts.map +1 -0
  724. package/dist/core/skill-curation/render/frontmatter-schema.js +25 -0
  725. package/dist/core/skill-curation/render/frontmatter-schema.js.map +1 -0
  726. package/dist/core/skill-curation/render/index.d.ts +5 -0
  727. package/dist/core/skill-curation/render/index.d.ts.map +1 -0
  728. package/dist/core/skill-curation/render/index.js +42 -0
  729. package/dist/core/skill-curation/render/index.js.map +1 -0
  730. package/dist/core/skill-curation/render/knowledge-layout.d.ts +4 -0
  731. package/dist/core/skill-curation/render/knowledge-layout.d.ts.map +1 -0
  732. package/dist/core/skill-curation/render/knowledge-layout.js +36 -0
  733. package/dist/core/skill-curation/render/knowledge-layout.js.map +1 -0
  734. package/dist/core/skill-curation/render/routing-table.d.ts +4 -0
  735. package/dist/core/skill-curation/render/routing-table.d.ts.map +1 -0
  736. package/dist/core/skill-curation/render/routing-table.js +37 -0
  737. package/dist/core/skill-curation/render/routing-table.js.map +1 -0
  738. package/dist/core/skill-curation/render/search-recipes.d.ts +4 -0
  739. package/dist/core/skill-curation/render/search-recipes.d.ts.map +1 -0
  740. package/dist/core/skill-curation/render/search-recipes.js +39 -0
  741. package/dist/core/skill-curation/render/search-recipes.js.map +1 -0
  742. package/dist/core/skill-curation/run-token.d.ts +27 -0
  743. package/dist/core/skill-curation/run-token.d.ts.map +1 -0
  744. package/dist/core/skill-curation/run-token.js +81 -0
  745. package/dist/core/skill-curation/run-token.js.map +1 -0
  746. package/dist/core/skill-curation/signals.d.ts +49 -0
  747. package/dist/core/skill-curation/signals.d.ts.map +1 -0
  748. package/dist/core/skill-curation/signals.js +149 -0
  749. package/dist/core/skill-curation/signals.js.map +1 -0
  750. package/dist/core/skill-curation/smoke-test.d.ts +39 -0
  751. package/dist/core/skill-curation/smoke-test.d.ts.map +1 -0
  752. package/dist/core/skill-curation/smoke-test.js +313 -0
  753. package/dist/core/skill-curation/smoke-test.js.map +1 -0
  754. package/dist/core/skill-curation/splicer.d.ts +16 -0
  755. package/dist/core/skill-curation/splicer.d.ts.map +1 -0
  756. package/dist/core/skill-curation/splicer.js +78 -0
  757. package/dist/core/skill-curation/splicer.js.map +1 -0
  758. package/dist/core/skill-curation/workdir.d.ts +40 -0
  759. package/dist/core/skill-curation/workdir.d.ts.map +1 -0
  760. package/dist/core/skill-curation/workdir.js +242 -0
  761. package/dist/core/skill-curation/workdir.js.map +1 -0
  762. package/dist/core/skills-compiler.d.ts +391 -0
  763. package/dist/core/skills-compiler.d.ts.map +1 -0
  764. package/dist/core/skills-compiler.js +1271 -0
  765. package/dist/core/skills-compiler.js.map +1 -0
  766. package/dist/core/skills-manifest.d.ts +8 -0
  767. package/dist/core/skills-manifest.d.ts.map +1 -0
  768. package/dist/core/skills-manifest.js +408 -0
  769. package/dist/core/skills-manifest.js.map +1 -0
  770. package/dist/core/system-reset.d.ts +268 -0
  771. package/dist/core/system-reset.d.ts.map +1 -0
  772. package/dist/core/system-reset.js +816 -0
  773. package/dist/core/system-reset.js.map +1 -0
  774. package/dist/core/template-store.d.ts +170 -0
  775. package/dist/core/template-store.d.ts.map +1 -0
  776. package/dist/core/template-store.js +388 -0
  777. package/dist/core/template-store.js.map +1 -0
  778. package/dist/core/template-versions.d.ts +95 -0
  779. package/dist/core/template-versions.d.ts.map +1 -0
  780. package/dist/core/template-versions.js +175 -0
  781. package/dist/core/template-versions.js.map +1 -0
  782. package/dist/core/today-agent-plan.d.ts +33 -0
  783. package/dist/core/today-agent-plan.d.ts.map +1 -0
  784. package/dist/core/today-agent-plan.js +120 -0
  785. package/dist/core/today-agent-plan.js.map +1 -0
  786. package/dist/core/today-direct-writer.d.ts +62 -0
  787. package/dist/core/today-direct-writer.d.ts.map +1 -0
  788. package/dist/core/today-direct-writer.js +132 -0
  789. package/dist/core/today-direct-writer.js.map +1 -0
  790. package/dist/core/today-write-lock.d.ts +89 -0
  791. package/dist/core/today-write-lock.d.ts.map +1 -0
  792. package/dist/core/today-write-lock.js +154 -0
  793. package/dist/core/today-write-lock.js.map +1 -0
  794. package/dist/core/trigger-dispatch.d.ts +31 -0
  795. package/dist/core/trigger-dispatch.d.ts.map +1 -0
  796. package/dist/core/trigger-dispatch.js +100 -0
  797. package/dist/core/trigger-dispatch.js.map +1 -0
  798. package/dist/core/trigger-evaluator.d.ts +59 -0
  799. package/dist/core/trigger-evaluator.d.ts.map +1 -0
  800. package/dist/core/trigger-evaluator.js +243 -0
  801. package/dist/core/trigger-evaluator.js.map +1 -0
  802. package/dist/core/workdir.d.ts +241 -0
  803. package/dist/core/workdir.d.ts.map +1 -0
  804. package/dist/core/workdir.js +565 -0
  805. package/dist/core/workdir.js.map +1 -0
  806. package/dist/db/automation-triggers.d.ts +90 -0
  807. package/dist/db/automation-triggers.d.ts.map +1 -0
  808. package/dist/db/automation-triggers.js +199 -0
  809. package/dist/db/automation-triggers.js.map +1 -0
  810. package/dist/db/client.d.ts +6 -0
  811. package/dist/db/client.d.ts.map +1 -0
  812. package/dist/db/client.js +47 -0
  813. package/dist/db/client.js.map +1 -0
  814. package/dist/db/entities-store.d.ts +92 -0
  815. package/dist/db/entities-store.d.ts.map +1 -0
  816. package/dist/db/entities-store.js +180 -0
  817. package/dist/db/entities-store.js.map +1 -0
  818. package/dist/db/hourly-check-signals.d.ts +78 -0
  819. package/dist/db/hourly-check-signals.d.ts.map +1 -0
  820. package/dist/db/hourly-check-signals.js +289 -0
  821. package/dist/db/hourly-check-signals.js.map +1 -0
  822. package/dist/db/integration-probe-store.d.ts +27 -0
  823. package/dist/db/integration-probe-store.d.ts.map +1 -0
  824. package/dist/db/integration-probe-store.js +75 -0
  825. package/dist/db/integration-probe-store.js.map +1 -0
  826. package/dist/db/integrations-store.d.ts +19 -0
  827. package/dist/db/integrations-store.d.ts.map +1 -0
  828. package/dist/db/integrations-store.js +85 -0
  829. package/dist/db/integrations-store.js.map +1 -0
  830. package/dist/db/managed-tasks-store.d.ts +130 -0
  831. package/dist/db/managed-tasks-store.d.ts.map +1 -0
  832. package/dist/db/managed-tasks-store.js +238 -0
  833. package/dist/db/managed-tasks-store.js.map +1 -0
  834. package/dist/db/management-parse-failures-store.d.ts +45 -0
  835. package/dist/db/management-parse-failures-store.d.ts.map +1 -0
  836. package/dist/db/management-parse-failures-store.js +36 -0
  837. package/dist/db/management-parse-failures-store.js.map +1 -0
  838. package/dist/db/observations.d.ts +145 -0
  839. package/dist/db/observations.d.ts.map +1 -0
  840. package/dist/db/observations.js +287 -0
  841. package/dist/db/observations.js.map +1 -0
  842. package/dist/db/recurring-schedules.d.ts +70 -0
  843. package/dist/db/recurring-schedules.d.ts.map +1 -0
  844. package/dist/db/recurring-schedules.js +213 -0
  845. package/dist/db/recurring-schedules.js.map +1 -0
  846. package/dist/db/repositories-store.d.ts +296 -0
  847. package/dist/db/repositories-store.d.ts.map +1 -0
  848. package/dist/db/repositories-store.js +754 -0
  849. package/dist/db/repositories-store.js.map +1 -0
  850. package/dist/db/runtime-state.d.ts +61 -0
  851. package/dist/db/runtime-state.d.ts.map +1 -0
  852. package/dist/db/runtime-state.js +104 -0
  853. package/dist/db/runtime-state.js.map +1 -0
  854. package/dist/db/schema.d.ts +4 -0
  855. package/dist/db/schema.d.ts.map +1 -0
  856. package/dist/db/schema.js +1338 -0
  857. package/dist/db/schema.js.map +1 -0
  858. package/dist/db/sot-bindings-store.d.ts +41 -0
  859. package/dist/db/sot-bindings-store.d.ts.map +1 -0
  860. package/dist/db/sot-bindings-store.js +64 -0
  861. package/dist/db/sot-bindings-store.js.map +1 -0
  862. package/dist/db/test-schemas.d.ts +23 -0
  863. package/dist/db/test-schemas.d.ts.map +1 -0
  864. package/dist/db/test-schemas.js +111 -0
  865. package/dist/db/test-schemas.js.map +1 -0
  866. package/dist/db/voice-transcripts-store.d.ts +28 -0
  867. package/dist/db/voice-transcripts-store.d.ts.map +1 -0
  868. package/dist/db/voice-transcripts-store.js +43 -0
  869. package/dist/db/voice-transcripts-store.js.map +1 -0
  870. package/dist/index.d.ts +2 -0
  871. package/dist/index.d.ts.map +1 -0
  872. package/dist/index.js +2913 -0
  873. package/dist/index.js.map +1 -0
  874. package/dist/init.d.ts +7 -0
  875. package/dist/init.d.ts.map +1 -0
  876. package/dist/init.js +32 -0
  877. package/dist/init.js.map +1 -0
  878. package/dist/log-buffer.d.ts +71 -0
  879. package/dist/log-buffer.d.ts.map +1 -0
  880. package/dist/log-buffer.js +201 -0
  881. package/dist/log-buffer.js.map +1 -0
  882. package/dist/logging.d.ts +5 -0
  883. package/dist/logging.d.ts.map +1 -0
  884. package/dist/logging.js +130 -0
  885. package/dist/logging.js.map +1 -0
  886. package/dist/management-rules.d.ts +2 -0
  887. package/dist/management-rules.d.ts.map +1 -0
  888. package/dist/management-rules.js +62 -0
  889. package/dist/management-rules.js.map +1 -0
  890. package/dist/messaging/constants.d.ts +33 -0
  891. package/dist/messaging/constants.d.ts.map +1 -0
  892. package/dist/messaging/constants.js +52 -0
  893. package/dist/messaging/constants.js.map +1 -0
  894. package/dist/messaging/magic-phrase.d.ts +16 -0
  895. package/dist/messaging/magic-phrase.d.ts.map +1 -0
  896. package/dist/messaging/magic-phrase.js +103 -0
  897. package/dist/messaging/magic-phrase.js.map +1 -0
  898. package/dist/messaging/owner-channels.d.ts +20 -0
  899. package/dist/messaging/owner-channels.d.ts.map +1 -0
  900. package/dist/messaging/owner-channels.js +41 -0
  901. package/dist/messaging/owner-channels.js.map +1 -0
  902. package/dist/observers/calendar-poller.d.ts +51 -0
  903. package/dist/observers/calendar-poller.d.ts.map +1 -0
  904. package/dist/observers/calendar-poller.js +128 -0
  905. package/dist/observers/calendar-poller.js.map +1 -0
  906. package/dist/observers/context-index-reconciler-observer.d.ts +72 -0
  907. package/dist/observers/context-index-reconciler-observer.d.ts.map +1 -0
  908. package/dist/observers/context-index-reconciler-observer.js +253 -0
  909. package/dist/observers/context-index-reconciler-observer.js.map +1 -0
  910. package/dist/observers/delegated-probe-observer.d.ts +83 -0
  911. package/dist/observers/delegated-probe-observer.d.ts.map +1 -0
  912. package/dist/observers/delegated-probe-observer.js +237 -0
  913. package/dist/observers/delegated-probe-observer.js.map +1 -0
  914. package/dist/observers/delegated-sync-worker.d.ts +375 -0
  915. package/dist/observers/delegated-sync-worker.d.ts.map +1 -0
  916. package/dist/observers/delegated-sync-worker.js +1087 -0
  917. package/dist/observers/delegated-sync-worker.js.map +1 -0
  918. package/dist/observers/entity-mirror-observer.d.ts +55 -0
  919. package/dist/observers/entity-mirror-observer.d.ts.map +1 -0
  920. package/dist/observers/entity-mirror-observer.js +73 -0
  921. package/dist/observers/entity-mirror-observer.js.map +1 -0
  922. package/dist/observers/git-delegated-cron.d.ts +41 -0
  923. package/dist/observers/git-delegated-cron.d.ts.map +1 -0
  924. package/dist/observers/git-delegated-cron.js +159 -0
  925. package/dist/observers/git-delegated-cron.js.map +1 -0
  926. package/dist/observers/git-event-classifier.d.ts +52 -0
  927. package/dist/observers/git-event-classifier.d.ts.map +1 -0
  928. package/dist/observers/git-event-classifier.js +70 -0
  929. package/dist/observers/git-event-classifier.js.map +1 -0
  930. package/dist/observers/git-watcher.d.ts +162 -0
  931. package/dist/observers/git-watcher.d.ts.map +1 -0
  932. package/dist/observers/git-watcher.js +768 -0
  933. package/dist/observers/git-watcher.js.map +1 -0
  934. package/dist/observers/github-poller-classifier.d.ts +101 -0
  935. package/dist/observers/github-poller-classifier.d.ts.map +1 -0
  936. package/dist/observers/github-poller-classifier.js +199 -0
  937. package/dist/observers/github-poller-classifier.js.map +1 -0
  938. package/dist/observers/github-poller.d.ts +291 -0
  939. package/dist/observers/github-poller.d.ts.map +1 -0
  940. package/dist/observers/github-poller.js +609 -0
  941. package/dist/observers/github-poller.js.map +1 -0
  942. package/dist/observers/imminent-event-scheduler.d.ts +34 -0
  943. package/dist/observers/imminent-event-scheduler.d.ts.map +1 -0
  944. package/dist/observers/imminent-event-scheduler.js +125 -0
  945. package/dist/observers/imminent-event-scheduler.js.map +1 -0
  946. package/dist/observers/mail-poller.d.ts +133 -0
  947. package/dist/observers/mail-poller.d.ts.map +1 -0
  948. package/dist/observers/mail-poller.js +563 -0
  949. package/dist/observers/mail-poller.js.map +1 -0
  950. package/dist/observers/mail-reconciliation.d.ts +87 -0
  951. package/dist/observers/mail-reconciliation.d.ts.map +1 -0
  952. package/dist/observers/mail-reconciliation.js +241 -0
  953. package/dist/observers/mail-reconciliation.js.map +1 -0
  954. package/dist/observers/manager.d.ts +67 -0
  955. package/dist/observers/manager.d.ts.map +1 -0
  956. package/dist/observers/manager.js +136 -0
  957. package/dist/observers/manager.js.map +1 -0
  958. package/dist/observers/notion-poller.d.ts +43 -0
  959. package/dist/observers/notion-poller.d.ts.map +1 -0
  960. package/dist/observers/notion-poller.js +184 -0
  961. package/dist/observers/notion-poller.js.map +1 -0
  962. package/dist/observers/observation-summarizer/index.d.ts +13 -0
  963. package/dist/observers/observation-summarizer/index.d.ts.map +1 -0
  964. package/dist/observers/observation-summarizer/index.js +13 -0
  965. package/dist/observers/observation-summarizer/index.js.map +1 -0
  966. package/dist/observers/observation-summarizer/pre-filter.d.ts +62 -0
  967. package/dist/observers/observation-summarizer/pre-filter.d.ts.map +1 -0
  968. package/dist/observers/observation-summarizer/pre-filter.js +189 -0
  969. package/dist/observers/observation-summarizer/pre-filter.js.map +1 -0
  970. package/dist/observers/observation-summarizer/response-parser.d.ts +30 -0
  971. package/dist/observers/observation-summarizer/response-parser.d.ts.map +1 -0
  972. package/dist/observers/observation-summarizer/response-parser.js +106 -0
  973. package/dist/observers/observation-summarizer/response-parser.js.map +1 -0
  974. package/dist/observers/observation-summarizer/summarizer-client.d.ts +83 -0
  975. package/dist/observers/observation-summarizer/summarizer-client.d.ts.map +1 -0
  976. package/dist/observers/observation-summarizer/summarizer-client.js +185 -0
  977. package/dist/observers/observation-summarizer/summarizer-client.js.map +1 -0
  978. package/dist/observers/observation-summarizer/summarizer-prompts.d.ts +51 -0
  979. package/dist/observers/observation-summarizer/summarizer-prompts.d.ts.map +1 -0
  980. package/dist/observers/observation-summarizer/summarizer-prompts.js +286 -0
  981. package/dist/observers/observation-summarizer/summarizer-prompts.js.map +1 -0
  982. package/dist/observers/observation-summarizer/worker.d.ts +106 -0
  983. package/dist/observers/observation-summarizer/worker.d.ts.map +1 -0
  984. package/dist/observers/observation-summarizer/worker.js +311 -0
  985. package/dist/observers/observation-summarizer/worker.js.map +1 -0
  986. package/dist/observers/obsidian-watcher.d.ts +90 -0
  987. package/dist/observers/obsidian-watcher.d.ts.map +1 -0
  988. package/dist/observers/obsidian-watcher.js +166 -0
  989. package/dist/observers/obsidian-watcher.js.map +1 -0
  990. package/dist/observers/primary-vault-watcher.d.ts +73 -0
  991. package/dist/observers/primary-vault-watcher.d.ts.map +1 -0
  992. package/dist/observers/primary-vault-watcher.js +115 -0
  993. package/dist/observers/primary-vault-watcher.js.map +1 -0
  994. package/dist/observers/repository-management-cron.d.ts +70 -0
  995. package/dist/observers/repository-management-cron.d.ts.map +1 -0
  996. package/dist/observers/repository-management-cron.js +166 -0
  997. package/dist/observers/repository-management-cron.js.map +1 -0
  998. package/dist/observers/skill-curation-walker.d.ts +33 -0
  999. package/dist/observers/skill-curation-walker.d.ts.map +1 -0
  1000. package/dist/observers/skill-curation-walker.js +216 -0
  1001. package/dist/observers/skill-curation-walker.js.map +1 -0
  1002. package/dist/safety/absolute-block-audit.d.ts +22 -0
  1003. package/dist/safety/absolute-block-audit.d.ts.map +1 -0
  1004. package/dist/safety/absolute-block-audit.js +32 -0
  1005. package/dist/safety/absolute-block-audit.js.map +1 -0
  1006. package/dist/safety/agent-write-tracker.d.ts +42 -0
  1007. package/dist/safety/agent-write-tracker.d.ts.map +1 -0
  1008. package/dist/safety/agent-write-tracker.js +82 -0
  1009. package/dist/safety/agent-write-tracker.js.map +1 -0
  1010. package/dist/safety/always-disallowed.d.ts +66 -0
  1011. package/dist/safety/always-disallowed.d.ts.map +1 -0
  1012. package/dist/safety/always-disallowed.js +347 -0
  1013. package/dist/safety/always-disallowed.js.map +1 -0
  1014. package/dist/safety/audit.d.ts +118 -0
  1015. package/dist/safety/audit.d.ts.map +1 -0
  1016. package/dist/safety/audit.js +324 -0
  1017. package/dist/safety/audit.js.map +1 -0
  1018. package/dist/safety/integration-write-tracker.d.ts +58 -0
  1019. package/dist/safety/integration-write-tracker.d.ts.map +1 -0
  1020. package/dist/safety/integration-write-tracker.js +41 -0
  1021. package/dist/safety/integration-write-tracker.js.map +1 -0
  1022. package/dist/safety/risk-classifier.d.ts +65 -0
  1023. package/dist/safety/risk-classifier.d.ts.map +1 -0
  1024. package/dist/safety/risk-classifier.js +763 -0
  1025. package/dist/safety/risk-classifier.js.map +1 -0
  1026. package/dist/scheduler/hourly-check-gate.d.ts +73 -0
  1027. package/dist/scheduler/hourly-check-gate.d.ts.map +1 -0
  1028. package/dist/scheduler/hourly-check-gate.js +128 -0
  1029. package/dist/scheduler/hourly-check-gate.js.map +1 -0
  1030. package/dist/secrets/backend-api-key-env.d.ts +104 -0
  1031. package/dist/secrets/backend-api-key-env.d.ts.map +1 -0
  1032. package/dist/secrets/backend-api-key-env.js +197 -0
  1033. package/dist/secrets/backend-api-key-env.js.map +1 -0
  1034. package/dist/secrets/codex-home-materializer.d.ts +35 -0
  1035. package/dist/secrets/codex-home-materializer.d.ts.map +1 -0
  1036. package/dist/secrets/codex-home-materializer.js +76 -0
  1037. package/dist/secrets/codex-home-materializer.js.map +1 -0
  1038. package/dist/secrets/encrypted-blob-store.d.ts +20 -0
  1039. package/dist/secrets/encrypted-blob-store.d.ts.map +1 -0
  1040. package/dist/secrets/encrypted-blob-store.js +80 -0
  1041. package/dist/secrets/encrypted-blob-store.js.map +1 -0
  1042. package/dist/secrets/platform-secret-store.d.ts +17 -0
  1043. package/dist/secrets/platform-secret-store.d.ts.map +1 -0
  1044. package/dist/secrets/platform-secret-store.js +37 -0
  1045. package/dist/secrets/platform-secret-store.js.map +1 -0
  1046. package/dist/secrets/redaction.d.ts +2 -0
  1047. package/dist/secrets/redaction.d.ts.map +1 -0
  1048. package/dist/secrets/redaction.js +2 -0
  1049. package/dist/secrets/redaction.js.map +1 -0
  1050. package/dist/secrets/secret-broker.d.ts +61 -0
  1051. package/dist/secrets/secret-broker.d.ts.map +1 -0
  1052. package/dist/secrets/secret-broker.js +160 -0
  1053. package/dist/secrets/secret-broker.js.map +1 -0
  1054. package/dist/secrets/secret-names.d.ts +34 -0
  1055. package/dist/secrets/secret-names.d.ts.map +1 -0
  1056. package/dist/secrets/secret-names.js +39 -0
  1057. package/dist/secrets/secret-names.js.map +1 -0
  1058. package/dist/secrets/secret-store.d.ts +8 -0
  1059. package/dist/secrets/secret-store.d.ts.map +1 -0
  1060. package/dist/secrets/secret-store.js +2 -0
  1061. package/dist/secrets/secret-store.js.map +1 -0
  1062. package/dist/secrets/types.d.ts +7 -0
  1063. package/dist/secrets/types.d.ts.map +1 -0
  1064. package/dist/secrets/types.js +2 -0
  1065. package/dist/secrets/types.js.map +1 -0
  1066. package/dist/services/apple-calendar/caldav-client.d.ts +48 -0
  1067. package/dist/services/apple-calendar/caldav-client.d.ts.map +1 -0
  1068. package/dist/services/apple-calendar/caldav-client.js +86 -0
  1069. package/dist/services/apple-calendar/caldav-client.js.map +1 -0
  1070. package/dist/services/apple-calendar/caldav-codec.d.ts +67 -0
  1071. package/dist/services/apple-calendar/caldav-codec.d.ts.map +1 -0
  1072. package/dist/services/apple-calendar/caldav-codec.js +341 -0
  1073. package/dist/services/apple-calendar/caldav-codec.js.map +1 -0
  1074. package/dist/services/apple-calendar/index.d.ts +3 -0
  1075. package/dist/services/apple-calendar/index.d.ts.map +1 -0
  1076. package/dist/services/apple-calendar/index.js +2 -0
  1077. package/dist/services/apple-calendar/index.js.map +1 -0
  1078. package/dist/services/apple-calendar/service.d.ts +75 -0
  1079. package/dist/services/apple-calendar/service.d.ts.map +1 -0
  1080. package/dist/services/apple-calendar/service.js +374 -0
  1081. package/dist/services/apple-calendar/service.js.map +1 -0
  1082. package/dist/services/apple-calendar/types.d.ts +78 -0
  1083. package/dist/services/apple-calendar/types.d.ts.map +1 -0
  1084. package/dist/services/apple-calendar/types.js +17 -0
  1085. package/dist/services/apple-calendar/types.js.map +1 -0
  1086. package/dist/services/attachments/hardlink.d.ts +11 -0
  1087. package/dist/services/attachments/hardlink.d.ts.map +1 -0
  1088. package/dist/services/attachments/hardlink.js +56 -0
  1089. package/dist/services/attachments/hardlink.js.map +1 -0
  1090. package/dist/services/attachments/sanitize.d.ts +21 -0
  1091. package/dist/services/attachments/sanitize.d.ts.map +1 -0
  1092. package/dist/services/attachments/sanitize.js +128 -0
  1093. package/dist/services/attachments/sanitize.js.map +1 -0
  1094. package/dist/services/attachments/store.d.ts +146 -0
  1095. package/dist/services/attachments/store.d.ts.map +1 -0
  1096. package/dist/services/attachments/store.js +477 -0
  1097. package/dist/services/attachments/store.js.map +1 -0
  1098. package/dist/services/calendar/outlook/graph-calendar-client.d.ts +114 -0
  1099. package/dist/services/calendar/outlook/graph-calendar-client.d.ts.map +1 -0
  1100. package/dist/services/calendar/outlook/graph-calendar-client.js +146 -0
  1101. package/dist/services/calendar/outlook/graph-calendar-client.js.map +1 -0
  1102. package/dist/services/calendar.d.ts +115 -0
  1103. package/dist/services/calendar.d.ts.map +1 -0
  1104. package/dist/services/calendar.js +281 -0
  1105. package/dist/services/calendar.js.map +1 -0
  1106. package/dist/services/delegated-backend-invoker.d.ts +414 -0
  1107. package/dist/services/delegated-backend-invoker.d.ts.map +1 -0
  1108. package/dist/services/delegated-backend-invoker.js +2372 -0
  1109. package/dist/services/delegated-backend-invoker.js.map +1 -0
  1110. package/dist/services/delegated-proxy-config.d.ts +93 -0
  1111. package/dist/services/delegated-proxy-config.d.ts.map +1 -0
  1112. package/dist/services/delegated-proxy-config.js +98 -0
  1113. package/dist/services/delegated-proxy-config.js.map +1 -0
  1114. package/dist/services/delegated-task-result-cache.d.ts +176 -0
  1115. package/dist/services/delegated-task-result-cache.d.ts.map +1 -0
  1116. package/dist/services/delegated-task-result-cache.js +0 -0
  1117. package/dist/services/delegated-task-result-cache.js.map +1 -0
  1118. package/dist/services/delegated-task-runtime.d.ts +346 -0
  1119. package/dist/services/delegated-task-runtime.d.ts.map +1 -0
  1120. package/dist/services/delegated-task-runtime.js +589 -0
  1121. package/dist/services/delegated-task-runtime.js.map +1 -0
  1122. package/dist/services/delegated-task-session-pool.d.ts +182 -0
  1123. package/dist/services/delegated-task-session-pool.d.ts.map +1 -0
  1124. package/dist/services/delegated-task-session-pool.js +292 -0
  1125. package/dist/services/delegated-task-session-pool.js.map +1 -0
  1126. package/dist/services/delegated-tool-runtime.d.ts +50 -0
  1127. package/dist/services/delegated-tool-runtime.d.ts.map +1 -0
  1128. package/dist/services/delegated-tool-runtime.js +120 -0
  1129. package/dist/services/delegated-tool-runtime.js.map +1 -0
  1130. package/dist/services/fts5.d.ts +40 -0
  1131. package/dist/services/fts5.d.ts.map +1 -0
  1132. package/dist/services/fts5.js +54 -0
  1133. package/dist/services/fts5.js.map +1 -0
  1134. package/dist/services/git-account-registry.d.ts +164 -0
  1135. package/dist/services/git-account-registry.d.ts.map +1 -0
  1136. package/dist/services/git-account-registry.js +297 -0
  1137. package/dist/services/git-account-registry.js.map +1 -0
  1138. package/dist/services/github.d.ts +49 -0
  1139. package/dist/services/github.d.ts.map +1 -0
  1140. package/dist/services/github.js +123 -0
  1141. package/dist/services/github.js.map +1 -0
  1142. package/dist/services/gmail-classifier.d.ts +62 -0
  1143. package/dist/services/gmail-classifier.d.ts.map +1 -0
  1144. package/dist/services/gmail-classifier.js +221 -0
  1145. package/dist/services/gmail-classifier.js.map +1 -0
  1146. package/dist/services/gmail.d.ts +192 -0
  1147. package/dist/services/gmail.d.ts.map +1 -0
  1148. package/dist/services/gmail.js +678 -0
  1149. package/dist/services/gmail.js.map +1 -0
  1150. package/dist/services/google-auth.d.ts +16 -0
  1151. package/dist/services/google-auth.d.ts.map +1 -0
  1152. package/dist/services/google-auth.js +37 -0
  1153. package/dist/services/google-auth.js.map +1 -0
  1154. package/dist/services/google-maps.d.ts +35 -0
  1155. package/dist/services/google-maps.d.ts.map +1 -0
  1156. package/dist/services/google-maps.js +82 -0
  1157. package/dist/services/google-maps.js.map +1 -0
  1158. package/dist/services/integrations/extract-write-item-id.d.ts +64 -0
  1159. package/dist/services/integrations/extract-write-item-id.d.ts.map +1 -0
  1160. package/dist/services/integrations/extract-write-item-id.js +188 -0
  1161. package/dist/services/integrations/extract-write-item-id.js.map +1 -0
  1162. package/dist/services/integrations/reconcile.d.ts +136 -0
  1163. package/dist/services/integrations/reconcile.d.ts.map +1 -0
  1164. package/dist/services/integrations/reconcile.js +218 -0
  1165. package/dist/services/integrations/reconcile.js.map +1 -0
  1166. package/dist/services/integrations/snapshot-partitions.d.ts +40 -0
  1167. package/dist/services/integrations/snapshot-partitions.d.ts.map +1 -0
  1168. package/dist/services/integrations/snapshot-partitions.js +113 -0
  1169. package/dist/services/integrations/snapshot-partitions.js.map +1 -0
  1170. package/dist/services/journal/render.d.ts +15 -0
  1171. package/dist/services/journal/render.d.ts.map +1 -0
  1172. package/dist/services/journal/render.js +17 -0
  1173. package/dist/services/journal/render.js.map +1 -0
  1174. package/dist/services/journal/writer.d.ts +26 -0
  1175. package/dist/services/journal/writer.d.ts.map +1 -0
  1176. package/dist/services/journal/writer.js +50 -0
  1177. package/dist/services/journal/writer.js.map +1 -0
  1178. package/dist/services/mail/account-registry.d.ts +208 -0
  1179. package/dist/services/mail/account-registry.d.ts.map +1 -0
  1180. package/dist/services/mail/account-registry.js +554 -0
  1181. package/dist/services/mail/account-registry.js.map +1 -0
  1182. package/dist/services/mail/gmail/auth-failure-classifier.d.ts +24 -0
  1183. package/dist/services/mail/gmail/auth-failure-classifier.d.ts.map +1 -0
  1184. package/dist/services/mail/gmail/auth-failure-classifier.js +67 -0
  1185. package/dist/services/mail/gmail/auth-failure-classifier.js.map +1 -0
  1186. package/dist/services/mail/gmail/gmail-provider.d.ts +58 -0
  1187. package/dist/services/mail/gmail/gmail-provider.d.ts.map +1 -0
  1188. package/dist/services/mail/gmail/gmail-provider.js +434 -0
  1189. package/dist/services/mail/gmail/gmail-provider.js.map +1 -0
  1190. package/dist/services/mail/gmail/legacy-row.d.ts +24 -0
  1191. package/dist/services/mail/gmail/legacy-row.d.ts.map +1 -0
  1192. package/dist/services/mail/gmail/legacy-row.js +71 -0
  1193. package/dist/services/mail/gmail/legacy-row.js.map +1 -0
  1194. package/dist/services/mail/gmail/poll-cursor.d.ts +12 -0
  1195. package/dist/services/mail/gmail/poll-cursor.d.ts.map +1 -0
  1196. package/dist/services/mail/gmail/poll-cursor.js +32 -0
  1197. package/dist/services/mail/gmail/poll-cursor.js.map +1 -0
  1198. package/dist/services/mail/html-to-plaintext.d.ts +27 -0
  1199. package/dist/services/mail/html-to-plaintext.d.ts.map +1 -0
  1200. package/dist/services/mail/html-to-plaintext.js +163 -0
  1201. package/dist/services/mail/html-to-plaintext.js.map +1 -0
  1202. package/dist/services/mail/imap/app-password.d.ts +27 -0
  1203. package/dist/services/mail/imap/app-password.d.ts.map +1 -0
  1204. package/dist/services/mail/imap/app-password.js +86 -0
  1205. package/dist/services/mail/imap/app-password.js.map +1 -0
  1206. package/dist/services/mail/imap/auth-failure-classifier.d.ts +21 -0
  1207. package/dist/services/mail/imap/auth-failure-classifier.d.ts.map +1 -0
  1208. package/dist/services/mail/imap/auth-failure-classifier.js +54 -0
  1209. package/dist/services/mail/imap/auth-failure-classifier.js.map +1 -0
  1210. package/dist/services/mail/imap/capabilities.d.ts +30 -0
  1211. package/dist/services/mail/imap/capabilities.d.ts.map +1 -0
  1212. package/dist/services/mail/imap/capabilities.js +70 -0
  1213. package/dist/services/mail/imap/capabilities.js.map +1 -0
  1214. package/dist/services/mail/imap/client.d.ts +15 -0
  1215. package/dist/services/mail/imap/client.d.ts.map +1 -0
  1216. package/dist/services/mail/imap/client.js +60 -0
  1217. package/dist/services/mail/imap/client.js.map +1 -0
  1218. package/dist/services/mail/imap/cursor.d.ts +19 -0
  1219. package/dist/services/mail/imap/cursor.d.ts.map +1 -0
  1220. package/dist/services/mail/imap/cursor.js +47 -0
  1221. package/dist/services/mail/imap/cursor.js.map +1 -0
  1222. package/dist/services/mail/imap/folder-resolver.d.ts +24 -0
  1223. package/dist/services/mail/imap/folder-resolver.d.ts.map +1 -0
  1224. package/dist/services/mail/imap/folder-resolver.js +58 -0
  1225. package/dist/services/mail/imap/folder-resolver.js.map +1 -0
  1226. package/dist/services/mail/imap/icloud-provider.d.ts +5 -0
  1227. package/dist/services/mail/imap/icloud-provider.d.ts.map +1 -0
  1228. package/dist/services/mail/imap/icloud-provider.js +5 -0
  1229. package/dist/services/mail/imap/icloud-provider.js.map +1 -0
  1230. package/dist/services/mail/imap/imap-provider-base.d.ts +173 -0
  1231. package/dist/services/mail/imap/imap-provider-base.d.ts.map +1 -0
  1232. package/dist/services/mail/imap/imap-provider-base.js +1004 -0
  1233. package/dist/services/mail/imap/imap-provider-base.js.map +1 -0
  1234. package/dist/services/mail/imap/query-translator.d.ts +13 -0
  1235. package/dist/services/mail/imap/query-translator.d.ts.map +1 -0
  1236. package/dist/services/mail/imap/query-translator.js +114 -0
  1237. package/dist/services/mail/imap/query-translator.js.map +1 -0
  1238. package/dist/services/mail/imap/reconcile-planner.d.ts +56 -0
  1239. package/dist/services/mail/imap/reconcile-planner.d.ts.map +1 -0
  1240. package/dist/services/mail/imap/reconcile-planner.js +52 -0
  1241. package/dist/services/mail/imap/reconcile-planner.js.map +1 -0
  1242. package/dist/services/mail/imap/reply-mime.d.ts +24 -0
  1243. package/dist/services/mail/imap/reply-mime.d.ts.map +1 -0
  1244. package/dist/services/mail/imap/reply-mime.js +77 -0
  1245. package/dist/services/mail/imap/reply-mime.js.map +1 -0
  1246. package/dist/services/mail/imap/yahoo-provider.d.ts +5 -0
  1247. package/dist/services/mail/imap/yahoo-provider.d.ts.map +1 -0
  1248. package/dist/services/mail/imap/yahoo-provider.js +5 -0
  1249. package/dist/services/mail/imap/yahoo-provider.js.map +1 -0
  1250. package/dist/services/mail/mail-search.d.ts +35 -0
  1251. package/dist/services/mail/mail-search.d.ts.map +1 -0
  1252. package/dist/services/mail/mail-search.js +59 -0
  1253. package/dist/services/mail/mail-search.js.map +1 -0
  1254. package/dist/services/mail/outlook/auth-failure-classifier.d.ts +38 -0
  1255. package/dist/services/mail/outlook/auth-failure-classifier.d.ts.map +1 -0
  1256. package/dist/services/mail/outlook/auth-failure-classifier.js +91 -0
  1257. package/dist/services/mail/outlook/auth-failure-classifier.js.map +1 -0
  1258. package/dist/services/mail/outlook/client-config.d.ts +34 -0
  1259. package/dist/services/mail/outlook/client-config.d.ts.map +1 -0
  1260. package/dist/services/mail/outlook/client-config.js +58 -0
  1261. package/dist/services/mail/outlook/client-config.js.map +1 -0
  1262. package/dist/services/mail/outlook/delta-cursor.d.ts +66 -0
  1263. package/dist/services/mail/outlook/delta-cursor.d.ts.map +1 -0
  1264. package/dist/services/mail/outlook/delta-cursor.js +85 -0
  1265. package/dist/services/mail/outlook/delta-cursor.js.map +1 -0
  1266. package/dist/services/mail/outlook/graph-client.d.ts +98 -0
  1267. package/dist/services/mail/outlook/graph-client.d.ts.map +1 -0
  1268. package/dist/services/mail/outlook/graph-client.js +198 -0
  1269. package/dist/services/mail/outlook/graph-client.js.map +1 -0
  1270. package/dist/services/mail/outlook/msal-app-factory.d.ts +20 -0
  1271. package/dist/services/mail/outlook/msal-app-factory.d.ts.map +1 -0
  1272. package/dist/services/mail/outlook/msal-app-factory.js +62 -0
  1273. package/dist/services/mail/outlook/msal-app-factory.js.map +1 -0
  1274. package/dist/services/mail/outlook/msal-cache-plugin.d.ts +19 -0
  1275. package/dist/services/mail/outlook/msal-cache-plugin.d.ts.map +1 -0
  1276. package/dist/services/mail/outlook/msal-cache-plugin.js +30 -0
  1277. package/dist/services/mail/outlook/msal-cache-plugin.js.map +1 -0
  1278. package/dist/services/mail/outlook/oauth-device-code.d.ts +26 -0
  1279. package/dist/services/mail/outlook/oauth-device-code.d.ts.map +1 -0
  1280. package/dist/services/mail/outlook/oauth-device-code.js +32 -0
  1281. package/dist/services/mail/outlook/oauth-device-code.js.map +1 -0
  1282. package/dist/services/mail/outlook/oauth-loopback.d.ts +41 -0
  1283. package/dist/services/mail/outlook/oauth-loopback.d.ts.map +1 -0
  1284. package/dist/services/mail/outlook/oauth-loopback.js +223 -0
  1285. package/dist/services/mail/outlook/oauth-loopback.js.map +1 -0
  1286. package/dist/services/mail/outlook/outlook-provider.d.ts +100 -0
  1287. package/dist/services/mail/outlook/outlook-provider.d.ts.map +1 -0
  1288. package/dist/services/mail/outlook/outlook-provider.js +619 -0
  1289. package/dist/services/mail/outlook/outlook-provider.js.map +1 -0
  1290. package/dist/services/mail/outlook/query-translator.d.ts +10 -0
  1291. package/dist/services/mail/outlook/query-translator.d.ts.map +1 -0
  1292. package/dist/services/mail/outlook/query-translator.js +103 -0
  1293. package/dist/services/mail/outlook/query-translator.js.map +1 -0
  1294. package/dist/services/mail/provider.d.ts +267 -0
  1295. package/dist/services/mail/provider.d.ts.map +1 -0
  1296. package/dist/services/mail/provider.js +34 -0
  1297. package/dist/services/mail/provider.js.map +1 -0
  1298. package/dist/services/mail/query-utils.d.ts +13 -0
  1299. package/dist/services/mail/query-utils.d.ts.map +1 -0
  1300. package/dist/services/mail/query-utils.js +18 -0
  1301. package/dist/services/mail/query-utils.js.map +1 -0
  1302. package/dist/services/mail-classifier.d.ts +25 -0
  1303. package/dist/services/mail-classifier.d.ts.map +1 -0
  1304. package/dist/services/mail-classifier.js +52 -0
  1305. package/dist/services/mail-classifier.js.map +1 -0
  1306. package/dist/services/mail-ingestion.d.ts +139 -0
  1307. package/dist/services/mail-ingestion.d.ts.map +1 -0
  1308. package/dist/services/mail-ingestion.js +223 -0
  1309. package/dist/services/mail-ingestion.js.map +1 -0
  1310. package/dist/services/mcp/auto-probe.d.ts +76 -0
  1311. package/dist/services/mcp/auto-probe.d.ts.map +1 -0
  1312. package/dist/services/mcp/auto-probe.js +147 -0
  1313. package/dist/services/mcp/auto-probe.js.map +1 -0
  1314. package/dist/services/mcp/generators/claude.d.ts +18 -0
  1315. package/dist/services/mcp/generators/claude.d.ts.map +1 -0
  1316. package/dist/services/mcp/generators/claude.js +90 -0
  1317. package/dist/services/mcp/generators/claude.js.map +1 -0
  1318. package/dist/services/mcp/generators/codex.d.ts +22 -0
  1319. package/dist/services/mcp/generators/codex.d.ts.map +1 -0
  1320. package/dist/services/mcp/generators/codex.js +102 -0
  1321. package/dist/services/mcp/generators/codex.js.map +1 -0
  1322. package/dist/services/mcp/generators/gemini.d.ts +20 -0
  1323. package/dist/services/mcp/generators/gemini.d.ts.map +1 -0
  1324. package/dist/services/mcp/generators/gemini.js +97 -0
  1325. package/dist/services/mcp/generators/gemini.js.map +1 -0
  1326. package/dist/services/mcp/generators/index.d.ts +20 -0
  1327. package/dist/services/mcp/generators/index.d.ts.map +1 -0
  1328. package/dist/services/mcp/generators/index.js +29 -0
  1329. package/dist/services/mcp/generators/index.js.map +1 -0
  1330. package/dist/services/mcp/generators/types.d.ts +47 -0
  1331. package/dist/services/mcp/generators/types.d.ts.map +1 -0
  1332. package/dist/services/mcp/generators/types.js +40 -0
  1333. package/dist/services/mcp/generators/types.js.map +1 -0
  1334. package/dist/services/mcp/probe.d.ts +31 -0
  1335. package/dist/services/mcp/probe.d.ts.map +1 -0
  1336. package/dist/services/mcp/probe.js +437 -0
  1337. package/dist/services/mcp/probe.js.map +1 -0
  1338. package/dist/services/mcp/registry.d.ts +84 -0
  1339. package/dist/services/mcp/registry.d.ts.map +1 -0
  1340. package/dist/services/mcp/registry.js +387 -0
  1341. package/dist/services/mcp/registry.js.map +1 -0
  1342. package/dist/services/mcp/risk.d.ts +82 -0
  1343. package/dist/services/mcp/risk.d.ts.map +1 -0
  1344. package/dist/services/mcp/risk.js +126 -0
  1345. package/dist/services/mcp/risk.js.map +1 -0
  1346. package/dist/services/mcp/session-materializer.d.ts +123 -0
  1347. package/dist/services/mcp/session-materializer.d.ts.map +1 -0
  1348. package/dist/services/mcp/session-materializer.js +361 -0
  1349. package/dist/services/mcp/session-materializer.js.map +1 -0
  1350. package/dist/services/mcp/tool-audit.d.ts +53 -0
  1351. package/dist/services/mcp/tool-audit.d.ts.map +1 -0
  1352. package/dist/services/mcp/tool-audit.js +74 -0
  1353. package/dist/services/mcp/tool-audit.js.map +1 -0
  1354. package/dist/services/mcp/types.d.ts +88 -0
  1355. package/dist/services/mcp/types.d.ts.map +1 -0
  1356. package/dist/services/mcp/types.js +94 -0
  1357. package/dist/services/mcp/types.js.map +1 -0
  1358. package/dist/services/notion.d.ts +134 -0
  1359. package/dist/services/notion.d.ts.map +1 -0
  1360. package/dist/services/notion.js +350 -0
  1361. package/dist/services/notion.js.map +1 -0
  1362. package/dist/services/obsidian.d.ts +116 -0
  1363. package/dist/services/obsidian.d.ts.map +1 -0
  1364. package/dist/services/obsidian.js +305 -0
  1365. package/dist/services/obsidian.js.map +1 -0
  1366. package/dist/services/service-registry.d.ts +31 -0
  1367. package/dist/services/service-registry.d.ts.map +1 -0
  1368. package/dist/services/service-registry.js +15 -0
  1369. package/dist/services/service-registry.js.map +1 -0
  1370. package/dist/services/voice/transcriber-impl.d.ts +15 -0
  1371. package/dist/services/voice/transcriber-impl.d.ts.map +1 -0
  1372. package/dist/services/voice/transcriber-impl.js +129 -0
  1373. package/dist/services/voice/transcriber-impl.js.map +1 -0
  1374. package/dist/services/voice/transcriber.d.ts +117 -0
  1375. package/dist/services/voice/transcriber.d.ts.map +1 -0
  1376. package/dist/services/voice/transcriber.js +201 -0
  1377. package/dist/services/voice/transcriber.js.map +1 -0
  1378. package/dist/settings/runtime-settings.d.ts +232 -0
  1379. package/dist/settings/runtime-settings.d.ts.map +1 -0
  1380. package/dist/settings/runtime-settings.js +769 -0
  1381. package/dist/settings/runtime-settings.js.map +1 -0
  1382. package/dist/settings/settings-store.d.ts +13 -0
  1383. package/dist/settings/settings-store.d.ts.map +1 -0
  1384. package/dist/settings/settings-store.js +87 -0
  1385. package/dist/settings/settings-store.js.map +1 -0
  1386. package/package.json +85 -0
@@ -0,0 +1,1216 @@
1
+ import { mkdirSync, unlinkSync, writeFileSync, } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { Readable } from "node:stream";
4
+ import { EventPriority, createEvent } from "@aitne/shared";
5
+ import { createLogger } from "../logging.js";
6
+ import { filenameForMime, splitOutboundText } from "./outbound-text.js";
7
+ // Per-type WhatsApp inbound size caps (symmetric with server limits).
8
+ const WA_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
9
+ const WA_AUDIO_MAX_BYTES = 16 * 1024 * 1024;
10
+ const WA_VIDEO_MAX_BYTES = 16 * 1024 * 1024;
11
+ const WA_DOCUMENT_MAX_BYTES = 100 * 1024 * 1024;
12
+ const WA_CAPTION_MAX_CHARS = 1024;
13
+ const logger = createLogger("whatsapp-adapter");
14
+ const OWNER_PHONE_RE = /^\+\d{8,15}$/;
15
+ const USER_JID_SUFFIX = "@s.whatsapp.net";
16
+ const LID_JID_SUFFIX = "@lid";
17
+ const HOSTED_LID_JID_SUFFIX = "@hosted.lid";
18
+ const QR_FILENAME = "qr.txt";
19
+ const QR_TTL_MS = 90_000;
20
+ const OUTBOUND_CHUNK_SIZE = 4000;
21
+ const PRESENCE_REFRESH_MS = 8_000;
22
+ /**
23
+ * How long a successfully-resolved WhatsApp Web client version is cached
24
+ * before we re-fetch from the upstream sources. WhatsApp updates web.whatsapp
25
+ * .com on a roughly weekly cadence, so 12 hours is small enough to keep us
26
+ * out of the "stale → 405" failure mode but large enough to avoid hammering
27
+ * the CDN on every reconnect.
28
+ */
29
+ const WA_VERSION_TTL_MS = 12 * 60 * 60 * 1000;
30
+ /**
31
+ * Reconnect tunables. Initial 1 s, double per attempt, cap at 60 s, plus a
32
+ * small jitter so multiple processes restarting simultaneously do not
33
+ * thunder-herd WhatsApp's relay servers. After RECONNECT_MAX_ATTEMPTS
34
+ * consecutive failures we surface an error state and stop retrying — hammering
35
+ * a relay that keeps closing us is the fast path to an IP-level ban.
36
+ */
37
+ const RECONNECT_INITIAL_DELAY_MS = 1_000;
38
+ const RECONNECT_MAX_DELAY_MS = 60_000;
39
+ const RECONNECT_BACKOFF_FACTOR = 2;
40
+ const RECONNECT_JITTER_MS = 500;
41
+ const RECONNECT_MAX_ATTEMPTS = 10;
42
+ /**
43
+ * Disconnect codes that mean the user must take action — re-pair, fix a
44
+ * conflicting device, or contact WhatsApp. There is no point reconnecting on
45
+ * any of these; we transition straight to "logged_out" and stop the loop.
46
+ *
47
+ * 401 — DisconnectReason.loggedOut
48
+ * 403 — DisconnectReason.forbidden (account banned / IP blocked)
49
+ * 411 — DisconnectReason.multideviceMismatch (linked-device conflict)
50
+ */
51
+ const UNRECOVERABLE_STATUS_CODES = new Set([401, 403, 411]);
52
+ /**
53
+ * Disconnect codes that indicate WhatsApp rejected our **client version**
54
+ * during the noise handshake. The fix is to re-fetch the latest WA Web
55
+ * version from upstream and try again — but the symptom is identical to a
56
+ * generic close, so we both invalidate the version cache here AND let the
57
+ * reconnect backoff handle the retry.
58
+ *
59
+ * 405 — Method Not Allowed (Boom-wrapped from the noise frame decoder)
60
+ * 515 — DisconnectReason.restartRequired (server asked us to restart)
61
+ */
62
+ const VERSION_REJECTED_STATUS_CODES = new Set([405, 515]);
63
+ /**
64
+ * Maximum number of recently-sent WAMessage IDs we keep in memory for echo
65
+ * deduplication. Each entry is ~40 chars; the cap is the sustained outbound
66
+ * burst we tolerate before falling off the trailing edge of the FIFO ring.
67
+ * 256 covers ~8 minutes of one-message-per-2-seconds activity, well beyond
68
+ * normal pacing.
69
+ */
70
+ const SENT_MESSAGE_ID_CAP = 256;
71
+ export function toWhatsAppJid(phone) {
72
+ if (!OWNER_PHONE_RE.test(phone)) {
73
+ throw new Error(`Invalid WhatsApp owner phone "${phone}". Expected E.164 format like +818012345678`);
74
+ }
75
+ return `${phone.slice(1)}${USER_JID_SUFFIX}`;
76
+ }
77
+ function normalizeWhatsAppUserJid(jid) {
78
+ if (typeof jid !== "string")
79
+ return null;
80
+ const at = jid.indexOf("@");
81
+ if (at <= 0)
82
+ return null;
83
+ const local = jid.slice(0, at);
84
+ const server = jid.slice(at + 1);
85
+ const user = local.split(":")[0]?.split("_")[0];
86
+ if (!user || !server)
87
+ return null;
88
+ return `${user}@${server}`;
89
+ }
90
+ function isDirectUserJid(jid) {
91
+ const normalized = normalizeWhatsAppUserJid(jid);
92
+ return normalized !== null
93
+ && (normalized.endsWith(USER_JID_SUFFIX)
94
+ || normalized.endsWith(LID_JID_SUFFIX)
95
+ || normalized.endsWith(HOSTED_LID_JID_SUFFIX));
96
+ }
97
+ export function extractWhatsAppText(message) {
98
+ if (!message)
99
+ return null;
100
+ const direct = message.conversation;
101
+ if (typeof direct === "string" && direct.trim()) {
102
+ return direct;
103
+ }
104
+ const extended = message.extendedTextMessage?.text;
105
+ if (typeof extended === "string" && extended.trim()) {
106
+ return extended;
107
+ }
108
+ const nestedKeys = [
109
+ "ephemeralMessage",
110
+ "viewOnceMessage",
111
+ "viewOnceMessageV2",
112
+ "viewOnceMessageV2Extension",
113
+ "documentWithCaptionMessage",
114
+ ];
115
+ for (const key of nestedKeys) {
116
+ const nested = message[key];
117
+ const nestedText = extractWhatsAppText(nested?.message);
118
+ if (nestedText) {
119
+ return nestedText;
120
+ }
121
+ }
122
+ return null;
123
+ }
124
+ function parseMediaLength(value) {
125
+ if (typeof value === "number" && Number.isFinite(value))
126
+ return value;
127
+ if (typeof value === "bigint")
128
+ return Number(value);
129
+ if (typeof value === "string") {
130
+ const parsed = Number(value);
131
+ return Number.isFinite(parsed) ? parsed : 0;
132
+ }
133
+ if (value && typeof value === "object" && typeof value.toString === "function") {
134
+ const parsed = Number(value.toString());
135
+ return Number.isFinite(parsed) ? parsed : 0;
136
+ }
137
+ return 0;
138
+ }
139
+ function unwrapWhatsAppMessage(message) {
140
+ let current = message;
141
+ for (let i = 0; i < 5; i += 1) {
142
+ if (!current)
143
+ return null;
144
+ const wrapper = current.ephemeralMessage
145
+ ?? current.viewOnceMessage
146
+ ?? current.viewOnceMessageV2
147
+ ?? current.viewOnceMessageV2Extension
148
+ ?? current.documentWithCaptionMessage;
149
+ if (!wrapper?.message)
150
+ return current;
151
+ current = wrapper.message;
152
+ }
153
+ /* v8 ignore next 2 — only reached with > 5 wrapper levels (not seen in practice) */
154
+ return current;
155
+ }
156
+ /**
157
+ * WhatsAppAdapter — Baileys-based owner-only WhatsApp DM integration.
158
+ *
159
+ * Phase 1 accepts messages from exactly one configured owner JID.
160
+ */
161
+ export class WhatsAppAdapter {
162
+ platformName = "whatsapp";
163
+ primaryRecipient;
164
+ authDir;
165
+ onMessage;
166
+ onLoggedOut;
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ sock = null;
169
+ authState = null;
170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ makeWASocket = null;
172
+ renderQr = null;
173
+ renderQrToDataUrl = null;
174
+ fetchLatestWaWebVersion = null;
175
+ fetchLatestBaileysVersion = null;
176
+ generateMessageId = null;
177
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
178
+ downloadMediaMessage = null;
179
+ attachmentStore;
180
+ /**
181
+ * WhatsApp now often addresses the owner's own account as an LID
182
+ * (`<opaque>@lid`) instead of a phone-number JID. We learn that alias from
183
+ * auth creds and treat it as equivalent to the configured owner phone.
184
+ */
185
+ ownerLidRecipient = null;
186
+ /**
187
+ * IDs of WAMessages this adapter has sent on the current Baileys socket.
188
+ * Used to filter Baileys' echo of our own outbound messages out of the
189
+ * incoming `messages.upsert` stream — see {@link handleIncomingMessage}.
190
+ * Bounded to {@link SENT_MESSAGE_ID_CAP} entries with FIFO eviction so a
191
+ * runaway send loop can never grow this unbounded.
192
+ */
193
+ sentMessageIds = new Set();
194
+ loggedOutCode = null;
195
+ connectionState = "disabled";
196
+ shuttingDown = false;
197
+ /**
198
+ * Set while we are intentionally tearing down the current Baileys socket
199
+ * (closeSocket → sock.end() → synchronous `connection.update` re-entry).
200
+ * Without this flag, the close handler would treat the close as a network
201
+ * failure and schedule a reconnect, racing against the legitimate next
202
+ * `connect()` call and ultimately causing WhatsApp to reject one of the
203
+ * sessions with `stream:error type="replaced"` (conflict).
204
+ */
205
+ intentionalClose = false;
206
+ reconnectTimer = null;
207
+ qrExpiryTimer = null;
208
+ latestQr = null;
209
+ lastError = null;
210
+ reconnectAttempts = 0;
211
+ cachedWAVersion = null;
212
+ cachedWAVersionAt = 0;
213
+ constructor(options) {
214
+ this.primaryRecipient = toWhatsAppJid(options.ownerPhone);
215
+ this.authDir = options.authDir;
216
+ this.onMessage = options.onMessage;
217
+ this.onLoggedOut = options.onLoggedOut ?? null;
218
+ this.attachmentStore = options.attachmentStore ?? null;
219
+ }
220
+ getStatus() {
221
+ return this.connectionState;
222
+ }
223
+ getLastError() {
224
+ return this.lastError;
225
+ }
226
+ /**
227
+ * User-visible error derived from the current connection state.
228
+ *
229
+ * `lastError` is the diagnostic record of the most recent failure and stays
230
+ * set across recovery (it's only cleared on `connection === "open"` or via
231
+ * the user-initiated {@link requestQR}). Surfacing it raw to the dashboard
232
+ * means a transient version-rejection (e.g. WhatsApp returning 515 on the
233
+ * first connect, then accepting the second) renders a persistent red alert
234
+ * underneath the QR while pairing is actually proceeding normally.
235
+ *
236
+ * Rule: errors are only "real" when there's no recovery in flight.
237
+ * - `ok` / `connecting` / `awaiting_qr` / `disabled` → null (active or
238
+ * transitioning). `disabled` covers the pre-connect window during
239
+ * {@link start}'s awaits.
240
+ * - `logged_out` → terminal, surface the error.
241
+ * - `disconnected` → if a reconnect timer is pending, recovery is in
242
+ * flight; otherwise we've either hit `RECONNECT_MAX_ATTEMPTS` or the
243
+ * adapter is between attempts with no scheduled retry, both of which
244
+ * are real, user-actionable failures.
245
+ */
246
+ getStatusError() {
247
+ switch (this.connectionState) {
248
+ case "ok":
249
+ case "connecting":
250
+ case "awaiting_qr":
251
+ case "disabled":
252
+ return null;
253
+ case "logged_out":
254
+ return this.lastError ?? "WhatsApp logged out";
255
+ case "disconnected":
256
+ if (this.reconnectTimer !== null)
257
+ return null;
258
+ return this.lastError ?? "WhatsApp disconnected";
259
+ /* v8 ignore next 2 — default branch unreachable with correctly typed connectionState */
260
+ default:
261
+ return this.lastError;
262
+ }
263
+ }
264
+ getNotificationRuntimeStatus() {
265
+ const error = this.getStatusError();
266
+ if (error !== null) {
267
+ return { runtimeState: "error", error };
268
+ }
269
+ switch (this.connectionState) {
270
+ case "ok":
271
+ return { runtimeState: "ok", error: null };
272
+ case "connecting":
273
+ case "awaiting_qr":
274
+ case "disabled":
275
+ // `disabled` is the pre-connect window during {@link start}'s awaits
276
+ // (loadDependencies / ensureAuthState). Mapping it to "error" briefly
277
+ // rendered red on /health polled during that window.
278
+ return { runtimeState: "connecting", error: null };
279
+ case "disconnected":
280
+ // getStatusError returned null → reconnect timer is pending, so this
281
+ // is a transient gap, not a failure. Treat as connecting.
282
+ return { runtimeState: "connecting", error: null };
283
+ /* v8 ignore next 2 — default branch unreachable with correctly typed connectionState */
284
+ default:
285
+ return { runtimeState: "connecting", error: null };
286
+ }
287
+ }
288
+ async requestQR() {
289
+ // User-initiated retry: clear any previous failure state and the
290
+ // backoff counter so the dashboard's "Refresh QR" button always gets a
291
+ // fresh attempt instead of inheriting the last reconnect's exhaustion.
292
+ this.shuttingDown = false;
293
+ this.lastError = null;
294
+ this.reconnectAttempts = 0;
295
+ if (this.reconnectTimer) {
296
+ clearTimeout(this.reconnectTimer);
297
+ this.reconnectTimer = null;
298
+ }
299
+ try {
300
+ await this.loadDependencies();
301
+ this.ensureAuthDir();
302
+ await this.ensureAuthState();
303
+ }
304
+ catch (err) {
305
+ this.lastError = err instanceof Error ? err.message : String(err);
306
+ throw err;
307
+ }
308
+ if (this.sock && this.connectionState === "ok") {
309
+ return;
310
+ }
311
+ if (this.sock) {
312
+ this.closeSocket();
313
+ }
314
+ try {
315
+ await this.connect();
316
+ }
317
+ catch (err) {
318
+ this.lastError = err instanceof Error ? err.message : String(err);
319
+ throw err;
320
+ }
321
+ }
322
+ /**
323
+ * Trigger QR generation (if needed) and wait up to `timeoutMs` for a fresh
324
+ * scannable QR. Returns the snapshot once available, or `null` on timeout /
325
+ * if pairing completes without a QR (already logged in).
326
+ */
327
+ async waitForQr(timeoutMs = 10_000) {
328
+ // connectionState may be mutated by async Baileys callbacks; treat the
329
+ // field as a runtime value, not a TS-narrowed literal across awaits.
330
+ if (this.connectionState === "ok") {
331
+ return null;
332
+ }
333
+ if (this.latestQr && Date.now() - this.latestQr.generatedAt < QR_TTL_MS) {
334
+ return this.latestQr;
335
+ }
336
+ await this.requestQR();
337
+ const deadline = Date.now() + timeoutMs;
338
+ while (Date.now() < deadline) {
339
+ const state = this.connectionState;
340
+ if (state === "ok")
341
+ return null;
342
+ if (state === "logged_out")
343
+ return null;
344
+ if (this.latestQr)
345
+ return this.latestQr;
346
+ await new Promise((resolve) => setTimeout(resolve, 200));
347
+ }
348
+ return this.latestQr;
349
+ }
350
+ /** Returns the rendered scannable QR data URL, or `null` if no QR is current. */
351
+ getQrSnapshot() {
352
+ if (!this.latestQr)
353
+ return null;
354
+ if (Date.now() - this.latestQr.generatedAt > QR_TTL_MS) {
355
+ return null;
356
+ }
357
+ return this.latestQr;
358
+ }
359
+ async start() {
360
+ if (this.sock)
361
+ return;
362
+ this.shuttingDown = false;
363
+ this.reconnectAttempts = 0;
364
+ await this.loadDependencies();
365
+ this.ensureAuthDir();
366
+ await this.ensureAuthState();
367
+ await this.connect();
368
+ }
369
+ async stop() {
370
+ this.shuttingDown = true;
371
+ if (this.reconnectTimer) {
372
+ clearTimeout(this.reconnectTimer);
373
+ this.reconnectTimer = null;
374
+ }
375
+ this.reconnectAttempts = 0;
376
+ this.sentMessageIds.clear();
377
+ this.clearQrSnapshot();
378
+ this.clearQrFile();
379
+ this.closeSocket();
380
+ this.connectionState = "disabled";
381
+ logger.info("WhatsApp adapter disconnected");
382
+ }
383
+ async sendMessage(params) {
384
+ if (!this.sock || this.connectionState !== "ok") {
385
+ throw new Error("WhatsApp socket is not connected");
386
+ }
387
+ const { channel, text, attachments } = params;
388
+ if (!attachments?.length) {
389
+ // Text only — existing behaviour.
390
+ return this.sendWhatsAppText(channel, text);
391
+ }
392
+ // Text + attachments. WhatsApp supports caption on image/document/video
393
+ // calls, but audio/sticker have no caption field. Strategy:
394
+ // - if text ≤ 1024 chars: use text as caption on the first attachment
395
+ // (no separate text message)
396
+ // - otherwise: send text in chunks first, then attachments bare.
397
+ // Baileys is one-media-per-send, so we always loop.
398
+ const captionText = text.length <= WA_CAPTION_MAX_CHARS ? text : null;
399
+ let lastMessageId;
400
+ if (!captionText && text) {
401
+ const result = await this.sendWhatsAppText(channel, text);
402
+ lastMessageId = result.messageId;
403
+ }
404
+ let isFirst = true;
405
+ for (const att of attachments) {
406
+ const caption = isFirst && captionText ? captionText : undefined;
407
+ isFirst = false;
408
+ try {
409
+ const { readFileSync: rfs } = await import("node:fs");
410
+ const buf = rfs(att.path);
411
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
412
+ let mediaPayload;
413
+ if (att.mimeType.startsWith("image/")) {
414
+ mediaPayload = { image: buf, mimetype: att.mimeType, caption };
415
+ }
416
+ else {
417
+ mediaPayload = {
418
+ document: buf,
419
+ mimetype: att.mimeType,
420
+ fileName: att.originalFilename,
421
+ caption,
422
+ };
423
+ }
424
+ const preId = this.generateMessageId?.() ?? null;
425
+ if (preId)
426
+ this.rememberSentMessageId(preId);
427
+ const result = await this.sock.sendMessage(channel, mediaPayload, preId ? { messageId: preId } : undefined);
428
+ const actualId = result?.key?.id;
429
+ if (typeof actualId === "string" && actualId !== preId) {
430
+ this.rememberSentMessageId(actualId);
431
+ }
432
+ lastMessageId = (typeof actualId === "string" ? actualId : preId) ?? lastMessageId;
433
+ }
434
+ catch (err) {
435
+ logger.error({ err, channel, filename: att.originalFilename }, "Failed to send WhatsApp attachment");
436
+ }
437
+ }
438
+ return { messageId: lastMessageId };
439
+ }
440
+ async sendWhatsAppText(channel, text) {
441
+ const chunks = splitOutboundText(text, OUTBOUND_CHUNK_SIZE);
442
+ let lastMessageId;
443
+ for (const chunk of chunks) {
444
+ // Pre-generate the WAMessage id so we can register it BEFORE Baileys
445
+ // begins emitting `messages.upsert` for the outbound. Without this,
446
+ // a self-DM reply could race past the dedup set and be re-ingested
447
+ // as if the user had sent it, looping the agent on its own replies.
448
+ const preId = this.generateMessageId?.() ?? null;
449
+ if (preId)
450
+ this.rememberSentMessageId(preId);
451
+ const result = await this.sock.sendMessage(channel, { text: chunk }, preId ? { messageId: preId } : undefined);
452
+ // If something between us and the test mock didn't honor our
453
+ // pre-generated id, fall back to the id Baileys actually used and
454
+ // record that one as well — better to over-dedup than under-dedup.
455
+ const actualId = result?.key?.id;
456
+ if (typeof actualId === "string" && actualId !== preId) {
457
+ this.rememberSentMessageId(actualId);
458
+ }
459
+ lastMessageId = (typeof actualId === "string" ? actualId : preId) ?? lastMessageId;
460
+ }
461
+ return { messageId: lastMessageId };
462
+ }
463
+ async beginProcessingIndicator(params) {
464
+ let stopped = false;
465
+ const sendPresence = async (state) => {
466
+ if (!this.sock || this.connectionState !== "ok") {
467
+ return;
468
+ }
469
+ if (typeof this.sock.sendPresenceUpdate !== "function") {
470
+ return;
471
+ }
472
+ try {
473
+ await this.sock.sendPresenceUpdate(state, params.channel);
474
+ }
475
+ catch (err) {
476
+ logger.debug({
477
+ channel: params.channel,
478
+ state,
479
+ error: err instanceof Error ? err.message : String(err),
480
+ }, "Failed to update WhatsApp presence");
481
+ }
482
+ };
483
+ await sendPresence("composing");
484
+ const interval = setInterval(() => {
485
+ void sendPresence("composing");
486
+ }, PRESENCE_REFRESH_MS);
487
+ interval.unref?.();
488
+ return {
489
+ stop: async () => {
490
+ if (stopped)
491
+ return;
492
+ stopped = true;
493
+ clearInterval(interval);
494
+ await sendPresence("paused");
495
+ },
496
+ };
497
+ }
498
+ async loadDependencies() {
499
+ if (this.makeWASocket
500
+ && this.renderQr
501
+ && this.renderQrToDataUrl
502
+ && this.fetchLatestWaWebVersion
503
+ && this.fetchLatestBaileysVersion
504
+ && this.generateMessageId
505
+ && this.downloadMediaMessage) {
506
+ return;
507
+ }
508
+ const installHint = "Run: pnpm --filter @aitne/daemon add @whiskeysockets/baileys qrcode-terminal qrcode";
509
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
510
+ let baileys;
511
+ try {
512
+ baileys = await import("@whiskeysockets/baileys");
513
+ /* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
514
+ }
515
+ catch (err) {
516
+ logger.error({ err }, "Failed to load @whiskeysockets/baileys");
517
+ throw new Error(`@whiskeysockets/baileys not installed. ${installHint}`);
518
+ }
519
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
520
+ let qrTermModule;
521
+ try {
522
+ qrTermModule = await import("qrcode-terminal");
523
+ /* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
524
+ }
525
+ catch (err) {
526
+ logger.error({ err }, "Failed to load qrcode-terminal");
527
+ throw new Error(`qrcode-terminal not installed. ${installHint}`);
528
+ }
529
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
530
+ let qrModule;
531
+ try {
532
+ qrModule = await import("qrcode");
533
+ /* v8 ignore next 4 — packages always installed in production; catch only reachable when package is absent */
534
+ }
535
+ catch (err) {
536
+ logger.error({ err }, "Failed to load qrcode");
537
+ throw new Error(`qrcode not installed. ${installHint}`);
538
+ }
539
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
540
+ const makeWASockFn = typeof baileys.default === "function" ? baileys.default : /* v8 ignore next */ baileys.makeWASocket;
541
+ /* v8 ignore next 1 — makeWASockFn is always truthy when Baileys is correctly installed */
542
+ this.makeWASocket = makeWASockFn ?? null;
543
+ /* v8 ignore next 3 — unreachable when Baileys exposes the expected API */
544
+ if (!this.makeWASocket || typeof baileys.useMultiFileAuthState !== "function") {
545
+ throw new Error("Baileys module does not expose the expected API");
546
+ }
547
+ const qrTermLib = /* v8 ignore next */ qrTermModule.default ?? qrTermModule;
548
+ /* v8 ignore next 3 — unreachable when qrcode-terminal exposes generate() */
549
+ if (!qrTermLib || typeof qrTermLib.generate !== "function") {
550
+ throw new Error("qrcode-terminal module does not expose generate()");
551
+ }
552
+ this.renderQr = qrTermLib.generate.bind(qrTermLib);
553
+ const qrLib = /* v8 ignore next */ qrModule.default ?? qrModule;
554
+ /* v8 ignore next 3 — unreachable when qrcode exposes toDataURL() */
555
+ if (!qrLib || typeof qrLib.toDataURL !== "function") {
556
+ throw new Error("qrcode module does not expose toDataURL()");
557
+ }
558
+ this.renderQrToDataUrl = qrLib.toDataURL.bind(qrLib);
559
+ const loggedOutRaw = baileys.DisconnectReason?.loggedOut;
560
+ this.loggedOutCode = typeof loggedOutRaw === "number" ? loggedOutRaw : /* v8 ignore next */ 401;
561
+ // Resolvers for the live WhatsApp Web client version. We capture both:
562
+ // `fetchLatestWaWebVersion` reads web.whatsapp.com's own sw.js (the most
563
+ // authoritative source — it's literally what the desktop client downloads),
564
+ // and `fetchLatestBaileysVersion` falls back to the Baileys master branch
565
+ // when WhatsApp's CDN is unreachable. Both helpers internally fall back to
566
+ // the bundled default if their network call fails, so we never throw.
567
+ if (typeof baileys.fetchLatestWaWebVersion === "function") {
568
+ this.fetchLatestWaWebVersion = baileys.fetchLatestWaWebVersion;
569
+ /* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
570
+ }
571
+ else {
572
+ this.fetchLatestWaWebVersion = null;
573
+ }
574
+ if (typeof baileys.fetchLatestBaileysVersion === "function") {
575
+ this.fetchLatestBaileysVersion = baileys.fetchLatestBaileysVersion;
576
+ /* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
577
+ }
578
+ else {
579
+ this.fetchLatestBaileysVersion = null;
580
+ }
581
+ // Pre-generated WAMessage IDs let us register an outbound id BEFORE
582
+ // calling sock.sendMessage, which closes the race window with the
583
+ // `messages.upsert` Baileys emits via process.nextTick for our own
584
+ // outbound (see Baileys' Socket/messages-send.js → emitOwnEvents).
585
+ // Without this we'd risk treating our own reply as a fresh user message
586
+ // and feedback-looping the daemon.
587
+ if (typeof baileys.generateMessageID === "function") {
588
+ this.generateMessageId = baileys.generateMessageID;
589
+ /* v8 ignore next 4 — generateMessageIDV2 path for older Baileys versions */
590
+ }
591
+ else if (typeof baileys.generateMessageIDV2 === "function") {
592
+ this.generateMessageId = () => baileys.generateMessageIDV2();
593
+ }
594
+ // Phase 2 inbound media download helper.
595
+ if (typeof baileys.downloadMediaMessage === "function") {
596
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
597
+ this.downloadMediaMessage = baileys.downloadMediaMessage;
598
+ /* v8 ignore next 3 — null branch only reachable with a Baileys build that omits this helper */
599
+ }
600
+ else {
601
+ this.downloadMediaMessage = null;
602
+ }
603
+ }
604
+ ensureAuthDir() {
605
+ mkdirSync(this.authDir, { recursive: true, mode: 0o700 });
606
+ }
607
+ async ensureAuthState() {
608
+ if (this.authState) {
609
+ return;
610
+ /* v8 ignore next 9 — real Baileys auth state is always pre-injected in tests; this branch only runs in production */
611
+ }
612
+ else {
613
+ const baileys = await import("@whiskeysockets/baileys");
614
+ const bundle = await baileys.useMultiFileAuthState(this.authDir);
615
+ this.authState = {
616
+ state: bundle.state,
617
+ saveCreds: bundle.saveCreds,
618
+ };
619
+ this.syncOwnerIdentityFromAuthState();
620
+ }
621
+ }
622
+ /**
623
+ * Resolve the WhatsApp Web client version we should advertise during the
624
+ * noise handshake. Cached for {@link WA_VERSION_TTL_MS}; on cache miss we
625
+ * try the live sources in order, falling back to `undefined` (which lets
626
+ * Baileys use its bundled default) if everything fails.
627
+ *
628
+ * Why: Baileys 7.0.0-rc.9 ships with a hard-coded `[2, 3000, 1027934701]`
629
+ * which WhatsApp's relays began rejecting with status 405 (`Method Not
630
+ * Allowed` from the noise frame decoder). Without this resolution every
631
+ * `connect()` failed before a QR could be emitted, leaving the dashboard
632
+ * stuck on "Pairing…".
633
+ */
634
+ async resolveWAVersion() {
635
+ const now = Date.now();
636
+ if (this.cachedWAVersion && now - this.cachedWAVersionAt < WA_VERSION_TTL_MS) {
637
+ return this.cachedWAVersion;
638
+ }
639
+ const tryResolve = async (fn, label) => {
640
+ if (!fn)
641
+ return null;
642
+ try {
643
+ const result = await fn();
644
+ if (result?.isLatest
645
+ && Array.isArray(result.version)
646
+ && result.version.length === 3
647
+ && result.version.every((n) => typeof n === "number" && Number.isFinite(n))) {
648
+ logger.info({ source: label, version: result.version }, "resolved WhatsApp Web version");
649
+ return result.version;
650
+ }
651
+ logger.debug({ source: label, isLatest: result?.isLatest, error: result?.error }, "WhatsApp Web version source returned no fresh version");
652
+ return null;
653
+ }
654
+ catch (err) {
655
+ logger.warn({ err, source: label }, "WhatsApp Web version source threw");
656
+ return null;
657
+ }
658
+ };
659
+ // Authoritative source first; Baileys master branch as a backup.
660
+ const version = (await tryResolve(this.fetchLatestWaWebVersion, "wa-web-sw"))
661
+ ?? (await tryResolve(this.fetchLatestBaileysVersion, "baileys-master"));
662
+ if (version) {
663
+ this.cachedWAVersion = version;
664
+ this.cachedWAVersionAt = now;
665
+ return version;
666
+ }
667
+ logger.warn("falling back to Baileys bundled WhatsApp Web version");
668
+ return undefined;
669
+ }
670
+ invalidateWAVersionCache() {
671
+ if (this.cachedWAVersion) {
672
+ logger.info({ previous: this.cachedWAVersion }, "invalidating cached WhatsApp Web version");
673
+ }
674
+ this.cachedWAVersion = null;
675
+ this.cachedWAVersionAt = 0;
676
+ }
677
+ /**
678
+ * Record a WAMessage id we just generated for an outbound send so the
679
+ * matching `messages.upsert` echo can be filtered out by
680
+ * {@link handleIncomingMessage}.
681
+ *
682
+ * Bounded with FIFO eviction (Sets preserve insertion order in ES2015+).
683
+ * Eviction loss is harmless: it just means a stale id we no longer care
684
+ * about ages out, never that we drop a real user message.
685
+ */
686
+ rememberSentMessageId(id) {
687
+ if (!id)
688
+ return;
689
+ if (this.sentMessageIds.has(id))
690
+ return;
691
+ if (this.sentMessageIds.size >= SENT_MESSAGE_ID_CAP) {
692
+ const oldest = this.sentMessageIds.values().next().value;
693
+ if (oldest !== undefined)
694
+ this.sentMessageIds.delete(oldest);
695
+ }
696
+ this.sentMessageIds.add(id);
697
+ }
698
+ /**
699
+ * Returns true (and removes the id) iff the given id was previously
700
+ * registered via {@link rememberSentMessageId}. Used as a one-shot
701
+ * "is this our own echo?" check; consuming on hit keeps the set lean and
702
+ * avoids re-matching if WhatsApp ever redelivers the same key.
703
+ */
704
+ consumeSentMessageId(id) {
705
+ if (typeof id !== "string" || id.length === 0)
706
+ return false;
707
+ return this.sentMessageIds.delete(id);
708
+ }
709
+ async connect() {
710
+ if (!this.makeWASocket || !this.authState) {
711
+ throw new Error("WhatsApp adapter dependencies are not initialized");
712
+ }
713
+ this.connectionState = "connecting";
714
+ logger.info("whatsapp connecting");
715
+ const version = await this.resolveWAVersion();
716
+ // shuttingDown may have flipped while we awaited the version resolver —
717
+ // bail out cleanly so we don't leak a fresh socket the caller can't see.
718
+ if (this.shuttingDown) {
719
+ this.connectionState = "disabled";
720
+ logger.info("whatsapp connect aborted: shutting down");
721
+ return;
722
+ }
723
+ const sock = this.makeWASocket({
724
+ auth: this.authState.state,
725
+ printQRInTerminal: false,
726
+ // `markOnlineOnConnect: true` registers our session as an *active*
727
+ // device with WhatsApp's relays. WhatsApp routes new messages to
728
+ // active devices first; if every linked device is `unavailable` the
729
+ // message may simply not be pushed to us, which is exactly what
730
+ // happens when this is left at `false` — incoming DMs (including
731
+ // self-DMs) silently never arrive at the daemon. The cosmetic cost
732
+ // is that the user's contacts see one more "online" device, which
733
+ // for a personal agent is exactly what we want anyway.
734
+ markOnlineOnConnect: true,
735
+ // Skip Baileys' initial-history-sync window. With the default
736
+ // (`syncFullHistory: true`), Baileys enters `AwaitingInitialSync`
737
+ // for ~20 s after every connect, buffering all `messages.upsert`
738
+ // events behind a "history sync" gate. We don't care about
739
+ // historical messages — only new ones from this point forward —
740
+ // so we turn the gate off entirely. `shouldSyncHistoryMessage` is
741
+ // a defensive belt-and-braces in case some inner loop still
742
+ // consults it during a partial sync.
743
+ syncFullHistory: false,
744
+ shouldSyncHistoryMessage: () => false,
745
+ /* v8 ignore next 1 — both truthy and falsy version paths tested; V8 ternary branch merge artefact */
746
+ ...(version ? { version } : {}),
747
+ });
748
+ this.sock = sock;
749
+ sock.ev.on("creds.update", this.authState.saveCreds);
750
+ sock.ev.on("creds.update", (update) => {
751
+ this.captureOwnerIdentity(update);
752
+ });
753
+ sock.ev.on("messages.upsert", (payload) => {
754
+ this.handleMessagesUpsert(payload);
755
+ });
756
+ sock.ev.on("connection.update", (update) => {
757
+ void this.handleConnectionUpdate(update, sock);
758
+ });
759
+ }
760
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
761
+ async handleConnectionUpdate(update, sock) {
762
+ if (sock !== this.sock)
763
+ return;
764
+ if (typeof update?.qr === "string") {
765
+ this.connectionState = "awaiting_qr";
766
+ try {
767
+ if (this.renderQr) {
768
+ this.renderQr(update.qr, { small: true });
769
+ }
770
+ await this.captureQr(update.qr);
771
+ }
772
+ catch (err) {
773
+ logger.error({ err }, "Failed to render WhatsApp QR");
774
+ }
775
+ }
776
+ if (update?.connection === "open") {
777
+ this.syncOwnerIdentityFromAuthState();
778
+ this.connectionState = "ok";
779
+ this.lastError = null;
780
+ this.reconnectAttempts = 0;
781
+ this.clearQrSnapshot();
782
+ this.clearQrFile();
783
+ logger.info("whatsapp connected");
784
+ return;
785
+ }
786
+ if (update?.connection !== "close") {
787
+ return;
788
+ }
789
+ // Synchronous re-entry from our own closeSocket → sock.end() flow. Bail
790
+ // out cleanly so we don't double-close (closeSocket is mid-execution
791
+ // already) and don't classify the close as a network failure.
792
+ if (this.intentionalClose) {
793
+ return;
794
+ }
795
+ const statusCode = update?.lastDisconnect?.error?.output?.statusCode
796
+ ?? update?.lastDisconnect?.error?.data?.statusCode
797
+ ?? null;
798
+ this.closeSocket();
799
+ this.clearQrSnapshot();
800
+ this.clearQrFile();
801
+ // Logged out / banned / multidevice mismatch — re-pairing is required.
802
+ // Reconnecting on these is not just useless, it's the fastest way to
803
+ // earn an IP-level rate limit, so we stop the loop entirely.
804
+ const isLoggedOut = statusCode === this.loggedOutCode
805
+ || (typeof statusCode === "number" && UNRECOVERABLE_STATUS_CODES.has(statusCode));
806
+ if (isLoggedOut) {
807
+ this.connectionState = "logged_out";
808
+ /* v8 ignore next 1 — statusCode is always a number when isLoggedOut=true */
809
+ this.lastError = `WhatsApp logged out (status ${statusCode ?? "unknown"}) — re-pair required`;
810
+ this.reconnectAttempts = 0;
811
+ logger.error({ statusCode }, "whatsapp connection closed: logged out");
812
+ if (this.onLoggedOut) {
813
+ try {
814
+ await this.onLoggedOut();
815
+ }
816
+ catch (err) {
817
+ logger.error({ err }, "Failed to notify about WhatsApp logout");
818
+ }
819
+ }
820
+ return;
821
+ }
822
+ if (this.shuttingDown) {
823
+ this.connectionState = "disabled";
824
+ this.reconnectAttempts = 0;
825
+ return;
826
+ }
827
+ // Version-rejection codes mean WhatsApp doesn't accept the client version
828
+ // we advertised. Drop the cache so the next connect re-fetches a fresh
829
+ // version, then fall through to the normal backoff path.
830
+ if (typeof statusCode === "number" && VERSION_REJECTED_STATUS_CODES.has(statusCode)) {
831
+ logger.warn({ statusCode }, "WhatsApp rejected our client version; refetching latest on next attempt");
832
+ this.invalidateWAVersionCache();
833
+ this.lastError = `WhatsApp rejected client version (status ${statusCode})`;
834
+ }
835
+ else {
836
+ this.lastError =
837
+ statusCode != null
838
+ ? `WhatsApp connection closed (status ${statusCode})`
839
+ : "WhatsApp connection closed";
840
+ }
841
+ this.connectionState = "disconnected";
842
+ logger.info({ statusCode, attempt: this.reconnectAttempts + 1 }, "whatsapp connection closed; scheduling reconnect");
843
+ this.scheduleReconnect();
844
+ }
845
+ /**
846
+ * Schedule the next reconnect attempt with full-jitter exponential backoff.
847
+ *
848
+ * - Delay: `min(initial * factor^attempt, max) + random(0, jitter)`
849
+ * - Cap: after {@link RECONNECT_MAX_ATTEMPTS} consecutive failures the loop
850
+ * stops and the adapter sits in `disconnected` until something external
851
+ * (e.g. the dashboard's "Refresh QR" button → `requestQR()`) restarts it.
852
+ *
853
+ * Why a hard cap: when WhatsApp is blocking us (bad version, throttled IP,
854
+ * regional outage) every retry burns CPU and risks escalating the block.
855
+ * Better to surface the error and let the user decide whether to wait it
856
+ * out or rotate IP / re-pair.
857
+ */
858
+ scheduleReconnect() {
859
+ if (this.reconnectTimer || this.shuttingDown)
860
+ return;
861
+ if (this.connectionState === "logged_out")
862
+ return;
863
+ if (this.reconnectAttempts >= RECONNECT_MAX_ATTEMPTS) {
864
+ const previousError = this.lastError ?? "unknown error";
865
+ this.lastError = `WhatsApp reconnect gave up after ${RECONNECT_MAX_ATTEMPTS} attempts (${previousError})`;
866
+ logger.error({ attempts: this.reconnectAttempts, lastError: previousError }, "whatsapp reconnect: max attempts exceeded");
867
+ return;
868
+ }
869
+ const exponential = Math.min(RECONNECT_INITIAL_DELAY_MS * RECONNECT_BACKOFF_FACTOR ** this.reconnectAttempts, RECONNECT_MAX_DELAY_MS);
870
+ const jitter = Math.floor(Math.random() * RECONNECT_JITTER_MS);
871
+ const delayMs = exponential + jitter;
872
+ this.reconnectAttempts += 1;
873
+ logger.info({ attempt: this.reconnectAttempts, delayMs }, "whatsapp reconnect scheduled");
874
+ this.reconnectTimer = setTimeout(() => {
875
+ this.reconnectTimer = null;
876
+ if (this.shuttingDown || this.connectionState === "logged_out") {
877
+ return;
878
+ }
879
+ void this.connect().catch((err) => {
880
+ // connect() throws synchronously on a misconfigured adapter; the
881
+ // close-event path can't recover that, so we have to feed the loop
882
+ // ourselves. Errors here are already counted in reconnectAttempts.
883
+ logger.error({ err }, "whatsapp reconnect attempt threw");
884
+ this.connectionState = "disconnected";
885
+ this.lastError = err instanceof Error ? err.message : String(err);
886
+ this.scheduleReconnect();
887
+ });
888
+ }, delayMs);
889
+ this.reconnectTimer.unref?.();
890
+ }
891
+ handleMessagesUpsert(payload) {
892
+ const messages = Array.isArray(payload?.messages)
893
+ ? payload.messages
894
+ : [];
895
+ for (const message of messages) {
896
+ void this.handleIncomingMessage(message).catch((err) => {
897
+ logger.error({ err }, "whatsapp incoming message handler threw");
898
+ });
899
+ }
900
+ }
901
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
902
+ async handleIncomingMessage(rawMessage) {
903
+ const remoteJid = rawMessage?.key?.remoteJid;
904
+ const messageId = rawMessage?.key?.id;
905
+ const fromMe = rawMessage?.key?.fromMe === true;
906
+ // `fromMe: true` covers two very different cases on a personal-agent
907
+ // WhatsApp setup that uses the owner's own number:
908
+ //
909
+ // 1. The daemon's own outbound message echoing back through Baileys'
910
+ // `messages.upsert` (Baileys emits these via process.nextTick when
911
+ // `emitOwnEvents: true`, which is the default).
912
+ // 2. The owner sending a self-DM from another linked device — this is
913
+ // the natural way the owner talks to their own agent without
914
+ // maintaining a second WhatsApp account.
915
+ //
916
+ // We want to drop case 1 and process case 2. The two are indistinguishable
917
+ // by JID alone (both use the owner's JID as `remoteJid`), so we tell them
918
+ // apart by message id: every id this adapter generates for an outbound
919
+ // send is registered in `sentMessageIds`, and we consume-on-match here.
920
+ if (fromMe) {
921
+ if (this.consumeSentMessageId(typeof messageId === "string" ? messageId : null)) {
922
+ // Our own echo — already accounted for. Nothing to do.
923
+ return;
924
+ }
925
+ logger.debug({ remoteJid, messageId }, "whatsapp ingesting fromMe message (self-DM from another linked device)");
926
+ }
927
+ if (typeof remoteJid !== "string" || !isDirectUserJid(remoteJid)) {
928
+ logger.debug({ remoteJid }, "whatsapp message dropped: non-dm jid");
929
+ return;
930
+ }
931
+ // For both inbound (`fromMe:false`) DMs and self-DMs (`fromMe:true`),
932
+ // `remoteJid` is the chat partner — which for owner-to-owner self-DMs is
933
+ // the owner's own JID. The check below therefore correctly accepts
934
+ // self-DMs and rejects DMs to/from any third party.
935
+ if (!this.isAuthorizedOwnerJid(remoteJid)) {
936
+ logger.debug({ remoteJid }, "whatsapp message dropped: unauthorized sender");
937
+ return;
938
+ }
939
+ const text = extractWhatsAppText(rawMessage?.message) ?? "";
940
+ // Only await media extraction when the store is ready — this preserves
941
+ // synchronous execution for the no-store path so existing tests that call
942
+ // handleMessagesUpsert() without awaiting still work correctly.
943
+ let attachmentRefs = [];
944
+ if (this.attachmentStore && this.downloadMediaMessage) {
945
+ attachmentRefs = await this.extractAndIngestWhatsAppMedia(rawMessage);
946
+ }
947
+ // Drop messages that have neither text nor supported media.
948
+ if (!text && attachmentRefs.length === 0) {
949
+ return;
950
+ }
951
+ const event = createEvent({
952
+ type: "message.received",
953
+ source: "whatsapp",
954
+ priority: EventPriority.HIGH,
955
+ data: {
956
+ waMessageId: rawMessage?.key?.id ?? null,
957
+ },
958
+ });
959
+ Object.assign(event, {
960
+ sender: this.primaryRecipient,
961
+ channel: this.primaryRecipient,
962
+ content: text,
963
+ platform: "whatsapp",
964
+ threadId: null,
965
+ isDm: true,
966
+ isMention: false,
967
+ ...(attachmentRefs.length > 0 ? { attachments: attachmentRefs } : {}),
968
+ });
969
+ this.onMessage(event);
970
+ }
971
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
972
+ async extractAndIngestWhatsAppMedia(rawMessage) {
973
+ /* v8 ignore next 1 — caller already checks attachmentStore && downloadMediaMessage */
974
+ if (!this.attachmentStore || !this.downloadMediaMessage)
975
+ return [];
976
+ const msg = unwrapWhatsAppMessage(rawMessage?.message ?? null);
977
+ if (!msg)
978
+ return [];
979
+ const refs = [];
980
+ // Image
981
+ const imgMsg = msg.imageMessage;
982
+ if (imgMsg) {
983
+ const mimeType = imgMsg.mimetype ?? "image/jpeg";
984
+ const fileLength = parseMediaLength(imgMsg.fileLength);
985
+ const caption = imgMsg.caption;
986
+ if (fileLength > WA_IMAGE_MAX_BYTES) {
987
+ logger.warn({ fileLength }, "whatsapp image exceeds 5 MB cap, skipping");
988
+ }
989
+ else {
990
+ const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("image", mimeType, "jpg"), WA_IMAGE_MAX_BYTES, caption);
991
+ if (ref)
992
+ refs.push(ref);
993
+ }
994
+ return refs; // each message has exactly one media type
995
+ }
996
+ // Document
997
+ const docMsg = msg.documentMessage;
998
+ if (docMsg) {
999
+ const mimeType = docMsg.mimetype ?? "application/octet-stream";
1000
+ const fileLength = parseMediaLength(docMsg.fileLength);
1001
+ const fileName = docMsg.fileName ?? "document";
1002
+ const caption = docMsg.caption;
1003
+ if (fileLength > WA_DOCUMENT_MAX_BYTES) {
1004
+ logger.warn({ fileLength }, "whatsapp document exceeds 100 MB cap, skipping");
1005
+ }
1006
+ else {
1007
+ const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, fileName, WA_DOCUMENT_MAX_BYTES, caption);
1008
+ if (ref)
1009
+ refs.push(ref);
1010
+ }
1011
+ return refs;
1012
+ }
1013
+ const audioMsg = msg.audioMessage;
1014
+ if (audioMsg) {
1015
+ const mimeType = audioMsg.mimetype ?? "audio/ogg";
1016
+ const fileLength = parseMediaLength(audioMsg.fileLength);
1017
+ if (fileLength > WA_AUDIO_MAX_BYTES) {
1018
+ logger.warn({ fileLength }, "whatsapp audio exceeds 16 MB cap, skipping");
1019
+ }
1020
+ else {
1021
+ const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("audio", mimeType, "ogg"), WA_AUDIO_MAX_BYTES);
1022
+ if (ref)
1023
+ refs.push(ref);
1024
+ }
1025
+ return refs;
1026
+ }
1027
+ const videoMsg = msg.videoMessage;
1028
+ if (videoMsg) {
1029
+ const mimeType = videoMsg.mimetype ?? "video/mp4";
1030
+ const fileLength = parseMediaLength(videoMsg.fileLength);
1031
+ const caption = videoMsg.caption;
1032
+ if (fileLength > WA_VIDEO_MAX_BYTES) {
1033
+ logger.warn({ fileLength }, "whatsapp video exceeds 16 MB cap, skipping");
1034
+ }
1035
+ else {
1036
+ const ref = await this.downloadAndIngestWhatsApp(rawMessage, mimeType, filenameForMime("video", mimeType, "mp4"), WA_VIDEO_MAX_BYTES, caption);
1037
+ if (ref)
1038
+ refs.push(ref);
1039
+ }
1040
+ return refs;
1041
+ }
1042
+ if (msg.stickerMessage) {
1043
+ logger.debug("whatsapp sticker ignored");
1044
+ }
1045
+ return refs;
1046
+ }
1047
+ async downloadAndIngestWhatsApp(
1048
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1049
+ rawMessage, mimeType, filename, maxBytes, caption) {
1050
+ /* v8 ignore next 1 — caller (extractAndIngestWhatsAppMedia) already checks both are set */
1051
+ if (!this.downloadMediaMessage || !this.attachmentStore)
1052
+ return null;
1053
+ let buf;
1054
+ try {
1055
+ buf = await this.downloadMediaMessage(rawMessage, "buffer");
1056
+ }
1057
+ catch (err) {
1058
+ logger.error({ err }, "whatsapp downloadMediaMessage failed");
1059
+ return null;
1060
+ }
1061
+ try {
1062
+ const stream = Readable.from([buf]);
1063
+ const result = await this.attachmentStore.ingestStream({
1064
+ stream,
1065
+ declaredMimeType: mimeType,
1066
+ originalFilename: filename,
1067
+ direction: "inbound",
1068
+ provenance: "user_whatsapp",
1069
+ caption,
1070
+ maxSizeBytes: maxBytes,
1071
+ });
1072
+ return {
1073
+ id: result.id,
1074
+ originalFilename: result.originalFilename,
1075
+ mimeType: result.mimeType,
1076
+ sizeBytes: result.sizeBytes,
1077
+ caption,
1078
+ };
1079
+ }
1080
+ catch (err) {
1081
+ logger.error({ err }, "whatsapp file ingest failed");
1082
+ return null;
1083
+ }
1084
+ }
1085
+ captureOwnerIdentity(update) {
1086
+ const me = update?.me;
1087
+ const lid = normalizeWhatsAppUserJid(typeof me?.lid === "string" ? me.lid : null);
1088
+ if (lid) {
1089
+ this.ownerLidRecipient = lid;
1090
+ }
1091
+ }
1092
+ syncOwnerIdentityFromAuthState() {
1093
+ const me = this.authState?.state?.creds?.me;
1094
+ const lid = normalizeWhatsAppUserJid(typeof me?.lid === "string" ? me.lid : null);
1095
+ if (lid) {
1096
+ this.ownerLidRecipient = lid;
1097
+ }
1098
+ }
1099
+ isAuthorizedOwnerJid(jid) {
1100
+ const normalized = normalizeWhatsAppUserJid(jid);
1101
+ /* v8 ignore next 1 — jid already passed isDirectUserJid check, so normalized is never null here */
1102
+ if (!normalized)
1103
+ return false;
1104
+ if (normalized === normalizeWhatsAppUserJid(this.primaryRecipient)) {
1105
+ return true;
1106
+ }
1107
+ this.syncOwnerIdentityFromAuthState();
1108
+ return normalized === this.ownerLidRecipient;
1109
+ }
1110
+ async captureQr(payload) {
1111
+ if (!this.renderQrToDataUrl) {
1112
+ throw new Error("qrcode renderer not initialized");
1113
+ }
1114
+ const dataUrl = await this.renderQrToDataUrl(payload, {
1115
+ width: 320,
1116
+ margin: 2,
1117
+ errorCorrectionLevel: "M",
1118
+ });
1119
+ const now = Date.now();
1120
+ this.latestQr = {
1121
+ payload,
1122
+ dataUrl,
1123
+ generatedAt: now,
1124
+ expiresAt: now + QR_TTL_MS,
1125
+ };
1126
+ this.writeQrFile(payload);
1127
+ }
1128
+ writeQrFile(qr) {
1129
+ try {
1130
+ const qrPath = join(this.authDir, QR_FILENAME);
1131
+ writeFileSync(qrPath, qr, { mode: 0o600 });
1132
+ }
1133
+ catch (err) {
1134
+ logger.warn({ err }, "Failed to persist WhatsApp QR file");
1135
+ }
1136
+ if (this.qrExpiryTimer) {
1137
+ clearTimeout(this.qrExpiryTimer);
1138
+ }
1139
+ this.qrExpiryTimer = setTimeout(() => {
1140
+ this.qrExpiryTimer = null;
1141
+ this.clearQrSnapshot();
1142
+ this.clearQrFile();
1143
+ }, QR_TTL_MS);
1144
+ this.qrExpiryTimer.unref?.();
1145
+ }
1146
+ clearQrSnapshot() {
1147
+ this.latestQr = null;
1148
+ if (this.qrExpiryTimer) {
1149
+ clearTimeout(this.qrExpiryTimer);
1150
+ this.qrExpiryTimer = null;
1151
+ }
1152
+ }
1153
+ clearQrFile() {
1154
+ const qrPath = join(this.authDir, QR_FILENAME);
1155
+ try {
1156
+ unlinkSync(qrPath);
1157
+ }
1158
+ catch {
1159
+ // Ignore missing-file errors.
1160
+ }
1161
+ }
1162
+ /**
1163
+ * Close and forget the current Baileys socket.
1164
+ *
1165
+ * IMPORTANT — ordering matters: Baileys' `sock.end(error)` emits
1166
+ * `connection.update` *synchronously* from inside the call (see
1167
+ * Baileys/Socket/socket.js, the `end()` closure that does
1168
+ * `ev.emit('connection.update', { connection: 'close', ... })`). That re-
1169
+ * enters our own `handleConnectionUpdate` while we are still in the
1170
+ * middle of `closeSocket()`. We defend against this with two layers:
1171
+ *
1172
+ * 1. **Null `this.sock` first.** The handler's `if (sock !== this.sock)`
1173
+ * guard then trivially returns: the synchronous reentry sees a stale
1174
+ * `sock` reference and a fresh-null `this.sock`.
1175
+ * 2. **`intentionalClose` flag.** Even if some other event type fires
1176
+ * after the null-out (e.g. a delayed ws-close on a later tick), the
1177
+ * close handler skips the reconnect classifier path entirely.
1178
+ *
1179
+ * Without these guards the synchronous reentry was scheduling a spurious
1180
+ * reconnect timer that fired ~1 s after our deliberate close, creating a
1181
+ * second concurrent socket. WhatsApp then rejected the older session with
1182
+ * `stream:error type="replaced"`, leaving the connection unstable.
1183
+ */
1184
+ closeSocket() {
1185
+ const sock = this.sock;
1186
+ if (!sock)
1187
+ return;
1188
+ this.sock = null;
1189
+ this.intentionalClose = true;
1190
+ // Remove application-level ev listeners before end(). Baileys' end()
1191
+ // only clears WebSocket-level listeners (ws 'close'/'open'/'message')
1192
+ // but leaves ev listeners (creds.update, messages.upsert, etc.) intact.
1193
+ // Without this, repeated reconnection cycles accumulate stale listeners
1194
+ // on the old socket's EventEmitter until the socket is garbage collected.
1195
+ try {
1196
+ sock.ev?.removeAllListeners?.();
1197
+ }
1198
+ catch {
1199
+ // Ignore — ev may already be torn down.
1200
+ }
1201
+ try {
1202
+ sock.ws?.close?.();
1203
+ }
1204
+ catch {
1205
+ // Ignore socket shutdown errors.
1206
+ }
1207
+ try {
1208
+ sock.end?.(new Error("shutdown"));
1209
+ }
1210
+ catch {
1211
+ // Ignore socket shutdown errors.
1212
+ }
1213
+ this.intentionalClose = false;
1214
+ }
1215
+ }
1216
+ //# sourceMappingURL=whatsapp-adapter.js.map