@qotaq/lalphgram 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 (517) hide show
  1. package/Events/package.json +6 -0
  2. package/LICENSE +21 -0
  3. package/Main/package.json +6 -0
  4. package/README.md +1 -0
  5. package/dist/cjs/Events.js +55 -0
  6. package/dist/cjs/Events.js.map +1 -0
  7. package/dist/cjs/LalphMain.js +59 -0
  8. package/dist/cjs/LalphMain.js.map +1 -0
  9. package/dist/cjs/Main.js +115 -0
  10. package/dist/cjs/Main.js.map +1 -0
  11. package/dist/cjs/index.js +281 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/lib/AnalysisPrompts.js +61 -0
  14. package/dist/cjs/lib/AnalysisPrompts.js.map +1 -0
  15. package/dist/cjs/lib/BranchParser.js +45 -0
  16. package/dist/cjs/lib/BranchParser.js.map +1 -0
  17. package/dist/cjs/lib/MermaidToPlantUml.js +96 -0
  18. package/dist/cjs/lib/MermaidToPlantUml.js.map +1 -0
  19. package/dist/cjs/lib/SpecHtmlGenerator.js +160 -0
  20. package/dist/cjs/lib/SpecHtmlGenerator.js.map +1 -0
  21. package/dist/cjs/lib/StreamJsonParser.js +88 -0
  22. package/dist/cjs/lib/StreamJsonParser.js.map +1 -0
  23. package/dist/cjs/lib/TelegramFormatter.js +122 -0
  24. package/dist/cjs/lib/TelegramFormatter.js.map +1 -0
  25. package/dist/cjs/lib/TelegraphHtml.js +65 -0
  26. package/dist/cjs/lib/TelegraphHtml.js.map +1 -0
  27. package/dist/cjs/lib/TelegraphMarkdown.js +346 -0
  28. package/dist/cjs/lib/TelegraphMarkdown.js.map +1 -0
  29. package/dist/cjs/schemas/CredentialSchemas.js +31 -0
  30. package/dist/cjs/schemas/CredentialSchemas.js.map +1 -0
  31. package/dist/cjs/schemas/GitHubSchemas.js +60 -0
  32. package/dist/cjs/schemas/GitHubSchemas.js.map +1 -0
  33. package/dist/cjs/schemas/LinearSchemas.js +63 -0
  34. package/dist/cjs/schemas/LinearSchemas.js.map +1 -0
  35. package/dist/cjs/schemas/ProjectSchemas.js +26 -0
  36. package/dist/cjs/schemas/ProjectSchemas.js.map +1 -0
  37. package/dist/cjs/schemas/TrackerSchemas.js +35 -0
  38. package/dist/cjs/schemas/TrackerSchemas.js.map +1 -0
  39. package/dist/cjs/services/AppContext.js +57 -0
  40. package/dist/cjs/services/AppContext.js.map +1 -0
  41. package/dist/cjs/services/AppRuntimeConfig.js +35 -0
  42. package/dist/cjs/services/AppRuntimeConfig.js.map +1 -0
  43. package/dist/cjs/services/AutoMerge.js +140 -0
  44. package/dist/cjs/services/AutoMerge.js.map +1 -0
  45. package/dist/cjs/services/ChatMachine.js +873 -0
  46. package/dist/cjs/services/ChatMachine.js.map +1 -0
  47. package/dist/cjs/services/CommentTimer.js +81 -0
  48. package/dist/cjs/services/CommentTimer.js.map +1 -0
  49. package/dist/cjs/services/CredentialStore.js +68 -0
  50. package/dist/cjs/services/CredentialStore.js.map +1 -0
  51. package/dist/cjs/services/CredentialWatcher.js +76 -0
  52. package/dist/cjs/services/CredentialWatcher.js.map +1 -0
  53. package/dist/cjs/services/Credentials.js +130 -0
  54. package/dist/cjs/services/Credentials.js.map +1 -0
  55. package/dist/cjs/services/EventLoop.js +203 -0
  56. package/dist/cjs/services/EventLoop.js.map +1 -0
  57. package/dist/cjs/services/GitHubClient/GitHubClient.js +236 -0
  58. package/dist/cjs/services/GitHubClient/GitHubClient.js.map +1 -0
  59. package/dist/cjs/services/GitHubClient/OctokitClient.js +329 -0
  60. package/dist/cjs/services/GitHubClient/OctokitClient.js.map +1 -0
  61. package/dist/cjs/services/GitHubClient.js +236 -0
  62. package/dist/cjs/services/GitHubClient.js.map +1 -0
  63. package/dist/cjs/services/GitHubEventSource.js +145 -0
  64. package/dist/cjs/services/GitHubEventSource.js.map +1 -0
  65. package/dist/cjs/services/GitHubIssueTracker.js +118 -0
  66. package/dist/cjs/services/GitHubIssueTracker.js.map +1 -0
  67. package/dist/cjs/services/LalphConfig.js +139 -0
  68. package/dist/cjs/services/LalphConfig.js.map +1 -0
  69. package/dist/cjs/services/LalphConfigReader.js +82 -0
  70. package/dist/cjs/services/LalphConfigReader.js.map +1 -0
  71. package/dist/cjs/services/LalphDirectory.js +45 -0
  72. package/dist/cjs/services/LalphDirectory.js.map +1 -0
  73. package/dist/cjs/services/LinearSdkClient.js +149 -0
  74. package/dist/cjs/services/LinearSdkClient.js.map +1 -0
  75. package/dist/cjs/services/LinearTracker.js +89 -0
  76. package/dist/cjs/services/LinearTracker.js.map +1 -0
  77. package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js +30 -0
  78. package/dist/cjs/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
  79. package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js +131 -0
  80. package/dist/cjs/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
  81. package/dist/cjs/services/MessengerAdapter/TelegramConfig.js +81 -0
  82. package/dist/cjs/services/MessengerAdapter/TelegramConfig.js.map +1 -0
  83. package/dist/cjs/services/MessengerAdapter.js +30 -0
  84. package/dist/cjs/services/MessengerAdapter.js.map +1 -0
  85. package/dist/cjs/services/OctokitClient.js +350 -0
  86. package/dist/cjs/services/OctokitClient.js.map +1 -0
  87. package/dist/cjs/services/PlanOverviewUploader.js +119 -0
  88. package/dist/cjs/services/PlanOverviewUploader.js.map +1 -0
  89. package/dist/cjs/services/PlanOverviewUploaderMap.js +25 -0
  90. package/dist/cjs/services/PlanOverviewUploaderMap.js.map +1 -0
  91. package/dist/cjs/services/PlanSession.js +489 -0
  92. package/dist/cjs/services/PlanSession.js.map +1 -0
  93. package/dist/cjs/services/ProjectStore.js +107 -0
  94. package/dist/cjs/services/ProjectStore.js.map +1 -0
  95. package/dist/cjs/services/PullRequestTracker.js +186 -0
  96. package/dist/cjs/services/PullRequestTracker.js.map +1 -0
  97. package/dist/cjs/services/SpecUploader.js +111 -0
  98. package/dist/cjs/services/SpecUploader.js.map +1 -0
  99. package/dist/cjs/services/SpecUploaderMap.js +25 -0
  100. package/dist/cjs/services/SpecUploaderMap.js.map +1 -0
  101. package/dist/cjs/services/TaskEventSource.js +58 -0
  102. package/dist/cjs/services/TaskEventSource.js.map +1 -0
  103. package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js +155 -0
  104. package/dist/cjs/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
  105. package/dist/cjs/services/TaskTracker/LinearSdkClient.js +149 -0
  106. package/dist/cjs/services/TaskTracker/LinearSdkClient.js.map +1 -0
  107. package/dist/cjs/services/TaskTracker/LinearTracker.js +126 -0
  108. package/dist/cjs/services/TaskTracker/LinearTracker.js.map +1 -0
  109. package/dist/cjs/services/TaskTracker/TaskTracker.js +20 -0
  110. package/dist/cjs/services/TaskTracker/TaskTracker.js.map +1 -0
  111. package/dist/cjs/services/TaskTracker/TrackerLayerMap.js +27 -0
  112. package/dist/cjs/services/TaskTracker/TrackerLayerMap.js.map +1 -0
  113. package/dist/cjs/services/TaskTracker/buildEventStream.js +55 -0
  114. package/dist/cjs/services/TaskTracker/buildEventStream.js.map +1 -0
  115. package/dist/cjs/services/TaskTracker.js +20 -0
  116. package/dist/cjs/services/TaskTracker.js.map +1 -0
  117. package/dist/cjs/services/TelegramAdapter.js +125 -0
  118. package/dist/cjs/services/TelegramAdapter.js.map +1 -0
  119. package/dist/cjs/services/TelegramConfig.js +81 -0
  120. package/dist/cjs/services/TelegramConfig.js.map +1 -0
  121. package/dist/cjs/services/TelegramConfigStore.js +81 -0
  122. package/dist/cjs/services/TelegramConfigStore.js.map +1 -0
  123. package/dist/cjs/services/TelegramNotifier.js +50 -0
  124. package/dist/cjs/services/TelegramNotifier.js.map +1 -0
  125. package/dist/cjs/services/TrackerLayerMap.js +27 -0
  126. package/dist/cjs/services/TrackerLayerMap.js.map +1 -0
  127. package/dist/cjs/services/TrackerResolver.js +45 -0
  128. package/dist/cjs/services/TrackerResolver.js.map +1 -0
  129. package/dist/cjs/services/messenger/MessengerAdapter.js +30 -0
  130. package/dist/cjs/services/messenger/MessengerAdapter.js.map +1 -0
  131. package/dist/cjs/services/messenger/TelegramAdapter.js +125 -0
  132. package/dist/cjs/services/messenger/TelegramAdapter.js.map +1 -0
  133. package/dist/cjs/services/task-tracker/GitHubIssueTracker.js +157 -0
  134. package/dist/cjs/services/task-tracker/GitHubIssueTracker.js.map +1 -0
  135. package/dist/cjs/services/task-tracker/LinearTracker.js +127 -0
  136. package/dist/cjs/services/task-tracker/LinearTracker.js.map +1 -0
  137. package/dist/cjs/services/task-tracker/TaskTracker.js +20 -0
  138. package/dist/cjs/services/task-tracker/TaskTracker.js.map +1 -0
  139. package/dist/cjs/services/task-tracker/TrackerLayerMap.js +27 -0
  140. package/dist/cjs/services/task-tracker/TrackerLayerMap.js.map +1 -0
  141. package/dist/cjs/shim/bin.js +31 -0
  142. package/dist/cjs/shim/bin.js.map +1 -0
  143. package/dist/cjs/shim/main.js +217 -0
  144. package/dist/cjs/shim/main.js.map +1 -0
  145. package/dist/cjs/shim/parseArgs.js +45 -0
  146. package/dist/cjs/shim/parseArgs.js.map +1 -0
  147. package/dist/cjs/shim/schemas.js +35 -0
  148. package/dist/cjs/shim/schemas.js.map +1 -0
  149. package/dist/dts/Events.d.ts +108 -0
  150. package/dist/dts/Events.d.ts.map +1 -0
  151. package/dist/dts/LalphMain.d.ts +2 -0
  152. package/dist/dts/LalphMain.d.ts.map +1 -0
  153. package/dist/dts/Main.d.ts +2 -0
  154. package/dist/dts/Main.d.ts.map +1 -0
  155. package/dist/dts/index.d.ts +101 -0
  156. package/dist/dts/index.d.ts.map +1 -0
  157. package/dist/dts/lib/AnalysisPrompts.d.ts +12 -0
  158. package/dist/dts/lib/AnalysisPrompts.d.ts.map +1 -0
  159. package/dist/dts/lib/BranchParser.d.ts +40 -0
  160. package/dist/dts/lib/BranchParser.d.ts.map +1 -0
  161. package/dist/dts/lib/MermaidToPlantUml.d.ts +19 -0
  162. package/dist/dts/lib/MermaidToPlantUml.d.ts.map +1 -0
  163. package/dist/dts/lib/SpecHtmlGenerator.d.ts +18 -0
  164. package/dist/dts/lib/SpecHtmlGenerator.d.ts.map +1 -0
  165. package/dist/dts/lib/StreamJsonParser.d.ts +147 -0
  166. package/dist/dts/lib/StreamJsonParser.d.ts.map +1 -0
  167. package/dist/dts/lib/TelegramFormatter.d.ts +35 -0
  168. package/dist/dts/lib/TelegramFormatter.d.ts.map +1 -0
  169. package/dist/dts/lib/TelegraphHtml.d.ts +11 -0
  170. package/dist/dts/lib/TelegraphHtml.d.ts.map +1 -0
  171. package/dist/dts/lib/TelegraphMarkdown.d.ts +21 -0
  172. package/dist/dts/lib/TelegraphMarkdown.d.ts.map +1 -0
  173. package/dist/dts/schemas/CredentialSchemas.d.ts +41 -0
  174. package/dist/dts/schemas/CredentialSchemas.d.ts.map +1 -0
  175. package/dist/dts/schemas/GitHubSchemas.d.ts +130 -0
  176. package/dist/dts/schemas/GitHubSchemas.d.ts.map +1 -0
  177. package/dist/dts/schemas/LinearSchemas.d.ts +121 -0
  178. package/dist/dts/schemas/LinearSchemas.d.ts.map +1 -0
  179. package/dist/dts/schemas/ProjectSchemas.d.ts +40 -0
  180. package/dist/dts/schemas/ProjectSchemas.d.ts.map +1 -0
  181. package/dist/dts/schemas/TrackerSchemas.d.ts +57 -0
  182. package/dist/dts/schemas/TrackerSchemas.d.ts.map +1 -0
  183. package/dist/dts/services/AppContext.d.ts +40 -0
  184. package/dist/dts/services/AppContext.d.ts.map +1 -0
  185. package/dist/dts/services/AppRuntimeConfig.d.ts +51 -0
  186. package/dist/dts/services/AppRuntimeConfig.d.ts.map +1 -0
  187. package/dist/dts/services/AutoMerge.d.ts +42 -0
  188. package/dist/dts/services/AutoMerge.d.ts.map +1 -0
  189. package/dist/dts/services/ChatMachine.d.ts +478 -0
  190. package/dist/dts/services/ChatMachine.d.ts.map +1 -0
  191. package/dist/dts/services/CommentTimer.d.ts +44 -0
  192. package/dist/dts/services/CommentTimer.d.ts.map +1 -0
  193. package/dist/dts/services/CredentialStore.d.ts +43 -0
  194. package/dist/dts/services/CredentialStore.d.ts.map +1 -0
  195. package/dist/dts/services/CredentialWatcher.d.ts +41 -0
  196. package/dist/dts/services/CredentialWatcher.d.ts.map +1 -0
  197. package/dist/dts/services/Credentials.d.ts +44 -0
  198. package/dist/dts/services/Credentials.d.ts.map +1 -0
  199. package/dist/dts/services/EventLoop.d.ts +26 -0
  200. package/dist/dts/services/EventLoop.d.ts.map +1 -0
  201. package/dist/dts/services/GitHubClient/GitHubClient.d.ts +69 -0
  202. package/dist/dts/services/GitHubClient/GitHubClient.d.ts.map +1 -0
  203. package/dist/dts/services/GitHubClient/OctokitClient.d.ts +214 -0
  204. package/dist/dts/services/GitHubClient/OctokitClient.d.ts.map +1 -0
  205. package/dist/dts/services/GitHubClient.d.ts +69 -0
  206. package/dist/dts/services/GitHubClient.d.ts.map +1 -0
  207. package/dist/dts/services/GitHubEventSource.d.ts +43 -0
  208. package/dist/dts/services/GitHubEventSource.d.ts.map +1 -0
  209. package/dist/dts/services/GitHubIssueTracker.d.ts +9 -0
  210. package/dist/dts/services/GitHubIssueTracker.d.ts.map +1 -0
  211. package/dist/dts/services/LalphConfig.d.ts +44 -0
  212. package/dist/dts/services/LalphConfig.d.ts.map +1 -0
  213. package/dist/dts/services/LalphConfigReader.d.ts +66 -0
  214. package/dist/dts/services/LalphConfigReader.d.ts.map +1 -0
  215. package/dist/dts/services/LalphDirectory.d.ts +39 -0
  216. package/dist/dts/services/LalphDirectory.d.ts.map +1 -0
  217. package/dist/dts/services/LinearSdkClient.d.ts +71 -0
  218. package/dist/dts/services/LinearSdkClient.d.ts.map +1 -0
  219. package/dist/dts/services/LinearTracker.d.ts +9 -0
  220. package/dist/dts/services/LinearTracker.d.ts.map +1 -0
  221. package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts +69 -0
  222. package/dist/dts/services/MessengerAdapter/MessengerAdapter.d.ts.map +1 -0
  223. package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts +13 -0
  224. package/dist/dts/services/MessengerAdapter/TelegramAdapter.d.ts.map +1 -0
  225. package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts +58 -0
  226. package/dist/dts/services/MessengerAdapter/TelegramConfig.d.ts.map +1 -0
  227. package/dist/dts/services/MessengerAdapter.d.ts +69 -0
  228. package/dist/dts/services/MessengerAdapter.d.ts.map +1 -0
  229. package/dist/dts/services/OctokitClient.d.ts +232 -0
  230. package/dist/dts/services/OctokitClient.d.ts.map +1 -0
  231. package/dist/dts/services/PlanOverviewUploader.d.ts +55 -0
  232. package/dist/dts/services/PlanOverviewUploader.d.ts.map +1 -0
  233. package/dist/dts/services/PlanOverviewUploaderMap.d.ts +14 -0
  234. package/dist/dts/services/PlanOverviewUploaderMap.d.ts.map +1 -0
  235. package/dist/dts/services/PlanSession.d.ts +169 -0
  236. package/dist/dts/services/PlanSession.d.ts.map +1 -0
  237. package/dist/dts/services/ProjectStore.d.ts +50 -0
  238. package/dist/dts/services/ProjectStore.d.ts.map +1 -0
  239. package/dist/dts/services/PullRequestTracker.d.ts +42 -0
  240. package/dist/dts/services/PullRequestTracker.d.ts.map +1 -0
  241. package/dist/dts/services/SpecUploader.d.ts +51 -0
  242. package/dist/dts/services/SpecUploader.d.ts.map +1 -0
  243. package/dist/dts/services/SpecUploaderMap.d.ts +14 -0
  244. package/dist/dts/services/SpecUploaderMap.d.ts.map +1 -0
  245. package/dist/dts/services/TaskEventSource.d.ts +21 -0
  246. package/dist/dts/services/TaskEventSource.d.ts.map +1 -0
  247. package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts +10 -0
  248. package/dist/dts/services/TaskTracker/GitHubIssueTracker.d.ts.map +1 -0
  249. package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts +71 -0
  250. package/dist/dts/services/TaskTracker/LinearSdkClient.d.ts.map +1 -0
  251. package/dist/dts/services/TaskTracker/LinearTracker.d.ts +10 -0
  252. package/dist/dts/services/TaskTracker/LinearTracker.d.ts.map +1 -0
  253. package/dist/dts/services/TaskTracker/TaskTracker.d.ts +39 -0
  254. package/dist/dts/services/TaskTracker/TaskTracker.d.ts.map +1 -0
  255. package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts +14 -0
  256. package/dist/dts/services/TaskTracker/TrackerLayerMap.d.ts.map +1 -0
  257. package/dist/dts/services/TaskTracker/buildEventStream.d.ts +16 -0
  258. package/dist/dts/services/TaskTracker/buildEventStream.d.ts.map +1 -0
  259. package/dist/dts/services/TaskTracker.d.ts +38 -0
  260. package/dist/dts/services/TaskTracker.d.ts.map +1 -0
  261. package/dist/dts/services/TelegramAdapter.d.ts +13 -0
  262. package/dist/dts/services/TelegramAdapter.d.ts.map +1 -0
  263. package/dist/dts/services/TelegramConfig.d.ts +58 -0
  264. package/dist/dts/services/TelegramConfig.d.ts.map +1 -0
  265. package/dist/dts/services/TelegramConfigStore.d.ts +57 -0
  266. package/dist/dts/services/TelegramConfigStore.d.ts.map +1 -0
  267. package/dist/dts/services/TelegramNotifier.d.ts +40 -0
  268. package/dist/dts/services/TelegramNotifier.d.ts.map +1 -0
  269. package/dist/dts/services/TrackerLayerMap.d.ts +14 -0
  270. package/dist/dts/services/TrackerLayerMap.d.ts.map +1 -0
  271. package/dist/dts/services/TrackerResolver.d.ts +43 -0
  272. package/dist/dts/services/TrackerResolver.d.ts.map +1 -0
  273. package/dist/dts/services/messenger/MessengerAdapter.d.ts +69 -0
  274. package/dist/dts/services/messenger/MessengerAdapter.d.ts.map +1 -0
  275. package/dist/dts/services/messenger/TelegramAdapter.d.ts +13 -0
  276. package/dist/dts/services/messenger/TelegramAdapter.d.ts.map +1 -0
  277. package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts +10 -0
  278. package/dist/dts/services/task-tracker/GitHubIssueTracker.d.ts.map +1 -0
  279. package/dist/dts/services/task-tracker/LinearTracker.d.ts +10 -0
  280. package/dist/dts/services/task-tracker/LinearTracker.d.ts.map +1 -0
  281. package/dist/dts/services/task-tracker/TaskTracker.d.ts +38 -0
  282. package/dist/dts/services/task-tracker/TaskTracker.d.ts.map +1 -0
  283. package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts +14 -0
  284. package/dist/dts/services/task-tracker/TrackerLayerMap.d.ts.map +1 -0
  285. package/dist/dts/shim/bin.d.ts +3 -0
  286. package/dist/dts/shim/bin.d.ts.map +1 -0
  287. package/dist/dts/shim/main.d.ts +36 -0
  288. package/dist/dts/shim/main.d.ts.map +1 -0
  289. package/dist/dts/shim/parseArgs.d.ts +11 -0
  290. package/dist/dts/shim/parseArgs.d.ts.map +1 -0
  291. package/dist/dts/shim/schemas.d.ts +55 -0
  292. package/dist/dts/shim/schemas.d.ts.map +1 -0
  293. package/dist/esm/Events.js +41 -0
  294. package/dist/esm/Events.js.map +1 -0
  295. package/dist/esm/LalphMain.js +56 -0
  296. package/dist/esm/LalphMain.js.map +1 -0
  297. package/dist/esm/Main.js +112 -0
  298. package/dist/esm/Main.js.map +1 -0
  299. package/dist/esm/index.js +101 -0
  300. package/dist/esm/index.js.map +1 -0
  301. package/dist/esm/lib/AnalysisPrompts.js +54 -0
  302. package/dist/esm/lib/AnalysisPrompts.js.map +1 -0
  303. package/dist/esm/lib/BranchParser.js +36 -0
  304. package/dist/esm/lib/BranchParser.js.map +1 -0
  305. package/dist/esm/lib/MermaidToPlantUml.js +89 -0
  306. package/dist/esm/lib/MermaidToPlantUml.js.map +1 -0
  307. package/dist/esm/lib/SpecHtmlGenerator.js +153 -0
  308. package/dist/esm/lib/SpecHtmlGenerator.js.map +1 -0
  309. package/dist/esm/lib/StreamJsonParser.js +79 -0
  310. package/dist/esm/lib/StreamJsonParser.js.map +1 -0
  311. package/dist/esm/lib/TelegramFormatter.js +114 -0
  312. package/dist/esm/lib/TelegramFormatter.js.map +1 -0
  313. package/dist/esm/lib/TelegraphHtml.js +57 -0
  314. package/dist/esm/lib/TelegraphHtml.js.map +1 -0
  315. package/dist/esm/lib/TelegraphMarkdown.js +338 -0
  316. package/dist/esm/lib/TelegraphMarkdown.js.map +1 -0
  317. package/dist/esm/package.json +4 -0
  318. package/dist/esm/schemas/CredentialSchemas.js +22 -0
  319. package/dist/esm/schemas/CredentialSchemas.js.map +1 -0
  320. package/dist/esm/schemas/GitHubSchemas.js +50 -0
  321. package/dist/esm/schemas/GitHubSchemas.js.map +1 -0
  322. package/dist/esm/schemas/LinearSchemas.js +52 -0
  323. package/dist/esm/schemas/LinearSchemas.js.map +1 -0
  324. package/dist/esm/schemas/ProjectSchemas.js +18 -0
  325. package/dist/esm/schemas/ProjectSchemas.js.map +1 -0
  326. package/dist/esm/schemas/TrackerSchemas.js +26 -0
  327. package/dist/esm/schemas/TrackerSchemas.js.map +1 -0
  328. package/dist/esm/services/AppContext.js +48 -0
  329. package/dist/esm/services/AppContext.js.map +1 -0
  330. package/dist/esm/services/AppRuntimeConfig.js +26 -0
  331. package/dist/esm/services/AppRuntimeConfig.js.map +1 -0
  332. package/dist/esm/services/AutoMerge.js +131 -0
  333. package/dist/esm/services/AutoMerge.js.map +1 -0
  334. package/dist/esm/services/ChatMachine.js +855 -0
  335. package/dist/esm/services/ChatMachine.js.map +1 -0
  336. package/dist/esm/services/CommentTimer.js +72 -0
  337. package/dist/esm/services/CommentTimer.js.map +1 -0
  338. package/dist/esm/services/CredentialStore.js +59 -0
  339. package/dist/esm/services/CredentialStore.js.map +1 -0
  340. package/dist/esm/services/CredentialWatcher.js +67 -0
  341. package/dist/esm/services/CredentialWatcher.js.map +1 -0
  342. package/dist/esm/services/Credentials.js +121 -0
  343. package/dist/esm/services/Credentials.js.map +1 -0
  344. package/dist/esm/services/EventLoop.js +128 -0
  345. package/dist/esm/services/EventLoop.js.map +1 -0
  346. package/dist/esm/services/GitHubClient/GitHubClient.js +227 -0
  347. package/dist/esm/services/GitHubClient/GitHubClient.js.map +1 -0
  348. package/dist/esm/services/GitHubClient/OctokitClient.js +320 -0
  349. package/dist/esm/services/GitHubClient/OctokitClient.js.map +1 -0
  350. package/dist/esm/services/GitHubClient.js +227 -0
  351. package/dist/esm/services/GitHubClient.js.map +1 -0
  352. package/dist/esm/services/GitHubEventSource.js +136 -0
  353. package/dist/esm/services/GitHubEventSource.js.map +1 -0
  354. package/dist/esm/services/GitHubIssueTracker.js +111 -0
  355. package/dist/esm/services/GitHubIssueTracker.js.map +1 -0
  356. package/dist/esm/services/LalphConfig.js +130 -0
  357. package/dist/esm/services/LalphConfig.js.map +1 -0
  358. package/dist/esm/services/LalphConfigReader.js +71 -0
  359. package/dist/esm/services/LalphConfigReader.js.map +1 -0
  360. package/dist/esm/services/LalphDirectory.js +36 -0
  361. package/dist/esm/services/LalphDirectory.js.map +1 -0
  362. package/dist/esm/services/LinearSdkClient.js +140 -0
  363. package/dist/esm/services/LinearSdkClient.js.map +1 -0
  364. package/dist/esm/services/LinearTracker.js +82 -0
  365. package/dist/esm/services/LinearTracker.js.map +1 -0
  366. package/dist/esm/services/MessengerAdapter/MessengerAdapter.js +21 -0
  367. package/dist/esm/services/MessengerAdapter/MessengerAdapter.js.map +1 -0
  368. package/dist/esm/services/MessengerAdapter/TelegramAdapter.js +124 -0
  369. package/dist/esm/services/MessengerAdapter/TelegramAdapter.js.map +1 -0
  370. package/dist/esm/services/MessengerAdapter/TelegramConfig.js +71 -0
  371. package/dist/esm/services/MessengerAdapter/TelegramConfig.js.map +1 -0
  372. package/dist/esm/services/MessengerAdapter.js +21 -0
  373. package/dist/esm/services/MessengerAdapter.js.map +1 -0
  374. package/dist/esm/services/OctokitClient.js +341 -0
  375. package/dist/esm/services/OctokitClient.js.map +1 -0
  376. package/dist/esm/services/PlanOverviewUploader.js +109 -0
  377. package/dist/esm/services/PlanOverviewUploader.js.map +1 -0
  378. package/dist/esm/services/PlanOverviewUploaderMap.js +17 -0
  379. package/dist/esm/services/PlanOverviewUploaderMap.js.map +1 -0
  380. package/dist/esm/services/PlanSession.js +471 -0
  381. package/dist/esm/services/PlanSession.js.map +1 -0
  382. package/dist/esm/services/ProjectStore.js +98 -0
  383. package/dist/esm/services/ProjectStore.js.map +1 -0
  384. package/dist/esm/services/PullRequestTracker.js +177 -0
  385. package/dist/esm/services/PullRequestTracker.js.map +1 -0
  386. package/dist/esm/services/SpecUploader.js +101 -0
  387. package/dist/esm/services/SpecUploader.js.map +1 -0
  388. package/dist/esm/services/SpecUploaderMap.js +17 -0
  389. package/dist/esm/services/SpecUploaderMap.js.map +1 -0
  390. package/dist/esm/services/TaskEventSource.js +50 -0
  391. package/dist/esm/services/TaskEventSource.js.map +1 -0
  392. package/dist/esm/services/TaskTracker/GitHubIssueTracker.js +148 -0
  393. package/dist/esm/services/TaskTracker/GitHubIssueTracker.js.map +1 -0
  394. package/dist/esm/services/TaskTracker/LinearSdkClient.js +140 -0
  395. package/dist/esm/services/TaskTracker/LinearSdkClient.js.map +1 -0
  396. package/dist/esm/services/TaskTracker/LinearTracker.js +119 -0
  397. package/dist/esm/services/TaskTracker/LinearTracker.js.map +1 -0
  398. package/dist/esm/services/TaskTracker/TaskTracker.js +12 -0
  399. package/dist/esm/services/TaskTracker/TaskTracker.js.map +1 -0
  400. package/dist/esm/services/TaskTracker/TrackerLayerMap.js +19 -0
  401. package/dist/esm/services/TaskTracker/TrackerLayerMap.js.map +1 -0
  402. package/dist/esm/services/TaskTracker/buildEventStream.js +47 -0
  403. package/dist/esm/services/TaskTracker/buildEventStream.js.map +1 -0
  404. package/dist/esm/services/TaskTracker.js +12 -0
  405. package/dist/esm/services/TaskTracker.js.map +1 -0
  406. package/dist/esm/services/TelegramAdapter.js +118 -0
  407. package/dist/esm/services/TelegramAdapter.js.map +1 -0
  408. package/dist/esm/services/TelegramConfig.js +71 -0
  409. package/dist/esm/services/TelegramConfig.js.map +1 -0
  410. package/dist/esm/services/TelegramConfigStore.js +71 -0
  411. package/dist/esm/services/TelegramConfigStore.js.map +1 -0
  412. package/dist/esm/services/TelegramNotifier.js +41 -0
  413. package/dist/esm/services/TelegramNotifier.js.map +1 -0
  414. package/dist/esm/services/TrackerLayerMap.js +19 -0
  415. package/dist/esm/services/TrackerLayerMap.js.map +1 -0
  416. package/dist/esm/services/TrackerResolver.js +36 -0
  417. package/dist/esm/services/TrackerResolver.js.map +1 -0
  418. package/dist/esm/services/messenger/MessengerAdapter.js +21 -0
  419. package/dist/esm/services/messenger/MessengerAdapter.js.map +1 -0
  420. package/dist/esm/services/messenger/TelegramAdapter.js +118 -0
  421. package/dist/esm/services/messenger/TelegramAdapter.js.map +1 -0
  422. package/dist/esm/services/task-tracker/GitHubIssueTracker.js +150 -0
  423. package/dist/esm/services/task-tracker/GitHubIssueTracker.js.map +1 -0
  424. package/dist/esm/services/task-tracker/LinearTracker.js +120 -0
  425. package/dist/esm/services/task-tracker/LinearTracker.js.map +1 -0
  426. package/dist/esm/services/task-tracker/TaskTracker.js +12 -0
  427. package/dist/esm/services/task-tracker/TaskTracker.js.map +1 -0
  428. package/dist/esm/services/task-tracker/TrackerLayerMap.js +19 -0
  429. package/dist/esm/services/task-tracker/TrackerLayerMap.js.map +1 -0
  430. package/dist/esm/shim/bin.js +28 -0
  431. package/dist/esm/shim/bin.js.map +1 -0
  432. package/dist/esm/shim/main.js +196 -0
  433. package/dist/esm/shim/main.js.map +1 -0
  434. package/dist/esm/shim/parseArgs.js +39 -0
  435. package/dist/esm/shim/parseArgs.js.map +1 -0
  436. package/dist/esm/shim/schemas.js +28 -0
  437. package/dist/esm/shim/schemas.js.map +1 -0
  438. package/lib/AnalysisPrompts/package.json +6 -0
  439. package/lib/BranchParser/package.json +6 -0
  440. package/lib/MermaidToPlantUml/package.json +6 -0
  441. package/lib/SpecHtmlGenerator/package.json +6 -0
  442. package/lib/StreamJsonParser/package.json +6 -0
  443. package/lib/TelegramFormatter/package.json +6 -0
  444. package/lib/TelegraphMarkdown/package.json +6 -0
  445. package/package.json +360 -0
  446. package/schemas/CredentialSchemas/package.json +6 -0
  447. package/schemas/GitHubSchemas/package.json +6 -0
  448. package/schemas/LinearSchemas/package.json +6 -0
  449. package/schemas/ProjectSchemas/package.json +6 -0
  450. package/schemas/TrackerSchemas/package.json +6 -0
  451. package/services/AppContext/package.json +6 -0
  452. package/services/AppRuntimeConfig/package.json +6 -0
  453. package/services/AutoMerge/package.json +6 -0
  454. package/services/ChatMachine/package.json +6 -0
  455. package/services/CommentTimer/package.json +6 -0
  456. package/services/EventLoop/package.json +6 -0
  457. package/services/GitHubClient/package.json +6 -0
  458. package/services/LalphConfig/package.json +6 -0
  459. package/services/LinearSdkClient/package.json +6 -0
  460. package/services/MessengerAdapter/MessengerAdapter/package.json +6 -0
  461. package/services/MessengerAdapter/TelegramAdapter/package.json +6 -0
  462. package/services/OctokitClient/package.json +6 -0
  463. package/services/PlanOverviewUploader/package.json +6 -0
  464. package/services/PlanOverviewUploaderMap/package.json +6 -0
  465. package/services/PlanSession/package.json +6 -0
  466. package/services/ProjectStore/package.json +6 -0
  467. package/services/PullRequestTracker/package.json +6 -0
  468. package/services/TaskTracker/GitHubIssueTracker/package.json +6 -0
  469. package/services/TaskTracker/LinearTracker/package.json +6 -0
  470. package/services/TaskTracker/TaskTracker/package.json +6 -0
  471. package/services/TelegramConfig/package.json +6 -0
  472. package/services/TrackerLayerMap/package.json +6 -0
  473. package/shim/bin/package.json +6 -0
  474. package/shim/main/package.json +6 -0
  475. package/shim/parseArgs/package.json +6 -0
  476. package/shim/schemas/package.json +6 -0
  477. package/src/Events.ts +98 -0
  478. package/src/Main.ts +177 -0
  479. package/src/index.ts +124 -0
  480. package/src/lib/AnalysisPrompts.ts +54 -0
  481. package/src/lib/BranchParser.ts +58 -0
  482. package/src/lib/MermaidToPlantUml.ts +103 -0
  483. package/src/lib/SpecHtmlGenerator.ts +199 -0
  484. package/src/lib/StreamJsonParser.ts +99 -0
  485. package/src/lib/TelegramFormatter.ts +151 -0
  486. package/src/lib/TelegraphMarkdown.ts +305 -0
  487. package/src/schemas/CredentialSchemas.ts +23 -0
  488. package/src/schemas/GitHubSchemas.ts +50 -0
  489. package/src/schemas/LinearSchemas.ts +57 -0
  490. package/src/schemas/ProjectSchemas.ts +18 -0
  491. package/src/schemas/TrackerSchemas.ts +27 -0
  492. package/src/services/AppContext.ts +72 -0
  493. package/src/services/AppRuntimeConfig.ts +23 -0
  494. package/src/services/AutoMerge.ts +198 -0
  495. package/src/services/ChatMachine.ts +911 -0
  496. package/src/services/CommentTimer.ts +133 -0
  497. package/src/services/EventLoop.ts +321 -0
  498. package/src/services/GitHubClient.ts +282 -0
  499. package/src/services/LalphConfig.ts +218 -0
  500. package/src/services/LinearSdkClient.ts +181 -0
  501. package/src/services/MessengerAdapter/MessengerAdapter.ts +53 -0
  502. package/src/services/MessengerAdapter/TelegramAdapter.ts +145 -0
  503. package/src/services/OctokitClient.ts +628 -0
  504. package/src/services/PlanOverviewUploader.ts +160 -0
  505. package/src/services/PlanOverviewUploaderMap.ts +17 -0
  506. package/src/services/PlanSession.ts +589 -0
  507. package/src/services/ProjectStore.ts +140 -0
  508. package/src/services/PullRequestTracker.ts +253 -0
  509. package/src/services/TaskTracker/GitHubIssueTracker.ts +162 -0
  510. package/src/services/TaskTracker/LinearTracker.ts +141 -0
  511. package/src/services/TaskTracker/TaskTracker.ts +34 -0
  512. package/src/services/TelegramConfig.ts +120 -0
  513. package/src/services/TrackerLayerMap.ts +19 -0
  514. package/src/shim/bin.ts +36 -0
  515. package/src/shim/main.ts +255 -0
  516. package/src/shim/parseArgs.ts +43 -0
  517. package/src/shim/schemas.ts +38 -0
@@ -0,0 +1,873 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.chatMachine = exports.UserMessage = exports.ReadyFlags = exports.REFACTOR_BUTTON_LABEL = exports.PlanTextOutput = exports.PlanSpecUpdatedReq = exports.PlanSpecCreatedReq = exports.PlanQuestionReceived = exports.PlanFailedReq = exports.PlanCompletedReq = exports.PlanAwaitingInputReq = exports.PlanAnalysisReadyReq = exports.PLAN_BUTTON_LABEL = exports.OTHER_BUTTON_LABEL = exports.NEW_PROJECT_BUTTON_LABEL = exports.INTERRUPT_BUTTON_LABEL = exports.IDLE_KEYBOARD = exports.FEATURE_BUTTON_LABEL = exports.DONE_BUTTON_LABEL = exports.DISCARD_BUTTON_LABEL = exports.ChatState = exports.BUG_BUTTON_LABEL = exports.BUFFER_BUTTON_LABEL = exports.APPROVE_BUTTON_LABEL = exports.ABORT_BUTTON_LABEL = void 0;
7
+ var Machine = _interopRequireWildcard(require("@effect/experimental/Machine"));
8
+ var _effect = require("effect");
9
+ var _AnalysisPrompts = require("../lib/AnalysisPrompts.js");
10
+ var _TelegramFormatter = require("../lib/TelegramFormatter.js");
11
+ var _MessengerAdapter = require("./MessengerAdapter/MessengerAdapter.js");
12
+ var _PlanOverviewUploader = require("./PlanOverviewUploader.js");
13
+ var _PlanSession = require("./PlanSession.js");
14
+ var _ProjectStore = require("./ProjectStore.js");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
+ /**
17
+ * Chat state machine using @effect/experimental/Machine
18
+ * @since 1.0.0
19
+ */
20
+
21
+ // ── Button labels ────────────────────────────────────────────────
22
+ const PLAN_BUTTON_LABEL = exports.PLAN_BUTTON_LABEL = "Plan";
23
+ const DONE_BUTTON_LABEL = exports.DONE_BUTTON_LABEL = "Done";
24
+ const FEATURE_BUTTON_LABEL = exports.FEATURE_BUTTON_LABEL = "Feature";
25
+ const BUG_BUTTON_LABEL = exports.BUG_BUTTON_LABEL = "Bug";
26
+ const REFACTOR_BUTTON_LABEL = exports.REFACTOR_BUTTON_LABEL = "Refactor";
27
+ const OTHER_BUTTON_LABEL = exports.OTHER_BUTTON_LABEL = "Other";
28
+ const APPROVE_BUTTON_LABEL = exports.APPROVE_BUTTON_LABEL = "Approve";
29
+ const BUFFER_BUTTON_LABEL = exports.BUFFER_BUTTON_LABEL = "Buffer";
30
+ const INTERRUPT_BUTTON_LABEL = exports.INTERRUPT_BUTTON_LABEL = "Interrupt";
31
+ const DISCARD_BUTTON_LABEL = exports.DISCARD_BUTTON_LABEL = "Discard";
32
+ const ABORT_BUTTON_LABEL = exports.ABORT_BUTTON_LABEL = "Abort";
33
+ const NEW_PROJECT_BUTTON_LABEL = exports.NEW_PROJECT_BUTTON_LABEL = "New project";
34
+ const MY_ANSWER_BUTTON_LABEL = "Custom answer";
35
+ const BACK_BUTTON_LABEL = "Back";
36
+ const PLAN_TYPE_LABELS = [FEATURE_BUTTON_LABEL, BUG_BUTTON_LABEL, REFACTOR_BUTTON_LABEL, OTHER_BUTTON_LABEL];
37
+ // ── Keyboards ────────────────────────────────────────────────────
38
+ const IDLE_KEYBOARD = exports.IDLE_KEYBOARD = [{
39
+ label: PLAN_BUTTON_LABEL
40
+ }, {
41
+ label: NEW_PROJECT_BUTTON_LABEL
42
+ }];
43
+ const COLLECTING_KEYBOARD = [{
44
+ label: DONE_BUTTON_LABEL
45
+ }, {
46
+ label: ABORT_BUTTON_LABEL
47
+ }];
48
+ const SESSION_KEYBOARD = [{
49
+ label: ABORT_BUTTON_LABEL
50
+ }];
51
+ const SPEC_READY_KEYBOARD = [{
52
+ label: APPROVE_BUTTON_LABEL
53
+ }, {
54
+ label: ABORT_BUTTON_LABEL
55
+ }];
56
+ class ReadyFlags extends _effect.Data.Class {}
57
+ exports.ReadyFlags = ReadyFlags;
58
+ const ChatState = exports.ChatState = /*#__PURE__*/_effect.Data.taggedEnum();
59
+ const initialSessionRunning = (projectId, planType) => ChatState.SessionRunning({
60
+ projectId,
61
+ planType,
62
+ pendingAnswerCount: 0,
63
+ pendingOptionLabels: new Set(),
64
+ answersBuffer: [],
65
+ awaitingFreeTextAnswer: false,
66
+ lastQuestionMessage: _effect.Option.none(),
67
+ readyFlags: new ReadyFlags({
68
+ spec: false,
69
+ analysis: false,
70
+ idle: false
71
+ }),
72
+ analysisFollowUpSent: false
73
+ });
74
+ // ── Request types ────────────────────────────────────────────────
75
+ class UserMessage extends /*#__PURE__*/_effect.Schema.TaggedRequest()("UserMessage", {
76
+ failure: _effect.Schema.Never,
77
+ success: _effect.Schema.Void,
78
+ payload: {
79
+ text: _effect.Schema.String
80
+ }
81
+ }) {}
82
+ exports.UserMessage = UserMessage;
83
+ class PlanTextOutput extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanTextOutput", {
84
+ failure: _effect.Schema.Never,
85
+ success: _effect.Schema.Void,
86
+ payload: {
87
+ text: _effect.Schema.String
88
+ }
89
+ }) {}
90
+ exports.PlanTextOutput = PlanTextOutput;
91
+ class PlanQuestionReceived extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanQuestionReceived", {
92
+ failure: _effect.Schema.Never,
93
+ success: _effect.Schema.Void,
94
+ payload: {
95
+ questions: /*#__PURE__*/_effect.Schema.Array(/*#__PURE__*/_effect.Schema.Struct({
96
+ question: _effect.Schema.String,
97
+ header: /*#__PURE__*/_effect.Schema.optional(_effect.Schema.String),
98
+ options: /*#__PURE__*/_effect.Schema.optional(/*#__PURE__*/_effect.Schema.Array(/*#__PURE__*/_effect.Schema.Struct({
99
+ label: _effect.Schema.String
100
+ })))
101
+ }))
102
+ }
103
+ }) {}
104
+ exports.PlanQuestionReceived = PlanQuestionReceived;
105
+ class PlanSpecCreatedReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanSpecCreatedReq", {
106
+ failure: _effect.Schema.Never,
107
+ success: _effect.Schema.Void,
108
+ payload: {}
109
+ }) {}
110
+ exports.PlanSpecCreatedReq = PlanSpecCreatedReq;
111
+ class PlanSpecUpdatedReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanSpecUpdatedReq", {
112
+ failure: _effect.Schema.Never,
113
+ success: _effect.Schema.Void,
114
+ payload: {}
115
+ }) {}
116
+ exports.PlanSpecUpdatedReq = PlanSpecUpdatedReq;
117
+ class PlanAnalysisReadyReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanAnalysisReadyReq", {
118
+ failure: _effect.Schema.Never,
119
+ success: _effect.Schema.Void,
120
+ payload: {}
121
+ }) {}
122
+ exports.PlanAnalysisReadyReq = PlanAnalysisReadyReq;
123
+ class PlanAwaitingInputReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanAwaitingInputReq", {
124
+ failure: _effect.Schema.Never,
125
+ success: _effect.Schema.Void,
126
+ payload: {}
127
+ }) {}
128
+ exports.PlanAwaitingInputReq = PlanAwaitingInputReq;
129
+ class PlanCompletedReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanCompletedReq", {
130
+ failure: _effect.Schema.Never,
131
+ success: _effect.Schema.Void,
132
+ payload: {}
133
+ }) {}
134
+ exports.PlanCompletedReq = PlanCompletedReq;
135
+ class PlanFailedReq extends /*#__PURE__*/_effect.Schema.TaggedRequest()("PlanFailedReq", {
136
+ failure: _effect.Schema.Never,
137
+ success: _effect.Schema.Void,
138
+ payload: {
139
+ message: _effect.Schema.String
140
+ }
141
+ }) {}
142
+ exports.PlanFailedReq = PlanFailedReq;
143
+ const reply = state => [undefined, state];
144
+ const chatMachine = exports.chatMachine = /*#__PURE__*/Machine.make(/*#__PURE__*/_effect.Effect.gen(function* () {
145
+ // Capture services at init (closures — handlers have R = never)
146
+ const notifier = yield* _MessengerAdapter.MessengerAdapter;
147
+ const planSession = yield* _PlanSession.PlanSession;
148
+ const projectStore = yield* _ProjectStore.ProjectStore;
149
+ const planOverviewUploader = yield* _PlanOverviewUploader.PlanOverviewUploader;
150
+ // ── Helpers ────────────────────────────────────────────────
151
+ const readSpecFiles = planType => planType === "Feature" ? planSession.readFeatureAnalysis.pipe(_effect.Effect.map(files => [{
152
+ name: "analysis.md",
153
+ content: files.analysis,
154
+ mermaid: false
155
+ }, {
156
+ name: "services.mmd",
157
+ content: files.services,
158
+ mermaid: true
159
+ }, {
160
+ name: "test.md",
161
+ content: files.test,
162
+ mermaid: false
163
+ }])) : planType === "Bug" ? planSession.readBugAnalysis.pipe(_effect.Effect.map(files => [{
164
+ name: "analysis.md",
165
+ content: files.analysis,
166
+ mermaid: false
167
+ }])) : planType === "Refactor" ? planSession.readRefactorAnalysis.pipe(_effect.Effect.map(files => [{
168
+ name: "analysis.md",
169
+ content: files.analysis,
170
+ mermaid: false
171
+ }])) : planSession.readDefaultAnalysis.pipe(_effect.Effect.map(files => [{
172
+ name: "analysis.md",
173
+ content: files.analysis,
174
+ mermaid: false
175
+ }]));
176
+ const sendSpecFilesRaw = files => _effect.Effect.forEach(files, file => {
177
+ const formatted = file.mermaid ? (0, _TelegramFormatter.markdownToTelegramHtml)(`\`\`\`mermaid\n${file.content}\n\`\`\``) : (0, _TelegramFormatter.markdownToTelegramHtml)(file.content);
178
+ const text = `<b>${file.name}</b>\n${formatted}`;
179
+ return _effect.Effect.forEach((0, _TelegramFormatter.splitMessage)(text), chunk => notifier.sendMessage(chunk));
180
+ });
181
+ const sendSpecFiles = planType => _effect.Effect.gen(function* () {
182
+ const files = yield* readSpecFiles(planType);
183
+ yield* planOverviewUploader.upload({
184
+ files,
185
+ description: `Spec: ${planType}`
186
+ }).pipe(_effect.Effect.tap(result => notifier.sendMessage(`<a href="${result.url}">View spec</a>`)), _effect.Effect.catchTag("PlanOverviewUploaderError", err => _effect.Effect.gen(function* () {
187
+ yield* _effect.Effect.logError(`Spec upload failed, sending raw: ${err.message}`);
188
+ yield* sendSpecFilesRaw(files);
189
+ })));
190
+ });
191
+ const rejectSession = planSession.reject.pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan abort error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
192
+ const abortToIdle = hasSession => _effect.Effect.gen(function* () {
193
+ if (hasSession) {
194
+ yield* rejectSession;
195
+ }
196
+ yield* _effect.Effect.log("Plan aborted");
197
+ yield* notifier.sendMessage({
198
+ text: "Plan aborted.",
199
+ replyKeyboard: IDLE_KEYBOARD
200
+ });
201
+ });
202
+ const submitAnswers = answers => _effect.Effect.gen(function* () {
203
+ const combined = answers.join("\n");
204
+ yield* _effect.Effect.log("Flushing batched answers to plan session");
205
+ yield* planSession.answer(combined).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan answer error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
206
+ });
207
+ const showFollowUpChoice = (text, projectId, planType, readyFlags, analysisFollowUpSent) => _effect.Effect.gen(function* () {
208
+ yield* _effect.Effect.log("Holding follow-up message, showing buffer/interrupt buttons");
209
+ yield* notifier.sendMessage({
210
+ text: "Send as follow-up or interrupt Claude?",
211
+ options: [{
212
+ label: BUFFER_BUTTON_LABEL
213
+ }, {
214
+ label: INTERRUPT_BUTTON_LABEL
215
+ }, {
216
+ label: DISCARD_BUTTON_LABEL
217
+ }]
218
+ });
219
+ return ChatState.AwaitingFollowUpDecision({
220
+ projectId,
221
+ planType,
222
+ message: text,
223
+ readyFlags,
224
+ analysisFollowUpSent
225
+ });
226
+ });
227
+ const checkAllReady = (projectId, planType, flags, analysisFollowUpSent) => _effect.Effect.gen(function* () {
228
+ if (!flags.spec || !flags.analysis || !flags.idle) {
229
+ return ChatState.SessionRunning({
230
+ projectId,
231
+ planType,
232
+ pendingAnswerCount: 0,
233
+ pendingOptionLabels: new Set(),
234
+ answersBuffer: [],
235
+ awaitingFreeTextAnswer: false,
236
+ lastQuestionMessage: _effect.Option.none(),
237
+ readyFlags: flags,
238
+ analysisFollowUpSent
239
+ });
240
+ }
241
+ yield* sendSpecFiles(planType).pipe(_effect.Effect.catchAll(err => _effect.Effect.logError(`Failed to send spec files: ${String(err)}`)));
242
+ yield* notifier.sendMessage({
243
+ text: "Spec ready. Reply with questions or approve to proceed.",
244
+ replyKeyboard: SPEC_READY_KEYBOARD
245
+ }).pipe(_effect.Effect.orElseSucceed(() => undefined));
246
+ return ChatState.SpecReady({
247
+ projectId,
248
+ planType,
249
+ readyFlags: flags,
250
+ analysisFollowUpSent
251
+ });
252
+ });
253
+ const maybeAnalysisFollowUp = (planType, alreadySent) => alreadySent ? _effect.Effect.succeed(true) : planSession.sendFollowUp((0, _AnalysisPrompts.getAnalysisPrompt)(planType)).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Analysis follow-up error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined), _effect.Effect.as(true));
254
+ /**
255
+ * Extract projectId, planType, readyFlags, and analysisFollowUpSent from any
256
+ * "active session" state (SessionRunning, AwaitingFollowUpDecision, SpecReady).
257
+ */
258
+ const extractActiveState = state => {
259
+ switch (state._tag) {
260
+ case "SessionRunning":
261
+ return _effect.Option.some({
262
+ projectId: state.projectId,
263
+ planType: state.planType,
264
+ readyFlags: state.readyFlags,
265
+ analysisFollowUpSent: state.analysisFollowUpSent
266
+ });
267
+ case "AwaitingFollowUpDecision":
268
+ return _effect.Option.some({
269
+ projectId: state.projectId,
270
+ planType: state.planType,
271
+ readyFlags: state.readyFlags,
272
+ analysisFollowUpSent: state.analysisFollowUpSent
273
+ });
274
+ case "SpecReady":
275
+ return _effect.Option.some({
276
+ projectId: state.projectId,
277
+ planType: state.planType,
278
+ readyFlags: state.readyFlags,
279
+ analysisFollowUpSent: state.analysisFollowUpSent
280
+ });
281
+ default:
282
+ return _effect.Option.none();
283
+ }
284
+ };
285
+ // ── Procedure handlers ─────────────────────────────────────
286
+ return Machine.procedures.make(ChatState.Idle()).pipe(
287
+ // ── UserMessage ────────────────────────────────────────
288
+ Machine.procedures.add()("UserMessage", ctx => _effect.Effect.gen(function* () {
289
+ const {
290
+ state
291
+ } = ctx;
292
+ const text = ctx.request.text;
293
+ yield* _effect.Effect.log(`Incoming message: ${text}`);
294
+ switch (state._tag) {
295
+ case "Idle":
296
+ {
297
+ if (text === PLAN_BUTTON_LABEL) {
298
+ const projects = yield* projectStore.listProjects.pipe(_effect.Effect.orElseSucceed(() => []));
299
+ if (projects.length === 0) {
300
+ yield* notifier.sendMessage("No projects. Create one first.");
301
+ return reply(state);
302
+ }
303
+ if (projects.length === 1) {
304
+ yield* _effect.Effect.log("Single project auto-selected").pipe(_effect.Effect.annotateLogs("projectId", projects[0].id));
305
+ yield* notifier.sendMessage({
306
+ text: "What type of change?",
307
+ options: [...PLAN_TYPE_LABELS.map(label => ({
308
+ label
309
+ })), {
310
+ label: ABORT_BUTTON_LABEL
311
+ }]
312
+ });
313
+ return reply(ChatState.SelectingPlanType({
314
+ projectId: projects[0].id
315
+ }));
316
+ }
317
+ yield* notifier.sendMessage({
318
+ text: "Select a project:",
319
+ options: [...projects.map(p => ({
320
+ label: p.id
321
+ })), {
322
+ label: NEW_PROJECT_BUTTON_LABEL
323
+ }, {
324
+ label: ABORT_BUTTON_LABEL
325
+ }]
326
+ });
327
+ return reply(ChatState.SelectingProject());
328
+ }
329
+ if (text === NEW_PROJECT_BUTTON_LABEL) {
330
+ yield* notifier.sendMessage("Enter project name:");
331
+ return reply(ChatState.CreatingProject({
332
+ step: "Name",
333
+ data: {},
334
+ continueWithPlan: false
335
+ }));
336
+ }
337
+ return reply(state);
338
+ }
339
+ case "SelectingProject":
340
+ {
341
+ if (text === ABORT_BUTTON_LABEL) {
342
+ yield* notifier.sendMessage({
343
+ text: "Plan aborted.",
344
+ replyKeyboard: IDLE_KEYBOARD
345
+ });
346
+ return reply(ChatState.Idle());
347
+ }
348
+ if (text === NEW_PROJECT_BUTTON_LABEL) {
349
+ yield* notifier.sendMessage("Enter project name:");
350
+ return reply(ChatState.CreatingProject({
351
+ step: "Name",
352
+ data: {},
353
+ continueWithPlan: true
354
+ }));
355
+ }
356
+ yield* _effect.Effect.log("Project selected").pipe(_effect.Effect.annotateLogs("projectId", text));
357
+ yield* notifier.sendMessage({
358
+ text: "What type of change?",
359
+ options: [...PLAN_TYPE_LABELS.map(label => ({
360
+ label
361
+ })), {
362
+ label: ABORT_BUTTON_LABEL
363
+ }]
364
+ });
365
+ return reply(ChatState.SelectingPlanType({
366
+ projectId: text
367
+ }));
368
+ }
369
+ case "SelectingPlanType":
370
+ {
371
+ if (text === ABORT_BUTTON_LABEL) {
372
+ yield* notifier.sendMessage({
373
+ text: "Plan aborted.",
374
+ replyKeyboard: IDLE_KEYBOARD
375
+ });
376
+ return reply(ChatState.Idle());
377
+ }
378
+ if (PLAN_TYPE_LABELS.includes(text)) {
379
+ yield* _effect.Effect.log("Plan type selected, collection started").pipe(_effect.Effect.annotateLogs("planType", text));
380
+ yield* notifier.sendMessage({
381
+ text: "Describe what you'd like to plan. Tap <b>Done</b> when ready.",
382
+ replyKeyboard: COLLECTING_KEYBOARD
383
+ });
384
+ return reply(ChatState.CollectingPlan({
385
+ projectId: state.projectId,
386
+ planType: text,
387
+ buffer: []
388
+ }));
389
+ }
390
+ return reply(state);
391
+ }
392
+ case "CollectingPlan":
393
+ {
394
+ if (text === ABORT_BUTTON_LABEL) {
395
+ yield* abortToIdle(false);
396
+ return reply(ChatState.Idle());
397
+ }
398
+ if (text === DONE_BUTTON_LABEL) {
399
+ const joinedText = state.buffer.join("\n");
400
+ if (joinedText.trim().length === 0) {
401
+ yield* _effect.Effect.log("Plan collection done with empty buffer");
402
+ yield* notifier.sendMessage("No plan description provided.");
403
+ return reply(state);
404
+ }
405
+ yield* _effect.Effect.log("Plan collection done, starting session").pipe(_effect.Effect.annotateLogs("planText", joinedText));
406
+ const totalProjects = yield* projectStore.listProjects.pipe(_effect.Effect.map(ps => ps.length), _effect.Effect.orElseSucceed(() => 1));
407
+ yield* planSession.start(joinedText, totalProjects > 1 ? state.projectId : undefined).pipe(_effect.Effect.tapError(err => notifier.sendMessage(`Plan error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
408
+ yield* notifier.sendMessage({
409
+ text: "Planning started...",
410
+ replyKeyboard: SESSION_KEYBOARD
411
+ });
412
+ return reply(initialSessionRunning(state.projectId, state.planType));
413
+ }
414
+ yield* _effect.Effect.log("Buffering plan message").pipe(_effect.Effect.annotateLogs("bufferedText", text));
415
+ yield* notifier.sendMessage("✓ Added. Tap <b>Done</b> when ready.");
416
+ return reply(ChatState.CollectingPlan({
417
+ projectId: state.projectId,
418
+ planType: state.planType,
419
+ buffer: [...state.buffer, text]
420
+ }));
421
+ }
422
+ case "SessionRunning":
423
+ {
424
+ if (text === ABORT_BUTTON_LABEL) {
425
+ yield* abortToIdle(true);
426
+ return reply(ChatState.Idle());
427
+ }
428
+ if (state.pendingAnswerCount > 0 && state.pendingOptionLabels.has(text)) {
429
+ if (text === MY_ANSWER_BUTTON_LABEL) {
430
+ yield* notifier.sendMessage({
431
+ text: "Type your answer:",
432
+ options: [{
433
+ label: BACK_BUTTON_LABEL
434
+ }]
435
+ });
436
+ return reply(ChatState.SessionRunning({
437
+ ...state,
438
+ awaitingFreeTextAnswer: true
439
+ }));
440
+ }
441
+ if (text === BACK_BUTTON_LABEL) {
442
+ if (_effect.Option.isSome(state.lastQuestionMessage)) {
443
+ yield* notifier.sendMessage(state.lastQuestionMessage.value);
444
+ }
445
+ return reply(ChatState.SessionRunning({
446
+ ...state,
447
+ awaitingFreeTextAnswer: false
448
+ }));
449
+ }
450
+ const newBuffer = [...state.answersBuffer, text];
451
+ const newPending = state.pendingAnswerCount - 1;
452
+ if (newPending <= 0) {
453
+ yield* _effect.Effect.log("Buffering answer");
454
+ yield* submitAnswers(newBuffer);
455
+ return reply(ChatState.SessionRunning({
456
+ ...state,
457
+ awaitingFreeTextAnswer: false,
458
+ answersBuffer: [],
459
+ pendingAnswerCount: 0,
460
+ pendingOptionLabels: new Set(),
461
+ readyFlags: new ReadyFlags({
462
+ ...state.readyFlags,
463
+ idle: false
464
+ })
465
+ }));
466
+ }
467
+ yield* _effect.Effect.log("Buffering answer");
468
+ return reply(ChatState.SessionRunning({
469
+ ...state,
470
+ awaitingFreeTextAnswer: false,
471
+ answersBuffer: newBuffer,
472
+ pendingAnswerCount: newPending
473
+ }));
474
+ }
475
+ if (state.awaitingFreeTextAnswer) {
476
+ const newBuffer = [...state.answersBuffer, text];
477
+ const newPending = state.pendingAnswerCount - 1;
478
+ if (newPending <= 0) {
479
+ yield* _effect.Effect.log("Buffering free-text answer");
480
+ yield* submitAnswers(newBuffer);
481
+ return reply(ChatState.SessionRunning({
482
+ ...state,
483
+ awaitingFreeTextAnswer: false,
484
+ answersBuffer: [],
485
+ pendingAnswerCount: 0,
486
+ pendingOptionLabels: new Set(),
487
+ readyFlags: new ReadyFlags({
488
+ ...state.readyFlags,
489
+ idle: false
490
+ })
491
+ }));
492
+ }
493
+ yield* _effect.Effect.log("Buffering free-text answer");
494
+ return reply(ChatState.SessionRunning({
495
+ ...state,
496
+ awaitingFreeTextAnswer: false,
497
+ answersBuffer: newBuffer,
498
+ pendingAnswerCount: newPending
499
+ }));
500
+ }
501
+ const idle = yield* planSession.isIdle;
502
+ if (idle) {
503
+ yield* planSession.sendFollowUp(text).pipe(_effect.Effect.tap(() => notifier.sendMessage("Follow-up sent.")), _effect.Effect.tapError(err => _effect.Effect.logError(`Plan follow-up error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
504
+ return reply(ChatState.SessionRunning({
505
+ ...state,
506
+ readyFlags: new ReadyFlags({
507
+ ...state.readyFlags,
508
+ idle: false
509
+ })
510
+ }));
511
+ }
512
+ const newState = yield* showFollowUpChoice(text, state.projectId, state.planType, state.readyFlags, state.analysisFollowUpSent);
513
+ return reply(newState);
514
+ }
515
+ case "AwaitingFollowUpDecision":
516
+ {
517
+ if (text === BUFFER_BUTTON_LABEL) {
518
+ yield* _effect.Effect.log("Buffering follow-up message");
519
+ yield* planSession.sendFollowUp(state.message).pipe(_effect.Effect.tap(() => notifier.sendMessage("Message buffered — Claude will process it shortly.")), _effect.Effect.tapError(err => _effect.Effect.logError(`Plan follow-up error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
520
+ return reply(ChatState.SessionRunning({
521
+ projectId: state.projectId,
522
+ planType: state.planType,
523
+ pendingAnswerCount: 0,
524
+ pendingOptionLabels: new Set(),
525
+ answersBuffer: [],
526
+ awaitingFreeTextAnswer: false,
527
+ lastQuestionMessage: _effect.Option.none(),
528
+ readyFlags: new ReadyFlags({
529
+ ...state.readyFlags,
530
+ idle: false
531
+ }),
532
+ analysisFollowUpSent: state.analysisFollowUpSent
533
+ }));
534
+ }
535
+ if (text === INTERRUPT_BUTTON_LABEL) {
536
+ yield* _effect.Effect.log("Interrupting Claude with follow-up message");
537
+ yield* planSession.interrupt(state.message).pipe(_effect.Effect.tap(() => notifier.sendMessage("Claude interrupted — processing your message now.")), _effect.Effect.tapError(err => _effect.Effect.logError(`Plan interrupt error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
538
+ return reply(ChatState.SessionRunning({
539
+ projectId: state.projectId,
540
+ planType: state.planType,
541
+ pendingAnswerCount: 0,
542
+ pendingOptionLabels: new Set(),
543
+ answersBuffer: [],
544
+ awaitingFreeTextAnswer: false,
545
+ lastQuestionMessage: _effect.Option.none(),
546
+ readyFlags: new ReadyFlags({
547
+ ...state.readyFlags,
548
+ idle: false
549
+ }),
550
+ analysisFollowUpSent: state.analysisFollowUpSent
551
+ }));
552
+ }
553
+ if (text === DISCARD_BUTTON_LABEL) {
554
+ yield* _effect.Effect.log("Follow-up message discarded");
555
+ yield* notifier.sendMessage("Message discarded.");
556
+ return reply(ChatState.SessionRunning({
557
+ projectId: state.projectId,
558
+ planType: state.planType,
559
+ pendingAnswerCount: 0,
560
+ pendingOptionLabels: new Set(),
561
+ answersBuffer: [],
562
+ awaitingFreeTextAnswer: false,
563
+ lastQuestionMessage: _effect.Option.none(),
564
+ readyFlags: state.readyFlags,
565
+ analysisFollowUpSent: state.analysisFollowUpSent
566
+ }));
567
+ }
568
+ if (text === ABORT_BUTTON_LABEL) {
569
+ yield* abortToIdle(true);
570
+ return reply(ChatState.Idle());
571
+ }
572
+ return reply(state);
573
+ }
574
+ case "SpecReady":
575
+ {
576
+ if (text === APPROVE_BUTTON_LABEL) {
577
+ yield* _effect.Effect.log("User approved task creation");
578
+ yield* planSession.approve.pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan approve error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
579
+ yield* notifier.sendMessage({
580
+ text: "Spec approved.",
581
+ replyKeyboard: IDLE_KEYBOARD
582
+ });
583
+ return reply(ChatState.Idle());
584
+ }
585
+ if (text === ABORT_BUTTON_LABEL) {
586
+ yield* abortToIdle(true);
587
+ return reply(ChatState.Idle());
588
+ }
589
+ const idleSpec = yield* planSession.isIdle;
590
+ if (idleSpec) {
591
+ yield* planSession.sendFollowUp(text).pipe(_effect.Effect.tap(() => notifier.sendMessage("Follow-up sent.")), _effect.Effect.tapError(err => _effect.Effect.logError(`Plan follow-up error: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
592
+ return reply(ChatState.SessionRunning({
593
+ projectId: state.projectId,
594
+ planType: state.planType,
595
+ pendingAnswerCount: 0,
596
+ pendingOptionLabels: new Set(),
597
+ answersBuffer: [],
598
+ awaitingFreeTextAnswer: false,
599
+ lastQuestionMessage: _effect.Option.none(),
600
+ readyFlags: new ReadyFlags({
601
+ ...state.readyFlags,
602
+ idle: false
603
+ }),
604
+ analysisFollowUpSent: state.analysisFollowUpSent
605
+ }));
606
+ }
607
+ const followUpState = yield* showFollowUpChoice(text, state.projectId, state.planType, state.readyFlags, state.analysisFollowUpSent);
608
+ return reply(followUpState);
609
+ }
610
+ case "CreatingProject":
611
+ {
612
+ if (text === ABORT_BUTTON_LABEL) {
613
+ yield* notifier.sendMessage({
614
+ text: "Project creation cancelled.",
615
+ replyKeyboard: IDLE_KEYBOARD
616
+ });
617
+ return reply(ChatState.Idle());
618
+ }
619
+ switch (state.step) {
620
+ case "Name":
621
+ {
622
+ yield* notifier.sendMessage({
623
+ text: "Concurrency (tasks in parallel):",
624
+ options: [{
625
+ label: "1"
626
+ }, {
627
+ label: "2"
628
+ }, {
629
+ label: "3"
630
+ }, {
631
+ label: "4"
632
+ }, {
633
+ label: ABORT_BUTTON_LABEL
634
+ }]
635
+ });
636
+ return reply(ChatState.CreatingProject({
637
+ ...state,
638
+ step: "Concurrency",
639
+ data: {
640
+ ...state.data,
641
+ name: text
642
+ }
643
+ }));
644
+ }
645
+ case "Concurrency":
646
+ {
647
+ const n = Number(text);
648
+ if (isNaN(n) || n < 1) return reply(state);
649
+ yield* notifier.sendMessage({
650
+ text: "Target branch (type branch name or skip):",
651
+ options: [{
652
+ label: "Skip"
653
+ }, {
654
+ label: ABORT_BUTTON_LABEL
655
+ }]
656
+ });
657
+ return reply(ChatState.CreatingProject({
658
+ ...state,
659
+ step: "TargetBranch",
660
+ data: {
661
+ ...state.data,
662
+ concurrency: n
663
+ }
664
+ }));
665
+ }
666
+ case "TargetBranch":
667
+ {
668
+ const targetBranch = text === "Skip" ? null : text;
669
+ yield* notifier.sendMessage({
670
+ text: "Git flow:",
671
+ options: [{
672
+ label: "PR"
673
+ }, {
674
+ label: "Commit"
675
+ }, {
676
+ label: ABORT_BUTTON_LABEL
677
+ }]
678
+ });
679
+ return reply(ChatState.CreatingProject({
680
+ ...state,
681
+ step: "GitFlow",
682
+ data: {
683
+ ...state.data,
684
+ targetBranch
685
+ }
686
+ }));
687
+ }
688
+ case "GitFlow":
689
+ {
690
+ const gitFlow = text === "Commit" ? "commit" : "pr";
691
+ yield* notifier.sendMessage({
692
+ text: "Enable review agent?",
693
+ options: [{
694
+ label: "Yes"
695
+ }, {
696
+ label: "No"
697
+ }, {
698
+ label: ABORT_BUTTON_LABEL
699
+ }]
700
+ });
701
+ return reply(ChatState.CreatingProject({
702
+ ...state,
703
+ step: "ReviewAgent",
704
+ data: {
705
+ ...state.data,
706
+ gitFlow
707
+ }
708
+ }));
709
+ }
710
+ case "ReviewAgent":
711
+ {
712
+ const reviewAgent = text === "Yes";
713
+ const data = state.data;
714
+ yield* projectStore.createProject({
715
+ id: data.name,
716
+ targetBranch: data.targetBranch != null ? _effect.Option.some(data.targetBranch) : _effect.Option.none(),
717
+ concurrency: data.concurrency,
718
+ gitFlow: data.gitFlow,
719
+ reviewAgent
720
+ }).pipe(_effect.Effect.tapError(err => notifier.sendMessage(`Failed to create project: ${err.message}`)), _effect.Effect.orElseSucceed(() => undefined));
721
+ yield* notifier.sendMessage(`Project <b>${data.name}</b> created.`);
722
+ if (state.continueWithPlan) {
723
+ yield* notifier.sendMessage({
724
+ text: "What type of change?",
725
+ options: [...PLAN_TYPE_LABELS.map(label => ({
726
+ label
727
+ })), {
728
+ label: ABORT_BUTTON_LABEL
729
+ }]
730
+ });
731
+ return reply(ChatState.SelectingPlanType({
732
+ projectId: data.name
733
+ }));
734
+ }
735
+ yield* notifier.sendMessage({
736
+ text: "Ready.",
737
+ replyKeyboard: IDLE_KEYBOARD
738
+ });
739
+ return reply(ChatState.Idle());
740
+ }
741
+ }
742
+ }
743
+ }
744
+ }).pipe(_effect.Effect.annotateLogs("service", "PlanInput"), _effect.Effect.tapError(err => _effect.Effect.logError(`Incoming message error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
745
+ // ── PlanTextOutput ─────────────────────────────────────
746
+ Machine.procedures.add()("PlanTextOutput", ctx => _effect.Effect.gen(function* () {
747
+ yield* _effect.Effect.forEach((0, _TelegramFormatter.splitMessage)((0, _TelegramFormatter.markdownToTelegramHtml)(ctx.request.text)), chunk => notifier.sendMessage(chunk));
748
+ return reply(ctx.state);
749
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
750
+ // ── PlanQuestionReceived ───────────────────────────────
751
+ Machine.procedures.add()("PlanQuestionReceived", ctx => _effect.Effect.gen(function* () {
752
+ const {
753
+ request,
754
+ state
755
+ } = ctx;
756
+ if (state._tag !== "SessionRunning") {
757
+ return reply(state);
758
+ }
759
+ const labels = request.questions.flatMap(q => q.options?.map(o => o.label) ?? []);
760
+ const newPendingLabels = new Set([...labels, MY_ANSWER_BUTTON_LABEL, BACK_BUTTON_LABEL]);
761
+ let lastQ = _effect.Option.none();
762
+ yield* _effect.Effect.forEach(request.questions, q => {
763
+ const formatted = (0, _TelegramFormatter.markdownToTelegramHtml)(q.question);
764
+ const header = q.header != null ? `<b>${(0, _TelegramFormatter.markdownToTelegramHtml)(q.header)}</b>\n` : "";
765
+ const baseOptions = q.options?.map(o => ({
766
+ label: o.label
767
+ })) ?? [];
768
+ const msg = {
769
+ text: `${header}${formatted}`,
770
+ options: [...baseOptions, {
771
+ label: MY_ANSWER_BUTTON_LABEL
772
+ }]
773
+ };
774
+ lastQ = _effect.Option.some(msg);
775
+ return notifier.sendMessage(msg);
776
+ });
777
+ return reply(ChatState.SessionRunning({
778
+ ...state,
779
+ pendingAnswerCount: request.questions.length,
780
+ pendingOptionLabels: newPendingLabels,
781
+ answersBuffer: [],
782
+ awaitingFreeTextAnswer: false,
783
+ lastQuestionMessage: lastQ
784
+ }));
785
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
786
+ // ── PlanSpecCreatedReq ─────────────────────────────────
787
+ Machine.procedures.add()("PlanSpecCreatedReq", ctx => _effect.Effect.gen(function* () {
788
+ const active = extractActiveState(ctx.state);
789
+ if (_effect.Option.isNone(active)) return reply(ctx.state);
790
+ const {
791
+ analysisFollowUpSent,
792
+ planType,
793
+ projectId,
794
+ readyFlags
795
+ } = active.value;
796
+ const sent = yield* maybeAnalysisFollowUp(planType, analysisFollowUpSent);
797
+ const newFlags = new ReadyFlags({
798
+ ...readyFlags,
799
+ spec: true
800
+ });
801
+ const newState = yield* checkAllReady(projectId, planType, newFlags, sent);
802
+ return reply(newState);
803
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
804
+ // ── PlanSpecUpdatedReq ─────────────────────────────────
805
+ Machine.procedures.add()("PlanSpecUpdatedReq", ctx => _effect.Effect.gen(function* () {
806
+ const active = extractActiveState(ctx.state);
807
+ if (_effect.Option.isNone(active)) return reply(ctx.state);
808
+ const {
809
+ analysisFollowUpSent,
810
+ planType,
811
+ projectId,
812
+ readyFlags
813
+ } = active.value;
814
+ const sent = yield* maybeAnalysisFollowUp(planType, analysisFollowUpSent);
815
+ const newFlags = new ReadyFlags({
816
+ ...readyFlags,
817
+ spec: true
818
+ });
819
+ const newState = yield* checkAllReady(projectId, planType, newFlags, sent);
820
+ return reply(newState);
821
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
822
+ // ── PlanAnalysisReadyReq ───────────────────────────────
823
+ Machine.procedures.add()("PlanAnalysisReadyReq", ctx => _effect.Effect.gen(function* () {
824
+ const active = extractActiveState(ctx.state);
825
+ if (_effect.Option.isNone(active)) return reply(ctx.state);
826
+ const {
827
+ analysisFollowUpSent,
828
+ planType,
829
+ projectId,
830
+ readyFlags
831
+ } = active.value;
832
+ const newFlags = new ReadyFlags({
833
+ ...readyFlags,
834
+ analysis: true
835
+ });
836
+ const newState = yield* checkAllReady(projectId, planType, newFlags, analysisFollowUpSent);
837
+ return reply(newState);
838
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
839
+ // ── PlanAwaitingInputReq ───────────────────────────────
840
+ Machine.procedures.add()("PlanAwaitingInputReq", ctx => _effect.Effect.gen(function* () {
841
+ const active = extractActiveState(ctx.state);
842
+ if (_effect.Option.isNone(active)) return reply(ctx.state);
843
+ const {
844
+ analysisFollowUpSent,
845
+ planType,
846
+ projectId,
847
+ readyFlags
848
+ } = active.value;
849
+ const newFlags = new ReadyFlags({
850
+ ...readyFlags,
851
+ idle: true
852
+ });
853
+ const newState = yield* checkAllReady(projectId, planType, newFlags, analysisFollowUpSent);
854
+ return reply(newState);
855
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
856
+ // ── PlanCompletedReq ───────────────────────────────────
857
+ Machine.procedures.add()("PlanCompletedReq", ctx => _effect.Effect.gen(function* () {
858
+ yield* notifier.sendMessage({
859
+ text: "Plan completed.",
860
+ replyKeyboard: IDLE_KEYBOARD
861
+ });
862
+ return reply(ChatState.Idle());
863
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))),
864
+ // ── PlanFailedReq ──────────────────────────────────────
865
+ Machine.procedures.add()("PlanFailedReq", ctx => _effect.Effect.gen(function* () {
866
+ yield* notifier.sendMessage({
867
+ text: `Plan failed: ${ctx.request.message}`,
868
+ replyKeyboard: IDLE_KEYBOARD
869
+ });
870
+ return reply(ChatState.Idle());
871
+ }).pipe(_effect.Effect.tapError(err => _effect.Effect.logError(`Plan event relay error: ${String(err)}`)), _effect.Effect.orElseSucceed(() => reply(ctx.state)))));
872
+ }));
873
+ //# sourceMappingURL=ChatMachine.js.map