@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,589 @@
1
+ /**
2
+ * Plan session manager — spawns `lalph plan` subprocess and bridges I/O
3
+ * @since 1.0.0
4
+ */
5
+ import { Command, CommandExecutor, FileSystem, Path } from "@effect/platform"
6
+ import { Context, Data, Effect, Exit, Layer, Option, Queue, Ref, Schema, Scope, Stream } from "effect"
7
+ import type { ContentBlock, StreamJsonMessage } from "../lib/StreamJsonParser.js"
8
+ import { AskUserQuestionInput, parseNdjsonMessages } from "../lib/StreamJsonParser.js"
9
+ import { AppContext } from "./AppContext.js"
10
+
11
+ /**
12
+ * @since 1.0.0
13
+ * @category errors
14
+ */
15
+ export class PlanSessionError extends Data.TaggedError("PlanSessionError")<{
16
+ message: string
17
+ cause: unknown
18
+ }> {}
19
+
20
+ /**
21
+ * @since 1.0.0
22
+ * @category events
23
+ */
24
+ export class PlanTextOutput extends Data.TaggedClass("PlanTextOutput")<{
25
+ readonly text: string
26
+ }> {}
27
+
28
+ /**
29
+ * @since 1.0.0
30
+ * @category events
31
+ */
32
+ export class PlanCompleted extends Data.TaggedClass("PlanCompleted")<{
33
+ readonly exitCode: number
34
+ }> {}
35
+
36
+ /**
37
+ * @since 1.0.0
38
+ * @category events
39
+ */
40
+ export class PlanFailed extends Data.TaggedClass("PlanFailed")<{
41
+ readonly message: string
42
+ }> {}
43
+
44
+ /**
45
+ * @since 1.0.0
46
+ * @category events
47
+ */
48
+ export class PlanQuestion extends Data.TaggedClass("PlanQuestion")<{
49
+ readonly questions: ReadonlyArray<{
50
+ readonly question: string
51
+ readonly header?: string | undefined
52
+ readonly options?: ReadonlyArray<{ readonly label: string; readonly description?: string | undefined }> | undefined
53
+ readonly multiSelect?: boolean | undefined
54
+ }>
55
+ }> {}
56
+
57
+ /**
58
+ * @since 1.0.0
59
+ * @category events
60
+ */
61
+ export class PlanSpecCreated extends Data.TaggedClass("PlanSpecCreated")<{
62
+ readonly filePath: string
63
+ }> {}
64
+
65
+ /**
66
+ * @since 1.0.0
67
+ * @category events
68
+ */
69
+ export class PlanSpecUpdated extends Data.TaggedClass("PlanSpecUpdated")<{
70
+ readonly filePath: string
71
+ }> {}
72
+
73
+ /**
74
+ * @since 1.0.0
75
+ * @category events
76
+ */
77
+ export class PlanAnalysisReady extends Data.TaggedClass("PlanAnalysisReady")<{
78
+ readonly filePath: string
79
+ }> {}
80
+
81
+ /**
82
+ * @since 1.0.0
83
+ * @category events
84
+ */
85
+ export class PlanAwaitingInput extends Data.TaggedClass("PlanAwaitingInput")<Record<string, never>> {}
86
+
87
+ /**
88
+ * @since 1.0.0
89
+ * @category events
90
+ */
91
+ export type PlanEvent =
92
+ | PlanTextOutput
93
+ | PlanQuestion
94
+ | PlanCompleted
95
+ | PlanFailed
96
+ | PlanSpecCreated
97
+ | PlanSpecUpdated
98
+ | PlanAnalysisReady
99
+ | PlanAwaitingInput
100
+
101
+ interface ActiveSession {
102
+ readonly process: CommandExecutor.Process
103
+ readonly scope: Scope.CloseableScope
104
+ readonly stdinQueue: Queue.Queue<Uint8Array>
105
+ }
106
+
107
+ /**
108
+ * @since 1.0.0
109
+ * @category services
110
+ */
111
+ export interface PlanSessionService {
112
+ readonly start: (planText: string, projectId?: string | undefined) => Effect.Effect<void, PlanSessionError>
113
+ readonly answer: (text: string) => Effect.Effect<void, PlanSessionError>
114
+ readonly sendFollowUp: (text: string) => Effect.Effect<void, PlanSessionError>
115
+ readonly interrupt: (text: string) => Effect.Effect<void, PlanSessionError>
116
+ readonly approve: Effect.Effect<void, PlanSessionError>
117
+ readonly reject: Effect.Effect<void, PlanSessionError>
118
+ readonly isActive: Effect.Effect<boolean>
119
+ readonly isIdle: Effect.Effect<boolean>
120
+ readonly readFeatureAnalysis: Effect.Effect<{
121
+ readonly analysis: string
122
+ readonly services: string
123
+ readonly test: string
124
+ }, PlanSessionError>
125
+ readonly readBugAnalysis: Effect.Effect<{ readonly analysis: string }, PlanSessionError>
126
+ readonly readRefactorAnalysis: Effect.Effect<{ readonly analysis: string }, PlanSessionError>
127
+ readonly readDefaultAnalysis: Effect.Effect<{ readonly analysis: string }, PlanSessionError>
128
+ readonly events: Stream.Stream<PlanEvent, PlanSessionError>
129
+ }
130
+
131
+ /**
132
+ * @since 1.0.0
133
+ * @category context
134
+ */
135
+ export class PlanSession extends Context.Tag("PlanSession")<
136
+ PlanSession,
137
+ PlanSessionService
138
+ >() {}
139
+
140
+ /**
141
+ * Builds the command to run for a plan session.
142
+ * @since 1.0.0
143
+ * @category context
144
+ */
145
+ export class PlanCommandBuilder extends Context.Tag("PlanCommandBuilder")<
146
+ PlanCommandBuilder,
147
+ (tempFile: string) => Command.Command
148
+ >() {}
149
+
150
+ const stripAnsi = (text: string): string =>
151
+ // eslint-disable-next-line no-control-regex
152
+ text.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "")
153
+
154
+ const WriteToolInput = Schema.Struct({ file_path: Schema.String })
155
+ const EditToolInput = Schema.Struct({ file_path: Schema.String })
156
+ const NotebookEditToolInput = Schema.Struct({ notebook_path: Schema.String })
157
+
158
+ const decodeWriteInput = Schema.decodeUnknown(WriteToolInput)
159
+ const decodeEditInput = Schema.decodeUnknown(EditToolInput)
160
+ const decodeNotebookInput = Schema.decodeUnknown(NotebookEditToolInput)
161
+
162
+ const isSpecFile = (path: string): boolean =>
163
+ ((path.includes(".specs/") || path.includes(".specs\\")) && !path.endsWith("analysis.md")) ||
164
+ path.endsWith(".lalph/plan.json")
165
+
166
+ const isAnalysisFile = (path: string): boolean =>
167
+ path.endsWith(".specs/analysis.md") || path.endsWith(".specs\\analysis.md")
168
+
169
+ const decodeAskInput = Schema.decodeUnknown(AskUserQuestionInput)
170
+
171
+ /**
172
+ * @since 1.0.0
173
+ * @category layers
174
+ */
175
+ export const PlanSessionLive = Layer.scoped(
176
+ PlanSession,
177
+ Effect.gen(function*() {
178
+ const fs = yield* FileSystem.FileSystem
179
+ const pathService = yield* Path.Path
180
+ const appContext = yield* AppContext
181
+ const executor = yield* CommandExecutor.CommandExecutor
182
+ const buildCommand = yield* PlanCommandBuilder
183
+ const sessionRef = yield* Ref.make<Option.Option<ActiveSession>>(Option.none())
184
+ const idleRef = yield* Ref.make(false)
185
+ const specsDirRef = yield* Ref.make<Option.Option<string>>(Option.none())
186
+ const eventQueue = yield* Queue.unbounded<PlanEvent>()
187
+ const seenFilePaths = yield* Ref.make<ReadonlySet<string>>(new Set())
188
+
189
+ const closeActiveSession = Effect.gen(function*() {
190
+ const current = yield* Ref.get(sessionRef)
191
+ if (Option.isSome(current)) {
192
+ yield* Scope.close(current.value.scope, Exit.void)
193
+ yield* Ref.set(sessionRef, Option.none())
194
+ }
195
+ })
196
+
197
+ yield* Effect.addFinalizer(() => closeActiveSession)
198
+
199
+ const start = (planText: string, projectId?: string | undefined) =>
200
+ Effect.gen(function*() {
201
+ const current = yield* Ref.get(sessionRef)
202
+ if (Option.isSome(current)) {
203
+ return yield* new PlanSessionError({
204
+ message: "A plan session is already active",
205
+ cause: null
206
+ })
207
+ }
208
+
209
+ yield* Ref.set(seenFilePaths, new Set())
210
+ yield* Ref.set(idleRef, false)
211
+ yield* Ref.set(specsDirRef, Option.none())
212
+
213
+ const tempDir = pathService.join(appContext.configDir, "tmp")
214
+ yield* fs.makeDirectory(tempDir, { recursive: true }).pipe(
215
+ Effect.mapError((err) =>
216
+ new PlanSessionError({ message: `Failed to create temp dir: ${String(err)}`, cause: err })
217
+ )
218
+ )
219
+
220
+ const tempFile = pathService.join(tempDir, `plan-${Date.now()}.md`)
221
+ yield* fs.writeFileString(tempFile, planText).pipe(
222
+ Effect.mapError((err) =>
223
+ new PlanSessionError({ message: `Failed to write plan file: ${String(err)}`, cause: err })
224
+ )
225
+ )
226
+
227
+ const cmd = buildCommand(tempFile)
228
+
229
+ const processScope = yield* Scope.make()
230
+
231
+ const process = yield* Command.start(cmd).pipe(
232
+ Effect.provideService(CommandExecutor.CommandExecutor, executor),
233
+ Scope.extend(processScope),
234
+ Effect.mapError((err) =>
235
+ new PlanSessionError({ message: `Failed to start lalph plan: ${String(err)}`, cause: err })
236
+ )
237
+ )
238
+
239
+ const stdinQueue = yield* Queue.unbounded<Uint8Array>()
240
+ yield* Ref.set(sessionRef, Option.some({ process, scope: processScope, stdinQueue }))
241
+ yield* Effect.log("Plan session process spawned").pipe(
242
+ Effect.annotateLogs({ tempFile })
243
+ )
244
+
245
+ yield* Stream.fromQueue(stdinQueue).pipe(
246
+ Stream.run(process.stdin),
247
+ Effect.catchAll((err) => Effect.logError(`stdin write error: ${String(err)}`)),
248
+ Effect.forkDaemon
249
+ )
250
+
251
+ if (projectId != null) {
252
+ const encoder = new TextEncoder()
253
+ yield* Queue.offer(stdinQueue, encoder.encode(projectId + "\n"))
254
+ yield* Effect.log("Pre-answered project prompt").pipe(
255
+ Effect.annotateLogs({ projectId })
256
+ )
257
+ }
258
+
259
+ const decoder = new TextDecoder()
260
+ const pendingTextRef = yield* Ref.make<Option.Option<{ messageId: string; text: string }>>(
261
+ Option.none()
262
+ )
263
+
264
+ const flushPendingText = Effect.gen(function*() {
265
+ const pending = yield* Ref.get(pendingTextRef)
266
+ if (Option.isSome(pending)) {
267
+ yield* Effect.log("Flushing buffered text block").pipe(
268
+ Effect.annotateLogs({ textLength: String(pending.value.text.length) })
269
+ )
270
+ yield* Queue.offer(eventQueue, new PlanTextOutput({ text: pending.value.text }))
271
+ yield* Ref.set(pendingTextRef, Option.none())
272
+ }
273
+ })
274
+
275
+ const detectFileEvent = (block: typeof ContentBlock.Type) =>
276
+ Effect.gen(function*() {
277
+ const filePathResult = yield* Effect.gen(function*() {
278
+ switch (block.name) {
279
+ case "Write":
280
+ return (yield* decodeWriteInput(block.input)).file_path
281
+ case "Edit":
282
+ return (yield* decodeEditInput(block.input)).file_path
283
+ case "NotebookEdit":
284
+ return (yield* decodeNotebookInput(block.input)).notebook_path
285
+ default:
286
+ return yield* Effect.fail("not a file-writing tool")
287
+ }
288
+ }).pipe(Effect.option)
289
+ if (Option.isSome(filePathResult)) {
290
+ const fp = filePathResult.value
291
+ if (fp.includes(".specs/") || fp.includes(".specs\\")) {
292
+ yield* Ref.set(specsDirRef, Option.some(pathService.dirname(fp)))
293
+ }
294
+ if (isAnalysisFile(fp)) {
295
+ yield* Effect.log("Analysis file detected").pipe(
296
+ Effect.annotateLogs({ filePath: fp })
297
+ )
298
+ yield* Queue.offer(eventQueue, new PlanAnalysisReady({ filePath: fp }))
299
+ } else if (isSpecFile(fp)) {
300
+ const seen = yield* Ref.get(seenFilePaths)
301
+ if (seen.has(fp)) {
302
+ yield* Effect.log("Spec file updated").pipe(
303
+ Effect.annotateLogs({ filePath: fp })
304
+ )
305
+ yield* Queue.offer(eventQueue, new PlanSpecUpdated({ filePath: fp }))
306
+ } else {
307
+ yield* Ref.update(seenFilePaths, (s) => new Set([...s, fp]))
308
+ yield* Effect.log("Spec file created").pipe(
309
+ Effect.annotateLogs({ filePath: fp })
310
+ )
311
+ yield* Queue.offer(eventQueue, new PlanSpecCreated({ filePath: fp }))
312
+ }
313
+ }
314
+ }
315
+ })
316
+
317
+ const processContentBlock = (block: typeof ContentBlock.Type, messageId: string, hasAskUser: boolean) =>
318
+ Effect.gen(function*() {
319
+ if (block.type === "text" && block.text != null && hasAskUser) {
320
+ yield* Effect.log("Suppressing text block (ask_user in same line)")
321
+ } else if (block.type === "text" && block.text != null) {
322
+ yield* Effect.log("Buffering text block").pipe(
323
+ Effect.annotateLogs({ textLength: String(block.text.length), messageId })
324
+ )
325
+ yield* Ref.set(pendingTextRef, Option.some({ messageId, text: block.text }))
326
+ } else if (block.type === "tool_use" && block.name === "mcp__ask-user__ask_user") {
327
+ yield* Effect.log("ask_user MCP tool detected, discarding buffered text")
328
+ yield* Ref.set(pendingTextRef, Option.none())
329
+ const askParsed = yield* decodeAskInput(block.input).pipe(
330
+ Effect.orElseSucceed(() => ({ questions: undefined }))
331
+ )
332
+ if (askParsed.questions != null && askParsed.questions.length > 0) {
333
+ yield* Queue.offer(eventQueue, new PlanQuestion({ questions: askParsed.questions }))
334
+ }
335
+ } else if (block.type === "tool_use" && block.name != null) {
336
+ yield* Effect.log("Tool invoked").pipe(
337
+ Effect.annotateLogs({ tool: block.name })
338
+ )
339
+ yield* detectFileEvent(block)
340
+ }
341
+ })
342
+
343
+ const processAssistantMessage = (msg: StreamJsonMessage) =>
344
+ Effect.gen(function*() {
345
+ const content = msg.message?.content
346
+ if (content == null) return
347
+ const messageId = msg.message?.id ?? ""
348
+ const pending = yield* Ref.get(pendingTextRef)
349
+ if (Option.isSome(pending) && pending.value.messageId !== messageId) {
350
+ yield* flushPendingText
351
+ }
352
+ const hasAskUser = content.some(
353
+ (b) => b.type === "tool_use" && b.name === "mcp__ask-user__ask_user"
354
+ )
355
+ for (const block of content) {
356
+ yield* processContentBlock(block, messageId, hasAskUser)
357
+ }
358
+ })
359
+
360
+ const routeMessage = (msg: StreamJsonMessage) =>
361
+ Effect.gen(function*() {
362
+ yield* Effect.log("Parsed stream-json message").pipe(
363
+ Effect.annotateLogs({
364
+ messageType: msg.type,
365
+ ...(msg.subtype != null ? { subtype: msg.subtype } : {})
366
+ })
367
+ )
368
+ if (msg.type === "shim_ready") {
369
+ yield* Effect.log("shim_ready received, auto-sending shim_start")
370
+ const encoder = new TextEncoder()
371
+ yield* Queue.offer(stdinQueue, encoder.encode(JSON.stringify({ type: "shim_start" }) + "\n"))
372
+ return
373
+ }
374
+ if (msg.type === "result") {
375
+ yield* flushPendingText
376
+ yield* Ref.set(idleRef, true)
377
+ yield* Queue.offer(eventQueue, new PlanAwaitingInput({}))
378
+ yield* Effect.log("Planner result received")
379
+ return
380
+ }
381
+ if (msg.type !== "assistant" || msg.message?.content == null) {
382
+ yield* flushPendingText
383
+ return
384
+ }
385
+ yield* processAssistantMessage(msg)
386
+ })
387
+
388
+ yield* process.stdout.pipe(
389
+ Stream.map((chunk) => decoder.decode(chunk)),
390
+ Stream.tap((chunk) =>
391
+ Effect.log("stdout chunk received").pipe(
392
+ Effect.annotateLogs({ chunkLength: String(chunk.length), preview: chunk.slice(0, 200) })
393
+ )
394
+ ),
395
+ parseNdjsonMessages,
396
+ Stream.mapEffect(routeMessage),
397
+ Stream.runDrain,
398
+ Effect.tap(() => flushPendingText),
399
+ Effect.tap(() => Effect.log("stdout stream completed")),
400
+ Effect.tapError((err) =>
401
+ Queue.offer(eventQueue, new PlanFailed({ message: `stdout stream error: ${String(err)}` }))
402
+ ),
403
+ Effect.catchAll((err) => Effect.logError(`stdout stream error: ${String(err)}`)),
404
+ Effect.forkDaemon
405
+ )
406
+
407
+ yield* process.stderr.pipe(
408
+ Stream.map((chunk) => decoder.decode(chunk)),
409
+ Stream.tap((chunk) =>
410
+ Effect.log("stderr chunk received").pipe(
411
+ Effect.annotateLogs({ chunkLength: String(chunk.length), preview: chunk.slice(0, 200) })
412
+ )
413
+ ),
414
+ Stream.map(stripAnsi),
415
+ Stream.flatMap((text) => {
416
+ const lines = text.split("\n").filter((line) => line.trim().length > 0)
417
+ return Stream.fromIterable(lines)
418
+ }),
419
+ Stream.mapEffect((line) =>
420
+ Effect.log("stderr line (suppressed from output)").pipe(
421
+ Effect.annotateLogs({ line: line.slice(0, 200) })
422
+ )
423
+ ),
424
+ Stream.runDrain,
425
+ Effect.tap(() => Effect.log("stderr stream completed")),
426
+ Effect.tapError((err) =>
427
+ Queue.offer(eventQueue, new PlanFailed({ message: `stderr stream error: ${String(err)}` }))
428
+ ),
429
+ Effect.catchAll((err) => Effect.logError(`stderr stream error: ${String(err)}`)),
430
+ Effect.forkDaemon
431
+ )
432
+
433
+ yield* Effect.gen(function*() {
434
+ const exitCode = yield* process.exitCode
435
+ yield* Effect.log("Plan session process exited").pipe(
436
+ Effect.annotateLogs({ exitCode: String(exitCode) })
437
+ )
438
+ yield* Ref.set(sessionRef, Option.none())
439
+ yield* Scope.close(processScope, Exit.void)
440
+ if (exitCode === 0) {
441
+ yield* Queue.offer(eventQueue, new PlanCompleted({ exitCode }))
442
+ } else {
443
+ yield* Queue.offer(
444
+ eventQueue,
445
+ new PlanFailed({ message: `lalph plan exited with code ${String(exitCode)}` })
446
+ )
447
+ }
448
+ }).pipe(
449
+ Effect.tapError((err) =>
450
+ Effect.gen(function*() {
451
+ yield* Ref.set(sessionRef, Option.none())
452
+ yield* Queue.offer(eventQueue, new PlanFailed({ message: `Process error: ${String(err)}` }))
453
+ })
454
+ ),
455
+ Effect.catchAll((err) => Effect.logError(`Process error: ${String(err)}`)),
456
+ Effect.forkDaemon
457
+ )
458
+ })
459
+
460
+ const answer = (text: string) =>
461
+ Effect.gen(function*() {
462
+ const current = yield* Ref.get(sessionRef)
463
+ if (Option.isNone(current)) {
464
+ return yield* new PlanSessionError({
465
+ message: "No active plan session",
466
+ cause: null
467
+ })
468
+ }
469
+ const encoder = new TextEncoder()
470
+ yield* Ref.set(idleRef, false)
471
+ yield* Queue.offer(current.value.stdinQueue, encoder.encode(text + "\n"))
472
+ })
473
+
474
+ const sendFollowUp = (text: string) =>
475
+ Effect.gen(function*() {
476
+ const current = yield* Ref.get(sessionRef)
477
+ if (Option.isNone(current)) {
478
+ return yield* new PlanSessionError({
479
+ message: "No active plan session",
480
+ cause: null
481
+ })
482
+ }
483
+ const encoder = new TextEncoder()
484
+ yield* Ref.set(idleRef, false)
485
+ const line = JSON.stringify({ type: "follow_up", text }) + "\n"
486
+ yield* Queue.offer(current.value.stdinQueue, encoder.encode(line))
487
+ })
488
+
489
+ const interrupt = (text: string) =>
490
+ Effect.gen(function*() {
491
+ const current = yield* Ref.get(sessionRef)
492
+ if (Option.isNone(current)) {
493
+ return yield* new PlanSessionError({
494
+ message: "No active plan session",
495
+ cause: null
496
+ })
497
+ }
498
+ const encoder = new TextEncoder()
499
+ yield* Ref.set(idleRef, false)
500
+ const line = JSON.stringify({ type: "shim_interrupt", text }) + "\n"
501
+ yield* Queue.offer(current.value.stdinQueue, encoder.encode(line))
502
+ })
503
+
504
+ const approve = Effect.gen(function*() {
505
+ const current = yield* Ref.get(sessionRef)
506
+ if (Option.isNone(current)) {
507
+ return yield* new PlanSessionError({
508
+ message: "No active plan session",
509
+ cause: null
510
+ })
511
+ }
512
+ const encoder = new TextEncoder()
513
+ yield* Ref.set(idleRef, false)
514
+ yield* Queue.offer(current.value.stdinQueue, encoder.encode(JSON.stringify({ type: "shim_approve" }) + "\n"))
515
+ })
516
+
517
+ const reject = Effect.gen(function*() {
518
+ const current = yield* Ref.get(sessionRef)
519
+ if (Option.isNone(current)) {
520
+ return yield* new PlanSessionError({
521
+ message: "No active plan session",
522
+ cause: null
523
+ })
524
+ }
525
+ const encoder = new TextEncoder()
526
+ yield* Queue.offer(current.value.stdinQueue, encoder.encode(JSON.stringify({ type: "shim_abort" }) + "\n"))
527
+ yield* closeActiveSession
528
+ })
529
+
530
+ const isActive = Ref.get(sessionRef).pipe(Effect.map(Option.isSome))
531
+ const isIdle = Ref.get(idleRef)
532
+
533
+ const readSpecFile = (fileName: string) =>
534
+ Effect.gen(function*() {
535
+ const specsDir = yield* Ref.get(specsDirRef)
536
+ if (Option.isNone(specsDir)) {
537
+ return yield* new PlanSessionError({ message: "No specs directory detected", cause: null })
538
+ }
539
+ const filePath = pathService.join(specsDir.value, fileName)
540
+ return yield* fs.readFileString(filePath).pipe(
541
+ Effect.mapError((err) =>
542
+ new PlanSessionError({ message: `Failed to read ${fileName}: ${String(err)}`, cause: err })
543
+ )
544
+ )
545
+ })
546
+
547
+ const readFeatureAnalysis = Effect.gen(function*() {
548
+ const analysis = yield* readSpecFile("analysis.md")
549
+ const services = yield* readSpecFile("services.mmd")
550
+ const test = yield* readSpecFile("test.md")
551
+ return { analysis, services, test }
552
+ })
553
+
554
+ const readBugAnalysis = Effect.gen(function*() {
555
+ const analysis = yield* readSpecFile("analysis.md")
556
+ return { analysis }
557
+ })
558
+
559
+ const readRefactorAnalysis = Effect.gen(function*() {
560
+ const analysis = yield* readSpecFile("analysis.md")
561
+ return { analysis }
562
+ })
563
+
564
+ const readDefaultAnalysis = Effect.gen(function*() {
565
+ const analysis = yield* readSpecFile("analysis.md")
566
+ return { analysis }
567
+ })
568
+
569
+ const events: Stream.Stream<PlanEvent, PlanSessionError> = Stream.fromQueue(eventQueue).pipe(
570
+ Stream.mapError((err) => new PlanSessionError({ message: `Event stream error: ${String(err)}`, cause: err }))
571
+ )
572
+
573
+ return PlanSession.of({
574
+ start: (planText, projectId) => start(planText, projectId).pipe(Effect.annotateLogs({ service: "PlanSession" })),
575
+ answer: (text) => answer(text).pipe(Effect.annotateLogs({ service: "PlanSession" })),
576
+ sendFollowUp: (text) => sendFollowUp(text).pipe(Effect.annotateLogs({ service: "PlanSession" })),
577
+ interrupt: (text) => interrupt(text).pipe(Effect.annotateLogs({ service: "PlanSession" })),
578
+ approve: approve.pipe(Effect.annotateLogs({ service: "PlanSession" })),
579
+ reject: reject.pipe(Effect.annotateLogs({ service: "PlanSession" })),
580
+ isActive,
581
+ isIdle,
582
+ readFeatureAnalysis,
583
+ readBugAnalysis,
584
+ readRefactorAnalysis,
585
+ readDefaultAnalysis,
586
+ events
587
+ })
588
+ })
589
+ )