@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70

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 (478) hide show
  1. package/AUTHORING.md +943 -51
  2. package/CHANGELOG.md +273 -1
  3. package/LICENSE +21 -0
  4. package/README.md +117 -29
  5. package/SUBMISSION.md +3 -2
  6. package/bin/apifuse-check.ts +293 -13
  7. package/bin/apifuse-dev.ts +42 -19
  8. package/bin/apifuse-migrate-deployment.ts +200 -0
  9. package/bin/apifuse-migrate-operation-declaration.ts +55 -0
  10. package/bin/apifuse-migrate-shape.ts +202 -0
  11. package/bin/apifuse-pack-check.ts +19 -6
  12. package/bin/apifuse-pack-smoke.ts +57 -2
  13. package/bin/apifuse-pack-types.ts +736 -38
  14. package/bin/apifuse-perf.ts +59 -23
  15. package/bin/apifuse-record.ts +923 -94
  16. package/bin/apifuse-submit-check.ts +2313 -281
  17. package/bin/apifuse-test.ts +3 -1
  18. package/bin/submit-check-delimited-text.ts +50 -0
  19. package/dist/auth-turn/index.d.ts +3 -3
  20. package/dist/auth-turn/index.js +1 -1
  21. package/dist/auth.d.ts +14 -0
  22. package/dist/auth.js +67 -0
  23. package/dist/ceremonies/index.d.ts +16 -0
  24. package/dist/ceremonies/index.js +141 -36
  25. package/dist/cli/commands.d.ts +1 -1
  26. package/dist/cli/commands.js +30 -0
  27. package/dist/cli/create.d.ts +1 -1
  28. package/dist/cli/create.js +8 -2
  29. package/dist/cli/deployment-intent.d.ts +178 -0
  30. package/dist/cli/deployment-intent.js +277 -0
  31. package/dist/cli/local-connection.d.ts +111 -0
  32. package/dist/cli/local-connection.js +151 -0
  33. package/dist/cli/migrate-deployment-intent.d.ts +132 -0
  34. package/dist/cli/migrate-deployment-intent.js +1552 -0
  35. package/dist/cli/migrate-operation-declaration.d.ts +70 -0
  36. package/dist/cli/migrate-operation-declaration.js +2206 -0
  37. package/dist/cli/migrate-operation-shape.d.ts +44 -0
  38. package/dist/cli/migrate-operation-shape.js +113 -0
  39. package/dist/cli/migrate-provider-shape.d.ts +56 -0
  40. package/dist/cli/migrate-provider-shape.js +580 -0
  41. package/dist/cli/resolver-runtime.d.ts +21 -0
  42. package/dist/cli/resolver-runtime.js +31 -0
  43. package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  44. package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
  45. package/dist/cli/templates/provider/README.md.tpl +41 -19
  46. package/dist/cli/templates/provider/index.ts.tpl +6 -3
  47. package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
  48. package/dist/cli/templates/provider/provider.json.tpl +6 -0
  49. package/dist/config/loader.d.ts +202 -16
  50. package/dist/config/loader.js +491 -141
  51. package/dist/contract-serialization.js +4 -8
  52. package/dist/contract-types.d.ts +12 -5
  53. package/dist/contract.js +24 -10
  54. package/dist/declaration-validation.d.ts +34 -0
  55. package/dist/declaration-validation.js +305 -0
  56. package/dist/define.d.ts +71 -29
  57. package/dist/define.js +807 -69
  58. package/dist/dev.d.ts +5 -0
  59. package/dist/dev.js +8 -1
  60. package/dist/engine.d.ts +129 -0
  61. package/dist/engine.js +209 -0
  62. package/dist/error-observability.d.ts +7 -0
  63. package/dist/error-observability.js +61 -0
  64. package/dist/error-resolution.d.ts +18 -0
  65. package/dist/error-resolution.js +243 -0
  66. package/dist/errors.d.ts +74 -0
  67. package/dist/errors.js +99 -0
  68. package/dist/fixture-sanitization.d.ts +28 -0
  69. package/dist/fixture-sanitization.js +371 -0
  70. package/dist/handle-meta.d.ts +90 -0
  71. package/dist/handle-meta.js +73 -0
  72. package/dist/handle.d.ts +226 -0
  73. package/dist/handle.js +345 -0
  74. package/dist/health-scenario.d.ts +1901 -0
  75. package/dist/health-scenario.js +653 -0
  76. package/dist/i18n/catalog.js +21 -1
  77. package/dist/i18n/error-messages.d.ts +86 -0
  78. package/dist/i18n/error-messages.js +192 -0
  79. package/dist/i18n/index.d.ts +1 -0
  80. package/dist/i18n/index.js +1 -0
  81. package/dist/i18n/keys.d.ts +12 -0
  82. package/dist/i18n/keys.js +76 -5
  83. package/dist/i18n/operation-locale-namespace.d.ts +2 -0
  84. package/dist/i18n/operation-locale-namespace.js +7 -0
  85. package/dist/index.d.ts +40 -15
  86. package/dist/index.js +29 -11
  87. package/dist/lint.d.ts +43 -11
  88. package/dist/lint.js +2512 -177
  89. package/dist/native-address.d.ts +43 -0
  90. package/dist/native-address.js +281 -0
  91. package/dist/native-egress-policy.d.ts +31 -0
  92. package/dist/native-egress-policy.js +288 -0
  93. package/dist/observability.d.ts +5 -2
  94. package/dist/observability.js +48 -1
  95. package/dist/provider.d.ts +18 -8
  96. package/dist/provider.js +11 -6
  97. package/dist/runtime/auth-flow.d.ts +6 -1
  98. package/dist/runtime/auth-flow.js +8 -0
  99. package/dist/runtime/bounded-expiring-map.d.ts +21 -0
  100. package/dist/runtime/bounded-expiring-map.js +64 -0
  101. package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
  102. package/dist/runtime/browser-telemetry-binding.js +83 -0
  103. package/dist/runtime/browser-telemetry.d.ts +76 -0
  104. package/dist/runtime/browser-telemetry.js +165 -0
  105. package/dist/runtime/browser.d.ts +4 -0
  106. package/dist/runtime/browser.js +688 -83
  107. package/dist/runtime/cache-telemetry.d.ts +71 -0
  108. package/dist/runtime/cache-telemetry.js +177 -0
  109. package/dist/runtime/cache.d.ts +3 -0
  110. package/dist/runtime/cache.js +245 -23
  111. package/dist/runtime/capability-response.d.ts +3 -0
  112. package/dist/runtime/capability-response.js +56 -0
  113. package/dist/runtime/capability-telemetry.d.ts +46 -0
  114. package/dist/runtime/capability-telemetry.js +68 -0
  115. package/dist/runtime/chrome149-header-order.d.ts +58 -0
  116. package/dist/runtime/chrome149-header-order.js +289 -0
  117. package/dist/runtime/diagnostic-env-values.d.ts +5 -0
  118. package/dist/runtime/diagnostic-env-values.js +57 -0
  119. package/dist/runtime/diagnostic-env.d.ts +14 -0
  120. package/dist/runtime/diagnostic-env.js +44 -0
  121. package/dist/runtime/diagnostic-redactor.d.ts +54 -0
  122. package/dist/runtime/diagnostic-redactor.js +571 -0
  123. package/dist/runtime/egress-lease.d.ts +65 -0
  124. package/dist/runtime/egress-lease.js +236 -0
  125. package/dist/runtime/engine-mode.d.ts +74 -0
  126. package/dist/runtime/engine-mode.js +152 -0
  127. package/dist/runtime/env.js +14 -1
  128. package/dist/runtime/executor.d.ts +3 -2
  129. package/dist/runtime/executor.js +23 -26
  130. package/dist/runtime/handle-wordlist.d.ts +43 -0
  131. package/dist/runtime/handle-wordlist.js +256 -0
  132. package/dist/runtime/handle.d.ts +71 -0
  133. package/dist/runtime/handle.js +908 -0
  134. package/dist/runtime/http-telemetry-binding.d.ts +10 -0
  135. package/dist/runtime/http-telemetry-binding.js +152 -0
  136. package/dist/runtime/http-telemetry-guard.d.ts +16 -0
  137. package/dist/runtime/http-telemetry-guard.js +202 -0
  138. package/dist/runtime/http-telemetry.d.ts +104 -0
  139. package/dist/runtime/http-telemetry.js +190 -0
  140. package/dist/runtime/http.d.ts +34 -0
  141. package/dist/runtime/http.js +680 -121
  142. package/dist/runtime/insights.js +2 -2
  143. package/dist/runtime/instrumentation.d.ts +2 -2
  144. package/dist/runtime/instrumentation.js +462 -19
  145. package/dist/runtime/native-network-errors.d.ts +33 -0
  146. package/dist/runtime/native-network-errors.js +69 -0
  147. package/dist/runtime/native-network.d.ts +105 -0
  148. package/dist/runtime/native-network.js +1433 -0
  149. package/dist/runtime/native-telemetry.d.ts +142 -0
  150. package/dist/runtime/native-telemetry.js +231 -0
  151. package/dist/runtime/ocr-telemetry.d.ts +82 -0
  152. package/dist/runtime/ocr-telemetry.js +192 -0
  153. package/dist/runtime/ocr.d.ts +29 -0
  154. package/dist/runtime/ocr.js +468 -0
  155. package/dist/runtime/otlp.d.ts +71 -2
  156. package/dist/runtime/otlp.js +398 -16
  157. package/dist/runtime/provider.d.ts +7 -0
  158. package/dist/runtime/provider.js +14 -0
  159. package/dist/runtime/proxy-errors.js +6 -2
  160. package/dist/runtime/proxy-nodemaven.d.ts +56 -0
  161. package/dist/runtime/proxy-nodemaven.js +147 -0
  162. package/dist/runtime/proxy-retry-policy.d.ts +4 -1
  163. package/dist/runtime/proxy-retry-policy.js +11 -2
  164. package/dist/runtime/proxy-telemetry.d.ts +133 -3
  165. package/dist/runtime/proxy-telemetry.js +218 -70
  166. package/dist/runtime/redirect-hop-headers.d.ts +19 -0
  167. package/dist/runtime/redirect-hop-headers.js +58 -0
  168. package/dist/runtime/redirects.d.ts +61 -0
  169. package/dist/runtime/redirects.js +149 -0
  170. package/dist/runtime/redis.d.ts +1 -1
  171. package/dist/runtime/redis.js +4 -2
  172. package/dist/runtime/request-options.d.ts +75 -1
  173. package/dist/runtime/request-options.js +588 -0
  174. package/dist/runtime/request-telemetry.d.ts +70 -0
  175. package/dist/runtime/request-telemetry.js +229 -0
  176. package/dist/runtime/resolver-config.d.ts +13 -0
  177. package/dist/runtime/resolver-config.js +14 -0
  178. package/dist/runtime/resolver-public.d.ts +3 -0
  179. package/dist/runtime/resolver-public.js +1 -0
  180. package/dist/runtime/resolver-runtime-options.d.ts +14 -0
  181. package/dist/runtime/resolver-runtime-options.js +33 -0
  182. package/dist/runtime/resolver-shared.d.ts +24 -0
  183. package/dist/runtime/resolver-shared.js +69 -0
  184. package/dist/runtime/resolver-span-attributes.d.ts +34 -0
  185. package/dist/runtime/resolver-span-attributes.js +93 -0
  186. package/dist/runtime/resolver-telemetry.d.ts +135 -0
  187. package/dist/runtime/resolver-telemetry.js +204 -0
  188. package/dist/runtime/resolver-usage.d.ts +32 -0
  189. package/dist/runtime/resolver-usage.js +54 -0
  190. package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
  191. package/dist/runtime/resolver-vendors/bindings.js +45 -0
  192. package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
  193. package/dist/runtime/resolver-vendors/browser.js +423 -0
  194. package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
  195. package/dist/runtime/resolver-vendors/capsolver.js +544 -0
  196. package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
  197. package/dist/runtime/resolver-vendors/hosts.js +68 -0
  198. package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
  199. package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
  200. package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
  201. package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
  202. package/dist/runtime/resolver-vendors/types.d.ts +125 -0
  203. package/dist/runtime/resolver-vendors/types.js +106 -0
  204. package/dist/runtime/resolver.d.ts +79 -0
  205. package/dist/runtime/resolver.js +1094 -0
  206. package/dist/runtime/state-telemetry.d.ts +79 -0
  207. package/dist/runtime/state-telemetry.js +194 -0
  208. package/dist/runtime/state.d.ts +10 -1
  209. package/dist/runtime/state.js +322 -82
  210. package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
  211. package/dist/runtime/stealth-akamai-sbsd.js +142 -0
  212. package/dist/runtime/stealth-cookies.d.ts +24 -0
  213. package/dist/runtime/stealth-cookies.js +131 -0
  214. package/dist/runtime/stealth-owned-headers.d.ts +39 -0
  215. package/dist/runtime/stealth-owned-headers.js +57 -0
  216. package/dist/runtime/stealth-telemetry.d.ts +92 -0
  217. package/dist/runtime/stealth-telemetry.js +179 -0
  218. package/dist/runtime/stealth.d.ts +45 -6
  219. package/dist/runtime/stealth.js +1775 -320
  220. package/dist/runtime/stt-telemetry.d.ts +77 -0
  221. package/dist/runtime/stt-telemetry.js +176 -0
  222. package/dist/runtime/stt.js +18 -19
  223. package/dist/runtime/timeout.d.ts +5 -0
  224. package/dist/runtime/timeout.js +12 -0
  225. package/dist/runtime/trace-config.d.ts +12 -0
  226. package/dist/runtime/trace-config.js +62 -0
  227. package/dist/runtime/trace.d.ts +17 -0
  228. package/dist/runtime/trace.js +176 -25
  229. package/dist/runtime-boundary-lint.d.ts +137 -0
  230. package/dist/runtime-boundary-lint.js +590 -0
  231. package/dist/schema.d.ts +20 -0
  232. package/dist/schema.js +72 -2
  233. package/dist/serve.d.ts +1 -1
  234. package/dist/serve.js +1 -1
  235. package/dist/server/error-observability.d.ts +1 -0
  236. package/dist/server/error-observability.js +1 -0
  237. package/dist/server/error-stack-frames.d.ts +35 -0
  238. package/dist/server/error-stack-frames.js +219 -0
  239. package/dist/server/index.d.ts +21 -2
  240. package/dist/server/index.js +11 -2
  241. package/dist/server/runtime-diagnostics.d.ts +165 -0
  242. package/dist/server/runtime-diagnostics.js +360 -0
  243. package/dist/server/sdk-version.d.ts +3 -0
  244. package/dist/server/sdk-version.js +19 -0
  245. package/dist/server/self-test-input-tokens.d.ts +2 -1
  246. package/dist/server/self-test-input-tokens.js +18 -14
  247. package/dist/server/self-test-redaction.js +8 -33
  248. package/dist/server/self-test.d.ts +18 -3
  249. package/dist/server/self-test.js +139 -76
  250. package/dist/server/sensitive-values.d.ts +26 -0
  251. package/dist/server/sensitive-values.js +137 -0
  252. package/dist/server/serve-implementation.d.ts +285 -0
  253. package/dist/server/serve-implementation.js +3172 -0
  254. package/dist/server/serve.d.ts +1 -75
  255. package/dist/server/serve.js +1 -1170
  256. package/dist/server/state-backend-report.d.ts +70 -0
  257. package/dist/server/state-backend-report.js +113 -0
  258. package/dist/server/trace-output.d.ts +7 -0
  259. package/dist/server/trace-output.js +111 -0
  260. package/dist/server/types.d.ts +37 -5
  261. package/dist/server/types.js +34 -1
  262. package/dist/stateful/errors.d.ts +19 -0
  263. package/dist/stateful/errors.js +24 -0
  264. package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
  265. package/dist/stateful/http-provider-event-emitter.js +237 -0
  266. package/dist/stateful/http-session-owner-registry.d.ts +44 -0
  267. package/dist/stateful/http-session-owner-registry.js +210 -0
  268. package/dist/stateful/index.d.ts +18 -0
  269. package/dist/stateful/index.js +18 -0
  270. package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
  271. package/dist/stateful/provider-event-delivery-failures.js +43 -0
  272. package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
  273. package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
  274. package/dist/stateful/provider-event-pipeline.d.ts +50 -0
  275. package/dist/stateful/provider-event-pipeline.js +1 -0
  276. package/dist/stateful/provider-events.d.ts +101 -0
  277. package/dist/stateful/provider-events.js +289 -0
  278. package/dist/stateful/session-key.d.ts +15 -0
  279. package/dist/stateful/session-key.js +86 -0
  280. package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
  281. package/dist/stateful/stateful-provider-adapter-context.js +42 -0
  282. package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
  283. package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
  284. package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
  285. package/dist/stateful/stateful-provider-adapter.js +287 -0
  286. package/dist/stateful/stateful-provider-observability.d.ts +62 -0
  287. package/dist/stateful/stateful-provider-observability.js +161 -0
  288. package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
  289. package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
  290. package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
  291. package/dist/stateful/stateful-provider-runtime-context.js +61 -0
  292. package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
  293. package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
  294. package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
  295. package/dist/stateful/stateful-provider-session-routing.js +345 -0
  296. package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
  297. package/dist/stateful/stateful-provider-session-runtime.js +245 -0
  298. package/dist/stateful-signing.d.ts +18 -0
  299. package/dist/stateful-signing.js +27 -0
  300. package/dist/stealth/profiles.d.ts +15 -4
  301. package/dist/stealth/profiles.js +169 -211
  302. package/dist/stream-evidence.d.ts +74 -0
  303. package/dist/stream-evidence.js +785 -0
  304. package/dist/stream.js +7 -1
  305. package/dist/testing/index.d.ts +2 -1
  306. package/dist/testing/index.js +2 -1
  307. package/dist/testing/run.d.ts +32 -2
  308. package/dist/testing/run.js +509 -25
  309. package/dist/trace-sanitization.d.ts +6 -0
  310. package/dist/trace-sanitization.js +68 -0
  311. package/dist/types.d.ts +899 -210
  312. package/dist/types.js +1 -0
  313. package/dist/typescript-module.d.ts +39 -0
  314. package/dist/typescript-module.js +72 -0
  315. package/package.json +52 -6
  316. package/src/auth-turn/index.ts +1 -1
  317. package/src/auth.ts +118 -0
  318. package/src/ceremonies/index.ts +189 -46
  319. package/src/cli/commands.ts +37 -0
  320. package/src/cli/create.ts +8 -2
  321. package/src/cli/deployment-intent.ts +364 -0
  322. package/src/cli/local-connection.ts +221 -0
  323. package/src/cli/migrate-deployment-intent.ts +1908 -0
  324. package/src/cli/migrate-operation-declaration.ts +3026 -0
  325. package/src/cli/migrate-operation-shape.ts +184 -0
  326. package/src/cli/migrate-provider-shape.ts +778 -0
  327. package/src/cli/resolver-runtime.ts +72 -0
  328. package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
  329. package/src/cli/templates/provider/Dockerfile.tpl +1 -1
  330. package/src/cli/templates/provider/README.md.tpl +41 -19
  331. package/src/cli/templates/provider/index.ts.tpl +6 -3
  332. package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
  333. package/src/cli/templates/provider/provider.json.tpl +6 -0
  334. package/src/config/loader.ts +774 -181
  335. package/src/contract-serialization.ts +5 -7
  336. package/src/contract-types.ts +12 -5
  337. package/src/contract.ts +24 -10
  338. package/src/declaration-validation.ts +376 -0
  339. package/src/define.ts +1105 -131
  340. package/src/dev.ts +13 -1
  341. package/src/engine.ts +390 -0
  342. package/src/error-observability.ts +64 -0
  343. package/src/error-resolution.ts +269 -0
  344. package/src/errors.ts +157 -0
  345. package/src/fixture-sanitization.ts +422 -0
  346. package/src/handle-meta.ts +143 -0
  347. package/src/handle.ts +694 -0
  348. package/src/health-scenario.ts +960 -0
  349. package/src/i18n/catalog.ts +23 -1
  350. package/src/i18n/error-messages.ts +255 -0
  351. package/src/i18n/index.ts +1 -0
  352. package/src/i18n/keys.ts +80 -6
  353. package/src/i18n/operation-locale-namespace.ts +10 -0
  354. package/src/index.ts +390 -23
  355. package/src/lint.ts +2975 -234
  356. package/src/native-address.ts +340 -0
  357. package/src/native-egress-policy.ts +358 -0
  358. package/src/observability.ts +51 -1
  359. package/src/provider.ts +207 -27
  360. package/src/runtime/auth-flow.ts +15 -0
  361. package/src/runtime/bounded-expiring-map.ts +67 -0
  362. package/src/runtime/browser-telemetry-binding.ts +92 -0
  363. package/src/runtime/browser-telemetry.ts +289 -0
  364. package/src/runtime/browser.ts +882 -99
  365. package/src/runtime/cache-telemetry.ts +247 -0
  366. package/src/runtime/cache.ts +258 -22
  367. package/src/runtime/capability-response.ts +53 -0
  368. package/src/runtime/capability-telemetry.ts +101 -0
  369. package/src/runtime/chrome149-header-order.ts +330 -0
  370. package/src/runtime/diagnostic-env-values.ts +56 -0
  371. package/src/runtime/diagnostic-env.ts +65 -0
  372. package/src/runtime/diagnostic-redactor.ts +668 -0
  373. package/src/runtime/egress-lease.ts +341 -0
  374. package/src/runtime/engine-mode.ts +233 -0
  375. package/src/runtime/env.ts +15 -1
  376. package/src/runtime/executor.ts +39 -32
  377. package/src/runtime/handle-wordlist.ts +266 -0
  378. package/src/runtime/handle.ts +1180 -0
  379. package/src/runtime/http-telemetry-binding.ts +162 -0
  380. package/src/runtime/http-telemetry-guard.ts +208 -0
  381. package/src/runtime/http-telemetry.ts +292 -0
  382. package/src/runtime/http.ts +896 -150
  383. package/src/runtime/insights.ts +2 -2
  384. package/src/runtime/instrumentation.ts +628 -28
  385. package/src/runtime/native-network-errors.ts +99 -0
  386. package/src/runtime/native-network.ts +1853 -0
  387. package/src/runtime/native-telemetry.ts +366 -0
  388. package/src/runtime/ocr-telemetry.ts +308 -0
  389. package/src/runtime/ocr.ts +564 -0
  390. package/src/runtime/otlp.ts +468 -21
  391. package/src/runtime/provider.ts +15 -0
  392. package/src/runtime/proxy-errors.ts +12 -4
  393. package/src/runtime/proxy-nodemaven.ts +222 -0
  394. package/src/runtime/proxy-retry-policy.ts +12 -1
  395. package/src/runtime/proxy-telemetry.ts +358 -103
  396. package/src/runtime/redirect-hop-headers.ts +71 -0
  397. package/src/runtime/redirects.ts +215 -0
  398. package/src/runtime/redis.ts +7 -2
  399. package/src/runtime/request-options.ts +728 -1
  400. package/src/runtime/request-telemetry.ts +375 -0
  401. package/src/runtime/resolver-config.ts +18 -0
  402. package/src/runtime/resolver-public.ts +44 -0
  403. package/src/runtime/resolver-runtime-options.ts +50 -0
  404. package/src/runtime/resolver-shared.ts +113 -0
  405. package/src/runtime/resolver-span-attributes.ts +139 -0
  406. package/src/runtime/resolver-telemetry.ts +362 -0
  407. package/src/runtime/resolver-usage.ts +99 -0
  408. package/src/runtime/resolver-vendors/bindings.ts +61 -0
  409. package/src/runtime/resolver-vendors/browser.ts +591 -0
  410. package/src/runtime/resolver-vendors/capsolver.ts +727 -0
  411. package/src/runtime/resolver-vendors/hosts.ts +81 -0
  412. package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
  413. package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
  414. package/src/runtime/resolver-vendors/types.ts +261 -0
  415. package/src/runtime/resolver.ts +1543 -0
  416. package/src/runtime/state-telemetry.ts +298 -0
  417. package/src/runtime/state.ts +435 -89
  418. package/src/runtime/stealth-akamai-sbsd.ts +207 -0
  419. package/src/runtime/stealth-cookies.ts +155 -0
  420. package/src/runtime/stealth-owned-headers.ts +67 -0
  421. package/src/runtime/stealth-telemetry.ts +309 -0
  422. package/src/runtime/stealth.ts +2275 -372
  423. package/src/runtime/stt-telemetry.ts +282 -0
  424. package/src/runtime/stt.ts +96 -91
  425. package/src/runtime/timeout.ts +18 -0
  426. package/src/runtime/trace-config.ts +78 -0
  427. package/src/runtime/trace.ts +257 -35
  428. package/src/runtime-boundary-lint.ts +707 -0
  429. package/src/schema.ts +80 -2
  430. package/src/serve.ts +6 -1
  431. package/src/server/error-observability.ts +1 -0
  432. package/src/server/error-stack-frames.ts +214 -0
  433. package/src/server/index.ts +184 -2
  434. package/src/server/runtime-diagnostics.ts +522 -0
  435. package/src/server/sdk-version.ts +22 -0
  436. package/src/server/self-test-input-tokens.ts +29 -14
  437. package/src/server/self-test-redaction.ts +10 -40
  438. package/src/server/self-test.ts +205 -89
  439. package/src/server/sensitive-values.ts +211 -0
  440. package/src/server/serve-implementation.ts +4596 -0
  441. package/src/server/serve.ts +1 -1685
  442. package/src/server/state-backend-report.ts +185 -0
  443. package/src/server/trace-output.ts +189 -0
  444. package/src/server/types.ts +34 -1
  445. package/src/stateful/README.md +146 -0
  446. package/src/stateful/errors.ts +35 -0
  447. package/src/stateful/http-provider-event-emitter.ts +314 -0
  448. package/src/stateful/http-session-owner-registry.ts +306 -0
  449. package/src/stateful/index.ts +18 -0
  450. package/src/stateful/provider-event-delivery-failures.ts +80 -0
  451. package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
  452. package/src/stateful/provider-event-pipeline.ts +61 -0
  453. package/src/stateful/provider-events.ts +462 -0
  454. package/src/stateful/session-key.ts +111 -0
  455. package/src/stateful/stateful-provider-adapter-context.ts +59 -0
  456. package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
  457. package/src/stateful/stateful-provider-adapter.ts +562 -0
  458. package/src/stateful/stateful-provider-observability.ts +261 -0
  459. package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
  460. package/src/stateful/stateful-provider-runtime-context.ts +96 -0
  461. package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
  462. package/src/stateful/stateful-provider-session-routing.ts +546 -0
  463. package/src/stateful/stateful-provider-session-runtime.ts +403 -0
  464. package/src/stateful-signing.ts +46 -0
  465. package/src/stealth/profiles.ts +212 -231
  466. package/src/stream-evidence.ts +988 -0
  467. package/src/stream.ts +8 -1
  468. package/src/testing/index.ts +10 -1
  469. package/src/testing/run.ts +685 -19
  470. package/src/trace-sanitization.ts +110 -0
  471. package/src/types.ts +1014 -273
  472. package/src/typescript-module.ts +100 -0
  473. package/dist/choice-token.d.ts +0 -24
  474. package/dist/choice-token.js +0 -74
  475. package/dist/runtime/choice.d.ts +0 -15
  476. package/dist/runtime/choice.js +0 -413
  477. package/src/choice-token.ts +0 -165
  478. package/src/runtime/choice.ts +0 -686
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
 
3
3
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
4
- import { dirname, resolve } from "node:path";
4
+ import { dirname, join, resolve } from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
 
7
7
  import { z } from "zod";
@@ -11,8 +11,14 @@ import {
11
11
  PROMPT_ASSET_SYNC_REMEDIATION,
12
12
  verifyPromptAssets,
13
13
  } from "../src/cli/prompt-assets.js";
14
+ import {
15
+ DECLARATION_INVALID_CODE,
16
+ validateFailClosedDeclaration,
17
+ } from "../src/declaration-validation.js";
18
+ import { redundantDeploymentDefaults } from "../src/cli/deployment-intent.js";
19
+ import { isProviderError } from "../src/errors.js";
14
20
  import type { ProviderDefinition } from "../src/index.js";
15
- import { lintProvider, type ProviderLintMode } from "../src/lint.js";
21
+ import { lintProviderWithInformation, type ProviderLintMode } from "../src/lint.js";
16
22
  import { safeParseSchemaSync } from "../src/schema.js";
17
23
 
18
24
  const HELP_TEXT = `Usage: apifuse check [path]
@@ -118,26 +124,84 @@ export async function runChecks(
118
124
  const indexPath = resolve(providerRoot, "index.ts");
119
125
  const dockerfilePath = resolve(providerRoot, "Dockerfile");
120
126
  const packageJsonPath = resolve(providerRoot, "package.json");
121
-
122
- const providerModule = existsSync(indexPath)
123
- ? await import(pathToFileURL(indexPath).href)
124
- : undefined;
127
+ const providerJsonPath = resolve(providerRoot, "provider.json");
128
+
129
+ let providerModule: Record<string, unknown> | undefined;
130
+ let providerImportError: unknown;
131
+ if (existsSync(indexPath)) {
132
+ try {
133
+ providerModule = (await import(pathToFileURL(indexPath).href)) as Record<string, unknown>;
134
+ } catch (error) {
135
+ if (isProviderError(error) && error.code === DECLARATION_INVALID_CODE) {
136
+ providerImportError = error;
137
+ } else {
138
+ throw error;
139
+ }
140
+ }
141
+ }
125
142
  const provider = assertProviderDefinition(providerModule?.default);
126
143
  const providerSourceFiles = collectProviderSourceFiles(providerRoot);
144
+ const localeCatalogEn = readEnglishLocaleCatalog(providerRoot);
127
145
 
128
146
  return [
129
147
  checkIndex(indexPath, provider),
148
+ checkDeclaration(provider, providerImportError),
130
149
  checkOperations(provider),
131
150
  checkFixtures(provider),
132
151
  checkSchemas(provider),
133
- checkAuthoringLint(provider, providerSourceFiles, options.lintMode),
152
+ checkAuthoringLint(provider, providerSourceFiles, localeCatalogEn, options.lintMode),
134
153
  checkProviderMetadata(provider),
154
+ await checkDeploymentIntent(providerRoot, provider),
135
155
  checkDockerfile(dockerfilePath),
136
156
  checkPackageJson(packageJsonPath),
157
+ checkProviderJson(providerJsonPath, packageJsonPath),
137
158
  checkPromptAssets(providerRoot),
138
159
  ];
139
160
  }
140
161
 
162
+ const DECLARATION_CHECK_MESSAGE = "Provider declaration passes fail-closed validation";
163
+
164
+ function checkDeclaration(
165
+ provider: ProviderDefinition | undefined,
166
+ importError: unknown,
167
+ ): CheckResult {
168
+ if (importError !== undefined) {
169
+ return {
170
+ message: DECLARATION_CHECK_MESSAGE,
171
+ passed: false,
172
+ details: formatDeclarationError(importError),
173
+ };
174
+ }
175
+ if (!provider) return { message: DECLARATION_CHECK_MESSAGE, passed: false };
176
+ try {
177
+ validateFailClosedDeclaration(provider);
178
+ return { message: DECLARATION_CHECK_MESSAGE, passed: true };
179
+ } catch (error) {
180
+ return {
181
+ message: DECLARATION_CHECK_MESSAGE,
182
+ passed: false,
183
+ details: formatDeclarationError(error),
184
+ };
185
+ }
186
+ }
187
+
188
+ function formatDeclarationError(error: unknown): string[] {
189
+ if (isProviderError(error) && error.code === DECLARATION_INVALID_CODE) {
190
+ const details = error.details;
191
+ if (isRecord(details) && Array.isArray(details.violations)) {
192
+ return details.violations.map((violation) => {
193
+ if (!isRecord(violation)) return String(violation);
194
+ const ruleId = typeof violation.ruleId === "string" ? violation.ruleId : "unknown-rule";
195
+ const path = typeof violation.path === "string" ? violation.path : "unknown-path";
196
+ const message = typeof violation.message === "string" ? `: ${violation.message}` : "";
197
+ const fix = typeof violation.fix === "string" ? ` Fix: ${violation.fix}` : "";
198
+ return `${path} [${ruleId}]${message}${fix}`;
199
+ });
200
+ }
201
+ }
202
+ return [error instanceof Error ? error.message : String(error)];
203
+ }
204
+
141
205
  export const PROMPT_ASSETS_CHECK_MESSAGE =
142
206
  "Agent prompt assets match the installed SDK version";
143
207
 
@@ -162,6 +226,21 @@ function isScannableProviderSourceFile(relativePath: string): boolean {
162
226
  );
163
227
  }
164
228
 
229
+ /**
230
+ * A directory under the provider root that is itself a git checkout — a linked
231
+ * worktree (`.worktree/<branch>/`, whose `.git` is a file pointing at the main
232
+ * repository), a nested clone (`.git` directory), or an initialised submodule.
233
+ * Its files are another revision of some repository, not this provider's
234
+ * runtime source: an older copy of `upstream/` or `scripts/` there would be
235
+ * linted as if it were request-path code at the root (the tooling-directory
236
+ * exemption is anchored at the provider root), and its `apifuse check` is run
237
+ * in that checkout, not here. Git refuses to track a path named `.git`, so the
238
+ * marker cannot be planted in a committed tree to hide a file from the scan.
239
+ */
240
+ function isNestedCheckout(directory: string): boolean {
241
+ return existsSync(join(directory, ".git"));
242
+ }
243
+
165
244
  function collectProviderSourceFiles(providerRoot: string): Record<string, string> {
166
245
  const sources: Record<string, string> = {};
167
246
  // `.agents`/`.apifuse` are deliberately not skipped: managed content there
@@ -172,7 +251,7 @@ function collectProviderSourceFiles(providerRoot: string): Record<string, string
172
251
  for (const entry of readdirSync(directory, { withFileTypes: true })) {
173
252
  const path = resolve(directory, entry.name);
174
253
  if (entry.isDirectory()) {
175
- if (!skipDirectories.has(entry.name)) {
254
+ if (!skipDirectories.has(entry.name) && !isNestedCheckout(path)) {
176
255
  visit(path);
177
256
  }
178
257
  continue;
@@ -306,9 +385,30 @@ function checkSchemas(provider: ProviderDefinition | undefined): CheckResult {
306
385
  };
307
386
  }
308
387
 
388
+ /**
389
+ * Reads `locales/en.json` so the error-localization lint rules can resolve
390
+ * declared `messageKey`/`fixKey` values. An absent or unreadable catalog is
391
+ * reported as an empty catalog rather than as "no catalog": a provider that
392
+ * references locale keys without shipping `en.json` must still fail the
393
+ * missing-key rule instead of silently skipping it.
394
+ */
395
+ function readEnglishLocaleCatalog(providerRoot: string): Record<string, unknown> {
396
+ const catalogPath = resolve(providerRoot, "locales", "en.json");
397
+ if (!existsSync(catalogPath)) return {};
398
+ try {
399
+ const parsed: unknown = JSON.parse(readFileSync(catalogPath, "utf8"));
400
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
401
+ ? (parsed as Record<string, unknown>)
402
+ : {};
403
+ } catch {
404
+ return {};
405
+ }
406
+ }
407
+
309
408
  function checkAuthoringLint(
310
409
  provider: ProviderDefinition | undefined,
311
410
  providerSourceFiles: Record<string, string>,
411
+ localeCatalogEn: Record<string, unknown>,
312
412
  lintMode: ProviderLintMode = "official",
313
413
  ): CheckResult {
314
414
  if (!provider) {
@@ -318,12 +418,21 @@ function checkAuthoringLint(
318
418
  };
319
419
  }
320
420
 
321
- const diagnostics = lintProvider({ ...provider, providerSourceFiles }, { mode: lintMode });
421
+ const { diagnostics, information } = lintProviderWithInformation(
422
+ { ...provider, providerSourceFiles, localeCatalogEn },
423
+ { mode: lintMode },
424
+ );
322
425
  const errors = diagnostics.filter((diagnostic) => diagnostic.level === "error");
323
- const details = diagnostics.map((diagnostic) => {
324
- const field = diagnostic.field ? `${diagnostic.field}: ` : "";
325
- return `${diagnostic.level.toUpperCase()} ${diagnostic.rule} ${field}${diagnostic.message}`;
426
+ const details = information.map((entry) => {
427
+ const field = entry.field ? `${entry.field}: ` : "";
428
+ return `INFO ${entry.rule} ${field}${entry.message}`;
326
429
  });
430
+ details.push(
431
+ ...diagnostics.map((diagnostic) => {
432
+ const field = diagnostic.field ? `${diagnostic.field}: ` : "";
433
+ return `${diagnostic.level.toUpperCase()} ${diagnostic.rule} ${field}${diagnostic.message}`;
434
+ }),
435
+ );
327
436
 
328
437
  return {
329
438
  message: "Provider authoring lint has no error-level diagnostics",
@@ -378,6 +487,64 @@ function checkProviderMetadata(provider: ProviderDefinition | undefined): CheckR
378
487
  };
379
488
  }
380
489
 
490
+ export const DEPLOYMENT_INTENT_CHECK_MESSAGE =
491
+ "Deployment intent lives only in defineProvider({ deployment }) without restating profile defaults";
492
+ export const LEGACY_DEPLOY_FILE_RULE = "deployment/legacy-deploy-file";
493
+ export const REDUNDANT_DEPLOYMENT_DEFAULT_RULE = "deployment/redundant-default";
494
+ export const SPREAD_EXPORT_DEPLOYMENT_RULE = "deployment/spread-export";
495
+
496
+ /**
497
+ * Deployment intent has one authored home: the `deployment` key on
498
+ * `defineProvider()`, carrying only the fields that differ from the runtime
499
+ * profile. A standalone `deploy.ts` is a legacy surface and a field that
500
+ * restates a profile default is noise the platform derives anyway. Both are
501
+ * reported as warnings while the fleet migrates (`apifuse
502
+ * migrate-deployment`); they become errors once no repository carries the
503
+ * legacy file.
504
+ */
505
+ async function checkDeploymentIntent(
506
+ providerRoot: string,
507
+ provider: ProviderDefinition | undefined,
508
+ ): Promise<CheckResult> {
509
+ const details: string[] = [];
510
+ if (existsSync(resolve(providerRoot, "deploy.ts"))) {
511
+ details.push(
512
+ `WARN ${LEGACY_DEPLOY_FILE_RULE}: deploy.ts is a legacy deployment surface; run \`apifuse migrate-deployment .\` to move its non-default values into defineProvider({ deployment }) and delete the file.`,
513
+ );
514
+ }
515
+ // A `deployment` extra on `export default { ...provider, deployment }` is
516
+ // indistinguishable from a declaration key once the module is loaded, so
517
+ // inspect the source. The inspector needs the TypeScript compiler (a
518
+ // devDependency of provider repositories); without it this rule is skipped.
519
+ const indexPath = resolve(providerRoot, "index.ts");
520
+ if (existsSync(indexPath)) {
521
+ try {
522
+ const { findSpreadExportDeploymentProperty } = await import(
523
+ "../src/cli/migrate-deployment-intent.js"
524
+ );
525
+ const spread = findSpreadExportDeploymentProperty(readFileSync(indexPath, "utf8"), indexPath);
526
+ if (spread !== undefined) {
527
+ details.push(
528
+ `WARN ${SPREAD_EXPORT_DEPLOYMENT_RULE}: index.ts:${spread.line} attaches \`deployment\` to a spread default export; the only authored surface is the \`deployment\` key inside defineProvider({...}). Run \`apifuse migrate-deployment .\` to hoist it.`,
529
+ );
530
+ }
531
+ } catch {
532
+ // TypeScript unavailable: the source-shape rule cannot run here.
533
+ }
534
+ }
535
+ if (provider?.deployment !== undefined) {
536
+ for (const redundant of redundantDeploymentDefaults(provider.deployment)) {
537
+ details.push(`WARN ${REDUNDANT_DEPLOYMENT_DEFAULT_RULE}: ${redundant.message}`);
538
+ }
539
+ }
540
+ return {
541
+ message: DEPLOYMENT_INTENT_CHECK_MESSAGE,
542
+ // Warning-only during the fleet migration window.
543
+ passed: true,
544
+ details,
545
+ };
546
+ }
547
+
381
548
  function checkDockerfile(dockerfilePath: string): CheckResult {
382
549
  return {
383
550
  message: "Dockerfile exists",
@@ -419,6 +586,119 @@ function checkPackageJson(packageJsonPath: string): CheckResult {
419
586
  }
420
587
  }
421
588
 
589
+ export const PROVIDER_JSON_CHECK_MESSAGE = "provider.json exists with a valid declaration";
590
+
591
+ /**
592
+ * Markets a provider may declare as its primary, and the locales the platform
593
+ * catalogs can carry.
594
+ *
595
+ * These mirror `scripts/provider-deploy/provider-locale-coverage.mjs` in the
596
+ * APIFuse monorepo, which is the policy's source of truth. The duplication is
597
+ * deliberate and bounded: the monorepo cannot be imported from a provider
598
+ * checkout, and a *closed* mirror is the point — it keeps a typo
599
+ * (`primaryMarket: "jp-JP"`) a local failure instead of one that only surfaces
600
+ * in the monorepo's contract validator days later.
601
+ */
602
+ const PROVIDER_PRIMARY_MARKETS = ["jp", "kr", "global"] as const;
603
+ const PROVIDER_COVERAGE_LOCALES = ["en", "ko", "ja"] as const;
604
+ const PROVIDER_BASELINE_LOCALE = "en";
605
+
606
+ /**
607
+ * Declared locale coverage, optional at schemaVersion 1.
608
+ *
609
+ * `apifuse provider declare-locale-coverage` writes this block, and the
610
+ * monorepo declaration schema has accepted it since the rollout landed. This
611
+ * check used to close `provider.json` over four keys, which made the only
612
+ * documented way to clear the monorepo's `LOCALE_COVERAGE_UNDECLARED` finding
613
+ * turn a green `bun run check` red — the declaration was unfixable from either
614
+ * side. The fix is to mirror the monorepo schema rather than to stop
615
+ * validating: the block stays closed over its own two keys so a misspelled
616
+ * field is still caught here, at authoring time.
617
+ */
618
+ const providerI18nDeclarationSchema = z
619
+ .object({
620
+ primaryMarket: z.enum(PROVIDER_PRIMARY_MARKETS),
621
+ locales: z
622
+ .array(z.enum(PROVIDER_COVERAGE_LOCALES))
623
+ .nonempty()
624
+ .refine((locales) => new Set(locales).size === locales.length, {
625
+ message: "i18n.locales must not repeat a locale",
626
+ })
627
+ .refine((locales) => locales.includes(PROVIDER_BASELINE_LOCALE), {
628
+ message: `i18n.locales must include "${PROVIDER_BASELINE_LOCALE}": it is the fallback every other locale resolves through`,
629
+ })
630
+ .optional(),
631
+ })
632
+ .strict();
633
+
634
+ const providerDeclarationSchema = z
635
+ .object({
636
+ schemaVersion: z.literal(1),
637
+ providerId: z.string(),
638
+ owner: z.string(),
639
+ lifecycle: z.enum(["draft", "ready", "live", "retired"]),
640
+ i18n: providerI18nDeclarationSchema.optional(),
641
+ })
642
+ .strict();
643
+
644
+ function checkProviderJson(providerJsonPath: string, packageJsonPath: string): CheckResult {
645
+ if (!existsSync(providerJsonPath)) {
646
+ return {
647
+ message: PROVIDER_JSON_CHECK_MESSAGE,
648
+ passed: false,
649
+ details: ["Missing provider.json at the provider root"],
650
+ };
651
+ }
652
+
653
+ try {
654
+ const declaration = providerDeclarationSchema.parse(
655
+ JSON.parse(readFileSync(providerJsonPath, "utf-8")) as unknown,
656
+ );
657
+ const expectedProviderId = readProviderIdFromPackageName(packageJsonPath);
658
+ if (expectedProviderId !== undefined && declaration.providerId !== expectedProviderId) {
659
+ return {
660
+ message: PROVIDER_JSON_CHECK_MESSAGE,
661
+ passed: false,
662
+ details: [
663
+ `provider.json providerId "${declaration.providerId}" does not match package.json name (expected "${expectedProviderId}")`,
664
+ ],
665
+ };
666
+ }
667
+
668
+ return {
669
+ message: PROVIDER_JSON_CHECK_MESSAGE,
670
+ passed: true,
671
+ details: [
672
+ `providerId: ${declaration.providerId}`,
673
+ `lifecycle: ${declaration.lifecycle}`,
674
+ ...(declaration.i18n
675
+ ? [
676
+ `locale coverage: primaryMarket ${declaration.i18n.primaryMarket}${
677
+ declaration.i18n.locales ? ` (locales: ${declaration.i18n.locales.join(", ")})` : ""
678
+ }`,
679
+ ]
680
+ : []),
681
+ ],
682
+ };
683
+ } catch (error) {
684
+ return {
685
+ message: PROVIDER_JSON_CHECK_MESSAGE,
686
+ passed: false,
687
+ details: [error instanceof Error ? error.message : String(error)],
688
+ };
689
+ }
690
+ }
691
+
692
+ function readProviderIdFromPackageName(packageJsonPath: string): string | undefined {
693
+ try {
694
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")) as unknown;
695
+ if (!isRecord(packageJson) || typeof packageJson.name !== "string") return undefined;
696
+ return /^(?:apifuse-provider-|@apifuse\/provider-)(.+)$/.exec(packageJson.name)?.[1];
697
+ } catch {
698
+ return undefined;
699
+ }
700
+ }
701
+
422
702
  function assertProviderDefinition(value: unknown): ProviderDefinition | undefined {
423
703
  return isProviderDefinition(value) ? value : undefined;
424
704
  }
@@ -431,7 +711,7 @@ function isProviderDefinition(value: unknown): value is ProviderDefinition {
431
711
  return (
432
712
  typeof value.id === "string" &&
433
713
  typeof value.version === "string" &&
434
- (value.runtime === "standard" || value.runtime === "browser") &&
714
+ (value.runtime === "standard" || value.runtime === "shared" || value.runtime === "browser") &&
435
715
  typeof value.meta.displayName === "string" &&
436
716
  typeof value.meta.category === "string"
437
717
  );
@@ -1,21 +1,27 @@
1
1
  #!/usr/bin/env bun
2
+ import { readDiagnosticEnv } from "../src/runtime/diagnostic-env.js";
2
3
 
3
4
  import { existsSync } from "node:fs";
4
5
  import { dirname, relative, resolve } from "node:path";
5
- import type { ProviderDefinition } from "../src/index.js";
6
6
  import {
7
- createBrowserClient,
8
7
  createCredentialContext,
9
- createEnvContext,
10
8
  createHttpClient,
9
+ createInProcessProviderEngine,
10
+ createOcrClientFromEnv,
11
11
  createProviderCache,
12
- createProviderChoiceContext,
13
- createStealthClient,
12
+ createHandleContext,
13
+ createProviderEnvironment,
14
14
  createSttClientFromEnv,
15
- PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV,
15
+ type ProviderDefinition,
16
+ type ProviderEngineBindingCandidates,
16
17
  ProviderError,
17
18
  } from "../src/index.js";
19
+ import { createCliResolverRuntime } from "../src/cli/resolver-runtime.js";
20
+ import { assertProcessEngineModeSupported } from "../src/runtime/engine-mode.js";
21
+ import { createBrowserClient } from "../src/runtime/browser.js";
18
22
  import { createMemoryProviderRuntimeState } from "../src/runtime/state.js";
23
+ import { createStealthClient } from "../src/runtime/stealth.js";
24
+ import type { ResolverTelemetryCollector } from "../src/runtime/resolver-telemetry.js";
19
25
  import { createTraceContext } from "../src/runtime/trace.js";
20
26
  import type { BrowserClient, ProviderContext } from "../src/types.js";
21
27
 
@@ -35,6 +41,9 @@ export async function main() {
35
41
  const providerModule = await import(resolve(providerPath, "index.ts"));
36
42
  const provider = assertProviderDefinition(providerModule.default, providerPath);
37
43
 
44
+ // Fail fast before the server starts: this is a developer tool, and an
45
+ // explicit remote request must never silently fall back to in-process.
46
+ assertProcessEngineModeSupported();
38
47
  const { startDevServer } = await import("../src/dev.js");
39
48
  const port = Number(process.env.APIFUSE__RUNTIME__PORT) || 3900;
40
49
 
@@ -42,6 +51,7 @@ export async function main() {
42
51
 
43
52
  console.log("\nEndpoints:");
44
53
  console.log(` GET http://localhost:${port}/health`);
54
+ console.log(` GET http://localhost:${port}/readyz`);
45
55
 
46
56
  for (const operationId of Object.keys(provider.operations)) {
47
57
  console.log(` POST http://localhost:${port}/v1/${operationId}`);
@@ -73,15 +83,19 @@ export async function main() {
73
83
 
74
84
  export function createProviderContext(provider: ProviderDefinition): {
75
85
  ctx: ProviderContext;
86
+ resolverTelemetry: ResolverTelemetryCollector;
76
87
  } {
77
- const env = createEnvContext([
78
- ...(provider.secrets?.map((secret) => secret.name) ?? []),
79
- PROVIDER_RUNTIME_CHOICE_TOKEN_MASTER_SECRET_ENV,
80
- ]);
88
+ const providerEnvironment = createProviderEnvironment(
89
+ process.env,
90
+ provider.secrets?.map((secret) => secret.name) ?? [],
91
+ );
92
+ const providerEnv = { get: (key: string) => readDiagnosticEnv(key, providerEnvironment) };
81
93
  const credential = createCredentialContext();
82
94
  const state = createMemoryProviderRuntimeState();
83
- const ctx: ProviderContext = {
84
- env,
95
+ const cache = createProviderCache({ providerId: provider.id });
96
+ const { resolver, resolverTelemetry } = createCliResolverRuntime(provider, cache);
97
+ const candidates: ProviderEngineBindingCandidates = {
98
+ env: providerEnv,
85
99
  credential,
86
100
  auth: createUnsupportedAuthStub(),
87
101
  browser:
@@ -92,20 +106,29 @@ export function createProviderContext(provider: ProviderDefinition): {
92
106
  })
93
107
  : createUnsupportedBrowserStub(),
94
108
  http: createHttpClient(),
95
- cache: createProviderCache({ providerId: provider.id }),
109
+ cache,
96
110
  state,
97
111
  trace: createTraceContext(),
98
- stealth: createStealthClient("http://localhost"),
112
+ stealth: createStealthClient("http://localhost", {
113
+ ...(provider.stealth ? { stealth: provider.stealth } : {}),
114
+ }),
115
+ ocr: createOcrClientFromEnv(provider.ocr),
99
116
  stt: createSttClientFromEnv(provider.stt),
100
- choice: createProviderChoiceContext({
117
+ resolver,
118
+ handle: createHandleContext({
101
119
  providerId: provider.id,
102
- env,
103
- credential,
120
+ // Local dev is a single-user session: one stable connection scope so
121
+ // bound handles (drafts, default cursors) work exactly as in production.
122
+ request: { headers: {}, connectionId: "local-dev" },
104
123
  state,
105
124
  }),
106
125
  };
126
+ const ctx = createInProcessProviderEngine().attach({
127
+ provider,
128
+ bindings: candidates,
129
+ }) as ProviderContext;
107
130
 
108
- return { ctx };
131
+ return { ctx, resolverTelemetry };
109
132
  }
110
133
 
111
134
  function normalizeArgs(argv: string[]): string[] {
@@ -216,7 +239,7 @@ function isProviderDefinition(value: unknown): value is ProviderDefinition {
216
239
  return (
217
240
  typeof value.id === "string" &&
218
241
  typeof value.version === "string" &&
219
- (value.runtime === "standard" || value.runtime === "browser") &&
242
+ (value.runtime === "standard" || value.runtime === "shared" || value.runtime === "browser") &&
220
243
  typeof value.meta.displayName === "string" &&
221
244
  typeof value.meta.category === "string"
222
245
  );