@proletariat/cli 0.3.72 → 0.3.73

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 (391) hide show
  1. package/dist/commands/action/create.js +1 -0
  2. package/dist/commands/action/create.js.map +1 -1
  3. package/dist/commands/action/delete.js +1 -1
  4. package/dist/commands/action/delete.js.map +1 -1
  5. package/dist/commands/action/run.js +1 -1
  6. package/dist/commands/action/run.js.map +1 -1
  7. package/dist/commands/action/show.js +1 -0
  8. package/dist/commands/action/show.js.map +1 -1
  9. package/dist/commands/action/update.js +1 -1
  10. package/dist/commands/action/update.js.map +1 -1
  11. package/dist/commands/agent/auth.js +4 -0
  12. package/dist/commands/agent/auth.js.map +1 -1
  13. package/dist/commands/agent/cleanup.js +1 -1
  14. package/dist/commands/agent/cleanup.js.map +1 -1
  15. package/dist/commands/agent/discover.js +1 -0
  16. package/dist/commands/agent/discover.js.map +1 -1
  17. package/dist/commands/agent/index.js +2 -0
  18. package/dist/commands/agent/index.js.map +1 -1
  19. package/dist/commands/agent/rebuild.js +1 -1
  20. package/dist/commands/agent/rebuild.js.map +1 -1
  21. package/dist/commands/agent/remove.js +1 -1
  22. package/dist/commands/agent/remove.js.map +1 -1
  23. package/dist/commands/agent/restart.js +1 -1
  24. package/dist/commands/agent/restart.js.map +1 -1
  25. package/dist/commands/agent/visit.js +1 -1
  26. package/dist/commands/agent/visit.js.map +1 -1
  27. package/dist/commands/asana/connect.js +6 -5
  28. package/dist/commands/asana/connect.js.map +1 -1
  29. package/dist/commands/asana/import.js +4 -4
  30. package/dist/commands/asana/import.js.map +1 -1
  31. package/dist/commands/asana/sync.js +3 -3
  32. package/dist/commands/asana/sync.js.map +1 -1
  33. package/dist/commands/autocomplete/setup.js +2 -1
  34. package/dist/commands/autocomplete/setup.js.map +1 -1
  35. package/dist/commands/board/index.js +1 -0
  36. package/dist/commands/board/index.js.map +1 -1
  37. package/dist/commands/board/view.js +1 -1
  38. package/dist/commands/board/view.js.map +1 -1
  39. package/dist/commands/branch/create.js +1 -1
  40. package/dist/commands/branch/create.js.map +1 -1
  41. package/dist/commands/branch/validate.js +2 -0
  42. package/dist/commands/branch/validate.js.map +1 -1
  43. package/dist/commands/branch/where.js +1 -0
  44. package/dist/commands/branch/where.js.map +1 -1
  45. package/dist/commands/category/create.js +3 -0
  46. package/dist/commands/category/create.js.map +1 -1
  47. package/dist/commands/category/delete.js +3 -0
  48. package/dist/commands/category/delete.js.map +1 -1
  49. package/dist/commands/category/rename.js +6 -0
  50. package/dist/commands/category/rename.js.map +1 -1
  51. package/dist/commands/claude/index.js +5 -5
  52. package/dist/commands/claude/index.js.map +1 -1
  53. package/dist/commands/claude/open.js +5 -0
  54. package/dist/commands/claude/open.js.map +1 -1
  55. package/dist/commands/commit.js +1 -1
  56. package/dist/commands/commit.js.map +1 -1
  57. package/dist/commands/config/index.js +6 -1
  58. package/dist/commands/config/index.js.map +1 -1
  59. package/dist/commands/dashboard.js +1 -0
  60. package/dist/commands/dashboard.js.map +1 -1
  61. package/dist/commands/diet.js +1 -0
  62. package/dist/commands/diet.js.map +1 -1
  63. package/dist/commands/docker/clean.js +2 -0
  64. package/dist/commands/docker/clean.js.map +1 -1
  65. package/dist/commands/docker/index.js +1 -0
  66. package/dist/commands/docker/index.js.map +1 -1
  67. package/dist/commands/docker/logs.js +6 -0
  68. package/dist/commands/docker/logs.js.map +1 -1
  69. package/dist/commands/docker/prune.js +1 -0
  70. package/dist/commands/docker/prune.js.map +1 -1
  71. package/dist/commands/docker/restart.js +5 -0
  72. package/dist/commands/docker/restart.js.map +1 -1
  73. package/dist/commands/docker/start.js +4 -0
  74. package/dist/commands/docker/start.js.map +1 -1
  75. package/dist/commands/docker/stop.js +4 -0
  76. package/dist/commands/docker/stop.js.map +1 -1
  77. package/dist/commands/epic/activate.js +1 -1
  78. package/dist/commands/epic/activate.js.map +1 -1
  79. package/dist/commands/epic/archive.js +1 -1
  80. package/dist/commands/epic/archive.js.map +1 -1
  81. package/dist/commands/epic/create.js +4 -0
  82. package/dist/commands/epic/create.js.map +1 -1
  83. package/dist/commands/epic/delete.js +1 -1
  84. package/dist/commands/epic/delete.js.map +1 -1
  85. package/dist/commands/epic/move.js +1 -1
  86. package/dist/commands/epic/move.js.map +1 -1
  87. package/dist/commands/epic/progress.js +1 -0
  88. package/dist/commands/epic/progress.js.map +1 -1
  89. package/dist/commands/epic/project.js +1 -1
  90. package/dist/commands/epic/project.js.map +1 -1
  91. package/dist/commands/epic/reorder.js +1 -1
  92. package/dist/commands/epic/reorder.js.map +1 -1
  93. package/dist/commands/epic/spec.js +1 -1
  94. package/dist/commands/epic/spec.js.map +1 -1
  95. package/dist/commands/epic/ticket.js +1 -1
  96. package/dist/commands/epic/ticket.js.map +1 -1
  97. package/dist/commands/epic/view.js +1 -1
  98. package/dist/commands/epic/view.js.map +1 -1
  99. package/dist/commands/execution/config.js +7 -1
  100. package/dist/commands/execution/config.js.map +1 -1
  101. package/dist/commands/execution/list.js +1 -0
  102. package/dist/commands/execution/list.js.map +1 -1
  103. package/dist/commands/execution/logs.js +1 -0
  104. package/dist/commands/execution/logs.js.map +1 -1
  105. package/dist/commands/execution/stop.js +2 -0
  106. package/dist/commands/execution/stop.js.map +1 -1
  107. package/dist/commands/execution/view.js +3 -1
  108. package/dist/commands/execution/view.js.map +1 -1
  109. package/dist/commands/feedback/list.js +2 -0
  110. package/dist/commands/feedback/list.js.map +1 -1
  111. package/dist/commands/feedback/submit.js +2 -0
  112. package/dist/commands/feedback/submit.js.map +1 -1
  113. package/dist/commands/feedback/view.js +2 -0
  114. package/dist/commands/feedback/view.js.map +1 -1
  115. package/dist/commands/gh/login.js +1 -1
  116. package/dist/commands/gh/login.js.map +1 -1
  117. package/dist/commands/gh/token.js +1 -1
  118. package/dist/commands/gh/token.js.map +1 -1
  119. package/dist/commands/linear/auth.js +4 -4
  120. package/dist/commands/linear/auth.js.map +1 -1
  121. package/dist/commands/linear/connect.js +10 -5
  122. package/dist/commands/linear/connect.js.map +1 -1
  123. package/dist/commands/linear/import.js +4 -3
  124. package/dist/commands/linear/import.js.map +1 -1
  125. package/dist/commands/linear/sync.js +3 -3
  126. package/dist/commands/linear/sync.js.map +1 -1
  127. package/dist/commands/link/create.js +1 -1
  128. package/dist/commands/link/create.js.map +1 -1
  129. package/dist/commands/link/list.js +1 -1
  130. package/dist/commands/link/list.js.map +1 -1
  131. package/dist/commands/link/remove.js +1 -1
  132. package/dist/commands/link/remove.js.map +1 -1
  133. package/dist/commands/media/add.js +2 -1
  134. package/dist/commands/media/add.js.map +1 -1
  135. package/dist/commands/media/index.js +2 -0
  136. package/dist/commands/media/index.js.map +1 -1
  137. package/dist/commands/media/list.js +1 -0
  138. package/dist/commands/media/list.js.map +1 -1
  139. package/dist/commands/media/preprocess.js +1 -1
  140. package/dist/commands/media/preprocess.js.map +1 -1
  141. package/dist/commands/media/remove.js +2 -1
  142. package/dist/commands/media/remove.js.map +1 -1
  143. package/dist/commands/media/show.js +1 -1
  144. package/dist/commands/media/show.js.map +1 -1
  145. package/dist/commands/monday/connect.js +4 -4
  146. package/dist/commands/monday/connect.js.map +1 -1
  147. package/dist/commands/monday/sync.js +4 -4
  148. package/dist/commands/monday/sync.js.map +1 -1
  149. package/dist/commands/new.js +1 -0
  150. package/dist/commands/new.js.map +1 -1
  151. package/dist/commands/orchestrator/start.js +2 -0
  152. package/dist/commands/orchestrator/start.js.map +1 -1
  153. package/dist/commands/phase/delete.js +1 -1
  154. package/dist/commands/phase/delete.js.map +1 -1
  155. package/dist/commands/phase/move.js +1 -1
  156. package/dist/commands/phase/move.js.map +1 -1
  157. package/dist/commands/phase/template/delete.js +1 -0
  158. package/dist/commands/phase/template/delete.js.map +1 -1
  159. package/dist/commands/phase/update.js +1 -1
  160. package/dist/commands/phase/update.js.map +1 -1
  161. package/dist/commands/pmo/init.js +2 -2
  162. package/dist/commands/pmo/init.js.map +1 -1
  163. package/dist/commands/pr/checks.js +1 -1
  164. package/dist/commands/pr/checks.js.map +1 -1
  165. package/dist/commands/pr/create.js +1 -1
  166. package/dist/commands/pr/create.js.map +1 -1
  167. package/dist/commands/pr/index.js +1 -1
  168. package/dist/commands/pr/index.js.map +1 -1
  169. package/dist/commands/pr/link.js +3 -3
  170. package/dist/commands/pr/link.js.map +1 -1
  171. package/dist/commands/pr/list.js +1 -1
  172. package/dist/commands/pr/list.js.map +1 -1
  173. package/dist/commands/pr/merge.js +1 -1
  174. package/dist/commands/pr/merge.js.map +1 -1
  175. package/dist/commands/pr/status.js +1 -1
  176. package/dist/commands/pr/status.js.map +1 -1
  177. package/dist/commands/priority/add.js +2 -2
  178. package/dist/commands/priority/add.js.map +1 -1
  179. package/dist/commands/priority/remove.js +2 -2
  180. package/dist/commands/priority/remove.js.map +1 -1
  181. package/dist/commands/priority/set.js +2 -2
  182. package/dist/commands/priority/set.js.map +1 -1
  183. package/dist/commands/project/archive.js +1 -1
  184. package/dist/commands/project/archive.js.map +1 -1
  185. package/dist/commands/project/create.js +4 -0
  186. package/dist/commands/project/create.js.map +1 -1
  187. package/dist/commands/project/delete.js +1 -1
  188. package/dist/commands/project/delete.js.map +1 -1
  189. package/dist/commands/project/spec.js +1 -1
  190. package/dist/commands/project/spec.js.map +1 -1
  191. package/dist/commands/project/unarchive.js +1 -1
  192. package/dist/commands/project/unarchive.js.map +1 -1
  193. package/dist/commands/project/update.js +1 -1
  194. package/dist/commands/project/update.js.map +1 -1
  195. package/dist/commands/project/view.js +1 -1
  196. package/dist/commands/project/view.js.map +1 -1
  197. package/dist/commands/pull.js +3 -0
  198. package/dist/commands/pull.js.map +1 -1
  199. package/dist/commands/qa/index.js +4 -4
  200. package/dist/commands/qa/index.js.map +1 -1
  201. package/dist/commands/repo/add.js +1 -1
  202. package/dist/commands/repo/add.js.map +1 -1
  203. package/dist/commands/repo/create.js +1 -1
  204. package/dist/commands/repo/create.js.map +1 -1
  205. package/dist/commands/repo/remove.js +2 -2
  206. package/dist/commands/repo/remove.js.map +1 -1
  207. package/dist/commands/repo/view.js +1 -1
  208. package/dist/commands/repo/view.js.map +1 -1
  209. package/dist/commands/roadmap/create.js +1 -0
  210. package/dist/commands/roadmap/create.js.map +1 -1
  211. package/dist/commands/session/create.js +4 -0
  212. package/dist/commands/session/create.js.map +1 -1
  213. package/dist/commands/session/exec.js +4 -0
  214. package/dist/commands/session/exec.js.map +1 -1
  215. package/dist/commands/session/health.js +2 -0
  216. package/dist/commands/session/health.js.map +1 -1
  217. package/dist/commands/session/inspect.js +3 -0
  218. package/dist/commands/session/inspect.js.map +1 -1
  219. package/dist/commands/session/peek.js +1 -0
  220. package/dist/commands/session/peek.js.map +1 -1
  221. package/dist/commands/session/restart.js +4 -0
  222. package/dist/commands/session/restart.js.map +1 -1
  223. package/dist/commands/shortcut/connect.js +4 -4
  224. package/dist/commands/shortcut/connect.js.map +1 -1
  225. package/dist/commands/staff/remove.js +1 -1
  226. package/dist/commands/staff/remove.js.map +1 -1
  227. package/dist/commands/status/delete.js +2 -1
  228. package/dist/commands/status/delete.js.map +1 -1
  229. package/dist/commands/status/list.js +1 -0
  230. package/dist/commands/status/list.js.map +1 -1
  231. package/dist/commands/status/move.js +2 -1
  232. package/dist/commands/status/move.js.map +1 -1
  233. package/dist/commands/status/update.js +1 -1
  234. package/dist/commands/status/update.js.map +1 -1
  235. package/dist/commands/telemetry/disable.js +1 -0
  236. package/dist/commands/telemetry/disable.js.map +1 -1
  237. package/dist/commands/telemetry/enable.js +1 -0
  238. package/dist/commands/telemetry/enable.js.map +1 -1
  239. package/dist/commands/telemetry/index.js +1 -0
  240. package/dist/commands/telemetry/index.js.map +1 -1
  241. package/dist/commands/template/apply.js +2 -2
  242. package/dist/commands/template/apply.js.map +1 -1
  243. package/dist/commands/template/delete.js +1 -0
  244. package/dist/commands/template/delete.js.map +1 -1
  245. package/dist/commands/template/save.js +1 -0
  246. package/dist/commands/template/save.js.map +1 -1
  247. package/dist/commands/template/update.js +1 -0
  248. package/dist/commands/template/update.js.map +1 -1
  249. package/dist/commands/ticket/complete.js +1 -1
  250. package/dist/commands/ticket/complete.js.map +1 -1
  251. package/dist/commands/ticket/create.js +14 -4
  252. package/dist/commands/ticket/create.js.map +1 -1
  253. package/dist/commands/ticket/delete.js +23 -8
  254. package/dist/commands/ticket/delete.js.map +1 -1
  255. package/dist/commands/ticket/edit.js +2 -2
  256. package/dist/commands/ticket/edit.js.map +1 -1
  257. package/dist/commands/ticket/link/block.js +1 -1
  258. package/dist/commands/ticket/link/block.js.map +1 -1
  259. package/dist/commands/ticket/link/duplicates.js +1 -1
  260. package/dist/commands/ticket/link/duplicates.js.map +1 -1
  261. package/dist/commands/ticket/link/relates.js +1 -1
  262. package/dist/commands/ticket/link/relates.js.map +1 -1
  263. package/dist/commands/ticket/list.d.ts +0 -8
  264. package/dist/commands/ticket/list.js +15 -121
  265. package/dist/commands/ticket/list.js.map +1 -1
  266. package/dist/commands/ticket/move.js +34 -7
  267. package/dist/commands/ticket/move.js.map +1 -1
  268. package/dist/commands/ticket/resolve.js +2 -2
  269. package/dist/commands/ticket/resolve.js.map +1 -1
  270. package/dist/commands/ticket/status.js +1 -1
  271. package/dist/commands/ticket/status.js.map +1 -1
  272. package/dist/commands/ticket/template/delete.js +1 -0
  273. package/dist/commands/ticket/template/delete.js.map +1 -1
  274. package/dist/commands/ticket/template/save.js +1 -0
  275. package/dist/commands/ticket/template/save.js.map +1 -1
  276. package/dist/commands/ticket/update.js +1 -0
  277. package/dist/commands/ticket/update.js.map +1 -1
  278. package/dist/commands/ticket/view.js +1 -1
  279. package/dist/commands/ticket/view.js.map +1 -1
  280. package/dist/commands/tools/add.js +6 -0
  281. package/dist/commands/tools/add.js.map +1 -1
  282. package/dist/commands/tools/remove.js +3 -0
  283. package/dist/commands/tools/remove.js.map +1 -1
  284. package/dist/commands/trello/configure.js +5 -5
  285. package/dist/commands/trello/configure.js.map +1 -1
  286. package/dist/commands/trello/import.js +4 -4
  287. package/dist/commands/trello/import.js.map +1 -1
  288. package/dist/commands/trello/sync.js +3 -3
  289. package/dist/commands/trello/sync.js.map +1 -1
  290. package/dist/commands/version/bump.js +3 -0
  291. package/dist/commands/version/bump.js.map +1 -1
  292. package/dist/commands/work/complete.js +34 -1
  293. package/dist/commands/work/complete.js.map +1 -1
  294. package/dist/commands/work/hooks/add.js +7 -0
  295. package/dist/commands/work/hooks/add.js.map +1 -1
  296. package/dist/commands/work/hooks/list.js +2 -0
  297. package/dist/commands/work/hooks/list.js.map +1 -1
  298. package/dist/commands/work/hooks/remove.js +4 -0
  299. package/dist/commands/work/hooks/remove.js.map +1 -1
  300. package/dist/commands/work/hooks/toggle.js +4 -0
  301. package/dist/commands/work/hooks/toggle.js.map +1 -1
  302. package/dist/commands/work/ready.js +44 -5
  303. package/dist/commands/work/ready.js.map +1 -1
  304. package/dist/commands/work/resolve.js +1 -1
  305. package/dist/commands/work/resolve.js.map +1 -1
  306. package/dist/commands/work/review.js +3 -1
  307. package/dist/commands/work/review.js.map +1 -1
  308. package/dist/commands/work/revise.js +1 -1
  309. package/dist/commands/work/revise.js.map +1 -1
  310. package/dist/commands/work/source/set.js +3 -0
  311. package/dist/commands/work/source/set.js.map +1 -1
  312. package/dist/commands/work/source.js +1 -0
  313. package/dist/commands/work/source.js.map +1 -1
  314. package/dist/commands/work/spawn.js +2 -1
  315. package/dist/commands/work/spawn.js.map +1 -1
  316. package/dist/commands/work/start.js +71 -18
  317. package/dist/commands/work/start.js.map +1 -1
  318. package/dist/commands/work/watch.js +1 -1
  319. package/dist/commands/work/watch.js.map +1 -1
  320. package/dist/commands/workflow/delete.js +1 -1
  321. package/dist/commands/workflow/delete.js.map +1 -1
  322. package/dist/commands/workflow/setup.js +5 -0
  323. package/dist/commands/workflow/setup.js.map +1 -1
  324. package/dist/commands/workflow/switch.js +1 -1
  325. package/dist/commands/workflow/switch.js.map +1 -1
  326. package/dist/commands/workflow/view.js +1 -1
  327. package/dist/commands/workflow/view.js.map +1 -1
  328. package/dist/commands/workflow-rule/create.js +1 -0
  329. package/dist/commands/workflow-rule/create.js.map +1 -1
  330. package/dist/commands/workflow-rule/delete.js +1 -1
  331. package/dist/commands/workflow-rule/delete.js.map +1 -1
  332. package/dist/commands/workflow-rule/update.js +1 -1
  333. package/dist/commands/workflow-rule/update.js.map +1 -1
  334. package/dist/commands/workspace/add.js +5 -0
  335. package/dist/commands/workspace/add.js.map +1 -1
  336. package/dist/commands/workspace/remove.js +1 -1
  337. package/dist/commands/workspace/remove.js.map +1 -1
  338. package/dist/hooks/init.js +35 -7
  339. package/dist/hooks/init.js.map +1 -1
  340. package/dist/hooks/postrun.d.ts +6 -4
  341. package/dist/hooks/postrun.js +25 -18
  342. package/dist/hooks/postrun.js.map +1 -1
  343. package/dist/lib/execution/commit-validation.d.ts +58 -0
  344. package/dist/lib/execution/commit-validation.js +252 -0
  345. package/dist/lib/execution/commit-validation.js.map +1 -0
  346. package/dist/lib/execution/config.js +3 -0
  347. package/dist/lib/execution/config.js.map +1 -1
  348. package/dist/lib/execution/storage.d.ts +20 -3
  349. package/dist/lib/execution/storage.js +27 -6
  350. package/dist/lib/execution/storage.js.map +1 -1
  351. package/dist/lib/flags/resolver.js +3 -6
  352. package/dist/lib/flags/resolver.js.map +1 -1
  353. package/dist/lib/linear/client.d.ts +4 -0
  354. package/dist/lib/linear/client.js +12 -0
  355. package/dist/lib/linear/client.js.map +1 -1
  356. package/dist/lib/onboarding/wizard.js +3 -3
  357. package/dist/lib/onboarding/wizard.js.map +1 -1
  358. package/dist/lib/pmo/base-command.d.ts +21 -1
  359. package/dist/lib/pmo/base-command.js +28 -4
  360. package/dist/lib/pmo/base-command.js.map +1 -1
  361. package/dist/lib/prompt-command.js +1 -1
  362. package/dist/lib/prompt-command.js.map +1 -1
  363. package/dist/lib/prompt-json.d.ts +19 -11
  364. package/dist/lib/prompt-json.js +32 -17
  365. package/dist/lib/prompt-json.js.map +1 -1
  366. package/dist/lib/providers/index.d.ts +11 -0
  367. package/dist/lib/providers/index.js +11 -0
  368. package/dist/lib/providers/index.js.map +1 -0
  369. package/dist/lib/providers/linear-provider.d.ts +26 -0
  370. package/dist/lib/providers/linear-provider.js +339 -0
  371. package/dist/lib/providers/linear-provider.js.map +1 -0
  372. package/dist/lib/providers/pmo-provider.d.ts +20 -0
  373. package/dist/lib/providers/pmo-provider.js +83 -0
  374. package/dist/lib/providers/pmo-provider.js.map +1 -0
  375. package/dist/lib/providers/resolver.d.ts +44 -0
  376. package/dist/lib/providers/resolver.js +82 -0
  377. package/dist/lib/providers/resolver.js.map +1 -0
  378. package/dist/lib/providers/types.d.ts +136 -0
  379. package/dist/lib/providers/types.js +12 -0
  380. package/dist/lib/providers/types.js.map +1 -0
  381. package/dist/lib/update-prompt.d.ts +3 -3
  382. package/dist/lib/update-prompt.js +15 -10
  383. package/dist/lib/update-prompt.js.map +1 -1
  384. package/dist/lib/work-lifecycle/index.d.ts +1 -0
  385. package/dist/lib/work-lifecycle/index.js +1 -0
  386. package/dist/lib/work-lifecycle/index.js.map +1 -1
  387. package/dist/lib/work-lifecycle/post-execution.d.ts +40 -9
  388. package/dist/lib/work-lifecycle/post-execution.js +61 -9
  389. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  390. package/oclif.manifest.json +1886 -1886
  391. package/package.json +1 -1
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Linear Ticket Provider
3
+ *
4
+ * Writes ticket operations directly to Linear via API,
5
+ * then updates local PMO to keep it in sync.
6
+ *
7
+ * Emits work:status_changed with source='linear' so the outbound sync
8
+ * handler skips Linear (avoiding double-write).
9
+ */
10
+ import { LinearClient } from '../linear/client.js';
11
+ import { LinearMapper } from '../linear/mapper.js';
12
+ import { getLinearApiKey, loadLinearConfig } from '../linear/config.js';
13
+ import { findMatchingLinearState } from '../external-issues/outbound-sync.js';
14
+ import { listLinearIssues } from '../external-issues/linear.js';
15
+ import { PMO_PRIORITY_TO_LINEAR, LINEAR_PRIORITY_TO_PMO } from '../linear/types.js';
16
+ export class LinearTicketProvider {
17
+ db;
18
+ storage;
19
+ projectId;
20
+ ticketStatusCategory;
21
+ name = 'linear';
22
+ constructor(db, storage, projectId, ticketStatusCategory) {
23
+ this.db = db;
24
+ this.storage = storage;
25
+ this.projectId = projectId;
26
+ this.ticketStatusCategory = ticketStatusCategory;
27
+ }
28
+ getApiKeyOrFail() {
29
+ const apiKey = getLinearApiKey(this.db);
30
+ if (!apiKey)
31
+ throw new Error('Linear API key not configured');
32
+ return apiKey;
33
+ }
34
+ async moveTicket(ticketId, newState) {
35
+ // 1. Get Linear API key
36
+ const apiKey = getLinearApiKey(this.db);
37
+ if (!apiKey) {
38
+ return { success: false, provider: 'linear', error: 'Linear API key not configured' };
39
+ }
40
+ // 2. Look up Linear mapping for this PMO ticket
41
+ const mapper = new LinearMapper(this.db);
42
+ const mapping = mapper.getByTicketId(ticketId);
43
+ if (!mapping) {
44
+ return { success: false, provider: 'linear', error: `No Linear mapping for ticket ${ticketId}` };
45
+ }
46
+ // 3. Get Linear team's workflow states
47
+ const client = new LinearClient(apiKey);
48
+ let team;
49
+ try {
50
+ team = await client.getTeamByKey(mapping.linearTeamKey);
51
+ }
52
+ catch (error) {
53
+ return {
54
+ success: false,
55
+ provider: 'linear',
56
+ error: `Failed to get Linear team: ${error instanceof Error ? error.message : String(error)}`,
57
+ };
58
+ }
59
+ if (!team) {
60
+ return { success: false, provider: 'linear', error: `Linear team not found: ${mapping.linearTeamKey}` };
61
+ }
62
+ let states;
63
+ try {
64
+ states = await client.listStates(team.id);
65
+ }
66
+ catch (error) {
67
+ return {
68
+ success: false,
69
+ provider: 'linear',
70
+ error: `Failed to list Linear states: ${error instanceof Error ? error.message : String(error)}`,
71
+ };
72
+ }
73
+ // 4. Find the matching Linear state for the target PMO state
74
+ // Map PMO status category to Linear state type for category matching
75
+ const categoryType = mapPMOStateToLinearType(newState);
76
+ const matchingState = findMatchingLinearState(states, newState, categoryType);
77
+ if (!matchingState) {
78
+ return {
79
+ success: false,
80
+ provider: 'linear',
81
+ error: `No matching Linear state for "${newState}" (category: ${categoryType})`,
82
+ };
83
+ }
84
+ // 5. Update the issue state on Linear
85
+ try {
86
+ await client.updateIssueState(mapping.linearIssueId, matchingState.id);
87
+ }
88
+ catch (error) {
89
+ return {
90
+ success: false,
91
+ provider: 'linear',
92
+ error: `Failed to update Linear issue: ${error instanceof Error ? error.message : String(error)}`,
93
+ };
94
+ }
95
+ // 6. Also update local PMO to keep it in sync
96
+ try {
97
+ await this.storage.moveTicket(this.projectId, ticketId, newState);
98
+ }
99
+ catch {
100
+ // Non-fatal: Linear is the source of truth, local PMO is best-effort
101
+ }
102
+ // 7. Post a comment about the status change
103
+ try {
104
+ await client.addComment(mapping.linearIssueId, `Status updated to **${newState}** (via prlt post-execution transition)`);
105
+ }
106
+ catch {
107
+ // Non-fatal: comment is informational
108
+ }
109
+ // 8. Update sync timestamp
110
+ try {
111
+ mapper.updateSyncTimestamp(ticketId);
112
+ }
113
+ catch {
114
+ // Non-fatal
115
+ }
116
+ return { success: true, provider: 'linear' };
117
+ }
118
+ async deleteTicket(ticketId) {
119
+ let apiKey;
120
+ try {
121
+ apiKey = this.getApiKeyOrFail();
122
+ }
123
+ catch {
124
+ return { success: false, provider: 'linear', error: 'Linear API key not configured' };
125
+ }
126
+ // Look up Linear mapping
127
+ const mapper = new LinearMapper(this.db);
128
+ const mapping = mapper.getByTicketId(ticketId);
129
+ if (mapping) {
130
+ // Archive the issue in Linear
131
+ const client = new LinearClient(apiKey);
132
+ try {
133
+ await client.archiveIssue(mapping.linearIssueId);
134
+ }
135
+ catch (error) {
136
+ return {
137
+ success: false,
138
+ provider: 'linear',
139
+ error: `Failed to archive Linear issue: ${error instanceof Error ? error.message : String(error)}`,
140
+ };
141
+ }
142
+ // Remove the mapping
143
+ try {
144
+ mapper.deleteMapping(ticketId);
145
+ }
146
+ catch {
147
+ // Non-fatal
148
+ }
149
+ }
150
+ // Also delete the local PMO mirror
151
+ try {
152
+ await this.storage.deleteTicket(ticketId);
153
+ }
154
+ catch {
155
+ // Non-fatal if Linear archive succeeded
156
+ }
157
+ return { success: true, provider: 'linear' };
158
+ }
159
+ async listTickets(projectId, filter) {
160
+ let apiKey;
161
+ try {
162
+ apiKey = this.getApiKeyOrFail();
163
+ }
164
+ catch {
165
+ return { success: false, provider: 'linear', tickets: [], error: 'Linear API key not configured' };
166
+ }
167
+ const linearConfig = loadLinearConfig(this.db);
168
+ const team = linearConfig?.defaultTeamKey || process.env.PRLT_LINEAR_TEAM;
169
+ try {
170
+ const envelopes = await listLinearIssues({ apiKey, team }, { limit: 50 });
171
+ let tickets = envelopes.map(envelope => ({
172
+ id: envelope.source.externalKey,
173
+ title: envelope.title,
174
+ description: envelope.description || undefined,
175
+ priority: envelope.priority || undefined,
176
+ category: envelope.category || undefined,
177
+ projectId: envelope.projectKey,
178
+ projectName: envelope.projectKey,
179
+ statusId: envelope.status,
180
+ statusName: envelope.status,
181
+ owner: envelope.assignee || undefined,
182
+ assignee: envelope.assignee || undefined,
183
+ subtasks: [],
184
+ labels: envelope.labels,
185
+ metadata: {
186
+ external_source: envelope.source.name,
187
+ external_key: envelope.source.externalKey,
188
+ external_id: envelope.source.externalId,
189
+ external_url: envelope.source.url,
190
+ },
191
+ createdAt: new Date(),
192
+ updatedAt: new Date(),
193
+ }));
194
+ // Apply client-side filters
195
+ if (filter?.priority) {
196
+ tickets = tickets.filter(t => t.priority === filter.priority);
197
+ }
198
+ if (filter?.column) {
199
+ tickets = tickets.filter(t => t.statusName === filter.column);
200
+ }
201
+ if (filter?.category) {
202
+ tickets = tickets.filter(t => t.category === filter.category);
203
+ }
204
+ if (filter?.search) {
205
+ const term = filter.search.toLowerCase();
206
+ tickets = tickets.filter(t => t.title.toLowerCase().includes(term) ||
207
+ (t.description || '').toLowerCase().includes(term));
208
+ }
209
+ if (filter?.label) {
210
+ const label = filter.label.toLowerCase();
211
+ tickets = tickets.filter(t => t.labels.some(l => l.toLowerCase() === label));
212
+ }
213
+ return { success: true, provider: 'linear', tickets };
214
+ }
215
+ catch (error) {
216
+ return {
217
+ success: false,
218
+ provider: 'linear',
219
+ tickets: [],
220
+ error: error instanceof Error ? error.message : String(error),
221
+ };
222
+ }
223
+ }
224
+ async createTicket(projectId, input) {
225
+ let apiKey;
226
+ try {
227
+ apiKey = this.getApiKeyOrFail();
228
+ }
229
+ catch {
230
+ return { success: false, provider: 'linear', error: 'Linear API key not configured' };
231
+ }
232
+ const client = new LinearClient(apiKey);
233
+ const linearConfig = loadLinearConfig(this.db);
234
+ const teamKey = linearConfig?.defaultTeamKey || process.env.PRLT_LINEAR_TEAM;
235
+ if (!teamKey) {
236
+ return { success: false, provider: 'linear', error: 'Linear team key is required. Set PRLT_LINEAR_TEAM.' };
237
+ }
238
+ const team = await client.getTeamByKey(teamKey);
239
+ if (!team) {
240
+ return { success: false, provider: 'linear', error: `Linear team "${teamKey}" not found.` };
241
+ }
242
+ try {
243
+ // Map PMO priority to Linear priority number
244
+ const linearPriority = input.priority ? PMO_PRIORITY_TO_LINEAR[input.priority] : undefined;
245
+ // Create the issue in Linear
246
+ const issue = await client.createIssue({
247
+ teamId: team.id,
248
+ title: input.title,
249
+ description: input.description,
250
+ priority: linearPriority,
251
+ });
252
+ // Create local PMO mirror ticket
253
+ const mirrorDescription = [
254
+ input.description || '',
255
+ '',
256
+ '---',
257
+ `_Created in Linear: [${issue.identifier}](${issue.url})_`,
258
+ ].join('\n').trim();
259
+ const mirrorPriority = input.priority || LINEAR_PRIORITY_TO_PMO[issue.priority] || undefined;
260
+ const pmoTicket = await this.storage.createTicket(projectId, {
261
+ ...input,
262
+ title: issue.title,
263
+ description: mirrorDescription,
264
+ priority: mirrorPriority,
265
+ metadata: {
266
+ ...input.metadata,
267
+ 'external_source': 'linear',
268
+ 'external_id': issue.id,
269
+ 'external_key': issue.identifier,
270
+ 'external_url': issue.url,
271
+ 'linear.issue_id': issue.id,
272
+ 'linear.identifier': issue.identifier,
273
+ 'linear.url': issue.url,
274
+ 'linear.team': issue.team.key,
275
+ 'linear.state': issue.state.name,
276
+ },
277
+ });
278
+ // Create mapping record for sync operations
279
+ const mapper = new LinearMapper(this.db);
280
+ mapper.createMapping({
281
+ pmoTicketId: pmoTicket.id,
282
+ linearIssueId: issue.id,
283
+ linearIdentifier: issue.identifier,
284
+ linearTeamKey: issue.team.key,
285
+ linearUrl: issue.url,
286
+ syncDirection: 'outbound',
287
+ createdAt: new Date(),
288
+ });
289
+ return { success: true, provider: 'linear', ticket: pmoTicket };
290
+ }
291
+ catch (error) {
292
+ return {
293
+ success: false,
294
+ provider: 'linear',
295
+ error: error instanceof Error ? error.message : String(error),
296
+ };
297
+ }
298
+ }
299
+ async getTicket(ticketId) {
300
+ // For getTicket, use local PMO since we maintain mirrors
301
+ // This avoids unnecessary API calls for reads
302
+ try {
303
+ const ticket = await this.storage.getTicket(ticketId);
304
+ return { success: true, provider: 'linear', ticket };
305
+ }
306
+ catch (error) {
307
+ return {
308
+ success: false,
309
+ provider: 'linear',
310
+ error: error instanceof Error ? error.message : String(error),
311
+ };
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Map a PMO status name to the most likely Linear state type.
317
+ * Used as a fallback when exact name matching fails.
318
+ */
319
+ function mapPMOStateToLinearType(stateName) {
320
+ const lower = stateName.toLowerCase();
321
+ if (lower.includes('review') || lower.includes('in progress') || lower.includes('started')) {
322
+ return 'started';
323
+ }
324
+ if (lower.includes('done') || lower.includes('complete') || lower.includes('merged')) {
325
+ return 'completed';
326
+ }
327
+ if (lower.includes('backlog')) {
328
+ return 'backlog';
329
+ }
330
+ if (lower.includes('cancel')) {
331
+ return 'canceled';
332
+ }
333
+ if (lower.includes('triage')) {
334
+ return 'triage';
335
+ }
336
+ // Default to started for unknown states (most post-execution transitions go forward)
337
+ return 'started';
338
+ }
339
+ //# sourceMappingURL=linear-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/linear-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * PMO Ticket Provider
3
+ *
4
+ * Default provider for users without external integrations.
5
+ * Wraps the existing PMO storage calls.
6
+ * Emits ticket:status_changed events via the storage layer.
7
+ */
8
+ import type { TicketFilter, CreateTicketInput } from '../pmo/types.js';
9
+ import type { TicketProvider, ProviderMoveResult, ProviderDeleteResult, ProviderListResult, ProviderCreateResult, ProviderGetResult, ProviderStorage } from './types.js';
10
+ export declare class PMOTicketProvider implements TicketProvider {
11
+ private storage;
12
+ private projectId;
13
+ readonly name: "pmo";
14
+ constructor(storage: ProviderStorage, projectId: string);
15
+ moveTicket(ticketId: string, newState: string): Promise<ProviderMoveResult>;
16
+ deleteTicket(ticketId: string): Promise<ProviderDeleteResult>;
17
+ listTickets(projectId?: string, filter?: TicketFilter): Promise<ProviderListResult>;
18
+ createTicket(projectId: string, input: CreateTicketInput): Promise<ProviderCreateResult>;
19
+ getTicket(ticketId: string): Promise<ProviderGetResult>;
20
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * PMO Ticket Provider
3
+ *
4
+ * Default provider for users without external integrations.
5
+ * Wraps the existing PMO storage calls.
6
+ * Emits ticket:status_changed events via the storage layer.
7
+ */
8
+ export class PMOTicketProvider {
9
+ storage;
10
+ projectId;
11
+ name = 'pmo';
12
+ constructor(storage, projectId) {
13
+ this.storage = storage;
14
+ this.projectId = projectId;
15
+ }
16
+ async moveTicket(ticketId, newState) {
17
+ try {
18
+ await this.storage.moveTicket(this.projectId, ticketId, newState);
19
+ return { success: true, provider: 'pmo' };
20
+ }
21
+ catch (error) {
22
+ return {
23
+ success: false,
24
+ provider: 'pmo',
25
+ error: error instanceof Error ? error.message : String(error),
26
+ };
27
+ }
28
+ }
29
+ async deleteTicket(ticketId) {
30
+ try {
31
+ await this.storage.deleteTicket(ticketId);
32
+ return { success: true, provider: 'pmo' };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ success: false,
37
+ provider: 'pmo',
38
+ error: error instanceof Error ? error.message : String(error),
39
+ };
40
+ }
41
+ }
42
+ async listTickets(projectId, filter) {
43
+ try {
44
+ const tickets = await this.storage.listTickets(projectId, filter);
45
+ return { success: true, provider: 'pmo', tickets };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ success: false,
50
+ provider: 'pmo',
51
+ tickets: [],
52
+ error: error instanceof Error ? error.message : String(error),
53
+ };
54
+ }
55
+ }
56
+ async createTicket(projectId, input) {
57
+ try {
58
+ const ticket = await this.storage.createTicket(projectId, input);
59
+ return { success: true, provider: 'pmo', ticket };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ success: false,
64
+ provider: 'pmo',
65
+ error: error instanceof Error ? error.message : String(error),
66
+ };
67
+ }
68
+ }
69
+ async getTicket(ticketId) {
70
+ try {
71
+ const ticket = await this.storage.getTicket(ticketId);
72
+ return { success: true, provider: 'pmo', ticket };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ success: false,
77
+ provider: 'pmo',
78
+ error: error instanceof Error ? error.message : String(error),
79
+ };
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=pmo-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pmo-provider.js","sourceRoot":"","sources":["../../../src/lib/providers/pmo-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Ticket Provider Resolver
3
+ *
4
+ * Determines which provider should handle ticket operations based on the
5
+ * ticket's external source metadata or workspace configuration.
6
+ *
7
+ * Two resolution modes:
8
+ * 1. Ticket-level: resolveTicketProvider() — for operations on a specific ticket
9
+ * (move, delete). Uses the ticket's metadata to find the source of truth.
10
+ *
11
+ * 2. Project-level: resolveProjectProvider() — for operations that aren't
12
+ * ticket-specific (list, create). Uses workspace config to determine
13
+ * the active provider.
14
+ */
15
+ import type Database from 'better-sqlite3';
16
+ import type { TicketProvider, ProviderStorage } from './types.js';
17
+ /**
18
+ * Resolve the correct provider for a given ticket.
19
+ *
20
+ * Uses the ticket's metadata to determine the source of truth:
21
+ * - external_source = 'linear' + configured + inbound/bidirectional → Linear
22
+ * - Otherwise → PMO
23
+ *
24
+ * @param ticketId - The PMO ticket ID
25
+ * @param projectId - The PMO project ID
26
+ * @param db - Database handle for config/mapping lookups
27
+ * @param storage - Storage for fallback and local sync
28
+ * @param metadata - Ticket metadata (contains external_source, etc.)
29
+ * @returns The appropriate TicketProvider for this ticket
30
+ */
31
+ export declare function resolveTicketProvider(ticketId: string, projectId: string, db: Database.Database, storage: ProviderStorage, metadata?: Record<string, string> | null): TicketProvider;
32
+ /**
33
+ * Resolve the correct provider for project-level operations (list, create).
34
+ *
35
+ * Unlike resolveTicketProvider, this doesn't require a specific ticket.
36
+ * It checks workspace configuration to determine the active provider.
37
+ *
38
+ * @param db - Database handle for config lookups
39
+ * @param storage - Storage instance
40
+ * @param projectId - The PMO project ID
41
+ * @param source - Optional source hint ('pmo', 'linear', or 'auto')
42
+ * @returns The appropriate TicketProvider
43
+ */
44
+ export declare function resolveProjectProvider(db: Database.Database, storage: ProviderStorage, projectId: string, source?: string): TicketProvider;
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Ticket Provider Resolver
3
+ *
4
+ * Determines which provider should handle ticket operations based on the
5
+ * ticket's external source metadata or workspace configuration.
6
+ *
7
+ * Two resolution modes:
8
+ * 1. Ticket-level: resolveTicketProvider() — for operations on a specific ticket
9
+ * (move, delete). Uses the ticket's metadata to find the source of truth.
10
+ *
11
+ * 2. Project-level: resolveProjectProvider() — for operations that aren't
12
+ * ticket-specific (list, create). Uses workspace config to determine
13
+ * the active provider.
14
+ */
15
+ import { isLinearConfigured } from '../linear/config.js';
16
+ import { LinearMapper } from '../linear/mapper.js';
17
+ import { PMOTicketProvider } from './pmo-provider.js';
18
+ import { LinearTicketProvider } from './linear-provider.js';
19
+ /**
20
+ * Resolve the correct provider for a given ticket.
21
+ *
22
+ * Uses the ticket's metadata to determine the source of truth:
23
+ * - external_source = 'linear' + configured + inbound/bidirectional → Linear
24
+ * - Otherwise → PMO
25
+ *
26
+ * @param ticketId - The PMO ticket ID
27
+ * @param projectId - The PMO project ID
28
+ * @param db - Database handle for config/mapping lookups
29
+ * @param storage - Storage for fallback and local sync
30
+ * @param metadata - Ticket metadata (contains external_source, etc.)
31
+ * @returns The appropriate TicketProvider for this ticket
32
+ */
33
+ export function resolveTicketProvider(ticketId, projectId, db, storage, metadata) {
34
+ const externalSource = metadata?.external_source;
35
+ // Check Linear
36
+ if (externalSource === 'linear' && isLinearConfigured(db)) {
37
+ const mapper = new LinearMapper(db);
38
+ const mapping = mapper.getByTicketId(ticketId);
39
+ if (mapping) {
40
+ // Only use Linear provider when Linear is the source of truth:
41
+ // - 'inbound' = ticket was imported from Linear → Linear is source of truth
42
+ // - 'bidirectional' = both directions synced → write to Linear directly
43
+ // - 'outbound' = ticket was created in PMO and pushed to Linear → PMO is source of truth
44
+ if (mapping.syncDirection !== 'outbound') {
45
+ return new LinearTicketProvider(db, storage, projectId, null);
46
+ }
47
+ }
48
+ }
49
+ // Default: local PMO
50
+ return new PMOTicketProvider(storage, projectId);
51
+ }
52
+ /**
53
+ * Resolve the correct provider for project-level operations (list, create).
54
+ *
55
+ * Unlike resolveTicketProvider, this doesn't require a specific ticket.
56
+ * It checks workspace configuration to determine the active provider.
57
+ *
58
+ * @param db - Database handle for config lookups
59
+ * @param storage - Storage instance
60
+ * @param projectId - The PMO project ID
61
+ * @param source - Optional source hint ('pmo', 'linear', or 'auto')
62
+ * @returns The appropriate TicketProvider
63
+ */
64
+ export function resolveProjectProvider(db, storage, projectId, source) {
65
+ if (source === 'pmo') {
66
+ return new PMOTicketProvider(storage, projectId);
67
+ }
68
+ if (source === 'linear') {
69
+ return new LinearTicketProvider(db, storage, projectId, null);
70
+ }
71
+ // auto: use Linear when it's configured in the workspace
72
+ try {
73
+ if (isLinearConfigured(db)) {
74
+ return new LinearTicketProvider(db, storage, projectId, null);
75
+ }
76
+ }
77
+ catch {
78
+ // workspace_settings table may not exist in older/test databases
79
+ }
80
+ return new PMOTicketProvider(storage, projectId);
81
+ }
82
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/lib/providers/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,SAAiB,EACjB,EAAqB,EACrB,OAAwB,EACxB,QAAwC;IAExC,MAAM,cAAc,GAAG,QAAQ,EAAE,eAAe,CAAA;IAEhD,eAAe;IACf,IAAI,cAAc,KAAK,QAAQ,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAA;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAE9C,IAAI,OAAO,EAAE,CAAC;YACZ,+DAA+D;YAC/D,4EAA4E;YAC5E,wEAAwE;YACxE,yFAAyF;YACzF,IAAI,OAAO,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;gBACzC,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAqB,EACrB,OAAwB,EACxB,SAAiB,EACjB,MAAe;IAEf,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC;QACH,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,OAAO,IAAI,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC"}