target-supabase-sdk 0.2.0 → 0.2.2

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 (484) hide show
  1. package/README.md +130 -11
  2. package/dist/browser.d.ts +44 -36
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +6 -45
  5. package/dist/browser.js.map +1 -1
  6. package/dist/chunks/create-logger-DyH3mZ8p.js +1028 -0
  7. package/dist/chunks/create-logger-DyH3mZ8p.js.map +1 -0
  8. package/dist/chunks/enable-log-persist-BH-tbKEj.js +1481 -0
  9. package/dist/chunks/enable-log-persist-BH-tbKEj.js.map +1 -0
  10. package/dist/chunks/word.interface-DLgRobKV.js +1973 -0
  11. package/dist/chunks/word.interface-DLgRobKV.js.map +1 -0
  12. package/dist/command/command.api.d.ts +1 -1
  13. package/dist/command/command.api.d.ts.map +1 -1
  14. package/dist/command/command.interface.d.ts +1 -1
  15. package/dist/command/command.interface.d.ts.map +1 -1
  16. package/dist/core.api.d.ts +10 -6
  17. package/dist/core.api.d.ts.map +1 -1
  18. package/dist/core.interface.d.ts +3 -2
  19. package/dist/core.interface.d.ts.map +1 -1
  20. package/dist/core.utils.d.ts +1 -1
  21. package/dist/core.utils.d.ts.map +1 -1
  22. package/dist/idea/idea.interface.d.ts +1 -1
  23. package/dist/idea/idea.interface.d.ts.map +1 -1
  24. package/dist/link/link.api.d.ts +1 -1
  25. package/dist/link/link.api.d.ts.map +1 -1
  26. package/dist/link/link.interface.d.ts +2 -2
  27. package/dist/link/link.interface.d.ts.map +1 -1
  28. package/dist/list/list.api.d.ts +3 -1
  29. package/dist/list/list.api.d.ts.map +1 -1
  30. package/dist/list/list.interface.d.ts +2 -2
  31. package/dist/list/list.interface.d.ts.map +1 -1
  32. package/dist/node/env/env-parsers.d.ts +19 -0
  33. package/dist/node/env/env-parsers.d.ts.map +1 -0
  34. package/dist/node/env/index.d.ts +11 -0
  35. package/dist/node/env/index.d.ts.map +1 -0
  36. package/dist/node/env/init-supabase-from-env.d.ts +17 -0
  37. package/dist/node/env/init-supabase-from-env.d.ts.map +1 -0
  38. package/dist/node/env/load-env.d.ts +20 -0
  39. package/dist/node/env/load-env.d.ts.map +1 -0
  40. package/dist/node/env/project-root.d.ts +11 -0
  41. package/dist/node/env/project-root.d.ts.map +1 -0
  42. package/dist/node/env/public-base-url.d.ts +10 -0
  43. package/dist/node/env/public-base-url.d.ts.map +1 -0
  44. package/dist/node/env/require-env.d.ts +3 -0
  45. package/dist/node/env/require-env.d.ts.map +1 -0
  46. package/dist/node/fs/json-state-store.d.ts +19 -0
  47. package/dist/node/fs/json-state-store.d.ts.map +1 -0
  48. package/dist/node/fs/read-source-file.d.ts +19 -0
  49. package/dist/node/fs/read-source-file.d.ts.map +1 -0
  50. package/dist/node/node-liveness.d.ts +30 -0
  51. package/dist/node/node-liveness.d.ts.map +1 -0
  52. package/dist/node/node-runtime.base.d.ts +21 -3
  53. package/dist/node/node-runtime.base.d.ts.map +1 -1
  54. package/dist/node/node.api.d.ts +1 -1
  55. package/dist/node/node.api.d.ts.map +1 -1
  56. package/dist/node/node.interface.d.ts +1 -6
  57. package/dist/node/node.interface.d.ts.map +1 -1
  58. package/dist/node/preload/run-service-preload.d.ts +14 -0
  59. package/dist/node/preload/run-service-preload.d.ts.map +1 -0
  60. package/dist/node/preload/service-preload.interface.d.ts +15 -0
  61. package/dist/node/preload/service-preload.interface.d.ts.map +1 -0
  62. package/dist/node/process/index.d.ts +5 -0
  63. package/dist/node/process/index.d.ts.map +1 -0
  64. package/dist/node/process/managed-child-processes.d.ts +37 -0
  65. package/dist/node/process/managed-child-processes.d.ts.map +1 -0
  66. package/dist/node/process/process-spawn.d.ts +27 -0
  67. package/dist/node/process/process-spawn.d.ts.map +1 -0
  68. package/dist/node/readiness/index.d.ts +9 -0
  69. package/dist/node/readiness/index.d.ts.map +1 -0
  70. package/dist/node/readiness/poll-until.d.ts +11 -0
  71. package/dist/node/readiness/poll-until.d.ts.map +1 -0
  72. package/dist/node/readiness/readiness-checks.d.ts +22 -0
  73. package/dist/node/readiness/readiness-checks.d.ts.map +1 -0
  74. package/dist/node/readiness/readiness.types.d.ts +12 -0
  75. package/dist/node/readiness/readiness.types.d.ts.map +1 -0
  76. package/dist/node/readiness/run-readiness-checks.d.ts +4 -0
  77. package/dist/node/readiness/run-readiness-checks.d.ts.map +1 -0
  78. package/dist/node/readiness/service-ready-gate.d.ts +26 -0
  79. package/dist/node/readiness/service-ready-gate.d.ts.map +1 -0
  80. package/dist/node.d.ts +26 -12
  81. package/dist/node.d.ts.map +1 -1
  82. package/dist/node.js +2482 -18
  83. package/dist/node.js.map +1 -1
  84. package/dist/parcel/chunk-fetch-registry.d.ts +14 -0
  85. package/dist/parcel/chunk-fetch-registry.d.ts.map +1 -0
  86. package/dist/parcel/chunk-url.utils.d.ts +9 -0
  87. package/dist/parcel/chunk-url.utils.d.ts.map +1 -0
  88. package/dist/parcel/parcel-manager.d.ts +44 -20
  89. package/dist/parcel/parcel-manager.d.ts.map +1 -1
  90. package/dist/parcel/parcel.api.d.ts +306 -0
  91. package/dist/parcel/parcel.api.d.ts.map +1 -0
  92. package/dist/parcel/parcel.interface.d.ts +26 -5
  93. package/dist/parcel/parcel.interface.d.ts.map +1 -1
  94. package/dist/parcel/parcel.service.d.ts +38 -0
  95. package/dist/parcel/parcel.service.d.ts.map +1 -0
  96. package/dist/parcel/storage-provider-registry.d.ts +17 -0
  97. package/dist/parcel/storage-provider-registry.d.ts.map +1 -0
  98. package/dist/parcel/storage-provider.types.d.ts +31 -0
  99. package/dist/parcel/storage-provider.types.d.ts.map +1 -0
  100. package/dist/preload.d.ts +7 -0
  101. package/dist/preload.d.ts.map +1 -0
  102. package/dist/preload.js +47 -0
  103. package/dist/preload.js.map +1 -0
  104. package/dist/repo/repo-context.utils.d.ts.map +1 -1
  105. package/dist/repo/repo-manager.d.ts +1 -1
  106. package/dist/repo/repo-manager.d.ts.map +1 -1
  107. package/dist/repo/repo.api.d.ts +1 -1
  108. package/dist/repo/repo.api.d.ts.map +1 -1
  109. package/dist/repo/repo.interface.d.ts +1 -1
  110. package/dist/repo/repo.interface.d.ts.map +1 -1
  111. package/dist/repo/repo.script-loader.d.ts +3 -3
  112. package/dist/repo/repo.script-loader.d.ts.map +1 -1
  113. package/dist/service/base.interface.d.ts +54 -57
  114. package/dist/service/base.interface.d.ts.map +1 -1
  115. package/dist/service/index.d.ts +21 -0
  116. package/dist/service/index.d.ts.map +1 -0
  117. package/dist/service/service.api.d.ts +503 -0
  118. package/dist/service/service.api.d.ts.map +1 -0
  119. package/dist/service/service.interface.d.ts +36 -9
  120. package/dist/service/service.interface.d.ts.map +1 -1
  121. package/dist/shared/http/fetch-retry.d.ts +21 -0
  122. package/dist/shared/http/fetch-retry.d.ts.map +1 -0
  123. package/dist/shared/log/create-logger.d.ts +27 -0
  124. package/dist/shared/log/create-logger.d.ts.map +1 -0
  125. package/dist/shared/log/enable-log-persist.d.ts +28 -0
  126. package/dist/shared/log/enable-log-persist.d.ts.map +1 -0
  127. package/dist/shared/log/index.d.ts +6 -6
  128. package/dist/shared/log/index.d.ts.map +1 -1
  129. package/dist/shared/log/log-manager.d.ts +25 -27
  130. package/dist/shared/log/log-manager.d.ts.map +1 -1
  131. package/dist/shared/log/log-persist-batch-id.d.ts +13 -0
  132. package/dist/shared/log/log-persist-batch-id.d.ts.map +1 -0
  133. package/dist/shared/log/log-persist-flush.d.ts +8 -0
  134. package/dist/shared/log/log-persist-flush.d.ts.map +1 -0
  135. package/dist/shared/log/log-persist-hook.d.ts +6 -0
  136. package/dist/shared/log/log-persist-hook.d.ts.map +1 -0
  137. package/dist/shared/log/log-persist-logger.d.ts +15 -0
  138. package/dist/shared/log/log-persist-logger.d.ts.map +1 -0
  139. package/dist/shared/log/log-persist-registry.d.ts +18 -0
  140. package/dist/shared/log/log-persist-registry.d.ts.map +1 -0
  141. package/dist/shared/log/log-persist.config.d.ts +10 -0
  142. package/dist/shared/log/log-persist.config.d.ts.map +1 -0
  143. package/dist/shared/log/log-persist.d.ts +55 -0
  144. package/dist/shared/log/log-persist.d.ts.map +1 -0
  145. package/dist/shared/log/log-persist.interface.d.ts +116 -0
  146. package/dist/shared/log/log-persist.interface.d.ts.map +1 -0
  147. package/dist/shared/log/log-scope.d.ts +25 -18
  148. package/dist/shared/log/log-scope.d.ts.map +1 -1
  149. package/dist/shared/utils/fetch-url.d.ts +3 -0
  150. package/dist/shared/utils/fetch-url.d.ts.map +1 -0
  151. package/dist/shared/utils/network-error.d.ts +14 -0
  152. package/dist/shared/utils/network-error.d.ts.map +1 -0
  153. package/dist/shared/utils/safe-file-name.d.ts +14 -0
  154. package/dist/shared/utils/safe-file-name.d.ts.map +1 -0
  155. package/dist/shared/utils/sha256.d.ts +3 -0
  156. package/dist/shared/utils/sha256.d.ts.map +1 -0
  157. package/dist/supabase.d.ts +7 -2
  158. package/dist/supabase.d.ts.map +1 -1
  159. package/dist/task/index.d.ts +8 -7
  160. package/dist/task/index.d.ts.map +1 -1
  161. package/dist/task/local-task-registry.d.ts +1 -1
  162. package/dist/task/local-task-registry.d.ts.map +1 -1
  163. package/dist/task/task-manager.d.ts +7 -9
  164. package/dist/task/task-manager.d.ts.map +1 -1
  165. package/dist/{node → task}/task-node.d.ts +2 -3
  166. package/dist/task/task-node.d.ts.map +1 -0
  167. package/dist/task/task-post-validated.api.d.ts +19 -0
  168. package/dist/task/task-post-validated.api.d.ts.map +1 -0
  169. package/dist/task/task-post.api.d.ts +10 -5
  170. package/dist/task/task-post.api.d.ts.map +1 -1
  171. package/dist/task/task-queue.d.ts +7 -0
  172. package/dist/task/task-queue.d.ts.map +1 -0
  173. package/dist/task/task-repo-context.d.ts.map +1 -1
  174. package/dist/task/task-repo-validation.d.ts +2 -2
  175. package/dist/task/task-repo-validation.d.ts.map +1 -1
  176. package/dist/task/task.api.d.ts +13 -13
  177. package/dist/task/task.api.d.ts.map +1 -1
  178. package/dist/task/task.constant.d.ts +4 -0
  179. package/dist/task/task.constant.d.ts.map +1 -0
  180. package/dist/task/task.interface.d.ts +1 -1
  181. package/dist/task/task.interface.d.ts.map +1 -1
  182. package/dist/trigger/trigger-manager.d.ts +25 -0
  183. package/dist/trigger/trigger-manager.d.ts.map +1 -0
  184. package/dist/trigger/trigger-node.d.ts +23 -0
  185. package/dist/trigger/trigger-node.d.ts.map +1 -0
  186. package/dist/trigger/trigger.api.d.ts +4 -4
  187. package/dist/trigger/trigger.api.d.ts.map +1 -1
  188. package/dist/trigger/trigger.constant.d.ts +8 -0
  189. package/dist/trigger/trigger.constant.d.ts.map +1 -0
  190. package/dist/trigger/trigger.interface.d.ts +46 -2
  191. package/dist/trigger/trigger.interface.d.ts.map +1 -1
  192. package/dist/word/word.api.d.ts +1 -1
  193. package/dist/word/word.api.d.ts.map +1 -1
  194. package/dist/word/word.interface.d.ts +2 -2
  195. package/dist/word/word.interface.d.ts.map +1 -1
  196. package/package.json +84 -74
  197. package/src/browser.ts +144 -79
  198. package/src/command/command.api.ts +19 -17
  199. package/src/command/command.interface.ts +2 -3
  200. package/src/core.api.ts +466 -477
  201. package/src/core.interface.ts +63 -62
  202. package/src/core.utils.ts +64 -64
  203. package/src/idea/idea.interface.ts +3 -3
  204. package/src/link/link.api.ts +28 -30
  205. package/src/link/link.interface.ts +3 -4
  206. package/src/list/list.api.ts +50 -29
  207. package/src/list/list.interface.ts +3 -4
  208. package/src/node/env/env-parsers.ts +77 -0
  209. package/src/node/env/index.ts +10 -0
  210. package/src/node/env/init-supabase-from-env.ts +38 -0
  211. package/src/node/env/load-env.ts +67 -0
  212. package/src/node/env/project-root.ts +34 -0
  213. package/src/node/env/public-base-url.ts +18 -0
  214. package/src/node/env/require-env.ts +15 -0
  215. package/src/node/fs/json-state-store.ts +97 -0
  216. package/src/node/fs/read-source-file.ts +75 -0
  217. package/src/node/node-liveness.ts +80 -0
  218. package/src/node/node-runtime.base.ts +135 -104
  219. package/src/node/node.api.ts +11 -10
  220. package/src/node/node.interface.ts +1 -8
  221. package/src/node/node.utils.ts +1 -1
  222. package/src/node/preload/run-service-preload.ts +48 -0
  223. package/src/node/preload/service-preload.interface.ts +14 -0
  224. package/src/node/process/index.ts +8 -0
  225. package/src/node/process/managed-child-processes.ts +121 -0
  226. package/src/node/process/process-spawn.ts +61 -0
  227. package/src/node/readiness/index.ts +20 -0
  228. package/src/node/readiness/poll-until.ts +27 -0
  229. package/src/node/readiness/readiness-checks.ts +79 -0
  230. package/src/node/readiness/readiness.types.ts +13 -0
  231. package/src/node/readiness/run-readiness-checks.ts +20 -0
  232. package/src/node/readiness/service-ready-gate.ts +65 -0
  233. package/src/node.ts +138 -47
  234. package/src/parcel/chunk-fetch-registry.ts +96 -0
  235. package/src/parcel/chunk-url.utils.ts +30 -0
  236. package/src/parcel/parcel-manager.ts +431 -173
  237. package/src/parcel/parcel.api.ts +103 -0
  238. package/src/parcel/parcel.interface.ts +44 -23
  239. package/src/parcel/parcel.service.ts +79 -0
  240. package/src/parcel/storage-provider-registry.ts +49 -0
  241. package/src/parcel/storage-provider.types.ts +45 -0
  242. package/src/preload.ts +7 -0
  243. package/src/repo/repo-context.utils.ts +3 -4
  244. package/src/repo/repo-manager.ts +7 -20
  245. package/src/repo/repo.api.ts +5 -5
  246. package/src/repo/repo.interface.ts +1 -2
  247. package/src/repo/repo.script-loader.ts +4 -8
  248. package/src/service/base.interface.ts +81 -90
  249. package/src/service/index.ts +173 -0
  250. package/src/service/service.api.ts +294 -0
  251. package/src/service/service.interface.ts +49 -17
  252. package/src/shared/http/fetch-retry.ts +145 -0
  253. package/src/shared/log/create-logger.ts +51 -0
  254. package/src/shared/log/enable-log-persist.ts +225 -0
  255. package/src/shared/log/index.ts +19 -11
  256. package/src/shared/log/log-manager.ts +65 -69
  257. package/src/shared/log/log-persist-batch-id.ts +43 -0
  258. package/src/shared/log/log-persist-flush.ts +128 -0
  259. package/src/shared/log/log-persist-hook.ts +13 -0
  260. package/src/shared/log/log-persist-logger.ts +33 -0
  261. package/src/shared/log/log-persist-registry.ts +252 -0
  262. package/src/shared/log/log-persist.config.ts +97 -0
  263. package/src/shared/log/log-persist.interface.ts +132 -0
  264. package/src/shared/log/log-persist.ts +704 -0
  265. package/src/shared/log/log-scope.ts +46 -46
  266. package/src/shared/utils/config-path.utils.ts +1 -1
  267. package/src/shared/utils/fetch-url.ts +13 -0
  268. package/src/shared/utils/network-error.ts +152 -0
  269. package/src/shared/utils/safe-file-name.ts +37 -0
  270. package/src/shared/utils/sha256.ts +15 -0
  271. package/src/supabase.ts +125 -119
  272. package/src/task/index.ts +31 -34
  273. package/src/task/local-task-registry.ts +9 -17
  274. package/src/task/task-manager.ts +34 -35
  275. package/src/{node → task}/task-node.ts +91 -73
  276. package/src/task/task-post-validated.api.ts +47 -0
  277. package/src/task/task-post.api.ts +81 -98
  278. package/src/task/task-queue.ts +18 -0
  279. package/src/task/task-repo-context.ts +2 -1
  280. package/src/task/task-repo-validation.ts +6 -8
  281. package/src/task/task.api.ts +61 -25
  282. package/src/task/task.constant.ts +4 -0
  283. package/src/task/task.interface.ts +4 -7
  284. package/src/trigger/trigger-manager.ts +287 -0
  285. package/src/trigger/trigger-node.ts +80 -0
  286. package/src/trigger/trigger.api.ts +11 -11
  287. package/src/trigger/trigger.constant.ts +10 -0
  288. package/src/trigger/trigger.interface.ts +52 -2
  289. package/src/trigger/trigger.utils.ts +1 -1
  290. package/src/word/word.api.ts +28 -30
  291. package/src/word/word.interface.ts +3 -4
  292. package/dist/auth/auth.api.d.ts +0 -28
  293. package/dist/auth/auth.api.d.ts.map +0 -1
  294. package/dist/auth/auth.api.js +0 -51
  295. package/dist/auth/auth.api.js.map +0 -1
  296. package/dist/command/command.api.js +0 -58
  297. package/dist/command/command.api.js.map +0 -1
  298. package/dist/command/command.interface.js +0 -9
  299. package/dist/command/command.interface.js.map +0 -1
  300. package/dist/core.api.js +0 -412
  301. package/dist/core.api.js.map +0 -1
  302. package/dist/core.interface.js +0 -46
  303. package/dist/core.interface.js.map +0 -1
  304. package/dist/core.utils.js +0 -81
  305. package/dist/core.utils.js.map +0 -1
  306. package/dist/feed/feed.interface.d.ts +0 -27
  307. package/dist/feed/feed.interface.d.ts.map +0 -1
  308. package/dist/feed/feed.interface.js +0 -17
  309. package/dist/feed/feed.interface.js.map +0 -1
  310. package/dist/file/file-manager.d.ts +0 -24
  311. package/dist/file/file-manager.d.ts.map +0 -1
  312. package/dist/file/file-manager.js +0 -109
  313. package/dist/file/file-manager.js.map +0 -1
  314. package/dist/file/file.api.d.ts +0 -15
  315. package/dist/file/file.api.d.ts.map +0 -1
  316. package/dist/file/file.api.js +0 -30
  317. package/dist/file/file.api.js.map +0 -1
  318. package/dist/file/file.interface.d.ts +0 -25
  319. package/dist/file/file.interface.d.ts.map +0 -1
  320. package/dist/file/file.interface.js +0 -9
  321. package/dist/file/file.interface.js.map +0 -1
  322. package/dist/file-list/file-list.api.d.ts +0 -15
  323. package/dist/file-list/file-list.api.d.ts.map +0 -1
  324. package/dist/file-list/file-list.api.js +0 -54
  325. package/dist/file-list/file-list.api.js.map +0 -1
  326. package/dist/file-list/file-list.interface.d.ts +0 -22
  327. package/dist/file-list/file-list.interface.d.ts.map +0 -1
  328. package/dist/file-list/file-list.interface.js +0 -5
  329. package/dist/file-list/file-list.interface.js.map +0 -1
  330. package/dist/idea/idea.interface.js +0 -15
  331. package/dist/idea/idea.interface.js.map +0 -1
  332. package/dist/index.js +0 -3
  333. package/dist/index.js.map +0 -1
  334. package/dist/link/link.api.js +0 -30
  335. package/dist/link/link.api.js.map +0 -1
  336. package/dist/link/link.interface.js +0 -7
  337. package/dist/link/link.interface.js.map +0 -1
  338. package/dist/list/list.api.js +0 -30
  339. package/dist/list/list.api.js.map +0 -1
  340. package/dist/list/list.interface.js +0 -6
  341. package/dist/list/list.interface.js.map +0 -1
  342. package/dist/node/node-log-scope.d.ts +0 -11
  343. package/dist/node/node-log-scope.d.ts.map +0 -1
  344. package/dist/node/node-log-scope.js +0 -7
  345. package/dist/node/node-log-scope.js.map +0 -1
  346. package/dist/node/node-runtime.base.js +0 -397
  347. package/dist/node/node-runtime.base.js.map +0 -1
  348. package/dist/node/node-task.preset.d.ts +0 -1
  349. package/dist/node/node-task.preset.d.ts.map +0 -1
  350. package/dist/node/node-task.preset.js +0 -14
  351. package/dist/node/node-task.preset.js.map +0 -1
  352. package/dist/node/node.api.js +0 -100
  353. package/dist/node/node.api.js.map +0 -1
  354. package/dist/node/node.interface.js +0 -19
  355. package/dist/node/node.interface.js.map +0 -1
  356. package/dist/node/node.utils.js +0 -36
  357. package/dist/node/node.utils.js.map +0 -1
  358. package/dist/node/task-node.d.ts.map +0 -1
  359. package/dist/node/task-node.js +0 -245
  360. package/dist/node/task-node.js.map +0 -1
  361. package/dist/node/trigger-node.d.ts +0 -18
  362. package/dist/node/trigger-node.d.ts.map +0 -1
  363. package/dist/node/trigger-node.js +0 -150
  364. package/dist/node/trigger-node.js.map +0 -1
  365. package/dist/parcel/parcel-manager.js +0 -156
  366. package/dist/parcel/parcel-manager.js.map +0 -1
  367. package/dist/parcel/parcel.interface.js +0 -11
  368. package/dist/parcel/parcel.interface.js.map +0 -1
  369. package/dist/question-list/question-list.api.d.ts +0 -13
  370. package/dist/question-list/question-list.api.d.ts.map +0 -1
  371. package/dist/question-list/question-list.api.js +0 -35
  372. package/dist/question-list/question-list.api.js.map +0 -1
  373. package/dist/question-list/question-list.interface.d.ts +0 -18
  374. package/dist/question-list/question-list.interface.d.ts.map +0 -1
  375. package/dist/question-list/question-list.interface.js +0 -5
  376. package/dist/question-list/question-list.interface.js.map +0 -1
  377. package/dist/repo/repo-context.utils.js +0 -81
  378. package/dist/repo/repo-context.utils.js.map +0 -1
  379. package/dist/repo/repo-manager.js +0 -166
  380. package/dist/repo/repo-manager.js.map +0 -1
  381. package/dist/repo/repo.api.js +0 -40
  382. package/dist/repo/repo.api.js.map +0 -1
  383. package/dist/repo/repo.interface.js +0 -8
  384. package/dist/repo/repo.interface.js.map +0 -1
  385. package/dist/repo/repo.script-loader.js +0 -108
  386. package/dist/repo/repo.script-loader.js.map +0 -1
  387. package/dist/review/review.api.d.ts +0 -14
  388. package/dist/review/review.api.d.ts.map +0 -1
  389. package/dist/review/review.api.js +0 -133
  390. package/dist/review/review.api.js.map +0 -1
  391. package/dist/review/review.interface.d.ts +0 -24
  392. package/dist/review/review.interface.d.ts.map +0 -1
  393. package/dist/review/review.interface.js +0 -10
  394. package/dist/review/review.interface.js.map +0 -1
  395. package/dist/review-v2/apis/post-review-setting.api.d.ts +0 -12
  396. package/dist/review-v2/apis/post-review-setting.api.d.ts.map +0 -1
  397. package/dist/review-v2/apis/post-review-setting.api.js +0 -27
  398. package/dist/review-v2/apis/post-review-setting.api.js.map +0 -1
  399. package/dist/review-v2/apis/post-review.api.d.ts +0 -13
  400. package/dist/review-v2/apis/post-review.api.d.ts.map +0 -1
  401. package/dist/review-v2/apis/post-review.api.js +0 -46
  402. package/dist/review-v2/apis/post-review.api.js.map +0 -1
  403. package/dist/review-v2/review-setting.interface.d.ts +0 -23
  404. package/dist/review-v2/review-setting.interface.d.ts.map +0 -1
  405. package/dist/review-v2/review-setting.interface.js +0 -5
  406. package/dist/review-v2/review-setting.interface.js.map +0 -1
  407. package/dist/review-v2/review.interface.d.ts +0 -20
  408. package/dist/review-v2/review.interface.d.ts.map +0 -1
  409. package/dist/review-v2/review.interface.js +0 -5
  410. package/dist/review-v2/review.interface.js.map +0 -1
  411. package/dist/service/api.interface.d.ts +0 -35
  412. package/dist/service/api.interface.d.ts.map +0 -1
  413. package/dist/service/api.interface.js +0 -12
  414. package/dist/service/api.interface.js.map +0 -1
  415. package/dist/service/base.interface.js +0 -7
  416. package/dist/service/base.interface.js.map +0 -1
  417. package/dist/service/service.interface.js +0 -11
  418. package/dist/service/service.interface.js.map +0 -1
  419. package/dist/shared/log/create-api-logger.d.ts +0 -21
  420. package/dist/shared/log/create-api-logger.d.ts.map +0 -1
  421. package/dist/shared/log/create-api-logger.js +0 -19
  422. package/dist/shared/log/create-api-logger.js.map +0 -1
  423. package/dist/shared/log/index.js +0 -10
  424. package/dist/shared/log/index.js.map +0 -1
  425. package/dist/shared/log/log-manager.js +0 -237
  426. package/dist/shared/log/log-manager.js.map +0 -1
  427. package/dist/shared/log/log-scope.js +0 -70
  428. package/dist/shared/log/log-scope.js.map +0 -1
  429. package/dist/shared/utils/config-path.utils.js +0 -85
  430. package/dist/shared/utils/config-path.utils.js.map +0 -1
  431. package/dist/shared/utils/error.utils.js +0 -15
  432. package/dist/shared/utils/error.utils.js.map +0 -1
  433. package/dist/shared/utils/id.utils.js +0 -5
  434. package/dist/shared/utils/id.utils.js.map +0 -1
  435. package/dist/supabase.js +0 -100
  436. package/dist/supabase.js.map +0 -1
  437. package/dist/task/index.js +0 -14
  438. package/dist/task/index.js.map +0 -1
  439. package/dist/task/local-task-registry.js +0 -214
  440. package/dist/task/local-task-registry.js.map +0 -1
  441. package/dist/task/task-manager.js +0 -196
  442. package/dist/task/task-manager.js.map +0 -1
  443. package/dist/task/task-post.api.js +0 -91
  444. package/dist/task/task-post.api.js.map +0 -1
  445. package/dist/task/task-repo-context.js +0 -12
  446. package/dist/task/task-repo-context.js.map +0 -1
  447. package/dist/task/task-repo-validation.js +0 -96
  448. package/dist/task/task-repo-validation.js.map +0 -1
  449. package/dist/task/task.api.js +0 -303
  450. package/dist/task/task.api.js.map +0 -1
  451. package/dist/task/task.interface.js +0 -36
  452. package/dist/task/task.interface.js.map +0 -1
  453. package/dist/task/task.utils.js +0 -2
  454. package/dist/task/task.utils.js.map +0 -1
  455. package/dist/trigger/trigger.api.js +0 -125
  456. package/dist/trigger/trigger.api.js.map +0 -1
  457. package/dist/trigger/trigger.interface.js +0 -11
  458. package/dist/trigger/trigger.interface.js.map +0 -1
  459. package/dist/trigger/trigger.utils.js +0 -39
  460. package/dist/trigger/trigger.utils.js.map +0 -1
  461. package/dist/word/word.api.js +0 -30
  462. package/dist/word/word.api.js.map +0 -1
  463. package/dist/word/word.interface.js +0 -6
  464. package/dist/word/word.interface.js.map +0 -1
  465. package/src/auth/auth.api.ts +0 -87
  466. package/src/feed/feed.interface.ts +0 -33
  467. package/src/file/file-manager.ts +0 -145
  468. package/src/file/file.api.ts +0 -43
  469. package/src/file/file.interface.ts +0 -30
  470. package/src/file-list/file-list.api.ts +0 -64
  471. package/src/file-list/file-list.interface.ts +0 -24
  472. package/src/node/node-log-scope.ts +0 -15
  473. package/src/node/node-task.preset.ts +0 -13
  474. package/src/node/trigger-node.ts +0 -180
  475. package/src/question-list/question-list.api.ts +0 -42
  476. package/src/question-list/question-list.interface.ts +0 -21
  477. package/src/review/review.api.ts +0 -145
  478. package/src/review/review.interface.ts +0 -26
  479. package/src/review-v2/apis/post-review-setting.api.ts +0 -35
  480. package/src/review-v2/apis/post-review.api.ts +0 -59
  481. package/src/review-v2/review-setting.interface.ts +0 -26
  482. package/src/review-v2/review.interface.ts +0 -23
  483. package/src/service/api.interface.ts +0 -47
  484. package/src/shared/log/create-api-logger.ts +0 -36
@@ -0,0 +1,128 @@
1
+ import { isCreateTargetAlreadyExistsError } from "../../core.api";
2
+ import { postLogListCreate } from "../../list/list.api";
3
+ import { CategoryList } from "../../list/list.interface";
4
+ import type { LogEntry } from "./log-manager";
5
+ import { LOG_PERSIST_LOADER_KEY } from "./log-persist.config";
6
+ import type { BuildLogListDraftInput, LogListDraft } from "./log-persist.interface";
7
+ import { persistLogger } from "./log-persist-logger";
8
+
9
+ export function estimateEntriesBytes(entries: LogEntry[]): number {
10
+ if (entries.length === 0) {
11
+ return 0;
12
+ }
13
+ try {
14
+ return Buffer.byteLength(JSON.stringify(entries), "utf8");
15
+ } catch {
16
+ return entries.length * 512;
17
+ }
18
+ }
19
+
20
+ export function buildLogListDraft(input: BuildLogListDraftInput): LogListDraft {
21
+ const { service, process, lane, idempotencyKey, entries } = input;
22
+ const first = entries[0];
23
+ const last = entries[entries.length - 1];
24
+
25
+ return {
26
+ name: `log-batch:${service}:${process}:${lane}`,
27
+ value: idempotencyKey,
28
+ category: CategoryList.LIST,
29
+ tagList: ["log", lane, service],
30
+ details: {
31
+ manifestVersion: 0,
32
+ loaderKey: LOG_PERSIST_LOADER_KEY,
33
+ meta: JSON.stringify({
34
+ service,
35
+ process,
36
+ pid: globalThis.process.pid,
37
+ lane,
38
+ count: entries.length,
39
+ from: first?.timestamp ?? null,
40
+ to: last?.timestamp ?? null,
41
+ flushedAt: Date.now(),
42
+ idempotencyKey,
43
+ }),
44
+ preview: first?.message ?? "",
45
+ items: entries,
46
+ },
47
+ };
48
+ }
49
+
50
+ async function withTimeout<T>(promise: Promise<T>, timeoutMs: number, label: string): Promise<T> {
51
+ let timer: ReturnType<typeof setTimeout> | null = null;
52
+ try {
53
+ return await Promise.race([
54
+ promise,
55
+ new Promise<T>((_resolve, reject) => {
56
+ timer = setTimeout(() => {
57
+ reject(new Error(`${label} timed out after ${timeoutMs}ms`));
58
+ }, timeoutMs);
59
+ }),
60
+ ]);
61
+ } finally {
62
+ if (timer != null) {
63
+ clearTimeout(timer);
64
+ }
65
+ }
66
+ }
67
+
68
+ export async function postLogBatch(draft: LogListDraft, postTimeoutMs: number): Promise<void> {
69
+ try {
70
+ const result = await withTimeout(
71
+ postLogListCreate({
72
+ name: draft.name,
73
+ value: draft.value,
74
+ category: draft.category,
75
+ details: draft.details,
76
+ }),
77
+ postTimeoutMs,
78
+ "postLogListCreate",
79
+ );
80
+
81
+ if (!result.success) {
82
+ const message = result.error?.message ?? "postLogListCreate failed";
83
+ persistLogger.error("post log batch failed", {
84
+ idempotencyKey: draft.value,
85
+ name: draft.name,
86
+ error: message,
87
+ });
88
+ throw new Error(message);
89
+ }
90
+ } catch (error) {
91
+ if (isCreateTargetAlreadyExistsError(error)) {
92
+ persistLogger.error("post log batch idempotent duplicate — treating as success", {
93
+ idempotencyKey: draft.value,
94
+ name: draft.name,
95
+ });
96
+ return;
97
+ }
98
+ throw error;
99
+ }
100
+ }
101
+
102
+ /** Take a prefix of entries that fits within maxBytes. */
103
+ export function takeEntriesWithinBytes(entries: LogEntry[], maxBytes: number): LogEntry[] {
104
+ if (entries.length === 0) {
105
+ return [];
106
+ }
107
+
108
+ const taken: LogEntry[] = [];
109
+ for (const entry of entries) {
110
+ const candidate = [...taken, entry];
111
+ if (taken.length > 0 && estimateEntriesBytes(candidate) > maxBytes) {
112
+ break;
113
+ }
114
+ taken.push(entry);
115
+ }
116
+
117
+ const result = taken.length > 0 ? taken : [entries[0]];
118
+ if (result.length < entries.length) {
119
+ persistLogger.warn("trimmed batch to maxBytes", {
120
+ requested: entries.length,
121
+ taken: result.length,
122
+ maxBytes,
123
+ takenBytes: estimateEntriesBytes(result),
124
+ });
125
+ }
126
+
127
+ return result;
128
+ }
@@ -0,0 +1,13 @@
1
+ import type { LogEntry } from "./log-manager";
2
+
3
+ type LogPersistOfferFn = (entry: LogEntry) => void;
4
+
5
+ let offerFn: LogPersistOfferFn | null = null;
6
+
7
+ export function registerLogPersistOffer(fn: LogPersistOfferFn | null): void {
8
+ offerFn = fn;
9
+ }
10
+
11
+ export function offerToLogPersist(entry: LogEntry): void {
12
+ offerFn?.(entry);
13
+ }
@@ -0,0 +1,33 @@
1
+ import { createLogger } from "./create-logger";
2
+
3
+ /** User-facing / lifecycle logs — may be persisted like normal app logs. */
4
+ export const LOG_PERSIST_TOPIC = "log-persist";
5
+
6
+ /** Operational logs from the persist pipeline — never re-offered to avoid feedback loops. */
7
+ export const LOG_PERSIST_INTERNAL_TOPIC = "log-persist-internal";
8
+
9
+ const logger = createLogger({ module: "log-persist" });
10
+
11
+ export function isLogPersistInternalTopic(topic: string | undefined): boolean {
12
+ return topic === LOG_PERSIST_INTERNAL_TOPIC;
13
+ }
14
+
15
+ type PersistLogData = Record<string, unknown>;
16
+
17
+ function write(level: "debug" | "info" | "warn" | "error", message: string, data?: PersistLogData): void {
18
+ logger[level](message, {
19
+ topic: LOG_PERSIST_INTERNAL_TOPIC,
20
+ ...(data != null ? { data } : {}),
21
+ });
22
+ }
23
+
24
+ export const persistLogger = {
25
+ debug: (message: string, data?: PersistLogData) => write("debug", message, data),
26
+ info: (message: string, data?: PersistLogData) => write("info", message, data),
27
+ warn: (message: string, data?: PersistLogData) => write("warn", message, data),
28
+ error: (message: string, data?: PersistLogData) => write("error", message, data),
29
+ };
30
+
31
+ export function patchPersistLoggerScope(labels: Record<string, string>): void {
32
+ logger.resetScope({ labels });
33
+ }
@@ -0,0 +1,252 @@
1
+ import { mkdir, readdir, readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createJsonFileStateStore } from "../../node/fs/json-state-store";
4
+ import type { LogPersistProcessRecord, LogPersistRegistryState } from "./log-persist.interface";
5
+ import { persistLogger } from "./log-persist-logger";
6
+
7
+ const DEFAULT_REGISTRY: LogPersistRegistryState = {
8
+ updatedAt: new Date(0).toISOString(),
9
+ service: "",
10
+ processes: {},
11
+ };
12
+
13
+ /** Per-process shard — each process owns one file; no cross-process RMW. */
14
+ interface LogPersistProcessShard extends LogPersistProcessRecord {
15
+ service: string;
16
+ updatedAt: string;
17
+ }
18
+
19
+ const DEFAULT_SHARD: LogPersistProcessShard = {
20
+ service: "",
21
+ updatedAt: new Date(0).toISOString(),
22
+ pid: 0,
23
+ enabledAt: new Date(0).toISOString(),
24
+ lastHeartbeatAt: new Date(0).toISOString(),
25
+ };
26
+
27
+ const legacyStores = new Map<
28
+ string,
29
+ ReturnType<typeof createJsonFileStateStore<LogPersistRegistryState, "processes">>
30
+ >();
31
+
32
+ const shardStores = new Map<string, ReturnType<typeof createJsonFileStateStore<LogPersistProcessShard>>>();
33
+
34
+ function isLegacyRegistryFile(registryPath: string): boolean {
35
+ return registryPath.endsWith(".json");
36
+ }
37
+
38
+ function legacyStoreFor(filePath: string) {
39
+ let store = legacyStores.get(filePath);
40
+ if (store == null) {
41
+ store = createJsonFileStateStore<LogPersistRegistryState, "processes">({
42
+ filePath,
43
+ defaultState: DEFAULT_REGISTRY,
44
+ nestedKeys: ["processes"],
45
+ updatedAtKey: "updatedAt",
46
+ });
47
+ legacyStores.set(filePath, store);
48
+ }
49
+ return store;
50
+ }
51
+
52
+ function shardStoreFor(shardFilePath: string) {
53
+ let store = shardStores.get(shardFilePath);
54
+ if (store == null) {
55
+ store = createJsonFileStateStore<LogPersistProcessShard>({
56
+ filePath: shardFilePath,
57
+ defaultState: DEFAULT_SHARD,
58
+ updatedAtKey: "updatedAt",
59
+ });
60
+ shardStores.set(shardFilePath, store);
61
+ }
62
+ return store;
63
+ }
64
+
65
+ function shardFilePath(registryDir: string, process: string): string {
66
+ return join(registryDir, `${process}.json`);
67
+ }
68
+
69
+ /** Registry root directory — one shard file per process under this path. */
70
+ export function defaultLogPersistRegistryPath(registryDir: string): string {
71
+ return join(registryDir, "log-persist-registry");
72
+ }
73
+
74
+ async function readShardedLogPersistRegistry(registryDir: string): Promise<LogPersistRegistryState> {
75
+ await mkdir(registryDir, { recursive: true });
76
+
77
+ let entries: string[];
78
+ try {
79
+ entries = await readdir(registryDir);
80
+ } catch {
81
+ return { ...DEFAULT_REGISTRY };
82
+ }
83
+
84
+ const processes: Record<string, LogPersistProcessRecord> = {};
85
+ let service = "";
86
+ let updatedAt = new Date(0).toISOString();
87
+
88
+ for (const name of entries) {
89
+ if (!name.endsWith(".json")) {
90
+ continue;
91
+ }
92
+
93
+ const processName = name.slice(0, -".json".length);
94
+ if (processName === "" || processName.startsWith("_")) {
95
+ continue;
96
+ }
97
+
98
+ try {
99
+ const raw = await readFile(join(registryDir, name), "utf8");
100
+ const shard = JSON.parse(raw) as Partial<LogPersistProcessShard>;
101
+ if (shard.service != null && shard.service !== "") {
102
+ service = shard.service;
103
+ }
104
+ if (shard.updatedAt != null && shard.updatedAt > updatedAt) {
105
+ updatedAt = shard.updatedAt;
106
+ }
107
+ processes[processName] = {
108
+ pid: shard.pid ?? 0,
109
+ enabledAt: shard.enabledAt ?? new Date(0).toISOString(),
110
+ lastHeartbeatAt: shard.lastHeartbeatAt ?? new Date(0).toISOString(),
111
+ };
112
+ } catch {
113
+ persistLogger.warn("registry shard read skipped — corrupt or missing", {
114
+ registryDir,
115
+ shard: name,
116
+ });
117
+ }
118
+ }
119
+
120
+ return { updatedAt, service, processes };
121
+ }
122
+
123
+ export async function registerLogPersistProcess(input: {
124
+ registryFilePath: string;
125
+ service: string;
126
+ process: string;
127
+ }): Promise<void> {
128
+ const now = new Date().toISOString();
129
+ const record: LogPersistProcessRecord = {
130
+ pid: process.pid,
131
+ enabledAt: now,
132
+ lastHeartbeatAt: now,
133
+ };
134
+
135
+ if (isLegacyRegistryFile(input.registryFilePath)) {
136
+ await legacyStoreFor(input.registryFilePath).write({
137
+ service: input.service,
138
+ processes: {
139
+ [input.process]: record,
140
+ },
141
+ });
142
+ } else {
143
+ await shardStoreFor(shardFilePath(input.registryFilePath, input.process)).write({
144
+ service: input.service,
145
+ pid: record.pid,
146
+ enabledAt: record.enabledAt,
147
+ lastHeartbeatAt: record.lastHeartbeatAt,
148
+ });
149
+ }
150
+
151
+ persistLogger.info("registry process registered", {
152
+ registryFilePath: input.registryFilePath,
153
+ service: input.service,
154
+ process: input.process,
155
+ pid: record.pid,
156
+ });
157
+ }
158
+
159
+ export async function heartbeatLogPersistProcess(input: { registryFilePath: string; process: string }): Promise<void> {
160
+ if (isLegacyRegistryFile(input.registryFilePath)) {
161
+ const current = await legacyStoreFor(input.registryFilePath).read();
162
+ const existing = current.processes[input.process];
163
+ if (existing == null) {
164
+ persistLogger.warn("registry heartbeat skipped — process not registered", {
165
+ registryFilePath: input.registryFilePath,
166
+ process: input.process,
167
+ });
168
+ return;
169
+ }
170
+
171
+ await legacyStoreFor(input.registryFilePath).write({
172
+ processes: {
173
+ [input.process]: {
174
+ ...existing,
175
+ lastHeartbeatAt: new Date().toISOString(),
176
+ },
177
+ },
178
+ });
179
+ return;
180
+ }
181
+
182
+ const store = shardStoreFor(shardFilePath(input.registryFilePath, input.process));
183
+ const current = await store.read();
184
+ if (current.pid === 0) {
185
+ persistLogger.warn("registry heartbeat skipped — process not registered", {
186
+ registryFilePath: input.registryFilePath,
187
+ process: input.process,
188
+ });
189
+ return;
190
+ }
191
+
192
+ await store.write({
193
+ lastHeartbeatAt: new Date().toISOString(),
194
+ });
195
+ }
196
+
197
+ export async function unregisterLogPersistProcess(input: { registryFilePath: string; process: string }): Promise<void> {
198
+ if (isLegacyRegistryFile(input.registryFilePath)) {
199
+ const current = await legacyStoreFor(input.registryFilePath).read();
200
+ const existing = current.processes[input.process];
201
+ if (existing == null) {
202
+ persistLogger.warn("registry unregister skipped — process not found", {
203
+ registryFilePath: input.registryFilePath,
204
+ process: input.process,
205
+ });
206
+ return;
207
+ }
208
+
209
+ await legacyStoreFor(input.registryFilePath).write({
210
+ processes: {
211
+ [input.process]: {
212
+ ...existing,
213
+ pid: 0,
214
+ lastHeartbeatAt: new Date(0).toISOString(),
215
+ },
216
+ },
217
+ });
218
+
219
+ persistLogger.info("registry process unregistered", {
220
+ registryFilePath: input.registryFilePath,
221
+ process: input.process,
222
+ });
223
+ return;
224
+ }
225
+
226
+ const store = shardStoreFor(shardFilePath(input.registryFilePath, input.process));
227
+ const current = await store.read();
228
+ if (current.pid === 0) {
229
+ persistLogger.warn("registry unregister skipped — process not found", {
230
+ registryFilePath: input.registryFilePath,
231
+ process: input.process,
232
+ });
233
+ return;
234
+ }
235
+
236
+ await store.write({
237
+ pid: 0,
238
+ lastHeartbeatAt: new Date(0).toISOString(),
239
+ });
240
+
241
+ persistLogger.info("registry process unregistered", {
242
+ registryFilePath: input.registryFilePath,
243
+ process: input.process,
244
+ });
245
+ }
246
+
247
+ export async function readLogPersistRegistry(registryFilePath: string): Promise<LogPersistRegistryState> {
248
+ if (isLegacyRegistryFile(registryFilePath)) {
249
+ return legacyStoreFor(registryFilePath).read();
250
+ }
251
+ return readShardedLogPersistRegistry(registryFilePath);
252
+ }
@@ -0,0 +1,97 @@
1
+ import { envBool, envInt, envMs } from "../../node/env/env-parsers";
2
+ import type { LogPersistConfig } from "./log-persist.interface";
3
+
4
+ export const LOG_PERSIST_LOADER_KEY = "LogBatch.0";
5
+
6
+ export const DEFAULT_LOG_PERSIST_CONFIG: LogPersistConfig = {
7
+ fast: {
8
+ maxBufferEntries: 500,
9
+ },
10
+ medium: {
11
+ debounceMs: 5_000,
12
+ maxEntries: 20,
13
+ maxBytes: 512 * 1024,
14
+ maxBufferEntries: 1_000,
15
+ },
16
+ slow: {
17
+ maxEntries: 400,
18
+ maxBytes: 512 * 1024,
19
+ maxAgeMs: 120_000,
20
+ maxBufferEntries: 2_000,
21
+ },
22
+ postTimeoutMs: 30_000,
23
+ shutdownDrainTimeoutMs: 15_000,
24
+ };
25
+
26
+ export function resolveLogPersistConfig(partial?: Partial<LogPersistConfig>): LogPersistConfig {
27
+ const defaults = DEFAULT_LOG_PERSIST_CONFIG;
28
+ return {
29
+ fast: { ...defaults.fast, ...partial?.fast },
30
+ medium: { ...defaults.medium, ...partial?.medium },
31
+ slow: { ...defaults.slow, ...partial?.slow },
32
+ postTimeoutMs: partial?.postTimeoutMs ?? defaults.postTimeoutMs,
33
+ shutdownDrainTimeoutMs: partial?.shutdownDrainTimeoutMs ?? defaults.shutdownDrainTimeoutMs,
34
+ };
35
+ }
36
+
37
+ export function logPersistEnabledFromEnv(env: NodeJS.ProcessEnv = process.env): boolean {
38
+ return envBool("LOG_PERSIST_ENABLED", false, env);
39
+ }
40
+
41
+ export function logPersistServiceFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {
42
+ const raw = env.LOG_PERSIST_SERVICE?.trim();
43
+ return raw != null && raw !== "" ? raw : undefined;
44
+ }
45
+
46
+ export function logPersistProcessFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {
47
+ const raw = env.LOG_PERSIST_PROCESS?.trim();
48
+ return raw != null && raw !== "" ? raw : undefined;
49
+ }
50
+
51
+ export function logPersistRegistryDirFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {
52
+ const configured = env.LOG_PERSIST_REGISTRY_DIR?.trim();
53
+ if (configured != null && configured !== "") {
54
+ return configured;
55
+ }
56
+ const runtime = env.RUNTIME_DATA_DIR?.trim();
57
+ return runtime != null && runtime !== "" ? runtime : undefined;
58
+ }
59
+
60
+ export function logPersistConfigFromEnv(env: NodeJS.ProcessEnv = process.env): LogPersistConfig {
61
+ return resolveLogPersistConfig({
62
+ fast: {
63
+ maxBufferEntries: envInt("LOG_FAST_MAX_BUFFER_ENTRIES", DEFAULT_LOG_PERSIST_CONFIG.fast.maxBufferEntries, {
64
+ env,
65
+ min: 1,
66
+ }),
67
+ },
68
+ medium: {
69
+ debounceMs: envMs("LOG_MEDIUM_DEBOUNCE_MS", DEFAULT_LOG_PERSIST_CONFIG.medium.debounceMs, { env }),
70
+ maxEntries: envInt("LOG_MEDIUM_MAX_ENTRIES", DEFAULT_LOG_PERSIST_CONFIG.medium.maxEntries, {
71
+ env,
72
+ min: 1,
73
+ }),
74
+ maxBytes: envInt("LOG_MEDIUM_MAX_BYTES", DEFAULT_LOG_PERSIST_CONFIG.medium.maxBytes, { env, min: 1 }),
75
+ maxBufferEntries: envInt(
76
+ "LOG_MEDIUM_MAX_BUFFER_ENTRIES",
77
+ DEFAULT_LOG_PERSIST_CONFIG.medium.maxBufferEntries,
78
+ { env, min: 1 },
79
+ ),
80
+ },
81
+ slow: {
82
+ maxEntries: envInt("LOG_SLOW_MAX_ENTRIES", DEFAULT_LOG_PERSIST_CONFIG.slow.maxEntries, { env, min: 1 }),
83
+ maxBytes: envInt("LOG_SLOW_MAX_BYTES", DEFAULT_LOG_PERSIST_CONFIG.slow.maxBytes, { env, min: 1 }),
84
+ maxAgeMs: envMs("LOG_SLOW_MAX_AGE_MS", DEFAULT_LOG_PERSIST_CONFIG.slow.maxAgeMs, { env }),
85
+ maxBufferEntries: envInt("LOG_SLOW_MAX_BUFFER_ENTRIES", DEFAULT_LOG_PERSIST_CONFIG.slow.maxBufferEntries, {
86
+ env,
87
+ min: 1,
88
+ }),
89
+ },
90
+ postTimeoutMs: envMs("LOG_PERSIST_POST_TIMEOUT_MS", DEFAULT_LOG_PERSIST_CONFIG.postTimeoutMs, { env }),
91
+ shutdownDrainTimeoutMs: envMs(
92
+ "LOG_PERSIST_SHUTDOWN_DRAIN_MS",
93
+ DEFAULT_LOG_PERSIST_CONFIG.shutdownDrainTimeoutMs,
94
+ { env },
95
+ ),
96
+ });
97
+ }
@@ -0,0 +1,132 @@
1
+ import type { TargetDraft } from "../../core.interface";
2
+ import type { List } from "../../list/list.interface";
3
+ import type { LogEntry } from "./log-manager";
4
+
5
+ /** Persistence lane — maps to List tagList and flush policy. */
6
+ export type LogPersistLane = "fast" | "medium" | "slow";
7
+
8
+ export interface LogPersistFastConfig {
9
+ maxBufferEntries: number;
10
+ }
11
+
12
+ export interface LogPersistMediumConfig {
13
+ debounceMs: number;
14
+ maxEntries: number;
15
+ maxBytes: number;
16
+ maxBufferEntries: number;
17
+ }
18
+
19
+ export interface LogPersistSlowConfig {
20
+ maxEntries: number;
21
+ maxBytes: number;
22
+ maxAgeMs: number;
23
+ maxBufferEntries: number;
24
+ }
25
+
26
+ export interface LogPersistConfig {
27
+ fast: LogPersistFastConfig;
28
+ medium: LogPersistMediumConfig;
29
+ slow: LogPersistSlowConfig;
30
+ /** postListCreate / network ceiling per batch */
31
+ postTimeoutMs: number;
32
+ /** Graceful shutdown drain ceiling */
33
+ shutdownDrainTimeoutMs: number;
34
+ }
35
+
36
+ export interface EnableLogPersistOptions {
37
+ service: string;
38
+ process: string;
39
+ /** Shared registry root directory — all processes use the same path; each writes its own shard file. */
40
+ registryFilePath?: string;
41
+ config?: Partial<LogPersistConfig>;
42
+ }
43
+
44
+ export interface EnsureLogPersistFromEnvOptions {
45
+ /** Overrides LOG_PERSIST_PROCESS when set. */
46
+ process?: string;
47
+ /** Overrides LOG_PERSIST_SERVICE when set. */
48
+ service?: string;
49
+ registryFilePath?: string;
50
+ config?: Partial<LogPersistConfig>;
51
+ }
52
+
53
+ export interface LogPersistProcessRecord {
54
+ pid: number;
55
+ enabledAt: string;
56
+ lastHeartbeatAt: string;
57
+ }
58
+
59
+ export interface LogPersistRegistryState {
60
+ updatedAt: string;
61
+ service: string;
62
+ processes: Record<string, LogPersistProcessRecord>;
63
+ }
64
+
65
+ export interface LogPersistQueueStats {
66
+ fast: number;
67
+ fastRetry: number;
68
+ medium: number;
69
+ slow: number;
70
+ }
71
+
72
+ export interface LogPersistQueueBytesStats {
73
+ fast: number;
74
+ fastRetry: number;
75
+ medium: number;
76
+ slow: number;
77
+ }
78
+
79
+ export interface LogPersistStats {
80
+ enabled: boolean;
81
+ draining: boolean;
82
+ service: string | null;
83
+ process: string | null;
84
+ queues: LogPersistQueueStats;
85
+ queueBytes: LogPersistQueueBytesStats;
86
+ mediumDebouncePending: boolean;
87
+ laneFlushing: Record<LogPersistLane, boolean>;
88
+ consecutiveFailures: Record<LogPersistLane, number>;
89
+ config: LogPersistConfig;
90
+ lastFlushAt: Record<LogPersistLane, string | null>;
91
+ lastError: string | null;
92
+ lastErrorAt: string | null;
93
+ }
94
+
95
+ export interface WaitForLogPersistReadyOptions {
96
+ registryFilePath: string;
97
+ service: string;
98
+ expectedProcesses: string[];
99
+ timeoutMs?: number;
100
+ pollIntervalMs?: number;
101
+ /** Process heartbeat older than this is treated as missing. */
102
+ staleMs?: number;
103
+ }
104
+
105
+ export interface LogPersistReadySnapshot {
106
+ ok: boolean;
107
+ missing: string[];
108
+ stale: string[];
109
+ registered: string[];
110
+ }
111
+
112
+ export interface LogBatchMeta {
113
+ service: string;
114
+ process: string;
115
+ pid: number;
116
+ lane: LogPersistLane;
117
+ count: number;
118
+ from: number | null;
119
+ to: number | null;
120
+ flushedAt: number;
121
+ idempotencyKey: string;
122
+ }
123
+
124
+ export interface BuildLogListDraftInput {
125
+ service: string;
126
+ process: string;
127
+ lane: LogPersistLane;
128
+ idempotencyKey: string;
129
+ entries: LogEntry[];
130
+ }
131
+
132
+ export type LogListDraft = TargetDraft<List>;