target-supabase-sdk 0.2.0 → 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 (484) hide show
  1. package/README.md +127 -10
  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-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/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 +17 -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 +89 -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 +109 -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
@@ -1,26 +1,38 @@
1
- import { MAX_POLL_TARGET_LIST_SIZE } from "../core.api";
2
1
  import { getPollCommandList } from "../command/command.api";
3
2
  import { CommandType } from "../command/command.interface";
3
+ import { MAX_POLL_TARGET_LIST_SIZE } from "../core.api";
4
4
  import {
5
- applyScopePatch,
6
- createChildScope,
7
- createRootScope,
8
- logManager,
5
+ createLogger,
6
+ createScope,
9
7
  type LoggerWithScope,
8
+ LogLevel,
10
9
  type LogScope,
10
+ logManager,
11
+ patchScope,
11
12
  } from "../shared/log";
12
- import { scopeForNodeLoop } from "./node-log-scope";
13
13
  import { getErrorMessage } from "../shared/utils/error.utils";
14
14
  import { patchChangeNodeStatus, patchNodeHeartBeat, patchStopNode, postRegisterNode } from "./node.api";
15
- import { NodeLoopContext, NodeStatus } from "./node.interface";
15
+ import { NodeStatus } from "./node.interface";
16
16
  import { formatHeartbeat, getRandomInterval } from "./node.utils";
17
17
 
18
+ /** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */
19
+ export interface NodeLoopContext {
20
+ loopTraceId: string;
21
+ nodeId: string;
22
+ }
23
+
24
+ export const LOG_TOPIC_NODE = "node";
25
+ const LOG_TOPIC_COMMAND = "command";
26
+ const LOG_TOPIC_PROCESS = "process";
27
+
18
28
  /**
19
29
  * Shared node process runtime: bootstrap, main-loop frame, heartbeat, commands, shutdown.
20
30
  * Subclasses implement {@link onBeforeRegisterNode} and {@link runLoopSteps}.
21
31
  */
22
32
  abstract class BaseNodeRuntime {
23
33
  protected static readonly HEARTBEAT_FAILURE_THRESHOLD = 3;
34
+ /** Log `nodeId` label while startup has not yet received an assigned id from Supabase. */
35
+ private static readonly NODE_ID_PENDING_ASSIGNMENT = "pending-node-id";
24
36
 
25
37
  protected readonly runtimeModule: string;
26
38
 
@@ -53,10 +65,10 @@ abstract class BaseNodeRuntime {
53
65
 
54
66
  protected constructor(runtimeModule: string) {
55
67
  this.runtimeModule = runtimeModule;
56
- this.isRunning = true;
68
+ this.isRunning = false;
57
69
  this.loopCount = 0;
58
70
  this.startupTraceId = logManager.generateTraceId();
59
- this.startupScope = createRootScope({ module: runtimeModule, traceId: this.startupTraceId });
71
+ this.startupScope = createScope({ module: runtimeModule, traceId: this.startupTraceId });
60
72
  }
61
73
 
62
74
  /** Hook: task registration, trigger config load, etc. Throw to abort bootstrap. */
@@ -65,8 +77,18 @@ abstract class BaseNodeRuntime {
65
77
  /** Hook: one iteration body after commands + heartbeat gate. */
66
78
  protected abstract runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void>;
67
79
 
80
+ /** Hook: minimum log level for main-loop scoped loggers (heartbeat, batchCommand, iteration). */
81
+ protected loopLoggerMinLevel(): LogLevel {
82
+ return LogLevel.INFO;
83
+ }
84
+
85
+ /** Hook: ms to wait between loop iterations. Default: random 15–60s. */
86
+ protected getLoopIntervalMs(): number {
87
+ return getRandomInterval();
88
+ }
89
+
68
90
  private getLogNodeId(): string {
69
- return this.localNodeId ?? "bootstrap";
91
+ return this.localNodeId ?? BaseNodeRuntime.NODE_ID_PENDING_ASSIGNMENT;
70
92
  }
71
93
 
72
94
  protected isShuttingDown(): boolean {
@@ -79,17 +101,17 @@ abstract class BaseNodeRuntime {
79
101
 
80
102
  private registerProcessLifecycle(logger: LoggerWithScope): void {
81
103
  process.on("SIGTERM", () => {
82
- logger.warn("收到 SIGTERM 信號,準備關閉節點", { topic: "process" });
104
+ logger.warn("收到 SIGTERM 信號,準備關閉節點", { topic: LOG_TOPIC_PROCESS });
83
105
  this.requestShutdown("SIGTERM");
84
106
  });
85
107
  process.on("SIGINT", () => {
86
- logger.warn("收到 SIGINT 信號,準備關閉節點", { topic: "process" });
108
+ logger.warn("收到 SIGINT 信號,準備關閉節點", { topic: LOG_TOPIC_PROCESS });
87
109
  this.requestShutdown("SIGINT");
88
110
  });
89
111
  process.on("uncaughtException", (error) => {
90
112
  if (this.shutdownPromise != null) {
91
- logger.critical("shutdown 進行中發生未捕獲異常", {
92
- topic: "process",
113
+ logger.critical("shutdown 進行中發生未捕獲異常,立即關閉節點", {
114
+ topic: LOG_TOPIC_PROCESS,
93
115
  data: {
94
116
  name: error.name,
95
117
  message: error.message,
@@ -99,8 +121,8 @@ abstract class BaseNodeRuntime {
99
121
  process.exit(1);
100
122
  return;
101
123
  }
102
- logger.error("未捕獲的異常,準備關閉節點", {
103
- topic: "process",
124
+ logger.critical("未捕獲的異常,準備關閉節點", {
125
+ topic: LOG_TOPIC_PROCESS,
104
126
  data: {
105
127
  name: error.name,
106
128
  message: error.message,
@@ -112,7 +134,7 @@ abstract class BaseNodeRuntime {
112
134
  process.on("unhandledRejection", (reason) => {
113
135
  if (this.shutdownPromise != null) {
114
136
  logger.error("shutdown 進行中發生未處理的 Promise 拒絕", {
115
- topic: "process",
137
+ topic: LOG_TOPIC_PROCESS,
116
138
  data: {
117
139
  reason: getErrorMessage(reason),
118
140
  stack: reason instanceof Error ? reason.stack : undefined,
@@ -121,7 +143,7 @@ abstract class BaseNodeRuntime {
121
143
  return;
122
144
  }
123
145
  logger.error("未處理的 Promise 拒絕,準備關閉節點", {
124
- topic: "process",
146
+ topic: LOG_TOPIC_PROCESS,
125
147
  data: {
126
148
  reason: getErrorMessage(reason),
127
149
  stack: reason instanceof Error ? reason.stack : undefined,
@@ -140,12 +162,12 @@ abstract class BaseNodeRuntime {
140
162
  }
141
163
 
142
164
  private async runStart(): Promise<void> {
143
- const { logger } = logManager.withScope(
144
- applyScopePatch(this.startupScope, { labels: { nodeId: this.getLogNodeId() } })
145
- );
165
+ const logger = createLogger({
166
+ scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
167
+ });
146
168
 
147
- logger.info("節點進程啟動中", {
148
- topic: "node",
169
+ logger.debug("節點進程啟動中", {
170
+ topic: LOG_TOPIC_NODE,
149
171
  data: {
150
172
  pid: process.pid,
151
173
  env: process.env.NODE_ENV ?? "development",
@@ -158,14 +180,14 @@ abstract class BaseNodeRuntime {
158
180
  await this.onBeforeRegisterNode(logger);
159
181
  } catch (error) {
160
182
  logger.error("節點啟動前置步驟失敗", {
161
- topic: "node",
183
+ topic: LOG_TOPIC_NODE,
162
184
  data: { error: getErrorMessage(error) },
163
185
  });
164
186
  this.requestShutdown("bootstrap:pre-register");
165
187
  return;
166
188
  }
167
189
 
168
- logger.info("開始向 Supabase 註冊節點", { topic: "node" });
190
+ logger.debug("開始向 Supabase 註冊節點", { topic: LOG_TOPIC_NODE });
169
191
  try {
170
192
  const { data, error } = await postRegisterNode({ traceId: this.startupTraceId });
171
193
  if (data == null || error) {
@@ -174,7 +196,7 @@ abstract class BaseNodeRuntime {
174
196
  this.localNodeId = data.id;
175
197
  logger.resetScope({ labels: { nodeId: data.id } });
176
198
  logger.success("節點註冊成功", {
177
- topic: "node",
199
+ topic: LOG_TOPIC_NODE,
178
200
  data: {
179
201
  nodeId: data.id,
180
202
  details: data.details,
@@ -182,7 +204,7 @@ abstract class BaseNodeRuntime {
182
204
  });
183
205
  } catch (error) {
184
206
  logger.error("節點註冊失敗", {
185
- topic: "node",
207
+ topic: LOG_TOPIC_NODE,
186
208
  data: { error: getErrorMessage(error) },
187
209
  });
188
210
  this.requestShutdown("bootstrap:register-node");
@@ -190,7 +212,7 @@ abstract class BaseNodeRuntime {
190
212
  }
191
213
 
192
214
  const nodeId = this.localNodeId!;
193
- logger.info("節點準備進入主循環", { topic: "node" });
215
+ logger.debug("節點準備進入主循環", { topic: LOG_TOPIC_NODE });
194
216
  const { error: enterBusyError } = await patchChangeNodeStatus({
195
217
  nodeId,
196
218
  status: NodeStatus.BUSY,
@@ -199,54 +221,62 @@ abstract class BaseNodeRuntime {
199
221
  });
200
222
  if (enterBusyError) {
201
223
  logger.error("節點進入主循環失敗,無法更新節點狀態為 BUSY", {
202
- topic: "node",
224
+ topic: LOG_TOPIC_NODE,
203
225
  data: { error: enterBusyError.message },
204
226
  });
205
227
  this.requestShutdown("bootstrap:enter-busy");
206
228
  return;
207
229
  }
208
- logger.info("節點狀態已設為 BUSY,進入主循環", { topic: "node", data: { nodeId } });
230
+ logger.debug("節點狀態已設為 BUSY 進入主循環", { topic: LOG_TOPIC_NODE, data: { nodeId } });
231
+ await this.runLoop(nodeId);
232
+ }
233
+
234
+ private async runLoop(nodeId: string): Promise<void> {
235
+ this.isRunning = true;
209
236
 
210
237
  while (this.isRunning) {
211
238
  this.loopCount++;
212
239
  const loopTraceId = logManager.generateTraceId();
213
- const loopScope = createChildScope({
240
+ const loopScope = createScope({
214
241
  module: `${this.runtimeModule}-loop-iteration`,
215
- parent: applyScopePatch(this.startupScope, { labels: { nodeId } }),
216
242
  traceId: loopTraceId,
243
+ labels: { nodeId },
217
244
  });
218
245
  const loopCtx: NodeLoopContext = { loopTraceId, nodeId };
219
- const { logger: iterLogger } = logManager.withScope(loopScope);
246
+ const iterLogger = createLogger({
247
+ scope: loopScope,
248
+ minLevel: this.loopLoggerMinLevel(),
249
+ });
220
250
 
221
- iterLogger.info(`主循環第 ${this.loopCount} 輪開始`, {
222
- topic: "node",
251
+ iterLogger.debug(`主循環第 ${this.loopCount} 輪開始`, {
252
+ topic: LOG_TOPIC_NODE,
223
253
  data: { nodeId, loopCount: this.loopCount },
224
254
  });
225
255
  try {
226
256
  await this.batchCommand(loopCtx);
227
257
  if (this.isShuttingDown()) {
228
- iterLogger.info("節點關閉中,跳過本輪剩餘步驟", { topic: "node" });
258
+ iterLogger.debug("節點關閉中,跳過本輪剩餘步驟", { topic: LOG_TOPIC_NODE });
229
259
  break;
230
260
  }
231
261
  const heartbeatOk = await this.heartbeat(loopCtx);
232
262
  if (this.isShuttingDown()) {
233
- iterLogger.info("節點關閉中,跳過本輪剩餘步驟", { topic: "node" });
263
+ iterLogger.debug("節點關閉中,跳過本輪剩餘步驟", { topic: LOG_TOPIC_NODE });
234
264
  break;
235
265
  }
236
266
  await this.runLoopSteps(loopCtx, heartbeatOk);
237
267
  } catch (error) {
238
268
  iterLogger.critical(`主循環第 ${this.loopCount} 輪遇到未知錯誤`, {
239
- topic: "node",
269
+ topic: LOG_TOPIC_NODE,
240
270
  data: { error: getErrorMessage(error) },
241
271
  });
242
272
  }
243
273
  if (this.isShuttingDown()) {
244
- iterLogger.debug("節點關閉中,跳過等待間隔", { topic: "node" });
274
+ iterLogger.debug("節點關閉中,跳過等待間隔", { topic: LOG_TOPIC_NODE });
245
275
  break;
246
276
  }
247
- const interval = getRandomInterval();
277
+ const interval = this.getLoopIntervalMs();
248
278
  iterLogger.debug(`主循環第 ${this.loopCount} 輪完成,等待下一輪`, {
249
- topic: "node",
279
+ topic: LOG_TOPIC_NODE,
250
280
  data: { intervalMs: interval },
251
281
  });
252
282
  await new Promise((resolve) => setTimeout(resolve, interval));
@@ -255,11 +285,11 @@ abstract class BaseNodeRuntime {
255
285
 
256
286
  async shutdown(options?: { trigger?: string }): Promise<void> {
257
287
  if (this.shutdownPromise != null) {
258
- const { logger } = logManager.withScope(
259
- applyScopePatch(this.startupScope, { labels: { nodeId: this.getLogNodeId() } })
260
- );
288
+ const logger = createLogger({
289
+ scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
290
+ });
261
291
  logger.debug("shutdown 已在進行,跳過重複調用", {
262
- topic: "node",
292
+ topic: LOG_TOPIC_NODE,
263
293
  data: { trigger: options?.trigger ?? "unknown" },
264
294
  });
265
295
  return this.shutdownPromise;
@@ -267,11 +297,11 @@ abstract class BaseNodeRuntime {
267
297
 
268
298
  this.isRunning = false;
269
299
  this.shutdownPromise = this.runShutdown(options?.trigger).catch((error) => {
270
- const { logger } = logManager.withScope(
271
- applyScopePatch(this.startupScope, { labels: { nodeId: this.getLogNodeId() } })
272
- );
300
+ const logger = createLogger({
301
+ scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
302
+ });
273
303
  logger.error("shutdown 流程異常", {
274
- topic: "node",
304
+ topic: LOG_TOPIC_NODE,
275
305
  data: {
276
306
  trigger: options?.trigger ?? "explicit",
277
307
  error: getErrorMessage(error),
@@ -283,22 +313,22 @@ abstract class BaseNodeRuntime {
283
313
  }
284
314
 
285
315
  private async runShutdown(trigger?: string): Promise<void> {
286
- const { logger } = logManager.withScope(
287
- applyScopePatch(this.startupScope, { labels: { nodeId: this.getLogNodeId() } })
288
- );
316
+ const logger = createLogger({
317
+ scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),
318
+ });
289
319
 
290
- logger.info("正在關閉節點進程", {
291
- topic: "node",
320
+ logger.debug("正在關閉節點進程", {
321
+ topic: LOG_TOPIC_NODE,
292
322
  data: { trigger: trigger ?? "explicit" },
293
323
  });
294
324
 
295
325
  if (this.localNodeId == null) {
296
- logger.info("本地節點未註冊,直接退出", { topic: "node" });
326
+ logger.warn("本地節點未註冊,進程退出", { topic: LOG_TOPIC_NODE });
297
327
  process.exit(0);
298
328
  return;
299
329
  }
300
330
 
301
- logger.info("正在登出節點", { topic: "node", data: { nodeId: this.localNodeId } });
331
+ logger.debug("正在登出節點", { topic: LOG_TOPIC_NODE, data: { nodeId: this.localNodeId } });
302
332
  try {
303
333
  const { error } = await patchStopNode({
304
334
  nodeId: this.localNodeId,
@@ -307,30 +337,29 @@ abstract class BaseNodeRuntime {
307
337
  if (error) {
308
338
  throw new Error(`patchStopNode 失敗: ${error.message}`);
309
339
  }
310
- logger.success("節點已登出", { topic: "node" });
340
+ logger.success("節點正常關閉,進程退出", { topic: LOG_TOPIC_NODE });
311
341
  } catch (error) {
312
- logger.critical("登出節點失敗", {
313
- topic: "node",
342
+ logger.critical("登出節點失敗,進程退出", {
343
+ topic: LOG_TOPIC_NODE,
314
344
  data: { error: getErrorMessage(error) },
315
345
  });
316
346
  } finally {
317
- logger.info("節點進程退出", { topic: "node" });
318
347
  process.exit(0);
319
348
  }
320
349
  }
321
350
 
322
351
  async heartbeat(ctx: NodeLoopContext): Promise<boolean> {
323
352
  const { loopTraceId, nodeId } = ctx;
324
- const { logger } = logManager.withScope(
325
- scopeForNodeLoop({
353
+ const logger = createLogger({
354
+ scope: createScope({
326
355
  module: "heartbeat",
327
356
  traceId: loopTraceId,
328
- nodeId,
329
- traceParentId: this.startupTraceId,
330
- })
331
- );
357
+ labels: { nodeId },
358
+ }),
359
+ minLevel: this.loopLoggerMinLevel(),
360
+ });
332
361
 
333
- logger.info("開始發送心跳", { topic: "node" });
362
+ logger.debug("開始發送心跳", { topic: LOG_TOPIC_NODE });
334
363
  let error: { message: string } | undefined;
335
364
  let lastHeartBeat: number | null | undefined;
336
365
  try {
@@ -351,19 +380,19 @@ abstract class BaseNodeRuntime {
351
380
  };
352
381
  if (failureCount >= BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD) {
353
382
  logger.critical("連續心跳失敗達上限,準備關閉節點", {
354
- topic: "node",
383
+ topic: LOG_TOPIC_NODE,
355
384
  data: logData,
356
385
  });
357
386
  this.requestShutdown("heartbeat:consecutive-failures");
358
387
  } else {
359
- logger.warn("心跳更新失敗", { topic: "node", data: logData });
388
+ logger.warn("心跳更新失敗", { topic: LOG_TOPIC_NODE, data: logData });
360
389
  }
361
390
  return false;
362
391
  }
363
392
 
364
393
  this.consecutiveHeartbeatFailures = 0;
365
394
  logger.success("心跳更新成功", {
366
- topic: "node",
395
+ topic: LOG_TOPIC_NODE,
367
396
  data: { lastHeartBeat: formatHeartbeat(lastHeartBeat) },
368
397
  });
369
398
  return true;
@@ -371,54 +400,52 @@ abstract class BaseNodeRuntime {
371
400
 
372
401
  async batchCommand(ctx: NodeLoopContext): Promise<void> {
373
402
  const { loopTraceId, nodeId } = ctx;
374
- const { logger } = logManager.withScope(
375
- scopeForNodeLoop({
403
+ const cmdLogger = createLogger({
404
+ scope: createScope({
376
405
  module: "batchCommand",
377
406
  traceId: loopTraceId,
378
- nodeId,
379
- traceParentId: this.startupTraceId,
380
- })
381
- );
382
-
383
- logger.debug("開始檢查控制指令", { topic: "node" });
407
+ labels: { nodeId },
408
+ }),
409
+ minLevel: this.loopLoggerMinLevel(),
410
+ });
384
411
 
412
+ cmdLogger.debug("開始檢查控制指令", { topic: LOG_TOPIC_COMMAND });
385
413
  const { data: commandList = [], error: pollError } = await getPollCommandList({
386
414
  nodeId,
387
415
  traceId: loopTraceId,
388
416
  size: MAX_POLL_TARGET_LIST_SIZE,
389
417
  });
390
418
  if (pollError) {
391
- logger.warn("獲取指令失敗", {
392
- topic: "node",
419
+ cmdLogger.warn("獲取指令失敗", {
420
+ topic: LOG_TOPIC_COMMAND,
393
421
  data: { error: pollError.message },
394
422
  });
395
423
  return;
396
424
  }
397
425
  if (commandList.length === 0) {
398
- logger.info("獲取指令數量為 0", { topic: "node" });
426
+ cmdLogger.debug("獲取指令數量為0 無需執行", { topic: LOG_TOPIC_COMMAND });
399
427
  return;
400
428
  }
401
-
402
- logger.info("獲取到控制指令", {
403
- topic: "node",
404
- data: { count: commandList.length },
429
+ cmdLogger.debug(`獲取到控制指令數量為${commandList.length}`, {
430
+ topic: LOG_TOPIC_COMMAND,
431
+ data: { count: commandList.length, commandList: commandList.map((command) => command.name) },
405
432
  });
406
433
 
407
434
  for (const command of commandList) {
408
435
  const cmd = command.name;
409
- logger.info("執行控制指令", {
410
- topic: "node",
436
+ cmdLogger.info("執行控制指令", {
437
+ topic: LOG_TOPIC_COMMAND,
411
438
  data: { commandId: command.id, cmd },
412
439
  });
413
440
  try {
414
- await this.executeCommand(cmd);
415
- logger.success("控制指令執行成功", {
416
- topic: "node",
441
+ await this.executeCommand(cmd, ctx);
442
+ cmdLogger.success("控制指令執行成功", {
443
+ topic: LOG_TOPIC_COMMAND,
417
444
  data: { commandId: command.id, cmd },
418
445
  });
419
446
  } catch (error) {
420
- logger.warn("控制指令執行失敗", {
421
- topic: "node",
447
+ cmdLogger.warn("控制指令執行失敗", {
448
+ topic: LOG_TOPIC_COMMAND,
422
449
  data: {
423
450
  commandId: command.id,
424
451
  cmd,
@@ -428,22 +455,26 @@ abstract class BaseNodeRuntime {
428
455
  }
429
456
  }
430
457
 
431
- logger.info("控制指令批次處理完成", {
432
- topic: "node",
433
- data: { totalDequeued: commandList.length },
458
+ cmdLogger.debug("控制指令批次處理完成", {
459
+ topic: LOG_TOPIC_COMMAND,
434
460
  });
435
461
  }
436
462
 
437
- async executeCommand(cmd: CommandType): Promise<void> {
438
- switch (cmd) {
439
- case CommandType.STOP_NODE:
440
- this.requestShutdown("cmd:STOP_NODE");
441
- return;
442
- default: {
443
- const unknownCmd: never = cmd;
444
- throw new Error(`無法解析的cmd: ${unknownCmd}`);
445
- }
463
+ /** Shared commands, then {@link resolveNodeCommand} for subclass-specific handling. */
464
+ protected async executeCommand(cmd: CommandType, ctx: NodeLoopContext): Promise<void> {
465
+ if (cmd === CommandType.STOP_NODE) {
466
+ this.requestShutdown("cmd:STOP_NODE");
467
+ return;
446
468
  }
469
+ await this.resolveNodeCommand(cmd, ctx);
470
+ }
471
+
472
+ /**
473
+ * Hook: handle node-type-specific {@link CommandType} values.
474
+ * Default rejects anything not handled in {@link executeCommand}.
475
+ */
476
+ protected async resolveNodeCommand(cmd: CommandType, _ctx: NodeLoopContext): Promise<void> {
477
+ throw new Error(`無法解析的 cmd: ${cmd}`);
447
478
  }
448
479
  }
449
480
 
@@ -1,10 +1,11 @@
1
- import { createTarget, QueryFilter, updateTargetDetails, validateWithSchema } from "../core.api";
2
- import { generateResponse } from "../core.interface";
3
- import { createApiLogger } from "../shared/log";
4
1
  import { z } from "zod";
5
- import { CategoryNode, Node, NodeDetails, NodeStatus } from "./node.interface";
2
+ import { createTarget, type QueryFilter, updateTargetDetails, validateWithSchema } from "../core.api";
3
+ import { generateResponse } from "../core.interface";
4
+ import { createLogger } from "../shared/log";
5
+ import { CategoryNode, type Node, type NodeDetails, NodeStatus } from "./node.interface";
6
6
 
7
7
  const NODE_STATUS_FIELD = "details->>status" as const;
8
+ const LOG_TOPIC_NODE = "node";
8
9
 
9
10
  const nodeIdSchema = z.string().trim().min(1);
10
11
  const traceIdSchema = z.string().trim().min(1).optional();
@@ -51,7 +52,7 @@ function lockOnNodeStatus(status: NodeStatus): QueryFilter[] {
51
52
 
52
53
  export const postRegisterNode = validateWithSchema(
53
54
  postRegisterNodeSchema,
54
- "postRegisterNodeSchema"
55
+ "postRegisterNodeSchema",
55
56
  )(async (payload) => {
56
57
  return createTarget<Node, PostRegisterNodePayload>({
57
58
  payload,
@@ -76,7 +77,7 @@ export const postRegisterNode = validateWithSchema(
76
77
 
77
78
  export const patchNodeHeartBeat = validateWithSchema(
78
79
  patchNodeHeartBeatSchema,
79
- "patchNodeHeartBeatSchema"
80
+ "patchNodeHeartBeatSchema",
80
81
  )(async ({ nodeId }) => {
81
82
  const lastHeartBeat = Date.now();
82
83
  await updateTargetDetails<Node, NodeDetails>({
@@ -93,7 +94,7 @@ export const patchNodeHeartBeat = validateWithSchema(
93
94
 
94
95
  export const patchStopNode = validateWithSchema(
95
96
  patchStopNodeSchema,
96
- "patchStopNodeSchema"
97
+ "patchStopNodeSchema",
97
98
  )(async ({ nodeId }) => {
98
99
  const lastHeartBeat = Date.now();
99
100
  // TODO 等待任務全部完成才下綫 應該先使用NodeStatus.DRAINING
@@ -112,9 +113,9 @@ export const patchStopNode = validateWithSchema(
112
113
 
113
114
  export const patchChangeNodeStatus = validateWithSchema(
114
115
  patchChangeNodeStatusSchema,
115
- "patchChangeNodeStatusSchema"
116
+ "patchChangeNodeStatusSchema",
116
117
  )(async ({ nodeId, status, fromStatus, traceId }) => {
117
- const logger = createApiLogger("patchChangeNodeStatus", { traceId, labels: { nodeId } });
118
+ const logger = createLogger({ module: "patchChangeNodeStatus", traceId, labels: { nodeId } });
118
119
 
119
120
  const data = await updateTargetDetails<Node, NodeDetails>({
120
121
  id: nodeId,
@@ -127,7 +128,7 @@ export const patchChangeNodeStatus = validateWithSchema(
127
128
  });
128
129
 
129
130
  logger.info("节点状态更新成功", {
130
- topic: "node",
131
+ topic: LOG_TOPIC_NODE,
131
132
  data: {
132
133
  nodeId,
133
134
  status,
@@ -1,4 +1,4 @@
1
- import { Target } from "../core.interface";
1
+ import type { Target } from "../core.interface";
2
2
 
3
3
  export enum NodeStatus {
4
4
  /** Registered, not yet in worker loop. */
@@ -30,11 +30,4 @@ export interface NodeDetails {
30
30
  manifestVersion: number;
31
31
  status: NodeStatus;
32
32
  lastHeartBeat: number;
33
- };
34
-
35
- /** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */
36
- export interface NodeLoopContext {
37
- loopTraceId: string;
38
- nodeId: string;
39
33
  }
40
-
@@ -33,4 +33,4 @@ export const formatHeartbeat = (timestamp: number): string => {
33
33
  const absolute = formatTimestamp(timestamp);
34
34
  const relative = formatRelativeTime(timestamp);
35
35
  return `${absolute} (${relative})`;
36
- };
36
+ };
@@ -0,0 +1,48 @@
1
+ import { resolve } from "node:path";
2
+ import { validateLogPersistPreloadEnv } from "../../shared/log/enable-log-persist";
3
+ import { logPersistEnabledFromEnv } from "../../shared/log/log-persist.config";
4
+ import { loadEnvFiles } from "../env/load-env";
5
+ import { resolveProjectRootByPackageName } from "../env/project-root";
6
+ import type { ServicePreloadOptions } from "./service-preload.interface";
7
+
8
+ function applyServiceEnvDefaults(projectRoot: string, options: ServicePreloadOptions): void {
9
+ if (!logPersistEnabledFromEnv()) {
10
+ return;
11
+ }
12
+
13
+ const service = process.env.LOG_PERSIST_SERVICE?.trim();
14
+ if (service == null || service === "") {
15
+ process.env.LOG_PERSIST_SERVICE = options.serviceValue;
16
+ }
17
+
18
+ const runtimeDir = process.env.RUNTIME_DATA_DIR?.trim();
19
+ if (runtimeDir == null || runtimeDir === "") {
20
+ const relative = options.runtimeDataDirRelative ?? "data/runtime";
21
+ process.env.RUNTIME_DATA_DIR = resolve(projectRoot, relative);
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Unified Node `--import` preload runner (sync only).
27
+ *
28
+ * Phase 1 — Resolve project root from service package name
29
+ * Phase 2 — Load `.env.local` / `.env`
30
+ * Phase 3 — Apply SDK service env defaults + optional L3 hook
31
+ * Phase 4 — Validate log-persist env when enabled
32
+ * Phase 5 — Process diagnostics (TODO)
33
+ *
34
+ * Supabase init and log-persist enable stay in app `main()` (async).
35
+ */
36
+ export function runServicePreload(options: ServicePreloadOptions): void {
37
+ const projectRoot = resolveProjectRootByPackageName(options.callerImportMetaUrl, options.packageName);
38
+
39
+ loadEnvFiles(projectRoot, { afterLoad: options.afterLoadEnv });
40
+
41
+ applyServiceEnvDefaults(projectRoot, options);
42
+ options.applyEnvDefaults?.(projectRoot);
43
+
44
+ validateLogPersistPreloadEnv();
45
+
46
+ // TODO: Phase 5 — optional unhandledRejection / uncaughtException formatters
47
+ // (formerly watch-service preload-diagnostics.mjs)
48
+ }
@@ -0,0 +1,14 @@
1
+ export interface ServicePreloadOptions {
2
+ /** `import.meta.url` from the service `scripts/preload.mjs`. */
3
+ callerImportMetaUrl: string;
4
+ /** package.json `name` — for resolveProjectRootByPackageName. */
5
+ packageName: string;
6
+ /** LOG_PERSIST_SERVICE default when persistence enabled. */
7
+ serviceValue: string;
8
+ /** Relative to project root; default `data/runtime`. */
9
+ runtimeDataDirRelative?: string;
10
+ /** Passed to loadEnvFiles `afterLoad`. */
11
+ afterLoadEnv?: () => void;
12
+ /** L3 hook after SDK defaults (legacy aliases, etc.). */
13
+ applyEnvDefaults?: (projectRoot: string) => void;
14
+ }
@@ -0,0 +1,8 @@
1
+ export type {
2
+ ManagedChildProcessesOptions,
3
+ SpawnChildResult,
4
+ StopAllChildrenOptions,
5
+ } from "./managed-child-processes";
6
+ export { ManagedChildProcesses } from "./managed-child-processes";
7
+ export type { BuildNodeImportArgsInput, SpawnTsxChildOptions } from "./process-spawn";
8
+ export { buildNodeImportArgs, isChildProcessRunning, spawnTsxChild } from "./process-spawn";