@pikku/core 0.12.106 → 0.12.111

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 (589) hide show
  1. package/CHANGELOG.md +358 -0
  2. package/dist/analytics/analytics.d.ts +6 -0
  3. package/dist/analytics/analytics.js +58 -0
  4. package/dist/analytics/analytics.types.d.ts +156 -0
  5. package/dist/analytics/analytics.types.js +1 -0
  6. package/dist/analytics/anonymous-analytics-identity.d.ts +23 -0
  7. package/dist/analytics/anonymous-analytics-identity.js +27 -0
  8. package/dist/analytics/compose-analytics-identity.d.ts +14 -0
  9. package/dist/analytics/compose-analytics-identity.js +33 -0
  10. package/dist/analytics/cookie-analytics-identity.d.ts +24 -0
  11. package/dist/analytics/cookie-analytics-identity.js +37 -0
  12. package/dist/analytics/define-analytics-events.d.ts +22 -0
  13. package/dist/analytics/define-analytics-events.js +9 -0
  14. package/dist/analytics/fan-out-analytics.d.ts +15 -0
  15. package/dist/analytics/fan-out-analytics.js +36 -0
  16. package/dist/analytics/index.d.ts +13 -0
  17. package/dist/analytics/index.js +8 -0
  18. package/dist/analytics/logger-analytics-service.d.ts +14 -0
  19. package/dist/analytics/logger-analytics-service.js +23 -0
  20. package/dist/analytics/mint-cookie.d.ts +44 -0
  21. package/dist/analytics/mint-cookie.js +55 -0
  22. package/dist/errors/errors.d.ts +7 -0
  23. package/dist/errors/errors.js +17 -0
  24. package/dist/function/function-meta.types.d.ts +2 -0
  25. package/dist/function/function-runner.js +29 -0
  26. package/dist/function/functions.types.d.ts +22 -3
  27. package/dist/middleware/auth-apikey.d.ts +1 -1
  28. package/dist/pikku-state.d.ts +1 -1
  29. package/dist/scopes.d.ts +11 -0
  30. package/dist/scopes.js +17 -0
  31. package/dist/services/credential-wire-service.d.ts +1 -1
  32. package/dist/services/feature-flag-service.d.ts +100 -0
  33. package/dist/services/feature-flag-service.js +1 -0
  34. package/dist/services/index.d.ts +1 -0
  35. package/dist/services/meta-service.d.ts +16 -0
  36. package/dist/services/meta-service.js +19 -0
  37. package/dist/services/webhook-service.d.ts +7 -2
  38. package/dist/services/webhook-service.js +11 -6
  39. package/dist/testing/service-tests/agent-run-service-tests.d.ts +2 -2
  40. package/dist/testing/service-tests/agent-storage-service-tests.d.ts +1 -1
  41. package/dist/testing/service-tests/channel-store-tests.d.ts +1 -1
  42. package/dist/testing/service-tests/credential-service-tests.d.ts +1 -1
  43. package/dist/testing/service-tests/deployment-service-tests.d.ts +1 -1
  44. package/dist/testing/service-tests/event-hub-store-tests.d.ts +1 -1
  45. package/dist/testing/service-tests/secret-service-tests.d.ts +1 -1
  46. package/dist/testing/service-tests/session-store-tests.d.ts +1 -1
  47. package/dist/testing/service-tests/workflow-run-service-tests.d.ts +1 -1
  48. package/dist/testing/service-tests/workflow-service-tests.d.ts +1 -1
  49. package/dist/types/core.types.d.ts +23 -0
  50. package/dist/wirings/agent/agent-rpc.d.ts +1 -1
  51. package/dist/wirings/agent/agent-turn.d.ts +1 -1
  52. package/dist/wirings/agent-scorer/agent-scorer-live.d.ts +1 -1
  53. package/dist/wirings/channel/channel-common.d.ts +1 -1
  54. package/dist/wirings/channel/channel-rpc-validators.d.ts +2 -2
  55. package/dist/wirings/channel/channel-runner.d.ts +1 -1
  56. package/dist/wirings/channel/local/local-channel-runner.d.ts +1 -1
  57. package/dist/wirings/channel/serverless/serverless-channel-runner.d.ts +1 -1
  58. package/dist/wirings/cli/channel/cli-approval.d.ts +2 -2
  59. package/dist/wirings/flag/assert-feature-available.d.ts +15 -0
  60. package/dist/wirings/flag/assert-feature-available.js +23 -0
  61. package/dist/wirings/flag/cached-flag-source.d.ts +73 -0
  62. package/dist/wirings/flag/cached-flag-source.js +96 -0
  63. package/dist/wirings/flag/define-feature-flags.d.ts +33 -0
  64. package/dist/wirings/flag/define-feature-flags.js +32 -0
  65. package/dist/wirings/flag/flag.types.d.ts +97 -0
  66. package/dist/wirings/flag/flag.types.js +1 -0
  67. package/dist/wirings/flag/index.d.ts +7 -0
  68. package/dist/wirings/flag/index.js +5 -0
  69. package/dist/wirings/flag/resolve-flag.d.ts +52 -0
  70. package/dist/wirings/flag/resolve-flag.js +90 -0
  71. package/dist/wirings/flag/validate-flag-definitions.d.ts +26 -0
  72. package/dist/wirings/flag/validate-flag-definitions.js +103 -0
  73. package/dist/wirings/rpc/rpc-runner.js +3 -0
  74. package/dist/wirings/virtual-user/virtual-user-scaffold.d.ts +8 -8
  75. package/dist/wirings/virtual-user/virtual-user-schedule.d.ts +1 -1
  76. package/dist/wirings/workflow/workflow-queue-routing.d.ts +1 -1
  77. package/package.json +11 -5
  78. package/run-tests.sh +17 -9
  79. package/src/public-surface.json +26 -0
  80. package/src/agent-naming.test.ts +0 -68
  81. package/src/api-report.test.ts +0 -138
  82. package/src/app-alias-surface.test.ts +0 -179
  83. package/src/app-leaf-surface.test.ts +0 -222
  84. package/src/bootstrap-compat/root.ts +0 -20
  85. package/src/classification/column-form.test.ts +0 -97
  86. package/src/classification/column-form.ts +0 -55
  87. package/src/classification/data-classification.ts +0 -73
  88. package/src/classification/index.ts +0 -40
  89. package/src/classification/key-ids.ts +0 -2
  90. package/src/classification/secret-value.test.ts +0 -204
  91. package/src/classification/secret-value.ts +0 -106
  92. package/src/crypto-utils.test.ts +0 -668
  93. package/src/crypto-utils.ts +0 -460
  94. package/src/dev/hot-reload.test.ts +0 -587
  95. package/src/dev/hot-reload.ts +0 -225
  96. package/src/dev/module-runner.test.ts +0 -235
  97. package/src/dev/module-runner.ts +0 -138
  98. package/src/dev/reload-meta.test.ts +0 -183
  99. package/src/dev/reload-meta.ts +0 -144
  100. package/src/ecosystem-tier-removed.test.ts +0 -72
  101. package/src/env.ts +0 -1
  102. package/src/errors/error-handler.ts +0 -77
  103. package/src/errors/error.test.ts +0 -229
  104. package/src/errors/errors.ts +0 -393
  105. package/src/errors/index.ts +0 -11
  106. package/src/errors/serialized-error.ts +0 -12
  107. package/src/factory-functions.test.ts +0 -111
  108. package/src/function/abort-scope.test.ts +0 -97
  109. package/src/function/abort-scope.ts +0 -80
  110. package/src/function/function-meta.types.ts +0 -151
  111. package/src/function/function-runner.test.ts +0 -1619
  112. package/src/function/function-runner.ts +0 -499
  113. package/src/function/functions.types.ts +0 -319
  114. package/src/function/index.ts +0 -40
  115. package/src/function/list.types.test.ts +0 -100
  116. package/src/function/list.types.ts +0 -69
  117. package/src/function/pikku-request.test.ts +0 -35
  118. package/src/function/pikku-request.ts +0 -17
  119. package/src/gopass-secrets-removed.test.ts +0 -51
  120. package/src/handle-error.test.ts +0 -532
  121. package/src/handle-error.ts +0 -64
  122. package/src/middleware/auth-apikey.test.ts +0 -362
  123. package/src/middleware/auth-apikey.ts +0 -39
  124. package/src/middleware/auth-bearer.test.ts +0 -566
  125. package/src/middleware/auth-bearer.ts +0 -83
  126. package/src/middleware/auth-cookie.test.ts +0 -572
  127. package/src/middleware/auth-cookie.ts +0 -107
  128. package/src/middleware/cors.test.ts +0 -579
  129. package/src/middleware/cors.ts +0 -103
  130. package/src/middleware/index.ts +0 -30
  131. package/src/middleware/middleware-factories.ts +0 -76
  132. package/src/middleware/middleware.types.ts +0 -61
  133. package/src/middleware/remote-auth.test.ts +0 -547
  134. package/src/middleware/remote-auth.ts +0 -95
  135. package/src/middleware/remote-jobs-secret.ts +0 -35
  136. package/src/middleware/require-origin.test.ts +0 -115
  137. package/src/middleware/require-origin.ts +0 -79
  138. package/src/middleware/telemetry.ts +0 -83
  139. package/src/middleware-runner.test.ts +0 -578
  140. package/src/middleware-runner.ts +0 -232
  141. package/src/no-any-casts.test.ts +0 -57
  142. package/src/no-root-barrel.test.ts +0 -122
  143. package/src/permissions.test.ts +0 -256
  144. package/src/permissions.ts +0 -217
  145. package/src/pikku-state.test.ts +0 -198
  146. package/src/pikku-state.ts +0 -206
  147. package/src/production-barrels-stay-lean.test.ts +0 -110
  148. package/src/public-surface.test.ts +0 -133
  149. package/src/remote.test.ts +0 -173
  150. package/src/remote.ts +0 -56
  151. package/src/removed-legacy-exports.test.ts +0 -66
  152. package/src/run-tests-script.test.ts +0 -67
  153. package/src/schema.test.ts +0 -430
  154. package/src/schema.ts +0 -204
  155. package/src/scopes.test.ts +0 -203
  156. package/src/scopes.ts +0 -67
  157. package/src/services/agent-run-state-service.ts +0 -37
  158. package/src/services/agent-runner-service.ts +0 -238
  159. package/src/services/agent-storage-service.ts +0 -39
  160. package/src/services/ai-embedding-service.ts +0 -9
  161. package/src/services/audit-service.test.ts +0 -44
  162. package/src/services/audit-service.ts +0 -280
  163. package/src/services/content-service.ts +0 -65
  164. package/src/services/credential-service.ts +0 -20
  165. package/src/services/credential-wire-service.test.ts +0 -235
  166. package/src/services/credential-wire-service.ts +0 -120
  167. package/src/services/deployment-service.ts +0 -32
  168. package/src/services/email-service.test.ts +0 -100
  169. package/src/services/email-service.ts +0 -60
  170. package/src/services/email-template.test.ts +0 -311
  171. package/src/services/email-template.ts +0 -254
  172. package/src/services/file-scenario-run-store.test.ts +0 -349
  173. package/src/services/file-scenario-run-store.ts +0 -282
  174. package/src/services/gateway-service.ts +0 -5
  175. package/src/services/http-personas-converse.test.ts +0 -274
  176. package/src/services/http-personas.test.ts +0 -379
  177. package/src/services/http-personas.ts +0 -508
  178. package/src/services/in-memory-agent-run-state-service.ts +0 -87
  179. package/src/services/in-memory-queue-service.test.ts +0 -162
  180. package/src/services/in-memory-queue-service.ts +0 -78
  181. package/src/services/in-memory-session-store.test.ts +0 -58
  182. package/src/services/in-memory-session-store.ts +0 -20
  183. package/src/services/in-memory-trigger-service.ts +0 -47
  184. package/src/services/in-memory-workflow-service.test.ts +0 -430
  185. package/src/services/in-memory-workflow-service.ts +0 -595
  186. package/src/services/index.ts +0 -192
  187. package/src/services/istanbul-coverage-service.test.ts +0 -66
  188. package/src/services/istanbul-coverage-service.ts +0 -59
  189. package/src/services/jwt-service.ts +0 -15
  190. package/src/services/local-content-request-handler.test.ts +0 -240
  191. package/src/services/local-content-request-handler.ts +0 -295
  192. package/src/services/local-content.test.ts +0 -186
  193. package/src/services/local-content.ts +0 -242
  194. package/src/services/local-credential-service.ts +0 -63
  195. package/src/services/local-email-service.test.ts +0 -182
  196. package/src/services/local-email-service.ts +0 -43
  197. package/src/services/local-gateway-service.ts +0 -51
  198. package/src/services/local-secrets.test.ts +0 -95
  199. package/src/services/local-secrets.ts +0 -71
  200. package/src/services/local-variables.test.ts +0 -61
  201. package/src/services/local-variables.ts +0 -45
  202. package/src/services/logger-console.test.ts +0 -117
  203. package/src/services/logger-console.ts +0 -174
  204. package/src/services/logger.ts +0 -48
  205. package/src/services/meta-service.test.ts +0 -75
  206. package/src/services/meta-service.ts +0 -767
  207. package/src/services/persona-actor-secret.test.ts +0 -68
  208. package/src/services/persona-actor-secret.ts +0 -70
  209. package/src/services/persona-sign-in.test.ts +0 -219
  210. package/src/services/persona-sign-in.ts +0 -238
  211. package/src/services/personas-service.ts +0 -191
  212. package/src/services/pikku-user-id.test.ts +0 -62
  213. package/src/services/pikku-user-id.ts +0 -13
  214. package/src/services/queue-webhook-service.test.ts +0 -409
  215. package/src/services/queue-webhook-service.ts +0 -150
  216. package/src/services/remote-jobs.test.ts +0 -106
  217. package/src/services/remote-jobs.ts +0 -92
  218. package/src/services/scheduler-service.ts +0 -37
  219. package/src/services/schema-service.ts +0 -10
  220. package/src/services/scope-service.ts +0 -91
  221. package/src/services/scoped-credential-service.test.ts +0 -86
  222. package/src/services/scoped-credential-service.ts +0 -63
  223. package/src/services/scoped-secret-service.test.ts +0 -93
  224. package/src/services/scoped-secret-service.ts +0 -40
  225. package/src/services/secret-host-binding.test.ts +0 -138
  226. package/src/services/secret-host-binding.ts +0 -51
  227. package/src/services/secret-service.ts +0 -25
  228. package/src/services/secretless.test.ts +0 -54
  229. package/src/services/secretless.ts +0 -29
  230. package/src/services/session-store.ts +0 -9
  231. package/src/services/stub-tracker.test.ts +0 -104
  232. package/src/services/stub-tracker.ts +0 -175
  233. package/src/services/system-role-guard.test.ts +0 -96
  234. package/src/services/system-role-guard.ts +0 -71
  235. package/src/services/temporary-file-service.ts +0 -76
  236. package/src/services/trigger-service.ts +0 -5
  237. package/src/services/typed-credential-service.ts +0 -83
  238. package/src/services/typed-secret-service.test.ts +0 -204
  239. package/src/services/typed-secret-service.ts +0 -132
  240. package/src/services/typed-variables-service.test.ts +0 -166
  241. package/src/services/typed-variables-service.ts +0 -166
  242. package/src/services/user-session-service.test.ts +0 -147
  243. package/src/services/user-session-service.ts +0 -85
  244. package/src/services/v8-coverage-service.test.ts +0 -69
  245. package/src/services/v8-coverage-service.ts +0 -163
  246. package/src/services/variables-service.ts +0 -13
  247. package/src/services/webhook-service.ts +0 -147
  248. package/src/services/workflow-service.ts +0 -120
  249. package/src/side-effects-are-declared.test.ts +0 -84
  250. package/src/source-files-stay-composable.test.ts +0 -41
  251. package/src/template-alias-surface.test.ts +0 -240
  252. package/src/test-utils.ts +0 -38
  253. package/src/testing/index.ts +0 -3
  254. package/src/testing/service-tests/agent-run-service-tests.ts +0 -98
  255. package/src/testing/service-tests/agent-storage-service-tests.ts +0 -379
  256. package/src/testing/service-tests/channel-store-tests.ts +0 -98
  257. package/src/testing/service-tests/credential-service-tests.ts +0 -143
  258. package/src/testing/service-tests/deployment-service-tests.ts +0 -33
  259. package/src/testing/service-tests/event-hub-store-tests.ts +0 -48
  260. package/src/testing/service-tests/secret-service-tests.ts +0 -105
  261. package/src/testing/service-tests/session-store-tests.ts +0 -62
  262. package/src/testing/service-tests/workflow-run-service-tests.ts +0 -59
  263. package/src/testing/service-tests/workflow-service-tests.ts +0 -308
  264. package/src/testing/service-tests.ts +0 -95
  265. package/src/time-utils.test.ts +0 -56
  266. package/src/time-utils.ts +0 -89
  267. package/src/types/core.types.ts +0 -446
  268. package/src/types/index.ts +0 -25
  269. package/src/types/state.types.ts +0 -226
  270. package/src/types/typed-credentials.test.ts +0 -72
  271. package/src/utils/hash.test.ts +0 -68
  272. package/src/utils/hash.ts +0 -26
  273. package/src/utils/hmac.ts +0 -21
  274. package/src/utils/node-host-resolver.ts +0 -20
  275. package/src/utils/safe-fetch.test.ts +0 -515
  276. package/src/utils/safe-fetch.ts +0 -347
  277. package/src/utils.test.ts +0 -359
  278. package/src/utils.ts +0 -165
  279. package/src/version.test.ts +0 -80
  280. package/src/version.ts +0 -25
  281. package/src/wirings/actor-flow/actor-flow.types.ts +0 -40
  282. package/src/wirings/actor-flow/index.ts +0 -10
  283. package/src/wirings/actor-flow/run-conversation.test.ts +0 -187
  284. package/src/wirings/actor-flow/run-conversation.ts +0 -280
  285. package/src/wirings/addon/addon-auth-tags.test.ts +0 -219
  286. package/src/wirings/addon/addon-runner.ts +0 -236
  287. package/src/wirings/addon/addon-scopes.test.ts +0 -225
  288. package/src/wirings/addon/addon-secrets.test.ts +0 -391
  289. package/src/wirings/addon/index.ts +0 -12
  290. package/src/wirings/addon/remote-addon-auth.ts +0 -65
  291. package/src/wirings/addon/wire-addon.test.ts +0 -102
  292. package/src/wirings/addon/wire-addon.ts +0 -202
  293. package/src/wirings/addon/wire-remote-addon.ts +0 -41
  294. package/src/wirings/agent/agent-agui.test.ts +0 -1213
  295. package/src/wirings/agent/agent-agui.ts +0 -405
  296. package/src/wirings/agent/agent-authorization.test.ts +0 -208
  297. package/src/wirings/agent/agent-finalize.test.ts +0 -187
  298. package/src/wirings/agent/agent-finalize.ts +0 -197
  299. package/src/wirings/agent/agent-helpers.test.ts +0 -215
  300. package/src/wirings/agent/agent-helpers.ts +0 -96
  301. package/src/wirings/agent/agent-interrupt.test.ts +0 -833
  302. package/src/wirings/agent/agent-interrupt.ts +0 -400
  303. package/src/wirings/agent/agent-memory.test.ts +0 -397
  304. package/src/wirings/agent/agent-memory.ts +0 -496
  305. package/src/wirings/agent/agent-middleware.types.test.ts +0 -41
  306. package/src/wirings/agent/agent-model-config.test.ts +0 -103
  307. package/src/wirings/agent/agent-model-config.ts +0 -59
  308. package/src/wirings/agent/agent-prepare.test.ts +0 -977
  309. package/src/wirings/agent/agent-prepare.ts +0 -1083
  310. package/src/wirings/agent/agent-registry.test.ts +0 -455
  311. package/src/wirings/agent/agent-registry.ts +0 -99
  312. package/src/wirings/agent/agent-resume-authorization.test.ts +0 -206
  313. package/src/wirings/agent/agent-rpc.ts +0 -116
  314. package/src/wirings/agent/agent-runner.test.ts +0 -1229
  315. package/src/wirings/agent/agent-runner.ts +0 -858
  316. package/src/wirings/agent/agent-stream-delegate.test.ts +0 -381
  317. package/src/wirings/agent/agent-stream-output-hooks.test.ts +0 -353
  318. package/src/wirings/agent/agent-stream.test.ts +0 -1800
  319. package/src/wirings/agent/agent-stream.ts +0 -1639
  320. package/src/wirings/agent/agent-thread-ownership.test.ts +0 -297
  321. package/src/wirings/agent/agent-turn.test.ts +0 -65
  322. package/src/wirings/agent/agent-turn.ts +0 -122
  323. package/src/wirings/agent/agent-utils.ts +0 -20
  324. package/src/wirings/agent/agent.types.ts +0 -676
  325. package/src/wirings/agent/index.ts +0 -58
  326. package/src/wirings/agent/voice-input.test.ts +0 -220
  327. package/src/wirings/agent/voice-input.ts +0 -180
  328. package/src/wirings/agent/voice-output.test.ts +0 -510
  329. package/src/wirings/agent/voice-output.ts +0 -311
  330. package/src/wirings/agent-scorer/agent-scorer-grade.test.ts +0 -106
  331. package/src/wirings/agent-scorer/agent-scorer-grade.ts +0 -55
  332. package/src/wirings/agent-scorer/agent-scorer-judge.test.ts +0 -285
  333. package/src/wirings/agent-scorer/agent-scorer-judge.ts +0 -180
  334. package/src/wirings/agent-scorer/agent-scorer-live.test.ts +0 -174
  335. package/src/wirings/agent-scorer/agent-scorer-live.ts +0 -56
  336. package/src/wirings/agent-scorer/agent-scorer-registry.ts +0 -66
  337. package/src/wirings/agent-scorer/agent-scorer-sampling.test.ts +0 -34
  338. package/src/wirings/agent-scorer/agent-scorer-sampling.ts +0 -36
  339. package/src/wirings/agent-scorer/agent-scorer-snapshots.test.ts +0 -49
  340. package/src/wirings/agent-scorer/agent-scorer-snapshots.ts +0 -46
  341. package/src/wirings/agent-scorer/agent-scorer-worker.test.ts +0 -122
  342. package/src/wirings/agent-scorer/agent-scorer-worker.ts +0 -71
  343. package/src/wirings/agent-scorer/agent-scorer.ts +0 -102
  344. package/src/wirings/agent-scorer/agent-scorer.types.ts +0 -128
  345. package/src/wirings/agent-scorer/index.ts +0 -23
  346. package/src/wirings/channel/channel-common.ts +0 -102
  347. package/src/wirings/channel/channel-handler-shapes.test.ts +0 -72
  348. package/src/wirings/channel/channel-handler.test.ts +0 -322
  349. package/src/wirings/channel/channel-handler.ts +0 -259
  350. package/src/wirings/channel/channel-host-rpc.test.ts +0 -150
  351. package/src/wirings/channel/channel-host-rpc.ts +0 -69
  352. package/src/wirings/channel/channel-middleware-runner.test.ts +0 -188
  353. package/src/wirings/channel/channel-middleware-runner.ts +0 -126
  354. package/src/wirings/channel/channel-rpc-registry.ts +0 -116
  355. package/src/wirings/channel/channel-rpc-responder.ts +0 -117
  356. package/src/wirings/channel/channel-rpc-service.ts +0 -132
  357. package/src/wirings/channel/channel-rpc-validators.ts +0 -65
  358. package/src/wirings/channel/channel-rpc.test.ts +0 -841
  359. package/src/wirings/channel/channel-rpc.ts +0 -5
  360. package/src/wirings/channel/channel-rpc.types.ts +0 -160
  361. package/src/wirings/channel/channel-runner.ts +0 -164
  362. package/src/wirings/channel/channel-store.ts +0 -35
  363. package/src/wirings/channel/channel.types.ts +0 -193
  364. package/src/wirings/channel/define-channel-routes.ts +0 -5
  365. package/src/wirings/channel/eventhub-service.ts +0 -16
  366. package/src/wirings/channel/eventhub-store.ts +0 -13
  367. package/src/wirings/channel/index.ts +0 -40
  368. package/src/wirings/channel/local/index.ts +0 -3
  369. package/src/wirings/channel/local/local-channel-handler.ts +0 -98
  370. package/src/wirings/channel/local/local-channel-runner.test.ts +0 -339
  371. package/src/wirings/channel/local/local-channel-runner.ts +0 -271
  372. package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -77
  373. package/src/wirings/channel/local/local-eventhub-service.ts +0 -69
  374. package/src/wirings/channel/log-channels.ts +0 -16
  375. package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -135
  376. package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -60
  377. package/src/wirings/channel/serverless/index.ts +0 -6
  378. package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -328
  379. package/src/wirings/cli/channel/cli-approval.test.ts +0 -177
  380. package/src/wirings/cli/channel/cli-approval.ts +0 -135
  381. package/src/wirings/cli/channel/cli-channel-runner.ts +0 -118
  382. package/src/wirings/cli/channel/cli-raw-channel-runner.test.ts +0 -192
  383. package/src/wirings/cli/channel/cli-raw-channel-runner.ts +0 -148
  384. package/src/wirings/cli/channel/cli-raw-client-runner.test.ts +0 -480
  385. package/src/wirings/cli/channel/cli-raw-client-runner.ts +0 -188
  386. package/src/wirings/cli/channel/index.ts +0 -6
  387. package/src/wirings/cli/cli-runner.test.ts +0 -969
  388. package/src/wirings/cli/cli-runner.ts +0 -538
  389. package/src/wirings/cli/cli.types.ts +0 -388
  390. package/src/wirings/cli/command-parser.test.ts +0 -1120
  391. package/src/wirings/cli/command-parser.ts +0 -713
  392. package/src/wirings/cli/define-cli-commands.ts +0 -13
  393. package/src/wirings/cli/format-cli-error.test.ts +0 -91
  394. package/src/wirings/cli/format-cli-error.ts +0 -96
  395. package/src/wirings/cli/index.ts +0 -19
  396. package/src/wirings/credential/credential.types.ts +0 -37
  397. package/src/wirings/credential/define-credential.ts +0 -49
  398. package/src/wirings/credential/index.ts +0 -7
  399. package/src/wirings/credential/validate-credential-definitions.ts +0 -63
  400. package/src/wirings/gateway/gateway-authorization.test.ts +0 -575
  401. package/src/wirings/gateway/gateway-channel-meta.test.ts +0 -44
  402. package/src/wirings/gateway/gateway-runner.test.ts +0 -581
  403. package/src/wirings/gateway/gateway-runner.ts +0 -411
  404. package/src/wirings/gateway/gateway.types.ts +0 -137
  405. package/src/wirings/gateway/index.ts +0 -15
  406. package/src/wirings/http/http-routes.test.ts +0 -318
  407. package/src/wirings/http/http-routes.ts +0 -111
  408. package/src/wirings/http/http-runner-addon-ref.test.ts +0 -238
  409. package/src/wirings/http/http-runner.test.ts +0 -503
  410. package/src/wirings/http/http-runner.ts +0 -462
  411. package/src/wirings/http/http.types.ts +0 -307
  412. package/src/wirings/http/index.ts +0 -27
  413. package/src/wirings/http/log-http-routes.ts +0 -18
  414. package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -318
  415. package/src/wirings/http/pikku-fetch-http-request.ts +0 -260
  416. package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -123
  417. package/src/wirings/http/pikku-fetch-http-response.ts +0 -149
  418. package/src/wirings/http/routers/http-router.ts +0 -13
  419. package/src/wirings/http/routers/path-to-regex.test.ts +0 -306
  420. package/src/wirings/http/routers/path-to-regex.ts +0 -115
  421. package/src/wirings/http/web-request.test.ts +0 -382
  422. package/src/wirings/http/web-request.ts +0 -162
  423. package/src/wirings/mcp/index.ts +0 -26
  424. package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -388
  425. package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
  426. package/src/wirings/mcp/mcp-runner.test.ts +0 -588
  427. package/src/wirings/mcp/mcp-runner.ts +0 -330
  428. package/src/wirings/mcp/mcp.types.ts +0 -199
  429. package/src/wirings/node/index.ts +0 -2
  430. package/src/wirings/node/node.types.ts +0 -23
  431. package/src/wirings/oauth2/index.ts +0 -1
  432. package/src/wirings/oauth2/oauth2.types.ts +0 -12
  433. package/src/wirings/persona/define-personas.ts +0 -33
  434. package/src/wirings/persona/index.ts +0 -75
  435. package/src/wirings/persona/persona-app-scopes.test.ts +0 -47
  436. package/src/wirings/persona/persona-app-scopes.ts +0 -74
  437. package/src/wirings/persona/persona-email.ts +0 -87
  438. package/src/wirings/persona/persona-environments.test.ts +0 -194
  439. package/src/wirings/persona/persona-environments.ts +0 -138
  440. package/src/wirings/persona/persona-mailbox.ts +0 -156
  441. package/src/wirings/persona/persona.test.ts +0 -230
  442. package/src/wirings/persona/persona.types.ts +0 -156
  443. package/src/wirings/persona/validate-personas.ts +0 -137
  444. package/src/wirings/queue/index.ts +0 -29
  445. package/src/wirings/queue/queue-identity.test.ts +0 -454
  446. package/src/wirings/queue/queue-identity.ts +0 -176
  447. package/src/wirings/queue/queue-runner.test.ts +0 -705
  448. package/src/wirings/queue/queue-runner.ts +0 -181
  449. package/src/wirings/queue/queue.types.ts +0 -161
  450. package/src/wirings/queue/register-queue-helper.ts +0 -46
  451. package/src/wirings/queue/signed-queue-service.ts +0 -60
  452. package/src/wirings/queue/validate-worker-config.test.ts +0 -108
  453. package/src/wirings/queue/validate-worker-config.ts +0 -90
  454. package/src/wirings/role/define-system-role.ts +0 -33
  455. package/src/wirings/role/index.ts +0 -13
  456. package/src/wirings/role/role.test.ts +0 -104
  457. package/src/wirings/role/role.types.ts +0 -47
  458. package/src/wirings/role/validate-role-definitions.ts +0 -93
  459. package/src/wirings/rpc/index.ts +0 -8
  460. package/src/wirings/rpc/rpc-runner.test.ts +0 -1130
  461. package/src/wirings/rpc/rpc-runner.ts +0 -566
  462. package/src/wirings/rpc/rpc-types.ts +0 -87
  463. package/src/wirings/scheduler/index.ts +0 -11
  464. package/src/wirings/scheduler/log-schedulers.ts +0 -16
  465. package/src/wirings/scheduler/scheduler-runner.test.ts +0 -835
  466. package/src/wirings/scheduler/scheduler-runner.ts +0 -138
  467. package/src/wirings/scheduler/scheduler.types.ts +0 -42
  468. package/src/wirings/scope/define-scope.ts +0 -33
  469. package/src/wirings/scope/index.ts +0 -15
  470. package/src/wirings/scope/scope.test.ts +0 -159
  471. package/src/wirings/scope/scope.types.ts +0 -42
  472. package/src/wirings/scope/validate-scope-definitions.ts +0 -107
  473. package/src/wirings/secret/index.ts +0 -9
  474. package/src/wirings/secret/secret.types.ts +0 -70
  475. package/src/wirings/secret/validate-secret-definitions.test.ts +0 -232
  476. package/src/wirings/secret/validate-secret-definitions.ts +0 -88
  477. package/src/wirings/trigger/index.ts +0 -9
  478. package/src/wirings/trigger/pikku-trigger-service.ts +0 -107
  479. package/src/wirings/trigger/trigger-runner.test.ts +0 -78
  480. package/src/wirings/trigger/trigger-runner.ts +0 -113
  481. package/src/wirings/trigger/trigger.types.ts +0 -100
  482. package/src/wirings/variable/index.ts +0 -8
  483. package/src/wirings/variable/validate-variable-definitions.test.ts +0 -115
  484. package/src/wirings/variable/validate-variable-definitions.ts +0 -71
  485. package/src/wirings/variable/variable.types.ts +0 -40
  486. package/src/wirings/virtual-user/index.ts +0 -107
  487. package/src/wirings/virtual-user/prepare-virtual-user-run.test.ts +0 -115
  488. package/src/wirings/virtual-user/prepare-virtual-user-run.ts +0 -95
  489. package/src/wirings/virtual-user/run-virtual-user.test.ts +0 -774
  490. package/src/wirings/virtual-user/run-virtual-user.ts +0 -684
  491. package/src/wirings/virtual-user/virtual-user-agents.test.ts +0 -72
  492. package/src/wirings/virtual-user/virtual-user-agents.ts +0 -62
  493. package/src/wirings/virtual-user/virtual-user-catalogue.test.ts +0 -215
  494. package/src/wirings/virtual-user/virtual-user-catalogue.ts +0 -184
  495. package/src/wirings/virtual-user/virtual-user-derive.test.ts +0 -426
  496. package/src/wirings/virtual-user/virtual-user-derive.ts +0 -161
  497. package/src/wirings/virtual-user/virtual-user-dispositions.test.ts +0 -68
  498. package/src/wirings/virtual-user/virtual-user-dispositions.ts +0 -210
  499. package/src/wirings/virtual-user/virtual-user-intents.test.ts +0 -218
  500. package/src/wirings/virtual-user/virtual-user-intents.ts +0 -185
  501. package/src/wirings/virtual-user/virtual-user-rng.test.ts +0 -72
  502. package/src/wirings/virtual-user/virtual-user-rng.ts +0 -50
  503. package/src/wirings/virtual-user/virtual-user-run-store.ts +0 -131
  504. package/src/wirings/virtual-user/virtual-user-scaffold.test.ts +0 -854
  505. package/src/wirings/virtual-user/virtual-user-scaffold.ts +0 -664
  506. package/src/wirings/virtual-user/virtual-user-schedule-store.ts +0 -93
  507. package/src/wirings/virtual-user/virtual-user-schedule.test.ts +0 -280
  508. package/src/wirings/virtual-user/virtual-user-schedule.ts +0 -156
  509. package/src/wirings/virtual-user/virtual-user-target.ts +0 -47
  510. package/src/wirings/virtual-user/virtual-user.types.ts +0 -215
  511. package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -709
  512. package/src/wirings/workflow/dsl/workflow-runner.ts +0 -25
  513. package/src/wirings/workflow/feature.test.ts +0 -131
  514. package/src/wirings/workflow/feature.ts +0 -59
  515. package/src/wirings/workflow/graph/graph-foreach-queued.test.ts +0 -569
  516. package/src/wirings/workflow/graph/graph-foreach.test.ts +0 -626
  517. package/src/wirings/workflow/graph/graph-node.ts +0 -115
  518. package/src/wirings/workflow/graph/graph-runner.test.ts +0 -1049
  519. package/src/wirings/workflow/graph/graph-runner.ts +0 -1376
  520. package/src/wirings/workflow/graph/graph-validation.test.ts +0 -27
  521. package/src/wirings/workflow/graph/graph-validation.ts +0 -41
  522. package/src/wirings/workflow/graph/template.test.ts +0 -49
  523. package/src/wirings/workflow/graph/template.ts +0 -42
  524. package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -39
  525. package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -75
  526. package/src/wirings/workflow/index.ts +0 -107
  527. package/src/wirings/workflow/pikku-scenario-service.ts +0 -1013
  528. package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -963
  529. package/src/wirings/workflow/pikku-workflow-service.ts +0 -1993
  530. package/src/wirings/workflow/run-timeline.test.ts +0 -199
  531. package/src/wirings/workflow/run-timeline.ts +0 -185
  532. package/src/wirings/workflow/scenario-cookie-jar.test.ts +0 -107
  533. package/src/wirings/workflow/scenario-cookie-jar.ts +0 -57
  534. package/src/wirings/workflow/scenario-expectations.test.ts +0 -238
  535. package/src/wirings/workflow/scenario-hooks.test.ts +0 -259
  536. package/src/wirings/workflow/scenario-poll.test.ts +0 -64
  537. package/src/wirings/workflow/scenario-poll.ts +0 -27
  538. package/src/wirings/workflow/scenario-prose.test.ts +0 -275
  539. package/src/wirings/workflow/scenario-prose.ts +0 -86
  540. package/src/wirings/workflow/scenario-run.types.ts +0 -193
  541. package/src/wirings/workflow/scenario-service.test.ts +0 -147
  542. package/src/wirings/workflow/scenario-step-guards.ts +0 -23
  543. package/src/wirings/workflow/scenario-step.test.ts +0 -800
  544. package/src/wirings/workflow/scenario-step.types.ts +0 -262
  545. package/src/wirings/workflow/scenario-surface.test.ts +0 -146
  546. package/src/wirings/workflow/scenario-surface.ts +0 -71
  547. package/src/wirings/workflow/scenario.types.ts +0 -63
  548. package/src/wirings/workflow/workflow-approval-audit.ts +0 -47
  549. package/src/wirings/workflow/workflow-approval-policy.test.ts +0 -594
  550. package/src/wirings/workflow/workflow-approval-policy.ts +0 -68
  551. package/src/wirings/workflow/workflow-approval.ts +0 -290
  552. package/src/wirings/workflow/workflow-child-run-session.test.ts +0 -168
  553. package/src/wirings/workflow/workflow-constants.ts +0 -66
  554. package/src/wirings/workflow/workflow-dispatch-durability.test.ts +0 -116
  555. package/src/wirings/workflow/workflow-dispatch-payload.test.ts +0 -55
  556. package/src/wirings/workflow/workflow-dispatch-relay.test.ts +0 -128
  557. package/src/wirings/workflow/workflow-errors.ts +0 -132
  558. package/src/wirings/workflow/workflow-inline-authority.test.ts +0 -175
  559. package/src/wirings/workflow/workflow-invocation-id.test.ts +0 -51
  560. package/src/wirings/workflow/workflow-invocation-id.ts +0 -28
  561. package/src/wirings/workflow/workflow-meta-resolver.ts +0 -45
  562. package/src/wirings/workflow/workflow-mirror.test.ts +0 -171
  563. package/src/wirings/workflow/workflow-missing-meta.test.ts +0 -92
  564. package/src/wirings/workflow/workflow-on-error.test.ts +0 -145
  565. package/src/wirings/workflow/workflow-queue-routing.ts +0 -129
  566. package/src/wirings/workflow/workflow-queue-wiring.ts +0 -149
  567. package/src/wirings/workflow/workflow-queue-workers.test.ts +0 -131
  568. package/src/wirings/workflow/workflow-queue-workers.ts +0 -66
  569. package/src/wirings/workflow/workflow-recovery.ts +0 -192
  570. package/src/wirings/workflow/workflow-replay-snapshot.test.ts +0 -140
  571. package/src/wirings/workflow/workflow-retry-policy.test.ts +0 -113
  572. package/src/wirings/workflow/workflow-run-authority.test.ts +0 -212
  573. package/src/wirings/workflow/workflow-run-context.test.ts +0 -172
  574. package/src/wirings/workflow/workflow-run-engine.types.ts +0 -92
  575. package/src/wirings/workflow/workflow-run-ownership.ts +0 -37
  576. package/src/wirings/workflow/workflow-run-polling.test.ts +0 -127
  577. package/src/wirings/workflow/workflow-stalled-recovery.test.ts +0 -152
  578. package/src/wirings/workflow/workflow-status-stream.test.ts +0 -354
  579. package/src/wirings/workflow/workflow-status-stream.ts +0 -144
  580. package/src/wirings/workflow/workflow-step-claim.ts +0 -46
  581. package/src/wirings/workflow/workflow-step-ordinal.test.ts +0 -94
  582. package/src/wirings/workflow/workflow-step-session.test.ts +0 -87
  583. package/src/wirings/workflow/workflow-suspend.ts +0 -61
  584. package/src/wirings/workflow/workflow-terminal-run-guard.test.ts +0 -105
  585. package/src/wirings/workflow/workflow.types.ts +0 -268
  586. package/src/wirings-stay-decoupled.test.ts +0 -130
  587. package/tsconfig.json +0 -14
  588. package/tsconfig.tsbuildinfo +0 -1
  589. package/tsconfig.type-tests.json +0 -15
@@ -1,347 +0,0 @@
1
- /**
2
- * Parses the textual IPv4 encodings `fetch`/`undici` accept — a dotted quad
3
- * whose octets may be decimal, octal (`0177`) or hex (`0x7f`), or the whole
4
- * address as a single 32-bit integer. `null` when not an IPv4 literal.
5
- */
6
- function parseIPv4Octets(
7
- host: string
8
- ): [number, number, number, number] | null {
9
- const toInt = (part: string): number | null => {
10
- let n: number
11
- if (/^0x[0-9a-f]+$/.test(part)) n = parseInt(part, 16)
12
- else if (/^0[0-7]+$/.test(part)) n = parseInt(part, 8)
13
- else if (/^\d+$/.test(part)) n = parseInt(part, 10)
14
- else return null
15
- return Number.isInteger(n) ? n : null
16
- }
17
-
18
- if (!host.includes('.')) {
19
- const n = toInt(host)
20
- if (n === null || n < 0 || n > 0xffffffff) return null
21
- return [(n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff]
22
- }
23
-
24
- const parts = host.split('.')
25
- if (parts.length !== 4) return null
26
- const octets: number[] = []
27
- for (const part of parts) {
28
- const n = toInt(part)
29
- if (n === null || n < 0 || n > 0xff) return null
30
- octets.push(n)
31
- }
32
- return octets as [number, number, number, number]
33
- }
34
-
35
- /**
36
- * IPv4 blocks that must never be reachable from user-supplied URLs: private,
37
- * loopback, link-local (cloud metadata), carrier-grade NAT (Alibaba's
38
- * `100.100.100.200` metadata endpoint), IETF protocol assignments, benchmarking,
39
- * 6to4 anycast, the documentation TEST-NETs, multicast and reserved space.
40
- */
41
- const PRIVATE_IPV4_BLOCKS: ReadonlyArray<readonly [string, number]> = [
42
- ['0.0.0.0', 8],
43
- ['10.0.0.0', 8],
44
- ['100.64.0.0', 10],
45
- ['127.0.0.0', 8],
46
- ['169.254.0.0', 16],
47
- ['172.16.0.0', 12],
48
- ['192.0.0.0', 24],
49
- ['192.0.2.0', 24],
50
- ['192.88.99.0', 24],
51
- ['192.168.0.0', 16],
52
- ['198.18.0.0', 15],
53
- ['198.51.100.0', 24],
54
- ['203.0.113.0', 24],
55
- ['224.0.0.0', 4],
56
- ['240.0.0.0', 4],
57
- ]
58
-
59
- const toUint32 = (octets: [number, number, number, number]): number =>
60
- ((octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]) >>> 0
61
-
62
- const PRIVATE_IPV4_RANGES = PRIVATE_IPV4_BLOCKS.map(([base, prefix]) => {
63
- const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0
64
- return [(toUint32(parseIPv4Octets(base)!) & mask) >>> 0, mask] as const
65
- })
66
-
67
- const isPrivateIPv4 = (octets: [number, number, number, number]): boolean => {
68
- const addr = toUint32(octets)
69
- return PRIVATE_IPV4_RANGES.some(
70
- ([base, mask]) => (addr & mask) >>> 0 === base
71
- )
72
- }
73
-
74
- /**
75
- * Expands an IPv6 literal into its eight 16-bit groups, handling `::` elision
76
- * and a trailing dotted-quad. `null` when not a well-formed IPv6 literal.
77
- */
78
- function parseIPv6Groups(host: string): number[] | null {
79
- const zoneless = host.split('%')[0]!
80
- const halves = zoneless.split('::')
81
- if (halves.length > 2) return null
82
-
83
- const parseSide = (side: string): number[] | null => {
84
- if (side === '') return []
85
- const parts = side.split(':')
86
- const groups: number[] = []
87
- for (let i = 0; i < parts.length; i++) {
88
- const part = parts[i]!
89
- if (i === parts.length - 1 && part.includes('.')) {
90
- const v4 = parseIPv4Octets(part)
91
- if (!v4) return null
92
- groups.push((v4[0] << 8) | v4[1], (v4[2] << 8) | v4[3])
93
- continue
94
- }
95
- if (!/^[0-9a-f]{1,4}$/.test(part)) return null
96
- groups.push(parseInt(part, 16))
97
- }
98
- return groups
99
- }
100
-
101
- const head = parseSide(halves[0]!)
102
- if (head === null) return null
103
-
104
- if (halves.length === 1) {
105
- return head.length === 8 ? head : null
106
- }
107
-
108
- const tail = parseSide(halves[1]!)
109
- if (tail === null) return null
110
- if (head.length + tail.length > 7) return null
111
- return [...head, ...new Array(8 - head.length - tail.length).fill(0), ...tail]
112
- }
113
-
114
- const embeddedIPv4 = (
115
- hi: number,
116
- lo: number
117
- ): [number, number, number, number] => [
118
- (hi >> 8) & 0xff,
119
- hi & 0xff,
120
- (lo >> 8) & 0xff,
121
- lo & 0xff,
122
- ]
123
-
124
- function isPrivateIPv6(groups: number[]): boolean {
125
- const [g0, g1, g2, g3, g4, g5, g6, g7] = groups as [
126
- number,
127
- number,
128
- number,
129
- number,
130
- number,
131
- number,
132
- number,
133
- number,
134
- ]
135
-
136
- if (groups.every((g) => g === 0)) return true // :: unspecified
137
- if (groups.slice(0, 7).every((g) => g === 0) && g7 === 1) return true // ::1
138
-
139
- // IPv4-mapped ::ffff:0:0/96 and IPv4-compatible ::/96
140
- if (g0 === 0 && g1 === 0 && g2 === 0 && g3 === 0 && g4 === 0) {
141
- if (g5 === 0xffff || g5 === 0) return isPrivateIPv4(embeddedIPv4(g6, g7))
142
- }
143
- // NAT64 well-known prefix 64:ff9b::/96
144
- if (
145
- g0 === 0x64 &&
146
- g1 === 0xff9b &&
147
- g2 === 0 &&
148
- g3 === 0 &&
149
- g4 === 0 &&
150
- g5 === 0
151
- )
152
- return isPrivateIPv4(embeddedIPv4(g6, g7))
153
- // 6to4 2002::/16 carries the IPv4 address in the next 32 bits
154
- if (g0 === 0x2002) return isPrivateIPv4(embeddedIPv4(g1, g2))
155
- if (g0 === 0x100 && g1 === 0 && g2 === 0 && g3 === 0) return true // discard-only 100::/64
156
- if ((g0 & 0xffc0) === 0xfe80) return true // link-local fe80::/10
157
- if ((g0 & 0xfe00) === 0xfc00) return true // unique-local fc00::/7
158
- if ((g0 & 0xffc0) === 0xfec0) return true // deprecated site-local fec0::/10
159
- if ((g0 & 0xff00) === 0xff00) return true // multicast ff00::/8
160
- return false
161
- }
162
-
163
- /**
164
- * Whether a hostname is an obvious internal target. Best-effort literal
165
- * matching only: it cannot catch a public hostname that *resolves* to a
166
- * private IP.
167
- */
168
- export function isPrivateHost(hostname: string): boolean {
169
- const host = hostname
170
- .replace(/^\[|\]$/g, '')
171
- .replace(/\.$/, '')
172
- .toLowerCase()
173
- if (host === '' || host === 'localhost' || host.endsWith('.localhost'))
174
- return true
175
-
176
- if (host.includes(':')) {
177
- const groups = parseIPv6Groups(host)
178
- return groups ? isPrivateIPv6(groups) : false
179
- }
180
-
181
- const v4 = parseIPv4Octets(host)
182
- return v4 ? isPrivateIPv4(v4) : false
183
- }
184
-
185
- /** Resolves a hostname to the IP addresses it points at. */
186
- export type HostResolver = (hostname: string) => Promise<string[]>
187
-
188
- let defaultHostResolver: HostResolver | undefined
189
-
190
- /**
191
- * Installs the resolver {@link safeFetch} uses when a call passes no
192
- * `resolveHost` of its own.
193
- *
194
- * Core cannot resolve DNS itself — Workers has no DNS API — so without a
195
- * resolver the guard is literal-only and a public name pointing at
196
- * `169.254.169.254` passes. Node runtimes install
197
- * `nodeHostResolver` from `@pikku/core/node-host-resolver` at startup.
198
- */
199
- export function setDefaultHostResolver(resolver: HostResolver | undefined) {
200
- defaultHostResolver = resolver
201
- }
202
-
203
- export interface SafeFetchOptions {
204
- /**
205
- * When set, the host of every hop must appear in this allowlist. When omitted,
206
- * any host that is not {@link isPrivateHost} is permitted.
207
- */
208
- allowedHosts?: string[]
209
- /** Maximum redirect hops to follow (each re-validated). Defaults to 3. */
210
- maxRedirects?: number
211
- /**
212
- * Resolves a hostname so a *public* name pointing at a private address is
213
- * refused. Defaults to whatever {@link setDefaultHostResolver} installed;
214
- * pass `null` to opt a call out of resolution entirely.
215
- */
216
- resolveHost?: HostResolver | null
217
- }
218
-
219
- /** Whether a hostname is already an IP literal, which the sync check covers. */
220
- function isIpLiteral(hostname: string): boolean {
221
- const host = hostname.replace(/^\[|\]$/g, '').replace(/\.$/, '')
222
- if (host.includes(':')) return parseIPv6Groups(host.toLowerCase()) !== null
223
- return parseIPv4Octets(host) !== null
224
- }
225
-
226
- /**
227
- * Rejects a hostname that resolves to an internal address.
228
- *
229
- * Resolution happens once per hop and the connection is not pinned to the
230
- * address checked, so a rebind between this check and the socket connecting is
231
- * still possible; catching that needs a runtime-level connect hook.
232
- */
233
- async function assertResolvedHostAllowed(
234
- hostname: string,
235
- options: SafeFetchOptions
236
- ): Promise<void> {
237
- if (options.allowedHosts) return
238
- const resolver =
239
- options.resolveHost === null
240
- ? undefined
241
- : (options.resolveHost ?? defaultHostResolver)
242
- if (!resolver || isIpLiteral(hostname)) return
243
-
244
- const addresses = await resolver(hostname)
245
- if (addresses.length === 0) {
246
- throw new Error(`Refusing to fetch: '${hostname}' resolved to no addresses`)
247
- }
248
- for (const address of addresses) {
249
- if (isPrivateHost(address)) {
250
- throw new Error(
251
- `Refusing to fetch from a private/internal host: '${hostname}' resolves to ${address}`
252
- )
253
- }
254
- }
255
- }
256
-
257
- export function assertFetchableUrl(
258
- url: string,
259
- options: SafeFetchOptions = {}
260
- ): URL {
261
- const parsed = new URL(url)
262
- if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
263
- throw new Error(`Refusing to fetch non-HTTP(S) URL: ${parsed.protocol}`)
264
- }
265
- if (options.allowedHosts) {
266
- if (!options.allowedHosts.includes(parsed.hostname)) {
267
- throw new Error(`URL host is not in the allowlist: ${parsed.hostname}`)
268
- }
269
- } else if (isPrivateHost(parsed.hostname)) {
270
- throw new Error(
271
- `Refusing to fetch from a private/internal host: ${parsed.hostname}`
272
- )
273
- }
274
- return parsed
275
- }
276
-
277
- /** The only 3xx statuses followed; every other 3xx is returned to the caller. */
278
- const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])
279
-
280
- function stripCredentialHeaders(init: RequestInit): RequestInit {
281
- if (!init.headers) return init
282
- const headers = new Headers(init.headers)
283
- headers.delete('authorization')
284
- headers.delete('cookie')
285
- return { ...init, headers }
286
- }
287
-
288
- /**
289
- * The WHATWG method/body transform for a redirect: `303` (and `301`/`302` on
290
- * a `POST`) becomes a bodyless `GET`; `307`/`308` preserve method and body.
291
- */
292
- function redirectInit(status: number, init: RequestInit): RequestInit {
293
- const method = (init.method ?? 'GET').toUpperCase()
294
- const toGet =
295
- (status === 303 && method !== 'GET' && method !== 'HEAD') ||
296
- ((status === 301 || status === 302) && method === 'POST')
297
- if (!toGet) return init
298
- const headers = new Headers(init.headers)
299
- headers.delete('content-length')
300
- headers.delete('content-type')
301
- return { ...init, method: 'GET', body: undefined, headers }
302
- }
303
-
304
- /**
305
- * `fetch` with SSRF protection on the initial URL and every redirect hop.
306
- * When a redirect cannot be followed (no `Location`, or the hop budget is
307
- * spent) the raw redirect response is returned for the caller to handle by
308
- * status.
309
- */
310
- export async function safeFetch(
311
- url: string,
312
- init: RequestInit = {},
313
- options: SafeFetchOptions = {}
314
- ): Promise<Response> {
315
- const maxRedirects = options.maxRedirects ?? 3
316
- const initial = assertFetchableUrl(url, options)
317
- await assertResolvedHostAllowed(initial.hostname, options)
318
- let currentUrl = initial.toString()
319
- let currentInit = init
320
-
321
- for (let hop = 0; ; hop++) {
322
- const response = await fetch(currentUrl, {
323
- ...currentInit,
324
- redirect: 'manual',
325
- })
326
- if (!REDIRECT_STATUSES.has(response.status)) {
327
- return response
328
- }
329
- const location = response.headers.get('location')
330
- if (!location || hop >= maxRedirects) {
331
- return response
332
- }
333
- const next = assertFetchableUrl(
334
- new URL(location, currentUrl).toString(),
335
- options
336
- )
337
- await assertResolvedHostAllowed(next.hostname, options)
338
- const nextUrl = next.toString()
339
- await response.body?.cancel()
340
- let nextInit = redirectInit(response.status, currentInit)
341
- if (new URL(nextUrl).origin !== new URL(currentUrl).origin) {
342
- nextInit = stripCredentialHeaders(nextInit)
343
- }
344
- currentInit = nextInit
345
- currentUrl = nextUrl
346
- }
347
- }
package/src/utils.test.ts DELETED
@@ -1,359 +0,0 @@
1
- import { describe, test, beforeEach } from 'node:test'
2
- import assert from 'node:assert'
3
- import {
4
- closeWireServices,
5
- createWeakUID,
6
- isSerializable,
7
- getTagGroups,
8
- freezeDedupe,
9
- stopSingletonServices,
10
- } from './utils.js'
11
- import {
12
- resetPikkuState,
13
- pikkuState,
14
- initializePikkuState,
15
- } from './pikku-state.js'
16
-
17
- beforeEach(() => {
18
- resetPikkuState()
19
- })
20
-
21
- describe('createWeakUID', () => {
22
- test('should return a string', () => {
23
- const uid = createWeakUID()
24
- assert.strictEqual(typeof uid, 'string')
25
- })
26
-
27
- test('should return unique values', () => {
28
- const uid1 = createWeakUID()
29
- const uid2 = createWeakUID()
30
- assert.notStrictEqual(uid1, uid2)
31
- })
32
-
33
- test('should contain a dash separator', () => {
34
- const uid = createWeakUID()
35
- assert.ok(uid.includes('-'))
36
- })
37
-
38
- test('separate module instances get different prefixes', async () => {
39
- const [a, b] = await Promise.all([
40
- import('./utils.js?instance=a'),
41
- import('./utils.js?instance=b'),
42
- ])
43
- assert.notStrictEqual(
44
- a.createWeakUID().split('-')[0],
45
- b.createWeakUID().split('-')[0]
46
- )
47
- })
48
- })
49
-
50
- describe('isSerializable', () => {
51
- test('should return true for objects', () => {
52
- assert.strictEqual(isSerializable({ key: 'value' }), true)
53
- })
54
-
55
- test('should return true for arrays', () => {
56
- assert.strictEqual(isSerializable([1, 2, 3]), true)
57
- })
58
-
59
- test('should return true for numbers', () => {
60
- assert.strictEqual(isSerializable(42), true)
61
- })
62
-
63
- test('should return true for booleans', () => {
64
- assert.strictEqual(isSerializable(true), true)
65
- })
66
-
67
- test('should return true for null', () => {
68
- assert.strictEqual(isSerializable(null), true)
69
- })
70
-
71
- test('should return false for strings', () => {
72
- assert.strictEqual(isSerializable('hello'), false)
73
- })
74
-
75
- test('should return false for ArrayBuffer', () => {
76
- assert.strictEqual(isSerializable(new ArrayBuffer(8)), false)
77
- })
78
-
79
- test('should return false for Uint8Array', () => {
80
- assert.strictEqual(isSerializable(new Uint8Array(8)), false)
81
- })
82
-
83
- test('should return false for Int8Array', () => {
84
- assert.strictEqual(isSerializable(new Int8Array(8)), false)
85
- })
86
-
87
- test('should return false for Uint16Array', () => {
88
- assert.strictEqual(isSerializable(new Uint16Array(8)), false)
89
- })
90
-
91
- test('should return false for Float64Array', () => {
92
- assert.strictEqual(isSerializable(new Float64Array(8)), false)
93
- })
94
- })
95
-
96
- describe('getTagGroups', () => {
97
- test('should return exact match', () => {
98
- const groups = { billing: 'billing-middleware' as any }
99
- const result = getTagGroups(groups, 'billing')
100
- assert.deepStrictEqual(result, ['billing-middleware'])
101
- })
102
-
103
- test('should return parent tag for namespaced tag', () => {
104
- const groups = { billing: 'billing-middleware' as any }
105
- const result = getTagGroups(groups, 'billing:read')
106
- assert.deepStrictEqual(result, ['billing-middleware'])
107
- })
108
-
109
- test('should return both exact and parent matches', () => {
110
- const groups = {
111
- billing: 'billing-middleware' as any,
112
- 'billing:read': 'billing-read-middleware' as any,
113
- }
114
- const result = getTagGroups(groups, 'billing:read')
115
- assert.deepStrictEqual(result, [
116
- 'billing-read-middleware',
117
- 'billing-middleware',
118
- ])
119
- })
120
-
121
- test('should resolve multi-level namespace', () => {
122
- const groups = {
123
- billing: 'b' as any,
124
- 'billing:read': 'br' as any,
125
- 'billing:read:admin': 'bra' as any,
126
- }
127
- const result = getTagGroups(groups, 'billing:read:admin')
128
- assert.deepStrictEqual(result, ['bra', 'br', 'b'])
129
- })
130
-
131
- test('should return empty array for unmatched tag', () => {
132
- const groups = { billing: 'b' as any }
133
- const result = getTagGroups(groups, 'other')
134
- assert.deepStrictEqual(result, [])
135
- })
136
-
137
- test('should skip missing intermediate groups', () => {
138
- const groups = {
139
- billing: 'b' as any,
140
- // no billing:read
141
- 'billing:read:admin': 'bra' as any,
142
- }
143
- const result = getTagGroups(groups, 'billing:read:admin')
144
- assert.deepStrictEqual(result, ['bra', 'b'])
145
- })
146
- })
147
-
148
- describe('freezeDedupe', () => {
149
- test('should return frozen empty array for undefined', () => {
150
- const result = freezeDedupe(undefined)
151
- assert.strictEqual(result.length, 0)
152
- assert.ok(Object.isFrozen(result))
153
- })
154
-
155
- test('should return frozen empty array for empty array', () => {
156
- const result = freezeDedupe([])
157
- assert.strictEqual(result.length, 0)
158
- assert.ok(Object.isFrozen(result))
159
- })
160
-
161
- test('should return same frozen reference for empty arrays', () => {
162
- const result1 = freezeDedupe([])
163
- const result2 = freezeDedupe(undefined)
164
- assert.strictEqual(result1, result2)
165
- })
166
-
167
- test('should return frozen single element array', () => {
168
- const result = freezeDedupe(['a'])
169
- assert.deepStrictEqual([...result], ['a'])
170
- assert.ok(Object.isFrozen(result))
171
- })
172
-
173
- test('should deduplicate array', () => {
174
- const a = () => {}
175
- const b = () => {}
176
- const result = freezeDedupe([a, b, a, b])
177
- assert.strictEqual(result.length, 2)
178
- assert.strictEqual(result[0], a)
179
- assert.strictEqual(result[1], b)
180
- })
181
-
182
- test('should freeze the result', () => {
183
- const result = freezeDedupe([1, 2, 3])
184
- assert.ok(Object.isFrozen(result))
185
- })
186
-
187
- test('should preserve order (first occurrence)', () => {
188
- const result = freezeDedupe([3, 1, 2, 1, 3])
189
- assert.deepStrictEqual([...result], [3, 1, 2])
190
- })
191
- })
192
-
193
- describe('closeWireServices', () => {
194
- test('should call close on services that have it', async () => {
195
- let closeCalled = false
196
- const mockLogger = {
197
- info: () => {},
198
- warn: () => {},
199
- error: () => {},
200
- debug: () => {},
201
- }
202
- const wireServices = {
203
- serviceA: {
204
- close: async () => {
205
- closeCalled = true
206
- },
207
- },
208
- serviceB: {},
209
- }
210
-
211
- await closeWireServices(mockLogger as any, wireServices as any)
212
-
213
- assert.strictEqual(closeCalled, true)
214
- })
215
-
216
- test('should handle errors during close gracefully', async () => {
217
- let errorLogged = false
218
- const mockLogger = {
219
- info: () => {},
220
- warn: () => {},
221
- error: () => {
222
- errorLogged = true
223
- },
224
- debug: () => {},
225
- }
226
- const wireServices = {
227
- serviceA: {
228
- close: async () => {
229
- throw new Error('close failed')
230
- },
231
- },
232
- }
233
-
234
- await closeWireServices(mockLogger as any, wireServices as any)
235
-
236
- assert.strictEqual(errorLogged, true)
237
- })
238
-
239
- test('should skip services without close method', async () => {
240
- const mockLogger = {
241
- info: () => {},
242
- warn: () => {},
243
- error: () => {},
244
- debug: () => {},
245
- }
246
- const wireServices = {
247
- serviceA: { doStuff: () => {} },
248
- serviceB: null,
249
- }
250
-
251
- await closeWireServices(mockLogger as any, wireServices as any)
252
- })
253
- })
254
-
255
- describe('stopSingletonServices', () => {
256
- test('should stop addon services first, then parent services', async () => {
257
- const order: string[] = []
258
- const mockServices = {
259
- logger: {
260
- info: () => {},
261
- warn: () => {},
262
- error: () => {},
263
- debug: () => {},
264
- },
265
- serviceA: {
266
- stop: async () => {
267
- order.push('parent-serviceA')
268
- },
269
- },
270
- }
271
- pikkuState(null, 'package', 'singletonServices', mockServices as any)
272
-
273
- initializePikkuState('@addon/pkg')
274
- const addonServices = {
275
- addonService: {
276
- stop: async () => {
277
- order.push('addon-addonService')
278
- },
279
- },
280
- }
281
- pikkuState(
282
- '@addon/pkg',
283
- 'package',
284
- 'singletonServices',
285
- addonServices as any
286
- )
287
-
288
- await stopSingletonServices()
289
-
290
- assert.ok(
291
- order.indexOf('addon-addonService') < order.indexOf('parent-serviceA')
292
- )
293
- })
294
-
295
- test('should handle services without stop method', async () => {
296
- const mockServices = {
297
- logger: {
298
- info: () => {},
299
- warn: () => {},
300
- error: () => {},
301
- debug: () => {},
302
- },
303
- noStop: {},
304
- }
305
- pikkuState(null, 'package', 'singletonServices', mockServices as any)
306
-
307
- await stopSingletonServices()
308
- })
309
-
310
- test('should handle errors during stop gracefully', async () => {
311
- let errorLogged = false
312
- const mockServices = {
313
- logger: {
314
- info: () => {},
315
- warn: () => {},
316
- error: () => {
317
- errorLogged = true
318
- },
319
- debug: () => {},
320
- },
321
- failing: {
322
- stop: async () => {
323
- throw new Error('stop failed')
324
- },
325
- },
326
- }
327
- pikkuState(null, 'package', 'singletonServices', mockServices as any)
328
-
329
- await stopSingletonServices()
330
-
331
- assert.strictEqual(errorLogged, true)
332
- })
333
-
334
- test('should clear addon singleton services after stopping', async () => {
335
- const mockServices = {
336
- logger: {
337
- info: () => {},
338
- warn: () => {},
339
- error: () => {},
340
- debug: () => {},
341
- },
342
- }
343
- pikkuState(null, 'package', 'singletonServices', mockServices as any)
344
-
345
- initializePikkuState('@addon/pkg')
346
- pikkuState('@addon/pkg', 'package', 'singletonServices', {
347
- s: { stop: async () => {} },
348
- } as any)
349
-
350
- await stopSingletonServices()
351
-
352
- const addonServices = pikkuState(
353
- '@addon/pkg',
354
- 'package',
355
- 'singletonServices'
356
- )
357
- assert.strictEqual(addonServices, null)
358
- })
359
- })