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,103 @@
1
+ import { z } from "zod";
2
+ import { createTarget, deleteTarget, getTarget, validateWithSchema } from "../core.api";
3
+ import { CategoryParcel, type Parcel, type ParcelDetails } from "./parcel.interface";
4
+
5
+ const parcelIdSchema = z.string().trim().min(1);
6
+
7
+ const chunkSchema = z.object({
8
+ index: z.number().int().nonnegative(),
9
+ size: z.number().int().nonnegative(),
10
+ checksum: z.string().trim().min(1),
11
+ url: z.string().trim().min(1),
12
+ provider: z.string().optional(),
13
+ });
14
+
15
+ const parcelCryptoSchema = z.object({
16
+ enabled: z.boolean(),
17
+ algorithm: z.string().optional(),
18
+ iv: z.string().optional(),
19
+ keyDerivation: z.string().optional(),
20
+ salt: z.string().optional(),
21
+ pbkdf2Iterations: z.number().int().positive().optional(),
22
+ });
23
+
24
+ export const parcelDetailsSchema = z.object({
25
+ manifestVersion: z.number().int().nonnegative(),
26
+ chunkList: z.array(chunkSchema).min(1),
27
+ checksum: z.string().trim().min(1),
28
+ size: z.number().int().nonnegative(),
29
+ preview: z.string().optional(),
30
+ crypto: parcelCryptoSchema.optional(),
31
+ });
32
+
33
+ export const postParcelSchema = z.object({
34
+ name: z.string().trim().min(1),
35
+ value: z.string().trim().min(1),
36
+ details: parcelDetailsSchema,
37
+ tagList: z.array(z.string()).optional().default([]),
38
+ extra: z.string().optional(),
39
+ });
40
+
41
+ export type PostParcelPayload = z.infer<typeof postParcelSchema>;
42
+
43
+ export const getParcelSchema = z.object({
44
+ id: parcelIdSchema,
45
+ });
46
+
47
+ export type GetParcelPayload = z.infer<typeof getParcelSchema>;
48
+
49
+ export const deleteParcelSchema = z.object({
50
+ id: parcelIdSchema,
51
+ });
52
+
53
+ export type DeleteParcelPayload = z.infer<typeof deleteParcelSchema>;
54
+
55
+ const parcelCategoryFilter = {
56
+ field: "category",
57
+ operator: "eq" as const,
58
+ value: CategoryParcel.PARCEL,
59
+ };
60
+
61
+ /** Persist a Parcel row (`category=parcel`) after chunks are uploaded via {@link ParcelManager.save}. */
62
+ export const postParcel = validateWithSchema(
63
+ postParcelSchema,
64
+ "postParcelSchema",
65
+ )(async ({ name, value, details, tagList, extra }) => {
66
+ return createTarget<Parcel, PostParcelPayload>({
67
+ payload: { name, value, details, tagList, extra },
68
+ createFn: () => ({
69
+ name,
70
+ value,
71
+ category: CategoryParcel.PARCEL,
72
+ tagList,
73
+ extra,
74
+ details: details as ParcelDetails,
75
+ }),
76
+ });
77
+ });
78
+
79
+ /** Fetch a Parcel by id (`category=parcel`). */
80
+ export const getParcel = validateWithSchema(
81
+ getParcelSchema,
82
+ "getParcelSchema",
83
+ )(async ({ id }) => {
84
+ const result = await getTarget({
85
+ id,
86
+ filterList: [parcelCategoryFilter],
87
+ });
88
+ return {
89
+ ...result,
90
+ data: result.data as Parcel,
91
+ };
92
+ });
93
+
94
+ /** Delete a Parcel row by id (`category=parcel`). Does not remove chunk blobs from storage providers. */
95
+ export const deleteParcel = validateWithSchema(
96
+ deleteParcelSchema,
97
+ "deleteParcelSchema",
98
+ )(async ({ id }) => {
99
+ return deleteTarget({
100
+ id,
101
+ filterList: [parcelCategoryFilter],
102
+ });
103
+ });
@@ -1,40 +1,61 @@
1
- import { Target } from "../core.interface";
1
+ import type { Target } from "../core.interface";
2
+
3
+ export enum CategoryParcel {
4
+ PARCEL = "parcel",
5
+ }
2
6
 
3
7
  export interface Parcel extends Target {
4
- category: CategoryParcel;
5
- details: ParcelDetails;
8
+ /** Human readable name */
9
+ name: string;
10
+ /** Used to search the parcel, should be unique */
11
+ value: string;
12
+ category: CategoryParcel;
13
+ details: ParcelDetails;
6
14
  }
7
15
 
8
- export enum CategoryParcel {
9
- PARCEL = "parcel",
16
+ export interface ParcelCrypto {
17
+ /** 未設置或 false → 明文分片 */
18
+ enabled: boolean;
19
+ /** 例如 "AES-GCM-256";enabled 時必填 */
20
+ algorithm?: string;
21
+ /** Base64 IV;AES-GCM 時必填 */
22
+ iv?: string;
23
+ /** 口令派生密鑰時的 KDF,例如 "PBKDF2-SHA256" */
24
+ keyDerivation?: string;
25
+ /** PBKDF2 salt(Base64);keyDerivation 為 PBKDF2 時必填 */
26
+ salt?: string;
27
+ /** PBKDF2 迭代次數;未設置時由 SDK 默認 */
28
+ pbkdf2Iterations?: number;
10
29
  }
11
30
 
12
31
  export interface ParcelDetails {
13
- manifestVersion: number;
14
- chunkList: Chunk[];
15
- /** sha256 */
16
- checksum: string;
17
- size: number;
32
+ manifestVersion: number;
33
+ chunkList: Chunk[];
34
+ /** 還原後的明文 sha256 */
35
+ checksum: string;
36
+ /** 還原後的明文大小(字節) */
37
+ size: number;
38
+ preview?: string;
39
+ crypto?: ParcelCrypto;
18
40
  }
19
41
 
20
42
  export enum LifecycleStatus {
21
- STORED = "STORED",
22
- SOFT_DELETED = "SOFT_DELETED",
23
- HARD_DELETED = "HARD_DELETED",
43
+ STORED = "STORED",
44
+ SOFT_DELETED = "SOFT_DELETED",
45
+ HARD_DELETED = "HARD_DELETED",
24
46
  }
25
47
 
26
48
  export interface Lifecycle {
27
- status: LifecycleStatus;
28
- storedAt: string;
29
- softDeletedAt: string | null;
30
- hardDeletedAt: string | null;
49
+ status: LifecycleStatus;
50
+ storedAt: string;
51
+ softDeletedAt: string | null;
52
+ hardDeletedAt: string | null;
31
53
  }
32
54
 
33
55
  export interface Chunk {
34
- index: number;
35
- /** TODO Storage service provider */
36
- // shardKey: string;
37
- size: number;
38
- checksum: string;
39
- url: string;
56
+ index: number;
57
+ size: number;
58
+ checksum: string; // 該 chunk 字節的 sha256(明文或密文,與 create 時一致)
59
+ url: string;
60
+ provider?: string; // 對應 StorageAdapter / 平台標識(呼應 TODO shardKey)
40
61
  }
@@ -0,0 +1,79 @@
1
+ import type { SupabaseResponse } from "../core.interface";
2
+ import { getParcel, postParcel } from "./parcel.api";
3
+ import type { Parcel } from "./parcel.interface";
4
+ import { type CreateOptions, ParcelManager, type ReassembleOptions, type StorageAdapter } from "./parcel-manager";
5
+
6
+ export interface PublishParcelInput {
7
+ file: ArrayBuffer;
8
+ adapters: StorageAdapter[];
9
+ name: string;
10
+ value: string;
11
+ tagList?: string[];
12
+ extra?: string;
13
+ createOptions?: CreateOptions;
14
+ }
15
+
16
+ export interface PublishParcelResult {
17
+ parcel: Parcel;
18
+ /** Present when encrypted without passphrase — caller must persist outside Supabase */
19
+ key?: CryptoKey;
20
+ }
21
+
22
+ export interface RestoreParcelByIdInput {
23
+ id: string;
24
+ reassembleOptions?: ReassembleOptions;
25
+ }
26
+
27
+ export interface RestoreParcelByIdResult {
28
+ parcel: Parcel;
29
+ file: ArrayBuffer;
30
+ }
31
+
32
+ function requireResponseData<T>(response: SupabaseResponse<T>, label: string): T {
33
+ if (response.data == null) {
34
+ const suffix = response.message != null ? ` (${response.message})` : "";
35
+ throw new Error(`${label}: no data${suffix}`);
36
+ }
37
+ return response.data;
38
+ }
39
+
40
+ /**
41
+ * One-shot publish: split (optional encrypt) → upload chunks → persist Parcel row.
42
+ * Orchestrates {@link ParcelManager} + {@link postParcel}.
43
+ */
44
+ export async function publishParcel(input: PublishParcelInput): Promise<PublishParcelResult> {
45
+ const { file, adapters, name, value, tagList = [], extra, createOptions } = input;
46
+
47
+ const createResult = await ParcelManager.create(file, createOptions ?? {});
48
+ const draft = await ParcelManager.save(createResult, adapters, { name, value, tagList });
49
+
50
+ const response = await postParcel({
51
+ name: draft.name,
52
+ value: draft.value,
53
+ details: draft.details,
54
+ tagList: draft.tagList ?? [],
55
+ extra,
56
+ });
57
+
58
+ return {
59
+ parcel: requireResponseData(response, "postParcel"),
60
+ key: createResult.key,
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Reassemble file bytes from a {@link Parcel} (chunk URLs in details).
66
+ */
67
+ export async function restoreParcel(parcel: Parcel, reassembleOptions?: ReassembleOptions): Promise<ArrayBuffer> {
68
+ return ParcelManager.reassemble(parcel, reassembleOptions ?? {});
69
+ }
70
+
71
+ /**
72
+ * Fetch Parcel by id, then reassemble. Orchestrates {@link getParcel} + {@link restoreParcel}.
73
+ */
74
+ export async function restoreParcelById(input: RestoreParcelByIdInput): Promise<RestoreParcelByIdResult> {
75
+ const response = await getParcel({ id: input.id });
76
+ const parcel = requireResponseData(response, "getParcel");
77
+ const file = await restoreParcel(parcel, input.reassembleOptions);
78
+ return { parcel, file };
79
+ }
@@ -0,0 +1,49 @@
1
+ import { registerProviderChunkResolver } from "./chunk-fetch-registry";
2
+ import type { ProviderProbeResult, StorageProviderModule } from "./storage-provider.types";
3
+
4
+ export type ProviderProbeMap = Record<string, ProviderProbeResult | { ok: true; detail: { skipped: true } }>;
5
+
6
+ export interface StorageProviderRegistry {
7
+ register(module: StorageProviderModule): void;
8
+ get(provider: string): StorageProviderModule;
9
+ has(provider: string): boolean;
10
+ list(): string[];
11
+ probeAll(): Promise<ProviderProbeMap>;
12
+ }
13
+
14
+ /** In-process registry for {@link StorageProviderModule}; syncs chunk resolvers on register. */
15
+ export function createStorageProviderRegistry(): StorageProviderRegistry {
16
+ const modules = new Map<string, StorageProviderModule>();
17
+
18
+ return {
19
+ register(module) {
20
+ modules.set(module.provider, module);
21
+ registerProviderChunkResolver(module);
22
+ },
23
+ get(provider) {
24
+ const found = modules.get(provider);
25
+ if (found == null) {
26
+ const available = [...modules.keys()].join(", ") || "(none)";
27
+ throw new Error(`Unknown storage provider: ${provider}. Registered: ${available}`);
28
+ }
29
+ return found;
30
+ },
31
+ has(provider) {
32
+ return modules.has(provider);
33
+ },
34
+ list() {
35
+ return [...modules.keys()];
36
+ },
37
+ async probeAll() {
38
+ const out: ProviderProbeMap = {};
39
+ for (const [name, module] of modules) {
40
+ if (module.probe == null) {
41
+ out[name] = { ok: true, detail: { skipped: true } };
42
+ continue;
43
+ }
44
+ out[name] = await module.probe();
45
+ }
46
+ return out;
47
+ },
48
+ };
49
+ }
@@ -0,0 +1,45 @@
1
+ import type { ChunkResolveProvider } from "./chunk-fetch-registry";
2
+ import type { Parcel } from "./parcel.interface";
3
+ import type { StorageAdapter } from "./parcel-manager";
4
+
5
+ export interface ProviderProbeOk {
6
+ ok: true;
7
+ detail?: Record<string, unknown>;
8
+ }
9
+
10
+ export interface ProviderProbeFail {
11
+ ok: false;
12
+ error: string;
13
+ }
14
+
15
+ export type ProviderProbeResult = ProviderProbeOk | ProviderProbeFail;
16
+
17
+ /** Best-effort rollback of partial uploads. */
18
+ export interface UploadTracker<THandle> {
19
+ readonly handles: THandle[];
20
+ push(handle: THandle): void;
21
+ }
22
+
23
+ export interface CreateUploadAdapterOptions {
24
+ /** Collect rollback handles during upload (partial-failure cleanup). */
25
+ tracker?: UploadTracker<unknown>;
26
+ }
27
+
28
+ /** Full storage backend module: upload, restore, probe, rollback. */
29
+ export interface StorageProviderModule extends ChunkResolveProvider {
30
+ createUploadAdapter(options?: CreateUploadAdapterOptions): StorageAdapter;
31
+ probe?(): Promise<ProviderProbeResult>;
32
+ rollbackUpload?(handles: unknown[]): Promise<void>;
33
+ /** Validate parcel before restore (provider mix, missing chunks). */
34
+ assertParcelRestorable?(parcel: Parcel): void;
35
+ }
36
+
37
+ export function createUploadTracker<THandle>(): UploadTracker<THandle> {
38
+ const handles: THandle[] = [];
39
+ return {
40
+ handles,
41
+ push(handle: THandle) {
42
+ handles.push(handle);
43
+ },
44
+ };
45
+ }
package/src/preload.ts ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Node `--import` entry — `target-supabase-sdk/preload`
3
+ * @see .cursor/skills/service-preload/SKILL.md
4
+ */
5
+
6
+ export { runServicePreload } from "./node/preload/run-service-preload";
7
+ export type { ServicePreloadOptions } from "./node/preload/service-preload.interface";
@@ -31,15 +31,14 @@ export function isTaskRepoContext(value: unknown): value is TaskRepoContext {
31
31
  export function normalizeRepoContextModule(
32
32
  moduleExports: unknown,
33
33
  taskTypeKey: string,
34
- exportName?: string
34
+ exportName?: string,
35
35
  ): TaskRepoContext | null {
36
36
  if (moduleExports == null) {
37
37
  return null;
38
38
  }
39
39
 
40
40
  const record = moduleExports as Record<string, unknown>;
41
- const namedExport =
42
- exportName != null && exportName !== "" ? record[exportName] : undefined;
41
+ const namedExport = exportName != null && exportName !== "" ? record[exportName] : undefined;
43
42
  const defaultExport = record.default;
44
43
  const candidate = namedExport ?? defaultExport ?? moduleExports;
45
44
 
@@ -103,7 +102,7 @@ export function getScriptLoadKey(script: TaskRepoScriptRecord): string {
103
102
  }
104
103
 
105
104
  export function assertScriptLoadable(
106
- details: TaskRepoScriptDetails
105
+ details: TaskRepoScriptDetails,
107
106
  ): details is TaskRepoScriptDetails & ({ source: string } | { modulePath: string }) {
108
107
  const hasSource = details.source != null && details.source.trim() !== "";
109
108
  const hasModulePath = details.modulePath != null && details.modulePath.trim() !== "";
@@ -1,21 +1,11 @@
1
- import { getPossibleTarget } from "../core.api";
2
- import { SupabaseInitializer } from "../supabase";
3
- import { LoggerWithContext } from "../shared/log/log-manager";
1
+ import { getPossibleTarget } from "../core.api";
2
+ import type { LoggerWithScope } from "../shared/log";
3
+ import { supabase } from "../supabase";
4
4
  import type { TaskRepoContext, TaskRepoScriptRecord } from "../task/task-repo-context";
5
5
  import { TASK_REPO_SCRIPT_CATEGORY } from "../task/task-repo-context";
6
- import {
7
- assertScriptLoadable,
8
- isTaskRepoContext,
9
- pickEntryScript,
10
- } from "./repo-context.utils";
11
- import { CategoryRepo, Repo } from "./repo.interface";
12
- import {
13
- clearRepoScriptModuleCache,
14
- loadRepoContextFromScript,
15
- loadRepoContextFromUrl,
16
- } from "./repo.script-loader";
17
-
18
- const supabase = SupabaseInitializer.getInstance();
6
+ import { CategoryRepo, type Repo } from "./repo.interface";
7
+ import { clearRepoScriptModuleCache, loadRepoContextFromScript, loadRepoContextFromUrl } from "./repo.script-loader";
8
+ import { assertScriptLoadable, isTaskRepoContext, pickEntryScript } from "./repo-context.utils";
19
9
 
20
10
  type LocalRepoEntry =
21
11
  | { kind: "context"; context: TaskRepoContext }
@@ -24,16 +14,31 @@ type LocalRepoEntry =
24
14
  const localRepoRegistry = new Map<string, LocalRepoEntry>();
25
15
  const remoteContextCache = new Map<string, TaskRepoContext>();
26
16
 
17
+ export type RepoContextFailureReason =
18
+ | "LOCAL_REPO_LOAD_FAILED"
19
+ | "LOCAL_REPO_NOT_FOUND"
20
+ | "REMOTE_REPO_NOT_FOUND"
21
+ | "REMOTE_REPO_LOAD_FAILED";
22
+
23
+ export type RepoContextResolvedVia = "local" | "remote";
24
+
27
25
  export interface GetRepoContextParams {
28
- logger: LoggerWithContext;
26
+ logger: LoggerWithScope;
29
27
  /** Task type key (`task.value`) — matches {@link Repo.value} for remote lookup; local registry key */
30
28
  taskTypeKey: string;
29
+ /**
30
+ * When false, skip Supabase fetch if the task type is not in the local registry.
31
+ * Default `true`.
32
+ */
33
+ includeRemote?: boolean;
31
34
  }
32
35
 
33
36
  export interface GetRepoContextResult<T extends TaskRepoContext = TaskRepoContext> {
34
37
  context: T | null;
35
38
  /** Present when `context` is null — import / DB / format failure at repo layer */
36
39
  error?: string;
40
+ failureReason?: RepoContextFailureReason;
41
+ resolvedVia?: RepoContextResolvedVia;
37
42
  }
38
43
 
39
44
  function buildRemoteCacheKey(taskTypeKey: string, contentHash: string): string {
@@ -65,9 +70,9 @@ async function fetchRemoteScripts(taskTypeKey: string): Promise<TaskRepoScriptRe
65
70
  }
66
71
 
67
72
  async function loadLocalEntry(
68
- logger: LoggerWithContext,
73
+ logger: LoggerWithScope,
69
74
  entry: LocalRepoEntry,
70
- taskTypeKey: string
75
+ taskTypeKey: string,
71
76
  ): Promise<TaskRepoContext | null> {
72
77
  if (entry.kind === "context") {
73
78
  return entry.context;
@@ -90,17 +95,14 @@ async function loadLocalEntry(
90
95
  return loaded?.context ?? null;
91
96
  }
92
97
 
93
- async function loadRemoteRepoContext(
94
- logger: LoggerWithContext,
95
- taskTypeKey: string
96
- ): Promise<GetRepoContextResult> {
97
- logger.info("從 Supabase 加載 Repo", { topic: "repo", context: { taskTypeKey } });
98
+ async function loadRemoteRepoContext(logger: LoggerWithScope, taskTypeKey: string): Promise<GetRepoContextResult> {
99
+ logger.info("從 Supabase 加載 Repo", { topic: "repo", data: { taskTypeKey } });
98
100
 
99
101
  const remoteRepo = await fetchRemoteRepo(taskTypeKey);
100
102
  if (remoteRepo == null) {
101
103
  const error = `Supabase 未找到 Repo (value=${taskTypeKey})`;
102
- logger.warn(error, { topic: "repo", context: { taskTypeKey } });
103
- return { context: null, error };
104
+ logger.warn(error, { topic: "repo", data: { taskTypeKey } });
105
+ return { context: null, error, failureReason: "REMOTE_REPO_NOT_FOUND" };
104
106
  }
105
107
 
106
108
  const repoUrl = remoteRepo.details?.url?.trim() ?? "";
@@ -108,8 +110,8 @@ async function loadRemoteRepoContext(
108
110
  const cacheKey = buildRemoteCacheKey(taskTypeKey, repoHash);
109
111
  const cached = remoteContextCache.get(cacheKey);
110
112
  if (cached != null) {
111
- logger.info("命中遠程 Repo 上下文緩存", { topic: "repo", context: { cacheKey } });
112
- return { context: cached };
113
+ logger.info("命中遠程 Repo 上下文緩存", { topic: "repo", data: { cacheKey } });
114
+ return { context: cached, resolvedVia: "remote" };
113
115
  }
114
116
 
115
117
  const scripts = await fetchRemoteScripts(taskTypeKey);
@@ -123,7 +125,7 @@ async function loadRemoteRepoContext(
123
125
  if (loaded == null && repoUrl !== "") {
124
126
  logger.info("未找到 script 行,嘗試從 Repo.details.url 加載", {
125
127
  topic: "repo",
126
- context: { taskTypeKey, url: repoUrl },
128
+ data: { taskTypeKey, url: repoUrl },
127
129
  });
128
130
  loaded = await loadRepoContextFromUrl({ logger, url: repoUrl, taskTypeKey });
129
131
  }
@@ -132,47 +134,55 @@ async function loadRemoteRepoContext(
132
134
  const error = `無法從 Repo 加載 TaskRepoContext (hasUrl=${repoUrl !== ""}, scriptCount=${scripts.length})`;
133
135
  logger.warn(error, {
134
136
  topic: "repo",
135
- context: { taskTypeKey, hasUrl: repoUrl !== "", scriptCount: scripts.length },
137
+ data: { taskTypeKey, hasUrl: repoUrl !== "", scriptCount: scripts.length },
136
138
  });
137
- return { context: null, error };
139
+ return { context: null, error, failureReason: "REMOTE_REPO_LOAD_FAILED" };
138
140
  }
139
141
 
140
142
  remoteContextCache.set(cacheKey, loaded.context);
141
- return { context: loaded.context };
143
+ return { context: loaded.context, resolvedVia: "remote" };
142
144
  }
143
145
 
144
146
  const getRepoContext = async <RepoContext extends TaskRepoContext>({
145
147
  logger,
146
148
  taskTypeKey,
149
+ includeRemote = true,
147
150
  }: GetRepoContextParams): Promise<GetRepoContextResult<RepoContext>> => {
148
151
  const localEntry = localRepoRegistry.get(taskTypeKey);
149
152
  if (localEntry != null) {
150
- logger.info("使用本地註冊的 Repo", { topic: "repo", context: { taskTypeKey } });
153
+ logger.info("使用本地註冊的 Repo", { topic: "repo", data: { taskTypeKey } });
151
154
  const context = await loadLocalEntry(logger, localEntry, taskTypeKey);
152
155
  if (context != null && isTaskRepoContext(context)) {
153
- return { context: context as RepoContext };
156
+ return { context: context as RepoContext, resolvedVia: "local" };
154
157
  }
155
158
  const error = "本地 Repo 模組加載失敗或未導出有效的 TaskRepoContext";
156
- logger.warn(error, { topic: "repo", context: { taskTypeKey } });
157
- return { context: null, error };
159
+ logger.warn(error, { topic: "repo", data: { taskTypeKey } });
160
+ return { context: null, error, failureReason: "LOCAL_REPO_LOAD_FAILED" };
161
+ }
162
+
163
+ if (!includeRemote) {
164
+ const error = `本地未註冊 Repo (value=${taskTypeKey})`;
165
+ logger.warn(error, { topic: "repo", data: { taskTypeKey, includeRemote: false } });
166
+ return { context: null, error, failureReason: "LOCAL_REPO_NOT_FOUND" };
158
167
  }
159
168
 
160
169
  try {
161
170
  const result = await loadRemoteRepoContext(logger, taskTypeKey);
162
171
  if (result.context != null && isTaskRepoContext(result.context)) {
163
- return { context: result.context as RepoContext };
172
+ return { context: result.context as RepoContext, resolvedVia: "remote" };
164
173
  }
165
174
  return {
166
175
  context: null,
167
176
  error: result.error ?? "遠程 Repo 上下文無效",
177
+ failureReason: result.failureReason ?? "REMOTE_REPO_LOAD_FAILED",
168
178
  };
169
179
  } catch (error) {
170
180
  const message = error instanceof Error ? error.message : String(error);
171
181
  logger.error("從 Supabase 加載 Repo 失敗", {
172
182
  topic: "repo",
173
- context: { taskTypeKey, error: message },
183
+ data: { taskTypeKey, error: message },
174
184
  });
175
- return { context: null, error: message };
185
+ return { context: null, error: message, failureReason: "REMOTE_REPO_LOAD_FAILED" };
176
186
  }
177
187
  };
178
188
 
@@ -196,6 +206,10 @@ function unregisterLocalRepo(taskTypeKey: string): void {
196
206
  localRepoRegistry.delete(taskTypeKey);
197
207
  }
198
208
 
209
+ function hasLocalRepo(taskTypeKey: string): boolean {
210
+ return localRepoRegistry.has(taskTypeKey);
211
+ }
212
+
199
213
  function getRegisteredLocalTaskTypeKeys(): string[] {
200
214
  return [...localRepoRegistry.keys()];
201
215
  }
@@ -209,6 +223,7 @@ const RepoManager = {
209
223
  registerLocalRepoContext,
210
224
  registerLocalModule,
211
225
  unregisterLocalRepo,
226
+ hasLocalRepo,
212
227
  getRegisteredLocalTaskTypeKeys,
213
228
  clearRemoteContextCache,
214
229
  clearRepoScriptModuleCache,
@@ -1,7 +1,7 @@
1
- import { scanTargetList, validateWithSchema } from "../core.api";
2
- import { generateResponse, SupabaseResponse } from "../core.interface";
3
1
  import { z } from "zod";
4
- import { CategoryRepo, Repo } from "./repo.interface";
2
+ import { scanTargetList, validateWithSchema } from "../core.api";
3
+ import { generateResponse, type SupabaseResponse } from "../core.interface";
4
+ import { CategoryRepo, type Repo } from "./repo.interface";
5
5
 
6
6
  const REPO_USAGE_FIELD = "details->>usage" as const;
7
7
 
@@ -16,7 +16,7 @@ export type GetScanRemoteRepoValuesPayload = z.infer<typeof getScanRemoteRepoVal
16
16
  * Returns `{ data: string[] }` on success; validation and DB failures use `{ error }` (never throws).
17
17
  */
18
18
  export const getScanRemoteRepoValues = async (
19
- payload: GetScanRemoteRepoValuesPayload
19
+ payload: GetScanRemoteRepoValuesPayload,
20
20
  ): Promise<SupabaseResponse<string[]>> => {
21
21
  try {
22
22
  return await getScanRemoteRepoValuesValidated(payload);
@@ -28,7 +28,7 @@ export const getScanRemoteRepoValues = async (
28
28
 
29
29
  const getScanRemoteRepoValuesValidated = validateWithSchema(
30
30
  getScanRemoteRepoValuesSchema,
31
- "getScanRemoteRepoValuesSchema"
31
+ "getScanRemoteRepoValuesSchema",
32
32
  )(async ({ usage }): Promise<SupabaseResponse<string[]>> => {
33
33
  try {
34
34
  const { data } = await scanTargetList<Repo>({
@@ -1,4 +1,4 @@
1
- import { Target } from "../core.interface";
1
+ import type { Target } from "../core.interface";
2
2
 
3
3
  export enum CategoryRepo {
4
4
  /** Project */
@@ -28,4 +28,3 @@ export interface RepoDetails {
28
28
  url: string;
29
29
  hash: string;
30
30
  }
31
-