@supatype/cli 0.1.0-alpha.9 → 0.1.1

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 (407) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/.turbo/turbo-test.log +285 -69
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -1
  6. package/dist/app/framework.js +1 -3
  7. package/dist/app/framework.js.map +1 -1
  8. package/dist/app/proxy-dev-app.d.ts +14 -0
  9. package/dist/app/proxy-dev-app.d.ts.map +1 -1
  10. package/dist/app/proxy-dev-app.js +110 -6
  11. package/dist/app/proxy-dev-app.js.map +1 -1
  12. package/dist/app-config.d.ts +10 -0
  13. package/dist/app-config.d.ts.map +1 -1
  14. package/dist/app-config.js +72 -0
  15. package/dist/app-config.js.map +1 -1
  16. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  17. package/dist/binary-cache.d.ts +19 -7
  18. package/dist/binary-cache.d.ts.map +1 -1
  19. package/dist/binary-cache.js +92 -46
  20. package/dist/binary-cache.js.map +1 -1
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +17 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/add.d.ts +3 -0
  26. package/dist/commands/add.d.ts.map +1 -0
  27. package/dist/commands/add.js +86 -0
  28. package/dist/commands/add.js.map +1 -0
  29. package/dist/commands/admin.d.ts +28 -1
  30. package/dist/commands/admin.d.ts.map +1 -1
  31. package/dist/commands/admin.js +297 -149
  32. package/dist/commands/admin.js.map +1 -1
  33. package/dist/commands/adopt.d.ts +3 -0
  34. package/dist/commands/adopt.d.ts.map +1 -0
  35. package/dist/commands/adopt.js +55 -0
  36. package/dist/commands/adopt.js.map +1 -0
  37. package/dist/commands/app.d.ts.map +1 -1
  38. package/dist/commands/app.js +20 -17
  39. package/dist/commands/app.js.map +1 -1
  40. package/dist/commands/cache.d.ts.map +1 -1
  41. package/dist/commands/cache.js +11 -10
  42. package/dist/commands/cache.js.map +1 -1
  43. package/dist/commands/cloud.d.ts +4 -9
  44. package/dist/commands/cloud.d.ts.map +1 -1
  45. package/dist/commands/cloud.js +75 -125
  46. package/dist/commands/cloud.js.map +1 -1
  47. package/dist/commands/db.d.ts.map +1 -1
  48. package/dist/commands/db.js +37 -58
  49. package/dist/commands/db.js.map +1 -1
  50. package/dist/commands/deploy.d.ts.map +1 -1
  51. package/dist/commands/deploy.js +140 -96
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.d.ts.map +1 -1
  54. package/dist/commands/dev.js +74 -39
  55. package/dist/commands/dev.js.map +1 -1
  56. package/dist/commands/diff.d.ts.map +1 -1
  57. package/dist/commands/diff.js +39 -39
  58. package/dist/commands/diff.js.map +1 -1
  59. package/dist/commands/doctor.d.ts +3 -0
  60. package/dist/commands/doctor.d.ts.map +1 -0
  61. package/dist/commands/doctor.js +78 -0
  62. package/dist/commands/doctor.js.map +1 -0
  63. package/dist/commands/engine.d.ts.map +1 -1
  64. package/dist/commands/engine.js +5 -4
  65. package/dist/commands/engine.js.map +1 -1
  66. package/dist/commands/functions.d.ts.map +1 -1
  67. package/dist/commands/functions.js +172 -119
  68. package/dist/commands/functions.js.map +1 -1
  69. package/dist/commands/generate.d.ts.map +1 -1
  70. package/dist/commands/generate.js +5 -4
  71. package/dist/commands/generate.js.map +1 -1
  72. package/dist/commands/init.d.ts +35 -1
  73. package/dist/commands/init.d.ts.map +1 -1
  74. package/dist/commands/init.js +883 -107
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/introspect.d.ts +3 -0
  77. package/dist/commands/introspect.d.ts.map +1 -0
  78. package/dist/commands/introspect.js +35 -0
  79. package/dist/commands/introspect.js.map +1 -0
  80. package/dist/commands/keys.d.ts +15 -1
  81. package/dist/commands/keys.d.ts.map +1 -1
  82. package/dist/commands/keys.js +46 -10
  83. package/dist/commands/keys.js.map +1 -1
  84. package/dist/commands/link-helpers.d.ts +15 -0
  85. package/dist/commands/link-helpers.d.ts.map +1 -0
  86. package/dist/commands/link-helpers.js +225 -0
  87. package/dist/commands/link-helpers.js.map +1 -0
  88. package/dist/commands/logs.d.ts.map +1 -1
  89. package/dist/commands/logs.js +5 -4
  90. package/dist/commands/logs.js.map +1 -1
  91. package/dist/commands/migrate-from-v1.d.ts.map +1 -1
  92. package/dist/commands/migrate-from-v1.js +3 -2
  93. package/dist/commands/migrate-from-v1.js.map +1 -1
  94. package/dist/commands/migrate.d.ts.map +1 -1
  95. package/dist/commands/migrate.js +119 -26
  96. package/dist/commands/migrate.js.map +1 -1
  97. package/dist/commands/pg.d.ts.map +1 -1
  98. package/dist/commands/pg.js +11 -12
  99. package/dist/commands/pg.js.map +1 -1
  100. package/dist/commands/plugins.d.ts.map +1 -1
  101. package/dist/commands/plugins.js +55 -46
  102. package/dist/commands/plugins.js.map +1 -1
  103. package/dist/commands/pull.d.ts.map +1 -1
  104. package/dist/commands/pull.js +33 -5
  105. package/dist/commands/pull.js.map +1 -1
  106. package/dist/commands/push.d.ts.map +1 -1
  107. package/dist/commands/push.js +111 -138
  108. package/dist/commands/push.js.map +1 -1
  109. package/dist/commands/seed.d.ts.map +1 -1
  110. package/dist/commands/seed.js +4 -3
  111. package/dist/commands/seed.js.map +1 -1
  112. package/dist/commands/self-host.d.ts +2 -2
  113. package/dist/commands/self-host.d.ts.map +1 -1
  114. package/dist/commands/self-host.js +65 -50
  115. package/dist/commands/self-host.js.map +1 -1
  116. package/dist/commands/self-update.d.ts.map +1 -1
  117. package/dist/commands/self-update.js +3 -2
  118. package/dist/commands/self-update.js.map +1 -1
  119. package/dist/commands/status.d.ts +1 -1
  120. package/dist/commands/status.d.ts.map +1 -1
  121. package/dist/commands/status.js +95 -29
  122. package/dist/commands/status.js.map +1 -1
  123. package/dist/commands/types.d.ts.map +1 -1
  124. package/dist/commands/types.js +3 -2
  125. package/dist/commands/types.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +54 -21
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/compose-rename.d.ts +10 -0
  130. package/dist/compose-rename.d.ts.map +1 -0
  131. package/dist/compose-rename.js +67 -0
  132. package/dist/compose-rename.js.map +1 -0
  133. package/dist/config.d.ts +2 -1
  134. package/dist/config.d.ts.map +1 -1
  135. package/dist/config.js.map +1 -1
  136. package/dist/dev-compose.d.ts +26 -0
  137. package/dist/dev-compose.d.ts.map +1 -1
  138. package/dist/dev-compose.js +357 -79
  139. package/dist/dev-compose.js.map +1 -1
  140. package/dist/dev-log-bus.d.ts +30 -0
  141. package/dist/dev-log-bus.d.ts.map +1 -0
  142. package/dist/dev-log-bus.js +87 -0
  143. package/dist/dev-log-bus.js.map +1 -0
  144. package/dist/dev-log-filter.d.ts +10 -0
  145. package/dist/dev-log-filter.d.ts.map +1 -0
  146. package/dist/dev-log-filter.js +36 -0
  147. package/dist/dev-log-filter.js.map +1 -0
  148. package/dist/dev-logo.d.ts +12 -0
  149. package/dist/dev-logo.d.ts.map +1 -0
  150. package/dist/dev-logo.js +56 -0
  151. package/dist/dev-logo.js.map +1 -0
  152. package/dist/dev-ports.d.ts +27 -0
  153. package/dist/dev-ports.d.ts.map +1 -0
  154. package/dist/dev-ports.js +171 -0
  155. package/dist/dev-ports.js.map +1 -0
  156. package/dist/dev-session-lock.d.ts +25 -0
  157. package/dist/dev-session-lock.d.ts.map +1 -0
  158. package/dist/dev-session-lock.js +81 -0
  159. package/dist/dev-session-lock.js.map +1 -0
  160. package/dist/dev-session.d.ts +26 -0
  161. package/dist/dev-session.d.ts.map +1 -0
  162. package/dist/dev-session.js +106 -0
  163. package/dist/dev-session.js.map +1 -0
  164. package/dist/dev-shutdown.d.ts +25 -0
  165. package/dist/dev-shutdown.d.ts.map +1 -0
  166. package/dist/dev-shutdown.js +114 -0
  167. package/dist/dev-shutdown.js.map +1 -0
  168. package/dist/dev-task-colors.d.ts +13 -0
  169. package/dist/dev-task-colors.d.ts.map +1 -0
  170. package/dist/dev-task-colors.js +43 -0
  171. package/dist/dev-task-colors.js.map +1 -0
  172. package/dist/dev-tui.d.ts +24 -0
  173. package/dist/dev-tui.d.ts.map +1 -0
  174. package/dist/dev-tui.js +188 -0
  175. package/dist/dev-tui.js.map +1 -0
  176. package/dist/diff-output.d.ts +5 -1
  177. package/dist/diff-output.d.ts.map +1 -1
  178. package/dist/diff-output.js +69 -0
  179. package/dist/diff-output.js.map +1 -1
  180. package/dist/docker-runtime.d.ts +30 -0
  181. package/dist/docker-runtime.d.ts.map +1 -0
  182. package/dist/docker-runtime.js +118 -0
  183. package/dist/docker-runtime.js.map +1 -0
  184. package/dist/engine-client.d.ts +10 -1
  185. package/dist/engine-client.d.ts.map +1 -1
  186. package/dist/engine-client.js +76 -17
  187. package/dist/engine-client.js.map +1 -1
  188. package/dist/engine-push-output.d.ts +17 -0
  189. package/dist/engine-push-output.d.ts.map +1 -0
  190. package/dist/engine-push-output.js +64 -0
  191. package/dist/engine-push-output.js.map +1 -0
  192. package/dist/ensure-binary.js +2 -2
  193. package/dist/ensure-binary.js.map +1 -1
  194. package/dist/env-file.d.ts +5 -0
  195. package/dist/env-file.d.ts.map +1 -0
  196. package/dist/env-file.js +33 -0
  197. package/dist/env-file.js.map +1 -0
  198. package/dist/gitignore.d.ts +8 -0
  199. package/dist/gitignore.d.ts.map +1 -0
  200. package/dist/gitignore.js +41 -0
  201. package/dist/gitignore.js.map +1 -0
  202. package/dist/kong-config.d.ts +9 -0
  203. package/dist/kong-config.d.ts.map +1 -1
  204. package/dist/kong-config.js +18 -1
  205. package/dist/kong-config.js.map +1 -1
  206. package/dist/link.d.ts +66 -0
  207. package/dist/link.d.ts.map +1 -0
  208. package/dist/link.js +160 -0
  209. package/dist/link.js.map +1 -0
  210. package/dist/process-manager.d.ts +8 -0
  211. package/dist/process-manager.d.ts.map +1 -1
  212. package/dist/process-manager.js +53 -9
  213. package/dist/process-manager.js.map +1 -1
  214. package/dist/project-config.d.ts +30 -3
  215. package/dist/project-config.d.ts.map +1 -1
  216. package/dist/project-config.js +37 -4
  217. package/dist/project-config.js.map +1 -1
  218. package/dist/prompts.d.ts +3 -0
  219. package/dist/prompts.d.ts.map +1 -0
  220. package/dist/prompts.js +3 -0
  221. package/dist/prompts.js.map +1 -0
  222. package/dist/pull-utils.d.ts +50 -14
  223. package/dist/pull-utils.d.ts.map +1 -1
  224. package/dist/pull-utils.js +152 -12
  225. package/dist/pull-utils.js.map +1 -1
  226. package/dist/resolve-target.d.ts +86 -0
  227. package/dist/resolve-target.d.ts.map +1 -0
  228. package/dist/resolve-target.js +291 -0
  229. package/dist/resolve-target.js.map +1 -0
  230. package/dist/restore-system-relation-targets.d.ts +3 -0
  231. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  232. package/dist/restore-system-relation-targets.js +45 -0
  233. package/dist/restore-system-relation-targets.js.map +1 -0
  234. package/dist/runtime-routes.d.ts.map +1 -1
  235. package/dist/runtime-routes.js +7 -0
  236. package/dist/runtime-routes.js.map +1 -1
  237. package/dist/schema-ast-v2.d.ts +1 -1
  238. package/dist/schema-ast-v2.d.ts.map +1 -1
  239. package/dist/schema-ast-v2.js +2 -2
  240. package/dist/schema-ast-v2.js.map +1 -1
  241. package/dist/schema-sources.d.ts +40 -0
  242. package/dist/schema-sources.d.ts.map +1 -0
  243. package/dist/schema-sources.js +183 -0
  244. package/dist/schema-sources.js.map +1 -0
  245. package/dist/scripts/postinstall.js +5 -1
  246. package/dist/scripts/postinstall.js.map +1 -1
  247. package/dist/self-host-compose.d.ts +37 -1
  248. package/dist/self-host-compose.d.ts.map +1 -1
  249. package/dist/self-host-compose.js +234 -43
  250. package/dist/self-host-compose.js.map +1 -1
  251. package/dist/storage-provision.d.ts +4 -0
  252. package/dist/storage-provision.d.ts.map +1 -1
  253. package/dist/storage-provision.js +24 -2
  254. package/dist/storage-provision.js.map +1 -1
  255. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  256. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  257. package/dist/supatype-eval-1781522769253.mjs +3 -0
  258. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  259. package/dist/systemd.js +2 -2
  260. package/dist/systemd.js.map +1 -1
  261. package/dist/target-client.d.ts +10 -0
  262. package/dist/target-client.d.ts.map +1 -0
  263. package/dist/target-client.js +22 -0
  264. package/dist/target-client.js.map +1 -0
  265. package/dist/type-extractor.d.ts +11 -0
  266. package/dist/type-extractor.d.ts.map +1 -1
  267. package/dist/type-extractor.js +95 -8
  268. package/dist/type-extractor.js.map +1 -1
  269. package/dist/ui/brand.d.ts +9 -0
  270. package/dist/ui/brand.d.ts.map +1 -0
  271. package/dist/ui/brand.js +11 -0
  272. package/dist/ui/brand.js.map +1 -0
  273. package/dist/ui/confirm.d.ts +12 -0
  274. package/dist/ui/confirm.d.ts.map +1 -0
  275. package/dist/ui/confirm.js +28 -0
  276. package/dist/ui/confirm.js.map +1 -0
  277. package/dist/ui/fatal.d.ts +10 -0
  278. package/dist/ui/fatal.d.ts.map +1 -0
  279. package/dist/ui/fatal.js +34 -0
  280. package/dist/ui/fatal.js.map +1 -0
  281. package/dist/ui/index.d.ts +9 -0
  282. package/dist/ui/index.d.ts.map +1 -0
  283. package/dist/ui/index.js +9 -0
  284. package/dist/ui/index.js.map +1 -0
  285. package/dist/ui/interactive.d.ts +3 -0
  286. package/dist/ui/interactive.d.ts.map +1 -0
  287. package/dist/ui/interactive.js +5 -0
  288. package/dist/ui/interactive.js.map +1 -0
  289. package/dist/ui/messages.d.ts +10 -0
  290. package/dist/ui/messages.d.ts.map +1 -0
  291. package/dist/ui/messages.js +35 -0
  292. package/dist/ui/messages.js.map +1 -0
  293. package/dist/ui/next-steps.d.ts +3 -0
  294. package/dist/ui/next-steps.d.ts.map +1 -0
  295. package/dist/ui/next-steps.js +10 -0
  296. package/dist/ui/next-steps.js.map +1 -0
  297. package/dist/ui/progress.d.ts +5 -0
  298. package/dist/ui/progress.d.ts.map +1 -0
  299. package/dist/ui/progress.js +24 -0
  300. package/dist/ui/progress.js.map +1 -0
  301. package/dist/ui/prompts.d.ts +14 -0
  302. package/dist/ui/prompts.d.ts.map +1 -0
  303. package/dist/ui/prompts.js +34 -0
  304. package/dist/ui/prompts.js.map +1 -0
  305. package/package.json +5 -2
  306. package/src/app/framework.ts +1 -3
  307. package/src/app/proxy-dev-app.ts +114 -6
  308. package/src/app-config.ts +80 -0
  309. package/src/binary-cache.ts +102 -52
  310. package/src/cli.ts +16 -2
  311. package/src/commands/add.ts +97 -0
  312. package/src/commands/admin.ts +381 -190
  313. package/src/commands/adopt.ts +82 -0
  314. package/src/commands/app.ts +20 -17
  315. package/src/commands/cache.ts +11 -10
  316. package/src/commands/cloud.ts +91 -142
  317. package/src/commands/db.ts +40 -63
  318. package/src/commands/deploy.ts +186 -126
  319. package/src/commands/dev.ts +98 -55
  320. package/src/commands/diff.ts +52 -43
  321. package/src/commands/doctor.ts +103 -0
  322. package/src/commands/engine.ts +5 -4
  323. package/src/commands/functions.ts +187 -123
  324. package/src/commands/generate.ts +5 -4
  325. package/src/commands/init.ts +1087 -104
  326. package/src/commands/introspect.ts +48 -0
  327. package/src/commands/keys.ts +56 -14
  328. package/src/commands/link-helpers.ts +273 -0
  329. package/src/commands/logs.ts +5 -4
  330. package/src/commands/migrate-from-v1.ts +3 -2
  331. package/src/commands/migrate.ts +167 -27
  332. package/src/commands/pg.ts +13 -18
  333. package/src/commands/plugins.ts +55 -46
  334. package/src/commands/pull.ts +38 -9
  335. package/src/commands/push.ts +148 -175
  336. package/src/commands/seed.ts +5 -4
  337. package/src/commands/self-host.ts +85 -54
  338. package/src/commands/self-update.ts +3 -2
  339. package/src/commands/status.ts +102 -33
  340. package/src/commands/types.ts +3 -2
  341. package/src/commands/update.ts +59 -23
  342. package/src/compose-rename.ts +76 -0
  343. package/src/config.ts +2 -1
  344. package/src/dev-compose.ts +462 -76
  345. package/src/dev-log-bus.ts +101 -0
  346. package/src/dev-log-filter.ts +32 -0
  347. package/src/dev-logo.ts +61 -0
  348. package/src/dev-ports.ts +212 -0
  349. package/src/dev-session-lock.ts +101 -0
  350. package/src/dev-session.ts +130 -0
  351. package/src/dev-shutdown.ts +147 -0
  352. package/src/dev-task-colors.ts +47 -0
  353. package/src/dev-tui.ts +232 -0
  354. package/src/diff-output.ts +79 -1
  355. package/src/docker-runtime.ts +151 -0
  356. package/src/engine-client.ts +81 -17
  357. package/src/engine-push-output.ts +75 -0
  358. package/src/ensure-binary.ts +2 -2
  359. package/src/env-file.ts +37 -0
  360. package/src/gitignore.ts +48 -0
  361. package/src/kong-config.ts +24 -1
  362. package/src/link.ts +243 -0
  363. package/src/process-manager.ts +66 -10
  364. package/src/project-config.ts +62 -7
  365. package/src/prompts.ts +2 -0
  366. package/src/pull-utils.ts +217 -23
  367. package/src/resolve-target.ts +419 -0
  368. package/src/restore-system-relation-targets.ts +45 -0
  369. package/src/runtime-routes.ts +7 -0
  370. package/src/schema-ast-v2.ts +2 -1
  371. package/src/schema-sources.ts +248 -0
  372. package/src/scripts/postinstall.ts +7 -1
  373. package/src/self-host-compose.ts +262 -46
  374. package/src/storage-provision.ts +33 -1
  375. package/src/supatype-eval-1781522769253.mts +1 -0
  376. package/src/systemd.ts +2 -2
  377. package/src/target-client.ts +40 -0
  378. package/src/type-extractor.ts +124 -11
  379. package/src/ui/README.md +17 -0
  380. package/src/ui/brand.ts +12 -0
  381. package/src/ui/confirm.ts +38 -0
  382. package/src/ui/fatal.ts +43 -0
  383. package/src/ui/index.ts +8 -0
  384. package/src/ui/interactive.ts +4 -0
  385. package/src/ui/messages.ts +43 -0
  386. package/src/ui/next-steps.ts +10 -0
  387. package/src/ui/progress.ts +28 -0
  388. package/src/ui/prompts.ts +40 -0
  389. package/tests/admin-ensure.test.ts +59 -0
  390. package/tests/cli-help.test.ts +27 -2
  391. package/tests/config.test.ts +29 -2
  392. package/tests/dev-ports.test.ts +41 -0
  393. package/tests/dev-session-lock.test.ts +54 -0
  394. package/tests/dev-ui.test.ts +162 -0
  395. package/tests/docker-runtime.test.ts +236 -0
  396. package/tests/engine-push-output.test.ts +67 -0
  397. package/tests/init.test.ts +197 -18
  398. package/tests/link.test.ts +148 -0
  399. package/tests/minisign.test.ts +102 -0
  400. package/tests/proxy-dev-app.test.ts +45 -1
  401. package/tests/pull-utils.test.ts +5 -4
  402. package/tests/runtime-contract.test.ts +186 -2
  403. package/tests/schema-sources.test.ts +119 -0
  404. package/tests/storage-provision.test.ts +100 -0
  405. package/tests/ui-confirm.test.ts +41 -0
  406. package/tests/ui-messages.test.ts +66 -0
  407. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Tracks an active `supatype dev` session so we can recover when the CLI exits
3
+ * without graceful shutdown (terminal closed, kill signal, etc.).
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
6
+ import { join, resolve } from "node:path";
7
+ import { spawnSync } from "node:child_process";
8
+ import * as p from "@clack/prompts";
9
+ import { runDockerCompose } from "./self-host-compose.js";
10
+ import { isInteractive } from "./ui/interactive.js";
11
+ import { warn } from "./ui/messages.js";
12
+ const LOCK_VERSION = 1;
13
+ export function devSessionLockPath(cwd) {
14
+ return resolve(cwd, ".supatype/dev-session.json");
15
+ }
16
+ export function readDevSessionLock(cwd) {
17
+ const path = devSessionLockPath(cwd);
18
+ if (!existsSync(path))
19
+ return null;
20
+ try {
21
+ const data = JSON.parse(readFileSync(path, "utf8"));
22
+ if (data.version !== LOCK_VERSION)
23
+ return null;
24
+ return data;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ export function writeDevSessionLock(cwd, lock) {
31
+ const dir = join(cwd, ".supatype");
32
+ mkdirSync(dir, { recursive: true });
33
+ const payload = { version: LOCK_VERSION, ...lock };
34
+ writeFileSync(devSessionLockPath(cwd), `${JSON.stringify(payload, null, 2)}\n`, "utf8");
35
+ }
36
+ export function clearDevSessionLock(cwd) {
37
+ const path = devSessionLockPath(cwd);
38
+ if (existsSync(path))
39
+ unlinkSync(path);
40
+ }
41
+ export function composeStackHasContainers(composeProject) {
42
+ const result = spawnSync("docker", ["ps", "-a", "--filter", `label=com.docker.compose.project=${composeProject}`, "--format", "{{.Names}}"], { encoding: "utf8", shell: process.platform === "win32" });
43
+ return Boolean(result.stdout?.trim());
44
+ }
45
+ /**
46
+ * When a previous dev session did not shut down cleanly, offer to stop its stack
47
+ * before starting a new one.
48
+ */
49
+ export async function recoverStaleDevSession(cwd) {
50
+ const lock = readDevSessionLock(cwd);
51
+ if (!lock)
52
+ return;
53
+ if (!composeStackHasContainers(lock.composeProject)) {
54
+ clearDevSessionLock(cwd);
55
+ return;
56
+ }
57
+ const message = `Previous dev session for "${lock.projectRef}" may not have shut down cleanly ` +
58
+ `(stack "${lock.composeProject}" is still running).`;
59
+ if (!isInteractive()) {
60
+ warn(message);
61
+ warn(`Stop it manually: docker compose -p ${lock.composeProject} down`);
62
+ return;
63
+ }
64
+ const stop = await p.confirm({
65
+ message: `${message}\n\nStop the orphaned stack before starting?`,
66
+ initialValue: true,
67
+ });
68
+ if (p.isCancel(stop) || !stop) {
69
+ warn(`Leaving "${lock.composeProject}" running.`);
70
+ return;
71
+ }
72
+ const status = runDockerCompose(lock.composePath, ["down"], cwd, lock.composeProject, { quiet: true });
73
+ if (status === 0) {
74
+ clearDevSessionLock(cwd);
75
+ p.log.success(`Stopped orphaned stack "${lock.composeProject}".`);
76
+ }
77
+ else {
78
+ warn(`Could not stop "${lock.composeProject}" (exit ${status}).`);
79
+ }
80
+ }
81
+ //# sourceMappingURL=dev-session-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-session-lock.js","sourceRoot":"","sources":["../src/dev-session-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `supatype dev` output session — TUI (default) or interleaved stream mode.
3
+ */
4
+ import type { ProcessOptions } from "./process-manager.js";
5
+ import { DevLogBus, type DevLogLevel } from "./dev-log-bus.js";
6
+ export type DevUiMode = "tui" | "stream";
7
+ export declare function resolveDevUiMode(streamFlag: boolean): DevUiMode;
8
+ export declare function beginDevSession(mode: DevUiMode): DevSession;
9
+ /** Enter console capture + TUI. */
10
+ export declare function startDevSession(): void;
11
+ export declare function endDevSession(): void;
12
+ export declare function getActiveDevSession(): DevSession | null;
13
+ /** Log to a TUI task stream, or prefixed console output in stream mode. */
14
+ export declare function appendDevTaskLog(taskId: string, taskTitle: string, line: string, level?: DevLogLevel): void;
15
+ export declare class DevSession {
16
+ readonly bus: DevLogBus;
17
+ readonly mode: DevUiMode;
18
+ private tui;
19
+ private restoreConsole;
20
+ constructor(mode: DevUiMode);
21
+ isTui(): boolean;
22
+ start(): void;
23
+ stop(): void;
24
+ }
25
+ export declare function enhanceProcessOptions(label: string, opts: ProcessOptions): ProcessOptions;
26
+ //# sourceMappingURL=dev-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-session.d.ts","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAA;AAExC,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,CAI/D;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAI3D;AAED,mCAAmC;AACnC,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,wBAAgB,mBAAmB,IAAI,UAAU,GAAG,IAAI,CAEvD;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,WAAmB,GACzB,IAAI,CAUN;AAED,qBAAa,UAAU;IACrB,QAAQ,CAAC,GAAG,YAAkB;IAC9B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,cAAc,CAA4B;gBAEtC,IAAI,EAAE,SAAS;IAI3B,KAAK,IAAI,OAAO;IAIhB,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;CAMb;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,cAAc,CAmBzF"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * `supatype dev` output session — TUI (default) or interleaved stream mode.
3
+ */
4
+ import { filterDevSubprocessLine, formatConsoleArgs } from "./dev-log-filter.js";
5
+ import { DevLogBus } from "./dev-log-bus.js";
6
+ import { DevTui } from "./dev-tui.js";
7
+ export function resolveDevUiMode(streamFlag) {
8
+ if (streamFlag)
9
+ return "stream";
10
+ if (!process.stdout.isTTY || !process.stdin.isTTY)
11
+ return "stream";
12
+ return "tui";
13
+ }
14
+ let activeSession = null;
15
+ export function beginDevSession(mode) {
16
+ activeSession?.stop();
17
+ activeSession = new DevSession(mode);
18
+ return activeSession;
19
+ }
20
+ /** Enter console capture + TUI. */
21
+ export function startDevSession() {
22
+ activeSession?.start();
23
+ }
24
+ export function endDevSession() {
25
+ activeSession?.stop();
26
+ activeSession = null;
27
+ }
28
+ export function getActiveDevSession() {
29
+ return activeSession;
30
+ }
31
+ /** Log to a TUI task stream, or prefixed console output in stream mode. */
32
+ export function appendDevTaskLog(taskId, taskTitle, line, level = "log") {
33
+ const session = getActiveDevSession();
34
+ if (session?.isTui()) {
35
+ session.bus.ensureTask(taskId, taskTitle);
36
+ session.bus.append(taskId, line, level);
37
+ return;
38
+ }
39
+ const prefix = taskId === "stack" ? "[supatype]" : `[${taskId}]`;
40
+ const write = level === "warn" ? console.warn : level === "error" ? console.error : console.log;
41
+ write(`${prefix} ${line}`);
42
+ }
43
+ export class DevSession {
44
+ bus = new DevLogBus();
45
+ mode;
46
+ tui = null;
47
+ restoreConsole = null;
48
+ constructor(mode) {
49
+ this.mode = mode;
50
+ }
51
+ isTui() {
52
+ return this.mode === "tui";
53
+ }
54
+ start() {
55
+ if (!this.isTui())
56
+ return;
57
+ this.restoreConsole = patchConsole(this.bus);
58
+ this.tui = new DevTui(this.bus);
59
+ this.tui.start();
60
+ }
61
+ stop() {
62
+ this.tui?.stop();
63
+ this.tui = null;
64
+ this.restoreConsole?.();
65
+ this.restoreConsole = null;
66
+ }
67
+ }
68
+ export function enhanceProcessOptions(label, opts) {
69
+ const session = getActiveDevSession();
70
+ const subprocessFilter = label === "app" || label === "studio"
71
+ ? { shouldLogLine: (line) => filterDevSubprocessLine(label, line) }
72
+ : {};
73
+ if (!session?.isTui()) {
74
+ return { ...opts, ...subprocessFilter };
75
+ }
76
+ session.bus.ensureTask(label, label);
77
+ return {
78
+ ...opts,
79
+ ...subprocessFilter,
80
+ onLine: (line, stream) => {
81
+ session.bus.append(label, line, stream === "stderr" ? "error" : "log");
82
+ },
83
+ };
84
+ }
85
+ function patchConsole(bus) {
86
+ const original = {
87
+ log: console.log,
88
+ warn: console.warn,
89
+ error: console.error,
90
+ };
91
+ console.log = (...args) => {
92
+ bus.append("stack", formatConsoleArgs(args), "log");
93
+ };
94
+ console.warn = (...args) => {
95
+ bus.append("stack", formatConsoleArgs(args), "warn");
96
+ };
97
+ console.error = (...args) => {
98
+ bus.append("stack", formatConsoleArgs(args), "error");
99
+ };
100
+ return () => {
101
+ console.log = original.log;
102
+ console.warn = original.warn;
103
+ console.error = original.error;
104
+ };
105
+ }
106
+ //# sourceMappingURL=dev-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-session.js","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Graceful shutdown for `supatype dev` — SIGINT, TUI Ctrl+C, terminal close,
3
+ * and a synchronous compose-down fallback on process exit.
4
+ */
5
+ export interface DevComposeShutdownFallback {
6
+ cwd: string;
7
+ composePath: string;
8
+ composeProject: string;
9
+ }
10
+ export interface RegisterDevShutdownOptions {
11
+ /** Sync `docker compose down` when async teardown cannot finish (terminal close, kill). */
12
+ compose?: DevComposeShutdownFallback;
13
+ /** Project root — clears `.supatype/dev-session.json` after shutdown. */
14
+ cwd?: string;
15
+ }
16
+ /** Register async teardown (stop children, compose down, etc.). Call once per dev session. */
17
+ export declare function registerDevShutdown(work: () => Promise<void>, opts?: RegisterDevShutdownOptions): void;
18
+ /** TUI Ctrl+C — do not re-emit SIGINT (avoids double-fire on Windows raw mode). */
19
+ export declare function requestDevShutdown(): void;
20
+ export declare function isDevShuttingDown(): boolean;
21
+ /** @internal Tests — reset module state between cases. */
22
+ export declare function resetDevShutdownForTests(): void;
23
+ /** Whether a compose fallback was registered (tests). */
24
+ export declare function hasComposeShutdownFallback(): boolean;
25
+ //# sourceMappingURL=dev-shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-shutdown.d.ts","sourceRoot":"","sources":["../src/dev-shutdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;CACvB;AAuCD,MAAM,WAAW,0BAA0B;IACzC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,0BAA0B,CAAA;IACpC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,EAAE,0BAA0B,GAChC,IAAI,CAmBN;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,0DAA0D;AAC1D,wBAAgB,wBAAwB,IAAI,IAAI,CAQ/C;AAwCD,yDAAyD;AACzD,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Graceful shutdown for `supatype dev` — SIGINT, TUI Ctrl+C, terminal close,
3
+ * and a synchronous compose-down fallback on process exit.
4
+ */
5
+ import { existsSync } from "node:fs";
6
+ import { endDevSession } from "./dev-session.js";
7
+ import { clearDevSessionLock } from "./dev-session-lock.js";
8
+ import { runDockerCompose } from "./self-host-compose.js";
9
+ let shutdownWork = null;
10
+ let composeFallback = null;
11
+ let shutdownCwd = null;
12
+ let shuttingDown = false;
13
+ let shutdownCompleted = false;
14
+ let forceQuitRequested = false;
15
+ let hooksRegistered = false;
16
+ function onSignal() {
17
+ void runDevShutdown();
18
+ }
19
+ function onStdinClose() {
20
+ if (!process.stdin.isTTY)
21
+ return;
22
+ void runDevShutdown();
23
+ }
24
+ function syncComposeDownFallback() {
25
+ if (shutdownCompleted || !composeFallback)
26
+ return;
27
+ try {
28
+ runDockerCompose(composeFallback.composePath, ["down"], composeFallback.cwd, composeFallback.composeProject, { quiet: true });
29
+ }
30
+ catch {
31
+ // best-effort — process is exiting
32
+ }
33
+ if (shutdownCwd)
34
+ clearDevSessionLock(shutdownCwd);
35
+ }
36
+ function onProcessExit() {
37
+ syncComposeDownFallback();
38
+ }
39
+ /** Register async teardown (stop children, compose down, etc.). Call once per dev session. */
40
+ export function registerDevShutdown(work, opts) {
41
+ shutdownWork = work;
42
+ composeFallback = opts?.compose ?? null;
43
+ shutdownCwd = opts?.cwd ?? opts?.compose?.cwd ?? null;
44
+ if (hooksRegistered)
45
+ return;
46
+ hooksRegistered = true;
47
+ process.on("SIGINT", onSignal);
48
+ process.on("SIGTERM", onSignal);
49
+ if (process.platform === "win32") {
50
+ process.on("SIGBREAK", onSignal);
51
+ }
52
+ process.on("exit", onProcessExit);
53
+ if (process.stdin.isTTY) {
54
+ process.stdin.on("end", onStdinClose);
55
+ process.stdin.on("close", onStdinClose);
56
+ }
57
+ }
58
+ /** TUI Ctrl+C — do not re-emit SIGINT (avoids double-fire on Windows raw mode). */
59
+ export function requestDevShutdown() {
60
+ void runDevShutdown();
61
+ }
62
+ export function isDevShuttingDown() {
63
+ return shuttingDown;
64
+ }
65
+ /** @internal Tests — reset module state between cases. */
66
+ export function resetDevShutdownForTests() {
67
+ shutdownWork = null;
68
+ composeFallback = null;
69
+ shutdownCwd = null;
70
+ shuttingDown = false;
71
+ shutdownCompleted = false;
72
+ forceQuitRequested = false;
73
+ hooksRegistered = false;
74
+ }
75
+ async function runDevShutdown() {
76
+ if (shuttingDown) {
77
+ if (!forceQuitRequested) {
78
+ forceQuitRequested = true;
79
+ process.stderr.write("\n[supatype] Still shutting down (stopping Docker)… press Ctrl+C again to force quit.\n");
80
+ return;
81
+ }
82
+ try {
83
+ endDevSession();
84
+ }
85
+ catch {
86
+ // best-effort terminal restore
87
+ }
88
+ process.stderr.write("\n[supatype] Forced quit — Docker containers may still be running.\n");
89
+ process.stdout.write("\n");
90
+ process.exit(130);
91
+ }
92
+ shuttingDown = true;
93
+ try {
94
+ endDevSession();
95
+ process.stdout.write("\n");
96
+ await shutdownWork?.();
97
+ shutdownCompleted = true;
98
+ if (shutdownCwd)
99
+ clearDevSessionLock(shutdownCwd);
100
+ process.exit(0);
101
+ }
102
+ catch (err) {
103
+ process.stderr.write(`[supatype] Shutdown failed: ${err.message}\n`);
104
+ process.stderr.write("[supatype] Docker containers may still be running — try: supatype self-host compose down\n");
105
+ syncComposeDownFallback();
106
+ shutdownCompleted = true;
107
+ process.exit(1);
108
+ }
109
+ }
110
+ /** Whether a compose fallback was registered (tests). */
111
+ export function hasComposeShutdownFallback() {
112
+ return composeFallback !== null && existsSync(composeFallback.composePath);
113
+ }
114
+ //# sourceMappingURL=dev-shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-shutdown.js","sourceRoot":"","sources":["../src/dev-shutdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * ANSI colours for `supatype dev` TUI task list and log panes.
3
+ */
4
+ import { BOLD, DIM, RESET } from "./ui/brand.js";
5
+ export { RESET, DIM, BOLD };
6
+ /** Purple for orchestrator logs, green for Vite/app, etc. */
7
+ export declare function taskColor(taskId: string): string;
8
+ export declare function levelColor(line: string): string | null;
9
+ /** Drop redundant prefix — task pane is already labelled supatype. */
10
+ export declare function normalizeStackLogLine(line: string): string;
11
+ export declare function colorizeLogLine(taskId: string, line: string): string;
12
+ export declare function colorizeTaskLabel(taskId: string, label: string, focused: boolean): string;
13
+ //# sourceMappingURL=dev-task-colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-task-colors.d.ts","sourceRoot":"","sources":["../src/dev-task-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAE3B,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAehD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGzF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ANSI colours for `supatype dev` TUI task list and log panes.
3
+ */
4
+ import { BOLD, DIM, RESET } from "./ui/brand.js";
5
+ export { RESET, DIM, BOLD };
6
+ /** Purple for orchestrator logs, green for Vite/app, etc. */
7
+ export function taskColor(taskId) {
8
+ switch (taskId) {
9
+ case "stack":
10
+ return "\x1b[35m";
11
+ case "app":
12
+ return "\x1b[32m";
13
+ case "studio":
14
+ return "\x1b[96m";
15
+ case "server":
16
+ return "\x1b[32m";
17
+ case "postgrest":
18
+ return "\x1b[36m";
19
+ default:
20
+ return "\x1b[37m";
21
+ }
22
+ }
23
+ export function levelColor(line) {
24
+ if (line.startsWith("✗ "))
25
+ return "\x1b[31m";
26
+ if (line.startsWith("⚠ "))
27
+ return "\x1b[33m";
28
+ return null;
29
+ }
30
+ /** Drop redundant prefix — task pane is already labelled supatype. */
31
+ export function normalizeStackLogLine(line) {
32
+ return line.replace(/^\[supatype\]\s*/, "");
33
+ }
34
+ export function colorizeLogLine(taskId, line) {
35
+ const level = levelColor(line);
36
+ const base = level ?? taskColor(taskId);
37
+ return `${base}${line}${RESET}`;
38
+ }
39
+ export function colorizeTaskLabel(taskId, label, focused) {
40
+ const style = focused ? BOLD + taskColor(taskId) : taskColor(taskId);
41
+ return `${style}${label}${RESET}`;
42
+ }
43
+ //# sourceMappingURL=dev-task-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-task-colors.js","sourceRoot":"","sources":["../src/dev-task-colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAE3B,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,UAAU,CAAA;QACnB,KAAK,KAAK;YACR,OAAO,UAAU,CAAA;QACnB,KAAK,QAAQ;YACX,OAAO,UAAU,CAAA;QACnB,KAAK,QAAQ;YACX,OAAO,UAAU,CAAA;QACnB,KAAK,WAAW;YACd,OAAO,UAAU,CAAA;QACnB;YACE,OAAO,UAAU,CAAA;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAA;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAA;IAC5C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;IACvC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAa,EAAE,OAAgB;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACpE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAA;AACnC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Interactive terminal UI for `supatype dev` — task list + focused log pane.
3
+ */
4
+ import type { DevLogBus } from "./dev-log-bus.js";
5
+ export declare class DevTui {
6
+ private readonly bus;
7
+ private active;
8
+ private scrollFromBottom;
9
+ private renderPending;
10
+ private unsubscribeBus;
11
+ private readonly onResize;
12
+ private readonly onData;
13
+ constructor(bus: DevLogBus);
14
+ start(): void;
15
+ stop(): void;
16
+ private scheduleRender;
17
+ private handleInput;
18
+ private maxScroll;
19
+ private chromeRowCount;
20
+ private splitPaneHeight;
21
+ private render;
22
+ private logLineAt;
23
+ }
24
+ //# sourceMappingURL=dev-tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-tui.d.ts","sourceRoot":"","sources":["../src/dev-tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AA0BjD,qBAAa,MAAM;IAQL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPhC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAE7C,GAAG,EAAE,SAAS;IAE3C,KAAK,IAAI,IAAI;IAiBb,IAAI,IAAI,IAAI;IAiBZ,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,MAAM;IAiDd,OAAO,CAAC,SAAS;CAkBlB"}