sonamu 0.10.12 → 0.10.13

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 (513) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +131 -27
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +12 -6
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
package/src/stream/sse.ts CHANGED
@@ -29,26 +29,26 @@ export interface SSEConnection<T extends z.ZodObject> {
29
29
  }
30
30
 
31
31
  class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
32
- private _closed = false;
33
- private _closeCallbacks: Array<() => void> = [];
32
+ private closedState = false;
33
+ private closeCallbacks: Array<() => void> = [];
34
34
 
35
35
  private readonly markClosed = () => {
36
- this._closed = true;
36
+ this.closedState = true;
37
37
  this.fireCloseCallbacks();
38
38
  };
39
39
 
40
40
  get closed(): boolean {
41
- return this._closed;
41
+ return this.closedState;
42
42
  }
43
43
 
44
44
  onClose(callback: () => void): void {
45
- this._closeCallbacks.push(callback);
45
+ this.closeCallbacks.push(callback);
46
46
  }
47
47
 
48
48
  // 콜백을 한 번만 실행하고 배열을 비워 중복 호출을 방지
49
49
  private fireCloseCallbacks(): void {
50
- const callbacks = this._closeCallbacks;
51
- this._closeCallbacks = [];
50
+ const callbacks = this.closeCallbacks;
51
+ this.closeCallbacks = [];
52
52
  for (const cb of callbacks) {
53
53
  cb();
54
54
  }
@@ -63,22 +63,23 @@ class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
63
63
  }
64
64
 
65
65
  publish<K extends keyof z.infer<T>>(event: K, data: z.infer<T>[K]): void {
66
- if (this._closed) {
66
+ if (this.closedState) {
67
67
  return;
68
68
  }
69
69
 
70
70
  this.reply.sse({
71
- event: event as string,
71
+ event:
72
+ /* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ event as string,
72
73
  data: JSON.stringify(data),
73
74
  });
74
75
  }
75
76
 
76
77
  async end(): Promise<void> {
77
- if (this._closed) {
78
+ if (this.closedState) {
78
79
  return;
79
80
  }
80
81
 
81
- this._closed = true;
82
+ this.closedState = true;
82
83
  this.socket.off("close", this.markClosed);
83
84
  this.socket.off("error", this.markClosed);
84
85
  this.fireCloseCallbacks();
@@ -7,7 +7,7 @@ export interface ManagedWebSocketConnection {
7
7
  closed: boolean;
8
8
  // setUserId/clearUserId 호출로 갱신됨. telemetry emit 사이트에서 hot path lookup을 피하기 위해 connection에 캐싱한다
9
9
  readonly userId?: string;
10
- publishUntyped(event: string, data: unknown): void;
10
+ publishUntyped<Data>(event: string, data: Data): void;
11
11
  close(code?: number, reason?: string): void;
12
12
  }
13
13
 
@@ -1,5 +1,6 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
 
3
+ import { runtimeTypeOf } from "../runtime-type";
3
4
  import { type WebSocketAudience } from "./ws-audience";
4
5
  import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
5
6
  import { type WebSocketClusterBus, type WebSocketClusterEnvelope } from "./ws-cluster-bus";
@@ -43,7 +44,7 @@ export class WebSocketDeliveryEngine {
43
44
  });
44
45
  }
45
46
 
46
- publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void {
47
+ publishToAudience<Data>(audience: WebSocketAudience, event: string, data: Data): void {
47
48
  const routingPlan = this.options.audienceResolver.resolve(audience);
48
49
  const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
49
50
 
@@ -99,7 +100,7 @@ export class WebSocketDeliveryEngine {
99
100
  },
100
101
  });
101
102
  })
102
- .catch((error: unknown) => {
103
+ .catch((cause: unknown) => {
103
104
  const durationMs = performance.now() - publishStartedAt;
104
105
  this.telemetry.emit({
105
106
  name: "ws.cluster.envelope.failed",
@@ -112,7 +113,7 @@ export class WebSocketDeliveryEngine {
112
113
  durationMs,
113
114
  status: "error",
114
115
  attributes: { event },
115
- errorType: error instanceof Error ? error.name : typeof error,
116
+ errorType: cause instanceof Error ? cause.name : runtimeTypeOf(cause),
116
117
  });
117
118
  });
118
119
  }
@@ -123,7 +124,7 @@ export class WebSocketDeliveryEngine {
123
124
  await this.options.clusterBus.shutdown();
124
125
  }
125
126
 
126
- getTelemetrySnapshot(): { pendingFanOutJobs: number; pendingFanOutTargets: number } {
127
+ getTelemetrySnapshot() {
127
128
  let pendingFanOutTargets = 0;
128
129
 
129
130
  for (const job of this.pendingFanOutJobs) {
@@ -183,7 +184,11 @@ export class WebSocketDeliveryEngine {
183
184
  });
184
185
  }
185
186
 
186
- private enqueueFanOut(targets: ManagedWebSocketConnection[], event: string, data: unknown): void {
187
+ private enqueueFanOut<Data>(
188
+ targets: ManagedWebSocketConnection[],
189
+ event: string,
190
+ data: Data,
191
+ ): void {
187
192
  if (targets.length === 0) {
188
193
  return;
189
194
  }
@@ -236,7 +241,7 @@ export class WebSocketDeliveryEngine {
236
241
  }
237
242
  } catch (error) {
238
243
  status = "error";
239
- errorType = error instanceof Error ? error.name : typeof error;
244
+ errorType = error instanceof Error ? error.name : runtimeTypeOf(error);
240
245
  throw error;
241
246
  } finally {
242
247
  const durationMs = performance.now() - startedAt;
@@ -260,7 +265,11 @@ export class WebSocketDeliveryEngine {
260
265
  }
261
266
  }
262
267
 
263
- private safePublish(connection: ManagedWebSocketConnection, event: string, data: unknown): void {
268
+ private safePublish<Data>(
269
+ connection: ManagedWebSocketConnection,
270
+ event: string,
271
+ data: Data,
272
+ ): void {
264
273
  try {
265
274
  if (!connection.closed) {
266
275
  connection.publishUntyped(event, data);
@@ -1,3 +1,4 @@
1
+ import { isFunctionValue } from "../utils/runtime-value";
1
2
  import { type ManagedWebSocketConnection } from "./ws-core";
2
3
  import {
3
4
  type WebSocketTelemetryConnectionSnapshot,
@@ -71,7 +72,5 @@ export class WebSocketLocalConnectionStore {
71
72
  function isTelemetryInspectableConnection(
72
73
  connection: ManagedWebSocketConnection,
73
74
  ): connection is ManagedWebSocketConnection & TelemetryInspectableConnection {
74
- return (
75
- "getTelemetrySnapshot" in connection && typeof connection.getTelemetrySnapshot === "function"
76
- );
75
+ return "getTelemetrySnapshot" in connection && isFunctionValue(connection.getTelemetrySnapshot);
77
76
  }
@@ -317,7 +317,12 @@ function getBindingKey(namespace: string, id: string): string {
317
317
  return `${namespace}::${id}`;
318
318
  }
319
319
 
320
- function parseBindingKey(key: string): { namespace: string; id: string } {
320
+ interface PresenceBinding {
321
+ namespace: string;
322
+ id: string;
323
+ }
324
+
325
+ function parseBindingKey(key: string): PresenceBinding {
321
326
  const [namespace, ...rest] = key.split("::");
322
327
  return {
323
328
  namespace,
@@ -1,3 +1,4 @@
1
+ import { isFunctionValue } from "../utils/runtime-value";
1
2
  import { WebSocketAudience, type WebSocketAudience as WebSocketAudienceSpec } from "./ws-audience";
2
3
  import { WebSocketAudienceResolver } from "./ws-audience-resolver";
3
4
  import { NoopWebSocketClusterBus, type WebSocketClusterBus } from "./ws-cluster-bus";
@@ -253,19 +254,29 @@ export class WebSocketRegistry {
253
254
  });
254
255
  }
255
256
 
256
- broadcast(event: string, data: unknown, namespace?: string): void {
257
+ broadcast<Data>(event: string, data: Data, namespace?: string): void {
257
258
  this.publishToAudience(WebSocketAudience.all(namespace), event, data);
258
259
  }
259
260
 
260
- publishToRoom(roomId: WebSocketRoomId, event: string, data: unknown, namespace?: string): void {
261
+ publishToRoom<Data>(
262
+ roomId: WebSocketRoomId,
263
+ event: string,
264
+ data: Data,
265
+ namespace?: string,
266
+ ): void {
261
267
  this.publishToAudience(WebSocketAudience.room(roomId, namespace), event, data);
262
268
  }
263
269
 
264
- publishToUser(userId: WebSocketUserId, event: string, data: unknown, namespace?: string): void {
270
+ publishToUser<Data>(
271
+ userId: WebSocketUserId,
272
+ event: string,
273
+ data: Data,
274
+ namespace?: string,
275
+ ): void {
265
276
  this.publishToAudience(WebSocketAudience.user(userId, namespace), event, data);
266
277
  }
267
278
 
268
- publishToAudience(audience: WebSocketAudienceSpec, event: string, data: unknown): void {
279
+ publishToAudience<Data>(audience: WebSocketAudienceSpec, event: string, data: Data): void {
269
280
  this.deliveryEngine.publishToAudience(audience, event, data);
270
281
  }
271
282
 
@@ -313,7 +324,5 @@ function formatUserId(userId: WebSocketUserId | undefined): string | undefined {
313
324
  function isTelemetryContextProvider(
314
325
  connection: ManagedWebSocketConnection,
315
326
  ): connection is ManagedWebSocketConnection & TelemetryContextProvider {
316
- return (
317
- "getTelemetryContext" in connection && typeof connection.getTelemetryContext === "function"
318
- );
327
+ return "getTelemetryContext" in connection && isFunctionValue(connection.getTelemetryContext);
319
328
  }
@@ -1,6 +1,23 @@
1
+ import { runtimeTypeOf } from "../runtime-type";
2
+ import { isFunctionValue, isObjectValue } from "../utils/runtime-value";
1
3
  import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore } from "./ws-telemetry-memory";
2
4
  import { generateSpanId, generateTraceId, parseTraceParent } from "./ws-telemetry-trace";
3
5
 
6
+ export type WebSocketTelemetryValue =
7
+ | null
8
+ | undefined
9
+ | bigint
10
+ | boolean
11
+ | number
12
+ | string
13
+ | Date
14
+ | WebSocketTelemetryValue[]
15
+ | WebSocketTelemetryAttributes;
16
+
17
+ export interface WebSocketTelemetryAttributes {
18
+ [key: string]: WebSocketTelemetryValue;
19
+ }
20
+
4
21
  // -- Record types (unchanged) --
5
22
 
6
23
  export type WebSocketTelemetryRecordBase = {
@@ -24,7 +41,7 @@ export type WebSocketTelemetryEventRecord = WebSocketTelemetryRecordBase & {
24
41
  name: string;
25
42
  level: "debug" | "info" | "warn" | "error";
26
43
  attributes?: Record<string, string | number | boolean>;
27
- detail?: Record<string, unknown>;
44
+ detail?: WebSocketTelemetryAttributes;
28
45
  payloadPreview?: string;
29
46
  };
30
47
 
@@ -49,12 +66,12 @@ export type WebSocketTelemetrySpanRecord = WebSocketTelemetryRecordBase & {
49
66
  events?: Array<{
50
67
  name: string;
51
68
  timestamp: number;
52
- attributes?: Record<string, unknown>;
69
+ attributes?: WebSocketTelemetryAttributes;
53
70
  }>;
54
71
  links?: Array<{
55
72
  traceId: string;
56
73
  spanId: string;
57
- attributes?: Record<string, unknown>;
74
+ attributes?: WebSocketTelemetryAttributes;
58
75
  }>;
59
76
  };
60
77
 
@@ -72,8 +89,8 @@ export type WebSocketTelemetryEventInput = {
72
89
  connectionId?: string;
73
90
  userId?: string;
74
91
  attributes?: Record<string, string | number | boolean>;
75
- detail?: Record<string, unknown>;
76
- payload?: unknown;
92
+ detail?: WebSocketTelemetryAttributes;
93
+ payload?: WebSocketTelemetryValue;
77
94
  traceId?: string;
78
95
  spanId?: string;
79
96
  parentSpanId?: string;
@@ -113,12 +130,12 @@ export type WebSocketSpanInput = {
113
130
  events?: Array<{
114
131
  name: string;
115
132
  timestamp: number;
116
- attributes?: Record<string, unknown>;
133
+ attributes?: WebSocketTelemetryAttributes;
117
134
  }>;
118
135
  links?: Array<{
119
136
  traceId: string;
120
137
  spanId: string;
121
- attributes?: Record<string, unknown>;
138
+ attributes?: WebSocketTelemetryAttributes;
122
139
  }>;
123
140
  };
124
141
 
@@ -434,7 +451,7 @@ function isSensitiveKey(key: string): boolean {
434
451
  return SENSITIVE_KEY_PATTERNS.some((pattern) => normalized.includes(pattern));
435
452
  }
436
453
 
437
- function redactValue(value: unknown, key?: string): unknown {
454
+ function redactValue(value: WebSocketTelemetryValue, key?: string): WebSocketTelemetryValue {
438
455
  if (key !== undefined && isSensitiveKey(key)) {
439
456
  return REDACTED_VALUE;
440
457
  }
@@ -447,8 +464,8 @@ function redactValue(value: unknown, key?: string): unknown {
447
464
  return value;
448
465
  }
449
466
 
450
- if (value && typeof value === "object") {
451
- const redacted: Record<string, unknown> = {};
467
+ if (value && isObjectValue(value)) {
468
+ const redacted: WebSocketTelemetryAttributes = {};
452
469
  for (const [childKey, childValue] of Object.entries(value)) {
453
470
  redacted[childKey] = redactValue(childValue, childKey);
454
471
  }
@@ -464,6 +481,7 @@ function redactValue(value: unknown, key?: string): unknown {
464
481
  */
465
482
  function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketTelemetryRecord {
466
483
  if (record.type === "event") {
484
+ // SAFETY: redactor는 이벤트 레코드의 키 구조를 유지하고 값만 마스킹한다.
467
485
  return {
468
486
  ...record,
469
487
  attributes: record.attributes
@@ -477,6 +495,7 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
477
495
  }
478
496
 
479
497
  if (record.type === "metric") {
498
+ // SAFETY: redactor는 메트릭 레코드의 키 구조를 유지하고 값만 마스킹한다.
480
499
  return {
481
500
  ...record,
482
501
  tags: record.tags
@@ -486,6 +505,7 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
486
505
  };
487
506
  }
488
507
 
508
+ // SAFETY: redactor는 span과 하위 이벤트·링크의 키 구조를 유지하고 값만 마스킹한다.
489
509
  return {
490
510
  ...record,
491
511
  attributes: record.attributes
@@ -494,19 +514,19 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
494
514
  events: record.events?.map((event) => ({
495
515
  ...event,
496
516
  attributes: event.attributes
497
- ? (redactValue(event.attributes) as Record<string, unknown>)
517
+ ? (redactValue(event.attributes) as WebSocketTelemetryAttributes)
498
518
  : undefined,
499
519
  })),
500
520
  links: record.links?.map((link) => ({
501
521
  ...link,
502
522
  attributes: link.attributes
503
- ? (redactValue(link.attributes) as Record<string, unknown>)
523
+ ? (redactValue(link.attributes) as WebSocketTelemetryAttributes)
504
524
  : undefined,
505
525
  })),
506
526
  };
507
527
  }
508
528
 
509
- function truncatePayloadPreview(payload: unknown, maxBytes: number): string {
529
+ function truncatePayloadPreview(payload: WebSocketTelemetryValue, maxBytes: number): string {
510
530
  try {
511
531
  const serialized = JSON.stringify(redactValue(payload));
512
532
  if (Buffer.byteLength(serialized, "utf-8") <= maxBytes) {
@@ -536,8 +556,8 @@ function truncateUtf8String(value: string, maxBytes: number): string {
536
556
  return result + suffix;
537
557
  }
538
558
 
539
- export function isPromiseLike(value: unknown): value is Promise<void> {
540
- return typeof value === "object" && value !== null && "then" in value && "catch" in value;
559
+ export function isPromiseLike<Value>(value: Value): value is Value & Promise<void> {
560
+ return isObjectValue(value) && value !== null && "then" in value && "catch" in value;
541
561
  }
542
562
 
543
563
  // -- TokenBucket (unchanged) --
@@ -679,7 +699,7 @@ type ResolvedSpanPipelineOptions = {
679
699
  type InternalEventReporter = (
680
700
  name: string,
681
701
  level: WebSocketTelemetryEventRecord["level"],
682
- detail?: Record<string, unknown>,
702
+ detail?: WebSocketTelemetryAttributes,
683
703
  ) => void;
684
704
 
685
705
  // -- TelemetryPipeline (abstract) --
@@ -695,7 +715,7 @@ abstract class TelemetryPipeline<
695
715
  > {
696
716
  abstract readonly signal: "event" | "metric" | "span";
697
717
  protected readonly sinks: TSink[];
698
- protected readonly _store: TStore;
718
+ protected readonly telemetryStore: TStore;
699
719
  protected readonly tokenBucket: TokenBucket;
700
720
  protected readonly maxInFlightEmits: number;
701
721
  protected readonly runtimeMetadata: RuntimeMetadata;
@@ -717,7 +737,7 @@ abstract class TelemetryPipeline<
717
737
  runtimeMetadata: RuntimeMetadata,
718
738
  ) {
719
739
  this.sinks = sinks;
720
- this._store = store;
740
+ this.telemetryStore = store;
721
741
  this.tokenBucket = new TokenBucket(maxRecordsPerSecond, maxRecordsPerSecond);
722
742
  this.maxInFlightEmits = maxInFlightEmits;
723
743
  this.sharedRedactor = sharedRedactor;
@@ -726,7 +746,7 @@ abstract class TelemetryPipeline<
726
746
  }
727
747
 
728
748
  get store(): TStore {
729
- return this._store;
749
+ return this.telemetryStore;
730
750
  }
731
751
 
732
752
  setInternalEventReporter(reporter: InternalEventReporter): void {
@@ -772,7 +792,8 @@ abstract class TelemetryPipeline<
772
792
  this.droppedCount += 1;
773
793
  return;
774
794
  }
775
- prepared = afterDefault as TRecord;
795
+ prepared =
796
+ /* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ afterDefault as TRecord;
776
797
  } catch {
777
798
  this.droppedCount += 1;
778
799
  return;
@@ -860,7 +881,7 @@ abstract class TelemetryPipeline<
860
881
  }
861
882
 
862
883
  // result.type === record.type === TRecord["type"]이므로 narrowed TRecord로 안전하게 좁힐 수 있다.
863
- return result as TRecord;
884
+ return /* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ result as TRecord;
864
885
  }
865
886
 
866
887
  protected dispatchToSinks(record: TRecord, selfObserveFailures = true): void {
@@ -885,9 +906,9 @@ abstract class TelemetryPipeline<
885
906
  () => {
886
907
  this.decrementInFlightEmit(sink);
887
908
  },
888
- (error: unknown) => {
909
+ (cause: unknown) => {
889
910
  this.decrementInFlightEmit(sink);
890
- this.observeSinkFailure("emit", error, selfObserveFailures);
911
+ this.observeSinkFailure("emit", cause, selfObserveFailures);
891
912
  },
892
913
  );
893
914
  }
@@ -906,9 +927,9 @@ abstract class TelemetryPipeline<
906
927
  this.inFlightEmits.set(sink, current - 1);
907
928
  }
908
929
 
909
- private observeSinkFailure(
930
+ private observeSinkFailure<Value>(
910
931
  phase: "emit" | "shutdown",
911
- error: unknown,
932
+ error: Value,
912
933
  selfObserveFailure: boolean,
913
934
  ): void {
914
935
  this.sinkFailureCount += 1;
@@ -916,14 +937,14 @@ abstract class TelemetryPipeline<
916
937
  this.dispatchInternalEvent("ws.telemetry.sink.failed", "warn", {
917
938
  phase,
918
939
  signal: this.signal,
919
- errorType: error instanceof Error ? error.name : typeof error,
940
+ errorType: error instanceof Error ? error.name : runtimeTypeOf(error),
920
941
  });
921
942
  }
922
943
 
923
944
  protected dispatchInternalEvent(
924
945
  name: string,
925
946
  level: WebSocketTelemetryEventRecord["level"],
926
- detail?: Record<string, unknown>,
947
+ detail?: WebSocketTelemetryAttributes,
927
948
  ): void {
928
949
  if (this.internalEventReporter === undefined) return;
929
950
  try {
@@ -953,8 +974,8 @@ abstract class TelemetryPipeline<
953
974
  let timeout: ReturnType<typeof setTimeout> | null = null;
954
975
  const shutdownPromise = result.then(
955
976
  () => "completed" as const,
956
- (error: unknown) => {
957
- throw error;
977
+ (cause: unknown) => {
978
+ throw cause;
958
979
  },
959
980
  );
960
981
  const timeoutPromise = new Promise<"timeout">((resolve) => {
@@ -1056,7 +1077,7 @@ class EventPipeline extends TelemetryPipeline<
1056
1077
  dispatchInternalDiagnosticEvent(
1057
1078
  name: string,
1058
1079
  level: WebSocketTelemetryEventRecord["level"],
1059
- detail?: Record<string, unknown>,
1080
+ detail?: WebSocketTelemetryAttributes,
1060
1081
  ): void {
1061
1082
  const record: WebSocketTelemetryEventRecord = {
1062
1083
  type: "event",
@@ -1172,7 +1193,7 @@ class MetricPipeline extends TelemetryPipeline<
1172
1193
 
1173
1194
  if (
1174
1195
  this.collectionInterval &&
1175
- typeof this.collectionInterval === "object" &&
1196
+ isObjectValue(this.collectionInterval) &&
1176
1197
  "unref" in this.collectionInterval
1177
1198
  ) {
1178
1199
  this.collectionInterval.unref();
@@ -1595,28 +1616,30 @@ function buildController(
1595
1616
  // 신호별 redactor / beforeRecord 해석.
1596
1617
  // null이면 sharedRedactor를 undefined로 덮어써 step 2 자체를 skip한다.
1597
1618
  const eventsSharedRedactor = eventsOpt.redactor === null ? undefined : defaults.redactor;
1598
- const eventsSignalRedactor =
1599
- typeof eventsOpt.redactor === "function" ? eventsOpt.redactor : undefined;
1619
+ const eventsSignalRedactor = isFunctionValue(eventsOpt.redactor) ? eventsOpt.redactor : undefined;
1600
1620
  const eventsSharedBeforeRecord =
1601
1621
  eventsOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
1602
- const eventsSignalBeforeRecord =
1603
- typeof eventsOpt.beforeRecord === "function" ? eventsOpt.beforeRecord : undefined;
1622
+ const eventsSignalBeforeRecord = isFunctionValue(eventsOpt.beforeRecord)
1623
+ ? eventsOpt.beforeRecord
1624
+ : undefined;
1604
1625
 
1605
1626
  const metricsSharedRedactor = metricsOpt.redactor === null ? undefined : defaults.redactor;
1606
- const metricsSignalRedactor =
1607
- typeof metricsOpt.redactor === "function" ? metricsOpt.redactor : undefined;
1627
+ const metricsSignalRedactor = isFunctionValue(metricsOpt.redactor)
1628
+ ? metricsOpt.redactor
1629
+ : undefined;
1608
1630
  const metricsSharedBeforeRecord =
1609
1631
  metricsOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
1610
- const metricsSignalBeforeRecord =
1611
- typeof metricsOpt.beforeRecord === "function" ? metricsOpt.beforeRecord : undefined;
1632
+ const metricsSignalBeforeRecord = isFunctionValue(metricsOpt.beforeRecord)
1633
+ ? metricsOpt.beforeRecord
1634
+ : undefined;
1612
1635
 
1613
1636
  const spansSharedRedactor = spansOpt.redactor === null ? undefined : defaults.redactor;
1614
- const spansSignalRedactor =
1615
- typeof spansOpt.redactor === "function" ? spansOpt.redactor : undefined;
1637
+ const spansSignalRedactor = isFunctionValue(spansOpt.redactor) ? spansOpt.redactor : undefined;
1616
1638
  const spansSharedBeforeRecord =
1617
1639
  spansOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
1618
- const spansSignalBeforeRecord =
1619
- typeof spansOpt.beforeRecord === "function" ? spansOpt.beforeRecord : undefined;
1640
+ const spansSignalBeforeRecord = isFunctionValue(spansOpt.beforeRecord)
1641
+ ? spansOpt.beforeRecord
1642
+ : undefined;
1620
1643
 
1621
1644
  // events
1622
1645
  const eventSinks: WebSocketTelemetryEventSink[] = eventsOpt.sinks ? [...eventsOpt.sinks] : [];