target-supabase-sdk 0.1.9 → 0.2.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 (464) hide show
  1. package/README.md +184 -1
  2. package/dist/browser.d.ts +60 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +6 -0
  5. package/dist/browser.js.map +1 -0
  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-C_bSw6Kx.js +1362 -0
  9. package/dist/chunks/enable-log-persist-C_bSw6Kx.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/index.d.ts +2 -48
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/link/link.api.d.ts +1 -1
  27. package/dist/link/link.api.d.ts.map +1 -1
  28. package/dist/link/link.interface.d.ts +3 -3
  29. package/dist/link/link.interface.d.ts.map +1 -1
  30. package/dist/list/list.api.d.ts +3 -1
  31. package/dist/list/list.api.d.ts.map +1 -1
  32. package/dist/list/list.interface.d.ts +2 -2
  33. package/dist/list/list.interface.d.ts.map +1 -1
  34. package/dist/node/env/env-parsers.d.ts +19 -0
  35. package/dist/node/env/env-parsers.d.ts.map +1 -0
  36. package/dist/node/env/index.d.ts +11 -0
  37. package/dist/node/env/index.d.ts.map +1 -0
  38. package/dist/node/env/init-supabase-from-env.d.ts +17 -0
  39. package/dist/node/env/init-supabase-from-env.d.ts.map +1 -0
  40. package/dist/node/env/load-env.d.ts +20 -0
  41. package/dist/node/env/load-env.d.ts.map +1 -0
  42. package/dist/node/env/project-root.d.ts +11 -0
  43. package/dist/node/env/project-root.d.ts.map +1 -0
  44. package/dist/node/env/public-base-url.d.ts +10 -0
  45. package/dist/node/env/public-base-url.d.ts.map +1 -0
  46. package/dist/node/env/require-env.d.ts +3 -0
  47. package/dist/node/env/require-env.d.ts.map +1 -0
  48. package/dist/node/fs/json-state-store.d.ts +19 -0
  49. package/dist/node/fs/json-state-store.d.ts.map +1 -0
  50. package/dist/node/fs/read-source-file.d.ts +19 -0
  51. package/dist/node/fs/read-source-file.d.ts.map +1 -0
  52. package/dist/node/node-liveness.d.ts +30 -0
  53. package/dist/node/node-liveness.d.ts.map +1 -0
  54. package/dist/node/node-runtime.base.d.ts +60 -0
  55. package/dist/node/node-runtime.base.d.ts.map +1 -0
  56. package/dist/node/node.api.d.ts +4 -4
  57. package/dist/node/node.api.d.ts.map +1 -1
  58. package/dist/node/node.interface.d.ts +1 -6
  59. package/dist/node/node.interface.d.ts.map +1 -1
  60. package/dist/node/preload/run-service-preload.d.ts +14 -0
  61. package/dist/node/preload/run-service-preload.d.ts.map +1 -0
  62. package/dist/node/preload/service-preload.interface.d.ts +15 -0
  63. package/dist/node/preload/service-preload.interface.d.ts.map +1 -0
  64. package/dist/node/process/index.d.ts +5 -0
  65. package/dist/node/process/index.d.ts.map +1 -0
  66. package/dist/node/process/managed-child-processes.d.ts +37 -0
  67. package/dist/node/process/managed-child-processes.d.ts.map +1 -0
  68. package/dist/node/process/process-spawn.d.ts +27 -0
  69. package/dist/node/process/process-spawn.d.ts.map +1 -0
  70. package/dist/node/readiness/index.d.ts +9 -0
  71. package/dist/node/readiness/index.d.ts.map +1 -0
  72. package/dist/node/readiness/poll-until.d.ts +11 -0
  73. package/dist/node/readiness/poll-until.d.ts.map +1 -0
  74. package/dist/node/readiness/readiness-checks.d.ts +22 -0
  75. package/dist/node/readiness/readiness-checks.d.ts.map +1 -0
  76. package/dist/node/readiness/readiness.types.d.ts +12 -0
  77. package/dist/node/readiness/readiness.types.d.ts.map +1 -0
  78. package/dist/node/readiness/run-readiness-checks.d.ts +4 -0
  79. package/dist/node/readiness/run-readiness-checks.d.ts.map +1 -0
  80. package/dist/node/readiness/service-ready-gate.d.ts +26 -0
  81. package/dist/node/readiness/service-ready-gate.d.ts.map +1 -0
  82. package/dist/node.d.ts +36 -0
  83. package/dist/node.d.ts.map +1 -0
  84. package/dist/node.js +2483 -0
  85. package/dist/node.js.map +1 -0
  86. package/dist/parcel/chunk-fetch-registry.d.ts +14 -0
  87. package/dist/parcel/chunk-fetch-registry.d.ts.map +1 -0
  88. package/dist/parcel/chunk-url.utils.d.ts +9 -0
  89. package/dist/parcel/chunk-url.utils.d.ts.map +1 -0
  90. package/dist/parcel/parcel-manager.d.ts +44 -20
  91. package/dist/parcel/parcel-manager.d.ts.map +1 -1
  92. package/dist/parcel/parcel.api.d.ts +306 -0
  93. package/dist/parcel/parcel.api.d.ts.map +1 -0
  94. package/dist/parcel/parcel.interface.d.ts +26 -5
  95. package/dist/parcel/parcel.interface.d.ts.map +1 -1
  96. package/dist/parcel/parcel.service.d.ts +38 -0
  97. package/dist/parcel/parcel.service.d.ts.map +1 -0
  98. package/dist/parcel/storage-provider-registry.d.ts +17 -0
  99. package/dist/parcel/storage-provider-registry.d.ts.map +1 -0
  100. package/dist/parcel/storage-provider.types.d.ts +31 -0
  101. package/dist/parcel/storage-provider.types.d.ts.map +1 -0
  102. package/dist/preload.d.ts +7 -0
  103. package/dist/preload.d.ts.map +1 -0
  104. package/dist/preload.js +47 -0
  105. package/dist/preload.js.map +1 -0
  106. package/dist/repo/repo-context.utils.d.ts.map +1 -1
  107. package/dist/repo/repo-manager.d.ts +14 -3
  108. package/dist/repo/repo-manager.d.ts.map +1 -1
  109. package/dist/repo/repo.api.d.ts +1 -1
  110. package/dist/repo/repo.api.d.ts.map +1 -1
  111. package/dist/repo/repo.interface.d.ts +1 -1
  112. package/dist/repo/repo.interface.d.ts.map +1 -1
  113. package/dist/repo/repo.script-loader.d.ts +5 -5
  114. package/dist/repo/repo.script-loader.d.ts.map +1 -1
  115. package/dist/service/base.interface.d.ts +54 -57
  116. package/dist/service/base.interface.d.ts.map +1 -1
  117. package/dist/service/index.d.ts +21 -0
  118. package/dist/service/index.d.ts.map +1 -0
  119. package/dist/service/service.api.d.ts +503 -0
  120. package/dist/service/service.api.d.ts.map +1 -0
  121. package/dist/service/service.interface.d.ts +36 -9
  122. package/dist/service/service.interface.d.ts.map +1 -1
  123. package/dist/shared/http/fetch-retry.d.ts +21 -0
  124. package/dist/shared/http/fetch-retry.d.ts.map +1 -0
  125. package/dist/shared/log/create-logger.d.ts +27 -0
  126. package/dist/shared/log/create-logger.d.ts.map +1 -0
  127. package/dist/shared/log/enable-log-persist.d.ts +28 -0
  128. package/dist/shared/log/enable-log-persist.d.ts.map +1 -0
  129. package/dist/shared/log/index.d.ts +10 -0
  130. package/dist/shared/log/index.d.ts.map +1 -0
  131. package/dist/shared/log/log-manager.d.ts +37 -60
  132. package/dist/shared/log/log-manager.d.ts.map +1 -1
  133. package/dist/shared/log/log-persist-batch-id.d.ts +13 -0
  134. package/dist/shared/log/log-persist-batch-id.d.ts.map +1 -0
  135. package/dist/shared/log/log-persist-flush.d.ts +8 -0
  136. package/dist/shared/log/log-persist-flush.d.ts.map +1 -0
  137. package/dist/shared/log/log-persist-hook.d.ts +6 -0
  138. package/dist/shared/log/log-persist-hook.d.ts.map +1 -0
  139. package/dist/shared/log/log-persist-logger.d.ts +15 -0
  140. package/dist/shared/log/log-persist-logger.d.ts.map +1 -0
  141. package/dist/shared/log/log-persist-registry.d.ts +17 -0
  142. package/dist/shared/log/log-persist-registry.d.ts.map +1 -0
  143. package/dist/shared/log/log-persist.config.d.ts +10 -0
  144. package/dist/shared/log/log-persist.config.d.ts.map +1 -0
  145. package/dist/shared/log/log-persist.d.ts +55 -0
  146. package/dist/shared/log/log-persist.d.ts.map +1 -0
  147. package/dist/shared/log/log-persist.interface.d.ts +116 -0
  148. package/dist/shared/log/log-persist.interface.d.ts.map +1 -0
  149. package/dist/shared/log/log-scope.d.ts +56 -0
  150. package/dist/shared/log/log-scope.d.ts.map +1 -0
  151. package/dist/shared/utils/fetch-url.d.ts +3 -0
  152. package/dist/shared/utils/fetch-url.d.ts.map +1 -0
  153. package/dist/shared/utils/network-error.d.ts +14 -0
  154. package/dist/shared/utils/network-error.d.ts.map +1 -0
  155. package/dist/shared/utils/safe-file-name.d.ts +14 -0
  156. package/dist/shared/utils/safe-file-name.d.ts.map +1 -0
  157. package/dist/shared/utils/sha256.d.ts +3 -0
  158. package/dist/shared/utils/sha256.d.ts.map +1 -0
  159. package/dist/supabase.d.ts +7 -2
  160. package/dist/supabase.d.ts.map +1 -1
  161. package/dist/task/index.d.ts +16 -0
  162. package/dist/task/index.d.ts.map +1 -0
  163. package/dist/task/local-task-registry.d.ts +11 -1
  164. package/dist/task/local-task-registry.d.ts.map +1 -1
  165. package/dist/task/task-manager.d.ts +21 -11
  166. package/dist/task/task-manager.d.ts.map +1 -1
  167. package/dist/task/task-node.d.ts +19 -0
  168. package/dist/task/task-node.d.ts.map +1 -0
  169. package/dist/task/task-post-validated.api.d.ts +19 -0
  170. package/dist/task/task-post-validated.api.d.ts.map +1 -0
  171. package/dist/task/task-post.api.d.ts +54 -0
  172. package/dist/task/task-post.api.d.ts.map +1 -0
  173. package/dist/task/task-queue.d.ts +7 -0
  174. package/dist/task/task-queue.d.ts.map +1 -0
  175. package/dist/task/task-repo-context.d.ts +2 -0
  176. package/dist/task/task-repo-context.d.ts.map +1 -1
  177. package/dist/task/task-repo-validation.d.ts +46 -0
  178. package/dist/task/task-repo-validation.d.ts.map +1 -0
  179. package/dist/task/task.api.d.ts +5 -47
  180. package/dist/task/task.api.d.ts.map +1 -1
  181. package/dist/task/task.constant.d.ts +4 -0
  182. package/dist/task/task.constant.d.ts.map +1 -0
  183. package/dist/task/task.interface.d.ts +3 -1
  184. package/dist/task/task.interface.d.ts.map +1 -1
  185. package/dist/trigger/trigger-manager.d.ts +25 -0
  186. package/dist/trigger/trigger-manager.d.ts.map +1 -0
  187. package/dist/trigger/trigger-node.d.ts +23 -0
  188. package/dist/trigger/trigger-node.d.ts.map +1 -0
  189. package/dist/trigger/trigger.api.d.ts +140 -0
  190. package/dist/trigger/trigger.api.d.ts.map +1 -0
  191. package/dist/trigger/trigger.constant.d.ts +8 -0
  192. package/dist/trigger/trigger.constant.d.ts.map +1 -0
  193. package/dist/trigger/trigger.interface.d.ts +87 -0
  194. package/dist/trigger/trigger.interface.d.ts.map +1 -0
  195. package/dist/trigger/trigger.utils.d.ts +6 -0
  196. package/dist/trigger/trigger.utils.d.ts.map +1 -0
  197. package/dist/word/word.api.d.ts +1 -1
  198. package/dist/word/word.api.d.ts.map +1 -1
  199. package/dist/word/word.interface.d.ts +2 -2
  200. package/dist/word/word.interface.d.ts.map +1 -1
  201. package/package.json +91 -61
  202. package/src/browser.ts +165 -0
  203. package/src/command/command.api.ts +20 -18
  204. package/src/command/command.interface.ts +2 -3
  205. package/src/core.api.ts +466 -477
  206. package/src/core.interface.ts +63 -62
  207. package/src/core.utils.ts +64 -64
  208. package/src/idea/idea.interface.ts +3 -3
  209. package/src/index.ts +2 -79
  210. package/src/link/link.api.ts +28 -30
  211. package/src/link/link.interface.ts +4 -5
  212. package/src/list/list.api.ts +50 -29
  213. package/src/list/list.interface.ts +3 -4
  214. package/src/node/env/env-parsers.ts +77 -0
  215. package/src/node/env/index.ts +10 -0
  216. package/src/node/env/init-supabase-from-env.ts +38 -0
  217. package/src/node/env/load-env.ts +67 -0
  218. package/src/node/env/project-root.ts +34 -0
  219. package/src/node/env/public-base-url.ts +18 -0
  220. package/src/node/env/require-env.ts +15 -0
  221. package/src/node/fs/json-state-store.ts +97 -0
  222. package/src/node/fs/read-source-file.ts +75 -0
  223. package/src/node/node-liveness.ts +80 -0
  224. package/src/node/node-runtime.base.ts +481 -0
  225. package/src/node/node.api.ts +12 -11
  226. package/src/node/node.interface.ts +1 -8
  227. package/src/node/node.utils.ts +1 -1
  228. package/src/node/preload/run-service-preload.ts +48 -0
  229. package/src/node/preload/service-preload.interface.ts +14 -0
  230. package/src/node/process/index.ts +8 -0
  231. package/src/node/process/managed-child-processes.ts +121 -0
  232. package/src/node/process/process-spawn.ts +61 -0
  233. package/src/node/readiness/index.ts +20 -0
  234. package/src/node/readiness/poll-until.ts +27 -0
  235. package/src/node/readiness/readiness-checks.ts +79 -0
  236. package/src/node/readiness/readiness.types.ts +13 -0
  237. package/src/node/readiness/run-readiness-checks.ts +20 -0
  238. package/src/node/readiness/service-ready-gate.ts +65 -0
  239. package/src/node.ts +153 -0
  240. package/src/parcel/chunk-fetch-registry.ts +96 -0
  241. package/src/parcel/chunk-url.utils.ts +30 -0
  242. package/src/parcel/parcel-manager.ts +431 -173
  243. package/src/parcel/parcel.api.ts +103 -0
  244. package/src/parcel/parcel.interface.ts +44 -23
  245. package/src/parcel/parcel.service.ts +79 -0
  246. package/src/parcel/storage-provider-registry.ts +49 -0
  247. package/src/parcel/storage-provider.types.ts +45 -0
  248. package/src/preload.ts +7 -0
  249. package/src/repo/repo-context.utils.ts +3 -4
  250. package/src/repo/repo-manager.ts +54 -39
  251. package/src/repo/repo.api.ts +5 -5
  252. package/src/repo/repo.interface.ts +1 -2
  253. package/src/repo/repo.script-loader.ts +16 -20
  254. package/src/service/base.interface.ts +81 -90
  255. package/src/service/index.ts +173 -0
  256. package/src/service/service.api.ts +294 -0
  257. package/src/service/service.interface.ts +49 -17
  258. package/src/shared/http/fetch-retry.ts +145 -0
  259. package/src/shared/log/create-logger.ts +51 -0
  260. package/src/shared/log/enable-log-persist.ts +225 -0
  261. package/src/shared/log/index.ts +31 -0
  262. package/src/shared/log/log-manager.ts +112 -121
  263. package/src/shared/log/log-persist-batch-id.ts +43 -0
  264. package/src/shared/log/log-persist-flush.ts +128 -0
  265. package/src/shared/log/log-persist-hook.ts +13 -0
  266. package/src/shared/log/log-persist-logger.ts +33 -0
  267. package/src/shared/log/log-persist-registry.ts +109 -0
  268. package/src/shared/log/log-persist.config.ts +97 -0
  269. package/src/shared/log/log-persist.interface.ts +132 -0
  270. package/src/shared/log/log-persist.ts +704 -0
  271. package/src/shared/log/log-scope.ts +123 -0
  272. package/src/shared/utils/config-path.utils.ts +1 -1
  273. package/src/shared/utils/fetch-url.ts +13 -0
  274. package/src/shared/utils/network-error.ts +152 -0
  275. package/src/shared/utils/safe-file-name.ts +37 -0
  276. package/src/shared/utils/sha256.ts +15 -0
  277. package/src/supabase.ts +125 -119
  278. package/src/task/index.ts +45 -0
  279. package/src/task/local-task-registry.ts +115 -36
  280. package/src/task/task-manager.ts +101 -113
  281. package/src/task/task-node.ts +302 -0
  282. package/src/task/task-post-validated.api.ts +47 -0
  283. package/src/task/task-post.api.ts +99 -0
  284. package/src/task/task-queue.ts +18 -0
  285. package/src/task/task-repo-context.ts +4 -1
  286. package/src/task/task-repo-validation.ts +169 -0
  287. package/src/task/task.api.ts +68 -92
  288. package/src/task/task.constant.ts +4 -0
  289. package/src/task/task.interface.ts +6 -7
  290. package/src/trigger/trigger-manager.ts +287 -0
  291. package/src/trigger/trigger-node.ts +80 -0
  292. package/src/trigger/trigger.api.ts +166 -0
  293. package/src/trigger/trigger.constant.ts +10 -0
  294. package/src/trigger/trigger.interface.ts +100 -0
  295. package/src/trigger/trigger.utils.ts +56 -0
  296. package/src/word/word.api.ts +28 -30
  297. package/src/word/word.interface.ts +3 -4
  298. package/dist/auth/auth.api.d.ts +0 -28
  299. package/dist/auth/auth.api.d.ts.map +0 -1
  300. package/dist/auth/auth.api.js +0 -51
  301. package/dist/auth/auth.api.js.map +0 -1
  302. package/dist/command/command.api.js +0 -58
  303. package/dist/command/command.api.js.map +0 -1
  304. package/dist/command/command.interface.js +0 -9
  305. package/dist/command/command.interface.js.map +0 -1
  306. package/dist/core.api.js +0 -412
  307. package/dist/core.api.js.map +0 -1
  308. package/dist/core.interface.js +0 -46
  309. package/dist/core.interface.js.map +0 -1
  310. package/dist/core.utils.js +0 -81
  311. package/dist/core.utils.js.map +0 -1
  312. package/dist/feed/feed.interface.d.ts +0 -27
  313. package/dist/feed/feed.interface.d.ts.map +0 -1
  314. package/dist/feed/feed.interface.js +0 -17
  315. package/dist/feed/feed.interface.js.map +0 -1
  316. package/dist/file/file-manager.d.ts +0 -24
  317. package/dist/file/file-manager.d.ts.map +0 -1
  318. package/dist/file/file-manager.js +0 -109
  319. package/dist/file/file-manager.js.map +0 -1
  320. package/dist/file/file.api.d.ts +0 -15
  321. package/dist/file/file.api.d.ts.map +0 -1
  322. package/dist/file/file.api.js +0 -30
  323. package/dist/file/file.api.js.map +0 -1
  324. package/dist/file/file.interface.d.ts +0 -25
  325. package/dist/file/file.interface.d.ts.map +0 -1
  326. package/dist/file/file.interface.js +0 -9
  327. package/dist/file/file.interface.js.map +0 -1
  328. package/dist/file-list/file-list.api.d.ts +0 -15
  329. package/dist/file-list/file-list.api.d.ts.map +0 -1
  330. package/dist/file-list/file-list.api.js +0 -54
  331. package/dist/file-list/file-list.api.js.map +0 -1
  332. package/dist/file-list/file-list.interface.d.ts +0 -22
  333. package/dist/file-list/file-list.interface.d.ts.map +0 -1
  334. package/dist/file-list/file-list.interface.js +0 -5
  335. package/dist/file-list/file-list.interface.js.map +0 -1
  336. package/dist/idea/idea.interface.js +0 -15
  337. package/dist/idea/idea.interface.js.map +0 -1
  338. package/dist/index.js +0 -42
  339. package/dist/index.js.map +0 -1
  340. package/dist/link/link.api.js +0 -30
  341. package/dist/link/link.api.js.map +0 -1
  342. package/dist/link/link.interface.js +0 -7
  343. package/dist/link/link.interface.js.map +0 -1
  344. package/dist/list/list.api.js +0 -30
  345. package/dist/list/list.api.js.map +0 -1
  346. package/dist/list/list.interface.js +0 -6
  347. package/dist/list/list.interface.js.map +0 -1
  348. package/dist/node/node-manager.d.ts +0 -48
  349. package/dist/node/node-manager.d.ts.map +0 -1
  350. package/dist/node/node-manager.js +0 -619
  351. package/dist/node/node-manager.js.map +0 -1
  352. package/dist/node/node-task.preset.d.ts +0 -1
  353. package/dist/node/node-task.preset.d.ts.map +0 -1
  354. package/dist/node/node-task.preset.js +0 -14
  355. package/dist/node/node-task.preset.js.map +0 -1
  356. package/dist/node/node.api.js +0 -100
  357. package/dist/node/node.api.js.map +0 -1
  358. package/dist/node/node.interface.js +0 -19
  359. package/dist/node/node.interface.js.map +0 -1
  360. package/dist/node/node.utils.js +0 -36
  361. package/dist/node/node.utils.js.map +0 -1
  362. package/dist/parcel/parcel-manager.js +0 -156
  363. package/dist/parcel/parcel-manager.js.map +0 -1
  364. package/dist/parcel/parcel.interface.js +0 -11
  365. package/dist/parcel/parcel.interface.js.map +0 -1
  366. package/dist/question-list/question-list.api.d.ts +0 -13
  367. package/dist/question-list/question-list.api.d.ts.map +0 -1
  368. package/dist/question-list/question-list.api.js +0 -35
  369. package/dist/question-list/question-list.api.js.map +0 -1
  370. package/dist/question-list/question-list.interface.d.ts +0 -18
  371. package/dist/question-list/question-list.interface.d.ts.map +0 -1
  372. package/dist/question-list/question-list.interface.js +0 -5
  373. package/dist/question-list/question-list.interface.js.map +0 -1
  374. package/dist/repo/repo-context.utils.js +0 -81
  375. package/dist/repo/repo-context.utils.js.map +0 -1
  376. package/dist/repo/repo-manager.js +0 -156
  377. package/dist/repo/repo-manager.js.map +0 -1
  378. package/dist/repo/repo.api.js +0 -40
  379. package/dist/repo/repo.api.js.map +0 -1
  380. package/dist/repo/repo.interface.js +0 -8
  381. package/dist/repo/repo.interface.js.map +0 -1
  382. package/dist/repo/repo.script-loader.js +0 -108
  383. package/dist/repo/repo.script-loader.js.map +0 -1
  384. package/dist/review/review.api.d.ts +0 -14
  385. package/dist/review/review.api.d.ts.map +0 -1
  386. package/dist/review/review.api.js +0 -133
  387. package/dist/review/review.api.js.map +0 -1
  388. package/dist/review/review.interface.d.ts +0 -24
  389. package/dist/review/review.interface.d.ts.map +0 -1
  390. package/dist/review/review.interface.js +0 -10
  391. package/dist/review/review.interface.js.map +0 -1
  392. package/dist/review-v2/apis/post-review-setting.api.d.ts +0 -12
  393. package/dist/review-v2/apis/post-review-setting.api.d.ts.map +0 -1
  394. package/dist/review-v2/apis/post-review-setting.api.js +0 -27
  395. package/dist/review-v2/apis/post-review-setting.api.js.map +0 -1
  396. package/dist/review-v2/apis/post-review.api.d.ts +0 -13
  397. package/dist/review-v2/apis/post-review.api.d.ts.map +0 -1
  398. package/dist/review-v2/apis/post-review.api.js +0 -46
  399. package/dist/review-v2/apis/post-review.api.js.map +0 -1
  400. package/dist/review-v2/review-setting.interface.d.ts +0 -23
  401. package/dist/review-v2/review-setting.interface.d.ts.map +0 -1
  402. package/dist/review-v2/review-setting.interface.js +0 -5
  403. package/dist/review-v2/review-setting.interface.js.map +0 -1
  404. package/dist/review-v2/review.interface.d.ts +0 -20
  405. package/dist/review-v2/review.interface.d.ts.map +0 -1
  406. package/dist/review-v2/review.interface.js +0 -5
  407. package/dist/review-v2/review.interface.js.map +0 -1
  408. package/dist/service/api.interface.d.ts +0 -35
  409. package/dist/service/api.interface.d.ts.map +0 -1
  410. package/dist/service/api.interface.js +0 -12
  411. package/dist/service/api.interface.js.map +0 -1
  412. package/dist/service/base.interface.js +0 -7
  413. package/dist/service/base.interface.js.map +0 -1
  414. package/dist/service/service.interface.js +0 -11
  415. package/dist/service/service.interface.js.map +0 -1
  416. package/dist/shared/log/create-api-logger.d.ts +0 -17
  417. package/dist/shared/log/create-api-logger.d.ts.map +0 -1
  418. package/dist/shared/log/create-api-logger.js +0 -15
  419. package/dist/shared/log/create-api-logger.js.map +0 -1
  420. package/dist/shared/log/log-manager.js +0 -218
  421. package/dist/shared/log/log-manager.js.map +0 -1
  422. package/dist/shared/utils/config-path.utils.js +0 -85
  423. package/dist/shared/utils/config-path.utils.js.map +0 -1
  424. package/dist/shared/utils/error.utils.js +0 -15
  425. package/dist/shared/utils/error.utils.js.map +0 -1
  426. package/dist/shared/utils/id.utils.js +0 -5
  427. package/dist/shared/utils/id.utils.js.map +0 -1
  428. package/dist/supabase.js +0 -100
  429. package/dist/supabase.js.map +0 -1
  430. package/dist/task/local-task-registry.js +0 -153
  431. package/dist/task/local-task-registry.js.map +0 -1
  432. package/dist/task/task-manager.js +0 -217
  433. package/dist/task/task-manager.js.map +0 -1
  434. package/dist/task/task-repo-context.js +0 -12
  435. package/dist/task/task-repo-context.js.map +0 -1
  436. package/dist/task/task.api.js +0 -351
  437. package/dist/task/task.api.js.map +0 -1
  438. package/dist/task/task.interface.js +0 -36
  439. package/dist/task/task.interface.js.map +0 -1
  440. package/dist/task/task.utils.js +0 -2
  441. package/dist/task/task.utils.js.map +0 -1
  442. package/dist/word/word.api.js +0 -30
  443. package/dist/word/word.api.js.map +0 -1
  444. package/dist/word/word.interface.js +0 -6
  445. package/dist/word/word.interface.js.map +0 -1
  446. package/src/auth/auth.api.ts +0 -87
  447. package/src/feed/feed.interface.ts +0 -33
  448. package/src/file/file-manager.ts +0 -145
  449. package/src/file/file.api.ts +0 -43
  450. package/src/file/file.interface.ts +0 -30
  451. package/src/file-list/file-list.api.ts +0 -64
  452. package/src/file-list/file-list.interface.ts +0 -24
  453. package/src/node/node-manager.ts +0 -673
  454. package/src/node/node-task.preset.ts +0 -13
  455. package/src/question-list/question-list.api.ts +0 -42
  456. package/src/question-list/question-list.interface.ts +0 -21
  457. package/src/review/review.api.ts +0 -145
  458. package/src/review/review.interface.ts +0 -26
  459. package/src/review-v2/apis/post-review-setting.api.ts +0 -35
  460. package/src/review-v2/apis/post-review.api.ts +0 -59
  461. package/src/review-v2/review-setting.interface.ts +0 -26
  462. package/src/review-v2/review.interface.ts +0 -23
  463. package/src/service/api.interface.ts +0 -47
  464. package/src/shared/log/create-api-logger.ts +0 -25
@@ -0,0 +1,225 @@
1
+ import { resolve } from "node:path";
2
+ import { envBool } from "../../node/env/env-parsers";
3
+ import { readEnv, requireEnv } from "../../node/env/require-env";
4
+ import { pollUntil } from "../../node/readiness";
5
+ import { createLogger } from "./create-logger";
6
+ import { LogPersist } from "./log-persist";
7
+ import {
8
+ logPersistConfigFromEnv,
9
+ logPersistEnabledFromEnv,
10
+ logPersistProcessFromEnv,
11
+ logPersistRegistryDirFromEnv,
12
+ logPersistServiceFromEnv,
13
+ resolveLogPersistConfig,
14
+ } from "./log-persist.config";
15
+ import type {
16
+ EnableLogPersistOptions,
17
+ EnsureLogPersistFromEnvOptions,
18
+ LogPersistReadySnapshot,
19
+ LogPersistStats,
20
+ WaitForLogPersistReadyOptions,
21
+ } from "./log-persist.interface";
22
+ import { registerLogPersistOffer } from "./log-persist-hook";
23
+ import { LOG_PERSIST_TOPIC, persistLogger } from "./log-persist-logger";
24
+ import { defaultLogPersistRegistryPath, readLogPersistRegistry } from "./log-persist-registry";
25
+
26
+ export { logPersistEnabledFromEnv };
27
+
28
+ function resolveRegistryFilePath(explicit?: string): string {
29
+ if (explicit != null && explicit.trim() !== "") {
30
+ return resolve(explicit);
31
+ }
32
+ const dir = logPersistRegistryDirFromEnv();
33
+ if (dir == null) {
34
+ throw new Error(
35
+ "[LogPersist] registry path required: set registryFilePath option or LOG_PERSIST_REGISTRY_DIR / RUNTIME_DATA_DIR",
36
+ );
37
+ }
38
+ return defaultLogPersistRegistryPath(resolve(dir));
39
+ }
40
+
41
+ export async function enableLogPersist(options: EnableLogPersistOptions): Promise<void> {
42
+ const registryFilePath = options.registryFilePath != null ? resolve(options.registryFilePath) : undefined;
43
+ const resolvedRegistry = registryFilePath ?? resolveRegistryFilePath();
44
+
45
+ const envConfig = logPersistConfigFromEnv();
46
+ await LogPersist.getInstance().enable({
47
+ ...options,
48
+ registryFilePath: resolvedRegistry,
49
+ config: resolveLogPersistConfig({
50
+ fast: { ...envConfig.fast, ...options.config?.fast },
51
+ medium: { ...envConfig.medium, ...options.config?.medium },
52
+ slow: { ...envConfig.slow, ...options.config?.slow },
53
+ postTimeoutMs: options.config?.postTimeoutMs ?? envConfig.postTimeoutMs,
54
+ shutdownDrainTimeoutMs: options.config?.shutdownDrainTimeoutMs ?? envConfig.shutdownDrainTimeoutMs,
55
+ }),
56
+ });
57
+ }
58
+
59
+ export async function disableLogPersist(): Promise<void> {
60
+ await LogPersist.getInstance().disable();
61
+ }
62
+
63
+ export function getLogPersistStats(): LogPersistStats {
64
+ return LogPersist.getInstance().getStats();
65
+ }
66
+
67
+ /**
68
+ * Enable log persistence when LOG_PERSIST_ENABLED=true.
69
+ * `process` / `service` can be passed explicitly or via LOG_PERSIST_PROCESS / LOG_PERSIST_SERVICE.
70
+ */
71
+ export async function ensureLogPersistFromEnv(options: EnsureLogPersistFromEnvOptions = {}): Promise<boolean> {
72
+ if (!logPersistEnabledFromEnv()) {
73
+ registerLogPersistOffer(null);
74
+ return false;
75
+ }
76
+
77
+ const service = options.service ?? logPersistServiceFromEnv();
78
+ const processName = options.process ?? logPersistProcessFromEnv();
79
+ if (service == null || service === "") {
80
+ throw new Error("[LogPersist] LOG_PERSIST_SERVICE is required when LOG_PERSIST_ENABLED=true");
81
+ }
82
+ if (processName == null || processName === "") {
83
+ throw new Error(
84
+ "[LogPersist] LOG_PERSIST_PROCESS is required when LOG_PERSIST_ENABLED=true (or pass process option)",
85
+ );
86
+ }
87
+
88
+ const registryFilePath =
89
+ options.registryFilePath != null ? resolve(options.registryFilePath) : resolveRegistryFilePath();
90
+
91
+ await enableLogPersist({
92
+ service,
93
+ process: processName,
94
+ registryFilePath,
95
+ config: options.config,
96
+ });
97
+
98
+ const lifecycleLogger = createLogger({ module: "log-persist" });
99
+ lifecycleLogger.info("log persist enabled from env", {
100
+ topic: LOG_PERSIST_TOPIC,
101
+ data: { service, process: processName, registryFilePath },
102
+ });
103
+
104
+ return true;
105
+ }
106
+
107
+ /**
108
+ * Preload guard: when persistence is enabled, required env must be present before app code runs.
109
+ */
110
+ export function validateLogPersistPreloadEnv(env: NodeJS.ProcessEnv = process.env): void {
111
+ if (!envBool("LOG_PERSIST_ENABLED", false, env)) {
112
+ return;
113
+ }
114
+
115
+ const missing: string[] = [];
116
+ if (readEnv("LOG_PERSIST_SERVICE", env) == null) {
117
+ missing.push("LOG_PERSIST_SERVICE");
118
+ }
119
+ const registryDir = logPersistRegistryDirFromEnv(env);
120
+ if (registryDir == null) {
121
+ missing.push("LOG_PERSIST_REGISTRY_DIR or RUNTIME_DATA_DIR");
122
+ }
123
+
124
+ if (missing.length > 0) {
125
+ throw new Error(`[LogPersist] preload env incomplete: ${missing.join(", ")}`);
126
+ }
127
+ }
128
+
129
+ function evaluateLogPersistReady(
130
+ state: Awaited<ReturnType<typeof readLogPersistRegistry>>,
131
+ expectedProcesses: string[],
132
+ staleMs: number,
133
+ now: number,
134
+ ): LogPersistReadySnapshot {
135
+ const missing: string[] = [];
136
+ const stale: string[] = [];
137
+ const registered: string[] = [];
138
+
139
+ for (const processName of expectedProcesses) {
140
+ const record = state.processes[processName];
141
+ if (record == null) {
142
+ missing.push(processName);
143
+ continue;
144
+ }
145
+
146
+ const heartbeatAt = Date.parse(record.lastHeartbeatAt);
147
+ if (!Number.isFinite(heartbeatAt) || now - heartbeatAt > staleMs) {
148
+ stale.push(processName);
149
+ continue;
150
+ }
151
+
152
+ registered.push(processName);
153
+ }
154
+
155
+ return {
156
+ ok: missing.length === 0 && stale.length === 0,
157
+ missing,
158
+ stale,
159
+ registered,
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Wait until every expected process has registered in the shared registry with a fresh heartbeat.
165
+ * Call from the service main process after spawning children.
166
+ */
167
+ export async function waitForLogPersistReady(options: WaitForLogPersistReadyOptions): Promise<LogPersistReadySnapshot> {
168
+ const timeoutMs = options.timeoutMs ?? 60_000;
169
+ const pollIntervalMs = options.pollIntervalMs ?? 500;
170
+ const staleMs = options.staleMs ?? 90_000;
171
+
172
+ let last: LogPersistReadySnapshot = {
173
+ ok: false,
174
+ missing: [...options.expectedProcesses],
175
+ stale: [],
176
+ registered: [],
177
+ };
178
+
179
+ try {
180
+ await pollUntil({
181
+ intervalMs: pollIntervalMs,
182
+ timeoutMs,
183
+ until: async () => {
184
+ const state = await readLogPersistRegistry(options.registryFilePath);
185
+ if (state.service !== options.service) {
186
+ last = {
187
+ ok: false,
188
+ missing: options.expectedProcesses,
189
+ stale: [],
190
+ registered: [],
191
+ };
192
+ return false;
193
+ }
194
+ last = evaluateLogPersistReady(state, options.expectedProcesses, staleMs, Date.now());
195
+ return last.ok;
196
+ },
197
+ });
198
+ } catch {
199
+ persistLogger.warn("waitForLogPersistReady timed out", {
200
+ timeoutMs,
201
+ expectedProcesses: options.expectedProcesses,
202
+ ...last,
203
+ });
204
+ }
205
+
206
+ return last;
207
+ }
208
+
209
+ export async function snapshotLogPersistReady(options: {
210
+ registryFilePath: string;
211
+ service: string;
212
+ expectedProcesses: string[];
213
+ staleMs?: number;
214
+ }): Promise<LogPersistReadySnapshot> {
215
+ const state = await readLogPersistRegistry(options.registryFilePath);
216
+ return evaluateLogPersistReady(state, options.expectedProcesses, options.staleMs ?? 90_000, Date.now());
217
+ }
218
+
219
+ export function resolveLogPersistRegistryPath(registryDir?: string): string {
220
+ const dir = registryDir ?? logPersistRegistryDirFromEnv();
221
+ if (dir == null) {
222
+ requireEnv("LOG_PERSIST_REGISTRY_DIR");
223
+ }
224
+ return defaultLogPersistRegistryPath(resolve(dir ?? ""));
225
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Log domain public API — curated re-exports only.
3
+ */
4
+
5
+ export type {
6
+ CreateLoggerFromModuleInput,
7
+ CreateLoggerFromScopeInput,
8
+ CreateLoggerInput,
9
+ } from "./create-logger";
10
+ // create-logger
11
+ export { createLogger } from "./create-logger";
12
+ export type { LogEntry, LoggerWithScope, LogOptions, LogRestParams, WithScopeOptions } from "./log-manager";
13
+ // log-manager
14
+ export { LogLevel, LogManager, logManager } from "./log-manager";
15
+ export type {
16
+ CreateScopeInput,
17
+ LoggerResetScopePatch,
18
+ LogScope,
19
+ LogScopeInput,
20
+ LogScopePatch,
21
+ PatchScopeInput,
22
+ } from "./log-scope";
23
+ // log-scope
24
+ export {
25
+ createScope,
26
+ formatScopeLabels,
27
+ normalizeScope,
28
+ patchScope,
29
+ resolveLogData,
30
+ withModule,
31
+ } from "./log-scope";
@@ -1,5 +1,7 @@
1
1
  import { isDevEnvironment } from "../../core.utils";
2
2
  import { generateUniqueId } from "../utils/id.utils";
3
+ import { offerToLogPersist } from "./log-persist-hook";
4
+ import { formatScopeLabels, type LoggerResetScopePatch, type LogScope, patchScope, resolveLogData } from "./log-scope";
3
5
 
4
6
  /**
5
7
  * Log severity and semantics (low → high). `minLevel` filters by {@link LOG_LEVEL_RANK}.
@@ -31,86 +33,70 @@ const LOG_LEVEL_RANK: Record<LogLevel, number> = {
31
33
  [LogLevel.CRITICAL]: 5,
32
34
  };
33
35
 
34
- interface LogEntry {
36
+ interface LogEntry extends LogScope {
35
37
  timestamp: number;
36
38
  level: LogLevel;
37
- /** Tell people what happened, but more structured */
38
39
  message: string;
39
- /** Category of a kind of log */
40
- topic: string | null;
41
- /** Where the log comes from */
42
- module: string;
43
- /** Specific process — correlates one logical chain (loop, request). */
44
- traceId: string;
45
- /** Worker node id when the log is node-scoped; omit for scheduler / admin / API-only paths. */
46
- nodeId?: string;
40
+ topic: string;
47
41
  extra?: string;
48
- context?: unknown;
42
+ /** Per-line structured business payload. */
43
+ data?: unknown;
49
44
  }
50
45
 
51
- interface LogContext {
52
- module: LogEntry["module"];
53
- traceId: LogEntry["traceId"];
54
- nodeId?: LogEntry["nodeId"];
55
- }
46
+ type LogRestParams = {
47
+ topic: string;
48
+ extra?: LogEntry["extra"];
49
+ data?: unknown;
50
+ };
56
51
 
57
- type LogRestParams = Omit<LogParams, "message">;
52
+ type LogParams = { message: LogEntry["message"] } & LogRestParams;
58
53
 
59
- interface LogEntryPayload {
54
+ interface LogEntryPayload extends LogScope {
60
55
  message: LogEntry["message"];
61
- topic?: LogEntry["topic"];
56
+ topic: LogEntry["topic"];
62
57
  extra?: LogEntry["extra"];
63
- context?: LogEntry["context"];
58
+ data?: LogEntry["data"];
64
59
  level: LogEntry["level"];
65
- module: LogEntry["module"];
66
- traceId: LogEntry["traceId"];
67
- nodeId?: LogEntry["nodeId"];
68
60
  }
69
61
 
70
- type LogParams = Pick<LogEntryPayload, "message" | "topic" | "extra" | "context">;
71
-
72
62
  interface LogOptions {
73
- defaultTopic: LogEntry["topic"];
74
63
  formatTimestamp: boolean;
75
64
  formatEmoji: boolean;
76
65
  formatPrefix: string;
77
- maxHistoryLength: number;
78
66
  /** Logs below this level are skipped. Defaults to DEBUG in dev, INFO in production. */
79
67
  minLevel?: LogLevel;
80
68
  onLog?: (entry: LogEntry) => void;
81
69
  }
82
70
 
71
+ /** Per-scoped-logger options for {@link LogManager.withScope}. */
72
+ interface WithScopeOptions {
73
+ /** Overrides global {@link LogOptions.minLevel} for this logger instance. */
74
+ minLevel?: LogLevel;
75
+ }
76
+
83
77
  const DEFAULT_OPTIONS: LogOptions = {
84
- defaultTopic: null,
85
78
  formatTimestamp: true,
86
79
  formatEmoji: true,
87
80
  formatPrefix: "",
88
- maxHistoryLength: 4096,
89
81
  minLevel: isDevEnvironment() ? LogLevel.DEBUG : LogLevel.INFO,
90
82
  };
91
83
 
92
- interface LoggerWithContext {
93
- /** Rank 0 — diagnostic detail; dev/troubleshooting only. */
94
- debug: (message: LogParams["message"], restParams?: LogRestParams) => void;
95
- /** Rank 1 — normal operational flow. */
96
- info: (message: LogParams["message"], restParams?: LogRestParams) => void;
97
- /** Rank 2 — positive milestone (semantic INFO, not higher severity). */
98
- success: (message: LogParams["message"], restParams?: LogRestParams) => void;
99
- /** Rank 3 — recoverable anomaly; system continues. */
100
- warn: (message: LogParams["message"], restParams?: LogRestParams) => void;
101
- /** Rank 4 — a concrete operation failed; needs investigation. */
102
- error: (message: LogParams["message"], restParams?: LogRestParams) => void;
103
- /** Rank 5 — invariant / design / integrity breach; escalate immediately. */
104
- critical: (message: LogParams["message"], restParams?: LogRestParams) => void;
105
- /** Merge partial fields into this logger's bound context (e.g. nodeId after register). */
106
- resetContext: (fields: Partial<LogContext>) => void;
84
+ interface LoggerWithScope {
85
+ debug: (message: LogParams["message"], restParams: LogRestParams) => void;
86
+ info: (message: LogParams["message"], restParams: LogRestParams) => void;
87
+ success: (message: LogParams["message"], restParams: LogRestParams) => void;
88
+ warn: (message: LogParams["message"], restParams: LogRestParams) => void;
89
+ error: (message: LogParams["message"], restParams: LogRestParams) => void;
90
+ critical: (message: LogParams["message"], restParams: LogRestParams) => void;
91
+ /** Merge labels / module into this logger's bound scope (trace fields are not mutable). */
92
+ resetScope: (patch: LoggerResetScopePatch) => void;
107
93
  }
108
94
 
109
95
  function mergeLogOptions(options?: Partial<LogOptions>): LogOptions {
110
96
  return { ...DEFAULT_OPTIONS, ...options };
111
97
  }
112
98
 
113
- function formatContextValue(value: unknown): string {
99
+ function formatDataValue(value: unknown): string {
114
100
  if (value === undefined) {
115
101
  return "";
116
102
  }
@@ -124,23 +110,25 @@ function formatContextValue(value: unknown): string {
124
110
  }
125
111
  }
126
112
 
127
- function validateLogContext(logContext: LogContext): void {
113
+ function validateLogScope(logScope: LogScope): void {
128
114
  const missing: string[] = [];
129
- if (!logContext.module?.trim()) {
115
+ if (!logScope.module?.trim()) {
130
116
  missing.push("module");
131
117
  }
132
- if (!logContext.traceId?.trim()) {
118
+ if (!logScope.traceId?.trim()) {
133
119
  missing.push("traceId");
134
120
  }
121
+ if (logScope.traceParentId !== null && typeof logScope.traceParentId !== "string") {
122
+ missing.push("traceParentId");
123
+ }
135
124
  if (missing.length > 0) {
136
- console.warn(`[LogManager] LogContext missing or empty: ${missing.join(", ")}`, logContext);
125
+ console.warn(`[LogManager] LogScope missing or invalid: ${missing.join(", ")}`, logScope);
137
126
  }
138
127
  }
139
128
 
140
129
  class LogManager {
141
130
  private static instance: LogManager;
142
131
  private options: LogOptions;
143
- private history: LogEntry[] = [];
144
132
  private readonly levelEmojis = {
145
133
  [LogLevel.DEBUG]: "🔍",
146
134
  [LogLevel.INFO]: "ℹ️",
@@ -158,7 +146,9 @@ class LogManager {
158
146
  if (!LogManager.instance) {
159
147
  LogManager.instance = new LogManager(options);
160
148
  } else if (options != null && Object.keys(options).length > 0) {
161
- console.warn("[LogManager] getInstance(options) ignored — singleton already created. Use setOptions() instead.");
149
+ console.warn(
150
+ "[LogManager] getInstance(options) ignored — singleton already created. Use setOptions() instead.",
151
+ );
162
152
  }
163
153
  return LogManager.instance;
164
154
  }
@@ -167,42 +157,28 @@ class LogManager {
167
157
  this.options = mergeLogOptions({ ...this.options, ...options });
168
158
  }
169
159
 
170
- public getHistory(): LogEntry[] {
171
- return [...this.history];
172
- }
173
-
174
- public clearHistory(): void {
175
- this.history = [];
176
- }
177
-
178
160
  private getMinLevel(): LogLevel {
179
161
  return this.options.minLevel ?? DEFAULT_OPTIONS.minLevel ?? LogLevel.INFO;
180
162
  }
181
163
 
182
- private shouldLog(level: LogLevel): boolean {
183
- return LOG_LEVEL_RANK[level] >= LOG_LEVEL_RANK[this.getMinLevel()];
164
+ private shouldLog(level: LogLevel, scopeMinLevel?: LogLevel): boolean {
165
+ const minLevel = scopeMinLevel ?? this.getMinLevel();
166
+ return LOG_LEVEL_RANK[level] >= LOG_LEVEL_RANK[minLevel];
184
167
  }
185
168
 
186
- private createLogEntry({
187
- level,
188
- message,
189
- topic,
190
- module,
191
- traceId,
192
- nodeId,
193
- extra,
194
- context,
195
- }: LogEntryPayload): LogEntry {
169
+ private createLogEntry(payload: LogEntryPayload): LogEntry {
170
+ const { level, message, topic, extra, data, module, traceId, traceParentId, labels } = payload;
196
171
  return {
197
172
  timestamp: Date.now(),
198
173
  level,
199
174
  message,
200
- topic: topic === undefined ? this.options.defaultTopic : topic,
175
+ topic,
201
176
  module,
202
177
  traceId,
203
- nodeId,
178
+ traceParentId,
179
+ labels,
204
180
  extra,
205
- context,
181
+ data,
206
182
  };
207
183
  }
208
184
 
@@ -223,24 +199,23 @@ class LogManager {
223
199
 
224
200
  parts.push(this.formatLevelTag(entry));
225
201
  parts.push(
226
- `traceId=${entry.traceId} nodeId=${entry.nodeId ?? "--"} module=${entry.module} topic=${entry.topic ?? "--"}`
202
+ `traceId=${entry.traceId} parent=${entry.traceParentId ?? "null"} labels=${formatScopeLabels(entry.labels)} module=${entry.module} topic=${entry.topic}`,
227
203
  );
228
204
 
229
205
  if (this.options.formatPrefix) {
230
206
  parts.push(`prefix=${this.options.formatPrefix}`);
231
207
  }
232
208
 
233
- const message =
234
- entry.level === LogLevel.CRITICAL ? `>>> ${entry.message} <<<` : entry.message;
209
+ const message = entry.level === LogLevel.CRITICAL ? `>>> ${entry.message} <<<` : entry.message;
235
210
  parts.push(`| ${message}`);
236
211
 
237
212
  if (entry.extra) {
238
213
  parts.push(`| extra=${entry.extra}`);
239
214
  }
240
215
 
241
- const contextText = formatContextValue(entry.context);
242
- if (contextText) {
243
- parts.push(`| context=${contextText}`);
216
+ const dataText = formatDataValue(entry.data);
217
+ if (dataText) {
218
+ parts.push(`| data=${dataText}`);
244
219
  }
245
220
 
246
221
  return parts.join(" ");
@@ -263,78 +238,94 @@ class LogManager {
263
238
  private log(
264
239
  level: LogLevel,
265
240
  message: LogParams["message"],
266
- logContext: LogContext,
267
- restParams?: LogRestParams
241
+ logScope: LogScope,
242
+ restParams: LogRestParams,
243
+ scopeMinLevel?: LogLevel,
268
244
  ) {
269
- if (!this.shouldLog(level)) {
245
+ if (!this.shouldLog(level, scopeMinLevel)) {
270
246
  return;
271
247
  }
272
248
 
273
- validateLogContext(logContext);
274
-
275
- const { topic, extra, context } = restParams ?? {};
276
- const { module, traceId, nodeId } = logContext;
277
- const entry = this.createLogEntry({ level, message, topic, extra, context, module, traceId, nodeId });
278
-
279
- this.history.push(entry);
280
- if (this.history.length > this.options.maxHistoryLength) {
281
- this.history.shift();
249
+ validateLogScope(logScope);
250
+ if (!restParams.topic?.trim()) {
251
+ throw new Error("[LogManager] topic is required on every log call");
282
252
  }
283
253
 
254
+ const { topic, extra } = restParams;
255
+ const data = resolveLogData(restParams);
256
+ const entry = this.createLogEntry({
257
+ level,
258
+ message,
259
+ topic,
260
+ extra,
261
+ data,
262
+ ...logScope,
263
+ });
264
+
284
265
  const formatted = this.formatLog(entry);
285
266
  this.emitLog(entry, formatted);
286
267
  this.options.onLog?.(entry);
268
+ offerToLogPersist(entry);
287
269
  }
288
270
 
289
271
  public generateTraceId(): string {
290
272
  return generateUniqueId();
291
273
  }
292
274
 
293
- public debug(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
294
- this.log(LogLevel.DEBUG, message, logContext, restParams);
275
+ public debug(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
276
+ this.log(LogLevel.DEBUG, message, logScope, restParams);
295
277
  }
296
278
 
297
- public info(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
298
- this.log(LogLevel.INFO, message, logContext, restParams);
279
+ public info(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
280
+ this.log(LogLevel.INFO, message, logScope, restParams);
299
281
  }
300
282
 
301
- public success(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
302
- this.log(LogLevel.SUCCESS, message, logContext, restParams);
283
+ public success(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
284
+ this.log(LogLevel.SUCCESS, message, logScope, restParams);
303
285
  }
304
286
 
305
- public warn(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
306
- this.log(LogLevel.WARN, message, logContext, restParams);
287
+ public warn(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
288
+ this.log(LogLevel.WARN, message, logScope, restParams);
307
289
  }
308
290
 
309
- public error(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
310
- this.log(LogLevel.ERROR, message, logContext, restParams);
291
+ public error(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
292
+ this.log(LogLevel.ERROR, message, logScope, restParams);
311
293
  }
312
294
 
313
- public critical(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams) {
314
- this.log(LogLevel.CRITICAL, message, logContext, restParams);
295
+ public critical(message: LogParams["message"], logScope: LogScope, restParams: LogRestParams) {
296
+ this.log(LogLevel.CRITICAL, message, logScope, restParams);
315
297
  }
316
298
 
317
- public withContext(context: LogContext): { logger: LoggerWithContext; context: LogContext } {
318
- const boundContext: LogContext = { ...context };
319
-
320
- const logger: LoggerWithContext = {
321
- debug: (message, restParams) => this.debug(message, boundContext, restParams),
322
- info: (message, restParams) => this.info(message, boundContext, restParams),
323
- success: (message, restParams) => this.success(message, boundContext, restParams),
324
- warn: (message, restParams) => this.warn(message, boundContext, restParams),
325
- error: (message, restParams) => this.error(message, boundContext, restParams),
326
- critical: (message, restParams) => this.critical(message, boundContext, restParams),
327
- resetContext: (fields) => {
328
- Object.assign(boundContext, fields);
299
+ public withScope(scope: LogScope, options?: WithScopeOptions): { logger: LoggerWithScope; scope: LogScope } {
300
+ const boundScope: LogScope = { ...scope, labels: scope.labels ? { ...scope.labels } : undefined };
301
+ const scopeMinLevel = options?.minLevel;
302
+
303
+ const logger: LoggerWithScope = {
304
+ debug: (message, restParams) => this.log(LogLevel.DEBUG, message, boundScope, restParams, scopeMinLevel),
305
+ info: (message, restParams) => this.log(LogLevel.INFO, message, boundScope, restParams, scopeMinLevel),
306
+ success: (message, restParams) =>
307
+ this.log(LogLevel.SUCCESS, message, boundScope, restParams, scopeMinLevel),
308
+ warn: (message, restParams) => this.log(LogLevel.WARN, message, boundScope, restParams, scopeMinLevel),
309
+ error: (message, restParams) => this.log(LogLevel.ERROR, message, boundScope, restParams, scopeMinLevel),
310
+ critical: (message, restParams) =>
311
+ this.log(LogLevel.CRITICAL, message, boundScope, restParams, scopeMinLevel),
312
+ resetScope: (patch) => {
313
+ const next = patchScope({
314
+ scope: boundScope,
315
+ patch,
316
+ allowTraceMutation: false,
317
+ });
318
+ boundScope.module = next.module;
319
+ boundScope.traceId = next.traceId;
320
+ boundScope.traceParentId = next.traceParentId;
321
+ boundScope.labels = next.labels;
329
322
  },
330
323
  };
331
324
 
332
- return { logger, context: boundContext };
325
+ return { logger, scope: boundScope };
333
326
  }
334
327
  }
335
328
 
336
329
  export const logManager = LogManager.getInstance();
337
- export { LogManager, LogLevel };
338
- export { createApiLogger } from "./create-api-logger";
339
- export type { CreateApiLoggerOptions } from "./create-api-logger";
340
- export type { LogOptions, LogEntry, LogContext, LoggerWithContext, LogRestParams };
330
+ export type { LogEntry, LoggerWithScope, LogOptions, LogRestParams, WithScopeOptions };
331
+ export { LogLevel, LogManager };
@@ -0,0 +1,43 @@
1
+ import { createHash } from "node:crypto";
2
+ import type { LogEntry } from "./log-manager";
3
+ import type { LogPersistLane } from "./log-persist.interface";
4
+
5
+ const BATCH_ID_VERSION = 1;
6
+
7
+ /** Stable subset of LogEntry for idempotency hashing (same batch → same key). */
8
+ function canonicalLogEntry(entry: LogEntry): Record<string, unknown> {
9
+ return {
10
+ timestamp: entry.timestamp,
11
+ level: entry.level,
12
+ message: entry.message,
13
+ topic: entry.topic,
14
+ module: entry.module,
15
+ traceId: entry.traceId,
16
+ traceParentId: entry.traceParentId ?? null,
17
+ extra: entry.extra ?? null,
18
+ data: entry.data ?? null,
19
+ labels: entry.labels ?? null,
20
+ };
21
+ }
22
+
23
+ /**
24
+ * Deterministic List.value for a log batch — retries after timeout map to the same row key.
25
+ * SHA-256 over canonical JSON (service + process + lane + entries in order).
26
+ */
27
+ export function computeLogBatchIdempotencyKey(input: {
28
+ service: string;
29
+ process: string;
30
+ lane: LogPersistLane;
31
+ entries: LogEntry[];
32
+ }): string {
33
+ const payload = {
34
+ v: BATCH_ID_VERSION,
35
+ service: input.service,
36
+ process: input.process,
37
+ lane: input.lane,
38
+ entries: input.entries.map(canonicalLogEntry),
39
+ };
40
+
41
+ const hash = createHash("sha256").update(JSON.stringify(payload), "utf8").digest("hex");
42
+ return `${hash.slice(0, 32)}`;
43
+ }