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
@@ -0,0 +1,173 @@
1
+ import { scanTargetList } from "../core.api";
2
+ import { generateResponse, type SupabaseResponse } from "../core.interface";
3
+ import { createLogger } from "../shared/log";
4
+ import { ServiceLifecycleStatus } from "./base.interface";
5
+ import { getService } from "./service.api";
6
+ import { CategoryService, type Service } from "./service.interface";
7
+
8
+ export type {
9
+ EnumMembers,
10
+ FieldDefinition,
11
+ SchemaDefinition,
12
+ ServiceLifecycle,
13
+ } from "./base.interface";
14
+ export { ServiceLifecycleStatus } from "./base.interface";
15
+ export type { GetApiPayload, GetServicePayload, PostApiPayload, PostServicePayload } from "./service.api";
16
+ export {
17
+ apiDetailsSchema,
18
+ fieldDefinitionSchema,
19
+ getApi,
20
+ getApiSchema,
21
+ getService,
22
+ getServiceSchema,
23
+ postApi,
24
+ postApiSchema,
25
+ postService,
26
+ postServiceSchema,
27
+ schemaDefinitionSchema,
28
+ serviceDetailsSchema,
29
+ serviceLifecycleSchema,
30
+ } from "./service.api";
31
+ export type { Api, ApiDetails, Service, ServiceDetails } from "./service.interface";
32
+ export { ApiMethod, CategoryApi, CategoryService } from "./service.interface";
33
+
34
+ export interface DiscoverServiceInput {
35
+ /** {@link Service.value} */
36
+ value: string;
37
+ traceId?: string;
38
+ }
39
+
40
+ const DISCOVER_LIFECYCLE_STATUS = ServiceLifecycleStatus.ACTIVE;
41
+ const SERVICE_LIFECYCLE_STATUS_FIELD = "details->lifecycle->>status" as const;
42
+
43
+ async function lookupServicePrimary(value: string): Promise<Service | null> {
44
+ const response = await getService({ value, lifecycleStatus: DISCOVER_LIFECYCLE_STATUS });
45
+ return response.data ?? null;
46
+ }
47
+
48
+ async function lookupServiceByScan(value: string): Promise<Service | null> {
49
+ const { data } = await scanTargetList<Service>({
50
+ category: CategoryService.SERVICE,
51
+ orderBy: { field: "value", ascending: true },
52
+ maxRows: 1,
53
+ filterList: [
54
+ { field: "value", operator: "eq", value },
55
+ {
56
+ field: SERVICE_LIFECYCLE_STATUS_FIELD,
57
+ operator: "eq",
58
+ value: DISCOVER_LIFECYCLE_STATUS,
59
+ },
60
+ ],
61
+ });
62
+
63
+ return data?.[0] ?? null;
64
+ }
65
+
66
+ async function resolveDiscoverFailureReason(value: string): Promise<"not-found" | "not-available"> {
67
+ const response = await getService({ value });
68
+ if (response.data == null) {
69
+ return "not-found";
70
+ }
71
+ return "not-available";
72
+ }
73
+
74
+ /**
75
+ * Discover a single service by {@link Service.value}.
76
+ * Only returns services with `lifecycle.status === ACTIVE` (filtered at query time).
77
+ *
78
+ * Lookup: primary `getService` → fallback `scanTargetList` by value.
79
+ */
80
+ export async function discoverService(input: DiscoverServiceInput): Promise<SupabaseResponse<Service>> {
81
+ const value = input.value.trim();
82
+ const logger = createLogger({
83
+ module: "discoverService",
84
+ traceId: input.traceId,
85
+ labels: { serviceValue: value },
86
+ });
87
+
88
+ if (value === "") {
89
+ const message = "discoverService: value must not be empty";
90
+ logger.warn(message, { topic: "service", data: { value: input.value } });
91
+ return generateResponse.error(message, undefined, "SERVICE_VALUE_REQUIRED") as SupabaseResponse<Service>;
92
+ }
93
+
94
+ try {
95
+ logger.info("开始发现服务", {
96
+ topic: "service",
97
+ data: { value, lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
98
+ });
99
+
100
+ let service = await lookupServicePrimary(value);
101
+ let source: "primary" | "scan" = "primary";
102
+
103
+ if (service == null) {
104
+ logger.warn("主路径未命中,尝试 catalog 扫描回退", {
105
+ topic: "service",
106
+ data: { value, step: "scan-fallback", lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
107
+ });
108
+ service = await lookupServiceByScan(value);
109
+ source = "scan";
110
+ }
111
+
112
+ if (service == null) {
113
+ const reason = await resolveDiscoverFailureReason(value);
114
+ if (reason === "not-available") {
115
+ const message = `Service ${value} is not available (lifecycle is not ACTIVE)`;
116
+ logger.warn("服务已注册但不可用", {
117
+ topic: "service",
118
+ data: { value, step: "not-available", lifecycleStatus: DISCOVER_LIFECYCLE_STATUS },
119
+ });
120
+ return generateResponse.error(message, undefined, "SERVICE_NOT_AVAILABLE") as SupabaseResponse<Service>;
121
+ }
122
+
123
+ const message = `Service not found: ${value}`;
124
+ logger.error("服务未发现", {
125
+ topic: "service",
126
+ data: { value, step: "not-found", tried: ["primary", "scan"] },
127
+ });
128
+ return generateResponse.error(message, undefined, "SERVICE_NOT_FOUND") as SupabaseResponse<Service>;
129
+ }
130
+
131
+ logger.info("服务发现成功", {
132
+ topic: "service",
133
+ data: {
134
+ value,
135
+ source,
136
+ serviceId: service.id,
137
+ lifecycleStatus: service.details.lifecycle.status,
138
+ apiKeyCount: service.details.apiKeys.length,
139
+ dependencyCount: service.details.dependencies.length,
140
+ },
141
+ });
142
+
143
+ return generateResponse.success(service);
144
+ } catch (error) {
145
+ const message = error instanceof Error ? error.message : String(error);
146
+ logger.error("服务发现失败", {
147
+ topic: "service",
148
+ data: { value, message },
149
+ });
150
+
151
+ let service: Service | null = null;
152
+ try {
153
+ service = await lookupServiceByScan(value);
154
+ } catch (fallbackError) {
155
+ const fallbackMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
156
+ logger.error("扫描回退失败", {
157
+ topic: "service",
158
+ data: { value, message: fallbackMessage },
159
+ });
160
+ return generateResponse.error(message, undefined, "SERVICE_DISCOVER_FAILED") as SupabaseResponse<Service>;
161
+ }
162
+
163
+ if (service != null) {
164
+ logger.warn("主路径异常后扫描回退成功", {
165
+ topic: "service",
166
+ data: { value, serviceId: service.id, primaryError: message },
167
+ });
168
+ return generateResponse.success(service);
169
+ }
170
+
171
+ return generateResponse.error(message, undefined, "SERVICE_DISCOVER_FAILED") as SupabaseResponse<Service>;
172
+ }
173
+ }
@@ -0,0 +1,294 @@
1
+ import { z } from "zod";
2
+ import { createTarget, getPossibleTarget, getTarget, type QueryFilter, validateWithSchema } from "../core.api";
3
+ import { type FieldDefinition, type SchemaDefinition, ServiceLifecycleStatus } from "./base.interface";
4
+ import {
5
+ type Api,
6
+ type ApiDetails,
7
+ ApiMethod,
8
+ CategoryApi,
9
+ CategoryService,
10
+ type Service,
11
+ type ServiceDetails,
12
+ } from "./service.interface";
13
+
14
+ const targetIdSchema = z.string().trim().min(1);
15
+
16
+ const enumMemberSchema = z.object({
17
+ key: z.string().trim().min(1),
18
+ value: z.string(),
19
+ });
20
+
21
+ const fieldPresenceSchema = z.object({
22
+ nullable: z.boolean(),
23
+ optional: z.boolean(),
24
+ });
25
+
26
+ const schemaDefinitionSchema: z.ZodType<SchemaDefinition> = z.lazy(() =>
27
+ z.discriminatedUnion("type", [
28
+ fieldPresenceSchema.extend({
29
+ type: z.literal("string"),
30
+ min: z.number().optional(),
31
+ max: z.number().optional(),
32
+ regex: z.string().optional(),
33
+ default: z.string().optional(),
34
+ }),
35
+ fieldPresenceSchema.extend({
36
+ type: z.literal("number"),
37
+ min: z.number().optional(),
38
+ max: z.number().optional(),
39
+ default: z.number().optional(),
40
+ }),
41
+ fieldPresenceSchema.extend({
42
+ type: z.literal("boolean"),
43
+ default: z.boolean().optional(),
44
+ }),
45
+ fieldPresenceSchema.extend({
46
+ type: z.literal("unknown"),
47
+ default: z.unknown().optional(),
48
+ }),
49
+ fieldPresenceSchema.extend({
50
+ type: z.literal("enum"),
51
+ members: z.array(enumMemberSchema).min(1),
52
+ defaultKey: z.string().trim().min(1).optional(),
53
+ }),
54
+ fieldPresenceSchema.extend({
55
+ type: z.literal("object"),
56
+ fields: z.array(fieldDefinitionSchema),
57
+ default: z.record(z.unknown()).optional(),
58
+ }),
59
+ fieldPresenceSchema.extend({
60
+ type: z.literal("array"),
61
+ items: schemaDefinitionSchema,
62
+ min: z.number().int().nonnegative().optional(),
63
+ max: z.number().int().nonnegative().optional(),
64
+ default: z.unknown().optional(),
65
+ }),
66
+ ]),
67
+ );
68
+
69
+ const fieldDefinitionSchema: z.ZodType<FieldDefinition> = z.intersection(
70
+ z.object({ fieldName: z.string().trim().min(1) }),
71
+ schemaDefinitionSchema,
72
+ );
73
+
74
+ export { fieldDefinitionSchema, schemaDefinitionSchema };
75
+
76
+ export const serviceLifecycleSchema = z.object({
77
+ status: z.nativeEnum(ServiceLifecycleStatus),
78
+ activeSince: z.string().trim().min(1),
79
+ deprecatedAt: z.string().nullable(),
80
+ sunsetAt: z.string().nullable(),
81
+ });
82
+
83
+ export const apiDetailsSchema = z.object({
84
+ method: z.nativeEnum(ApiMethod),
85
+ path: z.string().trim().min(1),
86
+ endpoint: z.string().trim().min(1),
87
+ request: z.object({
88
+ query: z.array(fieldDefinitionSchema),
89
+ }),
90
+ response: z.object({
91
+ "200": z.array(fieldDefinitionSchema),
92
+ }),
93
+ manifestVersion: z.number().int().nonnegative(),
94
+ lifecycle: serviceLifecycleSchema,
95
+ });
96
+
97
+ export const serviceDetailsSchema = z.object({
98
+ manifestVersion: z.number().int().nonnegative(),
99
+ apiKeys: z.array(z.string().trim().min(1)),
100
+ dependencies: z.array(z.string().trim().min(1)).default([]),
101
+ lifecycle: serviceLifecycleSchema,
102
+ });
103
+
104
+ export const postApiSchema = z.object({
105
+ name: z.string().trim().min(1),
106
+ value: z.string().trim().min(1),
107
+ details: apiDetailsSchema,
108
+ tagList: z.array(z.string()).optional().default([]),
109
+ extra: z.string().optional(),
110
+ });
111
+
112
+ export type PostApiPayload = z.infer<typeof postApiSchema>;
113
+
114
+ export const getApiSchema = z
115
+ .object({
116
+ id: targetIdSchema.optional(),
117
+ value: z.string().trim().min(1).optional(),
118
+ })
119
+ .refine(
120
+ (payload) => {
121
+ const hasId = payload.id != null && payload.id !== "";
122
+ const hasValue = payload.value != null && payload.value !== "";
123
+ return hasId !== hasValue;
124
+ },
125
+ { message: "Provide exactly one of id or value" },
126
+ );
127
+
128
+ export type GetApiPayload = z.infer<typeof getApiSchema>;
129
+
130
+ export const getServiceSchema = z
131
+ .object({
132
+ id: targetIdSchema.optional(),
133
+ value: z.string().trim().min(1).optional(),
134
+ /** When set, filters `details.lifecycle.status` at query time. */
135
+ lifecycleStatus: z.nativeEnum(ServiceLifecycleStatus).optional(),
136
+ })
137
+ .refine(
138
+ (payload) => {
139
+ const hasId = payload.id != null && payload.id !== "";
140
+ const hasValue = payload.value != null && payload.value !== "";
141
+ return hasId !== hasValue;
142
+ },
143
+ { message: "Provide exactly one of id or value" },
144
+ );
145
+
146
+ export type GetServicePayload = z.infer<typeof getServiceSchema>;
147
+
148
+ export const postServiceSchema = z.object({
149
+ name: z.string().trim().min(1),
150
+ value: z.string().trim().min(1),
151
+ details: serviceDetailsSchema,
152
+ tagList: z.array(z.string()).optional().default([]),
153
+ extra: z.string().optional(),
154
+ });
155
+
156
+ export type PostServicePayload = z.infer<typeof postServiceSchema>;
157
+
158
+ const apiCategoryFilter = {
159
+ field: "category",
160
+ operator: "eq" as const,
161
+ value: CategoryApi.API,
162
+ };
163
+
164
+ const serviceCategoryFilter = {
165
+ field: "category",
166
+ operator: "eq" as const,
167
+ value: CategoryService.SERVICE,
168
+ };
169
+
170
+ const SERVICE_LIFECYCLE_STATUS_FIELD = "details->lifecycle->>status" as const;
171
+
172
+ function buildServiceLookupFilters(payload: GetServicePayload): QueryFilter[] {
173
+ const filters: QueryFilter[] = [serviceCategoryFilter];
174
+
175
+ if (payload.id != null && payload.id !== "") {
176
+ // id path: caller adds .eq("id", id) separately
177
+ } else {
178
+ filters.push({ field: "value", operator: "eq", value: payload.value! });
179
+ }
180
+
181
+ if (payload.lifecycleStatus != null) {
182
+ filters.push({
183
+ field: SERVICE_LIFECYCLE_STATUS_FIELD,
184
+ operator: "eq",
185
+ value: payload.lifecycleStatus,
186
+ });
187
+ }
188
+
189
+ return filters;
190
+ }
191
+
192
+ /** Register an Api contract row (`category=api`). */
193
+ export const postApi = validateWithSchema(
194
+ postApiSchema,
195
+ "postApiSchema",
196
+ )(async ({ name, value, details, tagList, extra }) => {
197
+ return createTarget<Api, PostApiPayload>({
198
+ payload: { name, value, details, tagList, extra },
199
+ createFn: () => ({
200
+ name,
201
+ value,
202
+ category: CategoryApi.API,
203
+ tagList,
204
+ extra,
205
+ details: details as ApiDetails,
206
+ }),
207
+ });
208
+ });
209
+
210
+ /** Fetch an Api by id or by {@link Api.value} key (`category=api`). */
211
+ export const getApi = validateWithSchema(
212
+ getApiSchema,
213
+ "getApiSchema",
214
+ )(async (payload) => {
215
+ if (payload.id != null && payload.id !== "") {
216
+ const result = await getTarget({
217
+ id: payload.id,
218
+ filterList: [apiCategoryFilter],
219
+ });
220
+ return {
221
+ ...result,
222
+ data: result.data as Api,
223
+ };
224
+ }
225
+
226
+ const result = await getPossibleTarget({
227
+ filterList: [apiCategoryFilter, { field: "value", operator: "eq", value: payload.value! }],
228
+ });
229
+
230
+ if (result.data == null) {
231
+ return {
232
+ ...result,
233
+ data: undefined,
234
+ };
235
+ }
236
+
237
+ return {
238
+ ...result,
239
+ data: result.data as Api,
240
+ };
241
+ });
242
+
243
+ /** Fetch a Service by id or by {@link Service.value} key (`category=service`). */
244
+ export const getService = validateWithSchema(
245
+ getServiceSchema,
246
+ "getServiceSchema",
247
+ )(async (payload) => {
248
+ const filterList = buildServiceLookupFilters(payload);
249
+
250
+ if (payload.id != null && payload.id !== "") {
251
+ const result = await getTarget({
252
+ id: payload.id,
253
+ filterList,
254
+ });
255
+ return {
256
+ ...result,
257
+ data: result.data as Service,
258
+ };
259
+ }
260
+
261
+ const result = await getPossibleTarget({
262
+ filterList,
263
+ });
264
+
265
+ if (result.data == null) {
266
+ return {
267
+ ...result,
268
+ data: undefined,
269
+ };
270
+ }
271
+
272
+ return {
273
+ ...result,
274
+ data: result.data as Service,
275
+ };
276
+ });
277
+
278
+ /** Register a Service catalog row (`category=service`). */
279
+ export const postService = validateWithSchema(
280
+ postServiceSchema,
281
+ "postServiceSchema",
282
+ )(async ({ name, value, details, tagList, extra }) => {
283
+ return createTarget<Service, PostServicePayload>({
284
+ payload: { name, value, details, tagList, extra },
285
+ createFn: () => ({
286
+ name,
287
+ value,
288
+ category: CategoryService.SERVICE,
289
+ tagList,
290
+ extra,
291
+ details: details as ServiceDetails,
292
+ }),
293
+ });
294
+ });
@@ -1,27 +1,59 @@
1
- import { Target } from "../core.interface";
2
- import { Lifecycle } from "./base.interface";
1
+ import type { Target } from "../core.interface";
2
+ import type { FieldDefinition, ServiceLifecycle } from "./base.interface";
3
3
 
4
4
  export interface Service extends Target {
5
- /** "storage-service" 唯一键 */
6
- value: string;
7
- category: CategoryService;
8
- details: ServiceDetails;
5
+ name: string;
6
+ /** "storage-service" 唯一键 */
7
+ value: string;
8
+ category: CategoryService;
9
+ details: ServiceDetails;
9
10
  }
10
11
 
11
12
  export enum CategoryService {
12
- SERVICE = "service",
13
+ SERVICE = "service",
13
14
  }
14
15
 
15
- export enum ServiceStatus {
16
- ACTIVE = "ACTIVE",
17
- DEPRECATED = "DEPRECATED",
18
- SUNSET = "SUNSET",
16
+ export interface ServiceDetails {
17
+ manifestVersion: number;
18
+ /** 能力 Api keys */
19
+ apiKeys: string[];
20
+ /** 依赖的服务 Service keys */
21
+ dependencies: string[];
22
+ lifecycle: ServiceLifecycle;
19
23
  }
20
24
 
21
- export interface ServiceDetails {
22
- /** 能力 Api keys */
23
- apis: string[];
24
- /** 依赖的服务 Service keys */
25
- dependencies: string[];
26
- lifecycle: Lifecycle;
25
+ export interface Api extends Target {
26
+ /** "core.post.target.0" 唯一键 领域 + METHOD + content + VERSION */
27
+ value: string;
28
+ category: CategoryApi;
29
+ details: ApiDetails;
30
+ }
31
+
32
+ export enum CategoryApi {
33
+ API = "api",
34
+ }
35
+
36
+ export enum ApiMethod {
37
+ POST = "POST",
38
+ GET = "GET",
39
+ PUT = "PUT",
40
+ DELETE = "DELETE",
41
+ }
42
+
43
+ export interface ApiDetails {
44
+ method: ApiMethod;
45
+ /** /v0/core/target */
46
+ path: string;
47
+ /** out-of-box url like https://api.example.com/v0/core/target */
48
+ endpoint: string;
49
+ request: {
50
+ query: FieldDefinition[];
51
+ };
52
+ response: {
53
+ "200": FieldDefinition[];
54
+ };
55
+ manifestVersion: number;
56
+ lifecycle: ServiceLifecycle;
57
+ /** TODO contentType: e.g. application/json | application/octet-stream */
58
+ /** TODO auth / rate_limit / observability */
27
59
  }
@@ -0,0 +1,145 @@
1
+ import type { LoggerWithScope } from "../log/index";
2
+ import { classifyNetworkError, formatNetworkError } from "../utils/network-error";
3
+
4
+ function sleep(ms: number): Promise<void> {
5
+ return new Promise((resolve) => setTimeout(resolve, ms));
6
+ }
7
+
8
+ /** Default HTTP statuses that trigger retry (429, 5xx). */
9
+ export function isRetryableHttpStatus(status: number): boolean {
10
+ return status === 429 || status >= 500;
11
+ }
12
+
13
+ export type FetchInitFactory = () => RequestInit;
14
+
15
+ export function requestHasBody(init: RequestInit): boolean {
16
+ return init.body != null;
17
+ }
18
+
19
+ export interface FetchRetryOptions {
20
+ label: string;
21
+ timeoutMs: number;
22
+ maxAttempts?: number;
23
+ retryBaseMs?: number;
24
+ maxBackoffMs?: number;
25
+ /** undici ProxyAgent or other fetch extension — typed loosely to avoid undici dependency. */
26
+ dispatcher?: unknown;
27
+ isRetryableStatus?: (status: number) => boolean;
28
+ /** When set, retry/success lines are logged via SDK logger. */
29
+ logger?: LoggerWithScope;
30
+ hint?: string;
31
+ }
32
+
33
+ function backoffMs(retryBaseMs: number, attempt: number, response?: Response, maxBackoffMs?: number): number {
34
+ const retryAfter = response?.headers.get("Retry-After");
35
+ if (retryAfter != null) {
36
+ const seconds = Number(retryAfter);
37
+ if (Number.isFinite(seconds) && seconds > 0) {
38
+ const delayMs = seconds * 1000;
39
+ return maxBackoffMs != null ? Math.min(delayMs, maxBackoffMs) : delayMs;
40
+ }
41
+ }
42
+
43
+ let delayMs = retryBaseMs * 2 ** (attempt - 1);
44
+ if (maxBackoffMs != null) {
45
+ delayMs = Math.min(delayMs, maxBackoffMs);
46
+ }
47
+ return delayMs;
48
+ }
49
+
50
+ async function fetchOnce(url: string, init: RequestInit, timeoutMs: number, dispatcher?: unknown): Promise<Response> {
51
+ const options: RequestInit & { dispatcher?: unknown } = {
52
+ ...init,
53
+ signal: AbortSignal.timeout(timeoutMs),
54
+ };
55
+ if (dispatcher != null) {
56
+ options.dispatcher = dispatcher;
57
+ }
58
+ return fetch(url, options);
59
+ }
60
+
61
+ export async function fetchWithRetry(
62
+ url: string,
63
+ initOrFactory: RequestInit | FetchInitFactory,
64
+ options: FetchRetryOptions,
65
+ ): Promise<Response> {
66
+ const maxAttempts = options.maxAttempts ?? 1;
67
+ const retryBaseMs = options.retryBaseMs ?? 2_000;
68
+ const isRetryableStatus = options.isRetryableStatus ?? isRetryableHttpStatus;
69
+ const buildInit = typeof initOrFactory === "function" ? initOrFactory : () => initOrFactory;
70
+
71
+ if (maxAttempts > 1 && typeof initOrFactory !== "function" && requestHasBody(initOrFactory)) {
72
+ throw new Error(`${options.label}: retry requires an init factory when request body may be consumed`);
73
+ }
74
+
75
+ let lastError: Error | null = null;
76
+
77
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
78
+ try {
79
+ const response = await fetchOnce(url, buildInit(), options.timeoutMs, options.dispatcher);
80
+
81
+ if (!response.ok && isRetryableStatus(response.status) && attempt < maxAttempts) {
82
+ const delayMs = backoffMs(retryBaseMs, attempt, response, options.maxBackoffMs);
83
+ if (options.logger != null) {
84
+ options.logger.warn("retrying after HTTP error", {
85
+ topic: "fetch",
86
+ data: {
87
+ label: options.label,
88
+ attempt,
89
+ status: response.status,
90
+ delayMs,
91
+ },
92
+ });
93
+ }
94
+ await sleep(delayMs);
95
+ continue;
96
+ }
97
+
98
+ if (attempt > 1 && options.logger != null) {
99
+ options.logger.info("request succeeded after retry", {
100
+ topic: "fetch",
101
+ data: { label: options.label, attempt },
102
+ });
103
+ }
104
+
105
+ return response;
106
+ } catch (error) {
107
+ const classified = classifyNetworkError(error);
108
+ lastError = new Error(formatNetworkError(error, options.label, { hint: options.hint }));
109
+
110
+ if (classified.retryable && attempt < maxAttempts) {
111
+ const delayMs = backoffMs(retryBaseMs, attempt, undefined, options.maxBackoffMs);
112
+ if (options.logger != null) {
113
+ options.logger.warn("retrying after network error", {
114
+ topic: "fetch",
115
+ data: {
116
+ label: options.label,
117
+ attempt,
118
+ maxAttempts,
119
+ kind: classified.kind,
120
+ code: classified.code,
121
+ delayMs,
122
+ },
123
+ });
124
+ }
125
+ await sleep(delayMs);
126
+ continue;
127
+ }
128
+ throw lastError;
129
+ }
130
+ }
131
+
132
+ throw lastError ?? new Error(`${options.label}: request failed`);
133
+ }
134
+
135
+ export async function fetchBinaryWithRetry(
136
+ url: string,
137
+ init: RequestInit,
138
+ options: FetchRetryOptions,
139
+ ): Promise<ArrayBuffer> {
140
+ const response = await fetchWithRetry(url, init, options);
141
+ if (!response.ok) {
142
+ throw new Error(`${options.label}: HTTP ${response.status}`);
143
+ }
144
+ return response.arrayBuffer();
145
+ }